ZGlmZiAtLWdpdCBhL2ZpbmFsL0NSRURJVFMudHh0IGIvZmluYWwvQ1JFRElUUy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWEzMWU4MAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL0NSRURJVFMudHh0CkBAIC0wLDAgKzEsNDMgQEAKK1RoaXMgZmlsZSBpcyBhIHBhcnRpYWwgbGlzdCBvZiBwZW9wbGUgd2hvIGhhdmUgY29udHJpYnV0ZWQgdG8gdGhlIExMVk0vb3Blbm1wCitwcm9qZWN0LiAgSWYgeW91IGhhdmUgY29udHJpYnV0ZWQgYSBwYXRjaCBvciBtYWRlIHNvbWUgb3RoZXIgY29udHJpYnV0aW9uIHRvCitMTFZNL29wZW5tcCwgcGxlYXNlIHN1Ym1pdCBhIHBhdGNoIHRvIHRoaXMgZmlsZSB0byBhZGQgeW91cnNlbGYsIGFuZCBpdCB3aWxsIGJlCitkb25lIQorCitUaGUgbGlzdCBpcyBzb3J0ZWQgYnkgc3VybmFtZSBhbmQgZm9ybWF0dGVkIHRvIGFsbG93IGVhc3kgZ3JlcHBpbmcgYW5kCitiZWF1dGlmaWNhdGlvbiBieSBzY3JpcHRzLiAgVGhlIGZpZWxkcyBhcmU6IG5hbWUgKE4pLCBlbWFpbCAoRSksIHdlYi1hZGRyZXNzCisoVyksIFBHUCBrZXkgSUQgYW5kIGZpbmdlcnByaW50IChQKSwgZGVzY3JpcHRpb24gKEQpLCBhbmQgc25haWwtbWFpbCBhZGRyZXNzCisoUykuCisKK046IENhcmxvIEJlcnRvbGxpCitEOiBJQk0gY29udHJpYnV0b3IgdG8gUG93ZXJQQyBzdXBwb3J0IGluIENNYWtlIGZpbGVzIGFuZCBlbHNld2hlcmUuCisKK046IFN1bml0YSBDaGFuZHJhc2VrYXJhbgorRDogQ29udHJpYnV0b3IgdG8gdGVzdHN1aXRlIGZyb20gT3BlblVICisKK046IEJhcmJhcmEgQ2hhcG1hbgorRDogQ29udHJpYnV0b3IgdG8gdGVzdHN1aXRlIGZyb20gT3BlblVICisKK046IFVuaXZlcnNpdHkgb2YgSG91c3RvbiAKK1c6IGh0dHA6Ly93ZWIuY3MudWguZWR1L35vcGVudWgvZG93bmxvYWQvCitEOiBPcGVuVUggdGVzdCBzdWl0ZQorCitOOiBJbnRlbCBDb3Jwb3JhdGlvbiBPcGVuTVAgcnVudGltZSB0ZWFtCitXOiBodHRwOi8vb3Blbm1wcnRsLm9yZworRDogQ3JlYXRlZCB0aGUgcnVudGltZS4KKworTjogTWF0dGhpYXMgTXVsbGVyCitEOiBDb250cmlidXRvciB0byB0ZXN0c3VpdGUgZnJvbSBPcGVuVUgKKworTjogUGF2ZWwgTmV5dGNoZXYKK0Q6IENvbnRyaWJ1dG9yIHRvIHRlc3RzdWl0ZSBmcm9tIE9wZW5VSAorCitOOiBTdGV2ZW4gTm9vbmFuCitFOiBzdGV2ZW5AdXBsaW5rbGFicy5uZXQKK0Q6IFBhdGNoZXMgZm9yIHRoZSBBUk0gYXJjaGl0ZWN0dXJlIGFuZCByZW1vdmFsIG9mIHNldmVyYWwgaW5jb25zaXN0ZW5jaWVzLgorCitOOiBBbHAgVG9rZXIKK0U6IGFscEBudWFudGkuY29tCitEOiBNYWtpbmcgYnVpbGQgd29yayBmb3IgRnJlZUJTRC4KKworTjogQ2hlbmcgV2FuZyAKK0Q6IENvbnRyaWJ1dG9yIHRvIHRlc3RzdWl0ZSBmcm9tIE9wZW5VSApkaWZmIC0tZ2l0IGEvZmluYWwvTElDRU5TRS50eHQgYi9maW5hbC9MSUNFTlNFLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWY0MWUyCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvTElDRU5TRS50eHQKQEAgLTAsMCArMSwxMjQgQEAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgc29mdHdhcmUgY29udGFpbmVkIGluIHRoaXMgZGlyZWN0b3J5IHRyZWUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciBib3RoIHRoZQorVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyAiQlNELUxpa2UiIGxpY2Vuc2UgYW5kIHRoZSBNSVQgbGljZW5zZS4gIEFzIGEgdXNlciBvZgordGhpcyBjb2RlIHlvdSBtYXkgY2hvb3NlIHRvIHVzZSBpdCB1bmRlciBlaXRoZXIgbGljZW5zZS4gIEFzIGEgY29udHJpYnV0b3IsCit5b3UgYWdyZWUgdG8gYWxsb3cgeW91ciBjb2RlIHRvIGJlIHVzZWQgdW5kZXIgYm90aC4gIFRoZSBmdWxsIHRleHQgb2YgdGhlCityZWxldmFudCBsaWNlbnNlcyBpcyBpbmNsdWRlZCBiZWxvdy4KKworSW4gYWRkaXRpb24sIGEgbGljZW5zZSBhZ3JlZW1lbnQgZnJvbSB0aGUgY29weXJpZ2h0L3BhdGVudCBob2xkZXJzIG9mIHRoZQorc29mdHdhcmUgY29udGFpbmVkIGluIHRoaXMgZGlyZWN0b3J5IHRyZWUgaXMgaW5jbHVkZWQgYmVsb3cuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitVbml2ZXJzaXR5IG9mIElsbGlub2lzL05DU0EKK09wZW4gU291cmNlIExpY2Vuc2UKKworQ29weXJpZ2h0IChjKSAxOTk3LTIwMTMgSW50ZWwgQ29ycG9yYXRpb24KKworQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworRGV2ZWxvcGVkIGJ5OgorICAgIE9wZW5NUCBSdW50aW1lIFRlYW0KKyAgICBJbnRlbCBDb3Jwb3JhdGlvbgorICAgIGh0dHA6Ly93d3cub3Blbm1wcnRsLm9yZworCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCit0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCB3aXRoCit0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCit1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvCitzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXJzLgorCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVycyBpbiB0aGUKKyAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAqIE5laXRoZXIgdGhlIG5hbWVzIG9mIEludGVsIENvcnBvcmF0aW9uIE9wZW5NUCBSdW50aW1lIFRlYW0gbm9yIHRoZQorICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKK0ZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitDT05UUklCVVRPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKK0xJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCitPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIFdJVEggVEhFCitTT0ZUV0FSRS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0NvcHlyaWdodCAoYykgMTk5Ny0yMDEzIEludGVsIENvcnBvcmF0aW9uCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKK29mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCitpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCit0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCitjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKK2Z1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorVEhFIFNPRlRXQVJFLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworSW50ZWwgQ29ycG9yYXRpb24KKworU29mdHdhcmUgR3JhbnQgTGljZW5zZSBBZ3JlZW1lbnQgKCJBZ3JlZW1lbnQiKQorCitFeGNlcHQgZm9yIHRoZSBsaWNlbnNlIGdyYW50ZWQgaGVyZWluIHRvIHlvdSwgSW50ZWwgQ29ycG9yYXRpb24gKCJJbnRlbCIpIHJlc2VydmVzCithbGwgcmlnaHQsIHRpdGxlLCBhbmQgaW50ZXJlc3QgaW4gYW5kIHRvIHRoZSBTb2Z0d2FyZSAoZGVmaW5lZCBiZWxvdykuCisKK0RlZmluaXRpb24KKworIlNvZnR3YXJlIiBtZWFucyB0aGUgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBhcyB3ZWxsIGFzIGFueSBvcmlnaW5hbCB3b3JrIG9mCithdXRob3JzaGlwLCBpbmNsdWRpbmcgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zIHRvIGFuIGV4aXN0aW5nIHdvcmssIHRoYXQKK2lzIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGJ5IEludGVsIHRvIGxsdm0ub3JnIChodHRwOi8vbGx2bS5vcmcpICgiTExWTSIpIGZvcgoraW5jbHVzaW9uIGluLCBvciBkb2N1bWVudGF0aW9uIG9mLCBhbnkgb2YgdGhlIHByb2R1Y3RzIG93bmVkIG9yIG1hbmFnZWQgYnkgTExWTQorKHRoZSAiV29yayIpLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIgbWVhbnMgYW55IGZvcm0gb2YKK2VsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQgdG8gTExWTSBvciBpdHMKK3JlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMKK21haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUKK21hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgTExWTSBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nCit0aGUgV29yaywgYnV0IGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3RoZXJ3aXNlLgorCisxLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcworICAgQWdyZWVtZW50LCBJbnRlbCBoZXJlYnkgZ3JhbnRzIHRvIHlvdSBhbmQgdG8gcmVjaXBpZW50cyBvZiB0aGUgU29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIGJ5IExMVk0gYSBwZXJwZXR1YWwsIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLAorICAgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZSBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZQorICAgd29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgU29mdHdhcmUgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3Jrcy4KKworMi4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMKKyAgIEFncmVlbWVudCwgSW50ZWwgaGVyZWJ5IGdyYW50cyB5b3UgYW5kIHRvIHJlY2lwaWVudHMgb2YgdGhlIFNvZnR3YXJlCisgICBkaXN0cmlidXRlZCBieSBMTFZNIGEgcGVycGV0dWFsLCB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwKKyAgIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZQorICAgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlcgorICAgdGhlIFdvcmssIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICBieSBJbnRlbCB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgSW50ZWwncyBTb2Z0d2FyZSBhbG9uZSBvciBieQorICAgY29tYmluYXRpb24gb2YgdGhlIFNvZnR3YXJlIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBTb2Z0d2FyZSB3YXMKKyAgIHN1Ym1pdHRlZC4gSWYgYW55IGVudGl0eSBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgSW50ZWwgb3IgYW55CisgICBvdGhlciBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nCisgICB0aGF0IEludGVsJ3MgU29mdHdhcmUsIG9yIHRoZSBXb3JrIHRvIHdoaWNoIEludGVsIGhhcyBjb250cmlidXRlZCBjb25zdGl0dXRlcworICAgZGlyZWN0IG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgZ3JhbnRlZAorICAgdG8gdGhhdCBlbnRpdHkgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgZm9yIHRoZSBTb2Z0d2FyZSBvciBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHRoZSBzb2Z0d2FyZSBpcworcHJvdmlkZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsCitlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IKK2NvbmRpdGlvbnMgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvTWFrZWZpbGUgYi9maW5hbC9vZmZsb2FkL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM3OWYwNmQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL01ha2VmaWxlCkBAIC0wLDAgKzEsMjA4IEBACisjDQorIyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKyMvLw0KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlDQorIy8vDQorIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4NCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuDQorIy8vDQorIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorIw0KKw0KKyMgTUFLRUZJTEUgUEFSQU1FVEVSUw0KKyMNCisjIHJvb3RfZGlyIC0gcGF0aCB0byByb290IGRpcmVjdG9yeSBvZiBsaWJvZmZsb2FkDQorIyBidWlsZF9kaXIgLSBwYXRoIHRvIGJ1aWxkIGRpcmVjdG9yeQ0KKyMgbXBzc19kaXIgLSBwYXRoIHRvIHJvb3QgZGlyZWN0b3J5IG9mIG1wc3MNCisjIGxpYmlvbXBfaG9zdF9kaXIgLSBwYXRoIHRvIGhvc3QgbGliaW9tcCBkaXJlY3RvcnkgKHVubmVjZXNzYXJ5IGlmIGNvbXBpbGVyX2hvc3QgaXMgaWNjKQ0KKyMgbGliaW9tcF90YXJnZXRfZGlyIC0gcGF0aCB0byB0YXJnZXQgbGliaW9tcCBkaXJlY3RvcnkgKHVubmVjZXNhcnJ5IGlmIGNvbXBpbGVyX3RhcmdldCBpcyBpY2MpDQorIyBvbXBfaGVhZGVyX2RpciAtIHBhdGggdG8gb21wLmggKHVubmVjZXNzYXJ5IGlmIGNvbXBpbGVyX2hvc3QgYW5kIGNvbXBpbGVyX3RhcmdldCBhcmUgaWNjKQ0KKyMgb3NfaG9zdCAtIGhvc3Qgb3BlcmF0aW5nIHN5c3RlbQ0KKyMgb3NfdGFyZ2V0IC0gdGFyZ2V0IG9wZXJhdGluZyBzeXN0ZW0NCisjIGNvbXBpbGVyX2hvc3QgLSBob3N0IGNvbXBpbGVyDQorIyBjb21waWxlcl90YXJnZXQgLSB0YXJnZXQgY29tcGlsZXINCisjIG9wdGlvbnNfaG9zdCAtIGFkZGl0aW9uYWwgb3B0aW9ucyBmb3IgaG9zdCBjb21waWxlcg0KKyMgb3B0aW9uc190YXJnZXQgLSBhZGRpdGlvbmFsIG9wdGlvbnMgZm9yIHRhcmdldCBjb21waWxlcg0KKyMNCisNCisjIERpcmVjdG9yaWVzDQorcm9vdF9kaXI/PS4NCitidWlsZF9kaXI/PSQocm9vdF9kaXIpL2J1aWxkDQorYnVpbGRfaG9zdF9kaXI9JChidWlsZF9kaXIpL2hvc3QNCitidWlsZF90YXJnZXRfZGlyPSQoYnVpbGRfZGlyKS90YXJnZXQNCitvYmpfaG9zdF9kaXI9JChidWlsZF9kaXIpL29ial9ob3N0DQorb2JqX3RhcmdldF9kaXI9JChidWlsZF9kaXIpL29ial90YXJnZXQNCitzb3VyY2VfZGlyPSQocm9vdF9kaXIpL3NyYw0KK2ltcG9ydGVkX2Rpcj0kKHNvdXJjZV9kaXIpL2ltcG9ydGVkDQorDQorIyBPUw0KK29zX2hvc3Q/PWxpbnV4DQorb3NfdGFyZ2V0Pz1saW51eA0KK2lmbmVxICgkKG9zX2hvc3QpXyQob3NfdGFyZ2V0KSwgbGludXhfbGludXgpDQorICAkKGVycm9yICJPbmx5IGxpbnV4IGlzIHN1cHBvcnRlZCIpDQorZW5kaWYNCisNCisjIENvbXBpbGVycw0KK2NvbXBpbGVyX2hvc3Q/PWdjYw0KK2NvbXBpbGVyX3RhcmdldD89Z2NjDQorDQorIyBNUFNTDQorbXBzc19kaXI/PS8NCittcHNzX3ByZXNlbnQ9JChzaGVsbCBpZiB0ZXN0IC1kICQobXBzc19kaXIpOyB0aGVuIGVjaG8gT0s7IGVsc2UgZWNobyBLTzsgZmkpDQoraWZuZXEgKCQobXBzc19wcmVzZW50KSwgT0spDQorICAkKGVycm9yICJDYW5ub3QgZmluZCBNUFNTIGRpcmVjdG9yeSAkKG1wc3NfZGlyKSIpDQorZW5kaWYNCisNCitjb2lfZGlyPSQobXBzc19kaXIpL29wdC9pbnRlbC9taWMvY29pDQorbXlvX2Rpcj0kKG1wc3NfZGlyKS9vcHQvaW50ZWwvbWljL215bw0KKw0KKyMgU291cmNlcw0KK3NyY19saWJvZmZsb2FkX2NvbW1vbj1kdl91dGlsLmNwcCBsaWJvZmZsb2FkX2Vycm9yLmMgbGlib2ZmbG9hZF9tc2cuYyBvZmZsb2FkX2NvbW1vbi5jcHAgb2ZmbG9hZF90YWJsZS5jcHAgb2ZmbG9hZF90cmFjZS5jcHAgb2ZmbG9hZF91dGlsLmNwcA0KKw0KK3NyY19saWJvZmZsb2FkX2hvc3Q9JChzcmNfbGlib2ZmbG9hZF9jb21tb24pIGNlYW5fdXRpbC5jcHAgY29pL2NvaV9jbGllbnQuY3BwIGNvbXBpbGVyX2lmX2hvc3QuY3BwIG9mZmxvYWRfZW5naW5lLmNwcCBvZmZsb2FkX2Vudi5jcHAgb2ZmbG9hZF9ob3N0LmNwcCBvZmZsb2FkX29tcF9ob3N0LmNwcCBvZmZsb2FkX3RpbWVyX2hvc3QuY3BwIG9mZmxvYWRfb3JzbC5jcHAgb3JzbC1saXRlL2xpYi9vcnNsLWxpdGUuYyBvZmZsb2FkX215b19ob3N0LmNwcA0KK3NyY19saWJvZmZsb2FkX2hvc3Q6PSQoZm9yZWFjaCBmaWxlLCQoc3JjX2xpYm9mZmxvYWRfaG9zdCksJChzb3VyY2VfZGlyKS8kKGZpbGUpKQ0KKw0KK3NyY19saWJvZmZsb2FkX3RhcmdldD0kKHNyY19saWJvZmZsb2FkX2NvbW1vbikgY29pL2NvaV9zZXJ2ZXIuY3BwIGNvbXBpbGVyX2lmX3RhcmdldC5jcHAgb2ZmbG9hZF9vbXBfdGFyZ2V0LmNwcCBvZmZsb2FkX3RhcmdldC5jcHAgb2ZmbG9hZF90aW1lcl90YXJnZXQuY3BwIG9mZmxvYWRfbXlvX3RhcmdldC5jcHANCitzcmNfbGlib2ZmbG9hZF90YXJnZXQ6PSQoZm9yZWFjaCBmaWxlLCQoc3JjX2xpYm9mZmxvYWRfdGFyZ2V0KSwkKHNvdXJjZV9kaXIpLyQoZmlsZSkpDQorDQorc3JjX29mbGQ9b2ZsZGJlZ2luLmNwcCBvZmxkZW5kLmNwcA0KK3NyY19vZmxkOj0kKGZvcmVhY2ggZmlsZSwkKHNyY19vZmxkKSwkKHNvdXJjZV9kaXIpLyQoZmlsZSkpDQorDQoraGVhZGVycz0kKHdpbGRjYXJkICQoc291cmNlX2RpcikvKi5oKSAkKHdpbGRjYXJkICQoc291cmNlX2RpcikvY29pLyouaCkgJCh3aWxkY2FyZCAkKHNvdXJjZV9kaXIpL29yc2wtbGl0ZS9pbmNsdWRlLyouaCkNCitpZm5lcSAoJChvbXBfaGVhZGVyX2RpciksICkNCisgIGhlYWRlcnMrPSQoaW1wb3J0ZWRfZGlyKS9vbXAuaA0KK2VuZGlmDQorDQorIyBPYmplY3RzDQorb2JqX2xpYm9mZmxvYWRfaG9zdD0kKG5vdGRpciAkKHNyY19saWJvZmZsb2FkX2hvc3QpKQ0KK29ial9saWJvZmZsb2FkX2hvc3Q6PSQob2JqX2xpYm9mZmxvYWRfaG9zdDouY3BwPS5vKQ0KK29ial9saWJvZmZsb2FkX2hvc3Q6PSQob2JqX2xpYm9mZmxvYWRfaG9zdDouYz0ubykNCitvYmpfbGlib2ZmbG9hZF9ob3N0Oj0kKGZvcmVhY2ggZmlsZSwkKG9ial9saWJvZmZsb2FkX2hvc3QpLCQob2JqX2hvc3RfZGlyKS8kKGZpbGUpKQ0KKw0KK29ial9saWJvZmZsb2FkX3RhcmdldD0kKG5vdGRpciAkKHNyY19saWJvZmZsb2FkX3RhcmdldCkpDQorb2JqX2xpYm9mZmxvYWRfdGFyZ2V0Oj0kKG9ial9saWJvZmZsb2FkX3RhcmdldDouY3BwPS5vKQ0KK29ial9saWJvZmZsb2FkX3RhcmdldDo9JChvYmpfbGlib2ZmbG9hZF90YXJnZXQ6LmM9Lm8pDQorb2JqX2xpYm9mZmxvYWRfdGFyZ2V0Oj0kKGZvcmVhY2ggZmlsZSwkKG9ial9saWJvZmZsb2FkX3RhcmdldCksJChvYmpfdGFyZ2V0X2RpcikvJChmaWxlKSkNCisNCitvYmpfb2ZsZD0kKG5vdGRpciAkKHNyY19vZmxkKSkNCitvYmpfb2ZsZDo9JChvYmpfb2ZsZDouY3BwPS5vKQ0KK29ial9vZmxkX2hvc3Q9JChmb3JlYWNoIGZpbGUsJChvYmpfb2ZsZCksJChidWlsZF9ob3N0X2RpcikvJChmaWxlKSkNCitvYmpfb2ZsZF90YXJnZXQ9JChmb3JlYWNoIGZpbGUsJChvYmpfb2ZsZCksJChidWlsZF90YXJnZXRfZGlyKS8kKGZpbGUpKQ0KKw0KKyMgT3B0aW9ucw0KK29wdHNfY29tbW9uPS1PMiAtdyAtZnBpYyAtYyAtRENPSV9MSUJSQVJZX1ZFUlNJT049MiAtRE1ZT19TVVBQT1JUIC1ET0ZGTE9BRF9ERUJVRz0xIC1EU0VQX1NVUFBPUlQgLURUSU1JTkdfU1VQUE9SVCAtSSQoY29pX2RpcikvaW5jbHVkZSAtSSQobXlvX2RpcikvaW5jbHVkZSAtSSQoc291cmNlX2RpcikNCitpZm5lcSAoJChvbXBfaGVhZGVyX2RpciksICkNCisgIG9wdHNfY29tbW9uKz0tSSQoaW1wb3J0ZWRfZGlyKQ0KK2VuZGlmDQorDQorb3B0c19saWJvZmZsb2FkPS1zaGFyZWQgLVdsLC1zb25hbWUsbGlib2ZmbG9hZC5zby41IC1sZGwgLWxzdGRjKysgLWxpb21wNQ0KKw0KK29wdHNfbGlib2ZmbG9hZF9ob3N0PSQob3B0c19saWJvZmZsb2FkKSAtTCQoY29pX2RpcikvaG9zdC1saW51eC1yZWxlYXNlL2xpYiAtbGNvaV9ob3N0IC1MJChteW9fZGlyKS9saWIgLWxteW8tY2xpZW50DQoraWZuZXEgKCQobGliaW9tcF9ob3N0X2RpciksICkNCisgIG9wdHNfbGlib2ZmbG9hZF9ob3N0Kz0tTCQobGliaW9tcF9ob3N0X2RpcikNCitlbmRpZg0KKw0KK29wdHNfbGlib2ZmbG9hZF90YXJnZXQ9JChvcHRzX2xpYm9mZmxvYWQpIC1MJChjb2lfZGlyKS9kZXZpY2UtbGludXgtcmVsZWFzZS9saWIgLWxjb2lfZGV2aWNlIC1MJChteW9fZGlyKS9saWIgLWxteW8tc2VydmljZQ0KK2lmbmVxICgkKGxpYmlvbXBfdGFyZ2V0X2RpciksICkNCisgIG9wdHNfbGlib2ZmbG9hZF90YXJnZXQrPS1MJChsaWJpb21wX3RhcmdldF9kaXIpDQorZW5kaWYNCisNCitvcHRpb25zX2hvc3Q/PQ0KK29wdHNfaG9zdD0kKG9wdGlvbnNfaG9zdCkgLURIT1NUX0xJQlJBUlk9MQ0KK2lmZXEgKCQob3NfaG9zdCksIGxpbnV4KQ0KKyAgb3B0c19ob3N0Kz0tRExJTlVYDQorZW5kaWYNCisNCitvcHRpb25zX3RhcmdldD89DQorb3B0c190YXJnZXQ9JChvcHRpb25zX3RhcmdldCkgLURIT1NUX0xJQlJBUlk9MA0KK2lmZXEgKCQob3NfdGFyZ2V0KSwgbGludXgpDQorICBvcHRzX3RhcmdldCs9LURMSU5VWA0KK2VuZGlmDQorDQorIyBNYWtlIHRhcmdldHMNCisuUEhPTlk6IGFsbCBjbGVhbiBpbmZvDQorDQorYWxsOiBpbmZvICQoYnVpbGRfaG9zdF9kaXIpL2xpYm9mZmxvYWQuc28gJChidWlsZF90YXJnZXRfZGlyKS9saWJvZmZsb2FkLnNvICQob2JqX29mbGRfaG9zdCkgJChvYmpfb2ZsZF90YXJnZXQpDQorDQorDQorJChidWlsZF9ob3N0X2RpcikvbGlib2ZmbG9hZC5zbzogJChidWlsZF9ob3N0X2RpcikvbGlib2ZmbG9hZC5zby41IHwgJChidWlsZF9ob3N0X2RpcikNCisJbG4gLWYgJDwgJEANCisNCiskKGJ1aWxkX2hvc3RfZGlyKS9saWJvZmZsb2FkLnNvLjU6ICQob2JqX2xpYm9mZmxvYWRfaG9zdCkgfCAkKGJ1aWxkX2hvc3RfZGlyKQ0KKwkkKGNvbXBpbGVyX2hvc3QpICQob3B0c19saWJvZmZsb2FkX2hvc3QpICQob3B0c19ob3N0KSAkXiAtbyAkQA0KKw0KKyQob2JqX2hvc3RfZGlyKS8lLm86ICQoc291cmNlX2RpcikvJS5jICQoaGVhZGVycykgfCAkKG9ial9ob3N0X2RpcikNCisJJChjb21waWxlcl9ob3N0KSAkKG9wdHNfY29tbW9uKSAkKG9wdHNfaG9zdCkgJDwgLW8gJEANCisNCiskKG9ial9ob3N0X2RpcikvJS5vOiAkKHNvdXJjZV9kaXIpLyUuY3BwICQoaGVhZGVycykgfCAkKG9ial9ob3N0X2RpcikNCisJJChjb21waWxlcl9ob3N0KSAkKG9wdHNfY29tbW9uKSAkKG9wdHNfaG9zdCkgJDwgLW8gJEANCisNCiskKG9ial9ob3N0X2RpcikvJS5vOiAkKHNvdXJjZV9kaXIpL2NvaS8lLmNwcCAkKGhlYWRlcnMpIHwgJChvYmpfaG9zdF9kaXIpDQorCSQoY29tcGlsZXJfaG9zdCkgJChvcHRzX2NvbW1vbikgJChvcHRzX2hvc3QpICQ8IC1vICRADQorDQorJChvYmpfaG9zdF9kaXIpLyUubzogJChzb3VyY2VfZGlyKS9vcnNsLWxpdGUvbGliLyUuYyAkKGhlYWRlcnMpIHwgJChvYmpfaG9zdF9kaXIpDQorCSQoY29tcGlsZXJfaG9zdCkgJChvcHRzX2NvbW1vbikgJChvcHRzX2hvc3QpICQ8IC1vICRADQorDQorDQorJChidWlsZF90YXJnZXRfZGlyKS9saWJvZmZsb2FkLnNvOiAkKGJ1aWxkX3RhcmdldF9kaXIpL2xpYm9mZmxvYWQuc28uNSB8ICQoYnVpbGRfdGFyZ2V0X2RpcikNCisJbG4gLWYgJDwgJEANCisNCiskKGJ1aWxkX3RhcmdldF9kaXIpL2xpYm9mZmxvYWQuc28uNTogJChvYmpfbGlib2ZmbG9hZF90YXJnZXQpIHwgJChidWlsZF90YXJnZXRfZGlyKQ0KKwkkKGNvbXBpbGVyX3RhcmdldCkgJChvcHRzX2xpYm9mZmxvYWRfdGFyZ2V0KSAkKG9wdHNfdGFyZ2V0KSAkXiAtbyAkQA0KKw0KKyQob2JqX3RhcmdldF9kaXIpLyUubzogJChzb3VyY2VfZGlyKS8lLmMgJChoZWFkZXJzKSB8ICQob2JqX3RhcmdldF9kaXIpDQorCSQoY29tcGlsZXJfdGFyZ2V0KSAkKG9wdHNfY29tbW9uKSAkKG9wdHNfdGFyZ2V0KSAkPCAtbyAkQA0KKw0KKyQob2JqX3RhcmdldF9kaXIpLyUubzogJChzb3VyY2VfZGlyKS8lLmNwcCAkKGhlYWRlcnMpIHwgJChvYmpfdGFyZ2V0X2RpcikNCisJJChjb21waWxlcl90YXJnZXQpICQob3B0c19jb21tb24pICQob3B0c190YXJnZXQpICQ8IC1vICRADQorDQorJChvYmpfdGFyZ2V0X2RpcikvJS5vOiAkKHNvdXJjZV9kaXIpL2NvaS8lLmNwcCAkKGhlYWRlcnMpIHwgJChvYmpfdGFyZ2V0X2RpcikNCisJJChjb21waWxlcl90YXJnZXQpICQob3B0c19jb21tb24pICQob3B0c190YXJnZXQpICQ8IC1vICRADQorDQorJChvYmpfdGFyZ2V0X2RpcikvJS5vOiAkKHNvdXJjZV9kaXIpL29yc2wtbGl0ZS9saWIvJS5jICQoaGVhZGVycykgfCAkKG9ial90YXJnZXRfZGlyKQ0KKwkkKGNvbXBpbGVyX3RhcmdldCkgJChvcHRzX2NvbW1vbikgJChvcHRzX3RhcmdldCkgJDwgLW8gJEANCisNCisNCiskKGJ1aWxkX2hvc3RfZGlyKS8lLm86ICQoc291cmNlX2RpcikvJS5jcHAgJChoZWFkZXJzKSB8ICQoYnVpbGRfaG9zdF9kaXIpDQorCSQoY29tcGlsZXJfaG9zdCkgJChvcHRzX2NvbW1vbikgJChvcHRzX2hvc3QpICQ8IC1vICRADQorDQorJChidWlsZF90YXJnZXRfZGlyKS8lLm86ICQoc291cmNlX2RpcikvJS5jcHAgJChoZWFkZXJzKSB8ICQoYnVpbGRfdGFyZ2V0X2RpcikNCisJJChjb21waWxlcl90YXJnZXQpICQob3B0c19jb21tb24pICQob3B0c190YXJnZXQpICQ8IC1vICRADQorDQorDQorJChpbXBvcnRlZF9kaXIpL29tcC5oOiAkKG9tcF9oZWFkZXJfZGlyKS9vbXAuaCB8ICQoaW1wb3J0ZWRfZGlyKQ0KKwljcCAkPCAkQA0KKw0KKw0KKyQoYnVpbGRfaG9zdF9kaXIpICQoYnVpbGRfdGFyZ2V0X2RpcikgJChvYmpfaG9zdF9kaXIpICQob2JqX3RhcmdldF9kaXIpOiB8ICQoYnVpbGRfZGlyKQ0KKwkkKHNoZWxsIG1rZGlyIC1wICRAID4vZGV2L251bGwgMj4vZGV2L251bGwpDQorCUBlY2hvICJDcmVhdGVkICRAIGRpcmVjdG9yeSINCisNCiskKGJ1aWxkX2Rpcik6DQorCSQoc2hlbGwgbWtkaXIgLXAgJEAgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCkNCisJQGVjaG8gIkNyZWF0ZWQgJEAgZGlyZWN0b3J5Ig0KKw0KKyQoaW1wb3J0ZWRfZGlyKToNCisJJChzaGVsbCBta2RpciAtcCAkQCA+L2Rldi9udWxsIDI+L2Rldi9udWxsKQ0KKwlAZWNobyAiQ3JlYXRlZCAkQCBkaXJlY3RvcnkiDQorDQorDQorY2xlYW46DQorCSQoc2hlbGwgcm0gLXJmICQoYnVpbGRfZGlyKSkNCisJQGVjaG8gIlJlbW92ZSAkKGJ1aWxkX2RpcikgZGlyZWN0b3J5Ig0KKw0KKw0KK2luZm86DQorCUBlY2hvICJyb290X2RpciA9ICQocm9vdF9kaXIpIg0KKwlAZWNobyAiYnVpbGRfZGlyID0gJChidWlsZF9kaXIpIg0KKwlAZWNobyAibXBzc19kaXIgPSAkKG1wc3NfZGlyKSINCisJQGVjaG8gImxpYmlvbXBfaG9zdF9kaXIgPSAkKGxpYmlvbXBfaG9zdF9kaXIpIg0KKwlAZWNobyAibGliaW9tcF90YXJnZXRfZGlyID0gJChsaWJpb21wX3RhcmdldF9kaXIpIg0KKwlAZWNobyAib21wX2hlYWRlcl9kaXIgPSAkKG9tcF9oZWFkZXJfZGlyKSINCisJQGVjaG8gIm9zX2hvc3QgPSAkKG9zX2hvc3QpIg0KKwlAZWNobyAib3NfdGFyZ2V0ID0gJChvc190YXJnZXQpIg0KKwlAZWNobyAiY29tcGlsZXJfaG9zdCA9ICQoY29tcGlsZXJfaG9zdCkiDQorCUBlY2hvICJjb21waWxlcl90YXJnZXQgPSAkKGNvbXBpbGVyX3RhcmdldCkiDQorCUBlY2hvICJvcHRpb25zX2hvc3QgPSAkKG9wdGlvbnNfaG9zdCkiDQorCUBlY2hvICJvcHRpb25zX3RhcmdldCA9ICQob3B0aW9uc190YXJnZXQpIg0KKw0KZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvUkVBRE1FLnR4dCBiL2ZpbmFsL29mZmxvYWQvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lYjlmYjFkCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9SRUFETUUudHh0CkBAIC0wLDAgKzEsMTI5IEBACisNCisJICAgICAgIFJFQURNRSBmb3IgSW50ZWwoUikgT2ZmbG9hZCBSdW50aW1lIExpYnJhcnkNCisJICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisNCitIb3cgdG8gQnVpbGQgRG9jdW1lbnRhdGlvbg0KKz09PT09PT09PT09PT09PT09PT09PT09PT09DQorDQorVGhlIG1haW4gZG9jdW1lbnRhdGlvbiBpcyBpbiBEb3h5Z2VuKiBmb3JtYXQsIGFuZCB0aGlzIGRpc3RyaWJ1dGlvbg0KK3Nob3VsZCBjb21lIHdpdGggcHJlLWJ1aWx0IFBERiBkb2N1bWVudGF0aW9uIGluIGRvYy9SZWZlcmVuY2UucGRmLg0KK0hvd2V2ZXIsIGFuIEhUTUwgdmVyc2lvbiBjYW4gYmUgYnVpbHQgYnkgZXhlY3V0aW5nOg0KKw0KKyUgZG94eWdlbiBkb2MvZG94eWdlbi9jb25maWcNCisNCitpbiB0aGlzIGRpcmVjdG9yeS4NCisNCitUaGF0IHdpbGwgcHJvZHVjZSBIVE1MIGRvY3VtZW50YXRpb24gaW4gdGhlIGRvYy9kb3h5Z2VuL2dlbmVyYXRlZA0KK2RpcmVjdG9yeSwgd2hpY2ggY2FuIGJlIGFjY2Vzc2VkIGJ5IHBvaW50aW5nIGEgd2ViIGJyb3dzZXIgYXQgdGhlDQoraW5kZXguaHRtbCBmaWxlIHRoZXJlLg0KKw0KK0lmIHlvdSBkb24ndCBoYXZlIERveHlnZW4gaW5zdGFsbGVkLCB5b3UgY2FuIGRvd25sb2FkIGl0IGZyb20NCit3d3cuZG94eWdlbi5vcmcuDQorDQorDQorU29mdHdhcmUgUmVxdWlyZW1lbnRzDQorPT09PT09PT09PT09PT09PT09PT09DQorDQorSW50ZWwoUikgT2ZmbG9hZCBSdW50aW1lIExpYnJhcnkgcmVxdWlyZXMgYWRkaXRpb25hbCBzb2Z0d2FyZToNCisNCisxKSBJbnRlbChSKSBPcGVuTVAqIFJ1bnRpbWUgTGlicmFyeS4gIFlvdSBjYW4gZWl0aGVyIGRvd25sb2FkIHRoZSBzb3VyY2UNCitjb2RlIGZvciB0aGF0IChmcm9tIG9wZW5tcHJ0bC5vcmcgb3Igb3Blbm1wLmxsdm0ub3JnKSBvciBzaW1wbHkgdXNlIHRoZQ0KK2NvbXBpbGVkIHZlcnNpb24gZGlzdHJpYnV0ZWQgd2l0aCB0aGUgSW50ZWwgY29tcGlsZXJzLg0KKzIpIEludGVsKFIpIENPSSBSdW50aW1lIExpYnJhcnkgYW5kIEludGVsKFIpIE1ZTyBSdW50aW1lIExpYnJhcnkuICBUaGVzZQ0KK2xpYnJhcmllcyBhcmUgcGFydCBvZiBJbnRlbChSKSBNYW55Y29yZSBQbGF0Zm9ybSBTb2Z0d2FyZSBTdGFjayAoTVBTUykuICBZb3UNCitjYW4gZG93bmxvYWQgTVBTUyBzb3VyY2UgY29kZSBvciBiaW5hcmllcyBmcm9tDQorc29mdHdhcmUuaW50ZWwuY29tL2VuLXVzL2FydGljbGVzL2ludGVsLW1hbnljb3JlLXBsYXRmb3JtLXNvZnR3YXJlLXN0YWNrLW1wc3MuDQorQmluYXJpZXMgaW5jbHVkZSBob3N0IGxpYnJhcmllcyBmb3IgSW50ZWwoUikgNjQgQXJjaGl0ZWN0dXJlIGFuZCB0YXJnZXQNCitsaWJyYXJpZXMgZm9yIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZS4NCisNCitBbHNvIHlvdSB3aWxsIHJlcXVpcmUgYWxsIG9mIHRoZSBsaWJyYXJpZXMgdGhhdCBlbmFibGUgdGhlIHRhcmdldCBjb2RlIHRvIHJ1bg0KK29uIGRldmljZS4gIElmIHlvdSB0YXJnZXQgdGhlIEludGVsKFIpIFhlb24gUGhpIChUTSkgY29wcm9jZXNzb3IsIHRoZXNlDQorbGlicmFyaWVzIGNhbiBiZSB0YWtlbiBmcm9tIE1QU1MgdG9vLg0KKw0KKw0KK0hvdyB0byBCdWlsZCB0aGUgSW50ZWwoUikgT2ZmbG9hZCBSdW50aW1lIExpYnJhcnkNCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorDQorVGhlIE1ha2VmaWxlIGF0IHRoZSB0b3AtbGV2ZWwgd2lsbCBhdHRlbXB0IHRvIGRldGVjdCB3aGF0IGl0IG5lZWRzIHRvDQorYnVpbGQgdGhlIEludGVsKFIpIE9mZmxvYWQgUnVudGltZSBMaWJyYXJ5LiAgVG8gc2VlIHRoZSBkZWZhdWx0IHNldHRpbmdzLA0KK3R5cGU6DQorDQorbWFrZSBpbmZvDQorDQorWW91IGNhbiBjaGFuZ2UgdGhlIE1ha2VmaWxlJ3MgYmVoYXZpb3Igd2l0aCB0aGUgZm9sbG93aW5nIG9wdGlvbnM6DQorDQorcm9vdF9kaXI6CSAgICAgIFRoZSBwYXRoIHRvIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlDQorCQkgICAgICB0b3AtbGV2ZWwgTWFrZWZpbGUuICBCeSBkZWZhdWx0LCB0aGlzIHdpbGwgdGFrZSBvbiB0aGUNCisJCSAgICAgIHZhbHVlIG9mIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5Lg0KKw0KK2J1aWxkX2RpcjoJICAgICAgVGhlIHBhdGggdG8gdGhlIGJ1aWxkIGRpcmVjdG9yeS4gIEJ5IGRlZmF1bHQsIHRoaXMgd2lsbA0KKwkJICAgICAgdGFrZSBvbiB2YWx1ZSBbcm9vdF9kaXJdL2J1aWxkLg0KKw0KK21wc3NfZGlyOgkgICAgICBUaGUgcGF0aCB0byB0aGUgSW50ZWwoUikgTWFueWNvcmUgUGxhdGZvcm0gU29mdHdhcmUNCisJCSAgICAgIFN0YWNrIGluc3RhbGwgZGlyZWN0b3J5LiAgQnkgZGVmYXVsdCwgdGhpcyB3aWxsIHRha2Ugb24NCisJCSAgICAgIHRoZSB2YWx1ZSBvZiBvcGVyYXRpbmcgc3lzdGVtJ3Mgcm9vdCBkaXJlY3RvcnkuDQorDQorbGliaW9tcF9ob3N0X2RpcjogICAgIFRoZSBwYXRoIHRvIHRoZSBob3N0IEludGVsKFIpIE9wZW5NUCogUnVudGltZSBMaWJyYXJ5Lg0KKwkJICAgICAgVGhpcyBvcHRpb24gaXMgcmVxdWlyZWQgd2hlbiB0aGUgaG9zdCBjb21waWxlciBpcyBvdGhlcg0KKwkJICAgICAgdGhhbiBpY2MuDQorDQorbGliaW9tcF90YXJnZXRfZGlyOiAgIFRoZSBwYXRoIHRvIHRoZSB0YXJnZXQgSW50ZWwoUikgT3Blbk1QKiBSdW50aW1lDQorCQkgICAgICBMaWJyYXJ5LiAgVGhpcyBvcHRpb24gaXMgcmVxdWlyZWQgd2hlbiB0aGUgdGFyZ2V0DQorCQkgICAgICBjb21waWxlciBpcyBvdGhlciB0aGFuIGljYy4NCisNCitvbXBfaGVhZGVyX2RpcjogICAgICAgVGhlIHBhdGggdG8gdGhlIGhlYWRlciBmaWxlIDxvbXAuaD4gb2YgSW50ZWwoUikgT3Blbk1QKg0KKwkJICAgICAgUnVudGltZSBMaWJyYXJ5LiAgVGhpcyBvcHRpb24gaXMgcmVxdWlyZWQgaWYgZWl0aGVyIGhvc3QNCisJCSAgICAgIG9yIHRhcmdldCBjb21waWxlciBpcyBvdGhlciB0aGFuIGljYy4NCisNCitvc19ob3N0OgkgICAgICBPcGVyYXRpbmcgc3lzdGVtIG9uIGhvc3QuICBDdXJyZW50bHkgc3VwcG9ydHMgb25seQ0KKwkJICAgICAgImxpbnV4IiB3aGljaCBpcyBzZXQgYnkgZGVmYXVsdC4NCisNCitvc190YXJnZXQ6CSAgICAgIE9wZXJhdGluZyBzeXN0ZW0gb24gdGFyZ2V0IGRldmljZS4gIEN1cnJlbnRseSBzdXBwb3J0cw0KKwkJICAgICAgb25seSAibGludXgiIHdoaWNoIGlzIHNldCBieSBkZWZhdWx0Lg0KKw0KK2NvbXBpbGVyX2hvc3Q6CSAgICAgIFdoaWNoIGNvbXBpbGVyIHRvIHVzZSBmb3IgdGhlIGJ1aWxkIG9mIHRoZSBob3N0IHBhcnQuDQorCQkgICAgICBEZWZhdWx0cyB0byAiZ2NjIiouICBBbHNvIHN1cHBvcnRzICJpY2MiIGFuZCAiY2xhbmciKi4NCisJCSAgICAgIFlvdSBzaG91bGQgcHJvdmlkZSB0aGUgZnVsbCBwYXRoIHRvIHRoZSBjb21waWxlciBvciBpdA0KKwkJICAgICAgc2hvdWxkIGJlIGluIHRoZSB1c2VyJ3MgcGF0aC4NCisNCitjb21waWxlcl9ob3N0OgkgICAgICBXaGljaCBjb21waWxlciB0byB1c2UgZm9yIHRoZSBidWlsZCBvZiB0aGUgdGFyZ2V0IHBhcnQuDQorCQkgICAgICBEZWZhdWx0cyB0byAiZ2NjIiouICBBbHNvIHN1cHBvcnRzICJpY2MiIGFuZCAiY2xhbmciKi4NCisJCSAgICAgIFlvdSBzaG91bGQgcHJvdmlkZSB0aGUgZnVsbCBwYXRoIHRvIHRoZSBjb21waWxlciBvciBpdA0KKwkJICAgICAgc2hvdWxkIGJlIGluIHRoZSB1c2VyJ3MgcGF0aC4NCisNCitvcHRpb25zX2hvc3Q6CSAgICAgIEFkZGl0aW9uYWwgb3B0aW9ucyBmb3IgdGhlIGhvc3QgY29tcGlsZXIuDQorDQorb3B0aW9uc190YXJnZXQ6ICAgICAgIEFkZGl0aW9uYWwgb3B0aW9ucyBmb3IgdGhlIHRhcmdldCBjb21waWxlci4NCisNCitUbyB1c2UgYW55IG9mIHRoZSBvcHRpb25zIGFib3ZlLCBzaW1wbGUgYWRkIDxvcHRpb25fbmFtZT49PHZhbHVlPi4gIEZvcg0KK2V4YW1wbGUsIGlmIHlvdSB3YW50IHRvIGJ1aWxkIHdpdGggaWNjIGluc3RlYWQgb2YgZ2NjLCB0eXBlOg0KKw0KK21ha2UgY29tcGlsZXJfaG9zdD1pY2MgY29tcGlsZXJfdGFyZ2V0PWljYw0KKw0KKw0KK1N1cHBvcnRlZCBSVEwgQnVpbGQgQ29uZmlndXJhdGlvbnMNCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorDQorU3VwcG9ydGVkIEFyY2hpdGVjdHVyZXM6IEludGVsKFIpIDY0LCBhbmQgSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkDQorQ29yZSBBcmNoaXRlY3R1cmUNCisNCisJICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorCSAgICAgIHwgICBpY2MvaWNsICAgICB8ICAgIGdjYyAgICAgIHwgICAgY2xhbmcgICAgfA0KKy0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQorfCBMaW51eCogT1MgICB8ICAgICAgWWVzICAgICAgfCAgICAgWWVzKDEpICB8ICAgICBZZXMoMSkgIHwNCit8IE9TIFgqICAgICAgIHwgICAgICAgTm8gICAgICB8ICAgICAgTm8gICAgIHwgICAgICBObyAgICAgfA0KK3wgV2luZG93cyogT1MgfCAgICAgICBObyAgICAgIHwgICAgICBObyAgICAgfCAgICAgIE5vICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisoMSkgTGlib2ZmbG9hZCByZXF1aXJlcyBfcmR0c2MgaW50cmluc2ljLCB3aGljaCBtYXkgYmUgdW5zdXBwb3J0ZWQgYnkgc29tZQ0KKyAgICB2ZXJzaW9ucyBvZiBjb21waWxlci4gIEluIHRoaXMgY2FzZSB5b3UgbmVlZCB0byBpbmNsdWRlIHNyYy9yZHRzYy5oDQorICAgIG1hbnVhbGx5IGJ5IHVzaW5nIE1ha2VmaWxlIG9wdGlvbnMgb3B0aW9uc19ob3N0IGFuZCBvcHRpb25zX3RhcmdldDoNCisNCisgICAgbWFrZSBvcHRpb25zX2hvc3Q9Ii1pbmNsdWRlIHNyYy9yZHRzYy5oIiBvcHRpb25zX3RhcmdldD0iLWluY2x1ZGUgc3JjL3JkdHNjLmgiDQorDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCitOb3RpY2VzDQorPT09PT09PQ0KKw0KKypPdGhlciBuYW1lcyBhbmQgYnJhbmRzIG1heSBiZSBjbGFpbWVkIGFzIHRoZSBwcm9wZXJ0eSBvZiBvdGhlcnMuDQpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9kb2MvUmVmZXJlbmNlLnBkZiBiL2ZpbmFsL29mZmxvYWQvZG9jL1JlZmVyZW5jZS5wZGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkxNzZmMAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvZG9jL1JlZmVyZW5jZS5wZGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9kb2MvZG94eWdlbi9jb25maWcgYi9maW5hbC9vZmZsb2FkL2RvYy9kb3h5Z2VuL2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNDViNjk2Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9kb2MvZG94eWdlbi9jb25maWcKQEAgLTAsMCArMSwyMzI4IEBACisjIERveHlmaWxlIDEuOC42CisKKyMgVGhpcyBmaWxlIGRlc2NyaWJlcyB0aGUgc2V0dGluZ3MgdG8gYmUgdXNlZCBieSB0aGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0KKyMgZG94eWdlbiAod3d3LmRveHlnZW4ub3JnKSBmb3IgYSBwcm9qZWN0LgorIworIyBBbGwgdGV4dCBhZnRlciBhIGRvdWJsZSBoYXNoICgjIykgaXMgY29uc2lkZXJlZCBhIGNvbW1lbnQgYW5kIGlzIHBsYWNlZCBpbgorIyBmcm9udCBvZiB0aGUgVEFHIGl0IGlzIHByZWNlZGluZy4KKyMKKyMgQWxsIHRleHQgYWZ0ZXIgYSBzaW5nbGUgaGFzaCAoIykgaXMgY29uc2lkZXJlZCBhIGNvbW1lbnQgYW5kIHdpbGwgYmUgaWdub3JlZC4KKyMgVGhlIGZvcm1hdCBpczoKKyMgVEFHID0gdmFsdWUgW3ZhbHVlLCAuLi5dCisjIEZvciBsaXN0cywgaXRlbXMgY2FuIGFsc28gYmUgYXBwZW5kZWQgdXNpbmc6CisjIFRBRyArPSB2YWx1ZSBbdmFsdWUsIC4uLl0KKyMgVmFsdWVzIHRoYXQgY29udGFpbiBzcGFjZXMgc2hvdWxkIGJlIHBsYWNlZCBiZXR3ZWVuIHF1b3RlcyAoXCIgXCIpLgorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFByb2plY3QgcmVsYXRlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGlzIHRhZyBzcGVjaWZpZXMgdGhlIGVuY29kaW5nIHVzZWQgZm9yIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBjb25maWcgZmlsZQorIyB0aGF0IGZvbGxvdy4gVGhlIGRlZmF1bHQgaXMgVVRGLTggd2hpY2ggaXMgYWxzbyB0aGUgZW5jb2RpbmcgdXNlZCBmb3IgYWxsIHRleHQKKyMgYmVmb3JlIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoaXMgdGFnLiBEb3h5Z2VuIHVzZXMgbGliaWNvbnYgKG9yIHRoZSBpY29udgorIyBidWlsdCBpbnRvIGxpYmMpIGZvciB0aGUgdHJhbnNjb2RpbmcuIFNlZSBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvbGliaWNvbnYKKyMgZm9yIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGVuY29kaW5ncy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFVURi04LgorCitET1hZRklMRV9FTkNPRElORyAgICAgID0gVVRGLTgKKworIyBUaGUgUFJPSkVDVF9OQU1FIHRhZyBpcyBhIHNpbmdsZSB3b3JkIChvciBhIHNlcXVlbmNlIG9mIHdvcmRzIHN1cnJvdW5kZWQgYnkKKyMgZG91YmxlLXF1b3RlcywgdW5sZXNzIHlvdSBhcmUgdXNpbmcgRG94eXdpemFyZCkgdGhhdCBzaG91bGQgaWRlbnRpZnkgdGhlCisjIHByb2plY3QgZm9yIHdoaWNoIHRoZSBkb2N1bWVudGF0aW9uIGlzIGdlbmVyYXRlZC4gVGhpcyBuYW1lIGlzIHVzZWQgaW4gdGhlCisjIHRpdGxlIG9mIG1vc3QgZ2VuZXJhdGVkIHBhZ2VzIGFuZCBpbiBhIGZldyBvdGhlciBwbGFjZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBNeSBQcm9qZWN0LgorCitQUk9KRUNUX05BTUUgICAgICAgICAgID0gIkludGVsJnJlZzsmbmJzcDtPZmZsb2FkIFJ1bnRpbWUgTGlicmFyeSIKKworIyBUaGUgUFJPSkVDVF9OVU1CRVIgdGFnIGNhbiBiZSB1c2VkIHRvIGVudGVyIGEgcHJvamVjdCBvciByZXZpc2lvbiBudW1iZXIuIFRoaXMKKyMgY291bGQgYmUgaGFuZHkgZm9yIGFyY2hpdmluZyB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24gb3IgaWYgc29tZSB2ZXJzaW9uCisjIGNvbnRyb2wgc3lzdGVtIGlzIHVzZWQuCisKK1BST0pFQ1RfTlVNQkVSICAgICAgICAgPSAKKworIyBVc2luZyB0aGUgUFJPSkVDVF9CUklFRiB0YWcgb25lIGNhbiBwcm92aWRlIGFuIG9wdGlvbmFsIG9uZSBsaW5lIGRlc2NyaXB0aW9uCisjIGZvciBhIHByb2plY3QgdGhhdCBhcHBlYXJzIGF0IHRoZSB0b3Agb2YgZWFjaCBwYWdlIGFuZCBzaG91bGQgZ2l2ZSB2aWV3ZXIgYQorIyBxdWljayBpZGVhIGFib3V0IHRoZSBwdXJwb3NlIG9mIHRoZSBwcm9qZWN0LiBLZWVwIHRoZSBkZXNjcmlwdGlvbiBzaG9ydC4KKworUFJPSkVDVF9CUklFRiAgICAgICAgICA9IAorCisjIFdpdGggdGhlIFBST0pFQ1RfTE9HTyB0YWcgb25lIGNhbiBzcGVjaWZ5IGFuIGxvZ28gb3IgaWNvbiB0aGF0IGlzIGluY2x1ZGVkIGluCisjIHRoZSBkb2N1bWVudGF0aW9uLiBUaGUgbWF4aW11bSBoZWlnaHQgb2YgdGhlIGxvZ28gc2hvdWxkIG5vdCBleGNlZWQgNTUgcGl4ZWxzCisjIGFuZCB0aGUgbWF4aW11bSB3aWR0aCBzaG91bGQgbm90IGV4Y2VlZCAyMDAgcGl4ZWxzLiBEb3h5Z2VuIHdpbGwgY29weSB0aGUgbG9nbworIyB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4KKworUFJPSkVDVF9MT0dPICAgICAgICAgICA9IAorCisjIFRoZSBPVVRQVVRfRElSRUNUT1JZIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIChyZWxhdGl2ZSBvciBhYnNvbHV0ZSkgcGF0aAorIyBpbnRvIHdoaWNoIHRoZSBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiB3aWxsIGJlIHdyaXR0ZW4uIElmIGEgcmVsYXRpdmUgcGF0aCBpcworIyBlbnRlcmVkLCBpdCB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoZSBsb2NhdGlvbiB3aGVyZSBkb3h5Z2VuIHdhcyBzdGFydGVkLiBJZgorIyBsZWZ0IGJsYW5rIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB3aWxsIGJlIHVzZWQuCisKK09VVFBVVF9ESVJFQ1RPUlkgICAgICAgPSBkb2MvZG94eWdlbi9nZW5lcmF0ZWQKKworIyBJZiB0aGUgQ1JFQVRFX1NVQkRJUlMgdGFnIGlzIHNldCB0byBZRVMsIHRoZW4gZG94eWdlbiB3aWxsIGNyZWF0ZSA0MDk2IHN1Yi0KKyMgZGlyZWN0b3JpZXMgKGluIDIgbGV2ZWxzKSB1bmRlciB0aGUgb3V0cHV0IGRpcmVjdG9yeSBvZiBlYWNoIG91dHB1dCBmb3JtYXQgYW5kCisjIHdpbGwgZGlzdHJpYnV0ZSB0aGUgZ2VuZXJhdGVkIGZpbGVzIG92ZXIgdGhlc2UgZGlyZWN0b3JpZXMuIEVuYWJsaW5nIHRoaXMKKyMgb3B0aW9uIGNhbiBiZSB1c2VmdWwgd2hlbiBmZWVkaW5nIGRveHlnZW4gYSBodWdlIGFtb3VudCBvZiBzb3VyY2UgZmlsZXMsIHdoZXJlCisjIHB1dHRpbmcgYWxsIGdlbmVyYXRlZCBmaWxlcyBpbiB0aGUgc2FtZSBkaXJlY3Rvcnkgd291bGQgb3RoZXJ3aXNlIGNhdXNlcworIyBwZXJmb3JtYW5jZSBwcm9ibGVtcyBmb3IgdGhlIGZpbGUgc3lzdGVtLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0NSRUFURV9TVUJESVJTICAgICAgICAgPSBOTworCisjIFRoZSBPVVRQVVRfTEFOR1VBR0UgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgbGFuZ3VhZ2UgaW4gd2hpY2ggYWxsCisjIGRvY3VtZW50YXRpb24gZ2VuZXJhdGVkIGJ5IGRveHlnZW4gaXMgd3JpdHRlbi4gRG94eWdlbiB3aWxsIHVzZSB0aGlzCisjIGluZm9ybWF0aW9uIHRvIGdlbmVyYXRlIGFsbCBjb25zdGFudCBvdXRwdXQgaW4gdGhlIHByb3BlciBsYW5ndWFnZS4KKyMgUG9zc2libGUgdmFsdWVzIGFyZTogQWZyaWthYW5zLCBBcmFiaWMsIEFybWVuaWFuLCBCcmF6aWxpYW4sIENhdGFsYW4sIENoaW5lc2UsCisjIENoaW5lc2UtVHJhZGl0aW9uYWwsIENyb2F0aWFuLCBDemVjaCwgRGFuaXNoLCBEdXRjaCwgRW5nbGlzaCAoVW5pdGVkIFN0YXRlcyksCisjIEVzcGVyYW50bywgRmFyc2kgKFBlcnNpYW4pLCBGaW5uaXNoLCBGcmVuY2gsIEdlcm1hbiwgR3JlZWssIEh1bmdhcmlhbiwKKyMgSW5kb25lc2lhbiwgSXRhbGlhbiwgSmFwYW5lc2UsIEphcGFuZXNlLWVuIChKYXBhbmVzZSB3aXRoIEVuZ2xpc2ggbWVzc2FnZXMpLAorIyBLb3JlYW4sIEtvcmVhbi1lbiAoS29yZWFuIHdpdGggRW5nbGlzaCBtZXNzYWdlcyksIExhdHZpYW4sIExpdGh1YW5pYW4sCisjIE1hY2Vkb25pYW4sIE5vcndlZ2lhbiwgUGVyc2lhbiAoRmFyc2kpLCBQb2xpc2gsIFBvcnR1Z3Vlc2UsIFJvbWFuaWFuLCBSdXNzaWFuLAorIyBTZXJiaWFuLCBTZXJiaWFuLUN5cmlsbGljLCBTbG92YWssIFNsb3ZlbmUsIFNwYW5pc2gsIFN3ZWRpc2gsIFR1cmtpc2gsCisjIFVrcmFpbmlhbiBhbmQgVmlldG5hbWVzZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IEVuZ2xpc2guCisKK09VVFBVVF9MQU5HVUFHRSAgICAgICAgPSBFbmdsaXNoCisKKyMgSWYgdGhlIEJSSUVGX01FTUJFUl9ERVNDIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBpbmNsdWRlIGJyaWVmIG1lbWJlcgorIyBkZXNjcmlwdGlvbnMgYWZ0ZXIgdGhlIG1lbWJlcnMgdGhhdCBhcmUgbGlzdGVkIGluIHRoZSBmaWxlIGFuZCBjbGFzcworIyBkb2N1bWVudGF0aW9uIChzaW1pbGFyIHRvIEphdmFkb2MpLiBTZXQgdG8gTk8gdG8gZGlzYWJsZSB0aGlzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitCUklFRl9NRU1CRVJfREVTQyAgICAgID0gWUVTCisKKyMgSWYgdGhlIFJFUEVBVF9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgcHJlcGVuZCB0aGUgYnJpZWYKKyMgZGVzY3JpcHRpb24gb2YgYSBtZW1iZXIgb3IgZnVuY3Rpb24gYmVmb3JlIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbgorIworIyBOb3RlOiBJZiBib3RoIEhJREVfVU5ET0NfTUVNQkVSUyBhbmQgQlJJRUZfTUVNQkVSX0RFU0MgYXJlIHNldCB0byBOTywgdGhlCisjIGJyaWVmIGRlc2NyaXB0aW9ucyB3aWxsIGJlIGNvbXBsZXRlbHkgc3VwcHJlc3NlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworUkVQRUFUX0JSSUVGICAgICAgICAgICA9IFlFUworCisjIFRoaXMgdGFnIGltcGxlbWVudHMgYSBxdWFzaS1pbnRlbGxpZ2VudCBicmllZiBkZXNjcmlwdGlvbiBhYmJyZXZpYXRvciB0aGF0IGlzCisjIHVzZWQgdG8gZm9ybSB0aGUgdGV4dCBpbiB2YXJpb3VzIGxpc3RpbmdzLiBFYWNoIHN0cmluZyBpbiB0aGlzIGxpc3QsIGlmIGZvdW5kCisjIGFzIHRoZSBsZWFkaW5nIHRleHQgb2YgdGhlIGJyaWVmIGRlc2NyaXB0aW9uLCB3aWxsIGJlIHN0cmlwcGVkIGZyb20gdGhlIHRleHQKKyMgYW5kIHRoZSByZXN1bHQsIGFmdGVyIHByb2Nlc3NpbmcgdGhlIHdob2xlIGxpc3QsIGlzIHVzZWQgYXMgdGhlIGFubm90YXRlZAorIyB0ZXh0LiBPdGhlcndpc2UsIHRoZSBicmllZiBkZXNjcmlwdGlvbiBpcyB1c2VkIGFzLWlzLiBJZiBsZWZ0IGJsYW5rLCB0aGUKKyMgZm9sbG93aW5nIHZhbHVlcyBhcmUgdXNlZCAoJG5hbWUgaXMgYXV0b21hdGljYWxseSByZXBsYWNlZCB3aXRoIHRoZSBuYW1lIG9mCisjIHRoZSBlbnRpdHkpOlRoZSAkbmFtZSBjbGFzcywgVGhlICRuYW1lIHdpZGdldCwgVGhlICRuYW1lIGZpbGUsIGlzLCBwcm92aWRlcywKKyMgc3BlY2lmaWVzLCBjb250YWlucywgcmVwcmVzZW50cywgYSwgYW4gYW5kIHRoZS4KKworQUJCUkVWSUFURV9CUklFRiAgICAgICA9ICJUaGUgJG5hbWUgY2xhc3MiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlICRuYW1lIHdpZGdldCIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgJG5hbWUgZmlsZSIgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGlzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWlucyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcmVzZW50cyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgYSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgYW4gXAorICAgICAgICAgICAgICAgICAgICAgICAgIHRoZQorCisjIElmIHRoZSBBTFdBWVNfREVUQUlMRURfU0VDIGFuZCBSRVBFQVRfQlJJRUYgdGFncyBhcmUgYm90aCBzZXQgdG8gWUVTIHRoZW4KKyMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZGV0YWlsZWQgc2VjdGlvbiBldmVuIGlmIHRoZXJlIGlzIG9ubHkgYSBicmllZgorIyBkZXNjcmlwdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitBTFdBWVNfREVUQUlMRURfU0VDICAgID0gTk8KKworIyBJZiB0aGUgSU5MSU5FX0lOSEVSSVRFRF9NRU1CIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgc2hvdyBhbGwKKyMgaW5oZXJpdGVkIG1lbWJlcnMgb2YgYSBjbGFzcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGF0IGNsYXNzIGFzIGlmIHRob3NlCisjIG1lbWJlcnMgd2VyZSBvcmRpbmFyeSBjbGFzcyBtZW1iZXJzLiBDb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3JzIGFuZCBhc3NpZ25tZW50CisjIG9wZXJhdG9ycyBvZiB0aGUgYmFzZSBjbGFzc2VzIHdpbGwgbm90IGJlIHNob3duLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0lOTElORV9JTkhFUklURURfTUVNQiAgPSBOTworCisjIElmIHRoZSBGVUxMX1BBVEhfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIHByZXBlbmQgdGhlIGZ1bGwgcGF0aAorIyBiZWZvcmUgZmlsZXMgbmFtZSBpbiB0aGUgZmlsZSBsaXN0IGFuZCBpbiB0aGUgaGVhZGVyIGZpbGVzLiBJZiBzZXQgdG8gTk8gdGhlCisjIHNob3J0ZXN0IHBhdGggdGhhdCBtYWtlcyB0aGUgZmlsZSBuYW1lIHVuaXF1ZSB3aWxsIGJlIHVzZWQKKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworRlVMTF9QQVRIX05BTUVTICAgICAgICA9IFlFUworCisjIFRoZSBTVFJJUF9GUk9NX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHN0cmlwIGEgdXNlci1kZWZpbmVkIHBhcnQgb2YgdGhlIHBhdGguCisjIFN0cmlwcGluZyBpcyBvbmx5IGRvbmUgaWYgb25lIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyBtYXRjaGVzIHRoZSBsZWZ0LWhhbmQKKyMgcGFydCBvZiB0aGUgcGF0aC4gVGhlIHRhZyBjYW4gYmUgdXNlZCB0byBzaG93IHJlbGF0aXZlIHBhdGhzIGluIHRoZSBmaWxlIGxpc3QuCisjIElmIGxlZnQgYmxhbmsgdGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIGRveHlnZW4gaXMgcnVuIGlzIHVzZWQgYXMgdGhlIHBhdGggdG8KKyMgc3RyaXAuCisjCisjIE5vdGUgdGhhdCB5b3UgY2FuIHNwZWNpZnkgYWJzb2x1dGUgcGF0aHMgaGVyZSwgYnV0IGFsc28gcmVsYXRpdmUgcGF0aHMsIHdoaWNoCisjIHdpbGwgYmUgcmVsYXRpdmUgZnJvbSB0aGUgZGlyZWN0b3J5IHdoZXJlIGRveHlnZW4gaXMgc3RhcnRlZC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEZVTExfUEFUSF9OQU1FUyBpcyBzZXQgdG8gWUVTLgorCitTVFJJUF9GUk9NX1BBVEggICAgICAgID0gc3JjLworCisjIFRoZSBTVFJJUF9GUk9NX0lOQ19QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzdHJpcCBhIHVzZXItZGVmaW5lZCBwYXJ0IG9mIHRoZQorIyBwYXRoIG1lbnRpb25lZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiBhIGNsYXNzLCB3aGljaCB0ZWxscyB0aGUgcmVhZGVyIHdoaWNoCisjIGhlYWRlciBmaWxlIHRvIGluY2x1ZGUgaW4gb3JkZXIgdG8gdXNlIGEgY2xhc3MuIElmIGxlZnQgYmxhbmsgb25seSB0aGUgbmFtZSBvZgorIyB0aGUgaGVhZGVyIGZpbGUgY29udGFpbmluZyB0aGUgY2xhc3MgZGVmaW5pdGlvbiBpcyB1c2VkLiBPdGhlcndpc2Ugb25lIHNob3VsZAorIyBzcGVjaWZ5IHRoZSBsaXN0IG9mIGluY2x1ZGUgcGF0aHMgdGhhdCBhcmUgbm9ybWFsbHkgcGFzc2VkIHRvIHRoZSBjb21waWxlcgorIyB1c2luZyB0aGUgLUkgZmxhZy4KKworU1RSSVBfRlJPTV9JTkNfUEFUSCAgICA9IHNyYy8KKworIyBJZiB0aGUgU0hPUlRfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBtdWNoIHNob3J0ZXIgKGJ1dAorIyBsZXNzIHJlYWRhYmxlKSBmaWxlIG5hbWVzLiBUaGlzIGNhbiBiZSB1c2VmdWwgaXMgeW91ciBmaWxlIHN5c3RlbXMgZG9lc24ndAorIyBzdXBwb3J0IGxvbmcgbmFtZXMgbGlrZSBvbiBET1MsIE1hYywgb3IgQ0QtUk9NLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NIT1JUX05BTUVTICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBKQVZBRE9DX0FVVE9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBpbnRlcnByZXQgdGhlCisjIGZpcnN0IGxpbmUgKHVudGlsIHRoZSBmaXJzdCBkb3QpIG9mIGEgSmF2YWRvYy1zdHlsZSBjb21tZW50IGFzIHRoZSBicmllZgorIyBkZXNjcmlwdGlvbi4gSWYgc2V0IHRvIE5PLCB0aGUgSmF2YWRvYy1zdHlsZSB3aWxsIGJlaGF2ZSBqdXN0IGxpa2UgcmVndWxhciBRdC0KKyMgc3R5bGUgY29tbWVudHMgKHRodXMgcmVxdWlyaW5nIGFuIGV4cGxpY2l0IEBicmllZiBjb21tYW5kIGZvciBhIGJyaWVmCisjIGRlc2NyaXB0aW9uLikKKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitKQVZBRE9DX0FVVE9CUklFRiAgICAgID0gTk8KKworIyBJZiB0aGUgUVRfQVVUT0JSSUVGIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGludGVycHJldCB0aGUgZmlyc3QKKyMgbGluZSAodW50aWwgdGhlIGZpcnN0IGRvdCkgb2YgYSBRdC1zdHlsZSBjb21tZW50IGFzIHRoZSBicmllZiBkZXNjcmlwdGlvbi4gSWYKKyMgc2V0IHRvIE5PLCB0aGUgUXQtc3R5bGUgd2lsbCBiZWhhdmUganVzdCBsaWtlIHJlZ3VsYXIgUXQtc3R5bGUgY29tbWVudHMgKHRodXMKKyMgcmVxdWlyaW5nIGFuIGV4cGxpY2l0IFxicmllZiBjb21tYW5kIGZvciBhIGJyaWVmIGRlc2NyaXB0aW9uLikKKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitRVF9BVVRPQlJJRUYgICAgICAgICAgID0gTk8KKworIyBUaGUgTVVMVElMSU5FX0NQUF9JU19CUklFRiB0YWcgY2FuIGJlIHNldCB0byBZRVMgdG8gbWFrZSBkb3h5Z2VuIHRyZWF0IGEKKyMgbXVsdGktbGluZSBDKysgc3BlY2lhbCBjb21tZW50IGJsb2NrIChpLmUuIGEgYmxvY2sgb2YgLy8hIG9yIC8vLyBjb21tZW50cykgYXMKKyMgYSBicmllZiBkZXNjcmlwdGlvbi4gVGhpcyB1c2VkIHRvIGJlIHRoZSBkZWZhdWx0IGJlaGF2aW9yLiBUaGUgbmV3IGRlZmF1bHQgaXMKKyMgdG8gdHJlYXQgYSBtdWx0aS1saW5lIEMrKyBjb21tZW50IGJsb2NrIGFzIGEgZGV0YWlsZWQgZGVzY3JpcHRpb24uIFNldCB0aGlzCisjIHRhZyB0byBZRVMgaWYgeW91IHByZWZlciB0aGUgb2xkIGJlaGF2aW9yIGluc3RlYWQuCisjCisjIE5vdGUgdGhhdCBzZXR0aW5nIHRoaXMgdGFnIHRvIFlFUyBhbHNvIG1lYW5zIHRoYXQgcmF0aW9uYWwgcm9zZSBjb21tZW50cyBhcmUKKyMgbm90IHJlY29nbml6ZWQgYW55IG1vcmUuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworTVVMVElMSU5FX0NQUF9JU19CUklFRiA9IE5PCisKKyMgSWYgdGhlIElOSEVSSVRfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGFuIHVuZG9jdW1lbnRlZCBtZW1iZXIgaW5oZXJpdHMgdGhlCisjIGRvY3VtZW50YXRpb24gZnJvbSBhbnkgZG9jdW1lbnRlZCBtZW1iZXIgdGhhdCBpdCByZS1pbXBsZW1lbnRzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitJTkhFUklUX0RPQ1MgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFNFUEFSQVRFX01FTUJFUl9QQUdFUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlbiBkb3h5Z2VuIHdpbGwgcHJvZHVjZSBhCisjIG5ldyBwYWdlIGZvciBlYWNoIG1lbWJlci4gSWYgc2V0IHRvIE5PLCB0aGUgZG9jdW1lbnRhdGlvbiBvZiBhIG1lbWJlciB3aWxsIGJlCisjIHBhcnQgb2YgdGhlIGZpbGUvY2xhc3MvbmFtZXNwYWNlIHRoYXQgY29udGFpbnMgaXQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU0VQQVJBVEVfTUVNQkVSX1BBR0VTICA9IE5PCisKKyMgVGhlIFRBQl9TSVpFIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG51bWJlciBvZiBzcGFjZXMgaW4gYSB0YWIuIERveHlnZW4KKyMgdXNlcyB0aGlzIHZhbHVlIHRvIHJlcGxhY2UgdGFicyBieSBzcGFjZXMgaW4gY29kZSBmcmFnbWVudHMuCisjIE1pbmltdW0gdmFsdWU6IDEsIG1heGltdW0gdmFsdWU6IDE2LCBkZWZhdWx0IHZhbHVlOiA0LgorCitUQUJfU0laRSAgICAgICAgICAgICAgID0gOAorCisjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBudW1iZXIgb2YgYWxpYXNlcyB0aGF0IGFjdCBhcyBjb21tYW5kcyBpbgorIyB0aGUgZG9jdW1lbnRhdGlvbi4gQW4gYWxpYXMgaGFzIHRoZSBmb3JtOgorIyBuYW1lPXZhbHVlCisjIEZvciBleGFtcGxlIGFkZGluZworIyAic2lkZWVmZmVjdD1AcGFyIFNpZGUgRWZmZWN0czpcbiIKKyMgd2lsbCBhbGxvdyB5b3UgdG8gcHV0IHRoZSBjb21tYW5kIFxzaWRlZWZmZWN0IChvciBAc2lkZWVmZmVjdCkgaW4gdGhlCisjIGRvY3VtZW50YXRpb24sIHdoaWNoIHdpbGwgcmVzdWx0IGluIGEgdXNlci1kZWZpbmVkIHBhcmFncmFwaCB3aXRoIGhlYWRpbmcKKyMgIlNpZGUgRWZmZWN0czoiLiBZb3UgY2FuIHB1dCBcbidzIGluIHRoZSB2YWx1ZSBwYXJ0IG9mIGFuIGFsaWFzIHRvIGluc2VydAorIyBuZXdsaW5lcy4KKworQUxJQVNFUyAgICAgICAgICAgICAgICA9IAorCisjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBudW1iZXIgb2Ygd29yZC1rZXl3b3JkIG1hcHBpbmdzIChUQ0wgb25seSkuCisjIEEgbWFwcGluZyBoYXMgdGhlIGZvcm0gIm5hbWU9dmFsdWUiLiBGb3IgZXhhbXBsZSBhZGRpbmcgImNsYXNzPWl0Y2w6OmNsYXNzIgorIyB3aWxsIGFsbG93IHlvdSB0byB1c2UgdGhlIGNvbW1hbmQgY2xhc3MgaW4gdGhlIGl0Y2w6OmNsYXNzIG1lYW5pbmcuCisKK1RDTF9TVUJTVCAgICAgICAgICAgICAgPSAKKworIyBTZXQgdGhlIE9QVElNSVpFX09VVFBVVF9GT1JfQyB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBDIHNvdXJjZXMKKyMgb25seS4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgbW9yZSB0YWlsb3JlZCBmb3IgQy4gRm9yCisjIGluc3RhbmNlLCBzb21lIG9mIHRoZSBuYW1lcyB0aGF0IGFyZSB1c2VkIHdpbGwgYmUgZGlmZmVyZW50LiBUaGUgbGlzdCBvZiBhbGwKKyMgbWVtYmVycyB3aWxsIGJlIG9taXR0ZWQsIGV0Yy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitPUFRJTUlaRV9PVVRQVVRfRk9SX0MgID0gTk8KKworIyBTZXQgdGhlIE9QVElNSVpFX09VVFBVVF9KQVZBIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIEphdmEgb3IKKyMgUHl0aG9uIHNvdXJjZXMgb25seS4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgbW9yZSB0YWlsb3JlZAorIyBmb3IgdGhhdCBsYW5ndWFnZS4gRm9yIGluc3RhbmNlLCBuYW1lc3BhY2VzIHdpbGwgYmUgcHJlc2VudGVkIGFzIHBhY2thZ2VzLAorIyBxdWFsaWZpZWQgc2NvcGVzIHdpbGwgbG9vayBkaWZmZXJlbnQsIGV0Yy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitPUFRJTUlaRV9PVVRQVVRfSkFWQSAgID0gTk8KKworIyBTZXQgdGhlIE9QVElNSVpFX0ZPUl9GT1JUUkFOIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIEZvcnRyYW4KKyMgc291cmNlcy4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgdGFpbG9yZWQgZm9yIEZvcnRyYW4uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworT1BUSU1JWkVfRk9SX0ZPUlRSQU4gICA9IE5PCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfVkhETCB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBWSERMCisjIHNvdXJjZXMuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIHRhaWxvcmVkIGZvciBWSERMLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK09QVElNSVpFX09VVFBVVF9WSERMICAgPSBOTworCisjIERveHlnZW4gc2VsZWN0cyB0aGUgcGFyc2VyIHRvIHVzZSBkZXBlbmRpbmcgb24gdGhlIGV4dGVuc2lvbiBvZiB0aGUgZmlsZXMgaXQKKyMgcGFyc2VzLiBXaXRoIHRoaXMgdGFnIHlvdSBjYW4gYXNzaWduIHdoaWNoIHBhcnNlciB0byB1c2UgZm9yIGEgZ2l2ZW4KKyMgZXh0ZW5zaW9uLiBEb3h5Z2VuIGhhcyBhIGJ1aWx0LWluIG1hcHBpbmcsIGJ1dCB5b3UgY2FuIG92ZXJyaWRlIG9yIGV4dGVuZCBpdAorIyB1c2luZyB0aGlzIHRhZy4gVGhlIGZvcm1hdCBpcyBleHQ9bGFuZ3VhZ2UsIHdoZXJlIGV4dCBpcyBhIGZpbGUgZXh0ZW5zaW9uLCBhbmQKKyMgbGFuZ3VhZ2UgaXMgb25lIG9mIHRoZSBwYXJzZXJzIHN1cHBvcnRlZCBieSBkb3h5Z2VuOiBJREwsIEphdmEsIEphdmFzY3JpcHQsCisjIEMjLCBDLCBDKyssIEQsIFBIUCwgT2JqZWN0aXZlLUMsIFB5dGhvbiwgRm9ydHJhbiwgVkhETC4gRm9yIGluc3RhbmNlIHRvIG1ha2UKKyMgZG94eWdlbiB0cmVhdCAuaW5jIGZpbGVzIGFzIEZvcnRyYW4gZmlsZXMgKGRlZmF1bHQgaXMgUEhQKSwgYW5kIC5mIGZpbGVzIGFzIEMKKyMgKGRlZmF1bHQgaXMgRm9ydHJhbiksIHVzZTogaW5jPUZvcnRyYW4gZj1DLgorIworIyBOb3RlIEZvciBmaWxlcyB3aXRob3V0IGV4dGVuc2lvbiB5b3UgY2FuIHVzZSBub19leHRlbnNpb24gYXMgYSBwbGFjZWhvbGRlci4KKyMKKyMgTm90ZSB0aGF0IGZvciBjdXN0b20gZXh0ZW5zaW9ucyB5b3UgYWxzbyBuZWVkIHRvIHNldCBGSUxFX1BBVFRFUk5TIG90aGVyd2lzZQorIyB0aGUgZmlsZXMgYXJlIG5vdCByZWFkIGJ5IGRveHlnZW4uCisKK0VYVEVOU0lPTl9NQVBQSU5HICAgICAgPSAKKworIyBJZiB0aGUgTUFSS0RPV05fU1VQUE9SVCB0YWcgaXMgZW5hYmxlZCB0aGVuIGRveHlnZW4gcHJlLXByb2Nlc3NlcyBhbGwgY29tbWVudHMKKyMgYWNjb3JkaW5nIHRvIHRoZSBNYXJrZG93biBmb3JtYXQsIHdoaWNoIGFsbG93cyBmb3IgbW9yZSByZWFkYWJsZQorIyBkb2N1bWVudGF0aW9uLiBTZWUgaHR0cDovL2RhcmluZ2ZpcmViYWxsLm5ldC9wcm9qZWN0cy9tYXJrZG93bi8gZm9yIGRldGFpbHMuCisjIFRoZSBvdXRwdXQgb2YgbWFya2Rvd24gcHJvY2Vzc2luZyBpcyBmdXJ0aGVyIHByb2Nlc3NlZCBieSBkb3h5Z2VuLCBzbyB5b3UgY2FuCisjIG1peCBkb3h5Z2VuLCBIVE1MLCBhbmQgWE1MIGNvbW1hbmRzIHdpdGggTWFya2Rvd24gZm9ybWF0dGluZy4gRGlzYWJsZSBvbmx5IGluCisjIGNhc2Ugb2YgYmFja3dhcmQgY29tcGF0aWJpbGl0aWVzIGlzc3Vlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworTUFSS0RPV05fU1VQUE9SVCAgICAgICA9IFlFUworCisjIFdoZW4gZW5hYmxlZCBkb3h5Z2VuIHRyaWVzIHRvIGxpbmsgd29yZHMgdGhhdCBjb3JyZXNwb25kIHRvIGRvY3VtZW50ZWQKKyMgY2xhc3Nlcywgb3IgbmFtZXNwYWNlcyB0byB0aGVpciBjb3JyZXNwb25kaW5nIGRvY3VtZW50YXRpb24uIFN1Y2ggYSBsaW5rIGNhbgorIyBiZSBwcmV2ZW50ZWQgaW4gaW5kaXZpZHVhbCBjYXNlcyBieSBieSBwdXR0aW5nIGEgJSBzaWduIGluIGZyb250IG9mIHRoZSB3b3JkCisjIG9yIGdsb2JhbGx5IGJ5IHNldHRpbmcgQVVUT0xJTktfU1VQUE9SVCB0byBOTy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworQVVUT0xJTktfU1VQUE9SVCAgICAgICA9IFlFUworCisjIElmIHlvdSB1c2UgU1RMIGNsYXNzZXMgKGkuZS4gc3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yLCBldGMuKSBidXQgZG8gbm90IHdhbnQKKyMgdG8gaW5jbHVkZSAoYSB0YWcgZmlsZSBmb3IpIHRoZSBTVEwgc291cmNlcyBhcyBpbnB1dCwgdGhlbiB5b3Ugc2hvdWxkIHNldCB0aGlzCisjIHRhZyB0byBZRVMgaW4gb3JkZXIgdG8gbGV0IGRveHlnZW4gbWF0Y2ggZnVuY3Rpb25zIGRlY2xhcmF0aW9ucyBhbmQKKyMgZGVmaW5pdGlvbnMgd2hvc2UgYXJndW1lbnRzIGNvbnRhaW4gU1RMIGNsYXNzZXMgKGUuZy4gZnVuYyhzdGQ6OnN0cmluZyk7CisjIHZlcnN1cyBmdW5jKHN0ZDo6c3RyaW5nKSB7fSkuIFRoaXMgYWxzbyBtYWtlIHRoZSBpbmhlcml0YW5jZSBhbmQgY29sbGFib3JhdGlvbgorIyBkaWFncmFtcyB0aGF0IGludm9sdmUgU1RMIGNsYXNzZXMgbW9yZSBjb21wbGV0ZSBhbmQgYWNjdXJhdGUuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworQlVJTFRJTl9TVExfU1VQUE9SVCAgICA9IE5PCisKKyMgSWYgeW91IHVzZSBNaWNyb3NvZnQncyBDKysvQ0xJIGxhbmd1YWdlLCB5b3Ugc2hvdWxkIHNldCB0aGlzIG9wdGlvbiB0byBZRVMgdG8KKyMgZW5hYmxlIHBhcnNpbmcgc3VwcG9ydC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitDUFBfQ0xJX1NVUFBPUlQgICAgICAgID0gTk8KKworIyBTZXQgdGhlIFNJUF9TVVBQT1JUIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIHNpcCAoc2VlOgorIyBodHRwOi8vd3d3LnJpdmVyYmFua2NvbXB1dGluZy5jby51ay9zb2Z0d2FyZS9zaXAvaW50cm8pIHNvdXJjZXMgb25seS4gRG94eWdlbgorIyB3aWxsIHBhcnNlIHRoZW0gbGlrZSBub3JtYWwgQysrIGJ1dCB3aWxsIGFzc3VtZSBhbGwgY2xhc3NlcyB1c2UgcHVibGljIGluc3RlYWQKKyMgb2YgcHJpdmF0ZSBpbmhlcml0YW5jZSB3aGVuIG5vIGV4cGxpY2l0IHByb3RlY3Rpb24ga2V5d29yZCBpcyBwcmVzZW50LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NJUF9TVVBQT1JUICAgICAgICAgICAgPSBOTworCisjIEZvciBNaWNyb3NvZnQncyBJREwgdGhlcmUgYXJlIHByb3BnZXQgYW5kIHByb3BwdXQgYXR0cmlidXRlcyB0byBpbmRpY2F0ZQorIyBnZXR0ZXIgYW5kIHNldHRlciBtZXRob2RzIGZvciBhIHByb3BlcnR5LiBTZXR0aW5nIHRoaXMgb3B0aW9uIHRvIFlFUyB3aWxsIG1ha2UKKyMgZG94eWdlbiB0byByZXBsYWNlIHRoZSBnZXQgYW5kIHNldCBtZXRob2RzIGJ5IGEgcHJvcGVydHkgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoaXMgd2lsbCBvbmx5IHdvcmsgaWYgdGhlIG1ldGhvZHMgYXJlIGluZGVlZCBnZXR0aW5nIG9yIHNldHRpbmcgYSBzaW1wbGUKKyMgdHlwZS4gSWYgdGhpcyBpcyBub3QgdGhlIGNhc2UsIG9yIHlvdSB3YW50IHRvIHNob3cgdGhlIG1ldGhvZHMgYW55d2F5LCB5b3UKKyMgc2hvdWxkIHNldCB0aGlzIG9wdGlvbiB0byBOTy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworSURMX1BST1BFUlRZX1NVUFBPUlQgICA9IFlFUworCisjIElmIG1lbWJlciBncm91cGluZyBpcyB1c2VkIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZCB0aGUgRElTVFJJQlVURV9HUk9VUF9ET0MKKyMgdGFnIGlzIHNldCB0byBZRVMsIHRoZW4gZG94eWdlbiB3aWxsIHJldXNlIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBmaXJzdAorIyBtZW1iZXIgaW4gdGhlIGdyb3VwIChpZiBhbnkpIGZvciB0aGUgb3RoZXIgbWVtYmVycyBvZiB0aGUgZ3JvdXAuIEJ5IGRlZmF1bHQKKyMgYWxsIG1lbWJlcnMgb2YgYSBncm91cCBtdXN0IGJlIGRvY3VtZW50ZWQgZXhwbGljaXRseS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitESVNUUklCVVRFX0dST1VQX0RPQyAgID0gTk8KKworIyBTZXQgdGhlIFNVQkdST1VQSU5HIHRhZyB0byBZRVMgdG8gYWxsb3cgY2xhc3MgbWVtYmVyIGdyb3VwcyBvZiB0aGUgc2FtZSB0eXBlCisjIChmb3IgaW5zdGFuY2UgYSBncm91cCBvZiBwdWJsaWMgZnVuY3Rpb25zKSB0byBiZSBwdXQgYXMgYSBzdWJncm91cCBvZiB0aGF0CisjIHR5cGUgKGUuZy4gdW5kZXIgdGhlIFB1YmxpYyBGdW5jdGlvbnMgc2VjdGlvbikuIFNldCBpdCB0byBOTyB0byBwcmV2ZW50CisjIHN1Ymdyb3VwaW5nLiBBbHRlcm5hdGl2ZWx5LCB0aGlzIGNhbiBiZSBkb25lIHBlciBjbGFzcyB1c2luZyB0aGUKKyMgXG5vc3ViZ3JvdXBpbmcgY29tbWFuZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworU1VCR1JPVVBJTkcgICAgICAgICAgICA9IFlFUworCisjIFdoZW4gdGhlIElOTElORV9HUk9VUEVEX0NMQVNTRVMgdGFnIGlzIHNldCB0byBZRVMsIGNsYXNzZXMsIHN0cnVjdHMgYW5kIHVuaW9ucworIyBhcmUgc2hvd24gaW5zaWRlIHRoZSBncm91cCBpbiB3aGljaCB0aGV5IGFyZSBpbmNsdWRlZCAoZS5nLiB1c2luZyBcaW5ncm91cCkKKyMgaW5zdGVhZCBvZiBvbiBhIHNlcGFyYXRlIHBhZ2UgKGZvciBIVE1MIGFuZCBNYW4gcGFnZXMpIG9yIHNlY3Rpb24gKGZvciBMYVRlWAorIyBhbmQgUlRGKS4KKyMKKyMgTm90ZSB0aGF0IHRoaXMgZmVhdHVyZSBkb2VzIG5vdCB3b3JrIGluIGNvbWJpbmF0aW9uIHdpdGgKKyMgU0VQQVJBVEVfTUVNQkVSX1BBR0VTLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0lOTElORV9HUk9VUEVEX0NMQVNTRVMgPSBOTworCisjIFdoZW4gdGhlIElOTElORV9TSU1QTEVfU1RSVUNUUyB0YWcgaXMgc2V0IHRvIFlFUywgc3RydWN0cywgY2xhc3NlcywgYW5kIHVuaW9ucworIyB3aXRoIG9ubHkgcHVibGljIGRhdGEgZmllbGRzIG9yIHNpbXBsZSB0eXBlZGVmIGZpZWxkcyB3aWxsIGJlIHNob3duIGlubGluZSBpbgorIyB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgc2NvcGUgaW4gd2hpY2ggdGhleSBhcmUgZGVmaW5lZCAoaS5lLiBmaWxlLAorIyBuYW1lc3BhY2UsIG9yIGdyb3VwIGRvY3VtZW50YXRpb24pLCBwcm92aWRlZCB0aGlzIHNjb3BlIGlzIGRvY3VtZW50ZWQuIElmIHNldAorIyB0byBOTywgc3RydWN0cywgY2xhc3NlcywgYW5kIHVuaW9ucyBhcmUgc2hvd24gb24gYSBzZXBhcmF0ZSBwYWdlIChmb3IgSFRNTCBhbmQKKyMgTWFuIHBhZ2VzKSBvciBzZWN0aW9uIChmb3IgTGFUZVggYW5kIFJURikuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSU5MSU5FX1NJTVBMRV9TVFJVQ1RTICA9IE5PCisKKyMgV2hlbiBUWVBFREVGX0hJREVTX1NUUlVDVCB0YWcgaXMgZW5hYmxlZCwgYSB0eXBlZGVmIG9mIGEgc3RydWN0LCB1bmlvbiwgb3IKKyMgZW51bSBpcyBkb2N1bWVudGVkIGFzIHN0cnVjdCwgdW5pb24sIG9yIGVudW0gd2l0aCB0aGUgbmFtZSBvZiB0aGUgdHlwZWRlZi4gU28KKyMgdHlwZWRlZiBzdHJ1Y3QgVHlwZVMge30gVHlwZVQsIHdpbGwgYXBwZWFyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFzIGEgc3RydWN0CisjIHdpdGggbmFtZSBUeXBlVC4gV2hlbiBkaXNhYmxlZCB0aGUgdHlwZWRlZiB3aWxsIGFwcGVhciBhcyBhIG1lbWJlciBvZiBhIGZpbGUsCisjIG5hbWVzcGFjZSwgb3IgY2xhc3MuIEFuZCB0aGUgc3RydWN0IHdpbGwgYmUgbmFtZWQgVHlwZVMuIFRoaXMgY2FuIHR5cGljYWxseSBiZQorIyB1c2VmdWwgZm9yIEMgY29kZSBpbiBjYXNlIHRoZSBjb2RpbmcgY29udmVudGlvbiBkaWN0YXRlcyB0aGF0IGFsbCBjb21wb3VuZAorIyB0eXBlcyBhcmUgdHlwZWRlZidlZCBhbmQgb25seSB0aGUgdHlwZWRlZiBpcyByZWZlcmVuY2VkLCBuZXZlciB0aGUgdGFnIG5hbWUuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworVFlQRURFRl9ISURFU19TVFJVQ1QgICA9IE5PCisKKyMgVGhlIHNpemUgb2YgdGhlIHN5bWJvbCBsb29rdXAgY2FjaGUgY2FuIGJlIHNldCB1c2luZyBMT09LVVBfQ0FDSEVfU0laRS4gVGhpcworIyBjYWNoZSBpcyB1c2VkIHRvIHJlc29sdmUgc3ltYm9scyBnaXZlbiB0aGVpciBuYW1lIGFuZCBzY29wZS4gU2luY2UgdGhpcyBjYW4gYmUKKyMgYW4gZXhwZW5zaXZlIHByb2Nlc3MgYW5kIG9mdGVuIHRoZSBzYW1lIHN5bWJvbCBhcHBlYXJzIG11bHRpcGxlIHRpbWVzIGluIHRoZQorIyBjb2RlLCBkb3h5Z2VuIGtlZXBzIGEgY2FjaGUgb2YgcHJlLXJlc29sdmVkIHN5bWJvbHMuIElmIHRoZSBjYWNoZSBpcyB0b28gc21hbGwKKyMgZG94eWdlbiB3aWxsIGJlY29tZSBzbG93ZXIuIElmIHRoZSBjYWNoZSBpcyB0b28gbGFyZ2UsIG1lbW9yeSBpcyB3YXN0ZWQuIFRoZQorIyBjYWNoZSBzaXplIGlzIGdpdmVuIGJ5IHRoaXMgZm9ybXVsYTogMl4oMTYrTE9PS1VQX0NBQ0hFX1NJWkUpLiBUaGUgdmFsaWQgcmFuZ2UKKyMgaXMgMC4uOSwgdGhlIGRlZmF1bHQgaXMgMCwgY29ycmVzcG9uZGluZyB0byBhIGNhY2hlIHNpemUgb2YgMl4xNj02NTUzNgorIyBzeW1ib2xzLiBBdCB0aGUgZW5kIG9mIGEgcnVuIGRveHlnZW4gd2lsbCByZXBvcnQgdGhlIGNhY2hlIHVzYWdlIGFuZCBzdWdnZXN0CisjIHRoZSBvcHRpbWFsIGNhY2hlIHNpemUgZnJvbSBhIHNwZWVkIHBvaW50IG9mIHZpZXcuCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDksIGRlZmF1bHQgdmFsdWU6IDAuCisKK0xPT0tVUF9DQUNIRV9TSVpFICAgICAgPSAwCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQnVpbGQgcmVsYXRlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgRVhUUkFDVF9BTEwgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGFzc3VtZSBhbGwgZW50aXRpZXMgaW4KKyMgZG9jdW1lbnRhdGlvbiBhcmUgZG9jdW1lbnRlZCwgZXZlbiBpZiBubyBkb2N1bWVudGF0aW9uIHdhcyBhdmFpbGFibGUuIFByaXZhdGUKKyMgY2xhc3MgbWVtYmVycyBhbmQgc3RhdGljIGZpbGUgbWVtYmVycyB3aWxsIGJlIGhpZGRlbiB1bmxlc3MgdGhlCisjIEVYVFJBQ1RfUFJJVkFURSByZXNwZWN0aXZlbHkgRVhUUkFDVF9TVEFUSUMgdGFncyBhcmUgc2V0IHRvIFlFUy4KKyMgTm90ZTogVGhpcyB3aWxsIGFsc28gZGlzYWJsZSB0aGUgd2FybmluZ3MgYWJvdXQgdW5kb2N1bWVudGVkIG1lbWJlcnMgdGhhdCBhcmUKKyMgbm9ybWFsbHkgcHJvZHVjZWQgd2hlbiBXQVJOSU5HUyBpcyBzZXQgdG8gWUVTLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0VYVFJBQ1RfQUxMICAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRVhUUkFDVF9QUklWQVRFIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBwcml2YXRlIG1lbWJlcnMgb2YgYSBjbGFzcyB3aWxsCisjIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0VYVFJBQ1RfUFJJVkFURSAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRVhUUkFDVF9QQUNLQUdFIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBtZW1iZXJzIHdpdGggcGFja2FnZSBvciBpbnRlcm5hbAorIyBzY29wZSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0VYVFJBQ1RfUEFDS0FHRSAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRVhUUkFDVF9TVEFUSUMgdGFnIGlzIHNldCB0byBZRVMgYWxsIHN0YXRpYyBtZW1iZXJzIG9mIGEgZmlsZSB3aWxsIGJlCisjIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0VYVFJBQ1RfU1RBVElDICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRVhUUkFDVF9MT0NBTF9DTEFTU0VTIHRhZyBpcyBzZXQgdG8gWUVTIGNsYXNzZXMgKGFuZCBzdHJ1Y3RzKSBkZWZpbmVkCisjIGxvY2FsbHkgaW4gc291cmNlIGZpbGVzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uIElmIHNldCB0byBOTworIyBvbmx5IGNsYXNzZXMgZGVmaW5lZCBpbiBoZWFkZXIgZmlsZXMgYXJlIGluY2x1ZGVkLiBEb2VzIG5vdCBoYXZlIGFueSBlZmZlY3QKKyMgZm9yIEphdmEgc291cmNlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworRVhUUkFDVF9MT0NBTF9DTEFTU0VTICA9IFlFUworCisjIFRoaXMgZmxhZyBpcyBvbmx5IHVzZWZ1bCBmb3IgT2JqZWN0aXZlLUMgY29kZS4gV2hlbiBzZXQgdG8gWUVTIGxvY2FsIG1ldGhvZHMsCisjIHdoaWNoIGFyZSBkZWZpbmVkIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBzZWN0aW9uIGJ1dCBub3QgaW4gdGhlIGludGVyZmFjZSBhcmUKKyMgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uIElmIHNldCB0byBOTyBvbmx5IG1ldGhvZHMgaW4gdGhlIGludGVyZmFjZSBhcmUKKyMgaW5jbHVkZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRVhUUkFDVF9MT0NBTF9NRVRIT0RTICA9IE5PCisKKyMgSWYgdGhpcyBmbGFnIGlzIHNldCB0byBZRVMsIHRoZSBtZW1iZXJzIG9mIGFub255bW91cyBuYW1lc3BhY2VzIHdpbGwgYmUKKyMgZXh0cmFjdGVkIGFuZCBhcHBlYXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYXMgYSBuYW1lc3BhY2UgY2FsbGVkCisjICdhbm9ueW1vdXNfbmFtZXNwYWNle2ZpbGV9Jywgd2hlcmUgZmlsZSB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIGJhc2UgbmFtZSBvZgorIyB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBhbm9ueW1vdXMgbmFtZXNwYWNlLiBCeSBkZWZhdWx0IGFub255bW91cyBuYW1lc3BhY2UKKyMgYXJlIGhpZGRlbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWFRSQUNUX0FOT05fTlNQQUNFUyAgID0gTk8KKworIyBJZiB0aGUgSElERV9VTkRPQ19NRU1CRVJTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgaGlkZSBhbGwKKyMgdW5kb2N1bWVudGVkIG1lbWJlcnMgaW5zaWRlIGRvY3VtZW50ZWQgY2xhc3NlcyBvciBmaWxlcy4gSWYgc2V0IHRvIE5PIHRoZXNlCisjIG1lbWJlcnMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgdmFyaW91cyBvdmVydmlld3MsIGJ1dCBubyBkb2N1bWVudGF0aW9uCisjIHNlY3Rpb24gaXMgZ2VuZXJhdGVkLiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IGlmIEVYVFJBQ1RfQUxMIGlzIGVuYWJsZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSElERV9VTkRPQ19NRU1CRVJTICAgICA9IE5PCisKKyMgSWYgdGhlIEhJREVfVU5ET0NfQ0xBU1NFUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGhpZGUgYWxsCisjIHVuZG9jdW1lbnRlZCBjbGFzc2VzIHRoYXQgYXJlIG5vcm1hbGx5IHZpc2libGUgaW4gdGhlIGNsYXNzIGhpZXJhcmNoeS4gSWYgc2V0CisjIHRvIE5PIHRoZXNlIGNsYXNzZXMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgdmFyaW91cyBvdmVydmlld3MuIFRoaXMgb3B0aW9uIGhhcworIyBubyBlZmZlY3QgaWYgRVhUUkFDVF9BTEwgaXMgZW5hYmxlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitISURFX1VORE9DX0NMQVNTRVMgICAgID0gTk8KKworIyBJZiB0aGUgSElERV9GUklFTkRfQ09NUE9VTkRTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgaGlkZSBhbGwgZnJpZW5kCisjIChjbGFzc3xzdHJ1Y3R8dW5pb24pIGRlY2xhcmF0aW9ucy4gSWYgc2V0IHRvIE5PIHRoZXNlIGRlY2xhcmF0aW9ucyB3aWxsIGJlCisjIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0hJREVfRlJJRU5EX0NPTVBPVU5EUyAgPSBOTworCisjIElmIHRoZSBISURFX0lOX0JPRFlfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGhpZGUgYW55CisjIGRvY3VtZW50YXRpb24gYmxvY2tzIGZvdW5kIGluc2lkZSB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uLiBJZiBzZXQgdG8gTk8gdGhlc2UKKyMgYmxvY2tzIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGZ1bmN0aW9uJ3MgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBibG9jay4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitISURFX0lOX0JPRFlfRE9DUyAgICAgID0gTk8KKworIyBUaGUgSU5URVJOQUxfRE9DUyB0YWcgZGV0ZXJtaW5lcyBpZiBkb2N1bWVudGF0aW9uIHRoYXQgaXMgdHlwZWQgYWZ0ZXIgYQorIyBcaW50ZXJuYWwgY29tbWFuZCBpcyBpbmNsdWRlZC4gSWYgdGhlIHRhZyBpcyBzZXQgdG8gTk8gdGhlbiB0aGUgZG9jdW1lbnRhdGlvbgorIyB3aWxsIGJlIGV4Y2x1ZGVkLiBTZXQgaXQgdG8gWUVTIHRvIGluY2x1ZGUgdGhlIGludGVybmFsIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSU5URVJOQUxfRE9DUyAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIENBU0VfU0VOU0VfTkFNRVMgdGFnIGlzIHNldCB0byBOTyB0aGVuIGRveHlnZW4gd2lsbCBvbmx5IGdlbmVyYXRlIGZpbGUKKyMgbmFtZXMgaW4gbG93ZXItY2FzZSBsZXR0ZXJzLiBJZiBzZXQgdG8gWUVTIHVwcGVyLWNhc2UgbGV0dGVycyBhcmUgYWxzbworIyBhbGxvd2VkLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgaGF2ZSBjbGFzc2VzIG9yIGZpbGVzIHdob3NlIG5hbWVzIG9ubHkgZGlmZmVyCisjIGluIGNhc2UgYW5kIGlmIHlvdXIgZmlsZSBzeXN0ZW0gc3VwcG9ydHMgY2FzZSBzZW5zaXRpdmUgZmlsZSBuYW1lcy4gV2luZG93cworIyBhbmQgTWFjIHVzZXJzIGFyZSBhZHZpc2VkIHRvIHNldCB0aGlzIG9wdGlvbiB0byBOTy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IHN5c3RlbSBkZXBlbmRlbnQuCisKK0NBU0VfU0VOU0VfTkFNRVMgICAgICAgPSBOTworCisjIElmIHRoZSBISURFX1NDT1BFX05BTUVTIHRhZyBpcyBzZXQgdG8gTk8gdGhlbiBkb3h5Z2VuIHdpbGwgc2hvdyBtZW1iZXJzIHdpdGgKKyMgdGhlaXIgZnVsbCBjbGFzcyBhbmQgbmFtZXNwYWNlIHNjb3BlcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gSWYgc2V0IHRvIFlFUyB0aGUKKyMgc2NvcGUgd2lsbCBiZSBoaWRkZW4uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSElERV9TQ09QRV9OQU1FUyAgICAgICA9IE5PCisKKyMgSWYgdGhlIFNIT1dfSU5DTFVERV9GSUxFUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBwdXQgYSBsaXN0IG9mCisjIHRoZSBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBieSBhIGZpbGUgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhhdCBmaWxlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitTSE9XX0lOQ0xVREVfRklMRVMgICAgID0gWUVTCisKKworU0hPV19HUk9VUEVEX01FTUJfSU5DICA9IE5PCisKKyMgSWYgdGhlIEZPUkNFX0xPQ0FMX0lOQ0xVREVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGxpc3QgaW5jbHVkZQorIyBmaWxlcyB3aXRoIGRvdWJsZSBxdW90ZXMgaW4gdGhlIGRvY3VtZW50YXRpb24gcmF0aGVyIHRoYW4gd2l0aCBzaGFycCBicmFja2V0cy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitGT1JDRV9MT0NBTF9JTkNMVURFUyAgID0gTk8KKworIyBJZiB0aGUgSU5MSU5FX0lORk8gdGFnIGlzIHNldCB0byBZRVMgdGhlbiBhIHRhZyBbaW5saW5lXSBpcyBpbnNlcnRlZCBpbiB0aGUKKyMgZG9jdW1lbnRhdGlvbiBmb3IgaW5saW5lIG1lbWJlcnMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0lOTElORV9JTkZPICAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgU09SVF9NRU1CRVJfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzb3J0IHRoZQorIyAoZGV0YWlsZWQpIGRvY3VtZW50YXRpb24gb2YgZmlsZSBhbmQgY2xhc3MgbWVtYmVycyBhbHBoYWJldGljYWxseSBieSBtZW1iZXIKKyMgbmFtZS4gSWYgc2V0IHRvIE5PIHRoZSBtZW1iZXJzIHdpbGwgYXBwZWFyIGluIGRlY2xhcmF0aW9uIG9yZGVyLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitTT1JUX01FTUJFUl9ET0NTICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFNPUlRfQlJJRUZfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzb3J0IHRoZSBicmllZgorIyBkZXNjcmlwdGlvbnMgb2YgZmlsZSwgbmFtZXNwYWNlIGFuZCBjbGFzcyBtZW1iZXJzIGFscGhhYmV0aWNhbGx5IGJ5IG1lbWJlcgorIyBuYW1lLiBJZiBzZXQgdG8gTk8gdGhlIG1lbWJlcnMgd2lsbCBhcHBlYXIgaW4gZGVjbGFyYXRpb24gb3JkZXIuIE5vdGUgdGhhdAorIyB0aGlzIHdpbGwgYWxzbyBpbmZsdWVuY2UgdGhlIG9yZGVyIG9mIHRoZSBjbGFzc2VzIGluIHRoZSBjbGFzcyBsaXN0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NPUlRfQlJJRUZfRE9DUyAgICAgICAgPSBOTworCisjIElmIHRoZSBTT1JUX01FTUJFUlNfQ1RPUlNfMVNUIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNvcnQgdGhlCisjIChicmllZiBhbmQgZGV0YWlsZWQpIGRvY3VtZW50YXRpb24gb2YgY2xhc3MgbWVtYmVycyBzbyB0aGF0IGNvbnN0cnVjdG9ycyBhbmQKKyMgZGVzdHJ1Y3RvcnMgYXJlIGxpc3RlZCBmaXJzdC4gSWYgc2V0IHRvIE5PIHRoZSBjb25zdHJ1Y3RvcnMgd2lsbCBhcHBlYXIgaW4gdGhlCisjIHJlc3BlY3RpdmUgb3JkZXJzIGRlZmluZWQgYnkgU09SVF9CUklFRl9ET0NTIGFuZCBTT1JUX01FTUJFUl9ET0NTLgorIyBOb3RlOiBJZiBTT1JUX0JSSUVGX0RPQ1MgaXMgc2V0IHRvIE5PIHRoaXMgb3B0aW9uIGlzIGlnbm9yZWQgZm9yIHNvcnRpbmcgYnJpZWYKKyMgbWVtYmVyIGRvY3VtZW50YXRpb24uCisjIE5vdGU6IElmIFNPUlRfTUVNQkVSX0RPQ1MgaXMgc2V0IHRvIE5PIHRoaXMgb3B0aW9uIGlzIGlnbm9yZWQgZm9yIHNvcnRpbmcKKyMgZGV0YWlsZWQgbWVtYmVyIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU09SVF9NRU1CRVJTX0NUT1JTXzFTVCA9IE5PCisKKyMgSWYgdGhlIFNPUlRfR1JPVVBfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUgaGllcmFyY2h5CisjIG9mIGdyb3VwIG5hbWVzIGludG8gYWxwaGFiZXRpY2FsIG9yZGVyLiBJZiBzZXQgdG8gTk8gdGhlIGdyb3VwIG5hbWVzIHdpbGwKKyMgYXBwZWFyIGluIHRoZWlyIGRlZmluZWQgb3JkZXIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU09SVF9HUk9VUF9OQU1FUyAgICAgICA9IE5PCisKKyMgSWYgdGhlIFNPUlRfQllfU0NPUEVfTkFNRSB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIGNsYXNzIGxpc3Qgd2lsbCBiZSBzb3J0ZWQgYnkKKyMgZnVsbHktcXVhbGlmaWVkIG5hbWVzLCBpbmNsdWRpbmcgbmFtZXNwYWNlcy4gSWYgc2V0IHRvIE5PLCB0aGUgY2xhc3MgbGlzdCB3aWxsCisjIGJlIHNvcnRlZCBvbmx5IGJ5IGNsYXNzIG5hbWUsIG5vdCBpbmNsdWRpbmcgdGhlIG5hbWVzcGFjZSBwYXJ0LgorIyBOb3RlOiBUaGlzIG9wdGlvbiBpcyBub3QgdmVyeSB1c2VmdWwgaWYgSElERV9TQ09QRV9OQU1FUyBpcyBzZXQgdG8gWUVTLgorIyBOb3RlOiBUaGlzIG9wdGlvbiBhcHBsaWVzIG9ubHkgdG8gdGhlIGNsYXNzIGxpc3QsIG5vdCB0byB0aGUgYWxwaGFiZXRpY2FsCisjIGxpc3QuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU09SVF9CWV9TQ09QRV9OQU1FICAgICA9IE5PCisKKyMgSWYgdGhlIFNUUklDVF9QUk9UT19NQVRDSElORyBvcHRpb24gaXMgZW5hYmxlZCBhbmQgZG94eWdlbiBmYWlscyB0byBkbyBwcm9wZXIKKyMgdHlwZSByZXNvbHV0aW9uIG9mIGFsbCBwYXJhbWV0ZXJzIG9mIGEgZnVuY3Rpb24gaXQgd2lsbCByZWplY3QgYSBtYXRjaCBiZXR3ZWVuCisjIHRoZSBwcm90b3R5cGUgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhIG1lbWJlciBmdW5jdGlvbiBldmVuIGlmIHRoZXJlIGlzCisjIG9ubHkgb25lIGNhbmRpZGF0ZSBvciBpdCBpcyBvYnZpb3VzIHdoaWNoIGNhbmRpZGF0ZSB0byBjaG9vc2UgYnkgZG9pbmcgYQorIyBzaW1wbGUgc3RyaW5nIG1hdGNoLiBCeSBkaXNhYmxpbmcgU1RSSUNUX1BST1RPX01BVENISU5HIGRveHlnZW4gd2lsbCBzdGlsbAorIyBhY2NlcHQgYSBtYXRjaCBiZXR3ZWVuIHByb3RvdHlwZSBhbmQgaW1wbGVtZW50YXRpb24gaW4gc3VjaCBjYXNlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitTVFJJQ1RfUFJPVE9fTUFUQ0hJTkcgID0gTk8KKworIyBUaGUgR0VORVJBVEVfVE9ET0xJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoIFlFUykgb3IgZGlzYWJsZSAoIE5PKSB0aGUKKyMgdG9kbyBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFx0b2RvIGNvbW1hbmRzIGluIHRoZQorIyBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitHRU5FUkFURV9UT0RPTElTVCAgICAgID0gWUVTCisKKyMgVGhlIEdFTkVSQVRFX1RFU1RMSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKCBZRVMpIG9yIGRpc2FibGUgKCBOTykgdGhlCisjIHRlc3QgbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcdGVzdCBjb21tYW5kcyBpbiB0aGUKKyMgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworR0VORVJBVEVfVEVTVExJU1QgICAgICA9IFlFUworCisjIFRoZSBHRU5FUkFURV9CVUdMSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKCBZRVMpIG9yIGRpc2FibGUgKCBOTykgdGhlIGJ1ZworIyBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFxidWcgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0dFTkVSQVRFX0JVR0xJU1QgICAgICAgPSBZRVMKKworIyBUaGUgR0VORVJBVEVfREVQUkVDQVRFRExJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoIFlFUykgb3IgZGlzYWJsZSAoIE5PKQorIyB0aGUgZGVwcmVjYXRlZCBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFxkZXByZWNhdGVkIGNvbW1hbmRzIGluCisjIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitHRU5FUkFURV9ERVBSRUNBVEVETElTVD0gWUVTCisKKyMgVGhlIEVOQUJMRURfU0VDVElPTlMgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSBjb25kaXRpb25hbCBkb2N1bWVudGF0aW9uCisjIHNlY3Rpb25zLCBtYXJrZWQgYnkgXGlmIDxzZWN0aW9uX2xhYmVsPiAuLi4gXGVuZGlmIGFuZCBcY29uZCA8c2VjdGlvbl9sYWJlbD4KKyMgLi4uIFxlbmRjb25kIGJsb2Nrcy4KKworRU5BQkxFRF9TRUNUSU9OUyAgICAgICA9IAorCisjIFRoZSBNQVhfSU5JVElBTElaRVJfTElORVMgdGFnIGRldGVybWluZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRoYXQgdGhlCisjIGluaXRpYWwgdmFsdWUgb2YgYSB2YXJpYWJsZSBvciBtYWNybyAvIGRlZmluZSBjYW4gaGF2ZSBmb3IgaXQgdG8gYXBwZWFyIGluIHRoZQorIyBkb2N1bWVudGF0aW9uLiBJZiB0aGUgaW5pdGlhbGl6ZXIgY29uc2lzdHMgb2YgbW9yZSBsaW5lcyB0aGFuIHNwZWNpZmllZCBoZXJlCisjIGl0IHdpbGwgYmUgaGlkZGVuLiBVc2UgYSB2YWx1ZSBvZiAwIHRvIGhpZGUgaW5pdGlhbGl6ZXJzIGNvbXBsZXRlbHkuIFRoZQorIyBhcHBlYXJhbmNlIG9mIHRoZSB2YWx1ZSBvZiBpbmRpdmlkdWFsIHZhcmlhYmxlcyBhbmQgbWFjcm9zIC8gZGVmaW5lcyBjYW4gYmUKKyMgY29udHJvbGxlZCB1c2luZyBcc2hvd2luaXRpYWxpemVyIG9yIFxoaWRlaW5pdGlhbGl6ZXIgY29tbWFuZCBpbiB0aGUKKyMgZG9jdW1lbnRhdGlvbiByZWdhcmRsZXNzIG9mIHRoaXMgc2V0dGluZy4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMTAwMDAsIGRlZmF1bHQgdmFsdWU6IDMwLgorCitNQVhfSU5JVElBTElaRVJfTElORVMgID0gMzAKKworIyBTZXQgdGhlIFNIT1dfVVNFRF9GSUxFUyB0YWcgdG8gTk8gdG8gZGlzYWJsZSB0aGUgbGlzdCBvZiBmaWxlcyBnZW5lcmF0ZWQgYXQKKyMgdGhlIGJvdHRvbSBvZiB0aGUgZG9jdW1lbnRhdGlvbiBvZiBjbGFzc2VzIGFuZCBzdHJ1Y3RzLiBJZiBzZXQgdG8gWUVTIHRoZSBsaXN0CisjIHdpbGwgbWVudGlvbiB0aGUgZmlsZXMgdGhhdCB3ZXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1NIT1dfVVNFRF9GSUxFUyAgICAgICAgPSBZRVMKKworIyBTZXQgdGhlIFNIT1dfRklMRVMgdGFnIHRvIE5PIHRvIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gb2YgdGhlIEZpbGVzIHBhZ2UuIFRoaXMKKyMgd2lsbCByZW1vdmUgdGhlIEZpbGVzIGVudHJ5IGZyb20gdGhlIFF1aWNrIEluZGV4IGFuZCBmcm9tIHRoZSBGb2xkZXIgVHJlZSBWaWV3CisjIChpZiBzcGVjaWZpZWQpLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitTSE9XX0ZJTEVTICAgICAgICAgICAgID0gWUVTCisKKyMgU2V0IHRoZSBTSE9XX05BTUVTUEFDRVMgdGFnIHRvIE5PIHRvIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gb2YgdGhlIE5hbWVzcGFjZXMKKyMgcGFnZS4gVGhpcyB3aWxsIHJlbW92ZSB0aGUgTmFtZXNwYWNlcyBlbnRyeSBmcm9tIHRoZSBRdWljayBJbmRleCBhbmQgZnJvbSB0aGUKKyMgRm9sZGVyIFRyZWUgVmlldyAoaWYgc3BlY2lmaWVkKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworU0hPV19OQU1FU1BBQ0VTICAgICAgICA9IFlFUworCisjIFRoZSBGSUxFX1ZFUlNJT05fRklMVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcHJvZ3JhbSBvciBzY3JpcHQgdGhhdAorIyBkb3h5Z2VuIHNob3VsZCBpbnZva2UgdG8gZ2V0IHRoZSBjdXJyZW50IHZlcnNpb24gZm9yIGVhY2ggZmlsZSAodHlwaWNhbGx5IGZyb20KKyMgdGhlIHZlcnNpb24gY29udHJvbCBzeXN0ZW0pLiBEb3h5Z2VuIHdpbGwgaW52b2tlIHRoZSBwcm9ncmFtIGJ5IGV4ZWN1dGluZyAodmlhCisjIHBvcGVuKCkpIHRoZSBjb21tYW5kIGNvbW1hbmQgaW5wdXQtZmlsZSwgd2hlcmUgY29tbWFuZCBpcyB0aGUgdmFsdWUgb2YgdGhlCisjIEZJTEVfVkVSU0lPTl9GSUxURVIgdGFnLCBhbmQgaW5wdXQtZmlsZSBpcyB0aGUgbmFtZSBvZiBhbiBpbnB1dCBmaWxlIHByb3ZpZGVkCisjIGJ5IGRveHlnZW4uIFdoYXRldmVyIHRoZSBwcm9ncmFtIHdyaXRlcyB0byBzdGFuZGFyZCBvdXRwdXQgaXMgdXNlZCBhcyB0aGUgZmlsZQorIyB2ZXJzaW9uLiBGb3IgYW4gZXhhbXBsZSBzZWUgdGhlIGRvY3VtZW50YXRpb24uCisKK0ZJTEVfVkVSU0lPTl9GSUxURVIgICAgPSAKKworIyBUaGUgTEFZT1VUX0ZJTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBsYXlvdXQgZmlsZSB3aGljaCB3aWxsIGJlIHBhcnNlZAorIyBieSBkb3h5Z2VuLiBUaGUgbGF5b3V0IGZpbGUgY29udHJvbHMgdGhlIGdsb2JhbCBzdHJ1Y3R1cmUgb2YgdGhlIGdlbmVyYXRlZAorIyBvdXRwdXQgZmlsZXMgaW4gYW4gb3V0cHV0IGZvcm1hdCBpbmRlcGVuZGVudCB3YXkuIFRvIGNyZWF0ZSB0aGUgbGF5b3V0IGZpbGUKKyMgdGhhdCByZXByZXNlbnRzIGRveHlnZW4ncyBkZWZhdWx0cywgcnVuIGRveHlnZW4gd2l0aCB0aGUgLWwgb3B0aW9uLiBZb3UgY2FuCisjIG9wdGlvbmFsbHkgc3BlY2lmeSBhIGZpbGUgbmFtZSBhZnRlciB0aGUgb3B0aW9uLCBpZiBvbWl0dGVkIERveHlnZW5MYXlvdXQueG1sCisjIHdpbGwgYmUgdXNlZCBhcyB0aGUgbmFtZSBvZiB0aGUgbGF5b3V0IGZpbGUuCisjCisjIE5vdGUgdGhhdCBpZiB5b3UgcnVuIGRveHlnZW4gZnJvbSBhIGRpcmVjdG9yeSBjb250YWluaW5nIGEgZmlsZSBjYWxsZWQKKyMgRG94eWdlbkxheW91dC54bWwsIGRveHlnZW4gd2lsbCBwYXJzZSBpdCBhdXRvbWF0aWNhbGx5IGV2ZW4gaWYgdGhlIExBWU9VVF9GSUxFCisjIHRhZyBpcyBsZWZ0IGVtcHR5LgorCitMQVlPVVRfRklMRSAgICAgICAgICAgID0gCisKKyMgVGhlIENJVEVfQklCX0ZJTEVTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGJpYiBmaWxlcyBjb250YWluaW5nCisjIHRoZSByZWZlcmVuY2UgZGVmaW5pdGlvbnMuIFRoaXMgbXVzdCBiZSBhIGxpc3Qgb2YgLmJpYiBmaWxlcy4gVGhlIC5iaWIKKyMgZXh0ZW5zaW9uIGlzIGF1dG9tYXRpY2FsbHkgYXBwZW5kZWQgaWYgb21pdHRlZC4gVGhpcyByZXF1aXJlcyB0aGUgYmlidGV4IHRvb2wKKyMgdG8gYmUgaW5zdGFsbGVkLiBTZWUgYWxzbyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JpYlRlWCBmb3IgbW9yZSBpbmZvLgorIyBGb3IgTGFUZVggdGhlIHN0eWxlIG9mIHRoZSBiaWJsaW9ncmFwaHkgY2FuIGJlIGNvbnRyb2xsZWQgdXNpbmcKKyMgTEFURVhfQklCX1NUWUxFLiBUbyB1c2UgdGhpcyBmZWF0dXJlIHlvdSBuZWVkIGJpYnRleCBhbmQgcGVybCBhdmFpbGFibGUgaW4gdGhlCisjIHNlYXJjaCBwYXRoLiBEbyBub3QgdXNlIGZpbGUgbmFtZXMgd2l0aCBzcGFjZXMsIGJpYnRleCBjYW5ub3QgaGFuZGxlIHRoZW0uIFNlZQorIyBhbHNvIFxjaXRlIGZvciBpbmZvIGhvdyB0byBjcmVhdGUgcmVmZXJlbmNlcy4KKworQ0lURV9CSUJfRklMRVMgICAgICAgICA9IAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHdhcm5pbmcgYW5kIHByb2dyZXNzIG1lc3NhZ2VzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhlIFFVSUVUIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIG9uL29mZiB0aGUgbWVzc2FnZXMgdGhhdCBhcmUgZ2VuZXJhdGVkIHRvCisjIHN0YW5kYXJkIG91dHB1dCBieSBkb3h5Z2VuLiBJZiBRVUlFVCBpcyBzZXQgdG8gWUVTIHRoaXMgaW1wbGllcyB0aGF0IHRoZQorIyBtZXNzYWdlcyBhcmUgb2ZmLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1FVSUVUICAgICAgICAgICAgICAgICAgPSBOTworCisjIFRoZSBXQVJOSU5HUyB0YWcgY2FuIGJlIHVzZWQgdG8gdHVybiBvbi9vZmYgdGhlIHdhcm5pbmcgbWVzc2FnZXMgdGhhdCBhcmUKKyMgZ2VuZXJhdGVkIHRvIHN0YW5kYXJkIGVycm9yICggc3RkZXJyKSBieSBkb3h5Z2VuLiBJZiBXQVJOSU5HUyBpcyBzZXQgdG8gWUVTCisjIHRoaXMgaW1wbGllcyB0aGF0IHRoZSB3YXJuaW5ncyBhcmUgb24uCisjCisjIFRpcDogVHVybiB3YXJuaW5ncyBvbiB3aGlsZSB3cml0aW5nIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitXQVJOSU5HUyAgICAgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFdBUk5fSUZfVU5ET0NVTUVOVEVEIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZQorIyB3YXJuaW5ncyBmb3IgdW5kb2N1bWVudGVkIG1lbWJlcnMuIElmIEVYVFJBQ1RfQUxMIGlzIHNldCB0byBZRVMgdGhlbiB0aGlzIGZsYWcKKyMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGRpc2FibGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitXQVJOX0lGX1VORE9DVU1FTlRFRCAgID0gWUVTCisKKyMgSWYgdGhlIFdBUk5fSUZfRE9DX0VSUk9SIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgd2FybmluZ3MgZm9yCisjIHBvdGVudGlhbCBlcnJvcnMgaW4gdGhlIGRvY3VtZW50YXRpb24sIHN1Y2ggYXMgbm90IGRvY3VtZW50aW5nIHNvbWUgcGFyYW1ldGVycworIyBpbiBhIGRvY3VtZW50ZWQgZnVuY3Rpb24sIG9yIGRvY3VtZW50aW5nIHBhcmFtZXRlcnMgdGhhdCBkb24ndCBleGlzdCBvciB1c2luZworIyBtYXJrdXAgY29tbWFuZHMgd3JvbmdseS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworV0FSTl9JRl9ET0NfRVJST1IgICAgICA9IFlFUworCisjIFRoaXMgV0FSTl9OT19QQVJBTURPQyBvcHRpb24gY2FuIGJlIGVuYWJsZWQgdG8gZ2V0IHdhcm5pbmdzIGZvciBmdW5jdGlvbnMgdGhhdAorIyBhcmUgZG9jdW1lbnRlZCwgYnV0IGhhdmUgbm8gZG9jdW1lbnRhdGlvbiBmb3IgdGhlaXIgcGFyYW1ldGVycyBvciByZXR1cm4KKyMgdmFsdWUuIElmIHNldCB0byBOTyBkb3h5Z2VuIHdpbGwgb25seSB3YXJuIGFib3V0IHdyb25nIG9yIGluY29tcGxldGUgcGFyYW1ldGVyCisjIGRvY3VtZW50YXRpb24sIGJ1dCBub3QgYWJvdXQgdGhlIGFic2VuY2Ugb2YgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitXQVJOX05PX1BBUkFNRE9DICAgICAgID0gTk8KKworIyBUaGUgV0FSTl9GT1JNQVQgdGFnIGRldGVybWluZXMgdGhlIGZvcm1hdCBvZiB0aGUgd2FybmluZyBtZXNzYWdlcyB0aGF0IGRveHlnZW4KKyMgY2FuIHByb2R1Y2UuIFRoZSBzdHJpbmcgc2hvdWxkIGNvbnRhaW4gdGhlICRmaWxlLCAkbGluZSwgYW5kICR0ZXh0IHRhZ3MsIHdoaWNoCisjIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIGZpbGUgYW5kIGxpbmUgbnVtYmVyIGZyb20gd2hpY2ggdGhlIHdhcm5pbmcgb3JpZ2luYXRlZAorIyBhbmQgdGhlIHdhcm5pbmcgdGV4dC4gT3B0aW9uYWxseSB0aGUgZm9ybWF0IG1heSBjb250YWluICR2ZXJzaW9uLCB3aGljaCB3aWxsCisjIGJlIHJlcGxhY2VkIGJ5IHRoZSB2ZXJzaW9uIG9mIHRoZSBmaWxlIChpZiBpdCBjb3VsZCBiZSBvYnRhaW5lZCB2aWEKKyMgRklMRV9WRVJTSU9OX0ZJTFRFUikKKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6ICRmaWxlOiRsaW5lOiAkdGV4dC4KKworV0FSTl9GT1JNQVQgICAgICAgICAgICA9ICIkZmlsZTokbGluZTogJHRleHQiCisKKyMgVGhlIFdBUk5fTE9HRklMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGZpbGUgdG8gd2hpY2ggd2FybmluZyBhbmQgZXJyb3IKKyMgbWVzc2FnZXMgc2hvdWxkIGJlIHdyaXR0ZW4uIElmIGxlZnQgYmxhbmsgdGhlIG91dHB1dCBpcyB3cml0dGVuIHRvIHN0YW5kYXJkCisjIGVycm9yIChzdGRlcnIpLgorCitXQVJOX0xPR0ZJTEUgICAgICAgICAgID0gCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGlucHV0IGZpbGVzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhlIElOUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGVzIGFuZC9vciBkaXJlY3RvcmllcyB0aGF0IGNvbnRhaW4KKyMgZG9jdW1lbnRlZCBzb3VyY2UgZmlsZXMuIFlvdSBtYXkgZW50ZXIgZmlsZSBuYW1lcyBsaWtlIG15ZmlsZS5jcHAgb3IKKyMgZGlyZWN0b3JpZXMgbGlrZSAvdXNyL3NyYy9teXByb2plY3QuIFNlcGFyYXRlIHRoZSBmaWxlcyBvciBkaXJlY3RvcmllcyB3aXRoCisjIHNwYWNlcy4KKyMgTm90ZTogSWYgdGhpcyB0YWcgaXMgZW1wdHkgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlzIHNlYXJjaGVkLgorCitJTlBVVCAgICAgICAgICAgICAgICAgID0gc3JjCisKKyMgVGhpcyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIG9mIHRoZSBzb3VyY2UgZmlsZXMKKyMgdGhhdCBkb3h5Z2VuIHBhcnNlcy4gSW50ZXJuYWxseSBkb3h5Z2VuIHVzZXMgdGhlIFVURi04IGVuY29kaW5nLiBEb3h5Z2VuIHVzZXMKKyMgbGliaWNvbnYgKG9yIHRoZSBpY29udiBidWlsdCBpbnRvIGxpYmMpIGZvciB0aGUgdHJhbnNjb2RpbmcuIFNlZSB0aGUgbGliaWNvbnYKKyMgZG9jdW1lbnRhdGlvbiAoc2VlOiBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvbGliaWNvbnYpIGZvciB0aGUgbGlzdCBvZgorIyBwb3NzaWJsZSBlbmNvZGluZ3MuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBVVEYtOC4KKworSU5QVVRfRU5DT0RJTkcgICAgICAgICA9IFVURi04CisKKyMgSWYgdGhlIHZhbHVlIG9mIHRoZSBJTlBVVCB0YWcgY29udGFpbnMgZGlyZWN0b3JpZXMsIHlvdSBjYW4gdXNlIHRoZQorIyBGSUxFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkIHBhdHRlcm5zIChsaWtlICouY3BwIGFuZAorIyAqLmgpIHRvIGZpbHRlciBvdXQgdGhlIHNvdXJjZS1maWxlcyBpbiB0aGUgZGlyZWN0b3JpZXMuIElmIGxlZnQgYmxhbmsgdGhlCisjIGZvbGxvd2luZyBwYXR0ZXJucyBhcmUgdGVzdGVkOiouYywgKi5jYywgKi5jeHgsICouY3BwLCAqLmMrKywgKi5qYXZhLCAqLmlpLAorIyAqLml4eCwgKi5pcHAsICouaSsrLCAqLmlubCwgKi5pZGwsICouZGRsLCAqLm9kbCwgKi5oLCAqLmhoLCAqLmh4eCwgKi5ocHAsCisjICouaCsrLCAqLmNzLCAqLmQsICoucGhwLCAqLnBocDQsICoucGhwNSwgKi5waHRtbCwgKi5pbmMsICoubSwgKi5tYXJrZG93biwKKyMgKi5tZCwgKi5tbSwgKi5kb3gsICoucHksICouZjkwLCAqLmYsICouZm9yLCAqLnRjbCwgKi52aGQsICoudmhkbCwgKi51Y2YsCisjICoucXNmLCAqLmFzIGFuZCAqLmpzLgorCitGSUxFX1BBVFRFUk5TICAgICAgICAgID0gKi5jICouaCAqLmNwcCAqLmY5MAorCisjIFRoZSBSRUNVUlNJVkUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciBvciBub3Qgc3ViZGlyZWN0b3JpZXMgc2hvdWxkCisjIGJlIHNlYXJjaGVkIGZvciBpbnB1dCBmaWxlcyBhcyB3ZWxsLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1JFQ1VSU0lWRSAgICAgICAgICAgICAgPSBZRVMKKworIyBUaGUgRVhDTFVERSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBmaWxlcyBhbmQvb3IgZGlyZWN0b3JpZXMgdGhhdCBzaG91bGQgYmUKKyMgZXhjbHVkZWQgZnJvbSB0aGUgSU5QVVQgc291cmNlIGZpbGVzLiBUaGlzIHdheSB5b3UgY2FuIGVhc2lseSBleGNsdWRlIGEKKyMgc3ViZGlyZWN0b3J5IGZyb20gYSBkaXJlY3RvcnkgdHJlZSB3aG9zZSByb290IGlzIHNwZWNpZmllZCB3aXRoIHRoZSBJTlBVVCB0YWcuCisjCisjIE5vdGUgdGhhdCByZWxhdGl2ZSBwYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIGRveHlnZW4gaXMKKyMgcnVuLgorCitFWENMVURFICAgICAgICAgICAgICAgID0gc3JjL2ltcG9ydGVkIHNyYy9yZHRzYy5oCisKKyMgVGhlIEVYQ0xVREVfU1lNTElOS1MgdGFnIGNhbiBiZSB1c2VkIHRvIHNlbGVjdCB3aGV0aGVyIG9yIG5vdCBmaWxlcyBvcgorIyBkaXJlY3RvcmllcyB0aGF0IGFyZSBzeW1ib2xpYyBsaW5rcyAoYSBVbml4IGZpbGUgc3lzdGVtIGZlYXR1cmUpIGFyZSBleGNsdWRlZAorIyBmcm9tIHRoZSBpbnB1dC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWENMVURFX1NZTUxJTktTICAgICAgID0gTk8KKworIyBJZiB0aGUgdmFsdWUgb2YgdGhlIElOUFVUIHRhZyBjb250YWlucyBkaXJlY3RvcmllcywgeW91IGNhbiB1c2UgdGhlCisjIEVYQ0xVREVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybnMgdG8gZXhjbHVkZQorIyBjZXJ0YWluIGZpbGVzIGZyb20gdGhvc2UgZGlyZWN0b3JpZXMuCisjCisjIE5vdGUgdGhhdCB0aGUgd2lsZGNhcmRzIGFyZSBtYXRjaGVkIGFnYWluc3QgdGhlIGZpbGUgd2l0aCBhYnNvbHV0ZSBwYXRoLCBzbyB0bworIyBleGNsdWRlIGFsbCB0ZXN0IGRpcmVjdG9yaWVzIGZvciBleGFtcGxlIHVzZSB0aGUgcGF0dGVybiAqL3Rlc3QvKgorCitFWENMVURFX1BBVFRFUk5TICAgICAgID0gCisKKyMgVGhlIEVYQ0xVREVfU1lNQk9MUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBzeW1ib2wgbmFtZXMKKyMgKG5hbWVzcGFjZXMsIGNsYXNzZXMsIGZ1bmN0aW9ucywgZXRjLikgdGhhdCBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSB0aGUKKyMgb3V0cHV0LiBUaGUgc3ltYm9sIG5hbWUgY2FuIGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUsIGEgd29yZCwgb3IgaWYgdGhlCisjIHdpbGRjYXJkICogaXMgdXNlZCwgYSBzdWJzdHJpbmcuIEV4YW1wbGVzOiBBTmFtZXNwYWNlLCBBQ2xhc3MsCisjIEFDbGFzczo6QU5hbWVzcGFjZSwgQU5hbWVzcGFjZTo6KlRlc3QKKyMKKyMgTm90ZSB0aGF0IHRoZSB3aWxkY2FyZHMgYXJlIG1hdGNoZWQgYWdhaW5zdCB0aGUgZmlsZSB3aXRoIGFic29sdXRlIHBhdGgsIHNvIHRvCisjIGV4Y2x1ZGUgYWxsIHRlc3QgZGlyZWN0b3JpZXMgdXNlIHRoZSBwYXR0ZXJuICovdGVzdC8qCisKK0VYQ0xVREVfU1lNQk9MUyAgICAgICAgPSAKKworIyBUaGUgRVhBTVBMRV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGZpbGVzIG9yIGRpcmVjdG9yaWVzCisjIHRoYXQgY29udGFpbiBleGFtcGxlIGNvZGUgZnJhZ21lbnRzIHRoYXQgYXJlIGluY2x1ZGVkIChzZWUgdGhlIFxpbmNsdWRlCisjIGNvbW1hbmQpLgorCitFWEFNUExFX1BBVEggICAgICAgICAgID0gCisKKyMgSWYgdGhlIHZhbHVlIG9mIHRoZSBFWEFNUExFX1BBVEggdGFnIGNvbnRhaW5zIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHVzZSB0aGUKKyMgRVhBTVBMRV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCBwYXR0ZXJuIChsaWtlICouY3BwIGFuZAorIyAqLmgpIHRvIGZpbHRlciBvdXQgdGhlIHNvdXJjZS1maWxlcyBpbiB0aGUgZGlyZWN0b3JpZXMuIElmIGxlZnQgYmxhbmsgYWxsCisjIGZpbGVzIGFyZSBpbmNsdWRlZC4KKworRVhBTVBMRV9QQVRURVJOUyAgICAgICA9ICoKKworIyBJZiB0aGUgRVhBTVBMRV9SRUNVUlNJVkUgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBzdWJkaXJlY3RvcmllcyB3aWxsIGJlCisjIHNlYXJjaGVkIGZvciBpbnB1dCBmaWxlcyB0byBiZSB1c2VkIHdpdGggdGhlIFxpbmNsdWRlIG9yIFxkb250aW5jbHVkZSBjb21tYW5kcworIyBpcnJlc3BlY3RpdmUgb2YgdGhlIHZhbHVlIG9mIHRoZSBSRUNVUlNJVkUgdGFnLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0VYQU1QTEVfUkVDVVJTSVZFICAgICAgPSBOTworCisjIFRoZSBJTUFHRV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGZpbGVzIG9yIGRpcmVjdG9yaWVzCisjIHRoYXQgY29udGFpbiBpbWFnZXMgdGhhdCBhcmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUKKyMgXGltYWdlIGNvbW1hbmQpLgorCitJTUFHRV9QQVRIICAgICAgICAgICAgID0gCisKKyMgVGhlIElOUFVUX0ZJTFRFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHByb2dyYW0gdGhhdCBkb3h5Z2VuIHNob3VsZAorIyBpbnZva2UgdG8gZmlsdGVyIGZvciBlYWNoIGlucHV0IGZpbGUuIERveHlnZW4gd2lsbCBpbnZva2UgdGhlIGZpbHRlciBwcm9ncmFtCisjIGJ5IGV4ZWN1dGluZyAodmlhIHBvcGVuKCkpIHRoZSBjb21tYW5kOgorIworIyA8ZmlsdGVyPiA8aW5wdXQtZmlsZT4KKyMKKyMgd2hlcmUgPGZpbHRlcj4gaXMgdGhlIHZhbHVlIG9mIHRoZSBJTlBVVF9GSUxURVIgdGFnLCBhbmQgPGlucHV0LWZpbGU+IGlzIHRoZQorIyBuYW1lIG9mIGFuIGlucHV0IGZpbGUuIERveHlnZW4gd2lsbCB0aGVuIHVzZSB0aGUgb3V0cHV0IHRoYXQgdGhlIGZpbHRlcgorIyBwcm9ncmFtIHdyaXRlcyB0byBzdGFuZGFyZCBvdXRwdXQuIElmIEZJTFRFUl9QQVRURVJOUyBpcyBzcGVjaWZpZWQsIHRoaXMgdGFnCisjIHdpbGwgYmUgaWdub3JlZC4KKyMKKyMgTm90ZSB0aGF0IHRoZSBmaWx0ZXIgbXVzdCBub3QgYWRkIG9yIHJlbW92ZSBsaW5lczsgaXQgaXMgYXBwbGllZCBiZWZvcmUgdGhlCisjIGNvZGUgaXMgc2Nhbm5lZCwgYnV0IG5vdCB3aGVuIHRoZSBvdXRwdXQgY29kZSBpcyBnZW5lcmF0ZWQuIElmIGxpbmVzIGFyZSBhZGRlZAorIyBvciByZW1vdmVkLCB0aGUgYW5jaG9ycyB3aWxsIG5vdCBiZSBwbGFjZWQgY29ycmVjdGx5LgorCitJTlBVVF9GSUxURVIgICAgICAgICAgID0gCisKKyMgVGhlIEZJTFRFUl9QQVRURVJOUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBmaWx0ZXJzIG9uIGEgcGVyIGZpbGUgcGF0dGVybgorIyBiYXNpcy4gRG94eWdlbiB3aWxsIGNvbXBhcmUgdGhlIGZpbGUgbmFtZSB3aXRoIGVhY2ggcGF0dGVybiBhbmQgYXBwbHkgdGhlCisjIGZpbHRlciBpZiB0aGVyZSBpcyBhIG1hdGNoLiBUaGUgZmlsdGVycyBhcmUgYSBsaXN0IG9mIHRoZSBmb3JtOiBwYXR0ZXJuPWZpbHRlcgorIyAobGlrZSAqLmNwcD1teV9jcHBfZmlsdGVyKS4gU2VlIElOUFVUX0ZJTFRFUiBmb3IgZnVydGhlciBpbmZvcm1hdGlvbiBvbiBob3cKKyMgZmlsdGVycyBhcmUgdXNlZC4gSWYgdGhlIEZJTFRFUl9QQVRURVJOUyB0YWcgaXMgZW1wdHkgb3IgaWYgbm9uZSBvZiB0aGUKKyMgcGF0dGVybnMgbWF0Y2ggdGhlIGZpbGUgbmFtZSwgSU5QVVRfRklMVEVSIGlzIGFwcGxpZWQuCisKK0ZJTFRFUl9QQVRURVJOUyAgICAgICAgPSAKKworIyBJZiB0aGUgRklMVEVSX1NPVVJDRV9GSUxFUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIGlucHV0IGZpbHRlciAoaWYgc2V0IHVzaW5nCisjIElOUFVUX0ZJTFRFUiApIHdpbGwgYWxzbyBiZSB1c2VkIHRvIGZpbHRlciB0aGUgaW5wdXQgZmlsZXMgdGhhdCBhcmUgdXNlZCBmb3IKKyMgcHJvZHVjaW5nIHRoZSBzb3VyY2UgZmlsZXMgdG8gYnJvd3NlIChpLmUuIHdoZW4gU09VUkNFX0JST1dTRVIgaXMgc2V0IHRvIFlFUykuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRklMVEVSX1NPVVJDRV9GSUxFUyAgICA9IE5PCisKKyMgVGhlIEZJTFRFUl9TT1VSQ0VfUEFUVEVSTlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgc291cmNlIGZpbHRlcnMgcGVyIGZpbGUKKyMgcGF0dGVybi4gQSBwYXR0ZXJuIHdpbGwgb3ZlcnJpZGUgdGhlIHNldHRpbmcgZm9yIEZJTFRFUl9QQVRURVJOIChpZiBhbnkpIGFuZAorIyBpdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGRpc2FibGUgc291cmNlIGZpbHRlcmluZyBmb3IgYSBzcGVjaWZpYyBwYXR0ZXJuIHVzaW5nCisjICouZXh0PSAoc28gd2l0aG91dCBuYW1pbmcgYSBmaWx0ZXIpLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRklMVEVSX1NPVVJDRV9GSUxFUyBpcyBzZXQgdG8gWUVTLgorCitGSUxURVJfU09VUkNFX1BBVFRFUk5TID0gCisKKyMgSWYgdGhlIFVTRV9NREZJTEVfQVNfTUFJTlBBR0UgdGFnIHJlZmVycyB0byB0aGUgbmFtZSBvZiBhIG1hcmtkb3duIGZpbGUgdGhhdAorIyBpcyBwYXJ0IG9mIHRoZSBpbnB1dCwgaXRzIGNvbnRlbnRzIHdpbGwgYmUgcGxhY2VkIG9uIHRoZSBtYWluIHBhZ2UKKyMgKGluZGV4Lmh0bWwpLiBUaGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91IGhhdmUgYSBwcm9qZWN0IG9uIGZvciBpbnN0YW5jZSBHaXRIdWIKKyMgYW5kIHdhbnQgdG8gcmV1c2UgdGhlIGludHJvZHVjdGlvbiBwYWdlIGFsc28gZm9yIHRoZSBkb3h5Z2VuIG91dHB1dC4KKworVVNFX01ERklMRV9BU19NQUlOUEFHRSA9IAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHNvdXJjZSBicm93c2luZworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBTT1VSQ0VfQlJPV1NFUiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGEgbGlzdCBvZiBzb3VyY2UgZmlsZXMgd2lsbCBiZQorIyBnZW5lcmF0ZWQuIERvY3VtZW50ZWQgZW50aXRpZXMgd2lsbCBiZSBjcm9zcy1yZWZlcmVuY2VkIHdpdGggdGhlc2Ugc291cmNlcy4KKyMKKyMgTm90ZTogVG8gZ2V0IHJpZCBvZiBhbGwgc291cmNlIGNvZGUgaW4gdGhlIGdlbmVyYXRlZCBvdXRwdXQsIG1ha2Ugc3VyZSB0aGF0CisjIGFsc28gVkVSQkFUSU1fSEVBREVSUyBpcyBzZXQgdG8gTk8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU09VUkNFX0JST1dTRVIgICAgICAgICA9IFlFUworCisjIFNldHRpbmcgdGhlIElOTElORV9TT1VSQ0VTIHRhZyB0byBZRVMgd2lsbCBpbmNsdWRlIHRoZSBib2R5IG9mIGZ1bmN0aW9ucywKKyMgY2xhc3NlcyBhbmQgZW51bXMgZGlyZWN0bHkgaW50byB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitJTkxJTkVfU09VUkNFUyAgICAgICAgID0gTk8KKworIyBTZXR0aW5nIHRoZSBTVFJJUF9DT0RFX0NPTU1FTlRTIHRhZyB0byBZRVMgd2lsbCBpbnN0cnVjdCBkb3h5Z2VuIHRvIGhpZGUgYW55CisjIHNwZWNpYWwgY29tbWVudCBibG9ja3MgZnJvbSBnZW5lcmF0ZWQgc291cmNlIGNvZGUgZnJhZ21lbnRzLiBOb3JtYWwgQywgQysrIGFuZAorIyBGb3J0cmFuIGNvbW1lbnRzIHdpbGwgYWx3YXlzIHJlbWFpbiB2aXNpYmxlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitTVFJJUF9DT0RFX0NPTU1FTlRTICAgID0gWUVTCisKKyMgSWYgdGhlIFJFRkVSRU5DRURfQllfUkVMQVRJT04gdGFnIGlzIHNldCB0byBZRVMgdGhlbiBmb3IgZWFjaCBkb2N1bWVudGVkCisjIGZ1bmN0aW9uIGFsbCBkb2N1bWVudGVkIGZ1bmN0aW9ucyByZWZlcmVuY2luZyBpdCB3aWxsIGJlIGxpc3RlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OID0gWUVTCisKKyMgSWYgdGhlIFJFRkVSRU5DRVNfUkVMQVRJT04gdGFnIGlzIHNldCB0byBZRVMgdGhlbiBmb3IgZWFjaCBkb2N1bWVudGVkIGZ1bmN0aW9uCisjIGFsbCBkb2N1bWVudGVkIGVudGl0aWVzIGNhbGxlZC91c2VkIGJ5IHRoYXQgZnVuY3Rpb24gd2lsbCBiZSBsaXN0ZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworUkVGRVJFTkNFU19SRUxBVElPTiAgICA9IE5PCisKKyMgSWYgdGhlIFJFRkVSRU5DRVNfTElOS19TT1VSQ0UgdGFnIGlzIHNldCB0byBZRVMgYW5kIFNPVVJDRV9CUk9XU0VSIHRhZyBpcyBzZXQKKyMgdG8gWUVTLCB0aGVuIHRoZSBoeXBlcmxpbmtzIGZyb20gZnVuY3Rpb25zIGluIFJFRkVSRU5DRVNfUkVMQVRJT04gYW5kCisjIFJFRkVSRU5DRURfQllfUkVMQVRJT04gbGlzdHMgd2lsbCBsaW5rIHRvIHRoZSBzb3VyY2UgY29kZS4gT3RoZXJ3aXNlIHRoZXkgd2lsbAorIyBsaW5rIHRvIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitSRUZFUkVOQ0VTX0xJTktfU09VUkNFID0gWUVTCisKKyMgSWYgU09VUkNFX1RPT0xUSVBTIGlzIGVuYWJsZWQgKHRoZSBkZWZhdWx0KSB0aGVuIGhvdmVyaW5nIGEgaHlwZXJsaW5rIGluIHRoZQorIyBzb3VyY2UgY29kZSB3aWxsIHNob3cgYSB0b29sdGlwIHdpdGggYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBzdWNoIGFzIHByb3RvdHlwZSwKKyMgYnJpZWYgZGVzY3JpcHRpb24gYW5kIGxpbmtzIHRvIHRoZSBkZWZpbml0aW9uIGFuZCBkb2N1bWVudGF0aW9uLiBTaW5jZSB0aGlzCisjIHdpbGwgbWFrZSB0aGUgSFRNTCBmaWxlIGxhcmdlciBhbmQgbG9hZGluZyBvZiBsYXJnZSBmaWxlcyBhIGJpdCBzbG93ZXIsIHlvdQorIyBjYW4gb3B0IHRvIGRpc2FibGUgdGhpcyBmZWF0dXJlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU09VUkNFX0JST1dTRVIgaXMgc2V0IHRvIFlFUy4KKworU09VUkNFX1RPT0xUSVBTICAgICAgICA9IFlFUworCisjIElmIHRoZSBVU0VfSFRBR1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgcmVmZXJlbmNlcyB0byBzb3VyY2UgY29kZSB3aWxsCisjIHBvaW50IHRvIHRoZSBIVE1MIGdlbmVyYXRlZCBieSB0aGUgaHRhZ3MoMSkgdG9vbCBpbnN0ZWFkIG9mIGRveHlnZW4gYnVpbHQtaW4KKyMgc291cmNlIGJyb3dzZXIuIFRoZSBodGFncyB0b29sIGlzIHBhcnQgb2YgR05VJ3MgZ2xvYmFsIHNvdXJjZSB0YWdnaW5nIHN5c3RlbQorIyAoc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9nbG9iYWwvZ2xvYmFsLmh0bWwpLiBZb3Ugd2lsbCBuZWVkIHZlcnNpb24KKyMgNC44LjYgb3IgaGlnaGVyLgorIworIyBUbyB1c2UgaXQgZG8gdGhlIGZvbGxvd2luZzoKKyMgLSBJbnN0YWxsIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBnbG9iYWwKKyMgLSBFbmFibGUgU09VUkNFX0JST1dTRVIgYW5kIFVTRV9IVEFHUyBpbiB0aGUgY29uZmlnIGZpbGUKKyMgLSBNYWtlIHN1cmUgdGhlIElOUFVUIHBvaW50cyB0byB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUKKyMgLSBSdW4gZG94eWdlbiBhcyBub3JtYWwKKyMKKyMgRG94eWdlbiB3aWxsIGludm9rZSBodGFncyAoYW5kIHRoYXQgd2lsbCBpbiB0dXJuIGludm9rZSBndGFncyksIHNvIHRoZXNlCisjIHRvb2xzIG11c3QgYmUgYXZhaWxhYmxlIGZyb20gdGhlIGNvbW1hbmQgbGluZSAoaS5lLiBpbiB0aGUgc2VhcmNoIHBhdGgpLgorIworIyBUaGUgcmVzdWx0OiBpbnN0ZWFkIG9mIHRoZSBzb3VyY2UgYnJvd3NlciBnZW5lcmF0ZWQgYnkgZG94eWdlbiwgdGhlIGxpbmtzIHRvCisjIHNvdXJjZSBjb2RlIHdpbGwgbm93IHBvaW50IHRvIHRoZSBvdXRwdXQgb2YgaHRhZ3MuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNPVVJDRV9CUk9XU0VSIGlzIHNldCB0byBZRVMuCisKK1VTRV9IVEFHUyAgICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBWRVJCQVRJTV9IRUFERVJTIHRhZyBpcyBzZXQgdGhlIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhCisjIHZlcmJhdGltIGNvcHkgb2YgdGhlIGhlYWRlciBmaWxlIGZvciBlYWNoIGNsYXNzIGZvciB3aGljaCBhbiBpbmNsdWRlIGlzCisjIHNwZWNpZmllZC4gU2V0IHRvIE5PIHRvIGRpc2FibGUgdGhpcy4KKyMgU2VlIGFsc286IFNlY3Rpb24gXGNsYXNzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitWRVJCQVRJTV9IRUFERVJTICAgICAgID0gWUVTCisKKyMgSWYgdGhlIENMQU5HX0FTU0lTVEVEX1BBUlNJTkcgdGFnIGlzIHNldCB0byBZRVMsIHRoZW4gZG94eWdlbiB3aWxsIHVzZSB0aGUKKyMgY2xhbmcgcGFyc2VyIChzZWU6IGh0dHA6Ly9jbGFuZy5sbHZtLm9yZy8pIGZvciBtb3JlIGFjdXJhdGUgcGFyc2luZyBhdCB0aGUKKyMgY29zdCBvZiByZWR1Y2VkIHBlcmZvcm1hbmNlLiBUaGlzIGNhbiBiZSBwYXJ0aWN1bGFybHkgaGVscGZ1bCB3aXRoIHRlbXBsYXRlCisjIHJpY2ggQysrIGNvZGUgZm9yIHdoaWNoIGRveHlnZW4ncyBidWlsdC1pbiBwYXJzZXIgbGFja3MgdGhlIG5lY2Vzc2FyeSB0eXBlCisjIGluZm9ybWF0aW9uLgorIyBOb3RlOiBUaGUgYXZhaWxhYmlsaXR5IG9mIHRoaXMgb3B0aW9uIGRlcGVuZHMgb24gd2hldGhlciBvciBub3QgZG94eWdlbiB3YXMKKyMgY29tcGlsZWQgd2l0aCB0aGUgLS13aXRoLWxpYmNsYW5nIG9wdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitDTEFOR19BU1NJU1RFRF9QQVJTSU5HID0gTk8KKworIyBJZiBjbGFuZyBhc3Npc3RlZCBwYXJzaW5nIGlzIGVuYWJsZWQgeW91IGNhbiBwcm92aWRlIHRoZSBjb21waWxlciB3aXRoIGNvbW1hbmQKKyMgbGluZSBvcHRpb25zIHRoYXQgeW91IHdvdWxkIG5vcm1hbGx5IHVzZSB3aGVuIGludm9raW5nIHRoZSBjb21waWxlci4gTm90ZSB0aGF0CisjIHRoZSBpbmNsdWRlIHBhdGhzIHdpbGwgYWxyZWFkeSBiZSBzZXQgYnkgZG94eWdlbiBmb3IgdGhlIGZpbGVzIGFuZCBkaXJlY3RvcmllcworIyBzcGVjaWZpZWQgd2l0aCBJTlBVVCBhbmQgSU5DTFVERV9QQVRILgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgQ0xBTkdfQVNTSVNURURfUEFSU0lORyBpcyBzZXQgdG8gWUVTLgorCitDTEFOR19PUFRJT05TICAgICAgICAgID0gCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGFscGhhYmV0aWNhbCBjbGFzcyBpbmRleAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBBTFBIQUJFVElDQUxfSU5ERVggdGFnIGlzIHNldCB0byBZRVMsIGFuIGFscGhhYmV0aWNhbCBpbmRleCBvZiBhbGwKKyMgY29tcG91bmRzIHdpbGwgYmUgZ2VuZXJhdGVkLiBFbmFibGUgdGhpcyBpZiB0aGUgcHJvamVjdCBjb250YWlucyBhIGxvdCBvZgorIyBjbGFzc2VzLCBzdHJ1Y3RzLCB1bmlvbnMgb3IgaW50ZXJmYWNlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworQUxQSEFCRVRJQ0FMX0lOREVYICAgICA9IFlFUworCisjIFRoZSBDT0xTX0lOX0FMUEhBX0lOREVYIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbgorIyB3aGljaCB0aGUgYWxwaGFiZXRpY2FsIGluZGV4IGxpc3Qgd2lsbCBiZSBzcGxpdC4KKyMgTWluaW11bSB2YWx1ZTogMSwgbWF4aW11bSB2YWx1ZTogMjAsIGRlZmF1bHQgdmFsdWU6IDUuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBBTFBIQUJFVElDQUxfSU5ERVggaXMgc2V0IHRvIFlFUy4KKworQ09MU19JTl9BTFBIQV9JTkRFWCAgICA9IDUKKworIyBJbiBjYXNlIGFsbCBjbGFzc2VzIGluIGEgcHJvamVjdCBzdGFydCB3aXRoIGEgY29tbW9uIHByZWZpeCwgYWxsIGNsYXNzZXMgd2lsbAorIyBiZSBwdXQgdW5kZXIgdGhlIHNhbWUgaGVhZGVyIGluIHRoZSBhbHBoYWJldGljYWwgaW5kZXguIFRoZSBJR05PUkVfUFJFRklYIHRhZworIyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcHJlZml4IChvciBhIGxpc3Qgb2YgcHJlZml4ZXMpIHRoYXQgc2hvdWxkIGJlIGlnbm9yZWQKKyMgd2hpbGUgZ2VuZXJhdGluZyB0aGUgaW5kZXggaGVhZGVycy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEFMUEhBQkVUSUNBTF9JTkRFWCBpcyBzZXQgdG8gWUVTLgorCitJR05PUkVfUFJFRklYICAgICAgICAgID0gCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIEhUTUwgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUwgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIEhUTUwgb3V0cHV0CisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0dFTkVSQVRFX0hUTUwgICAgICAgICAgPSBZRVMKKworIyBUaGUgSFRNTF9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgSFRNTCBkb2NzIHdpbGwgYmUgcHV0LiBJZiBhCisjIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlIHB1dCBpbiBmcm9udCBvZgorIyBpdC4KKyMgVGhlIGRlZmF1bHQgZGlyZWN0b3J5IGlzOiBodG1sLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX09VVFBVVCAgICAgICAgICAgID0gaHRtbAorCisjIFRoZSBIVE1MX0ZJTEVfRVhURU5TSU9OIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlIGV4dGVuc2lvbiBmb3IgZWFjaAorIyBnZW5lcmF0ZWQgSFRNTCBwYWdlIChmb3IgZXhhbXBsZTogLmh0bSwgLnBocCwgLmFzcCkuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiAuaHRtbC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9GSUxFX0VYVEVOU0lPTiAgICA9IC5odG1sCisKKyMgVGhlIEhUTUxfSEVBREVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgdXNlci1kZWZpbmVkIEhUTUwgaGVhZGVyIGZpbGUgZm9yCisjIGVhY2ggZ2VuZXJhdGVkIEhUTUwgcGFnZS4gSWYgdGhlIHRhZyBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhCisjIHN0YW5kYXJkIGhlYWRlci4KKyMKKyMgVG8gZ2V0IHZhbGlkIEhUTUwgdGhlIGhlYWRlciBmaWxlIHRoYXQgaW5jbHVkZXMgYW55IHNjcmlwdHMgYW5kIHN0eWxlIHNoZWV0cworIyB0aGF0IGRveHlnZW4gbmVlZHMsIHdoaWNoIGlzIGRlcGVuZGVudCBvbiB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHVzZWQgKGUuZy4KKyMgdGhlIHNldHRpbmcgR0VORVJBVEVfVFJFRVZJRVcpLiBJdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdG8gc3RhcnQgd2l0aCBhCisjIGRlZmF1bHQgaGVhZGVyIHVzaW5nCisjIGRveHlnZW4gLXcgaHRtbCBuZXdfaGVhZGVyLmh0bWwgbmV3X2Zvb3Rlci5odG1sIG5ld19zdHlsZXNoZWV0LmNzcworIyBZb3VyQ29uZmlnRmlsZQorIyBhbmQgdGhlbiBtb2RpZnkgdGhlIGZpbGUgbmV3X2hlYWRlci5odG1sLiBTZWUgYWxzbyBzZWN0aW9uICJEb3h5Z2VuIHVzYWdlIgorIyBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGdlbmVyYXRlIHRoZSBkZWZhdWx0IGhlYWRlciB0aGF0IGRveHlnZW4gbm9ybWFsbHkKKyMgdXNlcy4KKyMgTm90ZTogVGhlIGhlYWRlciBpcyBzdWJqZWN0IHRvIGNoYW5nZSBzbyB5b3UgdHlwaWNhbGx5IGhhdmUgdG8gcmVnZW5lcmF0ZSB0aGUKKyMgZGVmYXVsdCBoZWFkZXIgd2hlbiB1cGdyYWRpbmcgdG8gYSBuZXdlciB2ZXJzaW9uIG9mIGRveHlnZW4uIEZvciBhIGRlc2NyaXB0aW9uCisjIG9mIHRoZSBwb3NzaWJsZSBtYXJrZXJzIGFuZCBibG9jayBuYW1lcyBzZWUgdGhlIGRvY3VtZW50YXRpb24uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfSEVBREVSICAgICAgICAgICAgPSAKKworIyBUaGUgSFRNTF9GT09URVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSB1c2VyLWRlZmluZWQgSFRNTCBmb290ZXIgZm9yIGVhY2gKKyMgZ2VuZXJhdGVkIEhUTUwgcGFnZS4gSWYgdGhlIHRhZyBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIHN0YW5kYXJkCisjIGZvb3Rlci4gU2VlIEhUTUxfSEVBREVSIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGhvdyB0byBnZW5lcmF0ZSBhIGRlZmF1bHQKKyMgZm9vdGVyIGFuZCB3aGF0IHNwZWNpYWwgY29tbWFuZHMgY2FuIGJlIHVzZWQgaW5zaWRlIHRoZSBmb290ZXIuIFNlZSBhbHNvCisjIHNlY3Rpb24gIkRveHlnZW4gdXNhZ2UiIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZ2VuZXJhdGUgdGhlIGRlZmF1bHQgZm9vdGVyCisjIHRoYXQgZG94eWdlbiBub3JtYWxseSB1c2VzLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0ZPT1RFUiAgICAgICAgICAgID0gCisKKyMgVGhlIEhUTUxfU1RZTEVTSEVFVCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHVzZXItZGVmaW5lZCBjYXNjYWRpbmcgc3R5bGUKKyMgc2hlZXQgdGhhdCBpcyB1c2VkIGJ5IGVhY2ggSFRNTCBwYWdlLiBJdCBjYW4gYmUgdXNlZCB0byBmaW5lLXR1bmUgdGhlIGxvb2sgb2YKKyMgdGhlIEhUTUwgb3V0cHV0LiBJZiBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGRlZmF1bHQgc3R5bGUgc2hlZXQuCisjIFNlZSBhbHNvIHNlY3Rpb24gIkRveHlnZW4gdXNhZ2UiIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZ2VuZXJhdGUgdGhlIHN0eWxlCisjIHNoZWV0IHRoYXQgZG94eWdlbiBub3JtYWxseSB1c2VzLgorIyBOb3RlOiBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgSFRNTF9FWFRSQV9TVFlMRVNIRUVUIGluc3RlYWQgb2YgdGhpcyB0YWcsIGFzCisjIGl0IGlzIG1vcmUgcm9idXN0IGFuZCB0aGlzIHRhZyAoSFRNTF9TVFlMRVNIRUVUKSB3aWxsIGluIHRoZSBmdXR1cmUgYmVjb21lCisjIG9ic29sZXRlLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX1NUWUxFU0hFRVQgICAgICAgID0gCisKKyMgVGhlIEhUTUxfRVhUUkFfU1RZTEVTSEVFVCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhbiBhZGRpdGlvbmFsIHVzZXItCisjIGRlZmluZWQgY2FzY2FkaW5nIHN0eWxlIHNoZWV0IHRoYXQgaXMgaW5jbHVkZWQgYWZ0ZXIgdGhlIHN0YW5kYXJkIHN0eWxlIHNoZWV0cworIyBjcmVhdGVkIGJ5IGRveHlnZW4uIFVzaW5nIHRoaXMgb3B0aW9uIG9uZSBjYW4gb3ZlcnJ1bGUgY2VydGFpbiBzdHlsZSBhc3BlY3RzLgorIyBUaGlzIGlzIHByZWZlcnJlZCBvdmVyIHVzaW5nIEhUTUxfU1RZTEVTSEVFVCBzaW5jZSBpdCBkb2VzIG5vdCByZXBsYWNlIHRoZQorIyBzdGFuZGFyZCBzdHlsZSBzaGVldCBhbmQgaXMgdGhlcmVmb3IgbW9yZSByb2J1c3QgYWdhaW5zdCBmdXR1cmUgdXBkYXRlcy4KKyMgRG94eWdlbiB3aWxsIGNvcHkgdGhlIHN0eWxlIHNoZWV0IGZpbGUgdG8gdGhlIG91dHB1dCBkaXJlY3RvcnkuIEZvciBhbiBleGFtcGxlCisjIHNlZSB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9FWFRSQV9TVFlMRVNIRUVUICA9IAorCisjIFRoZSBIVE1MX0VYVFJBX0ZJTEVTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGV4dHJhIGltYWdlcyBvcgorIyBvdGhlciBzb3VyY2UgZmlsZXMgd2hpY2ggc2hvdWxkIGJlIGNvcGllZCB0byB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5LiBOb3RlCisjIHRoYXQgdGhlc2UgZmlsZXMgd2lsbCBiZSBjb3BpZWQgdG8gdGhlIGJhc2UgSFRNTCBvdXRwdXQgZGlyZWN0b3J5LiBVc2UgdGhlCisjICRyZWxwYXRoXiBtYXJrZXIgaW4gdGhlIEhUTUxfSEVBREVSIGFuZC9vciBIVE1MX0ZPT1RFUiBmaWxlcyB0byBsb2FkIHRoZXNlCisjIGZpbGVzLiBJbiB0aGUgSFRNTF9TVFlMRVNIRUVUIGZpbGUsIHVzZSB0aGUgZmlsZSBuYW1lIG9ubHkuIEFsc28gbm90ZSB0aGF0IHRoZQorIyBmaWxlcyB3aWxsIGJlIGNvcGllZCBhcy1pczsgdGhlcmUgYXJlIG5vIGNvbW1hbmRzIG9yIG1hcmtlcnMgYXZhaWxhYmxlLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0VYVFJBX0ZJTEVTICAgICAgID0gCisKKyMgVGhlIEhUTUxfQ09MT1JTVFlMRV9IVUUgdGFnIGNvbnRyb2xzIHRoZSBjb2xvciBvZiB0aGUgSFRNTCBvdXRwdXQuIERveHlnZW4KKyMgd2lsbCBhZGp1c3QgdGhlIGNvbG9ycyBpbiB0aGUgc3R5bGVzaGVldCBhbmQgYmFja2dyb3VuZCBpbWFnZXMgYWNjb3JkaW5nIHRvCisjIHRoaXMgY29sb3IuIEh1ZSBpcyBzcGVjaWZpZWQgYXMgYW4gYW5nbGUgb24gYSBjb2xvcndoZWVsLCBzZWUKKyMgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9IdWUgZm9yIG1vcmUgaW5mb3JtYXRpb24uIEZvciBpbnN0YW5jZSB0aGUgdmFsdWUKKyMgMCByZXByZXNlbnRzIHJlZCwgNjAgaXMgeWVsbG93LCAxMjAgaXMgZ3JlZW4sIDE4MCBpcyBjeWFuLCAyNDAgaXMgYmx1ZSwgMzAwCisjIHB1cnBsZSwgYW5kIDM2MCBpcyByZWQgYWdhaW4uCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDM1OSwgZGVmYXVsdCB2YWx1ZTogMjIwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0NPTE9SU1RZTEVfSFVFICAgID0gMjIwCisKKyMgVGhlIEhUTUxfQ09MT1JTVFlMRV9TQVQgdGFnIGNvbnRyb2xzIHRoZSBwdXJpdHkgKG9yIHNhdHVyYXRpb24pIG9mIHRoZSBjb2xvcnMKKyMgaW4gdGhlIEhUTUwgb3V0cHV0LiBGb3IgYSB2YWx1ZSBvZiAwIHRoZSBvdXRwdXQgd2lsbCB1c2UgZ3JheXNjYWxlcyBvbmx5LiBBCisjIHZhbHVlIG9mIDI1NSB3aWxsIHByb2R1Y2UgdGhlIG1vc3Qgdml2aWQgY29sb3JzLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAyNTUsIGRlZmF1bHQgdmFsdWU6IDEwMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9DT0xPUlNUWUxFX1NBVCAgICA9IDEwMAorCisjIFRoZSBIVE1MX0NPTE9SU1RZTEVfR0FNTUEgdGFnIGNvbnRyb2xzIHRoZSBnYW1tYSBjb3JyZWN0aW9uIGFwcGxpZWQgdG8gdGhlCisjIGx1bWluYW5jZSBjb21wb25lbnQgb2YgdGhlIGNvbG9ycyBpbiB0aGUgSFRNTCBvdXRwdXQuIFZhbHVlcyBiZWxvdyAxMDAKKyMgZ3JhZHVhbGx5IG1ha2UgdGhlIG91dHB1dCBsaWdodGVyLCB3aGVyZWFzIHZhbHVlcyBhYm92ZSAxMDAgbWFrZSB0aGUgb3V0cHV0CisjIGRhcmtlci4gVGhlIHZhbHVlIGRpdmlkZWQgYnkgMTAwIGlzIHRoZSBhY3R1YWwgZ2FtbWEgYXBwbGllZCwgc28gODAgcmVwcmVzZW50cworIyBhIGdhbW1hIG9mIDAuOCwgVGhlIHZhbHVlIDIyMCByZXByZXNlbnRzIGEgZ2FtbWEgb2YgMi4yLCBhbmQgMTAwIGRvZXMgbm90CisjIGNoYW5nZSB0aGUgZ2FtbWEuCisjIE1pbmltdW0gdmFsdWU6IDQwLCBtYXhpbXVtIHZhbHVlOiAyNDAsIGRlZmF1bHQgdmFsdWU6IDgwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0NPTE9SU1RZTEVfR0FNTUEgID0gODAKKworIyBJZiB0aGUgSFRNTF9USU1FU1RBTVAgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgZm9vdGVyIG9mIGVhY2ggZ2VuZXJhdGVkIEhUTUwKKyMgcGFnZSB3aWxsIGNvbnRhaW4gdGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgcGFnZSB3YXMgZ2VuZXJhdGVkLiBTZXR0aW5nIHRoaXMKKyMgdG8gTk8gY2FuIGhlbHAgd2hlbiBjb21wYXJpbmcgdGhlIG91dHB1dCBvZiBtdWx0aXBsZSBydW5zLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX1RJTUVTVEFNUCAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEhUTUxfRFlOQU1JQ19TRUNUSU9OUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHRoZSBnZW5lcmF0ZWQgSFRNTAorIyBkb2N1bWVudGF0aW9uIHdpbGwgY29udGFpbiBzZWN0aW9ucyB0aGF0IGNhbiBiZSBoaWRkZW4gYW5kIHNob3duIGFmdGVyIHRoZQorIyBwYWdlIGhhcyBsb2FkZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9EWU5BTUlDX1NFQ1RJT05TICA9IE5PCisKKyMgV2l0aCBIVE1MX0lOREVYX05VTV9FTlRSSUVTIG9uZSBjYW4gY29udHJvbCB0aGUgcHJlZmVycmVkIG51bWJlciBvZiBlbnRyaWVzCisjIHNob3duIGluIHRoZSB2YXJpb3VzIHRyZWUgc3RydWN0dXJlZCBpbmRpY2VzIGluaXRpYWxseTsgdGhlIHVzZXIgY2FuIGV4cGFuZAorIyBhbmQgY29sbGFwc2UgZW50cmllcyBkeW5hbWljYWxseSBsYXRlciBvbi4gRG94eWdlbiB3aWxsIGV4cGFuZCB0aGUgdHJlZSB0bworIyBzdWNoIGEgbGV2ZWwgdGhhdCBhdCBtb3N0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVudHJpZXMgYXJlIHZpc2libGUgKHVubGVzcworIyBhIGZ1bGx5IGNvbGxhcHNlZCB0cmVlIGFscmVhZHkgZXhjZWVkcyB0aGlzIGFtb3VudCkuIFNvIHNldHRpbmcgdGhlIG51bWJlciBvZgorIyBlbnRyaWVzIDEgd2lsbCBwcm9kdWNlIGEgZnVsbCBjb2xsYXBzZWQgdHJlZSBieSBkZWZhdWx0LiAwIGlzIGEgc3BlY2lhbCB2YWx1ZQorIyByZXByZXNlbnRpbmcgYW4gaW5maW5pdGUgbnVtYmVyIG9mIGVudHJpZXMgYW5kIHdpbGwgcmVzdWx0IGluIGEgZnVsbCBleHBhbmRlZAorIyB0cmVlIGJ5IGRlZmF1bHQuCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDk5OTksIGRlZmF1bHQgdmFsdWU6IDEwMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9JTkRFWF9OVU1fRU5UUklFUyA9IDEwMAorCisjIElmIHRoZSBHRU5FUkFURV9ET0NTRVQgdGFnIGlzIHNldCB0byBZRVMsIGFkZGl0aW9uYWwgaW5kZXggZmlsZXMgd2lsbCBiZQorIyBnZW5lcmF0ZWQgdGhhdCBjYW4gYmUgdXNlZCBhcyBpbnB1dCBmb3IgQXBwbGUncyBYY29kZSAzIGludGVncmF0ZWQgZGV2ZWxvcG1lbnQKKyMgZW52aXJvbm1lbnQgKHNlZTogaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vdG9vbHMveGNvZGUvKSwgaW50cm9kdWNlZCB3aXRoCisjIE9TWCAxMC41IChMZW9wYXJkKS4gVG8gY3JlYXRlIGEgZG9jdW1lbnRhdGlvbiBzZXQsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhCisjIE1ha2VmaWxlIGluIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkuIFJ1bm5pbmcgbWFrZSB3aWxsIHByb2R1Y2UgdGhlIGRvY3NldCBpbgorIyB0aGF0IGRpcmVjdG9yeSBhbmQgcnVubmluZyBtYWtlIGluc3RhbGwgd2lsbCBpbnN0YWxsIHRoZSBkb2NzZXQgaW4KKyMgfi9MaWJyYXJ5L0RldmVsb3Blci9TaGFyZWQvRG9jdW1lbnRhdGlvbi9Eb2NTZXRzIHNvIHRoYXQgWGNvZGUgd2lsbCBmaW5kIGl0IGF0CisjIHN0YXJ0dXAuIFNlZSBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS90b29scy9jcmVhdGluZ2RvY3NldHN3aXRoZG94eWdlbi5odG1sCisjIGZvciBtb3JlIGluZm9ybWF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0dFTkVSQVRFX0RPQ1NFVCAgICAgICAgPSBOTworCisjIFRoaXMgdGFnIGRldGVybWluZXMgdGhlIG5hbWUgb2YgdGhlIGRvY3NldCBmZWVkLiBBIGRvY3VtZW50YXRpb24gZmVlZCBwcm92aWRlcworIyBhbiB1bWJyZWxsYSB1bmRlciB3aGljaCBtdWx0aXBsZSBkb2N1bWVudGF0aW9uIHNldHMgZnJvbSBhIHNpbmdsZSBwcm92aWRlcgorIyAoc3VjaCBhcyBhIGNvbXBhbnkgb3IgcHJvZHVjdCBzdWl0ZSkgY2FuIGJlIGdyb3VwZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBEb3h5Z2VuIGdlbmVyYXRlZCBkb2NzLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRE9DU0VUIGlzIHNldCB0byBZRVMuCisKK0RPQ1NFVF9GRUVETkFNRSAgICAgICAgPSAiRG94eWdlbiBnZW5lcmF0ZWQgZG9jcyIKKworIyBUaGlzIHRhZyBzcGVjaWZpZXMgYSBzdHJpbmcgdGhhdCBzaG91bGQgdW5pcXVlbHkgaWRlbnRpZnkgdGhlIGRvY3VtZW50YXRpb24KKyMgc2V0IGJ1bmRsZS4gVGhpcyBzaG91bGQgYmUgYSByZXZlcnNlIGRvbWFpbi1uYW1lIHN0eWxlIHN0cmluZywgZS5nLgorIyBjb20ubXljb21wYW55Lk15RG9jU2V0LiBEb3h5Z2VuIHdpbGwgYXBwZW5kIC5kb2NzZXQgdG8gdGhlIG5hbWUuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBvcmcuZG94eWdlbi5Qcm9qZWN0LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRE9DU0VUIGlzIHNldCB0byBZRVMuCisKK0RPQ1NFVF9CVU5ETEVfSUQgICAgICAgPSBvcmcuZG94eWdlbi5Qcm9qZWN0CisKKyMgVGhlIERPQ1NFVF9QVUJMSVNIRVJfSUQgdGFnIHNwZWNpZmllcyBhIHN0cmluZyB0aGF0IHNob3VsZCB1bmlxdWVseSBpZGVudGlmeQorIyB0aGUgZG9jdW1lbnRhdGlvbiBwdWJsaXNoZXIuIFRoaXMgc2hvdWxkIGJlIGEgcmV2ZXJzZSBkb21haW4tbmFtZSBzdHlsZQorIyBzdHJpbmcsIGUuZy4gY29tLm15Y29tcGFueS5NeURvY1NldC5kb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogb3JnLmRveHlnZW4uUHVibGlzaGVyLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRE9DU0VUIGlzIHNldCB0byBZRVMuCisKK0RPQ1NFVF9QVUJMSVNIRVJfSUQgICAgPSBvcmcuZG94eWdlbi5QdWJsaXNoZXIKKworIyBUaGUgRE9DU0VUX1BVQkxJU0hFUl9OQU1FIHRhZyBpZGVudGlmaWVzIHRoZSBkb2N1bWVudGF0aW9uIHB1Ymxpc2hlci4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFB1Ymxpc2hlci4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0RPQ1NFVCBpcyBzZXQgdG8gWUVTLgorCitET0NTRVRfUFVCTElTSEVSX05BTUUgID0gUHVibGlzaGVyCisKKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiBnZW5lcmF0ZXMgdGhyZWUKKyMgYWRkaXRpb25hbCBIVE1MIGluZGV4IGZpbGVzOiBpbmRleC5oaHAsIGluZGV4LmhoYywgYW5kIGluZGV4Lmhoay4gVGhlCisjIGluZGV4LmhocCBpcyBhIHByb2plY3QgZmlsZSB0aGF0IGNhbiBiZSByZWFkIGJ5IE1pY3Jvc29mdCdzIEhUTUwgSGVscCBXb3Jrc2hvcAorIyAoc2VlOiBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vZW4tdXMvZG93bmxvYWQvZGV0YWlscy5hc3B4P2lkPTIxMTM4KSBvbgorIyBXaW5kb3dzLgorIworIyBUaGUgSFRNTCBIZWxwIFdvcmtzaG9wIGNvbnRhaW5zIGEgY29tcGlsZXIgdGhhdCBjYW4gY29udmVydCBhbGwgSFRNTCBvdXRwdXQKKyMgZ2VuZXJhdGVkIGJ5IGRveHlnZW4gaW50byBhIHNpbmdsZSBjb21waWxlZCBIVE1MIGZpbGUgKC5jaG0pLiBDb21waWxlZCBIVE1MCisjIGZpbGVzIGFyZSBub3cgdXNlZCBhcyB0aGUgV2luZG93cyA5OCBoZWxwIGZvcm1hdCwgYW5kIHdpbGwgcmVwbGFjZSB0aGUgb2xkCisjIFdpbmRvd3MgaGVscCBmb3JtYXQgKC5obHApIG9uIGFsbCBXaW5kb3dzIHBsYXRmb3JtcyBpbiB0aGUgZnV0dXJlLiBDb21wcmVzc2VkCisjIEhUTUwgZmlsZXMgYWxzbyBjb250YWluIGFuIGluZGV4LCBhIHRhYmxlIG9mIGNvbnRlbnRzLCBhbmQgeW91IGNhbiBzZWFyY2ggZm9yCisjIHdvcmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLiBUaGUgSFRNTCB3b3Jrc2hvcCBhbHNvIGNvbnRhaW5zIGEgdmlld2VyIGZvcgorIyBjb21wcmVzc2VkIEhUTUwgZmlsZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworR0VORVJBVEVfSFRNTEhFTFAgICAgICA9IE5PCisKKyMgVGhlIENITV9GSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlIG5hbWUgb2YgdGhlIHJlc3VsdGluZyAuY2htCisjIGZpbGUuIFlvdSBjYW4gYWRkIGEgcGF0aCBpbiBmcm9udCBvZiB0aGUgZmlsZSBpZiB0aGUgcmVzdWx0IHNob3VsZCBub3QgYmUKKyMgd3JpdHRlbiB0byB0aGUgaHRtbCBvdXRwdXQgZGlyZWN0b3J5LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTEhFTFAgaXMgc2V0IHRvIFlFUy4KKworQ0hNX0ZJTEUgICAgICAgICAgICAgICA9IAorCisjIFRoZSBISENfTE9DQVRJT04gdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIChhYnNvbHV0ZSBwYXRoCisjIGluY2x1ZGluZyBmaWxlIG5hbWUpIG9mIHRoZSBIVE1MIGhlbHAgY29tcGlsZXIgKCBoaGMuZXhlKS4gSWYgbm9uLWVtcHR5CisjIGRveHlnZW4gd2lsbCB0cnkgdG8gcnVuIHRoZSBIVE1MIGhlbHAgY29tcGlsZXIgb24gdGhlIGdlbmVyYXRlZCBpbmRleC5oaHAuCisjIFRoZSBmaWxlIGhhcyB0byBiZSBzcGVjaWZpZWQgd2l0aCBmdWxsIHBhdGguCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MSEVMUCBpcyBzZXQgdG8gWUVTLgorCitISENfTE9DQVRJT04gICAgICAgICAgID0gCisKKyMgVGhlIEdFTkVSQVRFX0NISSBmbGFnIGNvbnRyb2xzIGlmIGEgc2VwYXJhdGUgLmNoaSBpbmRleCBmaWxlIGlzIGdlbmVyYXRlZCAoCisjIFlFUykgb3IgdGhhdCBpdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIG1hc3RlciAuY2htIGZpbGUgKCBOTykuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUxIRUxQIGlzIHNldCB0byBZRVMuCisKK0dFTkVSQVRFX0NISSAgICAgICAgICAgPSBOTworCisjIFRoZSBDSE1fSU5ERVhfRU5DT0RJTkcgaXMgdXNlZCB0byBlbmNvZGUgSHRtbEhlbHAgaW5kZXggKCBoaGspLCBjb250ZW50ICggaGhjKQorIyBhbmQgcHJvamVjdCBmaWxlIGNvbnRlbnQuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MSEVMUCBpcyBzZXQgdG8gWUVTLgorCitDSE1fSU5ERVhfRU5DT0RJTkcgICAgID0gCisKKyMgVGhlIEJJTkFSWV9UT0MgZmxhZyBjb250cm9scyB3aGV0aGVyIGEgYmluYXJ5IHRhYmxlIG9mIGNvbnRlbnRzIGlzIGdlbmVyYXRlZCAoCisjIFlFUykgb3IgYSBub3JtYWwgdGFibGUgb2YgY29udGVudHMgKCBOTykgaW4gdGhlIC5jaG0gZmlsZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTEhFTFAgaXMgc2V0IHRvIFlFUy4KKworQklOQVJZX1RPQyAgICAgICAgICAgICA9IE5PCisKKyMgVGhlIFRPQ19FWFBBTkQgZmxhZyBjYW4gYmUgc2V0IHRvIFlFUyB0byBhZGQgZXh0cmEgaXRlbXMgZm9yIGdyb3VwIG1lbWJlcnMgdG8KKyMgdGhlIHRhYmxlIG9mIGNvbnRlbnRzIG9mIHRoZSBIVE1MIGhlbHAgZG9jdW1lbnRhdGlvbiBhbmQgdG8gdGhlIHRyZWUgdmlldy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTEhFTFAgaXMgc2V0IHRvIFlFUy4KKworVE9DX0VYUEFORCAgICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEdFTkVSQVRFX1FIUCB0YWcgaXMgc2V0IHRvIFlFUyBhbmQgYm90aCBRSFBfTkFNRVNQQUNFIGFuZAorIyBRSFBfVklSVFVBTF9GT0xERVIgYXJlIHNldCwgYW4gYWRkaXRpb25hbCBpbmRleCBmaWxlIHdpbGwgYmUgZ2VuZXJhdGVkIHRoYXQKKyMgY2FuIGJlIHVzZWQgYXMgaW5wdXQgZm9yIFF0J3MgcWhlbHBnZW5lcmF0b3IgdG8gZ2VuZXJhdGUgYSBRdCBDb21wcmVzc2VkIEhlbHAKKyMgKC5xY2gpIG9mIHRoZSBnZW5lcmF0ZWQgSFRNTCBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0dFTkVSQVRFX1FIUCAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBRSEdfTE9DQVRJT04gdGFnIGlzIHNwZWNpZmllZCwgdGhlIFFDSF9GSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5CisjIHRoZSBmaWxlIG5hbWUgb2YgdGhlIHJlc3VsdGluZyAucWNoIGZpbGUuIFRoZSBwYXRoIHNwZWNpZmllZCBpcyByZWxhdGl2ZSB0bworIyB0aGUgSFRNTCBvdXRwdXQgZm9sZGVyLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCisKK1FDSF9GSUxFICAgICAgICAgICAgICAgPSAKKworIyBUaGUgUUhQX05BTUVTUEFDRSB0YWcgc3BlY2lmaWVzIHRoZSBuYW1lc3BhY2UgdG8gdXNlIHdoZW4gZ2VuZXJhdGluZyBRdCBIZWxwCisjIFByb2plY3Qgb3V0cHV0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIFF0IEhlbHAgUHJvamVjdCAvIE5hbWVzcGFjZQorIyAoc2VlOiBodHRwOi8vcXQtcHJvamVjdC5vcmcvZG9jL3F0LTQuOC9xdGhlbHBwcm9qZWN0Lmh0bWwjbmFtZXNwYWNlKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IG9yZy5kb3h5Z2VuLlByb2plY3QuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KKworUUhQX05BTUVTUEFDRSAgICAgICAgICA9IG9yZy5kb3h5Z2VuLlByb2plY3QKKworIyBUaGUgUUhQX1ZJUlRVQUxfRk9MREVSIHRhZyBzcGVjaWZpZXMgdGhlIG5hbWVzcGFjZSB0byB1c2Ugd2hlbiBnZW5lcmF0aW5nIFF0CisjIEhlbHAgUHJvamVjdCBvdXRwdXQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUgUXQgSGVscCBQcm9qZWN0IC8gVmlydHVhbAorIyBGb2xkZXJzIChzZWU6IGh0dHA6Ly9xdC1wcm9qZWN0Lm9yZy9kb2MvcXQtNC44L3F0aGVscHByb2plY3QuaHRtbCN2aXJ0dWFsLQorIyBmb2xkZXJzKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IGRvYy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1FIUCBpcyBzZXQgdG8gWUVTLgorCitRSFBfVklSVFVBTF9GT0xERVIgICAgID0gZG9jCisKKyMgSWYgdGhlIFFIUF9DVVNUX0ZJTFRFUl9OQU1FIHRhZyBpcyBzZXQsIGl0IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIGN1c3RvbQorIyBmaWx0ZXIgdG8gYWRkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIFF0IEhlbHAgUHJvamVjdCAvIEN1c3RvbQorIyBGaWx0ZXJzIChzZWU6IGh0dHA6Ly9xdC1wcm9qZWN0Lm9yZy9kb2MvcXQtNC44L3F0aGVscHByb2plY3QuaHRtbCNjdXN0b20tCisjIGZpbHRlcnMpLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCisKK1FIUF9DVVNUX0ZJTFRFUl9OQU1FICAgPSAKKworIyBUaGUgUUhQX0NVU1RfRklMVEVSX0FUVFJTIHRhZyBzcGVjaWZpZXMgdGhlIGxpc3Qgb2YgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlCisjIGN1c3RvbSBmaWx0ZXIgdG8gYWRkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIFF0IEhlbHAgUHJvamVjdCAvIEN1c3RvbQorIyBGaWx0ZXJzIChzZWU6IGh0dHA6Ly9xdC1wcm9qZWN0Lm9yZy9kb2MvcXQtNC44L3F0aGVscHByb2plY3QuaHRtbCNjdXN0b20tCisjIGZpbHRlcnMpLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCisKK1FIUF9DVVNUX0ZJTFRFUl9BVFRSUyAgPSAKKworIyBUaGUgUUhQX1NFQ1RfRklMVEVSX0FUVFJTIHRhZyBzcGVjaWZpZXMgdGhlIGxpc3Qgb2YgdGhlIGF0dHJpYnV0ZXMgdGhpcworIyBwcm9qZWN0J3MgZmlsdGVyIHNlY3Rpb24gbWF0Y2hlcy4gUXQgSGVscCBQcm9qZWN0IC8gRmlsdGVyIEF0dHJpYnV0ZXMgKHNlZToKKyMgaHR0cDovL3F0LXByb2plY3Qub3JnL2RvYy9xdC00LjgvcXRoZWxwcHJvamVjdC5odG1sI2ZpbHRlci1hdHRyaWJ1dGVzKS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1FIUCBpcyBzZXQgdG8gWUVTLgorCitRSFBfU0VDVF9GSUxURVJfQVRUUlMgID0gCisKKyMgVGhlIFFIR19MT0NBVElPTiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gb2YgUXQncworIyBxaGVscGdlbmVyYXRvci4gSWYgbm9uLWVtcHR5IGRveHlnZW4gd2lsbCB0cnkgdG8gcnVuIHFoZWxwZ2VuZXJhdG9yIG9uIHRoZQorIyBnZW5lcmF0ZWQgLnFocCBmaWxlLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCisKK1FIR19MT0NBVElPTiAgICAgICAgICAgPSAKKworIyBJZiB0aGUgR0VORVJBVEVfRUNMSVBTRUhFTFAgdGFnIGlzIHNldCB0byBZRVMsIGFkZGl0aW9uYWwgaW5kZXggZmlsZXMgd2lsbCBiZQorIyBnZW5lcmF0ZWQsIHRvZ2V0aGVyIHdpdGggdGhlIEhUTUwgZmlsZXMsIHRoZXkgZm9ybSBhbiBFY2xpcHNlIGhlbHAgcGx1Z2luLiBUbworIyBpbnN0YWxsIHRoaXMgcGx1Z2luIGFuZCBtYWtlIGl0IGF2YWlsYWJsZSB1bmRlciB0aGUgaGVscCBjb250ZW50cyBtZW51IGluCisjIEVjbGlwc2UsIHRoZSBjb250ZW50cyBvZiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIEhUTUwgYW5kIFhNTCBmaWxlcyBuZWVkcworIyB0byBiZSBjb3BpZWQgaW50byB0aGUgcGx1Z2lucyBkaXJlY3Rvcnkgb2YgZWNsaXBzZS4gVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeQorIyB3aXRoaW4gdGhlIHBsdWdpbnMgZGlyZWN0b3J5IHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgRUNMSVBTRV9ET0NfSUQgdmFsdWUuCisjIEFmdGVyIGNvcHlpbmcgRWNsaXBzZSBuZWVkcyB0byBiZSByZXN0YXJ0ZWQgYmVmb3JlIHRoZSBoZWxwIGFwcGVhcnMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworR0VORVJBVEVfRUNMSVBTRUhFTFAgICA9IE5PCisKKyMgQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIEVjbGlwc2UgaGVscCBwbHVnaW4uIFdoZW4gaW5zdGFsbGluZyB0aGUgcGx1Z2luCisjIHRoZSBkaXJlY3RvcnkgbmFtZSBjb250YWluaW5nIHRoZSBIVE1MIGFuZCBYTUwgZmlsZXMgc2hvdWxkIGFsc28gaGF2ZSB0aGlzCisjIG5hbWUuIEVhY2ggZG9jdW1lbnRhdGlvbiBzZXQgc2hvdWxkIGhhdmUgaXRzIG93biBpZGVudGlmaWVyLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogb3JnLmRveHlnZW4uUHJvamVjdC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0VDTElQU0VIRUxQIGlzIHNldCB0byBZRVMuCisKK0VDTElQU0VfRE9DX0lEICAgICAgICAgPSBvcmcuZG94eWdlbi5Qcm9qZWN0CisKKyMgSWYgeW91IHdhbnQgZnVsbCBjb250cm9sIG92ZXIgdGhlIGxheW91dCBvZiB0aGUgZ2VuZXJhdGVkIEhUTUwgcGFnZXMgaXQgbWlnaHQKKyMgYmUgbmVjZXNzYXJ5IHRvIGRpc2FibGUgdGhlIGluZGV4IGFuZCByZXBsYWNlIGl0IHdpdGggeW91ciBvd24uIFRoZQorIyBESVNBQkxFX0lOREVYIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIG9uL29mZiB0aGUgY29uZGVuc2VkIGluZGV4ICh0YWJzKSBhdCB0b3AKKyMgb2YgZWFjaCBIVE1MIHBhZ2UuIEEgdmFsdWUgb2YgTk8gZW5hYmxlcyB0aGUgaW5kZXggYW5kIHRoZSB2YWx1ZSBZRVMgZGlzYWJsZXMKKyMgaXQuIFNpbmNlIHRoZSB0YWJzIGluIHRoZSBpbmRleCBjb250YWluIHRoZSBzYW1lIGluZm9ybWF0aW9uIGFzIHRoZSBuYXZpZ2F0aW9uCisjIHRyZWUsIHlvdSBjYW4gc2V0IHRoaXMgb3B0aW9uIHRvIFlFUyBpZiB5b3UgYWxzbyBzZXQgR0VORVJBVEVfVFJFRVZJRVcgdG8gWUVTLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0RJU0FCTEVfSU5ERVggICAgICAgICAgPSBOTworCisjIFRoZSBHRU5FUkFURV9UUkVFVklFVyB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXRoZXIgYSB0cmVlLWxpa2UgaW5kZXgKKyMgc3RydWN0dXJlIHNob3VsZCBiZSBnZW5lcmF0ZWQgdG8gZGlzcGxheSBoaWVyYXJjaGljYWwgaW5mb3JtYXRpb24uIElmIHRoZSB0YWcKKyMgdmFsdWUgaXMgc2V0IHRvIFlFUywgYSBzaWRlIHBhbmVsIHdpbGwgYmUgZ2VuZXJhdGVkIGNvbnRhaW5pbmcgYSB0cmVlLWxpa2UKKyMgaW5kZXggc3RydWN0dXJlIChqdXN0IGxpa2UgdGhlIG9uZSB0aGF0IGlzIGdlbmVyYXRlZCBmb3IgSFRNTCBIZWxwKS4gRm9yIHRoaXMKKyMgdG8gd29yayBhIGJyb3dzZXIgdGhhdCBzdXBwb3J0cyBKYXZhU2NyaXB0LCBESFRNTCwgQ1NTIGFuZCBmcmFtZXMgaXMgcmVxdWlyZWQKKyMgKGkuZS4gYW55IG1vZGVybiBicm93c2VyKS4gV2luZG93cyB1c2VycyBhcmUgcHJvYmFibHkgYmV0dGVyIG9mZiB1c2luZyB0aGUKKyMgSFRNTCBoZWxwIGZlYXR1cmUuIFZpYSBjdXN0b20gc3R5bGVzaGVldHMgKHNlZSBIVE1MX0VYVFJBX1NUWUxFU0hFRVQpIG9uZSBjYW4KKyMgZnVydGhlciBmaW5lLXR1bmUgdGhlIGxvb2sgb2YgdGhlIGluZGV4LiBBcyBhbiBleGFtcGxlLCB0aGUgZGVmYXVsdCBzdHlsZQorIyBzaGVldCBnZW5lcmF0ZWQgYnkgZG94eWdlbiBoYXMgYW4gZXhhbXBsZSB0aGF0IHNob3dzIGhvdyB0byBwdXQgYW4gaW1hZ2UgYXQKKyMgdGhlIHJvb3Qgb2YgdGhlIHRyZWUgaW5zdGVhZCBvZiB0aGUgUFJPSkVDVF9OQU1FLiBTaW5jZSB0aGUgdHJlZSBiYXNpY2FsbHkgaGFzCisjIHRoZSBzYW1lIGluZm9ybWF0aW9uIGFzIHRoZSB0YWIgaW5kZXgsIHlvdSBjb3VsZCBjb25zaWRlciBzZXR0aW5nCisjIERJU0FCTEVfSU5ERVggdG8gWUVTIHdoZW4gZW5hYmxpbmcgdGhpcyBvcHRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworR0VORVJBVEVfVFJFRVZJRVcgICAgICA9IE5PCisKKyMgVGhlIEVOVU1fVkFMVUVTX1BFUl9MSU5FIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG51bWJlciBvZiBlbnVtIHZhbHVlcyB0aGF0CisjIGRveHlnZW4gd2lsbCBncm91cCBvbiBvbmUgbGluZSBpbiB0aGUgZ2VuZXJhdGVkIEhUTUwgZG9jdW1lbnRhdGlvbi4KKyMKKyMgTm90ZSB0aGF0IGEgdmFsdWUgb2YgMCB3aWxsIGNvbXBsZXRlbHkgc3VwcHJlc3MgdGhlIGVudW0gdmFsdWVzIGZyb20gYXBwZWFyaW5nCisjIGluIHRoZSBvdmVydmlldyBzZWN0aW9uLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAyMCwgZGVmYXVsdCB2YWx1ZTogNC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworRU5VTV9WQUxVRVNfUEVSX0xJTkUgICA9IDQKKworIyBJZiB0aGUgdHJlZXZpZXcgaXMgZW5hYmxlZCAoc2VlIEdFTkVSQVRFX1RSRUVWSUVXKSB0aGVuIHRoaXMgdGFnIGNhbiBiZSB1c2VkCisjIHRvIHNldCB0aGUgaW5pdGlhbCB3aWR0aCAoaW4gcGl4ZWxzKSBvZiB0aGUgZnJhbWUgaW4gd2hpY2ggdGhlIHRyZWUgaXMgc2hvd24uCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDE1MDAsIGRlZmF1bHQgdmFsdWU6IDI1MC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworVFJFRVZJRVdfV0lEVEggICAgICAgICA9IDI1MAorCisjIFdoZW4gdGhlIEVYVF9MSU5LU19JTl9XSU5ET1cgb3B0aW9uIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIG9wZW4gbGlua3MgdG8KKyMgZXh0ZXJuYWwgc3ltYm9scyBpbXBvcnRlZCB2aWEgdGFnIGZpbGVzIGluIGEgc2VwYXJhdGUgd2luZG93LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0VYVF9MSU5LU19JTl9XSU5ET1cgICAgPSBOTworCisjIFVzZSB0aGlzIHRhZyB0byBjaGFuZ2UgdGhlIGZvbnQgc2l6ZSBvZiBMYVRlWCBmb3JtdWxhcyBpbmNsdWRlZCBhcyBpbWFnZXMgaW4KKyMgdGhlIEhUTUwgZG9jdW1lbnRhdGlvbi4gV2hlbiB5b3UgY2hhbmdlIHRoZSBmb250IHNpemUgYWZ0ZXIgYSBzdWNjZXNzZnVsCisjIGRveHlnZW4gcnVuIHlvdSBuZWVkIHRvIG1hbnVhbGx5IHJlbW92ZSBhbnkgZm9ybV8qLnBuZyBpbWFnZXMgZnJvbSB0aGUgSFRNTAorIyBvdXRwdXQgZGlyZWN0b3J5IHRvIGZvcmNlIHRoZW0gdG8gYmUgcmVnZW5lcmF0ZWQuCisjIE1pbmltdW0gdmFsdWU6IDgsIG1heGltdW0gdmFsdWU6IDUwLCBkZWZhdWx0IHZhbHVlOiAxMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworRk9STVVMQV9GT05UU0laRSAgICAgICA9IDEwCisKKyMgVXNlIHRoZSBGT1JNVUxBX1RSQU5QQVJFTlQgdGFnIHRvIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCB0aGUgaW1hZ2VzCisjIGdlbmVyYXRlZCBmb3IgZm9ybXVsYXMgYXJlIHRyYW5zcGFyZW50IFBOR3MuIFRyYW5zcGFyZW50IFBOR3MgYXJlIG5vdAorIyBzdXBwb3J0ZWQgcHJvcGVybHkgZm9yIElFIDYuMCwgYnV0IGFyZSBzdXBwb3J0ZWQgb24gYWxsIG1vZGVybiBicm93c2Vycy4KKyMKKyMgTm90ZSB0aGF0IHdoZW4gY2hhbmdpbmcgdGhpcyBvcHRpb24geW91IG5lZWQgdG8gZGVsZXRlIGFueSBmb3JtXyoucG5nIGZpbGVzIGluCisjIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkgYmVmb3JlIHRoZSBjaGFuZ2VzIGhhdmUgZWZmZWN0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitGT1JNVUxBX1RSQU5TUEFSRU5UICAgID0gWUVTCisKKyMgRW5hYmxlIHRoZSBVU0VfTUFUSEpBWCBvcHRpb24gdG8gcmVuZGVyIExhVGVYIGZvcm11bGFzIHVzaW5nIE1hdGhKYXggKHNlZQorIyBodHRwOi8vd3d3Lm1hdGhqYXgub3JnKSB3aGljaCB1c2VzIGNsaWVudCBzaWRlIEphdmFzY3JpcHQgZm9yIHRoZSByZW5kZXJpbmcKKyMgaW5zdGVhZCBvZiB1c2luZyBwcmVyZW5kZXJlZCBiaXRtYXBzLiBVc2UgdGhpcyBpZiB5b3UgZG8gbm90IGhhdmUgTGFUZVgKKyMgaW5zdGFsbGVkIG9yIGlmIHlvdSB3YW50IHRvIGZvcm11bGFzIGxvb2sgcHJldHRpZXIgaW4gdGhlIEhUTUwgb3V0cHV0LiBXaGVuCisjIGVuYWJsZWQgeW91IG1heSBhbHNvIG5lZWQgdG8gaW5zdGFsbCBNYXRoSmF4IHNlcGFyYXRlbHkgYW5kIGNvbmZpZ3VyZSB0aGUgcGF0aAorIyB0byBpdCB1c2luZyB0aGUgTUFUSEpBWF9SRUxQQVRIIG9wdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitVU0VfTUFUSEpBWCAgICAgICAgICAgID0gTk8KKworIyBXaGVuIE1hdGhKYXggaXMgZW5hYmxlZCB5b3UgY2FuIHNldCB0aGUgZGVmYXVsdCBvdXRwdXQgZm9ybWF0IHRvIGJlIHVzZWQgZm9yCisjIHRoZSBNYXRoSmF4IG91dHB1dC4gU2VlIHRoZSBNYXRoSmF4IHNpdGUgKHNlZToKKyMgaHR0cDovL2RvY3MubWF0aGpheC5vcmcvZW4vbGF0ZXN0L291dHB1dC5odG1sKSBmb3IgbW9yZSBkZXRhaWxzLgorIyBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBIVE1MLUNTUyAod2hpY2ggaXMgc2xvd2VyLCBidXQgaGFzIHRoZSBiZXN0CisjIGNvbXBhdGliaWxpdHkpLCBOYXRpdmVNTUwgKGkuZS4gTWF0aE1MKSBhbmQgU1ZHLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogSFRNTC1DU1MuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBVU0VfTUFUSEpBWCBpcyBzZXQgdG8gWUVTLgorCitNQVRISkFYX0ZPUk1BVCAgICAgICAgID0gSFRNTC1DU1MKKworIyBXaGVuIE1hdGhKYXggaXMgZW5hYmxlZCB5b3UgbmVlZCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiByZWxhdGl2ZSB0byB0aGUgSFRNTAorIyBvdXRwdXQgZGlyZWN0b3J5IHVzaW5nIHRoZSBNQVRISkFYX1JFTFBBVEggb3B0aW9uLiBUaGUgZGVzdGluYXRpb24gZGlyZWN0b3J5CisjIHNob3VsZCBjb250YWluIHRoZSBNYXRoSmF4LmpzIHNjcmlwdC4gRm9yIGluc3RhbmNlLCBpZiB0aGUgbWF0aGpheCBkaXJlY3RvcnkKKyMgaXMgbG9jYXRlZCBhdCB0aGUgc2FtZSBsZXZlbCBhcyB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5LCB0aGVuCisjIE1BVEhKQVhfUkVMUEFUSCBzaG91bGQgYmUgLi4vbWF0aGpheC4gVGhlIGRlZmF1bHQgdmFsdWUgcG9pbnRzIHRvIHRoZSBNYXRoSmF4CisjIENvbnRlbnQgRGVsaXZlcnkgTmV0d29yayBzbyB5b3UgY2FuIHF1aWNrbHkgc2VlIHRoZSByZXN1bHQgd2l0aG91dCBpbnN0YWxsaW5nCisjIE1hdGhKYXguIEhvd2V2ZXIsIGl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIGluc3RhbGwgYSBsb2NhbCBjb3B5IG9mCisjIE1hdGhKYXggZnJvbSBodHRwOi8vd3d3Lm1hdGhqYXgub3JnIGJlZm9yZSBkZXBsb3ltZW50LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogaHR0cDovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFVTRV9NQVRISkFYIGlzIHNldCB0byBZRVMuCisKK01BVEhKQVhfUkVMUEFUSCAgICAgICAgPSBodHRwOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0CisKKyMgVGhlIE1BVEhKQVhfRVhURU5TSU9OUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBNYXRoSmF4CisjIGV4dGVuc2lvbiBuYW1lcyB0aGF0IHNob3VsZCBiZSBlbmFibGVkIGR1cmluZyBNYXRoSmF4IHJlbmRlcmluZy4gRm9yIGV4YW1wbGUKKyMgTUFUSEpBWF9FWFRFTlNJT05TID0gVGVYL0FNU21hdGggVGVYL0FNU3N5bWJvbHMKKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFVTRV9NQVRISkFYIGlzIHNldCB0byBZRVMuCisKK01BVEhKQVhfRVhURU5TSU9OUyAgICAgPSAKKworIyBUaGUgTUFUSEpBWF9DT0RFRklMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGZpbGUgd2l0aCBqYXZhc2NyaXB0IHBpZWNlcworIyBvZiBjb2RlIHRoYXQgd2lsbCBiZSB1c2VkIG9uIHN0YXJ0dXAgb2YgdGhlIE1hdGhKYXggY29kZS4gU2VlIHRoZSBNYXRoSmF4IHNpdGUKKyMgKHNlZTogaHR0cDovL2RvY3MubWF0aGpheC5vcmcvZW4vbGF0ZXN0L291dHB1dC5odG1sKSBmb3IgbW9yZSBkZXRhaWxzLiBGb3IgYW4KKyMgZXhhbXBsZSBzZWUgdGhlIGRvY3VtZW50YXRpb24uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBVU0VfTUFUSEpBWCBpcyBzZXQgdG8gWUVTLgorCitNQVRISkFYX0NPREVGSUxFICAgICAgID0gCisKKyMgV2hlbiB0aGUgU0VBUkNIRU5HSU5FIHRhZyBpcyBlbmFibGVkIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIHNlYXJjaCBib3ggZm9yCisjIHRoZSBIVE1MIG91dHB1dC4gVGhlIHVuZGVybHlpbmcgc2VhcmNoIGVuZ2luZSB1c2VzIGphdmFzY3JpcHQgYW5kIERIVE1MIGFuZAorIyBzaG91bGQgd29yayBvbiBhbnkgbW9kZXJuIGJyb3dzZXIuIE5vdGUgdGhhdCB3aGVuIHVzaW5nIEhUTUwgaGVscAorIyAoR0VORVJBVEVfSFRNTEhFTFApLCBRdCBoZWxwIChHRU5FUkFURV9RSFApLCBvciBkb2NzZXRzIChHRU5FUkFURV9ET0NTRVQpCisjIHRoZXJlIGlzIGFscmVhZHkgYSBzZWFyY2ggZnVuY3Rpb24gc28gdGhpcyBvbmUgc2hvdWxkIHR5cGljYWxseSBiZSBkaXNhYmxlZC4KKyMgRm9yIGxhcmdlIHByb2plY3RzIHRoZSBqYXZhc2NyaXB0IGJhc2VkIHNlYXJjaCBlbmdpbmUgY2FuIGJlIHNsb3csIHRoZW4KKyMgZW5hYmxpbmcgU0VSVkVSX0JBU0VEX1NFQVJDSCBtYXkgcHJvdmlkZSBhIGJldHRlciBzb2x1dGlvbi4gSXQgaXMgcG9zc2libGUgdG8KKyMgc2VhcmNoIHVzaW5nIHRoZSBrZXlib2FyZDsgdG8ganVtcCB0byB0aGUgc2VhcmNoIGJveCB1c2UgPGFjY2VzcyBrZXk+ICsgUworIyAod2hhdCB0aGUgPGFjY2VzcyBrZXk+IGlzIGRlcGVuZHMgb24gdGhlIE9TIGFuZCBicm93c2VyLCBidXQgaXQgaXMgdHlwaWNhbGx5CisjIDxDVFJMPiwgPEFMVD4vPG9wdGlvbj4sIG9yIGJvdGgpLiBJbnNpZGUgdGhlIHNlYXJjaCBib3ggdXNlIHRoZSA8Y3Vyc29yIGRvd24KKyMga2V5PiB0byBqdW1wIGludG8gdGhlIHNlYXJjaCByZXN1bHRzIHdpbmRvdywgdGhlIHJlc3VsdHMgY2FuIGJlIG5hdmlnYXRlZAorIyB1c2luZyB0aGUgPGN1cnNvciBrZXlzPi4gUHJlc3MgPEVudGVyPiB0byBzZWxlY3QgYW4gaXRlbSBvciA8ZXNjYXBlPiB0byBjYW5jZWwKKyMgdGhlIHNlYXJjaC4gVGhlIGZpbHRlciBvcHRpb25zIGNhbiBiZSBzZWxlY3RlZCB3aGVuIHRoZSBjdXJzb3IgaXMgaW5zaWRlIHRoZQorIyBzZWFyY2ggYm94IGJ5IHByZXNzaW5nIDxTaGlmdD4rPGN1cnNvciBkb3duPi4gQWxzbyBoZXJlIHVzZSB0aGUgPGN1cnNvciBrZXlzPgorIyB0byBzZWxlY3QgYSBmaWx0ZXIgYW5kIDxFbnRlcj4gb3IgPGVzY2FwZT4gdG8gYWN0aXZhdGUgb3IgY2FuY2VsIHRoZSBmaWx0ZXIKKyMgb3B0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitTRUFSQ0hFTkdJTkUgICAgICAgICAgID0gWUVTCisKKyMgV2hlbiB0aGUgU0VSVkVSX0JBU0VEX1NFQVJDSCB0YWcgaXMgZW5hYmxlZCB0aGUgc2VhcmNoIGVuZ2luZSB3aWxsIGJlCisjIGltcGxlbWVudGVkIHVzaW5nIGEgd2ViIHNlcnZlciBpbnN0ZWFkIG9mIGEgd2ViIGNsaWVudCB1c2luZyBKYXZhc2NyaXB0LiBUaGVyZQorIyBhcmUgdHdvIGZsYXZvdXJzIG9mIHdlYiBzZXJ2ZXIgYmFzZWQgc2VhcmNoaW5nIGRlcGVuZGluZyBvbiB0aGUKKyMgRVhURVJOQUxfU0VBUkNIIHNldHRpbmcuIFdoZW4gZGlzYWJsZWQsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIFBIUCBzY3JpcHQgZm9yCisjIHNlYXJjaGluZyBhbmQgYW4gaW5kZXggZmlsZSB1c2VkIGJ5IHRoZSBzY3JpcHQuIFdoZW4gRVhURVJOQUxfU0VBUkNIIGlzCisjIGVuYWJsZWQgdGhlIGluZGV4aW5nIGFuZCBzZWFyY2hpbmcgbmVlZHMgdG8gYmUgcHJvdmlkZWQgYnkgZXh0ZXJuYWwgdG9vbHMuIFNlZQorIyB0aGUgc2VjdGlvbiAiRXh0ZXJuYWwgSW5kZXhpbmcgYW5kIFNlYXJjaGluZyIgZm9yIGRldGFpbHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSEVOR0lORSBpcyBzZXQgdG8gWUVTLgorCitTRVJWRVJfQkFTRURfU0VBUkNIICAgID0gTk8KKworIyBXaGVuIEVYVEVSTkFMX1NFQVJDSCB0YWcgaXMgZW5hYmxlZCBkb3h5Z2VuIHdpbGwgbm8gbG9uZ2VyIGdlbmVyYXRlIHRoZSBQSFAKKyMgc2NyaXB0IGZvciBzZWFyY2hpbmcuIEluc3RlYWQgdGhlIHNlYXJjaCByZXN1bHRzIGFyZSB3cml0dGVuIHRvIGFuIFhNTCBmaWxlCisjIHdoaWNoIG5lZWRzIHRvIGJlIHByb2Nlc3NlZCBieSBhbiBleHRlcm5hbCBpbmRleGVyLiBEb3h5Z2VuIHdpbGwgaW52b2tlIGFuCisjIGV4dGVybmFsIHNlYXJjaCBlbmdpbmUgcG9pbnRlZCB0byBieSB0aGUgU0VBUkNIRU5HSU5FX1VSTCBvcHRpb24gdG8gb2J0YWluIHRoZQorIyBzZWFyY2ggcmVzdWx0cy4KKyMKKyMgRG94eWdlbiBzaGlwcyB3aXRoIGFuIGV4YW1wbGUgaW5kZXhlciAoIGRveHlpbmRleGVyKSBhbmQgc2VhcmNoIGVuZ2luZQorIyAoZG94eXNlYXJjaC5jZ2kpIHdoaWNoIGFyZSBiYXNlZCBvbiB0aGUgb3BlbiBzb3VyY2Ugc2VhcmNoIGVuZ2luZSBsaWJyYXJ5CisjIFhhcGlhbiAoc2VlOiBodHRwOi8veGFwaWFuLm9yZy8pLgorIworIyBTZWUgdGhlIHNlY3Rpb24gIkV4dGVybmFsIEluZGV4aW5nIGFuZCBTZWFyY2hpbmciIGZvciBkZXRhaWxzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTRUFSQ0hFTkdJTkUgaXMgc2V0IHRvIFlFUy4KKworRVhURVJOQUxfU0VBUkNIICAgICAgICA9IE5PCisKKyMgVGhlIFNFQVJDSEVOR0lORV9VUkwgc2hvdWxkIHBvaW50IHRvIGEgc2VhcmNoIGVuZ2luZSBob3N0ZWQgYnkgYSB3ZWIgc2VydmVyCisjIHdoaWNoIHdpbGwgcmV0dXJuIHRoZSBzZWFyY2ggcmVzdWx0cyB3aGVuIEVYVEVSTkFMX1NFQVJDSCBpcyBlbmFibGVkLgorIworIyBEb3h5Z2VuIHNoaXBzIHdpdGggYW4gZXhhbXBsZSBpbmRleGVyICggZG94eWluZGV4ZXIpIGFuZCBzZWFyY2ggZW5naW5lCisjIChkb3h5c2VhcmNoLmNnaSkgd2hpY2ggYXJlIGJhc2VkIG9uIHRoZSBvcGVuIHNvdXJjZSBzZWFyY2ggZW5naW5lIGxpYnJhcnkKKyMgWGFwaWFuIChzZWU6IGh0dHA6Ly94YXBpYW4ub3JnLykuIFNlZSB0aGUgc2VjdGlvbiAiRXh0ZXJuYWwgSW5kZXhpbmcgYW5kCisjIFNlYXJjaGluZyIgZm9yIGRldGFpbHMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTRUFSQ0hFTkdJTkUgaXMgc2V0IHRvIFlFUy4KKworU0VBUkNIRU5HSU5FX1VSTCAgICAgICA9IAorCisjIFdoZW4gU0VSVkVSX0JBU0VEX1NFQVJDSCBhbmQgRVhURVJOQUxfU0VBUkNIIGFyZSBib3RoIGVuYWJsZWQgdGhlIHVuaW5kZXhlZAorIyBzZWFyY2ggZGF0YSBpcyB3cml0dGVuIHRvIGEgZmlsZSBmb3IgaW5kZXhpbmcgYnkgYW4gZXh0ZXJuYWwgdG9vbC4gV2l0aCB0aGUKKyMgU0VBUkNIREFUQV9GSUxFIHRhZyB0aGUgbmFtZSBvZiB0aGlzIGZpbGUgY2FuIGJlIHNwZWNpZmllZC4KKyMgVGhlIGRlZmF1bHQgZmlsZSBpczogc2VhcmNoZGF0YS54bWwuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTRUFSQ0hFTkdJTkUgaXMgc2V0IHRvIFlFUy4KKworU0VBUkNIREFUQV9GSUxFICAgICAgICA9IHNlYXJjaGRhdGEueG1sCisKKyMgV2hlbiBTRVJWRVJfQkFTRURfU0VBUkNIIGFuZCBFWFRFUk5BTF9TRUFSQ0ggYXJlIGJvdGggZW5hYmxlZCB0aGUKKyMgRVhURVJOQUxfU0VBUkNIX0lEIHRhZyBjYW4gYmUgdXNlZCBhcyBhbiBpZGVudGlmaWVyIGZvciB0aGUgcHJvamVjdC4gVGhpcyBpcworIyB1c2VmdWwgaW4gY29tYmluYXRpb24gd2l0aCBFWFRSQV9TRUFSQ0hfTUFQUElOR1MgdG8gc2VhcmNoIHRocm91Z2ggbXVsdGlwbGUKKyMgcHJvamVjdHMgYW5kIHJlZGlyZWN0IHRoZSByZXN1bHRzIGJhY2sgdG8gdGhlIHJpZ2h0IHByb2plY3QuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTRUFSQ0hFTkdJTkUgaXMgc2V0IHRvIFlFUy4KKworRVhURVJOQUxfU0VBUkNIX0lEICAgICA9IAorCisjIFRoZSBFWFRSQV9TRUFSQ0hfTUFQUElOR1MgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSBzZWFyY2hpbmcgdGhyb3VnaCBkb3h5Z2VuCisjIHByb2plY3RzIG90aGVyIHRoYW4gdGhlIG9uZSBkZWZpbmVkIGJ5IHRoaXMgY29uZmlndXJhdGlvbiBmaWxlLCBidXQgdGhhdCBhcmUKKyMgYWxsIGFkZGVkIHRvIHRoZSBzYW1lIGV4dGVybmFsIHNlYXJjaCBpbmRleC4gRWFjaCBwcm9qZWN0IG5lZWRzIHRvIGhhdmUgYQorIyB1bmlxdWUgaWQgc2V0IHZpYSBFWFRFUk5BTF9TRUFSQ0hfSUQuIFRoZSBzZWFyY2ggbWFwcGluZyB0aGVuIG1hcHMgdGhlIGlkIG9mCisjIHRvIGEgcmVsYXRpdmUgbG9jYXRpb24gd2hlcmUgdGhlIGRvY3VtZW50YXRpb24gY2FuIGJlIGZvdW5kLiBUaGUgZm9ybWF0IGlzOgorIyBFWFRSQV9TRUFSQ0hfTUFQUElOR1MgPSB0YWduYW1lMT1sb2MxIHRhZ25hbWUyPWxvYzIgLi4uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTRUFSQ0hFTkdJTkUgaXMgc2V0IHRvIFlFUy4KKworRVhUUkFfU0VBUkNIX01BUFBJTkdTICA9IAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBMYVRlWCBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfTEFURVggdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIExhVGVYIG91dHB1dC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworR0VORVJBVEVfTEFURVggICAgICAgICA9IFlFUworCisjIFRoZSBMQVRFWF9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgTGFUZVggZG9jcyB3aWxsIGJlIHB1dC4gSWYgYQorIyByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSBwdXQgaW4gZnJvbnQgb2YKKyMgaXQuCisjIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpczogbGF0ZXguCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9PVVRQVVQgICAgICAgICAgID0gbGF0ZXgKKworIyBUaGUgTEFURVhfQ01EX05BTUUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIExhVGVYIGNvbW1hbmQgbmFtZSB0byBiZQorIyBpbnZva2VkLgorIworIyBOb3RlIHRoYXQgd2hlbiBlbmFibGluZyBVU0VfUERGTEFURVggdGhpcyBvcHRpb24gaXMgb25seSB1c2VkIGZvciBnZW5lcmF0aW5nCisjIGJpdG1hcHMgZm9yIGZvcm11bGFzIGluIHRoZSBIVE1MIG91dHB1dCwgYnV0IG5vdCBpbiB0aGUgTWFrZWZpbGUgdGhhdCBpcworIyB3cml0dGVuIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LgorIyBUaGUgZGVmYXVsdCBmaWxlIGlzOiBsYXRleC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX0NNRF9OQU1FICAgICAgICAgPSBsYXRleAorCisjIFRoZSBNQUtFSU5ERVhfQ01EX05BTUUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGNvbW1hbmQgbmFtZSB0byBnZW5lcmF0ZQorIyBpbmRleCBmb3IgTGFUZVguCisjIFRoZSBkZWZhdWx0IGZpbGUgaXM6IG1ha2VpbmRleC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK01BS0VJTkRFWF9DTURfTkFNRSAgICAgPSBtYWtlaW5kZXgKKworIyBJZiB0aGUgQ09NUEFDVF9MQVRFWCB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIGdlbmVyYXRlcyBtb3JlIGNvbXBhY3QgTGFUZVgKKyMgZG9jdW1lbnRzLiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIHNtYWxsIHByb2plY3RzIGFuZCBtYXkgaGVscCB0byBzYXZlIHNvbWUKKyMgdHJlZXMgaW4gZ2VuZXJhbC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworQ09NUEFDVF9MQVRFWCAgICAgICAgICA9IE5PCisKKyMgVGhlIFBBUEVSX1RZUEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgcGFwZXIgdHlwZSB0aGF0IGlzIHVzZWQgYnkgdGhlCisjIHByaW50ZXIuCisjIFBvc3NpYmxlIHZhbHVlcyBhcmU6IGE0ICgyMTAgeCAyOTcgbW0pLCBsZXR0ZXIgKDguNSB4IDExIGluY2hlcyksIGxlZ2FsICg4LjUgeAorIyAxNCBpbmNoZXMpIGFuZCBleGVjdXRpdmUgKDcuMjUgeCAxMC41IGluY2hlcykuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBhNC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK1BBUEVSX1RZUEUgICAgICAgICAgICAgPSBhNAorCisjIFRoZSBFWFRSQV9QQUNLQUdFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBMYVRlWCBwYWNrYWdlIG5hbWVzCisjIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBMYVRlWCBvdXRwdXQuIFRvIGdldCB0aGUgdGltZXMgZm9udCBmb3IKKyMgaW5zdGFuY2UgeW91IGNhbiBzcGVjaWZ5CisjIEVYVFJBX1BBQ0tBR0VTPXRpbWVzCisjIElmIGxlZnQgYmxhbmsgbm8gZXh0cmEgcGFja2FnZXMgd2lsbCBiZSBpbmNsdWRlZC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0VYVFJBX1BBQ0tBR0VTICAgICAgICAgPSAKKworIyBUaGUgTEFURVhfSEVBREVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcGVyc29uYWwgTGFUZVggaGVhZGVyIGZvciB0aGUKKyMgZ2VuZXJhdGVkIExhVGVYIGRvY3VtZW50LiBUaGUgaGVhZGVyIHNob3VsZCBjb250YWluIGV2ZXJ5dGhpbmcgdW50aWwgdGhlIGZpcnN0CisjIGNoYXB0ZXIuIElmIGl0IGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgc3RhbmRhcmQgaGVhZGVyLiBTZWUKKyMgc2VjdGlvbiAiRG94eWdlbiB1c2FnZSIgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBsZXQgZG94eWdlbiB3cml0ZSB0aGUKKyMgZGVmYXVsdCBoZWFkZXIgdG8gYSBzZXBhcmF0ZSBmaWxlLgorIworIyBOb3RlOiBPbmx5IHVzZSBhIHVzZXItZGVmaW5lZCBoZWFkZXIgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nISBUaGUKKyMgZm9sbG93aW5nIGNvbW1hbmRzIGhhdmUgYSBzcGVjaWFsIG1lYW5pbmcgaW5zaWRlIHRoZSBoZWFkZXI6ICR0aXRsZSwKKyMgJGRhdGV0aW1lLCAkZGF0ZSwgJGRveHlnZW52ZXJzaW9uLCAkcHJvamVjdG5hbWUsICRwcm9qZWN0bnVtYmVyLiBEb3h5Z2VuIHdpbGwKKyMgcmVwbGFjZSB0aGVtIGJ5IHJlc3BlY3RpdmVseSB0aGUgdGl0bGUgb2YgdGhlIHBhZ2UsIHRoZSBjdXJyZW50IGRhdGUgYW5kIHRpbWUsCisjIG9ubHkgdGhlIGN1cnJlbnQgZGF0ZSwgdGhlIHZlcnNpb24gbnVtYmVyIG9mIGRveHlnZW4sIHRoZSBwcm9qZWN0IG5hbWUgKHNlZQorIyBQUk9KRUNUX05BTUUpLCBvciB0aGUgcHJvamVjdCBudW1iZXIgKHNlZSBQUk9KRUNUX05VTUJFUikuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9IRUFERVIgICAgICAgICAgID0gZG9jL2RveHlnZW4vaGVhZGVyLnRleAorCisjIFRoZSBMQVRFWF9GT09URVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwZXJzb25hbCBMYVRlWCBmb290ZXIgZm9yIHRoZQorIyBnZW5lcmF0ZWQgTGFUZVggZG9jdW1lbnQuIFRoZSBmb290ZXIgc2hvdWxkIGNvbnRhaW4gZXZlcnl0aGluZyBhZnRlciB0aGUgbGFzdAorIyBjaGFwdGVyLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIHN0YW5kYXJkIGZvb3Rlci4KKyMKKyMgTm90ZTogT25seSB1c2UgYSB1c2VyLWRlZmluZWQgZm9vdGVyIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyEKKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX0ZPT1RFUiAgICAgICAgICAgPSAKKworIyBUaGUgTEFURVhfRVhUUkFfRklMRVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZXh0cmEgaW1hZ2VzIG9yCisjIG90aGVyIHNvdXJjZSBmaWxlcyB3aGljaCBzaG91bGQgYmUgY29waWVkIHRvIHRoZSBMQVRFWF9PVVRQVVQgb3V0cHV0CisjIGRpcmVjdG9yeS4gTm90ZSB0aGF0IHRoZSBmaWxlcyB3aWxsIGJlIGNvcGllZCBhcy1pczsgdGhlcmUgYXJlIG5vIGNvbW1hbmRzIG9yCisjIG1hcmtlcnMgYXZhaWxhYmxlLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfRVhUUkFfRklMRVMgICAgICA9IAorCisjIElmIHRoZSBQREZfSFlQRVJMSU5LUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIExhVGVYIHRoYXQgaXMgZ2VuZXJhdGVkIGlzCisjIHByZXBhcmVkIGZvciBjb252ZXJzaW9uIHRvIFBERiAodXNpbmcgcHMycGRmIG9yIHBkZmxhdGV4KS4gVGhlIFBERiBmaWxlIHdpbGwKKyMgY29udGFpbiBsaW5rcyAoanVzdCBsaWtlIHRoZSBIVE1MIG91dHB1dCkgaW5zdGVhZCBvZiBwYWdlIHJlZmVyZW5jZXMuIFRoaXMKKyMgbWFrZXMgdGhlIG91dHB1dCBzdWl0YWJsZSBmb3Igb25saW5lIGJyb3dzaW5nIHVzaW5nIGEgUERGIHZpZXdlci4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK1BERl9IWVBFUkxJTktTICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgTEFURVhfUERGTEFURVggdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCB1c2UgcGRmbGF0ZXggdG8gZ2VuZXJhdGUKKyMgdGhlIFBERiBmaWxlIGRpcmVjdGx5IGZyb20gdGhlIExhVGVYIGZpbGVzLiBTZXQgdGhpcyBvcHRpb24gdG8gWUVTIHRvIGdldCBhCisjIGhpZ2hlciBxdWFsaXR5IFBERiBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworVVNFX1BERkxBVEVYICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBMQVRFWF9CQVRDSE1PREUgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBhZGQgdGhlIFxiYXRjaG1vZGUKKyMgY29tbWFuZCB0byB0aGUgZ2VuZXJhdGVkIExhVGVYIGZpbGVzLiBUaGlzIHdpbGwgaW5zdHJ1Y3QgTGFUZVggdG8ga2VlcCBydW5uaW5nCisjIGlmIGVycm9ycyBvY2N1ciwgaW5zdGVhZCBvZiBhc2tpbmcgdGhlIHVzZXIgZm9yIGhlbHAuIFRoaXMgb3B0aW9uIGlzIGFsc28gdXNlZAorIyB3aGVuIGdlbmVyYXRpbmcgZm9ybXVsYXMgaW4gSFRNTC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfQkFUQ0hNT0RFICAgICAgICA9IE5PCisKKyMgSWYgdGhlIExBVEVYX0hJREVfSU5ESUNFUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBub3QgaW5jbHVkZSB0aGUKKyMgaW5kZXggY2hhcHRlcnMgKHN1Y2ggYXMgRmlsZSBJbmRleCwgQ29tcG91bmQgSW5kZXgsIGV0Yy4pIGluIHRoZSBvdXRwdXQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX0hJREVfSU5ESUNFUyAgICAgPSBOTworCisjIElmIHRoZSBMQVRFWF9TT1VSQ0VfQ09ERSB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBpbmNsdWRlIHNvdXJjZQorIyBjb2RlIHdpdGggc3ludGF4IGhpZ2hsaWdodGluZyBpbiB0aGUgTGFUZVggb3V0cHV0LgorIworIyBOb3RlIHRoYXQgd2hpY2ggc291cmNlcyBhcmUgc2hvd24gYWxzbyBkZXBlbmRzIG9uIG90aGVyIHNldHRpbmdzIHN1Y2ggYXMKKyMgU09VUkNFX0JST1dTRVIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX1NPVVJDRV9DT0RFICAgICAgPSBOTworCisjIFRoZSBMQVRFWF9CSUJfU1RZTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHN0eWxlIHRvIHVzZSBmb3IgdGhlCisjIGJpYmxpb2dyYXBoeSwgZS5nLiBwbGFpbm5hdCwgb3IgaWVlZXRyLiBTZWUKKyMgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CaWJUZVggYW5kIFxjaXRlIGZvciBtb3JlIGluZm8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBwbGFpbi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX0JJQl9TVFlMRSAgICAgICAgPSBwbGFpbgorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBSVEYgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX1JURiB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgUlRGIG91dHB1dC4gVGhlCisjIFJURiBvdXRwdXQgaXMgb3B0aW1pemVkIGZvciBXb3JkIDk3IGFuZCBtYXkgbm90IGxvb2sgdG9vIHByZXR0eSB3aXRoIG90aGVyIFJURgorIyByZWFkZXJzL2VkaXRvcnMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworR0VORVJBVEVfUlRGICAgICAgICAgICA9IE5PCisKKyMgVGhlIFJURl9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgUlRGIGRvY3Mgd2lsbCBiZSBwdXQuIElmIGEKKyMgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgcHV0IGluIGZyb250IG9mCisjIGl0LgorIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IHJ0Zi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgorCitSVEZfT1VUUFVUICAgICAgICAgICAgID0gcnRmCisKKyMgSWYgdGhlIENPTVBBQ1RfUlRGIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gZ2VuZXJhdGVzIG1vcmUgY29tcGFjdCBSVEYKKyMgZG9jdW1lbnRzLiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIHNtYWxsIHByb2plY3RzIGFuZCBtYXkgaGVscCB0byBzYXZlIHNvbWUKKyMgdHJlZXMgaW4gZ2VuZXJhbC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUlRGIGlzIHNldCB0byBZRVMuCisKK0NPTVBBQ1RfUlRGICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBSVEZfSFlQRVJMSU5LUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIFJURiB0aGF0IGlzIGdlbmVyYXRlZCB3aWxsCisjIGNvbnRhaW4gaHlwZXJsaW5rIGZpZWxkcy4gVGhlIFJURiBmaWxlIHdpbGwgY29udGFpbiBsaW5rcyAoanVzdCBsaWtlIHRoZSBIVE1MCisjIG91dHB1dCkgaW5zdGVhZCBvZiBwYWdlIHJlZmVyZW5jZXMuIFRoaXMgbWFrZXMgdGhlIG91dHB1dCBzdWl0YWJsZSBmb3Igb25saW5lCisjIGJyb3dzaW5nIHVzaW5nIFdvcmQgb3Igc29tZSBvdGhlciBXb3JkIGNvbXBhdGlibGUgcmVhZGVycyB0aGF0IHN1cHBvcnQgdGhvc2UKKyMgZmllbGRzLgorIworIyBOb3RlOiBXb3JkUGFkICh3cml0ZSkgYW5kIG90aGVycyBkbyBub3Qgc3VwcG9ydCBsaW5rcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUlRGIGlzIHNldCB0byBZRVMuCisKK1JURl9IWVBFUkxJTktTICAgICAgICAgPSBOTworCisjIExvYWQgc3R5bGVzaGVldCBkZWZpbml0aW9ucyBmcm9tIGZpbGUuIFN5bnRheCBpcyBzaW1pbGFyIHRvIGRveHlnZW4ncyBjb25maWcKKyMgZmlsZSwgaS5lLiBhIHNlcmllcyBvZiBhc3NpZ25tZW50cy4gWW91IG9ubHkgaGF2ZSB0byBwcm92aWRlIHJlcGxhY2VtZW50cywKKyMgbWlzc2luZyBkZWZpbml0aW9ucyBhcmUgc2V0IHRvIHRoZWlyIGRlZmF1bHQgdmFsdWUuCisjCisjIFNlZSBhbHNvIHNlY3Rpb24gIkRveHlnZW4gdXNhZ2UiIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZ2VuZXJhdGUgdGhlCisjIGRlZmF1bHQgc3R5bGUgc2hlZXQgdGhhdCBkb3h5Z2VuIG5vcm1hbGx5IHVzZXMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9SVEYgaXMgc2V0IHRvIFlFUy4KKworUlRGX1NUWUxFU0hFRVRfRklMRSAgICA9IAorCisjIFNldCBvcHRpb25hbCB2YXJpYWJsZXMgdXNlZCBpbiB0aGUgZ2VuZXJhdGlvbiBvZiBhbiBSVEYgZG9jdW1lbnQuIFN5bnRheCBpcworIyBzaW1pbGFyIHRvIGRveHlnZW4ncyBjb25maWcgZmlsZS4gQSB0ZW1wbGF0ZSBleHRlbnNpb25zIGZpbGUgY2FuIGJlIGdlbmVyYXRlZAorIyB1c2luZyBkb3h5Z2VuIC1lIHJ0ZiBleHRlbnNpb25GaWxlLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUlRGIGlzIHNldCB0byBZRVMuCisKK1JURl9FWFRFTlNJT05TX0ZJTEUgICAgPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgbWFuIHBhZ2Ugb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX01BTiB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgbWFuIHBhZ2VzIGZvcgorIyBjbGFzc2VzIGFuZCBmaWxlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitHRU5FUkFURV9NQU4gICAgICAgICAgID0gTk8KKworIyBUaGUgTUFOX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBtYW4gcGFnZXMgd2lsbCBiZSBwdXQuIElmIGEKKyMgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgcHV0IGluIGZyb250IG9mCisjIGl0LiBBIGRpcmVjdG9yeSBtYW4zIHdpbGwgYmUgY3JlYXRlZCBpbnNpZGUgdGhlIGRpcmVjdG9yeSBzcGVjaWZpZWQgYnkKKyMgTUFOX09VVFBVVC4KKyMgVGhlIGRlZmF1bHQgZGlyZWN0b3J5IGlzOiBtYW4uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9NQU4gaXMgc2V0IHRvIFlFUy4KKworTUFOX09VVFBVVCAgICAgICAgICAgICA9IG1hbgorCisjIFRoZSBNQU5fRVhURU5TSU9OIHRhZyBkZXRlcm1pbmVzIHRoZSBleHRlbnNpb24gdGhhdCBpcyBhZGRlZCB0byB0aGUgZ2VuZXJhdGVkCisjIG1hbiBwYWdlcy4gSW4gY2FzZSB0aGUgbWFudWFsIHNlY3Rpb24gZG9lcyBub3Qgc3RhcnQgd2l0aCBhIG51bWJlciwgdGhlIG51bWJlcgorIyAzIGlzIHByZXBlbmRlZC4gVGhlIGRvdCAoLikgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgTUFOX0VYVEVOU0lPTiB0YWcgaXMKKyMgb3B0aW9uYWwuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiAuMy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX01BTiBpcyBzZXQgdG8gWUVTLgorCitNQU5fRVhURU5TSU9OICAgICAgICAgID0gLjMKKworIyBJZiB0aGUgTUFOX0xJTktTIHRhZyBpcyBzZXQgdG8gWUVTIGFuZCBkb3h5Z2VuIGdlbmVyYXRlcyBtYW4gb3V0cHV0LCB0aGVuIGl0CisjIHdpbGwgZ2VuZXJhdGUgb25lIGFkZGl0aW9uYWwgbWFuIGZpbGUgZm9yIGVhY2ggZW50aXR5IGRvY3VtZW50ZWQgaW4gdGhlIHJlYWwKKyMgbWFuIHBhZ2UocykuIFRoZXNlIGFkZGl0aW9uYWwgZmlsZXMgb25seSBzb3VyY2UgdGhlIHJlYWwgbWFuIHBhZ2UsIGJ1dCB3aXRob3V0CisjIHRoZW0gdGhlIG1hbiBjb21tYW5kIHdvdWxkIGJlIHVuYWJsZSB0byBmaW5kIHRoZSBjb3JyZWN0IHBhZ2UuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX01BTiBpcyBzZXQgdG8gWUVTLgorCitNQU5fTElOS1MgICAgICAgICAgICAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgWE1MIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9YTUwgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGFuIFhNTCBmaWxlIHRoYXQKKyMgY2FwdHVyZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgY29kZSBpbmNsdWRpbmcgYWxsIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworR0VORVJBVEVfWE1MICAgICAgICAgICA9IE5PCisKKyMgVGhlIFhNTF9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgWE1MIHBhZ2VzIHdpbGwgYmUgcHV0LiBJZiBhCisjIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlIHB1dCBpbiBmcm9udCBvZgorIyBpdC4KKyMgVGhlIGRlZmF1bHQgZGlyZWN0b3J5IGlzOiB4bWwuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9YTUwgaXMgc2V0IHRvIFlFUy4KKworWE1MX09VVFBVVCAgICAgICAgICAgICA9IHhtbAorCisjIFRoZSBYTUxfU0NIRU1BIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgWE1MIHNjaGVtYSwgd2hpY2ggY2FuIGJlIHVzZWQgYnkgYQorIyB2YWxpZGF0aW5nIFhNTCBwYXJzZXIgdG8gY2hlY2sgdGhlIHN5bnRheCBvZiB0aGUgWE1MIGZpbGVzLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfWE1MIGlzIHNldCB0byBZRVMuCisKK1hNTF9TQ0hFTUEgICAgICAgICAgICAgPSAKKworIyBUaGUgWE1MX0RURCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIFhNTCBEVEQsIHdoaWNoIGNhbiBiZSB1c2VkIGJ5IGEKKyMgdmFsaWRhdGluZyBYTUwgcGFyc2VyIHRvIGNoZWNrIHRoZSBzeW50YXggb2YgdGhlIFhNTCBmaWxlcy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1hNTCBpcyBzZXQgdG8gWUVTLgorCitYTUxfRFREICAgICAgICAgICAgICAgID0gCisKKyMgSWYgdGhlIFhNTF9QUk9HUkFNTElTVElORyB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZHVtcCB0aGUgcHJvZ3JhbQorIyBsaXN0aW5ncyAoaW5jbHVkaW5nIHN5bnRheCBoaWdobGlnaHRpbmcgYW5kIGNyb3NzLXJlZmVyZW5jaW5nIGluZm9ybWF0aW9uKSB0bworIyB0aGUgWE1MIG91dHB1dC4gTm90ZSB0aGF0IGVuYWJsaW5nIHRoaXMgd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlIHRoZSBzaXplCisjIG9mIHRoZSBYTUwgb3V0cHV0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfWE1MIGlzIHNldCB0byBZRVMuCisKK1hNTF9QUk9HUkFNTElTVElORyAgICAgPSBZRVMKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgRE9DQk9PSyBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfRE9DQk9PSyB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgRG9jYm9vayBmaWxlcworIyB0aGF0IGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIFBERi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitHRU5FUkFURV9ET0NCT09LICAgICAgID0gTk8KKworIyBUaGUgRE9DQk9PS19PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgRG9jYm9vayBwYWdlcyB3aWxsIGJlIHB1dC4KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSBwdXQgaW4KKyMgZnJvbnQgb2YgaXQuCisjIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpczogZG9jYm9vay4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0RPQ0JPT0sgaXMgc2V0IHRvIFlFUy4KKworRE9DQk9PS19PVVRQVVQgICAgICAgICA9IGRvY2Jvb2sKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBBdXRvR2VuIERlZmluaXRpb25zIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9BVVRPR0VOX0RFRiB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYW4gQXV0b0dlbgorIyBEZWZpbml0aW9ucyAoc2VlIGh0dHA6Ly9hdXRvZ2VuLnNmLm5ldCkgZmlsZSB0aGF0IGNhcHR1cmVzIHRoZSBzdHJ1Y3R1cmUgb2YKKyMgdGhlIGNvZGUgaW5jbHVkaW5nIGFsbCBkb2N1bWVudGF0aW9uLiBOb3RlIHRoYXQgdGhpcyBmZWF0dXJlIGlzIHN0aWxsCisjIGV4cGVyaW1lbnRhbCBhbmQgaW5jb21wbGV0ZSBhdCB0aGUgbW9tZW50LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0dFTkVSQVRFX0FVVE9HRU5fREVGICAgPSBOTworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfUEVSTE1PRCB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBQZXJsIG1vZHVsZQorIyBmaWxlIHRoYXQgY2FwdHVyZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgY29kZSBpbmNsdWRpbmcgYWxsIGRvY3VtZW50YXRpb24uCisjCisjIE5vdGUgdGhhdCB0aGlzIGZlYXR1cmUgaXMgc3RpbGwgZXhwZXJpbWVudGFsIGFuZCBpbmNvbXBsZXRlIGF0IHRoZSBtb21lbnQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworR0VORVJBVEVfUEVSTE1PRCAgICAgICA9IE5PCisKKyMgSWYgdGhlIFBFUkxNT0RfTEFURVggdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIHRoZSBuZWNlc3NhcnkKKyMgTWFrZWZpbGUgcnVsZXMsIFBlcmwgc2NyaXB0cyBhbmQgTGFUZVggY29kZSB0byBiZSBhYmxlIHRvIGdlbmVyYXRlIFBERiBhbmQgRFZJCisjIG91dHB1dCBmcm9tIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1BFUkxNT0QgaXMgc2V0IHRvIFlFUy4KKworUEVSTE1PRF9MQVRFWCAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFBFUkxNT0RfUFJFVFRZIHRhZyBpcyBzZXQgdG8gWUVTIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQgd2lsbCBiZSBuaWNlbHkKKyMgZm9ybWF0dGVkIHNvIGl0IGNhbiBiZSBwYXJzZWQgYnkgYSBodW1hbiByZWFkZXIuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvCisjIHVuZGVyc3RhbmQgd2hhdCBpcyBnb2luZyBvbi4gT24gdGhlIG90aGVyIGhhbmQsIGlmIHRoaXMgdGFnIGlzIHNldCB0byBOTyB0aGUKKyMgc2l6ZSBvZiB0aGUgUGVybCBtb2R1bGUgb3V0cHV0IHdpbGwgYmUgbXVjaCBzbWFsbGVyIGFuZCBQZXJsIHdpbGwgcGFyc2UgaXQKKyMganVzdCB0aGUgc2FtZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1BFUkxNT0QgaXMgc2V0IHRvIFlFUy4KKworUEVSTE1PRF9QUkVUVFkgICAgICAgICA9IFlFUworCisjIFRoZSBuYW1lcyBvZiB0aGUgbWFrZSB2YXJpYWJsZXMgaW4gdGhlIGdlbmVyYXRlZCBkb3h5cnVsZXMubWFrZSBmaWxlIGFyZQorIyBwcmVmaXhlZCB3aXRoIHRoZSBzdHJpbmcgY29udGFpbmVkIGluIFBFUkxNT0RfTUFLRVZBUl9QUkVGSVguIFRoaXMgaXMgdXNlZnVsCisjIHNvIGRpZmZlcmVudCBkb3h5cnVsZXMubWFrZSBmaWxlcyBpbmNsdWRlZCBieSB0aGUgc2FtZSBNYWtlZmlsZSBkb24ndAorIyBvdmVyd3JpdGUgZWFjaCBvdGhlcidzIHZhcmlhYmxlcy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1BFUkxNT0QgaXMgc2V0IHRvIFlFUy4KKworUEVSTE1PRF9NQUtFVkFSX1BSRUZJWCA9IAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBwcmVwcm9jZXNzb3IKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgRU5BQkxFX1BSRVBST0NFU1NJTkcgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGV2YWx1YXRlIGFsbAorIyBDLXByZXByb2Nlc3NvciBkaXJlY3RpdmVzIGZvdW5kIGluIHRoZSBzb3VyY2VzIGFuZCBpbmNsdWRlIGZpbGVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitFTkFCTEVfUFJFUFJPQ0VTU0lORyAgID0gWUVTCisKKyMgSWYgdGhlIE1BQ1JPX0VYUEFOU0lPTiB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZXhwYW5kIGFsbCBtYWNybyBuYW1lcworIyBpbiB0aGUgc291cmNlIGNvZGUuIElmIHNldCB0byBOTyBvbmx5IGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHdpbGwgYmUKKyMgcGVyZm9ybWVkLiBNYWNybyBleHBhbnNpb24gY2FuIGJlIGRvbmUgaW4gYSBjb250cm9sbGVkIHdheSBieSBzZXR0aW5nCisjIEVYUEFORF9PTkxZX1BSRURFRiB0byBZRVMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEVOQUJMRV9QUkVQUk9DRVNTSU5HIGlzIHNldCB0byBZRVMuCisKK01BQ1JPX0VYUEFOU0lPTiAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRVhQQU5EX09OTFlfUFJFREVGIGFuZCBNQUNST19FWFBBTlNJT04gdGFncyBhcmUgYm90aCBzZXQgdG8gWUVTIHRoZW4KKyMgdGhlIG1hY3JvIGV4cGFuc2lvbiBpcyBsaW1pdGVkIHRvIHRoZSBtYWNyb3Mgc3BlY2lmaWVkIHdpdGggdGhlIFBSRURFRklORUQgYW5kCisjIEVYUEFORF9BU19ERUZJTkVEIHRhZ3MuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEVOQUJMRV9QUkVQUk9DRVNTSU5HIGlzIHNldCB0byBZRVMuCisKK0VYUEFORF9PTkxZX1BSRURFRiAgICAgPSBZRVMKKworIyBJZiB0aGUgU0VBUkNIX0lOQ0xVREVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZSBpbmNsdWRlcyBmaWxlcyBpbiB0aGUKKyMgSU5DTFVERV9QQVRIIHdpbGwgYmUgc2VhcmNoZWQgaWYgYSAjaW5jbHVkZSBpcyBmb3VuZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEVOQUJMRV9QUkVQUk9DRVNTSU5HIGlzIHNldCB0byBZRVMuCisKK1NFQVJDSF9JTkNMVURFUyAgICAgICAgPSBZRVMKKworIyBUaGUgSU5DTFVERV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQKKyMgY29udGFpbiBpbmNsdWRlIGZpbGVzIHRoYXQgYXJlIG5vdCBpbnB1dCBmaWxlcyBidXQgc2hvdWxkIGJlIHByb2Nlc3NlZCBieSB0aGUKKyMgcHJlcHJvY2Vzc29yLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIX0lOQ0xVREVTIGlzIHNldCB0byBZRVMuCisKK0lOQ0xVREVfUEFUSCAgICAgICAgICAgPSAKKworIyBZb3UgY2FuIHVzZSB0aGUgSU5DTFVERV9GSUxFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkCisjIHBhdHRlcm5zIChsaWtlICouaCBhbmQgKi5ocHApIHRvIGZpbHRlciBvdXQgdGhlIGhlYWRlci1maWxlcyBpbiB0aGUKKyMgZGlyZWN0b3JpZXMuIElmIGxlZnQgYmxhbmssIHRoZSBwYXR0ZXJucyBzcGVjaWZpZWQgd2l0aCBGSUxFX1BBVFRFUk5TIHdpbGwgYmUKKyMgdXNlZC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEVOQUJMRV9QUkVQUk9DRVNTSU5HIGlzIHNldCB0byBZRVMuCisKK0lOQ0xVREVfRklMRV9QQVRURVJOUyAgPSAKKworIyBUaGUgUFJFREVGSU5FRCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBtYWNybyBuYW1lcyB0aGF0IGFyZQorIyBkZWZpbmVkIGJlZm9yZSB0aGUgcHJlcHJvY2Vzc29yIGlzIHN0YXJ0ZWQgKHNpbWlsYXIgdG8gdGhlIC1EIG9wdGlvbiBvZiBlLmcuCisjIGdjYykuIFRoZSBhcmd1bWVudCBvZiB0aGUgdGFnIGlzIGEgbGlzdCBvZiBtYWNyb3Mgb2YgdGhlIGZvcm06IG5hbWUgb3IKKyMgbmFtZT1kZWZpbml0aW9uIChubyBzcGFjZXMpLiBJZiB0aGUgZGVmaW5pdGlvbiBhbmQgdGhlICI9IiBhcmUgb21pdHRlZCwgIj0xIgorIyBpcyBhc3N1bWVkLiBUbyBwcmV2ZW50IGEgbWFjcm8gZGVmaW5pdGlvbiBmcm9tIGJlaW5nIHVuZGVmaW5lZCB2aWEgI3VuZGVmIG9yCisjIHJlY3Vyc2l2ZWx5IGV4cGFuZGVkIHVzZSB0aGUgOj0gb3BlcmF0b3IgaW5zdGVhZCBvZiB0aGUgPSBvcGVyYXRvci4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEVOQUJMRV9QUkVQUk9DRVNTSU5HIGlzIHNldCB0byBZRVMuCisKK1BSRURFRklORUQgICAgICAgICAgICAgPSBDT0lfTElCUkFSWV9WRVJTSU9OPTIgLURNWU9fU1VQUE9SVCAtRE9GRkxPQURfREVCVUc9MSAtRFNFUF9TVVBQT1JUIC1EVElNSU5HX1NVUFBPUlQKKworIyBJZiB0aGUgTUFDUk9fRVhQQU5TSU9OIGFuZCBFWFBBTkRfT05MWV9QUkVERUYgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIHRoaXMKKyMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBsaXN0IG9mIG1hY3JvIG5hbWVzIHRoYXQgc2hvdWxkIGJlIGV4cGFuZGVkLiBUaGUKKyMgbWFjcm8gZGVmaW5pdGlvbiB0aGF0IGlzIGZvdW5kIGluIHRoZSBzb3VyY2VzIHdpbGwgYmUgdXNlZC4gVXNlIHRoZSBQUkVERUZJTkVECisjIHRhZyBpZiB5b3Ugd2FudCB0byB1c2UgYSBkaWZmZXJlbnQgbWFjcm8gZGVmaW5pdGlvbiB0aGF0IG92ZXJydWxlcyB0aGUKKyMgZGVmaW5pdGlvbiBmb3VuZCBpbiB0aGUgc291cmNlIGNvZGUuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitFWFBBTkRfQVNfREVGSU5FRCAgICAgID0gCisKKyMgSWYgdGhlIFNLSVBfRlVOQ1RJT05fTUFDUk9TIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbidzIHByZXByb2Nlc3NvciB3aWxsCisjIHJlbW92ZSBhbGwgcmVmZXJlbmNlcyB0byBmdW5jdGlvbi1saWtlIG1hY3JvcyB0aGF0IGFyZSBhbG9uZSBvbiBhIGxpbmUsIGhhdmUgYW4KKyMgYWxsIHVwcGVyY2FzZSBuYW1lLCBhbmQgZG8gbm90IGVuZCB3aXRoIGEgc2VtaWNvbG9uLiBTdWNoIGZ1bmN0aW9uIG1hY3JvcyBhcmUKKyMgdHlwaWNhbGx5IHVzZWQgZm9yIGJvaWxlci1wbGF0ZSBjb2RlLCBhbmQgd2lsbCBjb25mdXNlIHRoZSBwYXJzZXIgaWYgbm90CisjIHJlbW92ZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitTS0lQX0ZVTkNUSU9OX01BQ1JPUyAgID0gWUVTCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gZXh0ZXJuYWwgcmVmZXJlbmNlcworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRoZSBUQUdGSUxFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB0YWcgZmlsZXMuIEZvciBlYWNoIHRhZworIyBmaWxlIHRoZSBsb2NhdGlvbiBvZiB0aGUgZXh0ZXJuYWwgZG9jdW1lbnRhdGlvbiBzaG91bGQgYmUgYWRkZWQuIFRoZSBmb3JtYXQgb2YKKyMgYSB0YWcgZmlsZSB3aXRob3V0IHRoaXMgbG9jYXRpb24gaXMgYXMgZm9sbG93czoKKyMgVEFHRklMRVMgPSBmaWxlMSBmaWxlMiAuLi4KKyMgQWRkaW5nIGxvY2F0aW9uIGZvciB0aGUgdGFnIGZpbGVzIGlzIGRvbmUgYXMgZm9sbG93czoKKyMgVEFHRklMRVMgPSBmaWxlMT1sb2MxICJmaWxlMiA9IGxvYzIiIC4uLgorIyB3aGVyZSBsb2MxIGFuZCBsb2MyIGNhbiBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZSBwYXRocyBvciBVUkxzLiBTZWUgdGhlCisjIHNlY3Rpb24gIkxpbmtpbmcgdG8gZXh0ZXJuYWwgZG9jdW1lbnRhdGlvbiIgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHVzZQorIyBvZiB0YWcgZmlsZXMuCisjIE5vdGU6IEVhY2ggdGFnIGZpbGUgbXVzdCBoYXZlIGFuIHVuaXF1ZSBuYW1lICh3aGVyZSB0aGUgbmFtZSBkb2VzIE5PVCBpbmNsdWRlCisjIHRoZSBwYXRoKS4gSWYgYSB0YWcgZmlsZSBpcyBub3QgbG9jYXRlZCBpbiB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIGRveHlnZW4gaXMKKyMgcnVuLCB5b3UgbXVzdCBhbHNvIHNwZWNpZnkgdGhlIHBhdGggdG8gdGhlIHRhZ2ZpbGUgaGVyZS4KKworVEFHRklMRVMgICAgICAgICAgICAgICA9IAorCisjIFdoZW4gYSBmaWxlIG5hbWUgaXMgc3BlY2lmaWVkIGFmdGVyIEdFTkVSQVRFX1RBR0ZJTEUsIGRveHlnZW4gd2lsbCBjcmVhdGUgYQorIyB0YWcgZmlsZSB0aGF0IGlzIGJhc2VkIG9uIHRoZSBpbnB1dCBmaWxlcyBpdCByZWFkcy4gU2VlIHNlY3Rpb24gIkxpbmtpbmcgdG8KKyMgZXh0ZXJuYWwgZG9jdW1lbnRhdGlvbiIgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHVzYWdlIG9mIHRhZyBmaWxlcy4KKworR0VORVJBVEVfVEFHRklMRSAgICAgICA9IAorCisjIElmIHRoZSBBTExFWFRFUk5BTFMgdGFnIGlzIHNldCB0byBZRVMgYWxsIGV4dGVybmFsIGNsYXNzIHdpbGwgYmUgbGlzdGVkIGluIHRoZQorIyBjbGFzcyBpbmRleC4gSWYgc2V0IHRvIE5PIG9ubHkgdGhlIGluaGVyaXRlZCBleHRlcm5hbCBjbGFzc2VzIHdpbGwgYmUgbGlzdGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0FMTEVYVEVSTkFMUyAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBFWFRFUk5BTF9HUk9VUFMgdGFnIGlzIHNldCB0byBZRVMgYWxsIGV4dGVybmFsIGdyb3VwcyB3aWxsIGJlIGxpc3RlZCBpbgorIyB0aGUgbW9kdWxlcyBpbmRleC4gSWYgc2V0IHRvIE5PLCBvbmx5IHRoZSBjdXJyZW50IHByb2plY3QncyBncm91cHMgd2lsbCBiZQorIyBsaXN0ZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0VYVEVSTkFMX0dST1VQUyAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRVhURVJOQUxfUEFHRVMgdGFnIGlzIHNldCB0byBZRVMgYWxsIGV4dGVybmFsIHBhZ2VzIHdpbGwgYmUgbGlzdGVkIGluCisjIHRoZSByZWxhdGVkIHBhZ2VzIGluZGV4LiBJZiBzZXQgdG8gTk8sIG9ubHkgdGhlIGN1cnJlbnQgcHJvamVjdCdzIHBhZ2VzIHdpbGwKKyMgYmUgbGlzdGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitFWFRFUk5BTF9QQUdFUyAgICAgICAgID0gWUVTCisKKyMgVGhlIFBFUkxfUEFUSCBzaG91bGQgYmUgdGhlIGFic29sdXRlIHBhdGggYW5kIG5hbWUgb2YgdGhlIHBlcmwgc2NyaXB0CisjIGludGVycHJldGVyIChpLmUuIHRoZSByZXN1bHQgb2YgJ3doaWNoIHBlcmwnKS4KKyMgVGhlIGRlZmF1bHQgZmlsZSAod2l0aCBhYnNvbHV0ZSBwYXRoKSBpczogL3Vzci9iaW4vcGVybC4KKworUEVSTF9QQVRIICAgICAgICAgICAgICA9IC91c3IvYmluL3BlcmwKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgZG90IHRvb2wKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgQ0xBU1NfRElBR1JBTVMgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgY2xhc3MgZGlhZ3JhbQorIyAoaW4gSFRNTCBhbmQgTGFUZVgpIGZvciBjbGFzc2VzIHdpdGggYmFzZSBvciBzdXBlciBjbGFzc2VzLiBTZXR0aW5nIHRoZSB0YWcgdG8KKyMgTk8gdHVybnMgdGhlIGRpYWdyYW1zIG9mZi4gTm90ZSB0aGF0IHRoaXMgb3B0aW9uIGFsc28gd29ya3Mgd2l0aCBIQVZFX0RPVAorIyBkaXNhYmxlZCwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGluc3RhbGwgYW5kIHVzZSBkb3QsIHNpbmNlIGl0IHlpZWxkcyBtb3JlCisjIHBvd2VyZnVsIGdyYXBocy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworQ0xBU1NfRElBR1JBTVMgICAgICAgICA9IFlFUworCisjIFlvdSBjYW4gZGVmaW5lIG1lc3NhZ2Ugc2VxdWVuY2UgY2hhcnRzIHdpdGhpbiBkb3h5Z2VuIGNvbW1lbnRzIHVzaW5nIHRoZSBcbXNjCisjIGNvbW1hbmQuIERveHlnZW4gd2lsbCB0aGVuIHJ1biB0aGUgbXNjZ2VuIHRvb2wgKHNlZToKKyMgaHR0cDovL3d3dy5tY3Rlcm5hbi5tZS51ay9tc2NnZW4vKSkgdG8gcHJvZHVjZSB0aGUgY2hhcnQgYW5kIGluc2VydCBpdCBpbiB0aGUKKyMgZG9jdW1lbnRhdGlvbi4gVGhlIE1TQ0dFTl9QQVRIIHRhZyBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIGRpcmVjdG9yeSB3aGVyZQorIyB0aGUgbXNjZ2VuIHRvb2wgcmVzaWRlcy4gSWYgbGVmdCBlbXB0eSB0aGUgdG9vbCBpcyBhc3N1bWVkIHRvIGJlIGZvdW5kIGluIHRoZQorIyBkZWZhdWx0IHNlYXJjaCBwYXRoLgorCitNU0NHRU5fUEFUSCAgICAgICAgICAgID0gCisKKyMgWW91IGNhbiBpbmNsdWRlIGRpYWdyYW1zIG1hZGUgd2l0aCBkaWEgaW4gZG94eWdlbiBkb2N1bWVudGF0aW9uLiBEb3h5Z2VuIHdpbGwKKyMgdGhlbiBydW4gZGlhIHRvIHByb2R1Y2UgdGhlIGRpYWdyYW0gYW5kIGluc2VydCBpdCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gVGhlCisjIERJQV9QQVRIIHRhZyBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgZGlhIGJpbmFyeSByZXNpZGVzLgorIyBJZiBsZWZ0IGVtcHR5IGRpYSBpcyBhc3N1bWVkIHRvIGJlIGZvdW5kIGluIHRoZSBkZWZhdWx0IHNlYXJjaCBwYXRoLgorCitESUFfUEFUSCAgICAgICAgICAgICAgID0gCisKKyMgSWYgc2V0IHRvIFlFUywgdGhlIGluaGVyaXRhbmNlIGFuZCBjb2xsYWJvcmF0aW9uIGdyYXBocyB3aWxsIGhpZGUgaW5oZXJpdGFuY2UKKyMgYW5kIHVzYWdlIHJlbGF0aW9ucyBpZiB0aGUgdGFyZ2V0IGlzIHVuZG9jdW1lbnRlZCBvciBpcyBub3QgYSBjbGFzcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworSElERV9VTkRPQ19SRUxBVElPTlMgICA9IFlFUworCisjIElmIHlvdSBzZXQgdGhlIEhBVkVfRE9UIHRhZyB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgYXNzdW1lIHRoZSBkb3QgdG9vbCBpcworIyBhdmFpbGFibGUgZnJvbSB0aGUgcGF0aC4gVGhpcyB0b29sIGlzIHBhcnQgb2YgR3JhcGh2aXogKHNlZToKKyMgaHR0cDovL3d3dy5ncmFwaHZpei5vcmcvKSwgYSBncmFwaCB2aXN1YWxpemF0aW9uIHRvb2xraXQgZnJvbSBBVCZUIGFuZCBMdWNlbnQKKyMgQmVsbCBMYWJzLiBUaGUgb3RoZXIgb3B0aW9ucyBpbiB0aGlzIHNlY3Rpb24gaGF2ZSBubyBlZmZlY3QgaWYgdGhpcyBvcHRpb24gaXMKKyMgc2V0IHRvIE5PCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSEFWRV9ET1QgICAgICAgICAgICAgICA9IE5PCisKKyMgVGhlIERPVF9OVU1fVEhSRUFEUyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBkb3QgaW52b2NhdGlvbnMgZG94eWdlbiBpcyBhbGxvd2VkCisjIHRvIHJ1biBpbiBwYXJhbGxlbC4gV2hlbiBzZXQgdG8gMCBkb3h5Z2VuIHdpbGwgYmFzZSB0aGlzIG9uIHRoZSBudW1iZXIgb2YKKyMgcHJvY2Vzc29ycyBhdmFpbGFibGUgaW4gdGhlIHN5c3RlbS4gWW91IGNhbiBzZXQgaXQgZXhwbGljaXRseSB0byBhIHZhbHVlCisjIGxhcmdlciB0aGFuIDAgdG8gZ2V0IGNvbnRyb2wgb3ZlciB0aGUgYmFsYW5jZSBiZXR3ZWVuIENQVSBsb2FkIGFuZCBwcm9jZXNzaW5nCisjIHNwZWVkLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAzMiwgZGVmYXVsdCB2YWx1ZTogMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9OVU1fVEhSRUFEUyAgICAgICAgPSAwCisKKyMgV2hlbiB5b3Ugd2FudCBhIGRpZmZlcmVudGx5IGxvb2tpbmcgZm9udCBuIHRoZSBkb3QgZmlsZXMgdGhhdCBkb3h5Z2VuCisjIGdlbmVyYXRlcyB5b3UgY2FuIHNwZWNpZnkgdGhlIGZvbnQgbmFtZSB1c2luZyBET1RfRk9OVE5BTUUuIFlvdSBuZWVkIHRvIG1ha2UKKyMgc3VyZSBkb3QgaXMgYWJsZSB0byBmaW5kIHRoZSBmb250LCB3aGljaCBjYW4gYmUgZG9uZSBieSBwdXR0aW5nIGl0IGluIGEKKyMgc3RhbmRhcmQgbG9jYXRpb24gb3IgYnkgc2V0dGluZyB0aGUgRE9URk9OVFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUgb3IgYnkKKyMgc2V0dGluZyBET1RfRk9OVFBBVEggdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBmb250LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogSGVsdmV0aWNhLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX0ZPTlROQU1FICAgICAgICAgICA9IEhlbHZldGljYQorCisjIFRoZSBET1RfRk9OVFNJWkUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgc2l6ZSAoaW4gcG9pbnRzKSBvZiB0aGUgZm9udCBvZgorIyBkb3QgZ3JhcGhzLgorIyBNaW5pbXVtIHZhbHVlOiA0LCBtYXhpbXVtIHZhbHVlOiAyNCwgZGVmYXVsdCB2YWx1ZTogMTAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfRk9OVFNJWkUgICAgICAgICAgID0gMTAKKworIyBCeSBkZWZhdWx0IGRveHlnZW4gd2lsbCB0ZWxsIGRvdCB0byB1c2UgdGhlIGRlZmF1bHQgZm9udCBhcyBzcGVjaWZpZWQgd2l0aAorIyBET1RfRk9OVE5BTUUuIElmIHlvdSBzcGVjaWZ5IGEgZGlmZmVyZW50IGZvbnQgdXNpbmcgRE9UX0ZPTlROQU1FIHlvdSBjYW4gc2V0CisjIHRoZSBwYXRoIHdoZXJlIGRvdCBjYW4gZmluZCBpdCB1c2luZyB0aGlzIHRhZy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9GT05UUEFUSCAgICAgICAgICAgPSAKKworIyBJZiB0aGUgQ0xBU1NfR1JBUEggdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IKKyMgZWFjaCBkb2N1bWVudGVkIGNsYXNzIHNob3dpbmcgdGhlIGRpcmVjdCBhbmQgaW5kaXJlY3QgaW5oZXJpdGFuY2UgcmVsYXRpb25zLgorIyBTZXR0aW5nIHRoaXMgdGFnIHRvIFlFUyB3aWxsIGZvcmNlIHRoZSBDTEFTU19ESUFHUkFNUyB0YWcgdG8gTk8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitDTEFTU19HUkFQSCAgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIENPTExBQk9SQVRJT05fR1JBUEggdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQorIyBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGNsYXNzIHNob3dpbmcgdGhlIGRpcmVjdCBhbmQgaW5kaXJlY3QgaW1wbGVtZW50YXRpb24KKyMgZGVwZW5kZW5jaWVzIChpbmhlcml0YW5jZSwgY29udGFpbm1lbnQsIGFuZCBjbGFzcyByZWZlcmVuY2VzIHZhcmlhYmxlcykgb2YgdGhlCisjIGNsYXNzIHdpdGggb3RoZXIgZG9jdW1lbnRlZCBjbGFzc2VzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworQ09MTEFCT1JBVElPTl9HUkFQSCAgICA9IFlFUworCisjIElmIHRoZSBHUk9VUF9HUkFQSFMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IKKyMgZ3JvdXBzLCBzaG93aW5nIHRoZSBkaXJlY3QgZ3JvdXBzIGRlcGVuZGVuY2llcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0dST1VQX0dSQVBIUyAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgVU1MX0xPT0sgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGluaGVyaXRhbmNlIGFuZAorIyBjb2xsYWJvcmF0aW9uIGRpYWdyYW1zIGluIGEgc3R5bGUgc2ltaWxhciB0byB0aGUgT01HJ3MgVW5pZmllZCBNb2RlbGluZworIyBMYW5ndWFnZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworVU1MX0xPT0sgICAgICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFVNTF9MT09LIHRhZyBpcyBlbmFibGVkLCB0aGUgZmllbGRzIGFuZCBtZXRob2RzIGFyZSBzaG93biBpbnNpZGUgdGhlCisjIGNsYXNzIG5vZGUuIElmIHRoZXJlIGFyZSBtYW55IGZpZWxkcyBvciBtZXRob2RzIGFuZCBtYW55IG5vZGVzIHRoZSBncmFwaCBtYXkKKyMgYmVjb21lIHRvbyBiaWcgdG8gYmUgdXNlZnVsLiBUaGUgVU1MX0xJTUlUX05VTV9GSUVMRFMgdGhyZXNob2xkIGxpbWl0cyB0aGUKKyMgbnVtYmVyIG9mIGl0ZW1zIGZvciBlYWNoIHR5cGUgdG8gbWFrZSB0aGUgc2l6ZSBtb3JlIG1hbmFnZWFibGUuIFNldCB0aGlzIHRvIDAKKyMgZm9yIG5vIGxpbWl0LiBOb3RlIHRoYXQgdGhlIHRocmVzaG9sZCBtYXkgYmUgZXhjZWVkZWQgYnkgNTAlIGJlZm9yZSB0aGUgbGltaXQKKyMgaXMgZW5mb3JjZWQuIFNvIHdoZW4geW91IHNldCB0aGUgdGhyZXNob2xkIHRvIDEwLCB1cCB0byAxNSBmaWVsZHMgbWF5IGFwcGVhciwKKyMgYnV0IGlmIHRoZSBudW1iZXIgZXhjZWVkcyAxNSwgdGhlIHRvdGFsIGFtb3VudCBvZiBmaWVsZHMgc2hvd24gaXMgbGltaXRlZCB0bworIyAxMC4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMTAwLCBkZWZhdWx0IHZhbHVlOiAxMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK1VNTF9MSU1JVF9OVU1fRklFTERTICAgPSAxMAorCisjIElmIHRoZSBURU1QTEFURV9SRUxBVElPTlMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgaW5oZXJpdGFuY2UgYW5kCisjIGNvbGxhYm9yYXRpb24gZ3JhcGhzIHdpbGwgc2hvdyB0aGUgcmVsYXRpb25zIGJldHdlZW4gdGVtcGxhdGVzIGFuZCB0aGVpcgorIyBpbnN0YW5jZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK1RFTVBMQVRFX1JFTEFUSU9OUyAgICAgPSBOTworCisjIElmIHRoZSBJTkNMVURFX0dSQVBILCBFTkFCTEVfUFJFUFJPQ0VTU0lORyBhbmQgU0VBUkNIX0lOQ0xVREVTIHRhZ3MgYXJlIHNldCB0bworIyBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGZpbGUgc2hvd2luZyB0aGUKKyMgZGlyZWN0IGFuZCBpbmRpcmVjdCBpbmNsdWRlIGRlcGVuZGVuY2llcyBvZiB0aGUgZmlsZSB3aXRoIG90aGVyIGRvY3VtZW50ZWQKKyMgZmlsZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitJTkNMVURFX0dSQVBIICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIElOQ0xVREVEX0JZX0dSQVBILCBFTkFCTEVfUFJFUFJPQ0VTU0lORyBhbmQgU0VBUkNIX0lOQ0xVREVTIHRhZ3MgYXJlCisjIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGZpbGUgc2hvd2luZworIyB0aGUgZGlyZWN0IGFuZCBpbmRpcmVjdCBpbmNsdWRlIGRlcGVuZGVuY2llcyBvZiB0aGUgZmlsZSB3aXRoIG90aGVyIGRvY3VtZW50ZWQKKyMgZmlsZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitJTkNMVURFRF9CWV9HUkFQSCAgICAgID0gWUVTCisKKyMgSWYgdGhlIENBTExfR1JBUEggdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBjYWxsCisjIGRlcGVuZGVuY3kgZ3JhcGggZm9yIGV2ZXJ5IGdsb2JhbCBmdW5jdGlvbiBvciBjbGFzcyBtZXRob2QuCisjCisjIE5vdGUgdGhhdCBlbmFibGluZyB0aGlzIG9wdGlvbiB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UgdGhlIHRpbWUgb2YgYSBydW4uCisjIFNvIGluIG1vc3QgY2FzZXMgaXQgd2lsbCBiZSBiZXR0ZXIgdG8gZW5hYmxlIGNhbGwgZ3JhcGhzIGZvciBzZWxlY3RlZAorIyBmdW5jdGlvbnMgb25seSB1c2luZyB0aGUgXGNhbGxncmFwaCBjb21tYW5kLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitDQUxMX0dSQVBIICAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgQ0FMTEVSX0dSQVBIIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgY2FsbGVyCisjIGRlcGVuZGVuY3kgZ3JhcGggZm9yIGV2ZXJ5IGdsb2JhbCBmdW5jdGlvbiBvciBjbGFzcyBtZXRob2QuCisjCisjIE5vdGUgdGhhdCBlbmFibGluZyB0aGlzIG9wdGlvbiB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UgdGhlIHRpbWUgb2YgYSBydW4uCisjIFNvIGluIG1vc3QgY2FzZXMgaXQgd2lsbCBiZSBiZXR0ZXIgdG8gZW5hYmxlIGNhbGxlciBncmFwaHMgZm9yIHNlbGVjdGVkCisjIGZ1bmN0aW9ucyBvbmx5IHVzaW5nIHRoZSBcY2FsbGVyZ3JhcGggY29tbWFuZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworQ0FMTEVSX0dSQVBIICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEdSQVBISUNBTF9ISUVSQVJDSFkgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ3JhcGhpY2FsCisjIGhpZXJhcmNoeSBvZiBhbGwgY2xhc3NlcyBpbnN0ZWFkIG9mIGEgdGV4dHVhbCBvbmUuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitHUkFQSElDQUxfSElFUkFSQ0hZICAgID0gWUVTCisKKyMgSWYgdGhlIERJUkVDVE9SWV9HUkFQSCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzaG93IHRoZQorIyBkZXBlbmRlbmNpZXMgYSBkaXJlY3RvcnkgaGFzIG9uIG90aGVyIGRpcmVjdG9yaWVzIGluIGEgZ3JhcGhpY2FsIHdheS4gVGhlCisjIGRlcGVuZGVuY3kgcmVsYXRpb25zIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSAjaW5jbHVkZSByZWxhdGlvbnMgYmV0d2VlbiB0aGUKKyMgZmlsZXMgaW4gdGhlIGRpcmVjdG9yaWVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRElSRUNUT1JZX0dSQVBIICAgICAgICA9IFlFUworCisjIFRoZSBET1RfSU1BR0VfRk9STUFUIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIGltYWdlIGZvcm1hdCBvZiB0aGUgaW1hZ2VzCisjIGdlbmVyYXRlZCBieSBkb3QuCisjIE5vdGU6IElmIHlvdSBjaG9vc2Ugc3ZnIHlvdSBuZWVkIHRvIHNldCBIVE1MX0ZJTEVfRVhURU5TSU9OIHRvIHhodG1sIGluIG9yZGVyCisjIHRvIG1ha2UgdGhlIFNWRyBmaWxlcyB2aXNpYmxlIGluIElFIDkrIChvdGhlciBicm93c2VycyBkbyBub3QgaGF2ZSB0aGlzCisjIHJlcXVpcmVtZW50KS4KKyMgUG9zc2libGUgdmFsdWVzIGFyZTogcG5nLCBqcGcsIGdpZiBhbmQgc3ZnLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogcG5nLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX0lNQUdFX0ZPUk1BVCAgICAgICA9IHBuZworCisjIElmIERPVF9JTUFHRV9GT1JNQVQgaXMgc2V0IHRvIHN2ZywgdGhlbiB0aGlzIG9wdGlvbiBjYW4gYmUgc2V0IHRvIFlFUyB0bworIyBlbmFibGUgZ2VuZXJhdGlvbiBvZiBpbnRlcmFjdGl2ZSBTVkcgaW1hZ2VzIHRoYXQgYWxsb3cgem9vbWluZyBhbmQgcGFubmluZy4KKyMKKyMgTm90ZSB0aGF0IHRoaXMgcmVxdWlyZXMgYSBtb2Rlcm4gYnJvd3NlciBvdGhlciB0aGFuIEludGVybmV0IEV4cGxvcmVyLiBUZXN0ZWQKKyMgYW5kIHdvcmtpbmcgYXJlIEZpcmVmb3gsIENocm9tZSwgU2FmYXJpLCBhbmQgT3BlcmEuCisjIE5vdGU6IEZvciBJRSA5KyB5b3UgbmVlZCB0byBzZXQgSFRNTF9GSUxFX0VYVEVOU0lPTiB0byB4aHRtbCBpbiBvcmRlciB0byBtYWtlCisjIHRoZSBTVkcgZmlsZXMgdmlzaWJsZS4gT2xkZXIgdmVyc2lvbnMgb2YgSUUgZG8gbm90IGhhdmUgU1ZHIHN1cHBvcnQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0lOVEVSQUNUSVZFX1NWRyAgICAgICAgPSBOTworCisjIFRoZSBET1RfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgcGF0aCB3aGVyZSB0aGUgZG90IHRvb2wgY2FuIGJlCisjIGZvdW5kLiBJZiBsZWZ0IGJsYW5rLCBpdCBpcyBhc3N1bWVkIHRoZSBkb3QgdG9vbCBjYW4gYmUgZm91bmQgaW4gdGhlIHBhdGguCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfUEFUSCAgICAgICAgICAgICAgID0gCisKKyMgVGhlIERPVEZJTEVfRElSUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBkaXJlY3RvcmllcyB0aGF0CisjIGNvbnRhaW4gZG90IGZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uIChzZWUgdGhlIFxkb3RmaWxlCisjIGNvbW1hbmQpLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9URklMRV9ESVJTICAgICAgICAgICA9IAorCisjIFRoZSBNU0NGSUxFX0RJUlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMgdGhhdAorIyBjb250YWluIG1zYyBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlIHRoZSBcbXNjZmlsZQorIyBjb21tYW5kKS4KKworTVNDRklMRV9ESVJTICAgICAgICAgICA9IAorCisjIFRoZSBESUFGSUxFX0RJUlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMgdGhhdAorIyBjb250YWluIGRpYSBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlIHRoZSBcZGlhZmlsZQorIyBjb21tYW5kKS4KKworRElBRklMRV9ESVJTICAgICAgICAgICA9IAorCisjIFRoZSBET1RfR1JBUEhfTUFYX05PREVTIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIG5vZGVzCisjIHRoYXQgd2lsbCBiZSBzaG93biBpbiB0aGUgZ3JhcGguIElmIHRoZSBudW1iZXIgb2Ygbm9kZXMgaW4gYSBncmFwaCBiZWNvbWVzCisjIGxhcmdlciB0aGFuIHRoaXMgdmFsdWUsIGRveHlnZW4gd2lsbCB0cnVuY2F0ZSB0aGUgZ3JhcGgsIHdoaWNoIGlzIHZpc3VhbGl6ZWQKKyMgYnkgcmVwcmVzZW50aW5nIGEgbm9kZSBhcyBhIHJlZCBib3guIE5vdGUgdGhhdCBkb3h5Z2VuIGlmIHRoZSBudW1iZXIgb2YgZGlyZWN0CisjIGNoaWxkcmVuIG9mIHRoZSByb290IG5vZGUgaW4gYSBncmFwaCBpcyBhbHJlYWR5IGxhcmdlciB0aGFuCisjIERPVF9HUkFQSF9NQVhfTk9ERVMgdGhlbiB0aGUgZ3JhcGggd2lsbCBub3QgYmUgc2hvd24gYXQgYWxsLiBBbHNvIG5vdGUgdGhhdAorIyB0aGUgc2l6ZSBvZiBhIGdyYXBoIGNhbiBiZSBmdXJ0aGVyIHJlc3RyaWN0ZWQgYnkgTUFYX0RPVF9HUkFQSF9ERVBUSC4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMTAwMDAsIGRlZmF1bHQgdmFsdWU6IDUwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX0dSQVBIX01BWF9OT0RFUyAgICA9IDUwCisKKyMgVGhlIE1BWF9ET1RfR1JBUEhfREVQVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbWF4aW11bSBkZXB0aCBvZiB0aGUgZ3JhcGhzCisjIGdlbmVyYXRlZCBieSBkb3QuIEEgZGVwdGggdmFsdWUgb2YgMyBtZWFucyB0aGF0IG9ubHkgbm9kZXMgcmVhY2hhYmxlIGZyb20gdGhlCisjIHJvb3QgYnkgZm9sbG93aW5nIGEgcGF0aCB2aWEgYXQgbW9zdCAzIGVkZ2VzIHdpbGwgYmUgc2hvd24uIE5vZGVzIHRoYXQgbGF5CisjIGZ1cnRoZXIgZnJvbSB0aGUgcm9vdCBub2RlIHdpbGwgYmUgb21pdHRlZC4gTm90ZSB0aGF0IHNldHRpbmcgdGhpcyBvcHRpb24gdG8gMQorIyBvciAyIG1heSBncmVhdGx5IHJlZHVjZSB0aGUgY29tcHV0YXRpb24gdGltZSBuZWVkZWQgZm9yIGxhcmdlIGNvZGUgYmFzZXMuIEFsc28KKyMgbm90ZSB0aGF0IHRoZSBzaXplIG9mIGEgZ3JhcGggY2FuIGJlIGZ1cnRoZXIgcmVzdHJpY3RlZCBieQorIyBET1RfR1JBUEhfTUFYX05PREVTLiBVc2luZyBhIGRlcHRoIG9mIDAgbWVhbnMgbm8gZGVwdGggcmVzdHJpY3Rpb24uCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDEwMDAsIGRlZmF1bHQgdmFsdWU6IDAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitNQVhfRE9UX0dSQVBIX0RFUFRIICAgID0gMAorCisjIFNldCB0aGUgRE9UX1RSQU5TUEFSRU5UIHRhZyB0byBZRVMgdG8gZ2VuZXJhdGUgaW1hZ2VzIHdpdGggYSB0cmFuc3BhcmVudAorIyBiYWNrZ3JvdW5kLiBUaGlzIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQsIGJlY2F1c2UgZG90IG9uIFdpbmRvd3MgZG9lcyBub3Qgc2VlbQorIyB0byBzdXBwb3J0IHRoaXMgb3V0IG9mIHRoZSBib3guCisjCisjIFdhcm5pbmc6IERlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0gdXNlZCwgZW5hYmxpbmcgdGhpcyBvcHRpb24gbWF5IGxlYWQgdG8KKyMgYmFkbHkgYW50aS1hbGlhc2VkIGxhYmVscyBvbiB0aGUgZWRnZXMgb2YgYSBncmFwaCAoaS5lLiB0aGV5IGJlY29tZSBoYXJkIHRvCisjIHJlYWQpLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfVFJBTlNQQVJFTlQgICAgICAgID0gTk8KKworIyBTZXQgdGhlIERPVF9NVUxUSV9UQVJHRVRTIHRhZyB0byBZRVMgYWxsb3cgZG90IHRvIGdlbmVyYXRlIG11bHRpcGxlIG91dHB1dAorIyBmaWxlcyBpbiBvbmUgcnVuIChpLmUuIG11bHRpcGxlIC1vIGFuZCAtVCBvcHRpb25zIG9uIHRoZSBjb21tYW5kIGxpbmUpLiBUaGlzCisjIG1ha2VzIGRvdCBydW4gZmFzdGVyLCBidXQgc2luY2Ugb25seSBuZXdlciB2ZXJzaW9ucyBvZiBkb3QgKD4xLjguMTApIHN1cHBvcnQKKyMgdGhpcywgdGhpcyBmZWF0dXJlIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9NVUxUSV9UQVJHRVRTICAgICAgPSBOTworCisjIElmIHRoZSBHRU5FUkFURV9MRUdFTkQgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgbGVnZW5kIHBhZ2UKKyMgZXhwbGFpbmluZyB0aGUgbWVhbmluZyBvZiB0aGUgdmFyaW91cyBib3hlcyBhbmQgYXJyb3dzIGluIHRoZSBkb3QgZ2VuZXJhdGVkCisjIGdyYXBocy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0dFTkVSQVRFX0xFR0VORCAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRE9UX0NMRUFOVVAgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIHJlbW92ZSB0aGUgaW50ZXJtZWRpYXRlIGRvdAorIyBmaWxlcyB0aGF0IGFyZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSB2YXJpb3VzIGdyYXBocy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9DTEVBTlVQICAgICAgICAgICAgPSBZRVMKZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvZG9jL2RveHlnZW4vaGVhZGVyLnRleCBiL2ZpbmFsL29mZmxvYWQvZG9jL2RveHlnZW4vaGVhZGVyLnRleApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41ZTk2M2MyCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9kb2MvZG94eWdlbi9oZWFkZXIudGV4CkBAIC0wLDAgKzEsOTAgQEAKKyUgTGF0ZXggaGVhZGVyIGZvciBkb3h5Z2VuIDEuOC4zLjENCitcZG9jdW1lbnRjbGFzc3tib29rfQ0KK1x1c2VwYWNrYWdlW2E0cGFwZXIsdG9wPTIuNWNtLGJvdHRvbT0yLjVjbSxsZWZ0PTIuNWNtLHJpZ2h0PTIuNWNtXXtnZW9tZXRyeX0NCitcdXNlcGFja2FnZXttYWtlaWR4fQ0KK1x1c2VwYWNrYWdle25hdGJpYn0NCitcdXNlcGFja2FnZXtncmFwaGljeH0NCitcdXNlcGFja2FnZXttdWx0aWNvbH0NCitcdXNlcGFja2FnZXtmbG9hdH0NCitcdXNlcGFja2FnZXtsaXN0aW5nc30NCitcdXNlcGFja2FnZXtjb2xvcn0NCitcdXNlcGFja2FnZXtpZnRoZW59DQorXHVzZXBhY2thZ2VbdGFibGVde3hjb2xvcn0NCitcdXNlcGFja2FnZXt0ZXh0Y29tcH0NCitcdXNlcGFja2FnZXthbGx0dH0NCitcdXNlcGFja2FnZXtpZnBkZn0NCitcaWZwZGYNCitcdXNlcGFja2FnZVtwZGZ0ZXgsDQorICAgICAgICAgICAgcGFnZWJhY2tyZWY9dHJ1ZSwNCisgICAgICAgICAgICBjb2xvcmxpbmtzPXRydWUsDQorICAgICAgICAgICAgbGlua2NvbG9yPWJsdWUsDQorICAgICAgICAgICAgdW5pY29kZQ0KKyAgICAgICAgICAgXXtoeXBlcnJlZn0NCitcZWxzZQ0KK1x1c2VwYWNrYWdlW3BzMnBkZiwNCisgICAgICAgICAgICBwYWdlYmFja3JlZj10cnVlLA0KKyAgICAgICAgICAgIGNvbG9ybGlua3M9dHJ1ZSwNCisgICAgICAgICAgICBsaW5rY29sb3I9Ymx1ZSwNCisgICAgICAgICAgICB1bmljb2RlDQorICAgICAgICAgICBde2h5cGVycmVmfQ0KK1x1c2VwYWNrYWdle3BzcGljdHVyZX0NCitcZmkNCitcdXNlcGFja2FnZVt1dGY4XXtpbnB1dGVuY30NCitcdXNlcGFja2FnZXttYXRocHRteH0NCitcdXNlcGFja2FnZVtzY2FsZWQ9LjkwXXtoZWx2ZXR9DQorXHVzZXBhY2thZ2V7Y291cmllcn0NCitcdXNlcGFja2FnZXtzZWN0c3R5fQ0KK1x1c2VwYWNrYWdle2Ftc3N5bWJ9DQorXHVzZXBhY2thZ2VbdGl0bGVzXXt0b2Nsb2Z0fQ0KK1x1c2VwYWNrYWdle2RveHlnZW59DQorXHVzZXBhY2thZ2V7ZmFuY3loZHJ9DQorXHBhZ2VzdHlsZXtmYW5jeX0NCitcbHN0c2V0e2xhbmd1YWdlPUMrKyxpbnB1dGVuY29kaW5nPXV0ZjgsYmFzaWNzdHlsZT1cZm9vdG5vdGVzaXplLGJyZWFrbGluZXM9dHJ1ZSxicmVha2F0d2hpdGVzcGFjZT10cnVlLHRhYnNpemU9NCxudW1iZXJzPWxlZnQgfQ0KK1xtYWtlaW5kZXgNCitcc2V0Y291bnRlcnt0b2NkZXB0aH17M30NCitccmVuZXdjb21tYW5ke1xmb290cnVsZXdpZHRofXswLjRwdH0NCitccmVuZXdjb21tYW5ke1xmYW1pbHlkZWZhdWx0fXtcc2ZkZWZhdWx0fQ0KK1xoZnV6ej0xNXB0DQorXHNldGxlbmd0aHtcZW1lcmdlbmN5c3RyZXRjaH17MTVwdH0NCitcaGJhZG5lc3M9NzUwDQorXHRvbGVyYW5jZT03NTANCitcYmVnaW57ZG9jdW1lbnR9DQorXGh5cGVyc2V0dXB7cGFnZWFuY2hvcj1mYWxzZSxjaXRlY29sb3I9Ymx1ZX0NCitcYmVnaW57dGl0bGVwYWdlfQ0KK1x2c3BhY2UqezdjbX0NCitcYmVnaW57Y2VudGVyfQ0KK3tcTGFyZ2UgSW50ZWxcdGV4dHN1cGVyc2NyaXB0e1x0ZXh0cmVnaXN0ZXJlZH0gT2ZmbG9hZCBSdW50aW1lIExpYnJhcnkgfVxcDQorXHZzcGFjZSp7MWNtfQ0KK3tcbGFyZ2UgR2VuZXJhdGVkIGJ5IERveHlnZW4gJGRveHlnZW52ZXJzaW9uIH1cXA0KK1x2c3BhY2UqezAuNWNtfQ0KK3tcc21hbGwgJGRhdGV0aW1lIH1cXA0KK1xlbmR7Y2VudGVyfQ0KK1xlbmR7dGl0bGVwYWdlfQ0KKw0KK3tcYmYgRlRDIE9wdGltaXphdGlvbiBOb3RpY2V9DQorDQorSW50ZWwncyBjb21waWxlcnMgbWF5IG9yIG1heSBub3Qgb3B0aW1pemUgdG8gdGhlIHNhbWUgZGVncmVlIGZvciBub24tSW50ZWwgbWljcm9wcm9jZXNzb3JzIGZvcg0KK29wdGltaXphdGlvbnMgdGhhdCBhcmUgbm90IHVuaXF1ZSB0byBJbnRlbCBtaWNyb3Byb2Nlc3NvcnMuIFRoZXNlIG9wdGltaXphdGlvbnMgaW5jbHVkZSBTU0UyLA0KK1NTRTMsIGFuZCBTU1NFMyBpbnN0cnVjdGlvbiBzZXRzIGFuZCBvdGhlciBvcHRpbWl6YXRpb25zLiBJbnRlbCBkb2VzIG5vdCBndWFyYW50ZWUgdGhlDQorYXZhaWxhYmlsaXR5LCBmdW5jdGlvbmFsaXR5LCBvciBlZmZlY3RpdmVuZXNzIG9mIGFueSBvcHRpbWl6YXRpb24gb24gbWljcm9wcm9jZXNzb3JzIG5vdA0KK21hbnVmYWN0dXJlZCBieSBJbnRlbC4NCisNCitNaWNyb3Byb2Nlc3Nvci1kZXBlbmRlbnQgb3B0aW1pemF0aW9ucyBpbiB0aGlzIHByb2R1Y3QgYXJlIGludGVuZGVkIGZvciB1c2Ugd2l0aCBJbnRlbA0KK21pY3JvcHJvY2Vzc29ycy4gQ2VydGFpbiBvcHRpbWl6YXRpb25zIG5vdCBzcGVjaWZpYyB0byBJbnRlbCBtaWNyb2FyY2hpdGVjdHVyZSBhcmUgcmVzZXJ2ZWQgZm9yDQorSW50ZWwgbWljcm9wcm9jZXNzb3JzLiBQbGVhc2UgcmVmZXIgdG8gdGhlIGFwcGxpY2FibGUgcHJvZHVjdCBVc2VyIGFuZCBSZWZlcmVuY2UgR3VpZGVzIGZvcg0KK21vcmUgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoZSBzcGVjaWZpYyBpbnN0cnVjdGlvbiBzZXRzIGNvdmVyZWQgYnkgdGhpcyBub3RpY2UuDQorDQorTm90aWNlIHJldmlzaW9uIFwjMjAxMTA4MDQNCisNCitcdnNwYWNlKnswLjVjbX0NCisNCit7XGJmIFRyYWRlbWFya3N9DQorDQorSW50ZWwsIFhlb24sIGFuZCBJbnRlbCBYZW9uIFBoaSBhcmUgdHJhZGVtYXJrcyBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBpbiB0aGUgVS5TLiBhbmQvb3Igb3RoZXIgY291bnRyaWVzLg0KKw0KK1RoaXMgZG9jdW1lbnQgaXMgQ29weXJpZ2h0IFx0ZXh0Y29weXJpZ2h0IDIwMTQsIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLiANCisNCitccGFnZW51bWJlcmluZ3tyb21hbn0NCitcdGFibGVvZmNvbnRlbnRzDQorXHBhZ2VudW1iZXJpbmd7YXJhYmljfQ0KK1xoeXBlcnNldHVwe3BhZ2VhbmNob3I9dHJ1ZSxjaXRlY29sb3I9Ymx1ZX0NCmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9jZWFuX3V0aWwuY3BwIGIvZmluYWwvb2ZmbG9hZC9zcmMvY2Vhbl91dGlsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTE4OTBiCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvY2Vhbl91dGlsLmNwcApAQCAtMCwwICsxLDM0NCBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAiY2Vhbl91dGlsLmgiCisjaW5jbHVkZSAib2ZmbG9hZF9jb21tb24uaCIKKworLy8gMS4gYWxsb2NhdGUgZWxlbWVudCBvZiBDZWFuUmVhZFJhbmdlcyB0eXBlCisvLyAyLiBpbml0aWFsaXplZCBpdCBmb3IgcmVhZGluZyBjb25zZXF1ZW50bHkgY29udGlndW91cyByYW5nZXMKKy8vICAgIGRlc2NyaWJlZCBieSAiYXAiIGFyZ3VtZW50CitDZWFuUmVhZFJhbmdlcyAqIGluaXRfcmVhZF9yYW5nZXNfYXJyX2Rlc2MoY29uc3QgYXJyX2Rlc2MgKmFwKQoreworICAgIENlYW5SZWFkUmFuZ2VzICogcmVzOworCisgICAgLy8gZmluZCB0aGUgbWF4IGNvbnRpZ3VvdXMgcmFuZ2UKKyAgICBpbnQ2NF90IHJhbmsgPSBhcC0+cmFuayAtIDE7CisgICAgaW50NjRfdCBsZW5ndGggPSBhcC0+ZGltW3JhbmtdLnNpemU7CisgICAgZm9yICg7IHJhbmsgPj0gMDsgcmFuay0tKSB7CisgICAgICAgIGlmIChhcC0+ZGltW3JhbmtdLnN0cmlkZSA9PSAxKSB7CisgICAgICAgICAgICBsZW5ndGggKj0gKGFwLT5kaW1bcmFua10udXBwZXIgLSBhcC0+ZGltW3JhbmtdLmxvd2VyICsgMSk7CisgICAgICAgICAgICBpZiAocmFuayA+IDAgJiYgbGVuZ3RoICE9IGFwLT5kaW1bcmFuayAtIDFdLnNpemUpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmVzID0oQ2VhblJlYWRSYW5nZXMgKiltYWxsb2Moc2l6ZW9mKENlYW5SZWFkUmFuZ2VzKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFwLT5yYW5rIC0gcmFuaykgKiBzaXplb2YoQ2VhblJlYWREaW0pKTsKKyAgICByZXMtPmN1cnJlbnRfbnVtYmVyID0gMDsKKyAgICByZXMtPnJhbmdlX3NpemUgPSBsZW5ndGg7CisgICAgcmVzLT5sYXN0X25vbmNvbnRfaW5kID0gcmFuazsKKworICAgIC8vIGNhbGN1bGF0ZSBudW1iZXIgb2YgY29udGlndW91cyByYW5nZXMgaW5zaWRlIG5vbmNvbnRpZ3VvdXMgZGltZW5zaW9ucworICAgIGludCBjb3VudCA9IDE7CisgICAgYm9vbCBwcmV2X2lzX2NvbnQgPSB0cnVlOworICAgIGludDY0X3Qgb2Zmc2V0ID0gMDsKKworICAgIGZvciAoOyByYW5rID49IDA7IHJhbmstLSkgeworICAgICAgICByZXMtPkRpbVtyYW5rXS5jb3VudCA9IGNvdW50OworICAgICAgICByZXMtPkRpbVtyYW5rXS5zaXplID0gYXAtPmRpbVtyYW5rXS5zdHJpZGUgKiBhcC0+ZGltW3JhbmtdLnNpemU7CisgICAgICAgIGNvdW50ICo9IChwcmV2X2lzX2NvbnQgJiYgYXAtPmRpbVtyYW5rXS5zdHJpZGUgPT0gMT8gMSA6CisgICAgICAgICAgICAoYXAtPmRpbVtyYW5rXS51cHBlciAtIGFwLT5kaW1bcmFua10ubG93ZXIgKworICAgICAgICAgICAgYXAtPmRpbVtyYW5rXS5zdHJpZGUpIC8gYXAtPmRpbVtyYW5rXS5zdHJpZGUpOworICAgICAgICBwcmV2X2lzX2NvbnQgPSBmYWxzZTsKKyAgICAgICAgb2Zmc2V0ICs9KGFwLT5kaW1bcmFua10ubG93ZXIgLSBhcC0+ZGltW3JhbmtdLmxpbmRleCkgKgorICAgICAgICAgICAgICAgICBhcC0+ZGltW3JhbmtdLnNpemU7CisgICAgfQorICAgIHJlcy0+cmFuZ2VfbWF4X251bWJlciA9IGNvdW50OworICAgIHJlcyAtPiBwdHIgPSAodm9pZCopYXAtPmJhc2U7CisgICAgcmVzIC0+IGluaXRfb2Zmc2V0ID0gb2Zmc2V0OworICAgIHJldHVybiByZXM7Cit9CisKKy8vIGNoZWNrIGlmIHJhbmdlcyBkZXNjcmliZWQgYnkgMSBhcmd1bWVudCBjb3VsZCBiZSB0cmFuc2ZlcnJlZCBpbnRvIHJhbmdlcworLy8gZGVzY3JpYmVkIGJ5IDItbmQgb25lCitib29sIGNlYW5fcmFuZ2VzX21hdGNoKAorICAgIENlYW5SZWFkUmFuZ2VzICogcmVhZF9ybmcxLAorICAgIENlYW5SZWFkUmFuZ2VzICogcmVhZF9ybmcyCispCit7CisgICAgcmV0dXJuICggcmVhZF9ybmcxID09IE5VTEwgfHwgcmVhZF9ybmcyID09IE5VTEwgfHwKKyAgICAgICAgICAgIChyZWFkX3JuZzEtPnJhbmdlX3NpemUgJSByZWFkX3JuZzItPnJhbmdlX3NpemUgPT0gMCB8fAorICAgICAgICAgICAgcmVhZF9ybmcyLT5yYW5nZV9zaXplICUgcmVhZF9ybmcxLT5yYW5nZV9zaXplID09IDApKTsKK30KKworLy8gU2V0IG5leHQgb2Zmc2V0IGFuZCBsZW5ndGggYW5kIHJldHVybnMgdHJ1ZSBmb3IgbmV4dCByYW5nZS4KKy8vIFJldHVybnMgZmFsc2UgaWYgdGhlIHJhbmdlcyBhcmUgb3Zlci4KK2Jvb2wgZ2V0X25leHRfcmFuZ2UoCisgICAgQ2VhblJlYWRSYW5nZXMgKiByZWFkX3JuZywKKyAgICBpbnQ2NF90ICpvZmZzZXQKKykKK3sKKyAgICBpZiAoKytyZWFkX3JuZy0+Y3VycmVudF9udW1iZXIgPiByZWFkX3JuZy0+cmFuZ2VfbWF4X251bWJlcikgeworICAgICAgICByZWFkX3JuZy0+Y3VycmVudF9udW1iZXIgPSAwOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGludCByYW5rID0gMDsKKyAgICBpbnQgbnVtID0gcmVhZF9ybmctPmN1cnJlbnRfbnVtYmVyIC0gMTsKKyAgICBpbnQ2NF90IGN1cl9vZmZzZXQgPSAwOworICAgIGludCBudW1fbG9jOworICAgIGZvciAoOyByYW5rIDw9IHJlYWRfcm5nLT5sYXN0X25vbmNvbnRfaW5kOyByYW5rKyspIHsKKyAgICAgICAgbnVtX2xvYyA9IG51bSAvIHJlYWRfcm5nLT5EaW1bcmFua10uY291bnQ7CisgICAgICAgIGN1cl9vZmZzZXQgKz0gbnVtX2xvYyAqIHJlYWRfcm5nLT5EaW1bcmFua10uc2l6ZTsKKyAgICAgICAgbnVtID0gbnVtICUgcmVhZF9ybmctPkRpbVtyYW5rXS5jb3VudDsKKyAgICB9CisgICAgKm9mZnNldCA9IGN1cl9vZmZzZXQgKyByZWFkX3JuZy0+aW5pdF9vZmZzZXQ7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgaXNfYXJyX2Rlc2NfY29udGlndW91cyhjb25zdCBhcnJfZGVzYyAqYXApCit7CisgICAgaW50NjRfdCByYW5rID0gYXAtPnJhbmsgLSAxOworICAgIGludDY0X3QgbGVuZ3RoID0gYXAtPmRpbVtyYW5rXS5zaXplOworICAgIGZvciAoOyByYW5rID49IDA7IHJhbmstLSkgeworICAgICAgICBpZiAoYXAtPmRpbVtyYW5rXS5zdHJpZGUgPiAxICYmCisgICAgICAgICAgICBhcC0+ZGltW3JhbmtdLnVwcGVyIC0gYXAtPmRpbVtyYW5rXS5sb3dlciAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGxlbmd0aCAhPSBhcC0+ZGltW3JhbmtdLnNpemUpIHsKKyAgICAgICAgICAgIGZvciAoOyByYW5rID49IDA7IHJhbmstLSkgeworICAgICAgICAgICAgICAgIGlmIChhcC0+ZGltW3JhbmtdLnVwcGVyIC0gYXAtPmRpbVtyYW5rXS5sb3dlciAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBsZW5ndGggKj0gKGFwLT5kaW1bcmFua10udXBwZXIgLSBhcC0+ZGltW3JhbmtdLmxvd2VyICsgMSk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitpbnQ2NF90IGNlYW5fZ2V0X3RyYW5zZl9zaXplKENlYW5SZWFkUmFuZ2VzICogcmVhZF9ybmcpCit7CisgICAgcmV0dXJuKHJlYWRfcm5nLT5yYW5nZV9tYXhfbnVtYmVyICogcmVhZF9ybmctPnJhbmdlX3NpemUpOworfQorCitzdGF0aWMgdWludDY0X3QgbGFzdF9sZWZ0LCBsYXN0X3JpZ2h0OwordHlwZWRlZiB2b2lkICgqZnBwKShjb25zdCBjaGFyICpzcGFjZXMsIHVpbnQ2NF90IGxvdywgdWludDY0X3QgaGlnaCwgaW50IGVzaXplKTsKKworc3RhdGljIHZvaWQgZ2VuZXJhdGVfb25lX3JhbmdlKAorICAgIGNvbnN0IGNoYXIgKnNwYWNlcywKKyAgICB1aW50NjRfdCBscmFuZ2UsCisgICAgdWludDY0X3QgcnJhbmdlLAorICAgIGZwcCBmcCwKKyAgICBpbnQgZXNpemUKKykKK3sKKyAgICBPRkZMT0FEX1RSQUNFKDMsCisgICAgICAgICIlcyAgICBnZW5lcmF0ZV9vbmVfcmFuZ2UobHJhbmdlPSVwLCBycmFuZ2U9JXAsIGVzaXplPSVkKVxuIiwKKyAgICAgICAgc3BhY2VzLCAodm9pZCopbHJhbmdlLCAodm9pZCopcnJhbmdlLCBlc2l6ZSk7CisgICAgaWYgKGxhc3RfbGVmdCA9PSAtMSkgeworICAgICAgICAvLyBGaXJzdCByYW5nZQorICAgICAgICBsYXN0X2xlZnQgPSBscmFuZ2U7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAobHJhbmdlID09IGxhc3RfcmlnaHQrMSkgeworICAgICAgICAgICAgLy8gRXh0ZW5kIHByZXZpb3VzIHJhbmdlLCBkb24ndCBwcmludAorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgKCpmcCkoc3BhY2VzLCBsYXN0X2xlZnQsIGxhc3RfcmlnaHQsIGVzaXplKTsKKyAgICAgICAgICAgIGxhc3RfbGVmdCA9IGxyYW5nZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBsYXN0X3JpZ2h0ID0gcnJhbmdlOworfQorCitzdGF0aWMgdm9pZCBnZW5lcmF0ZV9tZW1fcmFuZ2VzX29uZV9yYW5rKAorICAgIGNvbnN0IGNoYXIgKnNwYWNlcywKKyAgICB1aW50NjRfdCBiYXNlLAorICAgIHVpbnQ2NF90IHJhbmssCisgICAgY29uc3Qgc3RydWN0IGRpbV9kZXNjICpkZHAsCisgICAgZnBwIGZwLAorICAgIGludCBlc2l6ZQorKQoreworICAgIHVpbnQ2NF90IGxpbmRleCA9IGRkcC0+bGluZGV4OworICAgIHVpbnQ2NF90IGxvd2VyID0gZGRwLT5sb3dlcjsKKyAgICB1aW50NjRfdCB1cHBlciA9IGRkcC0+dXBwZXI7CisgICAgdWludDY0X3Qgc3RyaWRlID0gZGRwLT5zdHJpZGU7CisgICAgdWludDY0X3Qgc2l6ZSA9IGRkcC0+c2l6ZTsKKyAgICBPRkZMT0FEX1RSQUNFKDMsCisgICAgICAgICIlcyAgICAiCisgICAgICAgICJnZW5lcmF0ZV9tZW1fcmFuZ2VzX29uZV9yYW5rKGJhc2U9JXAsIHJhbms9JWxsZCwgbGluZGV4PSVsbGQsICIKKyAgICAgICAgImxvd2VyPSVsbGQsIHVwcGVyPSVsbGQsIHN0cmlkZT0lbGxkLCBzaXplPSVsbGQsIGVzaXplPSVkKVxuIiwKKyAgICAgICAgc3BhY2VzLCAodm9pZCopYmFzZSwgcmFuaywgbGluZGV4LCBsb3dlciwgdXBwZXIsIHN0cmlkZSwgc2l6ZSwgZXNpemUpOworICAgIGlmIChyYW5rID09IDEpIHsKKyAgICAgICAgdWludDY0X3QgbHJhbmdlLCBycmFuZ2U7CisgICAgICAgIGlmIChzdHJpZGUgPT0gMSkgeworICAgICAgICAgICAgbHJhbmdlID0gYmFzZSArIChsb3dlci1saW5kZXgpKnNpemU7CisgICAgICAgICAgICBycmFuZ2UgPSBscmFuZ2UgKyAodXBwZXItbG93ZXIrMSkqc2l6ZSAtIDE7CisgICAgICAgICAgICBnZW5lcmF0ZV9vbmVfcmFuZ2Uoc3BhY2VzLCBscmFuZ2UsIHJyYW5nZSwgZnAsIGVzaXplKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9bG93ZXItbGluZGV4OyBpPD11cHBlci1saW5kZXg7IGkrPXN0cmlkZSkgeworICAgICAgICAgICAgICAgIGxyYW5nZSA9IGJhc2UgKyBpKnNpemU7CisgICAgICAgICAgICAgICAgcnJhbmdlID0gbHJhbmdlICsgc2l6ZSAtIDE7CisgICAgICAgICAgICAgICAgZ2VuZXJhdGVfb25lX3JhbmdlKHNwYWNlcywgbHJhbmdlLCBycmFuZ2UsIGZwLCBlc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGZvciAoaW50IGk9bG93ZXItbGluZGV4OyBpPD11cHBlci1saW5kZXg7IGkrPXN0cmlkZSkgeworICAgICAgICAgICAgZ2VuZXJhdGVfbWVtX3Jhbmdlc19vbmVfcmFuaygKKyAgICAgICAgICAgICAgICBzcGFjZXMsIGJhc2UraSpzaXplLCByYW5rLTEsIGRkcCsxLCBmcCwgZXNpemUpOworCisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGdlbmVyYXRlX21lbV9yYW5nZXMoCisgICAgY29uc3QgY2hhciAqc3BhY2VzLAorICAgIGNvbnN0IGFycl9kZXNjICphZHAsCisgICAgYm9vbCBkZXJlZiwKKyAgICBmcHAgZnAKKykKK3sKKyAgICB1aW50NjRfdCBlc2l6ZTsKKworICAgIE9GRkxPQURfVFJBQ0UoMywKKyAgICAgICAgIiVzICAgICIKKyAgICAgICAgImdlbmVyYXRlX21lbV9yYW5nZXMoYWRwPSVwLCBkZXJlZj0lZCwgZnApXG4iLAorICAgICAgICBzcGFjZXMsIGFkcCwgZGVyZWYpOworICAgIGxhc3RfbGVmdCA9IC0xOworICAgIGxhc3RfcmlnaHQgPSAtMjsKKworICAgIC8vIEVsZW1lbnQgc2l6ZSBpcyBkZXJpdmVkIGZyb20gbGFzdCBkaW1lbnNpb24KKyAgICBlc2l6ZSA9IGFkcC0+ZGltW2FkcC0+cmFuay0xXS5zaXplOworCisgICAgZ2VuZXJhdGVfbWVtX3Jhbmdlc19vbmVfcmFuaygKKyAgICAgICAgLy8gRm9yIGNfY2Vhbl92YXIgdGhlIGJhc2UgYWRkciBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgZGF0YQorICAgICAgICAvLyBGb3IgY19jZWFuX3Zhcl9wdHIgdGhlIGJhc2UgYWRkciBpcyBkZXJlZmVyZW5jZWQgdG8gZ2V0IHRvIHRoZSBkYXRhCisgICAgICAgIHNwYWNlcywgZGVyZWYgPyAqKCh1aW50NjRfdCopKGFkcC0+YmFzZSkpIDogYWRwLT5iYXNlLAorICAgICAgICBhZHAtPnJhbmssICZhZHAtPmRpbVswXSwgZnAsIGVzaXplKTsKKyAgICAoKmZwKShzcGFjZXMsIGxhc3RfbGVmdCwgbGFzdF9yaWdodCwgZXNpemUpOworfQorCisvLyByZXR1cm5zIG9mZnNldCBhbmQgbGVuZ3RoIG9mIHRoZSBkYXRhIHRvIGJlIHRyYW5zZmVycmVkCit2b2lkIF9fYXJyX2RhdGFfb2Zmc2V0X2FuZF9sZW5ndGgoCisgICAgY29uc3QgYXJyX2Rlc2MgKmFkcCwKKyAgICBpbnQ2NF90ICZvZmZzZXQsCisgICAgaW50NjRfdCAmbGVuZ3RoCispCit7CisgICAgaW50NjRfdCByYW5rID0gYWRwLT5yYW5rIC0gMTsKKyAgICBpbnQ2NF90IHNpemUgPSBhZHAtPmRpbVtyYW5rXS5zaXplOworICAgIGludDY0X3Qgcl9vZmYgPSAwOyAvLyBvZmZzZXQgZnJvbSByaWdodCBib3VuZGFyeQorCisgICAgLy8gZmluZCB0aGUgcmlnaHRtb3N0IGRpbWVuc2lvbiB3aGljaCB0YWtlcyBqdXN0IHBhcnQgb2YgaXRzCisgICAgLy8gcmFuZ2UuIFdlIGRlZmluZSBpdCBpZiB0aGUgc2l6ZSBvZiBsZWZ0IHJhbmsgaXMgbm90IGVxdWFsCisgICAgLy8gdGhlIHJhbmdlJ3MgbGVuZ3RoIGJldHdlZW4gdXBwZXIgYW5kIGxvd2VyIGJvdW5nYXJpZXMKKyAgICB3aGlsZSAocmFuayA+IDApIHsKKyAgICAgICAgc2l6ZSAqPSAoYWRwLT5kaW1bcmFua10udXBwZXIgLSBhZHAtPmRpbVtyYW5rXS5sb3dlciArIDEpOworICAgICAgICBpZiAoc2l6ZSAhPSBhZHAtPmRpbVtyYW5rIC0gMV0uc2l6ZSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmFuay0tOworICAgIH0KKworICAgIG9mZnNldCA9IChhZHAtPmRpbVtyYW5rXS5sb3dlciAtIGFkcC0+ZGltW3JhbmtdLmxpbmRleCkgKgorICAgICAgICAgICAgIGFkcC0+ZGltW3JhbmtdLnNpemU7CisKKyAgICAvLyBmaW5kIGdhcHMgYm90aCBmcm9tIHRoZSBsZWZ0IC0gb2Zmc2V0IGFuZCBmcm9tIHRoZSByaWdodCAtIHJfb2ZmCisgICAgZm9yIChyYW5rLS07IHJhbmsgPj0gMDsgcmFuay0tKSB7CisgICAgICAgIG9mZnNldCArPSAoYWRwLT5kaW1bcmFua10ubG93ZXIgLSBhZHAtPmRpbVtyYW5rXS5saW5kZXgpICoKKyAgICAgICAgICAgICAgICAgIGFkcC0+ZGltW3JhbmtdLnNpemU7CisgICAgICAgIHJfb2ZmICs9IGFkcC0+ZGltW3JhbmtdLnNpemUgLQorICAgICAgICAgICAgICAgICAoYWRwLT5kaW1bcmFuayArIDFdLnVwcGVyIC0gYWRwLT5kaW1bcmFuayArIDFdLmxpbmRleCArIDEpICoKKyAgICAgICAgICAgICAgICAgYWRwLT5kaW1bcmFuayArIDFdLnNpemU7CisgICAgfQorICAgIGxlbmd0aCA9IChhZHAtPmRpbVswXS51cHBlciAtIGFkcC0+ZGltWzBdLmxpbmRleCArIDEpICoKKyAgICAgICAgICAgICBhZHAtPmRpbVswXS5zaXplIC0gb2Zmc2V0IC0gcl9vZmY7Cit9CisKKyNpZiBPRkZMT0FEX0RFQlVHID4gMAorCit2b2lkIHByaW50X3JhbmdlKAorICAgIGNvbnN0IGNoYXIgKnNwYWNlcywKKyAgICB1aW50NjRfdCBsb3csCisgICAgdWludDY0X3QgaGlnaCwKKyAgICBpbnQgZXNpemUKKykKK3sKKyAgICBjaGFyIGJ1ZmZlclsxMDI0XTsKKyAgICBjaGFyIG51bWJlclszMl07CisKKyAgICBPRkZMT0FEX1RSQUNFKDMsICIlcyAgICAgICAgcHJpbnRfcmFuZ2UobG93PSVwLCBoaWdoPSVwLCBlc2l6ZT0lZClcbiIsCisgICAgICAgIHNwYWNlcywgKHZvaWQqKWxvdywgKHZvaWQqKWhpZ2gsIGVzaXplKTsKKworICAgIGlmIChjb25zb2xlX2VuYWJsZWQgPCA0KSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgT0ZGTE9BRF9UUkFDRSg0LCAiJXMgICAgICAgICAgICB2YWx1ZXM6XG4iLCBzcGFjZXMpOworICAgIGludCBjb3VudCA9IDA7CisgICAgYnVmZmVyWzBdID0gJ1wwJzsKKyAgICB3aGlsZSAobG93IDw9IGhpZ2gpCisgICAgeworICAgICAgICBzd2l0Y2ggKGVzaXplKQorICAgICAgICB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHNwcmludGYobnVtYmVyLCAiJWQgIiwgKigoY2hhciAqKWxvdykpOworICAgICAgICAgICAgbG93ICs9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgc3ByaW50ZihudW1iZXIsICIlZCAiLCAqKChzaG9ydCAqKWxvdykpOworICAgICAgICAgICAgbG93ICs9IDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgc3ByaW50ZihudW1iZXIsICIlZCAiLCAqKChpbnQgKilsb3cpKTsKKyAgICAgICAgICAgIGxvdyArPSA0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBzcHJpbnRmKG51bWJlciwgIjB4JTAxNnggIiwgKigodWludDY0X3QgKilsb3cpKTsKKyAgICAgICAgICAgIGxvdyArPSA4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3RyY2F0KGJ1ZmZlciwgbnVtYmVyKTsKKyAgICAgICAgY291bnQrKzsKKyAgICAgICAgaWYgKGNvdW50ID09IDEwKSB7CisgICAgICAgICAgICBPRkZMT0FEX1RSQUNFKDQsICIlcyAgICAgICAgICAgICVzXG4iLCBzcGFjZXMsIGJ1ZmZlcik7CisgICAgICAgICAgICBjb3VudCA9IDA7CisgICAgICAgICAgICBidWZmZXJbMF0gPSAnXDAnOworICAgICAgICB9CisgICAgfQorICAgIGlmIChjb3VudCAhPSAwKSB7CisgICAgICAgIE9GRkxPQURfVFJBQ0UoNCwgIiVzICAgICAgICAgICAgJXNcbiIsIHNwYWNlcywgYnVmZmVyKTsKKyAgICB9Cit9CisKK3ZvaWQgX19hcnJfZGVzY19kdW1wKAorICAgIGNvbnN0IGNoYXIgKnNwYWNlcywKKyAgICBjb25zdCBjaGFyICpuYW1lLAorICAgIGNvbnN0IGFycl9kZXNjICphZHAsCisgICAgYm9vbCBkZXJlZgorKQoreworICAgIE9GRkxPQURfVFJBQ0UoMiwgIiVzJXMgQ0VBTiBleHByZXNzaW9uICVwXG4iLCBzcGFjZXMsIG5hbWUsIGFkcCk7CisKKyAgICBpZiAoYWRwICE9IDApIHsKKyAgICAgICAgT0ZGTE9BRF9UUkFDRSgyLCAiJXMgICAgYmFzZT0lbGx4LCByYW5rPSVsbGRcbiIsCisgICAgICAgICAgICBzcGFjZXMsIGFkcC0+YmFzZSwgYWRwLT5yYW5rKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFkcC0+cmFuazsgaSsrKSB7CisgICAgICAgICAgICBPRkZMT0FEX1RSQUNFKDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyAgICBkaW1lbnNpb24gJWQ6IHNpemU9JWxsZCwgbGluZGV4PSVsbGQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImxvd2VyPSVsbGQsIHVwcGVyPSVsbGQsIHN0cmlkZT0lbGxkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZXMsIGksIGFkcC0+ZGltW2ldLnNpemUsIGFkcC0+ZGltW2ldLmxpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWRwLT5kaW1baV0ubG93ZXIsIGFkcC0+ZGltW2ldLnVwcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhZHAtPmRpbVtpXS5zdHJpZGUpOworICAgICAgICB9CisgICAgICAgIC8vIEZvciBjX2NlYW5fdmFyIHRoZSBiYXNlIGFkZHIgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGRhdGEKKyAgICAgICAgLy8gRm9yIGNfY2Vhbl92YXJfcHRyIHRoZSBiYXNlIGFkZHIgaXMgZGVyZWZlcmVuY2VkIHRvIGdldCB0byB0aGUgZGF0YQorICAgICAgICBnZW5lcmF0ZV9tZW1fcmFuZ2VzKHNwYWNlcywgYWRwLCBkZXJlZiwgJnByaW50X3JhbmdlKTsKKyAgICB9Cit9CisjZW5kaWYgLy8gT0ZGTE9BRF9ERUJVRwpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvY2Vhbl91dGlsLmggYi9maW5hbC9vZmZsb2FkL3NyYy9jZWFuX3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWIxZjUzCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvY2Vhbl91dGlsLmgKQEAgLTAsMCArMSw5NiBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIENFQU5fVVRJTF9IX0lOQ0xVREVECisjZGVmaW5lIENFQU5fVVRJTF9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLy8gQ0VBTiBleHByZXNzaW9uIHJlcHJlc2VudGF0aW9uCitzdHJ1Y3QgZGltX2Rlc2MgeworICAgIGludDY0X3Qgc2l6ZTsgICAgICAgLy8gTGVuZ3RoIG9mIGRhdGEgdHlwZQorICAgIGludDY0X3QgbGluZGV4OyAgICAgLy8gTG93ZXIgaW5kZXgKKyAgICBpbnQ2NF90IGxvd2VyOyAgICAgIC8vIExvd2VyIHNlY3Rpb24gYm91bmQKKyAgICBpbnQ2NF90IHVwcGVyOyAgICAgIC8vIFVwcGVyIHNlY3Rpb24gYm91bmQKKyAgICBpbnQ2NF90IHN0cmlkZTsgICAgIC8vIFN0cmlkZQorfTsKKworc3RydWN0IGFycl9kZXNjIHsKKyAgICBpbnQ2NF90IGJhc2U7ICAgICAgIC8vIEJhc2UgYWRkcmVzcworICAgIGludDY0X3QgcmFuazsgICAgICAgLy8gUmFuayBvZiBhcnJheQorICAgIGRpbV9kZXNjIGRpbVsxXTsKK307CisKK3N0cnVjdCBDZWFuUmVhZERpbSB7CisgICAgaW50NjRfdCBjb3VudDsgLy8gVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIGRpbWVuc2lvbgorICAgIGludDY0X3Qgc2l6ZTsgIC8vIFRoZSBudW1iZXIgb2YgYnl0ZXMgYmV0d2VlbiBzdWNjZXNzaXZlCisgICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudHMgaW4gdGhpcyBkaW1lbnNpb24uCit9OworCitzdHJ1Y3QgQ2VhblJlYWRSYW5nZXMgeworICAgIHZvaWQgKiAgcHRyOworICAgIGludDY0X3QgY3VycmVudF9udW1iZXI7ICAgLy8gdGhlIG51bWJlciBvZiByYW5nZXMgcmVhZAorICAgIGludDY0X3QgcmFuZ2VfbWF4X251bWJlcjsgLy8gbnVtYmVyIG9mIGNvbnRpZ3VvdXMgcmFuZ2VzCisgICAgaW50NjRfdCByYW5nZV9zaXplOyAgICAgICAvLyBzaXplIG9mIG1heCBjb250aWd1b3VzIHJhbmdlCisgICAgaW50ICAgICBsYXN0X25vbmNvbnRfaW5kOyAvLyBzaXplIG9mIERpbSBhcnJheQorICAgIGludDY0X3QgaW5pdF9vZmZzZXQ7ICAgICAgLy8gb2Zmc2V0IG9mIDEtc3QgZWxlbWVudCBmcm9tIGFycmF5IGxlZnQgYm91bmQKKyAgICBDZWFuUmVhZERpbSBEaW1bMV07Cit9OworCisvLyBhcnJheSBkZXNjcmlwdG9yIGxlbmd0aAorI2RlZmluZSBfX2Fycl9kZXNjX2xlbmd0aChyYW5rKSBcCisgICAgKHNpemVvZihpbnQ2NF90KSArIHNpemVvZihkaW1fZGVzYykgKiAocmFuaykpCisKKy8vIHJldHVybnMgb2Zmc2V0IGFuZCBsZW5ndGggb2YgdGhlIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQKK3ZvaWQgX19hcnJfZGF0YV9vZmZzZXRfYW5kX2xlbmd0aChjb25zdCBhcnJfZGVzYyAqYWRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgJm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICZsZW5ndGgpOworCisvLyBkZWZpbmUgaWYgZGF0YSBhcnJheSBkZXNjcmliZWQgYnkgYXJndW1lbnQgaXMgY29udGlndW91cyBvbmUKK2Jvb2wgaXNfYXJyX2Rlc2NfY29udGlndW91cyhjb25zdCBhcnJfZGVzYyAqYXApOworCisvLyBhbGxvY2F0ZSBlbGVtZW50IG9mIENlYW5SZWFkUmFuZ2VzIHR5cGUgaW5pdGlhbGl6ZWQKKy8vIHRvIHJlYWQgY29uc2VxdWVudGx5IGNvbnRpZ3VvdXMgcmFuZ2VzIGRlc2NyaWJlZCBieSAiYXAiIGFyZ3VtZW50CitDZWFuUmVhZFJhbmdlcyAqIGluaXRfcmVhZF9yYW5nZXNfYXJyX2Rlc2MoY29uc3QgYXJyX2Rlc2MgKmFwKTsKKworLy8gY2hlY2sgaWYgcmFuZ2VzIGRlc2NyaWJlZCBieSAxIGFyZ3VtZW50IGNvdWxkIGJlIHRyYW5zZmVycmVkIGludG8gcmFuZ2VzCisvLyBkZXNjcmliZWQgYnkgMi1uZCBvbmUKK2Jvb2wgY2Vhbl9yYW5nZXNfbWF0Y2goCisgICAgQ2VhblJlYWRSYW5nZXMgKiByZWFkX3JuZzEsCisgICAgQ2VhblJlYWRSYW5nZXMgKiByZWFkX3JuZzIKKyk7CisKKy8vIGZpcnN0IGFyZ3VtZW50IC0gcmV0dXJuZWQgdmFsdWUgYnkgY2FsbCB0byBpbml0X3JlYWRfcmFuZ2VzX2Fycl9kZXNjLgorLy8gcmV0dXJucyB0cnVlIGlmIG9mZnNldCBhbmQgbGVuZ3RoIG9mIG5leHQgcmFuZ2UgaXMgc2V0IHN1Y2Nlc3NmdWx5LgorLy8gcmV0dXJucyBmYWxzZSBpZiB0aGUgcmFuZ2VzIGlzIG92ZXIuCitib29sIGdldF9uZXh0X3JhbmdlKAorICAgIENlYW5SZWFkUmFuZ2VzICogcmVhZF9ybmcsCisgICAgaW50NjRfdCAqb2Zmc2V0CispOworCisvLyByZXR1cm5zIG51bWJlciBvZiB0cmFuc2ZlcnJlZCBieXRlcworaW50NjRfdCBjZWFuX2dldF90cmFuc2Zfc2l6ZShDZWFuUmVhZFJhbmdlcyAqIHJlYWRfcm5nKTsKKworI2lmIE9GRkxPQURfREVCVUcgPiAwCisvLyBwcmludHMgYXJyYXkgZGVzY3JpcHRvciBjb250ZW50cyB0byBzdGRlcnIKK3ZvaWQgICAgX19hcnJfZGVzY19kdW1wKAorICAgIGNvbnN0IGNoYXIgKnNwYWNlcywKKyAgICBjb25zdCBjaGFyICpuYW1lLAorICAgIGNvbnN0IGFycl9kZXNjICphZHAsCisgICAgYm9vbCBkZXJlZmVyZW5jZSk7CisjZWxzZQorI2RlZmluZSBfX2Fycl9kZXNjX2R1bXAoCisgICAgc3BhY2VzLAorICAgIG5hbWUsCisgICAgYWRwLAorICAgIGRlcmVmZXJlbmNlKQorI2VuZGlmIC8vIE9GRkxPQURfREVCVUcKKworI2VuZGlmIC8vIENFQU5fVVRJTF9IX0lOQ0xVREVECmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9jb2kvY29pX2NsaWVudC5jcHAgYi9maW5hbC9vZmZsb2FkL3NyYy9jb2kvY29pX2NsaWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI4YzdmNQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL2NvaS9jb2lfY2xpZW50LmNwcApAQCAtMCwwICsxLDM1MCBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvLyBUaGUgQ09JIGhvc3QgaW50ZXJmYWNlCisKKyNpbmNsdWRlICJjb2lfY2xpZW50LmgiCisjaW5jbHVkZSAiLi4vb2ZmbG9hZF9jb21tb24uaCIKKworbmFtZXNwYWNlIENPSSB7CisKKyNkZWZpbmUgQ09JX1ZFUlNJT04xICAgICJDT0lfMS4wIgorI2RlZmluZSBDT0lfVkVSU0lPTjIgICAgIkNPSV8yLjAiCisKK2Jvb2wgICAgICAgICAgICBpc19hdmFpbGFibGU7CitzdGF0aWMgdm9pZCogICAgbGliX2hhbmRsZTsKKworLy8gcG9pbnRlcnMgdG8gZnVuY3Rpb25zIGZyb20gQ09JIGxpYnJhcnkKK0NPSVJFU1VMVCAoKkVuZ2luZUdldENvdW50KShDT0lfSVNBX1RZUEUsIHVpbnQzMl90Kik7CitDT0lSRVNVTFQgKCpFbmdpbmVHZXRIYW5kbGUpKENPSV9JU0FfVFlQRSwgdWludDMyX3QsIENPSUVOR0lORSopOworCitDT0lSRVNVTFQgKCpQcm9jZXNzQ3JlYXRlRnJvbU1lbW9yeSkoQ09JRU5HSU5FLCBjb25zdCBjaGFyKiwgY29uc3Qgdm9pZCosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QsIGludCwgY29uc3QgY2hhcioqLCB1aW50OF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqKiwgdWludDhfdCwgY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCwgQ09JUFJPQ0VTUyopOworQ09JUkVTVUxUICgqUHJvY2Vzc0Rlc3Ryb3kpKENPSVBST0NFU1MsIGludDMyX3QsIHVpbnQ4X3QsIGludDhfdCosIHVpbnQzMl90Kik7CitDT0lSRVNVTFQgKCpQcm9jZXNzR2V0RnVuY3Rpb25IYW5kbGVzKShDT0lQUk9DRVNTLCB1aW50MzJfdCwgY29uc3QgY2hhcioqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JRlVOQ1RJT04qKTsKK0NPSVJFU1VMVCAoKlByb2Nlc3NMb2FkTGlicmFyeUZyb21NZW1vcnkpKENPSVBST0NFU1MsIGNvbnN0IHZvaWQqLCB1aW50NjRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqLCB1aW50NjRfdCwgdWludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lMSUJSQVJZKik7CitDT0lSRVNVTFQgKCpQcm9jZXNzUmVnaXN0ZXJMaWJyYXJpZXMpKHVpbnQzMl90LCBjb25zdCB2b2lkKiosIGNvbnN0IHVpbnQ2NF90KiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcioqLCBjb25zdCB1aW50NjRfdCopOworCitDT0lSRVNVTFQgKCpQaXBlbGluZUNyZWF0ZSkoQ09JUFJPQ0VTUywgQ09JX0NQVV9NQVNLLCB1aW50MzJfdCwgQ09JUElQRUxJTkUqKTsKK0NPSVJFU1VMVCAoKlBpcGVsaW5lRGVzdHJveSkoQ09JUElQRUxJTkUpOworQ09JUkVTVUxUICgqUGlwZWxpbmVSdW5GdW5jdGlvbikoQ09JUElQRUxJTkUsIENPSUZVTkNUSU9OLCB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENPSUJVRkZFUiosIGNvbnN0IENPSV9BQ0NFU1NfRkxBR1MqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QsIGNvbnN0IENPSUVWRU5UKiwgY29uc3Qgdm9pZCosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCwgdm9pZCosIHVpbnQxNl90LCBDT0lFVkVOVCopOworCitDT0lSRVNVTFQgKCpCdWZmZXJDcmVhdGUpKHVpbnQ2NF90LCBDT0lfQlVGRkVSX1RZUEUsIHVpbnQzMl90LCBjb25zdCB2b2lkKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QsIGNvbnN0IENPSVBST0NFU1MqLCBDT0lCVUZGRVIqKTsKK0NPSVJFU1VMVCAoKkJ1ZmZlckNyZWF0ZUZyb21NZW1vcnkpKHVpbnQ2NF90LCBDT0lfQlVGRkVSX1RZUEUsIHVpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCosIHVpbnQzMl90LCBjb25zdCBDT0lQUk9DRVNTKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSUJVRkZFUiopOworQ09JUkVTVUxUICgqQnVmZmVyRGVzdHJveSkoQ09JQlVGRkVSKTsKK0NPSVJFU1VMVCAoKkJ1ZmZlck1hcCkoQ09JQlVGRkVSLCB1aW50NjRfdCwgdWludDY0X3QsIENPSV9NQVBfVFlQRSwgdWludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENPSUVWRU5UKiwgQ09JRVZFTlQqLCBDT0lNQVBJTlNUQU5DRSosIHZvaWQqKik7CitDT0lSRVNVTFQgKCpCdWZmZXJVbm1hcCkoQ09JTUFQSU5TVEFOQ0UsIHVpbnQzMl90LCBjb25zdCBDT0lFVkVOVCosIENPSUVWRU5UKik7CitDT0lSRVNVTFQgKCpCdWZmZXJXcml0ZSkoQ09JQlVGRkVSLCB1aW50NjRfdCwgY29uc3Qgdm9pZCosIHVpbnQ2NF90LAorICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9DT1BZX1RZUEUsIHVpbnQzMl90LCBjb25zdCBDT0lFVkVOVCosIENPSUVWRU5UKik7CitDT0lSRVNVTFQgKCpCdWZmZXJSZWFkKShDT0lCVUZGRVIsIHVpbnQ2NF90LCB2b2lkKiwgdWludDY0X3QsIENPSV9DT1BZX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCwgY29uc3QgQ09JRVZFTlQqLCBDT0lFVkVOVCopOworQ09JUkVTVUxUICgqQnVmZmVyQ29weSkoQ09JQlVGRkVSLCBDT0lCVUZGRVIsIHVpbnQ2NF90LCB1aW50NjRfdCwgdWludDY0X3QsCisgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQ09QWV9UWVBFLCB1aW50MzJfdCwgY29uc3QgQ09JRVZFTlQqLCBDT0lFVkVOVCopOworQ09JUkVTVUxUICgqQnVmZmVyR2V0U2lua0FkZHJlc3MpKENPSUJVRkZFUiwgdWludDY0X3QqKTsKK0NPSVJFU1VMVCAoKkJ1ZmZlclNldFN0YXRlKShDT0lCVUZGRVIsIENPSVBST0NFU1MsIENPSV9CVUZGRVJfU1RBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0JVRkZFUl9NT1ZFX0ZMQUcsIHVpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgQ09JRVZFTlQqLCBDT0lFVkVOVCopOworCitDT0lSRVNVTFQgKCpFdmVudFdhaXQpKHVpbnQxNl90LCBjb25zdCBDT0lFVkVOVCosIGludDMyX3QsIHVpbnQ4X3QsIHVpbnQzMl90KiwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqKTsKKwordWludDY0X3QgICgqUGVyZkdldEN5Y2xlRnJlcXVlbmN5KSh2b2lkKTsKKworYm9vbCBpbml0KHZvaWQpCit7CisjaWZuZGVmIFRBUkdFVF9XSU5OVAorICAgIGNvbnN0IGNoYXIgKmxpYl9uYW1lID0gImxpYmNvaV9ob3N0LnNvLjAiOworI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCisgICAgY29uc3QgY2hhciAqbGliX25hbWUgPSAiY29pX2hvc3QuZGxsIjsKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkxvYWRpbmcgQ09JIGxpYnJhcnkgJXMgLi4uXG4iLCBsaWJfbmFtZSk7CisgICAgbGliX2hhbmRsZSA9IERMX29wZW4obGliX25hbWUpOworICAgIGlmIChsaWJfaGFuZGxlID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGxvYWQgdGhlIGxpYnJhcnlcbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgRW5naW5lR2V0Q291bnQgPQorICAgICAgICAoQ09JUkVTVUxUICgqKShDT0lfSVNBX1RZUEUsIHVpbnQzMl90KikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSUVuZ2luZUdldENvdW50IiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoRW5naW5lR2V0Q291bnQgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBDT0kgbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09JRW5naW5lR2V0Q291bnQiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgRW5naW5lR2V0SGFuZGxlID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikoQ09JX0lTQV9UWVBFLCB1aW50MzJfdCwgQ09JRU5HSU5FKikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSUVuZ2luZUdldEhhbmRsZSIsIENPSV9WRVJTSU9OMSk7CisgICAgaWYgKEVuZ2luZUdldEhhbmRsZSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lFbmdpbmVHZXRIYW5kbGUiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgUHJvY2Vzc0NyZWF0ZUZyb21NZW1vcnkgPQorICAgICAgICAoQ09JUkVTVUxUICgqKShDT0lFTkdJTkUsIGNvbnN0IGNoYXIqLCBjb25zdCB2b2lkKiwgdWludDY0X3QsIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcioqLCB1aW50OF90LCBjb25zdCBjaGFyKiosIHVpbnQ4X3QsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqLCB1aW50NjRfdCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCwgQ09JUFJPQ0VTUyopKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lQcm9jZXNzQ3JlYXRlRnJvbU1lbW9yeSIsIENPSV9WRVJTSU9OMSk7CisgICAgaWYgKFByb2Nlc3NDcmVhdGVGcm9tTWVtb3J5ID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSVByb2Nlc3NDcmVhdGVGcm9tTWVtb3J5Iik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFByb2Nlc3NEZXN0cm95ID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikoQ09JUFJPQ0VTUywgaW50MzJfdCwgdWludDhfdCwgaW50OF90KiwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqKSkKKyAgICAgICAgICAgIERMX3N5bShsaWJfaGFuZGxlLCAiQ09JUHJvY2Vzc0Rlc3Ryb3kiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChQcm9jZXNzRGVzdHJveSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lQcm9jZXNzRGVzdHJveSIpOworICAgICAgICBmaW5pKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBQcm9jZXNzR2V0RnVuY3Rpb25IYW5kbGVzID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikoQ09JUFJPQ0VTUywgdWludDMyX3QsIGNvbnN0IGNoYXIqKiwgQ09JRlVOQ1RJT04qKSkKKyAgICAgICAgICAgIERMX3N5bShsaWJfaGFuZGxlLCAiQ09JUHJvY2Vzc0dldEZ1bmN0aW9uSGFuZGxlcyIsIENPSV9WRVJTSU9OMSk7CisgICAgaWYgKFByb2Nlc3NHZXRGdW5jdGlvbkhhbmRsZXMgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBDT0kgbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09JUHJvY2Vzc0dldEZ1bmN0aW9uSGFuZGxlcyIpOworICAgICAgICBmaW5pKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBQcm9jZXNzTG9hZExpYnJhcnlGcm9tTWVtb3J5ID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikoQ09JUFJPQ0VTUywgY29uc3Qgdm9pZCosIHVpbnQ2NF90LCBjb25zdCBjaGFyKiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCB1aW50NjRfdCwgdWludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgIENPSUxJQlJBUlkqKSkKKyAgICAgICAgICAgIERMX3N5bShsaWJfaGFuZGxlLCAiQ09JUHJvY2Vzc0xvYWRMaWJyYXJ5RnJvbU1lbW9yeSIsIENPSV9WRVJTSU9OMik7CisgICAgaWYgKFByb2Nlc3NMb2FkTGlicmFyeUZyb21NZW1vcnkgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBDT0kgbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09JUHJvY2Vzc0xvYWRMaWJyYXJ5RnJvbU1lbW9yeSIpOworICAgICAgICBmaW5pKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBQcm9jZXNzUmVnaXN0ZXJMaWJyYXJpZXMgPQorICAgICAgICAoQ09JUkVTVUxUICgqKSh1aW50MzJfdCwgY29uc3Qgdm9pZCoqLCBjb25zdCB1aW50NjRfdCosIGNvbnN0IGNoYXIqKiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDY0X3QqKSkKKyAgICAgICAgICAgIERMX3N5bShsaWJfaGFuZGxlLCAiQ09JUHJvY2Vzc1JlZ2lzdGVyTGlicmFyaWVzIiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoUHJvY2Vzc1JlZ2lzdGVyTGlicmFyaWVzID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSVByb2Nlc3NSZWdpc3RlckxpYnJhcmllcyIpOworICAgICAgICBmaW5pKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBQaXBlbGluZUNyZWF0ZSA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKENPSVBST0NFU1MsIENPSV9DUFVfTUFTSywgdWludDMyX3QsIENPSVBJUEVMSU5FKikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSVBpcGVsaW5lQ3JlYXRlIiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoUGlwZWxpbmVDcmVhdGUgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBDT0kgbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09JUGlwZWxpbmVDcmVhdGUiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgUGlwZWxpbmVEZXN0cm95ID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikoQ09JUElQRUxJTkUpKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lQaXBlbGluZURlc3Ryb3kiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChQaXBlbGluZURlc3Ryb3kgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBDT0kgbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09JUGlwZWxpbmVEZXN0cm95Iik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFBpcGVsaW5lUnVuRnVuY3Rpb24gPQorICAgICAgICAoQ09JUkVTVUxUICgqKShDT0lQSVBFTElORSwgQ09JRlVOQ1RJT04sIHVpbnQzMl90LCBjb25zdCBDT0lCVUZGRVIqLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDT0lfQUNDRVNTX0ZMQUdTKiwgdWludDMyX3QsIGNvbnN0IENPSUVWRU5UKiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCosIHVpbnQxNl90LCB2b2lkKiwgdWludDE2X3QsIENPSUVWRU5UKikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSVBpcGVsaW5lUnVuRnVuY3Rpb24iLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChQaXBlbGluZVJ1bkZ1bmN0aW9uID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSVBpcGVsaW5lUnVuRnVuY3Rpb24iKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQnVmZmVyQ3JlYXRlID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikodWludDY0X3QsIENPSV9CVUZGRVJfVFlQRSwgdWludDMyX3QsIGNvbnN0IHZvaWQqLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCwgY29uc3QgQ09JUFJPQ0VTUyosIENPSUJVRkZFUiopKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lCdWZmZXJDcmVhdGUiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChCdWZmZXJDcmVhdGUgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBDT0kgbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09JQnVmZmVyQ3JlYXRlIik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEJ1ZmZlckNyZWF0ZUZyb21NZW1vcnkgPQorICAgICAgICAoQ09JUkVTVUxUICgqKSh1aW50NjRfdCwgQ09JX0JVRkZFUl9UWVBFLCB1aW50MzJfdCwgdm9pZCosCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90LCBjb25zdCBDT0lQUk9DRVNTKiwgQ09JQlVGRkVSKikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSUJ1ZmZlckNyZWF0ZUZyb21NZW1vcnkiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChCdWZmZXJDcmVhdGVGcm9tTWVtb3J5ID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSUJ1ZmZlckNyZWF0ZUZyb21NZW1vcnkiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQnVmZmVyRGVzdHJveSA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKENPSUJVRkZFUikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSUJ1ZmZlckRlc3Ryb3kiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChCdWZmZXJEZXN0cm95ID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSUJ1ZmZlckRlc3Ryb3kiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQnVmZmVyTWFwID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikoQ09JQlVGRkVSLCB1aW50NjRfdCwgdWludDY0X3QsIENPSV9NQVBfVFlQRSwgdWludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENPSUVWRU5UKiwgQ09JRVZFTlQqLCBDT0lNQVBJTlNUQU5DRSosCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSUJ1ZmZlck1hcCIsIENPSV9WRVJTSU9OMSk7CisgICAgaWYgKEJ1ZmZlck1hcCA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lCdWZmZXJNYXAiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQnVmZmVyVW5tYXAgPQorICAgICAgICAoQ09JUkVTVUxUICgqKShDT0lNQVBJTlNUQU5DRSwgdWludDMyX3QsIGNvbnN0IENPSUVWRU5UKiwKKyAgICAgICAgICAgICAgICAgICAgICAgQ09JRVZFTlQqKSkKKyAgICAgICAgICAgIERMX3N5bShsaWJfaGFuZGxlLCAiQ09JQnVmZmVyVW5tYXAiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChCdWZmZXJVbm1hcCA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lCdWZmZXJVbm1hcCIpOworICAgICAgICBmaW5pKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBCdWZmZXJXcml0ZSA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKENPSUJVRkZFUiwgdWludDY0X3QsIGNvbnN0IHZvaWQqLCB1aW50NjRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ09JX0NPUFlfVFlQRSwgdWludDMyX3QsIGNvbnN0IENPSUVWRU5UKiwKKyAgICAgICAgICAgICAgICAgICAgICAgQ09JRVZFTlQqKSkKKyAgICAgICAgICAgIERMX3N5bShsaWJfaGFuZGxlLCAiQ09JQnVmZmVyV3JpdGUiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChCdWZmZXJXcml0ZSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lCdWZmZXJXcml0ZSIpOworICAgICAgICBmaW5pKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBCdWZmZXJSZWFkID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikoQ09JQlVGRkVSLCB1aW50NjRfdCwgdm9pZCosIHVpbnQ2NF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9DT1BZX1RZUEUsIHVpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENPSUVWRU5UKiwgQ09JRVZFTlQqKSkKKyAgICAgICAgICAgIERMX3N5bShsaWJfaGFuZGxlLCAiQ09JQnVmZmVyUmVhZCIsIENPSV9WRVJTSU9OMSk7CisgICAgaWYgKEJ1ZmZlclJlYWQgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBDT0kgbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09JQnVmZmVyUmVhZCIpOworICAgICAgICBmaW5pKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBCdWZmZXJDb3B5ID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikoQ09JQlVGRkVSLCBDT0lCVUZGRVIsIHVpbnQ2NF90LCB1aW50NjRfdCwgdWludDY0X3QsCisgICAgICAgICAgICAgICAgICAgICAgIENPSV9DT1BZX1RZUEUsIHVpbnQzMl90LCBjb25zdCBDT0lFVkVOVCosCisgICAgICAgICAgICAgICAgICAgICAgIENPSUVWRU5UKikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSUJ1ZmZlckNvcHkiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChCdWZmZXJDb3B5ID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSUJ1ZmZlckNvcHkiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQnVmZmVyR2V0U2lua0FkZHJlc3MgPQorICAgICAgICAoQ09JUkVTVUxUICgqKShDT0lCVUZGRVIsIHVpbnQ2NF90KikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSUJ1ZmZlckdldFNpbmtBZGRyZXNzIiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoQnVmZmVyR2V0U2lua0FkZHJlc3MgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBDT0kgbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09JQnVmZmVyR2V0U2lua0FkZHJlc3MiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQnVmZmVyU2V0U3RhdGUgPQorICAgICAgICAoQ09JUkVTVUxUKCopKENPSUJVRkZFUiwgQ09JUFJPQ0VTUywgQ09JX0JVRkZFUl9TVEFURSwKKyAgICAgICAgICAgICAgICAgICAgICBDT0lfQlVGRkVSX01PVkVfRkxBRywgdWludDMyX3QsIGNvbnN0IENPSUVWRU5UKiwKKyAgICAgICAgICAgICAgICAgICAgICBDT0lFVkVOVCopKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lCdWZmZXJTZXRTdGF0ZSIsIENPSV9WRVJTSU9OMSk7CisgICAgaWYgKEJ1ZmZlclNldFN0YXRlID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSUJ1ZmZlclNldFN0YXRlIik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEV2ZW50V2FpdCA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKHVpbnQxNl90LCBjb25zdCBDT0lFVkVOVCosIGludDMyX3QsIHVpbnQ4X3QsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiwgdWludDMyX3QqKSkKKyAgICAgICAgICAgIERMX3N5bShsaWJfaGFuZGxlLCAiQ09JRXZlbnRXYWl0IiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoRXZlbnRXYWl0ID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSUV2ZW50V2FpdCIpOworICAgICAgICBmaW5pKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBQZXJmR2V0Q3ljbGVGcmVxdWVuY3kgPQorICAgICAgICAodWludDY0X3QgKCopKHZvaWQpKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lQZXJmR2V0Q3ljbGVGcmVxdWVuY3kiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChQZXJmR2V0Q3ljbGVGcmVxdWVuY3kgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBDT0kgbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09JUGVyZkdldEN5Y2xlRnJlcXVlbmN5Iik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlzX2F2YWlsYWJsZSA9IHRydWU7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBmaW5pKHZvaWQpCit7CisgICAgaXNfYXZhaWxhYmxlID0gZmFsc2U7CisKKyAgICBpZiAobGliX2hhbmRsZSAhPSAwKSB7CisjaWZuZGVmIFRBUkdFVF9XSU5OVAorICAgICAgICBETF9jbG9zZShsaWJfaGFuZGxlKTsKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKyAgICAgICAgbGliX2hhbmRsZSA9IDA7CisgICAgfQorfQorCit9IC8vIG5hbWVzcGFjZSBDT0kKZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL2NvaS9jb2lfY2xpZW50LmggYi9maW5hbC9vZmZsb2FkL3NyYy9jb2kvY29pX2NsaWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NzVhOGIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9jb2kvY29pX2NsaWVudC5oCkBAIC0wLDAgKzEsMTE4IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKy8vIFRoZSBpbnRlcmZhY2UgYmV0d2VlbiBvZmZsb2FkIGxpYnJhcnkgYW5kIHRoZSBDT0kgQVBJIG9uIHRoZSBob3N0CisKKyNpZm5kZWYgQ09JX0NMSUVOVF9IX0lOQ0xVREVECisjZGVmaW5lIENPSV9DTElFTlRfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8Y29tbW9uL0NPSVBlcmZfY29tbW9uLmg+CisjaW5jbHVkZSA8c291cmNlL0NPSUVuZ2luZV9zb3VyY2UuaD4KKyNpbmNsdWRlIDxzb3VyY2UvQ09JUHJvY2Vzc19zb3VyY2UuaD4KKyNpbmNsdWRlIDxzb3VyY2UvQ09JUGlwZWxpbmVfc291cmNlLmg+CisjaW5jbHVkZSA8c291cmNlL0NPSUJ1ZmZlcl9zb3VyY2UuaD4KKyNpbmNsdWRlIDxzb3VyY2UvQ09JRXZlbnRfc291cmNlLmg+CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgIi4uL2xpYm9mZmxvYWRfZXJyb3JfY29kZXMuaCIKKyNpbmNsdWRlICIuLi9vZmZsb2FkX3V0aWwuaCIKKworI2RlZmluZSBNSUNfRU5HSU5FU19NQVggICAgIDEyOAorCisjaWYgTUlDX0VOR0lORVNfTUFYIDwgQ09JX01BWF9JU0FfTUlDX0RFVklDRVMKKyNlcnJvciBNSUNfRU5HSU5FU19NQVggbmVlZCB0byBiZSBpbmNyZWFzZWQKKyNlbmRpZgorCisvLyBDT0kgbGlicmFyeSBpbnRlcmZhY2UKK25hbWVzcGFjZSBDT0kgeworCitleHRlcm4gYm9vbCBpbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgZmluaSh2b2lkKTsKKworZXh0ZXJuIGJvb2wgaXNfYXZhaWxhYmxlOworCisvLyBwb2ludGVycyB0byBmdW5jdGlvbnMgZnJvbSBDT0kgbGlicmFyeQorZXh0ZXJuIENPSVJFU1VMVCAoKkVuZ2luZUdldENvdW50KShDT0lfSVNBX1RZUEUsIHVpbnQzMl90Kik7CitleHRlcm4gQ09JUkVTVUxUICgqRW5naW5lR2V0SGFuZGxlKShDT0lfSVNBX1RZUEUsIHVpbnQzMl90LCBDT0lFTkdJTkUqKTsKKworZXh0ZXJuIENPSVJFU1VMVCAoKlByb2Nlc3NDcmVhdGVGcm9tTWVtb3J5KShDT0lFTkdJTkUsIGNvbnN0IGNoYXIqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqLCB1aW50NjRfdCwgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqKiwgdWludDhfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiosIHVpbnQ4X3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciosIHVpbnQ2NF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqLCB1aW50NjRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lQUk9DRVNTKik7CitleHRlcm4gQ09JUkVTVUxUICgqUHJvY2Vzc0Rlc3Ryb3kpKENPSVBST0NFU1MsIGludDMyX3QsIHVpbnQ4X3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50OF90KiwgdWludDMyX3QqKTsKK2V4dGVybiBDT0lSRVNVTFQgKCpQcm9jZXNzR2V0RnVuY3Rpb25IYW5kbGVzKShDT0lQUk9DRVNTLCB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSUZVTkNUSU9OKik7CitleHRlcm4gQ09JUkVTVUxUICgqUHJvY2Vzc0xvYWRMaWJyYXJ5RnJvbU1lbW9yeSkoQ09JUFJPQ0VTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JTElCUkFSWSopOworZXh0ZXJuIENPSVJFU1VMVCAoKlByb2Nlc3NSZWdpc3RlckxpYnJhcmllcykodWludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDY0X3QqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ2NF90Kik7CisKK2V4dGVybiBDT0lSRVNVTFQgKCpQaXBlbGluZUNyZWF0ZSkoQ09JUFJPQ0VTUywgQ09JX0NQVV9NQVNLLCB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lQSVBFTElORSopOworZXh0ZXJuIENPSVJFU1VMVCAoKlBpcGVsaW5lRGVzdHJveSkoQ09JUElQRUxJTkUpOworZXh0ZXJuIENPSVJFU1VMVCAoKlBpcGVsaW5lUnVuRnVuY3Rpb24pKENPSVBJUEVMSU5FLCBDT0lGVU5DVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90LCBjb25zdCBDT0lCVUZGRVIqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ09JX0FDQ0VTU19GTEFHUyosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCwgY29uc3QgQ09JRVZFTlQqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCosIHVpbnQxNl90LCB2b2lkKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90LCBDT0lFVkVOVCopOworCitleHRlcm4gQ09JUkVTVUxUICgqQnVmZmVyQ3JlYXRlKSh1aW50NjRfdCwgQ09JX0JVRkZFUl9UWVBFLCB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCosIHVpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDT0lQUk9DRVNTKiwgQ09JQlVGRkVSKik7CitleHRlcm4gQ09JUkVTVUxUICgqQnVmZmVyQ3JlYXRlRnJvbU1lbW9yeSkodWludDY0X3QsIENPSV9CVUZGRVJfVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90LCB2b2lkKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90LCBjb25zdCBDT0lQUk9DRVNTKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSUJVRkZFUiopOworZXh0ZXJuIENPSVJFU1VMVCAoKkJ1ZmZlckRlc3Ryb3kpKENPSUJVRkZFUik7CitleHRlcm4gQ09JUkVTVUxUICgqQnVmZmVyTWFwKShDT0lCVUZGRVIsIHVpbnQ2NF90LCB1aW50NjRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX01BUF9UWVBFLCB1aW50MzJfdCwgY29uc3QgQ09JRVZFTlQqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lFVkVOVCosIENPSU1BUElOU1RBTkNFKiwgdm9pZCoqKTsKK2V4dGVybiBDT0lSRVNVTFQgKCpCdWZmZXJVbm1hcCkoQ09JTUFQSU5TVEFOQ0UsIHVpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENPSUVWRU5UKiwgQ09JRVZFTlQqKTsKK2V4dGVybiBDT0lSRVNVTFQgKCpCdWZmZXJXcml0ZSkoQ09JQlVGRkVSLCB1aW50NjRfdCwgY29uc3Qgdm9pZCosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QsIENPSV9DT1BZX1RZUEUsIHVpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENPSUVWRU5UKiwgQ09JRVZFTlQqKTsKK2V4dGVybiBDT0lSRVNVTFQgKCpCdWZmZXJSZWFkKShDT0lCVUZGRVIsIHVpbnQ2NF90LCB2b2lkKiwgdWludDY0X3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQ09QWV9UWVBFLCB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENPSUVWRU5UKiwgQ09JRVZFTlQqKTsKK2V4dGVybiBDT0lSRVNVTFQgKCpCdWZmZXJDb3B5KShDT0lCVUZGRVIsIENPSUJVRkZFUiwgdWludDY0X3QsIHVpbnQ2NF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QsIENPSV9DT1BZX1RZUEUsIHVpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ09JRVZFTlQqLCBDT0lFVkVOVCopOworZXh0ZXJuIENPSVJFU1VMVCAoKkJ1ZmZlckdldFNpbmtBZGRyZXNzKShDT0lCVUZGRVIsIHVpbnQ2NF90Kik7CitleHRlcm4gQ09JUkVTVUxUICgqQnVmZmVyU2V0U3RhdGUpKENPSUJVRkZFUiwgQ09JUFJPQ0VTUywgQ09JX0JVRkZFUl9TVEFURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0JVRkZFUl9NT1ZFX0ZMQUcsIHVpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIENPSUVWRU5UKiwgQ09JRVZFTlQqKTsKKworZXh0ZXJuIENPSVJFU1VMVCAoKkV2ZW50V2FpdCkodWludDE2X3QsIGNvbnN0IENPSUVWRU5UKiwgaW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QsIHVpbnQzMl90KiwgdWludDMyX3QqKTsKKworZXh0ZXJuIHVpbnQ2NF90ICAoKlBlcmZHZXRDeWNsZUZyZXF1ZW5jeSkodm9pZCk7CisKK30gLy8gbmFtZXNwYWNlIENPSQorCisjZW5kaWYgLy8gQ09JX0NMSUVOVF9IX0lOQ0xVREVECmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9jb2kvY29pX3NlcnZlci5jcHAgYi9maW5hbC9vZmZsb2FkL3NyYy9jb2kvY29pX3NlcnZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNlNmMyZAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL2NvaS9jb2lfc2VydmVyLmNwcApAQCAtMCwwICsxLDEzMCBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvLyBUaGUgQ09JIGludGVyZmFjZSBvbiB0aGUgdGFyZ2V0CisKKyNpbmNsdWRlICJjb2lfc2VydmVyLmgiCisKKyNpbmNsdWRlICIuLi9vZmZsb2FkX3RhcmdldC5oIgorI2luY2x1ZGUgIi4uL29mZmxvYWRfdGltZXIuaCIKKyNpZmRlZiBNWU9fU1VQUE9SVAorI2luY2x1ZGUgIi4uL29mZmxvYWRfbXlvX3RhcmdldC5oIiAgICAgIC8vIGZvciBfX29mZmxvYWRfbXlvTGliSW5pdC9GaW5pCisjZW5kaWYgLy8gTVlPX1NVUFBPUlQKKworQ09JTkFUSVZFTElCRVhQT1JUCit2b2lkIHNlcnZlcl9jb21wdXRlKAorICAgIHVpbnQzMl90ICBidWZmZXJfY291bnQsCisgICAgdm9pZCoqICAgIGJ1ZmZlcnMsCisgICAgdWludDY0X3QqIGJ1ZmZlcnNfbGVuLAorICAgIHZvaWQqICAgICBtaXNjX2RhdGEsCisgICAgdWludDE2X3QgIG1pc2NfZGF0YV9sZW4sCisgICAgdm9pZCogICAgIHJldHVybl9kYXRhLAorICAgIHVpbnQxNl90ICByZXR1cm5fZGF0YV9sZW4KKykKK3sKKyAgICBPZmZsb2FkRGVzY3JpcHRvcjo6b2ZmbG9hZChidWZmZXJfY291bnQsIGJ1ZmZlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzY19kYXRhLCBtaXNjX2RhdGFfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybl9kYXRhLCByZXR1cm5fZGF0YV9sZW4pOworfQorCitDT0lOQVRJVkVMSUJFWFBPUlQKK3ZvaWQgc2VydmVyX2luaXQoCisgICAgdWludDMyX3QgIGJ1ZmZlcl9jb3VudCwKKyAgICB2b2lkKiogICAgYnVmZmVycywKKyAgICB1aW50NjRfdCogYnVmZmVyc19sZW4sCisgICAgdm9pZCogICAgIG1pc2NfZGF0YSwKKyAgICB1aW50MTZfdCAgbWlzY19kYXRhX2xlbiwKKyAgICB2b2lkKiAgICAgcmV0dXJuX2RhdGEsCisgICAgdWludDE2X3QgIHJldHVybl9kYXRhX2xlbgorKQoreworICAgIHN0cnVjdCBpbml0X2RhdGEgeworICAgICAgICBpbnQgIGRldmljZV9pbmRleDsKKyAgICAgICAgaW50ICBkZXZpY2VzX3RvdGFsOworICAgICAgICBpbnQgIGNvbnNvbGVfbGV2ZWw7CisgICAgICAgIGludCAgb2ZmbG9hZF9yZXBvcnRfbGV2ZWw7CisgICAgfSAqZGF0YSA9IChzdHJ1Y3QgaW5pdF9kYXRhKikgbWlzY19kYXRhOworCisgICAgLy8gc2V0IGRldmljZSBpbmRleCBhbmQgbnVtYmVyIG9mIHRvdGFsIGRldmljZXMKKyAgICBtaWNfaW5kZXggPSBkYXRhLT5kZXZpY2VfaW5kZXg7CisgICAgbWljX2VuZ2luZXNfdG90YWwgPSBkYXRhLT5kZXZpY2VzX3RvdGFsOworCisgICAgLy8gaW5pdGlhbGl6ZSB0cmFjZSBsZXZlbAorICAgIGNvbnNvbGVfZW5hYmxlZCA9IGRhdGEtPmNvbnNvbGVfbGV2ZWw7CisgICAgb2ZmbG9hZF9yZXBvcnRfbGV2ZWwgPSBkYXRhLT5vZmZsb2FkX3JlcG9ydF9sZXZlbDsKKworICAgIC8vIHJldHVybiBiYWNrIHRoZSBwcm9jZXNzIGlkCisgICAgKigocGlkX3QqKSByZXR1cm5fZGF0YSkgPSBnZXRwaWQoKTsKK30KKworQ09JTkFUSVZFTElCRVhQT1JUCit2b2lkIHNlcnZlcl92YXJfdGFibGVfc2l6ZSgKKyAgICB1aW50MzJfdCAgYnVmZmVyX2NvdW50LAorICAgIHZvaWQqKiAgICBidWZmZXJzLAorICAgIHVpbnQ2NF90KiBidWZmZXJzX2xlbiwKKyAgICB2b2lkKiAgICAgbWlzY19kYXRhLAorICAgIHVpbnQxNl90ICBtaXNjX2RhdGFfbGVuLAorICAgIHZvaWQqICAgICByZXR1cm5fZGF0YSwKKyAgICB1aW50MTZfdCAgcmV0dXJuX2RhdGFfbGVuCispCit7CisgICAgc3RydWN0IFBhcmFtcyB7CisgICAgICAgIGludDY0X3QgbmVsZW1zOworICAgICAgICBpbnQ2NF90IGxlbmd0aDsKKyAgICB9ICpwYXJhbXM7CisKKyAgICBwYXJhbXMgPSBzdGF0aWNfY2FzdDxQYXJhbXMqPihyZXR1cm5fZGF0YSk7CisgICAgcGFyYW1zLT5sZW5ndGggPSBfX29mZmxvYWRfdmFycy50YWJsZV9zaXplKHBhcmFtcy0+bmVsZW1zKTsKK30KKworQ09JTkFUSVZFTElCRVhQT1JUCit2b2lkIHNlcnZlcl92YXJfdGFibGVfY29weSgKKyAgICB1aW50MzJfdCAgYnVmZmVyX2NvdW50LAorICAgIHZvaWQqKiAgICBidWZmZXJzLAorICAgIHVpbnQ2NF90KiBidWZmZXJzX2xlbiwKKyAgICB2b2lkKiAgICAgbWlzY19kYXRhLAorICAgIHVpbnQxNl90ICBtaXNjX2RhdGFfbGVuLAorICAgIHZvaWQqICAgICByZXR1cm5fZGF0YSwKKyAgICB1aW50MTZfdCAgcmV0dXJuX2RhdGFfbGVuCispCit7CisgICAgX19vZmZsb2FkX3ZhcnMudGFibGVfY29weShidWZmZXJzWzBdLCAqc3RhdGljX2Nhc3Q8aW50NjRfdCo+KG1pc2NfZGF0YSkpOworfQorCisjaWZkZWYgTVlPX1NVUFBPUlQKKy8vIHRlbXBvcmFyeSB3b3JrYXJvdW5kIGZvciBibG9ja2luZyBiZWhhdmlvciBvZiBteW9pTGliSW5pdC9GaW5pIGNhbGxzCitDT0lOQVRJVkVMSUJFWFBPUlQKK3ZvaWQgc2VydmVyX215b2luaXQoCisgICAgdWludDMyX3QgIGJ1ZmZlcl9jb3VudCwKKyAgICB2b2lkKiogICAgYnVmZmVycywKKyAgICB1aW50NjRfdCogYnVmZmVyc19sZW4sCisgICAgdm9pZCogICAgIG1pc2NfZGF0YSwKKyAgICB1aW50MTZfdCAgbWlzY19kYXRhX2xlbiwKKyAgICB2b2lkKiAgICAgcmV0dXJuX2RhdGEsCisgICAgdWludDE2X3QgIHJldHVybl9kYXRhX2xlbgorKQoreworICAgIF9fb2ZmbG9hZF9teW9MaWJJbml0KCk7Cit9CisKK0NPSU5BVElWRUxJQkVYUE9SVAordm9pZCBzZXJ2ZXJfbXlvZmluaSgKKyAgICB1aW50MzJfdCAgYnVmZmVyX2NvdW50LAorICAgIHZvaWQqKiAgICBidWZmZXJzLAorICAgIHVpbnQ2NF90KiBidWZmZXJzX2xlbiwKKyAgICB2b2lkKiAgICAgbWlzY19kYXRhLAorICAgIHVpbnQxNl90ICBtaXNjX2RhdGFfbGVuLAorICAgIHZvaWQqICAgICByZXR1cm5fZGF0YSwKKyAgICB1aW50MTZfdCAgcmV0dXJuX2RhdGFfbGVuCispCit7CisgICAgX19vZmZsb2FkX215b0xpYkZpbmkoKTsKK30KKyNlbmRpZiAvLyBNWU9fU1VQUE9SVApkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvY29pL2NvaV9zZXJ2ZXIuaCBiL2ZpbmFsL29mZmxvYWQvc3JjL2NvaS9jb2lfc2VydmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc0NGQ5ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL2NvaS9jb2lfc2VydmVyLmgKQEAgLTAsMCArMSw3NCBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvL1RoZSBpbnRlcmZhY2UgYmV0d2VlbiBvZmZsb2FkIGxpYnJhcnkgYW5kIHRoZSBDT0kgQVBJIG9uIHRoZSB0YXJnZXQuCisKKyNpZm5kZWYgQ09JX1NFUlZFUl9IX0lOQ0xVREVECisjZGVmaW5lIENPSV9TRVJWRVJfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8Y29tbW9uL0NPSUVuZ2luZV9jb21tb24uaD4KKyNpbmNsdWRlIDxjb21tb24vQ09JUGVyZl9jb21tb24uaD4KKyNpbmNsdWRlIDxzaW5rL0NPSVByb2Nlc3Nfc2luay5oPgorI2luY2x1ZGUgPHNpbmsvQ09JUGlwZWxpbmVfc2luay5oPgorI2luY2x1ZGUgPHNpbmsvQ09JQnVmZmVyX3NpbmsuaD4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAiLi4vbGlib2ZmbG9hZF9lcnJvcl9jb2Rlcy5oIgorCisvLyB3cmFwcGVycyBmb3IgQ09JIEFQSQorI2RlZmluZSBQaXBlbGluZVN0YXJ0RXhlY3V0aW5nUnVuRnVuY3Rpb25zKCkgXAorICAgIHsgXAorICAgICAgICBDT0lSRVNVTFQgcmVzID0gQ09JUGlwZWxpbmVTdGFydEV4ZWN1dGluZ1J1bkZ1bmN0aW9ucygpOyBcCisgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsgXAorICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3BpcGVsaW5lX3N0YXJ0X3J1bl9mdW5jcywgbWljX2luZGV4LCByZXMpOyBcCisgICAgICAgICAgICBleGl0KDEpOyBcCisgICAgICAgIH0gXAorICAgIH0KKworI2RlZmluZSBQcm9jZXNzV2FpdEZvclNodXRkb3duKCkgXAorICAgIHsgXAorICAgICAgICBDT0lSRVNVTFQgcmVzID0gQ09JUHJvY2Vzc1dhaXRGb3JTaHV0ZG93bigpOyBcCisgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsgXAorICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3Byb2Nlc3Nfd2FpdF9zaHV0ZG93biwgbWljX2luZGV4LCByZXMpOyBcCisgICAgICAgICAgICBleGl0KDEpOyBcCisgICAgICAgIH0gXAorICAgIH0KKworI2RlZmluZSBCdWZmZXJBZGRSZWYoYnVmKSBcCisgICAgeyBcCisgICAgICAgIENPSVJFU1VMVCByZXMgPSBDT0lCdWZmZXJBZGRSZWYoYnVmKTsgXAorICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7IFwKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19idWZfYWRkX3JlZiwgbWljX2luZGV4LCByZXMpOyBcCisgICAgICAgICAgICBleGl0KDEpOyBcCisgICAgICAgIH0gXAorICAgIH0KKworI2RlZmluZSBCdWZmZXJSZWxlYXNlUmVmKGJ1ZikgXAorICAgIHsgXAorICAgICAgICBDT0lSRVNVTFQgcmVzID0gQ09JQnVmZmVyUmVsZWFzZVJlZihidWYpOyBcCisgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsgXAorICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2J1Zl9yZWxlYXNlX3JlZiwgbWljX2luZGV4LCByZXMpOyBcCisgICAgICAgICAgICBleGl0KDEpOyBcCisgICAgICAgIH0gXAorICAgIH0KKworI2RlZmluZSBFbmdpbmVHZXRJbmRleChpbmRleCkgXAorICAgIHsgXAorICAgICAgICBDT0lfSVNBX1RZUEUgaXNhX3R5cGU7IFwKKyAgICAgICAgQ09JUkVTVUxUIHJlcyA9IENPSUVuZ2luZUdldEluZGV4KCZpc2FfdHlwZSwgaW5kZXgpOyBcCisgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsgXAorICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2dldF9lbmdpbmVfaW5kZXgsIG1pY19pbmRleCwgcmVzKTsgXAorICAgICAgICAgICAgZXhpdCgxKTsgXAorICAgICAgICB9IFwKKyAgICB9CisKKyNlbmRpZiAvLyBDT0lfU0VSVkVSX0hfSU5DTFVERUQKZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL2NvbXBpbGVyX2lmX2hvc3QuY3BwIGIvZmluYWwvb2ZmbG9hZC9zcmMvY29tcGlsZXJfaWZfaG9zdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJjNDMwYgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL2NvbXBpbGVyX2lmX2hvc3QuY3BwCkBAIC0wLDAgKzEsMzIzIEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJjb21waWxlcl9pZl9ob3N0LmgiCisKKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpZm5kZWYgVEFSR0VUX1dJTk5UCisjaW5jbHVkZSA8YWxsb2NhLmg+CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKy8vIEdsb2JhbCBjb3VudGVyIG9uIGhvc3QuIAorLy8gVGhpcyB2YXJpYWJsZSBpcyB1c2VkIGlmIFAyT1BUX29mZmxvYWRfZG9fZGF0YV9wZXJzaXN0ZW5jZSA9PSAyLgorLy8gVGhlIHZhcmlhYmxlIHVzZWQgdG8gaWRlbnRpZnkgb2ZmbG9hZCBjb25zdHJ1Y3RzIGNvbnRhaW5lZCBpbiBvbmUgcHJvY2VkdXJlLgorLy8gSW5jcmVtZW50IG9mIE9GRkxPQURfQ0FMTF9DT1VOVCBpcyBpbnNlcnRlZCBhdCBlbnRyaWVzIG9mIEhPU1Qgcm91dGluZXMgd2l0aAorLy8gb2ZmbG9hZCBjb25zdHJ1Y3RzLgorc3RhdGljIGludCBvZmZsb2FkX2NhbGxfY291bnQgPSAwOworCitleHRlcm4gIkMiIE9GRkxPQUQgT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSgKKyAgICBUQVJHRVRfVFlQRSAgICAgIHRhcmdldF90eXBlLAorICAgIGludCAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgICAgICAgICAgICAgIGlzX29wdGlvbmFsLAorICAgIF9PZmZsb2FkX3N0YXR1cyogc3RhdHVzLAorICAgIGNvbnN0IGNoYXIqICAgICAgZmlsZSwKKyAgICB1aW50NjRfdCAgICAgICAgIGxpbmUKKykKK3sKKyAgICBib29sIHJldHZhbDsKKyAgICBPRkZMT0FEIG9mbGQ7CisKKyAgICAvLyBpbml0aWFsaXplIHN0YXR1cworICAgIGlmIChzdGF0dXMgIT0gMCkgeworICAgICAgICBzdGF0dXMtPnJlc3VsdCA9IE9GRkxPQURfVU5BVkFJTEFCTEU7CisgICAgICAgIHN0YXR1cy0+ZGV2aWNlX251bWJlciA9IC0xOworICAgICAgICBzdGF0dXMtPmRhdGFfc2VudCA9IDA7CisgICAgICAgIHN0YXR1cy0+ZGF0YV9yZWNlaXZlZCA9IDA7CisgICAgfQorCisgICAgLy8gbWFrZSBzdXJlIGxpYnJheSBpcyBpbml0aWFsaXplZAorICAgIHJldHZhbCA9IF9fb2ZmbG9hZF9pbml0X2xpYnJhcnkoKTsKKworICAgIC8vIE9GRkxPQURfVElNRVJfSU5JVCBtdXN0IGZvbGxvdyBjYWxsIHRvIF9fb2ZmbG9hZF9pbml0X2xpYnJhcnkKKyAgICBPZmZsb2FkSG9zdFRpbWVyRGF0YSAqIHRpbWVyX2RhdGEgPSBPRkZMT0FEX1RJTUVSX0lOSVQoZmlsZSwgbGluZSk7CisKKyAgICBPRkZMT0FEX1RJTUVSX1NUQVJUKHRpbWVyX2RhdGEsIGNfb2ZmbG9hZF9ob3N0X3RvdGFsX29mZmxvYWQpOworCisgICAgT0ZGTE9BRF9USU1FUl9TVEFSVCh0aW1lcl9kYXRhLCBjX29mZmxvYWRfaG9zdF9pbml0aWFsaXplKTsKKworICAgIC8vIGluaXRpYWxpemUgYWxsIGRldmljZXMgaXMgaW5pdF90eXBlIGlzIG9uX29mZmxvYWRfYWxsCisgICAgaWYgKHJldHZhbCAmJiBfX29mZmxvYWRfaW5pdF90eXBlID09IGNfaW5pdF9vbl9vZmZsb2FkX2FsbCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1pY19lbmdpbmVzX3RvdGFsOyBpKyspIHsKKyAgICAgICAgICAgICBtaWNfZW5naW5lc1tpXS5pbml0KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgT0ZGTE9BRF9USU1FUl9TVE9QKHRpbWVyX2RhdGEsIGNfb2ZmbG9hZF9ob3N0X2luaXRpYWxpemUpOworCisgICAgT0ZGTE9BRF9USU1FUl9TVEFSVCh0aW1lcl9kYXRhLCBjX29mZmxvYWRfaG9zdF90YXJnZXRfYWNxdWlyZSk7CisKKyAgICBpZiAodGFyZ2V0X3R5cGUgPT0gVEFSR0VUX0hPU1QpIHsKKyAgICAgICAgLy8gSG9zdCBhbHdheXMgYXZhaWxhYmxlCisgICAgICAgIHJldHZhbCA9IHRydWU7CisgICAgfQorICAgIGVsc2UgaWYgKHRhcmdldF90eXBlID09IFRBUkdFVF9NSUMpIHsKKyAgICAgICAgaWYgKHRhcmdldF9udW1iZXIgPj0gLTEpIHsKKyAgICAgICAgICAgIGlmIChyZXR2YWwpIHsKKyAgICAgICAgICAgICAgICBpZiAodGFyZ2V0X251bWJlciA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFVzZXIgcHJvdmlkZWQgdGhlIGRldmljZSBudW1iZXIKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciA9IHRhcmdldF9udW1iZXIgJSBtaWNfZW5naW5lc190b3RhbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBkZXZpY2UgMAorICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyID0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyByZXNlcnZlIGRldmljZSBpbiBPUlNMCisgICAgICAgICAgICAgICAgaWYgKGlzX29wdGlvbmFsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghT1JTTDo6dHJ5X3Jlc2VydmUodGFyZ2V0X251bWJlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFPUlNMOjpyZXNlcnZlKHRhcmdldF9udW1iZXIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyID0gLTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplIGRldmljZQorICAgICAgICAgICAgICAgIGlmICh0YXJnZXRfbnVtYmVyID49IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgX19vZmZsb2FkX2luaXRfdHlwZSA9PSBjX2luaXRfb25fb2ZmbG9hZCkgeworICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RJTUVSX1NUQVJUKHRpbWVyX2RhdGEsIGNfb2ZmbG9hZF9ob3N0X2luaXRpYWxpemUpOworICAgICAgICAgICAgICAgICAgICBtaWNfZW5naW5lc1t0YXJnZXRfbnVtYmVyXS5pbml0KCk7CisgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVElNRVJfU1RPUCh0aW1lcl9kYXRhLCBjX29mZmxvYWRfaG9zdF9pbml0aWFsaXplKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBmYWxsYmFjayB0byBDUFUKKyAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyID0gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0YXJnZXRfbnVtYmVyIDwgMCB8fCAhcmV0dmFsKSB7CisgICAgICAgICAgICAgICAgaWYgKCFpc19vcHRpb25hbCAmJiBzdGF0dXMgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfZGV2aWNlX2lzX25vdF9hdmFpbGFibGUpOworICAgICAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHZhbCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2ludmFsaWRfZGV2aWNlX251bWJlcik7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHJldHZhbCkgeworICAgICAgICBvZmxkID0gbmV3IE9mZmxvYWREZXNjcmlwdG9yKHRhcmdldF9udW1iZXIsIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXNfb3B0aW9uYWwsIGZhbHNlLCB0aW1lcl9kYXRhKTsKKyAgICAgICAgT0ZGTE9BRF9USU1FUl9IT1NUX01JQ19OVU0odGltZXJfZGF0YSwgdGFyZ2V0X251bWJlcik7CisgICAgICAgIE9mZmxvYWRfUmVwb3J0X1Byb2xvZyh0aW1lcl9kYXRhKTsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDIsIHRpbWVyX2RhdGEtPm9mZmxvYWRfbnVtYmVyLCBjX29mZmxvYWRfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3RhcnRpbmcgb2ZmbG9hZDogdGFyZ2V0X3R5cGUgPSAlZCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm51bWJlciA9ICVkLCBpc19vcHRpb25hbCA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIGlzX29wdGlvbmFsKTsKKworICAgICAgICBPRkZMT0FEX1RJTUVSX1NUT1AodGltZXJfZGF0YSwgY19vZmZsb2FkX2hvc3RfdGFyZ2V0X2FjcXVpcmUpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgb2ZsZCA9IE5VTEw7CisKKyAgICAgICAgT0ZGTE9BRF9USU1FUl9TVE9QKHRpbWVyX2RhdGEsIGNfb2ZmbG9hZF9ob3N0X3RhcmdldF9hY3F1aXJlKTsKKyAgICAgICAgT0ZGTE9BRF9USU1FUl9TVE9QKHRpbWVyX2RhdGEsIGNfb2ZmbG9hZF9ob3N0X3RvdGFsX29mZmxvYWQpOworICAgICAgICBvZmZsb2FkX3JlcG9ydF9mcmVlX2RhdGEodGltZXJfZGF0YSk7CisgICAgfQorCisgICAgcmV0dXJuIG9mbGQ7Cit9CisKK2V4dGVybiAiQyIgT0ZGTE9BRCBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFMSgKKyAgICBjb25zdCBpbnQqICBkZXZpY2VfbnVtLAorICAgIGNvbnN0IGNoYXIqIGZpbGUsCisgICAgdWludDY0X3QgICAgbGluZQorKQoreworICAgIGludCB0YXJnZXRfbnVtYmVyOworCisgICAgLy8gbWFrZSBzdXJlIGxpYnJheSBpcyBpbml0aWFsaXplZCBhbmQgYXQgbGVhc3Qgb25lIGRldmljZSBpcyBhdmFpbGFibGUKKyAgICBpZiAoIV9fb2ZmbG9hZF9pbml0X2xpYnJhcnkoKSkgeworICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfZGV2aWNlX2lzX25vdF9hdmFpbGFibGUpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIC8vIE9GRkxPQURfVElNRVJfSU5JVCBtdXN0IGZvbGxvdyBjYWxsIHRvIF9fb2ZmbG9hZF9pbml0X2xpYnJhcnkKKworICAgIE9mZmxvYWRIb3N0VGltZXJEYXRhICogdGltZXJfZGF0YSA9IE9GRkxPQURfVElNRVJfSU5JVChmaWxlLCBsaW5lKTsKKworICAgIE9GRkxPQURfVElNRVJfU1RBUlQodGltZXJfZGF0YSwgY19vZmZsb2FkX2hvc3RfdG90YWxfb2ZmbG9hZCk7CisKKyAgICBPRkZMT0FEX1RJTUVSX1NUQVJUKHRpbWVyX2RhdGEsIGNfb2ZmbG9hZF9ob3N0X2luaXRpYWxpemUpOworCisgICAgaWYgKF9fb2ZmbG9hZF9pbml0X3R5cGUgPT0gY19pbml0X29uX29mZmxvYWRfYWxsKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWljX2VuZ2luZXNfdG90YWw7IGkrKykgeworICAgICAgICAgICAgIG1pY19lbmdpbmVzW2ldLmluaXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIE9GRkxPQURfVElNRVJfU1RPUCh0aW1lcl9kYXRhLCBjX29mZmxvYWRfaG9zdF9pbml0aWFsaXplKTsKKworICAgIE9GRkxPQURfVElNRVJfU1RBUlQodGltZXJfZGF0YSwgY19vZmZsb2FkX2hvc3RfdGFyZ2V0X2FjcXVpcmUpOworCisgICAgLy8gdXNlIGRlZmF1bHQgZGV2aWNlIG51bWJlciBpZiBpdCBpcyBub3QgcHJvdmlkZWQKKyAgICBpZiAoZGV2aWNlX251bSAhPSAwKSB7CisgICAgICAgIHRhcmdldF9udW1iZXIgPSAqZGV2aWNlX251bTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHRhcmdldF9udW1iZXIgPSBfX29tcF9kZXZpY2VfbnVtOworICAgIH0KKworICAgIC8vIGRldmljZSBudW1iZXIgc2hvdWxkIGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgdmFsdWUKKyAgICBpZiAodGFyZ2V0X251bWJlciA8IDApIHsKKyAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX29tcF9pbnZhbGlkX2RldmljZV9udW0pOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIC8vIHNob3VsZCB3ZSBkbyB0aGlzIGZvciBPcGVuTVA/CisgICAgdGFyZ2V0X251bWJlciAlPSBtaWNfZW5naW5lc190b3RhbDsKKworICAgIC8vIHJlc2VydmUgZGV2aWNlIGluIE9SU0wKKyAgICBpZiAoIU9SU0w6OnJlc2VydmUodGFyZ2V0X251bWJlcikpIHsKKyAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2RldmljZV9pc19ub3RfYXZhaWxhYmxlKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICAvLyBpbml0aWFsaXplIGRldmljZShzKQorICAgIE9GRkxPQURfVElNRVJfU1RBUlQodGltZXJfZGF0YSwgY19vZmZsb2FkX2hvc3RfaW5pdGlhbGl6ZSk7CisKKyAgICBpZiAoX19vZmZsb2FkX2luaXRfdHlwZSA9PSBjX2luaXRfb25fb2ZmbG9hZCkgeworICAgICAgICBtaWNfZW5naW5lc1t0YXJnZXRfbnVtYmVyXS5pbml0KCk7CisgICAgfQorCisgICAgT0ZGTE9BRF9USU1FUl9TVE9QKHRpbWVyX2RhdGEsIGNfb2ZmbG9hZF9ob3N0X2luaXRpYWxpemUpOworCisgICAgT0ZGTE9BRCBvZmxkID0KKyAgICAgICAgbmV3IE9mZmxvYWREZXNjcmlwdG9yKHRhcmdldF9udW1iZXIsIDAsIHRydWUsIHRydWUsIHRpbWVyX2RhdGEpOworCisgICAgT0ZGTE9BRF9USU1FUl9IT1NUX01JQ19OVU0odGltZXJfZGF0YSwgdGFyZ2V0X251bWJlcik7CisKKyAgICBPZmZsb2FkX1JlcG9ydF9Qcm9sb2codGltZXJfZGF0YSk7CisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoMiwgdGltZXJfZGF0YS0+b2ZmbG9hZF9udW1iZXIsIGNfb2ZmbG9hZF9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0YXJ0aW5nIE9wZW5NUCBvZmZsb2FkLCBkZXZpY2UgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlcik7CisKKyAgICBPRkZMT0FEX1RJTUVSX1NUT1AodGltZXJfZGF0YSwgY19vZmZsb2FkX2hvc3RfdGFyZ2V0X2FjcXVpcmUpOworCisgICAgcmV0dXJuIG9mbGQ7Cit9CisKK2ludCBvZmZsb2FkX29mZmxvYWRfd3JhcCgKKyAgICBPRkZMT0FEIG9mbGQsCisgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICBpbnQgaXNfZW1wdHksCisgICAgaW50IG51bV92YXJzLAorICAgIFZhckRlc2MgKnZhcnMsCisgICAgVmFyRGVzYzIgKnZhcnMyLAorICAgIGludCBudW1fd2FpdHMsCisgICAgY29uc3Qgdm9pZCAqKndhaXRzLAorICAgIGNvbnN0IHZvaWQgKipzaWduYWwsCisgICAgaW50IGVudHJ5X2lkLAorICAgIGNvbnN0IHZvaWQgKnN0YWNrX2FkZHIKKykKK3sKKyAgICBib29sIHJldCA9IG9mbGQtPm9mZmxvYWQobmFtZSwgaXNfZW1wdHksIHZhcnMsIHZhcnMyLCBudW1fdmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdHMsIG51bV93YWl0cywgc2lnbmFsLCBlbnRyeV9pZCwgc3RhY2tfYWRkcik7CisgICAgaWYgKCFyZXQgfHwgc2lnbmFsID09IDApIHsKKyAgICAgICAgZGVsZXRlIG9mbGQ7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2V4dGVybiAiQyIgaW50IE9GRkxPQURfT0ZGTE9BRDEoCisgICAgT0ZGTE9BRCBvZmxkLAorICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgaW50IGlzX2VtcHR5LAorICAgIGludCBudW1fdmFycywKKyAgICBWYXJEZXNjICp2YXJzLAorICAgIFZhckRlc2MyICp2YXJzMiwKKyAgICBpbnQgbnVtX3dhaXRzLAorICAgIGNvbnN0IHZvaWQgKip3YWl0cywKKyAgICBjb25zdCB2b2lkICoqc2lnbmFsCispCit7CisgICAgcmV0dXJuIG9mZmxvYWRfb2ZmbG9hZF93cmFwKG9mbGQsIG5hbWUsIGlzX2VtcHR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV92YXJzLCB2YXJzLCB2YXJzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fd2FpdHMsIHdhaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbCwgTlVMTCwgTlVMTCk7Cit9CisKK2V4dGVybiAiQyIgaW50IE9GRkxPQURfT0ZGTE9BRDIoCisgICAgT0ZGTE9BRCBvZmxkLAorICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgaW50IGlzX2VtcHR5LAorICAgIGludCBudW1fdmFycywKKyAgICBWYXJEZXNjICp2YXJzLAorICAgIFZhckRlc2MyICp2YXJzMiwKKyAgICBpbnQgbnVtX3dhaXRzLAorICAgIGNvbnN0IHZvaWQqKiB3YWl0cywKKyAgICBjb25zdCB2b2lkKiogc2lnbmFsLAorICAgIGludCBlbnRyeV9pZCwKKyAgICBjb25zdCB2b2lkICpzdGFja19hZGRyCispCit7CisgICAgcmV0dXJuIG9mZmxvYWRfb2ZmbG9hZF93cmFwKG9mbGQsIG5hbWUsIGlzX2VtcHR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV92YXJzLCB2YXJzLCB2YXJzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fd2FpdHMsIHdhaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbCwgZW50cnlfaWQsIHN0YWNrX2FkZHIpOworfQorCitleHRlcm4gIkMiIGludCBPRkZMT0FEX09GRkxPQUQoCisgICAgT0ZGTE9BRCBvZmxkLAorICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgaW50IGlzX2VtcHR5LAorICAgIGludCBudW1fdmFycywKKyAgICBWYXJEZXNjICp2YXJzLAorICAgIFZhckRlc2MyICp2YXJzMiwKKyAgICBpbnQgbnVtX3dhaXRzLAorICAgIGNvbnN0IHZvaWQgKip3YWl0cywKKyAgICBjb25zdCB2b2lkICpzaWduYWwsCisgICAgaW50IGVudHJ5X2lkLAorICAgIGNvbnN0IHZvaWQgKnN0YWNrX2FkZHIKKykKK3sKKyAgICAvLyBzaWduYWwgaXMgcGFzc2VkIGJ5IHJlZmVyZW5jZSBub3cKKyAgICBjb25zdCB2b2lkICoqc2lnbmFsX25ldyA9IChzaWduYWwgIT0gMCkgPyAmc2lnbmFsIDogMDsKKyAgICBjb25zdCB2b2lkICoqd2FpdHNfbmV3ID0gMDsKKyAgICBpbnQgbnVtX3dhaXRzX25ldyA9IDA7CisKKyAgICAvLyByZW1vdmUgTlVMTCB2YWx1ZXMgZnJvbSB0aGUgbGlzdCBvZiBzaWduYWxzIHRvIHdhaXQgZm9yCisgICAgaWYgKG51bV93YWl0cyA+IDApIHsKKyAgICAgICAgd2FpdHNfbmV3ID0gKGNvbnN0IHZvaWQqKikgYWxsb2NhKHNpemVvZih2b2lkKikgKiBudW1fd2FpdHMpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bV93YWl0czsgaSsrKSB7CisgICAgICAgICAgICBpZiAod2FpdHNbaV0gIT0gMCkgeworICAgICAgICAgICAgICAgIHdhaXRzX25ld1tudW1fd2FpdHNfbmV3KytdID0gd2FpdHNbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT0ZGTE9BRF9PRkZMT0FEMShvZmxkLCBuYW1lLCBpc19lbXB0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fdmFycywgdmFycywgdmFyczIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3dhaXRzX25ldywgd2FpdHNfbmV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbF9uZXcpOworfQorCitleHRlcm4gIkMiIGludCBPRkZMT0FEX0NBTExfQ09VTlQoKQoreworICAgIG9mZmxvYWRfY2FsbF9jb3VudCsrOworICAgIHJldHVybiBvZmZsb2FkX2NhbGxfY291bnQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9jb21waWxlcl9pZl9ob3N0LmggYi9maW5hbC9vZmZsb2FkL3NyYy9jb21waWxlcl9pZl9ob3N0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIzNGM1MQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL2NvbXBpbGVyX2lmX2hvc3QuaApAQCAtMCwwICsxLDEzMyBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvKiEgXGZpbGUKKyAgICBcYnJpZWYgVGhlIGludGVyZmFjZSBiZXR3ZWVuIGNvbXBpbGVyLWdlbmVyYXRlZCBob3N0IGNvZGUgYW5kIHJ1bnRpbWUgbGlicmFyeQorKi8KKworI2lmbmRlZiBDT01QSUxFUl9JRl9IT1NUX0hfSU5DTFVERUQKKyNkZWZpbmUgQ09NUElMRVJfSUZfSE9TVF9IX0lOQ0xVREVECisKKyNpbmNsdWRlICJvZmZsb2FkX2hvc3QuaCIKKworI2RlZmluZSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFICAgICAgICAgIE9GRkxPQURfUFJFRklYKHRhcmdldF9hY3F1aXJlKQorI2RlZmluZSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFMSAgICAgICAgIE9GRkxPQURfUFJFRklYKHRhcmdldF9hY3F1aXJlMSkKKyNkZWZpbmUgT0ZGTE9BRF9PRkZMT0FEICAgICAgICAgICAgICAgICBPRkZMT0FEX1BSRUZJWChvZmZsb2FkKQorI2RlZmluZSBPRkZMT0FEX09GRkxPQUQxICAgICAgICAgICAgICAgIE9GRkxPQURfUFJFRklYKG9mZmxvYWQxKQorI2RlZmluZSBPRkZMT0FEX09GRkxPQUQyICAgICAgICAgICAgICAgIE9GRkxPQURfUFJFRklYKG9mZmxvYWQyKQorI2RlZmluZSBPRkZMT0FEX0NBTExfQ09VTlQgICAgICAgICAgICAgIE9GRkxPQURfUFJFRklYKG9mZmxvYWRfY2FsbF9jb3VudCkKKworCisvKiEgXGZuIE9GRkxPQURfVEFSR0VUX0FDUVVJUkUKKyAgICBcYnJpZWYgQXR0ZW1wdCB0byBhY3F1aXJlIHRoZSB0YXJnZXQuCisgICAgXHBhcmFtIHRhcmdldF90eXBlICAgVGhlIHR5cGUgb2YgdGFyZ2V0LgorICAgIFxwYXJhbSB0YXJnZXRfbnVtYmVyIFRoZSBkZXZpY2UgbnVtYmVyLgorICAgIFxwYXJhbSBpc19vcHRpb25hbCAgIFdoZXRoZXIgQ1BVIGZhbGwtYmFjayBpcyBhbGxvd2VkLgorICAgIFxwYXJhbSBzdGF0dXMgICAgICAgIEFkZHJlc3Mgb2YgdmFyaWFibGUgdG8gaG9sZCBvZmZsb2FkIHN0YXR1cy4KKyAgICBccGFyYW0gZmlsZSAgICAgICAgICBGaWxlbmFtZSBpbiB3aGljaCB0aGlzIG9mZmxvYWQgb2NjdXJyZWQuCisgICAgXHBhcmFtIGxpbmUgICAgICAgICAgTGluZSBudW1iZXIgaW4gdGhlIGZpbGUgd2hlcmUgdGhpcyBvZmZsb2FkIG9jY3VycmVkLgorKi8KK2V4dGVybiAiQyIgT0ZGTE9BRCBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKAorICAgIFRBUkdFVF9UWVBFICAgICAgdGFyZ2V0X3R5cGUsCisgICAgaW50ICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLAorICAgIGludCAgICAgICAgICAgICAgaXNfb3B0aW9uYWwsCisgICAgX09mZmxvYWRfc3RhdHVzKiBzdGF0dXMsCisgICAgY29uc3QgY2hhciogICAgICBmaWxlLAorICAgIHVpbnQ2NF90ICAgICAgICAgbGluZQorKTsKKworLyohIFxmbiBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFMQorICAgIFxicmllZiBBY3F1aXJlIHRoZSB0YXJnZXQgZm9yIG9mZmxvYWQgKE9wZW5NUCkuCisgICAgXHBhcmFtIGRldmljZV9udW1iZXIgRGV2aWNlIG51bWJlciBvciBudWxsIGlmIG5vdCBzcGVjaWZpZWQuCisgICAgXHBhcmFtIGZpbGUgICAgICAgICAgRmlsZW5hbWUgaW4gd2hpY2ggdGhpcyBvZmZsb2FkIG9jY3VycmVkCisgICAgXHBhcmFtIGxpbmUgICAgICAgICAgTGluZSBudW1iZXIgaW4gdGhlIGZpbGUgd2hlcmUgdGhpcyBvZmZsb2FkIG9jY3VycmVkLgorKi8KK2V4dGVybiAiQyIgT0ZGTE9BRCBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFMSgKKyAgICBjb25zdCBpbnQqICAgICAgZGV2aWNlX251bWJlciwKKyAgICBjb25zdCBjaGFyKiAgICAgZmlsZSwKKyAgICB1aW50NjRfdCAgICAgICAgbGluZQorKTsKKworLyohIFxmbiBPRkZMT0FEX09GRkxPQUQxCisgICAgXGJyaWVmIFJ1biBmdW5jdGlvbiBvbiB0YXJnZXQgdXNpbmcgaW50ZXJmYWNlIGZvciBvbGQgZGF0YSBwZXJzaXN0ZW5jZS4KKyAgICBccGFyYW0gbyBPZmZsb2FkIGRlc2NyaXB0b3IgY3JlYXRlZCBieSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFLgorICAgIFxwYXJhbSBuYW1lIE5hbWUgb2Ygb2ZmbG9hZCBlbnRyeSBwb2ludC4KKyAgICBccGFyYW0gaXNfZW1wdHkgSWYgbm8gY29kZSB0byBleGVjdXRlIChlLmcuIG9mZmxvYWRfdHJhbnNmZXIpCisgICAgXHBhcmFtIG51bV92YXJzIE51bWJlciBvZiB2YXJpYWJsZSBkZXNjcmlwdG9ycy4KKyAgICBccGFyYW0gdmFycyBQb2ludGVyIHRvIFZhckRlc2MgYXJyYXkuCisgICAgXHBhcmFtIHZhcnMyIFBvaW50ZXIgdG8gVmFyRGVzYzIgYXJyYXkuCisgICAgXHBhcmFtIG51bV93YWl0cyBOdW1iZXIgb2YgIndhaXQiIHZhbHVlcy4KKyAgICBccGFyYW0gd2FpdHMgUG9pbnRlciB0byBhcnJheSBvZiB3YWl0IHZhbHVlcy4KKyAgICBccGFyYW0gc2lnbmFsIFBvaW50ZXIgdG8gc2lnbmFsIHZhbHVlIG9yIE5VTEwuCisqLworZXh0ZXJuICJDIiBpbnQgT0ZGTE9BRF9PRkZMT0FEMSgKKyAgICBPRkZMT0FEIG8sCisgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICBpbnQgaXNfZW1wdHksCisgICAgaW50IG51bV92YXJzLAorICAgIFZhckRlc2MgKnZhcnMsCisgICAgVmFyRGVzYzIgKnZhcnMyLAorICAgIGludCBudW1fd2FpdHMsCisgICAgY29uc3Qgdm9pZCoqIHdhaXRzLAorICAgIGNvbnN0IHZvaWQqKiBzaWduYWwKKyk7CisKKy8qISBcZm4gT0ZGTE9BRF9PRkZMT0FEMgorICAgIFxicmllZiBSdW4gZnVuY3Rpb24gb24gdGFyZ2V0IHVzaW5nIGludGVyZmFjZSBmb3IgbmV3IGRhdGEgcGVyc2lzdGVuY2UuCisgICAgXHBhcmFtIG8gT2ZmbG9hZCBkZXNjcmlwdG9yIGNyZWF0ZWQgYnkgT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRS4KKyAgICBccGFyYW0gbmFtZSBOYW1lIG9mIG9mZmxvYWQgZW50cnkgcG9pbnQuCisgICAgXHBhcmFtIGlzX2VtcHR5IElmIG5vIGNvZGUgdG8gZXhlY3V0ZSAoZS5nLiBvZmZsb2FkX3RyYW5zZmVyKQorICAgIFxwYXJhbSBudW1fdmFycyBOdW1iZXIgb2YgdmFyaWFibGUgZGVzY3JpcHRvcnMuCisgICAgXHBhcmFtIHZhcnMgUG9pbnRlciB0byBWYXJEZXNjIGFycmF5LgorICAgIFxwYXJhbSB2YXJzMiBQb2ludGVyIHRvIFZhckRlc2MyIGFycmF5LgorICAgIFxwYXJhbSBudW1fd2FpdHMgTnVtYmVyIG9mICJ3YWl0IiB2YWx1ZXMuCisgICAgXHBhcmFtIHdhaXRzIFBvaW50ZXIgdG8gYXJyYXkgb2Ygd2FpdCB2YWx1ZXMuCisgICAgXHBhcmFtIHNpZ25hbCBQb2ludGVyIHRvIHNpZ25hbCB2YWx1ZSBvciBOVUxMLgorICAgIFxwYXJhbSBlbnRyeV9pZCBBIHNpZ25hdHVyZSBmb3IgdGhlIGZ1bmN0aW9uIGRvaW5nIHRoZSBvZmZsb2FkLgorICAgIFxwYXJhbSBzdGFja19hZGRyIFRoZSBzdGFjayBmcmFtZSBhZGRyZXNzIG9mIHRoZSBmdW5jdGlvbiBkb2luZyBvZmZsb2FkLgorKi8KK2V4dGVybiAiQyIgaW50IE9GRkxPQURfT0ZGTE9BRDIoCisgICAgT0ZGTE9BRCBvLAorICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgaW50IGlzX2VtcHR5LAorICAgIGludCBudW1fdmFycywKKyAgICBWYXJEZXNjICp2YXJzLAorICAgIFZhckRlc2MyICp2YXJzMiwKKyAgICBpbnQgbnVtX3dhaXRzLAorICAgIGNvbnN0IHZvaWQqKiB3YWl0cywKKyAgICBjb25zdCB2b2lkKiogc2lnbmFsLAorICAgIGludCBlbnRyeV9pZCwKKyAgICBjb25zdCB2b2lkICpzdGFja19hZGRyCispOworCisvLyBSdW4gZnVuY3Rpb24gb24gdGFyZ2V0IChvYnNvbGV0ZSkuCisvLyBAcGFyYW0gbyAgICBPRkZMT0FEIG9iamVjdAorLy8gQHBhcmFtIG5hbWUgZnVuY3Rpb24gbmFtZQorZXh0ZXJuICJDIiBpbnQgT0ZGTE9BRF9PRkZMT0FEKAorICAgIE9GRkxPQUQgbywKKyAgICBjb25zdCBjaGFyICpuYW1lLAorICAgIGludCBpc19lbXB0eSwKKyAgICBpbnQgbnVtX3ZhcnMsCisgICAgVmFyRGVzYyAqdmFycywKKyAgICBWYXJEZXNjMiAqdmFyczIsCisgICAgaW50IG51bV93YWl0cywKKyAgICBjb25zdCB2b2lkKiogd2FpdHMsCisgICAgY29uc3Qgdm9pZCogc2lnbmFsLAorICAgIGludCBlbnRyeV9pZCA9IDAsCisgICAgY29uc3Qgdm9pZCAqc3RhY2tfYWRkciA9IE5VTEwKKyk7CisKKy8vIEdsb2JhbCBjb3VudGVyIG9uIGhvc3QuCisvLyBUaGlzIHZhcmlhYmxlIGlzIHVzZWQgaWYgUDJPUFRfb2ZmbG9hZF9kb19kYXRhX3BlcnNpc3RlbmNlID09IDIuCisvLyBUaGUgdmFyaWFibGUgdXNlZCB0byBpZGVudGlmeSBvZmZsb2FkIGNvbnN0cnVjdHMgY29udGFpbmVkIGluIG9uZSBwcm9jZWR1cmUuCisvLyBDYWxsIHRvIE9GRkxPQURfQ0FMTF9DT1VOVCgpIGlzIGluc2VydGVkIGF0IEhPU1Qgb24gZW50cnkgb2YgdGhlIHJvdXRpbmUuCitleHRlcm4gIkMiIGludCAgT0ZGTE9BRF9DQUxMX0NPVU5UKCk7CisKKyNlbmRpZiAvLyBDT01QSUxFUl9JRl9IT1NUX0hfSU5DTFVERUQKZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL2NvbXBpbGVyX2lmX3RhcmdldC5jcHAgYi9maW5hbC9vZmZsb2FkL3NyYy9jb21waWxlcl9pZl90YXJnZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZjgyYjgKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9jb21waWxlcl9pZl90YXJnZXQuY3BwCkBAIC0wLDAgKzEsNDQgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImNvbXBpbGVyX2lmX3RhcmdldC5oIgorCitleHRlcm4gIkMiIHZvaWQgT0ZGTE9BRF9UQVJHRVRfRU5URVIoCisgICAgT0ZGTE9BRCBvZmxkLAorICAgIGludCB2YXJzX3RvdGFsLAorICAgIFZhckRlc2MgKnZhcnMsCisgICAgVmFyRGVzYzIgKnZhcnMyCispCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoJXAsICVkLCAlcCwgJXApXG4iLCBfX2Z1bmNfXywgb2ZsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhcnNfdG90YWwsIHZhcnMsIHZhcnMyKTsKKyAgICBvZmxkLT5tZXJnZV92YXJfZGVzY3ModmFycywgdmFyczIsIHZhcnNfdG90YWwpOworICAgIG9mbGQtPnNjYXR0ZXJfY29weWluX2RhdGEoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIE9GRkxPQURfVEFSR0VUX0xFQVZFKAorICAgIE9GRkxPQUQgb2ZsZAorKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzKCVwKVxuIiwgX19mdW5jX18sIG9mbGQpOworICAgIG9mbGQtPmdhdGhlcl9jb3B5b3V0X2RhdGEoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIE9GRkxPQURfVEFSR0VUX01BSU4odm9pZCkKK3sKKyAgICAvLyBpbml0aWFsaXplIHRhcmdldCBwYXJ0CisgICAgX19vZmZsb2FkX3RhcmdldF9pbml0KCk7CisKKyAgICAvLyBwYXNzIGNvbnRyb2wgdG8gQ09JCisgICAgUGlwZWxpbmVTdGFydEV4ZWN1dGluZ1J1bkZ1bmN0aW9ucygpOworICAgIFByb2Nlc3NXYWl0Rm9yU2h1dGRvd24oKTsKKworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkV4aXRpbmcgbWFpbi4uLlxuIik7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9jb21waWxlcl9pZl90YXJnZXQuaCBiL2ZpbmFsL29mZmxvYWQvc3JjL2NvbXBpbGVyX2lmX3RhcmdldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZDJjMWMKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9jb21waWxlcl9pZl90YXJnZXQuaApAQCAtMCwwICsxLDUwIEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKy8qISBcZmlsZQorICAgIFxicmllZiBUaGUgaW50ZXJmYWNlIGJldHdlZW4gY29tcGlsZXItZ2VuZXJhdGVkIHRhcmdldCBjb2RlIGFuZCBydW50aW1lIGxpYnJhcnkKKyovCisKKyNpZm5kZWYgQ09NUElMRVJfSUZfVEFSR0VUX0hfSU5DTFVERUQKKyNkZWZpbmUgQ09NUElMRVJfSUZfVEFSR0VUX0hfSU5DTFVERUQKKworI2luY2x1ZGUgIm9mZmxvYWRfdGFyZ2V0LmgiCisKKyNkZWZpbmUgT0ZGTE9BRF9UQVJHRVRfRU5URVIgICAgICAgICAgICBPRkZMT0FEX1BSRUZJWCh0YXJnZXRfZW50ZXIpCisjZGVmaW5lIE9GRkxPQURfVEFSR0VUX0xFQVZFICAgICAgICAgICAgT0ZGTE9BRF9QUkVGSVgodGFyZ2V0X2xlYXZlKQorI2RlZmluZSBPRkZMT0FEX1RBUkdFVF9NQUlOICAgICAgICAgICAgIE9GRkxPQURfUFJFRklYKHRhcmdldF9tYWluKQorCisvKiEgXGZuIE9GRkxPQURfVEFSR0VUX0VOVEVSCisgICAgXGJyaWVmIEZpbGwgaW4gdmFyaWFibGUgYWRkcmVzc2VzIHVzaW5nIFZhckRlc2MgYXJyYXkuCisgICAgXGJyaWVmIFRoZW4gY2FsbCBiYWNrIHRoZSBydW50aW1lIGxpYnJhcnkgdG8gZmV0Y2ggZGF0YS4KKyAgICBccGFyYW0gb2ZsZCAgICAgICAgIE9mZmxvYWQgZGVzY3JpcHRvciBjcmVhdGVkIGJ5IHJ1bnRpbWUuCisgICAgXHBhcmFtIHZhcl9kZXNjX251bSBOdW1iZXIgb2YgdmFyaWFibGUgZGVzY3JpcHRvcnMuCisgICAgXHBhcmFtIHZhcl9kZXNjICAgICBQb2ludGVyIHRvIFZhckRlc2MgYXJyYXkuCisgICAgXHBhcmFtIHZhcl9kZXNjMiAgICBQb2ludGVyIHRvIFZhckRlc2MyIGFycmF5LgorKi8KK2V4dGVybiAiQyIgdm9pZCBPRkZMT0FEX1RBUkdFVF9FTlRFUigKKyAgICBPRkZMT0FEIG9mbGQsCisgICAgaW50IHZhcl9kZXNjX251bSwKKyAgICBWYXJEZXNjICp2YXJfZGVzYywKKyAgICBWYXJEZXNjMiAqdmFyX2Rlc2MyCispOworCisvKiEgXGZuIE9GRkxPQURfVEFSR0VUX0xFQVZFCisgICAgXGJyaWVmIENhbGwgYmFjayB0aGUgcnVudGltZSBsaWJyYXJ5IHRvIGdhdGhlciBvdXRwdXRzIHVzaW5nIFZhckRlc2MgYXJyYXkuCisgICAgXHBhcmFtIG9mbGQgT2ZmbG9hZCBkZXNjcmlwdG9yIGNyZWF0ZWQgYnkgT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRS4KKyovCitleHRlcm4gIkMiIHZvaWQgT0ZGTE9BRF9UQVJHRVRfTEVBVkUoCisgICAgT0ZGTE9BRCBvZmxkCispOworCisvLyBFbnRyeSBwb2ludCBmb3IgdGhlIHRhcmdldCBhcHBsaWNhdGlvbi4KK2V4dGVybiAiQyIgdm9pZCBPRkZMT0FEX1RBUkdFVF9NQUlOKHZvaWQpOworCisjZW5kaWYgLy8gQ09NUElMRVJfSUZfVEFSR0VUX0hfSU5DTFVERUQKZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL2R2X3V0aWwuY3BwIGIvZmluYWwvb2ZmbG9hZC9zcmMvZHZfdXRpbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFkNzI3MQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL2R2X3V0aWwuY3BwCkBAIC0wLDAgKzEsMTMxIEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJvZmZsb2FkX2NvbW1vbi5oIgorCitib29sIF9fZHZfaXNfY29udGlndW91cyhjb25zdCBBcnJEZXNjICpkdnApCit7CisgICAgaWYgKGR2cC0+RmxhZ3MgJiBBcnJEZXNjRmxhZ3NDb250aWd1b3VzKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmIChkdnAtPlJhbmsgIT0gMCkgeworICAgICAgICBpZiAoZHZwLT5EaW1bMF0uTXVsdCAhPSBkdnAtPkxlbikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgZHZwLT5SYW5rOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChkdnAtPkRpbVtpXS5NdWx0ICE9CisgICAgICAgICAgICAgICAgZHZwLT5EaW1baS0xXS5FeHRlbnQgKiBkdnAtPkRpbVtpLTFdLk11bHQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgX19kdl9pc19hbGxvY2F0ZWQoY29uc3QgQXJyRGVzYyAqZHZwKQoreworICAgIHJldHVybiAoZHZwLT5GbGFncyAmIEFyckRlc2NGbGFnc0RlZmluZWQpOworfQorCit1aW50NjRfdCBfX2R2X2RhdGFfbGVuZ3RoKGNvbnN0IEFyckRlc2MgKmR2cCkKK3sKKyAgICB1aW50NjRfdCBzaXplOworCisgICAgaWYgKGR2cC0+UmFuayA9PSAwKSB7CisgICAgICAgIHNpemUgPSBkdnAtPkxlbjsKKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorCisgICAgc2l6ZSA9IGR2cC0+TGVuOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZHZwLT5SYW5rOyArK2kpIHsKKyAgICAgICAgc2l6ZSArPSAoZHZwLT5EaW1baV0uRXh0ZW50LTEpICogZHZwLT5EaW1baV0uTXVsdDsKKyAgICB9CisgICAgcmV0dXJuIHNpemU7Cit9CisKK3VpbnQ2NF90IF9fZHZfZGF0YV9sZW5ndGgoY29uc3QgQXJyRGVzYyAqZHZwLCBpbnQ2NF90IGNvdW50KQoreworICAgIGlmIChkdnAtPlJhbmsgPT0gMCkgeworICAgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50ICogZHZwLT5EaW1bMF0uTXVsdDsKK30KKworLy8gQ3JlYXRlIENlYW5SZWFkUmFuZ2VzIGRhdGEgZm9yIHJlYWRpbmcgY29udGlndW91cyByYW5nZXMgb2YKKy8vIG5vbmNvbnRpZ3VvdXMgYXJyYXkgZGVmaW5lZCBieSB0aGUgYXJndW1lbnQKK0NlYW5SZWFkUmFuZ2VzICogaW5pdF9yZWFkX3Jhbmdlc19kdihjb25zdCBBcnJEZXNjICpkdnApCit7CisgICAgaW50NjRfdCAgICAgICAgIGxlbjsKKyAgICBpbnQgICAgICAgICAgICAgY291bnQ7CisgICAgaW50ICAgICAgICAgICAgIHJhbmsgPSBkdnAtPlJhbms7CisgICAgQ2VhblJlYWRSYW5nZXMgKnJlcyA9IE5VTEw7CisKKyAgICBpZiAocmFuayAhPSAwKSB7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgbGVuID0gZHZwLT5MZW47CisgICAgICAgIGlmIChkdnAtPkRpbVswXS5NdWx0ID09IGxlbikgeworICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IHJhbms7IGkrKykgeworICAgICAgICAgICAgICAgIGxlbiAqPSBkdnAtPkRpbVtpLTFdLkV4dGVudDsKKyAgICAgICAgICAgICAgICBpZiAoZHZwLT5EaW1baV0uTXVsdCAhPSBsZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJlcyA9IChDZWFuUmVhZFJhbmdlcyAqKW1hbGxvYygKKyAgICAgICAgICAgIHNpemVvZihDZWFuUmVhZFJhbmdlcykgKyAocmFuayAtIGkpICogc2l6ZW9mKENlYW5SZWFkRGltKSk7CisgICAgICAgIHJlcyAtPiBsYXN0X25vbmNvbnRfaW5kID0gcmFuayAtIGkgLSAxOworICAgICAgICBjb3VudCA9IDE7CisgICAgICAgIGZvciAoOyBpIDwgcmFuazsgaSsrKSB7CisgICAgICAgICAgICByZXMtPkRpbVtyYW5rIC0gaSAtIDFdLmNvdW50ID0gY291bnQ7CisgICAgICAgICAgICByZXMtPkRpbVtyYW5rIC0gaSAtIDFdLnNpemUgPSBkdnAtPkRpbVtpXS5NdWx0OworICAgICAgICAgICAgY291bnQgKj0gZHZwLT5EaW1baV0uRXh0ZW50OworICAgICAgICB9CisgICAgICAgIHJlcyAtPiByYW5nZV9tYXhfbnVtYmVyID0gY291bnQ7CisgICAgICAgIHJlcyAtPiByYW5nZV9zaXplID0gbGVuOworICAgICAgICByZXMgLT4gcHRyID0gKHZvaWQqKWR2cC0+QmFzZTsKKyAgICAgICAgcmVzIC0+IGN1cnJlbnRfbnVtYmVyID0gMDsKKyAgICAgICAgcmVzIC0+IGluaXRfb2Zmc2V0ID0gMDsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworI2lmIE9GRkxPQURfREVCVUcgPiAwCit2b2lkIF9fZHZfZGVzY19kdW1wKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IEFyckRlc2MgKmR2cCkKK3sKKyAgICBPRkZMT0FEX1RSQUNFKDMsICIlcyBEViAlcFxuIiwgbmFtZSwgZHZwKTsKKworICAgIGlmIChkdnAgIT0gMCkgeworICAgICAgICBPRkZMT0FEX1RSQUNFKDMsCisgICAgICAgICAgICAgICAgICAgICAgIiAgICBkdi0+QmFzZSAgID0gMHglbHhcbiIKKyAgICAgICAgICAgICAgICAgICAgICAiICAgIGR2LT5MZW4gICAgPSAweCVseFxuIgorICAgICAgICAgICAgICAgICAgICAgICIgICAgZHYtPk9mZnNldCA9IDB4JWx4XG4iCisgICAgICAgICAgICAgICAgICAgICAgIiAgICBkdi0+RmxhZ3MgID0gMHglbHhcbiIKKyAgICAgICAgICAgICAgICAgICAgICAiICAgIGR2LT5SYW5rICAgPSAweCVseFxuIgorICAgICAgICAgICAgICAgICAgICAgICIgICAgZHYtPlJlc3J2ZCA9IDB4JWx4XG4iLAorICAgICAgICAgICAgICAgICAgICAgIGR2cC0+QmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICBkdnAtPkxlbiwKKyAgICAgICAgICAgICAgICAgICAgICBkdnAtPk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICBkdnAtPkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgIGR2cC0+UmFuaywKKyAgICAgICAgICAgICAgICAgICAgICBkdnAtPlJlc2VydmVkKTsKKworICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBkdnAtPlJhbms7IGkrKykgeworICAgICAgICAgICAgT0ZGTE9BRF9UUkFDRSgzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICglZCkgRXh0ZW50PSVsZCwgTXVsdGlwbGllcj0lbGQsIExvd2VyQm91bmQ9JWxkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkdnAtPkRpbVtpXS5FeHRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGR2cC0+RGltW2ldLk11bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGR2cC0+RGltW2ldLkxvd2VyQm91bmQpOworICAgICAgICB9CisgICAgfQorfQorI2VuZGlmIC8vIE9GRkxPQURfREVCVUcgPiAwCmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9kdl91dGlsLmggYi9maW5hbC9vZmZsb2FkL3NyYy9kdl91dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRmYTc3ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL2R2X3V0aWwuaApAQCAtMCwwICsxLDYzIEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgRFZfVVRJTF9IX0lOQ0xVREVECisjZGVmaW5lIERWX1VUSUxfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8vIERvcGUgdmVjdG9yIGRlY2xhcmF0aW9ucworI2RlZmluZSBBcnJEZXNjTWF4QXJyYXlSYW5rICAgICAgICAgMzEKKworLy8gRG9wZSB2ZWN0b3IgZmxhZ3MKKyNkZWZpbmUgQXJyRGVzY0ZsYWdzRGVmaW5lZCAgICAgICAgIDEKKyNkZWZpbmUgQXJyRGVzY0ZsYWdzTm9kZWFsbG9jICAgICAgIDIKKyNkZWZpbmUgQXJyRGVzY0ZsYWdzQ29udGlndW91cyAgICAgIDQKKwordHlwZWRlZiBpbnQ2NF90IGR2X3NpemU7CisKK3R5cGVkZWYgc3RydWN0IERpbURlc2MgeworICAgIGR2X3NpemUgICAgICAgIEV4dGVudDsgICAgICAvLyBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBkaW1lbnNpb24KKyAgICBkdl9zaXplICAgICAgICBNdWx0OyAgICAgICAgLy8gTXVsdGlwbGllciBmb3IgdGhpcyBkaW1lbnNpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBudW1iZXIgb2YgYnl0ZXMgYmV0d2VlbiBzdWNjZXNzaXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnRzIGluIHRoaXMgZGltZW5zaW9uLgorICAgIGR2X3NpemUgICAgICAgIExvd2VyQm91bmQ7ICAvLyBMb3dlckJvdW5kIG9mIHRoaXMgZGltZW5zaW9uCit9IERpbURlc2MgOworCit0eXBlZGVmIHN0cnVjdCBBcnJEZXNjIHsKKyAgICBkdl9zaXplICAgICAgICBCYXNlOyAgICAgICAgLy8gQmFzZSBhZGRyZXNzCisgICAgZHZfc2l6ZSAgICAgICAgTGVuOyAgICAgICAgIC8vIExlbmd0aCBvZiBkYXRhIHR5cGUsIHVzZWQgb25seSBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhcmFjdGVyIHN0cmluZ3MuCisgICAgZHZfc2l6ZSAgICAgICAgT2Zmc2V0OworICAgIGR2X3NpemUgICAgICAgIEZsYWdzOyAgICAgICAvLyBGbGFncworICAgIGR2X3NpemUgICAgICAgIFJhbms7ICAgICAgICAvLyBSYW5rIG9mIHBvaW50ZXIKKyAgICBkdl9zaXplICAgICAgICBSZXNlcnZlZDsgICAgLy8gcmVzZXJ2ZWQgZm9yIG9wZW5tcCByZXF1ZXN0cworICAgIERpbURlc2MgRGltW0FyckRlc2NNYXhBcnJheVJhbmtdOworfSBBcnJEZXNjIDsKKwordHlwZWRlZiBBcnJEZXNjKiBwQXJyRGVzYzsKKworYm9vbCBfX2R2X2lzX2NvbnRpZ3VvdXMoY29uc3QgQXJyRGVzYyAqZHZwKTsKKworYm9vbCBfX2R2X2lzX2FsbG9jYXRlZChjb25zdCBBcnJEZXNjICpkdnApOworCit1aW50NjRfdCBfX2R2X2RhdGFfbGVuZ3RoKGNvbnN0IEFyckRlc2MgKmR2cCk7CisKK3VpbnQ2NF90IF9fZHZfZGF0YV9sZW5ndGgoY29uc3QgQXJyRGVzYyAqZHZwLCBpbnQ2NF90IG5lbGVtcyk7CisKK0NlYW5SZWFkUmFuZ2VzICogaW5pdF9yZWFkX3Jhbmdlc19kdihjb25zdCBBcnJEZXNjICpkdnApOworCisjaWYgT0ZGTE9BRF9ERUJVRyA+IDAKK3ZvaWQgICAgX19kdl9kZXNjX2R1bXAoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgQXJyRGVzYyAqZHZwKTsKKyNlbHNlIC8vIE9GRkxPQURfREVCVUcKKyNkZWZpbmUgX19kdl9kZXNjX2R1bXAobmFtZSwgZHZwKQorI2VuZGlmIC8vIE9GRkxPQURfREVCVUcKKworI2VuZGlmIC8vIERWX1VUSUxfSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvbGlib2ZmbG9hZF9lcnJvci5jIGIvZmluYWwvb2ZmbG9hZC9zcmMvbGlib2ZmbG9hZF9lcnJvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMTVmOGIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9saWJvZmZsb2FkX2Vycm9yLmMKQEAgLTAsMCArMSw0NTIgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaWZuZGVmIHZhX2NvcHkKKyNkZWZpbmUgdmFfY29weShkc3QsIHNyYykgKChkc3QpID0gKHNyYykpCisjZW5kaWYKKworI2luY2x1ZGUgImxpYm9mZmxvYWRfbXNnLmgiCisKKyNpbmNsdWRlICJsaWJvZmZsb2FkX2Vycm9yX2NvZGVzLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGVycm9yLWhhbmRsaW5nIGZ1bmN0aW9uLCBsaWJvZmZsb2FkX2Vycm9yX3N1cHBvcnQgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBfX2xpYm9mZmxvYWRfZXJyb3Jfc3VwcG9ydChlcnJvcl90eXBlcyBpbnB1dF90YWcsIC4uLikKK3sKKyAgICB2YV9saXN0IGFyZ3M7CisgICAgdmFfc3RhcnQoYXJncywgaW5wdXRfdGFnKTsKKworICAgIHN3aXRjaCAoaW5wdXRfdGFnKSB7CisgICAgICAgIGNhc2UgY19kZXZpY2VfaXNfbm90X2F2YWlsYWJsZToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19kZXZpY2VfaXNfbm90X2F2YWlsYWJsZSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX2ludmFsaWRfZGV2aWNlX251bWJlcjoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19pbnZhbGlkX2RldmljZV9udW1iZXIsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19zZW5kX2Z1bmNfcHRyOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX3NlbmRfZnVuY19wdHIsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19yZWNlaXZlX2Z1bmNfcHRyOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX3JlY2VpdmVfZnVuY19wdHIsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX21hbGxvYzoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19vZmZsb2FkX21hbGxvYywgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWQxOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX29mZmxvYWQxLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfdW5rbm93bl92YXJfdHlwZToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBjX3Vua25vd25fdmFyX3R5cGUsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19pbnZhbGlkX2Vudl92YXJfdmFsdWU6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfaW52YWxpZF9lbnZfdmFyX3ZhbHVlLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfaW52YWxpZF9lbnZfdmFyX2ludF92YWx1ZToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19pbnZhbGlkX2Vudl92YXJfaW50X3ZhbHVlLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfaW52YWxpZF9lbnZfcmVwb3J0X3ZhbHVlOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX2ludmFsaWRfZW52X3JlcG9ydF92YWx1ZSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfc2lnbmFsZWQxOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX29mZmxvYWRfc2lnbmFsZWQxLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9zaWduYWxlZDI6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2Nfb2ZmbG9hZF9zaWduYWxlZDIsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19teW93cmFwcGVyX2NoZWNrcmVzdWx0OgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX215b3dyYXBwZXJfY2hlY2tyZXN1bHQsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19teW90YXJnZXRfY2hlY2tyZXN1bHQ6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfbXlvdGFyZ2V0X2NoZWNrcmVzdWx0LCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9kZXNjcmlwdG9yX29mZmxvYWQ6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2Nfb2ZmbG9hZF9kZXNjcmlwdG9yX29mZmxvYWQsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19tZXJnZV92YXJfZGVzY3MxOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX21lcmdlX3Zhcl9kZXNjczEsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19tZXJnZV92YXJfZGVzY3MyOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX21lcmdlX3Zhcl9kZXNjczIsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19taWNfcGFyc2VfZW52X3Zhcl9saXN0MToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19taWNfcGFyc2VfZW52X3Zhcl9saXN0MSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX21pY19wYXJzZV9lbnZfdmFyX2xpc3QyOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX21pY19wYXJzZV9lbnZfdmFyX2xpc3QyLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfbWljX3Byb2Nlc3NfZXhpdF9yZXQ6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfbWljX3Byb2Nlc3NfZXhpdF9yZXQsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19taWNfcHJvY2Vzc19leGl0X3NpZzoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19taWNfcHJvY2Vzc19leGl0X3NpZywgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX21pY19wcm9jZXNzX2V4aXQ6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfbWljX3Byb2Nlc3NfZXhpdCwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX21pY19pbml0MzoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19taWNfaW5pdDMsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19taWNfaW5pdDQ6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfbWljX2luaXQ0LCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfbWljX2luaXQ1OgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX21pY19pbml0NSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX21pY19pbml0NjoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19taWNfaW5pdDYsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19ub19zdGF0aWNfdmFyX2RhdGE6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2Nfbm9fc3RhdGljX3Zhcl9kYXRhLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfbm9fcHRyX2RhdGE6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2Nfbm9fcHRyX2RhdGEsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19nZXRfZW5naW5lX2hhbmRsZToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19nZXRfZW5naW5lX2hhbmRsZSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX2dldF9lbmdpbmVfaW5kZXg6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfZ2V0X2VuZ2luZV9pbmRleCwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX3Byb2Nlc3NfY3JlYXRlOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX3Byb2Nlc3NfY3JlYXRlLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfcHJvY2Vzc193YWl0X3NodXRkb3duOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX3Byb2Nlc3Nfd2FpdF9zaHV0ZG93biwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX3Byb2Nlc3NfcHJveHlfZmx1c2g6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfcHJvY2Vzc19wcm94eV9mbHVzaCwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX3Byb2Nlc3NfZ2V0X2Z1bmNfaGFuZGxlczoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19wcm9jZXNzX2dldF9mdW5jX2hhbmRsZXMsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19sb2FkX2xpYnJhcnk6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfbG9hZF9saWJyYXJ5LCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfY29pcGlwZV9tYXhfbnVtYmVyOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX2NvaV9waXBlbGluZV9tYXhfbnVtYmVyLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfcGlwZWxpbmVfY3JlYXRlOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX3BpcGVsaW5lX2NyZWF0ZSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX3BpcGVsaW5lX3J1bl9mdW5jOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX3BpcGVsaW5lX3J1bl9mdW5jLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfcGlwZWxpbmVfc3RhcnRfcnVuX2Z1bmNzOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX3BpcGVsaW5lX3N0YXJ0X3J1bl9mdW5jcywgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX2J1Zl9jcmVhdGU6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfYnVmX2NyZWF0ZSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX2J1Zl9jcmVhdGVfb3V0X29mX21lbToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19idWZfY3JlYXRlX291dF9vZl9tZW0sIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19idWZfY3JlYXRlX2Zyb21fbWVtOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX2J1Zl9jcmVhdGVfZnJvbV9tZW0sIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19idWZfZGVzdHJveToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19idWZfZGVzdHJveSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX2J1Zl9tYXA6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfYnVmX21hcCwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX2J1Zl91bm1hcDoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19idWZfdW5tYXAsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19idWZfcmVhZDoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19idWZfcmVhZCwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX2J1Zl93cml0ZToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19idWZfd3JpdGUsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19idWZfY29weToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19idWZfY29weSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX2J1Zl9nZXRfYWRkcmVzczoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19idWZfZ2V0X2FkZHJlc3MsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19idWZfYWRkX3JlZjoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19idWZfYWRkX3JlZiwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX2J1Zl9yZWxlYXNlX3JlZjoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19idWZfcmVsZWFzZV9yZWYsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19idWZfc2V0X3N0YXRlOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX2J1Zl9zZXRfc3RhdGUsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19ldmVudF93YWl0OgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX2V2ZW50X3dhaXQsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY196ZXJvX29yX25lZ19wdHJfbGVuOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX3plcm9fb3JfbmVnX3B0cl9sZW4sIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY196ZXJvX29yX25lZ190cmFuc2Zlcl9zaXplOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX3plcm9fb3JfbmVnX3RyYW5zZmVyX3NpemUsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19iYWRfcHRyX21lbV9yYW5nZToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19iYWRfcHRyX21lbV9yYW5nZSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX2RpZmZlcmVudF9zcmNfYW5kX2RzdG5fc2l6ZXM6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfZGlmZmVyZW50X3NyY19hbmRfZHN0bl9zaXplcywgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX3Jhbmdlc19kb250X21hdGNoOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX3Jhbmdlc19kb250X21hdGNoLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfZGVzdGluYXRpb25faXNfb3ZlcjoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19kZXN0aW5hdGlvbl9pc19vdmVyLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfc2xpY2Vfb2Zfbm9uY29udF9hcnJheToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19zbGljZV9vZl9ub25jb250X2FycmF5LCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfbm9uX2NvbnRpZ3VvdXNfZG9wZV92ZWN0b3I6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2Nfbm9uX2NvbnRpZ3VvdXNfZG9wZV92ZWN0b3IsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19wb2ludGVyX2FycmF5X21pc21hdGNoOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2gsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vbXBfaW52YWxpZF9kZXZpY2VfbnVtX2VudjoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19vbXBfaW52YWxpZF9kZXZpY2VfbnVtX2VudiwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29tcF9pbnZhbGlkX2RldmljZV9udW06CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2Nfb21wX2ludmFsaWRfZGV2aWNlX251bSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX3Vua25vd25fYmluYXJ5X3R5cGU6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfdW5rbm93bl9iaW5hcnlfdHlwZSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX211bHRpcGxlX3RhcmdldF9leGVzOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX211bHRpcGxlX3RhcmdldF9leGVzLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfbm9fdGFyZ2V0X2V4ZToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19ub190YXJnZXRfZXhlLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfcmVwb3J0X3Vua25vd25fdGltZXJfbm9kZToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19yZXBvcnRfdW5rbm93bl90aW1lcl9ub2RlLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfcmVwb3J0X3Vua25vd25fdHJhY2Vfbm9kZToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19yZXBvcnRfdW5rbm93bl90cmFjZV9ub2RlLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICB2YV9lbmQoYXJncyk7Cit9CisKK2NoYXIgY29uc3QgKiByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGVycm9yX3R5cGVzIGlucHV0X3RhZykKK3sKKyAgICBzd2l0Y2ggKGlucHV0X3RhZykgeworICAgICAgICBjYXNlIGNfcmVwb3J0X3RpdGxlOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfdGl0bGUpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9mcm9tX2ZpbGU6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9mcm9tX2ZpbGUpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9vZmZsb2FkOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfb2ZmbG9hZCkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X21pYzoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X21pYykpOworICAgICAgICBjYXNlIGNfcmVwb3J0X2ZpbGU6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9maWxlKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfbGluZToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2xpbmUpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9ob3N0OgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfaG9zdCkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X3RhZzoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3RhZykpOworICAgICAgICBjYXNlIGNfcmVwb3J0X2NwdV90aW1lOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfY3B1X3RpbWUpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9zZWNvbmRzOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfc2Vjb25kcykpOworICAgICAgICBjYXNlIGNfcmVwb3J0X2NwdV90b19taWNfZGF0YToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2NwdV90b19taWNfZGF0YSkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X2J5dGVzOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfYnl0ZXMpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9taWNfdGltZToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X21pY190aW1lKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfbWljX3RvX2NwdV9kYXRhOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfbWljX3RvX2NwdV9kYXRhKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfY29tcHV0ZToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2NvbXB1dGUpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9jb3B5aW5fZGF0YToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2NvcHlpbl9kYXRhKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfY29weW91dF9kYXRhOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfY29weW91dF9kYXRhKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfY3JlYXRlX2J1Zl9ob3N0OgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9jcmVhdGVfYnVmX2hvc3QpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9jcmVhdGVfYnVmX21pYzoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2NyZWF0ZV9idWZfbWljKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfZGVzdHJveToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2Rlc3Ryb3kpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9nYXRoZXJfY29weWluX2RhdGE6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9nYXRoZXJfY29weWluX2RhdGEpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9nYXRoZXJfY29weW91dF9kYXRhOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfZ2F0aGVyX2NvcHlvdXRfZGF0YSkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X3N0YXRlX3NpZ25hbDoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3N0YXRlX3NpZ25hbCkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X3NpZ25hbDoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3NpZ25hbCkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X3dhaXQ6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF93YWl0KSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfaW5pdDoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2luaXQpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9pbml0X2Z1bmM6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9pbml0X2Z1bmMpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9sb2dpY2FsX2NhcmQ6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9sb2dpY2FsX2NhcmQpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9taWNfbXlvX2ZwdHI6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9taWNfbXlvX2ZwdHIpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9taWNfbXlvX3NoYXJlZDoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X21pY19teW9fc2hhcmVkKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfbXlvYWNxdWlyZToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X215b2FjcXVpcmUpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9teW9maW5pOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfbXlvZmluaSkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X215b2luaXQ6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9teW9pbml0KSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfbXlvcmVnaXN0ZXI6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9teW9yZWdpc3RlcikpOworICAgICAgICBjYXNlIGNfcmVwb3J0X215b3JlbGVhc2U6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9teW9yZWxlYXNlKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfbXlvc2hhcmVkYWxpZ25lZGZyZWU6CisgICAgICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgICAgIG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9teW9zaGFyZWRhbGlnbmVkZnJlZSkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X215b3NoYXJlZGFsaWduZWRtYWxsb2M6CisgICAgICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgICAgIG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9teW9zaGFyZWRhbGlnbmVkbWFsbG9jKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfbXlvc2hhcmVkZnJlZToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X215b3NoYXJlZGZyZWUpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9teW9zaGFyZWRtYWxsb2M6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9teW9zaGFyZWRtYWxsb2MpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9waHlzaWNhbF9jYXJkOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfcGh5c2ljYWxfY2FyZCkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X3JlY2VpdmVfcG9pbnRlcl9kYXRhOgorICAgICAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgICAgICBvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfcmVjZWl2ZV9wb2ludGVyX2RhdGEpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9yZWNlaXZlZF9wb2ludGVyX2RhdGE6CisgICAgICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgICAgIG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9yZWNlaXZlZF9wb2ludGVyX2RhdGEpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9yZWdpc3RlcjoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3JlZ2lzdGVyKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfc2NhdHRlcl9jb3B5aW5fZGF0YToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3NjYXR0ZXJfY29weWluX2RhdGEpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9zY2F0dGVyX2NvcHlvdXRfZGF0YToKKyAgICAgICAgICAgIHJldHVybiAoCisgICAgICAgICAgICAgICAgb2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3NjYXR0ZXJfY29weW91dF9kYXRhKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfc2VuZF9wb2ludGVyX2RhdGE6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9zZW5kX3BvaW50ZXJfZGF0YSkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X3NlbnRfcG9pbnRlcl9kYXRhOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfc2VudF9wb2ludGVyX2RhdGEpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9zdGFydDoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3N0YXJ0KSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfc3RhcnRfdGFyZ2V0X2Z1bmM6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9zdGFydF90YXJnZXRfZnVuYykpOworICAgICAgICBjYXNlIGNfcmVwb3J0X3N0YXRlOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfc3RhdGUpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF91bnJlZ2lzdGVyOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfdW5yZWdpc3RlcikpOworICAgICAgICBjYXNlIGNfcmVwb3J0X3ZhcjoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3ZhcikpOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcmVwb3J0X3Vua25vd25fdHJhY2Vfbm9kZSk7CisgICAgICAgICAgICBhYm9ydCgpOworICAgIH0KK30KKworY2hhciBjb25zdCAqIHJlcG9ydF9nZXRfaG9zdF9zdGFnZV9zdHIoaW50IGkpCit7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2hvc3RfdG90YWxfb2ZmbG9hZDoKKyAgICAgICAgICAgIHJldHVybiAoCisgICAgICAgICAgICAgICBvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfaG9zdF90b3RhbF9vZmZsb2FkX3RpbWUpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfaG9zdF9pbml0aWFsaXplOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfaG9zdF9pbml0aWFsaXplKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2hvc3RfdGFyZ2V0X2FjcXVpcmU6CisgICAgICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgICAgIG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9ob3N0X3RhcmdldF9hY3F1aXJlKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2hvc3Rfd2FpdF9kZXBzOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfaG9zdF93YWl0X2RlcHMpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfaG9zdF9zZXR1cF9idWZmZXJzOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfaG9zdF9zZXR1cF9idWZmZXJzKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2hvc3RfYWxsb2NfYnVmZmVyczoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2hvc3RfYWxsb2NfYnVmZmVycykpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9ob3N0X3NldHVwX21pc2NfZGF0YToKKyAgICAgICAgICAgIHJldHVybiAoCisgICAgICAgICAgICAgICAgb2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2hvc3Rfc2V0dXBfbWlzY19kYXRhKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2hvc3RfYWxsb2NfZGF0YV9idWZmZXI6CisgICAgICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgICAgIG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9ob3N0X2FsbG9jX2RhdGFfYnVmZmVyKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2hvc3Rfc2VuZF9wb2ludGVyczoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2hvc3Rfc2VuZF9wb2ludGVycykpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9ob3N0X2dhdGhlcl9pbnB1dHM6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9ob3N0X2dhdGhlcl9pbnB1dHMpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfaG9zdF9tYXBfaW5fZGF0YV9idWZmZXI6CisgICAgICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgICAgIG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9ob3N0X21hcF9pbl9kYXRhX2J1ZmZlcikpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9ob3N0X3VubWFwX2luX2RhdGFfYnVmZmVyOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cigKKyAgICAgICAgICAgICAgICBtc2dfY19yZXBvcnRfaG9zdF91bm1hcF9pbl9kYXRhX2J1ZmZlcikpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9ob3N0X3N0YXJ0X2NvbXB1dGU6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9ob3N0X3N0YXJ0X2NvbXB1dGUpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfaG9zdF93YWl0X2NvbXB1dGU6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9ob3N0X3dhaXRfY29tcHV0ZSkpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9ob3N0X3N0YXJ0X2J1ZmZlcnNfcmVhZHM6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKAorICAgICAgICAgICAgICAgIG1zZ19jX3JlcG9ydF9ob3N0X3N0YXJ0X2J1ZmZlcnNfcmVhZHMpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfaG9zdF9zY2F0dGVyX291dHB1dHM6CisgICAgICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgICAgIG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9ob3N0X3NjYXR0ZXJfb3V0cHV0cykpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9ob3N0X21hcF9vdXRfZGF0YV9idWZmZXI6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKAorICAgICAgICAgICAgICAgIG1zZ19jX3JlcG9ydF9ob3N0X21hcF9vdXRfZGF0YV9idWZmZXIpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfaG9zdF91bm1hcF9vdXRfZGF0YV9idWZmZXI6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKAorICAgICAgICAgICAgICAgIG1zZ19jX3JlcG9ydF9ob3N0X3VubWFwX291dF9kYXRhX2J1ZmZlcikpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9ob3N0X3dhaXRfYnVmZmVyc19yZWFkczoKKyAgICAgICAgICAgIHJldHVybiAoCisgICAgICAgICAgICAgICAgb2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2hvc3Rfd2FpdF9idWZmZXJzX3JlYWRzKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2hvc3RfZGVzdHJveV9idWZmZXJzOgorICAgICAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgICAgICBvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfaG9zdF9kZXN0cm95X2J1ZmZlcnMpKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19yZXBvcnRfdW5rbm93bl90aW1lcl9ub2RlKTsKKyAgICAgICAgICAgIGFib3J0KCk7CisgICAgfQorfQorCitjaGFyIGNvbnN0ICogcmVwb3J0X2dldF90YXJnZXRfc3RhZ2Vfc3RyKGludCBpKQoreworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIGNfb2ZmbG9hZF90YXJnZXRfdG90YWxfdGltZToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3RhcmdldF90b3RhbF90aW1lKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX3RhcmdldF9kZXNjcmlwdG9yX3NldHVwOgorICAgICAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgICAgICBvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfdGFyZ2V0X2Rlc2NyaXB0b3Jfc2V0dXApKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfdGFyZ2V0X2Z1bmNfbG9va3VwOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfdGFyZ2V0X2Z1bmNfbG9va3VwKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX3RhcmdldF9mdW5jX3RpbWU6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF90YXJnZXRfZnVuY190aW1lKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX3RhcmdldF9zY2F0dGVyX2lucHV0czoKKyAgICAgICAgICAgIHJldHVybiAoCisgICAgICAgICAgICAgICAgb2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3RhcmdldF9zY2F0dGVyX2lucHV0cykpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF90YXJnZXRfYWRkX2J1ZmZlcl9yZWZzOgorICAgICAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgICAgICBvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfdGFyZ2V0X2FkZF9idWZmZXJfcmVmcykpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF90YXJnZXRfY29tcHV0ZToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3RhcmdldF9jb21wdXRlKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX3RhcmdldF9nYXRoZXJfb3V0cHV0czoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIKKyAgICAgICAgICAgICAgICAobXNnX2NfcmVwb3J0X3RhcmdldF9nYXRoZXJfb3V0cHV0cykpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF90YXJnZXRfcmVsZWFzZV9idWZmZXJfcmVmczoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIoCisgICAgICAgICAgICAgICAgbXNnX2NfcmVwb3J0X3RhcmdldF9yZWxlYXNlX2J1ZmZlcl9yZWZzKSk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcmVwb3J0X3Vua25vd25fdGltZXJfbm9kZSk7CisgICAgICAgICAgICBhYm9ydCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL2xpYm9mZmxvYWRfZXJyb3JfY29kZXMuaCBiL2ZpbmFsL29mZmxvYWQvc3JjL2xpYm9mZmxvYWRfZXJyb3JfY29kZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODIxNjdiCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvbGlib2ZmbG9hZF9lcnJvcl9jb2Rlcy5oCkBAIC0wLDAgKzEsMjc2IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZiAhZGVmaW5lZChMSUJPRkZMT0FEX0VSUk9SX0NPREVTX0gpCisjZGVmaW5lIExJQk9GRkxPQURfRVJST1JfQ09ERVNfSAorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3R5cGVkZWYgZW51bQoreworICAgIGNfZGV2aWNlX2lzX25vdF9hdmFpbGFibGUgPSAwLAorICAgIGNfaW52YWxpZF9kZXZpY2VfbnVtYmVyLAorICAgIGNfb2ZmbG9hZDEsCisgICAgY191bmtub3duX3Zhcl90eXBlLAorICAgIGNfc2VuZF9mdW5jX3B0ciwKKyAgICBjX3JlY2VpdmVfZnVuY19wdHIsCisgICAgY19vZmZsb2FkX21hbGxvYywKKyAgICBjX2ludmFsaWRfZW52X3Zhcl92YWx1ZSwKKyAgICBjX2ludmFsaWRfZW52X3Zhcl9pbnRfdmFsdWUsCisgICAgY19pbnZhbGlkX2Vudl9yZXBvcnRfdmFsdWUsCisgICAgY19vZmZsb2FkX3NpZ25hbGVkMSwKKyAgICBjX29mZmxvYWRfc2lnbmFsZWQyLAorICAgIGNfbXlvdGFyZ2V0X2NoZWNrcmVzdWx0LAorICAgIGNfbXlvd3JhcHBlcl9jaGVja3Jlc3VsdCwKKyAgICBjX29mZmxvYWRfZGVzY3JpcHRvcl9vZmZsb2FkLAorICAgIGNfbWVyZ2VfdmFyX2Rlc2NzMSwKKyAgICBjX21lcmdlX3Zhcl9kZXNjczIsCisgICAgY19taWNfcGFyc2VfZW52X3Zhcl9saXN0MSwKKyAgICBjX21pY19wYXJzZV9lbnZfdmFyX2xpc3QyLAorICAgIGNfbWljX3Byb2Nlc3NfZXhpdF9yZXQsCisgICAgY19taWNfcHJvY2Vzc19leGl0X3NpZywKKyAgICBjX21pY19wcm9jZXNzX2V4aXQsCisgICAgY19taWNfaW5pdDMsCisgICAgY19taWNfaW5pdDQsCisgICAgY19taWNfaW5pdDUsCisgICAgY19taWNfaW5pdDYsCisgICAgY19ub19zdGF0aWNfdmFyX2RhdGEsCisgICAgY19ub19wdHJfZGF0YSwKKyAgICBjX2dldF9lbmdpbmVfaGFuZGxlLAorICAgIGNfZ2V0X2VuZ2luZV9pbmRleCwKKyAgICBjX3Byb2Nlc3NfY3JlYXRlLAorICAgIGNfcHJvY2Vzc19nZXRfZnVuY19oYW5kbGVzLAorICAgIGNfcHJvY2Vzc193YWl0X3NodXRkb3duLAorICAgIGNfcHJvY2Vzc19wcm94eV9mbHVzaCwKKyAgICBjX2xvYWRfbGlicmFyeSwKKyAgICBjX3BpcGVsaW5lX2NyZWF0ZSwKKyAgICBjX3BpcGVsaW5lX3J1bl9mdW5jLAorICAgIGNfcGlwZWxpbmVfc3RhcnRfcnVuX2Z1bmNzLAorICAgIGNfYnVmX2NyZWF0ZSwKKyAgICBjX2J1Zl9jcmVhdGVfb3V0X29mX21lbSwKKyAgICBjX2J1Zl9jcmVhdGVfZnJvbV9tZW0sCisgICAgY19idWZfZGVzdHJveSwKKyAgICBjX2J1Zl9tYXAsCisgICAgY19idWZfdW5tYXAsCisgICAgY19idWZfcmVhZCwKKyAgICBjX2J1Zl93cml0ZSwKKyAgICBjX2J1Zl9jb3B5LAorICAgIGNfYnVmX2dldF9hZGRyZXNzLAorICAgIGNfYnVmX2FkZF9yZWYsCisgICAgY19idWZfcmVsZWFzZV9yZWYsCisgICAgY19idWZfc2V0X3N0YXRlLAorICAgIGNfZXZlbnRfd2FpdCwKKyAgICBjX3plcm9fb3JfbmVnX3B0cl9sZW4sCisgICAgY196ZXJvX29yX25lZ190cmFuc2Zlcl9zaXplLAorICAgIGNfYmFkX3B0cl9tZW1fcmFuZ2UsCisgICAgY19kaWZmZXJlbnRfc3JjX2FuZF9kc3RuX3NpemVzLAorICAgIGNfcmFuZ2VzX2RvbnRfbWF0Y2gsCisgICAgY19kZXN0aW5hdGlvbl9pc19vdmVyLAorICAgIGNfc2xpY2Vfb2Zfbm9uY29udF9hcnJheSwKKyAgICBjX25vbl9jb250aWd1b3VzX2RvcGVfdmVjdG9yLAorICAgIGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwKKyAgICBjX29tcF9pbnZhbGlkX2RldmljZV9udW1fZW52LAorICAgIGNfb21wX2ludmFsaWRfZGV2aWNlX251bSwKKyAgICBjX3Vua25vd25fYmluYXJ5X3R5cGUsCisgICAgY19tdWx0aXBsZV90YXJnZXRfZXhlcywKKyAgICBjX25vX3RhcmdldF9leGUsCisgICAgY19yZXBvcnRfaG9zdCwKKyAgICBjX3JlcG9ydF90YXJnZXQsCisgICAgY19yZXBvcnRfdGl0bGUsCisgICAgY19yZXBvcnRfZnJvbV9maWxlLAorICAgIGNfcmVwb3J0X2ZpbGUsCisgICAgY19yZXBvcnRfbGluZSwKKyAgICBjX3JlcG9ydF90YWcsCisgICAgY19yZXBvcnRfc2Vjb25kcywKKyAgICBjX3JlcG9ydF9ieXRlcywKKyAgICBjX3JlcG9ydF9taWMsCisgICAgY19yZXBvcnRfY3B1X3RpbWUsCisgICAgY19yZXBvcnRfY3B1X3RvX21pY19kYXRhLAorICAgIGNfcmVwb3J0X21pY190aW1lLAorICAgIGNfcmVwb3J0X21pY190b19jcHVfZGF0YSwKKyAgICBjX3JlcG9ydF91bmtub3duX3RpbWVyX25vZGUsCisgICAgY19yZXBvcnRfdW5rbm93bl90cmFjZV9ub2RlLAorICAgIGNfcmVwb3J0X29mZmxvYWQsCisgICAgY19yZXBvcnRfd190YWcsCisgICAgY19yZXBvcnRfc3RhdGUsCisgICAgY19yZXBvcnRfc3RhcnQsCisgICAgY19yZXBvcnRfaW5pdCwKKyAgICBjX3JlcG9ydF9sb2dpY2FsX2NhcmQsCisgICAgY19yZXBvcnRfcGh5c2ljYWxfY2FyZCwKKyAgICBjX3JlcG9ydF9yZWdpc3RlciwKKyAgICBjX3JlcG9ydF9pbml0X2Z1bmMsCisgICAgY19yZXBvcnRfY3JlYXRlX2J1Zl9ob3N0LAorICAgIGNfcmVwb3J0X2NyZWF0ZV9idWZfbWljLAorICAgIGNfcmVwb3J0X3NlbmRfcG9pbnRlcl9kYXRhLAorICAgIGNfcmVwb3J0X3NlbnRfcG9pbnRlcl9kYXRhLAorICAgIGNfcmVwb3J0X2dhdGhlcl9jb3B5aW5fZGF0YSwKKyAgICBjX3JlcG9ydF9jb3B5aW5fZGF0YSwKKyAgICBjX3JlcG9ydF9zdGF0ZV9zaWduYWwsCisgICAgY19yZXBvcnRfc2lnbmFsLAorICAgIGNfcmVwb3J0X3dhaXQsCisgICAgY19yZXBvcnRfY29tcHV0ZSwKKyAgICBjX3JlcG9ydF9yZWNlaXZlX3BvaW50ZXJfZGF0YSwKKyAgICBjX3JlcG9ydF9yZWNlaXZlZF9wb2ludGVyX2RhdGEsCisgICAgY19yZXBvcnRfc3RhcnRfdGFyZ2V0X2Z1bmMsCisgICAgY19yZXBvcnRfdmFyLAorICAgIGNfcmVwb3J0X3NjYXR0ZXJfY29weWluX2RhdGEsCisgICAgY19yZXBvcnRfZ2F0aGVyX2NvcHlvdXRfZGF0YSwKKyAgICBjX3JlcG9ydF9zY2F0dGVyX2NvcHlvdXRfZGF0YSwKKyAgICBjX3JlcG9ydF9jb3B5b3V0X2RhdGEsCisgICAgY19yZXBvcnRfdW5yZWdpc3RlciwKKyAgICBjX3JlcG9ydF9kZXN0cm95LAorICAgIGNfcmVwb3J0X215b2luaXQsCisgICAgY19yZXBvcnRfbXlvcmVnaXN0ZXIsCisgICAgY19yZXBvcnRfbXlvZmluaSwKKyAgICBjX3JlcG9ydF9taWNfbXlvX3NoYXJlZCwKKyAgICBjX3JlcG9ydF9taWNfbXlvX2ZwdHIsCisgICAgY19yZXBvcnRfbXlvc2hhcmVkbWFsbG9jLAorICAgIGNfcmVwb3J0X215b3NoYXJlZGZyZWUsCisgICAgY19yZXBvcnRfbXlvc2hhcmVkYWxpZ25lZG1hbGxvYywKKyAgICBjX3JlcG9ydF9teW9zaGFyZWRhbGlnbmVkZnJlZSwKKyAgICBjX3JlcG9ydF9teW9hY3F1aXJlLAorICAgIGNfcmVwb3J0X215b3JlbGVhc2UsCisgICAgY19jb2lwaXBlX21heF9udW1iZXIKK30gZXJyb3JfdHlwZXM7CisKK2VudW0gT2ZmbG9hZEhvc3RQaGFzZSB7CisgICAgLy8gVG90YWwgdGltZSBvbiBob3N0IGZvciBlbnRpcmUgb2ZmbG9hZAorICAgIGNfb2ZmbG9hZF9ob3N0X3RvdGFsX29mZmxvYWQgPSAwLAorCisgICAgLy8gVGltZSB0byBsb2FkIHRhcmdldCBiaW5hcnkKKyAgICBjX29mZmxvYWRfaG9zdF9pbml0aWFsaXplLAorCisgICAgLy8gVGltZSB0byBhY3F1aXJlIGxyYiBhdmFpbGFiaWxpdHkgZHluYW1pY2FsbHkKKyAgICBjX29mZmxvYWRfaG9zdF90YXJnZXRfYWNxdWlyZSwKKworICAgIC8vIFRpbWUgdG8gd2FpdCBmb3IgZGVwZW5kZW5jaWVzCisgICAgY19vZmZsb2FkX2hvc3Rfd2FpdF9kZXBzLAorCisgICAgLy8gVGltZSB0byBhbGxvY2F0ZSBwb2ludGVyIGJ1ZmZlcnMsIGluaXRpYXRlIHdyaXRlcyBmb3IgcG9pbnRlcnMKKyAgICAvLyBhbmQgY2FsY3VsYXRlIHNpemUgb2YgY29weWluL2NvcHlvdXQgYnVmZmVyCisgICAgY19vZmZsb2FkX2hvc3Rfc2V0dXBfYnVmZmVycywKKworICAgIC8vIFRpbWUgdG8gYWxsb2NhdGUgcG9pbnRlciBidWZmZXJzCisgICAgY19vZmZsb2FkX2hvc3RfYWxsb2NfYnVmZmVycywKKworICAgIC8vIFRpbWUgdG8gaW5pdGlhbGl6ZSBtaXNjIGRhdGEKKyAgICBjX29mZmxvYWRfaG9zdF9zZXR1cF9taXNjX2RhdGEsCisKKyAgICAvLyBUaW1lIHRvIGFsbG9jYXRlIGNvcHlpbi9jb3B5b3V0IGJ1ZmZlcgorICAgIGNfb2ZmbG9hZF9ob3N0X2FsbG9jX2RhdGFfYnVmZmVyLAorCisgICAgLy8gVGltZSB0byBpbml0aWF0ZSB3cml0ZXMgZnJvbSBob3N0IHBvaW50ZXJzIHRvIGJ1ZmZlcnMKKyAgICBjX29mZmxvYWRfaG9zdF9zZW5kX3BvaW50ZXJzLAorCisgICAgLy8gVGltZSB0byBHYXRoZXIgSU4gZGF0YSBvZiBvZmZsb2FkIGludG8gYnVmZmVyCisgICAgY19vZmZsb2FkX2hvc3RfZ2F0aGVyX2lucHV0cywKKworICAgIC8vIFRpbWUgdG8gbWFwIGJ1ZmZlcgorICAgIGNfb2ZmbG9hZF9ob3N0X21hcF9pbl9kYXRhX2J1ZmZlciwKKworICAgIC8vIFRpbWUgdG8gdW5tYXAgYnVmZmVyCisgICAgY19vZmZsb2FkX2hvc3RfdW5tYXBfaW5fZGF0YV9idWZmZXIsCisKKyAgICAvLyBUaW1lIHRvIHN0YXJ0IHJlbW90ZSBmdW5jdGlvbiBjYWxsIHRoYXQgZG9lcyBjb21wdXRhdGlvbiBvbiBscmIKKyAgICBjX29mZmxvYWRfaG9zdF9zdGFydF9jb21wdXRlLAorCisgICAgLy8gVGltZSB0byB3YWl0IGZvciBjb21wdXRlIHRvIGZpbmlzaAorICAgIGNfb2ZmbG9hZF9ob3N0X3dhaXRfY29tcHV0ZSwKKworICAgIC8vIFRpbWUgdG8gaW5pdGlhdGUgcmVhZHMgZnJvbSBwb2ludGVyIGJ1ZmZlcnMKKyAgICBjX29mZmxvYWRfaG9zdF9zdGFydF9idWZmZXJzX3JlYWRzLAorCisgICAgLy8gVGltZSB0byB1cGRhdGUgaG9zdCB2YXJpYWJlbHMgd2l0aCBPVVQgZGF0YSBmcm9tIGJ1ZmZlcgorICAgIGNfb2ZmbG9hZF9ob3N0X3NjYXR0ZXJfb3V0cHV0cywKKworICAgIC8vIFRpbWUgdG8gbWFwIGJ1ZmZlcgorICAgIGNfb2ZmbG9hZF9ob3N0X21hcF9vdXRfZGF0YV9idWZmZXIsCisKKyAgICAvLyBUaW1lIHRvIHVubWFwIGJ1ZmZlcgorICAgIGNfb2ZmbG9hZF9ob3N0X3VubWFwX291dF9kYXRhX2J1ZmZlciwKKworICAgIC8vIFRpbWUgdG8gd2FpdCByZWFkcyBmcm9tIGJ1ZmZlcnMgdG8gZmluaXNoCisgICAgY19vZmZsb2FkX2hvc3Rfd2FpdF9idWZmZXJzX3JlYWRzLAorCisgICAgLy8gVGltZSB0byBkZXN0cm95IGJ1ZmZlcnMgdGhhdCBhcmUgbm8gbG9uZ2VyIG5lZWRlZAorICAgIGNfb2ZmbG9hZF9ob3N0X2Rlc3Ryb3lfYnVmZmVycywKKworICAgIC8vIExBU1QgVElNRSBNT05JVE9SCisgICAgY19vZmZsb2FkX2hvc3RfbWF4X3BoYXNlCit9OworCitlbnVtIE9mZmxvYWRUYXJnZXRQaGFzZSB7CisgICAgLy8gVG90YWwgdGltZSBzcGVudCBvbiB0aGUgdGFyZ2V0CisgICAgY19vZmZsb2FkX3RhcmdldF90b3RhbF90aW1lID0gMCwKKworICAgIC8vIFRpbWUgdG8gaW5pdGlhbGl6ZSBvZmZsb2FkIGRlc2NyaXB0b3IKKyAgICBjX29mZmxvYWRfdGFyZ2V0X2Rlc2NyaXB0b3Jfc2V0dXAsCisKKyAgICAvLyBUaW1lIHRvIGZpbmQgdGFyZ2V0IGVudHJ5IHBvaW50IGluIGxvb2t1cCB0YWJsZQorICAgIGNfb2ZmbG9hZF90YXJnZXRfZnVuY19sb29rdXAsCisKKyAgICAvLyBUb3RhbCB0aW1lIHNwZW5kIGV4ZWN1dGluZyBvZmZsb2FkIGVudHJ5CisgICAgY19vZmZsb2FkX3RhcmdldF9mdW5jX3RpbWUsCisKKyAgICAvLyBUaW1lIHRvIGluaXRpYWxpemUgdGFyZ2V0IHZhcmlhYmxlcyB3aXRoIElOIHZhbHVlcyBmcm9tIGJ1ZmZlcgorICAgIGNfb2ZmbG9hZF90YXJnZXRfc2NhdHRlcl9pbnB1dHMsCisKKyAgICAvLyBUaW1lIHRvIGFkZCBidWZmZXIgcmVmZXJlbmNlIGZvciBwb2ludGVyIGJ1ZmZlcnMKKyAgICBjX29mZmxvYWRfdGFyZ2V0X2FkZF9idWZmZXJfcmVmcywKKworICAgIC8vIFRvdGFsIHRpbWUgb24gbHJiIGZvciBjb21wdXRhdGlvbgorICAgIGNfb2ZmbG9hZF90YXJnZXRfY29tcHV0ZSwKKworICAgIC8vIE9uIGxyYiwgdGltZSB0byBjb3B5IE9VVCBpbnRvIGJ1ZmZlcgorICAgIGNfb2ZmbG9hZF90YXJnZXRfZ2F0aGVyX291dHB1dHMsCisKKyAgICAvLyBUaW1lIHRvIHJlbGVhc2UgYnVmZmVyIHJlZmVyZW5jZXMKKyAgICBjX29mZmxvYWRfdGFyZ2V0X3JlbGVhc2VfYnVmZmVyX3JlZnMsCisKKyAgICAvLyBMQVNUIFRJTUUgTU9OSVRPUgorICAgIGNfb2ZmbG9hZF90YXJnZXRfbWF4X3BoYXNlCit9OworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCit2b2lkIF9fbGlib2ZmbG9hZF9lcnJvcl9zdXBwb3J0KGVycm9yX3R5cGVzIGlucHV0X3RhZywgLi4uKTsKK3ZvaWQgX19saWJvZmZsb2FkX3JlcG9ydF9zdXBwb3J0KGVycm9yX3R5cGVzIGlucHV0X3RhZywgLi4uKTsKK2NoYXIgY29uc3QgKm9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKGludCBtc2dDb2RlKTsKK2NoYXIgY29uc3QgKiByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGVycm9yX3R5cGVzIGlucHV0X3RhZyk7CitjaGFyIGNvbnN0ICogcmVwb3J0X2dldF9ob3N0X3N0YWdlX3N0cihpbnQgaSk7CitjaGFyIGNvbnN0ICogcmVwb3J0X2dldF90YXJnZXRfc3RhZ2Vfc3RyKGludCBpKTsKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNkZWZpbmUgdGVzdF9tc2dfY2F0KG5tLCBtc2cpIFwKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlx0IFRFU1QgZm9yICVzIFxuIFx0Iiwgbm0pOyBcCisgICAgX19saWJvZmZsb2FkX2Vycm9yX3N1cHBvcnQobXNnKTsKKworI2RlZmluZSB0ZXN0X21zZ19jYXQxKG5tLCBtc2csIC4uLikgXAorICAgIGZwcmludGYoc3RkZXJyLCAiXHQgVEVTVCBmb3IgJXMgXG4gXHQiLCBubSk7IFwKKyAgICBfX2xpYm9mZmxvYWRfZXJyb3Jfc3VwcG9ydChtc2csIF9fVkFfQVJHU19fKTsKKwordm9pZCB3cml0ZV9tZXNzYWdlKEZJTEUgKiBmaWxlLCBpbnQgbXNnQ29kZSwgdmFfbGlzdCBhcmdzX3ApOworCisjZGVmaW5lIExJQk9GRkxPQURfRVJST1IgX19saWJvZmZsb2FkX2Vycm9yX3N1cHBvcnQKKworI2lmZGVmIFRBUkdFVF9XSU5OVAorI2RlZmluZSBMSUJPRkZMT0FEX0FCT1JUIFwKKyAgICAgICAgIF9zZXRfYWJvcnRfYmVoYXZpb3IoMCwgX1dSSVRFX0FCT1JUX01TRyk7IFwKKyAgICAgICAgIGFib3J0KCkKKyNlbHNlCisjZGVmaW5lIExJQk9GRkxPQURfQUJPUlQgXAorICAgICAgICAgYWJvcnQoKQorI2VuZGlmCisKKyNlbmRpZiAvLyAhZGVmaW5lZChMSUJPRkZMT0FEX0VSUk9SX0NPREVTX0gpCmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9saWJvZmZsb2FkX21zZy5jIGIvZmluYWwvb2ZmbG9hZC9zcmMvbGlib2ZmbG9hZF9tc2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTYwMzkyCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvbGlib2ZmbG9hZF9tc2cuYwpAQCAtMCwwICsxLDM1IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gQnJpbmcgaW4gdGhlIHN0YXRpYyBzdHJpbmcgdGFibGUgYW5kIHRoZSBlbnVtZXJhdGlvbnMgZm9yIGluZGV4aW5nIGludG8KKy8vIGl0LgorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpbmNsdWRlICJsaWJvZmZsb2FkX21zZy5oIgorCisjIGRlZmluZSBEWU5BUlRfU1RERVJSX1BVVFMoX19tZXNzYWdlX3RleHRfXykgZnB1dHMoKF9fbWVzc2FnZV90ZXh0X18pLHN0ZGVycikKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBOb3cgdGhlIGNvZGUgZm9yIGFjY2Vzc2luZyB0aGUgbWVzc2FnZSBjYXRhbG9ncworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworICAgIHZvaWQgd3JpdGVfbWVzc2FnZShGSUxFICogZmlsZSwgaW50IG1zZ0NvZGUpIHsKKyAgICAgICAgZnB1dHMoTUVTU0FHRV9UQUJMRV9OQU1FWyBtc2dDb2RlIF0sIGZpbGUpOworICAgICAgICBmZmx1c2goZmlsZSk7CisgICAgfQorCisgICAgY2hhciBjb25zdCAqb2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIoaW50IG1zZ0NvZGUpIHsKKyAgICAgICAgcmV0dXJuIE1FU1NBR0VfVEFCTEVfTkFNRVsgbXNnQ29kZSBdOworICAgIH0KZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL2xpYm9mZmxvYWRfbXNnLmggYi9maW5hbC9vZmZsb2FkL3NyYy9saWJvZmZsb2FkX21zZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNDQ1ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9saWJvZmZsb2FkX21zZy5oCkBAIC0wLDAgKzEsMzI2IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBmaWxlOiBsaWJvZmZsb2FkX21zZy5oCitlbnVtIHsKKwlfX2R1bW15X18gPSAwLAorCW1zZ19jX2RldmljZV9pc19ub3RfYXZhaWxhYmxlLAorCW1zZ19jX2ludmFsaWRfZGV2aWNlX251bWJlciwKKwltc2dfY19zZW5kX2Z1bmNfcHRyLAorCW1zZ19jX3JlY2VpdmVfZnVuY19wdHIsCisJbXNnX2Nfb2ZmbG9hZF9tYWxsb2MsCisJbXNnX2Nfb2ZmbG9hZDEsCisJbXNnX2NfdW5rbm93bl92YXJfdHlwZSwKKwltc2dfY19pbnZhbGlkX2Vudl92YXJfdmFsdWUsCisJbXNnX2NfaW52YWxpZF9lbnZfdmFyX2ludF92YWx1ZSwKKwltc2dfY19pbnZhbGlkX2Vudl9yZXBvcnRfdmFsdWUsCisJbXNnX2Nfb2ZmbG9hZF9zaWduYWxlZDEsCisJbXNnX2Nfb2ZmbG9hZF9zaWduYWxlZDIsCisJbXNnX2NfbXlvd3JhcHBlcl9jaGVja3Jlc3VsdCwKKwltc2dfY19teW90YXJnZXRfY2hlY2tyZXN1bHQsCisJbXNnX2Nfb2ZmbG9hZF9kZXNjcmlwdG9yX29mZmxvYWQsCisJbXNnX2NfbWVyZ2VfdmFyX2Rlc2NzMSwKKwltc2dfY19tZXJnZV92YXJfZGVzY3MyLAorCW1zZ19jX21pY19wYXJzZV9lbnZfdmFyX2xpc3QxLAorCW1zZ19jX21pY19wYXJzZV9lbnZfdmFyX2xpc3QyLAorCW1zZ19jX21pY19wcm9jZXNzX2V4aXRfcmV0LAorCW1zZ19jX21pY19wcm9jZXNzX2V4aXRfc2lnLAorCW1zZ19jX21pY19wcm9jZXNzX2V4aXQsCisJbXNnX2NfbWljX2luaXQzLAorCW1zZ19jX21pY19pbml0NCwKKwltc2dfY19taWNfaW5pdDUsCisJbXNnX2NfbWljX2luaXQ2LAorCW1zZ19jX25vX3N0YXRpY192YXJfZGF0YSwKKwltc2dfY19ub19wdHJfZGF0YSwKKwltc2dfY19nZXRfZW5naW5lX2hhbmRsZSwKKwltc2dfY19nZXRfZW5naW5lX2luZGV4LAorCW1zZ19jX3Byb2Nlc3NfY3JlYXRlLAorCW1zZ19jX3Byb2Nlc3NfZ2V0X2Z1bmNfaGFuZGxlcywKKwltc2dfY19wcm9jZXNzX3dhaXRfc2h1dGRvd24sCisJbXNnX2NfcHJvY2Vzc19wcm94eV9mbHVzaCwKKwltc2dfY19sb2FkX2xpYnJhcnksCisJbXNnX2NfcGlwZWxpbmVfY3JlYXRlLAorCW1zZ19jX3BpcGVsaW5lX3J1bl9mdW5jLAorCW1zZ19jX3BpcGVsaW5lX3N0YXJ0X3J1bl9mdW5jcywKKwltc2dfY19idWZfY3JlYXRlLAorCW1zZ19jX2J1Zl9jcmVhdGVfb3V0X29mX21lbSwKKwltc2dfY19idWZfY3JlYXRlX2Zyb21fbWVtLAorCW1zZ19jX2J1Zl9kZXN0cm95LAorCW1zZ19jX2J1Zl9tYXAsCisJbXNnX2NfYnVmX3VubWFwLAorCW1zZ19jX2J1Zl9yZWFkLAorCW1zZ19jX2J1Zl93cml0ZSwKKwltc2dfY19idWZfY29weSwKKwltc2dfY19idWZfZ2V0X2FkZHJlc3MsCisJbXNnX2NfYnVmX2FkZF9yZWYsCisJbXNnX2NfYnVmX3JlbGVhc2VfcmVmLAorCW1zZ19jX2J1Zl9zZXRfc3RhdGUsCisJbXNnX2NfZXZlbnRfd2FpdCwKKwltc2dfY196ZXJvX29yX25lZ19wdHJfbGVuLAorCW1zZ19jX3plcm9fb3JfbmVnX3RyYW5zZmVyX3NpemUsCisJbXNnX2NfYmFkX3B0cl9tZW1fcmFuZ2UsCisJbXNnX2NfZGlmZmVyZW50X3NyY19hbmRfZHN0bl9zaXplcywKKwltc2dfY19ub25fY29udGlndW91c19kb3BlX3ZlY3RvciwKKwltc2dfY19vbXBfaW52YWxpZF9kZXZpY2VfbnVtX2VudiwKKwltc2dfY19vbXBfaW52YWxpZF9kZXZpY2VfbnVtLAorCW1zZ19jX3Vua25vd25fYmluYXJ5X3R5cGUsCisJbXNnX2NfbXVsdGlwbGVfdGFyZ2V0X2V4ZXMsCisJbXNnX2Nfbm9fdGFyZ2V0X2V4ZSwKKwltc2dfY19yZXBvcnRfdW5rbm93bl90aW1lcl9ub2RlLAorCW1zZ19jX3JlcG9ydF91bmtub3duX3RyYWNlX25vZGUsCisJbXNnX2NfcmVwb3J0X2hvc3QsCisJbXNnX2NfcmVwb3J0X21pYywKKwltc2dfY19yZXBvcnRfdGl0bGUsCisJbXNnX2NfcmVwb3J0X3NlY29uZHMsCisJbXNnX2NfcmVwb3J0X2J5dGVzLAorCW1zZ19jX3JlcG9ydF9jcHVfdGltZSwKKwltc2dfY19yZXBvcnRfbWljX3RpbWUsCisJbXNnX2NfcmVwb3J0X3RhZywKKwltc2dfY19yZXBvcnRfZnJvbV9maWxlLAorCW1zZ19jX3JlcG9ydF9maWxlLAorCW1zZ19jX3JlcG9ydF9saW5lLAorCW1zZ19jX3JlcG9ydF9jcHVfdG9fbWljX2RhdGEsCisJbXNnX2NfcmVwb3J0X21pY190b19jcHVfZGF0YSwKKwltc2dfY19yZXBvcnRfb2ZmbG9hZCwKKwltc2dfY19yZXBvcnRfd190YWcsCisJbXNnX2NfcmVwb3J0X3N0YXRlLAorCW1zZ19jX3JlcG9ydF9zdGFydCwKKwltc2dfY19yZXBvcnRfaW5pdCwKKwltc2dfY19yZXBvcnRfbG9naWNhbF9jYXJkLAorCW1zZ19jX3JlcG9ydF9waHlzaWNhbF9jYXJkLAorCW1zZ19jX3JlcG9ydF9yZWdpc3RlciwKKwltc2dfY19yZXBvcnRfaW5pdF9mdW5jLAorCW1zZ19jX3JlcG9ydF9jcmVhdGVfYnVmX2hvc3QsCisJbXNnX2NfcmVwb3J0X2NyZWF0ZV9idWZfbWljLAorCW1zZ19jX3JlcG9ydF9zZW5kX3BvaW50ZXJfZGF0YSwKKwltc2dfY19yZXBvcnRfc2VudF9wb2ludGVyX2RhdGEsCisJbXNnX2NfcmVwb3J0X2dhdGhlcl9jb3B5aW5fZGF0YSwKKwltc2dfY19yZXBvcnRfY29weWluX2RhdGEsCisJbXNnX2NfcmVwb3J0X3N0YXRlX3NpZ25hbCwKKwltc2dfY19yZXBvcnRfc2lnbmFsLAorCW1zZ19jX3JlcG9ydF93YWl0LAorCW1zZ19jX3JlcG9ydF9jb21wdXRlLAorCW1zZ19jX3JlcG9ydF9yZWNlaXZlX3BvaW50ZXJfZGF0YSwKKwltc2dfY19yZXBvcnRfcmVjZWl2ZWRfcG9pbnRlcl9kYXRhLAorCW1zZ19jX3JlcG9ydF9zdGFydF90YXJnZXRfZnVuYywKKwltc2dfY19yZXBvcnRfdmFyLAorCW1zZ19jX3JlcG9ydF9zY2F0dGVyX2NvcHlpbl9kYXRhLAorCW1zZ19jX3JlcG9ydF9nYXRoZXJfY29weW91dF9kYXRhLAorCW1zZ19jX3JlcG9ydF9zY2F0dGVyX2NvcHlvdXRfZGF0YSwKKwltc2dfY19yZXBvcnRfY29weW91dF9kYXRhLAorCW1zZ19jX3JlcG9ydF91bnJlZ2lzdGVyLAorCW1zZ19jX3JlcG9ydF9kZXN0cm95LAorCW1zZ19jX3JlcG9ydF9teW9pbml0LAorCW1zZ19jX3JlcG9ydF9teW9yZWdpc3RlciwKKwltc2dfY19yZXBvcnRfbXlvZmluaSwKKwltc2dfY19yZXBvcnRfbWljX215b19zaGFyZWQsCisJbXNnX2NfcmVwb3J0X21pY19teW9fZnB0ciwKKwltc2dfY19yZXBvcnRfbXlvc2hhcmVkbWFsbG9jLAorCW1zZ19jX3JlcG9ydF9teW9zaGFyZWRmcmVlLAorCW1zZ19jX3JlcG9ydF9teW9zaGFyZWRhbGlnbmVkbWFsbG9jLAorCW1zZ19jX3JlcG9ydF9teW9zaGFyZWRhbGlnbmVkZnJlZSwKKwltc2dfY19yZXBvcnRfbXlvYWNxdWlyZSwKKwltc2dfY19yZXBvcnRfbXlvcmVsZWFzZSwKKwltc2dfY19yZXBvcnRfaG9zdF90b3RhbF9vZmZsb2FkX3RpbWUsCisJbXNnX2NfcmVwb3J0X2hvc3RfaW5pdGlhbGl6ZSwKKwltc2dfY19yZXBvcnRfaG9zdF90YXJnZXRfYWNxdWlyZSwKKwltc2dfY19yZXBvcnRfaG9zdF93YWl0X2RlcHMsCisJbXNnX2NfcmVwb3J0X2hvc3Rfc2V0dXBfYnVmZmVycywKKwltc2dfY19yZXBvcnRfaG9zdF9hbGxvY19idWZmZXJzLAorCW1zZ19jX3JlcG9ydF9ob3N0X3NldHVwX21pc2NfZGF0YSwKKwltc2dfY19yZXBvcnRfaG9zdF9hbGxvY19kYXRhX2J1ZmZlciwKKwltc2dfY19yZXBvcnRfaG9zdF9zZW5kX3BvaW50ZXJzLAorCW1zZ19jX3JlcG9ydF9ob3N0X2dhdGhlcl9pbnB1dHMsCisJbXNnX2NfcmVwb3J0X2hvc3RfbWFwX2luX2RhdGFfYnVmZmVyLAorCW1zZ19jX3JlcG9ydF9ob3N0X3VubWFwX2luX2RhdGFfYnVmZmVyLAorCW1zZ19jX3JlcG9ydF9ob3N0X3N0YXJ0X2NvbXB1dGUsCisJbXNnX2NfcmVwb3J0X2hvc3Rfd2FpdF9jb21wdXRlLAorCW1zZ19jX3JlcG9ydF9ob3N0X3N0YXJ0X2J1ZmZlcnNfcmVhZHMsCisJbXNnX2NfcmVwb3J0X2hvc3Rfc2NhdHRlcl9vdXRwdXRzLAorCW1zZ19jX3JlcG9ydF9ob3N0X21hcF9vdXRfZGF0YV9idWZmZXIsCisJbXNnX2NfcmVwb3J0X2hvc3RfdW5tYXBfb3V0X2RhdGFfYnVmZmVyLAorCW1zZ19jX3JlcG9ydF9ob3N0X3dhaXRfYnVmZmVyc19yZWFkcywKKwltc2dfY19yZXBvcnRfaG9zdF9kZXN0cm95X2J1ZmZlcnMsCisJbXNnX2NfcmVwb3J0X3RhcmdldF90b3RhbF90aW1lLAorCW1zZ19jX3JlcG9ydF90YXJnZXRfZGVzY3JpcHRvcl9zZXR1cCwKKwltc2dfY19yZXBvcnRfdGFyZ2V0X2Z1bmNfbG9va3VwLAorCW1zZ19jX3JlcG9ydF90YXJnZXRfZnVuY190aW1lLAorCW1zZ19jX3JlcG9ydF90YXJnZXRfc2NhdHRlcl9pbnB1dHMsCisJbXNnX2NfcmVwb3J0X3RhcmdldF9hZGRfYnVmZmVyX3JlZnMsCisJbXNnX2NfcmVwb3J0X3RhcmdldF9jb21wdXRlLAorCW1zZ19jX3JlcG9ydF90YXJnZXRfZ2F0aGVyX291dHB1dHMsCisJbXNnX2NfcmVwb3J0X3RhcmdldF9yZWxlYXNlX2J1ZmZlcl9yZWZzLAorCW1zZ19jX2NvaV9waXBlbGluZV9tYXhfbnVtYmVyLAorCW1zZ19jX3Jhbmdlc19kb250X21hdGNoLAorCW1zZ19jX2Rlc3RpbmF0aW9uX2lzX292ZXIsCisJbXNnX2Nfc2xpY2Vfb2Zfbm9uY29udF9hcnJheSwKKwltc2dfY19wb2ludGVyX2FycmF5X21pc21hdGNoLAorCWxhc3RNc2cgPSAxNTIsCisJZmlyc3RNc2cgPSAxCit9OworCisKKyNpZiAhZGVmaW5lZChNRVNTQUdFX1RBQkxFX05BTUUpCisjICAgIGRlZmluZSBNRVNTQUdFX1RBQkxFX05BTUUgX19saWJvZmZsb2FkX21lc3NhZ2VfdGFibGUKKyNlbmRpZgorCitzdGF0aWMgY2hhciBjb25zdCAqIE1FU1NBR0VfVEFCTEVfTkFNRVtdID0geworCS8qICAgMCBfX2R1bW15X18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gIlVuLXVzZWQgbWVzc2FnZSIsCisJLyogICAxIG1zZ19jX2RldmljZV9pc19ub3RfYXZhaWxhYmxlICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogY2Fubm90IG9mZmxvYWQgdG8gTUlDIC0gZGV2aWNlIGlzIG5vdCBhdmFpbGFibGUiLAorCS8qICAgMiBtc2dfY19pbnZhbGlkX2RldmljZV9udW1iZXIgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGV4cGVjdGVkIGEgbnVtYmVyIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAtMSIsCisJLyogICAzIG1zZ19jX3NlbmRfZnVuY19wdHIgICAgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogY2Fubm90IGZpbmQgZnVuY3Rpb24gbmFtZSBmb3IgYWRkcmVzcyAlcCIsCisJLyogICA0IG1zZ19jX3JlY2VpdmVfZnVuY19wdHIgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogY2Fubm90IGZpbmQgYWRkcmVzcyBvZiBmdW5jdGlvbiAlcyIsCisJLyogICA1IG1zZ19jX29mZmxvYWRfbWFsbG9jICAgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIChyZXF1ZXN0ZWQ9JWxsZCBieXRlcywgYWxpZ24gJWxsZCkiLAorCS8qICAgNiBtc2dfY19vZmZsb2FkMSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGRldmljZSAlZCBkb2VzIG5vdCBoYXZlIGEgcGVuZGluZyBzaWduYWwgZm9yIHdhaXQoJXApIiwKKwkvKiAgIDcgbXNnX2NfdW5rbm93bl92YXJfdHlwZSAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiB1bmtub3duIHZhcmlhYmxlIHR5cGUgJWQiLAorCS8qICAgOCBtc2dfY19pbnZhbGlkX2Vudl92YXJfdmFsdWUgICAgICAgICAgICAgKi8gIm9mZmxvYWQgd2FybmluZzogaWdub3JpbmcgaW52YWxpZCB2YWx1ZSBzcGVjaWZpZWQgZm9yICVzIiwKKwkvKiAgIDkgbXNnX2NfaW52YWxpZF9lbnZfdmFyX2ludF92YWx1ZSAgICAgICAgICovICJvZmZsb2FkIHdhcm5pbmc6IHNwZWNpZnkgYW4gaW50ZWdlciB2YWx1ZSBmb3IgJXMiLAorCS8qICAxMCBtc2dfY19pbnZhbGlkX2Vudl9yZXBvcnRfdmFsdWUgICAgICAgICAgKi8gIm9mZmxvYWQgd2FybmluZzogaWdub3JpbmcgJXMgc2V0dGluZzsgdXNlIGEgdmFsdWUgaW4gcmFuZ2UgMS0zIiwKKwkvKiAgMTEgbXNnX2Nfb2ZmbG9hZF9zaWduYWxlZDEgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBpbnZhbGlkIGRldmljZSBudW1iZXIgJWQgc3BlY2lmaWVkIGluIF9PZmZsb2FkX3NpZ25hbGVkIiwKKwkvKiAgMTIgbXNnX2Nfb2ZmbG9hZF9zaWduYWxlZDIgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBpbnZhbGlkIHNpZ25hbCAlcCBzcGVjaWZpZWQgZm9yIF9PZmZsb2FkX3NpZ25hbGVkIiwKKwkvKiAgMTMgbXNnX2NfbXlvd3JhcHBlcl9jaGVja3Jlc3VsdCAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiAlcyBmYWlsZWQgd2l0aCBlcnJvciAlZCIsCisJLyogIDE0IG1zZ19jX215b3RhcmdldF9jaGVja3Jlc3VsdCAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogJXMgZmFpbGVkIHdpdGggZXJyb3IgJWQiLAorCS8qICAxNSBtc2dfY19vZmZsb2FkX2Rlc2NyaXB0b3Jfb2ZmbG9hZCAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCBmaW5kIG9mZmxvYWQgZW50cnkgJXMiLAorCS8qICAxNiBtc2dfY19tZXJnZV92YXJfZGVzY3MxICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IHVuZXhwZWN0ZWQgbnVtYmVyIG9mIHZhcmlhYmxlIGRlc2NyaXB0b3JzIiwKKwkvKiAgMTcgbXNnX2NfbWVyZ2VfdmFyX2Rlc2NzMiAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiB1bmV4cGVjdGVkIHZhcmlhYmxlIHR5cGUiLAorCS8qICAxOCBtc2dfY19taWNfcGFyc2VfZW52X3Zhcl9saXN0MSAgICAgICAgICAgKi8gIm9mZmxvYWRfZXJyb3I6IE1JQyBlbnZpcm9ubWVudCB2YXJpYWJsZSBtdXN0IGJlZ2luIHdpdGggYW4gYWxwYWJldGljIGNoYXJhY3RlciIsCisJLyogIDE5IG1zZ19jX21pY19wYXJzZV9lbnZfdmFyX2xpc3QyICAgICAgICAgICAqLyAib2ZmbG9hZF9lcnJvcjogTUlDIGVudmlyb25tZW50IHZhcmlhYmxlIHZhbHVlIG11c3QgYmUgc3BlY2lmaWVkIHdpdGggkT2SIiwKKwkvKiAgMjAgbXNnX2NfbWljX3Byb2Nlc3NfZXhpdF9yZXQgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBwcm9jZXNzIG9uIHRoZSBkZXZpY2UgJWQgdW5leHBlY3RlZGx5IGV4aXRlZCB3aXRoIGNvZGUgJWQiLAorCS8qICAyMSBtc2dfY19taWNfcHJvY2Vzc19leGl0X3NpZyAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IHByb2Nlc3Mgb24gdGhlIGRldmljZSAlZCB3YXMgdGVybWluYXRlZCBieSBzaWduYWwgJWQgKCVzKSIsCisJLyogIDIyIG1zZ19jX21pY19wcm9jZXNzX2V4aXQgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogcHJvY2VzcyBvbiB0aGUgZGV2aWNlICVkIHdhcyB1bmV4cGVjdGVkbHkgdGVybWluYXRlZCIsCisJLyogIDIzIG1zZ19jX21pY19pbml0MyAgICAgICAgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCB3YXJuaW5nOiBpZ25vcmluZyBNSUNfU1RBQ0tTSVpFIHNldHRpbmc7IHVzZSBhIHZhbHVlID49IDE2SyBhbmQgYSBtdWx0aXBsZSBvZiA0SyIsCisJLyogIDI0IG1zZ19jX21pY19pbml0NCAgICAgICAgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogdGhyZWFkIGtleSBjcmVhdGUgZmFpbGVkIHdpdGggZXJyb3IgJWQiLAorCS8qICAyNSBtc2dfY19taWNfaW5pdDUgICAgICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgd2FybmluZzogc3BlY2lmeSBPRkZMT0FEX0RFVklDRVMgYXMgY29tbWEtc2VwYXJhdGVkIHBoeXNpY2FsIGRldmljZSBudW1iZXJzIG9yICdub25lJyIsCisJLyogIDI2IG1zZ19jX21pY19pbml0NiAgICAgICAgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCB3YXJuaW5nOiBPRkZMT0FEX0RFVklDRVMgZGV2aWNlIG51bWJlciAlZCBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGEgcGh5c2ljYWwgZGV2aWNlIiwKKwkvKiAgMjcgbXNnX2Nfbm9fc3RhdGljX3Zhcl9kYXRhICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBjYW5ub3QgZmluZCBkYXRhIGFzc29jaWF0ZWQgd2l0aCBzdGF0aWNhbGx5IGFsbG9jYXRlZCB2YXJpYWJsZSAlcCIsCisJLyogIDI4IG1zZ19jX25vX3B0cl9kYXRhICAgICAgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogY2Fubm90IGZpbmQgZGF0YSBhc3NvY2lhdGVkIHdpdGggcG9pbnRlciB2YXJpYWJsZSAlcCIsCisJLyogIDI5IG1zZ19jX2dldF9lbmdpbmVfaGFuZGxlICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogY2Fubm90IGdldCBkZXZpY2UgJWQgaGFuZGxlIChlcnJvciBjb2RlICVkKSIsCisJLyogIDMwIG1zZ19jX2dldF9lbmdpbmVfaW5kZXggICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogY2Fubm90IGdldCBwaHlzaWNhbCBpbmRleCBmb3IgbG9naWNhbCBkZXZpY2UgJWQgKGVycm9yIGNvZGUgJWQpIiwKKwkvKiAgMzEgbXNnX2NfcHJvY2Vzc19jcmVhdGUgICAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBjYW5ub3Qgc3RhcnQgcHJvY2VzcyBvbiB0aGUgZGV2aWNlICVkIChlcnJvciBjb2RlICVkKSIsCisJLyogIDMyIG1zZ19jX3Byb2Nlc3NfZ2V0X2Z1bmNfaGFuZGxlcyAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogY2Fubm90IGdldCBmdW5jdGlvbiBoYW5kbGVzIG9uIHRoZSBkZXZpY2UgJWQgKGVycm9yIGNvZGUgJWQpIiwKKwkvKiAgMzMgbXNnX2NfcHJvY2Vzc193YWl0X3NodXRkb3duICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiB3YWl0IGZvciBwcm9jZXNzIHNodXRkb3duIGZhaWxlZCBvbiBkZXZpY2UgJWQgKGVycm9yIGNvZGUgJWQpIiwKKwkvKiAgMzQgbXNnX2NfcHJvY2Vzc19wcm94eV9mbHVzaCAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBjYW5ub3QgZmx1c2ggcHJvY2VzcyBvdXRwdXQgb24gZGV2aWNlICVkIChlcnJvciBjb2RlICVkKSIsCisJLyogIDM1IG1zZ19jX2xvYWRfbGlicmFyeSAgICAgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogY2Fubm90IGxvYWQgbGlicmFyeSB0byB0aGUgZGV2aWNlICVkIChlcnJvciBjb2RlICVkKSIsCisJLyogIDM2IG1zZ19jX3BpcGVsaW5lX2NyZWF0ZSAgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogY2Fubm90IGNyZWF0ZSBwaXBlbGluZSBvbiB0aGUgZGV2aWNlICVkIChlcnJvciBjb2RlICVkKSIsCisJLyogIDM3IG1zZ19jX3BpcGVsaW5lX3J1bl9mdW5jICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogY2Fubm90IGV4ZWN1dGUgZnVuY3Rpb24gb24gdGhlIGRldmljZSAlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICAzOCBtc2dfY19waXBlbGluZV9zdGFydF9ydW5fZnVuY3MgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCBzdGFydCBleGVjdXRpbmcgcGlwZWxpbmUgZnVuY3Rpb24gb24gdGhlIGRldmljZSAlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICAzOSBtc2dfY19idWZfY3JlYXRlICAgICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCBjcmVhdGUgYnVmZmVyIG9uIGRldmljZSAlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICA0MCBtc2dfY19idWZfY3JlYXRlX291dF9vZl9tZW0gICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCBjcmVhdGUgYnVmZmVyIG9uIGRldmljZSAlZCwgb3V0IG9mIG1lbW9yeSIsCisJLyogIDQxIG1zZ19jX2J1Zl9jcmVhdGVfZnJvbV9tZW0gICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogY2Fubm90IGNyZWF0ZSBidWZmZXIgZnJvbSBtZW1vcnkgb24gZGV2aWNlICVkIChlcnJvciBjb2RlICVkKSIsCisJLyogIDQyIG1zZ19jX2J1Zl9kZXN0cm95ICAgICAgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogYnVmZmVyIGRlc3Ryb3kgZmFpbGVkIChlcnJvciBjb2RlICVkKSIsCisJLyogIDQzIG1zZ19jX2J1Zl9tYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogYnVmZmVyIG1hcCBmYWlsZWQgKGVycm9yIGNvZGUgJWQpIiwKKwkvKiAgNDQgbXNnX2NfYnVmX3VubWFwICAgICAgICAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBidWZmZXIgdW5tYXAgZmFpbGVkIChlcnJvciBjb2RlICVkKSIsCisJLyogIDQ1IG1zZ19jX2J1Zl9yZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogYnVmZmVyIHJlYWQgZmFpbGVkIChlcnJvciBjb2RlICVkKSIsCisJLyogIDQ2IG1zZ19jX2J1Zl93cml0ZSAgICAgICAgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogYnVmZmVyIHdyaXRlIGZhaWxlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICA0NyBtc2dfY19idWZfY29weSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGJ1ZmZlciBjb3B5IGZhaWxlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICA0OCBtc2dfY19idWZfZ2V0X2FkZHJlc3MgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCBnZXQgYnVmZmVyIGFkZHJlc3Mgb24gZGV2aWNlICVkIChlcnJvciBjb2RlICVkKSIsCisJLyogIDQ5IG1zZ19jX2J1Zl9hZGRfcmVmICAgICAgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogY2Fubm90IHJldXNlIGJ1ZmZlciBtZW1vcnkgb24gZGV2aWNlICVkIChlcnJvciBjb2RlICVkKSIsCisJLyogIDUwIG1zZ19jX2J1Zl9yZWxlYXNlX3JlZiAgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogY2Fubm90IHJlbGVhc2UgYnVmZmVyIG1lbW9yeSBvbiBkZXZpY2UgJWQgKGVycm9yIGNvZGUgJWQpIiwKKwkvKiAgNTEgbXNnX2NfYnVmX3NldF9zdGF0ZSAgICAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBidWZmZXIgc2V0IHN0YXRlIGZhaWxlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICA1MiBtc2dfY19ldmVudF93YWl0ICAgICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IHdhaXQgZm9yIGV2ZW50IHRvIGJlY29tZSBzaWduYWxlZCBmYWlsZWQgKGVycm9yIGNvZGUgJWQpIiwKKwkvKiAgNTMgbXNnX2NfemVyb19vcl9uZWdfcHRyX2xlbiAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBtZW1vcnkgYWxsb2NhdGlvbiBvZiBuZWdhdGl2ZSBsZW5ndGggaXMgbm90IHN1cHBvcnRlZCIsCisJLyogIDU0IG1zZ19jX3plcm9fb3JfbmVnX3RyYW5zZmVyX3NpemUgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogZGF0YSB0cmFuc2ZlciBvZiB6ZXJvIG9yIG5lZ2F0aXZlIHNpemUgaXMgbm90IHN1cHBvcnRlZCIsCisJLyogIDU1IG1zZ19jX2JhZF9wdHJfbWVtX3JhbmdlICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogYWRkcmVzcyByYW5nZSBwYXJ0aWFsbHkgb3ZlcmxhcHMgd2l0aCBleGlzdGluZyBhbGxvY2F0aW9uIiwKKwkvKiAgNTYgbXNnX2NfZGlmZmVyZW50X3NyY19hbmRfZHN0bl9zaXplcyAgICAgICovICJvZmZsb2FkIGVycm9yOiBzaXplIG9mIHRoZSBzb3VyY2UgJWQgZGlmZmVycyBmcm9tIHNpemUgb2YgdGhlIGRlc3RpbmF0aW9uICVkIiwKKwkvKiAgNTcgbXNnX2Nfbm9uX2NvbnRpZ3VvdXNfZG9wZV92ZWN0b3IgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBvZmZsb2FkIGRhdGEgdHJhbnNmZXIgc3VwcG9ydHMgb25seSBhIHNpbmdsZSBjb250aWd1b3VzIG1lbW9yeSByYW5nZSBwZXIgdmFyaWFibGUiLAorCS8qICA1OCBtc2dfY19vbXBfaW52YWxpZF9kZXZpY2VfbnVtX2VudiAgICAgICAgKi8gIm9mZmxvYWQgd2FybmluZzogaWdub3JpbmcgJXMgc2V0dGluZzsgdXNlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgdmFsdWUiLAorCS8qICA1OSBtc2dfY19vbXBfaW52YWxpZF9kZXZpY2VfbnVtICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGRldmljZSBudW1iZXIgc2hvdWxkIGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgdmFsdWUiLAorCS8qICA2MCBtc2dfY191bmtub3duX2JpbmFyeV90eXBlICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IHVuZXhwZWN0ZWQgZW1iZWRkZWQgdGFyZ2V0IGJpbmFyeSB0eXBlLCBleHBlY3RlZCBlaXRoZXIgYW4gZXhlY3V0YWJsZSBvciBzaGFyZWQgbGlicmFyeSIsCisJLyogIDYxIG1zZ19jX211bHRpcGxlX3RhcmdldF9leGVzICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogbW9yZSB0aGF0IG9uZSB0YXJnZXQgZXhlY3V0YWJsZSBmb3VuZCIsCisJLyogIDYyIG1zZ19jX25vX3RhcmdldF9leGUgICAgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogdGFyZ2V0IGV4ZWN1dGFibGUgaXMgbm90IGF2YWlsYWJsZSIsCisJLyogIDYzIG1zZ19jX3JlcG9ydF91bmtub3duX3RpbWVyX25vZGUgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogdW5rbm93biB0aW1lciBub2RlIiwKKwkvKiAgNjQgbXNnX2NfcmVwb3J0X3Vua25vd25fdHJhY2Vfbm9kZSAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiB1bmtub3duIHRyYWNlIG5vZGUiLAorCS8qICA2NSBtc2dfY19yZXBvcnRfaG9zdCAgICAgICAgICAgICAgICAgICAgICAgKi8gIkhPU1QiLAorCS8qICA2NiBtc2dfY19yZXBvcnRfbWljICAgICAgICAgICAgICAgICAgICAgICAgKi8gIk1JQyIsCisJLyogIDY3IG1zZ19jX3JlcG9ydF90aXRsZSAgICAgICAgICAgICAgICAgICAgICAqLyAidGltZXIgZGF0YSAgICAgICAoc2VjKSIsCisJLyogIDY4IG1zZ19jX3JlcG9ydF9zZWNvbmRzICAgICAgICAgICAgICAgICAgICAqLyAiKHNlY29uZHMpIiwKKwkvKiAgNjkgbXNnX2NfcmVwb3J0X2J5dGVzICAgICAgICAgICAgICAgICAgICAgICovICIoYnl0ZXMpIiwKKwkvKiAgNzAgbXNnX2NfcmVwb3J0X2NwdV90aW1lICAgICAgICAgICAgICAgICAgICovICJDUFUgVGltZSIsCisJLyogIDcxIG1zZ19jX3JlcG9ydF9taWNfdGltZSAgICAgICAgICAgICAgICAgICAqLyAiTUlDIFRpbWUiLAorCS8qICA3MiBtc2dfY19yZXBvcnRfdGFnICAgICAgICAgICAgICAgICAgICAgICAgKi8gIlRhZyIsCisJLyogIDczIG1zZ19jX3JlcG9ydF9mcm9tX2ZpbGUgICAgICAgICAgICAgICAgICAqLyAiT2ZmbG9hZCBmcm9tIGZpbGUiLAorCS8qICA3NCBtc2dfY19yZXBvcnRfZmlsZSAgICAgICAgICAgICAgICAgICAgICAgKi8gIkZpbGUiLAorCS8qICA3NSBtc2dfY19yZXBvcnRfbGluZSAgICAgICAgICAgICAgICAgICAgICAgKi8gIkxpbmUiLAorCS8qICA3NiBtc2dfY19yZXBvcnRfY3B1X3RvX21pY19kYXRhICAgICAgICAgICAgKi8gIkNQVS0+TUlDIERhdGEiLAorCS8qICA3NyBtc2dfY19yZXBvcnRfbWljX3RvX2NwdV9kYXRhICAgICAgICAgICAgKi8gIk1JQy0+Q1BVIERhdGEiLAorCS8qICA3OCBtc2dfY19yZXBvcnRfb2ZmbG9hZCAgICAgICAgICAgICAgICAgICAgKi8gIk9mZmxvYWQiLAorCS8qICA3OSBtc2dfY19yZXBvcnRfd190YWcgICAgICAgICAgICAgICAgICAgICAgKi8gIlRhZyAlZCIsCisJLyogIDgwIG1zZ19jX3JlcG9ydF9zdGF0ZSAgICAgICAgICAgICAgICAgICAgICAqLyAiU3RhdGUiLAorCS8qICA4MSBtc2dfY19yZXBvcnRfc3RhcnQgICAgICAgICAgICAgICAgICAgICAgKi8gIlN0YXJ0IHRhcmdldCIsCisJLyogIDgyIG1zZ19jX3JlcG9ydF9pbml0ICAgICAgICAgICAgICAgICAgICAgICAqLyAiSW5pdGlhbGl6ZSIsCisJLyogIDgzIG1zZ19jX3JlcG9ydF9sb2dpY2FsX2NhcmQgICAgICAgICAgICAgICAqLyAibG9naWNhbCBjYXJkIiwKKwkvKiAgODQgbXNnX2NfcmVwb3J0X3BoeXNpY2FsX2NhcmQgICAgICAgICAgICAgICovICJwaHlzaWNhbCBjYXJkIiwKKwkvKiAgODUgbXNnX2NfcmVwb3J0X3JlZ2lzdGVyICAgICAgICAgICAgICAgICAgICovICJSZWdpc3RlciBzdGF0aWMgZGF0YSB0YWJsZXMiLAorCS8qICA4NiBtc2dfY19yZXBvcnRfaW5pdF9mdW5jICAgICAgICAgICAgICAgICAgKi8gIlNldHVwIHRhcmdldCBlbnRyeSIsCisJLyogIDg3IG1zZ19jX3JlcG9ydF9jcmVhdGVfYnVmX2hvc3QgICAgICAgICAgICAqLyAiQ3JlYXRlIGhvc3QgYnVmZmVyIiwKKwkvKiAgODggbXNnX2NfcmVwb3J0X2NyZWF0ZV9idWZfbWljICAgICAgICAgICAgICovICJDcmVhdGUgdGFyZ2V0IGJ1ZmZlciIsCisJLyogIDg5IG1zZ19jX3JlcG9ydF9zZW5kX3BvaW50ZXJfZGF0YSAgICAgICAgICAqLyAiU2VuZCBwb2ludGVyIGRhdGEiLAorCS8qICA5MCBtc2dfY19yZXBvcnRfc2VudF9wb2ludGVyX2RhdGEgICAgICAgICAgKi8gIkhvc3QtPnRhcmdldCBwb2ludGVyIGRhdGEiLAorCS8qICA5MSBtc2dfY19yZXBvcnRfZ2F0aGVyX2NvcHlpbl9kYXRhICAgICAgICAgKi8gIkdhdGhlciBjb3B5aW4gZGF0YSIsCisJLyogIDkyIG1zZ19jX3JlcG9ydF9jb3B5aW5fZGF0YSAgICAgICAgICAgICAgICAqLyAiSG9zdC0+dGFyZ2V0IGNvcHlpbiBkYXRhIiwKKwkvKiAgOTMgbXNnX2NfcmVwb3J0X3N0YXRlX3NpZ25hbCAgICAgICAgICAgICAgICovICJTaWduYWwiLAorCS8qICA5NCBtc2dfY19yZXBvcnRfc2lnbmFsICAgICAgICAgICAgICAgICAgICAgKi8gInNpZ25hbCA6IiwKKwkvKiAgOTUgbXNnX2NfcmVwb3J0X3dhaXQgICAgICAgICAgICAgICAgICAgICAgICovICJ3YWl0cyAgOiIsCisJLyogIDk2IG1zZ19jX3JlcG9ydF9jb21wdXRlICAgICAgICAgICAgICAgICAgICAqLyAiRXhlY3V0ZSB0YXNrIG9uIHRhcmdldCIsCisJLyogIDk3IG1zZ19jX3JlcG9ydF9yZWNlaXZlX3BvaW50ZXJfZGF0YSAgICAgICAqLyAiUmVjZWl2ZSBwb2ludGVyIGRhdGEiLAorCS8qICA5OCBtc2dfY19yZXBvcnRfcmVjZWl2ZWRfcG9pbnRlcl9kYXRhICAgICAgKi8gIlRhcmdldC0+aG9zdCBwb2ludGVyIGRhdGEiLAorCS8qICA5OSBtc2dfY19yZXBvcnRfc3RhcnRfdGFyZ2V0X2Z1bmMgICAgICAgICAgKi8gIlN0YXJ0IHRhcmdldCBlbnRyeSIsCisJLyogMTAwIG1zZ19jX3JlcG9ydF92YXIgICAgICAgICAgICAgICAgICAgICAgICAqLyAiVmFyIiwKKwkvKiAxMDEgbXNnX2NfcmVwb3J0X3NjYXR0ZXJfY29weWluX2RhdGEgICAgICAgICovICJTY2F0dGVyIGNvcHlpbiBkYXRhIiwKKwkvKiAxMDIgbXNnX2NfcmVwb3J0X2dhdGhlcl9jb3B5b3V0X2RhdGEgICAgICAgICovICJHYXRoZXIgY29weW91dCBkYXRhIiwKKwkvKiAxMDMgbXNnX2NfcmVwb3J0X3NjYXR0ZXJfY29weW91dF9kYXRhICAgICAgICovICJTY2F0dGVyIGNvcHlvdXQgZGF0YSIsCisJLyogMTA0IG1zZ19jX3JlcG9ydF9jb3B5b3V0X2RhdGEgICAgICAgICAgICAgICAqLyAiVGFyZ2V0LT5ob3N0IGNvcHlvdXQgZGF0YSIsCisJLyogMTA1IG1zZ19jX3JlcG9ydF91bnJlZ2lzdGVyICAgICAgICAgICAgICAgICAqLyAiVW5yZWdpc3RlciBkYXRhIHRhYmxlcyIsCisJLyogMTA2IG1zZ19jX3JlcG9ydF9kZXN0cm95ICAgICAgICAgICAgICAgICAgICAqLyAiRGVzdHJveSIsCisJLyogMTA3IG1zZ19jX3JlcG9ydF9teW9pbml0ICAgICAgICAgICAgICAgICAgICAqLyAiSW5pdGlhbGl6ZSBNWU8iLAorCS8qIDEwOCBtc2dfY19yZXBvcnRfbXlvcmVnaXN0ZXIgICAgICAgICAgICAgICAgKi8gIlJlZ2lzdGVyIE1ZTyB0YWJsZXMiLAorCS8qIDEwOSBtc2dfY19yZXBvcnRfbXlvZmluaSAgICAgICAgICAgICAgICAgICAgKi8gIkZpbmFsaXplIE1ZTyIsCisJLyogMTEwIG1zZ19jX3JlcG9ydF9taWNfbXlvX3NoYXJlZCAgICAgICAgICAgICAqLyAiTUlDIE1ZTyBzaGFyZWQgdGFibGUgcmVnaXN0ZXIiLAorCS8qIDExMSBtc2dfY19yZXBvcnRfbWljX215b19mcHRyICAgICAgICAgICAgICAgKi8gIk1JQyBNWU8gZnB0ciB0YWJsZSByZWdpc3RlciIsCisJLyogMTEyIG1zZ19jX3JlcG9ydF9teW9zaGFyZWRtYWxsb2MgICAgICAgICAgICAqLyAiTVlPIHNoYXJlZCBtYWxsb2MiLAorCS8qIDExMyBtc2dfY19yZXBvcnRfbXlvc2hhcmVkZnJlZSAgICAgICAgICAgICAgKi8gIk1ZTyBzaGFyZWQgZnJlZSIsCisJLyogMTE0IG1zZ19jX3JlcG9ydF9teW9zaGFyZWRhbGlnbmVkbWFsbG9jICAgICAqLyAiTVlPIHNoYXJlZCBhbGlnbmVkIG1hbGxvYyIsCisJLyogMTE1IG1zZ19jX3JlcG9ydF9teW9zaGFyZWRhbGlnbmVkZnJlZSAgICAgICAqLyAiTVlPIHNoYXJlZCBhbGlnbmVkIGZyZWUiLAorCS8qIDExNiBtc2dfY19yZXBvcnRfbXlvYWNxdWlyZSAgICAgICAgICAgICAgICAgKi8gIk1ZTyBhY3F1aXJlIiwKKwkvKiAxMTcgbXNnX2NfcmVwb3J0X215b3JlbGVhc2UgICAgICAgICAgICAgICAgICovICJNWU8gcmVsZWFzZSIsCisJLyogMTE4IG1zZ19jX3JlcG9ydF9ob3N0X3RvdGFsX29mZmxvYWRfdGltZSAgICAqLyAiaG9zdDogdG90YWwgb2ZmbG9hZCB0aW1lIiwKKwkvKiAxMTkgbXNnX2NfcmVwb3J0X2hvc3RfaW5pdGlhbGl6ZSAgICAgICAgICAgICovICJob3N0OiBpbml0aWFsaXplIHRhcmdldCIsCisJLyogMTIwIG1zZ19jX3JlcG9ydF9ob3N0X3RhcmdldF9hY3F1aXJlICAgICAgICAqLyAiaG9zdDogYWNxdWlyZSB0YXJnZXQiLAorCS8qIDEyMSBtc2dfY19yZXBvcnRfaG9zdF93YWl0X2RlcHMgICAgICAgICAgICAgKi8gImhvc3Q6IHdhaXQgZGVwZW5kZW5jaWVzIiwKKwkvKiAxMjIgbXNnX2NfcmVwb3J0X2hvc3Rfc2V0dXBfYnVmZmVycyAgICAgICAgICovICJob3N0OiBzZXR1cCBidWZmZXJzIiwKKwkvKiAxMjMgbXNnX2NfcmVwb3J0X2hvc3RfYWxsb2NfYnVmZmVycyAgICAgICAgICovICJob3N0OiBhbGxvY2F0ZSBidWZmZXJzIiwKKwkvKiAxMjQgbXNnX2NfcmVwb3J0X2hvc3Rfc2V0dXBfbWlzY19kYXRhICAgICAgICovICJob3N0OiBzZXR1cCBtaXNjX2RhdGEiLAorCS8qIDEyNSBtc2dfY19yZXBvcnRfaG9zdF9hbGxvY19kYXRhX2J1ZmZlciAgICAgKi8gImhvc3Q6IGFsbG9jYXRlIGJ1ZmZlciIsCisJLyogMTI2IG1zZ19jX3JlcG9ydF9ob3N0X3NlbmRfcG9pbnRlcnMgICAgICAgICAqLyAiaG9zdDogc2VuZCBwb2ludGVycyIsCisJLyogMTI3IG1zZ19jX3JlcG9ydF9ob3N0X2dhdGhlcl9pbnB1dHMgICAgICAgICAqLyAiaG9zdDogZ2F0aGVyIGlucHV0cyIsCisJLyogMTI4IG1zZ19jX3JlcG9ydF9ob3N0X21hcF9pbl9kYXRhX2J1ZmZlciAgICAqLyAiaG9zdDogbWFwIElOIGRhdGEgYnVmZmVyIiwKKwkvKiAxMjkgbXNnX2NfcmVwb3J0X2hvc3RfdW5tYXBfaW5fZGF0YV9idWZmZXIgICovICJob3N0OiB1bm1hcCBJTiBkYXRhIGJ1ZmZlciIsCisJLyogMTMwIG1zZ19jX3JlcG9ydF9ob3N0X3N0YXJ0X2NvbXB1dGUgICAgICAgICAqLyAiaG9zdDogaW5pdGlhdGUgY29tcHV0ZSIsCisJLyogMTMxIG1zZ19jX3JlcG9ydF9ob3N0X3dhaXRfY29tcHV0ZSAgICAgICAgICAqLyAiaG9zdDogd2FpdCBjb21wdXRlIiwKKwkvKiAxMzIgbXNnX2NfcmVwb3J0X2hvc3Rfc3RhcnRfYnVmZmVyc19yZWFkcyAgICovICJob3N0OiBpbml0aWF0ZSBwb2ludGVyIHJlYWRzIiwKKwkvKiAxMzMgbXNnX2NfcmVwb3J0X2hvc3Rfc2NhdHRlcl9vdXRwdXRzICAgICAgICovICJob3N0OiBzY2F0dGVyIG91dHB1dHMiLAorCS8qIDEzNCBtc2dfY19yZXBvcnRfaG9zdF9tYXBfb3V0X2RhdGFfYnVmZmVyICAgKi8gImhvc3Q6IG1hcCBPVVQgZGF0YSBidWZmZXIiLAorCS8qIDEzNSBtc2dfY19yZXBvcnRfaG9zdF91bm1hcF9vdXRfZGF0YV9idWZmZXIgKi8gImhvc3Q6IHVubWFwIE9VVCBkYXRhIGJ1ZmZlciIsCisJLyogMTM2IG1zZ19jX3JlcG9ydF9ob3N0X3dhaXRfYnVmZmVyc19yZWFkcyAgICAqLyAiaG9zdDogd2FpdCBwb2ludGVyIHJlYWRzIiwKKwkvKiAxMzcgbXNnX2NfcmVwb3J0X2hvc3RfZGVzdHJveV9idWZmZXJzICAgICAgICovICJob3N0OiBkZXN0cm95IGJ1ZmZlcnMiLAorCS8qIDEzOCBtc2dfY19yZXBvcnRfdGFyZ2V0X3RvdGFsX3RpbWUgICAgICAgICAgKi8gInRhcmdldDogdG90YWwgdGltZSIsCisJLyogMTM5IG1zZ19jX3JlcG9ydF90YXJnZXRfZGVzY3JpcHRvcl9zZXR1cCAgICAqLyAidGFyZ2V0OiBzZXR1cCBvZmZsb2FkIGRlc2NyaXB0b3IiLAorCS8qIDE0MCBtc2dfY19yZXBvcnRfdGFyZ2V0X2Z1bmNfbG9va3VwICAgICAgICAgKi8gInRhcmdldDogZW50cnkgbG9va3VwIiwKKwkvKiAxNDEgbXNnX2NfcmVwb3J0X3RhcmdldF9mdW5jX3RpbWUgICAgICAgICAgICovICJ0YXJnZXQ6IGVudHJ5IHRpbWUiLAorCS8qIDE0MiBtc2dfY19yZXBvcnRfdGFyZ2V0X3NjYXR0ZXJfaW5wdXRzICAgICAgKi8gInRhcmdldDogc2NhdHRlciBpbnB1dHMiLAorCS8qIDE0MyBtc2dfY19yZXBvcnRfdGFyZ2V0X2FkZF9idWZmZXJfcmVmcyAgICAgKi8gInRhcmdldDogYWRkIGJ1ZmZlciByZWZlcmVuY2UiLAorCS8qIDE0NCBtc2dfY19yZXBvcnRfdGFyZ2V0X2NvbXB1dGUgICAgICAgICAgICAgKi8gInRhcmdldDogY29tcHV0ZSIsCisJLyogMTQ1IG1zZ19jX3JlcG9ydF90YXJnZXRfZ2F0aGVyX291dHB1dHMgICAgICAqLyAidGFyZ2V0OiBnYXRoZXIgb3V0cHV0cyIsCisJLyogMTQ2IG1zZ19jX3JlcG9ydF90YXJnZXRfcmVsZWFzZV9idWZmZXJfcmVmcyAqLyAidGFyZ2V0OiByZW1vdmUgYnVmZmVyIHJlZmVyZW5jZSIsCisJLyogMTQ3IG1zZ19jX2NvaV9waXBlbGluZV9tYXhfbnVtYmVyICAgICAgICAgICAqLyAibnVtYmVyIG9mIGhvc3QgdGhyZWFkcyBkb2luZyBvZmZsb2FkIGV4Y2VlZHMgbWF4aW11bSBvZiAlZCIsCisJLyogMTQ4IG1zZ19jX3Jhbmdlc19kb250X21hdGNoICAgICAgICAgICAgICAgICAqLyAicmFuZ2VzIG9mIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZG9uJ3QgbWF0Y2ggdG9nZXRoZXIiLAorCS8qIDE0OSBtc2dfY19kZXN0aW5hdGlvbl9pc19vdmVyICAgICAgICAgICAgICAgKi8gImluc3VmZmljaWVudCBkZXN0aW5hdGlvbiBtZW1vcnkgdG8gdHJhbnNmZXIgc291cmNlIiwKKwkvKiAxNTAgbXNnX2Nfc2xpY2Vfb2Zfbm9uY29udF9hcnJheSAgICAgICAgICAgICovICJhIG5vbi1jb250aWd1b3VzIHNsaWNlIG1heSBiZSB0YWtlbiBvZiBjb250aWd1b3VzIGFycmF5cyBvbmx5IiwKKwkvKiAxNTEgbXNnX2NfcG9pbnRlcl9hcnJheV9taXNtYXRjaCAgICAgICAgICAgICovICJudW1iZXIgb2YgJXMgZWxlbWVudHMgaXMgbGVzcyB0aGFuIGRlc2NyaWJlZCBieSB0aGUgc291cmNlIiwKK307CmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9taWNfbGliLmY5MCBiL2ZpbmFsL29mZmxvYWQvc3JjL21pY19saWIuZjkwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMmU0ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9taWNfbGliLmY5MApAQCAtMCwwICsxLDQ0MSBAQAorIQorIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishLy8KKyEvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCishLy8KKyEvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCishLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCishLy8KKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIQorCisKKyEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorISAqIFRoaXMgZmlsZSBpcyBpbnRlbmRlZCB0byBzdXBwb3J0IHRoZSBJbnRlbChyKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUuCishICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyEgZnJlZSBmb3JtIEZvcnRyYW4gc291cmNlIC0gc2hvdWxkIGJlIG5hbWVkIC5mOTAKKyEgbGluZXMgYXJlIGxvbmdlciB0aGFuIDcyIGNoYXJhY3RlcnMKKworbW9kdWxlIG1pY19saWIKK3VzZSwgaW50cmluc2ljIDo6IGlzb19jX2JpbmRpbmcKKworaW50ZWdlciwgcGFyYW1ldGVyOjogdGFyZ2V0X21pYz0yCitpbnRlZ2VyLCBwYXJhbWV0ZXI6OiBkZWZhdWx0X3RhcmdldF90eXBlPXRhcmdldF9taWMKK2ludGVnZXIsIHBhcmFtZXRlcjo6IGRlZmF1bHRfdGFyZ2V0X251bWJlcj0wCisKK2VudW0sIGJpbmQoQykKKyAgICBlbnVtZXJhdG9yIDo6IE9GRkxPQURfU1VDQ0VTUyAgPSAwCisgICAgZW51bWVyYXRvciA6OiBPRkZMT0FEX0RJU0FCTEVEICAgICAgICAgICEgb2ZmbG9hZCBpcyBkaXNhYmxlZAorICAgIGVudW1lcmF0b3IgOjogT0ZGTE9BRF9VTkFWQUlMQUJMRSAgICAgICAhIGNhcmQgaXMgbm90IGF2YWlsYWJsZQorICAgIGVudW1lcmF0b3IgOjogT0ZGTE9BRF9PVVRfT0ZfTUVNT1JZICAgICAhIG5vdCBlbm91Z2ggbWVtb3J5IG9uIGRldmljZQorICAgIGVudW1lcmF0b3IgOjogT0ZGTE9BRF9QUk9DRVNTX0RJRUQgICAgICAhIHRhcmdldCBwcm9jZXNzIGhhcyBkaWVkCisgICAgZW51bWVyYXRvciA6OiBPRkZMT0FEX0VSUk9SICAgICAgICAgICAgICEgdW5zcGVjaWZpZWQgZXJyb3IKK2VuZCBlbnVtCisKK3R5cGUsIGJpbmQgKEMpIDo6IG9mZmxvYWRfc3RhdHVzCisgICAgaW50ZWdlcihraW5kPWNfaW50KSAgICA6OiAgcmVzdWx0ICAgICAgICAgID0gT0ZGTE9BRF9ESVNBQkxFRAorICAgIGludGVnZXIoa2luZD1jX2ludCkgICAgOjogIGRldmljZV9udW1iZXIgICA9IC0xCisgICAgaW50ZWdlcihraW5kPWNfc2l6ZV90KSA6OiAgZGF0YV9zZW50ICAgICAgID0gMAorICAgIGludGVnZXIoa2luZD1jX3NpemVfdCkgOjogIGRhdGFfcmVjZWl2ZWQgICA9IDAKK2VuZCB0eXBlIG9mZmxvYWRfc3RhdHVzCisKK2ludGVyZmFjZQorZnVuY3Rpb24gb2ZmbG9hZF9udW1iZXJfb2ZfZGV2aWNlcyAoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAiX09mZmxvYWRfbnVtYmVyX29mX2RldmljZXMiKQorIWRlYyQgYXR0cmlidXRlcyBkZWZhdWx0IDo6IG9mZmxvYWRfbnVtYmVyX29mX2RldmljZXMKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpICAgICAgICA6OiBvZmZsb2FkX251bWJlcl9vZl9kZXZpY2VzCishZGVjJCBhdHRyaWJ1dGVzIG9mZmxvYWQ6bWljIDo6IG9mZmxvYWRfbnVtYmVyX29mX2RldmljZXMKKyFkaXIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6ICBvZmZsb2FkX251bWJlcl9vZl9kZXZpY2VzCitlbmQgZnVuY3Rpb24gb2ZmbG9hZF9udW1iZXJfb2ZfZGV2aWNlcworCitmdW5jdGlvbiBvZmZsb2FkX3NpZ25hbGVkKHRhcmdldF9udW1iZXIsIHNpZ25hbCkgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJfT2ZmbG9hZF9zaWduYWxlZCIpCishZGVjJCBhdHRyaWJ1dGVzIGRlZmF1bHQgOjogb2ZmbG9hZF9zaWduYWxlZAorICBpbXBvcnQgOjogY19pbnQsIGNfaW50NjRfdAorICBpbnRlZ2VyIChraW5kPWNfaW50KSA6OiBvZmZsb2FkX3NpZ25hbGVkCisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfbnVtYmVyCisgIGludGVnZXIgKGtpbmQ9Y19pbnQ2NF90KSwgdmFsdWUgOjogc2lnbmFsCishZGVjJCBhdHRyaWJ1dGVzIG9mZmxvYWQ6bWljIDo6IG9mZmxvYWRfc2lnbmFsZWQKK2VuZCBmdW5jdGlvbiBvZmZsb2FkX3NpZ25hbGVkCisKK3N1YnJvdXRpbmUgb2ZmbG9hZF9yZXBvcnQodmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gIl9PZmZsb2FkX3JlcG9ydCIpCishZGVjJCBhdHRyaWJ1dGVzIGRlZmF1bHQgOjogb2ZmbG9hZF9yZXBvcnQKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB2YWwKKyFkZWMkIGF0dHJpYnV0ZXMgb2ZmbG9hZDptaWMgOjogb2ZmbG9hZF9yZXBvcnQKK2VuZCBzdWJyb3V0aW5lIG9mZmxvYWRfcmVwb3J0CisKK2Z1bmN0aW9uIG9mZmxvYWRfZ2V0X2RldmljZV9udW1iZXIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gIl9PZmZsb2FkX2dldF9kZXZpY2VfbnVtYmVyIikKKyFkZWMkIGF0dHJpYnV0ZXMgZGVmYXVsdCA6OiBvZmZsb2FkX2dldF9kZXZpY2VfbnVtYmVyCisgIGltcG9ydCA6OiBjX2ludAorICBpbnRlZ2VyIChraW5kPWNfaW50KSAgICAgICAgOjogb2ZmbG9hZF9nZXRfZGV2aWNlX251bWJlcgorIWRlYyQgYXR0cmlidXRlcyBvZmZsb2FkOm1pYyA6OiBvZmZsb2FkX2dldF9kZXZpY2VfbnVtYmVyCitlbmQgZnVuY3Rpb24gb2ZmbG9hZF9nZXRfZGV2aWNlX251bWJlcgorCitmdW5jdGlvbiBvZmZsb2FkX2dldF9waHlzaWNhbF9kZXZpY2VfbnVtYmVyKCkgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJfT2ZmbG9hZF9nZXRfcGh5c2ljYWxfZGV2aWNlX251bWJlciIpCishZGVjJCBhdHRyaWJ1dGVzIGRlZmF1bHQgOjogb2ZmbG9hZF9nZXRfcGh5c2ljYWxfZGV2aWNlX251bWJlcgorICBpbXBvcnQgOjogY19pbnQKKyAgaW50ZWdlciAoa2luZD1jX2ludCkgICAgICAgIDo6IG9mZmxvYWRfZ2V0X3BoeXNpY2FsX2RldmljZV9udW1iZXIKKyFkZWMkIGF0dHJpYnV0ZXMgb2ZmbG9hZDptaWMgOjogb2ZmbG9hZF9nZXRfcGh5c2ljYWxfZGV2aWNlX251bWJlcgorZW5kIGZ1bmN0aW9uIG9mZmxvYWRfZ2V0X3BoeXNpY2FsX2RldmljZV9udW1iZXIKKworISBPcGVuTVAgQVBJIHdyYXBwZXJzCisKK3N1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkc190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fdGhyZWFkcykgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJvbXBfc2V0X251bV90aHJlYWRzX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIG51bV90aHJlYWRzCitlbmQgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzX3RhcmdldAorCitmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyKSAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJvbXBfZ2V0X21heF90aHJlYWRzX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludAorICBpbnRlZ2VyIChraW5kPWNfaW50KSAgICAgICAgOjogb21wX2dldF9tYXhfdGhyZWFkc190YXJnZXQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCitlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkc190YXJnZXQKKworZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3NfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIpICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX2dldF9udW1fcHJvY3NfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpICAgICAgICA6OiBvbXBfZ2V0X251bV9wcm9jc190YXJnZXQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCitlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3NfdGFyZ2V0CisKK3N1YnJvdXRpbmUgb21wX3NldF9keW5hbWljX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV90aHJlYWRzKSAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJvbXBfc2V0X2R5bmFtaWNfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgbnVtX3RocmVhZHMKK2VuZCBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pY190YXJnZXQKKworZnVuY3Rpb24gb21wX2dldF9keW5hbWljX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyKSAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX2dldF9keW5hbWljX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludAorICBpbnRlZ2VyIChraW5kPWNfaW50KSAgICAgICAgOjogb21wX2dldF9keW5hbWljX3RhcmdldAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKK2VuZCBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWNfdGFyZ2V0CisKK3N1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWRfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJvbXBfc2V0X25lc3RlZF90YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCBuZXN0ZWQKK2VuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkX3RhcmdldAorCitmdW5jdGlvbiBvbXBfZ2V0X25lc3RlZF90YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlcikgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJvbXBfZ2V0X25lc3RlZF90YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQKKyAgaW50ZWdlciAoa2luZD1jX2ludCkgICAgICAgIDo6IG9tcF9nZXRfbmVzdGVkX3RhcmdldAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKK2VuZCBmdW5jdGlvbiBvbXBfZ2V0X25lc3RlZF90YXJnZXQKKworc3Vicm91dGluZSBvbXBfc2V0X3NjaGVkdWxlX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX3NldF9zY2hlZHVsZV90YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCBraW5kLCBtb2RpZmllcgorZW5kIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZV90YXJnZXQKKworc3Vicm91dGluZSBvbXBfZ2V0X3NjaGVkdWxlX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX2dldF9zY2hlZHVsZV90YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQsIGNfaW50cHRyX3QKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCisgIGludGVnZXIgKGtpbmQ9Y19pbnRwdHJfdCksIHZhbHVlIDo6IGtpbmQsIG1vZGlmaWVyCitlbmQgc3Vicm91dGluZSBvbXBfZ2V0X3NjaGVkdWxlX3RhcmdldAorCishIGxvY2sgQVBJIGZ1bmN0aW9ucworCitzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2tfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX2luaXRfbG9ja190YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQsIGNfaW50cHRyX3QKKyAgIWRpciQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogIG9tcF9pbml0X2xvY2tfdGFyZ2V0CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorICBpbnRlZ2VyIChraW5kPWNfaW50cHRyX3QpLCB2YWx1ZSA6OiBsb2NrCitlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrX3RhcmdldAorCitzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2tfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX2Rlc3Ryb3lfbG9ja190YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQsIGNfaW50cHRyX3QKKyAgIWRpciQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogIG9tcF9kZXN0cm95X2xvY2tfdGFyZ2V0CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorICBpbnRlZ2VyIChraW5kPWNfaW50cHRyX3QpLCB2YWx1ZSA6OiBsb2NrCitlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrX3RhcmdldAorCitzdWJyb3V0aW5lIG9tcF9zZXRfbG9ja190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX3NldF9sb2NrX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludCwgY19pbnRwdHJfdAorICAhZGlyJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiAgb21wX3NldF9sb2NrX3RhcmdldAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKKyAgaW50ZWdlciAoa2luZD1jX2ludHB0cl90KSwgdmFsdWUgOjogbG9jaworZW5kIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrX3RhcmdldAorCitzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX3Vuc2V0X2xvY2tfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2ludHB0cl90CisgICFkaXIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6ICBvbXBfdW5zZXRfbG9ja190YXJnZXQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCisgIGludGVnZXIgKGtpbmQ9Y19pbnRwdHJfdCksIHZhbHVlIDo6IGxvY2sKK2VuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrX3RhcmdldAorCitmdW5jdGlvbiBvbXBfdGVzdF9sb2NrX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX3Rlc3RfbG9ja190YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQsIGNfaW50cHRyX3QKKyAgaW50ZWdlciAoa2luZD1jX2ludCkgICAgICAgIDo6IG9tcF90ZXN0X2xvY2tfdGFyZ2V0CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorICBpbnRlZ2VyIChraW5kPWNfaW50cHRyX3QpLCB2YWx1ZSA6OiBsb2NrCitlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbG9ja190YXJnZXQKKworISBuZXN0ZWQgbG9jayBBUEkgZnVuY3Rpb25zCisKK3N1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJvbXBfaW5pdF9uZXN0X2xvY2tfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2ludHB0cl90CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorICBpbnRlZ2VyIChraW5kPWNfaW50cHRyX3QpLCB2YWx1ZSA6OiBsb2NrCitlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2tfdGFyZ2V0CisKK3N1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2spICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJvbXBfZGVzdHJveV9uZXN0X2xvY2tfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2ludHB0cl90CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorICBpbnRlZ2VyIChraW5kPWNfaW50cHRyX3QpLCB2YWx1ZSA6OiBsb2NrCitlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2tfdGFyZ2V0CisKK3N1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2tfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJvbXBfc2V0X25lc3RfbG9ja190YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQsIGNfaW50cHRyX3QKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCisgIGludGVnZXIgKGtpbmQ9Y19pbnRwdHJfdCksIHZhbHVlIDo6IGxvY2sKK2VuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrX3RhcmdldAorCitzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2tfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jaykgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX3Vuc2V0X25lc3RfbG9ja190YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQsIGNfaW50cHRyX3QKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCisgIGludGVnZXIgKGtpbmQ9Y19pbnRwdHJfdCksIHZhbHVlIDo6IGxvY2sKK2VuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2tfdGFyZ2V0CisKK2Z1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9ja190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJvbXBfdGVzdF9uZXN0X2xvY2tfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2ludHB0cl90CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpICAgICAgICA6OiBvbXBfdGVzdF9uZXN0X2xvY2tfdGFyZ2V0CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorICBpbnRlZ2VyIChraW5kPWNfaW50cHRyX3QpLCB2YWx1ZSA6OiBsb2NrCitlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrX3RhcmdldAorCishIGttcCBBUEkgZnVuY3Rpb25zCisKK3N1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJrbXBfc2V0X3N0YWNrc2l6ZV90YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCBzaXplCitlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV90YXJnZXQKKworZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIpICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAia21wX2dldF9zdGFja3NpemVfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpICAgICAgICA6OiBrbXBfZ2V0X3N0YWNrc2l6ZV90YXJnZXQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCitlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfdGFyZ2V0CisKK3N1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfc190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKSAgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJrbXBfc2V0X3N0YWNrc2l6ZV9zX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIHNpemUKK2VuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3NfdGFyZ2V0CisKK2Z1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3NfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIpICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICBiaW5kIChDLCBuYW1lID0gImttcF9nZXRfc3RhY2tzaXplX3NfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpICAgICAgICA6OiBrbXBfZ2V0X3N0YWNrc2l6ZV9zX3RhcmdldAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKK2VuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zX3RhcmdldAorCitzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAia21wX3NldF9ibG9ja3RpbWVfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgdGltZQorZW5kIHN1YnJvdXRpbmUga21wX3NldF9ibG9ja3RpbWVfdGFyZ2V0CisKK2Z1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyKSAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICBiaW5kIChDLCBuYW1lID0gImttcF9nZXRfYmxvY2t0aW1lX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludAorICBpbnRlZ2VyIChraW5kPWNfaW50KSAgICAgICAgOjoga21wX2dldF9ibG9ja3RpbWVfdGFyZ2V0CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorZW5kIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lX3RhcmdldAorCitzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWxfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIpICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gImttcF9zZXRfbGlicmFyeV9zZXJpYWxfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbF90YXJnZXQKKworc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZF90YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlcikgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZF90YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCitlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZF90YXJnZXQKKworc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dF90YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlcikgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dF90YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCitlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dF90YXJnZXQKKworc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gImttcF9zZXRfbGlicmFyeV90YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCBtb2RlCitlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGFyZ2V0CisKK2Z1bmN0aW9uIGttcF9nZXRfbGlicmFyeV90YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlcikgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICBiaW5kIChDLCBuYW1lID0gImttcF9nZXRfbGlicmFyeV90YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQKKyAgaW50ZWdlciAoa2luZD1jX2ludCkgICAgICAgIDo6IGttcF9nZXRfbGlicmFyeV90YXJnZXQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCitlbmQgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5X3RhcmdldAorCitzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHNfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdHMpICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAia21wX3NldF9kZWZhdWx0c190YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQsIGNfY2hhcgorIGNoYXJhY3RlciAoa2luZD1jX2NoYXIpIDo6IGRlZmF1bHRzKCopCisgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCitlbmQgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzX3RhcmdldAorCishIGFmZmluaXR5IEFQSSBmdW5jdGlvbnMKKworc3Vicm91dGluZSBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzaykgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gImttcF9jcmVhdGVfYWZmaW5pdHlfbWFza190YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQsIGNfaW50cHRyX3QKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCisgIGludGVnZXIgKGtpbmQ9Y19pbnRwdHJfdCksIHZhbHVlIDo6IG1hc2sKK2VuZCBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFza190YXJnZXQKKworc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2spICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gImttcF9kZXN0cm95X2FmZmluaXR5X21hc2tfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2ludHB0cl90CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorICBpbnRlZ2VyIChraW5kPWNfaW50cHRyX3QpLCB2YWx1ZSA6OiBtYXNrCitlbmQgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrX3RhcmdldAorCitmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAia21wX3NldF9hZmZpbml0eV90YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQsIGNfaW50cHRyX3QKKyAgaW50ZWdlciAoa2luZD1jX2ludCkgICAgICAgIDo6IGttcF9zZXRfYWZmaW5pdHlfdGFyZ2V0CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorICBpbnRlZ2VyIChraW5kPWNfaW50cHRyX3QpLCB2YWx1ZSA6OiBtYXNrCitlbmQgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV90YXJnZXQKKworZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV90YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gImttcF9nZXRfYWZmaW5pdHlfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2ludHB0cl90CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpICAgICAgICA6OiBrbXBfZ2V0X2FmZmluaXR5X3RhcmdldAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKKyAgaW50ZWdlciAoa2luZD1jX2ludHB0cl90KSwgdmFsdWUgOjogbWFzaworZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfdGFyZ2V0CisKK2Z1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIpICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAia21wX2dldF9hZmZpbml0eV9tYXhfcHJvY190YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQKKyAgaW50ZWdlciAoa2luZD1jX2ludCkgICAgICAgIDo6IGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfdGFyZ2V0CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfdGFyZ2V0CisKK2Z1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2MsICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzaykgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gImttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludCwgY19pbnRwdHJfdAorICBpbnRlZ2VyIChraW5kPWNfaW50KSAgICAgICAgOjoga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgcHJvYworICBpbnRlZ2VyIChraW5kPWNfaW50cHRyX3QpLCB2YWx1ZSA6OiBtYXNrCitlbmQgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0CisKK2Z1bmN0aW9uIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYywgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrKSAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gImttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2ludHB0cl90CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpICAgICAgICA6OiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIHByb2MKKyAgaW50ZWdlciAoa2luZD1jX2ludHB0cl90KSwgdmFsdWUgOjogbWFzaworZW5kIGZ1bmN0aW9uIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0CisKK2Z1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2MsICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzaykgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gImttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludCwgY19pbnRwdHJfdAorICBpbnRlZ2VyIChraW5kPWNfaW50KSAgICAgICAgOjoga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgcHJvYworICBpbnRlZ2VyIChraW5kPWNfaW50cHRyX3QpLCB2YWx1ZSA6OiBtYXNrCitlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0CisKK2VuZCBpbnRlcmZhY2UKK2VuZCBtb2R1bGUgbWljX2xpYgpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZC5oIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4OTE0YjcKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkLmgKQEAgLTAsMCArMSw0NzQgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLyoKKyAqIEluY2x1ZGUgZmlsZSBmb3IgT2ZmbG9hZCBBUEkuCisgKi8KKworI2lmbmRlZiBPRkZMT0FEX0hfSU5DTFVERUQKKyNkZWZpbmUgT0ZGTE9BRF9IX0lOQ0xVREVECisKKyNpZiBkZWZpbmVkKExJTlVYKSB8fCBkZWZpbmVkKEZSRUVCU0QpCisjaW5jbHVkZSA8Yml0cy9mdW5jdGV4Y2VwdC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxvbXAuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIFRBUkdFVF9BVFRSSUJVVEUgX19kZWNsc3BlYyh0YXJnZXQobWljKSkKKworLyoKKyAqICBUaGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KKyAqLwordHlwZWRlZiBlbnVtIFRBUkdFVF9UWVBFIHsKKyAgICBUQVJHRVRfTk9ORSwgICAgLyogVW5kZWZpbmUgdGFyZ2V0ICovCisgICAgVEFSR0VUX0hPU1QsICAgIC8qIEhvc3QgdXNlZCBhcyB0YXJnZXQgKi8KKyAgICBUQVJHRVRfTUlDICAgICAgLyogTUlDIHRhcmdldCAqLworfSBUQVJHRVRfVFlQRTsKKworLyoKKyAqICBUaGUgZGVmYXVsdCB0YXJnZXQgdHlwZS4KKyAqLworI2RlZmluZSBERUZBVUxUX1RBUkdFVF9UWVBFIFRBUkdFVF9NSUMKKworLyoKKyAqICBUaGUgZGVmYXVsdCB0YXJnZXQgbnVtYmVyLgorICovCisjZGVmaW5lIERFRkFVTFRfVEFSR0VUX05VTUJFUiAwCisKKy8qCisgKiAgT2ZmbG9hZCBzdGF0dXMuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgT0ZGTE9BRF9TVUNDRVNTID0gMCwKKyAgICBPRkZMT0FEX0RJU0FCTEVELCAgICAgICAgICAgICAgIC8qIG9mZmxvYWQgaXMgZGlzYWJsZWQgKi8KKyAgICBPRkZMT0FEX1VOQVZBSUxBQkxFLCAgICAgICAgICAgIC8qIGNhcmQgaXMgbm90IGF2YWlsYWJsZSAqLworICAgIE9GRkxPQURfT1VUX09GX01FTU9SWSwgICAgICAgICAgLyogbm90IGVub3VnaCBtZW1vcnkgb24gZGV2aWNlICovCisgICAgT0ZGTE9BRF9QUk9DRVNTX0RJRUQsICAgICAgICAgICAvKiB0YXJnZXQgcHJvY2VzcyBoYXMgZGllZCAqLworICAgIE9GRkxPQURfRVJST1IgICAgICAgICAgICAgICAgICAgLyogdW5zcGVjaWZpZWQgZXJyb3IgKi8KK30gX09mZmxvYWRfcmVzdWx0OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgX09mZmxvYWRfcmVzdWx0IHJlc3VsdDsgICAgICAgICAvKiByZXN1bHQsIHNlZSBhYm92ZSAqLworICAgIGludCAgICAgICAgICAgICBkZXZpY2VfbnVtYmVyOyAgLyogZGV2aWNlIG51bWJlciAqLworICAgIHNpemVfdCAgICAgICAgICBkYXRhX3NlbnQ7ICAgICAgLyogbnVtYmVyIG9mIGJ5dGVzIHNlbnQgdG8gdGhlIHRhcmdldCAqLworICAgIHNpemVfdCAgICAgICAgICBkYXRhX3JlY2VpdmVkOyAgLyogbnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkIGJ5IGhvc3QgKi8KK30gX09mZmxvYWRfc3RhdHVzOworCisjZGVmaW5lIE9GRkxPQURfU1RBVFVTX0lOSVQoeCkgXAorICAgICgoeCkucmVzdWx0ID0gT0ZGTE9BRF9ESVNBQkxFRCkKKworI2RlZmluZSBPRkZMT0FEX1NUQVRVU19JTklUSUFMSVpFUiBcCisgICAgeyBPRkZMT0FEX0RJU0FCTEVELCAtMSwgMCwgMCB9CisKKy8qIE9mZmxvYWQgcnVudGltZSBpbnRlcmZhY2VzICovCisKK2V4dGVybiBpbnQgX09mZmxvYWRfbnVtYmVyX29mX2RldmljZXModm9pZCk7CitleHRlcm4gaW50IF9PZmZsb2FkX2dldF9kZXZpY2VfbnVtYmVyKHZvaWQpOworZXh0ZXJuIGludCBfT2ZmbG9hZF9nZXRfcGh5c2ljYWxfZGV2aWNlX251bWJlcih2b2lkKTsKKworZXh0ZXJuIHZvaWQqIF9PZmZsb2FkX3NoYXJlZF9tYWxsb2Moc2l6ZV90IHNpemUpOworZXh0ZXJuIHZvaWQgIF9PZmZsb2FkX3NoYXJlZF9mcmVlKHZvaWQgKnB0cik7CisKK2V4dGVybiB2b2lkKiBfT2ZmbG9hZF9zaGFyZWRfYWxpZ25lZF9tYWxsb2Moc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbik7CitleHRlcm4gdm9pZCAgX09mZmxvYWRfc2hhcmVkX2FsaWduZWRfZnJlZSh2b2lkICpwdHIpOworCitleHRlcm4gaW50IF9PZmZsb2FkX3NpZ25hbGVkKGludCBpbmRleCwgdm9pZCAqc2lnbmFsKTsKK2V4dGVybiB2b2lkIF9PZmZsb2FkX3JlcG9ydChpbnQgdmFsKTsKKworLyogT3Blbk1QIEFQSSAqLworCitleHRlcm4gdm9pZCBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlKGludCBudW0pOworZXh0ZXJuIGludCAgb21wX2dldF9kZWZhdWx0X2RldmljZSh2b2lkKTsKK2V4dGVybiBpbnQgIG9tcF9nZXRfbnVtX2RldmljZXModm9pZCk7CisKKy8qIE9wZW5NUCBBUEkgd3JhcHBlcnMgKi8KKworLyogU2V0IG51bV90aHJlYWRzIG9uIHRhcmdldCAqLworZXh0ZXJuIHZvaWQgb21wX3NldF9udW1fdGhyZWFkc190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IG51bV90aHJlYWRzCispOworCisvKiBHZXQgbWF4X3RocmVhZHMgZnJvbSB0YXJnZXQgKi8KK2V4dGVybiBpbnQgb21wX2dldF9tYXhfdGhyZWFkc190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKyk7CisKKy8qIEdldCBudW1fcHJvY3MgZnJvbSB0YXJnZXQgKi8KK2V4dGVybiBpbnQgb21wX2dldF9udW1fcHJvY3NfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispOworCisvKiBTZXQgZHluYW1pYyBvbiB0YXJnZXQgKi8KK2V4dGVybiB2b2lkIG9tcF9zZXRfZHluYW1pY190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IG51bV90aHJlYWRzCispOworCisvKiBHZXQgZHluYW1pYyBmcm9tIHRhcmdldCAqLworZXh0ZXJuIGludCBvbXBfZ2V0X2R5bmFtaWNfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispOworCisvKiBTZXQgbmVzdGVkIG9uIHRhcmdldCAqLworZXh0ZXJuIHZvaWQgb21wX3NldF9uZXN0ZWRfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBuZXN0ZWQKKyk7CisKKy8qIEdldCBuZXN0ZWQgZnJvbSB0YXJnZXQgKi8KK2V4dGVybiBpbnQgb21wX2dldF9uZXN0ZWRfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispOworCitleHRlcm4gdm9pZCBvbXBfc2V0X251bV90aHJlYWRzX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgbnVtX3RocmVhZHMKKyk7CisKK2V4dGVybiBpbnQgb21wX2dldF9tYXhfdGhyZWFkc190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKyk7CisKK2V4dGVybiBpbnQgb21wX2dldF9udW1fcHJvY3NfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispOworCitleHRlcm4gdm9pZCBvbXBfc2V0X2R5bmFtaWNfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBudW1fdGhyZWFkcworKTsKKworZXh0ZXJuIGludCBvbXBfZ2V0X2R5bmFtaWNfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispOworCitleHRlcm4gdm9pZCBvbXBfc2V0X25lc3RlZF90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IG51bV90aHJlYWRzCispOworCitleHRlcm4gaW50IG9tcF9nZXRfbmVzdGVkX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKTsKKworZXh0ZXJuIHZvaWQgb21wX3NldF9zY2hlZHVsZV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX3NjaGVkX3Qga2luZCwKKyAgICBpbnQgbW9kaWZpZXIKKyk7CisKK2V4dGVybiB2b2lkIG9tcF9nZXRfc2NoZWR1bGVfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9zY2hlZF90ICpraW5kLAorICAgIGludCAqbW9kaWZpZXIKKyk7CisKKy8qIGxvY2sgQVBJIGZ1bmN0aW9ucyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgb21wX2xvY2tfdCBsb2NrOworfSBvbXBfbG9ja190YXJnZXRfdDsKKworZXh0ZXJuIHZvaWQgb21wX2luaXRfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX2xvY2tfdGFyZ2V0X3QgKmxvY2sKKyk7CisKK2V4dGVybiB2b2lkIG9tcF9kZXN0cm95X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9sb2NrX3RhcmdldF90ICpsb2NrCispOworCitleHRlcm4gdm9pZCBvbXBfc2V0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9sb2NrX3RhcmdldF90ICpsb2NrCispOworCitleHRlcm4gdm9pZCBvbXBfdW5zZXRfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX2xvY2tfdGFyZ2V0X3QgKmxvY2sKKyk7CisKK2V4dGVybiBpbnQgb21wX3Rlc3RfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX2xvY2tfdGFyZ2V0X3QgKmxvY2sKKyk7CisKKy8qIG5lc3RlZCBsb2NrIEFQSSBmdW5jdGlvbnMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIG9tcF9uZXN0X2xvY2tfdCBsb2NrOworfSBvbXBfbmVzdF9sb2NrX3RhcmdldF90OworCitleHRlcm4gdm9pZCBvbXBfaW5pdF9uZXN0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QgKmxvY2sKKyk7CisKK2V4dGVybiB2b2lkIG9tcF9kZXN0cm95X25lc3RfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX25lc3RfbG9ja190YXJnZXRfdCAqbG9jaworKTsKKworZXh0ZXJuIHZvaWQgb21wX3NldF9uZXN0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QgKmxvY2sKKyk7CisKK2V4dGVybiB2b2lkIG9tcF91bnNldF9uZXN0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QgKmxvY2sKKyk7CisKK2V4dGVybiBpbnQgb21wX3Rlc3RfbmVzdF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbmVzdF9sb2NrX3RhcmdldF90ICpsb2NrCispOworCisvKiBrbXAgQVBJIGZ1bmN0aW9ucyAqLworCitleHRlcm4gdm9pZCBrbXBfc2V0X3N0YWNrc2l6ZV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IHNpemUKKyk7CisKK2V4dGVybiBpbnQga21wX2dldF9zdGFja3NpemVfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispOworCitleHRlcm4gdm9pZCBrbXBfc2V0X3N0YWNrc2l6ZV9zX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBzaXplX3Qgc2l6ZQorKTsKKworZXh0ZXJuIHNpemVfdCBrbXBfZ2V0X3N0YWNrc2l6ZV9zX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKTsKKworZXh0ZXJuIHZvaWQga21wX3NldF9ibG9ja3RpbWVfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCB0aW1lCispOworCitleHRlcm4gaW50IGttcF9nZXRfYmxvY2t0aW1lX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKTsKKworZXh0ZXJuIHZvaWQga21wX3NldF9saWJyYXJ5X3NlcmlhbF90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKyk7CisKK2V4dGVybiB2b2lkIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKTsKKworZXh0ZXJuIHZvaWQga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispOworCitleHRlcm4gdm9pZCBrbXBfc2V0X2xpYnJhcnlfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBtb2RlCispOworCitleHRlcm4gaW50IGttcF9nZXRfbGlicmFyeV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKyk7CisKK2V4dGVybiB2b2lkIGttcF9zZXRfZGVmYXVsdHNfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGNoYXIgY29uc3QgKmRlZmF1bHRzCispOworCisvKiBhZmZpbml0eSBBUEkgZnVuY3Rpb25zICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBrbXBfYWZmaW5pdHlfbWFza190IG1hc2s7Cit9IGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90OworCitleHRlcm4gdm9pZCBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90ICptYXNrCispOworCitleHRlcm4gdm9pZCBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCAqbWFzaworKTsKKworZXh0ZXJuIGludCBrbXBfc2V0X2FmZmluaXR5X3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCAqbWFzaworKTsKKworZXh0ZXJuIGludCBrbXBfZ2V0X2FmZmluaXR5X3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCAqbWFzaworKTsKKworZXh0ZXJuIGludCBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKTsKKworZXh0ZXJuIGludCBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IHByb2MsCisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgKm1hc2sKKyk7CisKK2V4dGVybiBpbnQga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IHByb2MsCisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgKm1hc2sKKyk7CisKK2V4dGVybiBpbnQga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBwcm9jLAorICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90ICptYXNrCispOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogZXh0ZXJuICJDIiAqLworCisvKiBOYW1lc3BhY2UgZm9yIHRoZSBzaGFyZWRfYWxsb2NhdG9yLiAqLworbmFtZXNwYWNlIF9fb2ZmbG9hZCB7CisgIC8qIFRoaXMgZm9sbG93cyB0aGUgc3BlY2lmaWNhdGlvbiBmb3Igc3RkOjphbGxvY2F0b3IuICovCisgIC8qIEZvcndhcmQgZGVjbGFyYXRpb24gb2YgdGhlIGNsYXNzIHRlbXBsYXRlLiAqLworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgY2xhc3Mgc2hhcmVkX2FsbG9jYXRvcjsKKworICAvKiBTcGVjaWFsaXphdGlvbiBmb3Igc2hhcmVkX2FsbG9jYXRvcjx2b2lkPi4gKi8KKyAgdGVtcGxhdGUgPD4KKyAgY2xhc3Mgc2hhcmVkX2FsbG9jYXRvcjx2b2lkPiB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIHZvaWQgICAgICAgKnBvaW50ZXI7CisgICAgdHlwZWRlZiBjb25zdCB2b2lkICpjb25zdF9wb2ludGVyOworICAgIHR5cGVkZWYgdm9pZCAgICAgICAgdmFsdWVfdHlwZTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVT4gc3RydWN0IHJlYmluZCB7IHR5cGVkZWYgc2hhcmVkX2FsbG9jYXRvcjxVPiBvdGhlcjsgfTsKKyAgfTsKKworICAvKiBEZWZpbml0aW9uIG9mIHNoYXJlZF9hbGxvY2F0b3I8VD4uICovCisgIHRlbXBsYXRlIDxjbGFzcyBUPgorICBjbGFzcyBzaGFyZWRfYWxsb2NhdG9yIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgc2l6ZV90ICAgICBzaXplX3R5cGU7CisgICAgdHlwZWRlZiBwdHJkaWZmX3QgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICB0eXBlZGVmIFQgICAgICAgICAqcG9pbnRlcjsKKyAgICB0eXBlZGVmIGNvbnN0IFQgICAqY29uc3RfcG9pbnRlcjsKKyAgICB0eXBlZGVmIFQgICAgICAgICAmcmVmZXJlbmNlOworICAgIHR5cGVkZWYgY29uc3QgVCAgICZjb25zdF9yZWZlcmVuY2U7CisgICAgdHlwZWRlZiBUICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgdGVtcGxhdGUgPGNsYXNzIFU+IHN0cnVjdCByZWJpbmQgeyB0eXBlZGVmIHNoYXJlZF9hbGxvY2F0b3I8VT4gb3RoZXI7IH07CisgICAgc2hhcmVkX2FsbG9jYXRvcigpIHRocm93KCkgeyB9CisgICAgc2hhcmVkX2FsbG9jYXRvcihjb25zdCBzaGFyZWRfYWxsb2NhdG9yJikgdGhyb3coKSB7IH0KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVT4gc2hhcmVkX2FsbG9jYXRvcihjb25zdCBzaGFyZWRfYWxsb2NhdG9yPFU+JikgdGhyb3coKSB7IH0KKyAgICB+c2hhcmVkX2FsbG9jYXRvcigpIHRocm93KCkgeyB9CisgICAgcG9pbnRlciBhZGRyZXNzKHJlZmVyZW5jZSB4KSBjb25zdCB7IHJldHVybiAmeDsgfQorICAgIGNvbnN0X3BvaW50ZXIgYWRkcmVzcyhjb25zdF9yZWZlcmVuY2UgeCkgY29uc3QgeyByZXR1cm4gJng7IH0KKyAgICBwb2ludGVyIGFsbG9jYXRlKAorICAgICAgc2l6ZV90eXBlLCBzaGFyZWRfYWxsb2NhdG9yPHZvaWQ+Ojpjb25zdF9wb2ludGVyIGhpbnQgPSAwKTsKKyAgICB2b2lkIGRlYWxsb2NhdGUocG9pbnRlciBwLCBzaXplX3R5cGUgbik7CisgICAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgdGhyb3coKSB7CisgICAgICByZXR1cm4gc2l6ZV90eXBlKC0xKS9zaXplb2YoVCk7CisgICAgfSAvKiBtYXhfc2l6ZSAqLworICAgIHZvaWQgY29uc3RydWN0KHBvaW50ZXIgcCwgY29uc3QgVCYgYXJnKSB7CisgICAgICA6Om5ldyAocCkgVChhcmcpOworICAgIH0gLyogY29uc3RydWN0ICovCisgICAgdm9pZCBkZXN0cm95KHBvaW50ZXIgcCkgeworICAgICAgcC0+flQoKTsKKyAgICB9IC8qIGRlc3Ryb3kgKi8KKyAgfTsKKworICAvKiBEZWZpbml0aW9uIGZvciBhbGxvY2F0ZS4gKi8KKyAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgIHR5cGVuYW1lIHNoYXJlZF9hbGxvY2F0b3I8VD46OnBvaW50ZXIKKyAgc2hhcmVkX2FsbG9jYXRvcjxUPjo6YWxsb2NhdGUoc2hhcmVkX2FsbG9jYXRvcjxUPjo6c2l6ZV90eXBlIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9hbGxvY2F0b3I8dm9pZD46OmNvbnN0X3BvaW50ZXIpIHsKKyAgICAvKiBBbGxvY2F0ZSBmcm9tIHNoYXJlZCBtZW1vcnkuICovCisgICAgdm9pZCAqcHRyID0gX09mZmxvYWRfc2hhcmVkX21hbGxvYyhzKnNpemVvZihUKSk7CisgICAgaWYgKHB0ciA9PSAwKSBzdGQ6Ol9fdGhyb3dfYmFkX2FsbG9jKCk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHBvaW50ZXI+KHB0cik7CisgIH0gLyogYWxsb2NhdGUgKi8KKworICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgdm9pZCBzaGFyZWRfYWxsb2NhdG9yPFQ+OjpkZWFsbG9jYXRlKHBvaW50ZXIgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9hbGxvY2F0b3I8VD46OnNpemVfdHlwZSkgeworICAgIC8qIEZyZWUgdGhlIHNoYXJlZCBtZW1vcnkuICovCisgICAgX09mZmxvYWRfc2hhcmVkX2ZyZWUocCk7CisgIH0gLyogZGVhbGxvY2F0ZSAqLworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMj4KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBzaGFyZWRfYWxsb2NhdG9yPF9UMT4gJiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX2FsbG9jYXRvcjxfVDI+ICYpIHRocm93KCkgeworICAgIHJldHVybiB0cnVlOworICB9ICAvKiBvcGVyYXRvcj09ICovCisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX1QyPgorICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHNoYXJlZF9hbGxvY2F0b3I8X1QxPiAmLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfYWxsb2NhdG9yPF9UMj4gJikgdGhyb3coKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9ICAvKiBvcGVyYXRvciE9ICovCit9ICAvKiBfX29mZmxvYWQgKi8KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgLyogT0ZGTE9BRF9IX0lOQ0xVREVEICovCmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX2NvbW1vbi5jcHAgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX2NvbW1vbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY4MWIwNgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfY29tbW9uLmNwcApAQCAtMCwwICsxLDE3MCBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWYgZGVmaW5lZChMSU5VWCkgfHwgZGVmaW5lZChGUkVFQlNEKQorI2luY2x1ZGUgPG1tX21hbGxvYy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJvZmZsb2FkX2NvbW1vbi5oIgorCisvLyBUaGUgZGVidWcgcm91dGluZXMKKworI2lmIE9GRkxPQURfREVCVUcgPiAwCisKK3ZvaWQgX19kdW1wX2J5dGVzKAorICAgIGludCB0cmFjZV9sZXZlbCwKKyAgICBjb25zdCB2b2lkICpkYXRhLAorICAgIGludCBsZW4KKykKK3sKKyAgICBpZiAoY29uc29sZV9lbmFibGVkID4gdHJhY2VfbGV2ZWwpIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqYXJyID0gKGNvbnN0IHVpbnQ4X3QqKSBkYXRhOworICAgICAgICBjaGFyIGJ1ZmZlcls0MDk2XTsKKyAgICAgICAgY2hhciAqYnVmZmVycDsKKyAgICAgICAgaW50IGNvdW50ID0gMDsKKworICAgICAgICBidWZmZXJwID0gYnVmZmVyOworICAgICAgICB3aGlsZSAobGVuLS0pIHsKKyAgICAgICAgICAgIHNwcmludGYoYnVmZmVycCwgIiUwMngiLCAqYXJyKyspOworICAgICAgICAgICAgYnVmZmVycCArPSAyOworICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgIGlmICgoY291bnQmMykgPT0gMCkgeworICAgICAgICAgICAgICAgIHNwcmludGYoYnVmZmVycCwgIiAiKTsKKyAgICAgICAgICAgICAgICBidWZmZXJwKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGNvdW50JjYzKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSh0cmFjZV9sZXZlbCwgIiVzXG4iLCBidWZmZXIpOworICAgICAgICAgICAgICAgIGJ1ZmZlcnAgPSBidWZmZXI7CisgICAgICAgICAgICAgICAgY291bnQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjb3VudCkgeworICAgICAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSh0cmFjZV9sZXZlbCwgIiVzXG4iLCBidWZmZXIpOworICAgICAgICB9CisgICAgfQorfQorI2VuZGlmIC8vIE9GRkxPQURfREVCVUcKKworLy8gVGhlIE1hcnNoYWxsZXIgYW5kIGFzc29jaWF0ZWQgcm91dGluZXMKKwordm9pZCBNYXJzaGFsbGVyOjpzZW5kX2RhdGEoCisgICAgY29uc3Qgdm9pZCAqZGF0YSwKKyAgICBpbnQ2NF90IGxlbmd0aAorKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgInNlbmRfZGF0YSglcCwgJWxsZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLCBsZW5ndGgpOworICAgIG1lbWNweShidWZmZXJfcHRyLCBkYXRhLCAoc2l6ZV90KWxlbmd0aCk7CisgICAgYnVmZmVyX3B0ciArPSBsZW5ndGg7CisgICAgdGZyX3NpemUgKz0gbGVuZ3RoOworfQorCit2b2lkIE1hcnNoYWxsZXI6OnJlY2VpdmVfZGF0YSgKKyAgICB2b2lkICpkYXRhLAorICAgIGludDY0X3QgbGVuZ3RoCispCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAicmVjZWl2ZV9kYXRhKCVwLCAlbGxkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsIGxlbmd0aCk7CisgICAgbWVtY3B5KGRhdGEsIGJ1ZmZlcl9wdHIsIChzaXplX3QpbGVuZ3RoKTsKKyAgICBidWZmZXJfcHRyICs9IGxlbmd0aDsKKyAgICB0ZnJfc2l6ZSArPSBsZW5ndGg7Cit9CisKKy8vIFNlbmQgZnVuY3Rpb24gcG9pbnRlcgordm9pZCBNYXJzaGFsbGVyOjpzZW5kX2Z1bmNfcHRyKAorICAgIGNvbnN0IHZvaWQqIGRhdGEKKykKK3sKKyAgICBjb25zdCBjaGFyKiBuYW1lOworICAgIHNpemVfdCAgICAgIGxlbmd0aDsKKworICAgIGlmIChkYXRhICE9IDApIHsKKyAgICAgICAgbmFtZSA9IF9fb2ZmbG9hZF9mdW5jcy5maW5kX25hbWUoZGF0YSk7CisgICAgICAgIGlmIChuYW1lID09IDApIHsKKyNpZiBPRkZMT0FEX0RFQlVHID4gMAorICAgICAgICAgICAgaWYgKGNvbnNvbGVfZW5hYmxlZCA+IDIpIHsKKyAgICAgICAgICAgICAgICBfX29mZmxvYWRfZnVuY3MuZHVtcCgpOworICAgICAgICAgICAgfQorI2VuZGlmIC8vIE9GRkxPQURfREVCVUcgPiAwCisKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19zZW5kX2Z1bmNfcHRyLCBkYXRhKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICAgICAgbGVuZ3RoID0gc3RybGVuKG5hbWUpICsgMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIG5hbWUgPSAiIjsKKyAgICAgICAgbGVuZ3RoID0gMTsKKyAgICB9CisKKyAgICBtZW1jcHkoYnVmZmVyX3B0ciwgbmFtZSwgbGVuZ3RoKTsKKyAgICBidWZmZXJfcHRyICs9IGxlbmd0aDsKKyAgICB0ZnJfc2l6ZSArPSBsZW5ndGg7Cit9CisKKy8vIFJlY2VpdmUgZnVuY3Rpb24gcG9pbnRlcgordm9pZCBNYXJzaGFsbGVyOjpyZWNlaXZlX2Z1bmNfcHRyKAorICAgIGNvbnN0IHZvaWQqKiBkYXRhCispCit7CisgICAgY29uc3QgY2hhciogbmFtZTsKKyAgICBzaXplX3QgICAgICBsZW5ndGg7CisKKyAgICBuYW1lID0gKGNvbnN0IGNoYXIqKSBidWZmZXJfcHRyOworICAgIGlmIChuYW1lWzBdICE9ICdcMCcpIHsKKyAgICAgICAgKmRhdGEgPSBfX29mZmxvYWRfZnVuY3MuZmluZF9hZGRyKG5hbWUpOworICAgICAgICBpZiAoKmRhdGEgPT0gMCkgeworI2lmIE9GRkxPQURfREVCVUcgPiAwCisgICAgICAgICAgICBpZiAoY29uc29sZV9lbmFibGVkID4gMikgeworICAgICAgICAgICAgICAgIF9fb2ZmbG9hZF9mdW5jcy5kdW1wKCk7CisgICAgICAgICAgICB9CisjZW5kaWYgLy8gT0ZGTE9BRF9ERUJVRyA+IDAKKworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3JlY2VpdmVfZnVuY19wdHIsIG5hbWUpOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorICAgICAgICBsZW5ndGggPSBzdHJsZW4obmFtZSkgKyAxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgKmRhdGEgPSAwOworICAgICAgICBsZW5ndGggPSAxOworICAgIH0KKworICAgIGJ1ZmZlcl9wdHIgKz0gbGVuZ3RoOworICAgIHRmcl9zaXplICs9IGxlbmd0aDsKK30KKworLy8gRW5kIG9mIHRoZSBNYXJzaGFsbGVyIGFuZCBhc3NvY2lhdGVkIHJvdXRpbmVzCisKK2V4dGVybiB2b2lkICpPRkZMT0FEX01BTExPQygKKyAgICBzaXplX3Qgc2l6ZSwKKyAgICBzaXplX3QgYWxpZ24KKykKK3sKKyAgICB2b2lkICpwdHI7CisgICAgaW50ICAgZXJyOworCisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiJXMoJWxsZCwgJWxsZClcbiIsIF9fZnVuY19fLCBzaXplLCBhbGlnbik7CisKKyAgICBpZiAoYWxpZ24gPCBzaXplb2Yodm9pZCopKSB7CisgICAgICAgIGFsaWduID0gc2l6ZW9mKHZvaWQqKTsKKyAgICB9CisKKyAgICBwdHIgPSBfbW1fbWFsbG9jKHNpemUsIGFsaWduKTsKKyAgICBpZiAocHRyID09IE5VTEwpIHsKKyAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX29mZmxvYWRfbWFsbG9jLCBzaXplLCBhbGlnbik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiJXMgcmV0dXJuZWQgJXBcbiIsIF9fZnVuY19fLCBwdHIpOworCisgICAgcmV0dXJuIHB0cjsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfY29tbW9uLmggYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExY2I4YmIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX2NvbW1vbi5oCkBAIC0wLDAgKzEsNDQ0IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKy8qISBcZmlsZQorICAgIFxicmllZiBUaGUgcGFydHMgb2YgdGhlIHJ1bnRpbWUgbGlicmFyeSBjb21tb24gdG8gaG9zdCBhbmQgdGFyZ2V0CisqLworCisjaWZuZGVmIE9GRkxPQURfQ09NTU9OX0hfSU5DTFVERUQKKyNkZWZpbmUgT0ZGTE9BRF9DT01NT05fSF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtZW1vcnkuaD4KKworI2luY2x1ZGUgIm9mZmxvYWQuaCIKKyNpbmNsdWRlICJvZmZsb2FkX3RhYmxlLmgiCisjaW5jbHVkZSAib2ZmbG9hZF90cmFjZS5oIgorI2luY2x1ZGUgIm9mZmxvYWRfdGltZXIuaCIKKyNpbmNsdWRlICJvZmZsb2FkX3V0aWwuaCIKKyNpbmNsdWRlICJjZWFuX3V0aWwuaCIKKyNpbmNsdWRlICJkdl91dGlsLmgiCisjaW5jbHVkZSAibGlib2ZmbG9hZF9lcnJvcl9jb2Rlcy5oIgorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKy8vIFRoZSBkZWJ1ZyByb3V0aW5lcworCisvLyBIb3N0IGNvbnNvbGUgYW5kIGZpbGUgbG9nZ2luZworZXh0ZXJuIGludCBjb25zb2xlX2VuYWJsZWQ7CitleHRlcm4gaW50IG9mZmxvYWRfcmVwb3J0X2xldmVsOworCisjZGVmaW5lIE9GRkxPQURfRE9fVFJBQ0UgKG9mZmxvYWRfcmVwb3J0X2xldmVsID09IDMpCisKK2V4dGVybiBjb25zdCBjaGFyICpwcmVmaXg7CitleHRlcm4gaW50IG9mZmxvYWRfbnVtYmVyOworI2lmICFIT1NUX0xJQlJBUlkKK2V4dGVybiBpbnQgbWljX2luZGV4OworI2VuZGlmCisKKyNpZiBIT1NUX0xJQlJBUlkKK3ZvaWQgT2ZmbG9hZF9SZXBvcnRfUHJvbG9nKE9mZmxvYWRIb3N0VGltZXJEYXRhKiB0aW1lcl9kYXRhKTsKK3ZvaWQgT2ZmbG9hZF9SZXBvcnRfRXBpbG9nKE9mZmxvYWRIb3N0VGltZXJEYXRhKiB0aW1lcl9kYXRhKTsKK3ZvaWQgb2ZmbG9hZF9yZXBvcnRfZnJlZV9kYXRhKE9mZmxvYWRIb3N0VGltZXJEYXRhICogdGltZXJfZGF0YSk7Cit2b2lkIE9mZmxvYWRfVGltZXJfUHJpbnQodm9pZCk7CisKKyNpZm5kZWYgVEFSR0VUX1dJTk5UCisjZGVmaW5lIE9GRkxPQURfREVCVUdfSU5DUl9PRkxEX05VTSgpIFwKKyAgICAgICAgX19zeW5jX2FkZF9hbmRfZmV0Y2goJm9mZmxvYWRfbnVtYmVyLCAxKQorI2Vsc2UKKyNkZWZpbmUgT0ZGTE9BRF9ERUJVR19JTkNSX09GTERfTlVNKCkgXAorICAgICAgICBfSW50ZXJsb2NrZWRJbmNyZW1lbnQocmVpbnRlcnByZXRfY2FzdDxsb25nKj4oJm9mZmxvYWRfbnVtYmVyKSkKKyNlbmRpZgorCisjZGVmaW5lIE9GRkxPQURfREVCVUdfUFJJTlRfVEFHX1BSRUZJWCgpIFwKKyAgICAgICAgcHJpbnRmKCIlczogICIsIHByZWZpeCk7CisKKyNkZWZpbmUgT0ZGTE9BRF9ERUJVR19QUklOVF9QUkVGSVgoKSBcCisgICAgICAgIHByaW50ZigiJXM6ICAiLCBwcmVmaXgpOworI2Vsc2UKKyNkZWZpbmUgT0ZGTE9BRF9ERUJVR19QUklOVF9QUkVGSVgoKSBcCisgICAgICAgIHByaW50ZigiJXMlZDogICIsIHByZWZpeCwgbWljX2luZGV4KTsKKyNlbmRpZiAvLyBIT1NUX0xJQlJBUlkKKworI2RlZmluZSBPRkZMT0FEX1RSQUNFKHRyYWNlX2xldmVsLCAuLi4pICBcCisgICAgaWYgKGNvbnNvbGVfZW5hYmxlZCA+PSB0cmFjZV9sZXZlbCkgeyBcCisgICAgICAgIE9GRkxPQURfREVCVUdfUFJJTlRfUFJFRklYKCk7IFwKKyAgICAgICAgcHJpbnRmKF9fVkFfQVJHU19fKTsgXAorICAgICAgICBmZmx1c2goTlVMTCk7IFwKKyAgICB9CisKKyNpZiBPRkZMT0FEX0RFQlVHID4gMAorCisjZGVmaW5lIE9GRkxPQURfREVCVUdfVFJBQ0UobGV2ZWwsIC4uLikgXAorICAgIE9GRkxPQURfVFJBQ0UobGV2ZWwsIF9fVkFfQVJHU19fKQorCisjZGVmaW5lIE9GRkxPQURfUkVQT1JUKGxldmVsLCBvZmZsb2FkX251bWJlciwgc3RhZ2UsIC4uLikgXAorICAgIGlmIChPRkZMT0FEX0RPX1RSQUNFKSB7IFwKKyAgICAgICAgb2ZmbG9hZF9zdGFnZV9wcmludChzdGFnZSwgb2ZmbG9hZF9udW1iZXIsIF9fVkFfQVJHU19fKTsgXAorICAgICAgICBmZmx1c2goTlVMTCk7IFwKKyAgICB9CisKKyNkZWZpbmUgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKGxldmVsLCBvZmZsb2FkX251bWJlciwgc3RhZ2UsIC4uLikgXAorICAgIGlmIChPRkZMT0FEX0RPX1RSQUNFKSB7IFwKKyAgICAgICAgb2ZmbG9hZF9zdGFnZV9wcmludChzdGFnZSwgb2ZmbG9hZF9udW1iZXIsIF9fVkFfQVJHU19fKTsgXAorICAgICAgICBmZmx1c2goTlVMTCk7IFwKKyAgICB9IFwKKyAgICBpZiAoIU9GRkxPQURfRE9fVFJBQ0UpIHsgXAorICAgICAgICBPRkZMT0FEX1RSQUNFKGxldmVsLCBfX1ZBX0FSR1NfXykgXAorICAgIH0KKworI2RlZmluZSBPRkZMT0FEX0RFQlVHX0RVTVBfQllURVMobGV2ZWwsIGEsIGIpIFwKKyAgICBfX2R1bXBfYnl0ZXMobGV2ZWwsIGEsIGIpCisKK2V4dGVybiB2b2lkIF9fZHVtcF9ieXRlcygKKyAgICBpbnQgbGV2ZWwsCisgICAgY29uc3Qgdm9pZCAqZGF0YSwKKyAgICBpbnQgbGVuCispOworCisjZWxzZQorCisjZGVmaW5lIE9GRkxPQURfREVCVUdfTE9HKGxldmVsLCAuLi4pCisjZGVmaW5lIE9GRkxPQURfREVCVUdfRFVNUF9CWVRFUyhsZXZlbCwgYSwgYikKKworI2VuZGlmCisKKy8vIFJ1bnRpbWUgaW50ZXJmYWNlCisKKyNkZWZpbmUgT0ZGTE9BRF9QUkVGSVgoYSkgX19vZmZsb2FkXyMjYQorCisjZGVmaW5lIE9GRkxPQURfTUFMTE9DICAgICAgICAgICAgT0ZGTE9BRF9QUkVGSVgobWFsbG9jKQorI2RlZmluZSBPRkZMT0FEX0ZSRUUoYSkgICAgICAgICAgIF9tbV9mcmVlKGEpCisKKy8vIEZvcndhcmQgZnVuY3Rpb25zCisKK2V4dGVybiB2b2lkICpPRkZMT0FEX01BTExPQyhzaXplX3Qgc2l6ZSwgc2l6ZV90IGFsaWduKTsKKworLy8gVGhlIE1hcnNoYWxsZXIKKworLy8hIFxlbnVtIEluZGljYXRvciBmb3IgdGhlIHR5cGUgb2YgZW50cnkgb24gYW4gb2ZmbG9hZCBpdGVtIGxpc3QuCitlbnVtIE9mZmxvYWRJdGVtVHlwZSB7CisgICAgY19kYXRhID0gICAxLCAgICAgICAvLyE8IFBsYWluIGRhdGEKKyAgICBjX2RhdGFfcHRyLCAgICAgICAgIC8vITwgUG9pbnRlciBkYXRhCisgICAgY19mdW5jX3B0ciwgICAgICAgICAvLyE8IEZ1bmN0aW9uIHBvaW50ZXIKKyAgICBjX3ZvaWRfcHRyLCAgICAgICAgIC8vITwgdm9pZCoKKyAgICBjX3N0cmluZ19wdHIsICAgICAgIC8vITwgQyBzdHJpbmcKKyAgICBjX2R2LCAgICAgICAgICAgICAgIC8vITwgRG9wZSB2ZWN0b3IgdmFyaWFibGUKKyAgICBjX2R2X2RhdGEsICAgICAgICAgIC8vITwgRG9wZS12ZWN0b3IgZGF0YQorICAgIGNfZHZfZGF0YV9zbGljZSwgICAgLy8hPCBEb3BlLXZlY3RvciBkYXRhJ3Mgc2xpY2UKKyAgICBjX2R2X3B0ciwgICAgICAgICAgIC8vITwgRG9wZS12ZWN0b3IgdmFyaWFibGUgcG9pbnRlcgorICAgIGNfZHZfcHRyX2RhdGEsICAgICAgLy8hPCBEb3BlLXZlY3RvciBwb2ludGVyIGRhdGEKKyAgICBjX2R2X3B0cl9kYXRhX3NsaWNlLC8vITwgRG9wZS12ZWN0b3IgcG9pbnRlciBkYXRhJ3Mgc2xpY2UKKyAgICBjX2NlYW5fdmFyLCAgICAgICAgIC8vITwgQ0VBTiB2YXJpYWJsZQorICAgIGNfY2Vhbl92YXJfcHRyLCAgICAgLy8hPCBQb2ludGVyIHRvIENFQU4gdmFyaWFibGUKKyAgICBjX2RhdGFfcHRyX2FycmF5LCAgIC8vITwgUG9pbnRlciB0byBkYXRhIHBvaW50ZXIgYXJyYXkKKyAgICBjX2Z1bmNfcHRyX2FycmF5LCAgIC8vITwgUG9pbnRlciB0byBmdW5jdGlvbiBwb2ludGVyIGFycmF5CisgICAgY192b2lkX3B0cl9hcnJheSwgICAvLyE8IFBvaW50ZXIgdG8gdm9pZCogcG9pbnRlciBhcnJheQorICAgIGNfc3RyaW5nX3B0cl9hcnJheSAgLy8hPCBQb2ludGVyIHRvIGNoYXIqIHBvaW50ZXIgYXJyYXkKK307CisKKyNkZWZpbmUgVkFSX1RZUEVfSVNfUFRSKHQpICgodCkgPT0gY19zdHJpbmdfcHRyIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodCkgPT0gY19kYXRhX3B0ciB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHQpID09IGNfY2Vhbl92YXJfcHRyIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodCkgPT0gY19kdl9wdHIpCisKKyNkZWZpbmUgVkFSX1RZUEVfSVNfU0NBTEFSKHQpICgodCkgPT0gY19kYXRhIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodCkgPT0gY192b2lkX3B0ciB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHQpID09IGNfY2Vhbl92YXIgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0KSA9PSBjX2R2KQorCisjZGVmaW5lIFZBUl9UWVBFX0lTX0RWX0RBVEEodCkgKCh0KSA9PSBjX2R2X2RhdGEgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodCkgPT0gY19kdl9wdHJfZGF0YSkKKworI2RlZmluZSBWQVJfVFlQRV9JU19EVl9EQVRBX1NMSUNFKHQpICgodCkgPT0gY19kdl9kYXRhX3NsaWNlIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHQpID09IGNfZHZfcHRyX2RhdGFfc2xpY2UpCisKKworLy8hIFxlbnVtIFNwZWNpZnkgZGlyZWN0aW9uIHRvIGNvcHkgb2ZmbG9hZGVkIHZhcmlhYmxlLgorZW51bSBPZmZsb2FkUGFyYW1ldGVyVHlwZSB7CisgICAgY19wYXJhbWV0ZXJfdW5rbm93biA9IC0xLCAvLyE8IFVua25vd24gY2xhdXNlCisgICAgY19wYXJhbWV0ZXJfbm9jb3B5LCAgICAgICAvLyE8IFZhcmlhYmxlIGxpc3RlZCBpbiAibm9jb3B5IiBjbGF1c2UKKyAgICBjX3BhcmFtZXRlcl9pbiwgICAgICAgICAgIC8vITwgVmFyaWFibGUgbGlzdGVkIGluICJpbiIgY2xhdXNlCisgICAgY19wYXJhbWV0ZXJfb3V0LCAgICAgICAgICAvLyE8IFZhcmlhYmxlIGxpc3RlZCBpbiAib3V0IiBjbGF1c2UKKyAgICBjX3BhcmFtZXRlcl9pbm91dCAgICAgICAgIC8vITwgVmFyaWFibGUgbGlzdGVkIGluICJpbm91dCIgY2xhdXNlCit9OworCisvLyEgQW4gT2ZmbG9hZCBWYXJpYWJsZSBkZXNjcmlwdG9yCitzdHJ1Y3QgVmFyRGVzYyB7CisgICAgLy8hIE9mZmxvYWRJdGVtVHlwZXMgb2Ygc291cmNlIGFuZCBkZXN0aW5hdGlvbgorICAgIHVuaW9uIHsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVpbnQ4X3QgZHN0IDogNDsgLy8hPCBPZmZsb2FkSXRlbVR5cGUgb2YgZGVzdGluYXRpb24KKyAgICAgICAgICAgIHVpbnQ4X3Qgc3JjIDogNDsgLy8hPCBPZmZsb2FkSXRlbVR5cGUgb2Ygc291cmNlCisgICAgICAgIH07CisgICAgICAgIHVpbnQ4X3QgYml0czsKKyAgICB9IHR5cGU7CisKKyAgICAvLyEgT2ZmbG9hZFBhcmFtZXRlclR5cGUgdGhhdCBkZXNjcmliZXMgZGlyZWN0aW9uIG9mIGRhdGEgdHJhbnNmZXIKKyAgICB1bmlvbiB7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB1aW50OF90IGluICA6IDE7IC8vITwgU2V0IGlmIElOIG9yIElOT1VUCisgICAgICAgICAgICB1aW50OF90IG91dCA6IDE7IC8vITwgU2V0IGlmIE9VVCBvciBJTk9VVAorICAgICAgICB9OworICAgICAgICB1aW50OF90IGJpdHM7CisgICAgfSBkaXJlY3Rpb247CisKKyAgICB1aW50OF90IGFsbG9jX2lmOyAgICAgICAgLy8hPCBhbGxvY19pZiBtb2RpZmllciB2YWx1ZQorICAgIHVpbnQ4X3QgZnJlZV9pZjsgICAgICAgICAvLyE8IGZyZWVfaWYgbW9kaWZpZXIgdmFsdWUKKyAgICB1aW50MzJfdCBhbGlnbjsgICAgICAgICAgLy8hPCBNSUMgYWxpZ25tZW50IHJlcXVlc3RlZCBmb3IgcG9pbnRlciBkYXRhCisgICAgLy8hIE5vdCB1c2VkIGJ5IGNvbXBpbGVyOyBzZXQgdG8gMAorICAgIC8qISBVc2VkIGJ5IHJ1bnRpbWUgYXMgb2Zmc2V0IHRvIGRhdGEgZnJvbSBzdGFydCBvZiBNSUMgYnVmZmVyICovCisgICAgdWludDMyX3QgbWljX29mZnNldDsKKyAgICAvLyEgRmxhZ3MgZGVzY3JpYmluZyB0aGlzIHZhcmlhYmxlCisgICAgdW5pb24geworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgLy8hIHNvdXJjZSB2YXJpYWJsZSBoYXMgcGVyc2lzdGVudCBzdG9yYWdlCisgICAgICAgICAgICB1aW50MzJfdCBpc19zdGF0aWMgOiAxOworICAgICAgICAgICAgLy8hIGRlc3RpbmF0aW9uIHZhcmlhYmxlIGhhcyBwZXJzaXN0ZW50IHN0b3JhZ2UKKyAgICAgICAgICAgIHVpbnQzMl90IGlzX3N0YXRpY19kc3RuIDogMTsKKyAgICAgICAgICAgIC8vISBoYXMgbGVuZ3RoIGZvciBjX2R2ICYmIGNfZHZfcHRyCisgICAgICAgICAgICB1aW50MzJfdCBoYXNfbGVuZ3RoIDogMTsKKyAgICAgICAgICAgIC8vISBwZXJzaXN0ZWQgbG9jYWwgc2NhbGFyIGlzIGluIHN0YWNrIGJ1ZmZlcgorICAgICAgICAgICAgdWludDMyX3QgaXNfc3RhY2tfYnVmIDogMTsKKyAgICAgICAgICAgIC8vISBidWZmZXIgYWRkcmVzcyBpcyBzZW50IGluIGRhdGEKKyAgICAgICAgICAgIHVpbnQzMl90IHNpbmtfYWRkciA6IDE7CisgICAgICAgICAgICAvLyEgYWxsb2MgZGlzcGxhY2VtZW50IGlzIHNlbnQgaW4gZGF0YQorICAgICAgICAgICAgdWludDMyX3QgYWxsb2NfZGlzcCA6IDE7CisgICAgICAgICAgICAvLyEgc291cmNlIGRhdGEgaXMgbm9uY29udGlndW91cworICAgICAgICAgICAgdWludDMyX3QgaXNfbm9uY29udF9zcmMgOiAxOworICAgICAgICAgICAgLy8hIGRlc3RpbmF0aW9uIGRhdGEgaXMgbm9uY29udGlndW91cworICAgICAgICAgICAgdWludDMyX3QgaXNfbm9uY29udF9kc3QgOiAxOworICAgICAgICB9OworICAgICAgICB1aW50MzJfdCBiaXRzOworICAgIH0gZmxhZ3M7CisgICAgLy8hIE5vdCB1c2VkIGJ5IGNvbXBpbGVyOyBzZXQgdG8gMAorICAgIC8qISBVc2VkIGJ5IHJ1bnRpbWUgYXMgb2Zmc2V0IHRvIGJhc2UgZnJvbSBkYXRhIHN0b3JlZCBpbiBhIGJ1ZmZlciAqLworICAgIGludDY0X3Qgb2Zmc2V0OworICAgIC8vISBFbGVtZW50IGJ5dGUtc2l6ZSBvZiBkYXRhIHRvIGJlIHRyYW5zZmVycmVkCisgICAgLyohIEZvciBkb3BlLXZlY3RvciwgdGhlIHNpemUgb2YgdGhlIGRvcGUtdmVjdG9yICAgICAgKi8KKyAgICBpbnQ2NF90IHNpemU7CisgICAgdW5pb24geworICAgICAgICAvLyEgU2V0IHRvIDAgZm9yIGFycmF5IGV4cHJlc3Npb25zIGFuZCBkb3BlLXZlY3RvcnMKKyAgICAgICAgLyohIFNldCB0byAxIGZvciBzY2FsYXJzICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAvKiEgU2V0IHRvIHZhbHVlIG9mIGxlbmd0aCBtb2RpZmllciBmb3IgcG9pbnRlcnMgICovCisgICAgICAgIGludDY0X3QgY291bnQ7CisgICAgICAgIC8vISBEaXNwbGFjZW1lbnQgbm90IHVzZWQgYnkgY29tcGlsZXIKKyAgICAgICAgaW50NjRfdCBkaXNwOworICAgIH07CisKKyAgICAvLyEgVGhpcyBmaWVsZCBub3QgdXNlZCBieSBPcGVuTVAgNC4wCisgICAgLyohIFRoZSBhbGxvYyBzZWN0aW9uIGV4cHJlc3Npb24gaW4gI3ByYWdtYSBvZmZsb2FkICAgKi8KKyAgICB1bmlvbiB7CisgICAgICAgdm9pZCAqYWxsb2M7CisgICAgICAgaW50NjRfdCBwdHJfYXJyX29mZnNldDsKKyAgICB9OworCisgICAgLy8hIFRoaXMgZmllbGQgbm90IHVzZWQgYnkgT3Blbk1QIDQuMAorICAgIC8qISBUaGUgaW50byBzZWN0aW9uIGV4cHJlc3Npb24gaW4gI3ByYWdtYSBvZmZsb2FkICAgICovCisgICAgLyohIEZvciBjX2RhdGFfcHRyX2FycmF5IHRoaXMgaXMgdGhlIGludG8gcHRyIGFycmF5ICAgKi8KKyAgICB2b2lkICppbnRvOworCisgICAgLy8hIEZvciBhbiBvcmRpbmFyeSB2YXJpYWJsZSwgYWRkcmVzcyBvZiB0aGUgdmFyaWFibGUKKyAgICAvKiEgRm9yIGNfY2Vhbl92YXIgKEMvQysrIGFycmF5IGV4cHJlc3Npb24pLAorICAgICAgICBwb2ludGVyIHRvIGFycl9kZXNjLCB3aGljaCBpcyBhbiBhcnJheSBkZXNjcmlwdG9yLiAqLworICAgIC8qISBGb3IgY19kYXRhX3B0cl9hcnJheSAoYXJyYXkgb2YgZGF0YSBwb2ludGVycyksCisgICAgICAgIHBvaW50ZXIgdG8gcHRyX2FycmF5X2Rlc2NyaXB0b3IsCisgICAgICAgIHdoaWNoIGlzIGEgZGVzY3JpcHRvciBmb3IgcG9pbnRlciBhcnJheSB0cmFuc2ZlcnMuICovCisgICAgdm9pZCAqcHRyOworfTsKKworLy8hIEF1eGlsaWFyeSBzdHJ1Y3QgdXNlZCB3aGVuIC1nIGlzIGVuYWJsZWQgdGhhdCBob2xkcyB2YXJpYWJsZSBuYW1lcworc3RydWN0IFZhckRlc2MyIHsKKyAgICBjb25zdCBjaGFyICpzbmFtZTsgLy8hPCBTb3VyY2UgbmFtZQorICAgIGNvbnN0IGNoYXIgKmRuYW1lOyAvLyE8IERlc3RpbmF0aW9uIG5hbWUgKHdoZW4gImludG8iIGlzIHVzZWQpCit9OworCisvKiEgV2hlbiB0aGUgT2ZmbG9hZEl0ZW1UeXBlIGlzIGNfZGF0YV9wdHJfYXJyYXkKKyAgICB0aGUgcHRyIGZpZWxkIG9mIHRoZSBtYWluIGRlc2NyaXB0b3IgcG9pbnRzIHRvIHRoaXMgc3RydWN0LiAgICAgICAgICAqLworLyohIFRoZSB0eXBlIGluIFZhckRlc2MxIG1lcmVseSBzYXlzIGNfY2Vhbl9kYXRhX3B0ciwgYnV0IHRoZSBwb2ludGVyCisgICAgdHlwZSBjYW4gYmUgY19kYXRhX3B0ciwgY19mdW5jX3B0ciwgY192b2lkX3B0ciwgb3IgY19zdHJpbmdfcHRyLgorICAgIFRoZXJlZm9yZSB0aGUgYWN0dWFsIHBvaW50ZXIgdHlwZSBpcyBpbiB0aGUgZmxhZ3MgZmllbGQgb2YgVmFyRGVzYzMuICovCisvKiEgSWYgZmxhZ19hbGlnbl9pc19hcnJheS9mbGFnX2FsbG9jX2lmX2lzX2FycmF5L2ZsYWdfZnJlZV9pZl9pc19hcnJheQorICAgIGlzIDAgdGhlbiBhbGlnbm1lbnQvYWxsb2NfaWYvZnJlZV9pZiBhcmUgc3BlY2lmaWVkIGluIFZhckRlc2MxLiAgICAgICovCisvKiEgSWYgZmxhZ19hbGlnbl9pc19hcnJheS9mbGFnX2FsbG9jX2lmX2lzX2FycmF5L2ZsYWdfZnJlZV9pZl9pc19hcnJheQorICAgIGlzIDEgdGhlbiBhbGlnbl9hcnJheS9hbGxvY19pZl9hcnJheS9mcmVlX2lmX2FycmF5IHNwZWNpZnkKKyAgICB0aGUgc2V0IG9mIGFsaWdubWVudC9hbGxvY19pZi9mcmVlX2lmIHZhbHVlcy4gICAgICAgICAgICAgICAgICAgICAgICAqLworLyohIEZvciB0aGUgb3RoZXIgZmllbGRzLCBpZiBuZWl0aGVyIHRoZSBzY2FsYXIgbm9yIHRoZSBhcnJheSBmbGFnCisgICAgaXMgc2V0LCB0aGVuIHRoYXQgbW9kaWZpZXIgd2FzIG5vdCBzcGVjaWZpZWQuIElmIHRoZSBiaXRzIGFyZSBzZXQKKyAgICB0aGV5IHNwZWNpZnkgd2hpY2ggbW9kaWZpZXIgd2FzIHNldCBhbmQgd2hldGhlciBpdCB3YXMgYQorICAgIHNjYWxhciBvciBhbiBhcnJheSBleHByZXNzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitzdHJ1Y3QgVmFyRGVzYzMKK3sKKyAgICB2b2lkICpwdHJfYXJyYXk7ICAgICAgICAvLyE8IFBvaW50ZXIgdG8gYXJyX2Rlc2Mgb2YgYXJyYXkgb2YgcG9pbnRlcnMKKyAgICB2b2lkICphbGlnbl9hcnJheTsgICAgICAvLyE8IFNjYWxhciB2YWx1ZSBvciBwb2ludGVyIHRvIGFycl9kZXNjCisgICAgdm9pZCAqYWxsb2NfaWZfYXJyYXk7ICAgLy8hPCBTY2FsYXIgdmFsdWUgb3IgcG9pbnRlciB0byBhcnJfZGVzYworICAgIHZvaWQgKmZyZWVfaWZfYXJyYXk7ICAgIC8vITwgU2NhbGFyIHZhbHVlIG9yIHBvaW50ZXIgdG8gYXJyX2Rlc2MKKyAgICB2b2lkICpleHRlbnRfc3RhcnQ7ICAgICAvLyE8IFNjYWxhciB2YWx1ZSBvciBwb2ludGVyIHRvIGFycl9kZXNjCisgICAgdm9pZCAqZXh0ZW50X2VsZW1lbnRzOyAgLy8hPCBTY2FsYXIgdmFsdWUgb3IgcG9pbnRlciB0byBhcnJfZGVzYworICAgIHZvaWQgKmludG9fc3RhcnQ7ICAgICAgIC8vITwgU2NhbGFyIHZhbHVlIG9yIHBvaW50ZXIgdG8gYXJyX2Rlc2MKKyAgICB2b2lkICppbnRvX2VsZW1lbnRzOyAgICAvLyE8IFNjYWxhciB2YWx1ZSBvciBwb2ludGVyIHRvIGFycl9kZXNjCisgICAgdm9pZCAqYWxsb2Nfc3RhcnQ7ICAgICAgLy8hPCBTY2FsYXIgdmFsdWUgb3IgcG9pbnRlciB0byBhcnJfZGVzYworICAgIHZvaWQgKmFsbG9jX2VsZW1lbnRzOyAgIC8vITwgU2NhbGFyIHZhbHVlIG9yIHBvaW50ZXIgdG8gYXJyX2Rlc2MKKyAgICAvKiEgRmxhZ3MgdGhhdCBkZXNjcmliZSB0aGUgcG9pbnRlciB0eXBlIGFuZCB3aGV0aGVyIGVhY2ggZmllbGQKKyAgICAgICAgaXMgYSBzY2FsYXIgdmFsdWUgb3IgYW4gYXJyYXkgZXhwcmVzc2lvbi4gICAgICAgICovCisgICAgLyohIEZpcnN0IDYgYml0cyBhcmUgcG9pbnRlciBhcnJheSBlbGVtZW50IHR5cGU6CisgICAgICAgIGNfZGF0YV9wdHIsIGNfZnVuY19wdHIsIGNfdm9pZF9wdHIsIGNfc3RyaW5nX3B0ciAqLworICAgIC8qISBUaGVuIHNpbmdsZSBiaXRzIHNwZWNpZnk6ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiEgICAgIGFsaWduX2FycmF5IGlzIGFuIGFycmF5ICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyohICAgICBhbGxvY19pZl9hcnJheSBpcyBhbiBhcnJheSAgICAgICAgICAgICAgICAgICAqLworICAgIC8qISAgICAgZnJlZV9pZl9hcnJheSBpcyBhbiBhcnJheSAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiEgICAgIGV4dGVudF9zdGFydCBpcyBhIHNjYWxhciBleHByZXNzaW9uICAgICAgICAgICovCisgICAgLyohICAgICBleHRlbnRfc3RhcnQgaXMgYW4gYXJyYXkgZXhwcmVzc2lvbiAgICAgICAgICAqLworICAgIC8qISAgICAgZXh0ZW50X2VsZW1lbnRzIGlzIGEgc2NhbGFyIGV4cHJlc3Npb24gICAgICAgKi8KKyAgICAvKiEgICAgIGV4dGVudF9lbGVtZW50cyBpcyBhbiBhcnJheSBleHByZXNzaW9uICAgICAgICovCisgICAgLyohICAgICBpbnRvX3N0YXJ0IGlzIGEgc2NhbGFyIGV4cHJlc3Npb24gICAgICAgICAgICAqLworICAgIC8qISAgICAgaW50b19zdGFydCBpcyBhbiBhcnJheSBleHByZXNzaW9uICAgICAgICAgICAgKi8KKyAgICAvKiEgICAgIGludG9fZWxlbWVudHMgaXMgYSBzY2FsYXIgZXhwcmVzc2lvbiAgICAgICAgICovCisgICAgLyohICAgICBpbnRvX2VsZW1lbnRzIGlzIGFuIGFycmF5IGV4cHJlc3Npb24gICAgICAgICAqLworICAgIC8qISAgICAgYWxsb2Nfc3RhcnQgaXMgYSBzY2FsYXIgZXhwcmVzc2lvbiAgICAgICAgICAgKi8KKyAgICAvKiEgICAgIGFsbG9jX3N0YXJ0IGlzIGFuIGFycmF5IGV4cHJlc3Npb24gICAgICAgICAgICovCisgICAgLyohICAgICBhbGxvY19lbGVtZW50cyBpcyBhIHNjYWxhciBleHByZXNzaW9uICAgICAgICAqLworICAgIC8qISAgICAgYWxsb2NfZWxlbWVudHMgaXMgYW4gYXJyYXkgZXhwcmVzc2lvbiAgICAgICAgKi8KKyAgICB1aW50MzJfdCBhcnJheV9maWVsZHM7Cit9OworY29uc3QgaW50IGZsYWdfYWxpZ25faXNfYXJyYXkgPSA2OworY29uc3QgaW50IGZsYWdfYWxsb2NfaWZfaXNfYXJyYXkgPSA3OworY29uc3QgaW50IGZsYWdfZnJlZV9pZl9pc19hcnJheSA9IDg7Citjb25zdCBpbnQgZmxhZ19leHRlbnRfc3RhcnRfaXNfc2NhbGFyID0gOTsKK2NvbnN0IGludCBmbGFnX2V4dGVudF9zdGFydF9pc19hcnJheSA9IDEwOworY29uc3QgaW50IGZsYWdfZXh0ZW50X2VsZW1lbnRzX2lzX3NjYWxhciA9IDExOworY29uc3QgaW50IGZsYWdfZXh0ZW50X2VsZW1lbnRzX2lzX2FycmF5ID0gMTI7Citjb25zdCBpbnQgZmxhZ19pbnRvX3N0YXJ0X2lzX3NjYWxhciA9IDEzOworY29uc3QgaW50IGZsYWdfaW50b19zdGFydF9pc19hcnJheSA9IDE0OworY29uc3QgaW50IGZsYWdfaW50b19lbGVtZW50c19pc19zY2FsYXIgPSAxNTsKK2NvbnN0IGludCBmbGFnX2ludG9fZWxlbWVudHNfaXNfYXJyYXkgPSAxNjsKK2NvbnN0IGludCBmbGFnX2FsbG9jX3N0YXJ0X2lzX3NjYWxhciA9IDE3OworY29uc3QgaW50IGZsYWdfYWxsb2Nfc3RhcnRfaXNfYXJyYXkgPSAxODsKK2NvbnN0IGludCBmbGFnX2FsbG9jX2VsZW1lbnRzX2lzX3NjYWxhciA9IDE5OworY29uc3QgaW50IGZsYWdfYWxsb2NfZWxlbWVudHNfaXNfYXJyYXkgPSAyMDsKKworLy8gVGhlIE1hcnNoYWxsZXIKK2NsYXNzIE1hcnNoYWxsZXIKK3sKK3ByaXZhdGU6CisgICAgLy8gU3RhcnQgYWRkcmVzcyBvZiBidWZmZXIKKyAgICBjaGFyICpidWZmZXJfc3RhcnQ7CisKKyAgICAvLyBDdXJyZW50IHBvaW50ZXIgd2l0aGluIGJ1ZmZlcgorICAgIGNoYXIgKmJ1ZmZlcl9wdHI7CisKKyAgICAvLyBQaHlzaWNhbCBzaXplIG9mIGRhdGEgc2VudCAoaW5jbHVkaW5nIGZsYWdzKQorICAgIGxvbmcgbG9uZyBidWZmZXJfc2l6ZTsKKworICAgIC8vIFVzZXIgZGF0YSBzZW50L3JlY2VpdmVkCisgICAgbG9uZyBsb25nIHRmcl9zaXplOworCitwdWJsaWM6CisgICAgLy8gQ29uc3RydWN0b3IKKyAgICBNYXJzaGFsbGVyKCkgOgorICAgICAgICBidWZmZXJfc3RhcnQoMCksIGJ1ZmZlcl9wdHIoMCksCisgICAgICAgIGJ1ZmZlcl9zaXplKDApLCB0ZnJfc2l6ZSgwKQorICAgIHsKKyAgICB9CisKKyAgICAvLyBSZXR1cm4gY291bnQgb2YgdXNlciBkYXRhIHNlbnQvcmVjZWl2ZWQKKyAgICBsb25nIGxvbmcgZ2V0X3Rmcl9zaXplKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiB0ZnJfc2l6ZTsKKyAgICB9CisKKyAgICAvLyBSZXR1cm4gcG9pbnRlciB0byBidWZmZXIKKyAgICBjaGFyICpnZXRfYnVmZmVyX3N0YXJ0KCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBidWZmZXJfc3RhcnQ7CisgICAgfQorCisgICAgLy8gUmV0dXJuIGN1cnJlbnQgc2l6ZSBvZiBkYXRhIGluIGJ1ZmZlcgorICAgIGxvbmcgbG9uZyBnZXRfYnVmZmVyX3NpemUoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlcl9zaXplOworICAgIH0KKworICAgIC8vIFNldCBidWZmZXIgcG9pbnRlcgorICAgIHZvaWQgaW5pdF9idWZmZXIoCisgICAgICAgIGNoYXIgKmQsCisgICAgICAgIGxvbmcgbG9uZyBzCisgICAgKQorICAgIHsKKyAgICAgICAgYnVmZmVyX3N0YXJ0ID0gYnVmZmVyX3B0ciA9IGQ7CisgICAgICAgIGJ1ZmZlcl9zaXplID0gczsKKyAgICB9CisKKyAgICAvLyBTZW5kIGRhdGEKKyAgICB2b2lkIHNlbmRfZGF0YSgKKyAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwKKyAgICAgICAgaW50NjRfdCBsZW5ndGgKKyAgICApOworCisgICAgLy8gUmVjZWl2ZSBkYXRhCisgICAgdm9pZCByZWNlaXZlX2RhdGEoCisgICAgICAgIHZvaWQgKmRhdGEsCisgICAgICAgIGludDY0X3QgbGVuZ3RoCisgICAgKTsKKworICAgIC8vIFNlbmQgZnVuY3Rpb24gcG9pbnRlcgorICAgIHZvaWQgc2VuZF9mdW5jX3B0cigKKyAgICAgICAgY29uc3Qgdm9pZCogZGF0YQorICAgICk7CisKKyAgICAvLyBSZWNlaXZlIGZ1bmN0aW9uIHBvaW50ZXIKKyAgICB2b2lkIHJlY2VpdmVfZnVuY19wdHIoCisgICAgICAgIGNvbnN0IHZvaWQqKiBkYXRhCisgICAgKTsKK307CisKKy8vIEVuZCBvZiB0aGUgTWFyc2hhbGxlcgorCisvLyBUaGUgb2ZmbG9hZGVkIGZ1bmN0aW9uIGRlc2NyaXB0b3IuCisvLyBTZW50IGZyb20gaG9zdCB0byB0YXJnZXQgdG8gc3BlY2lmeSB3aGljaCBmdW5jdGlvbiB0byBydW4uCisvLyBBbHNvLCBzZXRzIGNvbnNvbGUgYW5kIGZpbGUgdHJhY2luZyBsZXZlbHMuCitzdHJ1Y3QgRnVuY3Rpb25EZXNjcmlwdG9yCit7CisgICAgLy8gSW5wdXQgZGF0YSBzaXplLgorICAgIGxvbmcgbG9uZyBpbl9kYXRhbGVuOworCisgICAgLy8gT3V0cHV0IGRhdGEgc2l6ZS4KKyAgICBsb25nIGxvbmcgb3V0X2RhdGFsZW47CisKKyAgICAvLyBXaGV0aGVyIHRyYWNlIGlzIHJlcXVlc3RlZCBvbiBjb25zb2xlLgorICAgIC8vIEEgdmFsdWUgb2YgMSBwcm9kdWNlcyBvbmx5IGZ1bmN0aW9uIG5hbWUgYW5kIGRhdGEgc2VudC9yZWNlaXZlZC4KKyAgICAvLyBWYWx1ZXMgPiAxIHByb2R1Y2UgY29waW91cyB0cmFjZSBpbmZvcm1hdGlvbi4KKyAgICB1aW50OF90IGNvbnNvbGVfZW5hYmxlZDsKKworICAgIC8vIEZsYWcgY29udHJvbGxpbmcgdGltaW5nIG9uIHRoZSB0YXJnZXQgc2lkZS4KKyAgICAvLyBWYWx1ZXMgPiAwIGVuYWJsZSB0aW1pbmcgb24gc2luay4KKyAgICB1aW50OF90IHRpbWVyX2VuYWJsZWQ7CisKKyAgICBpbnQgb2ZmbG9hZF9yZXBvcnRfbGV2ZWw7CisgICAgaW50IG9mZmxvYWRfbnVtYmVyOworCisgICAgLy8gbnVtYmVyIG9mIHZhcmlhYmxlIGRlc2NyaXB0b3JzCisgICAgaW50IHZhcnNfbnVtOworCisgICAgLy8gaW5vdXQgZGF0YSBvZmZzZXQgaWYgZGF0YSBpcyBwYXNzZWQgYXMgbWlzYy9yZXR1cm4gZGF0YQorICAgIC8vIG90aGVyd2lzZSBpdCBzaG91bGQgYmUgemVyby4KKyAgICBpbnQgZGF0YV9vZmZzZXQ7CisKKyAgICAvLyBUaGUgbmFtZSBvZiB0aGUgb2ZmbG9hZGVkIGZ1bmN0aW9uCisgICAgY2hhciBkYXRhW107Cit9OworCisvLyB0eXBlZGVmIE9GRkxPQUQuCisvLyBQb2ludGVyIHRvIE9mZmxvYWREZXNjcmlwdG9yLgordHlwZWRlZiBzdHJ1Y3QgT2ZmbG9hZERlc2NyaXB0b3IgKk9GRkxPQUQ7CisKKyNlbmRpZiAvLyBPRkZMT0FEX0NPTU1PTl9IX0lOQ0xVREVECmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX2VuZ2luZS5jcHAgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX2VuZ2luZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY5YjYwNAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfZW5naW5lLmNwcApAQCAtMCwwICsxLDUzMSBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAib2ZmbG9hZF9lbmdpbmUuaCIKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgIm9mZmxvYWRfaG9zdC5oIgorI2luY2x1ZGUgIm9mZmxvYWRfdGFibGUuaCIKKworY29uc3QgY2hhciogRW5naW5lOjptX2Z1bmNfbmFtZXNbRW5naW5lOjpjX2Z1bmNzX3RvdGFsXSA9Cit7CisgICAgInNlcnZlcl9jb21wdXRlIiwKKyNpZmRlZiBNWU9fU1VQUE9SVAorICAgICJzZXJ2ZXJfbXlvaW5pdCIsCisgICAgInNlcnZlcl9teW9maW5pIiwKKyNlbmRpZiAvLyBNWU9fU1VQUE9SVAorICAgICJzZXJ2ZXJfaW5pdCIsCisgICAgInNlcnZlcl92YXJfdGFibGVfc2l6ZSIsCisgICAgInNlcnZlcl92YXJfdGFibGVfY29weSIKK307CisKKy8vIFN5bWJvbGljIHJlcHJlc2VudGF0aW9uIG9mIHN5c3RlbSBzaWduYWxzLiBGaXggZm9yIENRMjMzNTkzCitjb25zdCBjaGFyKiBFbmdpbmU6OmNfc2lnbmFsX25hbWVzW0VuZ2luZTo6Y19zaWduYWxfbWF4XSA9Cit7CisgICAgIlVua25vd24gU0lHTkFMIiwKKyAgICAiU0lHSFVQIiwgICAgLyogIDEsIEhhbmd1cCAoUE9TSVgpLiAgKi8KKyAgICAiU0lHSU5UIiwgICAgLyogIDIsIEludGVycnVwdCAoQU5TSSkuICAqLworICAgICJTSUdRVUlUIiwgICAvKiAgMywgUXVpdCAoUE9TSVgpLiAgKi8KKyAgICAiU0lHSUxMIiwgICAgLyogIDQsIElsbGVnYWwgaW5zdHJ1Y3Rpb24gKEFOU0kpLiAgKi8KKyAgICAiU0lHVFJBUCIsICAgLyogIDUsIFRyYWNlIHRyYXAgKFBPU0lYKS4gICovCisgICAgIlNJR0FCUlQiLCAgIC8qICA2LCBBYm9ydCAoQU5TSSkuICAqLworICAgICJTSUdCVVMiLCAgICAvKiAgNywgQlVTIGVycm9yICg0LjIgQlNEKS4gICovCisgICAgIlNJR0ZQRSIsICAgIC8qICA4LCBGbG9hdGluZy1wb2ludCBleGNlcHRpb24gKEFOU0kpLiAgKi8KKyAgICAiU0lHS0lMTCIsICAgLyogIDksIEtpbGwsIHVuYmxvY2thYmxlIChQT1NJWCkuICAqLworICAgICJTSUdVU1IxIiwgICAvKiAxMCwgVXNlci1kZWZpbmVkIHNpZ25hbCAxIChQT1NJWCkuICAqLworICAgICJTSUdTRUdWIiwgICAvKiAxMSwgU2VnbWVudGF0aW9uIHZpb2xhdGlvbiAoQU5TSSkuICAqLworICAgICJTSUdVU1IyIiwgICAvKiAxMiwgVXNlci1kZWZpbmVkIHNpZ25hbCAyIChQT1NJWCkuICAqLworICAgICJTSUdQSVBFIiwgICAvKiAxMywgQnJva2VuIHBpcGUgKFBPU0lYKS4gICovCisgICAgIlNJR0FMUk0iLCAgIC8qIDE0LCBBbGFybSBjbG9jayAoUE9TSVgpLiAgKi8KKyAgICAiU0lHVEVSTSIsICAgLyogMTUsIFRlcm1pbmF0aW9uIChBTlNJKS4gICovCisgICAgIlNJR1NUS0ZMVCIsIC8qIDE2LCBTdGFjayBmYXVsdC4gICovCisgICAgIlNJR0NITEQiLCAgIC8qIDE3LCBDaGlsZCBzdGF0dXMgaGFzIGNoYW5nZWQgKFBPU0lYKS4gICovCisgICAgIlNJR0NPTlQiLCAgIC8qIDE4LCBDb250aW51ZSAoUE9TSVgpLiAgKi8KKyAgICAiU0lHU1RPUCIsICAgLyogMTksIFN0b3AsIHVuYmxvY2thYmxlIChQT1NJWCkuICAqLworICAgICJTSUdUU1RQIiwgICAvKiAyMCwgS2V5Ym9hcmQgc3RvcCAoUE9TSVgpLiAgKi8KKyAgICAiU0lHVFRJTiIsICAgLyogMjEsIEJhY2tncm91bmQgcmVhZCBmcm9tIHR0eSAoUE9TSVgpLiAgKi8KKyAgICAiU0lHVFRPVSIsICAgLyogMjIsIEJhY2tncm91bmQgd3JpdGUgdG8gdHR5IChQT1NJWCkuICAqLworICAgICJTSUdVUkciLCAgICAvKiAyMywgVXJnZW50IGNvbmRpdGlvbiBvbiBzb2NrZXQgKDQuMiBCU0QpLiAgKi8KKyAgICAiU0lHWENQVSIsICAgLyogMjQsIENQVSBsaW1pdCBleGNlZWRlZCAoNC4yIEJTRCkuICAqLworICAgICJTSUdYRlNaIiwgICAvKiAyNSwgRmlsZSBzaXplIGxpbWl0IGV4Y2VlZGVkICg0LjIgQlNEKS4gICovCisgICAgIlNJR1ZUQUxSTSIsIC8qIDI2LCBWaXJ0dWFsIGFsYXJtIGNsb2NrICg0LjIgQlNEKS4gICovCisgICAgIlNJR1BST0YiLCAgIC8qIDI3LCBQcm9maWxpbmcgYWxhcm0gY2xvY2sgKDQuMiBCU0QpLiAgKi8KKyAgICAiU0lHV0lOQ0giLCAgLyogMjgsIFdpbmRvdyBzaXplIGNoYW5nZSAoNC4zIEJTRCwgU3VuKS4gICovCisgICAgIlNJR0lPIiwgICAgIC8qIDI5LCBJL08gbm93IHBvc3NpYmxlICg0LjIgQlNEKS4gICovCisgICAgIlNJR1BXUiIsICAgIC8qIDMwLCBQb3dlciBmYWlsdXJlIHJlc3RhcnQgKFN5c3RlbSBWKS4gICovCisgICAgIlNJR1NZUyIgICAgIC8qIDMxLCBCYWQgc3lzdGVtIGNhbGwuICAqLworfTsKKwordm9pZCBFbmdpbmU6OmluaXQodm9pZCkKK3sKKyAgICBpZiAoIW1fcmVhZHkpIHsKKyAgICAgICAgbXV0ZXhfbG9ja2VyX3QgbG9ja2VyKG1fbG9jayk7CisKKyAgICAgICAgaWYgKCFtX3JlYWR5KSB7CisgICAgICAgICAgICAvLyBzdGFydCBwcm9jZXNzIGlmIG5vdCBkb25lIHlldAorICAgICAgICAgICAgaWYgKG1fcHJvY2VzcyA9PSAwKSB7CisgICAgICAgICAgICAgICAgaW5pdF9wcm9jZXNzKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGxvYWQgcGVuZ2luZyBpbWFnZXMKKyAgICAgICAgICAgIGxvYWRfbGlicmFyaWVzKCk7CisKKyAgICAgICAgICAgIC8vIGFuZCAocmUpYnVpbGQgcG9pbnRlciB0YWJsZQorICAgICAgICAgICAgaW5pdF9wdHJfZGF0YSgpOworCisgICAgICAgICAgICAvLyBpdCBpcyByZWFkeSBub3cKKyAgICAgICAgICAgIG1fcmVhZHkgPSB0cnVlOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEVuZ2luZTo6aW5pdF9wcm9jZXNzKHZvaWQpCit7CisgICAgQ09JRU5HSU5FIGVuZ2luZTsKKyAgICBDT0lSRVNVTFQgcmVzOworICAgIGNvbnN0IGNoYXIgKiplbnZpcm9uOworCisgICAgLy8gY3JlYXRlIGVudmlyb25tZW50IGZvciB0aGUgdGFyZ2V0IHByb2Nlc3MKKyAgICBlbnZpcm9uID0gKGNvbnN0IGNoYXIqKikgbWljX2Vudl92YXJzLmNyZWF0ZV9lbnZpcm9uX2Zvcl9jYXJkKG1faW5kZXgpOworICAgIGlmIChlbnZpcm9uICE9IDApIHsKKyAgICAgICAgZm9yIChjb25zdCBjaGFyICoqcCA9IGVudmlyb247ICpwICE9IDA7IHArKykgeworICAgICAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiRW52IFZhciBmb3IgY2FyZCAlZDogJXNcbiIsIG1faW5kZXgsICpwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENyZWF0ZSBleGVjdXRpb24gY29udGV4dCBpbiB0aGUgc3BlY2lmaWVkIGRldmljZQorICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkdldHRpbmcgZGV2aWNlICVkIChlbmdpbmUgJWQpIGhhbmRsZVxuIiwgbV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcGh5c2ljYWxfaW5kZXgpOworICAgIHJlcyA9IENPSTo6RW5naW5lR2V0SGFuZGxlKENPSV9JU0FfS05DLCBtX3BoeXNpY2FsX2luZGV4LCAmZW5naW5lKTsKKyAgICBjaGVja19yZXN1bHQocmVzLCBjX2dldF9lbmdpbmVfaGFuZGxlLCBtX2luZGV4LCByZXMpOworCisgICAgLy8gVGFyZ2V0IGV4ZWN1dGFibGUgc2hvdWxkIGJlIGF2YWlsYWJsZSBieSB0aGUgdGltZSB3aGVuIHdlCisgICAgLy8gYXR0ZW1wdCB0byBpbml0aWFsaXplIHRoZSBkZXZpY2UKKyAgICBpZiAoX190YXJnZXRfZXhlID09IDApIHsKKyAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX25vX3RhcmdldF9leGUpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwKKyAgICAgICAgIkxvYWRpbmcgdGFyZ2V0IGV4ZWN1dGFibGUgXCIlc1wiIGZyb20gJXAsIHNpemUgJWxsZFxuIiwKKyAgICAgICAgX190YXJnZXRfZXhlLT5uYW1lLCBfX3RhcmdldF9leGUtPmRhdGEsIF9fdGFyZ2V0X2V4ZS0+c2l6ZSk7CisKKyAgICByZXMgPSBDT0k6OlByb2Nlc3NDcmVhdGVGcm9tTWVtb3J5KAorICAgICAgICBlbmdpbmUsICAgICAgICAgICAgICAgICAvLyBpbl9FbmdpbmUKKyAgICAgICAgX190YXJnZXRfZXhlLT5uYW1lLCAgICAgLy8gaW5fcEJpbmFyeU5hbWUKKyAgICAgICAgX190YXJnZXRfZXhlLT5kYXRhLCAgICAgLy8gaW5fcEJpbmFyeUJ1ZmZlcgorICAgICAgICBfX3RhcmdldF9leGUtPnNpemUsICAgICAvLyBpbl9CaW5hcnlCdWZmZXJMZW5ndGgsCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8vIGluX0FyZ2MKKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLy8gaW5fcHBBcmd2CisgICAgICAgIGVudmlyb24gPT0gMCwgICAgICAgICAgIC8vIGluX0R1cEVudgorICAgICAgICBlbnZpcm9uLCAgICAgICAgICAgICAgICAvLyBpbl9wcEFkZGl0aW9uYWxFbnYKKyAgICAgICAgbWljX3Byb3h5X2lvLCAgICAgICAgICAgLy8gaW5fUHJveHlBY3RpdmUKKyAgICAgICAgbWljX3Byb3h5X2ZzX3Jvb3QsICAgICAgLy8gaW5fUHJveHlmc1Jvb3QKKyAgICAgICAgbWljX2J1ZmZlcl9zaXplLCAgICAgICAgLy8gaW5fQnVmZmVyU3BhY2UKKyAgICAgICAgbWljX2xpYnJhcnlfcGF0aCwgICAgICAgLy8gaW5fTGlicmFyeVNlYXJjaFBhdGgKKyAgICAgICAgX190YXJnZXRfZXhlLT5vcmlnaW4sICAgLy8gaW5fRmlsZU9mT3JpZ2luCisgICAgICAgIF9fdGFyZ2V0X2V4ZS0+b2Zmc2V0LCAgIC8vIGluX0ZpbGVPZk9yaWdpbk9mZnNldAorICAgICAgICAmbV9wcm9jZXNzICAgICAgICAgICAgICAvLyBvdXRfcFByb2Nlc3MKKyAgICApOworICAgIGNoZWNrX3Jlc3VsdChyZXMsIGNfcHJvY2Vzc19jcmVhdGUsIG1faW5kZXgsIHJlcyk7CisKKyAgICAvLyBnZXQgZnVuY3Rpb24gaGFuZGxlcworICAgIHJlcyA9IENPSTo6UHJvY2Vzc0dldEZ1bmN0aW9uSGFuZGxlcyhtX3Byb2Nlc3MsIGNfZnVuY3NfdG90YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZnVuY19uYW1lcywgbV9mdW5jcyk7CisgICAgY2hlY2tfcmVzdWx0KHJlcywgY19wcm9jZXNzX2dldF9mdW5jX2hhbmRsZXMsIG1faW5kZXgsIHJlcyk7CisKKyAgICAvLyBpbml0aWFsaXplIGRldmljZSBzaWRlCisgICAgcGlkX3QgcGlkID0gaW5pdF9kZXZpY2UoKTsKKworICAgIC8vIEZvciBJREIKKyAgICBpZiAoX19kYmdfaXNfYXR0YWNoZWQpIHsKKyAgICAgICAgLy8gVE9ETzogd2UgaGF2ZSBpbi1tZW1vcnkgZXhlY3V0YWJsZSBub3cuCisgICAgICAgIC8vIENoZWNrIHdpdGggSURCIHRlYW0gd2hhdCBzaG91bGQgd2UgcHJvdmlkZSB0aGVtIG5vdz8KKyAgICAgICAgaWYgKHN0cmxlbihfX3RhcmdldF9leGUtPm5hbWUpIDwgTUFYX1RBUkdFVF9OQU1FKSB7CisgICAgICAgICAgICBzdHJjcHkoX19kYmdfdGFyZ2V0X2V4ZV9uYW1lLCBfX3RhcmdldF9leGUtPm5hbWUpOworICAgICAgICB9CisgICAgICAgIF9fZGJnX3RhcmdldF9zb19waWQgPSBwaWQ7CisgICAgICAgIF9fZGJnX3RhcmdldF9pZCA9IG1fcGh5c2ljYWxfaW5kZXg7CisgICAgICAgIF9fZGJnX3RhcmdldF9zb19sb2FkZWQoKTsKKyAgICB9Cit9CisKK3ZvaWQgRW5naW5lOjpmaW5pX3Byb2Nlc3MoYm9vbCB2ZXJib3NlKQoreworICAgIGlmIChtX3Byb2Nlc3MgIT0gMCkgeworICAgICAgICB1aW50MzJfdCBzaWc7CisgICAgICAgIGludDhfdCByZXQ7CisKKyAgICAgICAgLy8gZGVzdHJveSB0YXJnZXQgcHJvY2VzcworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJEZXN0cm95aW5nIHByb2Nlc3Mgb24gdGhlIGRldmljZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luZGV4KTsKKworICAgICAgICBDT0lSRVNVTFQgcmVzID0gQ09JOjpQcm9jZXNzRGVzdHJveShtX3Byb2Nlc3MsIC0xLCAwLCAmcmV0LCAmc2lnKTsKKyAgICAgICAgbV9wcm9jZXNzID0gMDsKKworICAgICAgICBpZiAocmVzID09IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICJEZXZpY2UgcHJvY2Vzczogc2lnbmFsICVkLCBleGl0IGNvZGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZywgcmV0KTsKKyAgICAgICAgICAgIGlmICh2ZXJib3NlKSB7CisgICAgICAgICAgICAgICAgaWYgKHNpZyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoCisgICAgICAgICAgICAgICAgICAgICAgICBjX21pY19wcm9jZXNzX2V4aXRfc2lnLCBtX2luZGV4LCBzaWcsCisgICAgICAgICAgICAgICAgICAgICAgICBjX3NpZ25hbF9uYW1lc1tzaWcgPj0gY19zaWduYWxfbWF4ID8gMCA6IHNpZ10pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX21pY19wcm9jZXNzX2V4aXRfcmV0LCBtX2luZGV4LCByZXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gZm9yIGlkYgorICAgICAgICAgICAgaWYgKF9fZGJnX2lzX2F0dGFjaGVkKSB7CisgICAgICAgICAgICAgICAgX19kYmdfdGFyZ2V0X3NvX3VubG9hZGVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAodmVyYm9zZSkgeworICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19taWNfcHJvY2Vzc19leGl0LCBtX2luZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBFbmdpbmU6OmxvYWRfbGlicmFyaWVzKCkKK3sKKyAgICAvLyBsb2FkIGxpYnJhcmllcyBjb2xsZWN0ZWQgc28gZmFyCisgICAgZm9yIChUYXJnZXRJbWFnZUxpc3Q6Oml0ZXJhdG9yIGl0ID0gbV9pbWFnZXMuYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IG1faW1hZ2VzLmVuZCgpOyBpdCsrKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkxvYWRpbmcgbGlicmFyeSBcIiVzXCIgZnJvbSAlcCwgc2l6ZSAlbGx1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0LT5uYW1lLCBpdC0+ZGF0YSwgaXQtPnNpemUpOworCisgICAgICAgIC8vIGxvYWQgbGlicmFyeSB0byB0aGUgZGV2aWNlCisgICAgICAgIENPSUxJQlJBUlkgbGliOworICAgICAgICBDT0lSRVNVTFQgcmVzOworICAgICAgICByZXMgPSBDT0k6OlByb2Nlc3NMb2FkTGlicmFyeUZyb21NZW1vcnkobV9wcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdC0+c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0LT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWljX2xpYnJhcnlfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0LT5vcmlnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdC0+b2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0xPQURMSUJSQVJZX1YxX0ZMQUdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpYik7CisKKyAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUyAmJiByZXMgIT0gQ09JX0FMUkVBRFlfRVhJU1RTKSB7CisgICAgICAgICAgICBjaGVja19yZXN1bHQocmVzLCBjX2xvYWRfbGlicmFyeSwgbV9pbmRleCwgcmVzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtX2ltYWdlcy5jbGVhcigpOworfQorCitzdGF0aWMgYm9vbCB0YXJnZXRfZW50cnlfY21wKAorICAgIGNvbnN0IFZhckxpc3Q6OkJ1ZkVudHJ5ICZsLAorICAgIGNvbnN0IFZhckxpc3Q6OkJ1ZkVudHJ5ICZyCispCit7CisgICAgY29uc3QgY2hhciAqbF9uYW1lID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4obC5uYW1lKTsKKyAgICBjb25zdCBjaGFyICpyX25hbWUgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihyLm5hbWUpOworICAgIHJldHVybiBzdHJjbXAobF9uYW1lLCByX25hbWUpIDwgMDsKK30KKworc3RhdGljIGJvb2wgaG9zdF9lbnRyeV9jbXAoCisgICAgY29uc3QgVmFyVGFibGU6OkVudHJ5ICpsLAorICAgIGNvbnN0IFZhclRhYmxlOjpFbnRyeSAqcgorKQoreworICAgIHJldHVybiBzdHJjbXAobC0+bmFtZSwgci0+bmFtZSkgPCAwOworfQorCit2b2lkIEVuZ2luZTo6aW5pdF9wdHJfZGF0YSh2b2lkKQoreworICAgIENPSVJFU1VMVCByZXM7CisgICAgQ09JRVZFTlQgZXZlbnQ7CisKKyAgICAvLyBQcmVwYXJlIHRhYmxlIG9mIGhvc3QgZW50cmllcworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IFZhclRhYmxlOjpFbnRyeSo+IGhvc3RfdGFibGUoX19vZmZsb2FkX3ZhcnMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fb2ZmbG9hZF92YXJzLmVuZCgpKTsKKworICAgIC8vIG5vIG5lZWQgdG8gZG8gYW55dGhpbmcgZnVydGhlciBpcyBob3N0IHRhYmxlIGlzIGVtcHR5CisgICAgaWYgKGhvc3RfdGFibGUuc2l6ZSgpIDw9IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEdldCB2YXIgdGFibGUgZW50cmllcyBmcm9tIHRoZSB0YXJnZXQuCisgICAgLy8gRmlyc3Qgd2UgbmVlZCB0byBnZXQgc2l6ZSBmb3IgdGhlIGJ1ZmZlciB0byBjb3B5IGRhdGEKKyAgICBzdHJ1Y3QgeworICAgICAgICBpbnQ2NF90IG5lbGVtczsKKyAgICAgICAgaW50NjRfdCBsZW5ndGg7CisgICAgfSBwYXJhbXM7CisKKyAgICByZXMgPSBDT0k6OlBpcGVsaW5lUnVuRnVuY3Rpb24oZ2V0X3BpcGVsaW5lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZnVuY3NbY19mdW5jX3Zhcl90YWJsZV9zaXplXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtcywgc2l6ZW9mKHBhcmFtcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZldmVudCk7CisgICAgY2hlY2tfcmVzdWx0KHJlcywgY19waXBlbGluZV9ydW5fZnVuYywgbV9pbmRleCwgcmVzKTsKKworICAgIHJlcyA9IENPSTo6RXZlbnRXYWl0KDEsICZldmVudCwgLTEsIDEsIDAsIDApOworICAgIGNoZWNrX3Jlc3VsdChyZXMsIGNfZXZlbnRfd2FpdCwgcmVzKTsKKworICAgIGlmIChwYXJhbXMubGVuZ3RoID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGNyZWF0ZSBidWZmZXIgZm9yIHRhcmdldCBlbnRyaWVzIGFuZCBjb3B5IGRhdGEgdG8gaG9zdAorICAgIENPSUJVRkZFUiBidWZmZXI7CisgICAgcmVzID0gQ09JOjpCdWZmZXJDcmVhdGUocGFyYW1zLmxlbmd0aCwgQ09JX0JVRkZFUl9OT1JNQUwsIDAsIDAsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1fcHJvY2VzcywgJmJ1ZmZlcik7CisgICAgY2hlY2tfcmVzdWx0KHJlcywgY19idWZfY3JlYXRlLCBtX2luZGV4LCByZXMpOworCisgICAgQ09JX0FDQ0VTU19GTEFHUyBmbGFncyA9IENPSV9TSU5LX1dSSVRFOworICAgIHJlcyA9IENPSTo6UGlwZWxpbmVSdW5GdW5jdGlvbihnZXRfcGlwZWxpbmUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9mdW5jc1tjX2Z1bmNfdmFyX3RhYmxlX2NvcHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAmYnVmZmVyLCAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMubmVsZW1zLCBzaXplb2YocGFyYW1zLm5lbGVtcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZldmVudCk7CisgICAgY2hlY2tfcmVzdWx0KHJlcywgY19waXBlbGluZV9ydW5fZnVuYywgbV9pbmRleCwgcmVzKTsKKworICAgIHJlcyA9IENPSTo6RXZlbnRXYWl0KDEsICZldmVudCwgLTEsIDEsIDAsIDApOworICAgIGNoZWNrX3Jlc3VsdChyZXMsIGNfZXZlbnRfd2FpdCwgcmVzKTsKKworICAgIC8vIHBhdGNoIG5hbWVzIGluIHRhcmdldCBkYXRhCisgICAgVmFyTGlzdDo6QnVmRW50cnkgKnRhcmdldF90YWJsZTsKKyAgICBDT0lNQVBJTlNUQU5DRSBtYXBfaW5zdDsKKyAgICByZXMgPSBDT0k6OkJ1ZmZlck1hcChidWZmZXIsIDAsIHBhcmFtcy5sZW5ndGgsIENPSV9NQVBfUkVBRF9PTkxZLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIDAsICZtYXBfaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHZvaWQqKj4oJnRhcmdldF90YWJsZSkpOworICAgIGNoZWNrX3Jlc3VsdChyZXMsIGNfYnVmX21hcCwgcmVzKTsKKworICAgIFZhckxpc3Q6OnRhYmxlX3BhdGNoX25hbWVzKHRhcmdldF90YWJsZSwgcGFyYW1zLm5lbGVtcyk7CisKKyAgICAvLyBhbmQgc29ydCBlbnRyaWVzCisgICAgc3RkOjpzb3J0KHRhcmdldF90YWJsZSwgdGFyZ2V0X3RhYmxlICsgcGFyYW1zLm5lbGVtcywgdGFyZ2V0X2VudHJ5X2NtcCk7CisgICAgc3RkOjpzb3J0KGhvc3RfdGFibGUuYmVnaW4oKSwgaG9zdF90YWJsZS5lbmQoKSwgaG9zdF9lbnRyeV9jbXApOworCisgICAgLy8gbWVyZ2UgaG9zdCBhbmQgdGFyZ2V0IGVudHJpZXMgYW5kIGVudGVyIG1hdGNoaW5nIHZhcnMgbWFwCisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgVmFyVGFibGU6OkVudHJ5Kj46OmNvbnN0X2l0ZXJhdG9yIGhpID0KKyAgICAgICAgaG9zdF90YWJsZS5iZWdpbigpOworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IFZhclRhYmxlOjpFbnRyeSo+Ojpjb25zdF9pdGVyYXRvciBoZSA9CisgICAgICAgIGhvc3RfdGFibGUuZW5kKCk7CisgICAgY29uc3QgVmFyTGlzdDo6QnVmRW50cnkgKnRpID0gdGFyZ2V0X3RhYmxlOworICAgIGNvbnN0IFZhckxpc3Q6OkJ1ZkVudHJ5ICp0ZSA9IHRhcmdldF90YWJsZSArIHBhcmFtcy5uZWxlbXM7CisKKyAgICB3aGlsZSAoaGkgIT0gaGUgJiYgdGkgIT0gdGUpIHsKKyAgICAgICAgaW50IHJlcyA9IHN0cmNtcCgoKmhpKS0+bmFtZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odGktPm5hbWUpKTsKKyAgICAgICAgaWYgKHJlcyA9PSAwKSB7CisgICAgICAgICAgICAvLyBhZGQgbWF0Y2hpbmcgZW50cnkgdG8gdmFyIG1hcAorICAgICAgICAgICAgc3RkOjpwYWlyPFB0clNldDo6aXRlcmF0b3IsIGJvb2w+IHJlcyA9CisgICAgICAgICAgICAgICAgbV9wdHJfc2V0Lmluc2VydChQdHJEYXRhKCgqaGkpLT5hZGRyLCAoKmhpKS0+c2l6ZSkpOworCisgICAgICAgICAgICAvLyBzdG9yZSBhZGRyZXNzIGZvciBuZXcgZW50cmllcworICAgICAgICAgICAgaWYgKHJlcy5zZWNvbmQpIHsKKyAgICAgICAgICAgICAgICBQdHJEYXRhICpwdHIgPSBjb25zdF9jYXN0PFB0ckRhdGEqPihyZXMuZmlyc3Qub3BlcmF0b3ItPigpKTsKKyAgICAgICAgICAgICAgICBwdHItPm1pY19hZGRyID0gdGktPmFkZHI7CisgICAgICAgICAgICAgICAgcHRyLT5pc19zdGF0aWMgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBoaSsrOworICAgICAgICAgICAgdGkrKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChyZXMgPCAwKSB7CisgICAgICAgICAgICBoaSsrOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdGkrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGNsZWFudXAKKyAgICByZXMgPSBDT0k6OkJ1ZmZlclVubWFwKG1hcF9pbnN0LCAwLCAwLCAwKTsKKyAgICBjaGVja19yZXN1bHQocmVzLCBjX2J1Zl91bm1hcCwgcmVzKTsKKworICAgIHJlcyA9IENPSTo6QnVmZmVyRGVzdHJveShidWZmZXIpOworICAgIGNoZWNrX3Jlc3VsdChyZXMsIGNfYnVmX2Rlc3Ryb3ksIHJlcyk7Cit9CisKK0NPSVJFU1VMVCBFbmdpbmU6OmNvbXB1dGUoCisgICAgY29uc3Qgc3RkOjpsaXN0PENPSUJVRkZFUj4gJmJ1ZmZlcnMsCisgICAgY29uc3Qgdm9pZCogICAgICAgICBkYXRhLAorICAgIHVpbnQxNl90ICAgICAgICAgICAgZGF0YV9zaXplLAorICAgIHZvaWQqICAgICAgICAgICAgICAgcmV0LAorICAgIHVpbnQxNl90ICAgICAgICAgICAgcmV0X3NpemUsCisgICAgdWludDMyX3QgICAgICAgICAgICBudW1fZGVwcywKKyAgICBjb25zdCBDT0lFVkVOVCogICAgIGRlcHMsCisgICAgQ09JRVZFTlQqICAgICAgICAgICBldmVudAorKSAvKiBjb25zdCAqLworeworICAgIENPSUJVRkZFUiAqYnVmczsKKyAgICBDT0lfQUNDRVNTX0ZMQUdTICpmbGFnczsKKyAgICBDT0lSRVNVTFQgcmVzOworCisgICAgLy8gY29udmVydCBidWZmZXJzIGxpc3QgdG8gYXJyYXkKKyAgICBpbnQgbnVtX2J1ZnMgPSBidWZmZXJzLnNpemUoKTsKKyAgICBpZiAobnVtX2J1ZnMgPiAwKSB7CisgICAgICAgIGJ1ZnMgPSAoQ09JQlVGRkVSKikgYWxsb2NhKG51bV9idWZzICogc2l6ZW9mKENPSUJVRkZFUikpOworICAgICAgICBmbGFncyA9IChDT0lfQUNDRVNTX0ZMQUdTKikgYWxsb2NhKG51bV9idWZzICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQ09JX0FDQ0VTU19GTEFHUykpOworCisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgZm9yIChzdGQ6Omxpc3Q8Q09JQlVGRkVSPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBidWZmZXJzLmJlZ2luKCk7CisgICAgICAgICAgICAgaXQgIT0gYnVmZmVycy5lbmQoKTsgaXQrKykgeworICAgICAgICAgICAgYnVmc1tpXSA9ICppdDsKKworICAgICAgICAgICAgLy8gVE9ETzogdGhpcyBzaG91bGQgYmUgZml4ZWQKKyAgICAgICAgICAgIGZsYWdzW2krK10gPSBDT0lfU0lOS19XUklURTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgYnVmcyA9IDA7CisgICAgICAgIGZsYWdzID0gMDsKKyAgICB9CisKKyAgICAvLyBzdGFydCBjb21wdXRhdGlvbgorICAgIHJlcyA9IENPSTo6UGlwZWxpbmVSdW5GdW5jdGlvbihnZXRfcGlwZWxpbmUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9mdW5jc1tjX2Z1bmNfY29tcHV0ZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9idWZzLCBidWZzLCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2RlcHMsIGRlcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsIGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LCByZXRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQpOworICAgIHJldHVybiByZXM7Cit9CisKK3BpZF90IEVuZ2luZTo6aW5pdF9kZXZpY2Uodm9pZCkKK3sKKyAgICBzdHJ1Y3QgaW5pdF9kYXRhIHsKKyAgICAgICAgaW50ICBkZXZpY2VfaW5kZXg7CisgICAgICAgIGludCAgZGV2aWNlc190b3RhbDsKKyAgICAgICAgaW50ICBjb25zb2xlX2xldmVsOworICAgICAgICBpbnQgIG9mZmxvYWRfcmVwb3J0X2xldmVsOworICAgIH0gZGF0YTsKKyAgICBDT0lSRVNVTFQgcmVzOworICAgIENPSUVWRU5UIGV2ZW50OworICAgIHBpZF90IHBpZDsKKworICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSgyLCAwLCBjX29mZmxvYWRfaW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkluaXRpYWxpemluZyBkZXZpY2Ugd2l0aCBsb2dpY2FsIGluZGV4ICVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImFuZCBwaHlzaWNhbCBpbmRleCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5kZXgsIG1fcGh5c2ljYWxfaW5kZXgpOworCisgICAgLy8gc2V0dXAgbWlzYyBkYXRhCisgICAgZGF0YS5kZXZpY2VfaW5kZXggPSBtX2luZGV4OworICAgIGRhdGEuZGV2aWNlc190b3RhbCA9IG1pY19lbmdpbmVzX3RvdGFsOworICAgIGRhdGEuY29uc29sZV9sZXZlbCA9IGNvbnNvbGVfZW5hYmxlZDsKKyAgICBkYXRhLm9mZmxvYWRfcmVwb3J0X2xldmVsID0gb2ZmbG9hZF9yZXBvcnRfbGV2ZWw7CisKKyAgICByZXMgPSBDT0k6OlBpcGVsaW5lUnVuRnVuY3Rpb24oZ2V0X3BpcGVsaW5lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZnVuY3NbY19mdW5jX2luaXRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YSwgc2l6ZW9mKGRhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGlkLCBzaXplb2YocGlkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV2ZW50KTsKKyAgICBjaGVja19yZXN1bHQocmVzLCBjX3BpcGVsaW5lX3J1bl9mdW5jLCBtX2luZGV4LCByZXMpOworCisgICAgcmVzID0gQ09JOjpFdmVudFdhaXQoMSwgJmV2ZW50LCAtMSwgMSwgMCwgMCk7CisgICAgY2hlY2tfcmVzdWx0KHJlcywgY19ldmVudF93YWl0LCByZXMpOworCisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRGV2aWNlIHByb2Nlc3MgcGlkIGlzICVkXG4iLCBwaWQpOworCisgICAgcmV0dXJuIHBpZDsKK30KKworLy8gZGF0YSBhc3NvY2lhdGVkIHdpdGggZWFjaCB0aHJlYWQKK3N0cnVjdCBUaHJlYWQgeworICAgIFRocmVhZChsb25nKiBhZGRyX2NvaXBpcGVfY291bnRlcikgeworICAgICAgICBtX2FkZHJfY29pcGlwZV9jb3VudGVyID0gYWRkcl9jb2lwaXBlX2NvdW50ZXI7CisgICAgICAgIG1lbXNldChtX3BpcGVsaW5lcywgMCwgc2l6ZW9mKG1fcGlwZWxpbmVzKSk7CisgICAgfQorCisgICAgflRocmVhZCgpIHsKKyNpZm5kZWYgVEFSR0VUX1dJTk5UCisgICAgICAgIF9fc3luY19zdWJfYW5kX2ZldGNoKG1fYWRkcl9jb2lwaXBlX2NvdW50ZXIsIDEpOworI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCisgICAgICAgIF9JbnRlcmxvY2tlZERlY3JlbWVudChtX2FkZHJfY29pcGlwZV9jb3VudGVyKTsKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtaWNfZW5naW5lc190b3RhbDsgaSsrKSB7CisgICAgICAgICAgICBpZiAobV9waXBlbGluZXNbaV0gIT0gMCkgeworICAgICAgICAgICAgICAgIENPSTo6UGlwZWxpbmVEZXN0cm95KG1fcGlwZWxpbmVzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIENPSVBJUEVMSU5FIGdldF9waXBlbGluZShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fcGlwZWxpbmVzW2luZGV4XTsKKyAgICB9CisKKyAgICB2b2lkIHNldF9waXBlbGluZShpbnQgaW5kZXgsIENPSVBJUEVMSU5FIHBpcGVsaW5lKSB7CisgICAgICAgIG1fcGlwZWxpbmVzW2luZGV4XSA9IHBpcGVsaW5lOworICAgIH0KKworICAgIEF1dG9TZXQmIGdldF9hdXRvX3ZhcnMoKSB7CisgICAgICAgIHJldHVybiBtX2F1dG9fdmFyczsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgbG9uZyogICAgICAgbV9hZGRyX2NvaXBpcGVfY291bnRlcjsKKyAgICBBdXRvU2V0ICAgICBtX2F1dG9fdmFyczsKKyAgICBDT0lQSVBFTElORSBtX3BpcGVsaW5lc1tNSUNfRU5HSU5FU19NQVhdOworfTsKKworQ09JUElQRUxJTkUgRW5naW5lOjpnZXRfcGlwZWxpbmUodm9pZCkKK3sKKyAgICBUaHJlYWQqIHRocmVhZCA9IChUaHJlYWQqKSB0aHJlYWRfZ2V0c3BlY2lmaWMobWljX3RocmVhZF9rZXkpOworICAgIGlmICh0aHJlYWQgPT0gMCkgeworICAgICAgICB0aHJlYWQgPSBuZXcgVGhyZWFkKCZtX3Byb2NfbnVtYmVyKTsKKyAgICAgICAgdGhyZWFkX3NldHNwZWNpZmljKG1pY190aHJlYWRfa2V5LCB0aHJlYWQpOworICAgIH0KKworICAgIENPSVBJUEVMSU5FIHBpcGVsaW5lID0gdGhyZWFkLT5nZXRfcGlwZWxpbmUobV9pbmRleCk7CisgICAgaWYgKHBpcGVsaW5lID09IDApIHsKKyAgICAgICAgQ09JUkVTVUxUIHJlczsKKyAgICAgICAgaW50IHByb2NfbnVtOworCisjaWZuZGVmIFRBUkdFVF9XSU5OVAorICAgICAgICBwcm9jX251bSA9IF9fc3luY19mZXRjaF9hbmRfYWRkKCZtX3Byb2NfbnVtYmVyLCAxKTsKKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorICAgICAgICBwcm9jX251bSA9IF9JbnRlcmxvY2tlZEluY3JlbWVudCgmbV9wcm9jX251bWJlcik7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKyAgICAgICAgaWYgKHByb2NfbnVtID4gQ09JX1BJUEVMSU5FX01BWF9QSVBFTElORVMpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19jb2lwaXBlX21heF9udW1iZXIsIENPSV9QSVBFTElORV9NQVhfUElQRUxJTkVTKTsKKyAgICAgICAgICAgIExJQk9GRkxPQURfQUJPUlQ7CisgICAgICAgIH0KKyAgICAgICAgLy8gY3JlYXRlIHBpcGVsaW5lIGZvciB0aGlzIHRocmVhZAorICAgICAgICByZXMgPSBDT0k6OlBpcGVsaW5lQ3JlYXRlKG1fcHJvY2VzcywgMCwgbWljX3N0YWNrX3NpemUsICZwaXBlbGluZSk7CisgICAgICAgIGNoZWNrX3Jlc3VsdChyZXMsIGNfcGlwZWxpbmVfY3JlYXRlLCBtX2luZGV4LCByZXMpOworCisgICAgICAgIHRocmVhZC0+c2V0X3BpcGVsaW5lKG1faW5kZXgsIHBpcGVsaW5lKTsKKyAgICB9CisgICAgcmV0dXJuIHBpcGVsaW5lOworfQorCitBdXRvU2V0JiBFbmdpbmU6OmdldF9hdXRvX3ZhcnModm9pZCkKK3sKKyAgICBUaHJlYWQqIHRocmVhZCA9IChUaHJlYWQqKSB0aHJlYWRfZ2V0c3BlY2lmaWMobWljX3RocmVhZF9rZXkpOworICAgIGlmICh0aHJlYWQgPT0gMCkgeworICAgICAgICB0aHJlYWQgPSBuZXcgVGhyZWFkKCZtX3Byb2NfbnVtYmVyKTsKKyAgICAgICAgdGhyZWFkX3NldHNwZWNpZmljKG1pY190aHJlYWRfa2V5LCB0aHJlYWQpOworICAgIH0KKworICAgIHJldHVybiB0aHJlYWQtPmdldF9hdXRvX3ZhcnMoKTsKK30KKwordm9pZCBFbmdpbmU6OmRlc3Ryb3lfdGhyZWFkX2RhdGEodm9pZCAqZGF0YSkKK3sKKyAgICBkZWxldGUgc3RhdGljX2Nhc3Q8VGhyZWFkKj4oZGF0YSk7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX2VuZ2luZS5oIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9lbmdpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWE5NjMxCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9lbmdpbmUuaApAQCAtMCwwICsxLDQ4MiBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIE9GRkxPQURfRU5HSU5FX0hfSU5DTFVERUQKKyNkZWZpbmUgT0ZGTE9BRF9FTkdJTkVfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSAib2ZmbG9hZF9jb21tb24uaCIKKyNpbmNsdWRlICJjb2kvY29pX2NsaWVudC5oIgorCisvLyBBZGRyZXNzIHJhbmdlCitjbGFzcyBNZW1SYW5nZSB7CitwdWJsaWM6CisgICAgTWVtUmFuZ2UoKSA6IG1fc3RhcnQoMCksIG1fbGVuZ3RoKDApIHt9CisgICAgTWVtUmFuZ2UoY29uc3Qgdm9pZCAqYWRkciwgdWludDY0X3QgbGVuKSA6IG1fc3RhcnQoYWRkciksIG1fbGVuZ3RoKGxlbikge30KKworICAgIGNvbnN0IHZvaWQqIHN0YXJ0KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9zdGFydDsKKyAgICB9CisKKyAgICBjb25zdCB2b2lkKiBlbmQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4obV9zdGFydCkgKyBtX2xlbmd0aDsKKyAgICB9CisKKyAgICB1aW50NjRfdCBsZW5ndGgoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX2xlbmd0aDsKKyAgICB9CisKKyAgICAvLyByZXR1cm5zIHRydWUgaWYgZ2l2ZW4gcmFuZ2Ugb3ZlcmxhcHMgd2l0aCBhbm90aGVyIG9uZQorICAgIGJvb2wgb3ZlcmxhcHMoY29uc3QgTWVtUmFuZ2UgJm8pIGNvbnN0IHsKKyAgICAgICAgLy8gVHdvIGFkZHJlc3MgcmFuZ2VzIEFbc3RhcnQsIGVuZCkgYW5kIEJbc3RhcnQsZW5kKSBvdmVybGFwCisgICAgICAgIC8vIGlmIEEuc3RhcnQgPCBCLmVuZCBhbmQgQS5lbmQgPiBCLnN0YXJ0LgorICAgICAgICByZXR1cm4gc3RhcnQoKSA8IG8uZW5kKCkgJiYgZW5kKCkgPiBvLnN0YXJ0KCk7CisgICAgfQorCisgICAgLy8gcmV0dXJucyB0cnVlIGlmIGdpdmVuIHJhbmdlIGNvbnRhaW5zIHRoZSBvdGhlciByYW5nZQorICAgIGJvb2wgY29udGFpbnMoY29uc3QgTWVtUmFuZ2UgJm8pIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHN0YXJ0KCkgPD0gby5zdGFydCgpICYmIG8uZW5kKCkgPD0gZW5kKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIGNvbnN0IHZvaWQqIG1fc3RhcnQ7CisgICAgdWludDY0X3QgICAgbV9sZW5ndGg7Cit9OworCisvLyBEYXRhIGFzc29jaWF0ZWQgd2l0aCBhIHBvaW50ZXIgdmFyaWFibGUKK2NsYXNzIFB0ckRhdGEgeworcHVibGljOgorICAgIFB0ckRhdGEoY29uc3Qgdm9pZCAqYWRkciwgdWludDY0X3QgbGVuKSA6CisgICAgICAgIGNwdV9hZGRyKGFkZHIsIGxlbiksIGNwdV9idWYoMCksCisgICAgICAgIG1pY19hZGRyKDApLCBhbGxvY19kaXNwKDApLCBtaWNfYnVmKDApLCBtaWNfb2Zmc2V0KDApLAorICAgICAgICByZWZfY291bnQoMCksIGlzX3N0YXRpYyhmYWxzZSkKKyAgICB7fQorCisgICAgLy8KKyAgICAvLyBDb3B5IGNvbnN0cnVjdG9yCisgICAgLy8KKyAgICBQdHJEYXRhKGNvbnN0IFB0ckRhdGEmIHB0cik6CisgICAgICAgIGNwdV9hZGRyKHB0ci5jcHVfYWRkciksIGNwdV9idWYocHRyLmNwdV9idWYpLAorICAgICAgICBtaWNfYWRkcihwdHIubWljX2FkZHIpLCBhbGxvY19kaXNwKHB0ci5hbGxvY19kaXNwKSwKKyAgICAgICAgbWljX2J1ZihwdHIubWljX2J1ZiksIG1pY19vZmZzZXQocHRyLm1pY19vZmZzZXQpLAorICAgICAgICByZWZfY291bnQocHRyLnJlZl9jb3VudCksIGlzX3N0YXRpYyhwdHIuaXNfc3RhdGljKQorICAgIHt9CisKKyAgICBib29sIG9wZXJhdG9yPChjb25zdCBQdHJEYXRhICZvKSBjb25zdCB7CisgICAgICAgIC8vIFZhcmlhYmxlcyBhcmUgc29ydGVkIGJ5IHRoZSBDUFUgc3RhcnQgYWRkcmVzcy4KKyAgICAgICAgLy8gT3ZlcmxhcHBpbmcgbWVtb3J5IHJhbmdlcyBhcmUgY29uc2lkZXJlZCBlcXVhbC4KKyAgICAgICAgcmV0dXJuIChjcHVfYWRkci5zdGFydCgpIDwgby5jcHVfYWRkci5zdGFydCgpKSAmJgorICAgICAgICAgICAgICAgIWNwdV9hZGRyLm92ZXJsYXBzKG8uY3B1X2FkZHIpOworICAgIH0KKworICAgIGxvbmcgYWRkX3JlZmVyZW5jZSgpIHsKKyAgICAgICAgaWYgKGlzX3N0YXRpYykgeworICAgICAgICAgICAgcmV0dXJuIExPTkdfTUFYOworICAgICAgICB9CisjaWZuZGVmIFRBUkdFVF9XSU5OVAorICAgICAgICByZXR1cm4gX19zeW5jX2ZldGNoX2FuZF9hZGQoJnJlZl9jb3VudCwgMSk7CisjZWxzZSAvLyBUQVJHRVRfV0lOTlQKKyAgICAgICAgcmV0dXJuIF9JbnRlcmxvY2tlZEluY3JlbWVudCgmcmVmX2NvdW50KSAtIDE7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisgICAgfQorCisgICAgbG9uZyByZW1vdmVfcmVmZXJlbmNlKCkgeworICAgICAgICBpZiAoaXNfc3RhdGljKSB7CisgICAgICAgICAgICByZXR1cm4gTE9OR19NQVg7CisgICAgICAgIH0KKyNpZm5kZWYgVEFSR0VUX1dJTk5UCisgICAgICAgIHJldHVybiBfX3N5bmNfc3ViX2FuZF9mZXRjaCgmcmVmX2NvdW50LCAxKTsKKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorICAgICAgICByZXR1cm4gX0ludGVybG9ja2VkRGVjcmVtZW50KCZyZWZfY291bnQpOworI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorICAgIH0KKworICAgIGxvbmcgZ2V0X3JlZmVyZW5jZSgpIGNvbnN0IHsKKyAgICAgICAgaWYgKGlzX3N0YXRpYykgeworICAgICAgICAgICAgcmV0dXJuIExPTkdfTUFYOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZWZfY291bnQ7CisgICAgfQorCitwdWJsaWM6CisgICAgLy8gQ1BVIGFkZHJlc3MgcmFuZ2UKKyAgICBjb25zdCBNZW1SYW5nZSAgY3B1X2FkZHI7CisKKyAgICAvLyBDUFUgYW5kIE1JQyBidWZmZXJzCisgICAgQ09JQlVGRkVSICAgICAgIGNwdV9idWY7CisgICAgQ09JQlVGRkVSICAgICAgIG1pY19idWY7CisKKyAgICAvLyBwbGFjZWhvbGRlciBmb3IgYnVmZmVyIGFkZHJlc3Mgb24gbWljCisgICAgdWludDY0X3QgICAgICAgIG1pY19hZGRyOworCisgICAgdWludDY0X3QgICAgICAgIGFsbG9jX2Rpc3A7CisKKyAgICAvLyBhZGRpdGlvbmFsIG9mZnNldCB0byBwb2ludGVyIGRhdGEgb24gTUlDIGZvciBpbXByb3ZpbmcgYmFuZHdpZHRoIGZvcgorICAgIC8vIGRhdGEgd2hpY2ggaXMgbm90IDRLIGFsaWduZWQKKyAgICB1aW50MzJfdCAgICAgICAgbWljX29mZnNldDsKKworICAgIC8vIGlmIHRydWUgYnVmZmVycyBhcmUgY3JlYXRlZCBmcm9tIHN0YXRpYyBtZW1vcnkKKyAgICBib29sICAgICAgICAgICAgaXNfc3RhdGljOworICAgIG11dGV4X3QgICAgICAgICBhbGxvY19wdHJfZGF0YV9sb2NrOworCitwcml2YXRlOgorICAgIC8vIHJlZmVyZW5jZSBjb3VudCBmb3IgdGhlIGVudHJ5CisgICAgbG9uZyAgICAgICAgICAgIHJlZl9jb3VudDsKK307CisKK3R5cGVkZWYgc3RkOjpsaXN0PFB0ckRhdGEqPiBQdHJEYXRhTGlzdDsKKworLy8gRGF0YSBhc3NvY2lhdGVkIHdpdGggYXV0b21hdGljIHZhcmlhYmxlCitjbGFzcyBBdXRvRGF0YSB7CitwdWJsaWM6CisgICAgQXV0b0RhdGEoY29uc3Qgdm9pZCAqYWRkciwgdWludDY0X3QgbGVuKSA6CisgICAgICAgIGNwdV9hZGRyKGFkZHIsIGxlbiksIHJlZl9jb3VudCgwKQorICAgIHt9CisKKyAgICBib29sIG9wZXJhdG9yPChjb25zdCBBdXRvRGF0YSAmbykgY29uc3QgeworICAgICAgICAvLyBWYXJpYWJsZXMgYXJlIHNvcnRlZCBieSB0aGUgQ1BVIHN0YXJ0IGFkZHJlc3MuCisgICAgICAgIC8vIE92ZXJsYXBwaW5nIG1lbW9yeSByYW5nZXMgYXJlIGNvbnNpZGVyZWQgZXF1YWwuCisgICAgICAgIHJldHVybiAoY3B1X2FkZHIuc3RhcnQoKSA8IG8uY3B1X2FkZHIuc3RhcnQoKSkgJiYKKyAgICAgICAgICAgICAgICFjcHVfYWRkci5vdmVybGFwcyhvLmNwdV9hZGRyKTsKKyAgICB9CisKKyAgICBsb25nIGFkZF9yZWZlcmVuY2UoKSB7CisjaWZuZGVmIFRBUkdFVF9XSU5OVAorICAgICAgICByZXR1cm4gX19zeW5jX2ZldGNoX2FuZF9hZGQoJnJlZl9jb3VudCwgMSk7CisjZWxzZSAvLyBUQVJHRVRfV0lOTlQKKyAgICAgICAgcmV0dXJuIF9JbnRlcmxvY2tlZEluY3JlbWVudCgmcmVmX2NvdW50KSAtIDE7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisgICAgfQorCisgICAgbG9uZyByZW1vdmVfcmVmZXJlbmNlKCkgeworI2lmbmRlZiBUQVJHRVRfV0lOTlQKKyAgICAgICAgcmV0dXJuIF9fc3luY19zdWJfYW5kX2ZldGNoKCZyZWZfY291bnQsIDEpOworI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCisgICAgICAgIHJldHVybiBfSW50ZXJsb2NrZWREZWNyZW1lbnQoJnJlZl9jb3VudCk7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisgICAgfQorCisgICAgbG9uZyBnZXRfcmVmZXJlbmNlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gcmVmX2NvdW50OworICAgIH0KKworcHVibGljOgorICAgIC8vIENQVSBhZGRyZXNzIHJhbmdlCisgICAgY29uc3QgTWVtUmFuZ2UgY3B1X2FkZHI7CisKK3ByaXZhdGU6CisgICAgLy8gcmVmZXJlbmNlIGNvdW50IGZvciB0aGUgZW50cnkKKyAgICBsb25nIHJlZl9jb3VudDsKK307CisKKy8vIFNldCBvZiBhdXRpbWF0aWMgdmFyaWFibGVzCit0eXBlZGVmIHN0ZDo6c2V0PEF1dG9EYXRhPiBBdXRvU2V0OworCisvLyBUYXJnZXQgaW1hZ2UgZGF0YQorc3RydWN0IFRhcmdldEltYWdlCit7CisgICAgVGFyZ2V0SW1hZ2UoY29uc3QgY2hhciAqX25hbWUsIGNvbnN0IHZvaWQgKl9kYXRhLCB1aW50NjRfdCBfc2l6ZSwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpfb3JpZ2luLCB1aW50NjRfdCBfb2Zmc2V0KSA6CisgICAgICAgIG5hbWUoX25hbWUpLCBkYXRhKF9kYXRhKSwgc2l6ZShfc2l6ZSksCisgICAgICAgIG9yaWdpbihfb3JpZ2luKSwgb2Zmc2V0KF9vZmZzZXQpCisgICAge30KKworICAgIC8vIGxpYnJhcnkgbmFtZQorICAgIGNvbnN0IGNoYXIqIG5hbWU7CisKKyAgICAvLyBjb250ZW50cyBhbmQgc2l6ZQorICAgIGNvbnN0IHZvaWQqIGRhdGE7CisgICAgdWludDY0X3QgICAgc2l6ZTsKKworICAgIC8vIGZpbGUgb2Ygb3JpZ2luIGFuZCBvZmZzZXQgd2l0aGluIHRoYXQgZmlsZQorICAgIGNvbnN0IGNoYXIqIG9yaWdpbjsKKyAgICB1aW50NjRfdCAgICBvZmZzZXQ7Cit9OworCit0eXBlZGVmIHN0ZDo6bGlzdDxUYXJnZXRJbWFnZT4gVGFyZ2V0SW1hZ2VMaXN0OworCisvLyBEYXRhIGFzc29jaWF0ZWQgd2l0aCBwZXJzaXN0ZW50IGF1dG8gb2JqZWN0cworc3RydWN0IFBlcnNpc3REYXRhCit7CisgICAgUGVyc2lzdERhdGEoY29uc3Qgdm9pZCAqYWRkciwgdWludDY0X3Qgcm91dGluZV9udW0sIHVpbnQ2NF90IHNpemUpIDoKKyAgICAgICAgc3RhY2tfY3B1X2FkZHIoYWRkciksIHJvdXRpbmVfaWQocm91dGluZV9udW0pCisgICAgeworICAgICAgICBzdGFja19wdHJfZGF0YSA9IG5ldyBQdHJEYXRhKDAsIHNpemUpOworICAgIH0KKyAgICAvLyAxLXN0IGtleSB2YWx1ZSAtIGJlZ2lubmluZyBvZiB0aGUgc3RhY2sgYXQgQ1BVCisgICAgY29uc3Qgdm9pZCAqICAgc3RhY2tfY3B1X2FkZHI7CisgICAgLy8gMi1uZCBrZXkgdmFsdWUgLSBpZGVudGlmaWVyIG9mIHJvdXRpbmUgaW52b2NhdGlvbiBhdCBDUFUKKyAgICB1aW50NjRfdCAgIHJvdXRpbmVfaWQ7CisgICAgLy8gY29ycmVzcG9uZGVkIFB0ckRhdGE7IG9ubHkgc3RhY2tfcHRyX2RhdGEtPm1pY19idWYgaXMgdXNlZAorICAgIFB0ckRhdGEgKiBzdGFja19wdHJfZGF0YTsKKyAgICAvLyB1c2VkIHRvIGdldCBvZmZzZXQgb2YgdGhlIHZhcmlhYmxlIGluIHN0YWNrIGJ1ZmZlcgorICAgIGNoYXIgKiBjcHVfc3RhY2tfYWRkcjsKK307CisKK3R5cGVkZWYgc3RkOjpsaXN0PFBlcnNpc3REYXRhPiBQZXJzaXN0RGF0YUxpc3Q7CisKKy8vIGNsYXNzIHJlcHJlc2VudGluZyBhIHNpbmdsZSBlbmdpbmUKK3N0cnVjdCBFbmdpbmUgeworICAgIGZyaWVuZCB2b2lkIF9fb2ZmbG9hZF9pbml0X2xpYnJhcnlfb25jZSh2b2lkKTsKKyAgICBmcmllbmQgdm9pZCBfX29mZmxvYWRfZmluaV9saWJyYXJ5KHZvaWQpOworCisjZGVmaW5lIGNoZWNrX3Jlc3VsdChyZXMsIHRhZywgLi4uKSBcCisgICAgeyBcCisgICAgICAgIGlmIChyZXMgPT0gQ09JX1BST0NFU1NfRElFRCkgeyBcCisgICAgICAgICAgICBmaW5pX3Byb2Nlc3ModHJ1ZSk7IFwKKyAgICAgICAgICAgIGV4aXQoMSk7IFwKKyAgICAgICAgfSBcCisgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsgXAorICAgICAgICAgICAgX19saWJvZmZsb2FkX2Vycm9yX3N1cHBvcnQodGFnLCBfX1ZBX0FSR1NfXyk7IFwKKyAgICAgICAgICAgIGV4aXQoMSk7IFwKKyAgICAgICAgfSBcCisgICAgfQorCisgICAgaW50IGdldF9sb2dpY2FsX2luZGV4KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9pbmRleDsKKyAgICB9CisKKyAgICBpbnQgZ2V0X3BoeXNpY2FsX2luZGV4KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9waHlzaWNhbF9pbmRleDsKKyAgICB9CisKKyAgICBjb25zdCBDT0lQUk9DRVNTJiBnZXRfcHJvY2VzcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fcHJvY2VzczsKKyAgICB9CisKKyAgICAvLyBpbml0aWFsaXplIGRldmljZQorICAgIHZvaWQgaW5pdCh2b2lkKTsKKworICAgIC8vIGFkZCBuZXcgbGlicmFyeQorICAgIHZvaWQgYWRkX2xpYihjb25zdCBUYXJnZXRJbWFnZSAmbGliKQorICAgIHsKKyAgICAgICAgbV9sb2NrLmxvY2soKTsKKyAgICAgICAgbV9yZWFkeSA9IGZhbHNlOworICAgICAgICBtX2ltYWdlcy5wdXNoX2JhY2sobGliKTsKKyAgICAgICAgbV9sb2NrLnVubG9jaygpOworICAgIH0KKworICAgIENPSVJFU1VMVCBjb21wdXRlKAorICAgICAgICBjb25zdCBzdGQ6Omxpc3Q8Q09JQlVGRkVSPiAmYnVmZmVycywKKyAgICAgICAgY29uc3Qgdm9pZCogICAgICAgICBkYXRhLAorICAgICAgICB1aW50MTZfdCAgICAgICAgICAgIGRhdGFfc2l6ZSwKKyAgICAgICAgdm9pZCogICAgICAgICAgICAgICByZXQsCisgICAgICAgIHVpbnQxNl90ICAgICAgICAgICAgcmV0X3NpemUsCisgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgbnVtX2RlcHMsCisgICAgICAgIGNvbnN0IENPSUVWRU5UKiAgICAgZGVwcywKKyAgICAgICAgQ09JRVZFTlQqICAgICAgICAgICBldmVudAorICAgICk7CisKKyNpZmRlZiBNWU9fU1VQUE9SVAorICAgIC8vIHRlbXBvcmFyeSB3b3JrYXJvdW5kIGZvciBibG9ja2luZyBiZWhhdmlvciBmb3IgbXlvaUxpYkluaXQvRmluaSBjYWxscworICAgIHZvaWQgaW5pdF9teW8oQ09JRVZFTlQgKmV2ZW50KSB7CisgICAgICAgIENPSVJFU1VMVCByZXM7CisgICAgICAgIHJlcyA9IENPSTo6UGlwZWxpbmVSdW5GdW5jdGlvbihnZXRfcGlwZWxpbmUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZnVuY3NbY19mdW5jX215b19pbml0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7CisgICAgICAgIGNoZWNrX3Jlc3VsdChyZXMsIGNfcGlwZWxpbmVfcnVuX2Z1bmMsIG1faW5kZXgsIHJlcyk7CisgICAgfQorCisgICAgdm9pZCBmaW5pX215byhDT0lFVkVOVCAqZXZlbnQpIHsKKyAgICAgICAgQ09JUkVTVUxUIHJlczsKKyAgICAgICAgcmVzID0gQ09JOjpQaXBlbGluZVJ1bkZ1bmN0aW9uKGdldF9waXBlbGluZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9mdW5jc1tjX2Z1bmNfbXlvX2ZpbmldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKKyAgICAgICAgY2hlY2tfcmVzdWx0KHJlcywgY19waXBlbGluZV9ydW5fZnVuYywgbV9pbmRleCwgcmVzKTsKKyAgICB9CisjZW5kaWYgLy8gTVlPX1NVUFBPUlQKKworICAgIC8vCisgICAgLy8gTWVtb3J5IGFzc29jaWF0aW9uIHRhYmxlCisgICAgLy8KKyAgICBQdHJEYXRhKiBmaW5kX3B0cl9kYXRhKGNvbnN0IHZvaWQgKnB0cikgeworICAgICAgICBtX3B0cl9sb2NrLmxvY2soKTsKKyAgICAgICAgUHRyU2V0OjppdGVyYXRvciByZXMgPSBtX3B0cl9zZXQuZmluZChQdHJEYXRhKHB0ciwgMCkpOworICAgICAgICBtX3B0cl9sb2NrLnVubG9jaygpOworICAgICAgICBpZiAocmVzID09IG1fcHRyX3NldC5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8UHRyRGF0YSo+KHJlcy5vcGVyYXRvci0+KCkpOworICAgIH0KKworICAgIFB0ckRhdGEqIGluc2VydF9wdHJfZGF0YShjb25zdCB2b2lkICpwdHIsIHVpbnQ2NF90IGxlbiwgYm9vbCAmaXNfbmV3KSB7CisgICAgICAgIG1fcHRyX2xvY2subG9jaygpOworICAgICAgICBzdGQ6OnBhaXI8UHRyU2V0OjppdGVyYXRvciwgYm9vbD4gcmVzID0KKyAgICAgICAgICAgIG1fcHRyX3NldC5pbnNlcnQoUHRyRGF0YShwdHIsIGxlbikpOworICAgICAgICBQdHJEYXRhKiBwdHJfZGF0YSA9IGNvbnN0X2Nhc3Q8UHRyRGF0YSo+KHJlcy5maXJzdC5vcGVyYXRvci0+KCkpOworICAgICAgICBtX3B0cl9sb2NrLnVubG9jaygpOworCisgICAgICAgIGlzX25ldyA9IHJlcy5zZWNvbmQ7CisgICAgICAgIGlmIChpc19uZXcpIHsKKyAgICAgICAgICAgIC8vIEl0J3MgbmVjZXNzYXJ5IHRvIGxvY2sgYXMgc29vbiBhcyBwb3NzaWJsZS4KKyAgICAgICAgICAgIC8vIHVubG9jayBtdXN0IGJlIGRvbmUgYXQgY2FsbCBzaXRlIG9mIGluc2VydF9wdHJfZGF0YSBhdAorICAgICAgICAgICAgLy8gYnJhbmNoIGZvciBpc19uZXcKKyAgICAgICAgICAgIHB0cl9kYXRhLT5hbGxvY19wdHJfZGF0YV9sb2NrLmxvY2soKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcHRyX2RhdGE7CisgICAgfQorCisgICAgdm9pZCByZW1vdmVfcHRyX2RhdGEoY29uc3Qgdm9pZCAqcHRyKSB7CisgICAgICAgIG1fcHRyX2xvY2subG9jaygpOworICAgICAgICBtX3B0cl9zZXQuZXJhc2UoUHRyRGF0YShwdHIsIDApKTsKKyAgICAgICAgbV9wdHJfbG9jay51bmxvY2soKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIEF1dG9tYXRpYyB2YXJpYWJsZXMKKyAgICAvLworICAgIEF1dG9EYXRhKiBmaW5kX2F1dG9fZGF0YShjb25zdCB2b2lkICpwdHIpIHsKKyAgICAgICAgQXV0b1NldCAmYXV0b192YXJzID0gZ2V0X2F1dG9fdmFycygpOworICAgICAgICBBdXRvU2V0OjppdGVyYXRvciByZXMgPSBhdXRvX3ZhcnMuZmluZChBdXRvRGF0YShwdHIsIDApKTsKKyAgICAgICAgaWYgKHJlcyA9PSBhdXRvX3ZhcnMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb25zdF9jYXN0PEF1dG9EYXRhKj4ocmVzLm9wZXJhdG9yLT4oKSk7CisgICAgfQorCisgICAgQXV0b0RhdGEqIGluc2VydF9hdXRvX2RhdGEoY29uc3Qgdm9pZCAqcHRyLCB1aW50NjRfdCBsZW4pIHsKKyAgICAgICAgQXV0b1NldCAmYXV0b192YXJzID0gZ2V0X2F1dG9fdmFycygpOworICAgICAgICBzdGQ6OnBhaXI8QXV0b1NldDo6aXRlcmF0b3IsIGJvb2w+IHJlcyA9CisgICAgICAgICAgICBhdXRvX3ZhcnMuaW5zZXJ0KEF1dG9EYXRhKHB0ciwgbGVuKSk7CisgICAgICAgIHJldHVybiBjb25zdF9jYXN0PEF1dG9EYXRhKj4ocmVzLmZpcnN0Lm9wZXJhdG9yLT4oKSk7CisgICAgfQorCisgICAgdm9pZCByZW1vdmVfYXV0b19kYXRhKGNvbnN0IHZvaWQgKnB0cikgeworICAgICAgICBnZXRfYXV0b192YXJzKCkuZXJhc2UoQXV0b0RhdGEocHRyLCAwKSk7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBTaWduYWxzCisgICAgLy8KKyAgICB2b2lkIGFkZF9zaWduYWwoY29uc3Qgdm9pZCAqc2lnbmFsLCBPZmZsb2FkRGVzY3JpcHRvciAqZGVzYykgeworICAgICAgICBtX3NpZ25hbF9sb2NrLmxvY2soKTsKKyAgICAgICAgbV9zaWduYWxfbWFwW3NpZ25hbF0gPSBkZXNjOworICAgICAgICBtX3NpZ25hbF9sb2NrLnVubG9jaygpOworICAgIH0KKworICAgIE9mZmxvYWREZXNjcmlwdG9yKiBmaW5kX3NpZ25hbChjb25zdCB2b2lkICpzaWduYWwsIGJvb2wgcmVtb3ZlKSB7CisgICAgICAgIE9mZmxvYWREZXNjcmlwdG9yICpkZXNjID0gMDsKKworICAgICAgICBtX3NpZ25hbF9sb2NrLmxvY2soKTsKKyAgICAgICAgeworICAgICAgICAgICAgU2lnbmFsTWFwOjppdGVyYXRvciBpdCA9IG1fc2lnbmFsX21hcC5maW5kKHNpZ25hbCk7CisgICAgICAgICAgICBpZiAoaXQgIT0gbV9zaWduYWxfbWFwLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgZGVzYyA9IGl0LT5zZWNvbmQ7CisgICAgICAgICAgICAgICAgaWYgKHJlbW92ZSkgeworICAgICAgICAgICAgICAgICAgICBtX3NpZ25hbF9tYXAuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtX3NpZ25hbF9sb2NrLnVubG9jaygpOworCisgICAgICAgIHJldHVybiBkZXNjOworICAgIH0KKworICAgIC8vIHN0b3AgZGV2aWNlIHByb2Nlc3MKKyAgICB2b2lkIGZpbmlfcHJvY2Vzcyhib29sIHZlcmJvc2UpOworCisgICAgLy8gbGlzdCBvZiBzdGFja3MgYWN0aXZlIGF0IHRoZSBlbmdpbmUKKyAgICBQZXJzaXN0RGF0YUxpc3QgbV9wZXJzaXN0X2xpc3Q7CisKK3ByaXZhdGU6CisgICAgRW5naW5lKCkgOiBtX2luZGV4KC0xKSwgbV9waHlzaWNhbF9pbmRleCgtMSksIG1fcHJvY2VzcygwKSwgbV9yZWFkeShmYWxzZSksCisgICAgICAgICAgICAgICBtX3Byb2NfbnVtYmVyKDApCisgICAge30KKworICAgIH5FbmdpbmUoKSB7CisgICAgICAgIGlmIChtX3Byb2Nlc3MgIT0gMCkgeworICAgICAgICAgICAgZmluaV9wcm9jZXNzKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHNldCBpbmRleGVzCisgICAgdm9pZCBzZXRfaW5kZXhlcyhpbnQgbG9naWNhbF9pbmRleCwgaW50IHBoeXNpY2FsX2luZGV4KSB7CisgICAgICAgIG1faW5kZXggPSBsb2dpY2FsX2luZGV4OworICAgICAgICBtX3BoeXNpY2FsX2luZGV4ID0gcGh5c2ljYWxfaW5kZXg7CisgICAgfQorCisgICAgLy8gc3RhcnQgcHJvY2VzcyBvbiBkZXZpY2UKKyAgICB2b2lkIGluaXRfcHJvY2VzcygpOworCisgICAgdm9pZCBsb2FkX2xpYnJhcmllcyh2b2lkKTsKKyAgICB2b2lkIGluaXRfcHRyX2RhdGEodm9pZCk7CisKKyAgICAvLyBwZXJmb3JtcyBsaWJyYXJ5IGludGlhbGl6YXRpb24gb24gdGhlIGRldmljZSBzaWRlCisgICAgcGlkX3QgaW5pdF9kZXZpY2Uodm9pZCk7CisKK3ByaXZhdGU6CisgICAgLy8gZ2V0IHBpcGVsaW5lIGFzc29jaWF0ZWQgd2l0aCBhIGNhbGxpbmcgdGhyZWFkCisgICAgQ09JUElQRUxJTkUgZ2V0X3BpcGVsaW5lKHZvaWQpOworCisgICAgLy8gZ2V0IGF1dG9tYXRpYyB2YXJzIHNldCBhc3NvY2lhdGVkIHdpdGggdGhlIGNhbGxpbmcgdGhyZWFkCisgICAgQXV0b1NldCYgZ2V0X2F1dG9fdmFycyh2b2lkKTsKKworICAgIC8vIGRlc3RydWN0b3IgZm9yIHRocmVhZCBkYXRhCisgICAgc3RhdGljIHZvaWQgZGVzdHJveV90aHJlYWRfZGF0YSh2b2lkICpkYXRhKTsKKworcHJpdmF0ZToKKyAgICB0eXBlZGVmIHN0ZDo6c2V0PFB0ckRhdGE+IFB0clNldDsKKyAgICB0eXBlZGVmIHN0ZDo6bWFwPGNvbnN0IHZvaWQqLCBPZmZsb2FkRGVzY3JpcHRvcio+IFNpZ25hbE1hcDsKKworICAgIC8vIGRldmljZSBpbmRleGVzCisgICAgaW50ICAgICAgICAgbV9pbmRleDsKKyAgICBpbnQgICAgICAgICBtX3BoeXNpY2FsX2luZGV4OworCisgICAgLy8gbnVtYmVyIG9mIENPSSBwaXBlcyBjcmVhdGVkIGZvciB0aGUgZW5naW5lCisgICAgbG9uZyAgICAgICAgbV9wcm9jX251bWJlcjsKKworICAgIC8vIHByb2Nlc3MgaGFuZGxlCisgICAgQ09JUFJPQ0VTUyAgbV9wcm9jZXNzOworCisgICAgLy8gSWYgZmFsc2UsIGRldmljZSBlaXRoZXIgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIG9yIG5ldyBsaWJyYXJpZXMKKyAgICAvLyBoYXZlIGJlZW4gYWRkZWQuCisgICAgYm9vbCAgICAgICAgbV9yZWFkeTsKKyAgICBtdXRleF90ICAgICBtX2xvY2s7CisKKyAgICAvLyBMaXN0IG9mIGxpYnJhcmllcyB0byBiZSBsb2FkZWQKKyAgICBUYXJnZXRJbWFnZUxpc3QgbV9pbWFnZXM7CisKKyAgICAvLyB2YXIgdGFibGUKKyAgICBQdHJTZXQgICAgICBtX3B0cl9zZXQ7CisgICAgbXV0ZXhfdCAgICAgbV9wdHJfbG9jazsKKworICAgIC8vIHNpZ25hbHMKKyAgICBTaWduYWxNYXAgbV9zaWduYWxfbWFwOworICAgIG11dGV4X3QgICBtX3NpZ25hbF9sb2NrOworCisgICAgLy8gY29uc3RhbnRzIGZvciBhY2Nlc3NpbmcgZGV2aWNlIGZ1bmN0aW9uIGhhbmRsZXMKKyAgICBlbnVtIHsKKyAgICAgICAgY19mdW5jX2NvbXB1dGUgPSAwLAorI2lmZGVmIE1ZT19TVVBQT1JUCisgICAgICAgIGNfZnVuY19teW9faW5pdCwKKyAgICAgICAgY19mdW5jX215b19maW5pLAorI2VuZGlmIC8vIE1ZT19TVVBQT1JUCisgICAgICAgIGNfZnVuY19pbml0LAorICAgICAgICBjX2Z1bmNfdmFyX3RhYmxlX3NpemUsCisgICAgICAgIGNfZnVuY192YXJfdGFibGVfY29weSwKKyAgICAgICAgY19mdW5jc190b3RhbAorICAgIH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIG1fZnVuY19uYW1lc1tjX2Z1bmNzX3RvdGFsXTsKKworICAgIC8vIGRldmljZSBmdW5jdGlvbiBoYW5kbGVzCisgICAgQ09JRlVOQ1RJT04gbV9mdW5jc1tjX2Z1bmNzX3RvdGFsXTsKKworICAgIC8vIGludCAtPiBuYW1lIG1hcHBpbmcgZm9yIGRldmljZSBzaWduYWxzCisgICAgc3RhdGljIGNvbnN0IGludCAgIGNfc2lnbmFsX21heCA9IDMyOworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBjX3NpZ25hbF9uYW1lc1tjX3NpZ25hbF9tYXhdOworfTsKKworI2VuZGlmIC8vIE9GRkxPQURfRU5HSU5FX0hfSU5DTFVERUQKZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfZW52LmNwcCBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfZW52LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDM3MzM4Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9lbnYuY3BwCkBAIC0wLDAgKzEsMzU0IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJvZmZsb2FkX2Vudi5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSAib2ZmbG9hZF91dGlsLmgiCisjaW5jbHVkZSAibGlib2ZmbG9hZF9lcnJvcl9jb2Rlcy5oIgorCisvLyBmb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzIHZhbGlkIG9uIGFsbCBjYXJkcworY29uc3QgaW50IE1pY0VudlZhcjo6YW55X2NhcmQgPSAtMTsKKworTWljRW52VmFyOjp+TWljRW52VmFyKCkKK3sKKyAgICBmb3IgKHN0ZDo6bGlzdDxNaWNFbnZWYXI6OkNhcmRFbnZWYXJzKj46OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgICBpdCA9IGNhcmRfc3BlY19saXN0LmJlZ2luKCk7CisgICAgICAgICBpdCAhPSBjYXJkX3NwZWNfbGlzdC5lbmQoKTsgaXQrKykgeworICAgICAgICBDYXJkRW52VmFycyAqY2FyZF9kYXRhID0gKml0OworICAgICAgICBkZWxldGUgY2FyZF9kYXRhOworICAgIH0KK30KKworTWljRW52VmFyOjpWYXJWYWx1ZTo6flZhclZhbHVlKCkKK3sKKyAgICBmcmVlKGVudl92YXJfdmFsdWUpOworfQorCitNaWNFbnZWYXI6OkNhcmRFbnZWYXJzOjp+Q2FyZEVudlZhcnMoKQoreworICAgIGZvciAoc3RkOjpsaXN0PE1pY0VudlZhcjo6VmFyVmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBlbnZfdmFycy5iZWdpbigpOworICAgICAgICBpdCAhPSBlbnZfdmFycy5lbmQoKTsgaXQrKykgeworICAgICAgICAgICAgVmFyVmFsdWUgKnZhcl92YWx1ZSA9ICppdDsKKyAgICAgICAgICAgIGRlbGV0ZSB2YXJfdmFsdWU7CisgICAgfQorfQorCisvLyBTZWFyY2hpbmcgZm9yIGNhcmQgaW4gImNhcmRfc3BlY19saXN0IiBsaXN0IHdpdGggdGhlIHNhbWUgIm51bWJlciIKKworTWljRW52VmFyOjpDYXJkRW52VmFycyogTWljRW52VmFyOjpnZXRfY2FyZChpbnQgbnVtYmVyKQoreworICAgIGlmIChudW1iZXIgPT0gYW55X2NhcmQpIHsKKyAgICAgICAgcmV0dXJuICZjb21tb25fdmFyczsKKyAgICB9CisgICAgZm9yIChzdGQ6Omxpc3Q8TWljRW52VmFyOjpDYXJkRW52VmFycyo+Ojpjb25zdF9pdGVyYXRvcgorICAgICAgICAgaXQgPSBjYXJkX3NwZWNfbGlzdC5iZWdpbigpOworICAgICAgICAgaXQgIT0gY2FyZF9zcGVjX2xpc3QuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgQ2FyZEVudlZhcnMgKmNhcmRfZGF0YSA9ICppdDsKKyAgICAgICAgaWYgKGNhcmRfZGF0YS0+Y2FyZF9udW1iZXIgPT0gbnVtYmVyKSB7CisgICAgICAgICAgICByZXR1cm4gY2FyZF9kYXRhOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCisvLyBTZWFyY2hpbmcgZm9yIGVudmlyb25tZW50IHZhcmlhYmxlIGluICJlbnZfdmFyIiBsaXN0IHdpdGggdGhlIHNhbWUgbmFtZQorCitNaWNFbnZWYXI6OlZhclZhbHVlKiBNaWNFbnZWYXI6OkNhcmRFbnZWYXJzOjpmaW5kX3ZhcigKKyAgICBjaGFyKiBlbnZfdmFyX25hbWUsCisgICAgaW50IGVudl92YXJfbmFtZV9sZW5ndGgKKykKK3sKKyAgICBmb3IgKHN0ZDo6bGlzdDxNaWNFbnZWYXI6OlZhclZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZW52X3ZhcnMuYmVnaW4oKTsKKyAgICAgICAgaXQgIT0gZW52X3ZhcnMuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgICAgIFZhclZhbHVlICp2YXJfdmFsdWUgPSAqaXQ7CisgICAgICAgICAgICBpZiAodmFyX3ZhbHVlLT5sZW5ndGggPT0gZW52X3Zhcl9uYW1lX2xlbmd0aCAmJgorICAgICAgICAgICAgICAgICFzdHJuY21wKHZhcl92YWx1ZS0+ZW52X3ZhciwgZW52X3Zhcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVudl92YXJfbmFtZV9sZW5ndGgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhcl92YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgTWljRW52VmFyOjphbmFseXplX2Vudl92YXIoY2hhciAqZW52X3Zhcl9zdHJpbmcpCit7CisgICAgY2hhciAgICAgICAgICAqZW52X3Zhcl9uYW1lOworICAgIGNoYXIgICAgICAgICAgKmVudl92YXJfZGVmOworICAgIGludCAgICAgICAgICAgY2FyZF9udW1iZXI7CisgICAgaW50ICAgICAgICAgICBlbnZfdmFyX25hbWVfbGVuZ3RoOworICAgIE1pY0VudlZhcktpbmQgZW52X3Zhcl9raW5kOworCisgICAgZW52X3Zhcl9raW5kID0gZ2V0X2Vudl92YXJfa2luZChlbnZfdmFyX3N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYXJkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbnZfdmFyX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW52X3Zhcl9uYW1lX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbnZfdmFyX2RlZik7CisgICAgc3dpdGNoIChlbnZfdmFyX2tpbmQpIHsKKyAgICAgICAgY2FzZSBjX21pY192YXI6CisgICAgICAgIGNhc2UgY19taWNfY2FyZF92YXI6CisgICAgICAgICAgICBhZGRfZW52X3ZhcihjYXJkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudl92YXJfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudl92YXJfbmFtZV9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICBlbnZfdmFyX2RlZik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX21pY19jYXJkX2VudjoKKyAgICAgICAgICAgIG1pY19wYXJzZV9lbnZfdmFyX2xpc3QoY2FyZF9udW1iZXIsIGVudl92YXJfZGVmKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfbm9fbWljOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIE1pY0VudlZhcjo6YWRkX2Vudl92YXIoCisgICAgaW50IGNhcmRfbnVtYmVyLAorICAgIGNoYXIgKmVudl92YXJfbmFtZSwKKyAgICBpbnQgZW52X3Zhcl9uYW1lX2xlbmd0aCwKKyAgICBjaGFyICplbnZfdmFyX2RlZgorKQoreworICAgIFZhclZhbHVlICp2YXI7CisgICAgQ2FyZEVudlZhcnMgKmNhcmQ7CisKKyAgICAvLyBUaGUgY2FzZSBjb3JyZXNwb25kcyB0byBjb21tb24gZW52IHZhciBkZWZpbml0aW9uIG9mIGtpbmQKKyAgICAvLyA8bWljLXByZWZpeD5fPHZhcj4KKyAgICBpZiAoY2FyZF9udW1iZXIgPT0gYW55X2NhcmQpIHsKKyAgICAgICAgY2FyZCA9ICZjb21tb25fdmFyczsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGNhcmQgPSBnZXRfY2FyZChjYXJkX251bWJlcik7CisgICAgICAgIGlmICghY2FyZCkgeworICAgICAgICAgICAgLy8gZGVmaW5pdGlvbiBmb3IgbmV3IGNhcmQgb2NjdXJyZWQKKyAgICAgICAgICAgIGNhcmQgPSBuZXcgQ2FyZEVudlZhcnMoY2FyZF9udW1iZXIpOworICAgICAgICAgICAgY2FyZF9zcGVjX2xpc3QucHVzaF9iYWNrKGNhcmQpOworICAgICAgICB9CisKKyAgICB9CisgICAgdmFyID0gY2FyZC0+ZmluZF92YXIoZW52X3Zhcl9uYW1lLCBlbnZfdmFyX25hbWVfbGVuZ3RoKTsKKyAgICBpZiAoIXZhcikgeworICAgICAgICAvLyBwdXQgbmV3IGVudiB2YXIgZGVmaW5pdGlvbiBpbiAiZW52X3ZhciIgbGlzdAorICAgICAgICB2YXIgPSBuZXcgVmFyVmFsdWUoZW52X3Zhcl9uYW1lLCBlbnZfdmFyX25hbWVfbGVuZ3RoLCBlbnZfdmFyX2RlZik7CisgICAgICAgIGNhcmQtPmVudl92YXJzLnB1c2hfYmFjayh2YXIpOworICAgIH0KK30KKworLy8gVGhlIHJvdXRpbmUgYW5hbHlzZXMgc3RyaW5nIHBvaW50ZWQgYnkgImVudl92YXJfc3RyaW5nIiBhcmd1bWVudAorLy8gYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgc3ludGF4OgorLy8KKy8vIFNwZWNpZmljYXRpb24gb2YgcHJlZml4IGZvciBNSUMgZW52aXJvbm1lbnQgdmFyaWFibGVzCisvLyBNSUNfRU5WX1BSRUZJWD08bWljLXByZWZpeD4KKy8vCisvLyBTZXR0aW5nIHNpbmdsZSBNSUMgZW52aXJvbm1lbnQgdmFyaWFibGUKKy8vIDxtaWMtcHJlZml4Pl88dmFyPj08dmFsdWU+CisvLyA8bWljLXByZWZpeD5fPGNhcmQtbnVtYmVyPl88dmFyPj08dmFsdWU+CisKKy8vIFNldHRpbmcgbXVsdGlwbGUgTUlDIGVudmlyb25tZW50IHZhcmlhYmxlcworLy8gPG1pYy1wcmVmaXg+XzxjYXJkLW51bWJlcj5fRU5WPTxlbnYtdmFycz4KKworTWljRW52VmFyS2luZCBNaWNFbnZWYXI6OmdldF9lbnZfdmFyX2tpbmQoCisgICAgY2hhciAqZW52X3Zhcl9zdHJpbmcsCisgICAgaW50ICpjYXJkX251bWJlciwKKyAgICBjaGFyICoqZW52X3Zhcl9uYW1lLAorICAgIGludCAqZW52X3Zhcl9uYW1lX2xlbmd0aCwKKyAgICBjaGFyICoqZW52X3Zhcl9kZWYKKykKK3sKKyAgICBpbnQgbGVuID0gc3RybGVuKHByZWZpeCk7CisgICAgY2hhciAqYyA9IGVudl92YXJfc3RyaW5nOworICAgIGludCBudW0gPSAwOworICAgIGJvb2wgY2FyZF9pc19zZXQgPSBmYWxzZTsKKworICAgIGlmIChzdHJuY21wKGMsIHByZWZpeCwgbGVuKSAhPSAwIHx8IGNbbGVuXSAhPSAnXycpIHsKKyAgICAgICAgICAgIHJldHVybiBjX25vX21pYzsKKyAgICB9CisgICAgYyArPSBsZW4gKyAxOworCisgICAgKmNhcmRfbnVtYmVyID0gYW55X2NhcmQ7CisgICAgaWYgKGlzZGlnaXQoKmMpKSB7CisgICAgICAgIHdoaWxlIChpc2RpZ2l0ICgqYykpIHsKKyAgICAgICAgICAgIG51bSA9ICgqYysrIC0gJzAnKSArIChudW0gKiAxMCk7CisgICAgICAgIH0KKyAgICBpZiAoKmMgIT0gJ18nKSB7CisgICAgICAgIHJldHVybiBjX25vX21pYzsKKyAgICB9CisgICAgYysrOworICAgICAgICAqY2FyZF9udW1iZXIgPSBudW07CisgICAgICAgIGNhcmRfaXNfc2V0ID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKCFpc2FscGhhKCpjKSkgeworICAgICAgICByZXR1cm4gY19ub19taWM7CisgICAgfQorICAgICplbnZfdmFyX25hbWUgPSAqZW52X3Zhcl9kZWYgPSBjOworICAgIGlmIChzdHJuY21wKGMsICJFTlY9IiwgNCkgPT0gMCkgeworICAgICAgICBpZiAoIWNhcmRfaXNfc2V0KSB7CisgICAgICAgICAgICAqZW52X3Zhcl9uYW1lX2xlbmd0aCA9IDM7CisgICAgICAgICAgICAqZW52X3Zhcl9uYW1lID0gKmVudl92YXJfZGVmID0gYzsKKyAgICAgICAgICAgICplbnZfdmFyX2RlZiA9IHN0cmR1cCgqZW52X3Zhcl9kZWYpOworICAgICAgICAgICAgcmV0dXJuICBjX21pY192YXI7CisgICAgICAgIH0KKyAgICAgICAgKmVudl92YXJfZGVmID0gYyArIHN0cmxlbigiRU5WPSIpOworICAgICAgICAqZW52X3Zhcl9kZWYgPSBzdHJkdXAoKmVudl92YXJfZGVmKTsKKyAgICAgICAgcmV0dXJuIGNfbWljX2NhcmRfZW52OworICAgIH0KKyAgICBpZiAoaXNhbHBoYSgqYykpIHsKKyAgICAgICAgKmVudl92YXJfbmFtZV9sZW5ndGggPSAwOworICAgICAgICB3aGlsZSAoaXNhbG51bSgqYykgfHwgKmMgPT0gJ18nKSB7CisgICAgICAgICAgICBjKys7CisgICAgICAgICAgICAoKmVudl92YXJfbmFtZV9sZW5ndGgpKys7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCpjICE9ICc9JykgeworICAgICAgICByZXR1cm4gY19ub19taWM7CisgICAgfQorICAgICplbnZfdmFyX2RlZiA9IHN0cmR1cCgqZW52X3Zhcl9kZWYpOworICAgIHJldHVybiBjYXJkX2lzX3NldD8gY19taWNfY2FyZF92YXIgOiBjX21pY192YXI7Cit9CisKKy8vIGFuYWx5c2luZyA8ZW52LXZhcnM+IGluIGZvcm06CisvLyA8bWljLXByZWZpeD5fPGNhcmQtbnVtYmVyPl9FTlY9PGVudi12YXJzPgorLy8gd2hlcmU6CisvLworLy8gPGVudi12YXJzPjoKKy8vICAgICAgICAgICAgICAgIDxlbnYtdmFyPgorLy8gICAgICAgICAgICAgICAgPGVudi12YXJzPiB8IDxlbnYtdmFyPgorLy8KKy8vIDxlbnYtdmFyPjoKKy8vICAgICAgICAgICAgICAgIHZhcmlhYmxlPXZhbHVlCisvLyAgICAgICAgICAgICAgICB2YXJpYWJsZT0idmFsdWUiCisvLyAgICAgICAgICAgICAgICB2YXJpYWJsZT0KKwordm9pZCBNaWNFbnZWYXI6Om1pY19wYXJzZV9lbnZfdmFyX2xpc3QoCisgICAgaW50IGNhcmRfbnVtYmVyLCBjaGFyICplbnZfdmFyc19kZWZfbGlzdCkKK3sKKyAgICBjaGFyICpjID0gZW52X3ZhcnNfZGVmX2xpc3Q7CisgICAgY2hhciAqZW52X3Zhcl9uYW1lOworICAgIGludCAgZW52X3Zhcl9uYW1lX2xlbmd0aDsKKyAgICBjaGFyICplbnZfdmFyX2RlZjsKKyAgICBib29sIHZhcl9pc19xdW90ZWQ7CisKKyAgICBpZiAoKmMgPT0gJyInKSB7CisgICAgICAgIGMrKzsKKyAgICB9CisgICAgd2hpbGUgKCpjICE9IDApIHsKKyAgICAgICAgdmFyX2lzX3F1b3RlZCA9IGZhbHNlOworICAgICAgICBlbnZfdmFyX25hbWUgPSBjOworICAgICAgICBlbnZfdmFyX25hbWVfbGVuZ3RoID0gMDsKKyAgICAgICAgaWYgKGlzYWxwaGEoKmMpKSB7CisgICAgICAgICAgICB3aGlsZSAoaXNhbG51bSgqYykgfHwgKmMgPT0gJ18nKSB7CisgICAgICAgICAgICAgICAgYysrOworICAgICAgICAgICAgICAgIGVudl92YXJfbmFtZV9sZW5ndGgrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19taWNfcGFyc2VfZW52X3Zhcl9saXN0MSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCpjICE9ICc9JykgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX21pY19wYXJzZV9lbnZfdmFyX2xpc3QyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBjKys7CisKKyAgICAgICAgaWYgKCpjID09ICciJykgeworICAgICAgICAgICAgdmFyX2lzX3F1b3RlZCA9IHRydWU7CisgICAgICAgICAgICBjKys7CisgICAgICAgIH0KKyAgICAgICAgLy8gRW52aXJvbm1lbnQgdmFyaWFibGUgdmFsdWVzIHRoYXQgY29udGFpbiB8IHdpbGwgbmVlZCB0byBiZSBlc2NhcGVkLgorICAgICAgICB3aGlsZSAoKmMgIT0gMCAmJiAqYyAhPSAnfCcgJiYKKyAgICAgICAgICAgICAgICghdmFyX2lzX3F1b3RlZCB8fCAqYyAhPSAnIicpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBza2lwIGVzY2FwZWQgc3ltYm9sCisgICAgICAgICAgICBpZiAoKmMgPT0gJ1xcJykgeworICAgICAgICAgICAgICAgIGMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGMrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFyX2lzX3F1b3RlZCkgeworICAgICAgICAgICAgYysrOyAvLyBmb3IgIgorICAgICAgICAgICAgd2hpbGUgKCpjICE9IDAgJiYgKmMgIT0gJ3wnKSB7CisgICAgICAgICAgICAgICAgYysrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50IHN6ID0gYyAtIGVudl92YXJfbmFtZTsKKyAgICAgICAgZW52X3Zhcl9kZWYgPSAoY2hhciopbWFsbG9jKHN6KTsKKyAgICAgICAgbWVtY3B5KGVudl92YXJfZGVmLCBlbnZfdmFyX25hbWUsIHN6KTsKKyAgICAgICAgZW52X3Zhcl9kZWZbc3pdID0gMDsKKworICAgICAgICBpZiAoKmMgPT0gJ3wnKSB7CisgICAgICAgICAgICBjKys7CisgICAgICAgICAgICB3aGlsZSAoKmMgIT0gMCAmJiAqYyA9PSAnICcpIHsKKyAgICAgICAgICAgICAgICBjKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYWRkX2Vudl92YXIoY2FyZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgIGVudl92YXJfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgZW52X3Zhcl9uYW1lX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgZW52X3Zhcl9kZWYpOworICAgIH0KK30KKworLy8gQ29sbGVjdCBhbGwgZGVmaW5pdGlvbnMgZm9yIHRoZSBjYXJkIHdpdGggbnVtYmVyICJjYXJkX251bSIuCisvLyBUaGUgcmV0dXJuZWQgcmVzdWx0IGlzIHZlY3RvciBvZiBzdHJpbmcgcG9pbnRlcnMgZGVmaW5pbmcgb25lCisvLyBlbnZpcm9ubWVudCB2YXJpYWJsZS4gVGhlIHZlY3RvciBpcyB0ZXJtaW5hdGVkIGJ5IE5VTEwgcG9pbnRlci4KKy8vIEluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHZlY3RvciB0aGVyZSBhcmUgZW52IHZhcnMgZGVmaW5lZCBhcworLy8gPG1pYy1wcmVmaXg+XzxjYXJkLW51bWJlcj5fPHZhcj49PHZhbHVlPgorLy8gb3IKKy8vIDxtaWMtcHJlZml4Pl88Y2FyZC1udW1iZXI+X0VOVj08ZW52LXZhcnM+CisvLyB3aGVyZSA8Y2FyZC1udW1iZXI+IGlzIGVxdWFsIHRvICJjYXJkX251bSIKKy8vIFRoZXkgYXJlIGZvbGxvd2VkIGJ5IGRlZmluaXRpb25zIHZhbGlkIGZvciBhbnkgY2FyZAorLy8gYW5kIGFic2VudCBpbiBwcmV2aW91cyBkZWZpbml0aW9ucy4KKworY2hhcioqIE1pY0VudlZhcjo6Y3JlYXRlX2Vudmlyb25fZm9yX2NhcmQoaW50IGNhcmRfbnVtKQoreworICAgIFZhclZhbHVlICp2YXJfdmFsdWU7CisgICAgVmFyVmFsdWUgKnZhcl92YWx1ZV9maW5kOworICAgIENhcmRFbnZWYXJzICpjYXJkX2RhdGEgPSBnZXRfY2FyZChjYXJkX251bSk7CisgICAgQ2FyZEVudlZhcnMgKmNhcmRfZGF0YV9jb21tb247CisgICAgc3RkOjpsaXN0PGNoYXIqPiBuZXdfZW52OworICAgIGNoYXIgKipyZXo7CisKKyAgICBpZiAoIXByZWZpeCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLy8gVGhlcmUgaXMgbm8gcGVyc29uZWwgZW52IHZhciBkZWZpbml0aW9ucyBmb3IgdGhlIGNhcmQgd2l0aAorICAgIC8vIG51bWJlciAiY2FyZF9udW0iCisgICAgaWYgKCFjYXJkX2RhdGEpIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZV9lbnZpcm9uX2Zvcl9jYXJkKGFueV9jYXJkKTsKKyAgICB9CisKKyAgICBmb3IgKHN0ZDo6bGlzdDxNaWNFbnZWYXI6OlZhclZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgICBpdCA9IGNhcmRfZGF0YS0+ZW52X3ZhcnMuYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IGNhcmRfZGF0YS0+ZW52X3ZhcnMuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgdmFyX3ZhbHVlID0gKml0OworICAgICAgICBuZXdfZW52LnB1c2hfYmFjayh2YXJfdmFsdWUtPmVudl92YXJfdmFsdWUpOworICAgIH0KKworICAgIGlmIChjYXJkX251bSAhPSBhbnlfY2FyZCkgeworICAgICAgICBjYXJkX2RhdGFfY29tbW9uID0gZ2V0X2NhcmQoYW55X2NhcmQpOworICAgICAgICBmb3IgKHN0ZDo6bGlzdDxNaWNFbnZWYXI6OlZhclZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgICAgICAgaXQgPSBjYXJkX2RhdGFfY29tbW9uLT5lbnZfdmFycy5iZWdpbigpOworICAgICAgICAgICAgIGl0ICE9IGNhcmRfZGF0YV9jb21tb24tPmVudl92YXJzLmVuZCgpOyBpdCsrKSB7CisgICAgICAgICAgICB2YXJfdmFsdWUgPSAqaXQ7CisgICAgICAgICAgICB2YXJfdmFsdWVfZmluZCA9IGNhcmRfZGF0YS0+ZmluZF92YXIodmFyX3ZhbHVlLT5lbnZfdmFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcl92YWx1ZS0+bGVuZ3RoKTsKKyAgICAgICAgICAgIGlmICghdmFyX3ZhbHVlX2ZpbmQpIHsKKyAgICAgICAgICAgICAgICBuZXdfZW52LnB1c2hfYmFjayh2YXJfdmFsdWUtPmVudl92YXJfdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaW50IG5ld19lbnZfc2l6ZSA9IG5ld19lbnYuc2l6ZSgpOworICAgIHJleiA9IChjaGFyKiopIG1hbGxvYygobmV3X2Vudl9zaXplICsgMSkgKiBzaXplb2YoY2hhciopKTsKKyAgICBzdGQ6OmNvcHkobmV3X2Vudi5iZWdpbigpLCBuZXdfZW52LmVuZCgpLCByZXopOworICAgIHJleltuZXdfZW52X3NpemVdID0gMDsKKyAgICByZXR1cm4gcmV6OworfQpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9lbnYuaCBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfZW52LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAzNWZmNgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfZW52LmgKQEAgLTAsMCArMSw5MSBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIE9GRkxPQURfRU5WX0hfSU5DTFVERUQKKyNkZWZpbmUgT0ZGTE9BRF9FTlZfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8bGlzdD4KKworLy8gZGF0YSBzdHJ1Y3R1cmUgYW5kIHJvdXRpbmVzIHRvIHBhcnNlIE1JQyB1c2VyIGVudmlyb25tZW50IGFuZCBwYXNzIHRvIE1JQworCitlbnVtIE1pY0VudlZhcktpbmQKK3sKKyAgICBjX25vX21pYywgICAgICAgICAvLyBub3QgTUlDIGVudiB2YXIKKyAgICBjX21pY192YXIsICAgICAgICAvLyBmb3IgPG1pYy1wcmVmaXg+Xzx2YXI+CisgICAgY19taWNfY2FyZF92YXIsICAgLy8gZm9yIDxtaWMtcHJlZml4Pl88Y2FyZC1udW1iZXI+Xzx2YXI+CisgICAgY19taWNfY2FyZF9lbnYgICAgLy8gZm9yIDxtaWMtcHJlZml4Pl88Y2FyZC1udW1iZXI+X0VOVgorfTsKKworc3RydWN0IE1pY0VudlZhciB7CitwdWJsaWM6CisgICAgTWljRW52VmFyKCkgOiBwcmVmaXgoMCkge30KKyAgICB+TWljRW52VmFyKCk7CisKKyAgICB2b2lkIGFuYWx5emVfZW52X3ZhcihjaGFyICplbnZfdmFyX3N0cmluZyk7CisgICAgY2hhcioqIGNyZWF0ZV9lbnZpcm9uX2Zvcl9jYXJkKGludCBjYXJkX251bSk7CisgICAgTWljRW52VmFyS2luZCBnZXRfZW52X3Zhcl9raW5kKAorICAgICAgICBjaGFyICplbnZfdmFyX3N0cmluZywKKyAgICAgICAgaW50ICpjYXJkX251bWJlciwKKyAgICAgICAgY2hhciAqKmVudl92YXJfbmFtZSwKKyAgICAgICAgaW50ICplbnZfdmFyX25hbWVfbGVuZ3RoLAorICAgICAgICBjaGFyICoqZW52X3Zhcl9kZWYKKyAgICApOworICAgIHZvaWQgYWRkX2Vudl92YXIoCisgICAgICAgIGludCBjYXJkX251bWJlciwKKyAgICAgICAgY2hhciAqZW52X3Zhcl9uYW1lLAorICAgICAgICBpbnQgZW52X3Zhcl9uYW1lX2xlbmd0aCwKKyAgICAgICAgY2hhciAqZW52X3Zhcl9kZWYKKyAgICApOworCisgICAgdm9pZCBzZXRfcHJlZml4KGNvbnN0IGNoYXIgKnByZWYpIHsKKyAgICAgICAgcHJlZml4ID0gKHByZWYgJiYgKnByZWYgIT0gJ1wwJykgPyBwcmVmIDogMDsKKyAgICB9CisKKyAgICBzdHJ1Y3QgVmFyVmFsdWUgeworICAgIHB1YmxpYzoKKyAgICAgICAgY2hhciogZW52X3ZhcjsKKyAgICAgICAgaW50ICAgbGVuZ3RoOworICAgICAgICBjaGFyKiBlbnZfdmFyX3ZhbHVlOworCisgICAgICAgIFZhclZhbHVlKGNoYXIqIHZhciwgaW50IGxuLCBjaGFyKiB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgZW52X3ZhciA9IHZhcjsKKyAgICAgICAgICAgIGxlbmd0aCA9IGxuOworICAgICAgICAgICAgZW52X3Zhcl92YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisgICAgICAgIH5WYXJWYWx1ZSgpOworICAgIH07CisKKyAgICBzdHJ1Y3QgQ2FyZEVudlZhcnMgeworICAgIHB1YmxpYzoKKworICAgICAgICBpbnQgY2FyZF9udW1iZXI7CisgICAgICAgIHN0ZDo6bGlzdDxzdHJ1Y3QgVmFyVmFsdWUqPiBlbnZfdmFyczsKKworICAgICAgICBDYXJkRW52VmFycygpIHsgY2FyZF9udW1iZXIgPSBhbnlfY2FyZDsgfQorICAgICAgICBDYXJkRW52VmFycyhpbnQgbnVtKSB7IGNhcmRfbnVtYmVyID0gbnVtOyB9CisgICAgICAgIH5DYXJkRW52VmFycygpOworCisgICAgICAgIHZvaWQgYWRkX25ld19lbnZfdmFyKGludCBudW1iZXIsIGNoYXIgKmVudl92YXIsIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmVudl92YXJfdmFsdWUpOworICAgICAgICBWYXJWYWx1ZSogZmluZF92YXIoY2hhciogZW52X3Zhcl9uYW1lLCBpbnQgZW52X3Zhcl9uYW1lX2xlbmd0aCk7CisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgaW50IGFueV9jYXJkOworCitwcml2YXRlOgorICAgIHZvaWQgICAgICAgICBtaWNfcGFyc2VfZW52X3Zhcl9saXN0KGludCBjYXJkX251bWJlciwgY2hhciAqZW52X3Zhcl9kZWYpOworICAgIENhcmRFbnZWYXJzKiBnZXRfY2FyZChpbnQgbnVtYmVyKTsKKworICAgIGNvbnN0IGNoYXIgKnByZWZpeDsKKyAgICBzdGQ6Omxpc3Q8c3RydWN0IENhcmRFbnZWYXJzICo+IGNhcmRfc3BlY19saXN0OworICAgIENhcmRFbnZWYXJzIGNvbW1vbl92YXJzOworfTsKKworI2VuZGlmIC8vIE9GRkxPQURfRU5WX0hfSU5DTFVERUQKZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfaG9zdC5jcHAgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX2hvc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZDUxMzkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX2hvc3QuY3BwCkBAIC0wLDAgKzEsNDM2MCBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9uIGFzIHRoZSBmb2xsb3dpbmcgMiBmdW5jdGlvbnMgYXJlIGRlY2xhcmVkIGFzIGZyaWVuZCBpbiBvZmZsb2FkX2VuZ2luZS5oCisvLyBDTEFORyBkb2VzIG5vdCBsaWtlIHN0YXRpYyB0byBiZWVuIGFmdGVyIGZyaWVuZCBkZWNsYXJhdGlvbi4KK3N0YXRpYyB2b2lkIF9fb2ZmbG9hZF9pbml0X2xpYnJhcnlfb25jZSh2b2lkKTsKK3N0YXRpYyB2b2lkIF9fb2ZmbG9hZF9maW5pX2xpYnJhcnkodm9pZCk7CisKKyNpbmNsdWRlICJvZmZsb2FkX2hvc3QuaCIKKyNpZmRlZiBNWU9fU1VQUE9SVAorI2luY2x1ZGUgIm9mZmxvYWRfbXlvX2hvc3QuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaWZuZGVmIFRBUkdFVF9XSU5OVAorI2luY2x1ZGUgPGFsbG9jYS5oPgorI2luY2x1ZGUgPGVsZi5oPgorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Yml0c2V0PgorCisjaWYgZGVmaW5lZChIT1NUX1dJTk5UKQorI2RlZmluZSBQQVRIX1NFUEFSQVRPUiAiOyIKKyNlbHNlCisjZGVmaW5lIFBBVEhfU0VQQVJBVE9SICI6IgorI2VuZGlmCisKKyNkZWZpbmUgR0VUX09GRkxPQURfTlVNQkVSKHRpbWVyX2RhdGEpIFwKKyAgICB0aW1lcl9kYXRhPyB0aW1lcl9kYXRhLT5vZmZsb2FkX251bWJlciA6IDAKKworI2lmZGVmIFRBUkdFVF9XSU5OVAorLy8gU21hbGwgc3Vic2V0IG9mIEVMRiBkZWNsYXJhdGlvbnMgZm9yIFdpbmRvd3Mgd2hpY2ggaXMgbmVlZGVkIHRvIGNvbXBpbGUKKy8vIHRoaXMgZmlsZS4gRUxGIGhlYWRlciBpcyB1c2VkIHRvIHVuZGVyc3RhbmQgd2hhdCBiaW5hcnkgdHlwZSBpcyBjb250YWluZWQKKy8vIGluIHRoZSB0YXJnZXQgaW1hZ2UgLSBzaGFyZWQgbGlicmFyeSBvciBleGVjdXRhYmxlLgorCit0eXBlZGVmIHVpbnQxNl90IEVsZjY0X0hhbGY7Cit0eXBlZGVmIHVpbnQzMl90IEVsZjY0X1dvcmQ7Cit0eXBlZGVmIHVpbnQ2NF90IEVsZjY0X0FkZHI7Cit0eXBlZGVmIHVpbnQ2NF90IEVsZjY0X09mZjsKKworI2RlZmluZSBFSV9OSURFTlQgICAxNgorCisjZGVmaW5lIEVUX0VYRUMgICAgIDIKKyNkZWZpbmUgRVRfRFlOICAgICAgMworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVuc2lnbmVkIGNoYXIgZV9pZGVudFtFSV9OSURFTlRdOworICAgIEVsZjY0X0hhbGYgICAgZV90eXBlOworICAgIEVsZjY0X0hhbGYgICAgZV9tYWNoaW5lOworICAgIEVsZjY0X1dvcmQgICAgZV92ZXJzaW9uOworICAgIEVsZjY0X0FkZHIgICAgZV9lbnRyeTsKKyAgICBFbGY2NF9PZmYgICAgIGVfcGhvZmY7CisgICAgRWxmNjRfT2ZmICAgICBlX3Nob2ZmOworICAgIEVsZjY0X1dvcmQgICAgZV9mbGFnczsKKyAgICBFbGY2NF9IYWxmICAgIGVfZWhzaXplOworICAgIEVsZjY0X0hhbGYgICAgZV9waGVudHNpemU7CisgICAgRWxmNjRfSGFsZiAgICBlX3BobnVtOworICAgIEVsZjY0X0hhbGYgICAgZV9zaGVudHNpemU7CisgICAgRWxmNjRfSGFsZiAgICBlX3NobnVtOworICAgIEVsZjY0X0hhbGYgICAgZV9zaHN0cm5keDsKK30gRWxmNjRfRWhkcjsKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKworLy8gSG9zdCBjb25zb2xlIGFuZCBmaWxlIGxvZ2dpbmcKK2NvbnN0IGNoYXIgKnByZWZpeDsKK2ludCBjb25zb2xlX2VuYWJsZWQgPSAwOworaW50IG9mZmxvYWRfbnVtYmVyID0gMDsKKworc3RhdGljIGNvbnN0IGNoYXIgKmh0cmFjZV9lbnZuYW1lID0gIkhfVFJBQ0UiOworc3RhdGljIGNvbnN0IGNoYXIgKm9mZmxvYWRfcmVwb3J0X2Vudm5hbWUgPSAiT0ZGTE9BRF9SRVBPUlQiOworc3RhdGljIGNoYXIgKnRpbWVyX2Vudm5hbWUgPSAiSF9USU1FIjsKKworLy8gVHJhY2UgaW5mb3JtYXRpb24KK3N0YXRpYyBjb25zdCBjaGFyKiB2YXJkZXNjX2RpcmVjdGlvbl9hc19zdHJpbmdbXSA9IHsKKyAgICAiTk9DT1BZIiwKKyAgICAiSU4iLAorICAgICJPVVQiLAorICAgICJJTk9VVCIKK307CitzdGF0aWMgY29uc3QgY2hhciogdmFyZGVzY190eXBlX2FzX3N0cmluZ1tdID0geworICAgICJ1bmtub3duIiwKKyAgICAiZGF0YSIsCisgICAgImRhdGFfcHRyIiwKKyAgICAiZnVuY19wdHIiLAorICAgICJ2b2lkX3B0ciIsCisgICAgInN0cmluZ19wdHIiLAorICAgICJkdiIsCisgICAgImR2X2RhdGEiLAorICAgICJkdl9kYXRhX3NsaWNlIiwKKyAgICAiZHZfcHRyIiwKKyAgICAiZHZfcHRyX2RhdGEiLAorICAgICJkdl9wdHJfZGF0YV9zbGljZSIsCisgICAgImNlYW5fdmFyIiwKKyAgICAiY2Vhbl92YXJfcHRyIiwKKyAgICAiY19kYXRhX3B0cl9hcnJheSIsCisgICAgImNfZnVuY19wdHJfYXJyYXkiLAorICAgICJjX3ZvaWRfcHRyX2FycmF5IiwKKyAgICAiY19zdHJpbmdfcHRyX2FycmF5IgorfTsKKworRW5naW5lKiAgICAgICAgIG1pY19lbmdpbmVzID0gMDsKK3VpbnQzMl90ICAgICAgICBtaWNfZW5naW5lc190b3RhbCA9IDA7CitwdGhyZWFkX2tleV90ICAgbWljX3RocmVhZF9rZXk7CitNaWNFbnZWYXIgICAgICAgbWljX2Vudl92YXJzOwordWludDY0X3QgICAgICAgIGNwdV9mcmVxdWVuY3kgPSAwOworCisvLyBNSUNfU1RBQ0tTSVpFCit1aW50MzJfdCBtaWNfc3RhY2tfc2l6ZSA9IDEyICogMTAyNCAqIDEwMjQ7CisKKy8vIE1JQ19CVUZGRVJTSVpFCit1aW50NjRfdCBtaWNfYnVmZmVyX3NpemUgPSAwOworCisvLyBNSUNfTERfTElCUkFSWV9QQVRICitjaGFyKiBtaWNfbGlicmFyeV9wYXRoID0gMDsKKworLy8gTUlDX1BST1hZX0lPCitib29sIG1pY19wcm94eV9pbyA9IHRydWU7CisKKy8vIE1JQ19QUk9YWV9GU19ST09UCitjaGFyKiBtaWNfcHJveHlfZnNfcm9vdCA9IDA7CisKKy8vIFRocmVzaG9sZCBmb3IgY3JlYXRpbmcgYnVmZmVycyB3aXRoIGxhcmdlIHBhZ2VzLiBCdWZmZXIgaXMgY3JlYXRlZAorLy8gd2l0aCBsYXJnZSBwYWdlcyBoaW50IGlmIGl0cyBzaXplIGV4Y2VlZHMgdGhlIHRocmVzaG9sZCB2YWx1ZS4KKy8vIEJ5IGRlZmF1bHQgbGFyZ2UgcGFnZXMgYXJlIGRpc2FibGVkIHJpZ2h0IG5vdyAoYnkgc2V0dGluZyBkZWZhdWx0CisvLyB2YWx1ZSBmb3IgdGhyZXNob2xkIHRvIE1BWCkgZHVlIHRvIEhTRCA0MTE0NjI5LgordWludDY0X3QgX19vZmZsb2FkX3VzZV8ybWJfYnVmZmVycyA9IDB4ZmZmZmZmZmZmZmZmZmZmZlVMTDsKK3N0YXRpYyBjb25zdCBjaGFyICptaWNfdXNlXzJtYl9idWZmZXJzX2Vudm5hbWUgID0KKyAgICAiTUlDX1VTRV8yTUJfQlVGRkVSUyI7CisKK3N0YXRpYyB1aW50NjRfdCBfX29mZmxvYWRfdXNlX2FzeW5jX2J1ZmZlcl93cml0ZSA9IDIgKiAxMDI0ICogMTAyNDsKK3N0YXRpYyBjb25zdCBjaGFyICptaWNfdXNlX2FzeW5jX2J1ZmZlcl93cml0ZV9lbnZuYW1lICA9CisgICAgIk1JQ19VU0VfQVNZTkNfQlVGRkVSX1dSSVRFIjsKKworc3RhdGljIHVpbnQ2NF90IF9fb2ZmbG9hZF91c2VfYXN5bmNfYnVmZmVyX3JlYWQgPSAyICogMTAyNCAqIDEwMjQ7CitzdGF0aWMgY29uc3QgY2hhciAqbWljX3VzZV9hc3luY19idWZmZXJfcmVhZF9lbnZuYW1lICA9CisgICAgIk1JQ19VU0VfQVNZTkNfQlVGRkVSX1JFQUQiOworCisvLyBkZXZpY2UgaW5pdGlhbGl6YXRpb24gdHlwZQorT2ZmbG9hZEluaXRUeXBlIF9fb2ZmbG9hZF9pbml0X3R5cGUgPSBjX2luaXRfb25fb2ZmbG9hZF9hbGw7CitzdGF0aWMgY29uc3QgY2hhciAqb2ZmbG9hZF9pbml0X2Vudm5hbWUgPSAiT0ZGTE9BRF9JTklUIjsKKworLy8gYWN0aXZlIHdhaXQKK3N0YXRpYyBib29sIF9fb2ZmbG9hZF9hY3RpdmVfd2FpdCA9IHRydWU7CitzdGF0aWMgY29uc3QgY2hhciAqb2ZmbG9hZF9hY3RpdmVfd2FpdF9lbnZuYW1lID0gIk9GRkxPQURfQUNUSVZFX1dBSVQiOworCisvLyBPTVBfREVGQVVMVF9ERVZJQ0UKK2ludCBfX29tcF9kZXZpY2VfbnVtID0gMDsKK3N0YXRpYyBjb25zdCBjaGFyICpvbXBfZGV2aWNlX251bV9lbnZuYW1lID0gIk9NUF9ERUZBVUxUX0RFVklDRSI7CisKKy8vIFRoZSBsaXN0IG9mIHBlbmRpbmcgdGFyZ2V0IGxpYnJhcmllcworc3RhdGljIGJvb2wgICAgICAgICAgICBfX3RhcmdldF9saWJzOworc3RhdGljIFRhcmdldEltYWdlTGlzdCBfX3RhcmdldF9saWJzX2xpc3Q7CitzdGF0aWMgbXV0ZXhfdCAgICAgICAgIF9fdGFyZ2V0X2xpYnNfbG9jazsKK3N0YXRpYyBtdXRleF90ICAgICAgICAgc3RhY2tfYWxsb2NfbG9jazsKKworLy8gVGFyZ2V0IGV4ZWN1dGFibGUKK1RhcmdldEltYWdlKiAgICAgICAgICAgX190YXJnZXRfZXhlOworCitzdGF0aWMgY2hhciAqIG9mZmxvYWRfZ2V0X3NyY19iYXNlKHZvaWQgKiBwdHIsIHVpbnQ4X3QgdHlwZSkKK3sKKyAgICBjaGFyICpiYXNlOworICAgIGlmIChWQVJfVFlQRV9JU19QVFIodHlwZSkpIHsKKyAgICAgICAgYmFzZSA9ICpzdGF0aWNfY2FzdDxjaGFyKio+KHB0cik7CisgICAgfQorICAgIGVsc2UgaWYgKFZBUl9UWVBFX0lTX1NDQUxBUih0eXBlKSkgeworICAgICAgICBiYXNlID0gc3RhdGljX2Nhc3Q8Y2hhcio+KHB0cik7CisgICAgfQorICAgIGVsc2UgaWYgKFZBUl9UWVBFX0lTX0RWX0RBVEFfU0xJQ0UodHlwZSkgfHwgVkFSX1RZUEVfSVNfRFZfREFUQSh0eXBlKSkgeworICAgICAgICBBcnJEZXNjICpkdnA7CisgICAgICAgIGlmIChWQVJfVFlQRV9JU19EVl9EQVRBX1NMSUNFKHR5cGUpKSB7CisgICAgICAgICAgICBjb25zdCBhcnJfZGVzYyAqYXAgPSBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KHB0cik7CisgICAgICAgICAgICBkdnAgPSAodHlwZSA9PSBjX2R2X2RhdGFfc2xpY2UpID8KKyAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QXJyRGVzYyo+KGFwLT5iYXNlKSA6CisgICAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxBcnJEZXNjKio+KGFwLT5iYXNlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGR2cCA9ICh0eXBlID09IGNfZHZfZGF0YSkgPworICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QXJyRGVzYyo+KHB0cikgOgorICAgICAgICAgICAgICAgICAgKnN0YXRpY19jYXN0PEFyckRlc2MqKj4ocHRyKTsKKyAgICAgICAgfQorICAgICAgICBiYXNlID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oZHZwLT5CYXNlKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGJhc2UgPSBOVUxMOworICAgIH0KKyAgICByZXR1cm4gYmFzZTsKK30KKwordm9pZCBPZmZsb2FkRGVzY3JpcHRvcjo6cmVwb3J0X2NvaV9lcnJvcihlcnJvcl90eXBlcyBtc2csIENPSVJFU1VMVCByZXMpCit7CisgICAgLy8gc3BlY2lhbCBjYXNlIGZvciB0aGUgJ3Byb2Nlc3MgZGllZCcgZXJyb3IKKyAgICBpZiAocmVzID09IENPSV9QUk9DRVNTX0RJRUQpIHsKKyAgICAgICAgbV9kZXZpY2UuZmluaV9wcm9jZXNzKHRydWUpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgc3dpdGNoIChtc2cpIHsKKyAgICAgICAgICAgIGNhc2UgY19idWZfY3JlYXRlOgorICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gQ09JX09VVF9PRl9NRU1PUlkpIHsKKyAgICAgICAgICAgICAgICAgICAgbXNnID0gY19idWZfY3JlYXRlX291dF9vZl9tZW07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIGZhbGx0aHJ1ICovCisKKyAgICAgICAgICAgIGNhc2UgY19idWZfY3JlYXRlX2Zyb21fbWVtOgorICAgICAgICAgICAgY2FzZSBjX2J1Zl9nZXRfYWRkcmVzczoKKyAgICAgICAgICAgIGNhc2UgY19waXBlbGluZV9jcmVhdGU6CisgICAgICAgICAgICBjYXNlIGNfcGlwZWxpbmVfcnVuX2Z1bmM6CisgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihtc2csIG1fZGV2aWNlLmdldF9sb2dpY2FsX2luZGV4KCksIHJlcyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY19idWZfcmVhZDoKKyAgICAgICAgICAgIGNhc2UgY19idWZfd3JpdGU6CisgICAgICAgICAgICBjYXNlIGNfYnVmX2NvcHk6CisgICAgICAgICAgICBjYXNlIGNfYnVmX21hcDoKKyAgICAgICAgICAgIGNhc2UgY19idWZfdW5tYXA6CisgICAgICAgICAgICBjYXNlIGNfYnVmX2Rlc3Ryb3k6CisgICAgICAgICAgICBjYXNlIGNfYnVmX3NldF9zdGF0ZToKKyAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKG1zZywgcmVzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGV4aXQoMSk7Cit9CisKK19PZmZsb2FkX3Jlc3VsdCBPZmZsb2FkRGVzY3JpcHRvcjo6dHJhbnNsYXRlX2NvaV9lcnJvcihDT0lSRVNVTFQgcmVzKSBjb25zdAoreworICAgIHN3aXRjaCAocmVzKSB7CisgICAgICAgIGNhc2UgQ09JX1NVQ0NFU1M6CisgICAgICAgICAgICByZXR1cm4gT0ZGTE9BRF9TVUNDRVNTOworCisgICAgICAgIGNhc2UgQ09JX1BST0NFU1NfRElFRDoKKyAgICAgICAgICAgIHJldHVybiBPRkZMT0FEX1BST0NFU1NfRElFRDsKKworICAgICAgICBjYXNlIENPSV9PVVRfT0ZfTUVNT1JZOgorICAgICAgICAgICAgcmV0dXJuIE9GRkxPQURfT1VUX09GX01FTU9SWTsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIE9GRkxPQURfRVJST1I7CisgICAgfQorfQorCitib29sIE9mZmxvYWREZXNjcmlwdG9yOjphbGxvY19wdHJfZGF0YSgKKyAgICBQdHJEYXRhKiAmcHRyX2RhdGEsCisgICAgdm9pZCAqYmFzZSwKKyAgICBpbnQ2NF90IGRpc3AsCisgICAgaW50NjRfdCBzaXplLAorICAgIGludDY0X3QgYWxsb2NfZGlzcCwKKyAgICBpbnQgYWxpZ24KKykKK3sKKyAgICAvLyB0b3RhbCBsZW5ndGggb2YgYmFzZQorICAgIGludDY0X3QgbGVuZ3RoID0gZGlzcCArIHNpemU7CisgICAgYm9vbCBpc19uZXc7CisKKyAgICBPRkZMT0FEX1RSQUNFKDMsICJDcmVhdGluZyBhc3NvY2lhdGlvbiBmb3IgZGF0YTogYWRkciAlcCwgbGVuZ3RoICVsbGRcbiIsCisgICAgICAgICAgICAgICAgICBiYXNlLCBsZW5ndGgpOworCisgICAgLy8gYWRkIG5ldyBlbnRyeQorICAgIHB0cl9kYXRhID0gbV9kZXZpY2UuaW5zZXJ0X3B0cl9kYXRhKGJhc2UsIGxlbmd0aCwgaXNfbmV3KTsKKyAgICBpZiAoaXNfbmV3KSB7CisKKyAgICAgICAgT0ZGTE9BRF9UUkFDRSgzLCAiQWRkZWQgbmV3IGFzc29jaWF0aW9uXG4iKTsKKworICAgICAgICBpZiAobGVuZ3RoID4gMCkgeworICAgICAgICAgICAgT2ZmbG9hZFRpbWVyIHRpbWVyKGdldF90aW1lcl9kYXRhKCksIGNfb2ZmbG9hZF9ob3N0X2FsbG9jX2J1ZmZlcnMpOworICAgICAgICAgICAgQ09JUkVTVUxUIHJlczsKKworICAgICAgICAgICAgLy8gYWxpZ24gc2hvdWxkIGJlIGEgcG93ZXIgb2YgMgorICAgICAgICAgICAgaWYgKGFsaWduID4gMCAmJiAoYWxpZ24gJiAoYWxpZ24gLSAxKSkgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIG9mZnNldCB3aXRoaW4gbWljX2J1ZmZlci4gQ2FuIGRvIG9mZnNldCBvcHRpbWl6YXRpb24KKyAgICAgICAgICAgICAgICAvLyBvbmx5IHdoZW4gc291cmNlIGFkZHJlc3MgYWxpZ25tZW50IHNhdGlzZmllcyByZXF1ZXN0ZWQKKyAgICAgICAgICAgICAgICAvLyBhbGlnbm1lbnQgb24gdGhlIHRhcmdldCAoY3ExNzI3MzYpLgorICAgICAgICAgICAgICAgIGlmICgocmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oYmFzZSkgJiAoYWxpZ24gLSAxKSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YS0+bWljX29mZnNldCA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KGJhc2UpICYgNDA5NTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGJ1ZmZlciBzaXplIGFuZCBmbGFncworICAgICAgICAgICAgdWludDY0X3QgYnVmZmVyX3NpemUgPSBsZW5ndGggKyBwdHJfZGF0YS0+bWljX29mZnNldDsKKyAgICAgICAgICAgIHVpbnQzMl90IGJ1ZmZlcl9mbGFncyA9IDA7CisKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBidWZmZXIgd2l0aCBsYXJnZSBwYWdlcyBpZiBkYXRhIGxlbmd0aCBleGNlZWRzCisgICAgICAgICAgICAvLyBsYXJnZSBwYWdlIHRocmVzaG9sZAorICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSBfX29mZmxvYWRfdXNlXzJtYl9idWZmZXJzKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyX2ZsYWdzID0gQ09JX09QVElNSVpFX0hVR0VfUEFHRV9TSVpFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjcmVhdGUgQ1BVIGJ1ZmZlcgorICAgICAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9PRkZMT0FEX05VTUJFUihnZXRfdGltZXJfZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY19vZmZsb2FkX2NyZWF0ZV9idWZfaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkNyZWF0aW5nIGJ1ZmZlciBmcm9tIHNvdXJjZSBtZW1vcnkgJXAsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImxlbmd0aCAlbGxkXG4iLCBiYXNlLCBsZW5ndGgpOworCisgICAgICAgICAgICAvLyByZXN1bHQgaXMgbm90IGNoZWNrZWQgYmVjYXVzZSB3ZSBjYW4gY29udGludWUgd2l0aG91dCBjcHUKKyAgICAgICAgICAgIC8vIGJ1ZmZlci4gSW4gdGhpcyBjYXNlIHdlIHdpbGwgdXNlIENPSUJ1ZmZlclJlYWQvV3JpdGUgaW5zdGVhZAorICAgICAgICAgICAgLy8gb2YgQ09JQnVmZmVyQ29weS4KKyAgICAgICAgICAgIENPSTo6QnVmZmVyQ3JlYXRlRnJvbU1lbW9yeShsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0JVRkZFUl9OT1JNQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1fZGV2aWNlLmdldF9wcm9jZXNzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnB0cl9kYXRhLT5jcHVfYnVmKTsKKworICAgICAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9PRkZMT0FEX05VTUJFUihnZXRfdGltZXJfZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY19vZmZsb2FkX2NyZWF0ZV9idWZfbWljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiQ3JlYXRpbmcgYnVmZmVyIGZvciBzaW5rOiBzaXplICVsbGQsIG9mZnNldCAlZCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiZmxhZ3MgPTB4JXhcbiIsIGJ1ZmZlcl9zaXplIC0gYWxsb2NfZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPm1pY19vZmZzZXQsIGJ1ZmZlcl9mbGFncyk7CisKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBNSUMgYnVmZmVyCisgICAgICAgICAgICByZXMgPSBDT0k6OkJ1ZmZlckNyZWF0ZShidWZmZXJfc2l6ZSAtIGFsbG9jX2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQlVGRkVSX05PUk1BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1fZGV2aWNlLmdldF9wcm9jZXNzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHRyX2RhdGEtPm1pY19idWYpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1faXNfbWFuZGF0b3J5KSB7CisgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfY3JlYXRlLCByZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdHJfZGF0YS0+YWxsb2NfcHRyX2RhdGFfbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIG1ha2UgYnVmZmVyIHZhbGlkIG9uIHRoZSBkZXZpY2UuCisgICAgICAgICAgICByZXMgPSBDT0k6OkJ1ZmZlclNldFN0YXRlKHB0cl9kYXRhLT5taWNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2RldmljZS5nZXRfcHJvY2VzcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQlVGRkVSX1ZBTElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQlVGRkVSX05PX01PVkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDApOworICAgICAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1faXNfbWFuZGF0b3J5KSB7CisgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfc2V0X3N0YXRlLCByZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdHJfZGF0YS0+YWxsb2NfcHRyX2RhdGFfbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlcyA9IENPSTo6QnVmZmVyU2V0U3RhdGUocHRyX2RhdGEtPm1pY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9QUk9DRVNTX1NPVVJDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0JVRkZFUl9JTlZBTElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQlVGRkVSX05PX01PVkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDApOworICAgICAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1faXNfbWFuZGF0b3J5KSB7CisgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfc2V0X3N0YXRlLCByZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdHJfZGF0YS0+YWxsb2NfcHRyX2RhdGFfbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdHJfZGF0YS0+YWxsb2NfZGlzcCA9IGFsbG9jX2Rpc3A7CisgICAgICAgIHB0cl9kYXRhLT5hbGxvY19wdHJfZGF0YV9sb2NrLnVubG9jaygpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbXV0ZXhfbG9ja2VyX3QgbG9ja2VyKHB0cl9kYXRhLT5hbGxvY19wdHJfZGF0YV9sb2NrKTsKKworICAgICAgICBPRkZMT0FEX1RSQUNFKDMsICJGb3VuZCBleGlzdGluZyBhc3NvY2lhdGlvbjogYWRkciAlcCwgbGVuZ3RoICVsbGQsICIKKyAgICAgICAgICAgICAgICAgICAgICAiaXNfc3RhdGljICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5jcHVfYWRkci5zdGFydCgpLCBwdHJfZGF0YS0+Y3B1X2FkZHIubGVuZ3RoKCksCisgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPmlzX3N0YXRpYyk7CisKKyAgICAgICAgLy8gVGhpcyBpcyBub3QgYSBuZXcgZW50cnkuIE1ha2Ugc3VyZSB0aGF0IHByb3ZpZGVkIGFkZHJlc3MgcmFuZ2UgZml0cworICAgICAgICAvLyBpbnRvIGV4aXN0aW5nIG9uZS4KKyAgICAgICAgTWVtUmFuZ2UgYWRkcl9yYW5nZShiYXNlLCBsZW5ndGggLSBwdHJfZGF0YS0+YWxsb2NfZGlzcCk7CisgICAgICAgIGlmICghcHRyX2RhdGEtPmNwdV9hZGRyLmNvbnRhaW5zKGFkZHJfcmFuZ2UpKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfYmFkX3B0cl9tZW1fcmFuZ2UpOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIHRoZSBlbnRyeSBpcyBhc3NvY2lhdGVkIHdpdGggc3RhdGljIGRhdGEgaXQgbWF5IG5vdCBoYXZlIGJ1ZmZlcnMKKyAgICAgICAgLy8gY3JlYXRlZCBiZWNhdXNlIHRoZXkgYXJlIGNyZWF0ZWQgb24gZGVtYW5kLgorICAgICAgICBpZiAocHRyX2RhdGEtPmlzX3N0YXRpYyAmJiAhaW5pdF9zdGF0aWNfcHRyX2RhdGEocHRyX2RhdGEpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBPZmZsb2FkRGVzY3JpcHRvcjo6ZmluZF9wdHJfZGF0YSgKKyAgICBQdHJEYXRhKiAmcHRyX2RhdGEsCisgICAgdm9pZCAqYmFzZSwKKyAgICBpbnQ2NF90IGRpc3AsCisgICAgaW50NjRfdCBzaXplLAorICAgIGJvb2wgcmVwb3J0X2Vycm9yCispCit7CisgICAgLy8gdG90YWwgbGVuZ3RoIG9mIGJhc2UKKyAgICBpbnQ2NF90IGxlbmd0aCA9IGRpc3AgKyBzaXplOworCisgICAgT0ZGTE9BRF9UUkFDRSgzLCAiTG9va2luZyBmb3IgYXNzb2NpYXRpb24gZm9yIGRhdGE6IGFkZHIgJXAsICIKKyAgICAgICAgICAgICAgICAgICJsZW5ndGggJWxsZFxuIiwgYmFzZSwgbGVuZ3RoKTsKKworICAgIC8vIGZpbmQgZXhpc3RpbmcgYXNzb2NpYXRpb24gaW4gcG9pbnRlciB0YWJsZQorICAgIHB0cl9kYXRhID0gbV9kZXZpY2UuZmluZF9wdHJfZGF0YShiYXNlKTsKKyAgICBpZiAocHRyX2RhdGEgPT0gMCkgeworICAgICAgICBpZiAocmVwb3J0X2Vycm9yKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfbm9fcHRyX2RhdGEsIGJhc2UpOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorICAgICAgICBPRkZMT0FEX1RSQUNFKDMsICJBc3NvY2lhdGlvbiBkb2VzIG5vdCBleGlzdFxuIik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIE9GRkxPQURfVFJBQ0UoMywgIkZvdW5kIGFzc29jaWF0aW9uOiBiYXNlICVwLCBsZW5ndGggJWxsZCwgaXNfc3RhdGljICVkXG4iLAorICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPmNwdV9hZGRyLnN0YXJ0KCksIHB0cl9kYXRhLT5jcHVfYWRkci5sZW5ndGgoKSwKKyAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5pc19zdGF0aWMpOworCisgICAgLy8gbWFrZSBzdXJlIHRoYXQgcHJvdmlkZWQgYWRkcmVzcyByYW5nZSBmaXRzIGludG8gZXhpc3Rpbmcgb25lCisgICAgTWVtUmFuZ2UgYWRkcl9yYW5nZShiYXNlLCBsZW5ndGgpOworICAgIGlmICghcHRyX2RhdGEtPmNwdV9hZGRyLmNvbnRhaW5zKGFkZHJfcmFuZ2UpKSB7CisgICAgICAgIGlmIChyZXBvcnRfZXJyb3IpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19iYWRfcHRyX21lbV9yYW5nZSk7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgICAgIE9GRkxPQURfVFJBQ0UoMywgIkV4aXN0aW5nIGFzc29jaWF0aW9uIHBhcnRpYWxseSBvdmVybGFwcyB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgICAiZGF0YSBhZGRyZXNzIHJhbmdlXG4iKTsKKyAgICAgICAgcHRyX2RhdGEgPSAwOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBpZiB0aGUgZW50cnkgaXMgYXNzb2NpYXRlZCB3aXRoIHN0YXRpYyBkYXRhIGl0IG1heSBub3QgaGF2ZSBidWZmZXJzCisgICAgLy8gY3JlYXRlZCBiZWNhdXNlIHRoZXkgYXJlIGNyZWF0ZWQgb24gZGVtYW5kLgorICAgIGlmIChwdHJfZGF0YS0+aXNfc3RhdGljICYmICFpbml0X3N0YXRpY19wdHJfZGF0YShwdHJfZGF0YSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE9mZmxvYWREZXNjcmlwdG9yOjppbml0X3N0YXRpY19wdHJfZGF0YShQdHJEYXRhICpwdHJfZGF0YSkKK3sKKyAgICBPZmZsb2FkVGltZXIgdGltZXIoZ2V0X3RpbWVyX2RhdGEoKSwgY19vZmZsb2FkX2hvc3RfYWxsb2NfYnVmZmVycyk7CisKKyAgICBpZiAocHRyX2RhdGEtPmNwdV9idWYgPT0gMCkgeworICAgICAgICBPRkZMT0FEX1RSQUNFKDMsICJDcmVhdGluZyBidWZmZXIgZnJvbSBzb3VyY2UgbWVtb3J5ICVsbHhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPmNwdV9hZGRyLnN0YXJ0KCkpOworCisgICAgICAgIENPSVJFU1VMVCByZXMgPSBDT0k6OkJ1ZmZlckNyZWF0ZUZyb21NZW1vcnkoCisgICAgICAgICAgICBwdHJfZGF0YS0+Y3B1X2FkZHIubGVuZ3RoKCksCisgICAgICAgICAgICBDT0lfQlVGRkVSX05PUk1BTCwKKyAgICAgICAgICAgIDAsCisgICAgICAgICAgICBjb25zdF9jYXN0PHZvaWQqPihwdHJfZGF0YS0+Y3B1X2FkZHIuc3RhcnQoKSksCisgICAgICAgICAgICAxLCAmbV9kZXZpY2UuZ2V0X3Byb2Nlc3MoKSwKKyAgICAgICAgICAgICZwdHJfZGF0YS0+Y3B1X2J1Zik7CisKKyAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfY3JlYXRlX2Zyb21fbWVtLCByZXMpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHB0cl9kYXRhLT5taWNfYnVmID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9UUkFDRSgzLCAiQ3JlYXRpbmcgYnVmZmVyIGZyb20gc2luayBtZW1vcnkgJWxseFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YS0+bWljX2FkZHIpOworCisgICAgICAgIENPSVJFU1VMVCByZXMgPSBDT0k6OkJ1ZmZlckNyZWF0ZUZyb21NZW1vcnkoCisgICAgICAgICAgICBwdHJfZGF0YS0+Y3B1X2FkZHIubGVuZ3RoKCksCisgICAgICAgICAgICBDT0lfQlVGRkVSX05PUk1BTCwKKyAgICAgICAgICAgIENPSV9TSU5LX01FTU9SWSwKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KHB0cl9kYXRhLT5taWNfYWRkciksCisgICAgICAgICAgICAxLCAmbV9kZXZpY2UuZ2V0X3Byb2Nlc3MoKSwKKyAgICAgICAgICAgICZwdHJfZGF0YS0+bWljX2J1Zik7CisKKyAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfY3JlYXRlX2Zyb21fbWVtLCByZXMpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgT2ZmbG9hZERlc2NyaXB0b3I6OmluaXRfbWljX2FkZHJlc3MoUHRyRGF0YSAqcHRyX2RhdGEpCit7CisgICAgaWYgKHB0cl9kYXRhLT5taWNfYnVmICE9IDAgJiYgcHRyX2RhdGEtPm1pY19hZGRyID09IDApIHsKKyAgICAgICAgQ09JUkVTVUxUIHJlcyA9IENPSTo6QnVmZmVyR2V0U2lua0FkZHJlc3MocHRyX2RhdGEtPm1pY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwdHJfZGF0YS0+bWljX2FkZHIpOworICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChtX2lzX21hbmRhdG9yeSkgeworICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfZ2V0X2FkZHJlc3MsIHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgT2ZmbG9hZERlc2NyaXB0b3I6Om51bGxpZnlfdGFyZ2V0X3N0YWNrKAorICAgIENPSUJVRkZFUiB0YXJnX2J1ZiwKKyAgICB1aW50NjRfdCBzaXplCispCit7CisgICAgY2hhciAqIHB0ciA9IChjaGFyKiltYWxsb2Moc2l6ZSk7CisgICAgQ09JUkVTVUxUIHJlczsKKworICAgIG1lbXNldChwdHIsIDAsIHNpemUpOworICAgIHJlcyA9IENPSTo6QnVmZmVyV3JpdGUoCisgICAgICAgIHRhcmdfYnVmLAorICAgICAgICAwLAorICAgICAgICBwdHIsCisgICAgICAgIHNpemUsCisgICAgICAgIENPSV9DT1BZX1VOU1BFQ0lGSUVELAorICAgICAgICAwLCAwLCAwKTsKKyAgICBmcmVlKHB0cik7CisgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX3dyaXRlLCByZXMpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBPZmZsb2FkRGVzY3JpcHRvcjo6b2ZmbG9hZF9zdGFja19tZW1vcnlfbWFuYWdlcigKKyAgICBjb25zdCB2b2lkICogc3RhY2tfYmVnaW4sCisgICAgaW50ICByb3V0aW5lX2lkLAorICAgIGludCAgYnVmX3NpemUsCisgICAgaW50ICBhbGlnbiwKKyAgICBib29sICppc19uZXcpCit7CisgICAgbXV0ZXhfbG9ja2VyX3QgbG9ja2VyKHN0YWNrX2FsbG9jX2xvY2spOworCisgICAgUGVyc2lzdERhdGEgKiBuZXdfZWw7CisgICAgUGVyc2lzdERhdGFMaXN0OjppdGVyYXRvciBpdF9iZWdpbiA9IG1fZGV2aWNlLm1fcGVyc2lzdF9saXN0LmJlZ2luKCk7CisgICAgUGVyc2lzdERhdGFMaXN0OjppdGVyYXRvciBpdF9lbmQ7CisgICAgaW50IGVyYXNlID0gMDsKKworICAgICppc19uZXcgPSBmYWxzZTsKKworICAgIGZvciAoUGVyc2lzdERhdGFMaXN0OjppdGVyYXRvciBpdCA9IG1fZGV2aWNlLm1fcGVyc2lzdF9saXN0LmJlZ2luKCk7CisgICAgICAgIGl0ICE9IG1fZGV2aWNlLm1fcGVyc2lzdF9saXN0LmVuZCgpOyBpdCsrKSB7CisgICAgICAgIFBlcnNpc3REYXRhIGN1cl9lbCA9ICppdDsKKworICAgICAgICBpZiAoc3RhY2tfYmVnaW4gPiBpdC0+c3RhY2tfY3B1X2FkZHIpIHsKKyAgICAgICAgICAgIC8vIHRoaXMgc3RhY2sgZGF0YSBtdXN0IGJlIGRlc3Ryb3llZAorICAgICAgICAgICAgbV9kZXN0cm95X3N0YWNrLnB1c2hfZnJvbnQoY3VyX2VsLnN0YWNrX3B0cl9kYXRhKTsKKyAgICAgICAgICAgIGl0X2VuZCA9IGl0OworICAgICAgICAgICAgZXJhc2UrKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzdGFja19iZWdpbiA9PSBpdC0+c3RhY2tfY3B1X2FkZHIpIHsKKyAgICAgICAgICAgIGlmIChyb3V0aW5lX2lkICE9IGl0LT4gcm91dGluZV9pZCkgeworICAgICAgICAgICAgICAgIC8vIHRoaXMgc3RhY2sgZGF0YSBtdXN0IGJlIGRlc3Ryb3llZAorICAgICAgICAgICAgICAgIG1fZGVzdHJveV9zdGFjay5wdXNoX2Zyb250KGN1cl9lbC5zdGFja19wdHJfZGF0YSk7CisgICAgICAgICAgICAgICAgaXRfZW5kID0gaXQ7CisgICAgICAgICAgICAgICAgZXJhc2UrKzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHN0YWNrIGRhdGEgaXMgcmV1c2VkCisgICAgICAgICAgICAgICAgbV9zdGFja19wdHJfZGF0YSA9IGl0LT5zdGFja19wdHJfZGF0YTsKKyAgICAgICAgICAgICAgICBpZiAoZXJhc2UgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBvYnNvbGV0ZSBzdGFjayBzZWN0aW9ucyBtdXN0IGJlIGVyYXNlZCBmcm9tIHRoZSBsaXN0CisgICAgICAgICAgICAgICAgICAgIG1fZGV2aWNlLm1fcGVyc2lzdF9saXN0LmVyYXNlKGl0X2JlZ2luLCArK2l0X2VuZCk7CisKKyAgICAgICAgICAgICAgICAgICAgbV9pbl9kYXRhbGVuICs9CisgICAgICAgICAgICAgICAgICAgICAgICBlcmFzZSAqIHNpemVvZihuZXdfZWwtPnN0YWNrX3B0cl9kYXRhLT5taWNfYWRkcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIE9GRkxPQURfVFJBQ0UoMywgIlJldXNlIG9mIHN0YWNrIGJ1ZmZlciB3aXRoIGFkZHIgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YWNrX3B0cl9kYXRhLT5taWNfYWRkcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc3RhY2tfYmVnaW4gPCBpdC0+c3RhY2tfY3B1X2FkZHIpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGVyYXNlID4gMCkgeworICAgICAgICAvLyBhbGwgb2Jzb2xldGUgc3RhY2sgc2VjdGlvbnMgbXVzdCBiZSBlcmFzZWQgZnJvbSB0aGUgbGlzdAorICAgICAgICBtX2RldmljZS5tX3BlcnNpc3RfbGlzdC5lcmFzZShpdF9iZWdpbiwgKytpdF9lbmQpOworICAgICAgICBtX2luX2RhdGFsZW4gKz0gZXJhc2UgKiBzaXplb2YobmV3X2VsLT5zdGFja19wdHJfZGF0YS0+bWljX2FkZHIpOworICAgIH0KKyAgICAvLyBuZXcgc3RhY2sgdGFibGUgaXMgY3JlYXRlZAorICAgIG5ld19lbCA9IG5ldyBQZXJzaXN0RGF0YShzdGFja19iZWdpbiwgcm91dGluZV9pZCwgYnVmX3NpemUpOworICAgIC8vIGNyZWF0ZSBNSUMgYnVmZmVyCisgICAgQ09JUkVTVUxUIHJlczsKKyAgICB1aW50MzJfdCBidWZmZXJfZmxhZ3MgPSAwOworCisgICAgLy8gY3JlYXRlIGJ1ZmZlciB3aXRoIGxhcmdlIHBhZ2VzIGlmIGRhdGEgbGVuZ3RoIGV4Y2VlZHMKKyAgICAvLyBsYXJnZSBwYWdlIHRocmVzaG9sZAorICAgIGlmIChidWZfc2l6ZSA+PSBfX29mZmxvYWRfdXNlXzJtYl9idWZmZXJzKSB7CisgICAgICAgIGJ1ZmZlcl9mbGFncyA9IENPSV9PUFRJTUlaRV9IVUdFX1BBR0VfU0laRTsKKyAgICB9CisgICAgcmVzID0gQ09JOjpCdWZmZXJDcmVhdGUoYnVmX3NpemUsCisgICAgICAgIENPSV9CVUZGRVJfTk9STUFMLAorICAgICAgICBidWZmZXJfZmxhZ3MsCisgICAgICAgIDAsCisgICAgICAgIDEsCisgICAgICAgICZtX2RldmljZS5nZXRfcHJvY2VzcygpLAorICAgICAgICAmbmV3X2VsLT5zdGFja19wdHJfZGF0YS0+bWljX2J1Zik7CisgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChtX2lzX21hbmRhdG9yeSkgeworICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl9jcmVhdGUsIHJlcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBtYWtlIGJ1ZmZlciB2YWxpZCBvbiB0aGUgZGV2aWNlLgorICAgIHJlcyA9IENPSTo6QnVmZmVyU2V0U3RhdGUobmV3X2VsLT5zdGFja19wdHJfZGF0YS0+bWljX2J1ZiwKKyAgICAgICAgbV9kZXZpY2UuZ2V0X3Byb2Nlc3MoKSwKKyAgICAgICAgQ09JX0JVRkZFUl9WQUxJRCwKKyAgICAgICAgQ09JX0JVRkZFUl9OT19NT1ZFLAorICAgICAgICAwLCAwLCAwKTsKKyAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG1faXNfbWFuZGF0b3J5KSB7CisgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX3NldF9zdGF0ZSwgcmVzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJlcyA9IENPSTo6QnVmZmVyU2V0U3RhdGUobmV3X2VsLT5zdGFja19wdHJfZGF0YS0+bWljX2J1ZiwKKyAgICAgICAgQ09JX1BST0NFU1NfU09VUkNFLAorICAgICAgICBDT0lfQlVGRkVSX0lOVkFMSUQsCisgICAgICAgIENPSV9CVUZGRVJfTk9fTU9WRSwKKyAgICAgICAgMCwgMCwgMCk7CisgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChtX2lzX21hbmRhdG9yeSkgeworICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl9zZXRfc3RhdGUsIHJlcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBwZXJzaXN0ZW5jZSBhbGdvcml0aG0gcmVxdWlyZXMgdGFyZ2V0IHN0YWNrIGluaXRpYWx5IHRvIGJlIG51bGxpZmllZAorICAgIGlmICghbnVsbGlmeV90YXJnZXRfc3RhY2sobmV3X2VsLT5zdGFja19wdHJfZGF0YS0+bWljX2J1ZiwgYnVmX3NpemUpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtX3N0YWNrX3B0cl9kYXRhID0gbmV3X2VsLT5zdGFja19wdHJfZGF0YTsKKyAgICBpbml0X21pY19hZGRyZXNzKG1fc3RhY2tfcHRyX2RhdGEpOworICAgIE9GRkxPQURfVFJBQ0UoMywgIkFsbG9jYXRpbmcgc3RhY2sgYnVmZmVyIHdpdGggYWRkciAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBtX3N0YWNrX3B0cl9kYXRhLT5taWNfYWRkcik7CisgICAgbV9kZXZpY2UubV9wZXJzaXN0X2xpc3QucHVzaF9mcm9udCgqbmV3X2VsKTsKKyAgICBpbml0X21pY19hZGRyZXNzKG5ld19lbC0+c3RhY2tfcHRyX2RhdGEpOworICAgICppc19uZXcgPSB0cnVlOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE9mZmxvYWREZXNjcmlwdG9yOjpzZXR1cF9kZXNjcmlwdG9ycygKKyAgICBWYXJEZXNjICp2YXJzLAorICAgIFZhckRlc2MyICp2YXJzMiwKKyAgICBpbnQgdmFyc190b3RhbCwKKyAgICBpbnQgZW50cnlfaWQsCisgICAgY29uc3Qgdm9pZCAqc3RhY2tfYWRkcgorKQoreworICAgIENPSVJFU1VMVCByZXM7CisKKyAgICBPZmZsb2FkVGltZXIgdGltZXIoZ2V0X3RpbWVyX2RhdGEoKSwgY19vZmZsb2FkX2hvc3Rfc2V0dXBfYnVmZmVycyk7CisKKyAgICAvLyBtYWtlIGEgY29weSBvZiB2YXJpYWJsZSBkZXNjcmlwdG9ycworICAgIG1fdmFyc190b3RhbCA9IHZhcnNfdG90YWw7CisgICAgaWYgKHZhcnNfdG90YWwgPiAwKSB7CisgICAgICAgIG1fdmFycyA9IChWYXJEZXNjKikgbWFsbG9jKG1fdmFyc190b3RhbCAqIHNpemVvZihWYXJEZXNjKSk7CisgICAgICAgIG1lbWNweShtX3ZhcnMsIHZhcnMsIG1fdmFyc190b3RhbCAqIHNpemVvZihWYXJEZXNjKSk7CisgICAgICAgIG1fdmFyc19leHRyYSA9IChWYXJFeHRyYSopIG1hbGxvYyhtX3ZhcnNfdG90YWwgKiBzaXplb2YoVmFyRXh0cmEpKTsKKyAgICB9CisKKyAgICAvLyBkZXBlbmRlbmNpZXMKKyAgICBtX2luX2RlcHMgPSAoQ09JRVZFTlQqKSBtYWxsb2Moc2l6ZW9mKENPSUVWRU5UKSAqIChtX3ZhcnNfdG90YWwgICsgMSkpOworICAgIGlmIChtX3ZhcnNfdG90YWwgPiAwKSB7CisgICAgICAgIG1fb3V0X2RlcHMgPSAoQ09JRVZFTlQqKSBtYWxsb2Moc2l6ZW9mKENPSUVWRU5UKSAqIG1fdmFyc190b3RhbCk7CisgICAgfQorCisgICAgLy8gY29weWluL2NvcHlvdXQgZGF0YSBsZW5ndGgKKyAgICBtX2luX2RhdGFsZW4gPSAwOworICAgIG1fb3V0X2RhdGFsZW4gPSAwOworCisgICAgLy8gRmlyc3QgcGFzcyBvdmVyIHZhcmlhYmxlIGRlc2NyaXB0b3JzCisgICAgLy8gLSBDYWxjdWxhdGUgc2l6ZSBvZiB0aGUgaW5wdXQgYW5kIG91dHB1dCBub24tcG9pbnRlciBkYXRhCisgICAgLy8gLSBBbGxvY2F0ZSBidWZmZXJzIGZvciBpbnB1dCBhbmQgb3V0cHV0IHBvaW50ZXJzCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX3ZhcnNfdG90YWw7IGkrKykgeworICAgICAgICB2b2lkKiAgIGFsbG9jX2Jhc2UgPSBOVUxMOworICAgICAgICBpbnQ2NF90IGFsbG9jX2Rpc3AgPSAwOworICAgICAgICBpbnQ2NF90IGFsbG9jX3NpemU7CisgICAgICAgIGJvb2wgICAgc3JjX2lzX2Zvcl9taWMgPSAobV92YXJzW2ldLmRpcmVjdGlvbi5vdXQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uaW50byA9PSBOVUxMKTsKKworICAgICAgICBjb25zdCBjaGFyICp2YXJfc25hbWUgPSAiIjsKKyAgICAgICAgaWYgKHZhcnMyICE9IE5VTEwgJiYgaSA8IHZhcnNfdG90YWwpIHsKKyAgICAgICAgICAgIGlmICh2YXJzMltpXS5zbmFtZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgdmFyX3NuYW1lID0gdmFyczJbaV0uc25hbWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgT0ZGTE9BRF9UUkFDRSgyLCAiICAgVmFyRGVzYyAlZCwgdmFyPSVzLCAlcywgJXNcbiIsCisgICAgICAgICAgICBpLCB2YXJfc25hbWUsCisgICAgICAgICAgICB2YXJkZXNjX2RpcmVjdGlvbl9hc19zdHJpbmdbbV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzXSwKKyAgICAgICAgICAgIHZhcmRlc2NfdHlwZV9hc19zdHJpbmdbbV92YXJzW2ldLnR5cGUuc3JjXSk7CisgICAgICAgIGlmICh2YXJzMiAhPSBOVUxMICYmIGkgPCB2YXJzX3RvdGFsICYmIHZhcnMyW2ldLmRuYW1lICE9IE5VTEwpIHsKKyAgICAgICAgICAgIE9GRkxPQURfVFJBQ0UoMiwgIiAgICAgICAgICAgICAgaW50bz0lcywgJXNcbiIsIHZhcnMyW2ldLmRuYW1lLAorICAgICAgICAgICAgICAgIHZhcmRlc2NfdHlwZV9hc19zdHJpbmdbbV92YXJzW2ldLnR5cGUuZHN0XSk7CisgICAgICAgIH0KKyAgICAgICAgT0ZGTE9BRF9UUkFDRSgyLAorICAgICAgICAgICAgIiAgICAgICAgICAgICAgdHlwZV9zcmM9JWQsIHR5cGVfZHN0bj0lZCwgZGlyZWN0aW9uPSVkLCAiCisgICAgICAgICAgICAiYWxsb2NfaWY9JWQsIGZyZWVfaWY9JWQsIGFsaWduPSVkLCBtaWNfb2Zmc2V0PSVkLCBmbGFncz0weCV4LCAiCisgICAgICAgICAgICAib2Zmc2V0PSVsbGQsIHNpemU9JWxsZCwgY291bnQvZGlzcD0lbGxkLCBwdHI9JXAsIGludG89JXBcbiIsCisgICAgICAgICAgICBtX3ZhcnNbaV0udHlwZS5zcmMsCisgICAgICAgICAgICBtX3ZhcnNbaV0udHlwZS5kc3QsCisgICAgICAgICAgICBtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMsCisgICAgICAgICAgICBtX3ZhcnNbaV0uYWxsb2NfaWYsCisgICAgICAgICAgICBtX3ZhcnNbaV0uZnJlZV9pZiwKKyAgICAgICAgICAgIG1fdmFyc1tpXS5hbGlnbiwKKyAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0LAorICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmJpdHMsCisgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0LAorICAgICAgICAgICAgbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICBtX3ZhcnNbaV0uY291bnQsCisgICAgICAgICAgICBtX3ZhcnNbaV0ucHRyLAorICAgICAgICAgICAgbV92YXJzW2ldLmludG8pOworCisgICAgICAgIGlmIChtX3ZhcnNbaV0uYWxsb2MgIT0gTlVMTCkgeworICAgICAgICAgICAgLy8gYXJyYXkgZGVzY3JpcHRvcgorICAgICAgICAgICAgY29uc3QgYXJyX2Rlc2MgKmFwID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KG1fdmFyc1tpXS5hbGxvYyk7CisKKyAgICAgICAgICAgIC8vIGRlYnVnIGR1bXAKKyAgICAgICAgICAgIF9fYXJyX2Rlc2NfZHVtcCgiICAgICIsICJBTExPQyIsIGFwLCAwKTsKKworICAgICAgICAgICAgX19hcnJfZGF0YV9vZmZzZXRfYW5kX2xlbmd0aChhcCwgYWxsb2NfZGlzcCwgYWxsb2Nfc2l6ZSk7CisKKyAgICAgICAgICAgIGFsbG9jX2Jhc2UgPSByZWludGVycHJldF9jYXN0PHZvaWQqPihhcC0+YmFzZSk7CisgICAgICAgIH0KKworICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3AgPSAwOworICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X29mZnNldCA9IDA7CisgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YSA9IDA7CisgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMgPSAwOworICAgICAgICBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfZHN0ID0gMDsKKyAgICAgICAgLy8gZmxhZyBpc19hcnJfcHRyX2VsIGlzIDEgb25seSBmb3IgdmFyX2Rlc2NzIGdlbmVyYXRlZAorICAgICAgICAvLyBmb3IgY19kYXRhX3B0cl9hcnJheSB0eXBlCisgICAgICAgIGlmIChpIDwgdmFyc190b3RhbCkgeworICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmlzX2Fycl9wdHJfZWwgPSAwOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChtX3ZhcnNbaV0udHlwZS5zcmMpIHsKKyAgICAgICAgICAgIGNhc2UgY19kYXRhX3B0cl9hcnJheToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFycl9kZXNjICphcDsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFyRGVzYzMgKnZkMyA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBWYXJEZXNjMyo+KG1fdmFyc1tpXS5wdHIpOworICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MgPSB2ZDMtPmFycmF5X2ZpZWxkczsKKyAgICAgICAgICAgICAgICAgICAgT0ZGTE9BRF9UUkFDRSgyLAorICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgcG9pbnRlciBhcnJheSBmbGFncyA9ICUwNHhcbiIsIGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgT0ZGTE9BRF9UUkFDRSgyLAorICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgcG9pbnRlciBhcnJheSB0eXBlIGlzICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgdmFyZGVzY190eXBlX2FzX3N0cmluZ1tmbGFncyAmIDB4M2ZdKTsKKyAgICAgICAgICAgICAgICAgICAgYXAgPSBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KHZkMy0+cHRyX2FycmF5KTsKKyAgICAgICAgICAgICAgICAgICAgX19hcnJfZGVzY19kdW1wKCIgICAgICAgICAgICAgICIsICJwdHIgYXJyYXkiLCBhcCwgMCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uaW50bykgeworICAgICAgICAgICAgICAgICAgICAgICAgYXAgPSBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KG1fdmFyc1tpXS5pbnRvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fYXJyX2Rlc2NfZHVtcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAiLCAiaW50byBhcnJheSIsIGFwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgKDE8PGZsYWdfYWxpZ25faXNfYXJyYXkpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4odmQzLT5hbGlnbl9hcnJheSk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2Fycl9kZXNjX2R1bXAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgIiwgImFsaWduIGFycmF5IiwgYXAsIDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiAoMTw8ZmxhZ19hbGxvY19pZl9pc19hcnJheSkpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPih2ZDMtPmFsbG9jX2lmX2FycmF5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fYXJyX2Rlc2NfZHVtcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAiLCAiYWxsb2NfaWYgYXJyYXkiLCBhcCwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKChmbGFncyAmICgxPDxmbGFnX2ZyZWVfaWZfaXNfYXJyYXkpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4odmQzLT5mcmVlX2lmX2FycmF5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fYXJyX2Rlc2NfZHVtcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAiLCAiZnJlZV9pZiBhcnJheSIsIGFwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgKDE8PGZsYWdfZXh0ZW50X3N0YXJ0X2lzX2FycmF5KSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXAgPSBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KHZkMy0+ZXh0ZW50X3N0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fYXJyX2Rlc2NfZHVtcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAiLCAiZXh0ZW50X3N0YXJ0IGFycmF5IiwgYXAsIDApOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmCisgICAgICAgICAgICAgICAgICAgICAgICAoMTw8ZmxhZ19leHRlbnRfc3RhcnRfaXNfc2NhbGFyKSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgT0ZGTE9BRF9UUkFDRSgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgIGV4dGVudF9zdGFydCBzY2FsYXIgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCl2ZDMtPmV4dGVudF9zdGFydCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKChmbGFncyAmICgxPDxmbGFnX2V4dGVudF9lbGVtZW50c19pc19hcnJheSkpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZDMtPmV4dGVudF9lbGVtZW50cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2Fycl9kZXNjX2R1bXAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgIiwgImV4dGVudF9lbGVtZW50cyBhcnJheSIsIGFwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoZmxhZ3MgJgorICAgICAgICAgICAgICAgICAgICAgICAgKDE8PGZsYWdfZXh0ZW50X2VsZW1lbnRzX2lzX3NjYWxhcikpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVFJBQ0UoMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICBleHRlbnRfZWxlbWVudHMgc2NhbGFyID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDY0X3QpdmQzLT5leHRlbnRfZWxlbWVudHMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiAoMTw8ZmxhZ19pbnRvX3N0YXJ0X2lzX2FycmF5KSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXAgPSBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KHZkMy0+aW50b19zdGFydCk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2Fycl9kZXNjX2R1bXAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgIiwgImludG9fc3RhcnQgYXJyYXkiLCBhcCwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGZsYWdzICYKKyAgICAgICAgICAgICAgICAgICAgICAgICgxPDxmbGFnX2ludG9fc3RhcnRfaXNfc2NhbGFyKSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgT0ZGTE9BRF9UUkFDRSgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgIGludG9fc3RhcnQgc2NhbGFyID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDY0X3QpdmQzLT5pbnRvX3N0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgKDE8PGZsYWdfaW50b19lbGVtZW50c19pc19hcnJheSkpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPih2ZDMtPmludG9fZWxlbWVudHMpOworICAgICAgICAgICAgICAgICAgICAgICAgX19hcnJfZGVzY19kdW1wKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICIsICJpbnRvX2VsZW1lbnRzIGFycmF5IiwgYXAsIDApOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmCisgICAgICAgICAgICAgICAgICAgICAgICAoMTw8ZmxhZ19pbnRvX2VsZW1lbnRzX2lzX3NjYWxhcikpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVFJBQ0UoMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICBpbnRvX2VsZW1lbnRzIHNjYWxhciA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KXZkMy0+aW50b19lbGVtZW50cyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKChmbGFncyAmICgxPDxmbGFnX2FsbG9jX3N0YXJ0X2lzX2FycmF5KSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXAgPSBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KHZkMy0+YWxsb2Nfc3RhcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgX19hcnJfZGVzY19kdW1wKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICIsICJhbGxvY19zdGFydCBhcnJheSIsIGFwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoZmxhZ3MgJgorICAgICAgICAgICAgICAgICAgICAgICAgKDE8PGZsYWdfYWxsb2Nfc3RhcnRfaXNfc2NhbGFyKSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgT0ZGTE9BRF9UUkFDRSgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgIGFsbG9jX3N0YXJ0IHNjYWxhciA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KXZkMy0+YWxsb2Nfc3RhcnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiAoMTw8ZmxhZ19hbGxvY19lbGVtZW50c19pc19hcnJheSkpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPih2ZDMtPmFsbG9jX2VsZW1lbnRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fYXJyX2Rlc2NfZHVtcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAiLCAiYWxsb2NfZWxlbWVudHMgYXJyYXkiLCBhcCwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGZsYWdzICYKKyAgICAgICAgICAgICAgICAgICAgICAgICgxPDxmbGFnX2FsbG9jX2VsZW1lbnRzX2lzX3NjYWxhcikpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVFJBQ0UoMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICBhbGxvY19lbGVtZW50cyBzY2FsYXIgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCl2ZDMtPmFsbG9jX2VsZW1lbnRzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWdlbl92YXJfZGVzY3NfZm9yX3BvaW50ZXJfYXJyYXkoaSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX2RhdGE6CisgICAgICAgICAgICBjYXNlIGNfdm9pZF9wdHI6CisgICAgICAgICAgICBjYXNlIGNfY2Vhbl92YXI6CisgICAgICAgICAgICAgICAgLy8gSW4gYWxsIHVzZXMgbGF0ZXIKKyAgICAgICAgICAgICAgICAvLyBWYXJEZXNjLnNpemUgd2lsbCBoYXZlIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEgdG8gYmUKKyAgICAgICAgICAgICAgICAvLyB0cmFuc2ZlcnJlZAorICAgICAgICAgICAgICAgIC8vIFZhckRlc2MuZGlzcCB3aWxsIGhhdmUgYW4gb2Zmc2V0IGZyb20gYmFzZQorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0udHlwZS5zcmMgPT0gY19jZWFuX3ZhcikgeworICAgICAgICAgICAgICAgICAgICAvLyBhcnJheSBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFycl9kZXNjICphcCA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KG1fdmFyc1tpXS5wdHIpOworCisgICAgICAgICAgICAgICAgICAgIC8vIGRlYnVnIGR1bXAKKyAgICAgICAgICAgICAgICAgICAgX19hcnJfZGVzY19kdW1wKCIiLCAiSU4vT1VUIiwgYXAsIDApOworCisgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldCBhbmQgbGVuZ3RoIGFyZSBkZXJpdmVkIGZyb20gdGhlIGFycmF5IGRlc2NyaXB0b3IKKyAgICAgICAgICAgICAgICAgICAgX19hcnJfZGF0YV9vZmZzZXRfYW5kX2xlbmd0aChhcCwgbV92YXJzW2ldLmRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWlzX2Fycl9kZXNjX2NvbnRpZ3VvdXMoYXApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfbm9uY29udF9zcmMgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX3NyYyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdF9yZWFkX3Jhbmdlc19hcnJfZGVzYyhhcCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gYWxsIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBhYm91dCBsZW5ndGggYW5kIG9mZnNldCBpcworICAgICAgICAgICAgICAgICAgICAvLyB0cmFuc2ZlcnJlZCBpbiB2YXIgZGVzY3JpcHRvci4gVGhlcmUgaXMgbm8gbmVlZCB0byBzZW5kCisgICAgICAgICAgICAgICAgICAgIC8vIGFycmF5IGRlc2NyaXB0b3IgdG8gdGhlIHRhcmdldCBzaWRlLgorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ucHRyID0gcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oYXAtPmJhc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUgKj0gbV92YXJzW2ldLmNvdW50OworICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZGlzcCA9IDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cykgeworICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB0cmFuc2ZlciBzaXplID4gMAorICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLnNpemUgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3plcm9fb3JfbmVnX3RyYW5zZmVyX3NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQdHJEYXRhICpwdHJfZGF0YTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluZCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB2YXJpYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaW5kX3B0cl9kYXRhKHB0cl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldCB0byBiYXNlIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVtb3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikgbV92YXJzW2ldLnB0ciAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikgcHRyX2RhdGEtPmNwdV9hZGRyLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5pbnRvID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpY19kc3RuID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhID0gcHRyX2RhdGE7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAobV9pc19vcGVubXApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RhdGljIGRhdGEgaXMgdHJhbnNmZXJyZWQgb25seSBieSBvbXAgdGFyZ2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIGNvbnN0cnVjdCB3aGljaCBwYXNzZXMgemVyb3MgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NfaWYgYW5kIGZyZWVfaWYuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5hbGxvY19pZiB8fCBtX3ZhcnNbaV0uZnJlZV9pZikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9ub2NvcHk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0b0RhdGEgKmF1dG9fZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmFsbG9jX2lmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9fZGF0YSA9IG1fZGV2aWNlLmluc2VydF9hdXRvX2RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ucHRyLCBtX3ZhcnNbaV0uc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9fZGF0YS0+YWRkX3JlZmVyZW5jZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogd2hhdCBzaG91bGQgYmUgZG9uZSBpZiB2YXIgaXMgbm90IGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0YWJsZT8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b19kYXRhID0gbV9kZXZpY2UuZmluZF9hdXRvX2RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ucHRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3IgYXV0b21hdGljIHZhcmlhYmxlcyBkYXRhIGlzIHRyYW5zZmVycmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSBpZiBhbGxvY19pZiA9PSAwICYmIGZyZWVfaWYgPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIHJlZmVyZW5jZSBjb3VudCBpcyAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChtX3ZhcnNbaV0uYWxsb2NfaWYgfHwgbV92YXJzW2ldLmZyZWVfaWYpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9fZGF0YSAhPSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9fZGF0YS0+Z2V0X3JlZmVyZW5jZSgpICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfbm9jb3B5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNhdmUgZGF0YSBmb3IgbGF0ZXIgdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmF1dG9fZGF0YSA9IGF1dG9fZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmluICYmCisgICAgICAgICAgICAgICAgICAgICAgICAhbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpYykgeworICAgICAgICAgICAgICAgICAgICAgICAgbV9pbl9kYXRhbGVuICs9IG1fdmFyc1tpXS5zaXplOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3Igbm9uLXN0YXRpYyB0YXJnZXQgZGVzdGluYXRpb24gZGVmaW5lZCBhcyBDRUFOCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHByZXNzaW9uIHdlIHBhc3MgdG8gdGFyZ2V0IGl0cyBzaXplIGFuZCBkaXN0CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmludG8gPT0gTlVMTCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS50eXBlLnNyYyA9PSBjX2NlYW5fdmFyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbl9kYXRhbGVuICs9IDIgKiBzaXplb2YodWludDY0X3QpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbV9uZWVkX3J1bmZ1bmN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5vdXQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICFtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX291dF9kYXRhbGVuICs9IG1fdmFyc1tpXS5zaXplOworICAgICAgICAgICAgICAgICAgICAgICAgbV9uZWVkX3J1bmZ1bmN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX2R2OgorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMgfHwKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmFsbG9jX2lmIHx8CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mcmVlX2lmKSB7CisgICAgICAgICAgICAgICAgICAgIEFyckRlc2MgKmR2cCA9IHN0YXRpY19jYXN0PEFyckRlc2MqPihtX3ZhcnNbaV0ucHRyKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBkZWJ1ZyBkdW1wCisgICAgICAgICAgICAgICAgICAgIF9fZHZfZGVzY19kdW1wKCJJTi9PVVQiLCBkdnApOworCisgICAgICAgICAgICAgICAgICAgIC8vIHNlbmQgZG9wZSB2ZWN0b3IgY29udGVudHMgZXhjbHVkaW5nIGJhc2UKKyAgICAgICAgICAgICAgICAgICAgbV9pbl9kYXRhbGVuICs9IG1fdmFyc1tpXS5zaXplIC0gc2l6ZW9mKHVpbnQ2NF90KTsKKyAgICAgICAgICAgICAgICAgICAgbV9uZWVkX3J1bmZ1bmN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY19zdHJpbmdfcHRyOgorICAgICAgICAgICAgICAgIGlmICgobV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzIHx8CisgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uYWxsb2NfaWYgfHwKKyAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mcmVlX2lmKSAmJgorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplID0gMTsKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmNvdW50ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbigqc3RhdGljX2Nhc3Q8Y2hhcioqPihtX3ZhcnNbaV0ucHRyKSkgKyAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBmYWxsdGhydSAqLworCisgICAgICAgICAgICBjYXNlIGNfZGF0YV9wdHI6CisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5pc19zdGFja19idWYgJiYKKyAgICAgICAgICAgICAgICAgICAgIW1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cyAmJgorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uYWxsb2NfaWYpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyB2YXJfZGVzYyBpcyBmb3Igc3RhY2sgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbmV3OworCisgICAgICAgICAgICAgICAgICAgIGlmICghb2ZmbG9hZF9zdGFja19tZW1vcnlfbWFuYWdlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja19hZGRyLCBlbnRyeV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uY291bnQsIG1fdmFyc1tpXS5hbGlnbiwgJmlzX25ldykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoaXNfbmV3KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2NvbXB1dGVfYnVmZmVycy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zdGFja19wdHJfZGF0YS0+bWljX2J1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2RldmljZS5tX3BlcnNpc3RfbGlzdC5mcm9udCgpLmNwdV9zdGFja19hZGRyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjaGFyKj4obV92YXJzW2ldLnB0cik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGF0YWxlbiArPSBzaXplb2YobV9zdGFja19wdHJfZGF0YS0+bWljX2FkZHIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplID0gbV9kZXN0cm95X3N0YWNrLnNpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhID0gbV9zdGFja19wdHJfZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBhZGQgcmVmZXJlbmNlIGZvciBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgbV9uZWVkX3J1bmZ1bmN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIGZhbGx0aHJ1ICovCisKKyAgICAgICAgICAgIGNhc2UgY19jZWFuX3Zhcl9wdHI6CisgICAgICAgICAgICBjYXNlIGNfZHZfcHRyOgorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0udHlwZS5zcmMgPT0gY19jZWFuX3Zhcl9wdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXkgZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnJfZGVzYyAqYXAgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPihtX3ZhcnNbaV0ucHRyKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBkZWJ1ZyBkdW1wCisgICAgICAgICAgICAgICAgICAgIF9fYXJyX2Rlc2NfZHVtcCgiIiwgIklOL09VVCIsIGFwLCAxKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQgYW5kIGxlbmd0aCBhcmUgZGVyaXZlZCBmcm9tIHRoZSBhcnJheSBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgICAgIF9fYXJyX2RhdGFfb2Zmc2V0X2FuZF9sZW5ndGgoYXAsIG1fdmFyc1tpXS5kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIWlzX2Fycl9kZXNjX2NvbnRpZ3VvdXMoYXApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfbm9uY29udF9zcmMgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX3NyYyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdF9yZWFkX3Jhbmdlc19hcnJfZGVzYyhhcCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gYWxsIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBhYm91dCBsZW5ndGggYW5kIG9mZnNldCBpcworICAgICAgICAgICAgICAgICAgICAvLyB0cmFuc2ZlcnJlZCBpbiB2YXIgZGVzY3JpcHRvci4gVGhlcmUgaXMgbm8gbmVlZCB0byBzZW5kCisgICAgICAgICAgICAgICAgICAgIC8vIGFycmF5IGRlc2NyaXB0b3IgdG8gdGhlIHRhcmdldCBzaWRlLgorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ucHRyID0gcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oYXAtPmJhc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChtX3ZhcnNbaV0udHlwZS5zcmMgPT0gY19kdl9wdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBzZW5kIERWIHRvIHRoZSBkZXZpY2UgdW5sZXNzIGl0IGlzICdub2NvcHknCisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5hbGxvY19pZiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZyZWVfaWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFyckRlc2MgKmR2cCA9ICpzdGF0aWNfY2FzdDxBcnJEZXNjKio+KG1fdmFyc1tpXS5wdHIpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWJ1ZyBkdW1wCisgICAgICAgICAgICAgICAgICAgICAgICBfX2R2X2Rlc2NfZHVtcCgiSU4vT1VUIiwgZHZwKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBubyBkaXNwbGFjZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpc3AgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY19kYXRhX3B0ciBvciBjX3N0cmluZ19wdHIKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUgKj0gbV92YXJzW2ldLmNvdW50OworICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZGlzcCA9IDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cyB8fAorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uYWxsb2NfaWYgfHwKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZyZWVfaWYpIHsKKyAgICAgICAgICAgICAgICAgICAgUHRyRGF0YSAqcHRyX2RhdGE7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCBidWZmZXIgbGVuZ3RoID49IDAKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5hbGxvY19pZiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpc3AgKyBtX3ZhcnNbaV0uc2l6ZSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY196ZXJvX29yX25lZ19wdHJfbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBiYXNlIGFkZHJlc3MKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqYmFzZSA9ICpzdGF0aWNfY2FzdDx2b2lkKio+KG1fdmFyc1tpXS5wdHIpOworCisgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlIGJ1ZmZlciBpZiB3ZSBoYXZlIG5vIElOVE8gYW5kIGRvbid0IG5lZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGlvbiBmb3IgdGhlIHB0ciBhdCB0YXJnZXQKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19pc19mb3JfbWljKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmlzX3N0YWNrX2J1ZikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBzdGFjayBwZXJzaXN0ZW50IG9iamVjdHMgcHRyIGRhdGEgaXMgY3JlYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5IHZhcl9kZXNjIHdpdGggbnVtYmVyIDAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXRzIHB0cl9kYXRhIGlzIHN0b3JlZCBhdCBtX3N0YWNrX3B0cl9kYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEgPSBtX3N0YWNrX3B0cl9kYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5zaW5rX2FkZHIgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobV92YXJzW2ldLmFsbG9jX2lmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIG5ldyBlbnRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWxsb2NfcHRyX2RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxsb2NfYmFzZSAhPSBOVUxMKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NfZGlzcCA6IG1fdmFyc1tpXS5kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsbG9jX2Jhc2UgIT0gTlVMTCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jX3NpemUgOiBtX3ZhcnNbaV0uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jX2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxsb2NfYmFzZSAhPSBOVUxMKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA6IG1fdmFyc1tpXS5hbGlnbikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YS0+YWRkX3JlZmVyZW5jZSgpID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPm1pY19idWYgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgYnVmZmVyIHRvIHRoZSBsaXN0IG9mIGJ1ZmZlcnMgdGhhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcmUgcGFzc2VkIHRvIGRpc3BhdGNoIGNhbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9jb21wdXRlX2J1ZmZlcnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPm1pY19idWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBzZW5kIGJ1ZmZlciBhZGRyZXNzIHRvIGRldmljZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXB0cl9kYXRhLT5pc19zdGF0aWMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBhZGQgcmVmZXJlbmNlIGZvciBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9uZWVkX3J1bmZ1bmN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGVycm9yX2lmX25vdF9mb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1faXNfb3Blbm1wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvciBvbXAgdGFyZ2V0IHVwZGF0ZSB2YXJpYWJsZSBpcyBpZ25vcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGl0IGRvZXMgbm90IGV4aXN0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1fdmFyc1tpXS5hbGxvY19pZiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIW1fdmFyc1tpXS5mcmVlX2lmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9pZl9ub3RfZm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBleGlzdGluZyBhc3NvY2lhdGlvbiBmcm9tIHBvaW50ZXIgdGFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbmRfcHRyX2RhdGEocHRyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfaWZfbm90X2ZvdW5kKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1faXNfb3Blbm1wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1ha2UgdmFyIG5vY29weSBpZiBpdCBkb2VzIG5vdCBleGlzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX3BhcmFtZXRlcl9ub2NvcHk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1faXNfb3Blbm1wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRhdGEgaXMgdHJhbnNmZXJyZWQgb25seSBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY19pZiA9PSAwICYmIGZyZWVfaWYgPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciByZWZlcmVuY2UgY291bnQgaXMgMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG1fdmFyc1tpXS5hbGxvY19pZiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mcmVlX2lmKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPmdldF9yZWZlcmVuY2UoKSAhPSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfcGFyYW1ldGVyX25vY29weTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YS0+YWxsb2NfZGlzcCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5hbGxvY19kaXNwID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbl9kYXRhbGVuICs9IHNpemVvZihhbGxvY19kaXNwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgYnVmZmVycydzIGFkZHJlc3Mgb24gdGhlIHNpbmsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbml0X21pY19hZGRyZXNzKHB0cl9kYXRhKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbl9kYXRhbGVuICs9IHNpemVvZihwdHJfZGF0YS0+bWljX2FkZHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHRyX2RhdGEtPmlzX3N0YXRpYyAmJiBtX3ZhcnNbaV0uZnJlZV9pZikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGRlY3JlbWVudCBidWZmZXIgcmVmZXJlbmNlIG9uIHRhcmdldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX25lZWRfcnVuZnVuY3Rpb24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldCB0byBiYXNlIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVtb3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCA9IChjaGFyKikgYmFzZSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikgcHRyX2RhdGEtPmNwdV9hZGRyLnN0YXJ0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IG90aGVyIHBvaW50ZXIgcHJvcGVydGllcyB0byB2YXIgZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0ID0gcHRyX2RhdGEtPm1pY19vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpYyA9IHB0cl9kYXRhLT5pc19zdGF0aWM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbmRfcHRyX2RhdGEocHRyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKSBiYXNlIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKSBwdHJfZGF0YS0+Y3B1X2FkZHIuc3RhcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIHNhdmUgcG9pbnRlciBkYXRhCisgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YSA9IHB0cl9kYXRhOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX2Z1bmNfcHRyOgorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmluKSB7CisgICAgICAgICAgICAgICAgICAgIG1faW5fZGF0YWxlbiArPSBfX29mZmxvYWRfZnVuY3MubWF4X25hbWVfbGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLm91dCkgeworICAgICAgICAgICAgICAgICAgICBtX291dF9kYXRhbGVuICs9IF9fb2ZmbG9hZF9mdW5jcy5tYXhfbmFtZV9sZW5ndGgoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbV9uZWVkX3J1bmZ1bmN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX2R2X2RhdGE6CisgICAgICAgICAgICBjYXNlIGNfZHZfcHRyX2RhdGE6CisgICAgICAgICAgICBjYXNlIGNfZHZfZGF0YV9zbGljZToKKyAgICAgICAgICAgIGNhc2UgY19kdl9wdHJfZGF0YV9zbGljZToKKyAgICAgICAgICAgICAgICBBcnJEZXNjICpkdnA7CisgICAgICAgICAgICAgICAgaWYgKFZBUl9UWVBFX0lTX0RWX0RBVEFfU0xJQ0UobV92YXJzW2ldLnR5cGUuc3JjKSkgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnJfZGVzYyAqYXA7CisgICAgICAgICAgICAgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPihtX3ZhcnNbaV0ucHRyKTsKKworICAgICAgICAgICAgICAgICAgICBkdnAgPSAobV92YXJzW2ldLnR5cGUuc3JjID09IGNfZHZfZGF0YV9zbGljZSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PEFyckRlc2MqPihhcC0+YmFzZSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxBcnJEZXNjKio+KGFwLT5iYXNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGR2cCA9IChtX3ZhcnNbaV0udHlwZS5zcmMgPT0gY19kdl9kYXRhKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFyckRlc2MqPihtX3ZhcnNbaV0ucHRyKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICpzdGF0aWNfY2FzdDxBcnJEZXNjKio+KG1fdmFyc1tpXS5wdHIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGlmIGFsbG9jYXRhYmxlIGRvcGUgdmVjdG9yIGlzbid0IGFsbG9jYXRlZCBkb24ndAorICAgICAgICAgICAgICAgIC8vIHRyYW5zZmVyIGl0cyBkYXRhCisgICAgICAgICAgICAgICAgaWYgKCFfX2R2X2lzX2FsbG9jYXRlZChkdnApKSB7CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX25vY29weTsKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmFsbG9jX2lmID0gMDsKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZyZWVfaWYgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzIHx8CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5hbGxvY19pZiB8fAorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZnJlZV9pZikgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnJfZGVzYyAqYXA7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKFZBUl9UWVBFX0lTX0RWX0RBVEFfU0xJQ0UobV92YXJzW2ldLnR5cGUuc3JjKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXAgPSBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KG1fdmFyc1tpXS5wdHIpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWJ1ZyBkdW1wCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Fycl9kZXNjX2R1bXAoIiIsICJJTi9PVVQiLCBhcCwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFfX2R2X2lzX2NvbnRpZ3VvdXMoZHZwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfc3JjID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfcmVhZF9yYW5nZXNfZHYoZHZwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIHNpemUgYW5kIGRpc3BsYWNlbWVudAorICAgICAgICAgICAgICAgICAgICBpZiAoVkFSX1RZUEVfSVNfRFZfREFUQV9TTElDRShtX3ZhcnNbaV0udHlwZS5zcmMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQgYW5kIGxlbmd0aCBhcmUgZGVyaXZlZCBmcm9tIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXkgZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgX19hcnJfZGF0YV9vZmZzZXRfYW5kX2xlbmd0aChhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzX2Fycl9kZXNjX2NvbnRpZ3VvdXMoYXApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3MuaXNfbm9uY29udF9zcmMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19zbGljZV9vZl9ub25jb250X2FycmF5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfbm9uY29udF9zcmMgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfc3JjID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfcmVhZF9yYW5nZXNfYXJyX2Rlc2MoYXApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3MuaGFzX2xlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19kdl9kYXRhX2xlbmd0aChkdnAsIG1fdmFyc1tpXS5jb3VudCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSA9IF9fZHZfZGF0YV9sZW5ndGgoZHZwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXNwID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRoYXQgbGVuZ3RoID49IDAKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5hbGxvY19pZiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKG1fdmFyc1tpXS5kaXNwICsgbV92YXJzW2ldLnNpemUgPCAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3plcm9fb3JfbmVnX3B0cl9sZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGJhc2UgYWRkcmVzcworICAgICAgICAgICAgICAgICAgICB2b2lkICpiYXNlID0gcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oZHZwLT5CYXNlKTsKKyAgICAgICAgICAgICAgICAgICAgUHRyRGF0YSAqcHRyX2RhdGE7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGUgYnVmZmVyIGlmIHdlIGhhdmUgbm8gSU5UTyBhbmQgZG9uJ3QgbmVlZAorICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0aW9uIGZvciB0aGUgcHRyIGF0IHRhcmdldAorICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX2lzX2Zvcl9taWMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uYWxsb2NfaWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgbmV3IGVudHJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhbGxvY19wdHJfZGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGxvY19iYXNlICE9IE5VTEwpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY19kaXNwIDogbV92YXJzW2ldLmRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxsb2NfYmFzZSAhPSBOVUxMKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2Nfc2l6ZSA6IG1fdmFyc1tpXS5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NfZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGxvY19iYXNlICE9IE5VTEwpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIDogbV92YXJzW2ldLmFsaWduKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0cl9kYXRhLT5hZGRfcmVmZXJlbmNlKCkgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YS0+bWljX2J1ZiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBidWZmZXIgdG8gdGhlIGxpc3Qgb2YgYnVmZmVycworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IGFyZSBwYXNzZWQgdG8gZGlzcGF0Y2ggY2FsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2NvbXB1dGVfYnVmZmVycy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YS0+bWljX2J1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIHNlbmQgYnVmZmVyIGFkZHJlc3MgdG8gZGV2aWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5zaW5rX2FkZHIgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHRyX2RhdGEtPmlzX3N0YXRpYykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGFkZCByZWZlcmVuY2UgZm9yIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX25lZWRfcnVuZnVuY3Rpb24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZXJyb3JfaWZfbm90X2ZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9pc19vcGVubXApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIG9tcCB0YXJnZXQgdXBkYXRlIHZhcmlhYmxlIGlzIGlnbm9yZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgaXQgZG9lcyBub3QgZXhpc3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbV92YXJzW2ldLmFsbG9jX2lmICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbV92YXJzW2ldLmZyZWVfaWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2lmX25vdF9mb3VuZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGV4aXN0aW5nIGFzc29jaWF0aW9uIGZyb20gcG9pbnRlciB0YWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmluZF9wdHJfZGF0YShwdHJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9pZl9ub3RfZm91bmQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9pc19vcGVubXApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSB2YXIgbm9jb3B5IGlmIGl0IGRvZXMgbm90IGV4aXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfcGFyYW1ldGVyX25vY29weTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gdXBkYXRlIGJhc2UgaW4gZG9wZSB2ZWN0b3Igb24gZGV2aWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5zaW5rX2FkZHIgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0cl9kYXRhICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9pc19vcGVubXApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGF0YSBpcyB0cmFuc2ZlcnJlZCBvbmx5IGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jX2lmID09IDAgJiYgZnJlZV9pZiA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIHJlZmVyZW5jZSBjb3VudCBpcyAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobV92YXJzW2ldLmFsbG9jX2lmIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZyZWVfaWYpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YS0+Z2V0X3JlZmVyZW5jZSgpICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19wYXJhbWV0ZXJfbm9jb3B5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0cl9kYXRhLT5hbGxvY19kaXNwICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmFsbG9jX2Rpc3AgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luX2RhdGFsZW4gKz0gc2l6ZW9mKGFsbG9jX2Rpc3ApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCBidWZmZXJzJ3MgYWRkcmVzcyBvbiB0aGUgc2luaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWluaXRfbWljX2FkZHJlc3MocHRyX2RhdGEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luX2RhdGFsZW4gKz0gc2l6ZW9mKHB0cl9kYXRhLT5taWNfYWRkcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwdHJfZGF0YS0+aXNfc3RhdGljICYmIG1fdmFyc1tpXS5mcmVlX2lmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gZGVjcmVtZW50IGJ1ZmZlciByZWZlcmVuY2Ugb24gdGFyZ2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbmVlZF9ydW5mdW5jdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0IHRvIGJhc2UgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZW1vcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKSBiYXNlIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKSBwdHJfZGF0YS0+Y3B1X2FkZHIuc3RhcnQoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgb3RoZXIgcG9pbnRlciBwcm9wZXJ0aWVzIHRvIHZhciBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm1pY19vZmZzZXQgPSBwdHJfZGF0YS0+bWljX29mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljID0gcHRyX2RhdGEtPmlzX3N0YXRpYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsgLy8gIXNyY19pc19mb3JfbWljCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbmRfcHRyX2RhdGEocHRyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0ID0gIXB0cl9kYXRhID8gMCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikgYmFzZSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikgcHRyX2RhdGEtPmNwdV9hZGRyLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBzYXZlIHBvaW50ZXIgZGF0YQorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGEgPSBwdHJfZGF0YTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3Vua25vd25fdmFyX3R5cGUsIG1fdmFyc1tpXS50eXBlLnNyYyk7CisgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9BQk9SVDsKKyAgICAgICAgfQorICAgICAgICBpZiAobV92YXJzW2ldLnR5cGUuc3JjID09IGNfZGF0YV9wdHJfYXJyYXkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNyY19pc19mb3JfbWljICYmIG1fdmFyc1tpXS5mbGFncy5pc19zdGFja19idWYpIHsKKyAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgPSBzdGF0aWNfY2FzdDxjaGFyKj4obV92YXJzW2ldLnB0cikgLQorICAgICAgICAgICAgICAgIG1fZGV2aWNlLm1fcGVyc2lzdF9saXN0LmZyb250KCkuY3B1X3N0YWNrX2FkZHI7CisgICAgICAgIH0KKyAgICAgICAgLy8gaWYgc291cmNlIGlzIHVzZWQgYXQgQ1BVIHNhdmUgaXRzIG9mZnNldCBhbmQgZGlzcAorICAgICAgICBpZiAobV92YXJzW2ldLmludG8gPT0gTlVMTCB8fCBtX3ZhcnNbaV0uZGlyZWN0aW9uLmluKSB7CisgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X29mZnNldCA9IG1fdmFyc1tpXS5vZmZzZXQ7CisgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3AgICA9IG1fdmFyc1tpXS5kaXNwOworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgImludG8iIGlzIGRlZmluZSB3ZSBuZWVkIHRvIGRvIHRoZSBzaW1pbGFyIHdvcmsgZm9yIGl0CisgICAgICAgIGlmICghbV92YXJzW2ldLmludG8pIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaW50NjRfdCBpbnRvX2Rpc3AgPTAsIGludG9fb2Zmc2V0ID0gMDsKKworICAgICAgICBzd2l0Y2ggKG1fdmFyc1tpXS50eXBlLmRzdCkgeworICAgICAgICAgICAgY2FzZSBjX2RhdGFfcHRyX2FycmF5OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBjX2RhdGE6CisgICAgICAgICAgICBjYXNlIGNfdm9pZF9wdHI6CisgICAgICAgICAgICBjYXNlIGNfY2Vhbl92YXI6IHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHNpemUgPSBtX3ZhcnNbaV0uc2l6ZTsKKworICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0udHlwZS5kc3QgPT0gY19jZWFuX3ZhcikgeworICAgICAgICAgICAgICAgICAgICAvLyBhcnJheSBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFycl9kZXNjICphcCA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KG1fdmFyc1tpXS5pbnRvKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBkZWJ1ZyBkdW1wCisgICAgICAgICAgICAgICAgICAgIF9fYXJyX2Rlc2NfZHVtcCgiICAgICIsICJJTlRPIiwgYXAsIDApOworCisgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldCBhbmQgbGVuZ3RoIGFyZSBkZXJpdmVkIGZyb20gdGhlIGFycmF5IGRlc2NyaXB0b3IKKyAgICAgICAgICAgICAgICAgICAgX19hcnJfZGF0YV9vZmZzZXRfYW5kX2xlbmd0aChhcCwgaW50b19kaXNwLCBzaXplKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIWlzX2Fycl9kZXNjX2NvbnRpZ3VvdXMoYXApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfbm9uY29udF9kc3QgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX2RzdCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdF9yZWFkX3Jhbmdlc19hcnJfZGVzYyhhcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNlYW5fcmFuZ2VzX21hdGNoKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX2RzdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcmFuZ2VzX2RvbnRfbWF0Y2gpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmludG8gPSByZWludGVycHJldF9jYXN0PHZvaWQqPihhcC0+YmFzZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50NjRfdCBzaXplX3NyYyA9IG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMgPworICAgICAgICAgICAgICAgICAgICBjZWFuX2dldF90cmFuc2Zfc2l6ZShtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfc3JjKSA6CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplOworICAgICAgICAgICAgICAgIGludDY0X3Qgc2l6ZV9kc3QgPSBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfZHN0ID8KKyAgICAgICAgICAgICAgICAgICAgY2Vhbl9nZXRfdHJhbnNmX3NpemUobV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX2RzdCkgOgorICAgICAgICAgICAgICAgICAgICBzaXplOworICAgICAgICAgICAgICAgIC8vIEl0J3Mgc3VwcG9zZWQgdGhhdCAiaW50byIgc2l6ZSBtdXN0IGJlIG5vdCBsZXNzCisgICAgICAgICAgICAgICAgLy8gdGhhbiBzcmMgc2l6ZQorICAgICAgICAgICAgICAgIGlmIChzaXplX3NyYyA+IHNpemVfZHN0KSB7CisgICAgICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19kaWZmZXJlbnRfc3JjX2FuZF9kc3RuX3NpemVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfc3JjLCBzaXplX2RzdCk7CisgICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cykgeworICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpY19kc3RuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQdHJEYXRhICpwdHJfZGF0YTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluZCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB2YXJpYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaW5kX3B0cl9kYXRhKHB0cl9kYXRhLCBtX3ZhcnNbaV0uaW50bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRvX2Rpc3AsIHNpemUsIGZhbHNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0IHRvIGJhc2UgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZW1vcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRvX29mZnNldCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikgbV92YXJzW2ldLmludG8gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopIHB0cl9kYXRhLT5jcHVfYWRkci5zdGFydCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpY19kc3RuID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uZHN0X2RhdGEgPSBwdHJfZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmluICYmCisgICAgICAgICAgICAgICAgICAgICFtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljX2RzdG4pIHsKKyAgICAgICAgICAgICAgICAgICAgbV9pbl9kYXRhbGVuICs9IG1fdmFyc1tpXS5zaXplOworCisgICAgICAgICAgICAgICAgICAgIC8vIGZvciBub24tc3RhdGljIHRhcmdldCBkZXN0aW5hdGlvbiBkZWZpbmVkIGFzIENFQU4KKyAgICAgICAgICAgICAgICAgICAgLy8gZXhwcmVzc2lvbiB3ZSBwYXNzIHRvIHRhcmdldCBpdHMgc2l6ZSBhbmQgZGlzdAorICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLnR5cGUuZHN0ID09IGNfY2Vhbl92YXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGF0YWxlbiArPSAyICogc2l6ZW9mKHVpbnQ2NF90KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtX25lZWRfcnVuZnVuY3Rpb24gPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBjX2R2OgorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMgfHwKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmFsbG9jX2lmIHx8CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mcmVlX2lmKSB7CisgICAgICAgICAgICAgICAgICAgIEFyckRlc2MgKmR2cCA9IHN0YXRpY19jYXN0PEFyckRlc2MqPihtX3ZhcnNbaV0uaW50byk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZGVidWcgZHVtcAorICAgICAgICAgICAgICAgICAgICBfX2R2X2Rlc2NfZHVtcCgiSU5UTyIsIGR2cCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gc2VuZCBkb3BlIHZlY3RvciBjb250ZW50cyBleGNsdWRpbmcgYmFzZQorICAgICAgICAgICAgICAgICAgICBtX2luX2RhdGFsZW4gKz0gbV92YXJzW2ldLnNpemUgLSBzaXplb2YodWludDY0X3QpOworICAgICAgICAgICAgICAgICAgICBtX25lZWRfcnVuZnVuY3Rpb24gPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX3N0cmluZ19wdHI6CisgICAgICAgICAgICBjYXNlIGNfZGF0YV9wdHI6CisgICAgICAgICAgICBjYXNlIGNfY2Vhbl92YXJfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cjogeworICAgICAgICAgICAgICAgIGludDY0X3Qgc2l6ZSA9IG1fdmFyc1tpXS5zaXplOworCisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS50eXBlLmRzdCA9PSBjX2NlYW5fdmFyX3B0cikgeworICAgICAgICAgICAgICAgICAgICAvLyBhcnJheSBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFycl9kZXNjICphcCA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KG1fdmFyc1tpXS5pbnRvKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBkZWJ1ZyBkdW1wCisgICAgICAgICAgICAgICAgICAgIF9fYXJyX2Rlc2NfZHVtcCgiICAgICIsICJJTlRPIiwgYXAsIDEpOworCisgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldCBhbmQgbGVuZ3RoIGFyZSBkZXJpdmVkIGZyb20gdGhlIGFycmF5IGRlc2NyaXB0b3IKKyAgICAgICAgICAgICAgICAgICAgX19hcnJfZGF0YV9vZmZzZXRfYW5kX2xlbmd0aChhcCwgaW50b19kaXNwLCBzaXplKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIWlzX2Fycl9kZXNjX2NvbnRpZ3VvdXMoYXApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfbm9uY29udF9zcmMgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX2RzdCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdF9yZWFkX3Jhbmdlc19hcnJfZGVzYyhhcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNlYW5fcmFuZ2VzX21hdGNoKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX2RzdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcmFuZ2VzX2RvbnRfbWF0Y2gpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5pbnRvID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKio+KGFwLT5iYXNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobV92YXJzW2ldLnR5cGUuZHN0ID09IGNfZHZfcHRyKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gc2VuZCBEViB0byB0aGUgZGV2aWNlIHVubGVzcyBpdCBpcyAnbm9jb3B5JworICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uYWxsb2NfaWYgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mcmVlX2lmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBcnJEZXNjICpkdnAgPSAqc3RhdGljX2Nhc3Q8QXJyRGVzYyoqPihtX3ZhcnNbaV0uaW50byk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlYnVnIGR1bXAKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZHZfZGVzY19kdW1wKCJJTlRPIiwgZHZwKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHNpemVfc3JjID0gbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX3NyYyA/CisgICAgICAgICAgICAgICAgICAgIGNlYW5fZ2V0X3RyYW5zZl9zaXplKG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMpIDoKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemU7CisgICAgICAgICAgICAgICAgaW50NjRfdCBzaXplX2RzdCA9IG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19kc3QgPworICAgICAgICAgICAgICAgICAgICBjZWFuX2dldF90cmFuc2Zfc2l6ZShtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfZHN0KSA6CisgICAgICAgICAgICAgICAgICAgIHNpemU7CisgICAgICAgICAgICAgICAgLy8gSXQncyBzdXBwb3NlZCB0aGF0ICJpbnRvIiBzaXplIG11c3QgYmUgbm90IGxlc3MgdGhhbgorICAgICAgICAgICAgICAgIC8vIHNyYyBzaXplCisgICAgICAgICAgICAgICAgaWYgKHNpemVfc3JjID4gc2l6ZV9kc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2RpZmZlcmVudF9zcmNfYW5kX2RzdG5fc2l6ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV9zcmMsIHNpemVfZHN0KTsKKyAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzKSB7CisgICAgICAgICAgICAgICAgICAgIFB0ckRhdGEgKnB0cl9kYXRhOworCisgICAgICAgICAgICAgICAgICAgIC8vIGJhc2UgYWRkcmVzcworICAgICAgICAgICAgICAgICAgICB2b2lkICpiYXNlID0gKnN0YXRpY19jYXN0PHZvaWQqKj4obV92YXJzW2ldLmludG8pOworCisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmluKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZSBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhY2tfYnVmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHN0YWNrIHBlcnNpc3RlbnQgb2JqZWN0cyBwdHIgZGF0YSBpcyBjcmVhdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnkgdmFyX2Rlc2Mgd2l0aCBudW1iZXIgMC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJdHMgcHRyX2RhdGEgaXMgc3RvcmVkIGF0IG1fc3RhY2tfcHRyX2RhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YSA9IG1fc3RhY2tfcHRyX2RhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkciA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChtX3ZhcnNbaV0uYWxsb2NfaWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgbmV3IGVudHJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhbGxvY19wdHJfZGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGxvY19iYXNlICE9IE5VTEwpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY19kaXNwIDogaW50b19kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsbG9jX2Jhc2UgIT0gTlVMTCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jX3NpemUgOiBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NfZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGxvY19iYXNlICE9IE5VTEwpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIDogbV92YXJzW2ldLmFsaWduKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0cl9kYXRhLT5hZGRfcmVmZXJlbmNlKCkgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YS0+bWljX2J1ZiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBidWZmZXIgdG8gdGhlIGxpc3Qgb2YgYnVmZmVycyB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZSBwYXNzZWQgdG8gZGlzcGF0Y2ggY2FsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2NvbXB1dGVfYnVmZmVycy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YS0+bWljX2J1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIHNlbmQgYnVmZmVyIGFkZHJlc3MgdG8gZGV2aWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5zaW5rX2FkZHIgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHRyX2RhdGEtPmlzX3N0YXRpYykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGFkZCByZWZlcmVuY2UgZm9yIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX25lZWRfcnVuZnVuY3Rpb24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBleGlzdGluZyBhc3NvY2lhdGlvbiBmcm9tIHBvaW50ZXIgdGFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbmRfcHRyX2RhdGEocHRyX2RhdGEsIGJhc2UsIGludG9fZGlzcCwgc2l6ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0cl9kYXRhLT5hbGxvY19kaXNwICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuYWxsb2NfZGlzcCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbl9kYXRhbGVuICs9IHNpemVvZihhbGxvY19kaXNwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5zaW5rX2FkZHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgYnVmZmVycydzIGFkZHJlc3Mgb24gdGhlIHNpbmsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWluaXRfbWljX2FkZHJlc3MocHRyX2RhdGEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luX2RhdGFsZW4gKz0gc2l6ZW9mKHB0cl9kYXRhLT5taWNfYWRkcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHRyX2RhdGEtPmlzX3N0YXRpYyAmJiBtX3ZhcnNbaV0uZnJlZV9pZikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gZGVjcmVtZW50IGJ1ZmZlciByZWZlcmVuY2Ugb24gdGFyZ2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9uZWVkX3J1bmZ1bmN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29weSBvdGhlciBwb2ludGVyIHByb3BlcnRpZXMgdG8gdmFyIGRlc2NyaXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0ID0gcHRyX2RhdGEtPm1pY19vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljX2RzdG4gPSBwdHJfZGF0YS0+aXNfc3RhdGljOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaW5kX3B0cl9kYXRhKHB0cl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50b19kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludG9fb2Zmc2V0ID0gcHRyX2RhdGEgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikgYmFzZSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKSBwdHJfZGF0YS0+Y3B1X2FkZHIuc3RhcnQoKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBzYXZlIHBvaW50ZXIgZGF0YQorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uZHN0X2RhdGEgPSBwdHJfZGF0YTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgY19mdW5jX3B0cjoKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX2R2X2RhdGE6CisgICAgICAgICAgICBjYXNlIGNfZHZfcHRyX2RhdGE6CisgICAgICAgICAgICBjYXNlIGNfZHZfZGF0YV9zbGljZToKKyAgICAgICAgICAgIGNhc2UgY19kdl9wdHJfZGF0YV9zbGljZToKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzIHx8CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5hbGxvY19pZiB8fAorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZnJlZV9pZikgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnJfZGVzYyAqYXA7CisgICAgICAgICAgICAgICAgICAgIEFyckRlc2MgKmR2cDsKKyAgICAgICAgICAgICAgICAgICAgUHRyRGF0YSAqcHRyX2RhdGE7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgZGlzcDsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBzaXplOworCisgICAgICAgICAgICAgICAgICAgIGlmIChWQVJfVFlQRV9JU19EVl9EQVRBX1NMSUNFKG1fdmFyc1tpXS50eXBlLmRzdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPihtX3ZhcnNbaV0uaW50byk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlYnVnIGR1bXAKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fYXJyX2Rlc2NfZHVtcCgiICAgICIsICJJTlRPIiwgYXAsIDApOworCisgICAgICAgICAgICAgICAgICAgICAgICBkdnAgPSAobV92YXJzW2ldLnR5cGUuZHN0ID09IGNfZHZfZGF0YV9zbGljZSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxBcnJEZXNjKj4oYXAtPmJhc2UpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PEFyckRlc2MqKj4oYXAtPmJhc2UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZHZwID0gKG1fdmFyc1tpXS50eXBlLmRzdCA9PSBjX2R2X2RhdGEpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFyckRlc2MqPihtX3ZhcnNbaV0uaW50bykgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0YXRpY19jYXN0PEFyckRlc2MqKj4obV92YXJzW2ldLmludG8pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghX19kdl9pc19jb250aWd1b3VzKGR2cCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19ub25jb250X2RzdCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfZHN0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0X3JlYWRfcmFuZ2VzX2R2KGR2cCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gc2l6ZSBhbmQgZGlzcGxhY2VtZW50CisgICAgICAgICAgICAgICAgICAgIGlmIChWQVJfVFlQRV9JU19EVl9EQVRBX1NMSUNFKG1fdmFyc1tpXS50eXBlLmRzdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldCBhbmQgbGVuZ3RoIGFyZSBkZXJpdmVkIGZyb20gdGhlIGFycmF5CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Fycl9kYXRhX29mZnNldF9hbmRfbGVuZ3RoKGFwLCBpbnRvX2Rpc3AsIHNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNfYXJyX2Rlc2NfY29udGlndW91cyhhcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5pc19ub25jb250X2RzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3NsaWNlX29mX25vbmNvbnRfYXJyYXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19ub25jb250X2RzdCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19kc3QgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdF9yZWFkX3Jhbmdlc19hcnJfZGVzYyhhcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2Vhbl9yYW5nZXNfbWF0Y2goCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX2RzdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19yYW5nZXNfZG9udF9tYXRjaCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmhhc19sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gX19kdl9kYXRhX2xlbmd0aChkdnAsIG1fdmFyc1tpXS5jb3VudCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gX19kdl9kYXRhX2xlbmd0aChkdnApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZGlzcCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHNpemVfc3JjID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMgPworICAgICAgICAgICAgICAgICAgICAgICAgY2Vhbl9nZXRfdHJhbnNmX3NpemUobV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX3NyYykgOgorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemU7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgc2l6ZV9kc3QgPQorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX2RzdCA/CisgICAgICAgICAgICAgICAgICAgICAgICBjZWFuX2dldF90cmFuc2Zfc2l6ZShtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfZHN0KSA6CisgICAgICAgICAgICAgICAgICAgICAgICBzaXplOworICAgICAgICAgICAgICAgICAgICAvLyBJdCdzIHN1cHBvc2VkIHRoYXQgImludG8iIHNpemUgbXVzdCBiZSBub3QgbGVzcworICAgICAgICAgICAgICAgICAgICAvLyB0aGFuIHNyYyBzaXplCisgICAgICAgICAgICAgICAgICAgIGlmIChzaXplX3NyYyA+IHNpemVfZHN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfZGlmZmVyZW50X3NyY19hbmRfZHN0bl9zaXplcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3NyYywgc2l6ZV9kc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGJhc2UgYWRkcmVzcworICAgICAgICAgICAgICAgICAgICB2b2lkICpiYXNlID0gcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oZHZwLT5CYXNlKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZSBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uaW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uYWxsb2NfaWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgbmV3IGVudHJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhbGxvY19wdHJfZGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGxvY19iYXNlICE9IE5VTEwpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY19kaXNwIDogaW50b19kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsbG9jX2Jhc2UgIT0gTlVMTCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jX3NpemUgOiBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NfZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGxvY19iYXNlICE9IE5VTEwpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIDogbV92YXJzW2ldLmFsaWduKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YS0+YWRkX3JlZmVyZW5jZSgpID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPm1pY19idWYgIT0wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBidWZmZXIgdG8gdGhlIGxpc3Qgb2YgYnVmZmVycworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IGFyZSBwYXNzZWQgdG8gZGlzcGF0Y2ggY2FsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2NvbXB1dGVfYnVmZmVycy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YS0+bWljX2J1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIHNlbmQgYnVmZmVyIGFkZHJlc3MgdG8gZGV2aWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5zaW5rX2FkZHIgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHRyX2RhdGEtPmlzX3N0YXRpYykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGFkZCByZWZlcmVuY2UgZm9yIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX25lZWRfcnVuZnVuY3Rpb24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBleGlzdGluZyBhc3NvY2lhdGlvbiBmcm9tIHBvaW50ZXIgdGFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbmRfcHRyX2RhdGEocHRyX2RhdGEsIGJhc2UsIGludG9fZGlzcCwgc2l6ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gdXBkYXRlIGJhc2UgaW4gZG9wZSB2ZWN0b3Igb24gZGV2aWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkciA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YS0+YWxsb2NfZGlzcCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmFsbG9jX2Rpc3AgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGF0YWxlbiArPSBzaXplb2YoYWxsb2NfZGlzcCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGJ1ZmZlcnMncyBhZGRyZXNzIG9uIHRoZSBzaW5rCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbml0X21pY19hZGRyZXNzKHB0cl9kYXRhKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGF0YWxlbiArPSBzaXplb2YocHRyX2RhdGEtPm1pY19hZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwdHJfZGF0YS0+aXNfc3RhdGljICYmIG1fdmFyc1tpXS5mcmVlX2lmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBkZWNyZW1lbnQgYnVmZmVyIHJlZmVyZW5jZSBvbiB0YXJnZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX25lZWRfcnVuZnVuY3Rpb24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQgdG8gYmFzZSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVtb3J5CisgICAgICAgICAgICAgICAgICAgICAgICBpbnRvX29mZnNldCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKSBiYXNlIC0gKGNoYXIqKSBwdHJfZGF0YS0+Y3B1X2FkZHIuc3RhcnQoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29weSBvdGhlciBwb2ludGVyIHByb3BlcnRpZXMgdG8gdmFyIGRlc2NyaXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0ID0gcHRyX2RhdGEtPm1pY19vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljX2RzdG4gPSBwdHJfZGF0YS0+aXNfc3RhdGljOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeyAvLyBzcmNfaXNfZm9yX21pYworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaW5kX3B0cl9kYXRhKHB0cl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50b19kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaW50b19vZmZzZXQgPSAhcHRyX2RhdGEgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikgYmFzZSAtIChjaGFyKikgcHRyX2RhdGEtPmNwdV9hZGRyLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBzYXZlIHBvaW50ZXIgZGF0YQorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uZHN0X2RhdGEgPSBwdHJfZGF0YTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3Vua25vd25fdmFyX3R5cGUsIG1fdmFyc1tpXS50eXBlLnNyYyk7CisgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9BQk9SVDsKKyAgICAgICAgfQorICAgICAgICAvLyBpZiBpbnRvIGlzIHVzZWQgYXQgQ1BVIHNhdmUgaXRzIG9mZnNldCBhbmQgZGlzcAorICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5vdXQpIHsKKyAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5jcHVfb2Zmc2V0ID0gaW50b19vZmZzZXQ7CisgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3AgICA9IGludG9fZGlzcDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhY2tfYnVmKSB7CisgICAgICAgICAgICAgICAgaW50b19vZmZzZXQgPSBzdGF0aWNfY2FzdDxjaGFyKj4obV92YXJzW2ldLmludG8pIC0KKyAgICAgICAgICAgICAgICAgICAgbV9kZXZpY2UubV9wZXJzaXN0X2xpc3QuZnJvbnQoKS5jcHVfc3RhY2tfYWRkcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgPSBpbnRvX29mZnNldDsKKyAgICAgICAgICAgIG1fdmFyc1tpXS5kaXNwICAgPSBpbnRvX2Rpc3A7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBPZmZsb2FkRGVzY3JpcHRvcjo6c2V0dXBfbWlzY19kYXRhKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgT2ZmbG9hZFRpbWVyIHRpbWVyKGdldF90aW1lcl9kYXRhKCksIGNfb2ZmbG9hZF9ob3N0X3NldHVwX21pc2NfZGF0YSk7CisKKyAgICAvLyB3ZSBjYW4gc2tpcCBydW4gZnVuY3RvbiBjYWxsIHRvZ2V0aGVyIHdpdGggd2FpdCBpZiBvZmZsb2FkZWQKKyAgICAvLyByZWdpb24gaXMgZW1wdHkgYW5kIHRoZXJlIGlzIG5vIHVzZXIgZGVmaW5lZCBub24tcG9pbnRlciBJTi9PVVQgZGF0YQorICAgIGlmIChtX25lZWRfcnVuZnVuY3Rpb24pIHsKKyAgICAgICAgLy8gdmFyaWFibGUgZGVzY3JpcHRvcnMgYXJlIHNlbnQgYXMgaW5wdXQgZGF0YQorICAgICAgICBtX2luX2RhdGFsZW4gKz0gbV92YXJzX3RvdGFsICogc2l6ZW9mKFZhckRlc2MpOworCisgICAgICAgIC8vIHRpbWVyIGRhdGEgaXMgc2VudCBhcyBhIHBhcnQgb2YgdGhlIG91dHB1dCBkYXRhCisgICAgICAgIG1fb3V0X2RhdGFsZW4gKz0gT0ZGTE9BRF9USU1FUl9EQVRBTEVOKCk7CisKKyAgICAgICAgLy8gbWF4IGZyb20gaW5wdXQgZGF0YSBhbmQgb3V0cHV0IGRhdGEgbGVuZ3RoCisgICAgICAgIHVpbnQ2NF90IGRhdGFfbGVuID0gbV9pbl9kYXRhbGVuID4gbV9vdXRfZGF0YWxlbiA/IG1faW5fZGF0YWxlbiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fb3V0X2RhdGFsZW47CisKKyAgICAgICAgLy8gTWlzYyBkYXRhIGhhcyB0aGUgZm9sbG93aW5nIGxheW91dAorICAgICAgICAvLyAgICAgPEZ1bmN0aW9uIERlc2NyaXB0b3I+CisgICAgICAgIC8vICAgICA8RnVuY3Rpb24gTmFtZT4KKyAgICAgICAgLy8gICAgIDxJbi9PdXQgRGF0YT4gICAgICAgICAgICAob3B0aW9uYWwpCisgICAgICAgIC8vCisgICAgICAgIC8vIFdlIGNhbiB0cmFuc2ZlciBjb3B5aW4vY29weW91dCBkYXRhIGluIG1pc2MvcmV0dXJuIGRhdGEgd2hpY2ggY2FuCisgICAgICAgIC8vIGJlIHBhc3NlZCB0byBydW4gZnVuY3Rpb24gY2FsbCBpZiBpdHMgc2l6ZSBkb2VzIG5vdCBleGNlZWQKKyAgICAgICAgLy8gQ09JX1BJUEVMSU5FX01BWF9JTl9NSVNDX0RBVEFfTEVOLiBPdGhlcndpc2Ugd2UgaGF2ZSB0byBhbGxvY2F0ZQorICAgICAgICAvLyBidWZmZXIgZm9yIGl0LgorCisgICAgICAgIG1fZnVuY19kZXNjX3NpemUgPSBzaXplb2YoRnVuY3Rpb25EZXNjcmlwdG9yKSArIHN0cmxlbihuYW1lKSArIDE7CisgICAgICAgIG1fZnVuY19kZXNjX3NpemUgPSAobV9mdW5jX2Rlc2Nfc2l6ZSArIDcpICYgfjc7CisKKyAgICAgICAgaW50IG1pc2NfZGF0YV9vZmZzZXQgPSAwOworICAgICAgICBpbnQgbWlzY19kYXRhX3NpemUgPSAwOworICAgICAgICBpZiAoZGF0YV9sZW4gPiAwKSB7CisgICAgICAgICAgICBpZiAobV9mdW5jX2Rlc2Nfc2l6ZSArCisgICAgICAgICAgICAgICAgbV9pbl9kYXRhbGVuIDw9IENPSV9QSVBFTElORV9NQVhfSU5fTUlTQ19EQVRBX0xFTiAmJgorICAgICAgICAgICAgICAgIG1fb3V0X2RhdGFsZW4gPD0gQ09JX1BJUEVMSU5FX01BWF9JTl9NSVNDX0RBVEFfTEVOKSB7CisgICAgICAgICAgICAgICAgLy8gdXNlIG1pc2MvcmV0dXJuIGRhdGEgZm9yIGNvcHlpbi9jb3B5b3V0CisgICAgICAgICAgICAgICAgbWlzY19kYXRhX29mZnNldCA9IG1fZnVuY19kZXNjX3NpemU7CisgICAgICAgICAgICAgICAgbWlzY19kYXRhX3NpemUgPSBkYXRhX2xlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIE9mZmxvYWRUaW1lciB0aW1lcl9idWYoZ2V0X3RpbWVyX2RhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfb2ZmbG9hZF9ob3N0X2FsbG9jX2RhdGFfYnVmZmVyKTsKKworICAgICAgICAgICAgICAgIC8vIHNlbmQvcmVjZWl2ZSBkYXRhIHVzaW5nIGJ1ZmZlcgorICAgICAgICAgICAgICAgIENPSVJFU1VMVCByZXMgPSBDT0k6OkJ1ZmZlckNyZWF0ZShkYXRhX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0JVRkZFUl9OT1JNQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsICZtX2RldmljZS5nZXRfcHJvY2VzcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbV9pbm91dF9idWYpOworICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl9jcmVhdGUsIHJlcyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbV9jb21wdXRlX2J1ZmZlcnMucHVzaF9iYWNrKG1faW5vdXRfYnVmKTsKKyAgICAgICAgICAgICAgICBtX2Rlc3Ryb3lfYnVmZmVycy5wdXNoX2JhY2sobV9pbm91dF9idWYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSBmdW5jdGlvbiBkZXNjcmlwdG9yCisgICAgICAgIG1fZnVuY19kZXNjID0gKEZ1bmN0aW9uRGVzY3JpcHRvciopIG1hbGxvYyhtX2Z1bmNfZGVzY19zaXplICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc2NfZGF0YV9zaXplKTsKKyAgICAgICAgbV9mdW5jX2Rlc2MtPmNvbnNvbGVfZW5hYmxlZCA9IGNvbnNvbGVfZW5hYmxlZDsKKyAgICAgICAgbV9mdW5jX2Rlc2MtPnRpbWVyX2VuYWJsZWQgPQorICAgICAgICAgICAgdGltZXJfZW5hYmxlZCB8fCAob2ZmbG9hZF9yZXBvcnRfbGV2ZWwgJiYgb2ZmbG9hZF9yZXBvcnRfZW5hYmxlZCk7CisgICAgICAgIG1fZnVuY19kZXNjLT5vZmZsb2FkX3JlcG9ydF9sZXZlbCA9IG9mZmxvYWRfcmVwb3J0X2xldmVsOworICAgICAgICBtX2Z1bmNfZGVzYy0+b2ZmbG9hZF9udW1iZXIgPSBHRVRfT0ZGTE9BRF9OVU1CRVIoZ2V0X3RpbWVyX2RhdGEoKSk7CisgICAgICAgIG1fZnVuY19kZXNjLT5pbl9kYXRhbGVuID0gbV9pbl9kYXRhbGVuOworICAgICAgICBtX2Z1bmNfZGVzYy0+b3V0X2RhdGFsZW4gPSBtX291dF9kYXRhbGVuOworICAgICAgICBtX2Z1bmNfZGVzYy0+dmFyc19udW0gPSBtX3ZhcnNfdG90YWw7CisgICAgICAgIG1fZnVuY19kZXNjLT5kYXRhX29mZnNldCA9IG1pc2NfZGF0YV9vZmZzZXQ7CisKKyAgICAgICAgLy8gYXBwZW5kIGVudHJ5IG5hbWUKKyAgICAgICAgc3RyY3B5KG1fZnVuY19kZXNjLT5kYXRhLCBuYW1lKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBPZmZsb2FkRGVzY3JpcHRvcjo6d2FpdF9kZXBlbmRlbmNpZXMoCisgICAgY29uc3Qgdm9pZCAqKndhaXRzLAorICAgIGludCBudW1fd2FpdHMKKykKK3sKKyAgICBPZmZsb2FkVGltZXIgdGltZXIoZ2V0X3RpbWVyX2RhdGEoKSwgY19vZmZsb2FkX2hvc3Rfd2FpdF9kZXBzKTsKKyAgICBib29sIHJldCA9IHRydWU7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bV93YWl0czsgaSsrKSB7CisKKyAgICAgICAgT2ZmbG9hZERlc2NyaXB0b3IgKnRhc2sgPSBtX2RldmljZS5maW5kX3NpZ25hbCh3YWl0c1tpXSwgdHJ1ZSk7CisgICAgICAgIGlmICh0YXNrID09IDApIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19vZmZsb2FkMSwgbV9kZXZpY2UuZ2V0X2xvZ2ljYWxfaW5kZXgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdHNbaV0pOworICAgICAgICAgICAgTElCT0ZGTE9BRF9BQk9SVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghdGFzay0+b2ZmbG9hZF9maW5pc2goKSkgeworICAgICAgICAgICAgcmV0ID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICB0YXNrLT5jbGVhbnVwKCk7CisgICAgICAgIGRlbGV0ZSB0YXNrOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK2Jvb2wgT2ZmbG9hZERlc2NyaXB0b3I6Om9mZmxvYWQoCisgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICBib29sIGlzX2VtcHR5LAorICAgIFZhckRlc2MgKnZhcnMsCisgICAgVmFyRGVzYzIgKnZhcnMyLAorICAgIGludCB2YXJzX3RvdGFsLAorICAgIGNvbnN0IHZvaWQgKip3YWl0cywKKyAgICBpbnQgbnVtX3dhaXRzLAorICAgIGNvbnN0IHZvaWQgKipzaWduYWwsCisgICAgaW50IGVudHJ5X2lkLAorICAgIGNvbnN0IHZvaWQgKnN0YWNrX2FkZHIKKykKK3sKKyAgICBpZiAoc2lnbmFsID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDEsCisgICAgICAgICAgICAgICAgICAgICAgR0VUX09GRkxPQURfTlVNQkVSKGdldF90aW1lcl9kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgIGNfb2ZmbG9hZF9pbml0X2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgIk9mZmxvYWQgZnVuY3Rpb24gJXMsIGlzX2VtcHR5PSVkLCAjdmFyRGVzY3M9JWQsICIKKyAgICAgICAgICAgICAgICAgICAgICAiI3dhaXRzPSVkLCBzaWduYWw9bm9uZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBpc19lbXB0eSwgdmFyc190b3RhbCwgbnVtX3dhaXRzKTsKKyAgICAgICAgT0ZGTE9BRF9SRVBPUlQoMywgR0VUX09GRkxPQURfTlVNQkVSKGdldF90aW1lcl9kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgIGNfb2ZmbG9hZF9zZW50X3BvaW50ZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAiI1dhaXQgOiAlZCBcbiIsIG51bV93YWl0cyk7CisgICAgICAgIE9GRkxPQURfUkVQT1JUKDMsIEdFVF9PRkZMT0FEX05VTUJFUihnZXRfdGltZXJfZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICBjX29mZmxvYWRfc2lnbmFsLAorICAgICAgICAgICAgICAgICAgICAgICJub25lICVkXG4iLCAwKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSgxLAorICAgICAgICAgICAgICAgICAgICAgIEdFVF9PRkZMT0FEX05VTUJFUihnZXRfdGltZXJfZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICBjX29mZmxvYWRfaW5pdF9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICJPZmZsb2FkIGZ1bmN0aW9uICVzLCBpc19lbXB0eT0lZCwgI3ZhckRlc2NzPSVkLCAiCisgICAgICAgICAgICAgICAgICAgICAgIiN3YWl0cz0lZCwgc2lnbmFsPSVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGlzX2VtcHR5LCB2YXJzX3RvdGFsLCBudW1fd2FpdHMsCisgICAgICAgICAgICAgICAgICAgICAgKnNpZ25hbCk7CisKKyAgICAgICAgT0ZGTE9BRF9SRVBPUlQoMywgR0VUX09GRkxPQURfTlVNQkVSKGdldF90aW1lcl9kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgIGNfb2ZmbG9hZF9zaWduYWwsCisgICAgICAgICAgICAgICAgICAgICAgIiVkXG4iLCBzaWduYWwpOworICAgIH0KKyAgICBPRkZMT0FEX1JFUE9SVCgzLCBHRVRfT0ZGTE9BRF9OVU1CRVIoZ2V0X3RpbWVyX2RhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgY19vZmZsb2FkX3dhaXQsCisgICAgICAgICAgICAgICAgICAgICAgIiNXYWl0IDogJWQgICVwXG4iLCBudW1fd2FpdHMsIHdhaXRzKTsKKworICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSBPRkZMT0FEX1NVQ0NFU1M7CisgICAgICAgIG1fc3RhdHVzLT5kZXZpY2VfbnVtYmVyID0gbV9kZXZpY2UuZ2V0X2xvZ2ljYWxfaW5kZXgoKTsKKyAgICB9CisKKyAgICBtX25lZWRfcnVuZnVuY3Rpb24gPSAhaXNfZW1wdHk7CisKKyAgICAvLyB3YWl0IGZvciBkZXBlbmRlbmNpZXMgdG8gZmluaXNoCisgICAgaWYgKCF3YWl0X2RlcGVuZGVuY2llcyh3YWl0cywgbnVtX3dhaXRzKSkgeworICAgICAgICBjbGVhbnVwKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBzZXR1cCBidWZmZXJzCisgICAgaWYgKCFzZXR1cF9kZXNjcmlwdG9ycyh2YXJzLCB2YXJzMiwgdmFyc190b3RhbCwgZW50cnlfaWQsIHN0YWNrX2FkZHIpKSB7CisgICAgICAgIGNsZWFudXAoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIGluaXRpYXRlIHNlbmQgZm9yIHBvaW50ZXJzLiBXYW50IHRvIGRvIGl0IGFzIGVhcmx5IGFzIHBvc3NpYmxlLgorICAgIGlmICghc2VuZF9wb2ludGVyX2RhdGEoc2lnbmFsICE9IDApKSB7CisgICAgICAgIGNsZWFudXAoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIHNldHVwIG1pc2MgZGF0YSBmb3IgcnVuIGZ1bmN0aW9uCisgICAgaWYgKCFzZXR1cF9taXNjX2RhdGEobmFtZSkpIHsKKyAgICAgICAgY2xlYW51cCgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gZ2F0aGVyIGNvcHlpbiBkYXRhIGludG8gYnVmZmVyCisgICAgaWYgKCFnYXRoZXJfY29weWluX2RhdGEoKSkgeworICAgICAgICBjbGVhbnVwKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBTdGFydCB0aGUgY29tcHV0YXRpb24KKyAgICBpZiAoIWNvbXB1dGUoKSkgeworICAgICAgICBjbGVhbnVwKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBpbml0aWF0ZSByZWNlaXZlIGZvciBwb2ludGVycworICAgIGlmICghcmVjZWl2ZV9wb2ludGVyX2RhdGEoc2lnbmFsICE9IDApKSB7CisgICAgICAgIGNsZWFudXAoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIGlmIHRoZXJlIGlzIGEgc2lnbmFsIHNhdmUgZGVzY3JpcHRvciBmb3IgdGhlIGxhdGVyIHVzZS4KKyAgICBpZiAoc2lnbmFsICE9IDApIHsKKyAgICAgICAgbV9kZXZpY2UuYWRkX3NpZ25hbCgqc2lnbmFsLCB0aGlzKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gd2FpdCBmb3IgdGhlIG9mZmxvYWQgdG8gZmluaXNoLgorICAgIGlmICghb2ZmbG9hZF9maW5pc2goKSkgeworICAgICAgICBjbGVhbnVwKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjbGVhbnVwKCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgT2ZmbG9hZERlc2NyaXB0b3I6Om9mZmxvYWRfZmluaXNoKCkKK3sKKyAgICBDT0lSRVNVTFQgcmVzOworCisgICAgLy8gd2FpdCBmb3IgY29tcHV0ZSBkZXBlbmRlbmNpZXMgdG8gYmVjb21lIHNpZ25hbGVkCisgICAgaWYgKG1faW5fZGVwc190b3RhbCA+IDApIHsKKyAgICAgICAgT2ZmbG9hZFRpbWVyIHRpbWVyKGdldF90aW1lcl9kYXRhKCksIGNfb2ZmbG9hZF9ob3N0X3dhaXRfY29tcHV0ZSk7CisKKyAgICAgICAgaWYgKF9fb2ZmbG9hZF9hY3RpdmVfd2FpdCkgeworICAgICAgICAgICAgLy8ga2VlcCBDUFUgYnVzeQorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIHJlcyA9IENPSTo6RXZlbnRXYWl0KG1faW5fZGVwc190b3RhbCwgbV9pbl9kZXBzLCAwLCAxLCAwLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChyZXMgPT0gQ09JX1RJTUVfT1VUX1JFQUNIRUQpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmVzID0gQ09JOjpFdmVudFdhaXQobV9pbl9kZXBzX3RvdGFsLCBtX2luX2RlcHMsIC0xLCAxLCAwLCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfZXZlbnRfd2FpdCwgcmVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHNjYXR0ZXIgY29weW91dCBkYXRhIHJlY2VpdmVkIGZyb20gdGFyZ2V0CisgICAgaWYgKCFzY2F0dGVyX2NvcHlvdXRfZGF0YSgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLy8gd2FpdCBmb3IgcmVjZWl2ZSBkZXBlbmRlbmNpZXMgdG8gYmVjb21lIHNpZ25hbGVkCisgICAgaWYgKG1fb3V0X2RlcHNfdG90YWwgPiAwKSB7CisgICAgICAgIE9mZmxvYWRUaW1lciB0aW1lcihnZXRfdGltZXJfZGF0YSgpLCBjX29mZmxvYWRfaG9zdF93YWl0X2J1ZmZlcnNfcmVhZHMpOworCisgICAgICAgIGlmIChfX29mZmxvYWRfYWN0aXZlX3dhaXQpIHsKKyAgICAgICAgICAgIC8vIGtlZXAgQ1BVIGJ1c3kKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICByZXMgPSBDT0k6OkV2ZW50V2FpdChtX291dF9kZXBzX3RvdGFsLCBtX291dF9kZXBzLCAwLCAxLCAwLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChyZXMgPT0gQ09JX1RJTUVfT1VUX1JFQUNIRUQpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmVzID0gQ09JOjpFdmVudFdhaXQobV9vdXRfZGVwc190b3RhbCwgbV9vdXRfZGVwcywgLTEsIDEsIDAsIDApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19ldmVudF93YWl0LCByZXMpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gZGVzdHJveSBidWZmZXJzCisgICAgeworICAgICAgICBPZmZsb2FkVGltZXIgdGltZXIoZ2V0X3RpbWVyX2RhdGEoKSwgY19vZmZsb2FkX2hvc3RfZGVzdHJveV9idWZmZXJzKTsKKworICAgICAgICBmb3IgKEJ1ZmZlckxpc3Q6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9kZXN0cm95X2J1ZmZlcnMuYmVnaW4oKTsKKyAgICAgICAgICAgICBpdCAhPSBtX2Rlc3Ryb3lfYnVmZmVycy5lbmQoKTsgaXQrKykgeworICAgICAgICAgICAgcmVzID0gQ09JOjpCdWZmZXJEZXN0cm95KCppdCk7CisgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX2Rlc3Ryb3ksIHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBPZmZsb2FkRGVzY3JpcHRvcjo6Y2xlYW51cCgpCit7CisgICAgLy8gcmVsZWFzZSBkZXZpY2UgaW4gb3JzbAorICAgIE9SU0w6OnJlbGVhc2UobV9kZXZpY2UuZ2V0X2xvZ2ljYWxfaW5kZXgoKSk7CisKKyAgICBPRkZMT0FEX1RJTUVSX1NUT1AoZ2V0X3RpbWVyX2RhdGEoKSwgY19vZmZsb2FkX2hvc3RfdG90YWxfb2ZmbG9hZCk7CisKKyAgICAvLyByZXBvcnQgc3R1ZmYKKyAgICBPZmZsb2FkX1JlcG9ydF9FcGlsb2coZ2V0X3RpbWVyX2RhdGEoKSk7Cit9CisKK2Jvb2wgT2ZmbG9hZERlc2NyaXB0b3I6OmlzX3NpZ25hbGVkKCkKK3sKKyAgICBib29sIHNpZ25hbGVkID0gdHJ1ZTsKKyAgICBDT0lSRVNVTFQgcmVzOworCisgICAgLy8gY2hlY2sgY29tcHV0ZSBhbmQgcmVjZWl2ZSBkZXBlbmRlbmNpZXMKKyAgICBpZiAobV9pbl9kZXBzX3RvdGFsID4gMCkgeworICAgICAgICByZXMgPSBDT0k6OkV2ZW50V2FpdChtX2luX2RlcHNfdG90YWwsIG1faW5fZGVwcywgMCwgMSwgMCwgMCk7CisgICAgICAgIHNpZ25hbGVkID0gc2lnbmFsZWQgJiYgKHJlcyA9PSBDT0lfU1VDQ0VTUyk7CisgICAgfQorICAgIGlmIChtX291dF9kZXBzX3RvdGFsID4gMCkgeworICAgICAgICByZXMgPSBDT0k6OkV2ZW50V2FpdChtX291dF9kZXBzX3RvdGFsLCBtX291dF9kZXBzLCAwLCAxLCAwLCAwKTsKKyAgICAgICAgc2lnbmFsZWQgPSBzaWduYWxlZCAmJiAocmVzID09IENPSV9TVUNDRVNTKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2lnbmFsZWQ7Cit9CisKKy8vIFNlbmQgcG9pbnRlciBkYXRhIGlmIHNvdXJjZSBvciBkZXN0aW5hdGlvbiBvciBib3RoIG9mIHRoZW0gYXJlCisvLyBub25jb250aWd1b3VzLiBUaGVyZSBpcyBndWFyYW50ZWUgdGhhdCBsZW5ndGggb2YgZGVzdGluYXRpb24gZW5vdWdoIGZvcgorLy8gdHJhbnNmZXJyZWQgZGF0YS4KK2Jvb2wgT2ZmbG9hZERlc2NyaXB0b3I6OnNlbmRfbm9uY29udGlndW91c19wb2ludGVyX2RhdGEoCisgICAgaW50IGksCisgICAgUHRyRGF0YSogc3JjX2RhdGEsCisgICAgUHRyRGF0YSogZHN0X2RhdGEsCisgICAgQ09JRVZFTlQgKmV2ZW50CisgICAgKQoreworICAgIGludDY0X3Qgb2Zmc2V0X3NyYywgb2Zmc2V0X2RzdDsKKyAgICBpbnQ2NF90IGxlbmd0aF9zcmMsIGxlbmd0aF9kc3Q7CisgICAgaW50NjRfdCBsZW5ndGhfc3JjX2N1ciwgbGVuZ3RoX2RzdF9jdXI7CisgICAgaW50NjRfdCBzZW5kX3NpemUsIGRhdGFfc2VudCA9IDA7CisgICAgQ09JUkVTVUxUIHJlczsKKyAgICBib29sIGRzdF9pc19lbXB0eSA9IHRydWU7CisgICAgYm9vbCBzcmNfaXNfZW1wdHkgPSB0cnVlOworCisgICAgLy8gU2V0IGxlbmd0aF9zcmMgYW5kIGxlbmd0aF9kc3QKKyAgICBsZW5ndGhfc3JjID0gKG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMpID8KKyAgICAgICAgbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX3NyYy0+cmFuZ2Vfc2l6ZSA6IG1fdmFyc1tpXS5zaXplOworICAgIGxlbmd0aF9kc3QgPSAhbV92YXJzW2ldLmludG8gPyBsZW5ndGhfc3JjIDoKKyAgICAgICAgICAgICAgICAgICAgIChtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfZHN0KSA/CisgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfZHN0LT5yYW5nZV9zaXplIDogbV92YXJzW2ldLnNpemU7CisgICAgc2VuZF9zaXplID0gKGxlbmd0aF9zcmMgPCBsZW5ndGhfZHN0KSA/IGxlbmd0aF9zcmMgOiBsZW5ndGhfZHN0OworCisgICAgLy8gY29uc2VxdWVudGx5IGdldCBjb250aWd1b3VzIHJhbmdlcywKKyAgICAvLyBkZWZpbmUgY29ycmVzcG9uZGVkIGRlc3RpbmF0aW9uIG9mZnNldCBhbmQgc2VuZCBkYXRhCisgICAgZG8geworICAgICAgICBpZiAoc3JjX2lzX2VtcHR5KSB7CisgICAgICAgICAgICBpZiAobV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX3NyYykgeworICAgICAgICAgICAgICAgIGlmICghZ2V0X25leHRfcmFuZ2UobV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0X3NyYykpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc291cmNlIHJhbmdlcyBhcmUgb3ZlciAtIG5vdGhpbmcgdG8gc2VuZAorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChkYXRhX3NlbnQgPT0gMCkgeworICAgICAgICAgICAgICAgIG9mZnNldF9zcmMgPSBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3A7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxlbmd0aF9zcmNfY3VyID0gbGVuZ3RoX3NyYzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIGlmIHNvdXJjZSBpcyBjb250aWd1b3VzIG9yIGl0cyBjb250aWd1b3VzIHJhbmdlIGlzIGdyZWF0ZXIKKyAgICAgICAgICAgIC8vIHRoYW4gZGVzdGluYXRpb24gb25lCisgICAgICAgICAgICBvZmZzZXRfc3JjICs9IHNlbmRfc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBsZW5ndGhfc3JjX2N1ciAtPSBzZW5kX3NpemU7CisgICAgICAgIHNyY19pc19lbXB0eSA9IGxlbmd0aF9zcmNfY3VyID09IDA7CisKKyAgICAgICAgaWYgKGRzdF9pc19lbXB0eSkgeworICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5pbnRvKSB7CisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19kc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFnZXRfbmV4dF9yYW5nZShtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0X2RzdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlc3RpbmF0aW9uIHJhbmdlcyBhcmUgb3ZlcgorICAgICAgICAgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2Rlc3RpbmF0aW9uX2lzX292ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGludG8gaXMgY29udGlndW91cy4KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0X2RzdCA9IG1fdmFyc1tpXS5kaXNwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsZW5ndGhfZHN0X2N1ciA9IGxlbmd0aF9kc3Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBzYW1lIGFzIHNvdXJjZQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgb2Zmc2V0X2RzdCA9IG9mZnNldF9zcmM7CisgICAgICAgICAgICAgICAgbGVuZ3RoX2RzdF9jdXIgPSBsZW5ndGhfc3JjOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy8gaWYgZGVzdGluYXRpb24gaXMgY29udGlndW91cyBvciBpdHMgY29udGlndW91cyByYW5nZSBpcyBncmVhdGVyCisgICAgICAgICAgICAvLyB0aGFuIHNvdXJjZSBvbmUKKyAgICAgICAgICAgIG9mZnNldF9kc3QgKz0gc2VuZF9zaXplOworICAgICAgICB9CisgICAgICAgIGxlbmd0aF9kc3RfY3VyIC09IHNlbmRfc2l6ZTsKKyAgICAgICAgZHN0X2lzX2VtcHR5ID0gbGVuZ3RoX2RzdF9jdXIgPT0gMDsKKworICAgICAgICBpZiAoc3JjX2RhdGEgIT0gMCAmJiBzcmNfZGF0YS0+Y3B1X2J1ZiAhPSAwKSB7CisgICAgICAgICAgICByZXMgPSBDT0k6OkJ1ZmZlckNvcHkoCisgICAgICAgICAgICAgICAgZHN0X2RhdGEtPm1pY19idWYsCisgICAgICAgICAgICAgICAgc3JjX2RhdGEtPmNwdV9idWYsCisgICAgICAgICAgICAgICAgbV92YXJzW2ldLm1pY19vZmZzZXQgLSBkc3RfZGF0YS0+YWxsb2NfZGlzcCArCisgICAgICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCArIG9mZnNldF9kc3QsCisgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmNwdV9vZmZzZXQgKyBvZmZzZXRfc3JjLAorICAgICAgICAgICAgICAgIHNlbmRfc2l6ZSwKKyAgICAgICAgICAgICAgICBDT0lfQ09QWV9VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAwLCAwLAorICAgICAgICAgICAgICAgIGV2ZW50KTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfY29weSwgcmVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNoYXIgKmJhc2UgPSBvZmZsb2FkX2dldF9zcmNfYmFzZShtX3ZhcnNbaV0ucHRyLAorICAgICAgICAgICAgICAgIG1fdmFyc1tpXS50eXBlLnNyYyk7CisKKyAgICAgICAgICAgIHJlcyA9IENPSTo6QnVmZmVyV3JpdGUoCisgICAgICAgICAgICAgICAgZHN0X2RhdGEtPm1pY19idWYsCisgICAgICAgICAgICAgICAgbV92YXJzW2ldLm1pY19vZmZzZXQgLSBkc3RfZGF0YS0+YWxsb2NfZGlzcCArCisgICAgICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCArIG9mZnNldF9kc3QsCisgICAgICAgICAgICAgICAgYmFzZSArIG9mZnNldF9zcmMsCisgICAgICAgICAgICAgICAgc2VuZF9zaXplLAorICAgICAgICAgICAgICAgIENPSV9DT1BZX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgIDAsIDAsCisgICAgICAgICAgICAgICAgZXZlbnQpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl93cml0ZSwgcmVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkYXRhX3NlbnQgKz0gbGVuZ3RoX3NyYzsKKyAgICB9CisgICAgd2hpbGUgKHRydWUpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE9mZmxvYWREZXNjcmlwdG9yOjpzZW5kX3BvaW50ZXJfZGF0YShib29sIGlzX2FzeW5jKQoreworICAgIE9mZmxvYWRUaW1lciB0aW1lcihnZXRfdGltZXJfZGF0YSgpLCBjX29mZmxvYWRfaG9zdF9zZW5kX3BvaW50ZXJzKTsKKworICAgIHVpbnQ2NF90IHB0cl9zZW50ID0gMDsKKyAgICBDT0lSRVNVTFQgcmVzOworCisgICAgLy8gSW5pdGlhdGUgc2VuZCBmb3IgcG9pbnRlciBkYXRhCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX3ZhcnNfdG90YWw7IGkrKykgeworICAgICAgICBzd2l0Y2ggKG1fdmFyc1tpXS50eXBlLmRzdCkgeworICAgICAgICAgICAgY2FzZSBjX2RhdGFfcHRyX2FycmF5OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBjX2RhdGE6CisgICAgICAgICAgICBjYXNlIGNfdm9pZF9wdHI6CisgICAgICAgICAgICBjYXNlIGNfY2Vhbl92YXI6CisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uaW4gJiYKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpY19kc3RuKSB7CisgICAgICAgICAgICAgICAgICAgIENPSUVWRU5UICpldmVudCA9CisgICAgICAgICAgICAgICAgICAgICAgICAoaXNfYXN5bmMgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSA+PSBfX29mZmxvYWRfdXNlX2FzeW5jX2J1ZmZlcl93cml0ZSkgPworICAgICAgICAgICAgICAgICAgICAgICAgJm1faW5fZGVwc1ttX2luX2RlcHNfdG90YWwrK10gOiAwOworICAgICAgICAgICAgICAgICAgICBQdHJEYXRhKiBkc3RfZGF0YSA9IG1fdmFyc1tpXS5pbnRvID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmRzdF9kYXRhIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhOworICAgICAgICAgICAgICAgICAgICBQdHJEYXRhKiBzcmNfZGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICBWQVJfVFlQRV9JU19QVFIobV92YXJzW2ldLnR5cGUuc3JjKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgVkFSX1RZUEVfSVNfU0NBTEFSKG1fdmFyc1tpXS50eXBlLnNyYykgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWMgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhIDogMDsKKworICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfc3JjIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfbm9uY29udF9kc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VuZF9ub25jb250aWd1b3VzX3BvaW50ZXJfZGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgc3JjX2RhdGEsIGRzdF9kYXRhLCBldmVudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3JjX2RhdGEgIT0gMCAmJiBzcmNfZGF0YS0+Y3B1X2J1ZiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBDT0k6OkJ1ZmZlckNvcHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2RhdGEtPm1pY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2RhdGEtPmNwdV9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm1pY19vZmZzZXQgLSBkc3RfZGF0YS0+YWxsb2NfZGlzcCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCArIG1fdmFyc1tpXS5kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5jcHVfb2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0NPUFlfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX2NvcHksIHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpiYXNlID0gb2ZmbG9hZF9nZXRfc3JjX2Jhc2UobV92YXJzW2ldLnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0udHlwZS5zcmMpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gQ09JOjpCdWZmZXJXcml0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfZGF0YS0+bWljX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCAtIGRzdF9kYXRhLT5hbGxvY19kaXNwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0ICsgbV92YXJzW2ldLmRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSArIG1fdmFyc19leHRyYVtpXS5jcHVfZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQ09QWV9VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfd3JpdGUsIHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHRyX3NlbnQgKz0gbV92YXJzW2ldLnNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGNfc3RyaW5nX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19kYXRhX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19jZWFuX3Zhcl9wdHI6CisgICAgICAgICAgICBjYXNlIGNfZHZfcHRyOgorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmluICYmIG1fdmFyc1tpXS5zaXplID4gMCkgeworICAgICAgICAgICAgICAgICAgICBDT0lFVkVOVCAqZXZlbnQgPQorICAgICAgICAgICAgICAgICAgICAgICAgKGlzX2FzeW5jIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUgPj0gX19vZmZsb2FkX3VzZV9hc3luY19idWZmZXJfd3JpdGUpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICZtX2luX2RlcHNbbV9pbl9kZXBzX3RvdGFsKytdIDogMDsKKyAgICAgICAgICAgICAgICAgICAgUHRyRGF0YSogZHN0X2RhdGEgPSBtX3ZhcnNbaV0uaW50byA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5kc3RfZGF0YSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgUHRyRGF0YSogc3JjX2RhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgVkFSX1RZUEVfSVNfUFRSKG1fdmFyc1tpXS50eXBlLnNyYykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZBUl9UWVBFX0lTX1NDQUxBUihtX3ZhcnNbaV0udHlwZS5zcmMpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGEgOiAwOworCisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3MuaXNfbm9uY29udF9zcmMgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19ub25jb250X2RzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2VuZF9ub25jb250aWd1b3VzX3BvaW50ZXJfZGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBzcmNfZGF0YSwgZHN0X2RhdGEsIGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzcmNfZGF0YSAhPSAwICYmIHNyY19kYXRhLT5jcHVfYnVmICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IENPSTo6QnVmZmVyQ29weSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfZGF0YS0+bWljX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfZGF0YS0+Y3B1X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCAtIGRzdF9kYXRhLT5hbGxvY19kaXNwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0ICsgbV92YXJzW2ldLmRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmNwdV9vZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5jcHVfZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQ09QWV9VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfY29weSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmJhc2UgPSBvZmZsb2FkX2dldF9zcmNfYmFzZShtX3ZhcnNbaV0ucHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS50eXBlLnNyYyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBDT0k6OkJ1ZmZlcldyaXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9kYXRhLT5taWNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0IC0gZHN0X2RhdGEtPmFsbG9jX2Rpc3AgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgKyBtX3ZhcnNbaV0uZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlICsgbV92YXJzX2V4dHJhW2ldLmNwdV9kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9DT1BZX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl93cml0ZSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHB0cl9zZW50ICs9IG1fdmFyc1tpXS5zaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX2R2X2RhdGE6CisgICAgICAgICAgICBjYXNlIGNfZHZfcHRyX2RhdGE6CisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uaW4gJiYKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIFB0ckRhdGEgKnB0cl9kYXRhID0gbV92YXJzW2ldLmludG8gPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5kc3RfZGF0YSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhOworICAgICAgICAgICAgICAgICAgICBQdHJEYXRhKiBzcmNfZGF0YSA9IG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YTsKKworICAgICAgICAgICAgICAgICAgICBDT0lFVkVOVCAqZXZlbnQgPQorICAgICAgICAgICAgICAgICAgICAgICAgKGlzX2FzeW5jIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUgPj0gX19vZmZsb2FkX3VzZV9hc3luY19idWZmZXJfd3JpdGUpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICZtX2luX2RlcHNbbV9pbl9kZXBzX3RvdGFsKytdIDogMDsKKworICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfc3JjIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfbm9uY29udF9kc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRfbm9uY29udGlndW91c19wb2ludGVyX2RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgc3JjX2RhdGEsIHB0cl9kYXRhLCBldmVudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3JjX2RhdGEgJiYgc3JjX2RhdGEtPmNwdV9idWYgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gQ09JOjpCdWZmZXJDb3B5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5taWNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19kYXRhLT5jcHVfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgKyBwdHJfZGF0YS0+bWljX29mZnNldCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPmFsbG9jX2Rpc3AgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5jcHVfb2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0NPUFlfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX2NvcHksIHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpiYXNlID0gb2ZmbG9hZF9nZXRfc3JjX2Jhc2UobV92YXJzW2ldLnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0udHlwZS5zcmMpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gQ09JOjpCdWZmZXJXcml0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YS0+bWljX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YS0+bWljX29mZnNldCAtIHB0cl9kYXRhLT5hbGxvY19kaXNwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0ICsgbV92YXJzW2ldLmRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSArIG1fdmFyc19leHRyYVtpXS5jcHVfZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQ09QWV9VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfd3JpdGUsIHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHRyX3NlbnQgKz0gbV92YXJzW2ldLnNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGNfZHZfZGF0YV9zbGljZToKKyAgICAgICAgICAgIGNhc2UgY19kdl9wdHJfZGF0YV9zbGljZToKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5pbiAmJgorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgUHRyRGF0YSAqZHN0X2RhdGEgPSBtX3ZhcnNbaV0uaW50byA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmRzdF9kYXRhIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGE7CisgICAgICAgICAgICAgICAgICAgIFB0ckRhdGEqIHNyY19kYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChWQVJfVFlQRV9JU19QVFIobV92YXJzW2ldLnR5cGUuc3JjKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgVkFSX1RZUEVfSVNfRFZfREFUQShtX3ZhcnNbaV0udHlwZS5zcmMpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBWQVJfVFlQRV9JU19EVl9EQVRBX1NMSUNFKG1fdmFyc1tpXS50eXBlLnNyYykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZBUl9UWVBFX0lTX1NDQUxBUihtX3ZhcnNbaV0udHlwZS5zcmMpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhIDogMDsKKyAgICAgICAgICAgICAgICAgICAgQ09JRVZFTlQgKmV2ZW50ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChpc19hc3luYyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplID49IF9fb2ZmbG9hZF91c2VfYXN5bmNfYnVmZmVyX3dyaXRlKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAmbV9pbl9kZXBzW21faW5fZGVwc190b3RhbCsrXSA6IDA7CisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3MuaXNfbm9uY29udF9zcmMgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19ub25jb250X2RzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2VuZF9ub25jb250aWd1b3VzX3BvaW50ZXJfZGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBzcmNfZGF0YSwgZHN0X2RhdGEsIGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzcmNfZGF0YSAmJiBzcmNfZGF0YS0+Y3B1X2J1ZiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBDT0k6OkJ1ZmZlckNvcHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2RhdGEtPm1pY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2RhdGEtPmNwdV9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCAtIGRzdF9kYXRhLT5hbGxvY19kaXNwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfZGF0YS0+bWljX29mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmNwdV9vZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5jcHVfZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQ09QWV9VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfY29weSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmJhc2UgPSBvZmZsb2FkX2dldF9zcmNfYmFzZShtX3ZhcnNbaV0ucHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS50eXBlLnNyYyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBDT0k6OkJ1ZmZlcldyaXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9kYXRhLT5taWNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9kYXRhLT5taWNfb2Zmc2V0IC0gZHN0X2RhdGEtPmFsbG9jX2Rpc3AgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgKyBtX3ZhcnNbaV0uZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlICsgbV92YXJzX2V4dHJhW2ldLmNwdV9kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9DT1BZX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl93cml0ZSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHB0cl9zZW50ICs9IG1fdmFyc1tpXS5zaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGFsbG9jIGZpZWxkIGlzbid0IHVzZWQgYXQgdGFyZ2V0LgorICAgICAgICAvLyBXZSBjYW4gcmV1c2UgaXQgZm9yIG9mZnNldCBvZiBhcnJheSBwb2ludGVycy4KKyAgICAgICAgaWYgKG1fdmFyc19leHRyYVtpXS5pc19hcnJfcHRyX2VsKSB7CisgICAgICAgICAgICBtX3ZhcnNbaV0ucHRyX2Fycl9vZmZzZXQgPSBtX3ZhcnNfZXh0cmFbaV0ucHRyX2Fycl9vZmZzZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobV9zdGF0dXMpIHsKKyAgICAgICAgbV9zdGF0dXMtPmRhdGFfc2VudCArPSBwdHJfc2VudDsKKyAgICB9CisKKyAgICBPRkZMT0FEX1RJTUVSX0hPU1RfU0RBVEEoZ2V0X3RpbWVyX2RhdGEoKSwgcHRyX3NlbnQpOworICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSgxLCBHRVRfT0ZGTE9BRF9OVU1CRVIoZ2V0X3RpbWVyX2RhdGEoKSksCisgICAgICAgICAgICAgICAgICBjX29mZmxvYWRfc2VudF9wb2ludGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAiVG90YWwgcG9pbnRlciBkYXRhIHNlbnQgdG8gdGFyZ2V0OiBbJWxsZF0gYnl0ZXNcbiIsCisgICAgICAgICAgICAgICAgICBwdHJfc2VudCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBPZmZsb2FkRGVzY3JpcHRvcjo6Z2F0aGVyX2NvcHlpbl9kYXRhKCkKK3sKKyAgICBPZmZsb2FkVGltZXIgdGltZXIoZ2V0X3RpbWVyX2RhdGEoKSwgY19vZmZsb2FkX2hvc3RfZ2F0aGVyX2lucHV0cyk7CisKKyAgICBpZiAobV9uZWVkX3J1bmZ1bmN0aW9uICYmIG1faW5fZGF0YWxlbiA+IDApIHsKKyAgICAgICAgQ09JTUFQSU5TVEFOQ0UgbWFwX2luc3Q7CisgICAgICAgIGNoYXIgKmRhdGE7CisKKyAgICAgICAgLy8gaW5pdCBtYXJzaGFsbGVyCisgICAgICAgIGlmIChtX2lub3V0X2J1ZiAhPSAwKSB7CisgICAgICAgICAgICBPZmZsb2FkVGltZXIgdGltZXJfbWFwKGdldF90aW1lcl9kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfb2ZmbG9hZF9ob3N0X21hcF9pbl9kYXRhX2J1ZmZlcik7CisKKyAgICAgICAgICAgIENPSVJFU1VMVCByZXMgPSBDT0k6OkJ1ZmZlck1hcChtX2lub3V0X2J1ZiwgMCwgbV9pbl9kYXRhbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9NQVBfV1JJVEVfRU5USVJFX0JVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAmbWFwX2luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkKio+KCZkYXRhKSk7CisgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX21hcCwgcmVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGRhdGEgPSAoY2hhciopIG1fZnVuY19kZXNjICsgbV9mdW5jX2Rlc2MtPmRhdGFfb2Zmc2V0OworICAgICAgICB9CisKKyAgICAgICAgLy8gc2VuZCB2YXJpYWJsZSBkZXNjcmlwdG9ycworICAgICAgICBtZW1jcHkoZGF0YSwgbV92YXJzLCBtX3ZhcnNfdG90YWwgKiBzaXplb2YoVmFyRGVzYykpOworICAgICAgICBkYXRhICs9IG1fdmFyc190b3RhbCAqIHNpemVvZihWYXJEZXNjKTsKKworICAgICAgICAvLyBpbml0IG1hcnNoYWxsZXIKKyAgICAgICAgbV9pbi5pbml0X2J1ZmZlcihkYXRhLCBtX2luX2RhdGFsZW4pOworCisgICAgICAgIC8vIEdhdGhlciBjb3B5IGRhdGEgaW50byBidWZmZXIKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX3ZhcnNfdG90YWw7IGkrKykgeworICAgICAgICAgICAgYm9vbCBzcmNfaXNfZm9yX21pYyA9IChtX3ZhcnNbaV0uZGlyZWN0aW9uLm91dCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uaW50byA9PSBOVUxMKTsKKyAgICAgICAgICAgIFB0ckRhdGEqIHB0cl9kYXRhID0gc3JjX2lzX2Zvcl9taWMgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uZHN0X2RhdGE7CisgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmFsbG9jX2Rpc3ApIHsKKyAgICAgICAgICAgICAgICBtX2luLnNlbmRfZGF0YSgmcHRyX2RhdGEtPmFsbG9jX2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHB0cl9kYXRhLT5hbGxvY19kaXNwKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHNlbmQgc2luayBhZGRyZXNzIHRvIHRoZSB0YXJnZXQKKyAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyKSB7CisgICAgICAgICAgICAgICAgbV9pbi5zZW5kX2RhdGEoJnB0cl9kYXRhLT5taWNfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocHRyX2RhdGEtPm1pY19hZGRyKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAobV92YXJzW2ldLnR5cGUuZHN0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBjX2RhdGFfcHRyX2FycmF5OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGNfZGF0YToKKyAgICAgICAgICAgICAgICBjYXNlIGNfdm9pZF9wdHI6CisgICAgICAgICAgICAgICAgY2FzZSBjX2NlYW5fdmFyOgorICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5pbiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIW1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWNfZHN0bikgeworCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpwdHIgPSBvZmZsb2FkX2dldF9zcmNfYmFzZShtX3ZhcnNbaV0ucHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnR5cGUuc3JjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0udHlwZS5kc3QgPT0gY19jZWFuX3ZhcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldCBhbmQgbGVuZ3RoIGFyZSBkZXJpdmVkIGZyb20gdGhlIGFycmF5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgc2l6ZSA9IG1fdmFyc1tpXS5zaXplOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgZGlzcCA9IG1fdmFyc1tpXS5kaXNwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW4uc2VuZF9kYXRhKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZzaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW50NjRfdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW4uc2VuZF9kYXRhKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZkaXNwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW50NjRfdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBtX2luLnNlbmRfZGF0YShwdHIgKyBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIGNfZHY6CisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5hbGxvY19pZiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZyZWVfaWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlbmQgZG9wZSB2ZWN0b3IgZXhjbHVkaW5nIGJhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnB0ciA9IHN0YXRpY19jYXN0PGNoYXIqPihtX3ZhcnNbaV0ucHRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1faW4uc2VuZF9kYXRhKHB0ciArIHNpemVvZih1aW50NjRfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSAtIHNpemVvZih1aW50NjRfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBjX2RhdGFfcHRyOgorICAgICAgICAgICAgICAgICAgICAvLyBzZW5kIHRvIHRhcmdldCBhZGRyZXNzZXMgb2Ygb2Jzb2xldGUKKyAgICAgICAgICAgICAgICAgICAgLy8gc3RhY2tzIHRvIGJlIHJlbGVhc2VkCisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhY2tfYnVmICYmCisgICAgICAgICAgICAgICAgICAgICAgICAhbV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzICYmCisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uYWxsb2NfaWYgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoUHRyRGF0YUxpc3Q6Oml0ZXJhdG9yIGl0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2Rlc3Ryb3lfc3RhY2suYmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCAhPSBtX2Rlc3Ryb3lfc3RhY2suZW5kKCk7IGl0KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJEYXRhICogcHRyX2RhdGEgPSAqaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbi5zZW5kX2RhdGEoJihwdHJfZGF0YS0+bWljX2FkZHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocHRyX2RhdGEtPm1pY19hZGRyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBjX2Z1bmNfcHRyOgorICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5pbikgeworICAgICAgICAgICAgICAgICAgICAgICAgbV9pbi5zZW5kX2Z1bmNfcHRyKCooKGNvbnN0IHZvaWQqKikgbV92YXJzW2ldLnB0cikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobV9zdGF0dXMpIHsKKyAgICAgICAgICAgIG1fc3RhdHVzLT5kYXRhX3NlbnQgKz0gbV9pbi5nZXRfdGZyX3NpemUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtX2Z1bmNfZGVzYy0+ZGF0YV9vZmZzZXQgPT0gMCkgeworICAgICAgICAgICAgT2ZmbG9hZFRpbWVyIHRpbWVyX3VubWFwKGdldF90aW1lcl9kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19vZmZsb2FkX2hvc3RfdW5tYXBfaW5fZGF0YV9idWZmZXIpOworICAgICAgICAgICAgQ09JUkVTVUxUIHJlcyA9IENPSTo6QnVmZmVyVW5tYXAobWFwX2luc3QsIDAsIDAsIDApOworICAgICAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl91bm1hcCwgcmVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIE9GRkxPQURfVElNRVJfSE9TVF9TREFUQShnZXRfdGltZXJfZGF0YSgpLCBtX2luLmdldF90ZnJfc2l6ZSgpKTsKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoMSwKKyAgICAgICAgICAgICAgICAgIEdFVF9PRkZMT0FEX05VTUJFUihnZXRfdGltZXJfZGF0YSgpKSwgY19vZmZsb2FkX2NvcHlpbl9kYXRhLAorICAgICAgICAgICAgICAgICAgIlRvdGFsIGNvcHlpbiBkYXRhIHNlbnQgdG8gdGFyZ2V0OiBbJWxsZF0gYnl0ZXNcbiIsCisgICAgICAgICAgICAgICAgICBtX2luLmdldF90ZnJfc2l6ZSgpKTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE9mZmxvYWREZXNjcmlwdG9yOjpjb21wdXRlKCkKK3sKKyAgICBPZmZsb2FkVGltZXIgdGltZXIoZ2V0X3RpbWVyX2RhdGEoKSwgY19vZmZsb2FkX2hvc3Rfc3RhcnRfY29tcHV0ZSk7CisKKyAgICBpZiAobV9uZWVkX3J1bmZ1bmN0aW9uKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSgyLCBHRVRfT0ZGTE9BRF9OVU1CRVIoZ2V0X3RpbWVyX2RhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX29mZmxvYWRfY29tcHV0ZSwgIkNvbXB1dGUgdGFzayBvbiBNSUNcbiIpOworCisgICAgICAgIHZvaWQqIG1pc2MgPSBtX2Z1bmNfZGVzYzsKKyAgICAgICAgaW50ICAgbWlzY19sZW4gPSBtX2Z1bmNfZGVzY19zaXplOworICAgICAgICB2b2lkKiByZXQgPSAwOworICAgICAgICBpbnQgICByZXRfbGVuID0gMDsKKworICAgICAgICBpZiAobV9mdW5jX2Rlc2MtPmRhdGFfb2Zmc2V0ICE9IDApIHsKKyAgICAgICAgICAgIG1pc2NfbGVuICs9IG1faW5fZGF0YWxlbjsKKworICAgICAgICAgICAgaWYgKG1fb3V0X2RhdGFsZW4gPiAwKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gKGNoYXIqKSBtX2Z1bmNfZGVzYyArIG1fZnVuY19kZXNjLT5kYXRhX29mZnNldDsKKyAgICAgICAgICAgICAgICByZXRfbGVuID0gbV9vdXRfZGF0YWxlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGRpc3BhdGNoIHRhc2sKKyAgICAgICAgQ09JUkVTVUxUIHJlczsKKyAgICAgICAgQ09JRVZFTlQgZXZlbnQ7CisgICAgICAgIHJlcyA9IG1fZGV2aWNlLmNvbXB1dGUobV9jb21wdXRlX2J1ZmZlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzYywgbWlzY19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LCByZXRfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGVwc190b3RhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luX2RlcHNfdG90YWwgPiAwID8gbV9pbl9kZXBzIDogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXZlbnQpOworICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX3BpcGVsaW5lX3J1bl9mdW5jLCByZXMpOworICAgICAgICB9CisKKyAgICAgICAgbV9pbl9kZXBzX3RvdGFsID0gMTsKKyAgICAgICAgbV9pbl9kZXBzWzBdID0gZXZlbnQ7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIHJlY2VpdmUgcG9pbnRlciBkYXRhIGlmIHNvdXJjZSBvciBkZXN0aW5hdGlvbiBvciBib3RoIG9mIHRoZW0gYXJlCisvLyBub25jb250aWd1b3VzLiBUaGVyZSBpcyBndWFyYW50ZWUgdGhhdCBsZW5ndGggb2YgZGVzdGluYXRpb24gZW5vdWdoIGZvcgorLy8gdHJhbnNmZXJyZWQgZGF0YS4KK2Jvb2wgT2ZmbG9hZERlc2NyaXB0b3I6OnJlY2VpdmVfbm9uY29udGlndW91c19wb2ludGVyX2RhdGEoCisgICAgaW50IGksCisgICAgY2hhciogYmFzZSwKKyAgICBDT0lCVUZGRVIgZHN0X2J1ZiwKKyAgICBDT0lFVkVOVCAqZXZlbnQKKykKK3sKKyAgICBpbnQ2NF90IG9mZnNldF9zcmMsIG9mZnNldF9kc3Q7CisgICAgaW50NjRfdCBsZW5ndGhfc3JjLCBsZW5ndGhfZHN0OworICAgIGludDY0X3QgbGVuZ3RoX3NyY19jdXIsIGxlbmd0aF9kc3RfY3VyOworICAgIGludDY0X3QgcmVjZWl2ZV9zaXplLCBkYXRhX3JlY2VpdmVkID0gMDsKKyAgICBDT0lSRVNVTFQgcmVzOworICAgIGJvb2wgZHN0X2lzX2VtcHR5ID0gdHJ1ZTsKKyAgICBib29sIHNyY19pc19lbXB0eSA9IHRydWU7CisKKyAgICAvLyBTZXQgbGVuZ3RoX3NyYyBhbmQgbGVuZ3RoX2RzdAorICAgIGxlbmd0aF9zcmMgPSAobV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX3NyYykgPworICAgICAgICBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfc3JjLT5yYW5nZV9zaXplIDogbV92YXJzW2ldLnNpemU7CisgICAgbGVuZ3RoX2RzdCA9ICFtX3ZhcnNbaV0uaW50byA/IGxlbmd0aF9zcmMgOgorICAgICAgICAgICAgICAgICAgICAgKG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19kc3QpID8KKyAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19kc3QtPnJhbmdlX3NpemUgOiBtX3ZhcnNbaV0uc2l6ZTsKKyAgICByZWNlaXZlX3NpemUgPSAobGVuZ3RoX3NyYyA8IGxlbmd0aF9kc3QpID8gbGVuZ3RoX3NyYyA6IGxlbmd0aF9kc3Q7CisKKyAgICAvLyBjb25zZXF1ZW50bHkgZ2V0IGNvbnRpZ3VvdXMgcmFuZ2VzLAorICAgIC8vIGRlZmluZSBjb3JyZXNwb25kZWQgZGVzdGluYXRpb24gb2Zmc2V0IGFuZCByZWNlaXZlIGRhdGEKKyAgICBkbyB7CisgICAgICAgIC8vIGdldCBzb3JjZSBvZmZzZXQKKyAgICAgICAgaWYgKHNyY19pc19lbXB0eSkgeworICAgICAgICAgICAgaWYgKG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWdldF9uZXh0X3JhbmdlKG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldF9zcmMpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHNvdXJjZSByYW5nZXMgYXJlIG92ZXIgLSBub3RoaW5nIHRvIHNlbmQKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoZGF0YV9yZWNlaXZlZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgb2Zmc2V0X3NyYyA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxlbmd0aF9zcmNfY3VyID0gbGVuZ3RoX3NyYzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIGlmIHNvdXJjZSBpcyBjb250aWd1b3VzIG9yIGl0cyBjb250aWd1b3VzIHJhbmdlIGlzIGdyZWF0ZXIKKyAgICAgICAgICAgIC8vIHRoYW4gZGVzdGluYXRpb24gb25lCisgICAgICAgICAgICBvZmZzZXRfc3JjICs9IHJlY2VpdmVfc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBsZW5ndGhfc3JjX2N1ciAtPSByZWNlaXZlX3NpemU7CisgICAgICAgIHNyY19pc19lbXB0eSA9IGxlbmd0aF9zcmNfY3VyID09IDA7CisKKyAgICAgICAgLy8gZ2V0IGRlc3RpbmF0aW9uIG9mZnNldAorICAgICAgICBpZiAoZHN0X2lzX2VtcHR5KSB7CisgICAgICAgICAgICBpZiAobV92YXJzW2ldLmludG8pIHsKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX2RzdCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWdldF9uZXh0X3JhbmdlKG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19kc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXRfZHN0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVzdGluYXRpb24gcmFuZ2VzIGFyZSBvdmVyCisgICAgICAgICAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfZGVzdGluYXRpb25faXNfb3Zlcik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gZGVzdGluYXRpb24gaXMgY29udGlndW91cy4KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0X2RzdCA9IG1fdmFyc19leHRyYVtpXS5jcHVfZGlzcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGVuZ3RoX2RzdF9jdXIgPSBsZW5ndGhfZHN0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gc2FtZSBhcyBzb3VyY2UKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIG9mZnNldF9kc3QgPSBvZmZzZXRfc3JjOworICAgICAgICAgICAgICAgIGxlbmd0aF9kc3RfY3VyID0gbGVuZ3RoX3NyYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIGlmIGRlc3RpbmF0aW9uIGlzIGNvbnRpZ3VvdXMgb3IgaXRzIGNvbnRpZ3VvdXMgcmFuZ2UgaXMgZ3JlYXRlcgorICAgICAgICAgICAgLy8gdGhhbiBzb3VyY2Ugb25lCisgICAgICAgICAgICBvZmZzZXRfZHN0ICs9IHJlY2VpdmVfc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBsZW5ndGhfZHN0X2N1ciAtPSByZWNlaXZlX3NpemU7CisgICAgICAgIGRzdF9pc19lbXB0eSA9IGxlbmd0aF9kc3RfY3VyID09IDA7CisKKyAgICAgICAgaWYgKGRzdF9idWYgIT0gMCkgeworICAgICAgICAgICAgcmVzID0gQ09JOjpCdWZmZXJDb3B5KAorICAgICAgICAgICAgICAgIGRzdF9idWYsCisgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhLT5taWNfYnVmLAorICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5jcHVfb2Zmc2V0ICsgb2Zmc2V0X2RzdCwKKyAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0ICsgb2Zmc2V0X3NyYyArCisgICAgICAgICAgICAgICAgbV92YXJzW2ldLm1pY19vZmZzZXQgLQorICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YS0+YWxsb2NfZGlzcCwKKyAgICAgICAgICAgICAgICByZWNlaXZlX3NpemUsCisgICAgICAgICAgICAgICAgQ09JX0NPUFlfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgbV9pbl9kZXBzX3RvdGFsLAorICAgICAgICAgICAgICAgIG1faW5fZGVwc190b3RhbCA+IDAgPyBtX2luX2RlcHMgOiAwLAorICAgICAgICAgICAgICAgIGV2ZW50KTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfY29weSwgcmVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJlcyA9IENPSTo6QnVmZmVyUmVhZCgKKyAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGEtPm1pY19idWYsCisgICAgICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCArIG9mZnNldF9zcmMgKworICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0IC0KKyAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGEtPmFsbG9jX2Rpc3AsCisgICAgICAgICAgICAgICAgYmFzZSArIG9mZnNldF9kc3QsCisgICAgICAgICAgICAgICAgcmVjZWl2ZV9zaXplLAorICAgICAgICAgICAgICAgIENPSV9DT1BZX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgIG1faW5fZGVwc190b3RhbCwKKyAgICAgICAgICAgICAgICBtX2luX2RlcHNfdG90YWwgPiAwID8gbV9pbl9kZXBzIDogMCwKKyAgICAgICAgICAgICAgICBldmVudCk7CisgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX3JlYWQsIHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZGF0YV9yZWNlaXZlZCArPSByZWNlaXZlX3NpemU7CisgICAgfQorICAgIHdoaWxlICh0cnVlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBPZmZsb2FkRGVzY3JpcHRvcjo6cmVjZWl2ZV9wb2ludGVyX2RhdGEoYm9vbCBpc19hc3luYykKK3sKKyAgICBPZmZsb2FkVGltZXIgdGltZXIoZ2V0X3RpbWVyX2RhdGEoKSwgY19vZmZsb2FkX2hvc3Rfc3RhcnRfYnVmZmVyc19yZWFkcyk7CisKKyAgICB1aW50NjRfdCBwdHJfcmVjZWl2ZWQgPSAwOworICAgIENPSVJFU1VMVCByZXM7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fdmFyc190b3RhbDsgaSsrKSB7CisgICAgICAgIHN3aXRjaCAobV92YXJzW2ldLnR5cGUuc3JjKSB7CisgICAgICAgICAgICBjYXNlIGNfZGF0YV9wdHJfYXJyYXk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGNfZGF0YToKKyAgICAgICAgICAgIGNhc2UgY192b2lkX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19jZWFuX3ZhcjoKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5vdXQgJiYKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpYykgeworICAgICAgICAgICAgICAgICAgICBDT0lFVkVOVCAqZXZlbnQgPQorICAgICAgICAgICAgICAgICAgICAgICAgKGlzX2FzeW5jIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbl9kZXBzX3RvdGFsID4gMCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplID49IF9fb2ZmbG9hZF91c2VfYXN5bmNfYnVmZmVyX3JlYWQpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICZtX291dF9kZXBzW21fb3V0X2RlcHNfdG90YWwrK10gOiAwOworICAgICAgICAgICAgICAgICAgICBQdHJEYXRhICpwdHJfZGF0YSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIENPSUJVRkZFUiBkc3RfYnVmID0gTlVMTDsgLy8gYnVmZmVyIGF0IGhvc3QKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqYmFzZTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoVkFSX1RZUEVfSVNfUFRSKG1fdmFyc1tpXS50eXBlLmRzdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhID0gbV92YXJzW2ldLmludG8gPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uZHN0X2RhdGEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoVkFSX1RZUEVfSVNfU0NBTEFSKG1fdmFyc1tpXS50eXBlLmRzdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljX2RzdG4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YSA9IG1fdmFyc1tpXS5pbnRvID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5kc3RfZGF0YSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZHN0X2J1ZiA9IHB0cl9kYXRhID8gcHRyX2RhdGEtPmNwdV9idWYgOiBOVUxMOworICAgICAgICAgICAgICAgICAgICBpZiAoZHN0X2J1ZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlID0gb2ZmbG9hZF9nZXRfc3JjX2Jhc2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmludG8gPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNoYXIqPihtX3ZhcnNbaV0uaW50bykgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNoYXIqPihtX3ZhcnNbaV0ucHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0udHlwZS5kc3QpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5pc19ub25jb250X3NyYyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfZHN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlX25vbmNvbnRpZ3VvdXNfcG9pbnRlcl9kYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGJhc2UsIGRzdF9idWYsIGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkc3RfYnVmICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IENPSTo6QnVmZmVyQ29weSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YS0+bWljX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X29mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmNwdV9kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgKyBtX3ZhcnNbaV0uZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQ09QWV9VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luX2RlcHNfdG90YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbl9kZXBzX3RvdGFsID4gMCA/IG1faW5fZGVwcyA6IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl9jb3B5LCByZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBDT0k6OkJ1ZmZlclJlYWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhLT5taWNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgKyBtX3ZhcnNbaV0uZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlICsgbV92YXJzX2V4dHJhW2ldLmNwdV9vZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5jcHVfZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQ09QWV9VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luX2RlcHNfdG90YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbl9kZXBzX3RvdGFsID4gMCA/IG1faW5fZGVwcyA6IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl9yZWFkLCByZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB0cl9yZWNlaXZlZCArPSBtX3ZhcnNbaV0uc2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY19zdHJpbmdfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2RhdGFfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2NlYW5fdmFyX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19kdl9kYXRhOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cl9kYXRhOgorICAgICAgICAgICAgY2FzZSBjX2R2X2RhdGFfc2xpY2U6CisgICAgICAgICAgICBjYXNlIGNfZHZfcHRyX2RhdGFfc2xpY2U6CisgICAgICAgICAgICBjYXNlIGNfZHZfcHRyOiB7CisgICAgICAgICAgICAgICAgQ09JQlVGRkVSIGRzdF9idWYgPSBOVUxMOyAvLyBidWZmZXIgb24gaG9zdAorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLm91dCAmJiBtX3ZhcnNbaV0uc2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQ09JRVZFTlQgKmV2ZW50ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChpc19hc3luYyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGVwc190b3RhbCA+IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSA+PSBfX29mZmxvYWRfdXNlX2FzeW5jX2J1ZmZlcl9yZWFkKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAmbV9vdXRfZGVwc1ttX291dF9kZXBzX3RvdGFsKytdIDogMDsKKworICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBkc3Rfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqYmFzZSA9IHN0YXRpY19jYXN0PGNoYXIqPihtX3ZhcnNbaV0ucHRyKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoVkFSX1RZUEVfSVNfUFRSKG1fdmFyc1tpXS50eXBlLmRzdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB0ckRhdGEgKnB0cl9kYXRhID0gbV92YXJzW2ldLmludG8gPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uZHN0X2RhdGEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICBkc3RfYnVmID0gcHRyX2RhdGEgPyBwdHJfZGF0YS0+Y3B1X2J1ZiA6IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHN0X2J1ZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSA9IG1fdmFyc1tpXS5pbnRvID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0YXRpY19jYXN0PGNoYXIqKj4obV92YXJzW2ldLmludG8pIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0YXRpY19jYXN0PGNoYXIqKj4obV92YXJzW2ldLnB0cik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBkc3Rfb2Zmc2V0ID0gbV92YXJzX2V4dHJhW2ldLmNwdV9vZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5jcHVfZGlzcDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChWQVJfVFlQRV9JU19TQ0FMQVIobV92YXJzW2ldLnR5cGUuZHN0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWNfZHN0bikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9idWYgPSBtX3ZhcnNbaV0uaW50byA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmRzdF9kYXRhLT5jcHVfYnVmIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGEtPmNwdV9idWY7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHN0X2J1ZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSA9IG9mZmxvYWRfZ2V0X3NyY19iYXNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uaW50byA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNoYXIqPihtX3ZhcnNbaV0uaW50bykgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjaGFyKj4obV92YXJzW2ldLnB0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS50eXBlLmRzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBkc3Rfb2Zmc2V0ID0gbV92YXJzX2V4dHJhW2ldLmNwdV9vZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5jcHVfZGlzcDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChWQVJfVFlQRV9JU19EVl9EQVRBKG1fdmFyc1tpXS50eXBlLmRzdCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFSX1RZUEVfSVNfRFZfREFUQV9TTElDRShtX3ZhcnNbaV0udHlwZS5kc3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQdHJEYXRhICpwdHJfZGF0YSA9IG1fdmFyc1tpXS5pbnRvICE9IDAgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uZHN0X2RhdGEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICBkc3RfYnVmID0gcHRyX2RhdGEgIT0gMCA/IHB0cl9kYXRhLT5jcHVfYnVmIDogMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkc3RfYnVmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlID0gb2ZmbG9hZF9nZXRfc3JjX2Jhc2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5pbnRvID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2hhcio+KG1fdmFyc1tpXS5pbnRvKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNoYXIqPihtX3ZhcnNbaV0ucHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnR5cGUuZHN0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZHN0X29mZnNldCA9IG1fdmFyc19leHRyYVtpXS5jcHVfb2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3A7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfc3JjIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfbm9uY29udF9kc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVfbm9uY29udGlndW91c19wb2ludGVyX2RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgYmFzZSwgZHN0X2J1ZiwgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRzdF9idWYgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gQ09JOjpCdWZmZXJDb3B5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhLT5taWNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCArIG1fdmFyc1tpXS5kaXNwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm1pY19vZmZzZXQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGEtPmFsbG9jX2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0NPUFlfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbl9kZXBzX3RvdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGVwc190b3RhbCA+IDAgPyBtX2luX2RlcHMgOiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfY29weSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IENPSTo6QnVmZmVyUmVhZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGEtPm1pY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCArIG1fdmFyc1tpXS5kaXNwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm1pY19vZmZzZXQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGEtPmFsbG9jX2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSArIGRzdF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0NPUFlfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbl9kZXBzX3RvdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGVwc190b3RhbCA+IDAgPyBtX2luX2RlcHMgOiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfcmVhZCwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdHJfcmVjZWl2ZWQgKz0gbV92YXJzW2ldLnNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gZGVzdHJveSBidWZmZXJzIGZvciBvYnNvbGV0ZSBzdGFja3MKKyAgICAgICAgaWYgKG1fZGVzdHJveV9zdGFjay5zaXplKCkgIT0gMCkgeworICAgICAgICAgICAgZm9yIChQdHJEYXRhTGlzdDo6aXRlcmF0b3IgaXQgPSBtX2Rlc3Ryb3lfc3RhY2suYmVnaW4oKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBtX2Rlc3Ryb3lfc3RhY2suZW5kKCk7IGl0KyspIHsKKyAgICAgICAgICAgICAgICBQdHJEYXRhICpwdHJfZGF0YSA9ICppdDsKKyAgICAgICAgICAgICAgICBtX2Rlc3Ryb3lfYnVmZmVycy5wdXNoX2JhY2socHRyX2RhdGEtPm1pY19idWYpOworICAgICAgICAgICAgICAgIE9GRkxPQURfVFJBQ0UoMywgIlJlbW92aW5nIHN0YWNrIGJ1ZmZlciB3aXRoIGFkZHIgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPm1pY19hZGRyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1fZGVzdHJveV9zdGFjay5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIGlmIChtX3ZhcnNbaV0uZnJlZV9pZikgeworICAgICAgICAgICAgLy8gcmVtb3ZlIGFzc29jaWF0aW9uIGZvciBhdXRvbWF0aWMgdmFyaWFibGVzCisgICAgICAgICAgICBpZiAobV9pc19vcGVubXAgJiYgIW1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWMgJiYKKyAgICAgICAgICAgICAgICAobV92YXJzW2ldLnR5cGUuc3JjID09IGNfZGF0YSB8fAorICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0udHlwZS5zcmMgPT0gY192b2lkX3B0ciB8fAorICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0udHlwZS5zcmMgPT0gY19jZWFuX3ZhcikpIHsKKyAgICAgICAgICAgICAgICBBdXRvRGF0YSAqYXV0b19kYXRhID0gbV92YXJzX2V4dHJhW2ldLmF1dG9fZGF0YTsKKyAgICAgICAgICAgICAgICBpZiAoYXV0b19kYXRhICE9IDAgJiYgYXV0b19kYXRhLT5yZW1vdmVfcmVmZXJlbmNlKCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtX2RldmljZS5yZW1vdmVfYXV0b19kYXRhKGF1dG9fZGF0YS0+Y3B1X2FkZHIuc3RhcnQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBkZXN0cm95IGJ1ZmZlcnMKKyAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLm91dCB8fCBtX3ZhcnNbaV0uaW50byA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKCFWQVJfVFlQRV9JU19QVFIobV92YXJzW2ldLnR5cGUuc3JjKSAmJgorICAgICAgICAgICAgICAgICAgICAhVkFSX1RZUEVfSVNfRFZfREFUQV9TTElDRShtX3ZhcnNbaV0udHlwZS5zcmMpICYmCisgICAgICAgICAgICAgICAgICAgICFWQVJfVFlQRV9JU19EVl9EQVRBKG1fdmFyc1tpXS50eXBlLnNyYykpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgUHRyRGF0YSAqcHRyX2RhdGEgPSBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGE7CisgICAgICAgICAgICAgICAgaWYgKHB0cl9kYXRhLT5yZW1vdmVfcmVmZXJlbmNlKCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBkZXN0cm95IGJ1ZmZlcnMKKyAgICAgICAgICAgICAgICAgICAgaWYgKHB0cl9kYXRhLT5jcHVfYnVmICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fZGVzdHJveV9idWZmZXJzLnB1c2hfYmFjayhwdHJfZGF0YS0+Y3B1X2J1Zik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHB0cl9kYXRhLT5taWNfYnVmICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fZGVzdHJveV9idWZmZXJzLnB1c2hfYmFjayhwdHJfZGF0YS0+bWljX2J1Zik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgT0ZGTE9BRF9UUkFDRSgzLCAiUmVtb3ZpbmcgYXNzb2NpYXRpb24gZm9yIGFkZHIgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPmNwdV9hZGRyLnN0YXJ0KCkpOworCisgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBhc3NvY2lhdGlvbiBmcm9tIG1hcAorICAgICAgICAgICAgICAgICAgICBtX2RldmljZS5yZW1vdmVfcHRyX2RhdGEocHRyX2RhdGEtPmNwdV9hZGRyLnN0YXJ0KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKFZBUl9UWVBFX0lTX1BUUihtX3ZhcnNbaV0udHlwZS5kc3QpIHx8CisgICAgICAgICAgICAgICAgICAgICBWQVJfVFlQRV9JU19EVl9EQVRBX1NMSUNFKG1fdmFyc1tpXS50eXBlLmRzdCkgfHwKKyAgICAgICAgICAgICAgICAgICAgIFZBUl9UWVBFX0lTX0RWX0RBVEEobV92YXJzW2ldLnR5cGUuZHN0KSkgeworICAgICAgICAgICAgICAgIFB0ckRhdGEgKnB0cl9kYXRhID0gbV92YXJzX2V4dHJhW2ldLmRzdF9kYXRhOworICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YS0+cmVtb3ZlX3JlZmVyZW5jZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZGVzdHJveSBidWZmZXJzCisgICAgICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YS0+Y3B1X2J1ZiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2Rlc3Ryb3lfYnVmZmVycy5wdXNoX2JhY2socHRyX2RhdGEtPmNwdV9idWYpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YS0+bWljX2J1ZiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2Rlc3Ryb3lfYnVmZmVycy5wdXNoX2JhY2socHRyX2RhdGEtPm1pY19idWYpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVFJBQ0UoMywgIlJlbW92aW5nIGFzc29jaWF0aW9uIGZvciBhZGRyICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5jcHVfYWRkci5zdGFydCgpKTsKKworICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgYXNzb2NpYXRpb24gZnJvbSBtYXAKKyAgICAgICAgICAgICAgICAgICAgbV9kZXZpY2UucmVtb3ZlX3B0cl9kYXRhKHB0cl9kYXRhLT5jcHVfYWRkci5zdGFydCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobV9zdGF0dXMpIHsKKyAgICAgICAgbV9zdGF0dXMtPmRhdGFfcmVjZWl2ZWQgKz0gcHRyX3JlY2VpdmVkOworICAgIH0KKworICAgIE9GRkxPQURfVElNRVJfSE9TVF9SREFUQShnZXRfdGltZXJfZGF0YSgpLCBwdHJfcmVjZWl2ZWQpOworICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSgxLCBHRVRfT0ZGTE9BRF9OVU1CRVIoZ2V0X3RpbWVyX2RhdGEoKSksCisgICAgICAgICAgICAgICAgICBjX29mZmxvYWRfcmVjZWl2ZWRfcG9pbnRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgIlRvdGFsIHBvaW50ZXIgZGF0YSByZWNlaXZlZCBmcm9tIHRhcmdldDogWyVsbGRdIGJ5dGVzXG4iLAorICAgICAgICAgICAgICAgICAgcHRyX3JlY2VpdmVkKTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE9mZmxvYWREZXNjcmlwdG9yOjpzY2F0dGVyX2NvcHlvdXRfZGF0YSgpCit7CisgICAgT2ZmbG9hZFRpbWVyIHRpbWVyKGdldF90aW1lcl9kYXRhKCksIGNfb2ZmbG9hZF9ob3N0X3NjYXR0ZXJfb3V0cHV0cyk7CisKKyAgICBpZiAobV9uZWVkX3J1bmZ1bmN0aW9uICYmIG1fb3V0X2RhdGFsZW4gPiAwKSB7CisKKyAgICAgICAgLy8gdG90YWwgc2l6ZSB0aGF0IG5lZWQgdG8gYmUgdHJhbnNmZXJyZWQgZnJvbSB0YXJnZXQgdG8gaG9zdAorICAgICAgICBDT0lNQVBJTlNUQU5DRSBtYXBfaW5zdDsKKyAgICAgICAgQ09JUkVTVUxUIHJlczsKKyAgICAgICAgY2hhciAqZGF0YTsKKworICAgICAgICAvLyBvdXRwdXQgZGF0YSBidWZmZXIKKyAgICAgICAgaWYgKG1fZnVuY19kZXNjLT5kYXRhX29mZnNldCA9PSAwKSB7CisgICAgICAgICAgICBPZmZsb2FkVGltZXIgdGltZXJfbWFwKGdldF90aW1lcl9kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfb2ZmbG9hZF9ob3N0X21hcF9vdXRfZGF0YV9idWZmZXIpOworCisgICAgICAgICAgICBDT0lSRVNVTFQgcmVzID0gQ09JOjpCdWZmZXJNYXAobV9pbm91dF9idWYsIDAsIG1fb3V0X2RhdGFsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX01BUF9SRUFEX09OTFksIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1hcF9pbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHZvaWQqKj4oJmRhdGEpKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfbWFwLCByZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZGF0YSA9IChjaGFyKikgbV9mdW5jX2Rlc2MgKyBtX2Z1bmNfZGVzYy0+ZGF0YV9vZmZzZXQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBnZXQgdGltaW5nIGRhdGEKKyAgICAgICAgT0ZGTE9BRF9USU1FUl9UQVJHRVRfREFUQShnZXRfdGltZXJfZGF0YSgpLCBkYXRhKTsKKyAgICAgICAgZGF0YSArPSBPRkZMT0FEX1RJTUVSX0RBVEFMRU4oKTsKKworICAgICAgICAvLyBpbml0aWFsaXplIG91dHB1dCBtYXJzaGFsbGVyCisgICAgICAgIG1fb3V0LmluaXRfYnVmZmVyKGRhdGEsIG1fb3V0X2RhdGFsZW4pOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV92YXJzX3RvdGFsOyBpKyspIHsKKyAgICAgICAgICAgIHN3aXRjaCAobV92YXJzW2ldLnR5cGUuc3JjKSB7CisgICAgICAgICAgICAgICAgY2FzZSBjX2RhdGFfcHRyX2FycmF5OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGNfZGF0YToKKyAgICAgICAgICAgICAgICBjYXNlIGNfdm9pZF9wdHI6CisgICAgICAgICAgICAgICAgY2FzZSBjX2NlYW5fdmFyOgorICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5vdXQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICFtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uaW50bykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnB0ciA9IG9mZmxvYWRfZ2V0X3NyY19iYXNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjaGFyKj4obV92YXJzW2ldLmludG8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0udHlwZS5kc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fb3V0LnJlY2VpdmVfZGF0YShwdHIgKyBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fb3V0LnJlY2VpdmVfZGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2hhcio+KG1fdmFyc1tpXS5wdHIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5jcHVfZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBjX2Z1bmNfcHRyOgorICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5vdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fb3V0LnJlY2VpdmVfZnVuY19wdHIoKGNvbnN0IHZvaWQqKikgbV92YXJzW2ldLnB0cik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChtX3N0YXR1cykgeworICAgICAgICAgICAgbV9zdGF0dXMtPmRhdGFfcmVjZWl2ZWQgKz0gbV9vdXQuZ2V0X3Rmcl9zaXplKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobV9mdW5jX2Rlc2MtPmRhdGFfb2Zmc2V0ID09IDApIHsKKyAgICAgICAgICAgIE9mZmxvYWRUaW1lciB0aW1lcl91bm1hcChnZXRfdGltZXJfZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfb2ZmbG9hZF9ob3N0X3VubWFwX291dF9kYXRhX2J1ZmZlcik7CisKKyAgICAgICAgICAgIENPSVJFU1VMVCByZXMgPSBDT0k6OkJ1ZmZlclVubWFwKG1hcF9pbnN0LCAwLCAwLCAwKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfdW5tYXAsIHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBPRkZMT0FEX1RJTUVSX0hPU1RfUkRBVEEoZ2V0X3RpbWVyX2RhdGEoKSwgbV9vdXQuZ2V0X3Rmcl9zaXplKCkpOworICAgIE9GRkxPQURfVFJBQ0UoMSwgIlRvdGFsIGNvcHlvdXQgZGF0YSByZWNlaXZlZCBmcm9tIHRhcmdldDogWyVsbGRdIGJ5dGVzXG4iLAorICAgICAgICAgICAgICAgICAgbV9vdXQuZ2V0X3Rmcl9zaXplKCkpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgZ2V0X2Fycl9kZXNjX251bWJlcnMoCisgICAgY29uc3QgYXJyX2Rlc2MgKmFwLAorICAgIGludDY0X3QgZWxfc2l6ZSwKKyAgICBpbnQ2NF90ICZvZmZzZXQsCisgICAgaW50NjRfdCAmc2l6ZSwKKyAgICBpbnQgICAgICZlbF9udW1iZXIsCisgICAgQ2VhblJlYWRSYW5nZXMqICZwdHJfcmFuZ2VzCispCit7CisgICAgaWYgKGlzX2Fycl9kZXNjX2NvbnRpZ3VvdXMoYXApKSB7CisgICAgICAgIHB0cl9yYW5nZXMgPSBOVUxMOworICAgICAgICBfX2Fycl9kYXRhX29mZnNldF9hbmRfbGVuZ3RoKGFwLCBvZmZzZXQsIHNpemUpOworICAgICAgICBlbF9udW1iZXIgPSBzaXplIC8gZWxfc2l6ZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHB0cl9yYW5nZXMgPSBpbml0X3JlYWRfcmFuZ2VzX2Fycl9kZXNjKGFwKTsKKyAgICAgICAgZWxfbnVtYmVyID0gKHB0cl9yYW5nZXMtPnJhbmdlX3NpemUgLyBlbF9zaXplKSAqCisgICAgICAgICAgICAgICAgICAgIHB0cl9yYW5nZXMtPnJhbmdlX21heF9udW1iZXI7CisgICAgICAgIHNpemUgPSBwdHJfcmFuZ2VzLT5yYW5nZV9zaXplOworICAgIH0KK30KKworYXJyX2Rlc2MgKiBtYWtlX2Fycl9kZXNjKAorICAgIHZvaWQqICAgcHRyX3ZhbCwKKyAgICBpbnQ2NF90IGV4dGVudF9zdGFydF92YWwsCisgICAgaW50NjRfdCBleHRlbnRfZWxlbWVudHNfdmFsLAorICAgIGludDY0X3Qgc2l6ZQorKQoreworICAgIGFycl9kZXNjICpyZXM7CisgICAgcmVzID0gKGFycl9kZXNjICopbWFsbG9jKHNpemVvZihhcnJfZGVzYykpOworICAgIHJlcy0+YmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50NjRfdD4ocHRyX3ZhbCk7CisgICAgcmVzLT5yYW5rID0gMTsKKyAgICByZXMtPmRpbVswXS5zaXplID0gc2l6ZTsKKyAgICByZXMtPmRpbVswXS5saW5kZXggPSAwOworICAgIHJlcy0+ZGltWzBdLmxvd2VyID0gZXh0ZW50X3N0YXJ0X3ZhbDsKKyAgICByZXMtPmRpbVswXS51cHBlciA9IGV4dGVudF9lbGVtZW50c192YWwgKyBleHRlbnRfc3RhcnRfdmFsIC0gMTsKKyAgICByZXMtPmRpbVswXS5zdHJpZGUgPSAxOworICAgIHJldHVybiByZXM7Cit9CisKK2Jvb2wgT2ZmbG9hZERlc2NyaXB0b3I6Omdlbl92YXJfZGVzY3NfZm9yX3BvaW50ZXJfYXJyYXkoaW50IGkpCit7CisgICAgaW50ICAgICAgICAgICAgIHBvaW50ZXJzX251bWJlcjsKKyAgICBpbnQgICAgICAgICAgICAgdG1wX3ZhbDsKKyAgICBpbnQgICAgICAgICAgICAgbmV3X2luZGV4ID0gbV92YXJzX3RvdGFsOworICAgIGNvbnN0IGFycl9kZXNjICphcDsKKyAgICBjb25zdCBWYXJEZXNjMyAqdmQzID0gc3RhdGljX2Nhc3Q8Y29uc3QgVmFyRGVzYzMqPihtX3ZhcnNbaV0ucHRyKTsKKyAgICBpbnQgICAgICAgICAgICAgZmxhZ3MgPSB2ZDMtPmFycmF5X2ZpZWxkczsKKyAgICBib29sICAgICAgICAgICAgc3JjX2lzX2Zvcl9taWMgPSAobV92YXJzW2ldLmRpcmVjdGlvbi5vdXQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmludG8gPT0gTlVMTCk7CisKKyAgICBSZWFkQXJyRWxlbWVudHM8dm9pZCAqPiAgcHRyOworICAgIFJlYWRBcnJFbGVtZW50czx2b2lkICo+ICBpbnRvOworICAgIFJlYWRBcnJFbGVtZW50czxpbnQ2NF90PiBleHRfc3RhcnQ7CisgICAgUmVhZEFyckVsZW1lbnRzPGludDY0X3Q+IGV4dF9lbGVtZW50czsKKyAgICBSZWFkQXJyRWxlbWVudHM8aW50NjRfdD4gYWxpZ247CisgICAgUmVhZEFyckVsZW1lbnRzPGludDY0X3Q+IGFsbG9jX2lmOworICAgIFJlYWRBcnJFbGVtZW50czxpbnQ2NF90PiBmcmVlX2lmOworICAgIFJlYWRBcnJFbGVtZW50czxpbnQ2NF90PiBpbnRvX3N0YXJ0OworICAgIFJlYWRBcnJFbGVtZW50czxpbnQ2NF90PiBpbnRvX2VsZW07CisgICAgUmVhZEFyckVsZW1lbnRzPGludDY0X3Q+IGFsbG9jX3N0YXJ0OworICAgIFJlYWRBcnJFbGVtZW50czxpbnQ2NF90PiBhbGxvY19lbGVtOworCisKKyAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4odmQzLT5wdHJfYXJyYXkpOworCisgICAgLy8gInBvaW50ZXJzX251bWJlciIgZm9yIHRvdGFsIG51bWJlciBvZiB0cmFuc2ZlcnJlZCBwb2ludGVycy4KKyAgICAvLyBGb3IgZWFjaCBvZiB0aGVtIHdlIGNyZWF0ZSBuZXcgdmFyX2Rlc2MgYW5kIHB1dCBpdCBhdCB0aGUgYm90dG9tCisgICAgLy8gb2YgdGhlIHZhcl9kZXNjJ3MgYXJyYXkKKyAgICBnZXRfYXJyX2Rlc2NfbnVtYmVycyhhcCwgc2l6ZW9mKHZvaWQgKiksIHB0ci5vZmZzZXQsIHB0ci5zaXplLAorICAgICAgICBwb2ludGVyc19udW1iZXIsIHB0ci5yYW5nZXMpOworICAgIHB0ci5iYXNlID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYXAtPmJhc2UpOworCisgICAgLy8gMi4gcHJlcGFyZSBtZW1vcnkgZm9yIG5ldyB2YXJfZGVzY3MKKyAgICBtX3ZhcnNfdG90YWwgKz0gcG9pbnRlcnNfbnVtYmVyOworICAgIG1fdmFycyAgICAgICA9IChWYXJEZXNjKilyZWFsbG9jKG1fdmFycywgbV92YXJzX3RvdGFsICogc2l6ZW9mKFZhckRlc2MpKTsKKyAgICBtX3ZhcnNfZXh0cmEgPQorICAgICAgICAoVmFyRXh0cmEqKXJlYWxsb2MobV92YXJzX2V4dHJhLCBtX3ZhcnNfdG90YWwgKiBzaXplb2YoVmFyRXh0cmEpKTsKKyAgICBtX2luX2RlcHMgICAgPQorICAgICAgICAoQ09JRVZFTlQqKXJlYWxsb2MobV9pbl9kZXBzLCBzaXplb2YoQ09JRVZFTlQpICogKG1fdmFyc190b3RhbCArIDEpKTsKKyAgICBtX291dF9kZXBzICAgPQorICAgICAgICAoQ09JRVZFTlQqKXJlYWxsb2MobV9vdXRfZGVwcywgc2l6ZW9mKENPSUVWRU5UKSAqIG1fdmFyc190b3RhbCk7CisKKyAgICAvLyAzLiBQcmVwYXJlIGZvciByZWFkaW5nIG5ldyB2YXJfZGVzYydzIGZpZWxkcworICAgIC8vICAgIEVYVEVOVCBTVEFSVAorICAgIGlmICgoZmxhZ3MgJiAoMTw8ZmxhZ19leHRlbnRfc3RhcnRfaXNfYXJyYXkpKSAhPSAwKSB7CisgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPih2ZDMtPmV4dGVudF9zdGFydCk7CisgICAgICAgIGdldF9hcnJfZGVzY19udW1iZXJzKGFwLCBhcC0+ZGltW2FwLT5yYW5rIC0gMV0uc2l6ZSwgZXh0X3N0YXJ0Lm9mZnNldCwKKyAgICAgICAgICAgIGV4dF9zdGFydC5zaXplLCB0bXBfdmFsLCBleHRfc3RhcnQucmFuZ2VzKTsKKyAgICAgICAgZXh0X3N0YXJ0LmJhc2UgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihhcC0+YmFzZSk7CisgICAgICAgIGV4dF9zdGFydC5lbF9zaXplID0gYXAtPmRpbVthcC0+cmFuayAtIDFdLnNpemU7CisKKyAgICAgICAgaWYgKHRtcF92YWwgPCBwb2ludGVyc19udW1iZXIpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19wb2ludGVyX2FycmF5X21pc21hdGNoLCAiZXh0ZW50IHN0YXJ0Iik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoKGZsYWdzICYgKDE8PGZsYWdfZXh0ZW50X3N0YXJ0X2lzX3NjYWxhcikpICE9IDApIHsKKyAgICAgICAgZXh0X3N0YXJ0LnZhbCA9IChpbnQ2NF90KXZkMy0+ZXh0ZW50X3N0YXJ0OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZXh0X3N0YXJ0LnZhbCA9IDA7CisgICAgfQorCisgICAgLy8gICAgRVhURU5UIEVMRU1FTlRTIE5VTUJFUgorICAgIGlmICgoZmxhZ3MgJiAoMTw8ZmxhZ19leHRlbnRfZWxlbWVudHNfaXNfYXJyYXkpKSAhPSAwKSB7CisgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPih2ZDMtPmV4dGVudF9lbGVtZW50cyk7CisgICAgICAgIGdldF9hcnJfZGVzY19udW1iZXJzKGFwLCBhcC0+ZGltW2FwLT5yYW5rIC0gMV0uc2l6ZSwKKyAgICAgICAgICAgIGV4dF9lbGVtZW50cy5vZmZzZXQsIGV4dF9lbGVtZW50cy5zaXplLAorICAgICAgICAgICAgdG1wX3ZhbCwgZXh0X2VsZW1lbnRzLnJhbmdlcyk7CisgICAgICAgIGV4dF9lbGVtZW50cy5iYXNlID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYXAtPmJhc2UpOworICAgICAgICBleHRfZWxlbWVudHMuZWxfc2l6ZSA9IGFwLT5kaW1bYXAtPnJhbmsgLSAxXS5zaXplOworCisgICAgICAgIGlmICh0bXBfdmFsIDwgcG9pbnRlcnNfbnVtYmVyKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwgImV4dGVudCBlbGVtZW50cyIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKChmbGFncyAmICgxPDxmbGFnX2V4dGVudF9lbGVtZW50c19pc19zY2FsYXIpKSAhPSAwKSB7CisgICAgICAgIGV4dF9lbGVtZW50cy52YWwgPSAoaW50NjRfdCl2ZDMtPmV4dGVudF9lbGVtZW50czsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGV4dF9lbGVtZW50cy52YWwgPSBtX3ZhcnNbaV0uY291bnQ7CisgICAgfQorCisgICAgLy8gICAgQUxMT0NfSUYKKyAgICBpZiAoKGZsYWdzICYgKDE8PGZsYWdfYWxsb2NfaWZfaXNfYXJyYXkpKSAhPSAwKSB7CisgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPih2ZDMtPmFsbG9jX2lmX2FycmF5KTsKKyAgICAgICAgZ2V0X2Fycl9kZXNjX251bWJlcnMoYXAsIGFwLT5kaW1bYXAtPnJhbmsgLSAxXS5zaXplLCBhbGxvY19pZi5vZmZzZXQsCisgICAgICAgICAgICBhbGxvY19pZi5zaXplLCB0bXBfdmFsLCBhbGxvY19pZi5yYW5nZXMpOworICAgICAgICBhbGxvY19pZi5iYXNlID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYXAtPmJhc2UpOworICAgICAgICBhbGxvY19pZi5lbF9zaXplID0gYXAtPmRpbVthcC0+cmFuayAtIDFdLnNpemU7CisKKyAgICAgICAgaWYgKHRtcF92YWwgPCBwb2ludGVyc19udW1iZXIpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19wb2ludGVyX2FycmF5X21pc21hdGNoLCAiYWxsb2NfaWYiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgYWxsb2NfaWYudmFsID0gbV92YXJzW2ldLmNvdW50OworICAgIH0KKworICAgIC8vICAgIEZSRUVfSUYKKyAgICBpZiAoKGZsYWdzICYgKDE8PGZsYWdfZnJlZV9pZl9pc19hcnJheSkpICE9IDApIHsKKyAgICAgICAgYXAgPSBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KHZkMy0+ZnJlZV9pZl9hcnJheSk7CisgICAgICAgIGdldF9hcnJfZGVzY19udW1iZXJzKGFwLCBhcC0+ZGltW2FwLT5yYW5rIC0gMV0uc2l6ZSwgZnJlZV9pZi5vZmZzZXQsCisgICAgICAgICAgICBmcmVlX2lmLnNpemUsIHRtcF92YWwsIGZyZWVfaWYucmFuZ2VzKTsKKyAgICAgICAgZnJlZV9pZi5iYXNlID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYXAtPmJhc2UpOworICAgICAgICBmcmVlX2lmLmVsX3NpemUgPSBhcC0+ZGltW2FwLT5yYW5rIC0gMV0uc2l6ZTsKKworICAgICAgICBpZiAodG1wX3ZhbCA8IHBvaW50ZXJzX251bWJlcikgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2gsICJmcmVlX2lmIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGZyZWVfaWYudmFsID0gbV92YXJzW2ldLmNvdW50OworICAgIH0KKworICAgIC8vICAgIEFMSUdOCisKKyAgICBpZiAoKGZsYWdzICYgKDE8PGZsYWdfYWxpZ25faXNfYXJyYXkpKSAhPSAwKSB7CisgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPih2ZDMtPmFsaWduX2FycmF5KTsKKyAgICAgICAgZ2V0X2Fycl9kZXNjX251bWJlcnMoYXAsIGFwLT5kaW1bYXAtPnJhbmsgLSAxXS5zaXplLCBhbGlnbi5vZmZzZXQsCisgICAgICAgICAgICBhbGlnbi5zaXplLCB0bXBfdmFsLCBhbGlnbi5yYW5nZXMpOworICAgICAgICBhbGlnbi5iYXNlID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYXAtPmJhc2UpOworICAgICAgICBhbGlnbi5lbF9zaXplID0gYXAtPmRpbVthcC0+cmFuayAtIDFdLnNpemU7CisKKyAgICAgICAgaWYgKHRtcF92YWwgPCBwb2ludGVyc19udW1iZXIpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19wb2ludGVyX2FycmF5X21pc21hdGNoLCAiYWxpZ24iKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgYWxpZ24udmFsID0gbV92YXJzW2ldLmFsaWduOworICAgIH0KKworICAgIC8vIDMuMSBJTlRPCisKKyAgICBpZiAobV92YXJzW2ldLmludG8pIHsKKyAgICAgICAgYXAgPSBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KG1fdmFyc1tpXS5pbnRvKTsKKyAgICAgICAgZ2V0X2Fycl9kZXNjX251bWJlcnMoYXAsIGFwLT5kaW1bYXAtPnJhbmsgLSAxXS5zaXplLCBpbnRvLm9mZnNldCwKKyAgICAgICAgICAgIGludG8uc2l6ZSwgdG1wX3ZhbCwgaW50by5yYW5nZXMpOworICAgICAgICBpbnRvLmJhc2UgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihhcC0+YmFzZSk7CisKKyAgICAgICAgaWYgKHRtcF92YWwgPCBwb2ludGVyc19udW1iZXIpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19wb2ludGVyX2FycmF5X21pc21hdGNoLCAiaW50byIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gMy4yIElOVE9fU1RBUlQKKworICAgIGlmICgoZmxhZ3MgJiAoMTw8ZmxhZ19pbnRvX3N0YXJ0X2lzX2FycmF5KSkgIT0gMCkgeworICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4odmQzLT5pbnRvX3N0YXJ0KTsKKyAgICAgICAgZ2V0X2Fycl9kZXNjX251bWJlcnMoYXAsIGFwLT5kaW1bYXAtPnJhbmsgLSAxXS5zaXplLCBpbnRvX3N0YXJ0Lm9mZnNldCwKKyAgICAgICAgICAgIGludG9fc3RhcnQuc2l6ZSwgdG1wX3ZhbCwgaW50b19zdGFydC5yYW5nZXMpOworICAgICAgICBpbnRvX3N0YXJ0LmJhc2UgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihhcC0+YmFzZSk7CisgICAgICAgIGludG9fc3RhcnQuZWxfc2l6ZSA9IGFwLT5kaW1bYXAtPnJhbmsgLSAxXS5zaXplOworCisgICAgICAgIGlmICh0bXBfdmFsIDwgcG9pbnRlcnNfbnVtYmVyKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwgImludG9fZXh0ZW50IHN0YXJ0Iik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoKGZsYWdzICYgKDE8PGZsYWdfaW50b19zdGFydF9pc19zY2FsYXIpKSAhPSAwKSB7CisgICAgICAgIGludG9fc3RhcnQudmFsID0gKGludDY0X3QpdmQzLT5pbnRvX3N0YXJ0OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaW50b19zdGFydC52YWwgPSAwOworICAgIH0KKworICAgIC8vIDMuMyBJTlRPX0VMRU1FTlRTCisKKyAgICBpZiAoKGZsYWdzICYgKDE8PGZsYWdfaW50b19lbGVtZW50c19pc19hcnJheSkpICE9IDApIHsKKyAgICAgICAgYXAgPSBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KHZkMy0+aW50b19lbGVtZW50cyk7CisgICAgICAgIGdldF9hcnJfZGVzY19udW1iZXJzKGFwLCBhcC0+ZGltW2FwLT5yYW5rIC0gMV0uc2l6ZSwgaW50b19lbGVtLm9mZnNldCwKKyAgICAgICAgICAgIGludG9fZWxlbS5zaXplLCB0bXBfdmFsLCBpbnRvX2VsZW0ucmFuZ2VzKTsKKyAgICAgICAgaW50b19lbGVtLmJhc2UgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihhcC0+YmFzZSk7CisgICAgICAgIGludG9fZWxlbS5lbF9zaXplID0gYXAtPmRpbVthcC0+cmFuayAtIDFdLnNpemU7CisKKyAgICAgICAgaWYgKHRtcF92YWwgPCBwb2ludGVyc19udW1iZXIpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19wb2ludGVyX2FycmF5X21pc21hdGNoLCAiaW50b19leHRlbnQgZWxlbWVudHMiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICgoZmxhZ3MgJiAoMTw8ZmxhZ19pbnRvX2VsZW1lbnRzX2lzX3NjYWxhcikpICE9IDApIHsKKyAgICAgICAgaW50b19lbGVtLnZhbCA9IChpbnQ2NF90KXZkMy0+aW50b19lbGVtZW50czsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGludG9fZWxlbS52YWwgPSBtX3ZhcnNbaV0uY291bnQ7CisgICAgfQorCisgICAgLy8gICAgYWxsb2Nfc3RhcnQKKworICAgIGlmICgoZmxhZ3MgJiAoMTw8ZmxhZ19hbGxvY19zdGFydF9pc19hcnJheSkpICE9IDApIHsKKyAgICAgICAgYXAgPSBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KHZkMy0+YWxsb2Nfc3RhcnQpOworICAgICAgICBnZXRfYXJyX2Rlc2NfbnVtYmVycyhhcCwgYXAtPmRpbVthcC0+cmFuayAtIDFdLnNpemUsCisgICAgICAgICAgICBhbGxvY19zdGFydC5vZmZzZXQsIGFsbG9jX3N0YXJ0LnNpemUsIHRtcF92YWwsCisgICAgICAgICAgICBhbGxvY19zdGFydC5yYW5nZXMpOworICAgICAgICBhbGxvY19zdGFydC5iYXNlID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYXAtPmJhc2UpOworICAgICAgICBhbGxvY19zdGFydC5lbF9zaXplID0gYXAtPmRpbVthcC0+cmFuayAtIDFdLnNpemU7CisKKyAgICAgICAgaWYgKHRtcF92YWwgPCBwb2ludGVyc19udW1iZXIpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19wb2ludGVyX2FycmF5X21pc21hdGNoLCAiYWxsb2NfZXh0ZW50IHN0YXJ0Iik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoKGZsYWdzICYgKDE8PGZsYWdfYWxsb2Nfc3RhcnRfaXNfc2NhbGFyKSkgIT0gMCkgeworICAgICAgICBhbGxvY19zdGFydC52YWwgPSAoaW50NjRfdCl2ZDMtPmFsbG9jX3N0YXJ0OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgYWxsb2Nfc3RhcnQudmFsID0gMDsKKyAgICB9CisKKyAgICAvLyAgICBhbGxvY19lbGVtCisKKyAgICBpZiAoKGZsYWdzICYgKDE8PGZsYWdfYWxsb2NfZWxlbWVudHNfaXNfYXJyYXkpKSAhPSAwKSB7CisgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPih2ZDMtPmFsbG9jX2VsZW1lbnRzKTsKKyAgICAgICAgZ2V0X2Fycl9kZXNjX251bWJlcnMoYXAsIGFwLT5kaW1bYXAtPnJhbmsgLSAxXS5zaXplLCBhbGxvY19lbGVtLm9mZnNldCwKKyAgICAgICAgICAgIGFsbG9jX2VsZW0uc2l6ZSwgdG1wX3ZhbCwgYWxsb2NfZWxlbS5yYW5nZXMpOworICAgICAgICBhbGxvY19lbGVtLmJhc2UgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihhcC0+YmFzZSk7CisgICAgICAgIGFsbG9jX2VsZW0uZWxfc2l6ZSA9IGFwLT5kaW1bYXAtPnJhbmsgLSAxXS5zaXplOworICAgICAgICBpZiAodG1wX3ZhbCA8IHBvaW50ZXJzX251bWJlcikgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbGxvY19leHRlbnQgZWxlbWVudHMiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICgoZmxhZ3MgJiAoMTw8ZmxhZ19hbGxvY19lbGVtZW50c19pc19zY2FsYXIpKSAhPSAwKSB7CisgICAgICAgIGFsbG9jX2VsZW0udmFsID0gKGludDY0X3QpdmQzLT5hbGxvY19lbGVtZW50czsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGFsbG9jX2VsZW0udmFsID0gMDsKKyAgICB9CisKKyAgICBmb3IgKGludCBrID0gMDsgayA8IHBvaW50ZXJzX251bWJlcjsgaysrKSB7CisgICAgICAgIGludCB0eXBlID0gZmxhZ3MgJiAweDNmOworICAgICAgICBpbnQgdHlwZV9zcmMsIHR5cGVfZHN0OworICAgICAgICAvLyAgR2V0IG5ldyB2YWx1ZXMKKyAgICAgICAgLy8gdHlwZV9zcmMsIHR5cGVfZHN0CisgICAgICAgIHR5cGVfc3JjID0gdHlwZV9kc3QgPSAodHlwZSA9PSBjX2RhdGFfcHRyX2FycmF5KSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX2RhdGFfcHRyICAgOiAodHlwZSA9PSBjX2Z1bmNfcHRyX2FycmF5KSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX2Z1bmNfcHRyICAgOiAodHlwZSA9PSBjX3ZvaWRfcHRyX2FycmF5KSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX3ZvaWRfcHRyICAgOiAodHlwZSA9PSBjX3N0cmluZ19wdHJfYXJyYXkpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfc3RyaW5nX3B0ciA6IDA7CisKKyAgICAgICAgLy8gR2V0IHB0ciB2YWwKKyAgICAgICAgaWYgKCFwdHIucmVhZF9uZXh0KHRydWUpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHB0ci52YWwgPSAodm9pZCopKHB0ci5iYXNlICsgcHRyLm9mZnNldCk7CisgICAgICAgIH0KKworICAgICAgICAvLyAhISEgSWYgd2UgZ290IGVycm9yIGF0IHBoYXNlIG9mIHJlYWRpbmcgLSBpdCdzIGFuIGludGVybmFsCisgICAgICAgIC8vICEhISBlcnJvciwgYXMgd2UgbXVzdCBkZXRlY3QgbWlzbWF0Y2ggYmVmb3JlCisKKyAgICAgICAgLy8gR2V0IGludG8gdmFsCisgICAgICAgIGlmIChtX3ZhcnNbaV0uaW50bykgeworICAgICAgICAgICAgaWYgKCFpbnRvLnJlYWRfbmV4dCh0cnVlKSkgeworICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19wb2ludGVyX2FycmF5X21pc21hdGNoLCAiaW50byIpOworICAgICAgICAgICAgICAgIExJQk9GRkxPQURfQUJPUlQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnRvLnZhbCA9ICh2b2lkKikoaW50by5iYXNlICsgaW50by5vZmZzZXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gR2V0IG90aGVyIGNvbXBvbmVudHMgb2YgdGhlIGNsYXVzZQorICAgICAgICBpZiAoIWV4dF9zdGFydC5yZWFkX25leHQoZmxhZ3MgJiAoMTw8ZmxhZ19leHRlbnRfc3RhcnRfaXNfYXJyYXkpKSkgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2gsICJleHRlbnQgc3RhcnQiKTsKKyAgICAgICAgICAgIExJQk9GRkxPQURfQUJPUlQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFleHRfZWxlbWVudHMucmVhZF9uZXh0KAorICAgICAgICAgICAgICAgIGZsYWdzICYgKDE8PGZsYWdfZXh0ZW50X2VsZW1lbnRzX2lzX2FycmF5KSkpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19wb2ludGVyX2FycmF5X21pc21hdGNoLCAiZXh0ZW50IGVsZW1lbnRzIik7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0FCT1JUOworICAgICAgICB9CisgICAgICAgIGlmICghYWxsb2NfaWYucmVhZF9uZXh0KGZsYWdzICYgKDE8PGZsYWdfYWxsb2NfaWZfaXNfYXJyYXkpKSkgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2gsICJhbGxvY19pZiIpOworICAgICAgICAgICAgTElCT0ZGTE9BRF9BQk9SVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWZyZWVfaWYucmVhZF9uZXh0KGZsYWdzICYgKDE8PGZsYWdfZnJlZV9pZl9pc19hcnJheSkpKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwgImZyZWVfaWYiKTsKKyAgICAgICAgICAgIExJQk9GRkxPQURfQUJPUlQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFhbGlnbi5yZWFkX25leHQoZmxhZ3MgJiAoMTw8ZmxhZ19hbGlnbl9pc19hcnJheSkpKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwgImFsaWduIik7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0FCT1JUOworICAgICAgICB9CisgICAgICAgIGlmICghaW50b19zdGFydC5yZWFkX25leHQoZmxhZ3MgJiAoMTw8ZmxhZ19pbnRvX3N0YXJ0X2lzX2FycmF5KSkpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19wb2ludGVyX2FycmF5X21pc21hdGNoLCAiaW50b19leHRlbnQgc3RhcnQiKTsKKyAgICAgICAgICAgIExJQk9GRkxPQURfQUJPUlQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFpbnRvX2VsZW0ucmVhZF9uZXh0KGZsYWdzICYgKDE8PGZsYWdfaW50b19lbGVtZW50c19pc19hcnJheSkpKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwgImludG9fZXh0ZW50IGVsZW1lbnRzIik7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0FCT1JUOworICAgICAgICB9CisgICAgICAgIGlmICghYWxsb2Nfc3RhcnQucmVhZF9uZXh0KGZsYWdzICYgKDE8PGZsYWdfYWxsb2Nfc3RhcnRfaXNfYXJyYXkpKSkgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2gsICJhbGxvY19leHRlbnQgc3RhcnQiKTsKKyAgICAgICAgICAgIExJQk9GRkxPQURfQUJPUlQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFhbGxvY19lbGVtLnJlYWRfbmV4dCgKKyAgICAgICAgICAgICAgICAgZmxhZ3MgJiAoMTw8ZmxhZ19hbGxvY19lbGVtZW50c19pc19hcnJheSkpKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwgImFsbG9jX2V4dGVudCBlbGVtZW50cyIpOworICAgICAgICAgICAgTElCT0ZGTE9BRF9BQk9SVDsKKyAgICAgICAgfQorCisgICAgICAgIG1fdmFyc1tuZXdfaW5kZXggKyBrXS5kaXJlY3Rpb24uYml0cyA9IG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0czsKKyAgICAgICAgbV92YXJzW25ld19pbmRleCArIGtdLmFsbG9jX2lmID0gYWxsb2NfaWYudmFsOworICAgICAgICBtX3ZhcnNbbmV3X2luZGV4ICsga10uZnJlZV9pZiA9IGZyZWVfaWYudmFsOworICAgICAgICBtX3ZhcnNbbmV3X2luZGV4ICsga10uYWxpZ24gPSBhbGlnbi52YWw7CisgICAgICAgIG1fdmFyc1tuZXdfaW5kZXggKyBrXS5taWNfb2Zmc2V0ID0gMDsKKyAgICAgICAgbV92YXJzW25ld19pbmRleCArIGtdLmZsYWdzLmJpdHMgPSBtX3ZhcnNbaV0uZmxhZ3MuYml0czsKKyAgICAgICAgbV92YXJzW25ld19pbmRleCArIGtdLm9mZnNldCA9IDA7CisgICAgICAgIG1fdmFyc1tuZXdfaW5kZXggKyBrXS5zaXplID0gbV92YXJzW2ldLnNpemU7CisKKyAgICAgICAgaWYgKGV4dF9zdGFydC52YWwgPT0gMCkgeworICAgICAgICAgICAgbV92YXJzW25ld19pbmRleCArIGtdLmNvdW50ID0gZXh0X2VsZW1lbnRzLnZhbDsKKyAgICAgICAgICAgIG1fdmFyc1tuZXdfaW5kZXggKyBrXS5wdHIgPSBwdHIudmFsOworICAgICAgICAgICAgaWYgKHR5cGVfc3JjID09IGNfc3RyaW5nX3B0cikgeworICAgICAgICAgICAgICAgIG1fdmFyc1tuZXdfaW5kZXggKyBrXS5zaXplID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG1fdmFyc1tuZXdfaW5kZXggKyBrXS5jb3VudCA9IDA7CisgICAgICAgICAgICBtX3ZhcnNbbmV3X2luZGV4ICsga10ucHRyID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx2b2lkKj4obWFrZV9hcnJfZGVzYygKKyAgICAgICAgICAgICAgICBwdHIudmFsLAorICAgICAgICAgICAgICAgIGV4dF9zdGFydC52YWwsCisgICAgICAgICAgICAgICAgZXh0X2VsZW1lbnRzLnZhbCwKKyAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSkpOworCisgICAgICAgICAgICB0eXBlX3NyYyA9IHR5cGVfc3JjID09IGNfZGF0YV9wdHIgPyBjX2NlYW5fdmFyX3B0ciA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfc3RyaW5nX3B0ciA/IGNfY2Vhbl92YXJfcHRyIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZV9zcmM7CisgICAgICAgICAgICBpZiAoIW1fdmFyc1tpXS5pbnRvKSB7CisgICAgICAgICAgICAgICAgdHlwZV9kc3QgPSB0eXBlX3NyYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChtX3ZhcnNbaV0uaW50byAmJiBpbnRvX2VsZW0udmFsICE9IDApIHsKKyAgICAgICAgICAgIG1fdmFyc1tuZXdfaW5kZXggKyBrXS5pbnRvID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx2b2lkKj4obWFrZV9hcnJfZGVzYygKKyAgICAgICAgICAgICAgICBpbnRvLnZhbCwKKyAgICAgICAgICAgICAgICBpbnRvX3N0YXJ0LnZhbCwKKyAgICAgICAgICAgICAgICBpbnRvX2VsZW0udmFsLAorICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplKSk7CisgICAgICAgICAgICB0eXBlX2RzdCA9ICh0eXBlID09IGNfZGF0YV9wdHJfYXJyYXkpID8gY19jZWFuX3Zhcl9wdHIgOgorICAgICAgICAgICAgICAgICAgICAgICAodHlwZSA9PSBjX3N0cmluZ19wdHJfYXJyYXkpID8gY19jZWFuX3Zhcl9wdHIgOgorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZV9zcmM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBtX3ZhcnNbbmV3X2luZGV4ICsga10uaW50byA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYWxsb2NfZWxlbS52YWwgIT0gMCkgeworICAgICAgICAgICAgbV92YXJzW25ld19pbmRleCArIGtdLmFsbG9jID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx2b2lkKj4obWFrZV9hcnJfZGVzYygKKyAgICAgICAgICAgICAgICBwdHIudmFsLAorICAgICAgICAgICAgICAgIGFsbG9jX3N0YXJ0LnZhbCwKKyAgICAgICAgICAgICAgICBhbGxvY19lbGVtLnZhbCwKKyAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSkpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbV92YXJzW25ld19pbmRleCArIGtdLmFsbG9jID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIG1fdmFyc1tuZXdfaW5kZXggKyBrXS50eXBlLnNyYyA9IHR5cGVfc3JjOworICAgICAgICBtX3ZhcnNbbmV3X2luZGV4ICsga10udHlwZS5kc3QgPSB0eXBlX2RzdDsKKworICAgICAgICBtX3ZhcnNfZXh0cmFbbmV3X2luZGV4ICsga10uaXNfYXJyX3B0cl9lbCA9IDE7CisgICAgICAgIG1fdmFyc19leHRyYVtuZXdfaW5kZXggKyBrXS5wdHJfYXJyX29mZnNldCA9CisgICAgICAgICAgICBzcmNfaXNfZm9yX21pYyA/IHB0ci5vZmZzZXQgOiBpbnRvLm9mZnNldDsKKyAgICB9CisgICAgLy8gY291bnQgYW5kIGFsbG9jIGZpZWxkcyBhcmUgdXNlbGVzcyBhdCB0YXJnZXQuIFRoZXkgY2FuIGJlIHJldXNlZAorICAgIC8vIGZvciBwb2ludGVyIGFycmF5cy4KKyAgICBtX3ZhcnNbaV0uY291bnQgPSBwb2ludGVyc19udW1iZXI7CisgICAgbV92YXJzW2ldLnB0cl9hcnJfb2Zmc2V0ID0gbmV3X2luZGV4OworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBfX29mZmxvYWRfZmluaV9saWJyYXJ5KHZvaWQpCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiQ2xlYW51cCBvZmZsb2FkIGxpYnJhcnkgLi4uXG4iKTsKKyAgICBpZiAobWljX2VuZ2luZXNfdG90YWwgPiAwKSB7CisgICAgICAgIGRlbGV0ZVtdIG1pY19lbmdpbmVzOworCisgICAgICAgIGlmIChtaWNfcHJveHlfZnNfcm9vdCAhPSAwKSB7CisgICAgICAgICAgICBmcmVlKG1pY19wcm94eV9mc19yb290KTsKKyAgICAgICAgICAgIG1pY19wcm94eV9mc19yb290ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtaWNfbGlicmFyeV9wYXRoICE9IDApIHsKKyAgICAgICAgICAgIGZyZWUobWljX2xpYnJhcnlfcGF0aCk7CisgICAgICAgICAgICBtaWNfbGlicmFyeV9wYXRoID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRlc3Ryb3kgdGhyZWFkIGtleQorICAgICAgICB0aHJlYWRfa2V5X2RlbGV0ZShtaWNfdGhyZWFkX2tleSk7CisgICAgfQorCisgICAgLy8gdW5sb2FkIENPSSBsaWJyYXJ5CisgICAgaWYgKENPSTo6aXNfYXZhaWxhYmxlKSB7CisgICAgICAgIENPSTo6ZmluaSgpOworICAgIH0KKworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkNsZWFudXAgb2ZmbG9hZCBsaWJyYXJ5IC4uLiBkb25lXG4iKTsKK30KKworc3RhdGljIHZvaWQgX19vZmZsb2FkX2luaXRfbGlicmFyeV9vbmNlKHZvaWQpCit7CisgICAgQ09JUkVTVUxUIHJlczsKKyAgICB1aW50MzJfdCBudW1fZGV2aWNlczsKKyAgICBzdGQ6OmJpdHNldDxNSUNfRU5HSU5FU19NQVg+IGRldmljZXM7CisKKyAgICBwcmVmaXggPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X2hvc3QpOworCisgICAgLy8gaW5pdGlhbGl6ZSB0cmFjZQorICAgIGNvbnN0IGNoYXIgKmVudl92YXIgPSBnZXRlbnYoaHRyYWNlX2Vudm5hbWUpOworICAgIGlmIChlbnZfdmFyICE9IDAgJiYgKmVudl92YXIgIT0gJ1wwJykgeworICAgICAgICBpbnQ2NF90IG5ld192YWw7CisgICAgICAgIGlmIChfX29mZmxvYWRfcGFyc2VfaW50X3N0cmluZyhlbnZfdmFyLCBuZXdfdmFsKSkgeworICAgICAgICAgICAgY29uc29sZV9lbmFibGVkID0gbmV3X3ZhbCAmIDB4MGY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlbnZfdmFyID0gZ2V0ZW52KG9mZmxvYWRfcmVwb3J0X2Vudm5hbWUpOworICAgIGlmIChlbnZfdmFyICE9IDAgJiYgKmVudl92YXIgIT0gJ1wwJykgeworICAgICAgICBpbnQ2NF90IGVudl92YWw7CisgICAgICAgIGlmIChfX29mZmxvYWRfcGFyc2VfaW50X3N0cmluZyhlbnZfdmFyLCBlbnZfdmFsKSkgeworICAgICAgICAgICAgaWYgKGVudl92YWwgPT0gT0ZGTE9BRF9SRVBPUlRfMSB8fAorICAgICAgICAgICAgICAgIGVudl92YWwgPT0gT0ZGTE9BRF9SRVBPUlRfMiB8fAorICAgICAgICAgICAgICAgIGVudl92YWwgPT0gT0ZGTE9BRF9SRVBPUlRfMykgeworICAgICAgICAgICAgICAgIG9mZmxvYWRfcmVwb3J0X2xldmVsID0gZW52X3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19pbnZhbGlkX2Vudl9yZXBvcnRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZsb2FkX3JlcG9ydF9lbnZuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19pbnZhbGlkX2Vudl92YXJfaW50X3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZsb2FkX3JlcG9ydF9lbnZuYW1lKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICghb2ZmbG9hZF9yZXBvcnRfbGV2ZWwpIHsKKyAgICAgICAgZW52X3ZhciA9IGdldGVudih0aW1lcl9lbnZuYW1lKTsKKyAgICAgICAgaWYgKGVudl92YXIgIT0gMCAmJiAqZW52X3ZhciAhPSAnXDAnKSB7CisgICAgICAgICAgICB0aW1lcl9lbmFibGVkID0gYXRvaShlbnZfdmFyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGluaXRpYWxpemUgQ09JCisgICAgaWYgKCFDT0k6OmluaXQoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gZ2V0IG51bWJlciBvZiBkZXZpY2VzIGluc3RhbGxlZCBpbiB0aGUgc3lzdGVtCisgICAgcmVzID0gQ09JOjpFbmdpbmVHZXRDb3VudChDT0lfSVNBX0tOQywgJm51bV9kZXZpY2VzKTsKKyAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobnVtX2RldmljZXMgPiBNSUNfRU5HSU5FU19NQVgpIHsKKyAgICAgICAgbnVtX2RldmljZXMgPSBNSUNfRU5HSU5FU19NQVg7CisgICAgfQorCisgICAgLy8gZmlsbCBpbiB0aGUgbGlzdCBvZiBkZXZpY2VzIHRoYXQgY2FuIGJlIHVzZWQgZm9yIG9mZmxvYWRpbmcKKyAgICBlbnZfdmFyID0gZ2V0ZW52KCJPRkZMT0FEX0RFVklDRVMiKTsKKyAgICBpZiAoZW52X3ZhciAhPSAwKSB7CisgICAgICAgIGlmIChzdHJjYXNlY21wKGVudl92YXIsICJub25lIikgIT0gMCkgeworICAgICAgICAgICAgLy8gdmFsdWUgaXMgY29tcG9zZWQgb2YgY29tbWEgc2VwYXJhdGVkIHBoeXNpY2FsIGRldmljZSBpbmRleGVzCisgICAgICAgICAgICBjaGFyICpidWYgPSBzdHJkdXAoZW52X3Zhcik7CisgICAgICAgICAgICBjaGFyICpzdHIsICpwdHI7CisgICAgICAgICAgICBmb3IgKHN0ciA9IHN0cnRva19yKGJ1ZiwgIiwiLCAmcHRyKTsgc3RyICE9IDA7CisgICAgICAgICAgICAgICAgIHN0ciA9IHN0cnRva19yKDAsICIsIiwgJnB0cikpIHsKKyAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHN0cmluZyB0byBhbiBpbnQKKyAgICAgICAgICAgICAgICBpbnQ2NF90IG51bTsKKyAgICAgICAgICAgICAgICBpZiAoIV9fb2ZmbG9hZF9wYXJzZV9pbnRfc3RyaW5nKHN0ciwgbnVtKSkgeworICAgICAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfbWljX2luaXQ1KTsKKworICAgICAgICAgICAgICAgICAgICAvLyBmYWxsYmFjayB0byB1c2luZyBhbGwgaW5zdGFsbGVkIGRldmljZXMKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlcy5yZXNldCgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9kZXZpY2VzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZXMuc2V0KGkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobnVtIDwgMCB8fCBudW0gPj0gbnVtX2RldmljZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX21pY19pbml0NiwgbnVtKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRldmljZXMuc2V0KG51bSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmVlKGJ1Zik7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8vIHVzZSBhbGwgYXZhaWxhYmxlIGRldmljZXMKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fZGV2aWNlczsgaSsrKSB7CisgICAgICAgICAgICBDT0lFTkdJTkUgZW5naW5lOworICAgICAgICAgICAgcmVzID0gQ09JOjpFbmdpbmVHZXRIYW5kbGUoQ09JX0lTQV9LTkMsIGksICZlbmdpbmUpOworICAgICAgICAgICAgaWYgKHJlcyA9PSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIGRldmljZXMuc2V0KGkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgbWljX2VuZ2luZXNfdG90YWwgPSBkZXZpY2VzLmNvdW50KCk7CisKKyAgICAvLyBubyBuZWVkIHRvIGNvbnRpbnVlIGlmIHRoZXJlIGFyZSBubyBkZXZpY2VzIHRvIG9mZmxvYWQgdG8KKyAgICBpZiAobWljX2VuZ2luZXNfdG90YWwgPD0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gaW5pdGlhbGl6ZSBpbmRleGVzIGZvciBhdmFpbGFibGUgZGV2aWNlcworICAgIG1pY19lbmdpbmVzID0gbmV3IEVuZ2luZVttaWNfZW5naW5lc190b3RhbF07CisgICAgZm9yIChpbnQgcF9pZHggPSAwLCBsX2lkeCA9IDA7IHBfaWR4IDwgbnVtX2RldmljZXM7IHBfaWR4KyspIHsKKyAgICAgICAgaWYgKGRldmljZXNbcF9pZHhdKSB7CisgICAgICAgICAgICBtaWNfZW5naW5lc1tsX2lkeF0uc2V0X2luZGV4ZXMobF9pZHgsIHBfaWR4KTsKKyAgICAgICAgICAgIGxfaWR4Kys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBsaWJyYXJ5IHNlYXJjaCBwYXRoIGZvciBkZXZpY2UgYmluYXJpZXMKKyAgICBlbnZfdmFyID0gZ2V0ZW52KCJNSUNfTERfTElCUkFSWV9QQVRIIik7CisgICAgaWYgKGVudl92YXIgIT0gMCkgeworICAgICAgICBtaWNfbGlicmFyeV9wYXRoID0gc3RyZHVwKGVudl92YXIpOworICAgIH0KKworICAgIC8vIG1lbW9yeSBzaXplIHJlc2VydmVkIGZvciBDT0kgYnVmZmVycworICAgIGVudl92YXIgPSBnZXRlbnYoIk1JQ19CVUZGRVJTSVpFIik7CisgICAgaWYgKGVudl92YXIgIT0gMCkgeworICAgICAgICB1aW50NjRfdCBuZXdfc2l6ZTsKKyAgICAgICAgaWYgKF9fb2ZmbG9hZF9wYXJzZV9zaXplX3N0cmluZyhlbnZfdmFyLCBuZXdfc2l6ZSkpIHsKKyAgICAgICAgICAgIG1pY19idWZmZXJfc2l6ZSA9IG5ld19zaXplOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2ludmFsaWRfZW52X3Zhcl92YWx1ZSwgIk1JQ19CVUZGRVJTSVpFIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBkZXRlcm1pbmUgc3RhY2tzaXplIGZvciB0aGUgcGlwZWxpbmUgb24gdGhlIGRldmljZQorICAgIGVudl92YXIgPSBnZXRlbnYoIk1JQ19TVEFDS1NJWkUiKTsKKyAgICBpZiAoZW52X3ZhciAhPSAwICYmICplbnZfdmFyICE9ICdcMCcpIHsKKyAgICAgICAgdWludDY0X3QgbmV3X3NpemU7CisgICAgICAgIGlmIChfX29mZmxvYWRfcGFyc2Vfc2l6ZV9zdHJpbmcoZW52X3ZhciwgbmV3X3NpemUpICYmCisgICAgICAgICAgICAobmV3X3NpemUgPj0gMTYzODQpICYmICgobmV3X3NpemUgJiA0MDk1KSA9PSAwKSkgeworICAgICAgICAgICAgbWljX3N0YWNrX3NpemUgPSBuZXdfc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19taWNfaW5pdDMpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gcHJveHkgSS9PCisgICAgZW52X3ZhciA9IGdldGVudigiTUlDX1BST1hZX0lPIik7CisgICAgaWYgKGVudl92YXIgIT0gMCAmJiAqZW52X3ZhciAhPSAnXDAnKSB7CisgICAgICAgIGludDY0X3QgbmV3X3ZhbDsKKyAgICAgICAgaWYgKF9fb2ZmbG9hZF9wYXJzZV9pbnRfc3RyaW5nKGVudl92YXIsIG5ld192YWwpKSB7CisgICAgICAgICAgICBtaWNfcHJveHlfaW8gPSBuZXdfdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2ludmFsaWRfZW52X3Zhcl9pbnRfdmFsdWUsICJNSUNfUFJPWFlfSU8iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbnZfdmFyID0gZ2V0ZW52KCJNSUNfUFJPWFlfRlNfUk9PVCIpOworICAgIGlmIChlbnZfdmFyICE9IDAgJiYgKmVudl92YXIgIT0gJ1wwJykgeworICAgICAgICBtaWNfcHJveHlfZnNfcm9vdCA9IHN0cmR1cChlbnZfdmFyKTsKKyAgICB9CisKKyAgICAvLyBQcmVwYXJlIGVudmlyb25tZW50IGZvciB0aGUgdGFyZ2V0IHByb2Nlc3MgdXNpbmcgdGhlIGZvbGxvd2luZworICAgIC8vIHJ1bGVzCisgICAgLy8gLSBJZiBNSUNfRU5WX1BSRUZJWCBpcyBzZXQgdGhlbiBhbnkgZW52aXJvbm1lbnQgdmFyaWFibGUgb24gdGhlCisgICAgLy8gICBob3N0IHdoaWNoIGhhcyB0aGF0IHByZWZpeCBhcmUgY29waWVkIHRvIHRoZSBkZXZpY2Ugd2l0aG91dAorICAgIC8vICAgdGhlIHByZWZpeC4KKyAgICAvLyAgIEFsbCBvdGhlciBob3N0IGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgaWdub3JlZC4KKyAgICAvLyAtIElmIE1JQ19FTlZfUFJFRklYIGlzIG5vdCBzZXQgb3IgaWYgTUlDX0VOVl9QUkVGSVg9IiIgdGhlbiBob3N0CisgICAgLy8gICBlbnZpcm9ubWVudCBpcyBkdXBsaWNhdGVkLgorICAgIGVudl92YXIgPSBnZXRlbnYoIk1JQ19FTlZfUFJFRklYIik7CisgICAgaWYgKGVudl92YXIgIT0gMCAmJiAqZW52X3ZhciAhPSAnXDAnKSB7CisgICAgICAgIG1pY19lbnZfdmFycy5zZXRfcHJlZml4KGVudl92YXIpOworCisgICAgICAgIGludCBsZW4gPSBzdHJsZW4oZW52X3Zhcik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBlbnZpcm9uW2ldICE9IDA7IGkrKykgeworICAgICAgICAgICAgaWYgKHN0cm5jbXAoZW52aXJvbltpXSwgZW52X3ZhciwgbGVuKSA9PSAwICYmCisgICAgICAgICAgICAgICAgc3RybmNtcChlbnZpcm9uW2ldLCAiTUlDX0xEX0xJQlJBUllfUEFUSCIsIDE5KSAhPSAwICYmCisgICAgICAgICAgICAgICAgZW52aXJvbltpXVtsZW5dICE9ICc9JykgeworICAgICAgICAgICAgICAgIG1pY19lbnZfdmFycy5hbmFseXplX2Vudl92YXIoZW52aXJvbltpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBjcmVhdGUga2V5IGZvciB0aHJlYWQgZGF0YQorICAgIGlmICh0aHJlYWRfa2V5X2NyZWF0ZSgmbWljX3RocmVhZF9rZXksIEVuZ2luZTo6ZGVzdHJveV90aHJlYWRfZGF0YSkpIHsKKyAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX21pY19pbml0NCwgZXJybm8pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gY3B1IGZyZXF1ZW5jeQorICAgIGNwdV9mcmVxdWVuY3kgPSBDT0k6OlBlcmZHZXRDeWNsZUZyZXF1ZW5jeSgpOworCisgICAgZW52X3ZhciA9IGdldGVudihtaWNfdXNlXzJtYl9idWZmZXJzX2Vudm5hbWUpOworICAgIGlmIChlbnZfdmFyICE9IDAgJiYgKmVudl92YXIgIT0gJ1wwJykgeworICAgICAgICB1aW50NjRfdCBuZXdfc2l6ZTsKKyAgICAgICAgaWYgKF9fb2ZmbG9hZF9wYXJzZV9zaXplX3N0cmluZyhlbnZfdmFyLCBuZXdfc2l6ZSkpIHsKKyAgICAgICAgICAgIF9fb2ZmbG9hZF91c2VfMm1iX2J1ZmZlcnMgPSBuZXdfc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19pbnZhbGlkX2Vudl92YXJfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pY191c2VfMm1iX2J1ZmZlcnNfZW52bmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlbnZfdmFyID0gZ2V0ZW52KG1pY191c2VfYXN5bmNfYnVmZmVyX3dyaXRlX2Vudm5hbWUpOworICAgIGlmIChlbnZfdmFyICE9IDAgJiYgKmVudl92YXIgIT0gJ1wwJykgeworICAgICAgICB1aW50NjRfdCBuZXdfc2l6ZTsKKyAgICAgICAgaWYgKF9fb2ZmbG9hZF9wYXJzZV9zaXplX3N0cmluZyhlbnZfdmFyLCBuZXdfc2l6ZSkpIHsKKyAgICAgICAgICAgIF9fb2ZmbG9hZF91c2VfYXN5bmNfYnVmZmVyX3dyaXRlID0gbmV3X3NpemU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlbnZfdmFyID0gZ2V0ZW52KG1pY191c2VfYXN5bmNfYnVmZmVyX3JlYWRfZW52bmFtZSk7CisgICAgaWYgKGVudl92YXIgIT0gMCAmJiAqZW52X3ZhciAhPSAnXDAnKSB7CisgICAgICAgIHVpbnQ2NF90IG5ld19zaXplOworICAgICAgICBpZiAoX19vZmZsb2FkX3BhcnNlX3NpemVfc3RyaW5nKGVudl92YXIsIG5ld19zaXplKSkgeworICAgICAgICAgICAgX19vZmZsb2FkX3VzZV9hc3luY19idWZmZXJfcmVhZCA9IG5ld19zaXplOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gbWljIGluaXRpYWxpemF0aW9uIHR5cGUKKyAgICBlbnZfdmFyID0gZ2V0ZW52KG9mZmxvYWRfaW5pdF9lbnZuYW1lKTsKKyAgICBpZiAoZW52X3ZhciAhPSAwICYmICplbnZfdmFyICE9ICdcMCcpIHsKKyAgICAgICAgaWYgKHN0cmNtcChlbnZfdmFyLCAib25fb2ZmbG9hZCIpID09IDApIHsKKyAgICAgICAgICAgIF9fb2ZmbG9hZF9pbml0X3R5cGUgPSBjX2luaXRfb25fb2ZmbG9hZDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzdHJjbXAoZW52X3ZhciwgIm9uX29mZmxvYWRfYWxsIikgPT0gMCkgeworICAgICAgICAgICAgX19vZmZsb2FkX2luaXRfdHlwZSA9IGNfaW5pdF9vbl9vZmZsb2FkX2FsbDsKKyAgICAgICAgfQorI2lmbmRlZiBUQVJHRVRfV0lOTlQKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKGVudl92YXIsICJvbl9zdGFydCIpID09IDApIHsKKyAgICAgICAgICAgIF9fb2ZmbG9hZF9pbml0X3R5cGUgPSBjX2luaXRfb25fc3RhcnQ7CisgICAgICAgIH0KKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfaW52YWxpZF9lbnZfdmFyX3ZhbHVlLCBvZmZsb2FkX2luaXRfZW52bmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBhY3RpdmUgd2FpdAorICAgIGVudl92YXIgPSBnZXRlbnYob2ZmbG9hZF9hY3RpdmVfd2FpdF9lbnZuYW1lKTsKKyAgICBpZiAoZW52X3ZhciAhPSAwICYmICplbnZfdmFyICE9ICdcMCcpIHsKKyAgICAgICAgaW50NjRfdCBuZXdfdmFsOworICAgICAgICBpZiAoX19vZmZsb2FkX3BhcnNlX2ludF9zdHJpbmcoZW52X3ZhciwgbmV3X3ZhbCkpIHsKKyAgICAgICAgICAgIF9fb2ZmbG9hZF9hY3RpdmVfd2FpdCA9IG5ld192YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfaW52YWxpZF9lbnZfdmFyX2ludF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmbG9hZF9hY3RpdmVfd2FpdF9lbnZuYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIG9tcCBkZXZpY2UgbnVtCisgICAgZW52X3ZhciA9IGdldGVudihvbXBfZGV2aWNlX251bV9lbnZuYW1lKTsKKyAgICBpZiAoZW52X3ZhciAhPSAwICYmICplbnZfdmFyICE9ICdcMCcpIHsKKyAgICAgICAgaW50NjRfdCBuZXdfdmFsOworICAgICAgICBpZiAoX19vZmZsb2FkX3BhcnNlX2ludF9zdHJpbmcoZW52X3ZhciwgbmV3X3ZhbCkgJiYgbmV3X3ZhbCA+PSAwKSB7CisgICAgICAgICAgICBfX29tcF9kZXZpY2VfbnVtID0gbmV3X3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19vbXBfaW52YWxpZF9kZXZpY2VfbnVtX2VudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21wX2RldmljZV9udW1fZW52bmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBpbml0IE9SU0wKKyAgICBPUlNMOjppbml0KCk7Cit9CisKK2V4dGVybiBpbnQgX19vZmZsb2FkX2luaXRfbGlicmFyeSh2b2lkKQoreworICAgIC8vIGRvIG9uZSB0aW1lIGludGlhbGl6YXRpb24KKyAgICBzdGF0aWMgT2ZmbG9hZE9uY2VDb250cm9sIGN0cmwgPSBPRkZMT0FEX09OQ0VfQ09OVFJPTF9JTklUOworICAgIF9fb2ZmbG9hZF9ydW5fb25jZSgmY3RybCwgX19vZmZsb2FkX2luaXRfbGlicmFyeV9vbmNlKTsKKworICAgIC8vIG9mZmxvYWQgaXMgYXZhaWxhYmxlIGlmIENPSSBpcyBhdmFpbGFibGUgYW5kIHRoZSBudW1iZXIgb2YgZGV2aWNlcyA+IDAKKyAgICBib29sIGlzX2F2YWlsYWJsZSA9IENPSTo6aXNfYXZhaWxhYmxlICYmIChtaWNfZW5naW5lc190b3RhbCA+IDApOworCisgICAgLy8gcmVnaXN0ZXIgcGVuZGluZyBsaWJyYXJpZXMgaWYgdGhlcmUgYXJlIGFueQorICAgIGlmIChpc19hdmFpbGFibGUgJiYgX190YXJnZXRfbGlicykgeworICAgICAgICBtdXRleF9sb2NrZXJfdCBsb2NrZXIoX190YXJnZXRfbGlic19sb2NrKTsKKworICAgICAgICBmb3IgKFRhcmdldEltYWdlTGlzdDo6aXRlcmF0b3IgaXQgPSBfX3RhcmdldF9saWJzX2xpc3QuYmVnaW4oKTsKKyAgICAgICAgICAgICBpdCAhPSBfX3RhcmdldF9saWJzX2xpc3QuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgICAgIC8vIFJlZ2lzdGVyIGxpYnJhcnkgaW4gQ09JCisgICAgICAgICAgICBDT0k6OlByb2Nlc3NSZWdpc3RlckxpYnJhcmllcygxLCAmaXQtPmRhdGEsICZpdC0+c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpdC0+b3JpZ2luLCAmaXQtPm9mZnNldCk7CisKKyAgICAgICAgICAgIC8vIGFkZCBsaWIgdG8gYWxsIGVuZ2luZXMKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWljX2VuZ2luZXNfdG90YWw7IGkrKykgeworICAgICAgICAgICAgICAgIG1pY19lbmdpbmVzW2ldLmFkZF9saWIoKml0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIF9fdGFyZ2V0X2xpYnMgPSBmYWxzZTsKKyAgICAgICAgX190YXJnZXRfbGlic19saXN0LmNsZWFyKCk7CisgICAgfQorCisgICAgcmV0dXJuIGlzX2F2YWlsYWJsZTsKK30KKworZXh0ZXJuICJDIiB2b2lkIF9fb2ZmbG9hZF9yZWdpc3Rlcl9pbWFnZShjb25zdCB2b2lkICp0YXJnZXRfaW1hZ2UpCit7CisgICAgY29uc3Qgc3RydWN0IEltYWdlICppbWFnZSA9IHN0YXRpY19jYXN0PGNvbnN0IHN0cnVjdCBJbWFnZSo+KHRhcmdldF9pbWFnZSk7CisKKyAgICAvLyBkZWNvZGUgaW1hZ2UKKyAgICBjb25zdCBjaGFyICpuYW1lID0gaW1hZ2UtPmRhdGE7CisgICAgY29uc3Qgdm9pZCAqZGF0YSA9IGltYWdlLT5kYXRhICsgc3RybGVuKGltYWdlLT5kYXRhKSArIDE7CisgICAgdWludDY0X3QgICAgc2l6ZSA9IGltYWdlLT5zaXplOworICAgIGNvbnN0IGNoYXIgKm9yaWdpbiA9IDA7CisgICAgdWludDY0X3QgICAgb2Zmc2V0ID0gMDsKKworICAgIC8vIG91ciBhY3Rpb25zIGRlcGVuZCBvbiB0aGUgaW1hZ2UgdHlwZQorICAgIGNvbnN0IEVsZjY0X0VoZHIgKmhkciA9IHN0YXRpY19jYXN0PGNvbnN0IEVsZjY0X0VoZHIqPihkYXRhKTsKKyAgICBzd2l0Y2ggKGhkci0+ZV90eXBlKSB7CisgICAgICAgIGNhc2UgRVRfRVhFQzoKKyAgICAgICAgICAgIC8vIEVhY2ggb2ZmbG9hZCBhcHBsaWNhdGlvbiBpcyBzdXBwb3NlZCB0byBoYXZlIG9ubHkgb25lIHRhcmdldAorICAgICAgICAgICAgLy8gaW1hZ2UgcmVwcmVzZW50aW5nIHRhcmdldCBleGVjdXRhYmxlLgorICAgICAgICAgICAgLy8gTm8gdGhyZWFkIHN5bmNocm9uaXphdGlvbiBpcyByZXF1aXJlZCBoZXJlIGFzIHRoZSBpbml0aWFsaXphdGlvbgorICAgICAgICAgICAgLy8gY29kZSBpcyBhbHdheXMgZXhlY3V0ZWQgaW4gYSBzaW5nbGUgdGhyZWFkLgorICAgICAgICAgICAgaWYgKF9fdGFyZ2V0X2V4ZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX211bHRpcGxlX3RhcmdldF9leGVzKTsKKyAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX190YXJnZXRfZXhlID0gbmV3IFRhcmdldEltYWdlKG5hbWUsIGRhdGEsIHNpemUsIG9yaWdpbiwgb2Zmc2V0KTsKKworICAgICAgICAgICAgLy8gUmVnaXN0cmF0aW9uIGNvZGUgZm9yIGV4ZWNzIGlzIGFsd2F5cyBjYWxsZWQgZnJvbSB0aGUgY29udGV4dAorICAgICAgICAgICAgLy8gb2YgbWFpbiBhbmQgdGh1cyB3ZSBjYW4gc2FmZWx5IGNhbGwgYW55IGZ1bmN0aW9uIGhlcmUsCisgICAgICAgICAgICAvLyBpbmNsdWRpbmcgTG9hZExpYnJhcnkgQVBJIG9uIHdpbmRvd3MuIFRoaXMgaXMgdGhlIHBsYWNlIHdoZXJlCisgICAgICAgICAgICAvLyB3ZSBkbyB0aGUgb2ZmbG9hZCBsaWJyYXJ5IGluaXRpYWxpemF0aW9uLgorICAgICAgICAgICAgaWYgKF9fb2ZmbG9hZF9pbml0X2xpYnJhcnkoKSkgeworICAgICAgICAgICAgICAgIC8vIGluaXRpYWxpemUgZW5naW5lIGlmIGluaXRfdHlwZSBpcyBvbl9zdGFydAorICAgICAgICAgICAgICAgIGlmIChfX29mZmxvYWRfaW5pdF90eXBlID09IGNfaW5pdF9vbl9zdGFydCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1pY19lbmdpbmVzX3RvdGFsOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pY19lbmdpbmVzW2ldLmluaXQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRVRfRFlOOgorICAgICAgICAgICAgLy8gUmVnaXN0cmF0aW9uIGNvZGUgZm9yIGxpYnJhcmllcyBpcyBjYWxsZWQgZnJvbSB0aGUgRGxsTWFpbgorICAgICAgICAgICAgLy8gY29udGV4dCAob24gd2luZG93cykgYW5kIHRodXMgd2UgY2Fubm90IGRvIGFueXRoaW5nIHVzZWZ1bAorICAgICAgICAgICAgLy8gaGVyZS4gU28gd2UganVzdCBhZGQgaXQgdG8gdGhlIGxpc3Qgb2YgcGVuZGluZyBsaWJyYXJpZXMgZm9yCisgICAgICAgICAgICAvLyB0aGUgbGF0ZXIgdXNlLgorICAgICAgICAgICAgX190YXJnZXRfbGlic19sb2NrLmxvY2soKTsKKyAgICAgICAgICAgIF9fdGFyZ2V0X2xpYnMgPSB0cnVlOworICAgICAgICAgICAgX190YXJnZXRfbGlic19saXN0LnB1c2hfYmFjayhUYXJnZXRJbWFnZShuYW1lLCBkYXRhLCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW4sIG9mZnNldCkpOworICAgICAgICAgICAgX190YXJnZXRfbGlic19sb2NrLnVubG9jaygpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8vIHNvbWV0aGluZyBpcyBkZWZpbml0ZWx5IHdyb25nLCBpc3N1ZSBhbiBlcnJvciBhbmQgZXhpdAorICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3Vua25vd25fYmluYXJ5X3R5cGUpOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICB9Cit9CisKK2V4dGVybiAiQyIgdm9pZCBfX29mZmxvYWRfdW5yZWdpc3Rlcl9pbWFnZShjb25zdCB2b2lkICp0YXJnZXRfaW1hZ2UpCit7CisgICAgLy8gVGFyZ2V0IGltYWdlIGlzIHBhY2tlZCBhcyBmb2xsb3dzOgorICAgIC8vICAgICAgOCBieXRlcyAgICAgICAgICAgICAgICAtIHNpemUgb2YgdGhlIHRhcmdldCBiaW5hcnkKKyAgICAvLyAgICAgIG51bGwtdGVybWluYXRlZCBzdHJpbmcgLSBiaW5hcnkgbmFtZQorICAgIC8vICAgICAgPHNpemU+IGJ5dGVzICAgICAgICAgICAtIGJpbmFyeSBjb250ZW50cworICAgIGNvbnN0IHN0cnVjdCBJbWFnZSB7CisgICAgICAgICBpbnQ2NF90IHNpemU7CisgICAgICAgICBjaGFyIGRhdGFbXTsKKyAgICB9ICppbWFnZSA9IHN0YXRpY19jYXN0PGNvbnN0IHN0cnVjdCBJbWFnZSo+KHRhcmdldF9pbWFnZSk7CisKKyAgICAvLyBkZWNvZGUgaW1hZ2UKKyAgICBjb25zdCBjaGFyICpuYW1lID0gaW1hZ2UtPmRhdGE7CisgICAgY29uc3Qgdm9pZCAqZGF0YSA9IGltYWdlLT5kYXRhICsgc3RybGVuKGltYWdlLT5kYXRhKSArIDE7CisKKyAgICAvLyBvdXIgYWN0aW9ucyBkZXBlbmQgb24gdGhlIGltYWdlIHR5cGUKKyAgICBjb25zdCBFbGY2NF9FaGRyICpoZHIgPSBzdGF0aWNfY2FzdDxjb25zdCBFbGY2NF9FaGRyKj4oZGF0YSk7CisgICAgaWYgKGhkci0+ZV90eXBlID09IEVUX0VYRUMpIHsKKyAgICAgICAgLy8gV2UgYXJlIGV4ZWN1dGluZyBleGVjJ3MgZGVzY3RydWN0b3JzLgorICAgICAgICAvLyBJdCBpcyB0aW1lIHRvIGRvIGEgbGlicmFyeSBjbGVhbnVwLgorICAgICAgICBpZiAodGltZXJfZW5hYmxlZCkgeworICAgICAgICAgICAgT2ZmbG9hZF9UaW1lcl9QcmludCgpOworICAgICAgICB9CisKKyNpZmRlZiBNWU9fU1VQUE9SVAorICAgICAgICBfX29mZmxvYWRfbXlvRmluaSgpOworI2VuZGlmIC8vIE1ZT19TVVBQT1JUCisKKyAgICAgICAgX19vZmZsb2FkX2ZpbmlfbGlicmFyeSgpOworICAgIH0KK30KKworLy8gUnVudGltZSB0cmFjZSBpbnRlcmZhY2UgZm9yIHVzZXIgcHJvZ3JhbXMKKwordm9pZCBfX29mZmxvYWRfY29uc29sZV90cmFjZShpbnQgbGV2ZWwpCit7CisgICAgY29uc29sZV9lbmFibGVkID0gbGV2ZWw7Cit9CisKKy8vIFVzZXItdmlzaWJsZSBvZmZsb2FkIEFQSQorCitpbnQgX09mZmxvYWRfbnVtYmVyX29mX2RldmljZXModm9pZCkKK3sKKyAgICBfX29mZmxvYWRfaW5pdF9saWJyYXJ5KCk7CisgICAgcmV0dXJuIG1pY19lbmdpbmVzX3RvdGFsOworfQorCitpbnQgX09mZmxvYWRfZ2V0X2RldmljZV9udW1iZXIodm9pZCkKK3sKKyAgICByZXR1cm4gLTE7Cit9CisKK2ludCBfT2ZmbG9hZF9nZXRfcGh5c2ljYWxfZGV2aWNlX251bWJlcih2b2lkKQoreworICAgIHJldHVybiAtMTsKK30KKworaW50IF9PZmZsb2FkX3NpZ25hbGVkKGludCBpbmRleCwgdm9pZCAqc2lnbmFsKQoreworICAgIF9fb2ZmbG9hZF9pbml0X2xpYnJhcnkoKTsKKworICAgIC8vIGNoZWNrIGluZGV4IHZhbHVlCisgICAgaWYgKGluZGV4IDwgMCB8fCBtaWNfZW5naW5lc190b3RhbCA8PSAwKSB7CisgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19vZmZsb2FkX3NpZ25hbGVkMSwgaW5kZXgpOworICAgICAgICBMSUJPRkZMT0FEX0FCT1JUOworICAgIH0KKworICAgIC8vIGZpbmQgYXNzb2NpYXRlZCBhc3luYyB0YXNrCisgICAgT2ZmbG9hZERlc2NyaXB0b3IgKnRhc2sgPQorICAgICAgICBtaWNfZW5naW5lc1tpbmRleCAlIG1pY19lbmdpbmVzX3RvdGFsXS5maW5kX3NpZ25hbChzaWduYWwsIGZhbHNlKTsKKyAgICBpZiAodGFzayA9PSAwKSB7CisgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19vZmZsb2FkX3NpZ25hbGVkMiwgc2lnbmFsKTsKKyAgICAgICAgTElCT0ZGTE9BRF9BQk9SVDsKKyAgICB9CisKKyAgICByZXR1cm4gdGFzay0+aXNfc2lnbmFsZWQoKTsKK30KKwordm9pZCBfT2ZmbG9hZF9yZXBvcnQoaW50IHZhbCkKK3sKKyAgICBpZiAodmFsID09IE9GRkxPQURfUkVQT1JUX09OIHx8CisgICAgICAgIHZhbCA9PSBPRkZMT0FEX1JFUE9SVF9PRkYpIHsKKyAgICAgICAgb2ZmbG9hZF9yZXBvcnRfZW5hYmxlZCA9IHZhbDsKKyAgICB9Cit9CisKKy8vIElEQiBzdXBwb3J0CitpbnQgICBfX2RiZ19pc19hdHRhY2hlZCA9IDA7CitpbnQgICBfX2RiZ190YXJnZXRfaWQgPSAtMTsKK3BpZF90IF9fZGJnX3RhcmdldF9zb19waWQgPSAtMTsKK2NoYXIgIF9fZGJnX3RhcmdldF9leGVfbmFtZVtNQVhfVEFSR0VUX05BTUVdID0gezB9OworY29uc3QgaW50IF9fZGJnX2FwaV9tYWpvcl92ZXJzaW9uID0gMTsKK2NvbnN0IGludCBfX2RiZ19hcGlfbWlub3JfdmVyc2lvbiA9IDA7CisKK3ZvaWQgX19kYmdfdGFyZ2V0X3NvX2xvYWRlZCgpCit7Cit9Cit2b2lkIF9fZGJnX3RhcmdldF9zb191bmxvYWRlZCgpCit7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX2hvc3QuaCBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfaG9zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMjM5OTYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX2hvc3QuaApAQCAtMCwwICsxLDM0MyBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvKiEgXGZpbGUKKyAgICBcYnJpZWYgVGhlIHBhcnRzIG9mIHRoZSBydW50aW1lIGxpYnJhcnkgdXNlZCBvbmx5IG9uIHRoZSBob3N0CisqLworCisjaWZuZGVmIE9GRkxPQURfSE9TVF9IX0lOQ0xVREVECisjZGVmaW5lIE9GRkxPQURfSE9TVF9IX0lOQ0xVREVECisKKyNpZm5kZWYgVEFSR0VUX1dJTk5UCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisjaW5jbHVkZSAib2ZmbG9hZF9jb21tb24uaCIKKyNpbmNsdWRlICJvZmZsb2FkX3V0aWwuaCIKKyNpbmNsdWRlICJvZmZsb2FkX2VuZ2luZS5oIgorI2luY2x1ZGUgIm9mZmxvYWRfZW52LmgiCisjaW5jbHVkZSAib2ZmbG9hZF9vcnNsLmgiCisjaW5jbHVkZSAiY29pL2NvaV9jbGllbnQuaCIKKworLy8gTUlDIGVuZ2luZXMuCitleHRlcm4gRW5naW5lKiAgbWljX2VuZ2luZXM7CitleHRlcm4gdWludDMyX3QgbWljX2VuZ2luZXNfdG90YWw7CisKKy8vISBUaGUgdGFyZ2V0IGltYWdlIGlzIHBhY2tlZCBhcyBmb2xsb3dzLgorLyohICAgICAgMS4gOCBieXRlcyBjb250YWluaW5nIHRoZSBzaXplIG9mIHRoZSB0YXJnZXQgYmluYXJ5ICAgICAgICAgICovCisvKiEgICAgICAyLiBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcgd2hpY2ggaXMgdGhlIGJpbmFyeSBuYW1lICAgICAgICAgKi8KKy8qISAgICAgIDMuIDxzaXplPiBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhcmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBpbWFnZSAqLworLyohICAgICAgVGhlIGFkZHJlc3Mgb2Ygc3ltYm9sIF9fb2ZmbG9hZF90YXJnZXRfaW1hZ2UKKyAgICAgICAgICAgICBpcyB0aGUgYWRkcmVzcyBvZiB0aGlzIHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAqLworc3RydWN0IEltYWdlIHsKKyAgICAgaW50NjRfdCBzaXplOyAvLyE8IFNpemUgaW4gYnl0ZXMgb2YgdGhlIHRhcmdldCBiaW5hcnkgbmFtZSBhbmQgY29udGVudHMKKyAgICAgY2hhciBkYXRhW107ICAvLyE8IFRoZSBuYW1lIGFuZCBjb250ZW50cyBvZiB0aGUgdGFyZ2V0IGltYWdlCit9OworCisvLyBUaGUgb2ZmbG9hZCBkZXNjcmlwdG9yLgorY2xhc3MgT2ZmbG9hZERlc2NyaXB0b3IKK3sKK3B1YmxpYzoKKyAgICBPZmZsb2FkRGVzY3JpcHRvcigKKyAgICAgICAgaW50IGluZGV4LAorICAgICAgICBfT2ZmbG9hZF9zdGF0dXMgKnN0YXR1cywKKyAgICAgICAgYm9vbCBpc19tYW5kYXRvcnksCisgICAgICAgIGJvb2wgaXNfb3Blbm1wLAorICAgICAgICBPZmZsb2FkSG9zdFRpbWVyRGF0YSAqIHRpbWVyX2RhdGEKKyAgICApIDoKKyAgICAgICAgbV9kZXZpY2UobWljX2VuZ2luZXNbaW5kZXggJSBtaWNfZW5naW5lc190b3RhbF0pLAorICAgICAgICBtX2lzX21hbmRhdG9yeShpc19tYW5kYXRvcnkpLAorICAgICAgICBtX2lzX29wZW5tcChpc19vcGVubXApLAorICAgICAgICBtX2lub3V0X2J1ZigwKSwKKyAgICAgICAgbV9mdW5jX2Rlc2MoMCksCisgICAgICAgIG1fZnVuY19kZXNjX3NpemUoMCksCisgICAgICAgIG1faW5fZGVwcygwKSwKKyAgICAgICAgbV9pbl9kZXBzX3RvdGFsKDApLAorICAgICAgICBtX291dF9kZXBzKDApLAorICAgICAgICBtX291dF9kZXBzX3RvdGFsKDApLAorICAgICAgICBtX3ZhcnMoMCksCisgICAgICAgIG1fdmFyc19leHRyYSgwKSwKKyAgICAgICAgbV9zdGF0dXMoc3RhdHVzKSwKKyAgICAgICAgbV90aW1lcl9kYXRhKHRpbWVyX2RhdGEpCisgICAge30KKworICAgIH5PZmZsb2FkRGVzY3JpcHRvcigpCisgICAgeworICAgICAgICBpZiAobV9pbl9kZXBzICE9IDApIHsKKyAgICAgICAgICAgIGZyZWUobV9pbl9kZXBzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobV9vdXRfZGVwcyAhPSAwKSB7CisgICAgICAgICAgICBmcmVlKG1fb3V0X2RlcHMpOworICAgICAgICB9CisgICAgICAgIGlmIChtX2Z1bmNfZGVzYyAhPSAwKSB7CisgICAgICAgICAgICBmcmVlKG1fZnVuY19kZXNjKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobV92YXJzICE9IDApIHsKKyAgICAgICAgICAgIGZyZWUobV92YXJzKTsKKyAgICAgICAgICAgIGZyZWUobV92YXJzX2V4dHJhKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgb2ZmbG9hZChjb25zdCBjaGFyICpuYW1lLCBib29sIGlzX2VtcHR5LAorICAgICAgICAgICAgICAgICBWYXJEZXNjICp2YXJzLCBWYXJEZXNjMiAqdmFyczIsIGludCB2YXJzX3RvdGFsLAorICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICoqd2FpdHMsIGludCBudW1fd2FpdHMsIGNvbnN0IHZvaWQgKipzaWduYWwsCisgICAgICAgICAgICAgICAgIGludCBlbnRyeV9pZCwgY29uc3Qgdm9pZCAqc3RhY2tfYWRkcik7CisgICAgYm9vbCBvZmZsb2FkX2ZpbmlzaCgpOworCisgICAgYm9vbCBpc19zaWduYWxlZCgpOworCisgICAgT2ZmbG9hZEhvc3RUaW1lckRhdGEqIGdldF90aW1lcl9kYXRhKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV90aW1lcl9kYXRhOworICAgIH0KKworcHJpdmF0ZToKKyAgICBib29sIHdhaXRfZGVwZW5kZW5jaWVzKGNvbnN0IHZvaWQgKip3YWl0cywgaW50IG51bV93YWl0cyk7CisgICAgYm9vbCBzZXR1cF9kZXNjcmlwdG9ycyhWYXJEZXNjICp2YXJzLCBWYXJEZXNjMiAqdmFyczIsIGludCB2YXJzX3RvdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVudHJ5X2lkLCBjb25zdCB2b2lkICpzdGFja19hZGRyKTsKKyAgICBib29sIHNldHVwX21pc2NfZGF0YShjb25zdCBjaGFyICpuYW1lKTsKKyAgICBib29sIHNlbmRfcG9pbnRlcl9kYXRhKGJvb2wgaXNfYXN5bmMpOworICAgIGJvb2wgc2VuZF9ub25jb250aWd1b3VzX3BvaW50ZXJfZGF0YSgKKyAgICAgICAgaW50IGksCisgICAgICAgIFB0ckRhdGEqIHNyY19idWYsCisgICAgICAgIFB0ckRhdGEqIGRzdF9idWYsCisgICAgICAgIENPSUVWRU5UICpldmVudCk7CisgICAgYm9vbCByZWNlaXZlX25vbmNvbnRpZ3VvdXNfcG9pbnRlcl9kYXRhKAorICAgICAgICBpbnQgaSwKKyAgICAgICAgY2hhciogc3JjX2RhdGEsCisgICAgICAgIENPSUJVRkZFUiBkc3RfYnVmLAorICAgICAgICBDT0lFVkVOVCAqZXZlbnQpOworCisgICAgYm9vbCBnYXRoZXJfY29weWluX2RhdGEoKTsKKworICAgIGJvb2wgY29tcHV0ZSgpOworCisgICAgYm9vbCByZWNlaXZlX3BvaW50ZXJfZGF0YShib29sIGlzX2FzeW5jKTsKKyAgICBib29sIHNjYXR0ZXJfY29weW91dF9kYXRhKCk7CisKKyAgICB2b2lkIGNsZWFudXAoKTsKKworICAgIGJvb2wgZmluZF9wdHJfZGF0YShQdHJEYXRhKiAmcHRyX2RhdGEsIHZvaWQgKmJhc2UsIGludDY0X3QgZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBsZW5ndGgsIGJvb2wgZXJyb3JfZG9lc19ub3RfZXhpc3QgPSB0cnVlKTsKKyAgICBib29sIGFsbG9jX3B0cl9kYXRhKFB0ckRhdGEqICZwdHJfZGF0YSwgdm9pZCAqYmFzZSwgaW50NjRfdCBkaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBsZW5ndGgsIGludDY0X3QgYWxsb2NfZGlzcCwgaW50IGFsaWduKTsKKyAgICBib29sIGluaXRfc3RhdGljX3B0cl9kYXRhKFB0ckRhdGEgKnB0cl9kYXRhKTsKKyAgICBib29sIGluaXRfbWljX2FkZHJlc3MoUHRyRGF0YSAqcHRyX2RhdGEpOworICAgIGJvb2wgb2ZmbG9hZF9zdGFja19tZW1vcnlfbWFuYWdlcihjb25zdCB2b2lkICogc3RhY2tfYmVnaW4sIGludCByb3V0aW5lX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmX3NpemUsIGludCBhbGlnbiwgYm9vbCAqaXNfbmV3KTsKKyAgICBib29sIG51bGxpZnlfdGFyZ2V0X3N0YWNrKENPSUJVRkZFUiB0YXJnX2J1ZiwgdWludDY0X3Qgc2l6ZSk7CisKKyAgICBib29sIGdlbl92YXJfZGVzY3NfZm9yX3BvaW50ZXJfYXJyYXkoaW50IGkpOworCisgICAgdm9pZCByZXBvcnRfY29pX2Vycm9yKGVycm9yX3R5cGVzIG1zZywgQ09JUkVTVUxUIHJlcyk7CisgICAgX09mZmxvYWRfcmVzdWx0IHRyYW5zbGF0ZV9jb2lfZXJyb3IoQ09JUkVTVUxUIHJlcykgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBzdGQ6Omxpc3Q8Q09JQlVGRkVSPiBCdWZmZXJMaXN0OworCisgICAgLy8gZXh0cmEgZGF0YSBhc3NvY2lhdGVkIHdpdGggZWFjaCB2YXJpYWJsZSBkZXNjcmlwdG9yCisgICAgc3RydWN0IFZhckV4dHJhIHsKKyAgICAgICAgUHRyRGF0YSogc3JjX2RhdGE7CisgICAgICAgIFB0ckRhdGEqIGRzdF9kYXRhOworICAgICAgICBBdXRvRGF0YSogYXV0b19kYXRhOworICAgICAgICBpbnQ2NF90IGNwdV9kaXNwOworICAgICAgICBpbnQ2NF90IGNwdV9vZmZzZXQ7CisgICAgICAgIENlYW5SZWFkUmFuZ2VzICpyZWFkX3JuZ19zcmM7CisgICAgICAgIENlYW5SZWFkUmFuZ2VzICpyZWFkX3JuZ19kc3Q7CisgICAgICAgIGludDY0X3QgcHRyX2Fycl9vZmZzZXQ7CisgICAgICAgIGJvb2wgaXNfYXJyX3B0cl9lbDsKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgUmVhZEFyckVsZW1lbnRzIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFJlYWRBcnJFbGVtZW50cygpOgorICAgICAgICAgICAgcmFuZ2VzKE5VTEwpLAorICAgICAgICAgICAgZWxfc2l6ZShzaXplb2YoVCkpLAorICAgICAgICAgICAgb2Zmc2V0KDApLAorICAgICAgICAgICAgY291bnQoMCksCisgICAgICAgICAgICBpc19lbXB0eSh0cnVlKSwKKyAgICAgICAgICAgIGJhc2UoTlVMTCkKKyAgICAgICAge30KKworICAgICAgICBib29sIHJlYWRfbmV4dChib29sIGZsYWcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmbGFnICE9IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNfZW1wdHkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFnZXRfbmV4dF9yYW5nZShyYW5nZXMsICZvZmZzZXQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmFuZ2VzIGFyZSBvdmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBjb250aWd1b3VzIGVsZW1lbnRzIGFyZSBvdmVyCisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvdW50ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGxlbmd0aF9jdXIgPSBzaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGVsX3NpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZhbCA9IChUKWdldF9lbF92YWx1ZShiYXNlLCBvZmZzZXQsIGVsX3NpemUpOworICAgICAgICAgICAgICAgIGxlbmd0aF9jdXIgLT0gZWxfc2l6ZTsKKyAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgICAgIGlzX2VtcHR5ID0gbGVuZ3RoX2N1ciA9PSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICBwdWJsaWM6CisgICAgICAgIENlYW5SZWFkUmFuZ2VzICogcmFuZ2VzOworICAgICAgICBUICAgICAgIHZhbDsKKyAgICAgICAgaW50ICAgICBlbF9zaXplOworICAgICAgICBpbnQ2NF90IHNpemUsCisgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgICAgICAgICAgICAgIGxlbmd0aF9jdXI7CisgICAgICAgIGJvb2wgICAgaXNfZW1wdHk7CisgICAgICAgIGludCAgICAgY291bnQ7CisgICAgICAgIGNoYXIgICAqYmFzZTsKKyAgICB9OworCisgICAgLy8gcHRyX2RhdGEgZm9yIHBlcnNpc3RlbnQgYXV0byBvYmplY3RzCisgICAgUHRyRGF0YSogICAgbV9zdGFja19wdHJfZGF0YTsKKyAgICBQdHJEYXRhTGlzdCBtX2Rlc3Ryb3lfc3RhY2s7CisKKyAgICAvLyBFbmdpbmUKKyAgICBFbmdpbmUmIG1fZGV2aWNlOworCisgICAgLy8gaWYgdHJ1ZSBvZmZsb2FkIGlzIG1hbmRhdG9yeQorICAgIGJvb2wgbV9pc19tYW5kYXRvcnk7CisKKyAgICAvLyBpZiB0cnVlIG9mZmxvYWQgaGFzIG9wZW5tcCBvcmlnaW4KKyAgICBjb25zdCBib29sIG1faXNfb3Blbm1wOworCisgICAgLy8gVGhlIE1hcnNoYWxsZXIgZm9yIHRoZSBpbnB1dHMgb2YgdGhlIG9mZmxvYWRlZCByZWdpb24uCisgICAgTWFyc2hhbGxlciBtX2luOworCisgICAgLy8gVGhlIE1hcnNoYWxsZXIgZm9yIHRoZSBvdXRwdXRzIG9mIHRoZSBvZmZsb2FkZWQgcmVnaW9uLgorICAgIE1hcnNoYWxsZXIgbV9vdXQ7CisKKyAgICAvLyBMaXN0IG9mIGJ1ZmZlcnMgdGhhdCBhcmUgcGFzc2VkIHRvIGRpc3BhdGNoIGNhbGwKKyAgICBCdWZmZXJMaXN0IG1fY29tcHV0ZV9idWZmZXJzOworCisgICAgLy8gTGlzdCBvZiBidWZmZXJzIHRoYXQgbmVlZCB0byBiZSBkZXN0cm95ZWQgYXQgdGhlIGVuZCBvZiBvZmZsb2FkCisgICAgQnVmZmVyTGlzdCBtX2Rlc3Ryb3lfYnVmZmVyczsKKworICAgIC8vIFZhcmlhYmxlIGRlc2NyaXB0b3JzCisgICAgVmFyRGVzYyogIG1fdmFyczsKKyAgICBWYXJFeHRyYSogbV92YXJzX2V4dHJhOworICAgIGludCAgICAgICBtX3ZhcnNfdG90YWw7CisKKyAgICAvLyBQb2ludGVyIHRvIGEgdXNlci1zcGVjaWZpZWQgc3RhdHVzIHZhcmlhYmxlCisgICAgX09mZmxvYWRfc3RhdHVzICptX3N0YXR1czsKKworICAgIC8vIEZ1bmN0aW9uIGRlc2NyaXB0b3IKKyAgICBGdW5jdGlvbkRlc2NyaXB0b3IqIG1fZnVuY19kZXNjOworICAgIHVpbnQzMl90ICAgICAgICAgICAgbV9mdW5jX2Rlc2Nfc2l6ZTsKKworICAgIC8vIEJ1ZmZlciBmb3IgdHJhbnNmZXJyaW5nIGNvcHlpbi9jb3B5b3V0IGRhdGEKKyAgICBDT0lCVUZGRVIgbV9pbm91dF9idWY7CisKKyAgICAvLyBEZXBlbmRlbmNpZXMKKyAgICBDT0lFVkVOVCAqbV9pbl9kZXBzOworICAgIHVpbnQzMl90ICBtX2luX2RlcHNfdG90YWw7CisgICAgQ09JRVZFTlQgKm1fb3V0X2RlcHM7CisgICAgdWludDMyX3QgIG1fb3V0X2RlcHNfdG90YWw7CisKKyAgICAvLyBUaW1lciBkYXRhCisgICAgT2ZmbG9hZEhvc3RUaW1lckRhdGEgKm1fdGltZXJfZGF0YTsKKworICAgIC8vIGNvcHlpbi9jb3B5b3V0IGRhdGEgbGVuZ3RoCisgICAgdWludDY0X3QgbV9pbl9kYXRhbGVuOworICAgIHVpbnQ2NF90IG1fb3V0X2RhdGFsZW47CisKKyAgICAvLyBhIGJvb2xlYW4gdmFsdWUgY2FsY3VsYXRlZCBpbiBzZXR1cF9kZXNjcmlwdG9ycy4gSWYgdHJ1ZSB3ZSBuZWVkIHRvIGRvCisgICAgLy8gYSBydW4gZnVuY3Rpb24gb24gdGhlIHRhcmdldC4gT3RoZXJ3aXNlIGl0IG1heSBiZSBvcHRpbWl6ZWQgYXdheS4KKyAgICBib29sIG1fbmVlZF9ydW5mdW5jdGlvbjsKK307CisKKy8vIEluaXRpYWxpemF0aW9uIHR5cGVzIGZvciBNSUMKK2VudW0gT2ZmbG9hZEluaXRUeXBlIHsKKyAgICBjX2luaXRfb25fc3RhcnQsICAgICAgICAgLy8gYWxsIGRldmljZXMgYmVmb3JlIGVudGVyaW5nIG1haW4KKyAgICBjX2luaXRfb25fb2ZmbG9hZCwgICAgICAgLy8gc2luZ2xlIGRldmljZSBiZWZvcmUgc3RhcnRpbmcgdGhlIGZpcnN0IG9mZmxvYWQKKyAgICBjX2luaXRfb25fb2ZmbG9hZF9hbGwgICAgLy8gYWxsIGRldmljZXMgYmVmb3JlIHN0YXJ0aW5nIHRoZSBmaXJzdCBvZmZsb2FkCit9OworCisvLyBJbml0aWFsaXplcyBsaWJyYXJ5IGFuZCByZWdpc3RlcnMgc3BlY2lmaWVkIG9mZmxvYWQgaW1hZ2UuCitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX3JlZ2lzdGVyX2ltYWdlKGNvbnN0IHZvaWQqIGltYWdlKTsKK2V4dGVybiAiQyIgdm9pZCBfX29mZmxvYWRfdW5yZWdpc3Rlcl9pbWFnZShjb25zdCB2b2lkKiBpbWFnZSk7CisKKy8vIEluaXRpYWxpemVzIG9mZmxvYWQgcnVudGltZSBsaWJyYXJ5LgorZXh0ZXJuIGludCBfX29mZmxvYWRfaW5pdF9saWJyYXJ5KHZvaWQpOworCisvLyB0aHJlYWQgZGF0YSBmb3IgYXNzb2NpYXRpbmcgcGlwZWxpbmVzIHdpdGggdGhyZWFkcworZXh0ZXJuIHB0aHJlYWRfa2V5X3QgbWljX3RocmVhZF9rZXk7CisKKy8vIEVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgZGV2aWNlcworZXh0ZXJuIE1pY0VudlZhciBtaWNfZW52X3ZhcnM7CisKKy8vIENQVSBmcmVxdWVuY3kKK2V4dGVybiB1aW50NjRfdCBjcHVfZnJlcXVlbmN5OworCisvLyBMRF9MSUJSQVJZX1BBVEggZm9yIE1JQyBsaWJyYXJpZXMKK2V4dGVybiBjaGFyKiBtaWNfbGlicmFyeV9wYXRoOworCisvLyBzdGFjayBzaXplIGZvciB0YXJnZXQKK2V4dGVybiB1aW50MzJfdCBtaWNfc3RhY2tfc2l6ZTsKKworLy8gUHJlYWxsb2NhdGVkIG1lbW9yeSBzaXplIGZvciBidWZmZXJzIG9uIE1JQworZXh0ZXJuIHVpbnQ2NF90IG1pY19idWZmZXJfc2l6ZTsKKworLy8gU2V0dGluZyBjb250cm9sbGluZyBpbm91dCBwcm94eQorZXh0ZXJuIGJvb2wgIG1pY19wcm94eV9pbzsKK2V4dGVybiBjaGFyKiBtaWNfcHJveHlfZnNfcm9vdDsKKworLy8gVGhyZXNob2xkIGZvciBjcmVhdGluZyBidWZmZXJzIHdpdGggbGFyZ2UgcGFnZXMKK2V4dGVybiB1aW50NjRfdCBfX29mZmxvYWRfdXNlXzJtYl9idWZmZXJzOworCisvLyBvZmZsb2FkIGluaXRpYWxpemF0aW9uIHR5cGUKK2V4dGVybiBPZmZsb2FkSW5pdFR5cGUgX19vZmZsb2FkX2luaXRfdHlwZTsKKworLy8gRGV2aWNlIG51bWJlciB0byBvZmZsb2FkIHRvIHdoZW4gZGV2aWNlIGlzIG5vdCBleHBsaWNpdGx5IHNwZWNpZmllZC4KK2V4dGVybiBpbnQgX19vbXBfZGV2aWNlX251bTsKKworLy8gdGFyZ2V0IGV4ZWN1dGFibGUKK2V4dGVybiBUYXJnZXRJbWFnZSogX190YXJnZXRfZXhlOworCisvLyBJREIgc3VwcG9ydAorCisvLyBDYWxsZWQgYnkgdGhlIG9mZmxvYWQgcnVudGltZSBhZnRlciBpbml0aWFsaXphdGlvbiBvZiBvZmZsb2FkIGluZnJhc3RydWN0dXJlCisvLyBoYXMgYmVlbiBjb21wbGV0ZWQuCitleHRlcm4gIkMiIHZvaWQgIF9fZGJnX3RhcmdldF9zb19sb2FkZWQoKTsKKworLy8gQ2FsbGVkIGJ5IHRoZSBvZmZsb2FkIHJ1bnRpbWUgd2hlbiB0aGUgb2ZmbG9hZCBpbmZyYXN0cnVjdHVyZSBpcyBhYm91dCB0byBiZQorLy8gc2h1dCBkb3duLCBjdXJyZW50bHkgYXQgYXBwbGljYXRpb24gZXhpdC4KK2V4dGVybiAiQyIgdm9pZCAgX19kYmdfdGFyZ2V0X3NvX3VubG9hZGVkKCk7CisKKy8vIE51bGwtdGVybWluYXRlZCBzdHJpbmcgY29udGFpbmluZyBwYXRoIHRvIHRoZSBwcm9jZXNzIGltYWdlIG9mIHRoZSBob3N0aW5nCisvLyBhcHBsaWNhdGlvbiAob2ZmbG9hZF9tYWluKQorI2RlZmluZSBNQVhfVEFSR0VUX05BTUUgNTEyCitleHRlcm4gIkMiIGNoYXIgIF9fZGJnX3RhcmdldF9leGVfbmFtZVtNQVhfVEFSR0VUX05BTUVdOworCisvLyBJbnRlZ2VyIHNwZWNpZnlpbmcgdGhlIHByb2Nlc3MgaWQKK2V4dGVybiAiQyIgcGlkX3QgX19kYmdfdGFyZ2V0X3NvX3BpZDsKKworLy8gSW50ZWdlciBzcGVjaWZ5aW5nIHRoZSAwLWJhc2VkIGRldmljZSBudW1iZXIKK2V4dGVybiAiQyIgaW50ICAgX19kYmdfdGFyZ2V0X2lkOworCisvLyBTZXQgdG8gbm9uLXplcm8gYnkgdGhlIGhvc3Qtc2lkZSBkZWJ1Z2dlciB0byBlbmFibGUgb2ZmbG9hZCBkZWJ1Z2dpbmcKKy8vIHN1cHBvcnQKK2V4dGVybiAiQyIgaW50ICAgX19kYmdfaXNfYXR0YWNoZWQ7CisKKy8vIE1ham9yIHZlcnNpb24gb2YgdGhlIGRlYnVnZ2VyIHN1cHBvcnQgQVBJCitleHRlcm4gIkMiIGNvbnN0IGludCBfX2RiZ19hcGlfbWFqb3JfdmVyc2lvbjsKKworLy8gTWlub3IgdmVyc2lvbiBvZiB0aGUgZGVidWdnZXIgc3VwcG9ydCBBUEkKK2V4dGVybiAiQyIgY29uc3QgaW50IF9fZGJnX2FwaV9taW5vcl92ZXJzaW9uOworCisjZW5kaWYgLy8gT0ZGTE9BRF9IT1NUX0hfSU5DTFVERUQKZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfbXlvX2hvc3QuY3BwIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9teW9faG9zdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUxYzE4NgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfbXlvX2hvc3QuY3BwCkBAIC0wLDAgKzEsODA1IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJvZmZsb2FkX215b19ob3N0LmgiCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlICJvZmZsb2FkX2hvc3QuaCIKKworI2lmIGRlZmluZWQoTElOVVgpIHx8IGRlZmluZWQoRlJFRUJTRCkKKyNpbmNsdWRlIDxtbV9tYWxsb2MuaD4KKyNlbmRpZgorCisjZGVmaW5lIE1ZT19WRVJTSU9OMSAgICAiTVlPXzEuMCIKKworZXh0ZXJuICJDIiB2b2lkIF9fY2lsa3J0c19jaWxrX2Zvcl8zMih2b2lkKiwgdm9pZCosIHVpbnQzMl90LCBpbnQzMl90KTsKK2V4dGVybiAiQyIgdm9pZCBfX2NpbGtydHNfY2lsa19mb3JfNjQodm9pZCosIHZvaWQqLCB1aW50NjRfdCwgaW50MzJfdCk7CisKKyNpZm5kZWYgVEFSR0VUX1dJTk5UCisjcHJhZ21hIHdlYWsgX19jaWxrcnRzX2NpbGtfZm9yXzMyCisjcHJhZ21hIHdlYWsgX19jaWxrcnRzX2NpbGtfZm9yXzY0CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyNkZWZpbmUgTVlPX1RBQkxFX0VORF9NQVJLRVIoKSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigtMSkKKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorI2RlZmluZSBNWU9fVEFCTEVfRU5EX01BUktFUigpIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KDApCisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKK2NsYXNzIE15b1dyYXBwZXIgeworcHVibGljOgorICAgIE15b1dyYXBwZXIoKSA6IG1fbGliX2hhbmRsZSgwKSwgbV9pc19hdmFpbGFibGUoZmFsc2UpCisgICAge30KKworICAgIGJvb2wgaXNfYXZhaWxhYmxlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9pc19hdmFpbGFibGU7CisgICAgfQorCisgICAgYm9vbCBMb2FkTGlicmFyeSh2b2lkKTsKKworICAgIC8vIHVubG9hZHMgdGhlIGxpYnJhcnkKKyAgICB2b2lkIFVubG9hZExpYnJhcnkodm9pZCkgeworLy8gICAgICAgIGlmIChtX2xpYl9oYW5kbGUgIT0gMCkgeworLy8gICAgICAgICAgICBETF9jbG9zZShtX2xpYl9oYW5kbGUpOworLy8gICAgICAgICAgICBtX2xpYl9oYW5kbGUgPSAwOworLy8gICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBXcmFwcGVycyBmb3IgTVlPIGNsaWVudCBmdW5jdGlvbnMKKyAgICB2b2lkIExpYkluaXQodm9pZCAqYXJnLCB2b2lkICpmdW5jKSBjb25zdCB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSg0LCAwLCBjX29mZmxvYWRfbXlvaW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyglcCwgJXApXG4iLCBfX2Z1bmNfXywgYXJnLCBmdW5jKTsKKyAgICAgICAgQ2hlY2tSZXN1bHQoX19mdW5jX18sIG1fbGliX2luaXQoYXJnLCBmdW5jKSk7CisgICAgfQorCisgICAgdm9pZCBMaWJGaW5pKHZvaWQpIGNvbnN0IHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDQsIDAsIGNfb2ZmbG9hZF9teW9maW5pLCAiJXMoKVxuIiwgX19mdW5jX18pOworICAgICAgICBtX2xpYl9maW5pKCk7CisgICAgfQorCisgICAgdm9pZCogU2hhcmVkTWFsbG9jKHNpemVfdCBzaXplKSBjb25zdCB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSg0LCAwLCBjX29mZmxvYWRfbXlvc2hhcmVkbWFsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCVsbGQpXG4iLCBfX2Z1bmNfXywgc2l6ZSk7CisgICAgICAgIHJldHVybiBtX3NoYXJlZF9tYWxsb2Moc2l6ZSk7CisgICAgfQorCisgICAgdm9pZCBTaGFyZWRGcmVlKHZvaWQgKnB0cikgY29uc3QgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoNCwgMCwgY19vZmZsb2FkX215b3NoYXJlZGZyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoJXApXG4iLCBfX2Z1bmNfXywgcHRyKTsKKyAgICAgICAgbV9zaGFyZWRfZnJlZShwdHIpOworICAgIH0KKworICAgIHZvaWQqIFNoYXJlZEFsaWduZWRNYWxsb2Moc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbikgY29uc3QgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoNCwgMCwgY19vZmZsb2FkX215b3NoYXJlZGFsaWduZWRtYWxsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoJWxsZCwgJWxsZClcbiIsIF9fZnVuY19fLCBzaXplLCBhbGlnbik7CisgICAgICAgIHJldHVybiBtX3NoYXJlZF9hbGlnbmVkX21hbGxvYyhzaXplLCBhbGlnbik7CisgICAgfQorCisgICAgdm9pZCBTaGFyZWRBbGlnbmVkRnJlZSh2b2lkICpwdHIpIGNvbnN0IHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDQsIDAsIGNfb2ZmbG9hZF9teW9zaGFyZWRhbGlnbmVkZnJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyglcClcbiIsIF9fZnVuY19fLCBwdHIpOworICAgICAgICBtX3NoYXJlZF9hbGlnbmVkX2ZyZWUocHRyKTsKKyAgICB9CisKKyAgICB2b2lkIEFjcXVpcmUodm9pZCkgY29uc3QgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoNCwgMCwgY19vZmZsb2FkX215b2FjcXVpcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoKVxuIiwgX19mdW5jX18pOworICAgICAgICBDaGVja1Jlc3VsdChfX2Z1bmNfXywgbV9hY3F1aXJlKCkpOworICAgIH0KKworICAgIHZvaWQgUmVsZWFzZSh2b2lkKSBjb25zdCB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSg0LCAwLCBjX29mZmxvYWRfbXlvcmVsZWFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoKVxuIiwgX19mdW5jX18pOworICAgICAgICBDaGVja1Jlc3VsdChfX2Z1bmNfXywgbV9yZWxlYXNlKCkpOworICAgIH0KKworICAgIHZvaWQgSG9zdFZhclRhYmxlUHJvcGFnYXRlKHZvaWQgKnRhYmxlLCBpbnQgbnVtX2VudHJpZXMpIGNvbnN0IHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSg0LCAiJXMoJXAsICVkKVxuIiwgX19mdW5jX18sIHRhYmxlLCBudW1fZW50cmllcyk7CisgICAgICAgIENoZWNrUmVzdWx0KF9fZnVuY19fLCBtX2hvc3RfdmFyX3RhYmxlX3Byb3BhZ2F0ZSh0YWJsZSwgbnVtX2VudHJpZXMpKTsKKyAgICB9CisKKyAgICB2b2lkIEhvc3RGcHRyVGFibGVSZWdpc3Rlcih2b2lkICp0YWJsZSwgaW50IG51bV9lbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvcmRlcmVkKSBjb25zdCB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSg0LCAwLCBjX29mZmxvYWRfbXlvcmVnaXN0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCVwLCAlZCwgJWQpXG4iLCBfX2Z1bmNfXywgdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2VudHJpZXMsIG9yZGVyZWQpOworICAgICAgICBDaGVja1Jlc3VsdChfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgICAgbV9ob3N0X2ZwdHJfdGFibGVfcmVnaXN0ZXIodGFibGUsIG51bV9lbnRyaWVzLCBvcmRlcmVkKSk7CisgICAgfQorCisgICAgdm9pZCBSZW1vdGVUaHVua0NhbGwodm9pZCAqdGh1bmssIHZvaWQgKmFyZ3MsIGludCBkZXZpY2UpIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSg0LCAiJXMoJXAsICVwLCAlZClcbiIsIF9fZnVuY19fLCB0aHVuaywgYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UpOworICAgICAgICBDaGVja1Jlc3VsdChfX2Z1bmNfXywgbV9yZW1vdGVfdGh1bmtfY2FsbCh0aHVuaywgYXJncywgZGV2aWNlKSk7CisgICAgfQorCisgICAgTXlvaVJGdW5jQ2FsbEhhbmRsZSBSZW1vdGVDYWxsKGNoYXIgKmZ1bmMsIHZvaWQgKmFyZ3MsIGludCBkZXZpY2UpIGNvbnN0IHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSg0LCAiJXMoJXMsICVwLCAlZClcbiIsIF9fZnVuY19fLCBmdW5jLCBhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSk7CisgICAgICAgIHJldHVybiBtX3JlbW90ZV9jYWxsKGZ1bmMsIGFyZ3MsIGRldmljZSk7CisgICAgfQorCisgICAgdm9pZCBHZXRSZXN1bHQoTXlvaVJGdW5jQ2FsbEhhbmRsZSBoYW5kbGUpIGNvbnN0IHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSg0LCAiJXMoJXApXG4iLCBfX2Z1bmNfXywgaGFuZGxlKTsKKyAgICAgICAgQ2hlY2tSZXN1bHQoX19mdW5jX18sIG1fZ2V0X3Jlc3VsdChoYW5kbGUpKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgdm9pZCBDaGVja1Jlc3VsdChjb25zdCBjaGFyICpmdW5jLCBNeW9FcnJvciBlcnJvcikgY29uc3QgeworICAgICAgICBpZiAoZXJyb3IgIT0gTVlPX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfbXlvd3JhcHBlcl9jaGVja3Jlc3VsdCwgZnVuYywgZXJyb3IpOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorICAgIH0KKworcHJpdmF0ZToKKyAgICB2b2lkKiBtX2xpYl9oYW5kbGU7CisgICAgYm9vbCAgbV9pc19hdmFpbGFibGU7CisKKyAgICAvLyBwb2ludGVycyB0byBmdW5jdGlvbnMgZnJvbSBteW8gbGlicmFyeQorICAgIE15b0Vycm9yICgqbV9saWJfaW5pdCkodm9pZCosIHZvaWQqKTsKKyAgICB2b2lkICAgICAoKm1fbGliX2ZpbmkpKHZvaWQpOworICAgIHZvaWQqICAgICgqbV9zaGFyZWRfbWFsbG9jKShzaXplX3QpOworICAgIHZvaWQgICAgICgqbV9zaGFyZWRfZnJlZSkodm9pZCopOworICAgIHZvaWQqICAgICgqbV9zaGFyZWRfYWxpZ25lZF9tYWxsb2MpKHNpemVfdCwgc2l6ZV90KTsKKyAgICB2b2lkICAgICAoKm1fc2hhcmVkX2FsaWduZWRfZnJlZSkodm9pZCopOworICAgIE15b0Vycm9yICgqbV9hY3F1aXJlKSh2b2lkKTsKKyAgICBNeW9FcnJvciAoKm1fcmVsZWFzZSkodm9pZCk7CisgICAgTXlvRXJyb3IgKCptX2hvc3RfdmFyX3RhYmxlX3Byb3BhZ2F0ZSkodm9pZCosIGludCk7CisgICAgTXlvRXJyb3IgKCptX2hvc3RfZnB0cl90YWJsZV9yZWdpc3Rlcikodm9pZCosIGludCwgaW50KTsKKyAgICBNeW9FcnJvciAoKm1fcmVtb3RlX3RodW5rX2NhbGwpKHZvaWQqLCB2b2lkKiwgaW50KTsKKyAgICBNeW9pUkZ1bmNDYWxsSGFuZGxlICgqbV9yZW1vdGVfY2FsbCkoY2hhciosIHZvaWQqLCBpbnQpOworICAgIE15b0Vycm9yICgqbV9nZXRfcmVzdWx0KShNeW9pUkZ1bmNDYWxsSGFuZGxlKTsKK307CisKK2Jvb2wgTXlvV3JhcHBlcjo6TG9hZExpYnJhcnkodm9pZCkKK3sKKyNpZm5kZWYgVEFSR0VUX1dJTk5UCisgICAgY29uc3QgY2hhciAqbGliX25hbWUgPSAibGlibXlvLWNsaWVudC5zbyI7CisjZWxzZSAvLyBUQVJHRVRfV0lOTlQKKyAgICBjb25zdCBjaGFyICpsaWJfbmFtZSA9ICJteW8tY2xpZW50LmRsbCI7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJMb2FkaW5nIE1ZTyBsaWJyYXJ5ICVzIC4uLlxuIiwgbGliX25hbWUpOworCisgICAgbV9saWJfaGFuZGxlID0gRExfb3BlbihsaWJfbmFtZSk7CisgICAgaWYgKG1fbGliX2hhbmRsZSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBsb2FkIHRoZSBsaWJyYXJ5LiBlcnJubyA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1fbGliX2luaXQgPSAoTXlvRXJyb3IgKCopKHZvaWQqLCB2b2lkKikpCisgICAgICAgIERMX3N5bShtX2xpYl9oYW5kbGUsICJteW9pTGliSW5pdCIsIE1ZT19WRVJTSU9OMSk7CisgICAgaWYgKG1fbGliX2luaXQgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBNWU8gbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXlvaUxpYkluaXQiKTsKKyAgICAgICAgVW5sb2FkTGlicmFyeSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbV9saWJfZmluaSA9ICh2b2lkICgqKSh2b2lkKSkKKyAgICAgICAgRExfc3ltKG1fbGliX2hhbmRsZSwgIm15b2lMaWJGaW5pIiwgTVlPX1ZFUlNJT04xKTsKKyAgICBpZiAobV9saWJfZmluaSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIE1ZTyBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJteW9pTGliRmluaSIpOworICAgICAgICBVbmxvYWRMaWJyYXJ5KCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtX3NoYXJlZF9tYWxsb2MgPSAodm9pZCogKCopKHNpemVfdCkpCisgICAgICAgIERMX3N5bShtX2xpYl9oYW5kbGUsICJteW9TaGFyZWRNYWxsb2MiLCBNWU9fVkVSU0lPTjEpOworICAgIGlmIChtX3NoYXJlZF9tYWxsb2MgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBNWU8gbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXlvU2hhcmVkTWFsbG9jIik7CisgICAgICAgIFVubG9hZExpYnJhcnkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1fc2hhcmVkX2ZyZWUgPSAodm9pZCAoKikodm9pZCopKQorICAgICAgICBETF9zeW0obV9saWJfaGFuZGxlLCAibXlvU2hhcmVkRnJlZSIsIE1ZT19WRVJTSU9OMSk7CisgICAgaWYgKG1fc2hhcmVkX2ZyZWUgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBNWU8gbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXlvU2hhcmVkRnJlZSIpOworICAgICAgICBVbmxvYWRMaWJyYXJ5KCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtX3NoYXJlZF9hbGlnbmVkX21hbGxvYyA9ICh2b2lkKiAoKikoc2l6ZV90LCBzaXplX3QpKQorICAgICAgICBETF9zeW0obV9saWJfaGFuZGxlLCAibXlvU2hhcmVkQWxpZ25lZE1hbGxvYyIsIE1ZT19WRVJTSU9OMSk7CisgICAgaWYgKG1fc2hhcmVkX2FsaWduZWRfbWFsbG9jID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gTVlPIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm15b1NoYXJlZEFsaWduZWRNYWxsb2MiKTsKKyAgICAgICAgVW5sb2FkTGlicmFyeSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbV9zaGFyZWRfYWxpZ25lZF9mcmVlID0gKHZvaWQgKCopKHZvaWQqKSkKKyAgICAgICAgRExfc3ltKG1fbGliX2hhbmRsZSwgIm15b1NoYXJlZEFsaWduZWRGcmVlIiwgTVlPX1ZFUlNJT04xKTsKKyAgICBpZiAobV9zaGFyZWRfYWxpZ25lZF9mcmVlID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gTVlPIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm15b1NoYXJlZEFsaWduZWRGcmVlIik7CisgICAgICAgIFVubG9hZExpYnJhcnkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1fYWNxdWlyZSA9IChNeW9FcnJvciAoKikodm9pZCkpCisgICAgICAgIERMX3N5bShtX2xpYl9oYW5kbGUsICJteW9BY3F1aXJlIiwgTVlPX1ZFUlNJT04xKTsKKyAgICBpZiAobV9hY3F1aXJlID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gTVlPIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm15b0FjcXVpcmUiKTsKKyAgICAgICAgVW5sb2FkTGlicmFyeSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbV9yZWxlYXNlID0gKE15b0Vycm9yICgqKSh2b2lkKSkKKyAgICAgICAgRExfc3ltKG1fbGliX2hhbmRsZSwgIm15b1JlbGVhc2UiLCBNWU9fVkVSU0lPTjEpOworICAgIGlmIChtX3JlbGVhc2UgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBNWU8gbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXlvUmVsZWFzZSIpOworICAgICAgICBVbmxvYWRMaWJyYXJ5KCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtX2hvc3RfdmFyX3RhYmxlX3Byb3BhZ2F0ZSA9IChNeW9FcnJvciAoKikodm9pZCosIGludCkpCisgICAgICAgIERMX3N5bShtX2xpYl9oYW5kbGUsICJteW9pSG9zdFZhclRhYmxlUHJvcGFnYXRlIiwgTVlPX1ZFUlNJT04xKTsKKyAgICBpZiAobV9ob3N0X3Zhcl90YWJsZV9wcm9wYWdhdGUgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBNWU8gbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXlvaUhvc3RWYXJUYWJsZVByb3BhZ2F0ZSIpOworICAgICAgICBVbmxvYWRMaWJyYXJ5KCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtX2hvc3RfZnB0cl90YWJsZV9yZWdpc3RlciA9IChNeW9FcnJvciAoKikodm9pZCosIGludCwgaW50KSkKKyAgICAgICAgRExfc3ltKG1fbGliX2hhbmRsZSwgIm15b2lIb3N0RnB0clRhYmxlUmVnaXN0ZXIiLCBNWU9fVkVSU0lPTjEpOworICAgIGlmIChtX2hvc3RfZnB0cl90YWJsZV9yZWdpc3RlciA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIE1ZTyBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJteW9pSG9zdEZwdHJUYWJsZVJlZ2lzdGVyIik7CisgICAgICAgIFVubG9hZExpYnJhcnkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1fcmVtb3RlX3RodW5rX2NhbGwgPSAoTXlvRXJyb3IgKCopKHZvaWQqLCB2b2lkKiwgaW50KSkKKyAgICAgICAgRExfc3ltKG1fbGliX2hhbmRsZSwgIm15b2lSZW1vdGVUaHVua0NhbGwiLCBNWU9fVkVSU0lPTjEpOworICAgIGlmIChtX3JlbW90ZV90aHVua19jYWxsID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gTVlPIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm15b2lSZW1vdGVUaHVua0NhbGwiKTsKKyAgICAgICAgVW5sb2FkTGlicmFyeSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbV9yZW1vdGVfY2FsbCA9IChNeW9pUkZ1bmNDYWxsSGFuZGxlICgqKShjaGFyKiwgdm9pZCosIGludCkpCisgICAgICAgIERMX3N5bShtX2xpYl9oYW5kbGUsICJteW9pUmVtb3RlQ2FsbCIsIE1ZT19WRVJTSU9OMSk7CisgICAgaWYgKG1fcmVtb3RlX2NhbGwgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBNWU8gbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXlvaVJlbW90ZUNhbGwiKTsKKyAgICAgICAgVW5sb2FkTGlicmFyeSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbV9nZXRfcmVzdWx0ID0gKE15b0Vycm9yICgqKShNeW9pUkZ1bmNDYWxsSGFuZGxlKSkKKyAgICAgICAgRExfc3ltKG1fbGliX2hhbmRsZSwgIm15b2lHZXRSZXN1bHQiLCBNWU9fVkVSU0lPTjEpOworICAgIGlmIChtX2dldF9yZXN1bHQgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBNWU8gbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXlvaUdldFJlc3VsdCIpOworICAgICAgICBVbmxvYWRMaWJyYXJ5KCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJUaGUgbGlicmFyeSB3YXMgc3VjY2Vzc2Z1bGx5IGxvYWRlZFxuIik7CisKKyAgICBtX2lzX2F2YWlsYWJsZSA9IHRydWU7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgbXlvX2lzX2F2YWlsYWJsZTsKK3N0YXRpYyBNeW9XcmFwcGVyIG15b193cmFwcGVyOworCitzdHJ1Y3QgTXlvVGFibGUKK3sKKyAgICBNeW9UYWJsZShTaGFyZWRUYWJsZUVudHJ5ICp0YWIsIGludCBsZW4pIDogdmFyX3RhYih0YWIpLCB2YXJfdGFiX2xlbihsZW4pCisgICAge30KKworICAgIFNoYXJlZFRhYmxlRW50cnkqICAgdmFyX3RhYjsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHZhcl90YWJfbGVuOworfTsKKwordHlwZWRlZiBzdGQ6Omxpc3Q8TXlvVGFibGU+IE15b1RhYmxlTGlzdDsKK3N0YXRpYyBNeW9UYWJsZUxpc3QgX19teW9fdGFibGVfbGlzdDsKK3N0YXRpYyBtdXRleF90ICAgICAgX19teW9fdGFibGVfbG9jazsKK3N0YXRpYyBib29sICAgICAgICAgX19teW9fdGFibGVzID0gZmFsc2U7CisKK3N0YXRpYyB2b2lkIF9fb2ZmbG9hZF9teW9fc2hhcmVkX3RhYmxlX3JlZ2lzdGVyKFNoYXJlZFRhYmxlRW50cnkgKmVudHJ5KTsKK3N0YXRpYyB2b2lkIF9fb2ZmbG9hZF9teW9fc2hhcmVkX2luaXRfdGFibGVfcmVnaXN0ZXIoSW5pdFRhYmxlRW50cnkqIGVudHJ5KTsKK3N0YXRpYyB2b2lkIF9fb2ZmbG9hZF9teW9fZnB0cl90YWJsZV9yZWdpc3RlcihGcHRyVGFibGVFbnRyeSAqZW50cnkpOworCitzdGF0aWMgdm9pZCBfX29mZmxvYWRfbXlvTG9hZExpYnJhcnlfb25jZSh2b2lkKQoreworICAgIGlmIChfX29mZmxvYWRfaW5pdF9saWJyYXJ5KCkpIHsKKyAgICAgICAgbXlvX3dyYXBwZXIuTG9hZExpYnJhcnkoKTsKKyAgICB9Cit9CisKK3N0YXRpYyBib29sIF9fb2ZmbG9hZF9teW9Mb2FkTGlicmFyeSh2b2lkKQoreworICAgIHN0YXRpYyBPZmZsb2FkT25jZUNvbnRyb2wgY3RybCA9IE9GRkxPQURfT05DRV9DT05UUk9MX0lOSVQ7CisgICAgX19vZmZsb2FkX3J1bl9vbmNlKCZjdHJsLCBfX29mZmxvYWRfbXlvTG9hZExpYnJhcnlfb25jZSk7CisKKyAgICByZXR1cm4gbXlvX3dyYXBwZXIuaXNfYXZhaWxhYmxlKCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fb2ZmbG9hZF9teW9Jbml0X29uY2Uodm9pZCkKK3sKKyAgICBpZiAoIV9fb2ZmbG9hZF9teW9Mb2FkTGlicmFyeSgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBpbml0aWFsaXplIGFsbCBkZXZpY2VzCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtaWNfZW5naW5lc190b3RhbDsgaSsrKSB7CisgICAgICAgIG1pY19lbmdpbmVzW2ldLmluaXQoKTsKKyAgICB9CisKKyAgICAvLyBsb2FkIGFuZCBpbml0aWFsaXplIE1ZTyBsaWJyYXJ5CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiSW5pdGlhbGl6aW5nIE1ZTyBsaWJyYXJ5IC4uLlxuIik7CisKKyAgICBDT0lFVkVOVCBldmVudHNbTUlDX0VOR0lORVNfTUFYXTsKKyAgICBNeW9pVXNlclBhcmFtcyBwYXJhbXNbTUlDX0VOR0lORVNfTUFYKzFdOworCisgICAgLy8gbG9hZCB0YXJnZXQgbGlicmFyeSB0byBhbGwgZGV2aWNlcworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWljX2VuZ2luZXNfdG90YWw7IGkrKykgeworICAgICAgICBtaWNfZW5naW5lc1tpXS5pbml0X215bygmZXZlbnRzW2ldKTsKKworICAgICAgICBwYXJhbXNbaV0udHlwZSA9IE1ZT0lfVVNFUlBBUkFNU19ERVZJRDsKKyAgICAgICAgcGFyYW1zW2ldLm5vZGVpZCA9IG1pY19lbmdpbmVzW2ldLmdldF9waHlzaWNhbF9pbmRleCgpICsgMTsKKyAgICB9CisKKyAgICBwYXJhbXNbbWljX2VuZ2luZXNfdG90YWxdLnR5cGUgPSBNWU9JX1VTRVJQQVJBTVNfTEFTVF9NU0c7CisKKyAgICAvLyBpbml0aWFsaXplIG15byBydW50aW1lIG9uIGhvc3QKKyAgICBteW9fd3JhcHBlci5MaWJJbml0KHBhcmFtcywgMCk7CisKKyAgICAvLyB3YWl0IGZvciB0aGUgdGFyZ2V0IGluaXQgY2FsbHMgdG8gZmluaXNoCisgICAgQ09JUkVTVUxUIHJlczsKKyAgICByZXMgPSBDT0k6OkV2ZW50V2FpdChtaWNfZW5naW5lc190b3RhbCwgZXZlbnRzLCAtMSwgMSwgMCwgMCk7CisgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfZXZlbnRfd2FpdCwgcmVzKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICBteW9faXNfYXZhaWxhYmxlID0gdHJ1ZTsKKworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkluaXRpYWxpemluZyBNWU8gbGlicmFyeSAuLi4gZG9uZVxuIik7Cit9CisKK3N0YXRpYyBib29sIF9fb2ZmbG9hZF9teW9Jbml0KHZvaWQpCit7CisgICAgc3RhdGljIE9mZmxvYWRPbmNlQ29udHJvbCBjdHJsID0gT0ZGTE9BRF9PTkNFX0NPTlRST0xfSU5JVDsKKyAgICBfX29mZmxvYWRfcnVuX29uY2UoJmN0cmwsIF9fb2ZmbG9hZF9teW9Jbml0X29uY2UpOworCisgICAgLy8gcmVnaXN0ZXIgcGVuZGluZyBzaGFyZWQgdmFyIHRhYmxlcworICAgIGlmIChteW9faXNfYXZhaWxhYmxlICYmIF9fbXlvX3RhYmxlcykgeworICAgICAgICBtdXRleF9sb2NrZXJfdCBsb2NrZXIoX19teW9fdGFibGVfbG9jayk7CisKKyAgICAgICAgaWYgKF9fbXlvX3RhYmxlcykgeworICAgICAgICAgICAgLy8gIFJlZ2lzdGVyIHRhYmxlcyB3aXRoIE1ZTyBzbyBpdCBjYW4gcHJvcGFnYXRlIHRvIHRhcmdldC4KKyAgICAgICAgICAgIGZvcihNeW9UYWJsZUxpc3Q6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gX19teW9fdGFibGVfbGlzdC5iZWdpbigpOworICAgICAgICAgICAgICAgIGl0ICE9IF9fbXlvX3RhYmxlX2xpc3QuZW5kKCk7ICsraXQpIHsKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyAgICAgICAgICAgICAgICBmb3IgKFNoYXJlZFRhYmxlRW50cnkgKmVudHJ5ID0gaXQtPnZhcl90YWI7CisgICAgICAgICAgICAgICAgICAgICBlbnRyeS0+dmFyTmFtZSAhPSBNWU9fVEFCTEVfRU5EX01BUktFUigpOyBlbnRyeSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeS0+dmFyTmFtZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBteW9fd3JhcHBlci5Ib3N0VmFyVGFibGVQcm9wYWdhdGUoZW50cnksIDEpOworICAgICAgICAgICAgICAgIH0KKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorICAgICAgICAgICAgICAgIG15b193cmFwcGVyLkhvc3RWYXJUYWJsZVByb3BhZ2F0ZShpdC0+dmFyX3RhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQtPnZhcl90YWJfbGVuKTsKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX19teW9fdGFibGVfbGlzdC5jbGVhcigpOworICAgICAgICAgICAgX19teW9fdGFibGVzID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbXlvX2lzX2F2YWlsYWJsZTsKK30KKworc3RhdGljIGJvb2wgc2hhcmVkX3RhYmxlX2VudHJpZXMoCisgICAgU2hhcmVkVGFibGVFbnRyeSAqZW50cnkKKykKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlcyglcClcbiIsIF9fZnVuY19fLCBlbnRyeSk7CisKKyAgICBmb3IgKDsgZW50cnktPnZhck5hbWUgIT0gTVlPX1RBQkxFX0VORF9NQVJLRVIoKTsgZW50cnkrKykgeworI2lmZGVmIFRBUkdFVF9XSU5OVAorICAgICAgICBpZiAoZW50cnktPnZhck5hbWUgPT0gMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIGZwdHJfdGFibGVfZW50cmllcygKKyAgICBGcHRyVGFibGVFbnRyeSAqZW50cnkKKykKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlcyglcClcbiIsIF9fZnVuY19fLCBlbnRyeSk7CisKKyAgICBmb3IgKDsgZW50cnktPmZ1bmNOYW1lICE9IE1ZT19UQUJMRV9FTkRfTUFSS0VSKCk7IGVudHJ5KyspIHsKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyAgICAgICAgaWYgKGVudHJ5LT5mdW5jTmFtZSA9PSAwKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworZXh0ZXJuICJDIiB2b2lkIF9fb2ZmbG9hZF9teW9SZWdpc3RlclRhYmxlcygKKyAgICBJbml0VGFibGVFbnRyeSogaW5pdF90YWJsZSwKKyAgICBTaGFyZWRUYWJsZUVudHJ5ICpzaGFyZWRfdGFibGUsCisgICAgRnB0clRhYmxlRW50cnkgKmZwdHJfdGFibGUKKykKK3sKKyAgICAvLyBjaGVjayB3aGV0aGVyIHdlIG5lZWQgdG8gaW5pdGlhbGl6ZSBNWU8gbGlicmFyeS4gSXQgaXMKKyAgICAvLyBpbml0aWFsaXplZCBvbmx5IGlmIGF0IGxlYXN0IG9uZSBteW8gdGFibGUgaXMgbm90IGVtcHR5CisgICAgaWYgKHNoYXJlZF90YWJsZV9lbnRyaWVzKHNoYXJlZF90YWJsZSkgfHwgZnB0cl90YWJsZV9lbnRyaWVzKGZwdHJfdGFibGUpKSB7CisgICAgICAgIC8vIG1ha2Ugc3VyZSBteW8gbGlicmFyeSBpcyBsb2FkZWQKKyAgICAgICAgX19vZmZsb2FkX215b0xvYWRMaWJyYXJ5KCk7CisKKyAgICAgICAgLy8gcmVnaXN0ZXIgdGFibGVzCisgICAgICAgIF9fb2ZmbG9hZF9teW9fc2hhcmVkX3RhYmxlX3JlZ2lzdGVyKHNoYXJlZF90YWJsZSk7CisgICAgICAgIF9fb2ZmbG9hZF9teW9fZnB0cl90YWJsZV9yZWdpc3RlcihmcHRyX3RhYmxlKTsKKyAgICAgICAgX19vZmZsb2FkX215b19zaGFyZWRfaW5pdF90YWJsZV9yZWdpc3Rlcihpbml0X3RhYmxlKTsKKyAgICB9Cit9CisKK3ZvaWQgX19vZmZsb2FkX215b0Zpbmkodm9pZCkKK3sKKyAgICBpZiAobXlvX2lzX2F2YWlsYWJsZSkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlc1xuIiwgX19mdW5jX18pOworCisgICAgICAgIENPSUVWRU5UIGV2ZW50c1tNSUNfRU5HSU5FU19NQVhdOworCisgICAgICAgIC8vIGtpY2sgb2ZmIG15b2lMaWJGaW5pIGNhbGxzIG9uIGFsbCBkZXZpY2VzCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWljX2VuZ2luZXNfdG90YWw7IGkrKykgeworICAgICAgICAgICAgbWljX2VuZ2luZXNbaV0uZmluaV9teW8oJmV2ZW50c1tpXSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBjbGVhbnVwIG15byBydW50aW1lIG9uIGhvc3QKKyAgICAgICAgbXlvX3dyYXBwZXIuTGliRmluaSgpOworCisgICAgICAgIC8vIHdhaXQgZm9yIHRoZSB0YXJnZXQgZmluaSBjYWxscyB0byBmaW5pc2gKKyAgICAgICAgQ09JUkVTVUxUIHJlczsKKyAgICAgICAgcmVzID0gQ09JOjpFdmVudFdhaXQobWljX2VuZ2luZXNfdG90YWwsIGV2ZW50cywgLTEsIDEsIDAsIDApOworICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfZXZlbnRfd2FpdCwgcmVzKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIF9fb2ZmbG9hZF9teW9fc2hhcmVkX3RhYmxlX3JlZ2lzdGVyKAorICAgIFNoYXJlZFRhYmxlRW50cnkgKmVudHJ5CispCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoJXApXG4iLCBfX2Z1bmNfXywgZW50cnkpOworCisgICAgU2hhcmVkVGFibGVFbnRyeSAqc3RhcnQgPSBlbnRyeTsKKyAgICBpbnQgZW50cmllcyA9IDA7CisKKyAgICAvLyBhbGxvY2F0ZSBzaGFyZWQgbWVtb3J5IGZvciB2YXJzCisgICAgZm9yICg7IGVudHJ5LT52YXJOYW1lICE9IE1ZT19UQUJMRV9FTkRfTUFSS0VSKCk7IGVudHJ5KyspIHsKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyAgICAgICAgaWYgKGVudHJ5LT52YXJOYW1lID09IDApIHsKKyAgICAgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoNCwgInNraXAgcmVnaXN0ZXJpbmcgYSBOVUxMIE15b1NoYXJlZFRhYmxlIGVudHJ5XG4iKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSg0LCAicmVnaXN0ZXJpbmcgTXlvU2hhcmVkVGFibGUgZW50cnkgZm9yICVzIEAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS0+dmFyTmFtZSwgZW50cnkpOworCisgICAgICAgIC8vIEludm9rZSB0aGUgZnVuY3Rpb24gdG8gY3JlYXRlIHNoYXJlZCBtZW1vcnkKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkKCopKHZvaWQpPihlbnRyeS0+c2hhcmVkQWRkcikoKTsKKyAgICAgICAgZW50cmllcysrOworICAgIH0KKworICAgIC8vIGFuZCB0YWJsZSB0byB0aGUgbGlzdCBpZiBpdCBpcyBub3QgZW1wdHkKKyAgICBpZiAoZW50cmllcyA+IDApIHsKKyAgICAgICAgbXV0ZXhfbG9ja2VyX3QgbG9ja2VyKF9fbXlvX3RhYmxlX2xvY2spOworICAgICAgICBfX215b190YWJsZV9saXN0LnB1c2hfYmFjayhNeW9UYWJsZShzdGFydCwgZW50cmllcykpOworICAgICAgICBfX215b190YWJsZXMgPSB0cnVlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgX19vZmZsb2FkX215b19zaGFyZWRfaW5pdF90YWJsZV9yZWdpc3RlcihJbml0VGFibGVFbnRyeSogZW50cnkpCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoJXApXG4iLCBfX2Z1bmNfXywgZW50cnkpOworCisjaWZkZWYgVEFSR0VUX1dJTk5UCisgICAgZm9yICg7IGVudHJ5LT5mdW5jTmFtZSAhPSBNWU9fVEFCTEVfRU5EX01BUktFUigpOyBlbnRyeSsrKSB7CisgICAgICAgIGlmIChlbnRyeS0+ZnVuY05hbWUgPT0gMCkgeworICAgICAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSg0LCAic2tpcCByZWdpc3RlcmluZyBhIE5VTEwgTXlvU2hhcmVkSW5pdCBlbnRyeVxuIik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vICBJbnZva2UgdGhlIGZ1bmN0aW9uIHRvIGluaXQgdGhlIHNoYXJlZCBtZW1vcnkKKyAgICAgICAgZW50cnktPmZ1bmMoKTsKKyAgICB9CisjZWxzZSAvLyBUQVJHRVRfV0lOTlQKKyAgICBmb3IgKDsgZW50cnktPmZ1bmMgIT0gMDsgZW50cnkrKykgeworICAgICAgICAvLyBJbnZva2UgdGhlIGZ1bmN0aW9uIHRvIGluaXQgdGhlIHNoYXJlZCBtZW1vcnkKKyAgICAgICAgZW50cnktPmZ1bmMoKTsKKyAgICB9CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCit9CisKK3N0YXRpYyB2b2lkIF9fb2ZmbG9hZF9teW9fZnB0cl90YWJsZV9yZWdpc3RlcigKKyAgICBGcHRyVGFibGVFbnRyeSAqZW50cnkKKykKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlcyglcClcbiIsIF9fZnVuY19fLCBlbnRyeSk7CisKKyAgICBGcHRyVGFibGVFbnRyeSAqc3RhcnQgPSBlbnRyeTsKKyAgICBpbnQgZW50cmllcyA9IDA7CisKKyAgICBmb3IgKDsgZW50cnktPmZ1bmNOYW1lICE9IE1ZT19UQUJMRV9FTkRfTUFSS0VSKCk7IGVudHJ5KyspIHsKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyAgICAgICAgaWYgKGVudHJ5LT5mdW5jTmFtZSA9PSAwKSB7CisgICAgICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDQsICJza2lwIHJlZ2lzdGVyaW5nIGEgTlVMTCBNeW9GcHRyVGFibGUgZW50cnlcbiIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKworICAgICAgICBpZiAoIW15b193cmFwcGVyLmlzX2F2YWlsYWJsZSgpKSB7CisgICAgICAgICAgICAqKHN0YXRpY19jYXN0PHZvaWQqKj4oZW50cnktPmxvY2FsVGh1bmtBZGRyKSkgPSBlbnRyeS0+ZnVuY0FkZHI7CisgICAgICAgIH0KKworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDQsICJyZWdpc3RlcmluZyBNeW9GcHRyVGFibGUgZW50cnkgZm9yICVzIEAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS0+ZnVuY05hbWUsIGVudHJ5KTsKKworI2lmZGVmIFRBUkdFVF9XSU5OVAorICAgICAgICBpZiAobXlvX3dyYXBwZXIuaXNfYXZhaWxhYmxlKCkpIHsKKyAgICAgICAgICAgIG15b193cmFwcGVyLkhvc3RGcHRyVGFibGVSZWdpc3RlcihlbnRyeSwgMSwgZmFsc2UpOworICAgICAgICB9CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKyAgICAgICAgZW50cmllcysrOworICAgIH0KKworI2lmbmRlZiBUQVJHRVRfV0lOTlQKKyAgICBpZiAobXlvX3dyYXBwZXIuaXNfYXZhaWxhYmxlKCkgJiYgZW50cmllcyA+IDApIHsKKyAgICAgICAgbXlvX3dyYXBwZXIuSG9zdEZwdHJUYWJsZVJlZ2lzdGVyKHN0YXJ0LCBlbnRyaWVzLCBmYWxzZSk7CisgICAgfQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorfQorCitleHRlcm4gIkMiIGludCBfX29mZmxvYWRfbXlvSXNBdmFpbGFibGUoaW50IHRhcmdldF9udW1iZXIpCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoJWQpXG4iLCBfX2Z1bmNfXywgdGFyZ2V0X251bWJlcik7CisKKyAgICBpZiAodGFyZ2V0X251bWJlciA+PSAtMikgeworICAgICAgICBib29sIGlzX2RlZmF1bHRfbnVtYmVyID0gKHRhcmdldF9udW1iZXIgPT0gLTIpOworCisgICAgICAgIGlmIChfX29mZmxvYWRfbXlvSW5pdCgpKSB7CisgICAgICAgICAgICBpZiAodGFyZ2V0X251bWJlciA+PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gVXNlciBwcm92aWRlZCB0aGUgZGV2aWNlIG51bWJlcgorICAgICAgICAgICAgICAgIGludCBudW0gPSB0YXJnZXRfbnVtYmVyICUgbWljX2VuZ2luZXNfdG90YWw7CisKKyAgICAgICAgICAgICAgICAvLyByZXNlcnZlIGRldmljZSBpbiBPUlNMCisgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciA9IE9SU0w6OnJlc2VydmUobnVtKSA/IG51bSA6IC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gdHJ5IHRvIHVzZSBkZXZpY2UgMAorICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIgPSBPUlNMOjpyZXNlcnZlKDApID8gMCA6IC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBtYWtlIHN1cmUgZGV2aWNlIGlzIGluaXRpYWxpemVkCisgICAgICAgICAgICBpZiAodGFyZ2V0X251bWJlciA+PSAwKSB7CisgICAgICAgICAgICAgICAgbWljX2VuZ2luZXNbdGFyZ2V0X251bWJlcl0uaW5pdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy8gZmFsbGJhY2sgdG8gQ1BVCisgICAgICAgICAgICB0YXJnZXRfbnVtYmVyID0gLTE7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGFyZ2V0X251bWJlciA8IDAgJiYgIWlzX2RlZmF1bHRfbnVtYmVyKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfZGV2aWNlX2lzX25vdF9hdmFpbGFibGUpOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2ludmFsaWRfZGV2aWNlX251bWJlcik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgcmV0dXJuIHRhcmdldF9udW1iZXI7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBfX29mZmxvYWRfbXlvaVJlbW90ZUlUaHVua0NhbGwoCisgICAgdm9pZCAqdGh1bmssCisgICAgdm9pZCAqYXJnLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoJXAsICVwLCAlZClcbiIsIF9fZnVuY19fLCB0aHVuaywgYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlcik7CisKKyAgICBteW9fd3JhcHBlci5SZWxlYXNlKCk7CisgICAgbXlvX3dyYXBwZXIuUmVtb3RlVGh1bmtDYWxsKHRodW5rLCBhcmcsIHRhcmdldF9udW1iZXIpOworICAgIG15b193cmFwcGVyLkFjcXVpcmUoKTsKKworICAgIE9SU0w6OnJlbGVhc2UodGFyZ2V0X251bWJlcik7Cit9CisKK2V4dGVybiAiQyIgdm9pZCogX09mZmxvYWRfc2hhcmVkX21hbGxvYyhzaXplX3Qgc2l6ZSkKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlcyglbGxkKVxuIiwgX19mdW5jX18sIHNpemUpOworCisgICAgaWYgKF9fb2ZmbG9hZF9teW9Mb2FkTGlicmFyeSgpKSB7CisgICAgICAgIHJldHVybiBteW9fd3JhcHBlci5TaGFyZWRNYWxsb2Moc2l6ZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gbWFsbG9jKHNpemUpOworICAgIH0KK30KKworZXh0ZXJuICJDIiB2b2lkIF9PZmZsb2FkX3NoYXJlZF9mcmVlKHZvaWQgKnB0cikKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlcyglcClcbiIsIF9fZnVuY19fLCBwdHIpOworCisgICAgaWYgKF9fb2ZmbG9hZF9teW9Mb2FkTGlicmFyeSgpKSB7CisgICAgICAgIG15b193cmFwcGVyLlNoYXJlZEZyZWUocHRyKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGZyZWUocHRyKTsKKyAgICB9Cit9CisKK2V4dGVybiAiQyIgdm9pZCogX09mZmxvYWRfc2hhcmVkX2FsaWduZWRfbWFsbG9jKHNpemVfdCBzaXplLCBzaXplX3QgYWxpZ24pCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoJWxsZCwgJWxsZClcbiIsIF9fZnVuY19fLCBzaXplLCBhbGlnbik7CisKKyAgICBpZiAoX19vZmZsb2FkX215b0xvYWRMaWJyYXJ5KCkpIHsKKyAgICAgICAgcmV0dXJuIG15b193cmFwcGVyLlNoYXJlZEFsaWduZWRNYWxsb2Moc2l6ZSwgYWxpZ24pOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKGFsaWduIDwgc2l6ZW9mKHZvaWQqKSkgeworICAgICAgICAgICAgYWxpZ24gPSBzaXplb2Yodm9pZCopOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfbW1fbWFsbG9jKHNpemUsIGFsaWduKTsKKyAgICB9Cit9CisKK2V4dGVybiAiQyIgdm9pZCBfT2ZmbG9hZF9zaGFyZWRfYWxpZ25lZF9mcmVlKHZvaWQgKnB0cikKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlcyglcClcbiIsIF9fZnVuY19fLCBwdHIpOworCisgICAgaWYgKF9fb2ZmbG9hZF9teW9Mb2FkTGlicmFyeSgpKSB7CisgICAgICAgIG15b193cmFwcGVyLlNoYXJlZEFsaWduZWRGcmVlKHB0cik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBfbW1fZnJlZShwdHIpOworICAgIH0KK30KKworZXh0ZXJuICJDIiB2b2lkIF9faW50ZWxfY2lsa19mb3JfMzJfb2ZmbG9hZCgKKyAgICBpbnQgc2l6ZSwKKyAgICB2b2lkICgqY29weV9jb25zdHJ1Y3Rvcikodm9pZCosIHZvaWQqKSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICB2b2lkICpyYWRkciwKKyAgICB2b2lkICpjbG9zdXJlX29iamVjdCwKKyAgICB1bnNpZ25lZCBpbnQgaXRlcnMsCisgICAgdW5zaWduZWQgaW50IGdyYWluX3NpemUpCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXNcbiIsIF9fZnVuY19fKTsKKworICAgIHRhcmdldF9udW1iZXIgPSBfX29mZmxvYWRfbXlvSXNBdmFpbGFibGUodGFyZ2V0X251bWJlcik7CisgICAgaWYgKHRhcmdldF9udW1iZXIgPj0gMCkgeworICAgICAgICBzdHJ1Y3QgUyB7CisgICAgICAgICAgICB2b2lkICpNMTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBNMjsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBNMzsKKyAgICAgICAgICAgIGNoYXIgY2xvc3VyZVtdOworICAgICAgICB9ICphcmdzOworCisgICAgICAgIGFyZ3MgPSAoc3RydWN0IFMqKSBfT2ZmbG9hZF9zaGFyZWRfbWFsbG9jKHNpemVvZihzdHJ1Y3QgUykgKyBzaXplKTsKKyAgICAgICAgYXJncy0+TTEgPSByYWRkcjsKKyAgICAgICAgYXJncy0+TTIgPSBpdGVyczsKKyAgICAgICAgYXJncy0+TTMgPSBncmFpbl9zaXplOworCisgICAgICAgIGlmIChjb3B5X2NvbnN0cnVjdG9yID09IDApIHsKKyAgICAgICAgICAgIG1lbWNweShhcmdzLT5jbG9zdXJlLCBjbG9zdXJlX29iamVjdCwgc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjb3B5X2NvbnN0cnVjdG9yKGFyZ3MtPmNsb3N1cmUsIGNsb3N1cmVfb2JqZWN0KTsKKyAgICAgICAgfQorCisgICAgICAgIG15b193cmFwcGVyLlJlbGVhc2UoKTsKKyAgICAgICAgbXlvX3dyYXBwZXIuR2V0UmVzdWx0KAorICAgICAgICAgICAgbXlvX3dyYXBwZXIuUmVtb3RlQ2FsbCgiX19pbnRlbF9jaWxrX2Zvcl8zMl9vZmZsb2FkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncywgdGFyZ2V0X251bWJlcikKKyAgICAgICAgKTsKKyAgICAgICAgbXlvX3dyYXBwZXIuQWNxdWlyZSgpOworCisgICAgICAgIF9PZmZsb2FkX3NoYXJlZF9mcmVlKGFyZ3MpOworCisgICAgICAgIE9SU0w6OnJlbGVhc2UodGFyZ2V0X251bWJlcik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBfX2NpbGtydHNfY2lsa19mb3JfMzIocmFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zdXJlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhaW5fc2l6ZSk7CisgICAgfQorfQorCitleHRlcm4gIkMiIHZvaWQgX19pbnRlbF9jaWxrX2Zvcl82NF9vZmZsb2FkKAorICAgIGludCBzaXplLAorICAgIHZvaWQgKCpjb3B5X2NvbnN0cnVjdG9yKSh2b2lkKiwgdm9pZCopLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIHZvaWQgKnJhZGRyLAorICAgIHZvaWQgKmNsb3N1cmVfb2JqZWN0LAorICAgIHVpbnQ2NF90IGl0ZXJzLAorICAgIHVpbnQ2NF90IGdyYWluX3NpemUpCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXNcbiIsIF9fZnVuY19fKTsKKworICAgIHRhcmdldF9udW1iZXIgPSBfX29mZmxvYWRfbXlvSXNBdmFpbGFibGUodGFyZ2V0X251bWJlcik7CisgICAgaWYgKHRhcmdldF9udW1iZXIgPj0gMCkgeworICAgICAgICBzdHJ1Y3QgUyB7CisgICAgICAgICAgICB2b2lkICpNMTsKKyAgICAgICAgICAgIHVpbnQ2NF90IE0yOworICAgICAgICAgICAgdWludDY0X3QgTTM7CisgICAgICAgICAgICBjaGFyIGNsb3N1cmVbXTsKKyAgICAgICAgfSAqYXJnczsKKworICAgICAgICBhcmdzID0gKHN0cnVjdCBTKikgX09mZmxvYWRfc2hhcmVkX21hbGxvYyhzaXplb2Yoc3RydWN0IFMpICsgc2l6ZSk7CisgICAgICAgIGFyZ3MtPk0xID0gcmFkZHI7CisgICAgICAgIGFyZ3MtPk0yID0gaXRlcnM7CisgICAgICAgIGFyZ3MtPk0zID0gZ3JhaW5fc2l6ZTsKKworICAgICAgICBpZiAoY29weV9jb25zdHJ1Y3RvciA9PSAwKSB7CisgICAgICAgICAgICBtZW1jcHkoYXJncy0+Y2xvc3VyZSwgY2xvc3VyZV9vYmplY3QsIHNpemUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY29weV9jb25zdHJ1Y3RvcihhcmdzLT5jbG9zdXJlLCBjbG9zdXJlX29iamVjdCk7CisgICAgICAgIH0KKworICAgICAgICBteW9fd3JhcHBlci5SZWxlYXNlKCk7CisgICAgICAgIG15b193cmFwcGVyLkdldFJlc3VsdCgKKyAgICAgICAgICAgIG15b193cmFwcGVyLlJlbW90ZUNhbGwoIl9faW50ZWxfY2lsa19mb3JfNjRfb2ZmbG9hZCIsIGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIpCisgICAgICAgICk7CisgICAgICAgIG15b193cmFwcGVyLkFjcXVpcmUoKTsKKworICAgICAgICBfT2ZmbG9hZF9zaGFyZWRfZnJlZShhcmdzKTsKKworICAgICAgICBPUlNMOjpyZWxlYXNlKHRhcmdldF9udW1iZXIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19jaWxrcnRzX2NpbGtfZm9yXzY0KHJhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc3VyZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYWluX3NpemUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfbXlvX2hvc3QuaCBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfbXlvX2hvc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmE2MWY0Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9teW9faG9zdC5oCkBAIC0wLDAgKzEsODAgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBPRkZMT0FEX01ZT19IT1NUX0hfSU5DTFVERUQKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fSE9TVF9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxteW90eXBlcy5oPgorI2luY2x1ZGUgPG15b2ltcGwuaD4KKyNpbmNsdWRlIDxteW8uaD4KKyNpbmNsdWRlICJvZmZsb2FkLmgiCisKK3R5cGVkZWYgTXlvaVNoYXJlZFZhckVudHJ5ICAgICAgU2hhcmVkVGFibGVFbnRyeTsKKy8vdHlwZWRlZiBNeW9pSG9zdFNoYXJlZEZwdHJFbnRyeSBGcHRyVGFibGVFbnRyeTsKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAvLyEgRnVuY3Rpb24gTmFtZQorICAgIGNvbnN0IGNoYXIgKmZ1bmNOYW1lOworICAgIC8vISBGdW5jdGlvbiBBZGRyZXNzCisgICAgdm9pZCAqZnVuY0FkZHI7CisgICAgLy8hIExvY2FsIFRodW5rIEFkZHJlc3MKKyAgICB2b2lkICpsb2NhbFRodW5rQWRkcjsKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyAgICAvLyBEdW1teSB0byBwYWQgdXAgdG8gMzIgYnl0ZXMKKyAgICB2b2lkICpkdW1teTsKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKK30gRnB0clRhYmxlRW50cnk7CisKK3N0cnVjdCBJbml0VGFibGVFbnRyeSB7CisjaWZkZWYgVEFSR0VUX1dJTk5UCisgICAgLy8gRHVtbXkgdG8gcGFkIHVwIHRvIDE2IGJ5dGVzCisgICAgLy8gRnVuY3Rpb24gTmFtZQorICAgIGNvbnN0IGNoYXIgKmZ1bmNOYW1lOworI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorICAgIHZvaWQgKCpmdW5jKSh2b2lkKTsKK307CisKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fU0hBUkVEX1RBQkxFX1NFQ1RJT05fU1RBUlQgICAgICAgICAgIi5NeW9TaGFyZWRUYWJsZSRhIgorI2RlZmluZSBPRkZMT0FEX01ZT19TSEFSRURfVEFCTEVfU0VDVElPTl9FTkQgICAgICAgICAgICAiLk15b1NoYXJlZFRhYmxlJHoiCisKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fU0hBUkVEX0lOSVRfVEFCTEVfU0VDVElPTl9TVEFSVCAgICAgIi5NeW9TaGFyZWRJbml0VGFibGUkYSIKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fU0hBUkVEX0lOSVRfVEFCTEVfU0VDVElPTl9FTkQgICAgICAgIi5NeW9TaGFyZWRJbml0VGFibGUkeiIKKworI2RlZmluZSBPRkZMT0FEX01ZT19GUFRSX1RBQkxFX1NFQ1RJT05fU1RBUlQgICAgICAgICAgICAiLk15b0ZwdHJUYWJsZSRhIgorI2RlZmluZSBPRkZMT0FEX01ZT19GUFRSX1RBQkxFX1NFQ1RJT05fRU5EICAgICAgICAgICAgICAiLk15b0ZwdHJUYWJsZSR6IgorI2Vsc2UgIC8vIFRBUkdFVF9XSU5OVAorI2RlZmluZSBPRkZMT0FEX01ZT19TSEFSRURfVEFCTEVfU0VDVElPTl9TVEFSVCAgICAgICAgICAiLk15b1NoYXJlZFRhYmxlLiIKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fU0hBUkVEX1RBQkxFX1NFQ1RJT05fRU5EICAgICAgICAgICAgIi5NeW9TaGFyZWRUYWJsZS4iCisKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fU0hBUkVEX0lOSVRfVEFCTEVfU0VDVElPTl9TVEFSVCAgICAgIi5NeW9TaGFyZWRJbml0VGFibGUuIgorI2RlZmluZSBPRkZMT0FEX01ZT19TSEFSRURfSU5JVF9UQUJMRV9TRUNUSU9OX0VORCAgICAgICAiLk15b1NoYXJlZEluaXRUYWJsZS4iCisKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fRlBUUl9UQUJMRV9TRUNUSU9OX1NUQVJUICAgICAgICAgICAgIi5NeW9GcHRyVGFibGUuIgorI2RlZmluZSBPRkZMT0FEX01ZT19GUFRSX1RBQkxFX1NFQ1RJT05fRU5EICAgICAgICAgICAgICAiLk15b0ZwdHJUYWJsZS4iCisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKyNwcmFnbWEgc2VjdGlvbihPRkZMT0FEX01ZT19TSEFSRURfVEFCTEVfU0VDVElPTl9TVEFSVCwgcmVhZCwgd3JpdGUpCisjcHJhZ21hIHNlY3Rpb24oT0ZGTE9BRF9NWU9fU0hBUkVEX1RBQkxFX1NFQ1RJT05fRU5ELCByZWFkLCB3cml0ZSkKKworI3ByYWdtYSBzZWN0aW9uKE9GRkxPQURfTVlPX1NIQVJFRF9JTklUX1RBQkxFX1NFQ1RJT05fU1RBUlQsIHJlYWQsIHdyaXRlKQorI3ByYWdtYSBzZWN0aW9uKE9GRkxPQURfTVlPX1NIQVJFRF9JTklUX1RBQkxFX1NFQ1RJT05fRU5ELCByZWFkLCB3cml0ZSkKKworI3ByYWdtYSBzZWN0aW9uKE9GRkxPQURfTVlPX0ZQVFJfVEFCTEVfU0VDVElPTl9TVEFSVCwgcmVhZCwgd3JpdGUpCisjcHJhZ21hIHNlY3Rpb24oT0ZGTE9BRF9NWU9fRlBUUl9UQUJMRV9TRUNUSU9OX0VORCwgcmVhZCwgd3JpdGUpCisKK2V4dGVybiAiQyIgdm9pZCBfX29mZmxvYWRfbXlvUmVnaXN0ZXJUYWJsZXMoCisgICAgSW5pdFRhYmxlRW50cnkgKmluaXRfdGFibGUsCisgICAgU2hhcmVkVGFibGVFbnRyeSAqc2hhcmVkX3RhYmxlLAorICAgIEZwdHJUYWJsZUVudHJ5ICpmcHRyX3RhYmxlCispOworCitleHRlcm4gdm9pZCBfX29mZmxvYWRfbXlvRmluaSh2b2lkKTsKKworI2VuZGlmIC8vIE9GRkxPQURfTVlPX0hPU1RfSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9teW9fdGFyZ2V0LmNwcCBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfbXlvX3RhcmdldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWViMWM0ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfbXlvX3RhcmdldC5jcHAKQEAgLTAsMCArMSwxODQgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgIm9mZmxvYWRfbXlvX3RhcmdldC5oIgorI2luY2x1ZGUgIm9mZmxvYWRfdGFyZ2V0LmgiCisKK2V4dGVybiAiQyIgdm9pZCBfX2NpbGtydHNfY2lsa19mb3JfMzIodm9pZCosIHZvaWQqLCB1aW50MzJfdCwgaW50MzJfdCk7CitleHRlcm4gIkMiIHZvaWQgX19jaWxrcnRzX2NpbGtfZm9yXzY0KHZvaWQqLCB2b2lkKiwgdWludDY0X3QsIGludDMyX3QpOworCisjcHJhZ21hIHdlYWsgX19jaWxrcnRzX2NpbGtfZm9yXzMyCisjcHJhZ21hIHdlYWsgX19jaWxrcnRzX2NpbGtfZm9yXzY0CisKK3N0YXRpYyB2b2lkIENoZWNrUmVzdWx0KGNvbnN0IGNoYXIgKmZ1bmMsIE15b0Vycm9yIGVycm9yKSB7CisgICAgaWYgKGVycm9yICE9IE1ZT19TVUNDRVNTKSB7CisgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX215b3RhcmdldF9jaGVja3Jlc3VsdCwgZnVuYywgZXJyb3IpOworICAgICAgICBleGl0KDEpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgX19vZmZsb2FkX215b19zaGFyZWRfdGFibGVfcmVnaXN0ZXIoU2hhcmVkVGFibGVFbnRyeSAqZW50cnkpCit7CisgICAgaW50IGVudHJpZXMgPSAwOworICAgIFNoYXJlZFRhYmxlRW50cnkgKnRfc3RhcnQ7CisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlcyglcClcbiIsIF9fZnVuY19fLCBlbnRyeSk7CisKKyAgICB0X3N0YXJ0ID0gZW50cnk7CisgICAgd2hpbGUgKHRfc3RhcnQtPnZhck5hbWUgIT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoNCwgMCwgY19vZmZsb2FkX21pY19teW9fc2hhcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm15byBzaGFyZWQgZW50cnkgbmFtZSA9IFwiJXNcIiBhZGRyID0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0YXJ0LT52YXJOYW1lLCB0X3N0YXJ0LT5zaGFyZWRBZGRyKTsKKyAgICAgICAgdF9zdGFydCsrOworICAgICAgICBlbnRyaWVzKys7CisgICAgfQorCisgICAgaWYgKGVudHJpZXMgPiAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIm15b2lNaWNWYXJUYWJsZVJlZ2lzdGVyKCVwLCAlZClcbiIsIGVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJpZXMpOworICAgICAgICBDaGVja1Jlc3VsdCgibXlvaU1pY1ZhclRhYmxlUmVnaXN0ZXIiLAorICAgICAgICAgICAgICAgICAgICBteW9pTWljVmFyVGFibGVSZWdpc3RlcihlbnRyeSwgZW50cmllcykpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgX19vZmZsb2FkX215b19mcHRyX3RhYmxlX3JlZ2lzdGVyKAorICAgIEZwdHJUYWJsZUVudHJ5ICplbnRyeQorKQoreworICAgIGludCBlbnRyaWVzID0gMDsKKyAgICBGcHRyVGFibGVFbnRyeSAqdF9zdGFydDsKKworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzKCVwKVxuIiwgX19mdW5jX18sIGVudHJ5KTsKKworICAgIHRfc3RhcnQgPSBlbnRyeTsKKyAgICB3aGlsZSAodF9zdGFydC0+ZnVuY05hbWUgIT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoNCwgMCwgY19vZmZsb2FkX21pY19teW9fZnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJteW8gZnB0ciBlbnRyeSBuYW1lID0gXCIlc1wiIGFkZHIgPSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RhcnQtPmZ1bmNOYW1lLCB0X3N0YXJ0LT5mdW5jQWRkcik7CisgICAgICAgIHRfc3RhcnQrKzsKKyAgICAgICAgZW50cmllcysrOworICAgIH0KKworICAgIGlmIChlbnRyaWVzID4gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICJteW9pVGFyZ2V0RnB0clRhYmxlUmVnaXN0ZXIoJXAsICVkLCAwKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSwgZW50cmllcyk7CisgICAgICAgIENoZWNrUmVzdWx0KCJteW9pVGFyZ2V0RnB0clRhYmxlUmVnaXN0ZXIiLAorICAgICAgICAgICAgICAgICAgICBteW9pVGFyZ2V0RnB0clRhYmxlUmVnaXN0ZXIoZW50cnksIGVudHJpZXMsIDApKTsKKyAgICB9Cit9CisKK2V4dGVybiAiQyIgdm9pZCBfX29mZmxvYWRfbXlvQWNxdWlyZSh2b2lkKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzXG4iLCBfX2Z1bmNfXyk7CisgICAgQ2hlY2tSZXN1bHQoIm15b0FjcXVpcmUiLCBteW9BY3F1aXJlKCkpOworfQorCitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX215b1JlbGVhc2Uodm9pZCkKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlc1xuIiwgX19mdW5jX18pOworICAgIENoZWNrUmVzdWx0KCJteW9SZWxlYXNlIiwgbXlvUmVsZWFzZSgpKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIF9faW50ZWxfY2lsa19mb3JfMzJfb2ZmbG9hZF93cmFwcGVyKHZvaWQgKmFyZ3NfKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzXG4iLCBfX2Z1bmNfXyk7CisKKyAgICBzdHJ1Y3QgUyB7CisgICAgICAgIHZvaWQgKk0xOworICAgICAgICB1bnNpZ25lZCBpbnQgTTI7CisgICAgICAgIHVuc2lnbmVkIGludCBNMzsKKyAgICAgICAgY2hhciBjbG9zdXJlW107CisgICAgfSAqYXJncyA9IChzdHJ1Y3QgUyopIGFyZ3NfOworCisgICAgX19jaWxrcnRzX2NpbGtfZm9yXzMyKGFyZ3MtPk0xLCBhcmdzLT5jbG9zdXJlLCBhcmdzLT5NMiwgYXJncy0+TTMpOworfQorCitleHRlcm4gIkMiIHZvaWQgX19pbnRlbF9jaWxrX2Zvcl82NF9vZmZsb2FkX3dyYXBwZXIodm9pZCAqYXJnc18pCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXNcbiIsIF9fZnVuY19fKTsKKworICAgIHN0cnVjdCBTIHsKKyAgICAgICAgdm9pZCAqTTE7CisgICAgICAgIHVpbnQ2NF90IE0yOworICAgICAgICB1aW50NjRfdCBNMzsKKyAgICAgICAgY2hhciBjbG9zdXJlW107CisgICAgfSAqYXJncyA9IChzdHJ1Y3QgUyopIGFyZ3NfOworCisgICAgX19jaWxrcnRzX2NpbGtfZm9yXzY0KGFyZ3MtPk0xLCBhcmdzLT5jbG9zdXJlLCBhcmdzLT5NMiwgYXJncy0+TTMpOworfQorCitzdGF0aWMgdm9pZCBfX29mZmxvYWRfbXlvX29uY2VfaW5pdCh2b2lkKQoreworICAgIENoZWNrUmVzdWx0KCJteW9pUmVtb3RlRnVuY1JlZ2lzdGVyIiwKKyAgICAgICAgICAgICAgICBteW9pUmVtb3RlRnVuY1JlZ2lzdGVyKAorICAgICAgICAgICAgICAgICAgICAoTXlvaVJlbW90ZUZ1bmNUeXBlKSBfX2ludGVsX2NpbGtfZm9yXzMyX29mZmxvYWRfd3JhcHBlciwKKyAgICAgICAgICAgICAgICAgICAgIl9faW50ZWxfY2lsa19mb3JfMzJfb2ZmbG9hZCIpKTsKKyAgICBDaGVja1Jlc3VsdCgibXlvaVJlbW90ZUZ1bmNSZWdpc3RlciIsCisgICAgICAgICAgICAgICAgbXlvaVJlbW90ZUZ1bmNSZWdpc3RlcigKKyAgICAgICAgICAgICAgICAgICAgKE15b2lSZW1vdGVGdW5jVHlwZSkgX19pbnRlbF9jaWxrX2Zvcl82NF9vZmZsb2FkX3dyYXBwZXIsCisgICAgICAgICAgICAgICAgICAgICJfX2ludGVsX2NpbGtfZm9yXzY0X29mZmxvYWQiKSk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBfX29mZmxvYWRfbXlvUmVnaXN0ZXJUYWJsZXMoCisgICAgU2hhcmVkVGFibGVFbnRyeSAqc2hhcmVkX3RhYmxlLAorICAgIEZwdHJUYWJsZUVudHJ5ICpmcHRyX3RhYmxlCispCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXNcbiIsIF9fZnVuY19fKTsKKworICAgIC8vIG9uZSB0aW1lIHJlZ2lzdHJhdGlvbiBvZiBJbnRlbChSKSBDaWxrKFRNKSBsYW5ndWFnZSBlbnRyaWVzCisgICAgc3RhdGljIHB0aHJlYWRfb25jZV90IG9uY2VfY29udHJvbCA9IFBUSFJFQURfT05DRV9JTklUOworICAgIHB0aHJlYWRfb25jZSgmb25jZV9jb250cm9sLCBfX29mZmxvYWRfbXlvX29uY2VfaW5pdCk7CisKKyAgICAvLyByZWdpc3RlciBtb2R1bGUncyB0YWJsZXMKKyAgICBpZiAoc2hhcmVkX3RhYmxlLT52YXJOYW1lID09IDAgJiYgZnB0cl90YWJsZS0+ZnVuY05hbWUgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgX19vZmZsb2FkX215b19zaGFyZWRfdGFibGVfcmVnaXN0ZXIoc2hhcmVkX3RhYmxlKTsKKyAgICBfX29mZmxvYWRfbXlvX2ZwdHJfdGFibGVfcmVnaXN0ZXIoZnB0cl90YWJsZSk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCogX09mZmxvYWRfc2hhcmVkX21hbGxvYyhzaXplX3Qgc2l6ZSkKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlcyglbGxkKVxuIiwgX19mdW5jX18sIHNpemUpOworICAgIHJldHVybiBteW9TaGFyZWRNYWxsb2Moc2l6ZSk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBfT2ZmbG9hZF9zaGFyZWRfZnJlZSh2b2lkICpwdHIpCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoJXApXG4iLCBfX2Z1bmNfXywgcHRyKTsKKyAgICBteW9TaGFyZWRGcmVlKHB0cik7Cit9CisKK2V4dGVybiAiQyIgdm9pZCogX09mZmxvYWRfc2hhcmVkX2FsaWduZWRfbWFsbG9jKHNpemVfdCBzaXplLCBzaXplX3QgYWxpZ24pCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoJWxsZCwgJWxsZClcbiIsIF9fZnVuY19fLCBzaXplLCBhbGlnbik7CisgICAgcmV0dXJuIG15b1NoYXJlZEFsaWduZWRNYWxsb2Moc2l6ZSwgYWxpZ24pOworfQorCitleHRlcm4gIkMiIHZvaWQgX09mZmxvYWRfc2hhcmVkX2FsaWduZWRfZnJlZSh2b2lkICpwdHIpCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoJXApXG4iLCBfX2Z1bmNfXywgcHRyKTsKKyAgICBteW9TaGFyZWRBbGlnbmVkRnJlZShwdHIpOworfQorCisvLyB0ZW1wb3Jhcnkgd29ya2Fyb3VuZCBmb3IgYmxvY2tpbmcgYmVoYXZpb3Igb2YgbXlvaUxpYkluaXQvRmluaSBjYWxscworZXh0ZXJuICJDIiB2b2lkIF9fb2ZmbG9hZF9teW9MaWJJbml0KCkKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisgICAgQ2hlY2tSZXN1bHQoIm15b2lMaWJJbml0IiwgbXlvaUxpYkluaXQoMCwgMCkpOworfQorCitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX215b0xpYkZpbmkoKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzKClcbiIsIF9fZnVuY19fKTsKKyAgICBteW9pTGliRmluaSgpOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9teW9fdGFyZ2V0LmggYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX215b190YXJnZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjdmNzg5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9teW9fdGFyZ2V0LmgKQEAgLTAsMCArMSw1NCBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIE9GRkxPQURfTVlPX1RBUkdFVF9IX0lOQ0xVREVECisjZGVmaW5lIE9GRkxPQURfTVlPX1RBUkdFVF9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxteW90eXBlcy5oPgorI2luY2x1ZGUgPG15b2ltcGwuaD4KKyNpbmNsdWRlIDxteW8uaD4KKyNpbmNsdWRlICJvZmZsb2FkLmgiCisKK3R5cGVkZWYgTXlvaVNoYXJlZFZhckVudHJ5ICAgICAgICAgIFNoYXJlZFRhYmxlRW50cnk7Cit0eXBlZGVmIE15b2lUYXJnZXRTaGFyZWRGcHRyRW50cnkgICBGcHRyVGFibGVFbnRyeTsKKworI2lmZGVmIFRBUkdFVF9XSU5OVAorI2RlZmluZSBPRkZMT0FEX01ZT19TSEFSRURfVEFCTEVfU0VDVElPTl9TVEFSVCAgICAgICAgICAiLk15b1NoYXJlZFRhYmxlJGEiCisjZGVmaW5lIE9GRkxPQURfTVlPX1NIQVJFRF9UQUJMRV9TRUNUSU9OX0VORCAgICAgICAgICAgICIuTXlvU2hhcmVkVGFibGUkeiIKKworI2RlZmluZSBPRkZMT0FEX01ZT19GUFRSX1RBQkxFX1NFQ1RJT05fU1RBUlQgICAgICAgICAgICAiLk15b0ZwdHJUYWJsZSRhIgorI2RlZmluZSBPRkZMT0FEX01ZT19GUFRSX1RBQkxFX1NFQ1RJT05fRU5EICAgICAgICAgICAgICAiLk15b0ZwdHJUYWJsZSR6IgorI2Vsc2UgIC8vIFRBUkdFVF9XSU5OVAorI2RlZmluZSBPRkZMT0FEX01ZT19TSEFSRURfVEFCTEVfU0VDVElPTl9TVEFSVCAgICAgICAgICAiLk15b1NoYXJlZFRhYmxlLiIKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fU0hBUkVEX1RBQkxFX1NFQ1RJT05fRU5EICAgICAgICAgICAgIi5NeW9TaGFyZWRUYWJsZS4iCisKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fRlBUUl9UQUJMRV9TRUNUSU9OX1NUQVJUICAgICAgICAgICAgIi5NeW9GcHRyVGFibGUuIgorI2RlZmluZSBPRkZMT0FEX01ZT19GUFRSX1RBQkxFX1NFQ1RJT05fRU5EICAgICAgICAgICAgICAiLk15b0ZwdHJUYWJsZS4iCisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKyNwcmFnbWEgc2VjdGlvbihPRkZMT0FEX01ZT19TSEFSRURfVEFCTEVfU0VDVElPTl9TVEFSVCwgcmVhZCwgd3JpdGUpCisjcHJhZ21hIHNlY3Rpb24oT0ZGTE9BRF9NWU9fU0hBUkVEX1RBQkxFX1NFQ1RJT05fRU5ELCByZWFkLCB3cml0ZSkKKworI3ByYWdtYSBzZWN0aW9uKE9GRkxPQURfTVlPX0ZQVFJfVEFCTEVfU0VDVElPTl9TVEFSVCwgcmVhZCwgd3JpdGUpCisjcHJhZ21hIHNlY3Rpb24oT0ZGTE9BRF9NWU9fRlBUUl9UQUJMRV9TRUNUSU9OX0VORCwgcmVhZCwgd3JpdGUpCisKK2V4dGVybiAiQyIgdm9pZCBfX29mZmxvYWRfbXlvUmVnaXN0ZXJUYWJsZXMoCisgICAgU2hhcmVkVGFibGVFbnRyeSAqc2hhcmVkX3RhYmxlLAorICAgIEZwdHJUYWJsZUVudHJ5ICpmcHRyX3RhYmxlCispOworCitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX215b0FjcXVpcmUodm9pZCk7CitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX215b1JlbGVhc2Uodm9pZCk7CisKKy8vIHRlbXBvcmFyeSB3b3JrYXJvdW5kIGZvciBibG9ja2luZyBiZWhhdmlvciBmb3IgbXlvaUxpYkluaXQvRmluaSBjYWxscworZXh0ZXJuICJDIiB2b2lkIF9fb2ZmbG9hZF9teW9MaWJJbml0KCk7CitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX215b0xpYkZpbmkoKTsKKworI2VuZGlmIC8vIE9GRkxPQURfTVlPX1RBUkdFVF9IX0lOQ0xVREVECmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX29tcF9ob3N0LmNwcCBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfb21wX2hvc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZDQ0NDUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX29tcF9ob3N0LmNwcApAQCAtMCwwICsxLDg1MSBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSA8b21wLmg+CisjaW5jbHVkZSAib2ZmbG9hZC5oIgorI2luY2x1ZGUgImNvbXBpbGVyX2lmX2hvc3QuaCIKKworLy8gT3Blbk1QIEFQSQorCit2b2lkIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UoaW50IG51bSkKK3sKKyAgICBpZiAobnVtID49IDApIHsKKyAgICAgICAgX19vbXBfZGV2aWNlX251bSA9IG51bTsKKyAgICB9Cit9CisKK2ludCBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlKHZvaWQpCit7CisgICAgcmV0dXJuIF9fb21wX2RldmljZV9udW07Cit9CisKK2ludCBvbXBfZ2V0X251bV9kZXZpY2VzKCkKK3sKKyAgICBfX29mZmxvYWRfaW5pdF9saWJyYXJ5KCk7CisgICAgcmV0dXJuIG1pY19lbmdpbmVzX3RvdGFsOworfQorCisvLyBPcGVuTVAgQVBJIHdyYXBwZXJzCisKK3N0YXRpYyB2b2lkIG9tcF9zZXRfaW50X3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgc2V0dGluZywKKyAgICBjb25zdCBjaGFyKiBmX25hbWUKKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZl9uYW1lLCAwKTsKKyAgICBpZiAob2ZsZCkgeworICAgICAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisKKyAgICAgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgICAgICB2YXJzWzBdLnNpemUgPSBzaXplb2YoaW50KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gJnNldHRpbmc7CisKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsIGZfbmFtZSwgMCwgMSwgdmFycywgTlVMTCwgMCwgMCwgMCk7CisgICAgfQorfQorCitzdGF0aWMgaW50IG9tcF9nZXRfaW50X3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBjb25zdCBjaGFyICogZl9uYW1lCispCit7CisgICAgaW50IHNldHRpbmcgPSAwOworCisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZfbmFtZSwgMCk7CisgICAgaWYgKG9mbGQpIHsKKyAgICAgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworCisgICAgICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgICAgIHZhcnNbMF0uc2l6ZSA9IHNpemVvZihpbnQpOworICAgICAgICB2YXJzWzBdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1swXS5wdHIgPSAmc2V0dGluZzsKKworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgZl9uYW1lLCAwLCAxLCB2YXJzLCBOVUxMLCAwLCAwLCAwKTsKKyAgICB9CisgICAgcmV0dXJuIHNldHRpbmc7Cit9CisKK3ZvaWQgb21wX3NldF9udW1fdGhyZWFkc190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IG51bV90aHJlYWRzCispCit7CisgICAgb21wX3NldF9pbnRfdGFyZ2V0KHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCBudW1fdGhyZWFkcywKKyAgICAgICAgICAgICAgICAgICAgICAgIm9tcF9zZXRfbnVtX3RocmVhZHNfdGFyZ2V0Iik7Cit9CisKK2ludCBvbXBfZ2V0X21heF90aHJlYWRzX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworICAgIHJldHVybiBvbXBfZ2V0X2ludF90YXJnZXQodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib21wX2dldF9tYXhfdGhyZWFkc190YXJnZXQiKTsKK30KKworaW50IG9tcF9nZXRfbnVtX3Byb2NzX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworICAgIHJldHVybiBvbXBfZ2V0X2ludF90YXJnZXQodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib21wX2dldF9udW1fcHJvY3NfdGFyZ2V0Iik7Cit9CisKK3ZvaWQgb21wX3NldF9keW5hbWljX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgbnVtX3RocmVhZHMKKykKK3sKKyAgICBvbXBfc2V0X2ludF90YXJnZXQodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIG51bV90aHJlYWRzLAorICAgICAgICAgICAgICAgICAgICAgICAib21wX3NldF9keW5hbWljX3RhcmdldCIpOworfQorCitpbnQgb21wX2dldF9keW5hbWljX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworICAgIHJldHVybiBvbXBfZ2V0X2ludF90YXJnZXQodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib21wX2dldF9keW5hbWljX3RhcmdldCIpOworfQorCit2b2lkIG9tcF9zZXRfbmVzdGVkX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgbmVzdGVkCispCit7CisgICAgb21wX3NldF9pbnRfdGFyZ2V0KHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCBuZXN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICJvbXBfc2V0X25lc3RlZF90YXJnZXQiKTsKK30KKworaW50IG9tcF9nZXRfbmVzdGVkX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworICAgIHJldHVybiBvbXBfZ2V0X2ludF90YXJnZXQodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib21wX2dldF9uZXN0ZWRfdGFyZ2V0Iik7Cit9CisKK3ZvaWQgb21wX3NldF9zY2hlZHVsZV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX3NjaGVkX3Qga2luZCwKKyAgICBpbnQgbW9kaWZpZXIKKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIDApOworICAgIGlmIChvZmxkICE9IDApIHsKKyAgICAgICAgVmFyRGVzYyB2YXJzWzJdID0gezB9OworCisgICAgICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICAgICAgdmFyc1swXS5zaXplID0gc2l6ZW9mKG9tcF9zY2hlZF90KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gJmtpbmQ7CisKKyAgICAgICAgdmFyc1sxXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1sxXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1sxXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgICAgICB2YXJzWzFdLnNpemUgPSBzaXplb2YoaW50KTsKKyAgICAgICAgdmFyc1sxXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMV0ucHRyID0gJm1vZGlmaWVyOworCisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCAib21wX3NldF9zY2hlZHVsZV90YXJnZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMiwgdmFycywgTlVMTCwgMCwgMCwgMCk7CisgICAgfQorfQorCit2b2lkIG9tcF9nZXRfc2NoZWR1bGVfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9zY2hlZF90ICpraW5kLAorICAgIGludCAqbW9kaWZpZXIKKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIDApOworICAgIGlmIChvZmxkICE9IDApIHsKKyAgICAgICAgVmFyRGVzYyB2YXJzWzJdID0gezB9OworCisgICAgICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgICAgIHZhcnNbMF0uc2l6ZSA9IHNpemVvZihvbXBfc2NoZWRfdCk7CisgICAgICAgIHZhcnNbMF0uY291bnQgPSAxOworICAgICAgICB2YXJzWzBdLnB0ciA9IGtpbmQ7CisKKyAgICAgICAgdmFyc1sxXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1sxXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1sxXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICAgICAgdmFyc1sxXS5zaXplID0gc2l6ZW9mKGludCk7CisgICAgICAgIHZhcnNbMV0uY291bnQgPSAxOworICAgICAgICB2YXJzWzFdLnB0ciA9IG1vZGlmaWVyOworCisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCAib21wX2dldF9zY2hlZHVsZV90YXJnZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMiwgdmFycywgTlVMTCwgMCwgMCwgMCk7CisgICAgfQorfQorCisvLyBsb2NrIEFQSSBmdW5jdGlvbnMKKwordm9pZCBvbXBfaW5pdF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbG9ja190YXJnZXRfdCAqbG9jaworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgMCk7CisgICAgaWYgKG9mbGQgIT0gMCkgeworICAgICAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisKKyAgICAgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICAgICAgdmFyc1swXS5zaXplID0gc2l6ZW9mKG9tcF9sb2NrX3RhcmdldF90KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gbG9jazsKKworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgIm9tcF9pbml0X2xvY2tfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDEsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KK30KKwordm9pZCBvbXBfZGVzdHJveV9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbG9ja190YXJnZXRfdCAqbG9jaworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgMCk7CisgICAgaWYgKG9mbGQgIT0gMCkgeworICAgICAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisKKyAgICAgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgICAgICB2YXJzWzBdLnNpemUgPSBzaXplb2Yob21wX2xvY2tfdGFyZ2V0X3QpOworICAgICAgICB2YXJzWzBdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1swXS5wdHIgPSBsb2NrOworCisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCAib21wX2Rlc3Ryb3lfbG9ja190YXJnZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgdmFycywgTlVMTCwgMCwgMCwgMCk7CisgICAgfQorfQorCit2b2lkIG9tcF9zZXRfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX2xvY2tfdGFyZ2V0X3QgKmxvY2sKKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIDApOworICAgIGlmIChvZmxkICE9IDApIHsKKyAgICAgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworCisgICAgICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbm91dDsKKyAgICAgICAgdmFyc1swXS5zaXplID0gc2l6ZW9mKG9tcF9sb2NrX3RhcmdldF90KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gbG9jazsKKworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgIm9tcF9zZXRfbG9ja190YXJnZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgdmFycywgTlVMTCwgMCwgMCwgMCk7CisgICAgfQorfQorCit2b2lkIG9tcF91bnNldF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbG9ja190YXJnZXRfdCAqbG9jaworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgMCk7CisgICAgaWYgKG9mbGQgIT0gMCkgeworICAgICAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisKKyAgICAgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2lub3V0OworICAgICAgICB2YXJzWzBdLnNpemUgPSBzaXplb2Yob21wX2xvY2tfdGFyZ2V0X3QpOworICAgICAgICB2YXJzWzBdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1swXS5wdHIgPSBsb2NrOworCisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCAib21wX3Vuc2V0X2xvY2tfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDEsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KK30KKworaW50IG9tcF90ZXN0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9sb2NrX3RhcmdldF90ICpsb2NrCispCit7CisgICAgaW50IHJlc3VsdCA9IDA7CisKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIDApOworICAgIGlmIChvZmxkICE9IDApIHsKKyAgICAgICAgVmFyRGVzYyB2YXJzWzJdID0gezB9OworCisgICAgICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbm91dDsKKyAgICAgICAgdmFyc1swXS5zaXplID0gc2l6ZW9mKG9tcF9sb2NrX3RhcmdldF90KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gbG9jazsKKworICAgICAgICB2YXJzWzFdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzFdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzFdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgICAgICB2YXJzWzFdLnNpemUgPSBzaXplb2YoaW50KTsKKyAgICAgICAgdmFyc1sxXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMV0ucHRyID0gJnJlc3VsdDsKKworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgIm9tcF90ZXN0X2xvY2tfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDIsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvLyBuZXN0ZWQgbG9jayBBUEkgZnVuY3Rpb25zCisKK3ZvaWQgb21wX2luaXRfbmVzdF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbmVzdF9sb2NrX3RhcmdldF90ICpsb2NrCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgICAgICB2YXJzWzBdLnNpemUgPSBzaXplb2Yob21wX25lc3RfbG9ja190YXJnZXRfdCk7CisgICAgICAgIHZhcnNbMF0uY291bnQgPSAxOworICAgICAgICB2YXJzWzBdLnB0ciA9IGxvY2s7CisKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJvbXBfaW5pdF9uZXN0X2xvY2tfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDEsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KK30KKwordm9pZCBvbXBfZGVzdHJveV9uZXN0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QgKmxvY2sKKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIDApOworICAgIGlmIChvZmxkICE9IDApIHsKKyAgICAgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworCisgICAgICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICAgICAgdmFyc1swXS5zaXplID0gc2l6ZW9mKG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QpOworICAgICAgICB2YXJzWzBdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1swXS5wdHIgPSBsb2NrOworCisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCAib21wX2Rlc3Ryb3lfbmVzdF9sb2NrX3RhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAxLCB2YXJzLCBOVUxMLCAwLCAwLCAwKTsKKyAgICB9Cit9CisKK3ZvaWQgb21wX3NldF9uZXN0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QgKmxvY2sKKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIDApOworICAgIGlmIChvZmxkICE9IDApIHsKKyAgICAgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworCisgICAgICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbm91dDsKKyAgICAgICAgdmFyc1swXS5zaXplID0gc2l6ZW9mKG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QpOworICAgICAgICB2YXJzWzBdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1swXS5wdHIgPSBsb2NrOworCisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCAib21wX3NldF9uZXN0X2xvY2tfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDEsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KK30KKwordm9pZCBvbXBfdW5zZXRfbmVzdF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbmVzdF9sb2NrX3RhcmdldF90ICpsb2NrCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW5vdXQ7CisgICAgICAgIHZhcnNbMF0uc2l6ZSA9IHNpemVvZihvbXBfbmVzdF9sb2NrX3RhcmdldF90KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gbG9jazsKKworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgIm9tcF91bnNldF9uZXN0X2xvY2tfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDEsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KK30KKworaW50IG9tcF90ZXN0X25lc3RfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX25lc3RfbG9ja190YXJnZXRfdCAqbG9jaworKQoreworICAgIGludCByZXN1bHQgPSAwOworCisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1syXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW5vdXQ7CisgICAgICAgIHZhcnNbMF0uc2l6ZSA9IHNpemVvZihvbXBfbmVzdF9sb2NrX3RhcmdldF90KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gbG9jazsKKworICAgICAgICB2YXJzWzFdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzFdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzFdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgICAgICB2YXJzWzFdLnNpemUgPSBzaXplb2YoaW50KTsKKyAgICAgICAgdmFyc1sxXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMV0ucHRyID0gJnJlc3VsdDsKKworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgIm9tcF90ZXN0X25lc3RfbG9ja190YXJnZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMiwgdmFycywgTlVMTCwgMCwgMCwgMCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIGttcCBBUEkgZnVuY3Rpb25zCisKK3ZvaWQga21wX3NldF9zdGFja3NpemVfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBzaXplCispCit7CisgICAgb21wX3NldF9pbnRfdGFyZ2V0KHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAia21wX3NldF9zdGFja3NpemVfdGFyZ2V0Iik7Cit9CisKK2ludCBrbXBfZ2V0X3N0YWNrc2l6ZV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICByZXR1cm4gb21wX2dldF9pbnRfdGFyZ2V0KHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImttcF9nZXRfc3RhY2tzaXplX3RhcmdldCIpOworfQorCit2b2lkIGttcF9zZXRfc3RhY2tzaXplX3NfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIHNpemVfdCBzaXplCispCit7CisgICAgb21wX3NldF9pbnRfdGFyZ2V0KHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAia21wX3NldF9zdGFja3NpemVfc190YXJnZXQiKTsKK30KKworc2l6ZV90IGttcF9nZXRfc3RhY2tzaXplX3NfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispCit7CisgICAgcmV0dXJuIG9tcF9nZXRfaW50X3RhcmdldCh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJrbXBfZ2V0X3N0YWNrc2l6ZV9zX3RhcmdldCIpOworfQorCit2b2lkIGttcF9zZXRfYmxvY2t0aW1lX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgdGltZQorKQoreworICAgIG9tcF9zZXRfaW50X3RhcmdldCh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgImttcF9zZXRfYmxvY2t0aW1lX3RhcmdldCIpOworfQorCitpbnQga21wX2dldF9ibG9ja3RpbWVfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispCit7CisgICAgcmV0dXJuIG9tcF9nZXRfaW50X3RhcmdldCh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJrbXBfZ2V0X2Jsb2NrdGltZV90YXJnZXQiKTsKK30KKwordm9pZCBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgMCk7CisgICAgaWYgKG9mbGQgIT0gMCkgeworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgImttcF9zZXRfbGlicmFyeV9zZXJpYWxfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDApOworICAgIH0KK30KKwordm9pZCBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZF90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIDApOworICAgIGlmIChvZmxkICE9IDApIHsKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZF90YXJnZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCk7CisgICAgfQorfQorCit2b2lkIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0X3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgMCk7CisgICAgaWYgKG9mbGQgIT0gMCkgeworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgImttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0X3RhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwKTsKKyAgICB9Cit9CisKK3ZvaWQga21wX3NldF9saWJyYXJ5X3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgbW9kZQorKQoreworICAgIG9tcF9zZXRfaW50X3RhcmdldCh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgImttcF9zZXRfbGlicmFyeV90YXJnZXQiKTsKK30KKworaW50IGttcF9nZXRfbGlicmFyeV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICByZXR1cm4gb21wX2dldF9pbnRfdGFyZ2V0KHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImttcF9nZXRfbGlicmFyeV90YXJnZXQiKTsKK30KKwordm9pZCBrbXBfc2V0X2RlZmF1bHRzX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBjaGFyIGNvbnN0ICpkZWZhdWx0cworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgMCk7CisgICAgaWYgKG9mbGQgIT0gMCkgeworICAgICAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisKKyAgICAgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfc3RyaW5nX3B0cjsKKyAgICAgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfc3RyaW5nX3B0cjsKKyAgICAgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgICAgICB2YXJzWzBdLmFsbG9jX2lmID0gMTsKKyAgICAgICAgdmFyc1swXS5mcmVlX2lmID0gMTsKKyAgICAgICAgdmFyc1swXS5wdHIgPSAmZGVmYXVsdHM7CisKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJrbXBfc2V0X2RlZmF1bHRzX3RhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAxLCB2YXJzLCBOVUxMLCAwLCAwLCAwKTsKKyAgICB9Cit9CisKKy8vIGFmZmluaXR5IEFQSSBmdW5jdGlvbnMKKwordm9pZCBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90ICptYXNrCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgICAgICB2YXJzWzBdLnNpemUgPSBzaXplb2Yoa21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QpOworICAgICAgICB2YXJzWzBdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1swXS5wdHIgPSBtYXNrOworCisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCAia21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrX3RhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAxLCB2YXJzLCBOVUxMLCAwLCAwLCAwKTsKKyAgICB9Cit9CisKK3ZvaWQga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgKm1hc2sKKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIDApOworICAgIGlmIChvZmxkICE9IDApIHsKKyAgICAgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworCisgICAgICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICAgICAgdmFyc1swXS5zaXplID0gc2l6ZW9mKGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gbWFzazsKKworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgImttcF9kZXN0cm95X2FmZmluaXR5X21hc2tfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDEsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KK30KKworaW50IGttcF9zZXRfYWZmaW5pdHlfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90ICptYXNrCispCit7CisgICAgaW50IHJlc3VsdCA9IDE7CisKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIDApOworICAgIGlmIChvZmxkICE9IDApIHsKKyAgICAgICAgVmFyRGVzYyB2YXJzWzJdID0gezB9OworCisgICAgICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICAgICAgdmFyc1swXS5zaXplID0gc2l6ZW9mKGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gbWFzazsKKworICAgICAgICB2YXJzWzFdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzFdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzFdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgICAgICB2YXJzWzFdLnNpemUgPSBzaXplb2YoaW50KTsKKyAgICAgICAgdmFyc1sxXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMV0ucHRyID0gJnJlc3VsdDsKKworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgImttcF9zZXRfYWZmaW5pdHlfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDIsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitpbnQga21wX2dldF9hZmZpbml0eV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgKm1hc2sKKykKK3sKKyAgICBpbnQgcmVzdWx0ID0gMTsKKworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgMCk7CisgICAgaWYgKG9mbGQgIT0gMCkgeworICAgICAgICBWYXJEZXNjIHZhcnNbMl0gPSB7MH07CisKKyAgICAgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2lub3V0OworICAgICAgICB2YXJzWzBdLnNpemUgPSBzaXplb2Yoa21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QpOworICAgICAgICB2YXJzWzBdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1swXS5wdHIgPSBtYXNrOworCisgICAgICAgIHZhcnNbMV0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMV0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMV0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgICAgIHZhcnNbMV0uc2l6ZSA9IHNpemVvZihpbnQpOworICAgICAgICB2YXJzWzFdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1sxXS5wdHIgPSAmcmVzdWx0OworCisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCAia21wX2dldF9hZmZpbml0eV90YXJnZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMiwgdmFycywgTlVMTCwgMCwgMCwgMCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworICAgIHJldHVybiBvbXBfZ2V0X2ludF90YXJnZXQodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAia21wX2dldF9hZmZpbml0eV9tYXhfcHJvY190YXJnZXQiKTsKK30KKworaW50IGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgcHJvYywKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCAqbWFzaworKQoreworICAgIGludCByZXN1bHQgPSAxOworCisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1szXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgICAgIHZhcnNbMF0uc2l6ZSA9IHNpemVvZihpbnQpOworICAgICAgICB2YXJzWzBdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1swXS5wdHIgPSAmcHJvYzsKKworICAgICAgICB2YXJzWzFdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzFdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzFdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW5vdXQ7CisgICAgICAgIHZhcnNbMV0uc2l6ZSA9IHNpemVvZihrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCk7CisgICAgICAgIHZhcnNbMV0uY291bnQgPSAxOworICAgICAgICB2YXJzWzFdLnB0ciA9IG1hc2s7CisKKyAgICAgICAgdmFyc1syXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1syXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1syXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICAgICAgdmFyc1syXS5zaXplID0gc2l6ZW9mKGludCk7CisgICAgICAgIHZhcnNbMl0uY291bnQgPSAxOworICAgICAgICB2YXJzWzJdLnB0ciA9ICZyZXN1bHQ7CisKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMywgdmFycywgTlVMTCwgMCwgMCwgMCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgcHJvYywKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCAqbWFzaworKQoreworICAgIGludCByZXN1bHQgPSAxOworCisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1szXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgICAgIHZhcnNbMF0uc2l6ZSA9IHNpemVvZihpbnQpOworICAgICAgICB2YXJzWzBdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1swXS5wdHIgPSAmcHJvYzsKKworICAgICAgICB2YXJzWzFdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzFdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzFdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW5vdXQ7CisgICAgICAgIHZhcnNbMV0uc2l6ZSA9IHNpemVvZihrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCk7CisgICAgICAgIHZhcnNbMV0uY291bnQgPSAxOworICAgICAgICB2YXJzWzFdLnB0ciA9IG1hc2s7CisKKyAgICAgICAgdmFyc1syXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1syXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1syXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICAgICAgdmFyc1syXS5zaXplID0gc2l6ZW9mKGludCk7CisgICAgICAgIHZhcnNbMl0uY291bnQgPSAxOworICAgICAgICB2YXJzWzJdLnB0ciA9ICZyZXN1bHQ7CisKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAzLCB2YXJzLCBOVUxMLCAwLCAwLCAwKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50IGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgcHJvYywKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCAqbWFzaworKQoreworICAgIGludCByZXN1bHQgPSAxOworCisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1szXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgICAgIHZhcnNbMF0uc2l6ZSA9IHNpemVvZihpbnQpOworICAgICAgICB2YXJzWzBdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1swXS5wdHIgPSAmcHJvYzsKKworICAgICAgICB2YXJzWzFdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzFdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzFdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgICAgIHZhcnNbMV0uc2l6ZSA9IHNpemVvZihrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCk7CisgICAgICAgIHZhcnNbMV0uY291bnQgPSAxOworICAgICAgICB2YXJzWzFdLnB0ciA9IG1hc2s7CisKKyAgICAgICAgdmFyc1syXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1syXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1syXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICAgICAgdmFyc1syXS5zaXplID0gc2l6ZW9mKGludCk7CisgICAgICAgIHZhcnNbMl0uY291bnQgPSAxOworICAgICAgICB2YXJzWzJdLnB0ciA9ICZyZXN1bHQ7CisKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMywgdmFycywgTlVMTCwgMCwgMCwgMCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX29tcF90YXJnZXQuY3BwIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9vbXBfdGFyZ2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjIwNTJhCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9vbXBfdGFyZ2V0LmNwcApAQCAtMCwwICsxLDEwMjEgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgPG9tcC5oPgorI2luY2x1ZGUgIm9mZmxvYWQuaCIKKyNpbmNsdWRlICJjb21waWxlcl9pZl90YXJnZXQuaCIKKworLy8gT3Blbk1QIEFQSQorCit2b2lkIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UoaW50IG51bSkKK3sKK30KKworaW50IG9tcF9nZXRfZGVmYXVsdF9kZXZpY2Uodm9pZCkKK3sKKyAgICByZXR1cm4gbWljX2luZGV4OworfQorCitpbnQgb21wX2dldF9udW1fZGV2aWNlcygpCit7CisgICAgcmV0dXJuIG1pY19lbmdpbmVzX3RvdGFsOworfQorCisvLyBPcGVuTVAgQVBJIHdyYXBwZXJzCisKK3N0YXRpYyB2b2lkIG9tcF9zZW5kX2ludF90b19ob3N0KAorICAgIHZvaWQgKm9mbGRfLAorICAgIGludCBzZXR0aW5nCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgIHZhcnNbMF0ucHRyID0gJnNldHRpbmc7CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAxLCB2YXJzLCBOVUxMKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKworc3RhdGljIGludCBvbXBfZ2V0X2ludF9mcm9tX2hvc3QoCisgICAgdm9pZCAqb2ZsZF8KKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSAoT0ZGTE9BRCkgb2ZsZF87CisgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworICAgIGludCBzZXR0aW5nOworCisgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICB2YXJzWzBdLnB0ciA9ICZzZXR0aW5nOworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMSwgdmFycywgTlVMTCk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7CisKKyAgICByZXR1cm4gc2V0dGluZzsKK30KKwordm9pZCBvbXBfc2V0X251bV90aHJlYWRzX2xyYigKKyAgICB2b2lkICpvZmxkCispCit7CisgICAgaW50IG51bV90aHJlYWRzOworCisgICAgbnVtX3RocmVhZHMgPSBvbXBfZ2V0X2ludF9mcm9tX2hvc3Qob2ZsZCk7CisgICAgb21wX3NldF9udW1fdGhyZWFkcyhudW1fdGhyZWFkcyk7Cit9CisKK3ZvaWQgb21wX2dldF9tYXhfdGhyZWFkc19scmIoCisgICAgdm9pZCAqb2ZsZAorKQoreworICAgIGludCBudW1fdGhyZWFkczsKKworICAgIG51bV90aHJlYWRzID0gb21wX2dldF9tYXhfdGhyZWFkcygpOworICAgIG9tcF9zZW5kX2ludF90b19ob3N0KG9mbGQsIG51bV90aHJlYWRzKTsKK30KKwordm9pZCBvbXBfZ2V0X251bV9wcm9jc19scmIoCisgICAgdm9pZCAqb2ZsZAorKQoreworICAgIGludCBudW1fcHJvY3M7CisKKyAgICBudW1fcHJvY3MgPSBvbXBfZ2V0X251bV9wcm9jcygpOworICAgIG9tcF9zZW5kX2ludF90b19ob3N0KG9mbGQsIG51bV9wcm9jcyk7Cit9CisKK3ZvaWQgb21wX3NldF9keW5hbWljX2xyYigKKyAgICB2b2lkICpvZmxkCispCit7CisgICAgaW50IGR5bmFtaWM7CisKKyAgICBkeW5hbWljID0gb21wX2dldF9pbnRfZnJvbV9ob3N0KG9mbGQpOworICAgIG9tcF9zZXRfZHluYW1pYyhkeW5hbWljKTsKK30KKwordm9pZCBvbXBfZ2V0X2R5bmFtaWNfbHJiKAorICAgIHZvaWQgKm9mbGQKKykKK3sKKyAgICBpbnQgZHluYW1pYzsKKworICAgIGR5bmFtaWMgPSBvbXBfZ2V0X2R5bmFtaWMoKTsKKyAgICBvbXBfc2VuZF9pbnRfdG9faG9zdChvZmxkLCBkeW5hbWljKTsKK30KKwordm9pZCBvbXBfc2V0X25lc3RlZF9scmIoCisgICAgdm9pZCAqb2ZsZAorKQoreworICAgIGludCBuZXN0ZWQ7CisKKyAgICBuZXN0ZWQgPSBvbXBfZ2V0X2ludF9mcm9tX2hvc3Qob2ZsZCk7CisgICAgb21wX3NldF9uZXN0ZWQobmVzdGVkKTsKK30KKwordm9pZCBvbXBfZ2V0X25lc3RlZF9scmIoCisgICAgdm9pZCAqb2ZsZAorKQoreworICAgIGludCBuZXN0ZWQ7CisKKyAgICBuZXN0ZWQgPSBvbXBfZ2V0X25lc3RlZCgpOworICAgIG9tcF9zZW5kX2ludF90b19ob3N0KG9mbGQsIG5lc3RlZCk7Cit9CisKK3ZvaWQgb21wX3NldF9zY2hlZHVsZV9scmIoCisgICAgdm9pZCAqb2ZsZF8KKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSAoT0ZGTE9BRCkgb2ZsZF87CisgICAgVmFyRGVzYyB2YXJzWzJdID0gezB9OworICAgIG9tcF9zY2hlZF90IGtpbmQ7CisgICAgaW50IG1vZGlmaWVyOworCisgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICB2YXJzWzBdLnB0ciA9ICZraW5kOworCisgICAgdmFyc1sxXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzFdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMV0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICB2YXJzWzFdLnB0ciA9ICZtb2RpZmllcjsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDIsIHZhcnMsIE5VTEwpOworICAgIG9tcF9zZXRfc2NoZWR1bGUoa2luZCwgbW9kaWZpZXIpOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCit2b2lkIG9tcF9nZXRfc2NoZWR1bGVfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1syXSA9IHswfTsKKyAgICBvbXBfc2NoZWRfdCBraW5kOworICAgIGludCBtb2RpZmllcjsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgIHZhcnNbMF0ucHRyID0gJmtpbmQ7CisKKyAgICB2YXJzWzFdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMV0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1sxXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICB2YXJzWzFdLnB0ciA9ICZtb2RpZmllcjsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDIsIHZhcnMsIE5VTEwpOworICAgIG9tcF9nZXRfc2NoZWR1bGUoJmtpbmQsICZtb2RpZmllcik7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKKy8vIGxvY2sgQVBJIGZ1bmN0aW9ucworCit2b2lkIG9tcF9pbml0X2xvY2tfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKyAgICBvbXBfbG9ja190YXJnZXRfdCBsb2NrOworCisgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgdmFyc1swXS5wdHIgPSAmbG9jazsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDEsIHZhcnMsIE5VTEwpOworICAgIG9tcF9pbml0X2xvY2soJmxvY2subG9jayk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKK3ZvaWQgb21wX2Rlc3Ryb3lfbG9ja19scmIoCisgICAgdm9pZCAqb2ZsZF8KKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSAoT0ZGTE9BRCkgb2ZsZF87CisgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworICAgIG9tcF9sb2NrX3RhcmdldF90IGxvY2s7CisKKyAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgIHZhcnNbMF0ucHRyID0gJmxvY2s7CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAxLCB2YXJzLCBOVUxMKTsKKyAgICBvbXBfZGVzdHJveV9sb2NrKCZsb2NrLmxvY2spOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCit2b2lkIG9tcF9zZXRfbG9ja19scmIoCisgICAgdm9pZCAqb2ZsZF8KKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSAoT0ZGTE9BRCkgb2ZsZF87CisgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworICAgIG9tcF9sb2NrX3RhcmdldF90IGxvY2s7CisKKyAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2lub3V0OworICAgIHZhcnNbMF0ucHRyID0gJmxvY2s7CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAxLCB2YXJzLCBOVUxMKTsKKyAgICBvbXBfc2V0X2xvY2soJmxvY2subG9jayk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKK3ZvaWQgb21wX3Vuc2V0X2xvY2tfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKyAgICBvbXBfbG9ja190YXJnZXRfdCBsb2NrOworCisgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbm91dDsKKyAgICB2YXJzWzBdLnB0ciA9ICZsb2NrOworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMSwgdmFycywgTlVMTCk7CisgICAgb21wX3Vuc2V0X2xvY2soJmxvY2subG9jayk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKK3ZvaWQgb21wX3Rlc3RfbG9ja19scmIoCisgICAgdm9pZCAqb2ZsZF8KKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSAoT0ZGTE9BRCkgb2ZsZF87CisgICAgVmFyRGVzYyB2YXJzWzJdID0gezB9OworICAgIG9tcF9sb2NrX3RhcmdldF90IGxvY2s7CisgICAgaW50IHJlc3VsdDsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW5vdXQ7CisgICAgdmFyc1swXS5wdHIgPSAmbG9jazsKKworICAgIHZhcnNbMV0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1sxXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzFdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgIHZhcnNbMV0ucHRyID0gJnJlc3VsdDsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDIsIHZhcnMsIE5VTEwpOworICAgIHJlc3VsdCA9IG9tcF90ZXN0X2xvY2soJmxvY2subG9jayk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKKy8vIG5lc3RlZCBsb2NrIEFQSSBmdW5jdGlvbnMKKwordm9pZCBvbXBfaW5pdF9uZXN0X2xvY2tfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKyAgICBvbXBfbmVzdF9sb2NrX3RhcmdldF90IGxvY2s7CisKKyAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICB2YXJzWzBdLnB0ciA9ICZsb2NrOworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMSwgdmFycywgTlVMTCk7CisgICAgb21wX2luaXRfbmVzdF9sb2NrKCZsb2NrLmxvY2spOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCit2b2lkIG9tcF9kZXN0cm95X25lc3RfbG9ja19scmIoCisgICAgdm9pZCAqb2ZsZF8KKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSAoT0ZGTE9BRCkgb2ZsZF87CisgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworICAgIG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QgbG9jazsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgdmFyc1swXS5wdHIgPSAmbG9jazsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDEsIHZhcnMsIE5VTEwpOworICAgIG9tcF9kZXN0cm95X25lc3RfbG9jaygmbG9jay5sb2NrKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKwordm9pZCBvbXBfc2V0X25lc3RfbG9ja19scmIoCisgICAgdm9pZCAqb2ZsZF8KKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSAoT0ZGTE9BRCkgb2ZsZF87CisgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworICAgIG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QgbG9jazsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW5vdXQ7CisgICAgdmFyc1swXS5wdHIgPSAmbG9jazsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDEsIHZhcnMsIE5VTEwpOworICAgIG9tcF9zZXRfbmVzdF9sb2NrKCZsb2NrLmxvY2spOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCit2b2lkIG9tcF91bnNldF9uZXN0X2xvY2tfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKyAgICBvbXBfbmVzdF9sb2NrX3RhcmdldF90IGxvY2s7CisKKyAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2lub3V0OworICAgIHZhcnNbMF0ucHRyID0gJmxvY2s7CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAxLCB2YXJzLCBOVUxMKTsKKyAgICBvbXBfdW5zZXRfbmVzdF9sb2NrKCZsb2NrLmxvY2spOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCit2b2lkIG9tcF90ZXN0X25lc3RfbG9ja19scmIoCisgICAgdm9pZCAqb2ZsZF8KKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSAoT0ZGTE9BRCkgb2ZsZF87CisgICAgVmFyRGVzYyB2YXJzWzJdID0gezB9OworICAgIG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QgbG9jazsKKyAgICBpbnQgcmVzdWx0OworCisgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbm91dDsKKyAgICB2YXJzWzBdLnB0ciA9ICZsb2NrOworCisgICAgdmFyc1sxXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzFdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMV0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgdmFyc1sxXS5wdHIgPSAmcmVzdWx0OworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMiwgdmFycywgTlVMTCk7CisgICAgcmVzdWx0ID0gb21wX3Rlc3RfbmVzdF9sb2NrKCZsb2NrLmxvY2spOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCisvLyBrbXAgQVBJIGZ1bmN0aW9ucworCit2b2lkIGttcF9zZXRfc3RhY2tzaXplX2xyYigKKyAgICB2b2lkICpvZmxkCispCit7CisgICAgaW50IHNpemU7CisKKyAgICBzaXplID0gb21wX2dldF9pbnRfZnJvbV9ob3N0KG9mbGQpOworICAgIGttcF9zZXRfc3RhY2tzaXplKHNpemUpOworfQorCit2b2lkIGttcF9nZXRfc3RhY2tzaXplX2xyYigKKyAgICB2b2lkICpvZmxkCispCit7CisgICAgaW50IHNpemU7CisKKyAgICBzaXplID0ga21wX2dldF9zdGFja3NpemUoKTsKKyAgICBvbXBfc2VuZF9pbnRfdG9faG9zdChvZmxkLCBzaXplKTsKK30KKwordm9pZCBrbXBfc2V0X3N0YWNrc2l6ZV9zX2xyYigKKyAgICB2b2lkICpvZmxkCispCit7CisgICAgaW50IHNpemU7CisKKyAgICBzaXplID0gb21wX2dldF9pbnRfZnJvbV9ob3N0KG9mbGQpOworICAgIGttcF9zZXRfc3RhY2tzaXplX3Moc2l6ZSk7Cit9CisKK3ZvaWQga21wX2dldF9zdGFja3NpemVfc19scmIoCisgICAgdm9pZCAqb2ZsZAorKQoreworICAgIGludCBzaXplOworCisgICAgc2l6ZSA9IGttcF9nZXRfc3RhY2tzaXplX3MoKTsKKyAgICBvbXBfc2VuZF9pbnRfdG9faG9zdChvZmxkLCBzaXplKTsKK30KKwordm9pZCBrbXBfc2V0X2Jsb2NrdGltZV9scmIoCisgICAgdm9pZCAqb2ZsZAorKQoreworICAgIGludCB0aW1lOworCisgICAgdGltZSA9IG9tcF9nZXRfaW50X2Zyb21faG9zdChvZmxkKTsKKyAgICBrbXBfc2V0X2Jsb2NrdGltZSh0aW1lKTsKK30KKwordm9pZCBrbXBfZ2V0X2Jsb2NrdGltZV9scmIoCisgICAgdm9pZCAqb2ZsZAorKQoreworICAgIGludCB0aW1lOworCisgICAgdGltZSA9IGttcF9nZXRfYmxvY2t0aW1lKCk7CisgICAgb21wX3NlbmRfaW50X3RvX2hvc3Qob2ZsZCwgdGltZSk7Cit9CisKK3ZvaWQga21wX3NldF9saWJyYXJ5X3NlcmlhbF9scmIoCisgICAgdm9pZCAqb2ZsZF8KKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSAoT0ZGTE9BRCkgb2ZsZF87CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAwLCAwLCAwKTsKKyAgICBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsKCk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKK3ZvaWQga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMCwgMCwgMCk7CisgICAga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQoKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKwordm9pZCBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dF9scmIoCisgICAgdm9pZCAqb2ZsZF8KKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSAoT0ZGTE9BRCkgb2ZsZF87CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAwLCAwLCAwKTsKKyAgICBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dCgpOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCit2b2lkIGttcF9zZXRfbGlicmFyeV9scmIoCisgICAgdm9pZCAqb2ZsZAorKQoreworICAgIGludCBtb2RlOworCisgICAgbW9kZSA9IG9tcF9nZXRfaW50X2Zyb21faG9zdChvZmxkKTsKKyAgICBrbXBfc2V0X2xpYnJhcnkobW9kZSk7Cit9CisKK3ZvaWQga21wX2dldF9saWJyYXJ5X2xyYigKKyAgICB2b2lkICpvZmxkCispCit7CisgICAgaW50IG1vZGU7CisKKyAgICBtb2RlID0ga21wX2dldF9saWJyYXJ5KCk7CisgICAgb21wX3NlbmRfaW50X3RvX2hvc3Qob2ZsZCwgbW9kZSk7Cit9CisKK3ZvaWQga21wX3NldF9kZWZhdWx0c19scmIoCisgICAgdm9pZCAqb2ZsZF8KKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSAoT0ZGTE9BRCkgb2ZsZF87CisgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworICAgIGNoYXIgKmRlZmF1bHRzID0gMDsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX3N0cmluZ19wdHI7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfc3RyaW5nX3B0cjsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgdmFyc1swXS5wdHIgPSAmZGVmYXVsdHM7CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAxLCB2YXJzLCBOVUxMKTsKKyAgICBrbXBfc2V0X2RlZmF1bHRzKGRlZmF1bHRzKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKworLy8gYWZmaW5pdHkgQVBJIGZ1bmN0aW9ucworCit2b2lkIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFza19scmIoCisgICAgdm9pZCAqb2ZsZF8KKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSAoT0ZGTE9BRCkgb2ZsZF87CisgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90IG1hc2s7CisKKyAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICB2YXJzWzBdLnB0ciA9ICZtYXNrOworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMSwgdmFycywgTlVMTCk7CisgICAga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrKCZtYXNrLm1hc2spOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCit2b2lkIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2tfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCBtYXNrOworCisgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICB2YXJzWzBdLnB0ciA9ICZtYXNrOworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMSwgdmFycywgTlVMTCk7CisgICAga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaygmbWFzay5tYXNrKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKwordm9pZCBrbXBfc2V0X2FmZmluaXR5X2xyYigKKyAgICB2b2lkICpvZmxkXworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IChPRkZMT0FEKSBvZmxkXzsKKyAgICBWYXJEZXNjIHZhcnNbMl0gPSB7MH07CisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgbWFzazsKKyAgICBpbnQgcmVzdWx0OworCisgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICB2YXJzWzBdLnB0ciA9ICZtYXNrOworCisgICAgdmFyc1sxXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzFdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMV0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgdmFyc1sxXS5wdHIgPSAmcmVzdWx0OworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMiwgdmFycywgTlVMTCk7CisgICAgcmVzdWx0ID0ga21wX3NldF9hZmZpbml0eSgmbWFzay5tYXNrKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKwordm9pZCBrbXBfZ2V0X2FmZmluaXR5X2xyYigKKyAgICB2b2lkICpvZmxkXworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IChPRkZMT0FEKSBvZmxkXzsKKyAgICBWYXJEZXNjIHZhcnNbMl0gPSB7MH07CisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgbWFzazsKKyAgICBpbnQgcmVzdWx0OworCisgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbm91dDsKKyAgICB2YXJzWzBdLnB0ciA9ICZtYXNrOworCisgICAgdmFyc1sxXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzFdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMV0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgdmFyc1sxXS5wdHIgPSAmcmVzdWx0OworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMiwgdmFycywgTlVMTCk7CisgICAgcmVzdWx0ID0ga21wX2dldF9hZmZpbml0eSgmbWFzay5tYXNrKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKwordm9pZCBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jX2xyYigKKyAgICB2b2lkICpvZmxkCispCit7CisgICAgaW50IG1heF9wcm9jOworCisgICAgbWF4X3Byb2MgPSBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jKCk7CisgICAgb21wX3NlbmRfaW50X3RvX2hvc3Qob2ZsZCwgbWF4X3Byb2MpOworfQorCit2b2lkIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jX2xyYigKKyAgICB2b2lkICpvZmxkXworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IChPRkZMT0FEKSBvZmxkXzsKKyAgICBWYXJEZXNjIHZhcnNbM10gPSB7MH07CisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgbWFzazsKKyAgICBpbnQgcHJvYywgcmVzdWx0OworCisgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICB2YXJzWzBdLnB0ciA9ICZwcm9jOworCisgICAgdmFyc1sxXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzFdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMV0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbm91dDsKKyAgICB2YXJzWzFdLnB0ciA9ICZtYXNrOworCisgICAgdmFyc1syXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzJdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMl0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgdmFyc1syXS5wdHIgPSAmcmVzdWx0OworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMywgdmFycywgTlVMTCk7CisgICAgcmVzdWx0ID0ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgJm1hc2subWFzayk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKK3ZvaWQga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY19scmIoCisgICAgdm9pZCAqb2ZsZF8KKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSAoT0ZGTE9BRCkgb2ZsZF87CisgICAgVmFyRGVzYyB2YXJzWzNdID0gezB9OworICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90IG1hc2s7CisgICAgaW50IHByb2MsIHJlc3VsdDsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgdmFyc1swXS5wdHIgPSAmcHJvYzsKKworICAgIHZhcnNbMV0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1sxXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzFdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW5vdXQ7CisgICAgdmFyc1sxXS5wdHIgPSAmbWFzazsKKworICAgIHZhcnNbMl0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1syXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzJdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgIHZhcnNbMl0ucHRyID0gJnJlc3VsdDsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDMsIHZhcnMsIE5VTEwpOworICAgIHJlc3VsdCA9IGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgJm1hc2subWFzayk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKK3ZvaWQga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2NfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1szXSA9IHswfTsKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCBtYXNrOworICAgIGludCBwcm9jLCByZXN1bHQ7CisKKyAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgIHZhcnNbMF0ucHRyID0gJnByb2M7CisKKyAgICB2YXJzWzFdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMV0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1sxXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgIHZhcnNbMV0ucHRyID0gJm1hc2s7CisKKyAgICB2YXJzWzJdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMl0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1syXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICB2YXJzWzJdLnB0ciA9ICZyZXN1bHQ7CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAzLCB2YXJzLCBOVUxMKTsKKyAgICByZXN1bHQgPSBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCAmbWFzay5tYXNrKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKworLy8gVGFyZ2V0LXNpZGUgc3R1YnMgZm9yIHRoZSBob3N0IGZ1bmN0aW9ucyAodG8gYXZvaWQgdW5yZXNvbHZlZHMpCisvLyBUaGVzZSBhcmUgbmVlZGVkIGZvciB0aGUgb2ZmbG9hZG0gdGFibGUKKwordm9pZCBvbXBfc2V0X251bV90aHJlYWRzX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgbnVtX3RocmVhZHMKKykKK3sKK30KKworaW50IG9tcF9nZXRfbWF4X3RocmVhZHNfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispCit7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBvbXBfZ2V0X251bV9wcm9jc190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBvbXBfc2V0X2R5bmFtaWNfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBudW1fdGhyZWFkcworKQoreworfQorCitpbnQgb21wX2dldF9keW5hbWljX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworICAgIHJldHVybiAwOworfQorCit2b2lkIG9tcF9zZXRfbmVzdGVkX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgbnVtX3RocmVhZHMKKykKK3sKK30KKworaW50IG9tcF9nZXRfbmVzdGVkX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworICAgIHJldHVybiAwOworfQorCit2b2lkIG9tcF9zZXRfc2NoZWR1bGVfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9zY2hlZF90IGtpbmQsCisgICAgaW50IG1vZGlmaWVyCispCit7Cit9CisKK3ZvaWQgb21wX2dldF9zY2hlZHVsZV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX3NjaGVkX3QgKmtpbmQsCisgICAgaW50ICptb2RpZmllcgorKQoreworfQorCit2b2lkIG9tcF9pbml0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9sb2NrX3RhcmdldF90ICpsb2NrCispCit7Cit9CisKK3ZvaWQgb21wX2Rlc3Ryb3lfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX2xvY2tfdGFyZ2V0X3QgKmxvY2sKKykKK3sKK30KKwordm9pZCBvbXBfc2V0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9sb2NrX3RhcmdldF90ICpsb2NrCispCit7Cit9CisKK3ZvaWQgb21wX3Vuc2V0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9sb2NrX3RhcmdldF90ICpsb2NrCispCit7Cit9CisKK2ludCBvbXBfdGVzdF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbG9ja190YXJnZXRfdCAqbG9jaworKQoreworICAgIHJldHVybiAwOworfQorCit2b2lkIG9tcF9pbml0X25lc3RfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX25lc3RfbG9ja190YXJnZXRfdCAqbG9jaworKQoreworfQorCit2b2lkIG9tcF9kZXN0cm95X25lc3RfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX25lc3RfbG9ja190YXJnZXRfdCAqbG9jaworKQoreworfQorCit2b2lkIG9tcF9zZXRfbmVzdF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbmVzdF9sb2NrX3RhcmdldF90ICpsb2NrCispCit7Cit9CisKK3ZvaWQgb21wX3Vuc2V0X25lc3RfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX25lc3RfbG9ja190YXJnZXRfdCAqbG9jaworKQoreworfQorCitpbnQgb21wX3Rlc3RfbmVzdF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbmVzdF9sb2NrX3RhcmdldF90ICpsb2NrCispCit7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQga21wX3NldF9zdGFja3NpemVfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBzaXplCispCit7Cit9CisKK2ludCBrbXBfZ2V0X3N0YWNrc2l6ZV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBrbXBfc2V0X3N0YWNrc2l6ZV9zX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBzaXplX3Qgc2l6ZQorKQoreworfQorCitzaXplX3Qga21wX2dldF9zdGFja3NpemVfc190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBrbXBfc2V0X2Jsb2NrdGltZV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IHRpbWUKKykKK3sKK30KKworaW50IGttcF9nZXRfYmxvY2t0aW1lX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworICAgIHJldHVybiAwOworfQorCit2b2lkIGttcF9zZXRfbGlicmFyeV9zZXJpYWxfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispCit7Cit9CisKK3ZvaWQga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispCit7Cit9CisKK3ZvaWQga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispCit7Cit9CisKK3ZvaWQga21wX3NldF9saWJyYXJ5X3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgbW9kZQorKQoreworfQorCitpbnQga21wX2dldF9saWJyYXJ5X3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworICAgIHJldHVybiAwOworfQorCit2b2lkIGttcF9zZXRfZGVmYXVsdHNfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGNoYXIgY29uc3QgKmRlZmF1bHRzCispCit7Cit9CisKK3ZvaWQga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCAqbWFzaworKQoreworfQorCit2b2lkIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90ICptYXNrCispCit7Cit9CisKK2ludCBrbXBfc2V0X2FmZmluaXR5X3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCAqbWFzaworKQoreworICAgIHJldHVybiAwOworfQorCitpbnQga21wX2dldF9hZmZpbml0eV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgKm1hc2sKKykKK3sKKyAgICByZXR1cm4gMDsKK30KKworaW50IGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispCit7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IHByb2MsCisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgKm1hc2sKKykKK3sKKyAgICByZXR1cm4gMDsKK30KKworaW50IGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBwcm9jLAorICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90ICptYXNrCispCit7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IHByb2MsCisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgKm1hc2sKKykKK3sKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfb3JzbC5jcHAgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX29yc2wuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNjJmOGEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX29yc2wuY3BwCkBAIC0wLDAgKzEsODQgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgIm9mZmxvYWRfb3JzbC5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIm9mZmxvYWRfaG9zdC5oIgorI2luY2x1ZGUgIm9yc2wtbGl0ZS9pbmNsdWRlL29yc2wtbGl0ZS5oIgorCituYW1lc3BhY2UgT1JTTCB7CisKK3N0YXRpYyBib29sICAgICAgICAgICAgaXNfZW5hYmxlZCA9IGZhbHNlOworc3RhdGljIGNvbnN0IE9SU0xUYWcgICBteV90YWcgPSAiT2ZmbG9hZCI7CisKK3ZvaWQgaW5pdCgpCit7CisgICAgY29uc3QgY2hhciAqZW52X3ZhciA9IGdldGVudigiT0ZGTE9BRF9FTkFCTEVfT1JTTCIpOworICAgIGlmIChlbnZfdmFyICE9IDAgJiYgKmVudl92YXIgIT0gJ1wwJykgeworICAgICAgICBpbnQ2NF90IG5ld192YWw7CisgICAgICAgIGlmIChfX29mZmxvYWRfcGFyc2VfaW50X3N0cmluZyhlbnZfdmFyLCBuZXdfdmFsKSkgeworICAgICAgICAgICAgaXNfZW5hYmxlZCA9IG5ld192YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfaW52YWxpZF9lbnZfdmFyX2ludF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9GRkxPQURfRU5BQkxFX09SU0wiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpc19lbmFibGVkKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIk9SU0wgaXMgZW5hYmxlZFxuIik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJPUlNMIGlzIGRpc2FibGVkXG4iKTsKKyAgICB9Cit9CisKK2Jvb2wgcmVzZXJ2ZShpbnQgZGV2aWNlKQoreworICAgIGlmIChpc19lbmFibGVkKSB7CisgICAgICAgIGludCBwbnVtID0gbWljX2VuZ2luZXNbZGV2aWNlXS5nZXRfcGh5c2ljYWxfaW5kZXgoKTsKKyAgICAgICAgT1JTTEJ1c3lTZXQgYnNldDsKKworICAgICAgICBic2V0LnR5cGUgPSBCVVNZX1NFVF9GVUxMOworICAgICAgICBpZiAoT1JTTFJlc2VydmUoMSwgJnBudW0sICZic2V0LCBteV90YWcpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCB0cnlfcmVzZXJ2ZShpbnQgZGV2aWNlKQoreworICAgIGlmIChpc19lbmFibGVkKSB7CisgICAgICAgIGludCBwbnVtID0gbWljX2VuZ2luZXNbZGV2aWNlXS5nZXRfcGh5c2ljYWxfaW5kZXgoKTsKKyAgICAgICAgT1JTTEJ1c3lTZXQgYnNldDsKKworICAgICAgICBic2V0LnR5cGUgPSBCVVNZX1NFVF9GVUxMOworICAgICAgICBpZiAoT1JTTFRyeVJlc2VydmUoMSwgJnBudW0sICZic2V0LCBteV90YWcpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCByZWxlYXNlKGludCBkZXZpY2UpCit7CisgICAgaWYgKGlzX2VuYWJsZWQpIHsKKyAgICAgICAgaW50IHBudW0gPSBtaWNfZW5naW5lc1tkZXZpY2VdLmdldF9waHlzaWNhbF9pbmRleCgpOworICAgICAgICBPUlNMQnVzeVNldCBic2V0OworCisgICAgICAgIGJzZXQudHlwZSA9IEJVU1lfU0VUX0ZVTEw7CisgICAgICAgIGlmIChPUlNMUmVsZWFzZSgxLCAmcG51bSwgJmJzZXQsIG15X3RhZykgIT0gMCkgeworICAgICAgICAgICAgLy8gc2hvdWxkIG5ldmVyIGdldCBoZXJlCisgICAgICAgIH0KKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIE9SU0wKZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfb3JzbC5oIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9vcnNsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RiODZmOQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfb3JzbC5oCkBAIC0wLDAgKzEsMjUgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBPRkZMT0FEX09SU0xfSF9JTkNMVURFRAorI2RlZmluZSBPRkZMT0FEX09SU0xfSF9JTkNMVURFRAorCisvLyBPUlNMIGludGVyZmFjZQorbmFtZXNwYWNlIE9SU0wgeworCitleHRlcm4gdm9pZCBpbml0KCk7CisKK2V4dGVybiBib29sIHJlc2VydmUoaW50IGRldmljZSk7CitleHRlcm4gYm9vbCB0cnlfcmVzZXJ2ZShpbnQgZGV2aWNlKTsKK2V4dGVybiB2b2lkIHJlbGVhc2UoaW50IGRldmljZSk7CisKK30gLy8gbmFtZXNwYWNlIE9SU0wKKworI2VuZGlmIC8vIE9GRkxPQURfT1JTTF9IX0lOQ0xVREVECmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3RhYmxlLmNwcCBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfdGFibGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMTY1ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3RhYmxlLmNwcApAQCAtMCwwICsxLDM3NSBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAib2ZmbG9hZF90YWJsZS5oIgorI2luY2x1ZGUgIm9mZmxvYWRfY29tbW9uLmgiCisKKyNpZiAhSE9TVF9MSUJSQVJZCisvLyBQcmVkZWZpbmVkIG9mZmxvYWQgZW50cmllcworZXh0ZXJuIHZvaWQgb21wX3NldF9udW1fdGhyZWFkc19scmIodm9pZCopOworZXh0ZXJuIHZvaWQgb21wX2dldF9tYXhfdGhyZWFkc19scmIodm9pZCopOworZXh0ZXJuIHZvaWQgb21wX2dldF9udW1fcHJvY3NfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIG9tcF9zZXRfZHluYW1pY19scmIodm9pZCopOworZXh0ZXJuIHZvaWQgb21wX2dldF9keW5hbWljX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBvbXBfc2V0X25lc3RlZF9scmIodm9pZCopOworZXh0ZXJuIHZvaWQgb21wX2dldF9uZXN0ZWRfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIG9tcF9zZXRfc2NoZWR1bGVfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIG9tcF9nZXRfc2NoZWR1bGVfbHJiKHZvaWQqKTsKKworZXh0ZXJuIHZvaWQgb21wX2luaXRfbG9ja19scmIodm9pZCopOworZXh0ZXJuIHZvaWQgb21wX2Rlc3Ryb3lfbG9ja19scmIodm9pZCopOworZXh0ZXJuIHZvaWQgb21wX3NldF9sb2NrX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBvbXBfdW5zZXRfbG9ja19scmIodm9pZCopOworZXh0ZXJuIHZvaWQgb21wX3Rlc3RfbG9ja19scmIodm9pZCopOworCitleHRlcm4gdm9pZCBvbXBfaW5pdF9uZXN0X2xvY2tfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIG9tcF9kZXN0cm95X25lc3RfbG9ja19scmIodm9pZCopOworZXh0ZXJuIHZvaWQgb21wX3NldF9uZXN0X2xvY2tfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIG9tcF91bnNldF9uZXN0X2xvY2tfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIG9tcF90ZXN0X25lc3RfbG9ja19scmIodm9pZCopOworCitleHRlcm4gdm9pZCBrbXBfc2V0X3N0YWNrc2l6ZV9scmIodm9pZCopOworZXh0ZXJuIHZvaWQga21wX2dldF9zdGFja3NpemVfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIGttcF9zZXRfc3RhY2tzaXplX3NfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIGttcF9nZXRfc3RhY2tzaXplX3NfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIGttcF9zZXRfYmxvY2t0aW1lX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBrbXBfZ2V0X2Jsb2NrdGltZV9scmIodm9pZCopOworZXh0ZXJuIHZvaWQga21wX3NldF9saWJyYXJ5X3NlcmlhbF9scmIodm9pZCopOworZXh0ZXJuIHZvaWQga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0X2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBrbXBfc2V0X2xpYnJhcnlfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIGttcF9nZXRfbGlicmFyeV9scmIodm9pZCopOworZXh0ZXJuIHZvaWQga21wX3NldF9kZWZhdWx0c19scmIodm9pZCopOworCitleHRlcm4gdm9pZCBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2tfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIGttcF9zZXRfYWZmaW5pdHlfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIGttcF9nZXRfYWZmaW5pdHlfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY19scmIodm9pZCopOworCisvLyBQcmVkZWZpbmVkIGVudHJpZXMgb24gdGhlIHRhcmdldCBzaWRlCitzdGF0aWMgRnVuY1RhYmxlOjpFbnRyeSBwcmVkZWZpbmVkX2VudHJpZXNbXSA9IHsKKyAgICAib21wX3NldF9udW1fdGhyZWFkc190YXJnZXQiLAorICAgICh2b2lkKikgJm9tcF9zZXRfbnVtX3RocmVhZHNfbHJiLAorICAgICJvbXBfZ2V0X21heF90aHJlYWRzX3RhcmdldCIsCisgICAgKHZvaWQqKSAmb21wX2dldF9tYXhfdGhyZWFkc19scmIsCisgICAgIm9tcF9nZXRfbnVtX3Byb2NzX3RhcmdldCIsCisgICAgKHZvaWQqKSAmb21wX2dldF9udW1fcHJvY3NfbHJiLAorICAgICJvbXBfc2V0X2R5bmFtaWNfdGFyZ2V0IiwKKyAgICAodm9pZCopICZvbXBfc2V0X2R5bmFtaWNfbHJiLAorICAgICJvbXBfZ2V0X2R5bmFtaWNfdGFyZ2V0IiwKKyAgICAodm9pZCopICZvbXBfZ2V0X2R5bmFtaWNfbHJiLAorICAgICJvbXBfc2V0X25lc3RlZF90YXJnZXQiLAorICAgICh2b2lkKikgJm9tcF9zZXRfbmVzdGVkX2xyYiwKKyAgICAib21wX2dldF9uZXN0ZWRfdGFyZ2V0IiwKKyAgICAodm9pZCopICZvbXBfZ2V0X25lc3RlZF9scmIsCisgICAgIm9tcF9zZXRfc2NoZWR1bGVfdGFyZ2V0IiwKKyAgICAodm9pZCopICZvbXBfc2V0X3NjaGVkdWxlX2xyYiwKKyAgICAib21wX2dldF9zY2hlZHVsZV90YXJnZXQiLAorICAgICh2b2lkKikgJm9tcF9nZXRfc2NoZWR1bGVfbHJiLAorCisgICAgIm9tcF9pbml0X2xvY2tfdGFyZ2V0IiwKKyAgICAodm9pZCopICZvbXBfaW5pdF9sb2NrX2xyYiwKKyAgICAib21wX2Rlc3Ryb3lfbG9ja190YXJnZXQiLAorICAgICh2b2lkKikgJm9tcF9kZXN0cm95X2xvY2tfbHJiLAorICAgICJvbXBfc2V0X2xvY2tfdGFyZ2V0IiwKKyAgICAodm9pZCopICZvbXBfc2V0X2xvY2tfbHJiLAorICAgICJvbXBfdW5zZXRfbG9ja190YXJnZXQiLAorICAgICh2b2lkKikgJm9tcF91bnNldF9sb2NrX2xyYiwKKyAgICAib21wX3Rlc3RfbG9ja190YXJnZXQiLAorICAgICh2b2lkKikgJm9tcF90ZXN0X2xvY2tfbHJiLAorCisgICAgIm9tcF9pbml0X25lc3RfbG9ja190YXJnZXQiLAorICAgICh2b2lkKikgJm9tcF9pbml0X25lc3RfbG9ja19scmIsCisgICAgIm9tcF9kZXN0cm95X25lc3RfbG9ja190YXJnZXQiLAorICAgICh2b2lkKikgJm9tcF9kZXN0cm95X25lc3RfbG9ja19scmIsCisgICAgIm9tcF9zZXRfbmVzdF9sb2NrX3RhcmdldCIsCisgICAgKHZvaWQqKSAmb21wX3NldF9uZXN0X2xvY2tfbHJiLAorICAgICJvbXBfdW5zZXRfbmVzdF9sb2NrX3RhcmdldCIsCisgICAgKHZvaWQqKSAmb21wX3Vuc2V0X25lc3RfbG9ja19scmIsCisgICAgIm9tcF90ZXN0X25lc3RfbG9ja190YXJnZXQiLAorICAgICh2b2lkKikgJm9tcF90ZXN0X25lc3RfbG9ja19scmIsCisKKyAgICAia21wX3NldF9zdGFja3NpemVfdGFyZ2V0IiwKKyAgICAodm9pZCopICZrbXBfc2V0X3N0YWNrc2l6ZV9scmIsCisgICAgImttcF9nZXRfc3RhY2tzaXplX3RhcmdldCIsCisgICAgKHZvaWQqKSAma21wX2dldF9zdGFja3NpemVfbHJiLAorICAgICJrbXBfc2V0X3N0YWNrc2l6ZV9zX3RhcmdldCIsCisgICAgKHZvaWQqKSAma21wX3NldF9zdGFja3NpemVfc19scmIsCisgICAgImttcF9nZXRfc3RhY2tzaXplX3NfdGFyZ2V0IiwKKyAgICAodm9pZCopICZrbXBfZ2V0X3N0YWNrc2l6ZV9zX2xyYiwKKyAgICAia21wX3NldF9ibG9ja3RpbWVfdGFyZ2V0IiwKKyAgICAodm9pZCopICZrbXBfc2V0X2Jsb2NrdGltZV9scmIsCisgICAgImttcF9nZXRfYmxvY2t0aW1lX3RhcmdldCIsCisgICAgKHZvaWQqKSAma21wX2dldF9ibG9ja3RpbWVfbHJiLAorICAgICJrbXBfc2V0X2xpYnJhcnlfc2VyaWFsX3RhcmdldCIsCisgICAgKHZvaWQqKSAma21wX3NldF9saWJyYXJ5X3NlcmlhbF9scmIsCisgICAgImttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kX3RhcmdldCIsCisgICAgKHZvaWQqKSAma21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfbHJiLAorICAgICJrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dF90YXJnZXQiLAorICAgICh2b2lkKikgJmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0X2xyYiwKKyAgICAia21wX3NldF9saWJyYXJ5X3RhcmdldCIsCisgICAgKHZvaWQqKSAma21wX3NldF9saWJyYXJ5X2xyYiwKKyAgICAia21wX2dldF9saWJyYXJ5X3RhcmdldCIsCisgICAgKHZvaWQqKSAma21wX2dldF9saWJyYXJ5X2xyYiwKKyAgICAia21wX3NldF9kZWZhdWx0c190YXJnZXQiLAorICAgICh2b2lkKikgJmttcF9zZXRfZGVmYXVsdHNfbHJiLAorCisgICAgImttcF9jcmVhdGVfYWZmaW5pdHlfbWFza190YXJnZXQiLAorICAgICh2b2lkKikgJmttcF9jcmVhdGVfYWZmaW5pdHlfbWFza19scmIsCisgICAgImttcF9kZXN0cm95X2FmZmluaXR5X21hc2tfdGFyZ2V0IiwKKyAgICAodm9pZCopICZrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrX2xyYiwKKyAgICAia21wX3NldF9hZmZpbml0eV90YXJnZXQiLAorICAgICh2b2lkKikgJmttcF9zZXRfYWZmaW5pdHlfbHJiLAorICAgICJrbXBfZ2V0X2FmZmluaXR5X3RhcmdldCIsCisgICAgKHZvaWQqKSAma21wX2dldF9hZmZpbml0eV9scmIsCisgICAgImttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfdGFyZ2V0IiwKKyAgICAodm9pZCopICZrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jX2xyYiwKKyAgICAia21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0IiwKKyAgICAodm9pZCopICZrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY19scmIsCisgICAgImttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0IiwKKyAgICAodm9pZCopICZrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jX2xyYiwKKyAgICAia21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0IiwKKyAgICAodm9pZCopICZrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY19scmIsCisKKyAgICAoY29uc3QgY2hhciopIC0xLAorICAgICh2b2lkKikgLTEKK307CisKK3N0YXRpYyBGdW5jTGlzdDo6Tm9kZSBwcmVkZWZpbmVkX3RhYmxlID0geworICAgIHsgcHJlZGVmaW5lZF9lbnRyaWVzLCAtMSB9LAorICAgIDAsIDAKK307CisKKy8vIEVudHJ5IHRhYmxlCitGdW5jTGlzdCBfX29mZmxvYWRfZW50cmllcygmcHJlZGVmaW5lZF90YWJsZSk7CisjZWxzZQorRnVuY0xpc3QgX19vZmZsb2FkX2VudHJpZXM7CisjZW5kaWYgLy8gIUhPU1RfTElCUkFSWQorCisvLyBGdW5jdGlvbiB0YWJsZS4gTm8gcHJlZGVmaW5lZCBlbnRyaWVzLgorRnVuY0xpc3QgX19vZmZsb2FkX2Z1bmNzOworCisvLyBWYXIgdGFibGUKK1Zhckxpc3QgIF9fb2ZmbG9hZF92YXJzOworCisvLyBHaXZlbiB0aGUgZnVuY3Rpb24gbmFtZSByZXR1cm5zIHRoZSBhc3NvY2l0YXRlZCBmdW5jdGlvbiBwb2ludGVyCitjb25zdCB2b2lkKiBGdW5jTGlzdDo6ZmluZF9hZGRyKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgY29uc3Qgdm9pZCogZnVuYyA9IDA7CisKKyAgICBtX2xvY2subG9jaygpOworCisgICAgZm9yIChOb2RlICpuID0gbV9oZWFkOyBuICE9IDA7IG4gPSBuLT5uZXh0KSB7CisgICAgICAgIGZvciAoY29uc3QgVGFibGU6OkVudHJ5ICplID0gbi0+dGFibGUuZW50cmllczsKKyAgICAgICAgICAgICBlLT5uYW1lICE9IChjb25zdCBjaGFyKikgLTE7IGUrKykgeworICAgICAgICAgICAgaWYgKGUtPm5hbWUgIT0gMCAmJiBzdHJjbXAoZS0+bmFtZSwgbmFtZSkgPT0gMCkgeworICAgICAgICAgICAgICAgIGZ1bmMgPSBlLT5mdW5jOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgbV9sb2NrLnVubG9jaygpOworCisgICAgcmV0dXJuIGZ1bmM7Cit9CisKKy8vIEdpdmVuIHRoZSBmdW5jdGlvbiBwb2ludGVyIHJldHVybnMgdGhlIGFzc29jaXRhdGVkIGZ1bmN0aW9uIG5hbWUKK2NvbnN0IGNoYXIqIEZ1bmNMaXN0OjpmaW5kX25hbWUoY29uc3Qgdm9pZCAqZnVuYykKK3sKKyAgICBjb25zdCBjaGFyKiBuYW1lID0gMDsKKworICAgIG1fbG9jay5sb2NrKCk7CisKKyAgICBmb3IgKE5vZGUgKm4gPSBtX2hlYWQ7IG4gIT0gMDsgbiA9IG4tPm5leHQpIHsKKyAgICAgICAgZm9yIChjb25zdCBUYWJsZTo6RW50cnkgKmUgPSBuLT50YWJsZS5lbnRyaWVzOworICAgICAgICAgICAgIGUtPm5hbWUgIT0gKGNvbnN0IGNoYXIqKSAtMTsgZSsrKSB7CisgICAgICAgICAgICBpZiAoZS0+ZnVuYyA9PSBmdW5jKSB7CisgICAgICAgICAgICAgICAgbmFtZSA9IGUtPm5hbWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtX2xvY2sudW5sb2NrKCk7CisKKyAgICByZXR1cm4gbmFtZTsKK30KKworLy8gUmV0dXJucyBtYXggbmFtZSBsZW5ndGggZnJvbSBhbGwgdGFibGVzCitpbnQ2NF90IEZ1bmNMaXN0OjptYXhfbmFtZV9sZW5ndGgodm9pZCkKK3sKKyAgICBpZiAobV9tYXhfbmFtZV9sZW4gPCAwKSB7CisgICAgICAgIG1fbG9jay5sb2NrKCk7CisKKyAgICAgICAgbV9tYXhfbmFtZV9sZW4gPSAwOworICAgICAgICBmb3IgKE5vZGUgKm4gPSBtX2hlYWQ7IG4gIT0gMDsgbiA9IG4tPm5leHQpIHsKKyAgICAgICAgICAgIGlmIChuLT50YWJsZS5tYXhfbmFtZV9sZW4gPCAwKSB7CisgICAgICAgICAgICAgICAgbi0+dGFibGUubWF4X25hbWVfbGVuID0gMDsKKworICAgICAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSBtYXggbmFtZSBsZW5ndGggaW4gYSBzaW5nbGUgdGFibGUKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFRhYmxlOjpFbnRyeSAqZSA9IG4tPnRhYmxlLmVudHJpZXM7CisgICAgICAgICAgICAgICAgICAgICBlLT5uYW1lICE9IChjb25zdCBjaGFyKikgLTE7IGUrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoZS0+bmFtZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuID0gc3RybGVuKGUtPm5hbWUpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuLT50YWJsZS5tYXhfbmFtZV9sZW4gPCBsZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLT50YWJsZS5tYXhfbmFtZV9sZW4gPSBsZW47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHNlbGVjdCBtYXggZnJvbSBhbGwgdGFibGVzCisgICAgICAgICAgICBpZiAobV9tYXhfbmFtZV9sZW4gPCBuLT50YWJsZS5tYXhfbmFtZV9sZW4pIHsKKyAgICAgICAgICAgICAgICBtX21heF9uYW1lX2xlbiA9IG4tPnRhYmxlLm1heF9uYW1lX2xlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG1fbG9jay51bmxvY2soKTsKKyAgICB9CisgICAgcmV0dXJuIG1fbWF4X25hbWVfbGVuOworfQorCisvLyBEZWJ1Z2dpbmcgZHVtcAordm9pZCBGdW5jTGlzdDo6ZHVtcCh2b2lkKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZ1bmN0aW9uIHRhYmxlOlxuIik7CisKKyAgICBtX2xvY2subG9jaygpOworCisgICAgZm9yIChOb2RlICpuID0gbV9oZWFkOyBuICE9IDA7IG4gPSBuLT5uZXh0KSB7CisgICAgICAgIGZvciAoY29uc3QgVGFibGU6OkVudHJ5ICplID0gbi0+dGFibGUuZW50cmllczsKKyAgICAgICAgICAgICBlLT5uYW1lICE9IChjb25zdCBjaGFyKikgLTE7IGUrKykgeworICAgICAgICAgICAgaWYgKGUtPm5hbWUgIT0gMCkgeworICAgICAgICAgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIiVwICVzXG4iLCBlLT5mdW5jLCBlLT5uYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIG1fbG9jay51bmxvY2soKTsKK30KKworLy8gRGVidWdnaW5nIGR1bXAKK3ZvaWQgVmFyTGlzdDo6ZHVtcCh2b2lkKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIlZhciB0YWJsZTpcbiIpOworCisgICAgbV9sb2NrLmxvY2soKTsKKworICAgIGZvciAoTm9kZSAqbiA9IG1faGVhZDsgbiAhPSAwOyBuID0gbi0+bmV4dCkgeworICAgICAgICBmb3IgKGNvbnN0IFRhYmxlOjpFbnRyeSAqZSA9IG4tPnRhYmxlLmVudHJpZXM7CisgICAgICAgICAgICAgZS0+bmFtZSAhPSAoY29uc3QgY2hhciopIC0xOyBlKyspIHsKKyAgICAgICAgICAgIGlmIChlLT5uYW1lICE9IDApIHsKKyNpZiBIT1NUX0xJQlJBUlkKKyAgICAgICAgICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICIlcyAlcCAlbGRcbiIsIGUtPm5hbWUsIGUtPmFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLT5zaXplKTsKKyNlbHNlICAvLyBIT1NUX0xJQlJBUlkKKyAgICAgICAgICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICIlcyAlcFxuIiwgZS0+bmFtZSwgZS0+YWRkcik7CisjZW5kaWYgLy8gSE9TVF9MSUJSQVJZCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtX2xvY2sudW5sb2NrKCk7Cit9CisKKy8vCitpbnQ2NF90IFZhckxpc3Q6OnRhYmxlX3NpemUoaW50NjRfdCAmbmVsZW1zKQoreworICAgIGludDY0X3QgbGVuZ3RoID0gMDsKKworICAgIG5lbGVtcyA9IDA7CisKKyAgICAvLyBjYWxjdWxhdGUgc3RyaW5nIHRhYmxlIHNpemUgYW5kIG51bWJlciBvZiBlbGVtZW50cworICAgIGZvciAoTm9kZSAqbiA9IG1faGVhZDsgbiAhPSAwOyBuID0gbi0+bmV4dCkgeworICAgICAgICBmb3IgKGNvbnN0IFRhYmxlOjpFbnRyeSAqZSA9IG4tPnRhYmxlLmVudHJpZXM7CisgICAgICAgICAgICAgZS0+bmFtZSAhPSAoY29uc3QgY2hhciopIC0xOyBlKyspIHsKKyAgICAgICAgICAgIGlmIChlLT5uYW1lICE9IDApIHsKKyAgICAgICAgICAgICAgICBsZW5ndGggKz0gc3RybGVuKGUtPm5hbWUpICsgMTsKKyAgICAgICAgICAgICAgICBuZWxlbXMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBuZWxlbXMgKiBzaXplb2YoQnVmRW50cnkpICsgbGVuZ3RoOworfQorCisvLyBjb3B5IHRhYmxlIHRvIHRoZSBndmVuIGJ1ZmZlcgordm9pZCBWYXJMaXN0Ojp0YWJsZV9jb3B5KHZvaWQgKmJ1ZiwgaW50NjRfdCBuZWxlbXMpCit7CisgICAgQnVmRW50cnkqIGVsZW1zID0gc3RhdGljX2Nhc3Q8QnVmRW50cnkqPihidWYpOworICAgIGNoYXIqICAgICBuYW1lcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGVsZW1zICsgbmVsZW1zKTsKKworICAgIC8vIGNvcHkgZW50cmllcyB0byBidWZmZXIKKyAgICBmb3IgKE5vZGUgKm4gPSBtX2hlYWQ7IG4gIT0gMDsgbiA9IG4tPm5leHQpIHsKKyAgICAgICAgZm9yIChjb25zdCBUYWJsZTo6RW50cnkgKmUgPSBuLT50YWJsZS5lbnRyaWVzOworICAgICAgICAgICAgIGUtPm5hbWUgIT0gKGNvbnN0IGNoYXIqKSAtMTsgZSsrKSB7CisgICAgICAgICAgICBpZiAoZS0+bmFtZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgLy8gbmFtZSBmaWVsZCBjb250YWlucyBvZmZzZXQgdG8gdGhlIG5hbWUgZnJvbSB0aGUgYmVnaW5uaW5nCisgICAgICAgICAgICAgICAgLy8gb2YgdGhlIGJ1ZmZlcgorICAgICAgICAgICAgICAgIGVsZW1zLT5uYW1lID0gbmFtZXMgLSBzdGF0aWNfY2FzdDxjaGFyKj4oYnVmKTsKKyAgICAgICAgICAgICAgICBlbGVtcy0+YWRkciA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KGUtPmFkZHIpOworCisgICAgICAgICAgICAgICAgLy8gY29weSBuYW1lIHRvIHN0cmluZyB0YWJsZQorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBlLT5uYW1lOworICAgICAgICAgICAgICAgIHdoaWxlICgoKm5hbWVzKysgPSAqbmFtZSsrKSAhPSAnXDAnKTsKKworICAgICAgICAgICAgICAgIGVsZW1zKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIHBhdGNoIG5hbWUgb2Zmc2V0cyBpbiBhIGJ1ZmZlcgordm9pZCBWYXJMaXN0Ojp0YWJsZV9wYXRjaF9uYW1lcyh2b2lkICpidWYsIGludDY0X3QgbmVsZW1zKQoreworICAgIEJ1ZkVudHJ5KiBlbGVtcyA9IHN0YXRpY19jYXN0PEJ1ZkVudHJ5Kj4oYnVmKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG5lbGVtczsgaSsrKSB7CisgICAgICAgIGVsZW1zW2ldLm5hbWUgKz0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oYnVmKTsKKyAgICB9Cit9CisKKy8vIEFkZHMgZ2l2ZW4gbGlzdCBlbGVtZW50IHRvIHRoZSBnbG9iYWwgbG9va3VwIHRhYmxlIGxpc3QKK2V4dGVybiAiQyIgdm9pZCBfX29mZmxvYWRfcmVnaXN0ZXJfdGFibGVzKAorICAgIEZ1bmNMaXN0OjpOb2RlICplbnRyeV90YWJsZSwKKyAgICBGdW5jTGlzdDo6Tm9kZSAqZnVuY190YWJsZSwKKyAgICBWYXJMaXN0OjpOb2RlICp2YXJfdGFibGUKKykKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJSZWdpc3RlcmluZyBvZmZsb2FkIGZ1bmN0aW9uIGVudHJ5IHRhYmxlICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnlfdGFibGUpOworICAgIF9fb2ZmbG9hZF9lbnRyaWVzLmFkZF90YWJsZShlbnRyeV90YWJsZSk7CisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJSZWdpc3RlcmluZyBmdW5jdGlvbiB0YWJsZSAlcFxuIiwgZnVuY190YWJsZSk7CisgICAgX19vZmZsb2FkX2Z1bmNzLmFkZF90YWJsZShmdW5jX3RhYmxlKTsKKworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIlJlZ2lzdGVyaW5nIHZhciB0YWJsZSAlcFxuIiwgdmFyX3RhYmxlKTsKKyAgICBfX29mZmxvYWRfdmFycy5hZGRfdGFibGUodmFyX3RhYmxlKTsKK30KKworLy8gUmVtb3ZlcyBnaXZlbiBsaXN0IGVsZW1lbnQgZnJvbSB0aGUgZ2xvYmFsIGxvb2t1cCB0YWJsZSBsaXN0CitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX3VucmVnaXN0ZXJfdGFibGVzKAorICAgIEZ1bmNMaXN0OjpOb2RlICplbnRyeV90YWJsZSwKKyAgICBGdW5jTGlzdDo6Tm9kZSAqZnVuY190YWJsZSwKKyAgICBWYXJMaXN0OjpOb2RlICp2YXJfdGFibGUKKykKK3sKKyAgICBfX29mZmxvYWRfZW50cmllcy5yZW1vdmVfdGFibGUoZW50cnlfdGFibGUpOworCisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiVW5yZWdpc3RlcmluZyBmdW5jdGlvbiB0YWJsZSAlcFxuIiwgZnVuY190YWJsZSk7CisgICAgX19vZmZsb2FkX2Z1bmNzLnJlbW92ZV90YWJsZShmdW5jX3RhYmxlKTsKKworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIlVucmVnaXN0ZXJpbmcgdmFyIHRhYmxlICVwXG4iLCB2YXJfdGFibGUpOworICAgIF9fb2ZmbG9hZF92YXJzLnJlbW92ZV90YWJsZSh2YXJfdGFibGUpOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90YWJsZS5oIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmY2VkM2UKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3RhYmxlLmgKQEAgLTAsMCArMSwzMDEgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLyohIFxmaWxlCisgICAgXGJyaWVmIEZ1bmN0aW9uIGFuZCBWYXJpYWJsZSB0YWJsZXMgdXNlZCBieSB0aGUgcnVudGltZSBsaWJyYXJ5CisqLworCisjaWZuZGVmIE9GRkxPQURfVEFCTEVfSF9JTkNMVURFRAorI2RlZmluZSBPRkZMT0FEX1RBQkxFX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgIm9mZmxvYWRfdXRpbC5oIgorCisvLyBUZW1wbGF0ZSByZXByZXNlbnRpbmcgZG91YmxlIGxpbmtlZCBsaXN0IG9mIHRhYmxlcwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIFRhYmxlTGlzdCB7CitwdWJsaWM6CisgICAgLy8gdGFibGUgdHlwZQorICAgIHR5cGVkZWYgVCBUYWJsZTsKKworICAgIC8vIExpc3Qgbm9kZQorICAgIHN0cnVjdCBOb2RlIHsKKyAgICAgICAgVGFibGUgICB0YWJsZTsKKyAgICAgICAgTm9kZSogICBwcmV2OworICAgICAgICBOb2RlKiAgIG5leHQ7CisgICAgfTsKKworcHVibGljOgorICAgIGV4cGxpY2l0IFRhYmxlTGlzdChOb2RlICpub2RlID0gMCkgOiBtX2hlYWQobm9kZSkge30KKworICAgIHZvaWQgYWRkX3RhYmxlKE5vZGUgKm5vZGUpIHsKKyAgICAgICAgbV9sb2NrLmxvY2soKTsKKworICAgICAgICBpZiAobV9oZWFkICE9IDApIHsKKyAgICAgICAgICAgIG5vZGUtPm5leHQgPSBtX2hlYWQ7CisgICAgICAgICAgICBtX2hlYWQtPnByZXYgPSBub2RlOworICAgICAgICB9CisgICAgICAgIG1faGVhZCA9IG5vZGU7CisKKyAgICAgICAgbV9sb2NrLnVubG9jaygpOworICAgIH0KKworICAgIHZvaWQgcmVtb3ZlX3RhYmxlKE5vZGUgKm5vZGUpIHsKKyAgICAgICAgbV9sb2NrLmxvY2soKTsKKworICAgICAgICBpZiAobm9kZS0+bmV4dCAhPSAwKSB7CisgICAgICAgICAgICBub2RlLT5uZXh0LT5wcmV2ID0gbm9kZS0+cHJldjsKKyAgICAgICAgfQorICAgICAgICBpZiAobm9kZS0+cHJldiAhPSAwKSB7CisgICAgICAgICAgICBub2RlLT5wcmV2LT5uZXh0ID0gbm9kZS0+bmV4dDsKKyAgICAgICAgfQorICAgICAgICBpZiAobV9oZWFkID09IG5vZGUpIHsKKyAgICAgICAgICAgIG1faGVhZCA9IG5vZGUtPm5leHQ7CisgICAgICAgIH0KKworICAgICAgICBtX2xvY2sudW5sb2NrKCk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgTm9kZSogICAgICAgICAgIG1faGVhZDsKKyAgICBtdXRleF90ICAgICAgICAgbV9sb2NrOworfTsKKworLy8gRnVuY3Rpb24gbG9va3VwIHRhYmxlLgorc3RydWN0IEZ1bmNUYWJsZSB7CisgICAgLy8hIEZ1bmN0aW9uIHRhYmxlIGVudHJ5CisgICAgLyohIFRoaXMgdGFibGUgY29udGFpbnMgZnVuY3Rpb25zIGNyZWF0ZWQgZnJvbSBvZmZsb2FkIHJlZ2lvbnMuICAgKi8KKyAgICAvKiEgRWFjaCBlbnRyeSBjb25zaXN0cyBvZiBhIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uJ3MgImtleSIKKyAgICAgICAgYW5kIHRoZSBmdW5jdGlvbiBhZGRyZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qISBFYWNoIHNoYXJlZCBsaWJyYXJ5IG9yIGV4ZWN1dGFibGUgbWF5IGNvbnRhaW4gb25lIHN1Y2ggdGFibGUuICovCisgICAgLyohIFRoZSBlbmQgb2YgdGhlIHRhYmxlIGlzIG1hcmtlZCB3aXRoIGFuIGVudHJ5IHdob3NlIG5hbWUgZmllbGQKKyAgICAgICAgaGFzIHZhbHVlIC0xLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHN0cnVjdCBFbnRyeSB7CisgICAgICAgIGNvbnN0IGNoYXIqIG5hbWU7IC8vITwgTmFtZSBvZiB0aGUgZnVuY3Rpb24KKyAgICAgICAgdm9pZCogICAgICAgZnVuYzsgLy8hPCBBZGRyZXNzIG9mIHRoZSBmdW5jdGlvbgorICAgIH07CisKKyAgICAvLyBlbnRyaWVzCisgICAgY29uc3QgRW50cnkgKmVudHJpZXM7CisKKyAgICAvLyBtYXggbmFtZSBsZW5ndGgKKyAgICBpbnQ2NF90IG1heF9uYW1lX2xlbjsKK307CisKKy8vIEZ1bmN0aW9uIHRhYmxlCitjbGFzcyBGdW5jTGlzdCA6IHB1YmxpYyBUYWJsZUxpc3Q8RnVuY1RhYmxlPiB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgRnVuY0xpc3QoTm9kZSAqbm9kZSA9IDApIDogVGFibGVMaXN0PFRhYmxlPihub2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX21heF9uYW1lX2xlbigtMSkKKyAgICB7fQorCisgICAgLy8gYWRkIHRhYmxlIHRvIHRoZSBsaXN0CisgICAgdm9pZCBhZGRfdGFibGUoTm9kZSAqbm9kZSkgeworICAgICAgICAvLyByZWNhbGN1bGF0ZSBtYXggZnVuY3Rpb24gbmFtZSBsZW5ndGgKKyAgICAgICAgbV9tYXhfbmFtZV9sZW4gPSAtMTsKKworICAgICAgICAvLyBhZGQgdGFibGUKKyAgICAgICAgVGFibGVMaXN0PFRhYmxlPjo6YWRkX3RhYmxlKG5vZGUpOworICAgIH0KKworICAgIC8vIGZpbmQgZnVuY3Rpb24gYWRkcmVzcyBmb3IgdGhlIGdpdmVuIG5hbWUKKyAgICBjb25zdCB2b2lkKiBmaW5kX2FkZHIoY29uc3QgY2hhciAqbmFtZSk7CisKKyAgICAvLyBmaW5kIGZ1bmN0aW9uIG5hbWUgZm9yIHRoZSBnaXZlbiBhZGRyZXNzCisgICAgY29uc3QgY2hhciogZmluZF9uYW1lKGNvbnN0IHZvaWQgKmFkZHIpOworCisgICAgLy8gbWF4IG5hbWUgbGVuZ3RoIGZyb20gYWxsIHRhYmxlcyBpbiB0aGUgbGlzdAorICAgIGludDY0X3QgbWF4X25hbWVfbGVuZ3RoKHZvaWQpOworCisgICAgLy8gZGVidWcgZHVtcAorICAgIHZvaWQgZHVtcCh2b2lkKTsKKworcHJpdmF0ZToKKyAgICAvLyBtYXggbmFtZSBsZW5ndGggd2l0aGluIGZyb20gYWxsIHRhYmxlcworICAgIGludDY0X3QgbV9tYXhfbmFtZV9sZW47Cit9OworCisvLyBUYWJsZSBlbnRyeSBmb3Igc3RhdGljIHZhcmlhYmxlcworc3RydWN0IFZhclRhYmxlIHsKKyAgICAvLyEgVmFyaWFibGUgdGFibGUgZW50cnkKKyAgICAvKiEgVGhpcyB0YWJsZSBjb250YWlucyBzdGF0aWNhbGx5IGFsbG9jYXRlZCB2YXJpYWJsZXMgbWFya2VkIHdpdGgKKyAgICAgICAgX19kZWNsc3BlYyh0YXJnZXQobWljKSBvciAjcHJhZ21hIG9tcCBkZWNsYXJlIHRhcmdldC4gICAgICAgICAgICovCisgICAgLyohIEVhY2ggZW50cnkgY29uc2lzdHMgb2YgYSBwb2ludGVyIHRvIHRoZSB2YXJpYWJsZSdzICJrZXkiLAorICAgICAgICB0aGUgdmFyaWFibGUgYWRkcmVzcyBhbmQgaXRzIHNpemUgaW4gYnl0ZXMuICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiEgQmVjYXVzZSBtZW1vcnkgYWxsb2NhdGlvbiBpcyBkb25lIGZyb20gdGhlIGhvc3QsCisgICAgICAgIHRoZSBNSUMgdGFibGUgZG9lcyBub3QgbmVlZCB0aGUgc2l6ZSBvZiB0aGUgdmFyaWFibGUuICAgICAgICAgICAqLworICAgIC8qISBQYWRkaW5nIHRvIG1ha2UgdGhlIHRhYmxlIGVudHJ5IHNpemUgYSBwb3dlciBvZiAyIGlzIG5lY2Vzc2FyeQorICAgICAgICB0byBhdm9pZCAiaG9sZXMiIGJldHdlZW4gdGFibGUgY29udHJpYnV0aW9ucyBmcm9tIGRpZmZlcmVudCBvYmplY3QKKyAgICAgICAgZmlsZXMgb24gV2luZG93cyB3aGVuIGRlYnVnIGluZm9ybWF0aW9uIGlzIHNwZWNpZmllZCB3aXRoIC9aaS4gICovCisgICAgc3RydWN0IEVudHJ5IHsKKyAgICAgICAgY29uc3QgY2hhciogbmFtZTsgLy8hPCBOYW1lIG9mIHRoZSB2YXJpYWJsZQorICAgICAgICB2b2lkKiAgICAgICBhZGRyOyAvLyE8IEFkZHJlc3Mgb2YgdGhlIHZhcmlhYmxlCisKKyNpZiBIT1NUX0xJQlJBUlkKKyAgICAgICAgdWludDY0X3QgICAgc2l6ZTsKKworI2lmZGVmIFRBUkdFVF9XSU5OVAorCQkvLyBwYWRkaW5nIHRvIG1ha2UgZW50cnkgc2l6ZSBhIHBvd2VyIG9mIDIKKyAgICAgICAgdWludDY0X3QgICAgcGFkZGluZzsKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKyNlbmRpZgorICAgIH07CisKKyAgICAvLyBUYWJsZSB0ZXJtaW5hdGVkIGJ5IGFuIGVudHJ5IHdpdGggbmFtZSA9PSAtMQorICAgIGNvbnN0IEVudHJ5ICplbnRyaWVzOworfTsKKworLy8gTGlzdCBvZiB2YXIgdGFibGVzCitjbGFzcyBWYXJMaXN0IDogcHVibGljIFRhYmxlTGlzdDxWYXJUYWJsZT4geworcHVibGljOgorICAgIFZhckxpc3QoKSA6IFRhYmxlTGlzdDxUYWJsZT4oKQorICAgIHt9CisKKyAgICAvLyBkZWJ1ZyBkdW1wCisgICAgdm9pZCBkdW1wKCk7CisKK3B1YmxpYzoKKyAgICAvLyB2YXIgdGFibGUgbGlzdCBpdGVyYXRvcgorICAgIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjppbnB1dF9pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZTo6RW50cnk+IHsKKyAgICBwdWJsaWM6CisgICAgICAgIEl0ZXJhdG9yKCkgOiBtX25vZGUoMCksIG1fZW50cnkoMCkge30KKworICAgICAgICBleHBsaWNpdCBJdGVyYXRvcihOb2RlICpub2RlKSB7CisgICAgICAgICAgICBuZXdfbm9kZShub2RlKTsKKyAgICAgICAgfQorCisgICAgICAgIEl0ZXJhdG9yJiBvcGVyYXRvcisrKCkgeworICAgICAgICAgICAgaWYgKG1fZW50cnkgIT0gMCkgeworICAgICAgICAgICAgICAgIG1fZW50cnkrKzsKKyAgICAgICAgICAgICAgICB3aGlsZSAobV9lbnRyeS0+bmFtZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1fZW50cnkrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1fZW50cnktPm5hbWUgPT0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oLTEpKSB7CisgICAgICAgICAgICAgICAgICAgIG5ld19ub2RlKG1fbm9kZS0+bmV4dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEl0ZXJhdG9yICZvdGhlcikgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fZW50cnkgPT0gb3RoZXIubV9lbnRyeTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBJdGVyYXRvciAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX2VudHJ5ICE9IG90aGVyLm1fZW50cnk7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBUYWJsZTo6RW50cnkqIG9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX2VudHJ5OworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICB2b2lkIG5ld19ub2RlKE5vZGUgKm5vZGUpIHsKKyAgICAgICAgICAgIG1fbm9kZSA9IG5vZGU7CisgICAgICAgICAgICBtX2VudHJ5ID0gMDsKKyAgICAgICAgICAgIHdoaWxlIChtX25vZGUgIT0gMCkgeworICAgICAgICAgICAgICAgIG1fZW50cnkgPSBtX25vZGUtPnRhYmxlLmVudHJpZXM7CisgICAgICAgICAgICAgICAgd2hpbGUgKG1fZW50cnktPm5hbWUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtX2VudHJ5Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtX2VudHJ5LT5uYW1lICE9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KC0xKSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbV9ub2RlID0gbV9ub2RlLT5uZXh0OworICAgICAgICAgICAgICAgIG1fZW50cnkgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBOb2RlICAgICAgICAgICAgICAgICptX25vZGU7CisgICAgICAgIGNvbnN0IFRhYmxlOjpFbnRyeSAgKm1fZW50cnk7CisgICAgfTsKKworICAgIEl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeworICAgICAgICByZXR1cm4gSXRlcmF0b3IobV9oZWFkKTsKKyAgICB9CisKKyAgICBJdGVyYXRvciBlbmQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBJdGVyYXRvcigpOworICAgIH0KKworcHVibGljOgorICAgIC8vIEVudHJ5IHJlcHJlc2VudGF0aW9uIGluIGEgY29weSBidWZmZXIKKyAgICBzdHJ1Y3QgQnVmRW50cnkgeworICAgICAgICBpbnRwdHJfdCBuYW1lOworICAgICAgICBpbnRwdHJfdCBhZGRyOworICAgIH07CisKKyAgICAvLyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgdGFibGUgYW5kCisgICAgLy8gcmV0dXJucyB0aGUgc2l6ZSBvZiBidWZmZXIgZm9yIHRoZSB0YWJsZQorICAgIGludDY0X3QgdGFibGVfc2l6ZShpbnQ2NF90ICZuZWxlbXMpOworCisgICAgLy8gQ29weSB0YWJsZSBjb250ZW50cyB0byBnaXZlbiBidWZmZXIuIEl0IGlzIHN1cHBvc2VkIHRvIGJlIGxhcmdlCisgICAgLy8gZW5vdWdoIHRvIGhvbGQgYWxsIGVsZW1lbnRzIGFzIHN0cmluZyB0YWJsZS4KKyAgICB2b2lkIHRhYmxlX2NvcHkodm9pZCAqYnVmLCBpbnQ2NF90IG5lbGVtcyk7CisKKyAgICAvLyBQYXRjaCBuYW1lIG9mZnNldHMgaW4gYSB0YWJsZSBhZnRlciBpdCdzIGJlZW4gY29waWVkIHRvIG90aGVyIHNpZGUKKyAgICBzdGF0aWMgdm9pZCB0YWJsZV9wYXRjaF9uYW1lcyh2b2lkICpidWYsIGludDY0X3QgbmVsZW1zKTsKK307CisKK2V4dGVybiBGdW5jTGlzdCBfX29mZmxvYWRfZW50cmllczsKK2V4dGVybiBGdW5jTGlzdCBfX29mZmxvYWRfZnVuY3M7CitleHRlcm4gVmFyTGlzdCAgX19vZmZsb2FkX3ZhcnM7CisKKy8vIFNlY3Rpb24gbmFtZXMgd2hlcmUgdGhlIGxvb2t1cCB0YWJsZXMgYXJlIHN0b3JlZAorI2lmZGVmIFRBUkdFVF9XSU5OVAorI2RlZmluZSBPRkZMT0FEX0VOVFJZX1RBQkxFX1NFQ1RJT05fU1RBUlQgICAiLk9mZmxvYWRFbnRyeVRhYmxlJGEiCisjZGVmaW5lIE9GRkxPQURfRU5UUllfVEFCTEVfU0VDVElPTl9FTkQgICAgICIuT2ZmbG9hZEVudHJ5VGFibGUkeiIKKworI2RlZmluZSBPRkZMT0FEX0ZVTkNfVEFCTEVfU0VDVElPTl9TVEFSVCAgICAiLk9mZmxvYWRGdW5jVGFibGUkYSIKKyNkZWZpbmUgT0ZGTE9BRF9GVU5DX1RBQkxFX1NFQ1RJT05fRU5EICAgICAgIi5PZmZsb2FkRnVuY1RhYmxlJHoiCisKKyNkZWZpbmUgT0ZGTE9BRF9WQVJfVEFCTEVfU0VDVElPTl9TVEFSVCAgICAgIi5PZmZsb2FkVmFyVGFibGUkYSIKKyNkZWZpbmUgT0ZGTE9BRF9WQVJfVEFCTEVfU0VDVElPTl9FTkQgICAgICAgIi5PZmZsb2FkVmFyVGFibGUkeiIKKworI2RlZmluZSBPRkZMT0FEX0NSVElOSVRfU0VDVElPTl9TVEFSVCAgICAgICAiLkNSVCRYQ1QiCisKKyNwcmFnbWEgc2VjdGlvbihPRkZMT0FEX0NSVElOSVRfU0VDVElPTl9TVEFSVCwgcmVhZCkKKworI2Vsc2UgIC8vIFRBUkdFVF9XSU5OVAorCisjZGVmaW5lIE9GRkxPQURfRU5UUllfVEFCTEVfU0VDVElPTl9TVEFSVCAgICIuT2ZmbG9hZEVudHJ5VGFibGUuIgorI2RlZmluZSBPRkZMT0FEX0VOVFJZX1RBQkxFX1NFQ1RJT05fRU5EICAgICAiLk9mZmxvYWRFbnRyeVRhYmxlLiIKKworI2RlZmluZSBPRkZMT0FEX0ZVTkNfVEFCTEVfU0VDVElPTl9TVEFSVCAgICAiLk9mZmxvYWRGdW5jVGFibGUuIgorI2RlZmluZSBPRkZMT0FEX0ZVTkNfVEFCTEVfU0VDVElPTl9FTkQgICAgICAiLk9mZmxvYWRGdW5jVGFibGUuIgorCisjZGVmaW5lIE9GRkxPQURfVkFSX1RBQkxFX1NFQ1RJT05fU1RBUlQgICAgICIuT2ZmbG9hZFZhclRhYmxlLiIKKyNkZWZpbmUgT0ZGTE9BRF9WQVJfVEFCTEVfU0VDVElPTl9FTkQgICAgICAgIi5PZmZsb2FkVmFyVGFibGUuIgorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisjcHJhZ21hIHNlY3Rpb24oT0ZGTE9BRF9FTlRSWV9UQUJMRV9TRUNUSU9OX1NUQVJULCByZWFkLCB3cml0ZSkKKyNwcmFnbWEgc2VjdGlvbihPRkZMT0FEX0VOVFJZX1RBQkxFX1NFQ1RJT05fRU5ELCByZWFkLCB3cml0ZSkKKworI3ByYWdtYSBzZWN0aW9uKE9GRkxPQURfRlVOQ19UQUJMRV9TRUNUSU9OX1NUQVJULCByZWFkLCB3cml0ZSkKKyNwcmFnbWEgc2VjdGlvbihPRkZMT0FEX0ZVTkNfVEFCTEVfU0VDVElPTl9FTkQsIHJlYWQsIHdyaXRlKQorCisjcHJhZ21hIHNlY3Rpb24oT0ZGTE9BRF9WQVJfVEFCTEVfU0VDVElPTl9TVEFSVCwgcmVhZCwgd3JpdGUpCisjcHJhZ21hIHNlY3Rpb24oT0ZGTE9BRF9WQVJfVEFCTEVfU0VDVElPTl9FTkQsIHJlYWQsIHdyaXRlKQorCisKKy8vIHJlZ2lzdGVyL3VucmVnaXN0ZXIgZ2l2ZW4gdGFibGVzCitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX3JlZ2lzdGVyX3RhYmxlcygKKyAgICBGdW5jTGlzdDo6Tm9kZSAqZW50cnlfdGFibGUsCisgICAgRnVuY0xpc3Q6Ok5vZGUgKmZ1bmNfdGFibGUsCisgICAgVmFyTGlzdDo6Tm9kZSAqdmFyX3RhYmxlCispOworCitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX3VucmVnaXN0ZXJfdGFibGVzKAorICAgIEZ1bmNMaXN0OjpOb2RlICplbnRyeV90YWJsZSwKKyAgICBGdW5jTGlzdDo6Tm9kZSAqZnVuY190YWJsZSwKKyAgICBWYXJMaXN0OjpOb2RlICp2YXJfdGFibGUKKyk7CisjZW5kaWYgIC8vIE9GRkxPQURfVEFCTEVfSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90YXJnZXQuY3BwIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90YXJnZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmYzFiMDQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3RhcmdldC5jcHAKQEAgLTAsMCArMSw3NTQgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgIm9mZmxvYWRfdGFyZ2V0LmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaWZkZWYgU0VQX1NVUFBPUlQKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2VuZGlmIC8vIFNFUF9TVVBQT1JUCisjaW5jbHVkZSA8b21wLmg+CisjaW5jbHVkZSA8bWFwPgorCisvLyB0eXBlZGVmIG9mZmxvYWRfZnVuY193aXRoX3Bhcm1zLgorLy8gUG9pbnRlciB0byBmdW5jdGlvbiB0aGF0IHJlcHJlc2VudHMgYW4gb2ZmbG9hZGVkIGVudHJ5IHBvaW50LgorLy8gVGhlIHBhcmFtZXRlcnMgYXJlIGEgdGVtcG9yYXJ5IGZpeCBmb3IgcGFyYW1ldGVycyBvbiB0aGUgc3RhY2suCit0eXBlZGVmIHZvaWQgKCpvZmZsb2FkX2Z1bmNfd2l0aF9wYXJtcykodm9pZCAqKTsKKworLy8gVGFyZ2V0IGNvbnNvbGUgYW5kIGZpbGUgbG9nZ2luZworY29uc3QgY2hhciAqcHJlZml4OworaW50IGNvbnNvbGVfZW5hYmxlZCA9IDA7CitpbnQgb2ZmbG9hZF9yZXBvcnRfbGV2ZWwgPSAwOworCisvLyBUcmFjZSBpbmZvcm1hdGlvbgorc3RhdGljIGNvbnN0IGNoYXIqIHZhcmRlc2NfZGlyZWN0aW9uX2FzX3N0cmluZ1tdID0geworICAgICJOT0NPUFkiLAorICAgICJJTiIsCisgICAgIk9VVCIsCisgICAgIklOT1VUIgorfTsKK3N0YXRpYyBjb25zdCBjaGFyKiB2YXJkZXNjX3R5cGVfYXNfc3RyaW5nW10gPSB7CisgICAgInVua25vd24iLAorICAgICJkYXRhIiwKKyAgICAiZGF0YV9wdHIiLAorICAgICJmdW5jX3B0ciIsCisgICAgInZvaWRfcHRyIiwKKyAgICAic3RyaW5nX3B0ciIsCisgICAgImR2IiwKKyAgICAiZHZfZGF0YSIsCisgICAgImR2X2RhdGFfc2xpY2UiLAorICAgICJkdl9wdHIiLAorICAgICJkdl9wdHJfZGF0YSIsCisgICAgImR2X3B0cl9kYXRhX3NsaWNlIiwKKyAgICAiY2Vhbl92YXIiLAorICAgICJjZWFuX3Zhcl9wdHIiLAorICAgICJjX2RhdGFfcHRyX2FycmF5IgorfTsKKworaW50IG1pY19pbmRleCA9IC0xOworaW50IG1pY19lbmdpbmVzX3RvdGFsID0gLTE7Cit1aW50NjRfdCBtaWNfZnJlcXVlbmN5ID0gMDsKK2ludCBvZmZsb2FkX251bWJlciA9IDA7CitzdGF0aWMgc3RkOjptYXA8dm9pZCosIFJlZkluZm8qPiByZWZfZGF0YTsKK3N0YXRpYyBtdXRleF90IGFkZF9yZWZfbG9jazsKKworI2lmZGVmIFNFUF9TVVBQT1JUCitzdGF0aWMgY29uc3QgY2hhciogIHNlcF9tb25pdG9yX2VudiA9ICJTRVBfTU9OSVRPUiI7CitzdGF0aWMgYm9vbCAgICAgICAgIHNlcF9tb25pdG9yID0gZmFsc2U7CitzdGF0aWMgY29uc3QgY2hhciogIHNlcF9kZXZpY2VfZW52ID0gIlNFUF9ERVZJQ0UiOworc3RhdGljIGNvbnN0IGNoYXIqICBzZXBfZGV2aWNlID0gICIvZGV2L3NlcDMuOC9jIjsKK3N0YXRpYyBpbnQgICAgICAgICAgc2VwX2NvdW50ZXIgPSAwOworCisjZGVmaW5lIFNFUF9BUElfSU9DX01BR0lDICAgOTkKKyNkZWZpbmUgU0VQX0lPQ1RMX1BBVVNFICAgICBfSU8gKFNFUF9BUElfSU9DX01BR0lDLCAzMSkKKyNkZWZpbmUgU0VQX0lPQ1RMX1JFU1VNRSAgICBfSU8gKFNFUF9BUElfSU9DX01BR0lDLCAzMikKKworc3RhdGljIHZvaWQgYWRkX3JlZl9jb3VudCh2b2lkICogYnVmLCBib29sIGNyZWF0ZWQpCit7CisgICAgbXV0ZXhfbG9ja2VyX3QgbG9ja2VyKGFkZF9yZWZfbG9jayk7CisgICAgUmVmSW5mbyAqIGluZm8gPSByZWZfZGF0YVtidWZdOworCisgICAgaWYgKGluZm8pIHsKKyAgICAgICAgaW5mby0+Y291bnQrKzsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGluZm8gPSBuZXcgUmVmSW5mbygoaW50KWNyZWF0ZWQsKGxvbmcpMSk7CisgICAgfQorICAgIGluZm8tPmlzX2FkZGVkIHw9IGNyZWF0ZWQ7CisgICAgcmVmX2RhdGFbYnVmXSA9IGluZm87Cit9CisKK3N0YXRpYyB2b2lkIEJ1ZlJlbGVhc2VSZWYodm9pZCAqIGJ1ZikKK3sKKyAgICBtdXRleF9sb2NrZXJfdCBsb2NrZXIoYWRkX3JlZl9sb2NrKTsKKyAgICBSZWZJbmZvICogaW5mbyA9IHJlZl9kYXRhW2J1Zl07CisKKyAgICBpZiAoaW5mbykgeworICAgICAgICAtLWluZm8tPmNvdW50OworICAgICAgICBpZiAoaW5mby0+Y291bnQgPT0gMCAmJiBpbmZvLT5pc19hZGRlZCkgeworICAgICAgICAgICAgQnVmZmVyUmVsZWFzZVJlZihidWYpOworICAgICAgICAgICAgaW5mby0+aXNfYWRkZWQgPSAwOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW50IFZUUGF1c2VTYW1wbGluZyh2b2lkKQoreworICAgIGludCByZXQgPSAtMTsKKyAgICBpbnQgaGFuZGxlID0gb3BlbihzZXBfZGV2aWNlLCBPX1JEV1IpOworICAgIGlmIChoYW5kbGUgPiAwKSB7CisgICAgICAgIHJldCA9IGlvY3RsKGhhbmRsZSwgU0VQX0lPQ1RMX1BBVVNFKTsKKyAgICAgICAgY2xvc2UoaGFuZGxlKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBWVFJlc3VtZVNhbXBsaW5nKHZvaWQpCit7CisgICAgaW50IHJldCA9IC0xOworICAgIGludCBoYW5kbGUgPSBvcGVuKHNlcF9kZXZpY2UsIE9fUkRXUik7CisgICAgaWYgKGhhbmRsZSA+IDApIHsKKyAgICAgICAgcmV0ID0gaW9jdGwoaGFuZGxlLCBTRVBfSU9DVExfUkVTVU1FKTsKKyAgICAgICAgY2xvc2UoaGFuZGxlKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKyNlbmRpZiAvLyBTRVBfU1VQUE9SVAorCit2b2lkIE9mZmxvYWREZXNjcmlwdG9yOjpvZmZsb2FkKAorICAgIHVpbnQzMl90ICBidWZmZXJfY291bnQsCisgICAgdm9pZCoqICAgIGJ1ZmZlcnMsCisgICAgdm9pZCogICAgIG1pc2NfZGF0YSwKKyAgICB1aW50MTZfdCAgbWlzY19kYXRhX2xlbiwKKyAgICB2b2lkKiAgICAgcmV0dXJuX2RhdGEsCisgICAgdWludDE2X3QgIHJldHVybl9kYXRhX2xlbgorKQoreworICAgIEZ1bmN0aW9uRGVzY3JpcHRvciAqZnVuYyA9IChGdW5jdGlvbkRlc2NyaXB0b3IqKSBtaXNjX2RhdGE7CisgICAgY29uc3QgY2hhciAqbmFtZSA9IGZ1bmMtPmRhdGE7CisgICAgT2ZmbG9hZERlc2NyaXB0b3Igb2ZsZDsKKyAgICBjaGFyICppbl9kYXRhID0gMDsKKyAgICBjaGFyICpvdXRfZGF0YSA9IDA7CisgICAgY2hhciAqdGltZXJfZGF0YSA9IDA7CisKKyAgICBjb25zb2xlX2VuYWJsZWQgPSBmdW5jLT5jb25zb2xlX2VuYWJsZWQ7CisgICAgdGltZXJfZW5hYmxlZCA9IGZ1bmMtPnRpbWVyX2VuYWJsZWQ7CisgICAgb2ZmbG9hZF9yZXBvcnRfbGV2ZWwgPSBmdW5jLT5vZmZsb2FkX3JlcG9ydF9sZXZlbDsKKyAgICBvZmZsb2FkX251bWJlciA9IGZ1bmMtPm9mZmxvYWRfbnVtYmVyOworICAgIG9mbGQuc2V0X29mZmxvYWRfbnVtYmVyKGZ1bmMtPm9mZmxvYWRfbnVtYmVyKTsKKworI2lmZGVmIFNFUF9TVVBQT1JUCisgICAgaWYgKHNlcF9tb25pdG9yKSB7CisgICAgICAgIGlmIChfX3N5bmNfZmV0Y2hfYW5kX2FkZCgmc2VwX2NvdW50ZXIsIDEpID09IDApIHsKKyAgICAgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIlZUUmVzdW1lU2FtcGxpbmdcbiIpOworICAgICAgICAgICAgVlRSZXN1bWVTYW1wbGluZygpOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8vIFNFUF9TVVBQT1JUCisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoMiwgb2ZsZC5nZXRfb2ZmbG9hZF9udW1iZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY19vZmZsb2FkX3N0YXJ0X3RhcmdldF9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiT2ZmbG9hZCBcIiVzXCIgc3RhcnRlZFxuIiwgbmFtZSk7CisKKyAgICAvLyBpbml0aWFsaXplIHRpbWVyIGRhdGEKKyAgICBPRkZMT0FEX1RJTUVSX0lOSVQoKTsKKworICAgIE9GRkxPQURfVElNRVJfU1RBUlQoY19vZmZsb2FkX3RhcmdldF90b3RhbF90aW1lKTsKKworICAgIE9GRkxPQURfVElNRVJfU1RBUlQoY19vZmZsb2FkX3RhcmdldF9kZXNjcmlwdG9yX3NldHVwKTsKKworICAgIC8vIGdldCBpbnB1dC9vdXRwdXQgYnVmZmVyIGFkZHJlc3NlcworICAgIGlmIChmdW5jLT5pbl9kYXRhbGVuID4gMCB8fCBmdW5jLT5vdXRfZGF0YWxlbiA+IDApIHsKKyAgICAgICAgaWYgKGZ1bmMtPmRhdGFfb2Zmc2V0ICE9IDApIHsKKyAgICAgICAgICAgIGluX2RhdGEgPSAoY2hhciopIG1pc2NfZGF0YSArIGZ1bmMtPmRhdGFfb2Zmc2V0OworICAgICAgICAgICAgb3V0X2RhdGEgPSAoY2hhciopIHJldHVybl9kYXRhOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY2hhciAqaW5vdXRfYnVmID0gKGNoYXIqKSBidWZmZXJzWy0tYnVmZmVyX2NvdW50XTsKKyAgICAgICAgICAgIGluX2RhdGEgPSBpbm91dF9idWY7CisgICAgICAgICAgICBvdXRfZGF0YSA9IGlub3V0X2J1ZjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGFzc2lnbiB2YXJpYWJsZSBkZXNjcmlwdG9ycworICAgIG9mbGQubV92YXJzX3RvdGFsID0gZnVuYy0+dmFyc19udW07CisgICAgaWYgKG9mbGQubV92YXJzX3RvdGFsID4gMCkgeworICAgICAgICB1aW50NjRfdCB2YXJfZGF0YV9sZW4gPSBvZmxkLm1fdmFyc190b3RhbCAqIHNpemVvZihWYXJEZXNjKTsKKworICAgICAgICBvZmxkLm1fdmFycyA9IChWYXJEZXNjKikgbWFsbG9jKHZhcl9kYXRhX2xlbik7CisgICAgICAgIG1lbWNweShvZmxkLm1fdmFycywgaW5fZGF0YSwgdmFyX2RhdGFfbGVuKTsKKworICAgICAgICBpbl9kYXRhICs9IHZhcl9kYXRhX2xlbjsKKyAgICAgICAgZnVuYy0+aW5fZGF0YWxlbiAtPSB2YXJfZGF0YV9sZW47CisgICAgfQorCisgICAgLy8gdGltZXIgZGF0YQorICAgIGlmIChmdW5jLT50aW1lcl9lbmFibGVkKSB7CisgICAgICAgIHVpbnQ2NF90IHRpbWVyX2RhdGFfbGVuID0gT0ZGTE9BRF9USU1FUl9EQVRBTEVOKCk7CisKKyAgICAgICAgdGltZXJfZGF0YSA9IG91dF9kYXRhOworICAgICAgICBvdXRfZGF0YSArPSB0aW1lcl9kYXRhX2xlbjsKKyAgICAgICAgZnVuYy0+b3V0X2RhdGFsZW4gLT0gdGltZXJfZGF0YV9sZW47CisgICAgfQorCisgICAgLy8gaW5pdCBNYXJzaGFsbGVycworICAgIG9mbGQubV9pbi5pbml0X2J1ZmZlcihpbl9kYXRhLCBmdW5jLT5pbl9kYXRhbGVuKTsKKyAgICBvZmxkLm1fb3V0LmluaXRfYnVmZmVyKG91dF9kYXRhLCBmdW5jLT5vdXRfZGF0YWxlbik7CisKKyAgICAvLyBjb3B5IGJ1ZmZlcnMgdG8gb2ZmbG9hZCBkZXNjcmlwdG9yCisgICAgc3RkOjpjb3B5KGJ1ZmZlcnMsIGJ1ZmZlcnMgKyBidWZmZXJfY291bnQsCisgICAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcihvZmxkLm1fYnVmZmVycykpOworCisgICAgT0ZGTE9BRF9USU1FUl9TVE9QKGNfb2ZmbG9hZF90YXJnZXRfZGVzY3JpcHRvcl9zZXR1cCk7CisKKyAgICAvLyBmaW5kIG9mZmxvYWQgZW50cnkgYWRkcmVzcworICAgIE9GRkxPQURfVElNRVJfU1RBUlQoY19vZmZsb2FkX3RhcmdldF9mdW5jX2xvb2t1cCk7CisKKyAgICBvZmZsb2FkX2Z1bmNfd2l0aF9wYXJtcyBlbnRyeSA9IChvZmZsb2FkX2Z1bmNfd2l0aF9wYXJtcykKKyAgICAgICAgX19vZmZsb2FkX2VudHJpZXMuZmluZF9hZGRyKG5hbWUpOworCisgICAgaWYgKGVudHJ5ID09IE5VTEwpIHsKKyNpZiBPRkZMT0FEX0RFQlVHID4gMAorICAgICAgICBpZiAoY29uc29sZV9lbmFibGVkID4gMikgeworICAgICAgICAgICAgX19vZmZsb2FkX2VudHJpZXMuZHVtcCgpOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX29mZmxvYWRfZGVzY3JpcHRvcl9vZmZsb2FkLCBuYW1lKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICBPRkZMT0FEX1RJTUVSX1NUT1AoY19vZmZsb2FkX3RhcmdldF9mdW5jX2xvb2t1cCk7CisKKyAgICBPRkZMT0FEX1RJTUVSX1NUQVJUKGNfb2ZmbG9hZF90YXJnZXRfZnVuY190aW1lKTsKKworICAgIC8vIGV4ZWN1dGUgb2ZmbG9hZCBlbnRyeQorICAgIGVudHJ5KCZvZmxkKTsKKworICAgIE9GRkxPQURfVElNRVJfU1RPUChjX29mZmxvYWRfdGFyZ2V0X2Z1bmNfdGltZSk7CisKKyAgICBPRkZMT0FEX1RJTUVSX1NUT1AoY19vZmZsb2FkX3RhcmdldF90b3RhbF90aW1lKTsKKworICAgIC8vIGNvcHkgdGltZXIgZGF0YSB0byB0aGUgYnVmZmVyCisgICAgT0ZGTE9BRF9USU1FUl9UQVJHRVRfREFUQSh0aW1lcl9kYXRhKTsKKworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIk9mZmxvYWQgXCIlc1wiIGZpbmlzaGVkXG4iLCBuYW1lKTsKKworI2lmZGVmIFNFUF9TVVBQT1JUCisgICAgaWYgKHNlcF9tb25pdG9yKSB7CisgICAgICAgIGlmIChfX3N5bmNfc3ViX2FuZF9mZXRjaCgmc2VwX2NvdW50ZXIsIDEpID09IDApIHsKKyAgICAgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIlZUUGF1c2VTYW1wbGluZ1xuIik7CisgICAgICAgICAgICBWVFBhdXNlU2FtcGxpbmcoKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvLyBTRVBfU1VQUE9SVAorfQorCit2b2lkIE9mZmxvYWREZXNjcmlwdG9yOjptZXJnZV92YXJfZGVzY3MoCisgICAgVmFyRGVzYyAqdmFycywKKyAgICBWYXJEZXNjMiAqdmFyczIsCisgICAgaW50IHZhcnNfdG90YWwKKykKK3sKKyAgICAvLyBudW1iZXIgb2YgdmFyaWFibGUgZGVzY3JpcHRvcnMgcmVjZWl2ZWQgZnJvbSBob3N0IGFuZCBnZW5lcmF0ZWQKKyAgICAvLyBsb2NhbGx5IHNob3VsZCBtYXRjaAorICAgIGlmIChtX3ZhcnNfdG90YWwgPCB2YXJzX3RvdGFsKSB7CisgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19tZXJnZV92YXJfZGVzY3MxKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fdmFyc190b3RhbDsgaSsrKSB7CisgICAgICAgIGlmIChpIDwgdmFyc190b3RhbCkgeworICAgICAgICAgICAgLy8gdmFyaWFibGUgdHlwZSBtdXN0IG1hdGNoCisgICAgICAgICAgICBpZiAobV92YXJzW2ldLnR5cGUuYml0cyAhPSB2YXJzW2ldLnR5cGUuYml0cykgeworICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19tZXJnZV92YXJfZGVzY3MyKTsKKyAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtX3ZhcnNbaV0ucHRyID0gdmFyc1tpXS5wdHI7CisgICAgICAgICAgICBtX3ZhcnNbaV0uaW50byA9IHZhcnNbaV0uaW50bzsKKworICAgICAgICAgICAgY29uc3QgY2hhciAqdmFyX3NuYW1lID0gIiI7CisgICAgICAgICAgICBpZiAodmFyczIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmICh2YXJzMltpXS5zbmFtZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHZhcl9zbmFtZSA9IHZhcnMyW2ldLnNuYW1lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSgyLCBnZXRfb2ZmbG9hZF9udW1iZXIoKSwgY19vZmZsb2FkX3ZhciwKKyAgICAgICAgICAgICAgICAiICAgVmFyRGVzYyAlZCwgdmFyPSVzLCAlcywgJXNcbiIsCisgICAgICAgICAgICAgICAgaSwgdmFyX3NuYW1lLAorICAgICAgICAgICAgICAgIHZhcmRlc2NfZGlyZWN0aW9uX2FzX3N0cmluZ1ttX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHNdLAorICAgICAgICAgICAgICAgIHZhcmRlc2NfdHlwZV9hc19zdHJpbmdbbV92YXJzW2ldLnR5cGUuc3JjXSk7CisgICAgICAgICAgICBpZiAodmFyczIgIT0gTlVMTCAmJiB2YXJzMltpXS5kbmFtZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgT0ZGTE9BRF9UUkFDRSgyLCAiICAgICAgICAgICAgICBpbnRvPSVzLCAlc1xuIiwgdmFyczJbaV0uZG5hbWUsCisgICAgICAgICAgICAgICAgICAgIHZhcmRlc2NfdHlwZV9hc19zdHJpbmdbbV92YXJzW2ldLnR5cGUuZHN0XSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgT0ZGTE9BRF9UUkFDRSgyLAorICAgICAgICAgICAgIiAgICAgICAgICAgICAgdHlwZV9zcmM9JWQsIHR5cGVfZHN0bj0lZCwgZGlyZWN0aW9uPSVkLCAiCisgICAgICAgICAgICAiYWxsb2NfaWY9JWQsIGZyZWVfaWY9JWQsIGFsaWduPSVkLCBtaWNfb2Zmc2V0PSVkLCBmbGFncz0weCV4LCAiCisgICAgICAgICAgICAib2Zmc2V0PSVsbGQsIHNpemU9JWxsZCwgY291bnQvZGlzcD0lbGxkLCBwdHI9JXAgaW50bz0lcFxuIiwKKyAgICAgICAgICAgIG1fdmFyc1tpXS50eXBlLnNyYywKKyAgICAgICAgICAgIG1fdmFyc1tpXS50eXBlLmRzdCwKKyAgICAgICAgICAgIG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cywKKyAgICAgICAgICAgIG1fdmFyc1tpXS5hbGxvY19pZiwKKyAgICAgICAgICAgIG1fdmFyc1tpXS5mcmVlX2lmLAorICAgICAgICAgICAgbV92YXJzW2ldLmFsaWduLAorICAgICAgICAgICAgbV92YXJzW2ldLm1pY19vZmZzZXQsCisgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuYml0cywKKyAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQsCisgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSwKKyAgICAgICAgICAgIG1fdmFyc1tpXS5jb3VudCwKKyAgICAgICAgICAgIG1fdmFyc1tpXS5wdHIsCisgICAgICAgICAgICBtX3ZhcnNbaV0uaW50byk7CisgICAgfQorfQorCit2b2lkIE9mZmxvYWREZXNjcmlwdG9yOjpzY2F0dGVyX2NvcHlpbl9kYXRhKCkKK3sKKyAgICBPRkZMT0FEX1RJTUVSX1NUQVJUKGNfb2ZmbG9hZF90YXJnZXRfc2NhdHRlcl9pbnB1dHMpOworCisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiSU4gIGJ1ZmZlciBAICVwIHNpemUgJWxsZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1faW4uZ2V0X2J1ZmZlcl9zdGFydCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbV9pbi5nZXRfYnVmZmVyX3NpemUoKSk7CisgICAgT0ZGTE9BRF9ERUJVR19EVU1QX0JZVEVTKDIsIG1faW4uZ2V0X2J1ZmZlcl9zdGFydCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luLmdldF9idWZmZXJfc2l6ZSgpKTsKKworICAgIC8vIHJlY2VpdmUgZGF0YQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV92YXJzX3RvdGFsOyBpKyspIHsKKyAgICAgICAgYm9vbCBzcmNfaXNfZm9yX21pYyA9IChtX3ZhcnNbaV0uZGlyZWN0aW9uLm91dCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5pbnRvID09IE5VTEwpOworICAgICAgICB2b2lkKiogcHRyX2FkZHIgPSBzcmNfaXNfZm9yX21pYyA/CisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHZvaWQqKj4obV92YXJzW2ldLnB0cikgOgorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx2b2lkKio+KG1fdmFyc1tpXS5pbnRvKTsKKyAgICAgICAgaW50IHR5cGUgPSBzcmNfaXNfZm9yX21pYyA/IG1fdmFyc1tpXS50eXBlLnNyYyA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0udHlwZS5kc3Q7CisgICAgICAgIGJvb2wgaXNfc3RhdGljID0gc3JjX2lzX2Zvcl9taWMgPworICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWMgOgorICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWNfZHN0bjsKKyAgICAgICAgdm9pZCAqcHRyID0gTlVMTDsKKworICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmFsbG9jX2Rpc3ApIHsKKyAgICAgICAgICAgIGludDY0X3Qgb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIG1faW4ucmVjZWl2ZV9kYXRhKCZvZmZzZXQsIHNpemVvZihvZmZzZXQpKTsKKyAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgPSAtb2Zmc2V0OworICAgICAgICB9CisgICAgICAgIGlmIChWQVJfVFlQRV9JU19EVl9EQVRBX1NMSUNFKHR5cGUpIHx8CisgICAgICAgICAgICBWQVJfVFlQRV9JU19EVl9EQVRBKHR5cGUpKSB7CisgICAgICAgICAgICBBcnJEZXNjICpkdnAgPSAodHlwZSA9PSBjX2R2X2RhdGFfc2xpY2UgfHwgdHlwZSA9PSBjX2R2X2RhdGEpPworICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxBcnJEZXNjKj4ocHRyX2FkZHIpIDoKKyAgICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PEFyckRlc2MqKj4ocHRyX2FkZHIpOworICAgICAgICAgICAgcHRyX2FkZHIgPSByZWludGVycHJldF9jYXN0PHZvaWQqKj4oJmR2cC0+QmFzZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTZXQgcG9pbnRlciB2YWx1ZXMKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICBjYXNlIGNfZGF0YV9wdHJfYXJyYXk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgaiA9IG1fdmFyc1tpXS5wdHJfYXJyX29mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgaW50IG1heF9lbCA9IGogKyBtX3ZhcnNbaV0uY291bnQ7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgKmRzdF9hcnJfcHRyID0gKHNyY19pc19mb3JfbWljKT8KKyAgICAgICAgICAgICAgICAgICAgICAgICoocmVpbnRlcnByZXRfY2FzdDxjaGFyKio+KG1fdmFyc1tpXS5wdHIpKSA6CisgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIqPihtX3ZhcnNbaV0uaW50byk7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yICg7IGogPCBtYXhfZWw7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19pc19mb3JfbWljKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2pdLnB0ciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9hcnJfcHRyICsgbV92YXJzW2pdLnB0cl9hcnJfb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2pdLmludG8gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfYXJyX3B0ciArIG1fdmFyc1tqXS5wdHJfYXJyX29mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgY19kYXRhOgorICAgICAgICAgICAgY2FzZSBjX3ZvaWRfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2NlYW5fdmFyOgorICAgICAgICAgICAgY2FzZSBjX2R2OgorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGNfc3RyaW5nX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19kYXRhX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19jZWFuX3Zhcl9wdHI6CisgICAgICAgICAgICBjYXNlIGNfZHZfcHRyOgorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uYWxsb2NfaWYpIHsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmOworICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkcikgeworICAgICAgICAgICAgICAgICAgICAgICAgbV9pbi5yZWNlaXZlX2RhdGEoJmJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVmID0gbV9idWZmZXJzLmZyb250KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2J1ZmZlcnMucG9wX2Zyb250KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZikgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc19zdGF0aWMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1fdmFyc1tpXS5mbGFncy5zaW5rX2FkZHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5jcmVtZW50IGJ1ZmZlciByZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGTE9BRF9USU1FUl9TVEFSVChjX29mZmxvYWRfdGFyZ2V0X2FkZF9idWZmZXJfcmVmcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlckFkZFJlZihidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RJTUVSX1NUT1AoY19vZmZsb2FkX3RhcmdldF9hZGRfYnVmZmVyX3JlZnMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfcmVmX2NvdW50KGJ1ZiwgMCA9PSBtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHB0ciA9IHN0YXRpY19jYXN0PGNoYXIqPihidWYpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1fdmFyc1tpXS5mbGFncy5pc19zdGFja19idWYgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIDogbV92YXJzW2ldLm9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKnB0cl9hZGRyID0gcHRyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyKSB7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgbV9pbi5yZWNlaXZlX2RhdGEoJmJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgICAgICAgICAgICAgICAgICB2b2lkICpwdHIgPSBzdGF0aWNfY2FzdDxjaGFyKj4oYnVmKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobV92YXJzW2ldLmZsYWdzLmlzX3N0YWNrX2J1ZiA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA6IG1fdmFyc1tpXS5vZmZzZXQpOworICAgICAgICAgICAgICAgICAgICAqcHRyX2FkZHIgPSBwdHI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGNfZnVuY19wdHI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY19kdl9kYXRhOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cl9kYXRhOgorICAgICAgICAgICAgY2FzZSBjX2R2X2RhdGFfc2xpY2U6CisgICAgICAgICAgICBjYXNlIGNfZHZfcHRyX2RhdGFfc2xpY2U6CisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5hbGxvY19pZikgeworICAgICAgICAgICAgICAgICAgICB2b2lkICpidWY7CisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2luLnJlY2VpdmVfZGF0YSgmYnVmLCBzaXplb2YoYnVmKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBidWYgPSBtX2J1ZmZlcnMuZnJvbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fYnVmZmVycy5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoYnVmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzX3N0YXRpYykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmNyZW1lbnQgYnVmZmVyIHJlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RJTUVSX1NUQVJUKGNfb2ZmbG9hZF90YXJnZXRfYWRkX2J1ZmZlcl9yZWZzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyQWRkUmVmKGJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVElNRVJfU1RPUChjX29mZmxvYWRfdGFyZ2V0X2FkZF9idWZmZXJfcmVmcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9yZWZfY291bnQoYnVmLCAwID09IG1fdmFyc1tpXS5mbGFncy5zaW5rX2FkZHIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcHRyID0gc3RhdGljX2Nhc3Q8Y2hhcio+KGJ1ZikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0ICsgbV92YXJzW2ldLm9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAqcHRyX2FkZHIgPSBwdHI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1fdmFyc1tpXS5mbGFncy5zaW5rX2FkZHIpIHsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmOworICAgICAgICAgICAgICAgICAgICBtX2luLnJlY2VpdmVfZGF0YSgmYnVmLCBzaXplb2YoYnVmKSk7CisgICAgICAgICAgICAgICAgICAgIHB0ciA9IHN0YXRpY19jYXN0PGNoYXIqPihidWYpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm1pY19vZmZzZXQgKyBtX3ZhcnNbaV0ub2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAqcHRyX2FkZHIgPSBwdHI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY191bmtub3duX3Zhcl90eXBlLCB0eXBlKTsKKyAgICAgICAgICAgICAgICBhYm9ydCgpOworICAgICAgICB9CisgICAgICAgIC8vIFJlbGVhc2Ugb2Jzb2xldGUgYnVmZmVycyBmb3Igc3RhY2sgb2YgcGVyc2lzdGVudCBvYmplY3RzCisgICAgICAgIGlmICh0eXBlID0gY19kYXRhX3B0ciAmJgorICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX3N0YWNrX2J1ZiAmJgorICAgICAgICAgICAgIW1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cyAmJgorICAgICAgICAgICAgbV92YXJzW2ldLmFsbG9jX2lmICYmCisgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaj0wOyBqIDwgbV92YXJzW2ldLnNpemU7IGorKykgeworICAgICAgICAgICAgICAgICAgICB2b2lkICpidWY7CisgICAgICAgICAgICAgICAgICAgIG1faW4ucmVjZWl2ZV9kYXRhKCZidWYsIHNpemVvZihidWYpKTsKKyAgICAgICAgICAgICAgICAgICAgQnVmZmVyUmVsZWFzZVJlZihidWYpOworICAgICAgICAgICAgICAgICAgICByZWZfZGF0YS5lcmFzZShidWYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBEbyBjb3B5aW4KKyAgICAgICAgc3dpdGNoIChtX3ZhcnNbaV0udHlwZS5kc3QpIHsKKyAgICAgICAgICAgIGNhc2UgY19kYXRhX3B0cl9hcnJheToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgY19kYXRhOgorICAgICAgICAgICAgY2FzZSBjX3ZvaWRfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2NlYW5fdmFyOgorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmluICYmCisgICAgICAgICAgICAgICAgICAgICFtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljX2RzdG4pIHsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBzaXplOworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGRpc3A7CisgICAgICAgICAgICAgICAgICAgIGNoYXIqIHB0ciA9IG1fdmFyc1tpXS5pbnRvID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNoYXIqPihtX3ZhcnNbaV0uaW50bykgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2hhcio+KG1fdmFyc1tpXS5wdHIpOworICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLnR5cGUuZHN0ID09IGNfY2Vhbl92YXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1faW4ucmVjZWl2ZV9kYXRhKCgmc2l6ZSksIHNpemVvZihpbnQ2NF90KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2luLnJlY2VpdmVfZGF0YSgoJmRpc3ApLCBzaXplb2YoaW50NjRfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IG1fdmFyc1tpXS5zaXplOworICAgICAgICAgICAgICAgICAgICAgICAgZGlzcCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbV9pbi5yZWNlaXZlX2RhdGEocHRyICsgZGlzcCwgc2l6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGNfZHY6CisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cyB8fAorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uYWxsb2NfaWYgfHwKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZyZWVfaWYpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciogcHRyID0gbV92YXJzW2ldLmludG8gPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2hhcio+KG1fdmFyc1tpXS5pbnRvKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjaGFyKj4obV92YXJzW2ldLnB0cik7CisgICAgICAgICAgICAgICAgICAgIG1faW4ucmVjZWl2ZV9kYXRhKHB0ciArIHNpemVvZih1aW50NjRfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplIC0gc2l6ZW9mKHVpbnQ2NF90KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGNfc3RyaW5nX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19kYXRhX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19jZWFuX3Zhcl9wdHI6CisgICAgICAgICAgICBjYXNlIGNfZHZfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2R2X2RhdGE6CisgICAgICAgICAgICBjYXNlIGNfZHZfcHRyX2RhdGE6CisgICAgICAgICAgICBjYXNlIGNfZHZfZGF0YV9zbGljZToKKyAgICAgICAgICAgIGNhc2UgY19kdl9wdHJfZGF0YV9zbGljZToKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX2Z1bmNfcHRyOgorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmluKSB7CisgICAgICAgICAgICAgICAgICAgIG1faW4ucmVjZWl2ZV9mdW5jX3B0cigoY29uc3Qgdm9pZCoqKSBtX3ZhcnNbaV0ucHRyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3Vua25vd25fdmFyX3R5cGUsIG1fdmFyc1tpXS50eXBlLmRzdCk7CisgICAgICAgICAgICAgICAgYWJvcnQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIE9GRkxPQURfVFJBQ0UoMSwgIlRvdGFsIGNvcHlpbiBkYXRhIHJlY2VpdmVkIGZyb20gaG9zdDogWyVsbGRdIGJ5dGVzXG4iLAorICAgICAgICAgICAgICAgICAgbV9pbi5nZXRfdGZyX3NpemUoKSk7CisKKyAgICBPRkZMT0FEX1RJTUVSX1NUT1AoY19vZmZsb2FkX3RhcmdldF9zY2F0dGVyX2lucHV0cyk7CisKKyAgICBPRkZMT0FEX1RJTUVSX1NUQVJUKGNfb2ZmbG9hZF90YXJnZXRfY29tcHV0ZSk7Cit9CisKK3ZvaWQgT2ZmbG9hZERlc2NyaXB0b3I6OmdhdGhlcl9jb3B5b3V0X2RhdGEoKQoreworICAgIE9GRkxPQURfVElNRVJfU1RPUChjX29mZmxvYWRfdGFyZ2V0X2NvbXB1dGUpOworCisgICAgT0ZGTE9BRF9USU1FUl9TVEFSVChjX29mZmxvYWRfdGFyZ2V0X2dhdGhlcl9vdXRwdXRzKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV92YXJzX3RvdGFsOyBpKyspIHsKKyAgICAgICAgYm9vbCBzcmNfaXNfZm9yX21pYyA9IChtX3ZhcnNbaV0uZGlyZWN0aW9uLm91dCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5pbnRvID09IE5VTEwpOworCisgICAgICAgIHN3aXRjaCAobV92YXJzW2ldLnR5cGUuc3JjKSB7CisgICAgICAgICAgICBjYXNlIGNfZGF0YV9wdHJfYXJyYXk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGNfZGF0YToKKyAgICAgICAgICAgIGNhc2UgY192b2lkX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19jZWFuX3ZhcjoKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5vdXQgJiYKKyAgICAgICAgICAgICAgICAgICAgIW1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWMpIHsKKyAgICAgICAgICAgICAgICAgICAgbV9vdXQuc2VuZF9kYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2hhcio+KG1fdmFyc1tpXS5wdHIpICsgbV92YXJzW2ldLmRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGNfZHY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY19zdHJpbmdfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2RhdGFfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2NlYW5fdmFyX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19kdl9wdHI6CisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mcmVlX2lmICYmCisgICAgICAgICAgICAgICAgICAgIHNyY19pc19mb3JfbWljICYmCisgICAgICAgICAgICAgICAgICAgICFtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljKSB7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZiA9ICpzdGF0aWNfY2FzdDxjaGFyKio+KG1fdmFyc1tpXS5wdHIpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhY2tfYnVmPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgOiBtX3ZhcnNbaV0ub2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBkZWNyZW1lbnQgYnVmZmVyIHJlZmVyZW5jZSBjb3VudAorICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RJTUVSX1NUQVJUKGNfb2ZmbG9hZF90YXJnZXRfcmVsZWFzZV9idWZmZXJfcmVmcyk7CisgICAgICAgICAgICAgICAgICAgIEJ1ZlJlbGVhc2VSZWYoYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgT0ZGTE9BRF9USU1FUl9TVE9QKGNfb2ZmbG9hZF90YXJnZXRfcmVsZWFzZV9idWZmZXJfcmVmcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGNfZnVuY19wdHI6CisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24ub3V0KSB7CisgICAgICAgICAgICAgICAgICAgIG1fb3V0LnNlbmRfZnVuY19wdHIoKigodm9pZCoqKSBtX3ZhcnNbaV0ucHRyKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGNfZHZfZGF0YToKKyAgICAgICAgICAgIGNhc2UgY19kdl9wdHJfZGF0YToKKyAgICAgICAgICAgIGNhc2UgY19kdl9kYXRhX3NsaWNlOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cl9kYXRhX3NsaWNlOgorICAgICAgICAgICAgICAgIGlmIChzcmNfaXNfZm9yX21pYyAmJgorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZnJlZV9pZiAmJgorICAgICAgICAgICAgICAgICAgICAhbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpYykgeworICAgICAgICAgICAgICAgICAgICBBcnJEZXNjICpkdnAgPSAobV92YXJzW2ldLnR5cGUuc3JjID09IGNfZHZfZGF0YSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnR5cGUuc3JjID09IGNfZHZfZGF0YV9zbGljZSkgPworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QXJyRGVzYyo+KG1fdmFyc1tpXS5wdHIpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICpzdGF0aWNfY2FzdDxBcnJEZXNjKio+KG1fdmFyc1tpXS5wdHIpOworCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGR2cC0+QmFzZSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQ7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGRlY3JlbWVudCBidWZmZXIgcmVmZXJlbmNlIGNvdW50CisgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVElNRVJfU1RBUlQoY19vZmZsb2FkX3RhcmdldF9yZWxlYXNlX2J1ZmZlcl9yZWZzKTsKKyAgICAgICAgICAgICAgICAgICAgQnVmUmVsZWFzZVJlZihidWYpOworICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RJTUVSX1NUT1AoY19vZmZsb2FkX3RhcmdldF9yZWxlYXNlX2J1ZmZlcl9yZWZzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3Vua25vd25fdmFyX3R5cGUsIG1fdmFyc1tpXS50eXBlLmRzdCk7CisgICAgICAgICAgICAgICAgYWJvcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtX3ZhcnNbaV0uaW50bykgeworICAgICAgICAgICAgc3dpdGNoIChtX3ZhcnNbaV0udHlwZS5kc3QpIHsKKyAgICAgICAgICAgICAgICBjYXNlIGNfZGF0YV9wdHJfYXJyYXk6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgY19kYXRhOgorICAgICAgICAgICAgICAgIGNhc2UgY192b2lkX3B0cjoKKyAgICAgICAgICAgICAgICBjYXNlIGNfY2Vhbl92YXI6CisgICAgICAgICAgICAgICAgY2FzZSBjX2R2OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgY19zdHJpbmdfcHRyOgorICAgICAgICAgICAgICAgIGNhc2UgY19kYXRhX3B0cjoKKyAgICAgICAgICAgICAgICBjYXNlIGNfY2Vhbl92YXJfcHRyOgorICAgICAgICAgICAgICAgIGNhc2UgY19kdl9wdHI6CisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmluICYmCisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZnJlZV9pZiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIW1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWNfZHN0bikgeworICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmID0gKnN0YXRpY19jYXN0PGNoYXIqKj4obV92YXJzW2ldLmludG8pIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhY2tfYnVmPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgOiBtX3ZhcnNbaV0ub2Zmc2V0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWNyZW1lbnQgYnVmZmVyIHJlZmVyZW5jZSBjb3VudAorICAgICAgICAgICAgICAgICAgICAgICAgT0ZGTE9BRF9USU1FUl9TVEFSVCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX29mZmxvYWRfdGFyZ2V0X3JlbGVhc2VfYnVmZmVyX3JlZnMpOworICAgICAgICAgICAgICAgICAgICAgICAgQnVmUmVsZWFzZVJlZihidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgT0ZGTE9BRF9USU1FUl9TVE9QKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfb2ZmbG9hZF90YXJnZXRfcmVsZWFzZV9idWZmZXJfcmVmcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIGNfZnVuY19wdHI6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBjX2R2X2RhdGE6CisgICAgICAgICAgICAgICAgY2FzZSBjX2R2X3B0cl9kYXRhOgorICAgICAgICAgICAgICAgIGNhc2UgY19kdl9kYXRhX3NsaWNlOgorICAgICAgICAgICAgICAgIGNhc2UgY19kdl9wdHJfZGF0YV9zbGljZToKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mcmVlX2lmICYmCisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZGlyZWN0aW9uLmluICYmCisgICAgICAgICAgICAgICAgICAgICAgICAhbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpY19kc3RuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBcnJEZXNjICpkdnAgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtX3ZhcnNbaV0udHlwZS5kc3QgPT0gY19kdl9kYXRhX3NsaWNlIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS50eXBlLmRzdCA9PSBjX2R2X2RhdGEpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBcnJEZXNjKj4obV92YXJzW2ldLmludG8pIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RhdGljX2Nhc3Q8QXJyRGVzYyoqPihtX3ZhcnNbaV0uaW50byk7CisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWYgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihkdnAtPkJhc2UpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidWYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVjcmVtZW50IGJ1ZmZlciByZWZlcmVuY2UgY291bnQKKyAgICAgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVElNRVJfU1RBUlQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19vZmZsb2FkX3RhcmdldF9yZWxlYXNlX2J1ZmZlcl9yZWZzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZlJlbGVhc2VSZWYoYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVElNRVJfU1RPUCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX29mZmxvYWRfdGFyZ2V0X3JlbGVhc2VfYnVmZmVyX3JlZnMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3Vua25vd25fdmFyX3R5cGUsIG1fdmFyc1tpXS50eXBlLmRzdCk7CisgICAgICAgICAgICAgICAgICAgIGFib3J0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJPVVQgYnVmZmVyIEAgcCAlcCBzaXplICVsbGRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBtX291dC5nZXRfYnVmZmVyX3N0YXJ0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBtX291dC5nZXRfYnVmZmVyX3NpemUoKSk7CisKKyAgICBPRkZMT0FEX0RFQlVHX0RVTVBfQllURVMoMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9vdXQuZ2V0X2J1ZmZlcl9zdGFydCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX291dC5nZXRfYnVmZmVyX3NpemUoKSk7CisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoMSwgZ2V0X29mZmxvYWRfbnVtYmVyKCksIGNfb2ZmbG9hZF9jb3B5b3V0X2RhdGEsCisgICAgICAgICAgICAgICAgICAiVG90YWwgY29weW91dCBkYXRhIHNlbnQgdG8gaG9zdDogWyVsbGRdIGJ5dGVzXG4iLAorICAgICAgICAgICAgICAgICAgbV9vdXQuZ2V0X3Rmcl9zaXplKCkpOworCisgICAgT0ZGTE9BRF9USU1FUl9TVE9QKGNfb2ZmbG9hZF90YXJnZXRfZ2F0aGVyX291dHB1dHMpOworfQorCit2b2lkIF9fb2ZmbG9hZF90YXJnZXRfaW5pdCh2b2lkKQoreworI2lmZGVmIFNFUF9TVVBQT1JUCisgICAgY29uc3QgY2hhciogZW52X3ZhciA9IGdldGVudihzZXBfbW9uaXRvcl9lbnYpOworICAgIGlmIChlbnZfdmFyICE9IDAgJiYgKmVudl92YXIgIT0gJ1wwJykgeworICAgICAgICBzZXBfbW9uaXRvciA9IGF0b2koZW52X3Zhcik7CisgICAgfQorICAgIGVudl92YXIgPSBnZXRlbnYoc2VwX2RldmljZV9lbnYpOworICAgIGlmIChlbnZfdmFyICE9IDAgJiYgKmVudl92YXIgIT0gJ1wwJykgeworICAgICAgICBzZXBfZGV2aWNlID0gZW52X3ZhcjsKKyAgICB9CisjZW5kaWYgLy8gU0VQX1NVUFBPUlQKKworICAgIHByZWZpeCA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfbWljKTsKKworICAgIC8vIGluaXQgZnJlcXVlbmN5CisgICAgbWljX2ZyZXF1ZW5jeSA9IENPSVBlcmZHZXRDeWNsZUZyZXF1ZW5jeSgpOworfQorCisvLyBVc2VyLXZpc2libGUgb2ZmbG9hZCBBUEkKKworaW50IF9PZmZsb2FkX251bWJlcl9vZl9kZXZpY2VzKHZvaWQpCit7CisgICAgcmV0dXJuIG1pY19lbmdpbmVzX3RvdGFsOworfQorCitpbnQgX09mZmxvYWRfZ2V0X2RldmljZV9udW1iZXIodm9pZCkKK3sKKyAgICByZXR1cm4gbWljX2luZGV4OworfQorCitpbnQgX09mZmxvYWRfZ2V0X3BoeXNpY2FsX2RldmljZV9udW1iZXIodm9pZCkKK3sKKyAgICB1aW50MzJfdCBpbmRleDsKKyAgICBFbmdpbmVHZXRJbmRleCgmaW5kZXgpOworICAgIHJldHVybiBpbmRleDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfdGFyZ2V0LmggYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3RhcmdldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYjMxNDcKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3RhcmdldC5oCkBAIC0wLDAgKzEsMTAwIEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKy8vIFRoZSBwYXJ0cyBvZiB0aGUgb2ZmbG9hZCBsaWJyYXJ5IHVzZWQgb25seSBvbiB0aGUgdGFyZ2V0CisKKyNpZm5kZWYgT0ZGTE9BRF9UQVJHRVRfSF9JTkNMVURFRAorI2RlZmluZSBPRkZMT0FEX1RBUkdFVF9IX0lOQ0xVREVECisKKyNpbmNsdWRlICJvZmZsb2FkX2NvbW1vbi5oIgorI2luY2x1ZGUgImNvaS9jb2lfc2VydmVyLmgiCisKKy8vIFRoZSBvZmZsb2FkIGRlc2NyaXB0b3IuCitjbGFzcyBPZmZsb2FkRGVzY3JpcHRvcgoreworcHVibGljOgorICAgIH5PZmZsb2FkRGVzY3JpcHRvcigpIHsKKyAgICAgICAgaWYgKG1fdmFycyAhPSAwKSB7CisgICAgICAgICAgICBmcmVlKG1fdmFycyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBFbnRyeSBwb2ludCBmb3IgQ09JLiBTeW5jaHJvbm91c2x5IGV4ZWN1dGUgb2ZmbG9hZGVkIHJlZ2lvbiBnaXZlbgorICAgIC8vIHRoZSBwcm92aWRlZCBidWZmZXJzLCBtaXNjIGFuZCByZXR1cm4gZGF0YS4KKyAgICBzdGF0aWMgdm9pZCBvZmZsb2FkKAorICAgICAgICB1aW50MzJfdCAgYnVmZmVyX2NvdW50LAorICAgICAgICB2b2lkKiogICAgYnVmZmVycywKKyAgICAgICAgdm9pZCogICAgIG1pc2NfZGF0YSwKKyAgICAgICAgdWludDE2X3QgIG1pc2NfZGF0YV9sZW4sCisgICAgICAgIHZvaWQqICAgICByZXR1cm5fZGF0YSwKKyAgICAgICAgdWludDE2X3QgIHJldHVybl9kYXRhX2xlbgorICAgICk7CisKKyAgICAvLyBzY2F0dGVycyBpbnB1dCBkYXRhIGZyb20gaW4gYnVmZmVyIHRvIHRhcmdldCB2YXJpYWJsZXMKKyAgICB2b2lkIHNjYXR0ZXJfY29weWluX2RhdGEoKTsKKworICAgIC8vIGdhdGhlcnMgb3V0cHV0IGRhdGEgdG8gdGhlIGJ1ZmZlcgorICAgIHZvaWQgZ2F0aGVyX2NvcHlvdXRfZGF0YSgpOworCisgICAgLy8gbWVyZ2VzIGxvY2FsIHZhcmlhYmxlIGRlc2NyaXB0b3JzIHdpdGggdGhlIGRlc2NyaXB0b3JzIHJlY2VpdmVkIGZyb20KKyAgICAvLyBob3N0CisgICAgdm9pZCBtZXJnZV92YXJfZGVzY3MoVmFyRGVzYyAqdmFycywgVmFyRGVzYzIgKnZhcnMyLCBpbnQgdmFyc190b3RhbCk7CisKKyAgICBpbnQgZ2V0X29mZmxvYWRfbnVtYmVyKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9vZmZsb2FkX251bWJlcjsKKyAgICB9CisKKyAgICB2b2lkIHNldF9vZmZsb2FkX251bWJlcihpbnQgbnVtYmVyKSB7CisgICAgICAgIG1fb2ZmbG9hZF9udW1iZXIgPSBudW1iZXI7CisgICAgfQorCitwcml2YXRlOgorICAgIC8vIENvbnN0cnVjdG9yCisgICAgT2ZmbG9hZERlc2NyaXB0b3IoKSA6IG1fdmFycygwKQorICAgIHt9CisKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBzdGQ6Omxpc3Q8dm9pZCo+IEJ1ZmZlckxpc3Q7CisKKyAgICAvLyBUaGUgTWFyc2hhbGxlciBmb3IgdGhlIGlucHV0cyBvZiB0aGUgb2ZmbG9hZGVkIHJlZ2lvbi4KKyAgICBNYXJzaGFsbGVyIG1faW47CisKKyAgICAvLyBUaGUgTWFyc2hhbGxlciBmb3IgdGhlIG91dHB1dHMgb2YgdGhlIG9mZmxvYWRlZCByZWdpb24uCisgICAgTWFyc2hhbGxlciBtX291dDsKKworICAgIC8vIExpc3Qgb2YgYnVmZmVycyB0aGF0IGFyZSBwYXNzZWQgdG8gZGlzcGF0Y2ggY2FsbAorICAgIEJ1ZmZlckxpc3QgbV9idWZmZXJzOworCisgICAgLy8gVmFyaWFibGUgZGVzY3JpcHRvcnMgcmVjZWl2ZWQgZnJvbSBob3N0CisgICAgVmFyRGVzYyogbV92YXJzOworICAgIGludCAgICAgIG1fdmFyc190b3RhbDsKKyAgICBpbnQgICAgICBtX29mZmxvYWRfbnVtYmVyOworfTsKKworLy8gb25lIHRpbWUgdGFyZ2V0IGluaXRpYWxpemF0aW9uIGluIG1haW4KK2V4dGVybiB2b2lkIF9fb2ZmbG9hZF90YXJnZXRfaW5pdCh2b2lkKTsKKworLy8gbG9naWNhbCBkZXZpY2UgaW5kZXgKK2V4dGVybiBpbnQgbWljX2luZGV4OworCisvLyB0b3RhbCBudW1iZXIgb2YgYXZhaWxhYmxlIGxvZ2ljYWwgZGV2aWNlcworZXh0ZXJuIGludCBtaWNfZW5naW5lc190b3RhbDsKKworLy8gZGV2aWNlIGZyZXF1ZW5jeSAoZnJvbSBDT0kpCitleHRlcm4gdWludDY0X3QgbWljX2ZyZXF1ZW5jeTsKKworc3RydWN0IFJlZkluZm8geworICAgIFJlZkluZm8oYm9vbCBpc19hZGQsIGxvbmcgYW1vdW50KTppc19hZGRlZChpc19hZGQpLGNvdW50KGFtb3VudCkKKyAgICB7fQorICAgIGJvb2wgaXNfYWRkZWQ7CisgICAgbG9uZyBjb3VudDsKK307CisKKyNlbmRpZiAvLyBPRkZMT0FEX1RBUkdFVF9IX0lOQ0xVREVECmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3RhcmdldF9tYWluLmNwcCBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfdGFyZ2V0X21haW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0OTIxZDIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3RhcmdldF9tYWluLmNwcApAQCAtMCwwICsxLDE3IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKK2V4dGVybiAiQyIgdm9pZCBfX29mZmxvYWRfdGFyZ2V0X21haW4odm9pZCk7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqIGFyZ3YpCit7CisgICAgX19vZmZsb2FkX3RhcmdldF9tYWluKCk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3RpbWVyLmggYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3RpbWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQwMWE5ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfdGltZXIuaApAQCAtMCwwICsxLDE3MiBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIE9GRkxPQURfVElNRVJfSF9JTkNMVURFRAorI2RlZmluZSBPRkZMT0FEX1RJTUVSX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAibGlib2ZmbG9hZF9lcnJvcl9jb2Rlcy5oIgorCitleHRlcm4gaW50IHRpbWVyX2VuYWJsZWQ7CisKKyNpZmRlZiBUSU1JTkdfU1VQUE9SVAorCitzdHJ1Y3QgT2ZmbG9hZFRhcmdldFRpbWVyRGF0YSB7CisgICAgdWludDY0X3QgZnJlcXVlbmN5OworICAgIHN0cnVjdCB7CisgICAgICAgIHVpbnQ2NF90IHN0YXJ0OworICAgICAgICB1aW50NjRfdCB0b3RhbDsKKyAgICB9IHBoYXNlc1tjX29mZmxvYWRfdGFyZ2V0X21heF9waGFzZV07Cit9OworCitzdHJ1Y3QgT2ZmbG9hZEhvc3RUaW1lckRhdGEgeworICAgIC8vIHNvdXJjZSBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyCisgICAgY29uc3QgY2hhciogZmlsZTsKKyAgICBpbnQgICAgICAgICBsaW5lOworCisgICAgLy8gaG9zdCB0aW1lciBkYXRhCisgICAgc3RydWN0IHsKKyAgICAgICAgdWludDY0X3Qgc3RhcnQ7CisgICAgICAgIHVpbnQ2NF90IHRvdGFsOworICAgIH0gcGhhc2VzW2Nfb2ZmbG9hZF9ob3N0X21heF9waGFzZV07CisKKyAgICB1aW50NjRfdCBzZW50X2J5dGVzOworICAgIHVpbnQ2NF90IHJlY2VpdmVkX2J5dGVzOworICAgIGludCBjYXJkX251bWJlcjsKKyAgICBpbnQgb2ZmbG9hZF9udW1iZXI7CisKKyAgICAvLyB0YXJnZXQgdGltZXIgZGF0YQorICAgIE9mZmxvYWRUYXJnZXRUaW1lckRhdGEgdGFyZ2V0OworCisgICAgLy8gbmV4dCBlbGVtZW50CisgICAgT2ZmbG9hZEhvc3RUaW1lckRhdGEgKm5leHQ7Cit9OworCisjaWYgSE9TVF9MSUJSQVJZCisKK2V4dGVybiBpbnQgb2ZmbG9hZF9yZXBvcnRfbGV2ZWw7CitleHRlcm4gaW50IG9mZmxvYWRfcmVwb3J0X2VuYWJsZWQ7CisjZGVmaW5lIE9GRkxPQURfUkVQT1JUXzEgMQorI2RlZmluZSBPRkZMT0FEX1JFUE9SVF8yIDIKKyNkZWZpbmUgT0ZGTE9BRF9SRVBPUlRfMyAzCisjZGVmaW5lIE9GRkxPQURfUkVQT1JUX09OIDEKKyNkZWZpbmUgT0ZGTE9BRF9SRVBPUlRfT0ZGIDAKKworI2RlZmluZSBPRkZMT0FEX1RJTUVSX0RBVEFMRU4oKSBcCisgICAgKCh0aW1lcl9lbmFibGVkIHx8IChvZmZsb2FkX3JlcG9ydF9sZXZlbCAmJiBvZmZsb2FkX3JlcG9ydF9lbmFibGVkKSkgPyBcCisgICAgICgoMSArIGNfb2ZmbG9hZF90YXJnZXRfbWF4X3BoYXNlKSAqIHNpemVvZih1aW50NjRfdCkpIDogMCkKKworI2RlZmluZSBPRkZMT0FEX1RJTUVSX1NUQVJUKHRpbWVyX2RhdGEsIHBub2RlKSBcCisgICAgaWYgKHRpbWVyX2VuYWJsZWQgfHwgXAorICAgICAgICAob2ZmbG9hZF9yZXBvcnRfbGV2ZWwgJiYgb2ZmbG9hZF9yZXBvcnRfZW5hYmxlZCkpIHsgXAorICAgICAgICBvZmZsb2FkX3RpbWVyX3N0YXJ0KHRpbWVyX2RhdGEsIHBub2RlKTsgXAorICAgIH0KKworI2RlZmluZSBPRkZMT0FEX1RJTUVSX1NUT1AodGltZXJfZGF0YSwgcG5vZGUpIFwKKyAgICBpZiAodGltZXJfZW5hYmxlZCB8fCBcCisgICAgICAgIChvZmZsb2FkX3JlcG9ydF9sZXZlbCAmJiBvZmZsb2FkX3JlcG9ydF9lbmFibGVkKSkgeyBcCisgICAgICAgIG9mZmxvYWRfdGltZXJfc3RvcCh0aW1lcl9kYXRhLCBwbm9kZSk7IFwKKyAgICB9CisKKyNkZWZpbmUgT0ZGTE9BRF9USU1FUl9JTklUKGZpbGUsIGxpbmUpIFwKKyAgICBvZmZsb2FkX3RpbWVyX2luaXQoZmlsZSwgbGluZSk7CisKKyNkZWZpbmUgT0ZGTE9BRF9USU1FUl9UQVJHRVRfREFUQSh0aW1lcl9kYXRhLCBkYXRhKSBcCisgICAgaWYgKHRpbWVyX2VuYWJsZWQgfHwgXAorICAgICAgICAob2ZmbG9hZF9yZXBvcnRfbGV2ZWwgJiYgb2ZmbG9hZF9yZXBvcnRfZW5hYmxlZCkpIHsgXAorICAgICAgICBvZmZsb2FkX3RpbWVyX2ZpbGxfdGFyZ2V0X2RhdGEodGltZXJfZGF0YSwgZGF0YSk7IFwKKyAgICB9CisKKyNkZWZpbmUgT0ZGTE9BRF9USU1FUl9IT1NUX1NEQVRBKHRpbWVyX2RhdGEsIGRhdGEpIFwKKyAgICBpZiAob2ZmbG9hZF9yZXBvcnRfbGV2ZWwgJiYgb2ZmbG9hZF9yZXBvcnRfZW5hYmxlZCkgeyBcCisgICAgICAgIG9mZmxvYWRfdGltZXJfZmlsbF9ob3N0X3NkYXRhKHRpbWVyX2RhdGEsIGRhdGEpOyBcCisgICAgfQorCisjZGVmaW5lIE9GRkxPQURfVElNRVJfSE9TVF9SREFUQSh0aW1lcl9kYXRhLCBkYXRhKSBcCisgICAgaWYgKG9mZmxvYWRfcmVwb3J0X2xldmVsICYmIG9mZmxvYWRfcmVwb3J0X2VuYWJsZWQpIHsgXAorICAgICAgICBvZmZsb2FkX3RpbWVyX2ZpbGxfaG9zdF9yZGF0YSh0aW1lcl9kYXRhLCBkYXRhKTsgXAorICAgIH0KKworI2RlZmluZSBPRkZMT0FEX1RJTUVSX0hPU1RfTUlDX05VTSh0aW1lcl9kYXRhLCBkYXRhKSBcCisgICAgaWYgKG9mZmxvYWRfcmVwb3J0X2xldmVsICYmIG9mZmxvYWRfcmVwb3J0X2VuYWJsZWQpIHsgXAorICAgICAgICBvZmZsb2FkX3RpbWVyX2ZpbGxfaG9zdF9taWNfbnVtKHRpbWVyX2RhdGEsIGRhdGEpOyBcCisgICAgfQorCitleHRlcm4gdm9pZCBvZmZsb2FkX3RpbWVyX3N0YXJ0KE9mZmxvYWRIb3N0VGltZXJEYXRhICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9mZmxvYWRIb3N0UGhhc2UgdF9ub2RlKTsKK2V4dGVybiB2b2lkIG9mZmxvYWRfdGltZXJfc3RvcChPZmZsb2FkSG9zdFRpbWVyRGF0YSAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9mZmxvYWRIb3N0UGhhc2UgdF9ub2RlKTsKK2V4dGVybiBPZmZsb2FkSG9zdFRpbWVyRGF0YSAqIG9mZmxvYWRfdGltZXJfaW5pdChjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSk7CitleHRlcm4gdm9pZCBvZmZsb2FkX3RpbWVyX2ZpbGxfdGFyZ2V0X2RhdGEoT2ZmbG9hZEhvc3RUaW1lckRhdGEgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKTsKK2V4dGVybiB2b2lkIG9mZmxvYWRfdGltZXJfZmlsbF9ob3N0X3NkYXRhKE9mZmxvYWRIb3N0VGltZXJEYXRhICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBzZW50X2J5dGVzKTsKK2V4dGVybiB2b2lkIG9mZmxvYWRfdGltZXJfZmlsbF9ob3N0X3JkYXRhKE9mZmxvYWRIb3N0VGltZXJEYXRhICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBzZW50X2J5dGVzKTsKK2V4dGVybiB2b2lkIG9mZmxvYWRfdGltZXJfZmlsbF9ob3N0X21pY19udW0oT2ZmbG9hZEhvc3RUaW1lckRhdGEgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhcmRfbnVtYmVyKTsKKworLy8gVXRpbGl0eSBzdHJ1Y3R1cmUgZm9yIHN0YXJ0aW5nL3N0b3BwaW5nIHRpbWVyCitzdHJ1Y3QgT2ZmbG9hZFRpbWVyIHsKKyAgICBPZmZsb2FkVGltZXIoT2ZmbG9hZEhvc3RUaW1lckRhdGEgKmRhdGEsIE9mZmxvYWRIb3N0UGhhc2UgcGhhc2UpIDoKKyAgICAgICAgbV9kYXRhKGRhdGEpLAorICAgICAgICBtX3BoYXNlKHBoYXNlKQorICAgIHsKKyAgICAgICAgT0ZGTE9BRF9USU1FUl9TVEFSVChtX2RhdGEsIG1fcGhhc2UpOworICAgIH0KKworICAgIH5PZmZsb2FkVGltZXIoKQorICAgIHsKKyAgICAgICAgT0ZGTE9BRF9USU1FUl9TVE9QKG1fZGF0YSwgbV9waGFzZSk7CisgICAgfQorCitwcml2YXRlOgorICAgIE9mZmxvYWRIb3N0VGltZXJEYXRhKiAgIG1fZGF0YTsKKyAgICBPZmZsb2FkSG9zdFBoYXNlICAgICAgICBtX3BoYXNlOworfTsKKworI2Vsc2UKKworI2RlZmluZSBPRkZMT0FEX1RJTUVSX0RBVEFMRU4oKSBcCisgICAgKCh0aW1lcl9lbmFibGVkKSA/IFwKKyAgICAgKCgxICsgY19vZmZsb2FkX3RhcmdldF9tYXhfcGhhc2UpICogc2l6ZW9mKHVpbnQ2NF90KSkgOiAwKQorCisjZGVmaW5lIE9GRkxPQURfVElNRVJfU1RBUlQocG5vZGUpIFwKKyAgICBpZiAodGltZXJfZW5hYmxlZCkgb2ZmbG9hZF90aW1lcl9zdGFydChwbm9kZSk7CisKKyNkZWZpbmUgT0ZGTE9BRF9USU1FUl9TVE9QKHBub2RlKSBcCisgICAgaWYgKHRpbWVyX2VuYWJsZWQpIG9mZmxvYWRfdGltZXJfc3RvcChwbm9kZSk7CisKKyNkZWZpbmUgT0ZGTE9BRF9USU1FUl9JTklUKCkgXAorICAgIGlmICh0aW1lcl9lbmFibGVkKSBvZmZsb2FkX3RpbWVyX2luaXQoKTsKKworI2RlZmluZSBPRkZMT0FEX1RJTUVSX1RBUkdFVF9EQVRBKGRhdGEpIFwKKyAgICBpZiAodGltZXJfZW5hYmxlZCkgb2ZmbG9hZF90aW1lcl9maWxsX3RhcmdldF9kYXRhKGRhdGEpOworCitleHRlcm4gdm9pZCBvZmZsb2FkX3RpbWVyX3N0YXJ0KE9mZmxvYWRUYXJnZXRQaGFzZSB0X25vZGUpOworZXh0ZXJuIHZvaWQgb2ZmbG9hZF90aW1lcl9zdG9wKE9mZmxvYWRUYXJnZXRQaGFzZSB0X25vZGUpOworZXh0ZXJuIHZvaWQgb2ZmbG9hZF90aW1lcl9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgb2ZmbG9hZF90aW1lcl9maWxsX3RhcmdldF9kYXRhKHZvaWQgKmRhdGEpOworCisjZW5kaWYgLy8gSE9TVF9MSUJSQVJZCisKKyNlbHNlIC8vIFRJTUlOR19TVVBQT1JUCisKKyNkZWZpbmUgT0ZGTE9BRF9USU1FUl9TVEFSVCguLi4pCisjZGVmaW5lIE9GRkxPQURfVElNRVJfU1RPUCguLi4pCisjZGVmaW5lIE9GRkxPQURfVElNRVJfSU5JVCguLi4pCisjZGVmaW5lIE9GRkxPQURfVElNRVJfVEFSR0VUX0RBVEEoLi4uKQorI2RlZmluZSBPRkZMT0FEX1RJTUVSX0RBVEFMRU4oLi4uKSAgICAgICgwKQorCisjZW5kaWYgLy8gVElNSU5HX1NVUFBPUlQKKworI2VuZGlmIC8vIE9GRkxPQURfVElNRVJfSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90aW1lcl9ob3N0LmNwcCBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfdGltZXJfaG9zdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIyN2RiMAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfdGltZXJfaG9zdC5jcHAKQEAgLTAsMCArMSwzNTkgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgIm9mZmxvYWRfdGltZXIuaCIKKworI2lmZGVmIF9fSU5URUxfQ09NUElMRVIKKyNpbmNsdWRlIDxpYTMyaW50cmluLmg+CisjZWxzZSAvLyBfX0lOVEVMX0NPTVBJTEVSCisjaW5jbHVkZSA8eDg2aW50cmluLmg+CisjZW5kaWYgLy8gX19JTlRFTF9DT01QSUxFUgorCisjaW5jbHVkZSAib2ZmbG9hZF9ob3N0LmgiCisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxpb21hbmlwPgorCitpbnQgdGltZXJfZW5hYmxlZCA9IDA7CisKKyNpZmRlZiBUSU1JTkdfU1VQUE9SVAorCitpbnQgb2ZmbG9hZF9yZXBvcnRfbGV2ZWwgPSAwOworaW50IG9mZmxvYWRfcmVwb3J0X2VuYWJsZWQgPSAxOworCitzdGF0aWMgY29uc3QgaW50IGhvc3RfdGltZXJfcHJlZml4X3NwYWNlc1tdID0geworICAgIC8qY19vZmZsb2FkX2hvc3Rfc2V0dXBfYnVmZmVycyovICAgICAgICAgMCwKKyAgICAvKmNfb2ZmbG9hZF9ob3N0X2luaXRpYWxpemUqLyAgICAgICAgICAgIDIsCisgICAgLypjX29mZmxvYWRfaG9zdF90YXJnZXRfYWNxdWlyZSovICAgICAgICAyLAorICAgIC8qY19vZmZsb2FkX2hvc3Rfd2FpdF9kZXBzKi8gICAgICAgICAgICAgMiwKKyAgICAvKmNfb2ZmbG9hZF9ob3N0X3NldHVwX2J1ZmZlcnMqLyAgICAgICAgIDIsCisgICAgLypjX29mZmxvYWRfaG9zdF9hbGxvY19idWZmZXJzKi8gICAgICAgICA0LAorICAgIC8qY19vZmZsb2FkX2hvc3Rfc2V0dXBfbWlzY19kYXRhKi8gICAgICAgMiwKKyAgICAvKmNfb2ZmbG9hZF9ob3N0X2FsbG9jX2RhdGFfYnVmZmVyKi8gICAgIDQsCisgICAgLypjX29mZmxvYWRfaG9zdF9zZW5kX3BvaW50ZXJzKi8gICAgICAgICAyLAorICAgIC8qY19vZmZsb2FkX2hvc3RfZ2F0aGVyX2lucHV0cyovICAgICAgICAgMiwKKyAgICAvKmNfb2ZmbG9hZF9ob3N0X21hcF9pbl9kYXRhX2J1ZmZlciovICAgIDQsCisgICAgLypjX29mZmxvYWRfaG9zdF91bm1hcF9pbl9kYXRhX2J1ZmZlciovICA0LAorICAgIC8qY19vZmZsb2FkX2hvc3Rfc3RhcnRfY29tcHV0ZSovICAgICAgICAgMiwKKyAgICAvKmNfb2ZmbG9hZF9ob3N0X3dhaXRfY29tcHV0ZSovICAgICAgICAgIDIsCisgICAgLypjX29mZmxvYWRfaG9zdF9zdGFydF9idWZmZXJzX3JlYWRzKi8gICAyLAorICAgIC8qY19vZmZsb2FkX2hvc3Rfc2NhdHRlcl9vdXRwdXRzKi8gICAgICAgMiwKKyAgICAvKmNfb2ZmbG9hZF9ob3N0X21hcF9vdXRfZGF0YV9idWZmZXIqLyAgIDQsCisgICAgLypjX29mZmxvYWRfaG9zdF91bm1hcF9vdXRfZGF0YV9idWZmZXIqLyA0LAorICAgIC8qY19vZmZsb2FkX2hvc3Rfd2FpdF9idWZmZXJzX3JlYWRzKi8gICAgMiwKKyAgICAvKmNfb2ZmbG9hZF9ob3N0X2Rlc3Ryb3lfYnVmZmVycyovICAgICAgIDIKK307CisKK2NvbnN0IHN0YXRpYyBpbnQgdGFyZ2V0X3RpbWVyX3ByZWZpeF9zcGFjZXNbXSA9IHsKKy8qY19vZmZsb2FkX3RhcmdldF90b3RhbF90aW1lKi8gICAgICAgICAgMCwKKy8qY19vZmZsb2FkX3RhcmdldF9kZXNjcmlwdG9yX3NldHVwKi8gICAgMiwKKy8qY19vZmZsb2FkX3RhcmdldF9mdW5jX2xvb2t1cCovICAgICAgICAgMiwKKy8qY19vZmZsb2FkX3RhcmdldF9mdW5jX3RpbWUqLyAgICAgICAgICAgMiwKKy8qY19vZmZsb2FkX3RhcmdldF9zY2F0dGVyX2lucHV0cyovICAgICAgNCwKKy8qY19vZmZsb2FkX3RhcmdldF9hZGRfYnVmZmVyX3JlZnMqLyAgICAgNiwKKy8qY19vZmZsb2FkX3RhcmdldF9jb21wdXRlKi8gICAgICAgICAgICAgNCwKKy8qY19vZmZsb2FkX3RhcmdldF9nYXRoZXJfb3V0cHV0cyovICAgICAgNCwKKy8qY19vZmZsb2FkX3RhcmdldF9yZWxlYXNlX2J1ZmZlcl9yZWZzKi8gNgorfTsKKworc3RhdGljIE9mZmxvYWRIb3N0VGltZXJEYXRhKiB0aW1lcl9kYXRhX2hlYWQ7CitzdGF0aWMgT2ZmbG9hZEhvc3RUaW1lckRhdGEqIHRpbWVyX2RhdGFfdGFpbDsKK3N0YXRpYyBtdXRleF90ICAgICAgICAgICAgICAgdGltZXJfZGF0YV9tdXRleDsKKworc3RhdGljIHZvaWQgb2ZmbG9hZF9ob3N0X3BoYXNlX25hbWUoc3RkOjpzdHJpbmdzdHJlYW0gJnNzLCBpbnQgcF9ub2RlKTsKK3N0YXRpYyB2b2lkIG9mZmxvYWRfdGFyZ2V0X3BoYXNlX25hbWUoc3RkOjpzdHJpbmdzdHJlYW0gJnNzLCBpbnQgcF9ub2RlKTsKKworZXh0ZXJuIHZvaWQgT2ZmbG9hZF9UaW1lcl9QcmludCh2b2lkKQoreworICAgIHN0ZDo6c3RyaW5nICAgICAgIGJ1ZjsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICBjb25zdCBjaGFyICpzdGFycyA9CisgICAgICAgICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiI7CisKKyAgICBzcyA8PCAiXG5cbiIgPDwgc3RhcnMgPDwgIlxuIjsKKyAgICBzcyA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOworICAgIHNzIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfdGl0bGUpIDw8ICJcbiI7CisgICAgc3MgPDwgc3RhcnMgPDwgIlxuIjsKKyAgICBkb3VibGUgZnJlcXVlbmN5ID0gY3B1X2ZyZXF1ZW5jeTsKKworICAgIGZvciAoT2ZmbG9hZEhvc3RUaW1lckRhdGEgKnBub2RlID0gdGltZXJfZGF0YV9oZWFkOworICAgICAgICAgcG5vZGUgIT0gMDsgcG5vZGUgPSBwbm9kZS0+bmV4dCkgeworICAgICAgICBzcyA8PCAiICAgICAgIjsKKyAgICAgICAgc3MgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9mcm9tX2ZpbGUpIDw8ICIgIjw8IHBub2RlLT5maWxlOworICAgICAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X2xpbmUpIDw8ICIgIiA8PCBwbm9kZS0+bGluZTsKKyAgICAgICAgc3MgPDwgIlxuIjsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjX29mZmxvYWRfaG9zdF9tYXhfcGhhc2UgOyBpKyspIHsKKyAgICAgICAgICAgIHNzIDw8ICIgICAgICAgICAgIjsKKyAgICAgICAgICAgIG9mZmxvYWRfaG9zdF9waGFzZV9uYW1lKHNzLCBpKTsKKyAgICAgICAgICAgIHNzIDw8ICIgICAiIDw8IHN0ZDo6Zml4ZWQgPDwgc3RkOjpzZXRwcmVjaXNpb24oNSk7CisgICAgICAgICAgICBzcyA8PCAoZG91YmxlKXBub2RlLT5waGFzZXNbaV0udG90YWwgLyBmcmVxdWVuY3kgPDwgIlxuIjsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY19vZmZsb2FkX3RhcmdldF9tYXhfcGhhc2UgOyBpKyspIHsKKyAgICAgICAgICAgIGRvdWJsZSB0aW1lID0gMDsKKyAgICAgICAgICAgIGlmIChwbm9kZS0+dGFyZ2V0LmZyZXF1ZW5jeSAhPSAwKSB7CisgICAgICAgICAgICAgICAgdGltZSA9IChkb3VibGUpIHBub2RlLT50YXJnZXQucGhhc2VzW2ldLnRvdGFsIC8KKyAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSkgcG5vZGUtPnRhcmdldC5mcmVxdWVuY3k7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcyA8PCAiICAgICAgICAgICI7CisgICAgICAgICAgICBvZmZsb2FkX3RhcmdldF9waGFzZV9uYW1lKHNzLCBpKTsKKyAgICAgICAgICAgIHNzIDw8ICIgICAiIDw8IHN0ZDo6Zml4ZWQgPDwgc3RkOjpzZXRwcmVjaXNpb24oNSk7CisgICAgICAgICAgICBzcyA8PCB0aW1lIDw8ICJcbiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBidWYgPSBzcy5zdHIoKTsKKyAgICBmcHJpbnRmKHN0ZG91dCwgYnVmLmRhdGEoKSk7CisgICAgZmZsdXNoKHN0ZG91dCk7Cit9CisKK2V4dGVybiB2b2lkIE9mZmxvYWRfUmVwb3J0X1Byb2xvZyhPZmZsb2FkSG9zdFRpbWVyRGF0YSAqcG5vZGUpCit7CisgICAgZG91YmxlIGZyZXF1ZW5jeSA9IGNwdV9mcmVxdWVuY3k7CisgICAgc3RkOjpzdHJpbmcgICAgICAgYnVmOworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworCisgICAgaWYgKHBub2RlKSB7CisgICAgICAgIC8vIFtPZmZsb2FkXSBbTWljIDBdIFtGaWxlXSAgICAgICAgICBmaWxlLmMKKyAgICAgICAgc3MgPDwgIlsiIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfb2ZmbG9hZCkgPDwgIl0gWyI7CisgICAgICAgIHNzIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfbWljKSA8PCAiICI7CisgICAgICAgIHNzIDw8IHBub2RlLT5jYXJkX251bWJlciA8PCAiXSBbIjsKKyAgICAgICAgc3MgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9maWxlKTsKKyAgICAgICAgc3MgPDwgIl0gICAgICAgICAgICAgICAgICAgICIgPDwgcG5vZGUtPmZpbGUgPDwgIlxuIjsKKworICAgICAgICAvLyBbT2ZmbG9hZF0gW01pYyAwXSBbTGluZV0gICAgICAgICAgMTIzNAorICAgICAgICBzcyA8PCAiWyIgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9vZmZsb2FkKSA8PCAiXSBbIjsKKyAgICAgICAgc3MgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9taWMpIDw8ICIgIjsKKyAgICAgICAgc3MgPDwgcG5vZGUtPmNhcmRfbnVtYmVyIDw8ICJdIFsiOworICAgICAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X2xpbmUpOworICAgICAgICBzcyA8PCAiXSAgICAgICAgICAgICAgICAgICAgIiA8PCBwbm9kZS0+bGluZSA8PCAiXG4iOworCisgICAgICAgIC8vIFtPZmZsb2FkXSBbTWljIDBdIFtUYWddICAgICAgICAgIFRhZyAxCisgICAgICAgIHNzIDw8ICJbIiA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X29mZmxvYWQpIDw8ICJdIFsiOworICAgICAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X21pYykgPDwgIiAiOworICAgICAgICBzcyA8PCBwbm9kZS0+Y2FyZF9udW1iZXIgPDwgIl0gWyI7CisgICAgICAgIHNzIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfdGFnKTsKKyAgICAgICAgc3MgPDwgIl0gICAgICAgICAgICAgICAgICAgICAiIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfdGFnKTsKKyAgICAgICAgc3MgPDwgIiAiIDw8IHBub2RlLT5vZmZsb2FkX251bWJlciA8PCAiXG4iOworCisgICAgICAgIGJ1ZiA9IHNzLnN0cigpOworICAgICAgICBmcHJpbnRmKHN0ZG91dCwgYnVmLmRhdGEoKSk7CisgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgIH0KK30KKworZXh0ZXJuIHZvaWQgT2ZmbG9hZF9SZXBvcnRfRXBpbG9nKE9mZmxvYWRIb3N0VGltZXJEYXRhICogdGltZXJfZGF0YSkKK3sKKyAgICBkb3VibGUgZnJlcXVlbmN5ID0gY3B1X2ZyZXF1ZW5jeTsKKyAgICBzdGQ6OnN0cmluZyAgICAgICBidWY7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisKKyAgICBPZmZsb2FkSG9zdFRpbWVyRGF0YSAqcG5vZGUgPSB0aW1lcl9kYXRhOworCisgICAgaWYgKCFwbm9kZSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNzIDw8ICJbIiA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X29mZmxvYWQpIDw8ICJdIFsiOworICAgIHNzIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfaG9zdCkgPDwgIl0gIFsiOworICAgIHNzIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfdGFnKSA8PCAgIiAiOworICAgIHNzIDw8IHBub2RlLT5vZmZsb2FkX251bWJlciA8PCAiXSBbIjsKKyAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X2NwdV90aW1lKSA8PCAiXSAgICAgICAgIjsKKyAgICBzcyA8PCBzdGQ6OmZpeGVkIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKDYpOworICAgIHNzIDw8IChkb3VibGUpIHBub2RlLT5waGFzZXNbMF0udG90YWwgLyBmcmVxdWVuY3k7CisgICAgc3MgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zZWNvbmRzKSA8PCAiXG4iOworCisgICAgaWYgKG9mZmxvYWRfcmVwb3J0X2xldmVsID49IE9GRkxPQURfUkVQT1JUXzIpIHsKKyAgICAgICAgc3MgPDwgIlsiIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfb2ZmbG9hZCkgPDwgIl0gWyI7CisgICAgICAgIHNzIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfbWljKTsKKyAgICAgICAgc3MgPDwgIiAiIDw8IHBub2RlLT5jYXJkX251bWJlcjsKKyAgICAgICAgc3MgPDwgIl0gWyIgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF90YWcpIDw8ICIgIjsKKyAgICAgICAgc3MgPDwgIHBub2RlLT5vZmZsb2FkX251bWJlciA8PCAiXSBbIjsKKyAgICAgICAgc3MgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9jcHVfdG9fbWljX2RhdGEpIDw8ICJdICAgIjsKKyAgICAgICAgc3MgPDwgcG5vZGUtPnNlbnRfYnl0ZXMgPDwgIiAiOworICAgICAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X2J5dGVzKSA8PCAiXG4iOworICAgIH0KKworICAgIGRvdWJsZSB0aW1lID0gMDsKKyAgICBpZiAocG5vZGUtPnRhcmdldC5mcmVxdWVuY3kgIT0gMCkgeworICAgICAgICB0aW1lID0gKGRvdWJsZSkgcG5vZGUtPnRhcmdldC5waGFzZXNbMF0udG90YWwgLworICAgICAgICAgICAgKGRvdWJsZSkgcG5vZGUtPnRhcmdldC5mcmVxdWVuY3k7CisgICAgfQorICAgIHNzIDw8ICJbIiA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X29mZmxvYWQpIDw8ICJdIFsiOworICAgIHNzIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfbWljKSA8PCAiICI7CisgICAgc3MgPDwgcG5vZGUtPmNhcmRfbnVtYmVyPDwgIl0gWyI7CisgICAgc3MgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF90YWcpIDw8ICAiICI7CisgICAgc3MgPDwgcG5vZGUtPm9mZmxvYWRfbnVtYmVyIDw8ICJdIFsiOworICAgIHNzIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfbWljX3RpbWUpIDw8ICJdICAgICAgICAiOworICAgIHNzIDw8IHN0ZDo6Zml4ZWQgPDwgc3RkOjpzZXRwcmVjaXNpb24oNikgPDwgdGltZTsKKyAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3NlY29uZHMpIDw8ICJcbiI7CisKKyAgICBpZiAob2ZmbG9hZF9yZXBvcnRfbGV2ZWwgPj0gT0ZGTE9BRF9SRVBPUlRfMikgeworICAgICAgICBzcyA8PCAiWyIgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9vZmZsb2FkKSA8PCAiXSBbIjsKKyAgICAgICAgc3MgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9taWMpOworICAgICAgICBzcyA8PCAiICIgPDwgcG5vZGUtPmNhcmRfbnVtYmVyOworICAgICAgICBzcyA8PCAiXSBbIiA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3RhZykgPDwgIiAiOworICAgICAgICBzcyA8PCAgcG5vZGUtPm9mZmxvYWRfbnVtYmVyIDw8ICJdIFsiOworICAgICAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X21pY190b19jcHVfZGF0YSkgPDwgIl0gICAiOworICAgICAgICBzcyA8PCBwbm9kZS0+cmVjZWl2ZWRfYnl0ZXMgPDwgIiAiOworICAgICAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X2J5dGVzKSA8PCAiXG4iOworICAgIH0KKyAgICBzcyA8PCAiXG4iOworCisgICAgYnVmID0gc3Muc3RyKCk7CisgICAgZnByaW50ZihzdGRvdXQsIGJ1Zi5kYXRhKCkpOworICAgIGZmbHVzaChzdGRvdXQpOworCisgICAgb2ZmbG9hZF9yZXBvcnRfZnJlZV9kYXRhKHRpbWVyX2RhdGEpOworfQorCitleHRlcm4gdm9pZCBvZmZsb2FkX3JlcG9ydF9mcmVlX2RhdGEoT2ZmbG9hZEhvc3RUaW1lckRhdGEgKiB0aW1lcl9kYXRhKQoreworICAgIE9mZmxvYWRIb3N0VGltZXJEYXRhICpwbm9kZV9sYXN0ID0gTlVMTDsKKworICAgIGZvciAoT2ZmbG9hZEhvc3RUaW1lckRhdGEgKnBub2RlID0gdGltZXJfZGF0YV9oZWFkOworICAgICAgICAgcG5vZGUgIT0gMDsgcG5vZGUgPSBwbm9kZS0+bmV4dCkgeworICAgICAgICBpZiAodGltZXJfZGF0YSA9PSBwbm9kZSkgeworICAgICAgICAgICAgaWYgKHBub2RlX2xhc3QpIHsKKyAgICAgICAgICAgICAgICBwbm9kZV9sYXN0LT5uZXh0ID0gcG5vZGUtPm5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aW1lcl9kYXRhX2hlYWQgPSBwbm9kZS0+bmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE9GRkxPQURfRlJFRShwbm9kZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBwbm9kZV9sYXN0ID0gcG5vZGU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBmaWxsX2J1Zl93aXRoX3NwYWNlcyhzdGQ6OnN0cmluZ3N0cmVhbSAmc3MsIGludCBudW0pCit7CisgICAgZm9yICg7IG51bSA+IDA7IG51bS0tKSB7CisgICAgICAgIHNzIDw8ICIgIjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG9mZmxvYWRfaG9zdF9waGFzZV9uYW1lKHN0ZDo6c3RyaW5nc3RyZWFtICZzcywgaW50IHBfbm9kZSkKK3sKKyAgICBpbnQgcHJlZml4X3NwYWNlczsKKyAgICBpbnQgc3RyX2xlbmd0aDsKKyAgICBpbnQgdGFpbF9sZW5ndGg7CisgICAgY29uc3QgaW50IG1lc3NhZ2VfbGVuZ3RoID0gNDA7CisgICAgY2hhciBjb25zdCAqc3RyOworCisgICAgc3RyID0gcmVwb3J0X2dldF9ob3N0X3N0YWdlX3N0cihwX25vZGUpOworICAgIHByZWZpeF9zcGFjZXMgPSBob3N0X3RpbWVyX3ByZWZpeF9zcGFjZXNbcF9ub2RlXTsKKyAgICBmaWxsX2J1Zl93aXRoX3NwYWNlcyhzcywgcHJlZml4X3NwYWNlcyk7CisgICAgc3RyX2xlbmd0aCA9IHN0cmxlbihzdHIpOworICAgIHNzIDw8IHN0cjsKKyAgICB0YWlsX2xlbmd0aCA9IG1lc3NhZ2VfbGVuZ3RoIC0gcHJlZml4X3NwYWNlcyAtIHN0cl9sZW5ndGg7CisgICAgdGFpbF9sZW5ndGggPSB0YWlsX2xlbmd0aCA+IDA/IHRhaWxfbGVuZ3RoIDogMTsKKyAgICBmaWxsX2J1Zl93aXRoX3NwYWNlcyhzcywgdGFpbF9sZW5ndGgpOworfQorCitzdGF0aWMgdm9pZCBvZmZsb2FkX3RhcmdldF9waGFzZV9uYW1lKHN0ZDo6c3RyaW5nc3RyZWFtICZzcywgaW50IHBfbm9kZSkKK3sKKyAgICBpbnQgcHJlZml4X3NwYWNlczsKKyAgICBpbnQgc3RyX2xlbmd0aDsKKyAgICBjb25zdCBpbnQgbWVzc2FnZV9sZW5ndGggPSA0MDsKKyAgICBpbnQgdGFpbF9sZW5ndGg7CisgICAgY2hhciBjb25zdCAqc3RyOworCisgICAgc3RyID0gcmVwb3J0X2dldF90YXJnZXRfc3RhZ2Vfc3RyKHBfbm9kZSk7CisgICAgcHJlZml4X3NwYWNlcyA9IHRhcmdldF90aW1lcl9wcmVmaXhfc3BhY2VzW3Bfbm9kZV07CisgICAgZmlsbF9idWZfd2l0aF9zcGFjZXMoc3MsIHByZWZpeF9zcGFjZXMpOworICAgIHN0cl9sZW5ndGggPSBzdHJsZW4oc3RyKTsKKyAgICBzcyA8PCBzdHI7CisgICAgdGFpbF9sZW5ndGggPSBtZXNzYWdlX2xlbmd0aCAtIHByZWZpeF9zcGFjZXMgLSBzdHJfbGVuZ3RoOworICAgIHRhaWxfbGVuZ3RoID0gKHRhaWxfbGVuZ3RoID4gMCk/IHRhaWxfbGVuZ3RoIDogMTsKKyAgICBmaWxsX2J1Zl93aXRoX3NwYWNlcyhzcywgdGFpbF9sZW5ndGgpOworfQorCit2b2lkIG9mZmxvYWRfdGltZXJfc3RhcnQoT2ZmbG9hZEhvc3RUaW1lckRhdGEgKiB0aW1lcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIE9mZmxvYWRIb3N0UGhhc2UgcF90eXBlKQoreworICAgIHRpbWVyX2RhdGEtPnBoYXNlc1twX3R5cGVdLnN0YXJ0ID0gX3JkdHNjKCk7Cit9CisKK3ZvaWQgb2ZmbG9hZF90aW1lcl9zdG9wKE9mZmxvYWRIb3N0VGltZXJEYXRhICogdGltZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9mZmxvYWRIb3N0UGhhc2UgcF90eXBlKQoreworICAgIHRpbWVyX2RhdGEtPnBoYXNlc1twX3R5cGVdLnRvdGFsICs9IF9yZHRzYygpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lcl9kYXRhLT5waGFzZXNbcF90eXBlXS5zdGFydDsKK30KKwordm9pZCBvZmZsb2FkX3RpbWVyX2ZpbGxfdGFyZ2V0X2RhdGEoT2ZmbG9hZEhvc3RUaW1lckRhdGEgKiB0aW1lcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmKQoreworICAgIHVpbnQ2NF90ICpkYXRhID0gKHVpbnQ2NF90KikgYnVmOworCisgICAgdGltZXJfZGF0YS0+dGFyZ2V0LmZyZXF1ZW5jeSA9ICpkYXRhKys7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjX29mZmxvYWRfdGFyZ2V0X21heF9waGFzZTsgaSsrKSB7CisgICAgICAgIHRpbWVyX2RhdGEtPnRhcmdldC5waGFzZXNbaV0udG90YWwgPSAqZGF0YSsrOworICAgIH0KK30KKwordm9pZCBvZmZsb2FkX3RpbWVyX2ZpbGxfaG9zdF9zZGF0YShPZmZsb2FkSG9zdFRpbWVyRGF0YSAqIHRpbWVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHNlbnRfYnl0ZXMpCit7CisgICAgaWYgKHRpbWVyX2RhdGEpIHsKKyAgICAgICAgdGltZXJfZGF0YS0+c2VudF9ieXRlcyArPSBzZW50X2J5dGVzOworICAgIH0KK30KKwordm9pZCBvZmZsb2FkX3RpbWVyX2ZpbGxfaG9zdF9yZGF0YShPZmZsb2FkSG9zdFRpbWVyRGF0YSAqIHRpbWVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHJlY2VpdmVkX2J5dGVzKQoreworICAgIGlmICh0aW1lcl9kYXRhKSB7CisgICAgICAgIHRpbWVyX2RhdGEtPnJlY2VpdmVkX2J5dGVzICs9IHJlY2VpdmVkX2J5dGVzOworICAgIH0KK30KKwordm9pZCBvZmZsb2FkX3RpbWVyX2ZpbGxfaG9zdF9taWNfbnVtKE9mZmxvYWRIb3N0VGltZXJEYXRhICogdGltZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FyZF9udW1iZXIpCit7CisgICAgaWYgKHRpbWVyX2RhdGEpIHsKKyAgICAgICAgdGltZXJfZGF0YS0+Y2FyZF9udW1iZXIgPSBjYXJkX251bWJlcjsKKyAgICB9Cit9CisKK09mZmxvYWRIb3N0VGltZXJEYXRhKiBvZmZsb2FkX3RpbWVyX2luaXQoY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpCit7CisgICAgc3RhdGljIGJvb2wgZmlyc3RfdGltZSA9IHRydWU7CisgICAgT2ZmbG9hZEhvc3RUaW1lckRhdGEqIHRpbWVyX2RhdGEgPSBOVUxMOworCisgICAgdGltZXJfZGF0YV9tdXRleC5sb2NrKCk7CisgICAgeworICAgICAgICBpZiAodGltZXJfZW5hYmxlZCB8fAorICAgICAgICAgICAgKG9mZmxvYWRfcmVwb3J0X2xldmVsICYmIG9mZmxvYWRfcmVwb3J0X2VuYWJsZWQpKSB7CisgICAgICAgICAgICB0aW1lcl9kYXRhID0gKE9mZmxvYWRIb3N0VGltZXJEYXRhKikKKyAgICAgICAgICAgICAgICBPRkZMT0FEX01BTExPQyhzaXplb2YoT2ZmbG9hZEhvc3RUaW1lckRhdGEpLCAwKTsKKyAgICAgICAgICAgIG1lbXNldCh0aW1lcl9kYXRhLCAwLCBzaXplb2YoT2ZmbG9hZEhvc3RUaW1lckRhdGEpKTsKKworICAgICAgICAgICAgdGltZXJfZGF0YS0+b2ZmbG9hZF9udW1iZXIgPSBPRkZMT0FEX0RFQlVHX0lOQ1JfT0ZMRF9OVU0oKSAtIDE7CisKKyAgICAgICAgICAgIGlmICh0aW1lcl9kYXRhX2hlYWQgPT0gMCkgeworICAgICAgICAgICAgICAgIHRpbWVyX2RhdGFfaGVhZCA9IHRpbWVyX2RhdGE7CisgICAgICAgICAgICAgICAgdGltZXJfZGF0YV90YWlsID0gdGltZXJfZGF0YTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHRpbWVyX2RhdGFfdGFpbC0+bmV4dCA9IHRpbWVyX2RhdGE7CisgICAgICAgICAgICAgICAgdGltZXJfZGF0YV90YWlsID0gdGltZXJfZGF0YTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGltZXJfZGF0YS0+ZmlsZSA9IGZpbGU7CisgICAgICAgICAgICB0aW1lcl9kYXRhLT5saW5lID0gbGluZTsKKyAgICAgICAgfQorICAgIH0KKyAgICB0aW1lcl9kYXRhX211dGV4LnVubG9jaygpOworICAgIHJldHVybiB0aW1lcl9kYXRhOworfQorCisjZW5kaWYgLy8gVElNSU5HX1NVUFBPUlQKZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfdGltZXJfdGFyZ2V0LmNwcCBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfdGltZXJfdGFyZ2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGE0YzkxCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90aW1lcl90YXJnZXQuY3BwCkBAIC0wLDAgKzEsNjcgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgIm9mZmxvYWRfdGltZXIuaCIKKyNpbmNsdWRlICJvZmZsb2FkX3RhcmdldC5oIgorCisjaWZkZWYgX19JTlRFTF9DT01QSUxFUgorI2luY2x1ZGUgPGlhMzJpbnRyaW4uaD4KKyNlbHNlIC8vIF9fSU5URUxfQ09NUElMRVIKKyNpbmNsdWRlIDx4ODZpbnRyaW4uaD4KKyNlbmRpZiAvLyBfX0lOVEVMX0NPTVBJTEVSCisKKworCitpbnQgdGltZXJfZW5hYmxlZCA9IDA7CisKKyNpZmRlZiBUSU1JTkdfU1VQUE9SVAorCisjaWYgZGVmaW5lZChMSU5VWCkgfHwgZGVmaW5lZChGUkVFQlNEKQorc3RhdGljIF9fdGhyZWFkIE9mZmxvYWRUYXJnZXRUaW1lckRhdGEgdGltZXJfZGF0YTsKKyNlbHNlIC8vIFdJTk5UCitzdGF0aWMgX19kZWNsc3BlYyh0aHJlYWQpIE9mZmxvYWRUYXJnZXRUaW1lckRhdGEgdGltZXJfZGF0YTsKKyNlbmRpZiAvLyBkZWZpbmVkKExJTlVYKSB8fCBkZWZpbmVkKEZSRUVCU0QpCisKKwordm9pZCBvZmZsb2FkX3RpbWVyX3N0YXJ0KAorICAgIE9mZmxvYWRUYXJnZXRQaGFzZSBwX3R5cGUKKykKK3sKKyAgICB0aW1lcl9kYXRhLnBoYXNlc1twX3R5cGVdLnN0YXJ0ID0gX3JkdHNjKCk7Cit9CisKK3ZvaWQgb2ZmbG9hZF90aW1lcl9zdG9wKAorICAgIE9mZmxvYWRUYXJnZXRQaGFzZSBwX3R5cGUKKykKK3sKKyAgICB0aW1lcl9kYXRhLnBoYXNlc1twX3R5cGVdLnRvdGFsICs9IF9yZHRzYygpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVyX2RhdGEucGhhc2VzW3BfdHlwZV0uc3RhcnQ7Cit9CisKK3ZvaWQgb2ZmbG9hZF90aW1lcl9pbml0KCkKK3sKKyAgICBtZW1zZXQoJnRpbWVyX2RhdGEsIDAsIHNpemVvZihPZmZsb2FkVGFyZ2V0VGltZXJEYXRhKSk7Cit9CisKK3ZvaWQgb2ZmbG9hZF90aW1lcl9maWxsX3RhcmdldF9kYXRhKAorICAgIHZvaWQgKmJ1ZgorKQoreworICAgIHVpbnQ2NF90ICpkYXRhID0gKHVpbnQ2NF90KikgYnVmOworCisgICAgdGltZXJfZGF0YS5mcmVxdWVuY3kgPSBtaWNfZnJlcXVlbmN5OworICAgIG1lbWNweShkYXRhKyssICYodGltZXJfZGF0YS5mcmVxdWVuY3kpLCBzaXplb2YodWludDY0X3QpKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY19vZmZsb2FkX3RhcmdldF9tYXhfcGhhc2U7IGkrKykgeworICAgICAgICBtZW1jcHkoZGF0YSsrLCAmKHRpbWVyX2RhdGEucGhhc2VzW2ldLnRvdGFsKSwgc2l6ZW9mKHVpbnQ2NF90KSk7CisgICAgfQorfQorCisjZW5kaWYgLy8gVElNSU5HX1NVUFBPUlQKZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfdHJhY2UuY3BwIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90cmFjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEwNjIwNAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfdHJhY2UuY3BwCkBAIC0wLDAgKzEsMzA5IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJvZmZsb2FkX3RyYWNlLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgImxpYm9mZmxvYWRfZXJyb3JfY29kZXMuaCIKKworZXh0ZXJuIGNvbnN0IGNoYXIgKnByZWZpeDsKKworI2lmICFIT1NUX0xJQlJBUlkKK2V4dGVybiBpbnQgbWljX2luZGV4OworI2VuZGlmCisKKy8vIFRoZSBkZWJ1ZyByb3V0aW5lcworCitzdGF0aWMgY29uc3QgY2hhciAqIG9mZmxvYWRfc3RhZ2Uoc3RkOjpzdHJpbmdzdHJlYW0gJnNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZsb2FkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHByaW50X3RhZykKK3sKKyAgICBzcyA8PCAiWyIgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9vZmZsb2FkKSA8PCAiXSI7CisjaWYgSE9TVF9MSUJSQVJZCisgICAgc3MgPDwgIiBbIiA8PCBwcmVmaXggPDwgIl0iOworICAgIGlmIChwcmludF90YWcpIHsKKyAgICAgICAgc3MgPDwgIiAgWyIgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF90YWcpOworICAgICAgICBzcyA8PCAiICIgPDwgb2ZmbG9hZF9udW1iZXIgPDwgIl0iOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgc3MgPDwgIiAgICAgICAgICI7CisgICAgfQorICAgIHNzIDw8ICIgWyIgPDwgdGFnIDw8ICJdIjsKKyAgICBzcyA8PCAiICAgICAgICAgICAiIDw8IHRleHQ7CisjZWxzZQorICAgIHNzIDw8ICIgWyIgPDwgcHJlZml4IDw8ICIgIiA8PCBtaWNfaW5kZXggPDwgIl0iOworICAgIGlmIChwcmludF90YWcpIHsKKyAgICAgICAgc3MgPDwgIiBbIiA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3RhZyk7CisgICAgICAgIHNzIDw8ICIgIiA8PCBvZmZsb2FkX251bWJlciA8PCAiXSI7CisgICAgfQorICAgIHNzIDw8ICIgWyIgPDwgdGFnIDw8ICJdIjsKKyAgICBzcyA8PCAiICAgICAgICAgICAiIDw8IHRleHQ7CisjZW5kaWYKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBvZmZsb2FkX3NpZ25hbChzdGQ6OnN0cmluZ3N0cmVhbSAmc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZmxvYWRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0ZXh0KQoreworICAgIHNzIDw8ICJbIiA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X29mZmxvYWQpIDw8ICJdIjsKKyAgICBzcyA8PCAiIFsiIDw8IHByZWZpeCA8PCAiXSI7CisgICAgc3MgPDwgIiAgWyIgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF90YWcpOworICAgIHNzIDw8ICIgIiA8PCBvZmZsb2FkX251bWJlciA8PCAiXSI7CisgICAgc3MgPDwgIiBbIiA8PCB0YWcgPDwgIl0iOworICAgIHNzIDw8ICIgICAgICAgICAgIiA8PCB0ZXh0OworICAgIHJldHVybiAwOworfQorCit2b2lkIG9mZmxvYWRfc3RhZ2VfcHJpbnQoaW50IHN0YWdlLCBpbnQgb2ZmbG9hZF9udW1iZXIsIC4uLikKK3sKKyAgICBzdGQ6OnN0cmluZyBidWY7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgY2hhciBjb25zdCAqc3RyMTsKKyAgICBjaGFyIGNvbnN0ICpzdHIyOworICAgIHZhX2xpc3QgdmFfYXJnczsKKyAgICB2YV9zdGFydCh2YV9hcmdzLCBvZmZsb2FkX251bWJlcik7CisgICAgdmFfYXJnKHZhX2FyZ3MsIGNoYXIqKTsKKworICAgIHN3aXRjaCAoc3RhZ2UpIHsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfc3RhcnQ6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGFydCk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgdHJ1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfaW5pdDoKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X2luaXQpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIGZhbHNlKTsKKyAgICAgICAgICAgIHNzIDw8ICIgIiA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X2xvZ2ljYWxfY2FyZCk7CisgICAgICAgICAgICBzcyA8PCAiICIgPDwgdmFfYXJnKHZhX2FyZ3MsIGludCk7CisgICAgICAgICAgICBzcyA8PCAiID0gIiA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3BoeXNpY2FsX2NhcmQpOworICAgICAgICAgICAgc3MgPDwgIiAiIDw8IHZhX2FyZyh2YV9hcmdzLCBpbnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX3JlZ2lzdGVyOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfcmVnaXN0ZXIpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIHRydWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2luaXRfZnVuYzoKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X2luaXRfZnVuYyk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgdHJ1ZSk7CisgICAgICAgICAgICBzcyA8PCAiOiAiIDw8IHZhX2FyZyh2YV9hcmdzLCBjaGFyKik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfY3JlYXRlX2J1Zl9ob3N0OgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfY3JlYXRlX2J1Zl9ob3N0KTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCB0cnVlKTsKKyAgICAgICAgICAgIHNzIDw8ICI6IGJhc2U9MHgiIDw8IHN0ZDo6aGV4IDw8IHZhX2FyZyh2YV9hcmdzLCB1aW50NjRfdCk7CisgICAgICAgICAgICBzcyA8PCAiIGxlbmd0aD0iIDw8IHN0ZDo6ZGVjIDw8IHZhX2FyZyh2YV9hcmdzLCB1aW50NjRfdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfY3JlYXRlX2J1Zl9taWM6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9jcmVhdGVfYnVmX21pYyk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgdHJ1ZSk7CisgICAgICAgICAgICBzcyA8PCAiOiBzaXplPSIgPDwgdmFfYXJnKHZhX2FyZ3MsIHVpbnQ2NF90KTsKKyAgICAgICAgICAgIHNzIDw8ICIgb2Zmc2V0PSIgPDwgdmFfYXJnKHZhX2FyZ3MsIGludCk7CisgICAgICAgICAgICBpZiAodmFfYXJnKHZhX2FyZ3MsaW50KSkKKyAgICAgICAgICAgICAgIHNzIDw8ICIgKDJNIHBhZ2UpIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9zZW5kX3BvaW50ZXJfZGF0YToKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3NlbmRfcG9pbnRlcl9kYXRhKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCB0cnVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9zZW50X3BvaW50ZXJfZGF0YToKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3NlbnRfcG9pbnRlcl9kYXRhKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCB0cnVlKTsKKyAgICAgICAgICAgIHNzIDw8ICIgIiA8PCB2YV9hcmcodmFfYXJncywgdWludDY0X3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2dhdGhlcl9jb3B5aW5fZGF0YToKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X2dhdGhlcl9jb3B5aW5fZGF0YSk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgdHJ1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfY29weWluX2RhdGE6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9jb3B5aW5fZGF0YSk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgdHJ1ZSk7CisgICAgICAgICAgICBzcyA8PCAiICIgPDwgdmFfYXJnKHZhX2FyZ3MsIHVpbnQ2NF90KSA8PCAiICI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfY29tcHV0ZToKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X2NvbXB1dGUpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIHRydWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX3JlY2VpdmVfcG9pbnRlcl9kYXRhOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfcmVjZWl2ZV9wb2ludGVyX2RhdGEpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIHRydWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX3JlY2VpdmVkX3BvaW50ZXJfZGF0YToKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3JlY2VpdmVkX3BvaW50ZXJfZGF0YSk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgdHJ1ZSk7CisgICAgICAgICAgICBzcyA8PCAiICIgPDwgdmFfYXJnKHZhX2FyZ3MsIHVpbnQ2NF90KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9zdGFydF90YXJnZXRfZnVuYzoKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXJ0X3RhcmdldF9mdW5jKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCB0cnVlKTsKKyAgICAgICAgICAgIHNzIDw8ICI6ICIgPDwgdmFfYXJnKHZhX2FyZ3MsIGNoYXIqKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF92YXI6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF92YXIpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsICIgICIsIHRydWUpOworICAgICAgICAgICAgdmFfYXJnKHZhX2FyZ3MsIGludCk7CisgICAgICAgICAgICBzcyA8PCB2YV9hcmcodmFfYXJncywgY2hhciopOworICAgICAgICAgICAgc3MgPDwgIiAiIDw8ICIgIiA8PCB2YV9hcmcodmFfYXJncywgY2hhciopOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX3NjYXR0ZXJfY29weWluX2RhdGE6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zY2F0dGVyX2NvcHlpbl9kYXRhKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCB0cnVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9nYXRoZXJfY29weW91dF9kYXRhOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfZ2F0aGVyX2NvcHlvdXRfZGF0YSk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgdHJ1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfc2NhdHRlcl9jb3B5b3V0X2RhdGE6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zY2F0dGVyX2NvcHlvdXRfZGF0YSk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgdHJ1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfY29weW91dF9kYXRhOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfY29weW91dF9kYXRhKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCB0cnVlKTsKKyAgICAgICAgICAgIHNzIDw8ICIgICAiIDw8IHZhX2FyZyh2YV9hcmdzLCB1aW50NjRfdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfc2lnbmFsOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ2NF90ICAqc2lnbmFsOworICAgICAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlX3NpZ25hbCk7CisgICAgICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc2lnbmFsKTsKKyAgICAgICAgICAgICAgICBvZmZsb2FkX3NpZ25hbChzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIpOworCSAgICAgICAgc2lnbmFsID0gdmFfYXJnKHZhX2FyZ3MsIHVpbnQ2NF90Kik7CisJICAgICAgICBpZiAoc2lnbmFsKQorICAgICAgICAgICAgICAgICAgIHNzIDw8ICIgMHgiIDw8IHN0ZDo6aGV4IDw8ICpzaWduYWw7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgIHNzIDw8ICIgbm9uZSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfd2FpdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgY291bnQ7CisgICAgICAgICAgICAgICAgdWludDY0X3QgICoqc2lnbmFsOworICAgICAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlX3NpZ25hbCk7CisgICAgICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfd2FpdCk7CisgICAgICAgICAgICAgICAgb2ZmbG9hZF9zaWduYWwoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyKTsKKyAgICAgICAgICAgICAgICBjb3VudCA9IHZhX2FyZyh2YV9hcmdzLCBpbnQpOworICAgICAgICAgICAgICAgIHNpZ25hbCA9IHZhX2FyZyh2YV9hcmdzLCB1aW50NjRfdCoqKTsKKyAgICAgICAgICAgICAgICBpZiAoY291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNvdW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcyA8PCAiICIgPDwgc3RkOjpoZXggPDwgc2lnbmFsW2NvdW50LTFdOworICAgICAgICAgICAgICAgICAgICAgICAgY291bnQtLTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHNzIDw8ICIgbm9uZSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfdW5yZWdpc3RlcjoKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3VucmVnaXN0ZXIpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIGZhbHNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9kZXN0cm95OgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfZGVzdHJveSk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgdHJ1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfbXlvaW5pdDoKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X215b2luaXQpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIGZhbHNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9teW9yZWdpc3RlcjoKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X215b3JlZ2lzdGVyKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCBmYWxzZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfbXlvZmluaToKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X215b2ZpbmkpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIGZhbHNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9taWNfbXlvX3NoYXJlZDoKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X21pY19teW9fc2hhcmVkKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCBmYWxzZSk7CisgICAgICAgICAgICBzcyA8PCAiICIgPDwgdmFfYXJnKHZhX2FyZ3MsIGNoYXIqKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9taWNfbXlvX2ZwdHI6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9taWNfbXlvX2ZwdHIpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIGZhbHNlKTsKKyAgICAgICAgICAgIHNzIDw8ICIgIiA8PCB2YV9hcmcodmFfYXJncywgY2hhciopOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX215b3NoYXJlZG1hbGxvYzoKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X215b3NoYXJlZG1hbGxvYyk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgZmFsc2UpOworICAgICAgICAgICAgdmFfYXJnKHZhX2FyZ3MsIGNoYXIqKTsKKyAgICAgICAgICAgIHNzIDw8ICIgIiA8PCB2YV9hcmcodmFfYXJncywgc2l6ZV90KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9teW9zaGFyZWRmcmVlOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfbXlvc2hhcmVkZnJlZSk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgZmFsc2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX215b3NoYXJlZGFsaWduZWRtYWxsb2M6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9teW9zaGFyZWRhbGlnbmVkbWFsbG9jKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCBmYWxzZSk7CisgICAgICAgICAgICB2YV9hcmcodmFfYXJncywgY2hhciopOworICAgICAgICAgICAgc3MgPDwgIiAiIDw8IHZhX2FyZyh2YV9hcmdzLCBzaXplX3QpOworICAgICAgICAgICAgc3MgPDwgIiAiIDw8IHZhX2FyZyh2YV9hcmdzLCBzaXplX3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX215b3NoYXJlZGFsaWduZWRmcmVlOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfbXlvc2hhcmVkYWxpZ25lZGZyZWUpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIGZhbHNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9teW9hY3F1aXJlOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfbXlvYWNxdWlyZSk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgZmFsc2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX215b3JlbGVhc2U6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9teW9yZWxlYXNlKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCBmYWxzZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19yZXBvcnRfdW5rbm93bl90cmFjZV9ub2RlKTsKKyAgICAgICAgICAgIGFib3J0KCk7CisgICAgfQorICAgIHNzIDw8ICJcbiI7CisgICAgYnVmID0gc3Muc3RyKCk7CisgICAgZnByaW50ZihzdGRvdXQsIGJ1Zi5kYXRhKCkpOworICAgIGZmbHVzaChzdGRvdXQpOworCisgICAgdmFfZW5kKHZhX2FyZ3MpOworICAgIHJldHVybjsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfdHJhY2UuaCBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfdHJhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWMyOGE0Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90cmFjZS5oCkBAIC0wLDAgKzEsNTIgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLy8gVGhlIHBhcnRzIG9mIHRoZSBvZmZsb2FkIGxpYnJhcnkgY29tbW9uIHRvIGhvc3QgYW5kIHRhcmdldAorCit2b2lkIG9mZmxvYWRfc3RhZ2VfcHJpbnQoaW50IHN0YWdlLCBpbnQgb2ZmbG9hZF9udW1iZXIsIC4uLik7CisKK2VudW0gT2ZmbG9hZFRyYWNlU3RhZ2UgeworICAgIC8vIFRvdGFsIHRpbWUgc3BlbnQgb24gdGhlIHRhcmdldAorICAgIGNfb2ZmbG9hZF9zdGFydCA9IDAsCisgICAgY19vZmZsb2FkX2luaXQsCisgICAgY19vZmZsb2FkX3JlZ2lzdGVyLAorICAgIGNfb2ZmbG9hZF9pbml0X2Z1bmMsCisgICAgY19vZmZsb2FkX2NyZWF0ZV9idWZfaG9zdCwKKyAgICBjX29mZmxvYWRfY3JlYXRlX2J1Zl9taWMsCisgICAgY19vZmZsb2FkX3NlbmRfcG9pbnRlcl9kYXRhLAorICAgIGNfb2ZmbG9hZF9zZW50X3BvaW50ZXJfZGF0YSwKKyAgICBjX29mZmxvYWRfZ2F0aGVyX2NvcHlpbl9kYXRhLAorICAgIGNfb2ZmbG9hZF9jb3B5aW5fZGF0YSwKKyAgICBjX29mZmxvYWRfY29tcHV0ZSwKKyAgICBjX29mZmxvYWRfcmVjZWl2ZV9wb2ludGVyX2RhdGEsCisgICAgY19vZmZsb2FkX3JlY2VpdmVkX3BvaW50ZXJfZGF0YSwKKyAgICBjX29mZmxvYWRfc3RhcnRfdGFyZ2V0X2Z1bmMsCisgICAgY19vZmZsb2FkX3ZhciwKKyAgICBjX29mZmxvYWRfc2NhdHRlcl9jb3B5aW5fZGF0YSwKKyAgICBjX29mZmxvYWRfZ2F0aGVyX2NvcHlvdXRfZGF0YSwKKyAgICBjX29mZmxvYWRfc2NhdHRlcl9jb3B5b3V0X2RhdGEsCisgICAgY19vZmZsb2FkX2NvcHlvdXRfZGF0YSwKKyAgICBjX29mZmxvYWRfc2lnbmFsLAorICAgIGNfb2ZmbG9hZF93YWl0LAorICAgIGNfb2ZmbG9hZF91bnJlZ2lzdGVyLAorICAgIGNfb2ZmbG9hZF9kZXN0cm95LAorICAgIGNfb2ZmbG9hZF9maW5pc2gsCisgICAgY19vZmZsb2FkX215b2luaXQsCisgICAgY19vZmZsb2FkX215b3JlZ2lzdGVyLAorICAgIGNfb2ZmbG9hZF9taWNfbXlvX3NoYXJlZCwKKyAgICBjX29mZmxvYWRfbWljX215b19mcHRyLAorICAgIGNfb2ZmbG9hZF9teW9zaGFyZWRtYWxsb2MsCisgICAgY19vZmZsb2FkX215b3NoYXJlZGZyZWUsCisgICAgY19vZmZsb2FkX215b3NoYXJlZGFsaWduZWRtYWxsb2MsCisgICAgY19vZmZsb2FkX215b3NoYXJlZGFsaWduZWRmcmVlLAorICAgIGNfb2ZmbG9hZF9teW9hY3F1aXJlLAorICAgIGNfb2ZmbG9hZF9teW9yZWxlYXNlLAorICAgIGNfb2ZmbG9hZF9teW9maW5pCit9OwpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF91dGlsLmNwcCBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfdXRpbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg0NjJjOAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfdXRpbC5jcHAKQEAgLTAsMCArMSwyMDYgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgIm9mZmxvYWRfdXRpbC5oIgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSAibGlib2ZmbG9hZF9lcnJvcl9jb2Rlcy5oIgorCisjaWZkZWYgVEFSR0VUX1dJTk5UCit2b2lkICp0aHJlYWRfZ2V0c3BlY2lmaWMocHRocmVhZF9rZXlfdCBrZXkpCit7CisgICAgaWYgKGtleSA9PSAwKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFRsc0dldFZhbHVlKGtleSk7CisgICAgfQorfQorCitpbnQgdGhyZWFkX3NldHNwZWNpZmljKHB0aHJlYWRfa2V5X3Qga2V5LCBjb25zdCB2b2lkICp2YWx1ZSkKK3sKKyAgICByZXR1cm4gKFRsc1NldFZhbHVlKGtleSwgKExQVk9JRCl2YWx1ZSkpID8gMCA6IEdldExhc3RFcnJvcigpOworfQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCitib29sIF9fb2ZmbG9hZF9wYXJzZV9zaXplX3N0cmluZyhjb25zdCBjaGFyICpzdHIsIHVpbnQ2NF90ICZuZXdfc2l6ZSkKK3sKKyAgICB1aW50NjRfdCB2YWw7CisgICAgY2hhciAqc3VmZml4OworCisgICAgZXJybm8gPSAwOworI2lmZGVmIFRBUkdFVF9XSU5OVAorICAgIHZhbCA9IHN0cnRvdWwoc3RyLCAmc3VmZml4LCAxMCk7CisjZWxzZSAvLyBUQVJHRVRfV0lOTlQKKyAgICB2YWwgPSBzdHJ0b3VsbChzdHIsICZzdWZmaXgsIDEwKTsKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKyAgICBpZiAoZXJybm8gIT0gMCB8fCBzdWZmaXggPT0gc3RyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoc3VmZml4WzBdID09ICdcMCcpIHsKKyAgICAgICAgLy8gZGVmYXVsdCBpcyBLaWxvYnl0ZXMKKyAgICAgICAgbmV3X3NpemUgPSB2YWwgKiAxMDI0OworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgZWxzZSBpZiAoc3VmZml4WzFdID09ICdcMCcpIHsKKyAgICAgICAgLy8gT3B0aW9uYWwgc3VmZml4ZXM6IEIgKGJ5dGVzKSwgSyAoS2lsb2J5dGVzKSwgTSAoTWVnYWJ5dGVzKSwKKyAgICAgICAgLy8gRyAoR2lnYWJ5dGVzKSwgb3IgVCAoVGVyYWJ5dGVzKSBzcGVjaWZ5IHRoZSB1bml0cy4KKyAgICAgICAgc3dpdGNoIChzdWZmaXhbMF0pIHsKKyAgICAgICAgICAgIGNhc2UgJ2InOgorICAgICAgICAgICAgY2FzZSAnQic6CisgICAgICAgICAgICAgICAgbmV3X3NpemUgPSB2YWw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgJ2snOgorICAgICAgICAgICAgY2FzZSAnSyc6CisgICAgICAgICAgICAgICAgbmV3X3NpemUgPSB2YWwgKiAxMDI0OworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICdtJzoKKyAgICAgICAgICAgIGNhc2UgJ00nOgorICAgICAgICAgICAgICAgIG5ld19zaXplID0gdmFsICogMTAyNCAqIDEwMjQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgJ2cnOgorICAgICAgICAgICAgY2FzZSAnRyc6CisgICAgICAgICAgICAgICAgbmV3X3NpemUgPSB2YWwgKiAxMDI0ICogMTAyNCAqIDEwMjQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgJ3QnOgorICAgICAgICAgICAgY2FzZSAnVCc6CisgICAgICAgICAgICAgICAgbmV3X3NpemUgPSB2YWwgKiAxMDI0ICogMTAyNCAqIDEwMjQgKiAxMDI0OworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgX19vZmZsb2FkX3BhcnNlX2ludF9zdHJpbmcoY29uc3QgY2hhciAqc3RyLCBpbnQ2NF90ICZ2YWx1ZSkKK3sKKyAgICBpbnQ2NF90IHZhbDsKKyAgICBjaGFyICpzdWZmaXg7CisKKyAgICBlcnJubyA9IDA7CisjaWZkZWYgVEFSR0VUX1dJTk5UCisgICAgdmFsID0gc3RydG9sKHN0ciwgJnN1ZmZpeCwgMCk7CisjZWxzZQorICAgIHZhbCA9IHN0cnRvbGwoc3RyLCAmc3VmZml4LCAwKTsKKyNlbmRpZgorICAgIGlmIChlcnJubyA9PSAwICYmIHN1ZmZpeCAhPSBzdHIgJiYgKnN1ZmZpeCA9PSAnXDAnKSB7CisgICAgICAgIHZhbHVlID0gdmFsOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisjaWZkZWYgVEFSR0VUX1dJTk5UCitleHRlcm4gdm9pZCogRExfb3Blbihjb25zdCBjaGFyICpwYXRoKQoreworICAgIHZvaWQgKmhhbmRsZTsKKyAgICBpbnQgZXJyb3JfbW9kZTsKKworICAgIC8qCisgICAgICogZG8gbm90IGRpc3BsYXkgbWVzc2FnZSBib3ggd2l0aCBlcnJvciBpZiBpdCB0aGUgY2FsbCBiZWxvdyBmYWlscyB0bworICAgICAqIGxvYWQgZHluYW1pYyBsaWJyYXJ5LgorICAgICAqLworICAgIGVycm9yX21vZGUgPSBTZXRFcnJvck1vZGUoU0VNX0ZBSUxDUklUSUNBTEVSUk9SUyB8IFNFTV9OT09QRU5GSUxFRVJST1JCT1gpOworCisgICAgLyogbG9hZCBkeW5hbWljIGxpYnJhcnkgKi8KKyAgICBoYW5kbGUgPSAodm9pZCopIExvYWRMaWJyYXJ5KHBhdGgpOworCisgICAgLyogcmVzdG9yZSBlcnJvciBtb2RlICovCisgICAgU2V0RXJyb3JNb2RlKGVycm9yX21vZGUpOworCisgICAgcmV0dXJuIGhhbmRsZTsKK30KKworZXh0ZXJuIGludCBETF9hZGRyKGNvbnN0IHZvaWQgKmFkZHIsIERsX2luZm8gKmRsX2luZm8pCit7CisgICAgTUVNT1JZX0JBU0lDX0lORk9STUFUSU9OIG1lbV9pbmZvOworICAgIGNoYXIgbW9kX25hbWVbTUFYX1BBVEhdOworICAgIEhNT0RVTEUgbW9kX2hhbmRsZTsKKworICAgIC8qIEZpbGwgTUVNT1JZX0JBU0lDX0lORk9STUFUSU9OIHN0cnVjdCAqLworICAgIGlmICghVmlydHVhbFF1ZXJ5KGFkZHIsICZtZW1faW5mbywgc2l6ZW9mKG1lbV9pbmZvKSkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIG1vZF9oYW5kbGUgPSAoSE1PRFVMRSltZW1faW5mby5BbGxvY2F0aW9uQmFzZTsKKworICAgIC8qIEFOU0kgZmlsZSBuYW1lIGZvciBtb2R1bGUgKi8KKyAgICBpZiAoIUdldE1vZHVsZUZpbGVOYW1lQShtb2RfaGFuZGxlLCAoY2hhciopIG1vZF9uYW1lLCBzaXplb2YobW9kX25hbWUpKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgc3RyY3B5KGRsX2luZm8tPmRsaV9mbmFtZSwgbW9kX25hbWUpOworICAgIGRsX2luZm8tPmRsaV9mYmFzZSA9IG1lbV9pbmZvLkJhc2VBZGRyZXNzOworICAgIGRsX2luZm8tPmRsaV9zYWRkciA9IGFkZHI7CisgICAgc3RyY3B5KGRsX2luZm8tPmRsaV9zbmFtZSwgbW9kX25hbWUpOworICAgIHJldHVybiAxOworfQorCisvLyBSdW4gb25jZQorc3RhdGljIEJPT0wgQ0FMTEJBQ0sgX19vZmZsb2FkX3J1bl9vbmNlX3dyYXBwZXIoCisgICAgUElOSVRfT05DRSBpbml0T25jZSwKKyAgICBQVk9JRCBwYXJhbWV0ZXIsCisgICAgUFZPSUQgKmNvbnRleHQKKykKK3sKKyAgICB2b2lkICgqaW5pdF9yb3V0aW5lKSh2b2lkKSA9ICh2b2lkKCopKHZvaWQpKSBwYXJhbWV0ZXI7CisgICAgaW5pdF9yb3V0aW5lKCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgX19vZmZsb2FkX3J1bl9vbmNlKE9mZmxvYWRPbmNlQ29udHJvbCAqY3RybCwgdm9pZCAoKmZ1bmMpKHZvaWQpKQoreworICAgIEluaXRPbmNlRXhlY3V0ZU9uY2UoY3RybCwgX19vZmZsb2FkX3J1bl9vbmNlX3dyYXBwZXIsICh2b2lkKikgZnVuYywgMCk7Cit9CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKy8qIEFSR1NVU0VEICovIC8vIHZlcnNpb24gaXMgbm90IHVzZWQgb24gd2luZG93cwordm9pZCogRExfc3ltKHZvaWQgKmhhbmRsZSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmVyc2lvbikKK3sKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyAgICByZXR1cm4gR2V0UHJvY0FkZHJlc3MoKEhNT0RVTEUpIGhhbmRsZSwgbmFtZSk7CisjZWxzZSAvLyBUQVJHRVRfV0lOTlQKKyAgICBpZiAodmVyc2lvbiA9PSAwKSB7CisgICAgICAgIHJldHVybiBkbHN5bShoYW5kbGUsIG5hbWUpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGRsdnN5bShoYW5kbGUsIG5hbWUsIHZlcnNpb24pOworICAgIH0KKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKK30KKworaW50NjRfdCBnZXRfZWxfdmFsdWUoCisgICAgICAgICAgICAgICAgICAgICBjaGFyICpiYXNlLAorICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHNpemUpCit7CisgICAgaW50NjRfdCB2YWwgPSAwOworICAgIHN3aXRjaCAoc2l6ZSkgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICB2YWwgPSBzdGF0aWNfY2FzdDxpbnQ2NF90PigqKChjaGFyICopKGJhc2UgKyBvZmZzZXQpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgdmFsID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oKigoc2hvcnQgKikoYmFzZSArIG9mZnNldCkpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICB2YWwgPSBzdGF0aWNfY2FzdDxpbnQ2NF90PigqKChpbnQgKikoYmFzZSArIG9mZnNldCkpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdmFsID0gKigoaW50NjRfdCAqKShiYXNlICsgb2Zmc2V0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHZhbDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfdXRpbC5oIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF91dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUwZDc3ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfdXRpbC5oCkBAIC0wLDAgKzEsMTUzIEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgT0ZGTE9BRF9VVElMX0hfSU5DTFVERUQKKyNkZWZpbmUgT0ZGTE9BRF9VVElMX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8cHJvY2Vzcy5oPgorI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKyNpZmRlZiBUQVJHRVRfV0lOTlQKK3R5cGVkZWYgdW5zaWduZWQgcHRocmVhZF9rZXlfdDsKK3R5cGVkZWYgaW50IHBpZF90OworCisjZGVmaW5lIF9fZnVuY19fIF9fRlVOQ1RJT05fXworI2RlZmluZSBzdHJ0b2tfcihzLGQscCkgc3RydG9rX3MocyxkLHApCisjZGVmaW5lIHN0cmNhc2VjbXAoYSxiKSBzdHJpY21wKGEsYikKKworI2RlZmluZSB0aHJlYWRfa2V5X2NyZWF0ZShrZXksIGRlc3RydWN0b3IpIFwKKyAgICAoKCgqa2V5ID0gVGxzQWxsb2MoKSkgPiAwKSA/IDAgOiBHZXRMYXN0RXJyb3IoKSkKKyNkZWZpbmUgdGhyZWFkX2tleV9kZWxldGUoa2V5KSBUbHNGcmVlKGtleSkKKworI2lmbmRlZiBTX0lTUkVHCisjZGVmaW5lIFNfSVNSRUcobW9kZSkgICgoKG1vZGUpICYgU19JRk1UKSA9PSBTX0lGUkVHKQorI2VuZGlmCisKK3ZvaWQqICAgdGhyZWFkX2dldHNwZWNpZmljKHB0aHJlYWRfa2V5X3Qga2V5KTsKK2ludCAgICAgdGhyZWFkX3NldHNwZWNpZmljKHB0aHJlYWRfa2V5X3Qga2V5LCBjb25zdCB2b2lkICp2YWx1ZSk7CisjZWxzZQorI2RlZmluZSB0aHJlYWRfa2V5X2NyZWF0ZShrZXksIGRlc3RydWN0b3IpIFwKKyAgICAgICAgICAgIHB0aHJlYWRfa2V5X2NyZWF0ZSgoa2V5KSwgKGRlc3RydWN0b3IpKQorI2RlZmluZSB0aHJlYWRfa2V5X2RlbGV0ZShrZXkpICBwdGhyZWFkX2tleV9kZWxldGUoa2V5KQorI2RlZmluZSB0aHJlYWRfZ2V0c3BlY2lmaWMoa2V5KSBwdGhyZWFkX2dldHNwZWNpZmljKGtleSkKKyNkZWZpbmUgdGhyZWFkX3NldHNwZWNpZmljKGtleSwgdmFsdWUpIHB0aHJlYWRfc2V0c3BlY2lmaWMoa2V5LCB2YWx1ZSkKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKworLy8gTXV0ZXggaW1wbGVtZW50YXRpb24KK3N0cnVjdCBtdXRleF90IHsKKyAgICBtdXRleF90KCkgeworI2lmZGVmIFRBUkdFVF9XSU5OVAorICAgICAgICBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKCZtX2xvY2spOworI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCisgICAgICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmbV9sb2NrLCAwKTsKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKyAgICB9CisKKyAgICB+bXV0ZXhfdCgpIHsKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyAgICAgICAgRGVsZXRlQ3JpdGljYWxTZWN0aW9uKCZtX2xvY2spOworI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCisgICAgICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbV9sb2NrKTsKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKyAgICB9CisKKyAgICB2b2lkIGxvY2soKSB7CisjaWZkZWYgVEFSR0VUX1dJTk5UCisgICAgICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZtX2xvY2spOworI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbV9sb2NrKTsKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKyAgICB9CisKKyAgICB2b2lkIHVubG9jaygpIHsKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyAgICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJm1fbG9jayk7CisjZWxzZSAvLyBUQVJHRVRfV0lOTlQKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1fbG9jayk7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisgICAgfQorCitwcml2YXRlOgorI2lmZGVmIFRBUkdFVF9XSU5OVAorICAgIENSSVRJQ0FMX1NFQ1RJT04gICAgbV9sb2NrOworI2Vsc2UKKyAgICBwdGhyZWFkX211dGV4X3QgICAgIG1fbG9jazsKKyNlbmRpZgorfTsKKworc3RydWN0IG11dGV4X2xvY2tlcl90IHsKKyAgICBtdXRleF9sb2NrZXJfdChtdXRleF90ICZtdXRleCkgOiBtX211dGV4KG11dGV4KSB7CisgICAgICAgIG1fbXV0ZXgubG9jaygpOworICAgIH0KKworICAgIH5tdXRleF9sb2NrZXJfdCgpIHsKKyAgICAgICAgbV9tdXRleC51bmxvY2soKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgbXV0ZXhfdCAmbV9tdXRleDsKK307CisKKy8vIER5bmFtaWMgbG9hZGVyIGludGVyZmFjZQorI2lmZGVmIFRBUkdFVF9XSU5OVAorc3RydWN0IERsX2luZm8KK3sKKyAgICBjaGFyICAgICAgICBkbGlfZm5hbWVbTUFYX1BBVEhdOworICAgIHZvaWQgICAgICAgKmRsaV9mYmFzZTsKKyAgICBjaGFyICAgICAgICBkbGlfc25hbWVbTUFYX1BBVEhdOworICAgIGNvbnN0IHZvaWQgKmRsaV9zYWRkcjsKK307CisKK3ZvaWQqICAgRExfb3Blbihjb25zdCBjaGFyICpwYXRoKTsKKyNkZWZpbmUgRExfY2xvc2UoaGFuZGxlKSAgICAgICAgRnJlZUxpYnJhcnkoKEhNT0RVTEUpIChoYW5kbGUpKQoraW50ICAgICBETF9hZGRyKGNvbnN0IHZvaWQgKmFkZHIsIERsX2luZm8gKmluZm8pOworI2Vsc2UKKyNkZWZpbmUgRExfb3BlbihwYXRoKSAgICAgICAgICAgZGxvcGVuKChwYXRoKSwgUlRMRF9OT1cpCisjZGVmaW5lIERMX2Nsb3NlKGhhbmRsZSkgICAgICAgIGRsY2xvc2UoaGFuZGxlKQorI2RlZmluZSBETF9hZGRyKGFkZHIsIGluZm8pICAgICBkbGFkZHIoKGFkZHIpLCAoaW5mbykpCisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKK2V4dGVybiB2b2lkKiBETF9zeW0odm9pZCAqaGFuZGxlLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2ZXJzaW9uKTsKKworLy8gT25lLXRpbWUgaW5pdGlhbGl6YXRpb24gQVBJCisjaWZkZWYgVEFSR0VUX1dJTk5UCit0eXBlZGVmIElOSVRfT05DRSAgICAgICAgICAgICAgICAgICBPZmZsb2FkT25jZUNvbnRyb2w7CisjZGVmaW5lIE9GRkxPQURfT05DRV9DT05UUk9MX0lOSVQgICBJTklUX09OQ0VfU1RBVElDX0lOSVQKKworZXh0ZXJuIHZvaWQgX19vZmZsb2FkX3J1bl9vbmNlKE9mZmxvYWRPbmNlQ29udHJvbCAqY3RybCwgdm9pZCAoKmZ1bmMpKHZvaWQpKTsKKyNlbHNlCit0eXBlZGVmIHB0aHJlYWRfb25jZV90ICAgICAgICAgICAgICBPZmZsb2FkT25jZUNvbnRyb2w7CisjZGVmaW5lIE9GRkxPQURfT05DRV9DT05UUk9MX0lOSVQgICBQVEhSRUFEX09OQ0VfSU5JVAorCisjZGVmaW5lIF9fb2ZmbG9hZF9ydW5fb25jZShjdHJsLCBmdW5jKSBwdGhyZWFkX29uY2UoY3RybCwgZnVuYykKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKworLy8gUGFyc2VzIHNpemUgc3BlY2lmaWNhdGlvbiBzdHJpbmcuCitleHRlcm4gYm9vbCBfX29mZmxvYWRfcGFyc2Vfc2l6ZV9zdHJpbmcoY29uc3QgY2hhciAqc3RyLCB1aW50NjRfdCAmbmV3X3NpemUpOworCisvLyBQYXJzZXMgc3RyaW5nIHdpdGggaW50ZWdlciB2YWx1ZQorZXh0ZXJuIGJvb2wgX19vZmZsb2FkX3BhcnNlX2ludF9zdHJpbmcoY29uc3QgY2hhciAqc3RyLCBpbnQ2NF90ICZ2YWx1ZSk7CisKKy8vIGdldCB2YWx1ZSBieSBpdHMgYmFzZSwgb2Zmc2V0IGFuZCBzaXplCitpbnQ2NF90IGdldF9lbF92YWx1ZSgKKyAgICBjaGFyICAgKmJhc2UsCisgICAgaW50NjRfdCBvZmZzZXQsCisgICAgaW50NjRfdCBzaXplCispOworI2VuZGlmIC8vIE9GRkxPQURfVVRJTF9IX0lOQ0xVREVECmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vZmxkYmVnaW4uY3BwIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZsZGJlZ2luLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDVmOTgyCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZsZGJlZ2luLmNwcApAQCAtMCwwICsxLDE2NCBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWYgSE9TVF9MSUJSQVJZCisjaW5jbHVkZSAib2ZmbG9hZF9ob3N0LmgiCisjaW5jbHVkZSAib2ZmbG9hZF9teW9faG9zdC5oIgorI2Vsc2UKKyNpbmNsdWRlICJjb21waWxlcl9pZl90YXJnZXQuaCIKKyNpbmNsdWRlICJvZmZsb2FkX3RhcmdldC5oIgorI2luY2x1ZGUgIm9mZmxvYWRfbXlvX3RhcmdldC5oIgorI2VuZGlmCisKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyNkZWZpbmUgQUxMT0NBVEUobmFtZSkgX19kZWNsc3BlYyhhbGxvY2F0ZShuYW1lKSkKKyNkZWZpbmUgRExMX0xPQ0FMCisjZWxzZSAvLyBUQVJHRVRfV0lOTlQKKyNkZWZpbmUgQUxMT0NBVEUobmFtZSkgX19hdHRyaWJ1dGVfXygoc2VjdGlvbihuYW1lKSkpCisjZGVmaW5lIERMTF9MT0NBTCAgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiaGlkZGVuIikpKQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisjaWYgSE9TVF9MSUJSQVJZCisvLyB0aGUgaG9zdCBwcm9ncmFtL3NoYXJlZCBsaWJyYXJ5IHNob3VsZCBhbHdheXMgaGF2ZSBfX29mZmxvYWRfdGFyZ2V0X2ltYWdlCisvLyBzeW1ib2wgZGVmaW5lZC4gVGhpcyBzeW1ib2wgc3BlY2lmaWVzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRhcmdldCBwcm9ncmFtCisvLyBpbWFnZS4KK2V4dGVybiAiQyIgRExMX0xPQ0FMIGNvbnN0IHZvaWQqIF9fb2ZmbG9hZF90YXJnZXRfaW1hZ2U7CisjZWxzZSAvLyBIT1NUX0xJQlJBUlkKKy8vIERlZmluZSBhIHdlYWsgbWFpbiB3aGljaCB3b3VsZCBiZSB1c2VkIG9uIHRhcmdldCBzaWRlIGluIGNhc2UgdXNlcmUncworLy8gc291cmNlIGZpbGUgY29udGFpbmluZyBtYWluIGRvZXMgbm90IGhhdmUgb2ZmbG9hZCBjb2RlLgorI3ByYWdtYSB3ZWFrIG1haW4KK2ludCBtYWluKHZvaWQpCit7CisgICAgT0ZGTE9BRF9UQVJHRVRfTUFJTigpOworICAgIHJldHVybiAwOworfQorCisjcHJhZ21hIHdlYWsgTUFJTl9fCitleHRlcm4gIkMiIGludCBNQUlOX18odm9pZCkKK3sKKyAgICBPRkZMT0FEX1RBUkdFVF9NQUlOKCk7CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYgLy8gSE9TVF9MSUJSQVJZCisKKy8vIG9mZmxvYWQgc2VjdGlvbiBwcm9sb2cKK0FMTE9DQVRFKE9GRkxPQURfRU5UUllfVEFCTEVfU0VDVElPTl9TVEFSVCkKKyNpZmRlZiBUQVJHRVRfV0lOTlQKK19fZGVjbHNwZWMoYWxpZ24oc2l6ZW9mKEZ1bmNUYWJsZTo6RW50cnkpKSkKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKK3N0YXRpYyBGdW5jVGFibGU6OkVudHJ5IF9fb2ZmbG9hZF9lbnRyeV90YWJsZV9zdGFydCA9IHsgMCB9OworCisvLyBsaXN0IGVsZW1lbnQgZm9yIHRoZSBjdXJyZW50IG1vZHVsZQorc3RhdGljIEZ1bmNMaXN0OjpOb2RlIF9fb2ZmbG9hZF9lbnRyeV9ub2RlID0geworICAgIHsgJl9fb2ZmbG9hZF9lbnRyeV90YWJsZV9zdGFydCArIDEsIC0xIH0sCisgICAgMCwgMAorfTsKKworLy8gb2ZmbG9hZCBmcCBzZWN0aW9uIHByb2xvZworQUxMT0NBVEUoT0ZGTE9BRF9GVU5DX1RBQkxFX1NFQ1RJT05fU1RBUlQpCisjaWZkZWYgVEFSR0VUX1dJTk5UCitfX2RlY2xzcGVjKGFsaWduKHNpemVvZihGdW5jVGFibGU6OkVudHJ5KSkpCisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCitzdGF0aWMgRnVuY1RhYmxlOjpFbnRyeSBfX29mZmxvYWRfZnVuY190YWJsZV9zdGFydCA9IHsgMCB9OworCisvLyBsaXN0IGVsZW1lbnQgZm9yIHRoZSBjdXJyZW50IG1vZHVsZQorc3RhdGljIEZ1bmNMaXN0OjpOb2RlIF9fb2ZmbG9hZF9mdW5jX25vZGUgPSB7CisgICAgeyAmX19vZmZsb2FkX2Z1bmNfdGFibGVfc3RhcnQgKyAxLCAtMSB9LAorICAgIDAsIDAKK307CisKKy8vIG9mZmxvYWQgZnAgc2VjdGlvbiBwcm9sb2cKK0FMTE9DQVRFKE9GRkxPQURfVkFSX1RBQkxFX1NFQ1RJT05fU1RBUlQpCisjaWZkZWYgVEFSR0VUX1dJTk5UCitfX2RlY2xzcGVjKGFsaWduKHNpemVvZihWYXJUYWJsZTo6RW50cnkpKSkKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKK3N0YXRpYyBWYXJUYWJsZTo6RW50cnkgX19vZmZsb2FkX3Zhcl90YWJsZV9zdGFydCA9IHsgMCB9OworCisvLyBsaXN0IGVsZW1lbnQgZm9yIHRoZSBjdXJyZW50IG1vZHVsZQorc3RhdGljIFZhckxpc3Q6Ok5vZGUgX19vZmZsb2FkX3Zhcl9ub2RlID0geworICAgIHsgJl9fb2ZmbG9hZF92YXJfdGFibGVfc3RhcnQgKyAxIH0sCisgICAgMCwgMAorfTsKKworI2lmZGVmIE1ZT19TVVBQT1JUCisKKy8vIG9mZmxvYWQgbXlvIHNoYXJlZCB2YXIgc2VjdGlvbiBwcm9sb2cKK0FMTE9DQVRFKE9GRkxPQURfTVlPX1NIQVJFRF9UQUJMRV9TRUNUSU9OX1NUQVJUKQorI2lmZGVmIFRBUkdFVF9XSU5OVAorX19kZWNsc3BlYyhhbGlnbihzaXplb2YoU2hhcmVkVGFibGVFbnRyeSkpKQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorc3RhdGljIFNoYXJlZFRhYmxlRW50cnkgX19vZmZsb2FkX215b19zaGFyZWRfdGFibGVfc3RhcnQgPSB7IDAgfTsKKworI2lmIEhPU1RfTElCUkFSWQorLy8gb2ZmbG9hZCBteW8gc2hhcmVkIHZhciBpbml0IHNlY3Rpb24gcHJvbG9nCitBTExPQ0FURShPRkZMT0FEX01ZT19TSEFSRURfSU5JVF9UQUJMRV9TRUNUSU9OX1NUQVJUKQorI2lmZGVmIFRBUkdFVF9XSU5OVAorX19kZWNsc3BlYyhhbGlnbihzaXplb2YoSW5pdFRhYmxlRW50cnkpKSkKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKK3N0YXRpYyBJbml0VGFibGVFbnRyeSBfX29mZmxvYWRfbXlvX3NoYXJlZF9pbml0X3RhYmxlX3N0YXJ0ID0geyAwIH07CisjZW5kaWYKKworLy8gb2ZmbG9hZCBteW8gZnB0ciBzZWN0aW9uIHByb2xvZworQUxMT0NBVEUoT0ZGTE9BRF9NWU9fRlBUUl9UQUJMRV9TRUNUSU9OX1NUQVJUKQorI2lmZGVmIFRBUkdFVF9XSU5OVAorX19kZWNsc3BlYyhhbGlnbihzaXplb2YoRnB0clRhYmxlRW50cnkpKSkKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKK3N0YXRpYyBGcHRyVGFibGVFbnRyeSBfX29mZmxvYWRfbXlvX2ZwdHJfdGFibGVfc3RhcnQgPSB7IDAgfTsKKworI2VuZGlmIC8vIE1ZT19TVVBQT1JUCisKKy8vIGluaXQvZmluaSBjb2RlIHdoaWNoIGFkZHMvcmVtb3ZlcyBsb2NhbCBsb29rdXAgZGF0YSB0by9mcm9tIHRoZSBnbG9iYWwgbGlzdAorCitzdGF0aWMgdm9pZCBvZmZsb2FkX2ZpbmkoKTsKKworI2lmbmRlZiBUQVJHRVRfV0lOTlQKK3N0YXRpYyB2b2lkIG9mZmxvYWRfaW5pdCgpIF9fYXR0cmlidXRlX18oKGNvbnN0cnVjdG9yKDEwMSkpKTsKKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorc3RhdGljIHZvaWQgb2ZmbG9hZF9pbml0KCk7CisKKy8vIFBsYWNlIG9mZmxvYWQgaW5pdGlhbGl6YXRpb24gYmVmb3JlIHVzZXIgY29uc3RydWN0b3JzCitBTExPQ0FURShPRkZMT0FEX0NSVElOSVRfU0VDVElPTl9TVEFSVCkKK3N0YXRpYyB2b2lkICgqYWRkcmVzc29mX29mZmxvYWRfaW5pdCkoKSA9IG9mZmxvYWRfaW5pdDsKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKworc3RhdGljIHZvaWQgb2ZmbG9hZF9pbml0KCkKK3sKKyAgICAvLyByZWdpc3RlciBvZmZsb2FkIHRhYmxlcworICAgIF9fb2ZmbG9hZF9yZWdpc3Rlcl90YWJsZXMoJl9fb2ZmbG9hZF9lbnRyeV9ub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9fb2ZmbG9hZF9mdW5jX25vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX19vZmZsb2FkX3Zhcl9ub2RlKTsKKworI2lmIEhPU1RfTElCUkFSWQorICAgIF9fb2ZmbG9hZF9yZWdpc3Rlcl9pbWFnZSgmX19vZmZsb2FkX3RhcmdldF9pbWFnZSk7CisgICAgYXRleGl0KG9mZmxvYWRfZmluaSk7CisjZW5kaWYgLy8gSE9TVF9MSUJSQVJZCisKKyNpZmRlZiBNWU9fU1VQUE9SVAorICAgIF9fb2ZmbG9hZF9teW9SZWdpc3RlclRhYmxlcygKKyNpZiBIT1NUX0xJQlJBUlkKKyAgICAgICAgJl9fb2ZmbG9hZF9teW9fc2hhcmVkX2luaXRfdGFibGVfc3RhcnQgKyAxLAorI2VuZGlmIC8vIEhPU1RfTElCUkFSWQorICAgICAgICAmX19vZmZsb2FkX215b19zaGFyZWRfdGFibGVfc3RhcnQgKyAxLAorICAgICAgICAmX19vZmZsb2FkX215b19mcHRyX3RhYmxlX3N0YXJ0ICsgMQorICAgICk7CisjZW5kaWYgLy8gTVlPX1NVUFBPUlQKK30KKworc3RhdGljIHZvaWQgb2ZmbG9hZF9maW5pKCkKK3sKKyNpZiBIT1NUX0xJQlJBUlkKKyAgICBfX29mZmxvYWRfdW5yZWdpc3Rlcl9pbWFnZSgmX19vZmZsb2FkX3RhcmdldF9pbWFnZSk7CisjZW5kaWYgLy8gSE9TVF9MSUJSQVJZCisKKyAgICAvLyB1bnJlZ2lzdGVyIG9mZmxvYWQgdGFibGVzCisgICAgX19vZmZsb2FkX3VucmVnaXN0ZXJfdGFibGVzKCZfX29mZmxvYWRfZW50cnlfbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9fb2ZmbG9hZF9mdW5jX25vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfX29mZmxvYWRfdmFyX25vZGUpOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvb2ZsZGVuZC5jcHAgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmxkZW5kLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjFmZTU5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZsZGVuZC5jcHAKQEAgLTAsMCArMSw3NyBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWYgSE9TVF9MSUJSQVJZCisjaW5jbHVkZSAib2ZmbG9hZF9ob3N0LmgiCisjaW5jbHVkZSAib2ZmbG9hZF9teW9faG9zdC5oIgorI2Vsc2UKKyNpbmNsdWRlICJvZmZsb2FkX3RhcmdldC5oIgorI2luY2x1ZGUgIm9mZmxvYWRfbXlvX3RhcmdldC5oIgorI2VuZGlmCisKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyNkZWZpbmUgQUxMT0NBVEUobmFtZSkgX19kZWNsc3BlYyhhbGxvY2F0ZShuYW1lKSkKKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorI2RlZmluZSBBTExPQ0FURShuYW1lKSBfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKG5hbWUpKSkKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKworLy8gb2ZmbG9hZCBlbnRyeSB0YWJsZQorQUxMT0NBVEUoT0ZGTE9BRF9FTlRSWV9UQUJMRV9TRUNUSU9OX0VORCkKKyNpZmRlZiBUQVJHRVRfV0lOTlQKK19fZGVjbHNwZWMoYWxpZ24oc2l6ZW9mKEZ1bmNUYWJsZTo6RW50cnkpKSkKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKK3N0YXRpYyBGdW5jVGFibGU6OkVudHJ5IF9fb2ZmbG9hZF9lbnRyeV90YWJsZV9lbmQgPSB7IChjb25zdCBjaGFyKiktMSB9OworCisvLyBvZmZsb2FkIGZ1bmN0aW9uIHRhYmxlCitBTExPQ0FURShPRkZMT0FEX0ZVTkNfVEFCTEVfU0VDVElPTl9FTkQpCisjaWZkZWYgVEFSR0VUX1dJTk5UCitfX2RlY2xzcGVjKGFsaWduKHNpemVvZihGdW5jVGFibGU6OkVudHJ5KSkpCisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCitzdGF0aWMgRnVuY1RhYmxlOjpFbnRyeSBfX29mZmxvYWRfZnVuY190YWJsZV9lbmQgPSB7IChjb25zdCBjaGFyKiktMSB9OworCisvLyBkYXRhIHRhYmxlCitBTExPQ0FURShPRkZMT0FEX1ZBUl9UQUJMRV9TRUNUSU9OX0VORCkKKyNpZmRlZiBUQVJHRVRfV0lOTlQKK19fZGVjbHNwZWMoYWxpZ24oc2l6ZW9mKFZhclRhYmxlOjpFbnRyeSkpKQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorc3RhdGljIFZhclRhYmxlOjpFbnRyeSBfX29mZmxvYWRfdmFyX3RhYmxlX2VuZCA9IHsgKGNvbnN0IGNoYXIqKS0xIH07CisKKyNpZmRlZiBNWU9fU1VQUE9SVAorCisvLyBvZmZsb2FkIG15byBzaGFyZWQgdmFyIHNlY3Rpb24gZXBpbG9nCitBTExPQ0FURShPRkZMT0FEX01ZT19TSEFSRURfVEFCTEVfU0VDVElPTl9FTkQpCisjaWZkZWYgVEFSR0VUX1dJTk5UCitfX2RlY2xzcGVjKGFsaWduKHNpemVvZihTaGFyZWRUYWJsZUVudHJ5KSkpCitzdGF0aWMgU2hhcmVkVGFibGVFbnRyeSBfX29mZmxvYWRfbXlvX3NoYXJlZF90YWJsZV9lbmQgPSB7IChjb25zdCBjaGFyKiktMSwgMCB9OworI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCitzdGF0aWMgU2hhcmVkVGFibGVFbnRyeSBfX29mZmxvYWRfbXlvX3NoYXJlZF90YWJsZV9lbmQgPSB7IDAgfTsKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKworI2lmIEhPU1RfTElCUkFSWQorLy8gb2ZmbG9hZCBteW8gc2hhcmVkIHZhciBpbml0IHNlY3Rpb24gZXBpbG9nCitBTExPQ0FURShPRkZMT0FEX01ZT19TSEFSRURfSU5JVF9UQUJMRV9TRUNUSU9OX0VORCkKKyNpZmRlZiBUQVJHRVRfV0lOTlQKK19fZGVjbHNwZWMoYWxpZ24oc2l6ZW9mKEluaXRUYWJsZUVudHJ5KSkpCitzdGF0aWMgSW5pdFRhYmxlRW50cnkgX19vZmZsb2FkX215b19zaGFyZWRfaW5pdF90YWJsZV9lbmQgPSB7IChjb25zdCBjaGFyKiktMSwgMCB9OworI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCitzdGF0aWMgSW5pdFRhYmxlRW50cnkgX19vZmZsb2FkX215b19zaGFyZWRfaW5pdF90YWJsZV9lbmQgPSB7IDAgfTsKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKyNlbmRpZiAvLyBIT1NUX0xJQlJBUlkKKworLy8gb2ZmbG9hZCBteW8gZnB0ciBzZWN0aW9uIGVwaWxvZworQUxMT0NBVEUoT0ZGTE9BRF9NWU9fRlBUUl9UQUJMRV9TRUNUSU9OX0VORCkKKyNpZmRlZiBUQVJHRVRfV0lOTlQKK19fZGVjbHNwZWMoYWxpZ24oc2l6ZW9mKEZwdHJUYWJsZUVudHJ5KSkpCitzdGF0aWMgRnB0clRhYmxlRW50cnkgX19vZmZsb2FkX215b19mcHRyX3RhYmxlX2VuZCA9IHsgKGNvbnN0IGNoYXIqKS0xLCAwLCAwIH07CisjZWxzZSAvLyBUQVJHRVRfV0lOTlQKK3N0YXRpYyBGcHRyVGFibGVFbnRyeSBfX29mZmxvYWRfbXlvX2ZwdHJfdGFibGVfZW5kID0geyAwIH07CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKyNlbmRpZiAvLyBNWU9fU1VQUE9SVApkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvb3JzbC1saXRlL2luY2x1ZGUvb3JzbC1saXRlLmggYi9maW5hbC9vZmZsb2FkL3NyYy9vcnNsLWxpdGUvaW5jbHVkZS9vcnNsLWxpdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjZhMzM1Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvb3JzbC1saXRlL2luY2x1ZGUvb3JzbC1saXRlLmgKQEAgLTAsMCArMSwyMjEgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBfT1JTTF9MSVRFX0hfCisjZGVmaW5lIF9PUlNMX0xJVEVfSF8KKworI2lmbmRlZiBUQVJHRVRfV0lOTlQKKyNpbmNsdWRlIDxzY2hlZC5oPgorI2Vsc2UKKyNkZWZpbmUgY3B1X3NldF90IGludAorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqIFR5cGUgb2YgYSBPUlNMQnVzeVNldCAqLwordHlwZWRlZiBlbnVtIE9SU0xCdXN5U2V0VHlwZSB7CisgICAgQlVTWV9TRVRfRU1QVFkgPSAwLCAgICAgLyoqPCBFbXB0eSBzZXQgKi8KKyAgICBCVVNZX1NFVF9QQVJUSUFMID0gMSwgICAvKio8IE5vbi1lbXB0eSBzZXQgdGhhdCBvbWl0cyBzb21lIHRocmVhZHMgKi8KKyAgICBCVVNZX1NFVF9GVUxMID0gMiAgICAgICAvKio8IEEgc2V0IHRoYXQgaW5jbHVkZXMgYWxsIHRocmVhZHMgb24gdGhlIGNhcmQgKi8KK30gQnVzeVNldFR5cGU7CisKKy8qKiBPUlNMQnVzeVNldCBlbmNhcHN1bGF0aW9uICovCit0eXBlZGVmIHN0cnVjdCBPUlNMQnVzeVNldCB7CisgICAgQnVzeVNldFR5cGUgdHlwZTsgICAvKio8IFNldCB0eXBlICovCisjaWZkZWYgX19saW51eF9fCisgICAgY3B1X3NldF90IGNwdV9zZXQ7ICAvKio8IENQVSBtYXNrICh1bnVzZWQgZm9yIEJVU1lfU0VUX0VNUFRZIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVTWV9TRVRfUEFSVElBTCBzZXRzKSByZXByZXNlbnRlZCBieSB0aGUgc3RhbmRhcmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbnV4IENQVSBzZXQgdHlwZSAtLSBjcHVfc2V0X3QuIFRocmVhZHMgYXJlIG51bWJlcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydGluZyBmcm9tIDAuIFRoZSBtYXhpbWFsIHBvc3NpYmxlIHRocmVhZCBudW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHN5c3RlbS1zcGVjaWZpYy4gU2VlIENQVV9TRVQoMykgZmFtaWx5IG9mIG1hY3JvcworICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG1vcmUgZGV0YWlscy4gVW51c2VkIGluIE9SU0wgTGl0ZS4gKi8KKyNlbmRpZgorfSBPUlNMQnVzeVNldDsKKworLyoqIENsaWVudCB0YWcgKi8KK3R5cGVkZWYgY2hhciogT1JTTFRhZzsKKworLyoqIE1heGltYWwgbGVuZ3RoIG9mIHRhZyBpbiBjaGFyYWN0ZXJzICovCisjZGVmaW5lIE9SU0xfTUFYX1RBR19MRU4gMTI4CisKKy8qKiBNYXhpbWFsIG51bWJlciBvZiBjYXJkcyB0aGF0IGNhbiBiZSBtYW5hZ2VkIGJ5IE9SU0wgKi8KKyNkZWZpbmUgT1JTTF9NQVhfQ0FSRFMgMzIKKworLyoqIFJlc2VydmVzIGNvbXB1dGF0aW9uYWwgcmVzb3VyY2VzIG9uIGEgc2V0IG9mIGNhcmRzLiBCbG9ja3MuCisgKgorICogSWYgYW55IG9mIHRoZSByZXNvdXJjZXMgY2Fubm90IGJlIHJlc2VydmVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgYmxvY2sgdW50aWwKKyAqIHRoZXkgYmVjb21lIGF2YWlsYWJsZS4gUmVzZXJ2YXRpb24gY2FuIGJlIHJlY3Vyc2l2ZSBpZiBwZXJmb3JtZWQgYnkgdGhlCisgKiBzYW1lIHRhZy4gQSByZWN1cnNpdmVseSByZXNlcnZlZCByZXNvdXJjZSBtdXN0IGJlIHJlbGVhc2VkIHRoZSBzYW1lIG51bWJlcgorICogb2YgdGltZXMgaXQgd2FzIHJlc2VydmVkLgorICoKKyAqIEBzZWUgT1JTTFRyeVJlc2VydmUKKyAqCisgKiBAcGFyYW1baW5dICBuICAgICAgTnVtYmVyIG9mIGNhcmRzIHRvIHJlc2VydmUgcmVzb3VyY2VzIG9uLiBDYW5ub3QgYmUgPCAwCisgKiAgICAgICAgICAgICAgICAgICAgb3IgPiBPUlNMX01BWF9DQVJEUy4KKyAqCisgKiBAcGFyYW1baW5dICBpbmRzICAgSW5kaWNlcyBvZiB0aGUgY2FyZHM6IGFuIGludGVnZXIgYXJyYXkgd2l0aCBuIGVsZW1lbnRzLgorICogICAgICAgICAgICAgICAgICAgIENhbm5vdCBiZSBOVUxMIGlmIG4gPiAwLiBWYWxpZCBjYXJkIGluZGljZXMgYXJlIGZyb20gMAorICogICAgICAgICAgICAgICAgICAgIHRvIE9SU0xfTUFYX0NBUkRTLTEuIENhbm5vdCBjb250YWluIGR1cGxpY2F0ZSBlbGVtZW50cy4KKyAqCisgKiBAcGFyYW1baW5dICBic2V0cyAgUmVxdWVzdGVkIHJlc291cmNlcyBvbiBlYWNoIG9mIHRoZSBjYXJkLiBDYW5ub3QgYmUgTlVMTAorICogICAgICAgICAgICAgICAgICAgIGlmIG4gPiAwLgorICoKKyAqIEBwYXJhbVtpbl0gIHRhZyAgICBPUlNMVGFnIG9mIHRoZSBjYWxsaW5nIGNsaWVudC4gQ2Fubm90IGJlIE5VTEwuIExlbmd0aAorICogICAgICAgICAgICAgICAgICAgIG11c3Qgbm90IGV4ZWVkIE9SU0xfTUFYX1RBR19MRU4uCisgKgorICogQHJldHVybnMgICAgMCAgICAgIGlmIHRoZSByZXNvdXJjZXMgd2VyZSBzdWNjZXNzZnVsbHkgcmVzZXJ2ZWQKKyAqCisgKiBAcmV0dXJucyAgICBFSU5WQUwgaWYgYW55IG9mIHRoZSBhcmd1bWVudHMgaXMgaW52YWxpZAorICoKKyAqIEByZXR1cm5zICAgIEVBR0FJTiBsaW1pdCBvZiByZWN1cnNpdmUgcmVzZXJ2YXRpb25zIHJlYWNoZWQKKyAqICAgICAgICAgICAgICAgICAgICAobm90IGluIE9SU0wgTGl0ZSkKKyAqCisgKiBAcmV0dXJucyAgICBFTk9TWVMgKGluIE9SU0wgTGl0ZSkgaWYgdHlwZSBvZiBhbnkgb2YgdGhlIGJ1c3kgc2V0cyBpcworICogICAgICAgICAgICAgICAgICAgIGVxdWFsIHRvIEJVU1lfU0VUX1BBUlRJQUwKKyAqLworaW50IE9SU0xSZXNlcnZlKGNvbnN0IGludCBuLCBjb25zdCBpbnQgKl9fcmVzdHJpY3QgaW5kcywKKyAgICAgICAgICAgICAgICBjb25zdCBPUlNMQnVzeVNldCAqX19yZXN0cmljdCBic2V0cywKKyAgICAgICAgICAgICAgICBjb25zdCBPUlNMVGFnIF9fcmVzdHJpY3QgdGFnKTsKKworLyoqIFJlc2VydmVzIGNvbXB1dGF0aW9uYWwgcmVzb3VyY2VzIG9uIGEgc2V0IG9mIGNhcmRzLiBEb2VzIG5vdCBibG9jay4KKyAqCisgKiBJZiBhbnkgb2YgdGhlIHJlc291cmNlcyBjYW5ub3QgYmUgcmVzZXJ2ZWQsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4KKyAqIGltbWVkaWF0ZWx5LiBSZXNlcnZhdGlvbiBjYW4gYmUgcmVjdXJzaXZlIGlmIHBlcmZvcm1lZCBieSB0aGUgc2FtZSB0YWcuCisgKiBBIHJlY3Vyc2l2ZWx5IHJlc2VydmVkIHJlc291cmNlIG11c3QgYmUgcmVsZWFzZWQgdGhlIHNhbWUgbnVtYmVyIG9mIHRpbWVzCisgKiBpdCB3YXMgcmVzZXJ2ZWQuCisgKgorICogQHNlZSBPUlNMUmVzZXJ2ZQorICoKKyAqIEBwYXJhbVtpbl0gIG4gICAgICBOdW1iZXIgb2YgY2FyZHMgdG8gcmVzZXJ2ZSByZXNvdXJjZXMgb24uIENhbm5vdCBiZSA8IDAKKyAqICAgICAgICAgICAgICAgICAgICBvciA+IE9SU0xfTUFYX0NBUkRTLgorICoKKyAqIEBwYXJhbVtpbl0gIGluZHMgICAgIEluZGljZXMgb2YgdGhlIGNhcmRzOiBhbiBpbnRlZ2VyIGFycmF5IHdpdGggbiBlbGVtZW50cy4KKyAqICAgICAgICAgICAgICAgICAgICAgIENhbm5vdCBiZSBOVUxMIGlmIG4gPiAwLiBWYWxpZCBjYXJkIGluZGljZXMgYXJlIGZyb20gMAorICogICAgICAgICAgICAgICAgICAgICAgdG8gT1JTTF9NQVhfQ0FSRFMtMS4gQ2Fubm90IGNvbnRhaW4gZHVwbGljYXRlIGVsZW1lbnRzLgorICoKKyAqIEBwYXJhbVtpbm91dF0gYnNldHMgIFJlcXVlc3RlZCByZXNvdXJjZXMgb24gZWFjaCBvZiB0aGUgY2FyZC4gQ2Fubm90IGJlCisgKiAgICAgICAgICAgICAgICAgICAgICBOVUxMIGlmIG4gPiAwLgorICoKKyAqIEBwYXJhbVtpbl0gICAgdGFnICAgIE9SU0xUYWcgb2YgdGhlIGNhbGxpbmcgY2xpZW50LiBDYW5ub3QgYmUgTlVMTC4gTGVuZ3RoCisgKiAgICAgICAgICAgICAgICAgICAgICBtdXN0IG5vdCBleGNlZWQgT1JTTF9NQVhfVEFHX0xFTi4KKyAqCisgKiBAcmV0dXJucyAgICAgIDAgICAgICBpZiB0aGUgcmVzb3VyY2VzIHdlcmUgc3VjY2Vzc2Z1bGx5IHJlc2VydmVkCisgKgorICogQHJldHVybnMgICAgICBFQlVTWSAgaWYgc29tZSBvZiB0aGUgcmVxdWVzdGVkIHJlc291cmNlcyBhcmUgYnVzeQorICoKKyAqIEByZXR1cm5zICAgICAgRUlOVkFMIGlmIGFueSBvZiB0aGUgYXJndW1lbnRzIGlzIGludmFsaWQKKyAqCisgKiBAcmV0dXJucyAgICAgIEVBR0FJTiBsaW1pdCBvZiByZWN1cnNpdmUgcmVzZXJ2YXRpb25zIHJlYWNoZWQKKyAqICAgICAgICAgICAgICAgICAgICAgIChub3QgaW4gT1JTTCBMaXRlKQorICoKKyAqIEByZXR1cm5zICAgICAgRU5PU1lTIChpbiBPUlNMIExpdGUpIGlmIHR5cGUgb2YgYW55IG9mIHRoZSBidXN5IHNldHMgaXMKKyAqICAgICAgICAgICAgICAgICAgICAgIGVxdWFsIHRvIEJVU1lfU0VUX1BBUlRJQUwKKyAqLworaW50IE9SU0xUcnlSZXNlcnZlKGNvbnN0IGludCBuLCBjb25zdCBpbnQgKl9fcmVzdHJpY3QgaW5kcywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBPUlNMQnVzeVNldCAqX19yZXN0cmljdCBic2V0cywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBPUlNMVGFnIF9fcmVzdHJpY3QgdGFnKTsKKworLyoqIEdyYW51bGFyaWZ5IG9mIHBhcnRpYWwgcmVzZXJ2YXRpb24gKi8KK3R5cGVkZWYgZW51bSBPUlNMUGFydGlhbEdyYW51bGFyaXR5IHsKKyAgICBHUkFOX0NBUkQgPSAwLCAvKio8IENhcmQgZ3JhbnVsYXJpdHkgKi8KKyAgICBHUkFOX1RIUkVBRCA9IDEgLyoqPCBUaHJlYWQgZ3JhbnVsYXJpdHkgKi8KK30gT1JTTFBhcnRpYWxHcmFudWxhcml0eTsKKworLyoqIFJlcXVlc3RzIHJlc2VydmF0aW9uIG9mIHNvbWUgb2YgY29tcHV0YXRpb25hbCByZXNvdXJjZXMgb24gYSBzZXQgb2YgY2FyZHMuCisgKiBEb2VzIG5vdCBibG9jay4gVXBkYXRlcyB1c2VyLXByb3ZpZGVkIGJzZXRzIHRvIGluZGljYXRlIHdoaWNoIHJlc291cmNlcworICogd2VyZSByZXNlcnZlZC4KKyAqCisgKiBJZiBhbnkgb2YgdGhlIHJlc291cmNlcyBjYW5ub3QgYmUgcmVzZXJ2ZWQsIHRoaXMgZnVuY3Rpb24gd2lsbCB1cGRhdGUgYnVzeQorICogc2V0cyBwcm92aWRlZCBieSB0aGUgY2FsbGVyIHRvIHJlZmxlY3Qgd2hhdCByZXNvdXJjZXMgd2VyZSBhY3R1YWxseQorICogcmVzZXJ2ZWQuIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgdHdvIGdyYW51bGFyaXR5IG1vZGVzOiAnY2FyZCcgYW5kCisgKiAndGhyZWFkJy4gIFdoZW4gZ3JhbnVsYXJpdHkgaXMgc2V0IHRvICdjYXJkJywgYSBmYWlsdXJlIHRvIHJlc2VydmUgYSB0aHJlYWQKKyAqIG9uIHRoZSBjYXJkIHdpbGwgaW1wbHkgdGhhdCByZXNlcnZhdGlvbiBoYXMgZmFpbGVkIGZvciB0aGUgd2hvbGUgY2FyZC4gV2hlbgorICogZ3JhbnVsYXJpdHkgaXMgc2V0IHRvICd0aHJlYWQnLCByZXNlcnZhdGlvbiBvbiBhIGNhcmQgd2lsbCBiZSBjb25zaWRlcmVkCisgKiBzdWNjZXNzZnVsIGFzIGxvbmcgYXMgYXQgbGVhc3Qgb25lIHRocmVhZCBvbiB0aGUgY2FyZCB3YXMgc3VjY2Vzc2Z1bGx5CisgKiByZXNlcnZlZC4gUmVzZXJ2YXRpb24gY2FuIGJlIHJlY3Vyc2l2ZSBpZiBwZXJmb3JtZWQgYnkgdGhlIHNhbWUgdGFnLiBBCisgKiByZWN1cnNpdmVseSByZXNlcnZlZCByZXNvdXJjZSBtdXN0IGJlIHJlbGVhc2VkIHRoZSBzYW1lIG51bWJlciBvZiB0aW1lcyBpdAorICogd2FzIHJlc2VydmVkLgorICoKKyAqIEBwYXJhbVtpbl0gIGdyYW4gICBSZXNlcnZhdGlvbiBncmFudWxhcml0eQorICoKKyAqIEBwYXJhbVtpbl0gIG4gICAgICBOdW1iZXIgb2YgY2FyZHMgdG8gcmVzZXJ2ZSByZXNvdXJjZXMgb24uIENhbm5vdCBiZSA8IDAKKyAqICAgICAgICAgICAgICAgICAgICBvciA+IE9SU0xfTUFYX0NBUkRTLgorICoKKyAqIEBwYXJhbVtpbl0gIGluZHMgICBJbmRpY2VzIG9mIHRoZSBjYXJkczogYW4gaW50ZWdlciBhcnJheSB3aXRoIG4gZWxlbWVudHMuCisgKiAgICAgICAgICAgICAgICAgICAgQ2Fubm90IGJlIE5VTEwgaWYgbiA+IDAuIFZhbGlkIGNhcmQgaW5kaWNlcyBhcmUgZnJvbSAwCisgKiAgICAgICAgICAgICAgICAgICAgdG8gT1JTTF9NQVhfQ0FSRFMtMS4gQ2Fubm90IGNvbnRhaW4gZHVwbGljYXRlIGVsZW1lbnRzLgorICoKKyAqIEBwYXJhbVtpbl0gIGJzZXRzICBSZXF1ZXN0ZWQgcmVzb3VyY2VzIG9uIGVhY2ggb2YgdGhlIGNhcmQuIENhbm5vdCBiZSBOVUxMCisgKiAgICAgICAgICAgICAgICAgICAgaWYgbiA+IDAuCisgKgorICogQHBhcmFtW2luXSAgdGFnICAgIE9SU0xUYWcgb2YgdGhlIGNhbGxpbmcgY2xpZW50LiBDYW5ub3QgYmUgTlVMTC4gTGVuZ3RoCisgKiAgICAgICAgICAgICAgICAgICAgbXVzdCBub3QgZXhjZWVkIE9SU0xfTUFYX1RBR19MRU4uCisgKgorICogQHJldHVybnMgICAgMCAgICAgIGlmIGF0IGxlYXN0IHNvbWUgb2YgdGhlIHJlc291cmNlcyB3ZXJlIHN1Y2Nlc3NmdWxseQorICogICAgICAgICAgICAgICAgICAgIHJlc2VydmVkCisgKgorICogQHJldHVybnMgICAgRUJVU1kgIGlmIGFsbCBvZiB0aGUgcmVxdWVzdGVkIHJlc291cmNlcyBhcmUgYnVzeQorICoKKyAqIEByZXR1cm5zICAgIEVJTlZBTCBpZiBhbnkgb2YgdGhlIGFyZ3VtZW50cyBpcyBpbnZhbGlkCisgKgorICogQHJldHVybnMgICAgRUFHQUlOIGxpbWl0IG9mIHJlY3Vyc2l2ZSByZXNlcnZhdGlvbnMgcmVhY2hlZAorICogICAgICAgICAgICAgICAgICAgIChub3QgaW4gT1JTTCBMaXRlKQorICoKKyAqIEByZXR1cm5zICAgIEVOT1NZUyAoaW4gT1JTTCBMaXRlKSBpZiB0eXBlIG9mIGFueSBvZiB0aGUgYnVzeSBzZXRzIGlzCisgKiAgICAgICAgICAgICAgICAgICAgZXF1YWwgdG8gQlVTWV9TRVRfUEFSVElBTAorICovCitpbnQgT1JTTFJlc2VydmVQYXJ0aWFsKGNvbnN0IE9SU0xQYXJ0aWFsR3JhbnVsYXJpdHkgZ3JhbiwgY29uc3QgaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAqX19yZXN0cmljdCBpbmRzLAorICAgICAgICAgICAgICAgICAgICAgICBPUlNMQnVzeVNldCAqX19yZXN0cmljdCBic2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT1JTTFRhZyBfX3Jlc3RyaWN0IHRhZyk7CisKKy8qKiBSZWxlYXNlcyBwcmV2aW91c2x5IHJlc2VydmVkIGNvbXB1dGF0aW9uYWwgcmVzb3VyY2VzIG9uIGEgc2V0IG9mIGNhcmRzLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBmYWlsIGlmIGFueSBvZiB0aGUgcmVzb3VyY2VzIHRvIGJlIHJlbGVhc2VkIHdlcmUgbm90CisgKiByZXNlcnZlZCBieSB0aGUgY2FsbGluZyBjbGllbnQuCisgKgorICogQHNlZSBPUlNMUmVzZXJ2ZQorICogQHNlZSBPUlNMVHJ5UmVzZXJ2ZQorICogQHNlZSBPUlNMUmVzZXJ2ZVBhcnRpYWwKKyAqCisgKiBAcGFyYW1baW5dICBuICAgICAgTnVtYmVyIG9mIGNhcmRzIHRvIHJlc2VydmUgcmVzb3VyY2VzIG9uLiBDYW5ub3QgYmUgPCAwCisgKiAgICAgICAgICAgICAgICAgICAgb3IgPiBPUlNMX01BWF9DQVJEUy4KKyAqCisgKiBAcGFyYW1baW5dICBpbmRzICAgSW5kaWNlcyBvZiB0aGUgY2FyZHM6IGFuIGludGVnZXIgYXJyYXkgd2l0aCBuIGVsZW1lbnRzLgorICogICAgICAgICAgICAgICAgICAgIENhbm5vdCBiZSBOVUxMIGlmIG4gPiAwLiBWYWxpZCBjYXJkIGluZGljZXMgYXJlIGZyb20gMAorICogICAgICAgICAgICAgICAgICAgIHRvIE9SU0xfTUFYX0NBUkRTLTEuIENhbm5vdCBjb250YWluIGR1cGxpY2F0ZSBlbGVtZW50cy4KKyAqCisgKiBAcGFyYW1baW5dICBic2V0cyAgUmVxdWVzdGVkIHJlc291cmNlcyBvbiBlYWNoIG9mIHRoZSBjYXJkLiBDYW5ub3QgYmUgTlVMTAorICogICAgICAgICAgICAgICAgICAgIGlmIG4gPiAwLgorICoKKyAqIEBwYXJhbVtpbl0gIHRhZyAgICBPUlNMVGFnIG9mIHRoZSBjYWxsaW5nIGNsaWVudC4gQ2Fubm90IGJlIE5VTEwuIExlbmd0aAorICogICAgICAgICAgICAgICAgICAgIG11c3Qgbm90IGV4Y2VlZCBPUlNMX01BWF9UQUdfTEVOLgorICoKKyAqIEByZXR1cm5zICAgIDAgICAgICBpZiB0aGUgcmVzb3VyY2VzIHdlcmUgc3VjY2Vzc2Z1bGx5IHJlbGVhc2VkCisgKgorICogQHJldHVybnMgICAgRUlOVkFMIGlmIGFueSBvZiB0aGUgYXJndW1lbnRzIGlzIGludmFsaWQKKyAqCisgKiBAcmV0dXJucyAgICBFUEVSTSAgdGhlIGNhbGxpbmcgY2xpZW50IGRpZCBub3QgcmVzZXJ2ZSBzb21lIG9mIHRoZQorICogICAgICAgICAgICAgICAgICAgIHJlc291cmNlcyBpdCBpcyB0cnlpbmcgdG8gcmVsZWFzZS4KKyAqCisgKiBAcmV0dXJucyAgICBFTk9TWVMgKGluIE9SU0wgTGl0ZSkgaWYgdHlwZSBvZiBhbnkgb2YgdGhlIGJ1c3kgc2V0cyBpcworICogICAgICAgICAgICAgICAgICAgIGVxdWFsIHRvIEJVU1lfU0VUX1BBUlRJQUwKKyAqLworaW50IE9SU0xSZWxlYXNlKGNvbnN0IGludCBuLCBjb25zdCBpbnQgKl9fcmVzdHJpY3QgaW5kcywKKyAgICAgICAgICAgICAgICBjb25zdCBPUlNMQnVzeVNldCAqX19yZXN0cmljdCBic2V0cywKKyAgICAgICAgICAgICAgICBjb25zdCBPUlNMVGFnIF9fcmVzdHJpY3QgdGFnKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vcnNsLWxpdGUvbGliL29yc2wtbGl0ZS5jIGIvZmluYWwvb2ZmbG9hZC9zcmMvb3JzbC1saXRlL2xpYi9vcnNsLWxpdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjFjZGE3Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvb3JzbC1saXRlL2xpYi9vcnNsLWxpdGUuYwpAQCAtMCwwICsxLDMzNyBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgIm9yc2wtbGl0ZS9pbmNsdWRlL29yc2wtbGl0ZS5oIgorCisjZGVmaW5lIERJU0FCTEVfU1lNQk9MX1ZFUlNJT05JTkcKKworI2lmIGRlZmluZWQoX19saW51eF9fKSAmJiAhZGVmaW5lZChESVNBQkxFX1NZTUJPTF9WRVJTSU9OSU5HKQorI2RlZmluZSBzeW12ZXIoc3JjLCB0Z3QsIHZlcnN0cikgX19hc21fXygiLnN5bXZlciAiICNzcmMgIiwiICN0Z3QgdmVyc3RyKQorc3ltdmVyKE9SU0xSZXNlcnZlMCwgT1JTTFJlc2VydmUsICJAQE9SU0xfMC4wIik7CitzeW12ZXIoT1JTTFRyeVJlc2VydmUwLCBPUlNMVHJ5UmVzZXJ2ZSwgIkBAT1JTTF8wLjAiKTsKK3N5bXZlcihPUlNMUmVzZXJ2ZVBhcnRpYWwwLCBPUlNMUmVzZXJ2ZVBhcnRpYWwsICJAQE9SU0xfMC4wIik7CitzeW12ZXIoT1JTTFJlbGVhc2UwLCBPUlNMUmVsZWFzZSwgIkBAT1JTTF8wLjAiKTsKKyNlbHNlCisjZGVmaW5lIE9SU0xSZXNlcnZlMCBPUlNMUmVzZXJ2ZQorI2RlZmluZSBPUlNMVHJ5UmVzZXJ2ZTAgT1JTTFRyeVJlc2VydmUKKyNkZWZpbmUgT1JTTFJlc2VydmVQYXJ0aWFsMCBPUlNMUmVzZXJ2ZVBhcnRpYWwKKyNkZWZpbmUgT1JTTFJlbGVhc2UwIE9SU0xSZWxlYXNlCisjZW5kaWYKKworI2lmZGVmIF9fbGludXhfXworI2luY2x1ZGUgPHB0aHJlYWQuaD4KK3N0YXRpYyBwdGhyZWFkX211dGV4X3QgZ2xvYmFsX211dGV4ID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKK3N0YXRpYyBwdGhyZWFkX2NvbmRfdCByZWxlYXNlX2NvbmQgPSBQVEhSRUFEX0NPTkRfSU5JVElBTElaRVI7CisjZW5kaWYKKworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNwcmFnbWEgaW50cmluc2ljKF9SZWFkV3JpdGVCYXJyaWVyKQorc3RhdGljIFNSV0xPQ0sgZ2xvYmFsX211dGV4ID0gU1JXTE9DS19JTklUOworc3RhdGljIHZvbGF0aWxlIGludCByZWxlYXNlX2NvbmRfaW5pdGlhbGl6ZWQgPSAwOworc3RhdGljIENPTkRJVElPTl9WQVJJQUJMRSByZWxlYXNlX2NvbmQ7CisKK3N0YXRpYyB2b2lkIHN0YXRlX2xhenlfaW5pdF9zeW5jKCkKK3sKKyAgICBpZiAoIXJlbGVhc2VfY29uZF9pbml0aWFsaXplZCkgeworICAgICAgICBBY3F1aXJlU1JXTG9ja0V4Y2x1c2l2ZSgmZ2xvYmFsX211dGV4KTsKKyAgICAgICAgX1JlYWRXcml0ZUJhcnJpZXIoKTsKKyAgICAgICAgaWYgKCFyZWxlYXNlX2NvbmRfaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgIEluaXRpYWxpemVDb25kaXRpb25WYXJpYWJsZSgmcmVsZWFzZV9jb25kKTsKKyAgICAgICAgICAgIHJlbGVhc2VfY29uZF9pbml0aWFsaXplZCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgUmVsZWFzZVNSV0xvY2tFeGNsdXNpdmUoJmdsb2JhbF9tdXRleCk7CisgICAgfQorfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgc3RhdGVfbG9jaygpCit7CisjaWZkZWYgX19saW51eF9fCisgICAgcmV0dXJuIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ2xvYmFsX211dGV4KTsKKyNlbmRpZgorCisjaWZkZWYgX1dJTjMyCisgICAgQWNxdWlyZVNSV0xvY2tFeGNsdXNpdmUoJmdsb2JhbF9tdXRleCk7CisgICAgcmV0dXJuIDA7CisjZW5kaWYKK30KKworc3RhdGljIGludCBzdGF0ZV91bmxvY2soKQoreworI2lmZGVmIF9fbGludXhfXworICAgIHJldHVybiBwdGhyZWFkX211dGV4X3VubG9jaygmZ2xvYmFsX211dGV4KTsKKyNlbmRpZgorCisjaWZkZWYgX1dJTjMyCisgICAgUmVsZWFzZVNSV0xvY2tFeGNsdXNpdmUoJmdsb2JhbF9tdXRleCk7CisgICAgcmV0dXJuIDA7CisjZW5kaWYKK30KKworc3RhdGljIGludCBzdGF0ZV93YWl0X2Zvcl9yZWxlYXNlKCkKK3sKKyNpZmRlZiBfX2xpbnV4X18KKyAgICByZXR1cm4gcHRocmVhZF9jb25kX3dhaXQoJnJlbGVhc2VfY29uZCwgJmdsb2JhbF9tdXRleCk7CisjZW5kaWYKKworI2lmZGVmIF9XSU4zMgorICAgIHJldHVybiBTbGVlcENvbmRpdGlvblZhcmlhYmxlU1JXKCZyZWxlYXNlX2NvbmQsCisgICAgICAgICAgICAmZ2xvYmFsX211dGV4LCBJTkZJTklURSwgMCkgPT0gMCA/IDEgOiAwOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgc3RhdGVfc2lnbmFsX3JlbGVhc2UoKQoreworI2lmZGVmIF9fbGludXhfXworICAgIHJldHVybiBwdGhyZWFkX2NvbmRfc2lnbmFsKCZyZWxlYXNlX2NvbmQpOworI2VuZGlmCisKKyNpZmRlZiBfV0lOMzIKKyAgICBXYWtlQ29uZGl0aW9uVmFyaWFibGUoJnJlbGVhc2VfY29uZCk7CisgICAgcmV0dXJuIDA7CisjZW5kaWYKK30KKworc3RhdGljIHN0cnVjdCB7CisgICAgY2hhciBvd25lcltPUlNMX01BWF9UQUdfTEVOICsgMV07CisgICAgdW5zaWduZWQgbG9uZyByc3J2X2NudDsKK30gcnNydl9kYXRhW09SU0xfTUFYX0NBUkRTXTsKKworc3RhdGljIGludCBjaGVja19hcmdzKGNvbnN0IGludCBuLCBjb25zdCBpbnQgKl9fcmVzdHJpY3QgaW5kcywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPUlNMQnVzeVNldCAqX19yZXN0cmljdCBic2V0cywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPUlNMVGFnIF9fcmVzdHJpY3QgdGFnKQoreworICAgIGludCBpOworICAgIGludCBjYXJkX3NwZWNpZmllZFtPUlNMX01BWF9DQVJEU107CisgICAgaWYgKHRhZyA9PSBOVUxMKSByZXR1cm4gLTE7CisgICAgaWYgKHN0cmxlbigoY2hhciAqKXRhZykgPiBPUlNMX01BWF9UQUdfTEVOKSByZXR1cm4gLTE7CisgICAgaWYgKG4gPCAwIHx8IG4gPj0gT1JTTF9NQVhfQ0FSRFMpIHJldHVybiAtMTsKKyAgICBpZiAobiAhPSAwICYmIChpbmRzID09IE5VTEwgfHwgYnNldHMgPT0gTlVMTCkpIHJldHVybiAtMTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgT1JTTF9NQVhfQ0FSRFM7IGkrKykKKyAgICAgICAgY2FyZF9zcGVjaWZpZWRbaV0gPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgaW50IGluZCA9IGluZHNbaV07CisgICAgICAgIGlmIChpbmQgPCAwIHx8IGluZCA+PSBPUlNMX01BWF9DQVJEUykgcmV0dXJuIC0xOworICAgICAgICBpZiAoY2FyZF9zcGVjaWZpZWRbaW5kXSkgcmV0dXJuIC0xOworICAgICAgICBjYXJkX3NwZWNpZmllZFtpbmRdID0gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfYnNldHMoY29uc3QgaW50IG4sIGNvbnN0IE9SU0xCdXN5U2V0ICpic2V0cykKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICBpZiAoYnNldHNbaV0udHlwZSA9PSBCVVNZX1NFVF9QQVJUSUFMKSByZXR1cm4gLTE7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2FuX3Jlc2VydmVfY2FyZChpbnQgY2FyZCwgY29uc3QgT1JTTEJ1c3lTZXQgKl9fcmVzdHJpY3QgYnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPUlNMVGFnIF9fcmVzdHJpY3QgdGFnKQoreworICAgIGFzc2VydCh0YWcgIT0gTlVMTCk7CisgICAgYXNzZXJ0KGJzZXQgIT0gTlVMTCk7CisgICAgYXNzZXJ0KHN0cmxlbigoY2hhciAqKXRhZykgPCBPUlNMX01BWF9UQUdfTEVOKTsKKyAgICBhc3NlcnQoYnNldC0+dHlwZSAhPSBCVVNZX1NFVF9QQVJUSUFMKTsKKworICAgIHJldHVybiAoYnNldC0+dHlwZSA9PSBCVVNZX1NFVF9FTVBUWSB8fAorICAgICAgICAgICAgKChyc3J2X2RhdGFbY2FyZF0ucnNydl9jbnQgPT0gMCB8fAorICAgICAgICAgICAgc3RybmNtcCgoY2hhciAqKXRhZywKKyAgICAgICAgICAgICAgICByc3J2X2RhdGFbY2FyZF0ub3duZXIsIE9SU0xfTUFYX1RBR19MRU4pID09IDApICYmCisgICAgICAgICAgICByc3J2X2RhdGFbY2FyZF0ucnNydl9jbnQgPCBVTE9OR19NQVgpKSA/IDAgOiAtIDE7Cit9CisKK3N0YXRpYyB2b2lkIHJlc2VydmVfY2FyZChpbnQgY2FyZCwgY29uc3QgT1JTTEJ1c3lTZXQgKl9fcmVzdHJpY3QgYnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPUlNMVGFnIF9fcmVzdHJpY3QgdGFnKQoreworICAgIGFzc2VydCh0YWcgIT0gTlVMTCk7CisgICAgYXNzZXJ0KGJzZXQgIT0gTlVMTCk7CisgICAgYXNzZXJ0KHN0cmxlbigoY2hhciAqKXRhZykgPCBPUlNMX01BWF9UQUdfTEVOKTsKKyAgICBhc3NlcnQoYnNldC0+dHlwZSAhPSBCVVNZX1NFVF9QQVJUSUFMKTsKKworICAgIGlmIChic2V0LT50eXBlID09IEJVU1lfU0VUX0VNUFRZKQorICAgICAgICByZXR1cm47CisKKyAgICBhc3NlcnQocnNydl9kYXRhW2NhcmRdLnJzcnZfY250ID09IDAgfHwKKyAgICAgICAgICAgIHN0cm5jbXAoKGNoYXIgKil0YWcsCisgICAgICAgICAgICAgICAgcnNydl9kYXRhW2NhcmRdLm93bmVyLCBPUlNMX01BWF9UQUdfTEVOKSA9PSAwKTsKKyAgICBhc3NlcnQocnNydl9kYXRhW2NhcmRdLnJzcnZfY250IDwgVUxPTkdfTUFYKTsKKworICAgIGlmIChyc3J2X2RhdGFbY2FyZF0ucnNydl9jbnQgPT0gMCkKKyAgICAgICAgc3RybmNweShyc3J2X2RhdGFbY2FyZF0ub3duZXIsIChjaGFyICopdGFnLCBPUlNMX01BWF9UQUdfTEVOKTsKKyAgICByc3J2X2RhdGFbY2FyZF0ub3duZXJbT1JTTF9NQVhfVEFHX0xFTl0gPSAnXDAnOworICAgIHJzcnZfZGF0YVtjYXJkXS5yc3J2X2NudCsrOworfQorCitzdGF0aWMgaW50IGNhbl9yZWxlYXNlX2NhcmQoaW50IGNhcmQsIGNvbnN0IE9SU0xCdXN5U2V0ICpfX3Jlc3RyaWN0IGJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT1JTTFRhZyBfX3Jlc3RyaWN0IHRhZykKK3sKKyAgICBhc3NlcnQodGFnICE9IE5VTEwpOworICAgIGFzc2VydChic2V0ICE9IE5VTEwpOworICAgIGFzc2VydChzdHJsZW4oKGNoYXIgKil0YWcpIDwgT1JTTF9NQVhfVEFHX0xFTik7CisgICAgYXNzZXJ0KGJzZXQtPnR5cGUgIT0gQlVTWV9TRVRfUEFSVElBTCk7CisKKyAgICByZXR1cm4gKGJzZXQtPnR5cGUgPT0gQlVTWV9TRVRfRU1QVFkgfHwgKHJzcnZfZGF0YVtjYXJkXS5yc3J2X2NudCA+IDAgJiYKKyAgICAgICAgICAgICAgICBzdHJuY21wKChjaGFyICopdGFnLAorICAgICAgICAgICAgICAgICAgICByc3J2X2RhdGFbY2FyZF0ub3duZXIsIE9SU0xfTUFYX1RBR19MRU4pID09IDApKSA/IDAgOiAxOworfQorCitzdGF0aWMgdm9pZCByZWxlYXNlX2NhcmQoaW50IGNhcmQsIGNvbnN0IE9SU0xCdXN5U2V0ICpfX3Jlc3RyaWN0IGJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT1JTTFRhZyBfX3Jlc3RyaWN0IHRhZykKK3sKKyAgICBhc3NlcnQodGFnICE9IE5VTEwpOworICAgIGFzc2VydChic2V0ICE9IE5VTEwpOworICAgIGFzc2VydChzdHJsZW4oKGNoYXIgKil0YWcpIDwgT1JTTF9NQVhfVEFHX0xFTik7CisgICAgYXNzZXJ0KGJzZXQtPnR5cGUgIT0gQlVTWV9TRVRfUEFSVElBTCk7CisKKyAgICBpZiAoYnNldC0+dHlwZSA9PSBCVVNZX1NFVF9FTVBUWSkKKyAgICAgICAgcmV0dXJuOworCisgICAgYXNzZXJ0KHN0cm5jbXAoKGNoYXIgKil0YWcsCisgICAgICAgICAgICAgICAgcnNydl9kYXRhW2NhcmRdLm93bmVyLCBPUlNMX01BWF9UQUdfTEVOKSA9PSAwKTsKKyAgICBhc3NlcnQocnNydl9kYXRhW2NhcmRdLnJzcnZfY250ID4gMCk7CisKKyAgICByc3J2X2RhdGFbY2FyZF0ucnNydl9jbnQtLTsKK30KKworaW50IE9SU0xSZXNlcnZlMChjb25zdCBpbnQgbiwgY29uc3QgaW50ICpfX3Jlc3RyaWN0IGluZHMsCisgICAgICAgICAgICAgICAgY29uc3QgT1JTTEJ1c3lTZXQgKl9fcmVzdHJpY3QgYnNldHMsCisgICAgICAgICAgICAgICAgY29uc3QgT1JTTFRhZyBfX3Jlc3RyaWN0IHRhZykKK3sKKyAgICBpbnQgaSwgb2s7CisKKyAgICBpZiAobiA9PSAwKSByZXR1cm4gMDsKKyAgICBpZiAoY2hlY2tfYXJncyhuLCBpbmRzLCBic2V0cywgdGFnKSAhPSAwKSByZXR1cm4gRUlOVkFMOworICAgIGlmIChjaGVja19ic2V0cyhuLCBic2V0cykgIT0gMCkgcmV0dXJuIEVOT1NZUzsKKworICAgIHN0YXRlX2xvY2soKTsKKworICAgIC8qIExvb3AgdW50aWwgd2UgZmluZCB0aGF0IGFsbCB0aGUgcmVzb3VyY2VzIHdlIHdhbnQgYXJlIGF2YWlsYWJsZSAqLworICAgIGRvIHsKKyAgICAgICAgb2sgPSAxOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICAgICAgaWYgKGNhbl9yZXNlcnZlX2NhcmQoaW5kc1tpXSwgJmJzZXRzW2ldLCB0YWcpICE9IDApIHsKKyAgICAgICAgICAgICAgICBvayA9IDA7CisgICAgICAgICAgICAgICAgLyogV2FpdCBmb3Igc29tZW9uZSB0byByZWxlYXNlIHNvbWUgcmVzb3VyY2VzICovCisgICAgICAgICAgICAgICAgc3RhdGVfd2FpdF9mb3JfcmVsZWFzZSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgIH0gd2hpbGUgKCFvayk7CisKKyAgICAvKiBBdCB0aGlzIHBvaW50IHdlIGFyZSBnb29kIHRvIHJlc2VydmVfY2FyZCB0aGUgcmVzb3VyY2VzIHdlIHdhbnQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICByZXNlcnZlX2NhcmQoaW5kc1tpXSwgJmJzZXRzW2ldLCB0YWcpOworCisgICAgc3RhdGVfdW5sb2NrKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBPUlNMVHJ5UmVzZXJ2ZTAoY29uc3QgaW50IG4sIGNvbnN0IGludCAqX19yZXN0cmljdCBpbmRzLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IE9SU0xCdXN5U2V0ICpfX3Jlc3RyaWN0IGJzZXRzLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IE9SU0xUYWcgX19yZXN0cmljdCB0YWcpCit7CisgICAgaW50IGksIHJjID0gRUJVU1k7CisKKyAgICBpZiAobiA9PSAwKSByZXR1cm4gMDsKKyAgICBpZiAoY2hlY2tfYXJncyhuLCBpbmRzLCBic2V0cywgdGFnKSAhPSAwKSByZXR1cm4gRUlOVkFMOworICAgIGlmIChjaGVja19ic2V0cyhuLCBic2V0cykgIT0gMCkgcmV0dXJuIEVOT1NZUzsKKworICAgIHN0YXRlX2xvY2soKTsKKworICAgIC8qIENoZWNrIHJlc291cmNlIGF2YWlsYWJpbGl0eSBvbmNlICovCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgaWYgKGNhbl9yZXNlcnZlX2NhcmQoaW5kc1tpXSwgJmJzZXRzW2ldLCB0YWcpICE9IDApCisgICAgICAgICAgICBnb3RvIGJhaWxfb3V0OworCisgICAgLyogQXQgdGhpcyBwb2ludCB3ZSBhcmUgZ29vZCB0byByZXNlcnZlIHRoZSByZXNvdXJjZXMgd2Ugd2FudCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgIHJlc2VydmVfY2FyZChpbmRzW2ldLCAmYnNldHNbaV0sIHRhZyk7CisKKyAgICByYyA9IDA7CisKK2JhaWxfb3V0OgorICAgIHN0YXRlX3VubG9jaygpOworICAgIHJldHVybiByYzsKK30KKworaW50IE9SU0xSZXNlcnZlUGFydGlhbDAoY29uc3QgT1JTTFBhcnRpYWxHcmFudWxhcml0eSBncmFuLCBjb25zdCBpbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICpfX3Jlc3RyaWN0IGluZHMsIE9SU0xCdXN5U2V0ICpfX3Jlc3RyaWN0IGJzZXRzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPUlNMVGFnIF9fcmVzdHJpY3QgdGFnKQoreworICAgIGludCByYyA9IEVCVVNZOworICAgIGludCBpLCBudW1fYXZhaWwgPSBuOworCisgICAgaWYgKG4gPT0gMCkgcmV0dXJuIDA7CisgICAgaWYgKGdyYW4gIT0gR1JBTl9DQVJEICYmIGdyYW4gIT0gR1JBTl9USFJFQUQpIHJldHVybiBFSU5WQUw7CisgICAgaWYgKGdyYW4gIT0gR1JBTl9DQVJEKSByZXR1cm4gRUlOVkFMOworICAgIGlmIChjaGVja19hcmdzKG4sIGluZHMsIGJzZXRzLCB0YWcpICE9IDApIHJldHVybiBFSU5WQUw7CisgICAgaWYgKGNoZWNrX2JzZXRzKG4sIGJzZXRzKSAhPSAwKSByZXR1cm4gRU5PU1lTOworCisgICAgc3RhdGVfbG9jaygpOworCisgICAgLyogQ2hlY2sgcmVzb3VyY2UgYXZhaWxhYmlsaXR5IG9uY2U7IHJlbW92ZSB1bmF2YWlsYWJsZSByZXNvdXJjZXMgZnJvbSB0aGUKKyAgICAgKiB1c2VyLXByb3ZpZGVkIGxpc3QgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICBpZiAoY2FuX3Jlc2VydmVfY2FyZChpbmRzW2ldLCAmYnNldHNbaV0sIHRhZykgIT0gMCkgeworICAgICAgICAgICAgbnVtX2F2YWlsLS07CisgICAgICAgICAgICBic2V0c1tpXS50eXBlID0gQlVTWV9TRVRfRU1QVFk7CisgICAgICAgIH0KKworICAgIGlmIChudW1fYXZhaWwgPT0gMCkKKyAgICAgICAgZ290byBiYWlsX291dDsKKworICAgIC8qIEF0IHRoaXMgcG9pbnQgd2UgYXJlIGdvb2QgdG8gcmVzZXJ2ZSB0aGUgcmVzb3VyY2VzIHdlIHdhbnQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICByZXNlcnZlX2NhcmQoaW5kc1tpXSwgJmJzZXRzW2ldLCB0YWcpOworCisgICAgcmMgPSAwOworCitiYWlsX291dDoKKyAgICBzdGF0ZV91bmxvY2soKTsKKyAgICByZXR1cm4gcmM7Cit9CisKK2ludCBPUlNMUmVsZWFzZTAoY29uc3QgaW50IG4sIGNvbnN0IGludCAqX19yZXN0cmljdCBpbmRzLAorICAgICAgICAgICAgICAgIGNvbnN0IE9SU0xCdXN5U2V0ICpfX3Jlc3RyaWN0IGJzZXRzLAorICAgICAgICAgICAgICAgIGNvbnN0IE9SU0xUYWcgX19yZXN0cmljdCB0YWcpCit7CisgICAgaW50IGksIHJjID0gRVBFUk07CisKKyAgICBpZiAobiA9PSAwKSByZXR1cm4gMDsKKyAgICBpZiAoY2hlY2tfYXJncyhuLCBpbmRzLCBic2V0cywgdGFnKSAhPSAwKSByZXR1cm4gRUlOVkFMOworICAgIGlmIChjaGVja19ic2V0cyhuLCBic2V0cykgIT0gMCkgcmV0dXJuIEVOT1NZUzsKKworICAgIHN0YXRlX2xvY2soKTsKKworICAgIC8qIENoZWNrIHRoYXQgd2UgY2FuIHJlbGVhc2UgYWxsIHRoZSByZXNvdXJjZXMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICBpZiAoY2FuX3JlbGVhc2VfY2FyZChpbmRzW2ldLCAmYnNldHNbaV0sIHRhZykgIT0gMCkKKyAgICAgICAgICAgIGdvdG8gYmFpbF9vdXQ7CisKKyAgICAvKiBBdCB0aGlzIHBvaW50IHdlIGFyZSBnb29kIHRvIHJlbGVhc2UgdGhlIHJlc291cmNlcyB3ZSB3YW50ICovCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgcmVsZWFzZV9jYXJkKGluZHNbaV0sICZic2V0c1tpXSwgdGFnKTsKKworICAgIHN0YXRlX3NpZ25hbF9yZWxlYXNlKCk7CisKKyAgICByYyA9IDA7CisKK2JhaWxfb3V0OgorICAgIHN0YXRlX3VubG9jaygpOworICAgIHJldHVybiByYzsKK30KKworLyogdmltOnNldCBldDogKi8KZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL29yc2wtbGl0ZS92ZXJzaW9uLnR4dCBiL2ZpbmFsL29mZmxvYWQvc3JjL29yc2wtbGl0ZS92ZXJzaW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjVmNTk5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvb3JzbC1saXRlL3ZlcnNpb24udHh0CkBAIC0wLDAgKzEgQEAKK09SU0wtbGl0ZSAwLjcKZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL3JkdHNjLmggYi9maW5hbC9vZmZsb2FkL3NyYy9yZHRzYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhOTFkNzEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9yZHRzYy5oCkBAIC0wLDAgKzEsMTcgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwordWludDY0X3QgX3JkdHNjKCkKK3sKKyAgdWludDMyX3QgZWF4LCBlZHg7CisgIGFzbSB2b2xhdGlsZSAoInJkdHNjIiA6ICI9YSIgKGVheCksICI9ZCIgKGVkeCkpOworICByZXR1cm4gKCh1aW50NjRfdCllZHggPDwgMzIpIHwgZWF4OworfQpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvdXNlX21wc3MyLnR4dCBiL2ZpbmFsL29mZmxvYWQvc3JjL3VzZV9tcHNzMi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ4ZjQ4MwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL3VzZV9tcHNzMi50eHQKQEAgLTAsMCArMSBAQAorMi4xLjY3MjAtMTMKZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL3VzZV9tcHNzX3dpbi50eHQgYi9maW5hbC9vZmZsb2FkL3NyYy91c2VfbXBzc193aW4udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0OGY0ODMKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy91c2VfbXBzc193aW4udHh0CkBAIC0wLDAgKzEgQEAKKzIuMS42NzIwLTEzCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL0J1aWxkX1dpdGhfQ01ha2UudHh0IGIvZmluYWwvcnVudGltZS9CdWlsZF9XaXRoX0NNYWtlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmMwZjc3Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9CdWlsZF9XaXRoX0NNYWtlLnR4dApAQCAtMCwwICsxLDIyNSBAQAorIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCisgICAgICAgICAgICAgICBCdWlsZGluZyBsaWJpb21wNSB1c2luZyBDTWFrZQorICAgICAgICAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgLS0tLSBWZXJzaW9uIG9mIENNYWtlIHJlcXVpcmVkOiB2Mi44LjAgb3IgYWJvdmUgLS0tLQorIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0hvdyB0byBjYWxsIGNtYWtlIGluaXRpYWxseSwgdGhlbiByZXBlYXRlZGx5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLSBXaGVuIGNhbGxpbmcgY21ha2UgZm9yIHRoZSBmaXJzdCB0aW1lLCBhbGwgbmVlZGVkIGNvbXBpbGVyIG9wdGlvbnMKKyAgbXVzdCBiZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gIEFmdGVyIHRoaXMgaW5pdGlhbCBjYWxsIHRvCisgIGNtYWtlLCB0aGUgY29tcGlsZXIgZGVmaW5pdGlvbnMgbXVzdCBub3QgYmUgaW5jbHVkZWQgZm9yIGZ1cnRoZXIgY2FsbHMKKyAgdG8gY21ha2UuICBPdGhlciBvcHRpb25zIGNhbiBiZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSBtdWx0aXBsZQorICB0aW1lcyBpbmNsdWRpbmcgYWxsIGRlZmluaXRpb25zIGluIHRoZSBCdWlsZCBvcHRpb25zIHNlY3Rpb24gYmVsb3cuCistIEV4YW1wbGUgb2YgY29uZmlndXJpbmcsIGJ1aWxkaW5nLCByZWNvbmZpZ3VyaW5nLCByZWJ1aWxkaW5nOgorICAkIG1rZGlyIGJ1aWxkCisgICQgY2QgYnVpbGQKKyAgJCBjbWFrZSAtRENNQUtFX0NfQ09NUElMRVI9Z2NjIC1EQ01BS0VfQ1hYX0NPTVBJTEVSPWcrKyAtRGFyY2g9MzIgLi4gICMgSW5pdGlhbCBjb25maWd1cmF0aW9uCisgICQgbWFrZSBhbGwgY29tbW9uCisgIC4uLgorICAkIG1ha2UgY2xlYW4KKyAgJCBjbWFrZSAtRGFyY2g9MzJlIC1EQ01BS0VfQlVJTERfVFlQRT1EZWJ1ZyAuLiAgICAgICAgICAgICAgICAgICAgICAgICMgU2Vjb25kIGNvbmZpZ3VyYXRpb24KKyAgJCBtYWtlIGFsbCBjb21tb24KKyAgLi4uCisgICQgcm0gLXJmICoKKyAgJCBjbWFrZSAtRENNQUtFX0NfQ09NUElMRVI9Z2NjIC1EQ01BS0VfQ1hYX0NPTVBJTEVSPWcrKyAtRGFyY2g9MzJlIC4uICMgVGhpcmQgY29uZmlndXJhdGlvbgorICAkIG1ha2UgYWxsIGNvbW1vbgorLSBOb3RpY2UgaW4gdGhlIGV4YW1wbGUgaG93IHRoZSBjb21waWxlciBkZWZpbml0aW9ucyBhcmUgb25seSBzcGVjaWZpZWQKKyAgZm9yIGFuIGVtcHR5IGJ1aWxkIGRpcmVjdG9yeSwgYnV0IG90aGVyIEJ1aWxkIG9wdGlvbnMgYXJlIHVzZWQgYXQgYW55IHRpbWUuCistIFRoZSBmaWxlIENNYWtlQ2FjaGUudHh0IHdoaWNoIGlzIGNyZWF0ZWQgYWZ0ZXIgdGhlIGZpcnN0IGNhbGwgdG8gY21ha2UKKyAgaXMgYSBjb25maWd1cmF0aW9uIGZpbGUgd2hpY2ggaG9sZHMgYWxsIHRoZSB2YWx1ZXMgZm9yIHRoZSBCdWlsZCBvcHRpb25zLgorICBUaGVzZSBjb25maWd1cmF0aW9uIHZhbHVlcyBjYW4gYmUgY2hhbmdlZCB1c2luZyBhIHRleHQgZWRpdG9yIHRvIG1vZGlmeSAKKyAgQ01ha2VDYWNoZS50eHQgYXMgb3Bwb3NlZCB0byB1c2luZyBkZWZpbml0aW9ucyBvbiB0aGUgY29tbWFuZCBsaW5lLgorLSBUbyBoYXZlIGNtYWtlIGNyZWF0ZSBhIHBhcnRpY3VsYXIgdHlwZSBvZiBidWlsZCBnZW5lcmF0b3IgZmlsZSBzaW1wbHkgCisgIGlubHVkZSB0aGUgLUcgPEdlbmVyYXRvciBuYW1lPiBvcHRpb246CisgICQgY21ha2UgLUcgIlVuaXggTWFrZWZpbGVzIiAuLi4KKyAgWW91IGNhbiBzZWUgYSBsaXN0IG9mIGdlbmVyYXRvcnMgY21ha2Ugc3VwcG9ydHMgYnkgZXhlY3V0aW5nIGNtYWtlIHdpdGgKKyAgbm8gYXJndW1lbnRzIGFuZCBhIGxpc3Qgd2lsbCBiZSBwcmludGVkLgorCis9PT09PT09PT09PT09PT09PT09PT0KK0luc3RydWN0aW9ucyB0byBCdWlsZAorPT09PT09PT09PT09PT09PT09PT09CisgJCBjZCBsaWJvbXBfdG9wX2xldmVsLyBbIGRpcmVjdG9yeSB3aXRoIHNyYy8gLCBleHBvcnRzLyAsIHRvb2xzLyAsIGV0Yy4gXQorICQgbWtkaXIgYnVpbGQKKyAkIGNkIGJ1aWxkCisKKyBbIExpbnV4KiAsIE1hYyogTGlicmFyaWVzIF0KKyAkIGNtYWtlIC1EQ01BS0VfQ19DT01QSUxFUj08QyBDb21waWxlcj4gLURDTUFLRV9DWFhfQ09NUElMRVI9PEMrKyBDb21waWxlcj4gLi4KKworIFsgSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgTGlicmFyeSAoSW50ZWwoUikgTUlDIExpYnJhcnkpIF0KKyAkIGNtYWtlIC1EQ01BS0VfQ19DT01QSUxFUj08QyBDb21waWxlcj4gLURDTUFLRV9DWFhfQ09NUElMRVI9PEMrKyBDb21waWxlcj4gLURvcz1taWMgLURhcmNoPTMyZSAuLgorCisgWyBXaW5kb3dzIExpYnJhcmllcyBdCisgJCBjbWFrZSAtRyAiVW5peCBNYWtlZmlsZXMiIC1EQ01BS0VfQ19DT01QSUxFUj08QyBDb21waWxlcj4gLURDTUFLRV9DWFhfQ09NUElMRVI9PEMrKyBDb21waWxlcj4gLURDTUFLRV9BU01fTUFTTV9DT01QSUxFUj1bbWwgfCBtbDY0XSAtRENNQUtFX0JVSUxEX1RZUEU9UmVsZWFzZSAuLgorCisgJCBtYWtlIGFsbCBjb21tb24KKworPT09PT09PT09PT09PT09PT0KK01hYyogRmF0IExpYnJhcmllcworPT09PT09PT09PT09PT09PT0KK09uIE9TIFgqIG1hY2hpbmVzLCBpdCBpcyBwb3NzaWJsZSB0byBidWlsZCB1bml2ZXJzYWwgKG9yIGZhdCkgbGlicmFyaWVzIHdoaWNoCitpbmNsdWRlIGJvdGggSUEtMzIgYXJjaGl0ZWN0dXJlIGFuZCBJbnRlbChSKSA2NCBhcmNoaXRlY3R1cmUgb2JqZWN0cyBpbiBhCitzaW5nbGUgYXJjaGl2ZTsganVzdCBidWlsZCB0aGUgMzIgYW5kIDMyZSBsaWJyYXJpZXMgc2VwYXJhdGVseToKKyAkIGNtYWtlIC1EQ01BS0VfQ19DT01QSUxFUj1jbGFuZyAtRENNQUtFX0NYWF9DT01QSUxFUj1jbGFuZysrIC1EYXJjaD0zMiAuLgorICQgbWFrZQorICQgY21ha2UgLURhcmNoPTMyZSAuLgorICQgbWFrZQordGhlbiBpbnZva2UgbWFrZSBhZ2FpbiB3aXRoIGEgc3BlY2lhbCBhcmd1bWVudCBhcyBmb2xsb3dzOgorICQgbWFrZSBmYXQKKy0gVGhlIGZhdCB0YXJnZXQgaXMgb25seSBhdmFpbGFibGUgZm9yIHRoZSBhcmNoPTMyZSBjb25maWd1cmF0aW9uLgorLSBUaGUgZmF0IGxpYnJhcmllcyB3aWxsIGJlIHB1dCBpbiBleHBvcnRzL21hY18zMmUvbGliIHdoaWxlIHRoZSAidGhpbiIgbGlicmFyaWVzCisgIHdpbGwgYmUgaW4gZXhwb3J0cy9tYWNfMzJlL2xpYi50aGluIGFuZCBleHBvcnRzL21hY18zMi9saWIudGhpbgorCis9PT09PT09PT09PT09PT09CitDb21waWxlciBvcHRpb25zCis9PT09PT09PT09PT09PT09CistRENNQUtFX0NfQ09NUElMRVI9PEMgY29tcGlsZXIgbmFtZT4KKy1EQ01BS0VfQ1hYX0NPTVBJTEVSPTxDKysgY29tcGlsZXIgbmFtZT4KKworLURDTUFLRV9Gb3J0cmFuX0NPTVBJTEVSPTxGb3J0cmFuIGNvbXBpbGVyIG5hbWU+CitVbml4KiBzeXN0ZW1zIChPcHRpb25hbCBhcyBjb21waWxlciBpcyBkZWZhdWx0KToKK1RoaXMgb3B0aW9uIGlzIG9ubHkgbmVlZGVkIHdoZW4gLURjcmVhdGVfZm9ydHJhbl9tb2R1bGVzIGlzIHRydWUKKworLURDTUFLRV9BU01fQ09NUElMRVI9PEFzc2VtYmxlciBuYW1lPgorVGhpcyBvcHRpb24gaXNuJ3QgdXN1YWxseSBuZWVkZWQgZm9yIE5vbi1XaW5kb3dzKiBidWlsZHMKKworLURDTUFLRV9BU01fTUFTTV9DT01QSUxFUj1bbWwgfCBtbDY0IF0KK1RoaXMgb3B0aW9uIGlzIFdpbmRvd3MqIE9ubHkKKworPT09PT09PT09PT09PQorQnVpbGQgb3B0aW9ucworPT09PT09PT09PT09PQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PQorPT09PSBPcGVyYXRpbmcgU3lzdGVtID09PT0KKz09PT09PT09PT09PT09PT09PT09PT09PT09CistRG9zPWxpbnxtYWN8d2lufG1pYworKiBPcGVyYXRpbmcgc3lzdGVtIGNhbiBiZSBsaW4gKExpbnV4KiksIG1hYyAoTWFjKiksIHdpbiAoV2luZG93cyopLCBvcgorICBtaWMgKEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZSAoSW50ZWwoUikgTUlDIEFyY2hpdGVjdHVyZSkpLgorICBJZiBub3Qgc3BlY2lmaWVkLCBjbWFrZSB3aWxsIHRyeSB0byBkZXRlcm1pbmUgeW91ciBjdXJyZW50IG9wZXJhdGluZyBzeXN0ZW0uCisKKz09PT09PT09PT09PT09PT09PT09PT0KKz09PT0gQXJjaGl0ZWN0dXJlID09PT0KKz09PT09PT09PT09PT09PT09PT09PT0KKy1EYXJjaD0zMnwzMmV8YXJtfHBwYzY0CisqIEFyY2hpdGVjdHVyZSBjYW4gYmUgMzIgKElBLTMyIGFyY2hpdGVjdHVyZSksIDMyZSAoSW50ZWwoUikgNjQgYXJjaGl0ZWN0dXJlKSwKKyAgYXJtIChBUk0gYXJjaGl0ZWN0dXJlKSwgb3IgcHBjNjQgKFBQQzY0IGFyY2hpdGVjdHVyZSkuCisgIFRoaXMgb3B0aW9uLCBieSBkZWZhdWx0IGlzIGNob3NlbiBiYXNlZCBvbiB0aGUKKyAgQ01ha2UgdmFyaWFibGUgQ01BS0VfU0laRU9GX1ZPSURfUC4gIElmIGl0IGlzIDgsIHRoZW4gSW50ZWwoUikgNjQgYXJjaGl0ZWN0dXJlCisgIGlzIGFzc3VtZWQuICBJZiBpdCBpcyA0LCB0aGVuIElBLTMyIGFyY2hpdGVjdHVyZSBpcyBhc3N1bWVkLiAgSWYgeW91IHdhbnQgdG8KKyAgdXNlIGEgZGlmZmVyZW50IGFyY2hpdGVjdHVyZSBvdGhlciB0aGFuIHg4NiBiYXNlZCBhcmNoaXRlY3R1cmUsIHlvdSBtdXN0IHNwZWNpZnkKKyAgaXQgd2hlbiBjYWxsaW5nIGNtYWtlIGluaXRpYWxseSB1c2luZyB0aGlzIC1EYXJjaD08YXJjaD4gb3B0aW9uIG9yIGJ5IGNoYW5naW5nIAorICB0aGUgYXJjaCB2YWx1ZSB2aWEgQ01ha2VDYWNoZS50eHQgb3IgdGhlIENNYWtlIEdVSSBhZnRlciB0aGUgaW5pdGlhbCBDTWFrZSBydW4uCisKKy0tLS0gRmlyc3QgdmFsdWVzIGxpc3RlZCBhcmUgdGhlIGRlZmF1bHQgdmFsdWUgLS0tLQorLURsaWJfdHlwZT1ub3JtYWx8cHJvZmlsZXxzdHVicworTGlicmFyeSB0eXBlIGNhbiBiZSBub3JtYWwsIHByb2ZpbGUsIG9yIHN0dWJzLgorCistRENNQUtFX0JVSUxEX1RZUEU9UmVsZWFzZXxEZWJ1Z3xSZWxXaXRoRGViSW5mbworQnVpbGQgdHlwZSBjYW4gYmUgUmVsZWFzZSwgRGVidWcsIG9yIFJlbFdpdGhEZWJJbmZvLgorU2VlIGJlbG93IGZvciBpbnRlcmFjdGlvbiB3aGVuIC1EVVNFX0JVSUxEUExfUlVMRVMgaXMgb24uCisKKy1EdmVyc2lvbj01fDQKK2xpYmlvbXA1IHZlcnNpb24gY2FuIGJlIDUgb3IgNC4KKworLURvbXBfdmVyc2lvbj00MHwzMAorT3Blbk1QIHZlcnNpb24gY2FuIGJlIGVpdGhlciA0MCBvciAzMC4KKworLURtaWNfYXJjaD1rbmN8a25mCitJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlLiAgQ2FuIGJlIAora25mIChLbmlnaHRzIEZlcnJ5KSBvciBrbmMgKEtuaWdodHMgQ29ybmVyKS4KK1RoaXMgdmFsdWUgaXMgaWdub3JlZCBpZiBvcyAhPSBtaWMKKyAgCistRG1pY19vcz1saW58YnNkCitPcGVyYXRpbmcgc3lzdGVtIG9uIEludGVsKFIpIE1JQyBBcmNoaXRlY3R1cmUuCitDYW4gYmUgZWl0aGVyIGJzZCBvciBsaW4uICBUaGlzIHZhbHVlIGlzIGlnbm9yZWQgaWYgb3MgIT0gbWljCisKKy1EY3JlYXRlX2ZvcnRyYW5fbW9kdWxlcz1vZmZ8b24KK1Nob3VsZCB0aGUgRm9ydHJhbiBtb2R1bGVzIGJlIGNyZWF0ZWQgKHJlcXVpcmVzIEZvcnRyYW4gY29tcGlsZXIpCisKKy1Ec3RhdHM9b2ZmfG9uCitTaG91bGQgaW5jbHVkZSBzdGF0cy1nYXRoZXJpbmcgY29kZT8KKworPT09PT09PT09PT09PT09PT09PT09Cis9PT09IE1pY3JvIHRlc3RzID09PT0KKz09PT09PT09PT09PT09PT09PT09PQorQWZ0ZXIgdGhlIGxpYnJhcnkgaGFzIGJlZW4gYnVpbHQsIGZpdmUgbWljcm90ZXN0cyBhcmUgcGVyZm9ybWVkLgorU29tZSB3aWxsIGJlIHNraXBwZWQgYmFzZWQgdXBvbiB0aGUgcGxhdGZvcm0uCitUaGVzZSB0ZXN0cyBjYW4gYmUgdHVybmVkIG9uIChkZWZhdWx0KSBvciBvZmYgd2l0aCB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CistRHRlc3RfdG91Y2g9b258b2ZmICAgICAtLSBTaG91bGQgdGhlIHRvdWNoIHRlc3QgYmUgZG9uZT8KKy1EdGVzdF9yZWxvPW9ufG9mZiAgICAgIC0tIFNob3VsZCB0aGUgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSB0ZXN0IGJlIGRvbmU/CistRHRlc3RfZXhlY3N0YWNrPW9ufG9mZiAtLSBTaG91bGQgdGhlIHN0YWNrIGJlIGNoZWNrZWQgZm9yIGV4ZWN1dGFiaWxpdHk/CistRHRlc3RfaW5zdHI9b258b2ZmICAgICAtLSBTaG91bGQgdGhlIEludGVsKFIpIE1JQyBMaWJyYXJpZXMgYmUgY2hlY2tlZCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgY29ycmVjdCBpbnN0cnVjdGlvbiBzZXQ/CistRHRlc3RfZGVwcz1vbnxvZmYgICAgICAtLSBTaG91bGQgbGliaW9tcDUncyBkZXBlbmRlbmNpZXMgYmUgY2hlY2tlZD8KKy1EdGVzdHM9b2ZmfG9uICAgICAgICAgIC0tIFNob3VsZCBhbnkgb2YgdGhlIGFib3ZlIHRlc3RzIGJlIGRvbmU/CisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis9PT09IEhvdyB0byBhcHBlbmQgZmxhZ3MgdG8gY29tcGlsYXRpb24gPT09PQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0gVGhlc2UgZmxhZ3MgYXJlICphcHBlbmRlZCouICBUaGV5IGRvIG5vdCAKKyAgb3ZlcndyaXRlIGFueSBvZiB0aGUgcHJlc2V0IGZsYWdzLgorLURVU0VSX0NQUF9GTEFHUz08c3BhY2Utc2VwYXJhdGVkIGZsYWdzPiAgICAtLSBBZGRpdGlvbmFsIEMgUHJlcHJvY2Vzc29yIGZsYWdzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0eXBpY2FsbHkgYWRkaXRpb25hbCAtRGRlZj12YWwgZmxhZ3MpCistRFVTRVJfQ19GTEFHUz08c3BhY2Utc2VwYXJhdGVkIGZsYWdzPiAgICAgIC0tIEFkZGl0aW9uYWwgQyBjb21waWxlciBmbGFncworLURVU0VSX0NYWF9GTEFHUz08c3BhY2Utc2VwYXJhdGVkIGZsYWdzPiAgICAtLSBBZGRpdGlvbmFsIEMrKyBjb21waWxlciBmbGFncworLURVU0VSX0FTTV9GTEFHUz08c3BhY2Utc2VwYXJhdGVkIGZsYWdzPiAgICAtLSBBZGRpdGlvbmFsIGFzc2VtYmx5IGZsYWdzCistRFVTRVJfTERfRkxBR1M9PHNwYWNlLXNlcGFyYXRlZCBmbGFncz4gICAgIC0tIEFkZGl0aW9uYWwgbGlua2VyIGZsYWdzCistRFVTRVJfTERfTElCX0ZMQUdTPTxzcGFjZS1zZXBhcmF0ZWQgZmxhZ3M+IC0tIEFkZGl0aW9uYWwgbGlicmFyaWVzIHRvIGxpbmsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGR1cmluZyBsaW5rIHBoYXNlCistRFVTRVJfRl9GTEFHUz08c3BhY2Utc2VwYXJhdGVkIGZsYWdzPiAgLS0gQWRkaXRpb25hbCBGb3J0cmFuIGNvbXBpbGVyIGZsYWdzCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis9PT09IEZlYXR1cmUgQmFzZWQgQ29tcGlsYXRpb24gPT09PQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy1EVVNFX0JVSUxEUExfUlVMRVM9ZmFsc2V8dHJ1ZQorU2hvdWxkIHRoZSBidWlsZCBpbWl0YXRlIGJ1aWxkLnBsJ3MgYnVpbGQgcHJvY2Vzcy4KK1doZW4gdGhpcyBpcyB0cnVlLCB0aGUgVW5peCogUmVsZWFzZSBidWlsZHMgd2lsbCBidWlsZCBsaWJpb21wNQord2l0aCAtTzIgYW5kIC1nIGZsYWdzIGFjdGl2YXRlZCAoc2FtZSBhcyBSZWxXaXRoRGViSW5mbykuIFRoZW4sCit0aGUgZGVidWcgaW5mbyBpcyBzdHJpcHBlZCBvdXQgb2YgdGhlIGxpYnJhcnkgYW5kIHB1dCBpbnRvIGxpYmlvbXA1LmRiZworVGhpcyBpcyBkb25lIGZvciBpbnRlcmFjdGlvbiB3aXRoIEludGVsKFIpIFBhcmFsbGVsIEFtcGxpZmllci4KKworLURVU0VfQURBUFRJVkVfTE9DS1M9dHJ1ZXxmYWxzZSAgICAgICAKK1Nob3VsZCBhZGFwdGl2ZSAoVFNYLWJhc2VkKSBsb2NrcyBiZSBpbmNsdWRlZD8gIAorVGhlc2UgYXJlIHg4NiBzcGVjaWZpYy4gIFRoaXMgZmVhdHVyZSBpcyB0dXJuZWQgb24gYnkgZGVmYXVsdCAKK2ZvciBJQS0zMiBhcmNoaXRlY3R1cmUgYW5kIEludGVsKFIpIDY0IGFyY2hpdGVjdHVyZS4gCitPdGhlcndpc2UsIGl0IGlzIHR1cm5lZCBvZmYuCisKKy1EVVNFX1BSRURFRklORURfTElOS0VSX0ZMQUdTPXRydWV8ZmFsc2UKK1Nob3VsZCB0aGUgcHJlZGVmaW5lZCBsaW5rZXIgZmxhZ3MgaW4gQ29tbW9uRmxhZ3MuY21ha2UgYmUgaW5jbHVkZWQKK2luIHRoZSBsaW5rIGNvbW1hbmQ/IFRoaXMgaXMgdHJ1ZSBieSBkZWZhdWx0IGFuZCBzaG91bGQgd29yayBmb3IKK0xpbnV4KiwgTWFjKiwgYW5kIFdpbmRvd3MqLiAgVGhlIC0tdmVyc2lvbi1zY3JpcHQgZmxhZyBvbiBVbml4KiBiYXNlZAorb3BlcmF0aW5nIHN5c3RlbXMgd2lsbCBiZSBpbmNsdWRlZCByZWdhcmRsZXNzLgorCis9PT09PT09PT09PT09PT09PT09PT09PT0KK0V4YW1wbGVzIHVzYWdlcyBvZiBDTWFrZQorPT09PT09PT09PT09PT09PT09PT09PT09CistLS0tIFR5cGljYWwgdXNhZ2UgLS0tLQorY21ha2UgLURDTUFLRV9DX0NPTVBJTEVSPWljYyAtRENNQUtFX0NYWF9DT01QSUxFUj1pY3BjIC4uCitjbWFrZSAtRENNQUtFX0NfQ09NUElMRVI9Z2NjIC1EQ01BS0VfQ1hYX0NPTVBJTEVSPWcrKyAuLgorY21ha2UgLURDTUFLRV9DX0NPTVBJTEVSPWNsYW5nIC1EQ01BS0VfQ1hYX0NPTVBJTEVSPWNsYW5nKysgLi4KKworLS0tLSBXaXRoIFZhcmlvdXMgT3B0aW9ucyAtLS0tCitjbWFrZSAtRENNQUtFX0NfQ09NUElMRVI9Z2NjIC1EQ01BS0VfQ1hYX0NPTVBJTEVSPWcrKyAtRG9zPWxpbiAtRGFyY2g9MzIgLi4KK2NtYWtlIC1EQ01BS0VfQ19DT01QSUxFUj1jbGFuZyAtRENNQUtFX0NYWF9DT01QSUxFUj1jbGFuZysrIC1Eb3M9bWFjIC1EYXJjaD0zMiAtRENNQUtFX0JVSUxEX1RZUEU9RGVidWcgLi4KK2NtYWtlIC1EQ01BS0VfQ19DT01QSUxFUj1pY2MgLURDTUFLRV9DWFhfQ09NUElMRVI9aWNwYyAtRENNQUtFX0ZvcnRyYW5fQ09NUElMRVI9aWZvcnQgLUR0ZXN0cz1vbiAtRGNyZWF0ZV9mb3J0cmFuX21vZHVsZXM9b24gLURVU0VfQlVJTERQTF9SVUxFUz1vbiAuLgorY21ha2UgLURVU0VSX0NGTEFHUz0nV2Vycm9yJyAtRFVTRVJfQ1BQX0ZMQUdTPSctRE5FV19GRUFUVVJFPTEgLURPTERfRkVBVFVSRT0wJyAtRFVTRVJfQ1hYX0ZMQUdTPSctV2Vycm9yIC1Xc2lnbi1jb21wYXJlJyAuLgorCistLS0tIFN0dWJzIGxpYnJhcnkgLS0tLQorY21ha2UgLURDTUFLRV9DX0NPTVBJTEVSPWdjYyAtRENNQUtFX0NYWF9DT01QSUxFUj1nKysgLURsaWJfdHlwZT1zdHVicyAuLgorCis9PT09PT09PT0KK0Zvb3Rub3RlcworPT09PT09PT09CitbKl0gT3RoZXIgbmFtZXMgYW5kIGJyYW5kcyBtYXkgYmUgY2xhaW1lZCBhcyB0aGUgcHJvcGVydHkgb2Ygb3RoZXJzLgpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9DTWFrZUxpc3RzLnR4dCBiL2ZpbmFsL3J1bnRpbWUvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJjODRjNgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw4MzMgQEAKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworIyMjIyMjIyMjIyMjIyMjIworIyBDTUFLRSBsaWJpb21wNQorY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuOCBGQVRBTF9FUlJPUikKK3Byb2plY3QobGliaW9tcCBDIENYWCkKKworIyMjIyMjIyMjCisjIEdMT0JBTFMgCitzZXQoR0xPQkFMX0RFQlVHIDApCisKKyMgQWRkIGNtYWtlIGRpcmVjdG9yeSB0byBzZWFyY2ggZm9yIGN1c3RvbSBjbWFrZSBmdW5jdGlvbnMKK3NldChDTUFLRV9NT0RVTEVfUEFUSCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY21ha2UgJHtDTUFLRV9NT0RVTEVfUEFUSH0pCisKKyMgU2V0IGJhc2UgbGlib21wIGRpcmVjdG9yeSAoZGlyZWN0b3J5IHdpdGggZXhwb3J0cy8gLCBzcmMvICwgdG9vbHMvICwgZXRjLikKKyMgVGhlIHRvcC1sZXZlbCBDTWFrZUxpc3RzLnR4dCBzaG91bGQgZGVmaW5lIHRoaXMgdmFyaWFibGUuCitzZXQoTElCT01QX1dPUksgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9KQorCisjIFRoZXNlIGluY2x1ZGUgZmlsZXMgYXJlIGluIGNtYWtlLyBzdWJkaXJlY3RvcnkgZXhjZXB0IGZvciBGaW5kUGVybCB3aGljaCBpcyBhIGNtYWtlIHN0YW5kYXJkIG1vZHVsZQoraW5jbHVkZShIZWxwZXJGdW5jdGlvbnMpCitpbmNsdWRlKERlZmluaXRpb25zKSAjIC1EIGRlZmluaXRpb25zIHdoZW4gY29tcGlsaW5nIAoraW5jbHVkZShDb21tb25GbGFncykgIyBjb21waWxlciwgYXNzZW1ibGVyLCBmb3J0cmFuLCBsaW5rZXIgZmxhZ3MgY29tbW9uIGZvciBhbGwgY29tcGlsZXJzCitpbmNsdWRlKFNvdXJjZUZpbGVzKSAjIHNvdXJjZSBmaWxlcyB0byBjb21waWxlIAoraW5jbHVkZShQZXJsRmxhZ3MpICAgIyBQZXJsIGZsYWdzIGZvciBnZW5lcmF0ZS1kZWYucGwgYW5kIGV4cGFuZC12YXJzLnBsCitpbmNsdWRlKEZpbmRQZXJsKSAjIFN0YW5kYXJkIGNtYWtlIG1vZHVsZSB0byBjaGVjayBmb3IgUGVybAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgICAgICAgICAgICAgICAgICAgICAgICBDT05GSUdVUkFUSU9OCisjCisjICogQW55IHZhcmlhYmxlL3ZhbHVlIHRoYXQgaXMgQ0FDSEUtZWQgY2FuIGJlIGNoYW5nZWQgYWZ0ZXIgdGhlIGluaXRpYWwgcnVuIG9mIGNtYWtlCisjIHRocm91Z2ggdGhlIGZpbGUsIENNYWtlQ2FjaGUudHh0IHdoaWNoIGlzIGluIHRoZSBidWlsZCBkaXJlY3RvcnkuCisjICogSWYgeW91IGNoYW5nZSBhbnkgdmFsdWUgaW4gQ01ha2VDYWNoZS50eHQsIHRoZW4ganVzdCBydW4gY21ha2UgLi4KKyMgYW5kIHRoZSBjaGFuZ2VkIHdpbGwgYmUgcGlja2VkIHVwLiAgT25lIGNhbiBhbHNvIHVzZSAtRFZBUklBQkxFPVZBTFVFCisjIHdoZW4gY2FsbGluZyBjbWFrZSB0byBjaGFuZ2VkIGNvbmZpZ3VyYXRpb24gdmFsdWVzLiAgCisjICogQ01BS0VfQ19DT01QSUxFUiwgQ01BS0VfQ1hYX0NPTVBJTEVSLCBDTUFLRV9BU01fTUFTTV9DT01QSUxFUiwgQ01BS0VfQVNNX0NPTVBJTEVSLAorIyBDTUFLRV9Gb3J0cmFuX0NPTVBJTEVSIGNhbiBvbmx5IGJ5IHNwZWNpZmllZCBvbiB0aGUgaW5pdGlhbCBydW4gb2YgY21ha2UuIAorIyBUaGlzIG1lYW5zIHlvdSBjYW5ub3Qgc3BlY2lmeSAtRENNQUtFX0NfQ09NUElMRVI9IG9uIGEgc3Vic2VxdWVudCBydW4gb2YgY21ha2UKKyMgaW4gdGhlIHNhbWUgYnVpbGQgZGlyZWN0b3J5IHVudGlsIHRoYXQgYnVpbGQgZGlyZWN0b3J5IGlzIGVtcHRpZWQuCisjIElmIHlvdSB3YW50IHRvIGNoYW5nZSB0aGUgY29tcGlsZXIsIHRoZW4gZW1wdHkgdGhlIGJ1aWxkIGRpcmVjdG9yeSBhbmQgcmVydW4gY21ha2UuCisKKyMgQnVpbGQgQ29uZmlndXJhdGlvbgorc2V0KG9zX3Bvc3NpYmxlX3ZhbHVlcyAgICAgICAgICBsaW4gbWFjIHdpbiBtaWMpCitzZXQoYXJjaF9wb3NzaWJsZV92YWx1ZXMgICAgICAgIDMyZSAzMiBhcm0gcHBjNjQpCitzZXQoYnVpbGRfdHlwZV9wb3NzaWJsZV92YWx1ZXMgIHJlbGVhc2UgZGVidWcgcmVsd2l0aGRlYmluZm8pCitzZXQob21wX3ZlcnNpb25fcG9zc2libGVfdmFsdWVzIDQwIDMwKQorc2V0KGxpYl90eXBlX3Bvc3NpYmxlX3ZhbHVlcyAgICBub3JtYWwgcHJvZmlsZSBzdHVicykKK3NldChtaWNfYXJjaF9wb3NzaWJsZV92YWx1ZXMgICAga25mIGtuYykKK3NldChtaWNfb3NfcG9zc2libGVfdmFsdWVzICAgICAgYnNkIGxpbikKKworIyBCZWxvdywgY21ha2Ugd2lsbCB0cnkgYW5kIGRldGVybWluZSB0aGUgb3BlcmF0aW5nIHN5c3RlbSBhbmQgYXJjaGl0ZWN0dXJlIGZvciB5b3UgKGl0IGFzc3VtZXMgSW50ZWwgYXJjaGl0ZWN0dXJlKQorIyBUaGVzZSB2YWx1ZXMgYXJlIHNldCBpbiBDTWFrZUNhY2hlLnR4dCB3aGVuIGNtYWtlIGlzIGZpcnN0IHJ1biAoLUR2YXJfbmFtZT0uLi4gd2lsbCB0YWtlIHByZWNlZGVuY2UpCisjICBwYXJhbWV0ZXIgIHwgZGVmYXVsdCB2YWx1ZSAgICAgICAgICAgICAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBSaWdodCBub3csIHRoaXMgYnVpbGQgc3lzdGVtIGNvbnNpZGVycyBvcz1saW4gdG8gbWVhbiAiVW5peC1saWtlIHRoYXQgaXMgbm90IE1BQyIKK2lmKCR7QVBQTEV9KSAjIEFwcGxlIGdvZXMgZmlyc3QgYmVjYXVzZSBDTWFrZSBjb25zaWRlcnMgTWFjIHRvIGJlIGEgVW5peCBiYXNlZCBvcGVyYXRpbmcgc3lzdGVtLCB3aGlsZSBsaWJpb21wNSBjb25zaWRlcnMgaXQgYSBzcGVjaWFsIGNhc2UKKyAgICBzZXQob3MgICAgICAgICAgICAgbWFjICAgICAgICAgQ0FDSEUgU1RSSU5HICJUaGUgb3BlcmF0aW5nIHN5c3RlbSB0byBidWlsZCBmb3IgKGxpbi9tYWMvd2luL21pYykiKQorZWxzZWlmKCR7VU5JWH0pCisgICAgc2V0KG9zICAgICAgICAgICAgIGxpbiAgICAgICAgIENBQ0hFIFNUUklORyAiVGhlIG9wZXJhdGluZyBzeXN0ZW0gdG8gYnVpbGQgZm9yIChsaW4vbWFjL3dpbi9taWMpIikKK2Vsc2VpZigke1dJTjMyfSkgICAgICAgCisgICAgc2V0KG9zICAgICAgICAgICAgIHdpbiAgICAgICAgIENBQ0hFIFNUUklORyAiVGhlIG9wZXJhdGluZyBzeXN0ZW0gdG8gYnVpbGQgZm9yIChsaW4vbWFjL3dpbi9taWMpIikKK2Vsc2UoKQorICAgIHNldChvcyAgICAgICAgICAgICBsaW4gICAgICAgICBDQUNIRSBTVFJJTkcgIlRoZSBvcGVyYXRpbmcgc3lzdGVtIHRvIGJ1aWxkIGZvciAobGluL21hYy93aW4vbWljKSIpCitlbmRpZigpCisKKyMgc2V0IHRvIGRlZmF1bHQgYXJjaGl0ZWN0dXJlIGlmIHRoZSB1c2VyIGRpZCBub3Qgc3BlY2lmeSBhbiBhcmNoaXRlY3R1cmUgZXhwbGljaXRseQoraWYoTk9UIGFyY2gpCQorCWlmKCIke0NNQUtFX1NJWkVPRl9WT0lEX1B9IiBTVFJFUVVBTCAiNCIpCisgICAgCXNldChhcmNoICAgICAgICAgICAzMiAgICAgICAgICBDQUNIRSBTVFJJTkcgIlRoZSBhcmNoaXRlY3R1cmUgdG8gYnVpbGQgZm9yICgzMmUvMzIvYXJtL3BwYzY0KS4gIDMyZSBpcyBJbnRlbChSKSA2NCBhcmNoaXRlY3R1cmUsIDMyIGlzIElBLTMyIGFyY2hpdGVjdHVyZSIpCisJZWxzZSgpCisgICAgCXNldChhcmNoICAgICAgICAgICAzMmUgICAgICAgICBDQUNIRSBTVFJJTkcgIlRoZSBhcmNoaXRlY3R1cmUgdG8gYnVpbGQgZm9yICgzMmUvMzIvYXJtL3BwYzY0KS4gIDMyZSBpcyBJbnRlbChSKSA2NCBhcmNoaXRlY3R1cmUsIDMyIGlzIElBLTMyIGFyY2hpdGVjdHVyZSIpCisJZW5kaWYoKQorZW5kaWYoKQorCitzZXQobGliX3R5cGUgICAgICAgbm9ybWFsICAgICAgICBDQUNIRSBTVFJJTkcgIlBlcmZvcm1hbmNlLFByb2ZpbGluZyxTdHVicyBsaWJyYXJ5IChub3JtYWwvcHJvZmlsZS9zdHVicykiKQorc2V0KHZlcnNpb24gICAgICAgIDUgICAgICAgICAgICAgQ0FDSEUgU1RSSU5HICJQcm9kdWNlIGxpYmd1aWRlICh2ZXJzaW9uIDQpIG9yIGxpYmlvbXA1ICh2ZXJzaW9uIDUpIikKK3NldChvbXBfdmVyc2lvbiAgICA0MCAgICAgICAgICAgIENBQ0hFIFNUUklORyAiVGhlIE9wZW5NUCB2ZXJzaW9uICg0MC8zMCkiKQorc2V0KG1pY19hcmNoICAgICAgIGtuYyAgICAgICAgICAgQ0FDSEUgU1RSSU5HICJJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUgKEludGVsKFIpIE1JQyBBcmNoaXRlY3R1cmUpIChrbmYva25jKS4gICBJZ25vcmVkIGlmIG5vdCBJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlIGJ1aWxkLiIpCitzZXQobWljX29zICAgICAgICAgbGluICAgICAgICAgICBDQUNIRSBTVFJJTkcgIkludGVsKFIpIE1JQyBBcmNoaXRlY3R1cmUgb3BlcmF0aW5nIHN5c3RlbSAoYnNkL2xpbikuICAgSWdub3JlZCBpZiBub3QgSW50ZWwoUikgTUlDIEFyY2hpdGVjdHVyZSBidWlsZC4iKQorc2V0KGNyZWF0ZV9mb3J0cmFuX21vZHVsZXMgZmFsc2UgQ0FDSEUgU1RSSU5HICJDcmVhdGUgRm9ydHJhbiBtb2R1bGUgZmlsZXM/IChyZXF1aXJlcyBmb3J0cmFuIGNvbXBpbGVyKSIpCisKKyMgLSBUaGVzZSB0ZXN0cyBhcmUgbGl0dGxlIHRlc3RzIHBlcmZvcm1lZCBhZnRlciB0aGUgbGlicmFyeSBpcyBmb3JtZWQuCisjIC0gVGhlIGxpYnJhcnkgd29uJ3QgYmUgY29waWVkIHRvIHRoZSBleHBvcnRzIGRpcmVjdG9yeSB1bnRpbCBpdCBoYXMgcGFzc2VkL3NraXBwZWQgYWxsIGJlbG93IHRlc3RzCisjIC0gVG8gc2tpcCB0aGVzZSB0ZXN0cywganVzdCBwYXNzIC1EdGVzdHM9T0ZGIHRvIGNtYWtlIG9yIGNoYW5nZSB0ZXN0cyB2YWx1ZSBpbiBDTWFrZUNhY2hlLnR4dCB0byBPRkYgYWZ0ZXIgcnVubmluZyBjbWFrZQorc2V0KHRlc3RfdG91Y2ggICAgICB0cnVlICAgICAgICAgQ0FDSEUgQk9PTCAgICJQZXJmb3JtIGEgc21hbGwgdG91Y2ggdGVzdD8iICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3NldCh0ZXN0X3JlbG8gICAgICAgdHJ1ZSAgICAgICAgIENBQ0hFIEJPT0wgICAiUGVyZm9ybSBhIHJlbG9jYXRpb24gdGVzdCBmb3IgZHluYW1pYyBsaWJyYXJpZXM/IiAgICAgICApCitzZXQodGVzdF9leGVjc3RhY2sgIHRydWUgICAgICAgICBDQUNIRSBCT09MICAgIlBlcmZvcm0gYSBleGVjc3RhY2sgdGVzdCBmb3IgbGludXggZHluYW1pYyBsaWJyYXJpZXM/IiAgKQorc2V0KHRlc3RfaW5zdHIgICAgICB0cnVlICAgICAgICAgQ0FDSEUgQk9PTCAgICJQZXJmb3JtIGFuIGluc3RydWN0aW9uIHRlc3QgZm9yIEludGVsKFIpIE1JQyBBcmNoaXRlY3R1cmUgbGlicmFyaWVzPyIgKQorc2V0KHRlc3RfZGVwcyAgICAgICB0cnVlICAgICAgICAgQ0FDSEUgQk9PTCAgICJQZXJmb3JtIGEgbGlicmFyeSBkZXBlbmRlbmN5IHRlc3Q/IiAgICAgICAgICAgICAgICAgICAgICkKK3NldCh0ZXN0cyAgICAgICAgICAgZmFsc2UgICAgICAgIENBQ0hFIEJPT0wgICAiUGVyZm9ybSB0b3VjaCwgcmVsbywgZXhlY3N0YWNrLCBpbnN0ciwgYW5kIGRlcHMgdGVzdHM/IiApCisKKyMgLSBzdGF0cy1nYXRoZXJpbmcgZW5hYmxlcyBPcGVuTVAgc3RhdHMgd2hlcmUgdGhpbmdzIGxpa2UgdGhlIG51bWJlciBvZiBwYXJhbGxlbCByZWdpb25zLCBjbG9jayB0aWNrcyBzcGVudCBpbgorIyAgIHBhcnRpY3VsYXIgb3Blbm1wIHJlZ2lvbnMgYXJlIHJlY29yZGVkLgorc2V0KHN0YXRzICAgICAgICAgICBmYWxzZSAgICAgICAgIENBQ0hFIEJPT0wgICAiU3RhdHMtR2F0aGVyaW5nIGZ1bmN0aW9uYWxpdHk/IiAgICAgICAgICAgICAgICAgICAgICAgICApCisKKyMgVXNlciBzcGVjaWZpZWQgZmxhZ3MuICBUaGVzZSBhcmUgYXBwZW5kZWQgdG8gdGhlIHByZWRldGVybWluZWQgZmxhZ3MgZm91bmQgaW4gQ29tbW9uRmxhZ3MuY21ha2UgYW5kICR7Q01BS0VfQ19DT01QSUxFUl9JRH0vKkZsYWdzLmNtYWtlIChpLmUuLCBHTlUvQ0ZsYWdzLmNtYWtlKQorc2V0KFVTRVJfQ19GTEFHUyAgICAgICIiIENBQ0hFIFNUUklORyAiQXBwZW5kZWQgdXNlciBzcGVjaWZpZWQgQyBjb21waWxlciBmbGFncy4iICAgICAgICAgICAgICkKK3NldChVU0VSX0NYWF9GTEFHUyAgICAiIiBDQUNIRSBTVFJJTkcgIkFwcGVuZGVkIHVzZXIgc3BlY2lmaWVkIEMrKyBjb21waWxlciBmbGFncy4iICAgICAgICAgICApCitzZXQoVVNFUl9DUFBfRkxBR1MgICAgIiIgQ0FDSEUgU1RSSU5HICJBcHBlbmRlZCB1c2VyIHNwZWNpZmllZCBDIHByZXByb2Nlc3NvciBmbGFncy4iICAgICAgICAgKQorc2V0KFVTRVJfQVNNX0ZMQUdTICAgICIiIENBQ0hFIFNUUklORyAiQXBwZW5kZWQgdXNlciBzcGVjaWZpZWQgYXNzZW1ibGVyIGZsYWdzLiIgICAgICAgICAgICAgICkKK3NldChVU0VSX0xEX0ZMQUdTICAgICAiIiBDQUNIRSBTVFJJTkcgIkFwcGVuZGVkIHVzZXIgc3BlY2lmaWVkIGxpbmtlciBmbGFncy4iICAgICAgICAgICAgICAgICApCitzZXQoVVNFUl9MRF9MSUJfRkxBR1MgIiIgQ0FDSEUgU1RSSU5HICJBcHBlbmRlZCB1c2VyIHNwZWNpZmllZCBsaW5rZWQgbGlicyBmbGFncy4gKGkuZS4sIC1sbSkiKQorc2V0KFVTRVJfRl9GTEFHUyAgICAgICIiIENBQ0hFIFNUUklORyAiQXBwZW5kZWQgdXNlciBzcGVjaWZpZWQgRm9ydHJhbiBjb21waWxlciBmbGFncy4gIFRoZXNlIGFyZSBvbmx5IHVzZWQgaWYgY3JlYXRlX2ZvcnRyYW5fbW9kdWxlcz09dHJ1ZS4iICAgICAgICkKKworIyAtIEFsbG93IHRocmVlIGJ1aWxkIHR5cGVzOiBSZWxlYXNlLCBEZWJ1ZywgUmVsV2l0aERlYkluZm8gKHRoZXNlIHJlbGF0ZSB0byBidWlsZC5wbCdzIHJlbGVhc2UsIGRlYnVnLCBhbmQgZGlhZyBzZXR0aW5ncyByZXNwZWN0aXZlbHkpCisjIC0gZGVmYXVsdCBpcyBSZWxlYXNlICh3aGVuIENNQUtFX0JVSUxEX1RZUEUgaXMgbm90IGRlZmluZWQpCisjIC0gQ01BS0VfQlVJTERfVFlQRSBhZmZlY3RzIHRoZSAtTyBhbmQgLWcgZmxhZ3MgKENNYWtlIG1hZ2ljYWxseSBpbmNsdWRlcyBjb3JyZWN0IHZlcnNpb24gb2YgdGhlbSBvbiBwZXIgY29tcGlsZXIgYmFzaXMpCisjIC0gdHlwaWNhbDogUmVsZWFzZSA9IC1PMyAtRE5ERUJVRworIyAgICAgICAgICAgIFJlbFdpdGhEZWJJbmZvID0gLU8yIC1nIC1ETkRFQlVHCisjICAgICAgICAgICAgRGVidWcgPSAtZworaWYoQ01BS0VfQlVJTERfVFlQRSkKKyAgICAjIENNQUtFX0JVSUxEX1RZUEUgd2FzIGRlZmluZWQsIGNoZWNrIGZvciB2YWxpZGl0eSAKKyAgICBzdHJpbmcoVE9MT1dFUiAiJHtDTUFLRV9CVUlMRF9UWVBFfSIgY21ha2VfYnVpbGRfdHlwZV9sb3dlcmNhc2UpCisgICAgY2hlY2tfdmFyaWFibGUoY21ha2VfYnVpbGRfdHlwZV9sb3dlcmNhc2UgICIke2J1aWxkX3R5cGVfcG9zc2libGVfdmFsdWVzfSIpCitlbHNlKCkKKyAgICAjIENNQUtFX0JVSUxEX1RZUEUgd2FzIG5vdCBkZWZpbmVkLCBzZXQgZGVmYXVsdCB0byBSZWxlYXNlCisgICAgdW5zZXQoQ01BS0VfQlVJTERfVFlQRSBDQUNIRSkKKyAgICBzZXQoQ01BS0VfQlVJTERfVFlQRSBSZWxlYXNlIENBQ0hFIFNUUklORyAiQ2hvb3NlIHRoZSB0eXBlIG9mIGJ1aWxkLCBvcHRpb25zIGFyZTogUmVsZWFzZS9EZWJ1Zy9SZWxXaXRoRGViSW5mbyIpCisgICAgc3RyaW5nKFRPTE9XRVIgIiR7Q01BS0VfQlVJTERfVFlQRX0iIGNtYWtlX2J1aWxkX3R5cGVfbG93ZXJjYXNlKQorICAgIGNoZWNrX3ZhcmlhYmxlKGNtYWtlX2J1aWxkX3R5cGVfbG93ZXJjYXNlICAiJHtidWlsZF90eXBlX3Bvc3NpYmxlX3ZhbHVlc30iKQorZW5kaWYoKQorCisjIENoZWNrIHZhbGlkIHZhbHVlcworY2hlY2tfdmFyaWFibGUob3MgICAgICAgICAgIiR7b3NfcG9zc2libGVfdmFsdWVzfSIgICAgICAgICApCitjaGVja192YXJpYWJsZShhcmNoICAgICAgICAiJHthcmNoX3Bvc3NpYmxlX3ZhbHVlc30iICAgICAgICkKK2NoZWNrX3ZhcmlhYmxlKG9tcF92ZXJzaW9uICIke29tcF92ZXJzaW9uX3Bvc3NpYmxlX3ZhbHVlc30iKQorY2hlY2tfdmFyaWFibGUobGliX3R5cGUgICAgIiR7bGliX3R5cGVfcG9zc2libGVfdmFsdWVzfSIgICApCitpZigiJHtvc30iIFNUUkVRVUFMICJtaWMiKQorICAgIGNoZWNrX3ZhcmlhYmxlKG1pY19hcmNoICIke21pY19hcmNoX3Bvc3NpYmxlX3ZhbHVlc30iICApCisgICAgY2hlY2tfdmFyaWFibGUobWljX29zICAgIiR7bWljX29zX3Bvc3NpYmxlX3ZhbHVlc30iICAgICkKK2VuZGlmKCkKKyMgR2V0IHRoZSBidWlsZCBudW1iZXIgZnJvbSBrbXBfdmVyc2lvbi5jCitnZXRfYnVpbGRfbnVtYmVyKCIke0xJQk9NUF9XT1JLfSIgYnVpbGRfbnVtYmVyKQorCisjIEdldHRpbmcgdGltZSBhbmQgZGF0ZSAKKyMgQXMgb2Ygbm93LCBubyB0aW1lc3RhbXAgd2lsbCBiZSBjcmVhdGVkLgorc2V0KGRhdGUgIk5vIFRpbWVzdGFtcCIpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFNldCBzb21lIHVzZWZ1bCBmbGFncyB2YXJpYWJsZXMgZm9yIG90aGVyIHBhcnRzIG9mIGNtYWtlIHRvIHVzZQorIyBPcGVyYXRpbmcgU3lzdGVtCitzZXQoTElOVVggRkFMU0UpCitzZXQoTUFDIEZBTFNFKQorc2V0KFdJTkRPV1MgRkFMU0UpCitzZXQoTUlDIEZBTFNFKQorc2V0KEZSRUVCU0QgRkFMU0UpCitpZigiJHtvc30iIFNUUkVRVUFMICJsaW4iKQorICAgIHNldChMSU5VWCBUUlVFKQorICAgIHNldChyZWFsX29zIGxpbikKK2Vsc2VpZigiJHtvc30iIFNUUkVRVUFMICJtYWMiKQorICAgIHNldChNQUMgVFJVRSkKKyAgICBzZXQocmVhbF9vcyBtYWMpCitlbHNlaWYoIiR7b3N9IiBTVFJFUVVBTCAid2luIikKKyAgICBzZXQoV0lORE9XUyBUUlVFKQorICAgIHNldChyZWFsX29zIHdpbikKK2Vsc2VpZigiJHtvc30iIFNUUkVRVUFMICJtaWMiKQorICAgIHNldChNSUMgVFJVRSkKKyAgICBzZXQocmVhbF9vcyBscmIpCitlbmRpZigpCitpZigiJHtDTUFLRV9TWVNURU1fTkFNRX0iIFNUUkVRVUFMICJGcmVlQlNEIikKKyAgICBzZXQoRlJFRUJTRCBUUlVFKQorZW5kaWYoKQorCisjIEFyY2hpdGVjdHVyZQorc2V0KElBMzIgRkFMU0UpCitzZXQoSU5URUw2NCBGQUxTRSkKK3NldChBUk0gRkFMU0UpCitzZXQoUFBDNjQgRkFMU0UpCitpZigiJHthcmNofSIgU1RSRVFVQUwgIjMyIikgICAgICAjIElBLTMyIGFyY2hpdGVjdHVyZQorICAgIHNldChJQTMyIFRSVUUpCitlbHNlaWYoIiR7YXJjaH0iIFNUUkVRVUFMICIzMmUiKSAjIEludGVsKFIpIDY0IGFyY2hpdGVjdHVyZQorICAgIHNldChJTlRFTDY0IFRSVUUpCitlbHNlaWYoIiR7YXJjaH0iIFNUUkVRVUFMICJhcm0iKSAjIEFSTSBhcmNoaXRlY3R1cmUKKyAgICBzZXQoQVJNIFRSVUUpCitlbHNlaWYoIiR7YXJjaH0iIFNUUkVRVUFMICJwcGM2NCIpICMgUFBDNjQgYXJjaGl0ZWN0dXJlCisgICAgc2V0KFBQQzY0IFRSVUUpCitlbmRpZigpCisKKyMgU2V0IHNvbWUgZmxhZ3MgYmFzZWQgb24gYnVpbGRfdHlwZQorIyBjbWFrZV9idWlsZF90eXBlX2xvd2VyY2FzZSBpcyBiYXNlZCBvZmYgb2YgQ01BS0VfQlVJTERfVFlQRSwganVzdCBwdXQgaW4gbG93ZXJjYXNlLgorc2V0KFJFTEVBU0VfQlVJTEQgICAgICAgIEZBTFNFKQorc2V0KERFQlVHX0JVSUxEICAgICAgICAgIEZBTFNFKQorc2V0KFJFTFdJVEhERUJJTkZPX0JVSUxEIEZBTFNFKQoraWYoIiR7Y21ha2VfYnVpbGRfdHlwZV9sb3dlcmNhc2V9IiBTVFJFUVVBTCAicmVsZWFzZSIpCisgICAgc2V0KFJFTEVBU0VfQlVJTEQgVFJVRSkKK2Vsc2VpZigiJHtjbWFrZV9idWlsZF90eXBlX2xvd2VyY2FzZX0iIFNUUkVRVUFMICJkZWJ1ZyIpCisgICAgc2V0KERFQlVHX0JVSUxEIFRSVUUpCitlbHNlaWYoIiR7Y21ha2VfYnVpbGRfdHlwZV9sb3dlcmNhc2V9IiBTVFJFUVVBTCAicmVsd2l0aGRlYmluZm8iKQorICAgIHNldChSRUxXSVRIREVCSU5GT19CVUlMRCBUUlVFKQorZW5kaWYoKQorCisjIFN0YXRzLWdhdGhlcmluZyBvbiBvciBvZmY/CitzZXQoU1RBVFNfR0FUSEVSSU5HIEZBTFNFKQoraWYoIiR7c3RhdHN9IikgIyBzdHJpbmcgIm9uIiBvciAiT04iIGlzIHNlZW4gYXMgYm9vbGVhbiBUUlVFCisgICAgc2V0KFNUQVRTX0dBVEhFUklORyBUUlVFKQorZW5kaWYoKQorCisjIEluY2x1ZGUgaXR0IG5vdGlmeSBpbnRlcmZhY2U/IFJpZ2h0IG5vdywgYWx3YXlzLgorc2V0KFVTRV9JVFRfTk9USUZZIFRSVUUpCisKKyMgbm9ybWFsLCBwcm9maWxlLCBzdHVicyBsaWJyYXJ5Lgorc2V0KE5PUk1BTF9MSUJSQVJZIEZBTFNFKQorc2V0KFNUVUJTX0xJQlJBUlkgRkFMU0UpCitzZXQoUFJPRklMRV9MSUJSQVJZIEZBTFNFKQoraWYoIiR7bGliX3R5cGV9IiBTVFJFUVVBTCAibm9ybWFsIikKKyAgICBzZXQoTk9STUFMX0xJQlJBUlkgVFJVRSkKK2Vsc2VpZigiJHtsaWJfdHlwZX0iIFNUUkVRVUFMICJwcm9maWxlIikKKyAgICBzZXQoUFJPRklMRV9MSUJSQVJZIFRSVUUpCitlbHNlaWYoIiR7bGliX3R5cGV9IiBTVFJFUVVBTCAic3R1YnMiKQorICAgIHNldChTVFVCU19MSUJSQVJZIFRSVUUpCitlbmRpZigpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEZlYXR1cmVzIGZvciBjb21waWxhdGlvbiBhbmQgYnVpbGQgaW4gZ2VuZXJhbAorCisjIC0gRG9lcyB0aGUgY29tcGlsZXIgc3VwcG9ydCBhIDEyOC1iaXQgZmxvYXRpbmcgcG9pbnQgZGF0YSB0eXBlPyBEZWZhdWx0IGlzIGZhbHNlCisjIC0gSWYgYSBjb21waWxlciBkb2VzLCB0aGVuIGNoYW5nZSBpdCBpbiB0aGUgQ01ha2VDYWNoZS50eHQgZmlsZSAob3IgdXNpbmcgdGhlIGNtYWtlIEdVSSkKKyMgICBvciBzZW5kIHRvIGNtYWtlIC1EQ09NUElMRVJfU1VQUE9SVFNfUVVBRF9QUkVDSVNJT049dHJ1ZQorIyAtIElmIENPTVBJTEVSX1NVUFBPUlRTX1FVQURfUFJFQ0lTSU9OIGlzIHRydWUsIHRoZW4gYSBjb3JyZXNwb25kaW5nIENPTVBJTEVSX1FVQURfVFlQRSBtdXN0IGJlIGdpdmVuCisjICAgVGhpcyBpcyB0aGUgY29tcGlsZXIncyBxdWFkLXByZWNpc2lvbiBkYXRhIHR5cGUuCisjICoqIFRPRE86IFRoaXMgaXNuJ3QgY29tcGxldGUgeWV0LiBGaW5pc2ggaXQuIFJlcXVpcmVzIGNoYW5naW5nIG1hY3JvcyBpbiBrbXBfb3MuaCAqKgorc2V0KENPTVBJTEVSX1NVUFBPUlRTX1FVQURfUFJFQ0lTSU9OIGZhbHNlIENBQ0hFIEJPT0wgICAiKklOQ09NUExFVEUqIERvZXMgdGhlIGNvbXBpbGVyIHN1cHBvcnQgYSAxMjgtYml0IGZsb2F0aW5nIHBvaW50IHR5cGU/IikKK3NldChDT01QSUxFUl9RVUFEX1RZUEUgICAgICAgICAgICAgICAiIiAgICBDQUNIRSBTVFJJTkcgIipJTkNPTVBMRVRFKiBUaGUgcXVhZCBwcmVjaXNpb24gZGF0YSB0eXBlIChpLmUuLCBmb3IgZ2NjLCBfX2Zsb2F0MTI4KSIpCisKKyMgLSBTaG91bGQgdGhlIG9yaWduYWwgYnVpbGQgcnVsZXMgZm9yIGJ1aWxkcyBiZSB1c2VkPyAoY21ha2UvT3JpZ2luYWxCdWlsZFJ1bGVzLmNtYWtlKS4gIFRoaXMgc2V0dGluZyBpcyBvZmYgYnkgZGVmYXVsdC4KKyMgLSBUaGlzIGFsd2F5cyBjb21waWxlcyB3aXRoIC1nLiAgQW5kIGlmIGl0IGlzIGEgcmVsZWFzZSBidWlsZCwgdGhlIGRlYnVnIGluZm8gaXMgc3RyaXBwZWQgb3V0IHZpYSBvYmpjb3B5IGFuZCBwdXQgaW50byBsaWJpb21wNS5kYmcuCitzZXQoVVNFX0JVSUxEUExfUlVMRVMgZmFsc2UgQ0FDSEUgQk9PTCAiU2hvdWxkIHRoZSBidWlsZCBmb2xsb3cgYnVpbGQucGwgcnVsZXMvcmVjaXBlcz8iKQorCisjIC0gU2hvdWxkIHRoZSBidWlsZCB1c2UgdGhlIHByZWRlZmluZWQgbGlua2VyIGZsYWdzIChPUy1kZXBlbmRlbnQpIGluIENvbW1vbkZsYWdzLmNtYWtlPworIyAtIHRoZXNlIHByZWRlZmluZWQgbGlua2VyIGZsYWdzIHNob3VsZCB3b3JrIGZvciBXaW5kb3dzLCBNYWMsIGFuZCBUcnVlIExpbnV4IGZvciB0aGUgbW9zdCBwb3B1bGFyIGNvbXBpbGVycy9saW5rZXJzCitzZXQoVVNFX1BSRURFRklORURfTElOS0VSX0ZMQUdTIHRydWUgQ0FDSEUgQk9PTCAiU2hvdWxkIHRoZSBidWlsZCB1c2UgdGhlIHByZWRlZmluZWQgbGlua2VyIGZsYWdzIGluIENvbW1vbkZsYWdzLmNtYWtlPyIpCisKKyMgLSBUU1ggYmFzZWQgbG9ja3MgaGF2ZSBfX2FzbSBjb2RlIHdoaWNoIGNhbiBiZSB0cm91Ymxlc29tZSBmb3Igc29tZSBjb21waWxlcnMuICBUaGlzIGZlYXR1cmUgaXMgYWxzbyB4ODYgc3BlY2lmaWMuCitpZih7JHtJQTMyfSBPUiAke0lOVEVMNjR9KQorICAgIHNldChVU0VfQURBUFRJVkVfTE9DS1MgdHJ1ZSBDQUNIRSBCT09MICJTaG91bGQgVFNYLWJhc2VkIGxvY2sgYmUgY29tcGlsZWQgKGFkYXB0aXZlIGxvY2sgaW4ga21wX2xvY2suY3BwKS4gIFRoZXNlIGFyZSB4ODYgc3BlY2lmaWMuIikKK2Vsc2UoKQorICAgIHNldChVU0VfQURBUFRJVkVfTE9DS1MgZmFsc2UgQ0FDSEUgQk9PTCAiU2hvdWxkIFRTWC1iYXNlZCBsb2NrIGJlIGNvbXBpbGVkIChhZGFwdGl2ZSBsb2NrIGluIGttcF9sb2NrLmNwcCkuICBUaGVzZSBhcmUgeDg2IHNwZWNpZmljLiIpCitlbmRpZigpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgRXJyb3IgY2hlY2tpbmcgdGhlIGNvbmZpZ3VyYXRpb24gCitpZigke1NUQVRTX0dBVEhFUklOR30gQU5EICgke1dJTkRPV1N9IE9SICR7TUFDfSkpCisgICAgZXJyb3Jfc2F5KCJTdGF0cy1nYXRoZXJpbmcgZnVuY3Rpb25hbGl0eSBpcyBvbmx5IHN1cHBvcnRlZCBvbiB4ODYtTGludXggYW5kIEludGVsKFIpIE1JQyBBcmNoaXRlY3R1cmUiKQorZW5kaWYoKQoraWYoJHtTVEFUU19HQVRIRVJJTkd9IEFORCBOT1QgKCR7SUEzMn0gT1IgJHtJTlRFTDY0fSkpCisgICAgZXJyb3Jfc2F5KCJTdGF0cy1nYXRoZXJpbmcgZnVuY3Rpb25hbGl0eSBpcyBvbmx5IHN1cHBvcnRlZCBvbiB4ODYtTGludXggYW5kIEludGVsKFIpIE1JQyBBcmNoaXRlY3R1cmUiKQorZW5kaWYoKQoraWYoJHtVU0VfQURBUFRJVkVfTE9DS1N9IEFORCBOT1QoJHtJQTMyfSBPUiAke0lOVEVMNjR9KSkKKyAgICBlcnJvcl9zYXkoIkFkYXB0aXZlIGxvY2tzIChUU1gpIGZ1bmN0aW9uYWxpdHkgaXMgb25seSBzdXBwb3J0ZWQgb24geDg2IEFyY2hpdGVjdHVyZSIpCitlbmRpZigpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIC0gQ3JlYXRlIHRoZSBzdWZmaXggZm9yIHRoZSBleHBvcnQgZGlyZWN0b3J5CisjIC0gT25seSBhZGQgdG8gc3VmZml4IHdoZW4gbm90IGEgZGVmYXVsdCB2YWx1ZQorIyAtIEV4YW1wbGUgc3VmZml4OiAuZGViLjMwLnMxIAorIyAgIGZpbmFsIGV4cG9ydCBkaXJlY3Rvcnk6IGV4cG9ydHMvbGluXzMyZS5kZWIuMzAuczEvbGliCisjIC0gVGhlc2Ugc3VmZml4ZXMgaW1wbHkgdGhlIGJ1aWxkIGlzIGEgRGVidWcsIE9wZW5NUCAzLjAsIFN0YXRzLUdhdGhlcmluZyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5CitpZihOT1QgIiR7Y21ha2VfYnVpbGRfdHlwZV9sb3dlcmNhc2V9IiBTVFJFUVVBTCAicmVsZWFzZSIpCisgICAgc3RyaW5nKFNVQlNUUklORyAiJHtjbWFrZV9idWlsZF90eXBlX2xvd2VyY2FzZX0iIDAgMyBidWlsZF90eXBlX3N1ZmZpeCkKKyAgICBzZXQoc3VmZml4ICIke3N1ZmZpeH0uJHtidWlsZF90eXBlX3N1ZmZpeH0iKQorZW5kaWYoKQoraWYoTk9UICIke29tcF92ZXJzaW9ufSIgU1RSRVFVQUwgIjQwIikKKyAgICBzZXQoc3VmZml4ICIke3N1ZmZpeH0uJHtvbXBfdmVyc2lvbn0iKQorZW5kaWYoKQoraWYoJHtTVEFUU19HQVRIRVJJTkd9KQorICAgIHNldChzdWZmaXggIiR7c3VmZml4fS5zMSIpCitlbmRpZigpCitpZigke01JQ30pCisgICAgaWYoTk9UICIke21pY19hcmNofSIgU1RSRVFVQUwgImtuZiIpCisgICAgICAgIHNldChzdWZmaXggIiR7c3VmZml4fS4ke21pY19hcmNofSIpCisgICAgZW5kaWYoKQorICAgIGlmKE5PVCAiJHttaWNfb3N9IiBTVFJFUVVBTCAiYnNkIikKKyAgICAgICAgc2V0KHN1ZmZpeCAiJHtzdWZmaXh9LiR7bWljX29zfSIpCisgICAgZW5kaWYoKQorZW5kaWYoKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgU2V0dGluZyBmaWxlIGV4dGVuc2lvbnMgLyBzdWZmaXhlcworc2V0KG9iaiAke0NNQUtFX0NfT1VUUFVUX0VYVEVOU0lPTn0gICApCitzZXQobGliICR7Q01BS0VfU1RBVElDX0xJQlJBUllfU1VGRklYfSkKK3NldChkbGwgJHtDTUFLRV9TSEFSRURfTElCUkFSWV9TVUZGSVh9KQorc2V0KGV4ZSAke0NNQUtFX0VYRUNVVEFCTEVfU1VGRklYfSAgICApCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgRmluZCBwZXJsIGV4ZWN1dGFibGUKKyMgUGVybCBpcyB1c2VkIHRvIGNyZWF0ZSBvbXAuaCAoYW5kIG90aGVyIGhlYWRlcnMpIGFsb25nIHdpdGgga21wX2kxOG5faWQuaW5jIGFuZCBrbXBfaTE4bl9kZWZhdWx0LmluYyAoc2VlIGJlbG93IGluIFJ1bGVzIHNlY3Rpb24pCitpZihOT1QgIiR7UEVSTF9GT1VORH0iKSAjIHZhcmlhYmxlIGlzIGRlZmluZWQgaW4gRmluZFBlcmwgU3RhbmRhcmQgQ01ha2UgTW9kdWxlCisgICAgZXJyb3Jfc2F5KCJFcnJvcjogQ291bGQgbm90IGZpbmQgdmFsaWQgcGVybCIpCitlbmRpZigpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgU2V0dGluZyBkaXJlY3RvcnkgbmFtZXMKK3NldChwbGF0Zm9ybSAgICAgICAiJHtyZWFsX29zfV8ke2FyY2h9IiAgICAgICAgICAgICAgICApICMgaS5lLiwgbGluXzMyZSwgbWFjXzMyCitzZXQoYnVpbGRfZGlyICAgICAgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSIgICAgICAgKSAjIGJ1aWxkIGRpcmVjdG9yeSAoV2hlcmUgQ01ha2VDYWNoZS50eHQgaXMgY3JlYXRlZCwgYnVpbGQgZmlsZXMgZ2VuZXJhdGVkKQorc2V0KHNyY19kaXIgICAgICAgICIke0xJQk9NUF9XT1JLfS9zcmMiICAgICAgICAgICAgICAgICkKK3NldCh0b29sc19kaXIgICAgICAiJHtMSUJPTVBfV09SS30vdG9vbHMiICAgICAgICAgICAgICApIAorc2V0KGV4cG9ydF9kaXIgICAgICIke0xJQk9NUF9XT1JLfS9leHBvcnRzIiAgICAgICAgICAgICkgCitzZXQoZXhwb3J0X2Ntbl9kaXIgIiR7ZXhwb3J0X2Rpcn0vY29tbW9uJHtzdWZmaXh9IiAgICAgKSAKK3NldChleHBvcnRfcHRmX2RpciAiJHtleHBvcnRfZGlyfS8ke3BsYXRmb3JtfSR7c3VmZml4fSIpCitfZXhwb3J0X2xpYl9kaXIoJHtwbGF0Zm9ybX0gZXhwb3J0X2xpYl9kaXIpICAjIHNldCBleHBvcnRzIGRpcmVjdG9yeSAocmVsYXRpdmUgdG8gYnVpbGRfZGlyKSBpLmUuLCAuLi9leHBvcnRzL2xpbl8zMmUvbGliLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvciBpLmUuLCAuLi9leHBvcnRzL21hY18zMmUvbGliLnRoaW4vIGZvciBtYWMKK2lmKCR7TUFDfSkKKyAgICAjIG1hY3MgdXNlIGxpYi50aGluLyBzdWJkaXJlY3RvcnkgZm9yIG5vbi1mYXQgbGlicmFyaWVzIHRoYXQgb25seSBjb250YWluIG9uZSBhcmNoaXRlY3R1cmUKKyAgICAjIG1hY3MgdXNlIGxpYi8gc3ViZGlyZWN0b3J5IGZvciBmYXQgbGlicmFyaWVzIHRoYXQgY29udGFpbiBib3RoIElBLTMyIGFyY2hpdGVjdHVyZSBhbmQgSW50ZWwoUikgNjQgYXJjaGl0ZWN0dXJlIGNvZGUuCisgICAgX2V4cG9ydF9saWJfZmF0X2Rpcigke3BsYXRmb3JtfSBleHBvcnRfbGliX2ZhdF9kaXIpCitlbmRpZigpCitzZXQoaW5jX2RpciAgICAgICAgIiR7TElCT01QX1dPUkt9L3NyYy9pbmNsdWRlLyR7b21wX3ZlcnNpb259IikKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBTZXR0aW5nIGZpbmFsIGxpYnJhcnkgbmFtZQorc2V0KGxpYl9pdGVtICJsaWJpb21wIikKK2lmKCR7UFJPRklMRV9MSUJSQVJZfSkKKyAgICBzZXQobGliX2l0ZW0gIiR7bGliX2l0ZW19cHJvZiIpCitlbmRpZigpCitpZigke1NUVUJTX0xJQlJBUll9KQorICAgIHNldChsaWJfaXRlbSAiJHtsaWJfaXRlbX1zdHVicyIpCitlbmRpZigpCitzZXQobGliX2l0ZW0gIiR7bGliX2l0ZW19JHt2ZXJzaW9ufSIpCitpZigke1dJTkRPV1N9KQorICAgIHNldChsaWJfaXRlbSAiJHtsaWJfaXRlbX1tZCIpCitlbmRpZigpCitzZXQobGliX2V4dCAiJHtkbGx9IikKKyMgJHtsaWJfZmlsZX0gaXMgcmVhbCBsaWJyYXJ5IG5hbWU6CisjIGxpYmlvbXA1LnNvICAgIGZvciBMaW51eAorIyBsaWJpb21wNS5keWxpYiBmb3IgTWFjCisjIGxpYmlvbXA1bWQuZGxsIGZvciBXaW5kb3dzCitzZXQobGliX2ZpbGUgIiR7bGliX2l0ZW19JHtsaWJfZXh0fSIpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgU2V0dGluZyBleHBvcnQgZmlsZSBuYW1lcyAoZnVsbCBwYXRocykKK2lmKCR7V0lORE9XU30pCisgICAgc2V0KGltcF9maWxlICIke2xpYl9pdGVtfSR7bGlifSIpICMgdGhpcyBpcyBleHBvcnRlZCAobGliaW9tcDVtZC5saWIpCisgICAgc2V0KGRlZl9maWxlICIke2xpYl9pdGVtfS5kZWYiKSAjIHRoaXMgaXMgbm90IGV4cG9ydGVkCisgICAgc2V0KHJjX2ZpbGUgICIke2xpYl9pdGVtfS5yYyIpICAjIHRoaXMgaXMgbm90IGV4cG9ydGVkCisgICAgaWYoIiR7Q01BS0VfQlVJTERfVFlQRX0iIFNUUkVRVUFMICJEZWJ1ZyIgT1IgIiR7Q01BS0VfQlVJTERfVFlQRX0iIFNUUkVRVUFMICJSZWxXaXRoRGViSW5mbyIgT1IgJHtVU0VfQlVJTERQTF9SVUxFU30pCisgICAgICAgIHNldChwZGJfZmlsZSAiJHtsaWJfZmlsZX0ucGRiIikgIyB0aGlzIGlzIGV4cG9ydGVkIGlmIGl0IGV4aXN0cyAobGliaW9tcDVtZC5kbGwucGRiKQorICAgIGVuZGlmKCkKK2VuZGlmKCkKK3NldChleHBvcnRfbGliX2ZpbGVzICAiJHtsaWJfZmlsZX0iICIke2ltcF9maWxlfSIgIiR7cGRiX2ZpbGV9IikgCitzZXQoZXhwb3J0X2luY19maWxlcyAgImlvbXBfbGliLmgiKQorc2V0KGV4cG9ydF9tb2RfZmlsZXMgICJvbXBfbGliLm1vZCIgIm9tcF9saWJfa2luZHMubW9kIikKK3NldChleHBvcnRfY21uX2ZpbGVzMSAib21wLmgiICJvbXBfbGliLmgiICJvbXBfbGliLmYiICJvbXBfbGliLmY5MCIpCitzZXQoZXhwb3J0X2Ntbl9maWxlczIgImlvbXAuaCIpCithZGRfcHJlZml4KCIke2V4cG9ydF9saWJfZGlyfS8iICAgICAgICAgICAgICAgIGV4cG9ydF9saWJfZmlsZXMpCithZGRfcHJlZml4KCIke2V4cG9ydF9wdGZfZGlyfS9pbmNsdWRlX2NvbXBhdC8iIGV4cG9ydF9pbmNfZmlsZXMpCithZGRfcHJlZml4KCIke2V4cG9ydF9wdGZfZGlyfS9pbmNsdWRlLyIgICAgICAgIGV4cG9ydF9tb2RfZmlsZXMpCithZGRfcHJlZml4KCIke2V4cG9ydF9jbW5fZGlyfS9pbmNsdWRlLyIgICAgICAgIGV4cG9ydF9jbW5fZmlsZXMxKQorYWRkX3ByZWZpeCgiJHtleHBvcnRfY21uX2Rpcn0vaW5jbHVkZV9jb21wYXQvIiBleHBvcnRfY21uX2ZpbGVzMikKK3NldChleHBvcnRfY21uX2ZpbGVzICIke2V4cG9ydF9jbW5fZmlsZXMxfSIgIiR7ZXhwb3J0X2Ntbl9maWxlczJ9IikKK2lmKCIke2V4cG9ydF9saWJfZmF0X2Rpcn0iKQorICAgIHNldChleHBvcnRfbGliX2ZhdF9maWxlcyAiJHtsaWJfZmlsZX0iICIke2ltcF9maWxlfSIpCisgICAgYWRkX3ByZWZpeCgiJHtleHBvcnRfbGliX2ZhdF9kaXJ9LyIgZXhwb3J0X2xpYl9mYXRfZmlsZXMpCitlbmRpZigpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgR2V0dGluZyBsZWdhbCB0eXBlL2FyY2gKK3NldF9sZWdhbF90eXBlKGxlZ2FsX3R5cGUpCitzZXRfbGVnYWxfYXJjaChsZWdhbF9hcmNoKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFByZXByb2Nlc3NvciBEZWZpbml0aW9ucyAoY21ha2UvRGVmaW5pdGlvbnMuY21ha2UpCisjIFByZXByb2Nlc3NvciBJbmNsdWRlcyAKKyMgQ29tcGlsZXIgKEMvQysrKSBGbGFncyAoY21ha2UvQ29tbW9uRmxhZ3MuY21ha2UpCisjIEFzc2VtYmxlciBGbGFncyAoY21ha2UvQ29tbW9uRmxhZ3MuY21ha2UpCisjIEZvcnRyYW4gICBGbGFncyAoY21ha2UvQ29tbW9uRmxhZ3MuY21ha2UpCisjIExpbmtlciAgICBGbGFncyAoY21ha2UvQ29tbW9uRmxhZ3MuY21ha2UpCisjIEFyY2hpdmVyICBGbGFncyAoY21ha2UvQ29tbW9uRmxhZ3MuY21ha2UpCisjIEhlbHBlciBQZXJsIFNjcmlwdCBGbGFncyAoY21ha2UvUGVybEZsYWdzLmNtYWtlKQorIyAqIEluc2lkZSB0aGUgY21ha2UvQ29tbW9uRmxhZ3MuY21ha2UgZmlsZSwgdGhlIFVTRVJfKl9GTEFHUyBhcmUgYWRkZWQuCisjICogQ2Fubm90IHVzZSBDTUFLRV8qX0ZMQUdTIGRpcmVjdGx5IGJlY2F1c2UgLXggYysrIGlzIHB1dCBpbiB0aGUgbGlua2VyIGNvbW1hbmQgYW5kIG1hbmdsZXMgdGhlIGxpbmtpbmcgcGhhc2UuCisKKyMgcHJlcHJvY2Vzc29yIGZsYWdzICgtRCBkZWZpbml0aW9ucyBhbmQgLUkgaW5jbHVkZXMpCisjIEdyYWIgZW52aXJvbm1lbnQgdmFyaWFibGUgQ1BQRkxBR1MgYW5kIGFwcGVuZCB0aG9zZSB0byBkZWZpbml0aW9ucworc2V0KGluY2x1ZGVfZGlycyAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0gJHtzcmNfZGlyfSAke3NyY19kaXJ9L2kxOG4gJHtpbmNfZGlyfSAke3NyY19kaXJ9L3RoaXJkcGFydHkvaXR0bm90aWZ5KQoraW5jbHVkZV9kaXJlY3Rvcmllcygke2luY2x1ZGVfZGlyc30pCisKKyMgR3JhYiBhc3NlbWJsZXItZGVwZW5kZW50IGZsYWdzCisjIENNYWtlIHdpbGwgbG9vayBmb3IgY21ha2UvJHtDTUFLRV9BU01fQ09NUElMRVJfSUR9L0FzbUZsYWdzLmNtYWtlIHRvIGFwcGVuZCBhZGRpdGlvbmFsIGFzc2VtYmxlciBmbGFncy4KK2lmKCR7V0lORE9XU30pCisgICAgIyBXaW5kb3dzIGJhc2VkIHN5c3RlbXMgdXNlIENNQUtFX0FTTV9NQVNNX0NPTVBJTEVSCisgICAgIyBUaGUgd2luZG93cyBhc3NlbWJseSBmaWxlcyBhcmUgaW4gTUFTTSBmb3JtYXQsIGFuZCB0aGV5IHJlcXVpcmUgYSB0b29sIHRoYXQgY2FuIGhhbmRsZSBNQVNNIHN5bnRheCAobWwuZXhlIG9yIG1sNjQuZXhlIHR5cGljYWxseSkKKyAgICBlbmFibGVfbGFuZ3VhZ2UoQVNNX01BU00pIAorICAgIHNldChDTUFLRV9NT0RVTEVfUEFUSCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY21ha2UvJHtDTUFLRV9BU01fTUFTTV9DT01QSUxFUl9JRH0gJHtDTUFLRV9NT0RVTEVfUEFUSH0pCisgICAgZmluZF9maWxlKGFzc2VtYmxlcl9zcGVjaWZpY19pbmNsdWRlX2ZpbGVfZm91bmQgQXNtRmxhZ3MuY21ha2UgJHtDTUFLRV9NT0RVTEVfUEFUSH0pCisgICAgaWYoYXNzZW1ibGVyX3NwZWNpZmljX2luY2x1ZGVfZmlsZV9mb3VuZCkKKyAgICAgICAgaW5jbHVkZShBc21GbGFncykKKyAgICAgICAgYXBwZW5kX2Fzc2VtYmxlcl9zcGVjaWZpY19hc21fZmxhZ3MoQVNNX0ZMQUdTKQorICAgIGVsc2UoKQorICAgICAgICB3YXJuaW5nX3NheSgiQ291bGQgbm90IGZpbmQgY21ha2UvJHtDTUFLRV9BU01fTUFTTV9DT01QSUxFUl9JRH0vQXNtRmxhZ3MuY21ha2U6IHdpbGwgb25seSB1c2UgZGVmYXVsdCBmbGFncyIpCisgICAgZW5kaWYoKQorZWxzZSgpCisgICAgIyBVbml4IChpbmNsdWRpbmcgTWFjKSBiYXNlZCBzeXN0ZW1zIHVzZSBDTUFLRV9BU01fQ09NUElMRVIKKyAgICAjIFVuaXggYXNzZW1ibHkgZmlsZXMgY2FuIGJlIGhhbmRsZWQgYnkgY29tcGlsZXIgdXN1YWxseS4KKyAgICBlbmFibGVfbGFuZ3VhZ2UoQVNNKQorICAgIHNldChDTUFLRV9NT0RVTEVfUEFUSCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY21ha2UvJHtDTUFLRV9BU01fQ09NUElMRVJfSUR9ICR7Q01BS0VfTU9EVUxFX1BBVEh9KQorICAgIGZpbmRfZmlsZShhc3NlbWJsZXJfc3BlY2lmaWNfaW5jbHVkZV9maWxlX2ZvdW5kIEFzbUZsYWdzLmNtYWtlICR7Q01BS0VfTU9EVUxFX1BBVEh9KQorICAgIGlmKGFzc2VtYmxlcl9zcGVjaWZpY19pbmNsdWRlX2ZpbGVfZm91bmQpCisgICAgICAgIGluY2x1ZGUoQXNtRmxhZ3MpCisgICAgICAgIGFwcGVuZF9hc3NlbWJsZXJfc3BlY2lmaWNfYXNtX2ZsYWdzKEFTTV9GTEFHUykKKyAgICBlbHNlKCkKKyAgICAgICAgd2FybmluZ19zYXkoIkNvdWxkIG5vdCBmaW5kIGNtYWtlLyR7Q01BS0VfQVNNX0NPTVBJTEVSX0lEfS9Bc21GbGFncy5jbWFrZTogd2lsbCBvbmx5IHVzZSBkZWZhdWx0IGZsYWdzIikKKyAgICBlbmRpZigpCitlbmRpZigpCisjIEdyYWIgY29tcGlsZXItZGVwZW5kZW50IGZsYWdzCisjIENtYWtlIHdpbGwgbG9vayBmb3IgY21ha2UvJHtDTUFLRV9DX0NPTVBJTEVSX0lEfS9DRmxhZ3MuY21ha2UgdG8gYXBwZW5kIGFkZGl0aW9uYWwgYywgY3h4LCBhbmQgbGlua2VyIGZsYWdzLgorc2V0KENNQUtFX01PRFVMRV9QQVRIICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9jbWFrZS8ke0NNQUtFX0NfQ09NUElMRVJfSUR9ICR7Q01BS0VfTU9EVUxFX1BBVEh9KQorZmluZF9maWxlKGNvbXBpbGVyX3NwZWNpZmljX2luY2x1ZGVfZmlsZV9mb3VuZCBDRmxhZ3MuY21ha2UgJHtDTUFLRV9NT0RVTEVfUEFUSH0pCitpZihjb21waWxlcl9zcGVjaWZpY19pbmNsdWRlX2ZpbGVfZm91bmQpCisgICAgaW5jbHVkZShDRmxhZ3MpICMgQ09NUElMRVJfU1VQUE9SVFNfUVVBRF9QUkVDSVNJT04gY2hhbmdlZCBpbiBoZXJlCisgICAgYXBwZW5kX2NvbXBpbGVyX3NwZWNpZmljX2NfYW5kX2N4eF9mbGFncyhDX0ZMQUdTIENYWF9GTEFHUykKKyAgICBhcHBlbmRfY29tcGlsZXJfc3BlY2lmaWNfbGlua2VyX2ZsYWdzKExEX0ZMQUdTIExEX0xJQl9GTEFHUykKK2Vsc2UoKQorICAgIHdhcm5pbmdfc2F5KCJDb3VsZCBub3QgZmluZCBjbWFrZS8ke0NNQUtFX0NfQ09NUElMRVJfSUR9L0NGbGFncy5jbWFrZTogd2lsbCBvbmx5IHVzZSBkZWZhdWx0IGZsYWdzIikKK2VuZGlmKCkKKworIyBHcmFiIGFsbCB0aGUgY29tcGlsZXItaW5kZXBlbmRlbnQgZmxhZ3MKK2FwcGVuZF9jX2FuZF9jeHhfZmxhZ3NfY29tbW9uKENfRkxBR1MgQ1hYX0ZMQUdTKSAKK2FwcGVuZF9hc21fZmxhZ3NfY29tbW9uKEFTTV9GTEFHUykKK2FwcGVuZF9mb3J0X2ZsYWdzX2NvbW1vbihGX0ZMQUdTKQorYXBwZW5kX2xpbmtlcl9mbGFnc19jb21tb24oTERfRkxBR1MgTERfTElCX0ZMQUdTKQorYXBwZW5kX2FyY2hpdmVyX2ZsYWdzX2NvbW1vbihBUl9GTEFHUykKK2FwcGVuZF9jcHBfZmxhZ3MoREVGSU5JVElPTlNfRkxBR1MpCisKKyMgU2V0dXAgdGhlIGZsYWdzIGNvcnJlY3RseSBmb3IgY21ha2UgKGNvdmVydCB0byBzdHJpbmcpCisjIFByZXR0eSB0aGVtIHVwIChTVFJJUCBhbnkgYmVnaW5uaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlKQorbGlzdF90b19zdHJpbmcoIiR7REVGSU5JVElPTlNfRkxBR1N9IiBERUZJTklUSU9OU19GTEFHUykKK2xpc3RfdG9fc3RyaW5nKCIke0NfRkxBR1N9IiAgICAgICAgICAgQ19GTEFHUyAgICAgICAgICApCitsaXN0X3RvX3N0cmluZygiJHtDWFhfRkxBR1N9IiAgICAgICAgIENYWF9GTEFHUyAgICAgICAgKQorbGlzdF90b19zdHJpbmcoIiR7QVNNX0ZMQUdTfSIgICAgICAgICBBU01fRkxBR1MgICAgICAgICkKK2xpc3RfdG9fc3RyaW5nKCIke0xEX0ZMQUdTfSIgICAgICAgICAgTERfRkxBR1MgICAgICAgICApCitsaXN0X3RvX3N0cmluZygiJHtMRF9MSUJfRkxBR1N9IiAgICAgIExEX0xJQl9GTEFHUyAgICAgKQorbGlzdF90b19zdHJpbmcoIiR7QVJfRkxBR1N9IiAgICAgICAgICBBUl9GTEFHUyAgICAgICAgICkgIyBXaW5kb3dzIHNwZWNpZmljIGZvciBjcmVhdGluZyBpbXBvcnQgbGlicmFyeQorc3RyaW5nKFNUUklQICAgIiR7REVGSU5JVElPTlNfRkxBR1N9IiBERUZJTklUSU9OU19GTEFHUykKK3N0cmluZyhTVFJJUCAgICIke0NfRkxBR1N9IiAgICAgICAgICAgQ19GTEFHUyAgICAgICAgICApCitzdHJpbmcoU1RSSVAgICAiJHtDWFhfRkxBR1N9IiAgICAgICAgIENYWF9GTEFHUyAgICAgICAgKQorc3RyaW5nKFNUUklQICAgIiR7QVNNX0ZMQUdTfSIgICAgICAgICBBU01fRkxBR1MgICAgICAgICkKK3N0cmluZyhTVFJJUCAgICIke0xEX0ZMQUdTfSIgICAgICAgICAgTERfRkxBR1MgICAgICAgICApCitzdHJpbmcoU1RSSVAgICAiJHtMRF9MSUJfRkxBR1N9IiAgICAgIExEX0xJQl9GTEFHUyAgICAgKQorc3RyaW5nKFNUUklQICAgIiR7QVJfRkxBR1N9IiAgICAgICAgICBBUl9GTEFHUyAgICAgICAgICkgIyBXaW5kb3dzIHNwZWNpZmljIGZvciBjcmVhdGluZyBpbXBvcnQgbGlicmFyeQorCisjIEdyYWIgdGhlIFBlcmwgZmxhZ3MKK3NldF9ldl9mbGFncyhldl9mbGFncykgIyBleHBhbmQtdmFycy5wbCBmbGFncworc2V0X2dkX2ZsYWdzKGdkX2ZsYWdzKSAjIGdlbmVyYXRlLWRlZi5wbCBmbGFncyAoV2luZG93cyBvbmx5KQorc2V0KG9hX29wdHMgIi0tb3M9JHtyZWFsX29zfSIgIi0tYXJjaD0ke2FyY2h9IikgIyBzZW50IHRvIHRoZSBwZXJsIHNjcmlwdHMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEdldHRpbmcgY29ycmVjdCBzb3VyY2UgZmlsZXMgKGNtYWtlL1NvdXJjZUZpbGVzLmNtYWtlKQorc2V0X2NfZmlsZXMobGliX2NfaXRlbXMpCitzZXRfY3BwX2ZpbGVzKGxpYl9jeHhfaXRlbXMpCitzZXRfYXNtX2ZpbGVzKGxpYl9hc21faXRlbXMpCitzZXRfaW1wX2NfZmlsZXMoaW1wX2NfaXRlbXMpICMgV2luZG93cy1zcGVjaWZpYworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBTZXR0aW5nIGFsbCBzb3VyY2UgZmlsZSB2YXJpYWJsZXMKK3NldChsaWJfc3JjX2ZpbGVzICIke2xpYl9jX2l0ZW1zfSIgIiR7bGliX2N4eF9pdGVtc30iICIke2xpYl9hc21faXRlbXN9IikKK3NldChpbXBfc3JjX2ZpbGVzICIke2ltcF9jX2l0ZW1zfSIpCithZGRfcHJlZml4KCIke3NyY19kaXJ9LyIgbGliX3NyY19maWxlcykKK2FkZF9wcmVmaXgoIiR7c3JjX2Rpcn0vIiBpbXBfc3JjX2ZpbGVzKSAjIFdpbmRvd3Mtc3BlY2lmaWMKK2FkZF9wcmVmaXgoIiR7c3JjX2Rpcn0vIiBsaWJfY19pdGVtcyAgKQorYWRkX3ByZWZpeCgiJHtzcmNfZGlyfS8iIGxpYl9jeHhfaXRlbXMpCithZGRfcHJlZml4KCIke3NyY19kaXJ9LyIgbGliX2FzbV9pdGVtcykKK2FkZF9wcmVmaXgoIiR7c3JjX2Rpcn0vIiBpbXBfY19pdGVtcyAgKSAjIFdpbmRvd3Mtc3BlY2lmaWMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIERlYnVnIHByaW50IG91dHMuICBXaWxsIHByaW50ICJ2YXJpYWJsZSA9ICR7dmFyaWFibGV9IiBpZiBHTE9CQUxfREVCVUcgPT0gMQoraWYoR0xPQkFMX0RFQlVHKQorICAgIGluY2x1ZGUoQ01ha2VQcmludFN5c3RlbUluZm9ybWF0aW9uKQorZW5kaWYoKQorZGVidWdfc2F5X3ZhcihDTUFLRV9BU01fQ09NUElMRV9PQkpFQ1QpCitkZWJ1Z19zYXlfdmFyKENNQUtFX1JDX0NPTVBJTEVSKQorZGVidWdfc2F5X3ZhcihDTUFLRV9DX0NPTVBJTEVSX0lEKQorZGVidWdfc2F5X3ZhcihMSUJPTVBfV09SSykKK2RlYnVnX3NheV92YXIoZGF0ZSkKK2RlYnVnX3NheV92YXIoc3RhdHMpCitkZWJ1Z19zYXlfdmFyKGxpYl9maWxlKQorZGVidWdfc2F5X3ZhcihleHBvcnRfbGliX2ZpbGVzKQorZGVidWdfc2F5X3ZhcihERUZJTklUSU9OU19GTEFHUykKK2RlYnVnX3NheV92YXIoQ19GTEFHUykKK2RlYnVnX3NheV92YXIoQ1hYX0ZMQUdTKQorZGVidWdfc2F5X3ZhcihBU01fRkxBR1MpCitkZWJ1Z19zYXlfdmFyKEZfRkxBR1MpCitkZWJ1Z19zYXlfdmFyKExEX0ZMQUdTKQorZGVidWdfc2F5X3ZhcihMRF9MSUJfRkxBR1MpCitkZWJ1Z19zYXlfdmFyKEFSX0ZMQUdTKQorZGVidWdfc2F5X3Zhcihldl9mbGFncykKK2RlYnVnX3NheV92YXIoZ2RfZmxhZ3MpCitkZWJ1Z19zYXlfdmFyKG9hX29wdHMpCitkZWJ1Z19zYXlfdmFyKGxpYl9jX2l0ZW1zKQorZGVidWdfc2F5X3ZhcihsaWJfY3h4X2l0ZW1zKQorZGVidWdfc2F5X3ZhcihsaWJfYXNtX2l0ZW1zKQorZGVidWdfc2F5X3ZhcihpbXBfY19pdGVtcykKK2RlYnVnX3NheV92YXIobGliX3NyY19maWxlcykKK2RlYnVnX3NheV92YXIoaW1wX3NyY19maWxlcykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAjCisjICAgICAgICAgICAgICAgICAgICAgLS0tIFJ1bGVzL1JlY2lwZXMgLS0tICAgICAgICAgICAgICAgICAgICAgICAgIworIyAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlbG93LCAke2xkZXBzfSBhbHdheXMgc3RhbmRzIGZvciAibG9jYWwgZGVwZW5kZW5jaWVzIiBmb3IgdGhlIAorIyBuZXh0IGltbWVkaWF0ZSB0YXJnZXQgdG8gYmUgY3JlYXRlZCB2aWEgYWRkX2N1c3RvbV90YXJnZXQoKSBvciAKKyMgYWRkX2N1c3RvbV9jb21tYW5kKCkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgLS0tIENyZWF0ZSBhbGwgLS0tCithZGRfY3VzdG9tX3RhcmdldChsaWIgQUxMIERFUEVORFMgJHtleHBvcnRfbGliX2ZpbGVzfSkKK2FkZF9jdXN0b21fdGFyZ2V0KGluYyBBTEwgREVQRU5EUyAke2V4cG9ydF9pbmNfZmlsZXN9KQoraWYoJHtjcmVhdGVfZm9ydHJhbl9tb2R1bGVzfSkKK2FkZF9jdXN0b21fdGFyZ2V0KG1vZCBBTEwgREVQRU5EUyAke2V4cG9ydF9tb2RfZmlsZXN9KQorZW5kaWYoKQorIyAtLS0gRW5mb3JjZSB0aGUgdGVzdHMgdG8gYmUgY29tcGxldGVkL3NraXBwZWQgYmVmb3JlIGNvcHlpbmcgdG8gZXhwb3J0cyBkaXJlY3RvcnkgLS0tCitpZigke3Rlc3RzfSkKKyAgICBpZigke1dJTkRPV1N9KQorICAgICAgICBzZXQodGVzdC1kZXBlbmRlbmNpZXMgdGVzdC10b3VjaC1tdC8uc3VjY2VzcyB0ZXN0LXRvdWNoLW1kLy5zdWNjZXNzIHRlc3QtcmVsby8uc3VjY2VzcyB0ZXN0LWV4ZWNzdGFjay8uc3VjY2VzcyB0ZXN0LWluc3RyLy5zdWNjZXNzIHRlc3QtZGVwcy8uc3VjY2VzcykKKyAgICBlbHNlKCkKKyAgICAgICAgc2V0KHRlc3QtZGVwZW5kZW5jaWVzIHRlc3QtdG91Y2gtcnQvLnN1Y2Nlc3MgdGVzdC1yZWxvLy5zdWNjZXNzIHRlc3QtZXhlY3N0YWNrLy5zdWNjZXNzIHRlc3QtaW5zdHIvLnN1Y2Nlc3MgdGVzdC1kZXBzLy5zdWNjZXNzKQorICAgIGVuZGlmKCkKKyAgICBzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMoJHtleHBvcnRfbGliX2ZpbGVzfSBQUk9QRVJUSUVTIE9CSkVDVF9ERVBFTkRTICIke3Rlc3QtZGVwZW5kZW5jaWVzfSIpCitlbmRpZigpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIC0tLSBDcmVhdGUgQ29tbW9uIEZpbGVzIC0tLQorYWRkX2N1c3RvbV90YXJnZXQoY29tbW9uIERFUEVORFMgJHtleHBvcnRfY21uX2ZpbGVzfSkKK2FkZF9jdXN0b21fdGFyZ2V0KGNsZWFuLWNvbW1vbiBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgcmVtb3ZlIC1mICR7ZXhwb3J0X2Ntbl9maWxlc30pCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAtLS0gQ29weSBmaWxlcyB0byBleHBvcnQgZGlyZWN0b3JpZXMgLS0tCisjIC0ganVzdCBhIHNpbXBsZSBjb3B5IHJlY2lwZSB3aGljaCBhY3RzIGFzIGFuIGluc3RhbGwgc3RlcAorIyAtIGNvcGllcyBvdXQgb2YgdGhlIHNyY19kaXIgaW50byB0aGUgZGVzdF9kaXIKKyMKKyMgZGVzdF9kaXIvdGFyZ2V0IDogc3JjX2Rpci90YXJnZXQKKyMgICAgY3Agc3JjX2Rpci90YXJnZXQgZGVzdF9kaXIvdGFyZ2V0CittYWNybyAoc2ltcGxlX2NvcHlfcmVjaXBlIHRhcmdldCBzcmNfZGlyIGRlc3RfZGlyKQorICAgIGdldF9zb3VyY2VfZmlsZV9wcm9wZXJ0eShleHRyYV9kZXBlbmRzICR7ZGVzdF9kaXJ9LyR7dGFyZ2V0fSBPQkpFQ1RfREVQRU5EUykKKyAgICBpZigiJHtleHRyYV9kZXBlbmRzfSIgTUFUQ0hFUyAiTk9URk9VTkQiKQorICAgICAgICBzZXQoZXh0cmFfZGVwZW5kcykKKyAgICBlbmRpZigpCisgICAgc2V0KGxkZXBzICR7c3JjX2Rpcn0vJHt0YXJnZXR9ICIke2V4dHJhX2RlcGVuZHN9IikKKyAgICBpZihOT1QgIiR7dGFyZ2V0fSIgU1RSRVFVQUwgIiIpCisgICAgICAgIGZpbGUoTUFLRV9ESVJFQ1RPUlkgJHtkZXN0X2Rpcn0pICMgbWFrZSBzdXJlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBleGlzdHMKKyAgICAgICAgYWRkX2N1c3RvbV9jb21tYW5kKAorICAgICAgICAgICAgT1VUUFVUICAgJHtkZXN0X2Rpcn0vJHt0YXJnZXR9CisgICAgICAgICAgICBDT01NQU5EICAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHkgJHtzcmNfZGlyfS8ke3RhcmdldH0gJHtkZXN0X2Rpcn0vJHt0YXJnZXR9CisgICAgICAgICAgICBERVBFTkRTICAke2xkZXBzfQorICAgICAgICApCisgICAgZW5kaWYoKQorZW5kbWFjcm8oKQorIyBjb3B5IGZyb20gYnVpbGQgZGlyZWN0b3J5IHRvIGZpbmFsIHJlc3RpbmcgcGxhY2VzIGluIGV4cG9ydHMgZGlyZWN0b3J5CitzaW1wbGVfY29weV9yZWNpcGUoIm9tcC5oIiAgICAgICAgICAgICAiJHtidWlsZF9kaXJ9IiAgIiR7ZXhwb3J0X2Ntbl9kaXJ9L2luY2x1ZGUiKQorc2ltcGxlX2NvcHlfcmVjaXBlKCJvbXBfbGliLmgiICAgICAgICAgIiR7YnVpbGRfZGlyfSIgICIke2V4cG9ydF9jbW5fZGlyfS9pbmNsdWRlIikKK3NpbXBsZV9jb3B5X3JlY2lwZSgib21wX2xpYi5mIiAgICAgICAgICIke2J1aWxkX2Rpcn0iICAiJHtleHBvcnRfY21uX2Rpcn0vaW5jbHVkZSIpCitzaW1wbGVfY29weV9yZWNpcGUoIm9tcF9saWIuZjkwIiAgICAgICAiJHtidWlsZF9kaXJ9IiAgIiR7ZXhwb3J0X2Ntbl9kaXJ9L2luY2x1ZGUiKQorc2ltcGxlX2NvcHlfcmVjaXBlKCJpb21wLmgiICAgICAgICAgICAgIiR7YnVpbGRfZGlyfSIgICIke2V4cG9ydF9jbW5fZGlyfS9pbmNsdWRlX2NvbXBhdCIpCitzaW1wbGVfY29weV9yZWNpcGUoIiR7bGliX2ZpbGV9IiAgICAgICAiJHtidWlsZF9kaXJ9IiAgIiR7ZXhwb3J0X2xpYl9kaXJ9IikKK3NpbXBsZV9jb3B5X3JlY2lwZSgiJHtpbXBfZmlsZX0iICAgICAgICIke2J1aWxkX2Rpcn0iICAiJHtleHBvcnRfbGliX2Rpcn0iKQorc2ltcGxlX2NvcHlfcmVjaXBlKCIke3BkYl9maWxlfSIgICAgICAgIiR7YnVpbGRfZGlyfSIgICIke2V4cG9ydF9saWJfZGlyfSIpCitzaW1wbGVfY29weV9yZWNpcGUoIiR7ZGJnX2ZpbGV9IiAgICAgICAiJHtidWlsZF9kaXJ9IiAgIiR7ZXhwb3J0X2xpYl9kaXJ9IikKK3NpbXBsZV9jb3B5X3JlY2lwZSgib21wX2xpYi5tb2QiICAgICAgICIke2J1aWxkX2Rpcn0iICAiJHtleHBvcnRfcHRmX2Rpcn0vaW5jbHVkZSIpCitzaW1wbGVfY29weV9yZWNpcGUoIm9tcF9saWJfa2luZHMubW9kIiAiJHtidWlsZF9kaXJ9IiAgIiR7ZXhwb3J0X3B0Zl9kaXJ9L2luY2x1ZGUiKQorc2ltcGxlX2NvcHlfcmVjaXBlKCJpb21wX2xpYi5oIiAgICAgICAgIiR7YnVpbGRfZGlyfSIgICIke2V4cG9ydF9wdGZfZGlyfS9pbmNsdWRlX2NvbXBhdCIpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAtLS0gQnVpbGQgdGhlIG1haW4gbGlicmFyeSAtLS0KKyMgJChsaWJfZmlsZSkgPD09IE1haW4gbGlicmFyeSBmaWxlIHRvIGNyZWF0ZQorCisjIG9iamVjdHMgZGVwZW5kIG9uIDogLmluYyBmaWxlcyBhbmQgb21wLmgKKyMgVGhpcyB3YXkgdGhlICouaW5jIGFuZCBvbXAuaCBhcmUgZ2VuZXJhdGVkIGJlZm9yZSBhbnkgY29tcGlsYXRpb25zIHRha2UgcGxhY2UKK2FkZF9jdXN0b21fdGFyZ2V0KG5lZWRlZC1oZWFkZXJzIERFUEVORFMgJHtidWlsZF9kaXJ9L2ttcF9pMThuX2lkLmluYyAke2J1aWxkX2Rpcn0va21wX2kxOG5fZGVmYXVsdC5pbmMgJHtidWlsZF9kaXJ9L29tcC5oKQorCisjIEZvciBXaW5kb3dzLCB0aGVyZSBpcyBhIGRlZmluaXRpb25zIGZpbGUgKC5kZWYpIGFuZCByZXNvdXJjZSBmaWxlICgucmVzKSBjcmVhdGVkIHVzaW5nIGdlbmVyYXRlLWRlZi5wbCBhbmQgcmMuZXhlIHJlc3BlY3RpdmVseS4KK2lmKCR7V0lORE9XU30pCisgICAgYWRkX2N1c3RvbV90YXJnZXQobmVlZGVkLXdpbmRvd3MtZmlsZXMgREVQRU5EUyAke2J1aWxkX2Rpcn0vJHtkZWZfZmlsZX0gJHtidWlsZF9kaXJ9LyR7cmNfZmlsZX0pCisgICAgbGlzdChBUFBFTkQgbGliX3NyY19maWxlcyAke2J1aWxkX2Rpcn0vJHtyY19maWxlfSkKKyAgICAjIFRoZSB3aW5kb3dzIGFzc2VtYmx5IGZpbGVzIGFyZSBpbiBNQVNNIGZvcm1hdCwgYW5kIHRoZXkgcmVxdWlyZSBhIHRvb2wgdGhhdCBjYW4gaGFuZGxlIE1BU00gc3ludGF4IChtbC5leGUgb3IgbWw2NC5leGUgdHlwaWNhbGx5KQorICAgIGVuYWJsZV9sYW5ndWFnZShBU01fTUFTTSkgCitlbHNlKCkKKyAgICAjIFVuaXggYXNzZW1ibHkgZmlsZXMgY2FuIGJlIGhhbmRsZWQgYnkgY29tcGlsZXIuCisgICAgZW5hYmxlX2xhbmd1YWdlKEFTTSkKK2VuZGlmKCkKKworIyBSZW1vdmUgYW55IGNtYWtlLWF1dG9tYXRpYyBsaW5raW5nIG9mIGxpYnJhcmllcyBieSBsaW5rZXIsIFRoaXMgaXMgc28gbGludXggCisjIGFuZCBtYWMgZG9uJ3QgaW5jbHVkZSBsaWJzdGRjKysganVzdCBiZWNhdXNlIHdlIGNvbXBpbGUgYysrIGZpbGVzLgoraWYoJHtVU0VfUFJFREVGSU5FRF9MSU5LRVJfRkxBR1N9KQorICAgIHNldChDTUFLRV9DX0lNUExJQ0lUX0xJTktfTElCUkFSSUVTICAgIiIpCisgICAgc2V0KENNQUtFX0NYWF9JTVBMSUNJVF9MSU5LX0xJQlJBUklFUyAiIikKKyAgICBzZXQoQ01BS0VfQVNNX0lNUExJQ0lUX0xJTktfTElCUkFSSUVTICIiKQorZW5kaWYoKQorCisjIC0tLSAke2xpYl9maWxlfSBydWxlIC0tLQorYWRkX2xpYnJhcnkoaW9tcDUgU0hBUkVEICR7bGliX3NyY19maWxlc30pCitzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoaW9tcDUgUFJPUEVSVElFUyAKKyAgICBQUkVGSVggIiIgU1VGRklYICIiICAgICAgICAgICMgVGFrZSBjb250cm9sIAorICAgIE9VVFBVVF9OQU1FICIke2xpYl9maWxlfSIgICAgIyBvZiBvdXRwdXQgbmFtZQorICAgIExJTktfRkxBR1MgICIke0xEX0ZMQUdTfSIgICAgIAorICAgIExJTktFUl9MQU5HVUFHRSBDICAgICAgICAgICAgIyB1c2UgQyBDb21waWxlciBmb3IgbGlua2luZyBzdGVwCisgICAgU0tJUF9CVUlMRF9SUEFUSCB0cnVlICAgICAgICAjIGhhdmUgTWFjIGxpbmtlciAtaW5zdGFsbF9uYW1lIGp1c3QgYmUgIi1pbnN0YWxsX25hbWUgbGliaW9tcDUuZHlsaWIiCispCisjIFRhcmdldCBsaWIgKGV4cG9ydCBmaWxlcykgZGVwZW5kIG9uIHRoZSBsaWJyYXJ5IChpb21wNSkgYmVpbmcgYnVpbHQKK2FkZF9kZXBlbmRlbmNpZXMobGliIGlvbXA1KQorCisjIExpbmtpbmcgY29tbWFuZCB3aWxsIGluY2x1ZGUgbGlicmFyaWVzIGluIExEX0xJQl9GTEFHUwordGFyZ2V0X2xpbmtfbGlicmFyaWVzKGlvbXA1ICR7TERfTElCX0ZMQUdTfSkKKworIyBDcmVhdGUgKi5pbmMgYW5kIG9tcC5oIGJlZm9yZSBjb21waWxpbmcgYW55IHNvdXJjZXMKK2FkZF9kZXBlbmRlbmNpZXMoaW9tcDUgbmVlZGVkLWhlYWRlcnMpCitpZigke1dJTkRPV1N9KQorIyBDcmVhdGUgLmRlZiBhbmQgLnJjIGZpbGUgYmVmb3JlIGNvbXBpbGluZyBhbnkgc291cmNlcworICAgIGFkZF9kZXBlbmRlbmNpZXMoaW9tcDUgbmVlZGVkLXdpbmRvd3MtZmlsZXMpCitlbmRpZigpCisKKyMgU2V0IHRoZSBjb21waWxlciBmbGFncyBmb3IgZWFjaCB0eXBlIG9mIHNvdXJjZQorc2V0X3NvdXJjZV9maWxlc19wcm9wZXJ0aWVzKCR7bGliX2NfaXRlbXN9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7aW1wX2NfaXRlbXN9ICAgUFJPUEVSVElFUyBDT01QSUxFX0ZMQUdTICIke0NfRkxBR1N9IiAgKQorc2V0X3NvdXJjZV9maWxlc19wcm9wZXJ0aWVzKCR7bGliX2N4eF9pdGVtc30gUFJPUEVSVElFUyBDT01QSUxFX0ZMQUdTICIke0NYWF9GTEFHU30iKQorc2V0X3NvdXJjZV9maWxlc19wcm9wZXJ0aWVzKCR7bGliX2FzbV9pdGVtc30gUFJPUEVSVElFUyBDT01QSUxFX0ZMQUdTICIke0FTTV9GTEFHU30iKQorIyBTZXQgdGhlIC1EIGRlZmluaXRpb25zIGZvciBhbGwgc291cmNlcworYWRkX2RlZmluaXRpb25zKCR7REVGSU5JVElPTlNfRkxBR1N9KQorCisjIElmIGNyZWF0aW5nIGEgYnVpbGQgdGhhdCBpbWl0YXRlcyBidWlsZC5wbCdzIHJ1bGVzIHRoZW4gc2V0IFVTRV9CVUlMRFBMX1JVTEVTIHRvIHRydWUKK2lmKCR7VVNFX0JVSUxEUExfUlVMRVN9KQorICAgIGluY2x1ZGUoQnVpbGRQTFJ1bGVzKQorZW5kaWYoKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgLS0tIFNvdXJjZSBmaWxlIHNwZWNpZmljIGZsYWdzIC0tLQorIyBrbXBfdmVyc2lvbi5vIDogLUQgX0tNUF9CVUlMRF9USU1FPSJcIiQoZGF0ZSl9XCIiCitzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMoJHtzcmNfZGlyfS9rbXBfdmVyc2lvbi5jICBQUk9QRVJUSUVTIENPTVBJTEVfREVGSU5JVElPTlMgIl9LTVBfQlVJTERfVElNRT1cIlxcXCIke2RhdGV9XFxcIlwiIikKKworIyB6X0xpbnV4X2FzbS5vIDogLUQgS01QX0FSQ0hfKgoraWYoJHtBUk19KQorICAgIHNldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcygke3NyY19kaXJ9L3pfTGludXhfYXNtLnMgUFJPUEVSVElFUyBDT01QSUxFX0RFRklOSVRJT05TICJLTVBfQVJDSF9BUk0iKQorZWxzZWlmKCR7SU5URUw2NH0pCisgICAgc2V0X3NvdXJjZV9maWxlc19wcm9wZXJ0aWVzKCR7c3JjX2Rpcn0vel9MaW51eF9hc20ucyBQUk9QRVJUSUVTIENPTVBJTEVfREVGSU5JVElPTlMgIktNUF9BUkNIX1g4Nl82NCIpCitlbHNlaWYoJHtJQTMyfSkKKyAgICBzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMoJHtzcmNfZGlyfS96X0xpbnV4X2FzbS5zIFBST1BFUlRJRVMgQ09NUElMRV9ERUZJTklUSU9OUyAiS01QX0FSQ0hfWDg2IikKK2Vsc2VpZigke1BQQzY0fSkKKwlzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMoJHtzcmNfZGlyfS96X0xpbnV4X2FzbS5zIFBST1BFUlRJRVMgQ09NUElMRV9ERUZJTklUSU9OUyAiS01QX0FSQ0hfUFBDNjQiKQorZW5kaWYoKQorCitpZigke1dJTkRPV1N9KQorICAgIHNldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcygke3NyY19kaXJ9L3RoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeV9zdGF0aWMuYyBQUk9QRVJUSUVTIENPTVBJTEVfREVGSU5JVElPTlMgIlVOSUNPREUiKQorZW5kaWYoKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTUFDIHNwZWNpZmljIGJ1aWxkIHJ1bGVzCitpZigke01BQ30pCisgICAgIyBmYXQgbGlicmFyeSBydWxlcworICAgIGlmKCR7SU5URUw2NH0pCisgICAgICAgIF9leHBvcnRfbGliX2ZhdF9kaXIoICJtYWNfMzJlIiBleHBvcnRfZmF0X21hY18zMmUpCisgICAgICAgIF9leHBvcnRfbGliX2RpciggICAgICJtYWNfMzIiICBleHBvcnRfbWFjXzMyICAgICApCisgICAgICAgIF9leHBvcnRfbGliX2RpciggICAgICJtYWNfMzJlIiBleHBvcnRfbWFjXzMyZSAgICApCisgICAgICAgIGZpbGUoTUFLRV9ESVJFQ1RPUlkgJHtleHBvcnRfZmF0X21hY18zMmV9KQorICAgICAgICBhZGRfY3VzdG9tX3RhcmdldChmYXQKKyAgICAgICAgICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBlY2hvIEJ1aWxkaW5nIDMyIGFuZCAzMmUgZmF0IGxpYnJhcmllcyBmcm9tICR7ZXhwb3J0X21hY18zMn0vJHtsaWJfZmlsZX0gYW5kICR7ZXhwb3J0X21hY18zMmV9LyR7bGliX2ZpbGV9CisgICAgICAgICAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgZWNobyBXaWxsIHB1dCBmYXQgbGlicmFyeSBpbiAke2V4cG9ydF9mYXRfbWFjXzMyZX0gZGlyZWN0b3J5CisgICAgICAgICAgICBDT01NQU5EIGxpcG8gLWNyZWF0ZSAtb3V0cHV0ICR7ZXhwb3J0X2ZhdF9tYWNfMzJlfS8ke2xpYl9maWxlfSAke2V4cG9ydF9tYWNfMzJ9LyR7bGliX2ZpbGV9ICR7ZXhwb3J0X21hY18zMmV9LyR7bGliX2ZpbGV9CisgICAgICAgICkKKyAgICBlbmRpZigpCitlbmRpZigpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBXaW5kb3dzIHNwZWNpZmljIGJ1aWxkIHJ1bGVzCitpZigke1dJTkRPV1N9KQorCisgICAgIyAtLS0gQ3JlYXRlICQoaW1wX2ZpbGUpIC0tLQorICAgICMgVGhpcyBmaWxlIGlzIGZpcnN0IGNyZWF0ZWQgaW4gdGhlIHVuc3RyaXBwZWQvJHtsaWJfZmlsZX0gY3JlYXRpb24gc3RlcC4KKyAgICAjIEl0IGlzIHRoZW4gInJlLWxpbmtlZCIgdG8gaW5jbHVkZSBrbXBfaW1wb3J0LmMgd2hpY2ggcHJldmVudHMgbGlua2luZyBvZiBib3RoIFZpc3VhbCBTdHVkaW8gT3Blbk1QIGFuZCBuZXdseSBidWlsdCBPcGVuTVAKKyAgICBpZihOT1QgIiR7aW1wX2ZpbGV9IiBTVFJFUVVBTCAiIikKKyAgICAgICAgc2V0KGdlbmVyYXRlZF9pbXBvcnRfZmlsZSAke2xpYl9maWxlfSR7bGlifSkKKyAgICAgICAgYWRkX2xpYnJhcnkoaW9tcDVpbXAgU1RBVElDICR7Z2VuZXJhdGVkX2ltcG9ydF9maWxlfSAke2ltcF9zcmNfZmlsZXN9KQorICAgICAgICBzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMoJHtnZW5lcmF0ZWRfaW1wb3J0X2ZpbGV9IFBST1BFUlRJRVMgR0VORVJBVEVEIFRSVUUgRVhURVJOQUxfT0JKRUNUIFRSVUUpCisgICAgICAgIHNldF90YXJnZXRfcHJvcGVydGllcyhpb21wNWltcCBQUk9QRVJUSUVTCisgICAgICAgICAgICBQUkVGSVggIiIgU1VGRklYICIiCisgICAgICAgICAgICBPVVRQVVRfTkFNRSAiJHtpbXBfZmlsZX0iCisgICAgICAgICAgICBTVEFUSUNfTElCUkFSWV9GTEFHUyAiJHtBUl9GTEFHU30iCisgICAgICAgICAgICBMSU5LRVJfTEFOR1VBR0UgQworICAgICAgICAgICAgU0tJUF9CVUlMRF9SUEFUSCB0cnVlCisgICAgICAgICkKKyAgICAgICAgYWRkX2N1c3RvbV9jb21tYW5kKFRBUkdFVCBpb21wNWltcCBQUkVfQlVJTEQgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIHJlbW92ZSAtZiAke2ltcF9maWxlfSkKKyAgICAgICAgYWRkX2RlcGVuZGVuY2llcyhpb21wNWltcCBpb21wNSkKKyAgICBlbmRpZigpCisKKyAgICAjIC0tLSBDcmVhdGUgJChkZWZfZmlsZSkgLS0tCisgICAgaWYoTk9UICIke2RlZl9maWxlfSIgU1RSRVFVQUwgIiIpCisgICAgICAgIHN0cmluZ190b19saXN0KCIke2dkX2ZsYWdzfSIgZ2RfZmxhZ3MpCisgICAgICAgIGFkZF9jdXN0b21fY29tbWFuZCgKKyAgICAgICAgICAgIE9VVFBVVCAgJHtkZWZfZmlsZX0KKyAgICAgICAgICAgIENPTU1BTkQgJHtQRVJMX0VYRUNVVEFCTEV9ICR7dG9vbHNfZGlyfS9nZW5lcmF0ZS1kZWYucGwgJHtnZF9mbGFnc30gLW8gJHtkZWZfZmlsZX0gJHtzcmNfZGlyfS9kbGxleHBvcnRzCisgICAgICAgICAgICBERVBFTkRTICR7c3JjX2Rpcn0vZGxsZXhwb3J0cyAke3Rvb2xzX2Rpcn0vZ2VuZXJhdGUtZGVmLnBsCisgICAgICAgICkKKyAgICBlbmRpZigpCisKKyAgICAjIC0tLSBDcmVhdGUgJChyY19maWxlKSAtLS0KKyAgICBpZihOT1QgIiR7cmNfZmlsZX0iIFNUUkVRVUFMICIiKQorICAgICAgICBhZGRfY3VzdG9tX2NvbW1hbmQoCisgICAgICAgICAgICBPVVRQVVQgICR7cmNfZmlsZX0KKyAgICAgICAgICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5IGxpYmlvbXAucmMgJHtyY19maWxlfQorICAgICAgICAgICAgREVQRU5EUyBsaWJpb21wLnJjCisgICAgICAgICkKKyAgICBlbmRpZigpCitlbmRpZigpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBrbXBfaTE4bl9pZC5pbmMgYW5kIGttcF9pMThuX2RlZmF1bHQuaW5jCitzZXQocGVybGNtZCAiJHtQRVJMX0VYRUNVVEFCTEV9IiAiJHt0b29sc19kaXJ9L21lc3NhZ2UtY29udmVydGVyLnBsIiAiJHtvYV9vcHRzfSIgIi0tcHJlZml4PWttcF9pMThuIiAiLS1lbnVtPWttcF9pMThuX2lkLmluYyIgIiR7c3JjX2Rpcn0vaTE4bi9lbl9VUy50eHQiKQorYWRkX2N1c3RvbV9jb21tYW5kKAorICAgIE9VVFBVVCAgJHtidWlsZF9kaXJ9L2ttcF9pMThuX2lkLmluYworICAgIENPTU1BTkQgJHtwZXJsY21kfQorICAgIERFUEVORFMgJHtzcmNfZGlyfS9pMThuL2VuX1VTLnR4dCAke3Rvb2xzX2Rpcn0vbWVzc2FnZS1jb252ZXJ0ZXIucGwKKykKK3NldChwZXJsY21kICIke1BFUkxfRVhFQ1VUQUJMRX0iICIke3Rvb2xzX2Rpcn0vbWVzc2FnZS1jb252ZXJ0ZXIucGwiICIke29hX29wdHN9IiAiLS1wcmVmaXg9a21wX2kxOG4iICItLWRlZmF1bHQ9a21wX2kxOG5fZGVmYXVsdC5pbmMiICIke3NyY19kaXJ9L2kxOG4vZW5fVVMudHh0IikKK2FkZF9jdXN0b21fY29tbWFuZCgKKyAgICBPVVRQVVQgICR7YnVpbGRfZGlyfS9rbXBfaTE4bl9kZWZhdWx0LmluYworICAgIENPTU1BTkQgJHtwZXJsY21kfQorICAgIERFUEVORFMgJHtzcmNfZGlyfS9pMThuL2VuX1VTLnR4dCAke3Rvb2xzX2Rpcn0vbWVzc2FnZS1jb252ZXJ0ZXIucGwKKykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE1pY3JvIHRlc3QgcnVsZXMgZm9yIGFmdGVyIGxpYnJhcnkgaGFzIGJlZW4gYnVpbHQgKGNtYWtlL01pY3JvVGVzdHMuY21ha2UpCisjIC0gT25seSBwZXJmb3JtIGlmICR7dGVzdHN9ID09IHRydWUgKHNwZWNpZnkgd2hlbiBpbnZva2luZzogY21ha2UgLUR0ZXN0cz1vbiAuLi4pCitpZigke3Rlc3RzfSkKKyAgICBpbmNsdWRlKE1pY3JvVGVzdHMpCitlbmRpZigpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAtLS0gQ3JlYXRlIEZvcnRyYW4gRmlsZXMgLS0tCisjIG9tcF9saWIubW9kCitpZigke2NyZWF0ZV9mb3J0cmFuX21vZHVsZXN9KQorICAgICMgR3JhYiBmb3J0cmFuLWNvbXBpbGVyLWRlcGVuZGVudCBmbGFncworICAgICMgQ21ha2Ugd2lsbCBsb29rIGZvciBjbWFrZS8ke0NNQUtFX0ZvcnRyYW5fQ09NUElMRVJfSUR9L0ZvcnRyYW5GbGFncy5jbWFrZSB0byBhcHBlbmQgYWRkaXRpb25hbCBmb3J0cmFuIGZsYWdzLgorICAgIGVuYWJsZV9sYW5ndWFnZShGb3J0cmFuKQorICAgIHNldChDTUFLRV9NT0RVTEVfUEFUSCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY21ha2UvJHtDTUFLRV9Gb3J0cmFuX0NPTVBJTEVSX0lEfSAke0NNQUtFX01PRFVMRV9QQVRIfSkKKyAgICBmaW5kX2ZpbGUoZm9ydHJhbl9zcGVjaWZpY19pbmNsdWRlX2ZpbGVfZm91bmQgRm9ydHJhbkZsYWdzLmNtYWtlICR7Q01BS0VfTU9EVUxFX1BBVEh9KQorICAgIGlmKGZvcnRyYW5fc3BlY2lmaWNfaW5jbHVkZV9maWxlX2ZvdW5kKQorICAgICAgICBpbmNsdWRlKEZvcnRyYW5GbGFncykKKyAgICAgICAgYXBwZW5kX2ZvcnRyYW5fY29tcGlsZXJfc3BlY2lmaWNfZm9ydF9mbGFncyhGX0ZMQUdTKQorICAgIGVsc2UoKQorICAgICAgICB3YXJuaW5nX3NheSgiQ291bGQgbm90IGZpbmQgY21ha2UvJHtDTUFLRV9Gb3J0cmFuX0NPTVBJTEVSX0lEfS9Gb3J0cmFuRmxhZ3MuY21ha2U6IHdpbGwgb25seSB1c2UgZGVmYXVsdCBmbGFncyBpbiBDb21tb25GbGFncy5jbWFrZSIpCisgICAgZW5kaWYoKQorICAgIHNldChvbXBfbGliX2YgIm9tcF9saWIuZjkwIiApCisgICAgYWRkX2N1c3RvbV9jb21tYW5kKAorICAgICAgICBPVVRQVVQgIm9tcF9saWIubW9kIgorICAgICAgICBDT01NQU5EICR7Q01BS0VfRm9ydHJhbl9DT01QSUxFUn0gLWMgJHtGX0ZMQUdTfSAke29tcF9saWJfZn0KKyAgICAgICAgREVQRU5EUyAke29tcF9saWJfZn0KKyAgICApCisgICAgYWRkX2N1c3RvbV9jb21tYW5kKAorICAgICAgICBPVVRQVVQgIm9tcF9saWJfa2luZHMubW9kIgorICAgICAgICBDT01NQU5EICR7Q01BS0VfRm9ydHJhbl9DT01QSUxFUn0gLWMgJHtGX0ZMQUdTfSAke29tcF9saWJfZn0KKyAgICAgICAgREVQRU5EUyAke29tcF9saWJfZn0KKyAgICApCisgICAgIyBjbGVhbiBvbXBfbGliLm8gZnJvbSBidWlsZCBkaXJlY3Rvcnkgd2hlbiAibWFrZSBjbGVhbiIgCisgICAgc2V0X2RpcmVjdG9yeV9wcm9wZXJ0aWVzKFBST1BFUlRJRVMgQURESVRJT05BTF9NQUtFX0NMRUFOX0ZJTEVTIG9tcF9saWIke29ian0pCitlbmRpZigpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAtLS0gVXNpbmcgZXhwYW5kLXZhcnMucGwgdG8gZ2VuZXJhdGUgZmlsZXMgLS0tCisjIC0gJ2ZpbGUnIGlzIGdlbmVyYXRlZCB1c2luZyBleHBhbmQtdmFycy5wbCBhbmQgJ2ZpbGUnLnZhcgorIyAtIEFueSAuaCAuZiAuZjkwIC5yYyBmaWxlcyBzaG91bGQgYmUgY3JlYXRlZCB3aXRoIHRoaXMgcmVjaXBlCittYWNybyhleHBhbmRfdmFyc19yZWNpcGUgZmlsZW5hbWUpCisgICAgZ2V0X3NvdXJjZV9maWxlX3Byb3BlcnR5KGV4dHJhX2V2X2ZsYWdzICR7ZmlsZW5hbWV9IENPTVBJTEVfREVGSU5JVElPTlMpCisgICAgaWYoIiR7ZXh0cmFfZXZfZmxhZ3N9IiBNQVRDSEVTICJOT1RGT1VORCIpCisgICAgICAgIHNldChleHRyYV9ldl9mbGFncykKKyAgICBlbHNlKCkKKyAgICAgICAgc3RyaW5nX3RvX2xpc3QoIiR7ZXh0cmFfZXZfZmxhZ3N9IiBleHRyYV9ldl9mbGFncykKKyAgICBlbmRpZigpCisgICAgZmluZF9maWxlKCR7ZmlsZW5hbWV9X3BhdGggJHtmaWxlbmFtZX0udmFyIFBBVEhTICR7c3JjX2Rpcn0vaW5jbHVkZS8ke29tcF92ZXJzaW9ufSAke3NyY19kaXJ9KQorICAgIHNldChsZGVwcyAiJHske2ZpbGVuYW1lfV9wYXRofSIgIiR7c3JjX2Rpcn0va21wX3ZlcnNpb24uYyIgIiR7dG9vbHNfZGlyfS9leHBhbmQtdmFycy5wbCIpCisgICAgc2V0KGV4cGFuZHZhcnNjbWQgJHtQRVJMX0VYRUNVVEFCTEV9ICR7dG9vbHNfZGlyfS9leHBhbmQtdmFycy5wbCAtLXN0cmljdCAke2V2X2ZsYWdzfSAke2V4dHJhX2V2X2ZsYWdzfSAkeyR7ZmlsZW5hbWV9X3BhdGh9ICR7ZmlsZW5hbWV9KQorICAgIGlmKE5PVCAiJHtmaWxlbmFtZX0iIFNUUkVRVUFMICIiKQorICAgICAgICBhZGRfY3VzdG9tX2NvbW1hbmQoCisgICAgICAgICAgICBPVVRQVVQgICR7ZmlsZW5hbWV9CisgICAgICAgICAgICBDT01NQU5EICR7ZXhwYW5kdmFyc2NtZH0KKyAgICAgICAgICAgIERFUEVORFMgJHtsZGVwc30KKyAgICAgICAgKQorICAgIGVuZGlmKCkKK2VuZG1hY3JvKCkKK3N0cmluZ190b19saXN0KCIke2V2X2ZsYWdzfSIgZXZfZmxhZ3MpCisjIG9tcF9saWIuaCAgOiBldi1mbGFncyArPSAtRCBLTVBfSU5UX1BUUl9LSU5EPSJpbnRfcHRyX2tpbmQoKSIKK3NldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcyhvbXBfbGliLmggUFJPUEVSVElFUyBDT01QSUxFX0RFRklOSVRJT05TICItRCBLTVBfSU5UX1BUUl9LSU5EPVwiaW50X3B0cl9raW5kKClcIiIpIAorIyBpb21wX2xpYi5oIDogZXYtZmxhZ3MgKz0gLUQgS01QX0lOVF9QVFJfS0lORD0kKGlmICQoZmlsdGVyIDMyLCQoYXJjaCkpLDQsOCkKK2lmKCR7SUEzMn0pICMgMzIgYml0IGFyY2hzCisgICAgc2V0X3NvdXJjZV9maWxlc19wcm9wZXJ0aWVzKGlvbXBfbGliLmggUFJPUEVSVElFUyBDT01QSUxFX0RFRklOSVRJT05TICItRCBLTVBfSU5UX1BUUl9LSU5EPTQiKSAKK2Vsc2UoKQorICAgIHNldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcyhpb21wX2xpYi5oIFBST1BFUlRJRVMgQ09NUElMRV9ERUZJTklUSU9OUyAiLUQgS01QX0lOVF9QVFJfS0lORD04IikgCitlbmRpZigpCisjIGxpYmlvbXAucmMgOiBldi1mbGFncyArPSAtRCBLTVBfRklMRT0kKGxpYl9maWxlKQorc2V0X3NvdXJjZV9maWxlc19wcm9wZXJ0aWVzKGxpYmlvbXAucmMgUFJPUEVSVElFUyBDT01QSUxFX0RFRklOSVRJT05TICItRCBLTVBfRklMRT0ke2xpYl9maWxlfSIpIAorZXhwYW5kX3ZhcnNfcmVjaXBlKG9tcC5oKQorZXhwYW5kX3ZhcnNfcmVjaXBlKG9tcF9saWIuaCkKK2V4cGFuZF92YXJzX3JlY2lwZShvbXBfbGliLmYpCitleHBhbmRfdmFyc19yZWNpcGUob21wX2xpYi5mOTApCitleHBhbmRfdmFyc19yZWNpcGUoaW9tcC5oKQorZXhwYW5kX3ZhcnNfcmVjaXBlKGlvbXBfbGliLmgpCitleHBhbmRfdmFyc19yZWNpcGUobGliaW9tcC5yYykKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBQcmludCBjb25maWd1cmF0aW9uIGFmdGVyIGFsbCB2YXJpYWJsZXMgYXJlIHNldC4KK3NheSgiIikKK3NheSgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ09ORklHVVJBVElPTiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpCitzYXkoIk9wZXJhdGluZyBTeXN0ZW0gICA6ICR7b3N9IikKK3NheSgiQXJjaGl0ZWN0dXJlICAgICAgIDogJHthcmNofSIpCitzYXkoIkJ1aWxkIFR5cGUgICAgICAgICA6ICR7Q01BS0VfQlVJTERfVFlQRX0iKQorc2F5KCJPcGVuTVAgVmVyc2lvbiAgICAgOiAke29tcF92ZXJzaW9ufSIpCitzYXkoIkxpYiBUeXBlICAgICAgICAgICA6ICR7bGliX3R5cGV9IikKK2lmKCR7TUlDfSkKKyAgICBzYXkoIkludGVsKFIpIE1JQyBBcmNoaXRlY3R1cmUgICAgOiAke21pY19hcmNofSIpCisgICAgc2F5KCJJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlIE9TIDogJHttaWNfb3N9IikKK2VuZGlmKCkKK3NheSgiRm9ydHJhbiBNb2R1bGVzICAgIDogJHtjcmVhdGVfZm9ydHJhbl9tb2R1bGVzfSIpCisjIHdpbGwgc2F5IGRldmVsb3BtZW50IGlmIGFsbCB6ZXJvcworaWYoIiR7YnVpbGRfbnVtYmVyfSIgU1RSRVFVQUwgIjAwMDAwMDAwIikKKyAgICBzZXQoYnVpbGQgImRldmVsb3BtZW50IikKK2Vsc2UoKQorICAgIHNldChidWlsZCAiJHtidWlsZF9udW1iZXJ9IikKK2VuZGlmKCkKK3NheSgiQnVpbGQgICAgICAgICAgICAgIDogJHtidWlsZH0iKQorc2F5KCJTdGF0cy1HYXRoZXJpbmcgICAgOiAke3N0YXRzfSIpCitzYXkoIlVzZSBidWlsZC5wbCBydWxlcyA6ICR7VVNFX0JVSUxEUExfUlVMRVN9IikKK3NheSgiQWRhcHRpdmUgbG9ja3MgICAgIDogJHtVU0VfQURBUFRJVkVfTE9DS1N9IikKK3NheSgiVXNlIHByZWRlZmluZWQgbGlua2VyIGZsYWdzICAgICAgOiAke1VTRV9QUkVERUZJTkVEX0xJTktFUl9GTEFHU30iKQorc2F5KCJDb21waWxlciBzdXBwb3J0cyBxdWFkIHByZWNpc2lvbiA6ICR7Q09NUElMRVJfU1VQUE9SVFNfUVVBRF9QUkVDSVNJT059IikKK3NheSgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpCitzYXkoIiIpCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvQ01ha2VMaXN0cy50eHQub2xkIGIvZmluYWwvcnVudGltZS9DTWFrZUxpc3RzLnR4dC5vbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA4ZTUwMAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvQ01ha2VMaXN0cy50eHQub2xkCkBAIC0wLDAgKzEsOCBAQAorcHJvamVjdChvcGVubXApCitjbWFrZV9taW5pbXVtX3JlcXVpcmVkKFZFUlNJT04gMi44KQorCitzZXQoVkVSU0lPTiA1KQorc2V0KE9NUF9WRVJTSU9OICIyMDExMDciKQorc2V0KE9NUF9WRVJTSU9OX05VTSAiNDAiKQorCithZGRfc3ViZGlyZWN0b3J5KHNyYykKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvTWFrZWZpbGUgYi9maW5hbC9ydW50aW1lL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjOTUyOTgKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL01ha2VmaWxlCkBAIC0wLDAgKzEsNDUgQEAKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworb21wX3Jvb3Q/PS4KK2luY2x1ZGUgJChvbXBfcm9vdCkvdG9vbHMvY29tbW9uLmluYworLlBIT05ZOiBkZWZhdWx0IGFsbCBvbXAKKworZGVmYXVsdDogb21wCisKK2FsbDogb21wIHN0dWJzCisKK29tcDogaW5mbyBta2RpcgorCUBlY2hvICQob21wX3Jvb3QpL3Rvb2xzL2J1aWxkLnBsICQoYnVpbGRfYXJncykgLS1hcmNoPSQoYXJjaCkgLS1tb2RlPSQobW9kZSkgbGliIGluYyBjb21tb24KKwkkKG9tcF9yb290KS90b29scy9idWlsZC5wbCAkKGJ1aWxkX2FyZ3MpIC0tYXJjaD0kKGFyY2gpIC0tbW9kZT0kKG1vZGUpIGxpYiBpbmMgY29tbW9uCisKK3N0dWJzOiBta2RpcgorCUBlY2hvICQob21wX3Jvb3QpL3Rvb2xzL2J1aWxkLnBsICQoYnVpbGRfYXJncykgLS1hcmNoPSQoYXJjaCkgLS1tb2RlPSQobW9kZSkgLS1zdHVicyBsaWIgaW5jIGNvbW1vbiAKKwkkKG9tcF9yb290KS90b29scy9idWlsZC5wbCAkKGJ1aWxkX2FyZ3MpIC0tYXJjaD0kKGFyY2gpIC0tbW9kZT0kKG1vZGUpIC0tc3R1YnMgbGliIGluYyBjb21tb24KKworLlBIT05ZOiBjbGVhbiBpbmZvCisKK2NsZWFuOgorCSQoc2hlbGwgJChSTSkgLXJmICQob21wX3Jvb3QpJChTTEFTSCl0bXApCisJQGVjaG8gY2xlYW4gZG9uZQorCitta2RpcjoKKwkkKHNoZWxsICQoTUQpICQob21wX3Jvb3QpJChTTEFTSCl0bXAgPiQoTlVMKSAyPiQoTlVMKSkKKwlAZWNobyBDcmVhdGVkICQob21wX3Jvb3QpJChTTEFTSCl0bXAgZGlyZWN0b3J5CisKK2luZm86CisJQGVjaG8gb21wX3Jvb3Q9JChvbXBfcm9vdCkKKwlAZWNobyBvbXBfb3M9JChvbXBfb3MpCisJQGVjaG8gYXJjaD0kKGFyY2gpCisJQGVjaG8gY29tcGlsZXI9JChjb21waWxlcikJCisJQGVjaG8gbWljPSQobWljKQorCUBlY2hvIG1vZGU9JChtb2RlKQorCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL1JFQURNRS50eHQgYi9maW5hbC9ydW50aW1lL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBkMjA3YgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvUkVBRE1FLnR4dApAQCAtMCwwICsxLDExNyBAQAorCisgICAgICAgICAgICAgICBSRUFETUUgZm9yIEludGVsKFIpIE9wZW5NUCogUnVudGltZSBMaWJyYXJ5CisgICAgICAgICAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0hvdyB0byBCdWlsZCBEb2N1bWVudGF0aW9uCis9PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgbWFpbiBkb2N1bWVudGF0aW9uIGlzIGluIERveHlnZW4qIGZvcm1hdCwgYW5kIHRoaXMgZGlzdHJpYnV0aW9uCitzaG91bGQgY29tZSB3aXRoIHByZS1idWlsdCBQREYgZG9jdW1lbnRhdGlvbiBpbiBkb2MvUmVmZXJlbmNlLnBkZi4gIAorSG93ZXZlciwgYW4gSFRNTCB2ZXJzaW9uIGNhbiBiZSBidWlsdCBieSBleGVjdXRpbmc6CisKKyUgZG94eWdlbiBkb2MvZG94eWdlbi9jb25maWcgCisKK2luIHRoaXMgZGlyZWN0b3J5LgorCitUaGF0IHdpbGwgcHJvZHVjZSBIVE1MIGRvY3VtZW50YXRpb24gaW4gdGhlIGRvYy9kb3h5Z2VuL2dlbmVyYXRlZAorZGlyZWN0b3J5LCB3aGljaCBjYW4gYmUgYWNjZXNzZWQgYnkgcG9pbnRpbmcgYSB3ZWIgYnJvd3NlciBhdCB0aGUKK2luZGV4Lmh0bWwgZmlsZSB0aGVyZS4KKworSWYgeW91IGRvbid0IGhhdmUgRG94eWdlbiBpbnN0YWxsZWQsIHlvdSBjYW4gZG93bmxvYWQgaXQgZnJvbQord3d3LmRveHlnZW4ub3JnLgorCisKK0hvdyB0byBCdWlsZCB0aGUgSW50ZWwoUikgT3Blbk1QKiBSdW50aW1lIExpYnJhcnkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIE1ha2VmaWxlIGF0IHRoZSB0b3AtbGV2ZWwgd2lsbCBhdHRlbXB0IHRvIGRldGVjdCB3aGF0IGl0IG5lZWRzIHRvCitidWlsZCB0aGUgSW50ZWwoUikgT3Blbk1QKiBSdW50aW1lIExpYnJhcnkuICBUbyBzZWUgdGhlIGRlZmF1bHQgc2V0dGluZ3MsIAordHlwZToKKworbWFrZSBpbmZvCisKK1lvdSBjYW4gY2hhbmdlIHRoZSBNYWtlZmlsZSdzIGJlaGF2aW9yIHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25zOgorCitvbXBfcm9vdDogICAgVGhlIHBhdGggdG8gdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgdG9wLWxldmVsCisJICAgICBNYWtlZmlsZS4gIEJ5IGRlZmF1bHQsIHRoaXMgd2lsbCB0YWtlIG9uIHRoZSB2YWx1ZSBvZiB0aGUgCisJICAgICBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgorCitvbXBfb3M6ICAgICAgT3BlcmF0aW5nIHN5c3RlbS4gIEJ5IGRlZmF1bHQsIHRoZSBidWlsZCB3aWxsIGF0dGVtcHQgdG8gCisJICAgICBkZXRlY3QgdGhpcy4gQ3VycmVudGx5IHN1cHBvcnRzICJsaW51eCIsICJmcmVlYnNkIiwgIm1hY29zIiwgYW5kCisJICAgICAid2luZG93cyIuCisKK2FyY2g6ICAgICAgICBBcmNoaXRlY3R1cmUuIEJ5IGRlZmF1bHQsIHRoZSBidWlsZCB3aWxsIGF0dGVtcHQgdG8gCisJICAgICBkZXRlY3QgdGhpcyBpZiBub3Qgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLiBDdXJyZW50bHkgCisJICAgICBzdXBwb3J0ZWQgdmFsdWVzIGFyZQorICAgICAgICAgICAgICAgICAiMzIiIGZvciBJQS0zMiBhcmNoaXRlY3R1cmUgCisgICAgICAgICAgICAgICAgICIzMmUiIGZvciBJbnRlbChSKSA2NCBhcmNoaXRlY3R1cmUKKyAgICAgICAgICAgICAgICAgIm1pYyIgZm9yIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZQorCisgICAgICAgICAgICAgSWYgIm1pYyIgaXMgc3BlY2lmaWVkIHRoZW4gImljYyIgd2lsbCBiZSB1c2VkIGFzIHRoZQorCSAgICAgY29tcGlsZXIsIGFuZCBhcHByb3ByaWF0ZSBrMW9tIGJpbnV0aWxzIHdpbGwgYmUgdXNlZC4gVGhlCisJICAgICBuZWNlc3NhcnkgcGFja2FnZXMgbXVzdCBiZSBpbnN0YWxsZWQgb24gdGhlIGJ1aWxkIG1hY2hpbmUKKwkgICAgIGZvciB0aGlzIHRvIGJlIHBvc3NpYmxlIChidXQgYW4gSW50ZWwoUikgWGVvbiBQaGkoVE0pCisJICAgICBjb3Byb2Nlc3NvciBjYXJkIGlzIG5vdCByZXF1aXJlZCB0byBidWlsZCB0aGUgbGlicmFyeSkuCisKK2NvbXBpbGVyOiAgICBXaGljaCBjb21waWxlciB0byB1c2UgZm9yIHRoZSBidWlsZC4gIERlZmF1bHRzIHRvICJpY2MiIAorCSAgICAgb3IgImljbCIgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiBvbXBfb3MuIEFsc28gc3VwcG9ydHMgCisJICAgICBzb21lIHZlcnNpb25zIG9mICJnY2MiKiB3aGVuIG9tcF9vcyBpcyAibGludXgiLiBUaGUgc2VsZWN0ZWQgCisJICAgICBjb21waWxlciBzaG91bGQgYmUgaW5zdGFsbGVkIGFuZCBpbiB0aGUgdXNlcidzIHBhdGguIFRoZSAKKwkgICAgIGNvcnJlc3BvbmRpbmcgRm9ydHJhbiBjb21waWxlciBzaG91bGQgYWxzbyBiZSBpbiB0aGUgcGF0aC4gCisJICAgICBTZWUgIlN1cHBvcnRlZCBSVEwgQnVpbGQgQ29uZmlndXJhdGlvbnMiIGJlbG93IGZvciBtb3JlIAorCSAgICAgaW5mb3JtYXRpb24gb24gY29tcGlsZXIgdmVyc2lvbnMuCisKK21vZGU6ICAgICAgICBMaWJyYXJ5IG1vZGU6IGRlZmF1bHQgaXMgInJlbGVhc2UiLiAgQWxzbyBzdXBwb3J0cyAiZGVidWciLgorCitUbyB1c2UgYW55IG9mIHRoZSBvcHRpb25zIGFib3ZlLCBzaW1wbGUgYWRkIDxvcHRpb25fbmFtZT49PHZhbHVlPi4gIEZvciAKK2V4YW1wbGUsIGlmIHlvdSB3YW50IHRvIGJ1aWxkIHdpdGggZ2NjIGluc3RlYWQgb2YgaWNjLCB0eXBlOgorCittYWtlIGNvbXBpbGVyPWdjYworCitUaGVyZSBpcyBhbHNvIGFuIGV4cGVyaW1lbnRhbCBDTWFrZSBidWlsZCBzeXN0ZW0uIFRoaXMgaXMgKm5vdCogeWV0CitzdXBwb3J0ZWQgZm9yIHByb2R1Y3Rpb24gdXNlIGFuZCByZXN1bHRpbmcgYmluYXJpZXMgaGF2ZSBub3QgYmVlbiBjaGVja2VkCitmb3IgY29tcGF0aWJpbGl0eS4KKworU3VwcG9ydGVkIFJUTCBCdWlsZCBDb25maWd1cmF0aW9ucworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitTdXBwb3J0ZWQgQXJjaGl0ZWN0dXJlczogSUEtMzIgYXJjaGl0ZWN0dXJlLCBJbnRlbChSKSA2NCwgYW5kIAorSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlCisKKyAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorICAgICAgICAgICAgICB8ICAgaWNjL2ljbCAgICAgfCAgICBnY2MgICAgICB8ICAgY2xhbmcgICAgfAorLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfCBMaW51eCogT1MgICB8ICAgWWVzKDEsNSkgICAgfCAgWWVzKDIsNCkgICB8IFllcyg0LDYsNykgfAorfCBGcmVlQlNEKiAgICB8ICAgTm8gICAgICAgICAgfCAgTm8gICAgICAgICB8IFllcyg0LDYsNykgfAorfCBPUyBYKiAgICAgICB8ICAgWWVzKDEsMyw0KSAgfCAgTm8gICAgICAgICB8IFllcyg0LDYsNykgfAorfCBXaW5kb3dzKiBPUyB8ICAgWWVzKDEsNCkgICAgfCAgTm8gICAgICAgICB8IE5vICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisoMSkgT24gSUEtMzIgYXJjaGl0ZWN0dXJlIGFuZCBJbnRlbChSKSA2NCwgaWNjL2ljbCB2ZXJzaW9ucyAxMi54IGFyZSAKKyAgICBzdXBwb3J0ZWQgKDEyLjEgaXMgcmVjb21tZW5kZWQpLgorKDIpIGdjYyB2ZXJzaW9uIDQuNi4yIGlzIHN1cHBvcnRlZC4KKygzKSBGb3IgaWNjIG9uIE9TIFgqLCBPUyBYKiB2ZXJzaW9uIDEwLjUuOCBpcyBzdXBwb3J0ZWQuCisoNCkgSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlIG5vdCBzdXBwb3J0ZWQuCisoNSkgT24gSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlLCBpY2MvaWNsIHZlcnNpb25zIDEzLjAgCisgICAgb3IgbGF0ZXIgYXJlIHJlcXVpcmVkLgorKDYpIGNsYW5nIHZlcnNpb24gMy4zIGlzIHN1cHBvcnRlZC4KKyg3KSBjbGFuZyBjdXJyZW50bHkgZG9lcyBub3Qgb2ZmZXIgYSBzb2Z0d2FyZS1pbXBsZW1lbnRlZCAxMjggYml0IGV4dGVuZGVkIAorICAgIHByZWNpc2lvbiB0eXBlLiAgVGh1cywgYWxsIGVudHJ5IHBvaW50cyByZWxpYW50IG9uIHRoaXMgdHlwZSBhcmUgcmVtb3ZlZAorICAgIGZyb20gdGhlIGxpYnJhcnkgYW5kIGNhbm5vdCBiZSBjYWxsZWQgaW4gdGhlIHVzZXIgcHJvZ3JhbS4gIFRoZSBmb2xsb3dpbmcKKyAgICBmdW5jdGlvbnMgYXJlIG5vdCBhdmFpbGFibGU6CisgICAgX19rbXBjX2F0b21pY19jbXBseDE2XyoKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfKgorICAgIF9fa21wY19hdG9taWNfKl9mcAorCitGcm9udC1lbmQgQ29tcGlsZXJzIHRoYXQgd29yayB3aXRoIHRoaXMgUlRMCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBmb2xsb3dpbmcgY29tcGlsZXJzIGFyZSBrbm93biB0byBkbyBjb21wYXRpYmxlIGNvZGUgZ2VuZXJhdGlvbiBmb3IKK3RoaXMgUlRMOiAgaWNjL2ljbCwgZ2NjLiAgU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbC4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTm90aWNlcworPT09PT09PQorCisqT3RoZXIgbmFtZXMgYW5kIGJyYW5kcyBtYXkgYmUgY2xhaW1lZCBhcyB0aGUgcHJvcGVydHkgb2Ygb3RoZXJzLgpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9jbWFrZS9CdWlsZFBMUnVsZXMuY21ha2UgYi9maW5hbC9ydW50aW1lL2NtYWtlL0J1aWxkUExSdWxlcy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGIwZjJmCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9jbWFrZS9CdWlsZFBMUnVsZXMuY21ha2UKQEAgLTAsMCArMSwxMDAgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVGhpcyBmaWxlIGNvbnRhaW5zIGFkZGl0aW9uYWwgYnVpbGQgcnVsZXMgdGhhdCBjb3JyZXNwb25kIHRvIGJ1aWxkLnBsJ3MgcnVsZXMKKyMgQnVpbGRpbmcgbGliaW9tcDUuZGJnIGlzIGxpbnV4IG9ubHksIFdpbmRvd3Mgd2lsbCBidWlsZCBsaWJpb21wNW1kLmRsbC5wZGIKKyMKKyMgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMgQlVJTEQgREVQRU5ERU5DSUVTICMjIyMjIyMjIyMKKyMKKyMgICAgICAgIGV4cG9ydHMvLi4uL2xpYmlvbXA1LnNvICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0cy8uLi4vbGliaW9tcDUuZGJnCisjICAgICAgICBbY29weV0gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBbY29weV0KKyMgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisjICAgICAgICAgICAuL2xpYmlvbXA1LnNvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4vbGliaW9tcDUuZGJnCisjICAgIFtjb3B5XSAgICAvICBPUiAgXF9fX19fX19fX19fXyBbY29weV0gICAgICAgICAgICAgICAgICAgICAgICAgfCBbY29weV0KKyMgICAgICAgICAgICAgLyAgICAgICAgICAgICAgICAgICAgXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisjICAgIC4vdW5zdHJpcHBlZC9saWJpb21wNS5zbyAgIC4vc3RyaXBwZWQvbGliaW9tcDUuc28gICAuL3Vuc3RyaXBwZWQvbGliaW9tcDUuZGJnCisjICAgICAgICAgICAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcICAgICAgICAgICAgICAgIC8KKyMgICAgICAgICAgLyBbbGlua2luZ10gICAgICAgICAgICAgICAgICAgICAgICBcW3N0cmlwXSAgICAgICAvW3N0cmlwIGFuZCBzdG9yZV0KKyMgICAgICAgICAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCAgICAgICAgICAgIC8KKyMgICAgICR7b2Jqc30gKG1heWJlIGNvbXBpbGVkIHdpdGggLWcpICAgICAuL3Vuc3RyaXBwZWQvbGliaW9tcDUuc28gKGxpYnJhcnkgd2l0aCBkZWJ1ZyBpbmZvIGluIGl0KQorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgW2xpbmtpbmddCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtvYmpzfSAoYWx3YXlzIGNvbXBpbGVkIHdpdGggLWcpCisjCisjIEZvciBpY2MgTGludXggYnVpbGRzLCB3ZSBhbHdheXMgaW5jbHVkZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gdmlhIC1nIGFuZCBjcmVhdGUgbGliaW9tcDUuZGJnIAorIyBzbyB0aGF0IEludGVsKFIpIFBhcmFsbGVsIEFtcGxpZmllciBjYW4gdXNlIHRoZSAuZGJnIGZpbGUuCisjIEZvciBpY2MgV2luZG93cyBidWlsZHMsIHdlIGFsd2F5cyBpbmNsdWRlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB2aWEgLVppIGFuZCBjcmVhdGUgbGliaW9tcDUucGRiCisjIGluIGEgZmFzaGlvbiBzaW1pbGFyIHRvIGxpYmlvbXA1LmRiZworIyBGb3IgaWNjIE1hYyBidWlsZHMsIHdlIGRvbid0IGJvdGhlciB3aXRoIHRoZSBkZWJ1ZyBpbmZvLgorCisjIFdlIGJ1aWxkIGxpYnJhcnkgaW4gdW5zdHJpcHBlZCBkaXJlY3RvcnkKK2ZpbGUoTUFLRV9ESVJFQ1RPUlkgJHtidWlsZF9kaXJ9L3Vuc3RyaXBwZWQpCisKKyMgT25seSBidWlsZCB0aGUgLmRiZyBmaWxlIGZvciBSZWxlYXNlIGJ1aWxkcworIyBEZWJ1ZyBhbmQgUmVsV2l0aERlYkluZm8gYnVpbGRzIHNob3VsZCBub3QgY3JlYXRlIGEgLmRiZyBmaWxlLiAgCisjIFRoZSBkZWJ1ZyBpbmZvIHNob3VsZCByZW1haW4gaW4gdGhlIGxpYnJhcnkgZmlsZS4KK2lmKCR7TElOVVh9IEFORCAke1JFTEVBU0VfQlVJTER9KQorICAgIHNldChkYmdfZmlsZSAke2xpYl9pdGVtfS5kYmcpCitlbmRpZigpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIC0tLSBDcmVhdGUgJChsaWJfZmlsZSkuZGJnIC0tLQoraWYoTk9UICIke2RiZ19maWxlfSIgU1RSRVFVQUwgIiIpCisgICAgIyBpZiBhICR7ZGJnX2ZpbGV9IGZpbGUgaXMgZ29pbmcgdG8gYmUgY3JlYXRlZCwgdGhlbiAKKyAgICBmaWxlKE1BS0VfRElSRUNUT1JZICR7YnVpbGRfZGlyfS9zdHJpcHBlZCkKKworICAgICMgLi8ke2xpYl9maWxlfSA6IHN0cmlwcGVkLyR7bGliX2ZpbGV9CisgICAgIyAgICAgY29weSBzdHJpcHBlZC8ke2xpYl9maWxlfSAuLyR7bGliX2ZpbGV9CisgICAgc2ltcGxlX2NvcHlfcmVjaXBlKCIke2xpYl9maWxlfSIgICAiJHtidWlsZF9kaXJ9L3N0cmlwcGVkIiAgICIke2J1aWxkX2Rpcn0iKQorCisgICAgIyBzdHJpcHBlZC8ke2xpYl9maWxlfSA6IHVuc3RyaXBwZWQvJHtsaWJfZmlsZX0gLi8ke2RiZ19maWxlfQorICAgICMgICAgIG9iamNvcHkgLS1zdHJpcC1kZWJ1ZyB1bnN0cmlwcGVkLyR7bGliX2ZpbGV9IHN0cmlwcGVkLyR7bGliX2ZpbGV9LnRtcAorICAgICMgICAgIG9iamNvcHkgLS1hZGQtZ251LWRlYnVnbGluaz0ke2RiZ19maWxlfSBzdHJpcHBlZC8ke2xpYl9maWxlfS50bXAgc3RyaXBwZWQvJHtsaWJfZmlsZX0KKyAgICBhZGRfY3VzdG9tX2NvbW1hbmQoCisgICAgICAgIE9VVFBVVCAgJHtidWlsZF9kaXJ9L3N0cmlwcGVkLyR7bGliX2ZpbGV9CisgICAgICAgIENPTU1BTkQgJHtDTUFLRV9PQkpDT1BZfSAtLXN0cmlwLWRlYnVnICR7YnVpbGRfZGlyfS91bnN0cmlwcGVkLyR7bGliX2ZpbGV9ICR7YnVpbGRfZGlyfS9zdHJpcHBlZC8ke2xpYl9maWxlfS50bXAKKyAgICAgICAgQ09NTUFORCAke0NNQUtFX09CSkNPUFl9IC0tYWRkLWdudS1kZWJ1Z2xpbms9JHtkYmdfZmlsZX0gJHtidWlsZF9kaXJ9L3N0cmlwcGVkLyR7bGliX2ZpbGV9LnRtcCAke2J1aWxkX2Rpcn0vc3RyaXBwZWQvJHtsaWJfZmlsZX0KKyAgICAgICAgREVQRU5EUyAiJHtidWlsZF9kaXJ9LyR7ZGJnX2ZpbGV9IgorICAgICkKKworICAgICMgLi8ke2RiZ19maWxlfSA6IHVuc3RyaXBwZWQvJHtkYmdfZmlsZX0KKyAgICAjICAgICBjb3B5IHVuc3RyaXBwZWQvJHtkYmdfZmlsZX0gLi8ke2RiZ19maWxlfQorICAgIHNpbXBsZV9jb3B5X3JlY2lwZSgiJHtkYmdfZmlsZX0iICAgIiR7YnVpbGRfZGlyfS91bnN0cmlwcGVkIiAiJHtidWlsZF9kaXJ9IikKKworICAgICMgdW5zdHJpcHBlZC8ke2RiZ19maWxlfSA6IHVuc3RyaXBwZWQvJHtsaWJfZmlsZX0KKyAgICAjICAgICBvYmpjb3B5IC0tb25seS1rZWVwLWRlYnVnIHVuc3RyaXBwZWQvJHtsaWJfZmlsZX0gdW5zdHJpcHBlZC8ke2RiZ19maWxlfQorICAgIGFkZF9jdXN0b21fY29tbWFuZCgKKyAgICAgICAgT1VUUFVUICAke2J1aWxkX2Rpcn0vdW5zdHJpcHBlZC8ke2RiZ19maWxlfQorICAgICAgICBDT01NQU5EICR7Q01BS0VfT0JKQ09QWX0gLS1vbmx5LWtlZXAtZGVidWcgJHtidWlsZF9kaXJ9L3Vuc3RyaXBwZWQvJHtsaWJfZmlsZX0gJHtidWlsZF9kaXJ9L3Vuc3RyaXBwZWQvJHtkYmdfZmlsZX0gCisgICAgICAgIERFUEVORFMgaW9tcDUKKyAgICApCisgICAgCitlbHNlKCkKKworICAgICMgLi8ke2xpYl9maWxlfSA6IHVuc3RyaXBwZWQvJHtsaWJfZmlsZX0KKyAgICAjICAgICAgY29weSB1bnN0cmlwcGVkLyR7bGliX2ZpbGV9IC4vJHtsaWJfZmlsZX0KKyAgICBzaW1wbGVfY29weV9yZWNpcGUoIiR7bGliX2ZpbGV9IiAgICIke2J1aWxkX2Rpcn0vdW5zdHJpcHBlZCIgICIke2J1aWxkX2Rpcn0iKQorZW5kaWYoKQorCisjIFdpbmRvd3Mgc3BlY2lmaWMgY29tbWFuZCB0byBtb3ZlIGFyb3VuZCBkZWJ1ZyBpbmZvIGZpbGVzIHBvc3QtYnVpbGQKK2lmKE5PVCAiJHtwZGJfZmlsZX0iIFNUUkVRVUFMICIiIEFORCAke1JFTEVBU0VfQlVJTER9KQorICAgIGFkZF9jdXN0b21fY29tbWFuZChUQVJHRVQgaW9tcDUgUE9TVF9CVUlMRAorICAgICAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgcmVuYW1lICR7cGRiX2ZpbGV9ICR7cGRiX2ZpbGV9Lm5vbnN0cmlwcGVkCisgICAgICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSByZW5hbWUgJHtwZGJfZmlsZX0uc3RyaXBwZWQgJHtwZGJfZmlsZX0KKyAgICApCitlbmRpZigpCisKKyMgSGF2ZSBpY2MgYnVpbGQgbGliaW9tcDUgaW4gdW5zdHJpcHBlZCBkaXJlY3RvcnkKK3NldF90YXJnZXRfcHJvcGVydGllcyhpb21wNSBQUk9QRVJUSUVTIAorICAgIExJQlJBUllfT1VUUFVUX0RJUkVDVE9SWSAiJHtidWlsZF9kaXJ9L3Vuc3RyaXBwZWQiIAorICAgIFJVTlRJTUVfT1VUUFVUX0RJUkVDVE9SWSAiJHtidWlsZF9kaXJ9L3Vuc3RyaXBwZWQiCisgICAgQVJDSElWRV9PVVRQVVRfRElSRUNUT1JZICIke2J1aWxkX2Rpcn0iCispCisKKyMgQWx3YXlzIHVzZSBSZWxXaXRoRGViSW5mbyBmbGFncyBmb3IgUmVsZWFzZSBidWlsZHMgd2hlbiB1c2luZyB0aGUgYnVpbGQucGwncyBidWlsZCBydWxlcyAodXNlIC1nIC1PMiBpbnN0ZWFkIG9mIGp1c3QgLU8zKQorIyBUaGUgZGVidWcgaW5mbyBpcyB0aGVuIHN0cmlwcGVkIG91dCBhdCB0aGUgZW5kIG9mIHRoZSBidWlsZCBhbmQgcHV0IGludG8gbGliaW9tcDUuZGJnIGZvciBMaW51eAoraWYoJHtSRUxFQVNFX0JVSUxEfSBBTkQgTk9UICR7TUFDfSkKKyAgICBzZXQoQ01BS0VfQ19GTEFHU19SRUxFQVNFICAgJHtDTUFLRV9DX0ZMQUdTX1JFTFdJVEhERUJJTkZPfSAgKQorICAgIHNldChDTUFLRV9DWFhfRkxBR1NfUkVMRUFTRSAke0NNQUtFX0NYWF9GTEFHU19SRUxXSVRIREVCSU5GT30pCisgICAgc2V0KENNQUtFX0FTTV9GTEFHU19SRUxFQVNFICR7Q01BS0VfQVNNX0ZMQUdTX1JFTFdJVEhERUJJTkZPfSkKK2VuZGlmKCkKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9jbWFrZS9DbGFuZy9Bc21GbGFncy5jbWFrZSBiL2ZpbmFsL3J1bnRpbWUvY21ha2UvQ2xhbmcvQXNtRmxhZ3MuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIzZTZiOQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvY21ha2UvQ2xhbmcvQXNtRmxhZ3MuY21ha2UKQEAgLTAsMCArMSwxNiBAQAorIyBUaGlzIGZpbGUgaG9sZHMgQ2xhbmcgKGNsYW5nL2NsYW5nKyspIHNwZWNpZmljIGNvbXBpbGVyIGRlcGVuZGVudCBmbGFncworIyBUaGUgZmxhZyB0eXBlcyBhcmU6CisjICAgMSkgQXNzZW1ibHkgZmxhZ3MKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEFzc2VtYmx5IGZsYWdzCitmdW5jdGlvbihhcHBlbmRfYXNzZW1ibGVyX3NwZWNpZmljX2FzbV9mbGFncyBpbnB1dF9hc21fZmxhZ3MpCisgICAgc2V0KGxvY2FsX2FzbV9mbGFncykKKyAgICBhcHBlbmRfYXNtX2ZsYWdzKCIteCBhc3NlbWJsZXItd2l0aC1jcHAiKSAjIEFzc2VtYmx5IGZpbGUgdGhhdCBuZWVkcyB0byBiZSBwcmVwcm9jZXNzZWQKKyAgICBpZigke0lBMzJ9KQorICAgICAgICBhcHBlbmRfYXNtX2ZsYWdzKCItbTMyIikgIyBHZW5lcmF0ZSAzMiBiaXQgSUEtMzIgYXJjaGl0ZWN0dXJlIGNvZGUgCisgICAgICAgIGFwcGVuZF9hc21fZmxhZ3MoIi1tc3NlMiIpICMgQWxsb3cgdXNlIG9mIFN0cmVhbWluZyBTSU1EIEluc3RydWN0aW9ucworICAgIGVuZGlmKCkKKyAgICBzZXQoJHtpbnB1dF9hc21fZmxhZ3N9ICR7JHtpbnB1dF9hc21fZmxhZ3N9fSAiJHtsb2NhbF9hc21fZmxhZ3N9IiBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvY21ha2UvQ2xhbmcvQ0ZsYWdzLmNtYWtlIGIvZmluYWwvcnVudGltZS9jbWFrZS9DbGFuZy9DRmxhZ3MuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRlMTgwOQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvY21ha2UvQ2xhbmcvQ0ZsYWdzLmNtYWtlCkBAIC0wLDAgKzEsMzggQEAKKyMgVGhpcyBmaWxlIGhvbGRzIENsYW5nIChjbGFuZy9jbGFuZysrKSBzcGVjaWZpYyBjb21waWxlciBkZXBlbmRlbnQgZmxhZ3MKKyMgVGhlIGZsYWcgdHlwZXMgYXJlOgorIyAgIDEpIEMvQysrIENvbXBpbGVyIGZsYWdzCisjICAgMikgTGlua2VyIGZsYWdzCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDL0MrKyBDb21waWxlciBmbGFncworZnVuY3Rpb24oYXBwZW5kX2NvbXBpbGVyX3NwZWNpZmljX2NfYW5kX2N4eF9mbGFncyBpbnB1dF9jX2ZsYWdzIGlucHV0X2N4eF9mbGFncykKKyAgICBzZXQobG9jYWxfY19mbGFncykKKyAgICBzZXQobG9jYWxfY3h4X2ZsYWdzKQorICAgIGFwcGVuZF9jX2FuZF9jeHhfZmxhZ3MoIi1zdGQ9YysrMHgiKSAjIEVuYWJsZXMgc3VwcG9ydCBmb3IgbWFueSBDKysxMSAoZm9ybWVybHkga25vd24gYXMgQysrMHgpIGZlYXR1cmVzLiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgbW9zdCByZWNlbnRseSBhZGRlZCBmZWF0dXJlczoKKyAgICBhcHBlbmRfY19hbmRfY3h4X2ZsYWdzKCItZm5vLWV4Y2VwdGlvbnMiKSAjIEV4Y2VwdGlvbiBoYW5kbGluZyB0YWJsZSBnZW5lcmF0aW9uIGlzIGRpc2FibGVkLgorICAgIGFwcGVuZF9jX2FuZF9jeHhfZmxhZ3MoIi14IGMrKyIpICMgQ29tcGlsZSBDIGZpbGVzIGFzIEMrKyBmaWxlcworICAgIGlmKCR7SUEzMn0pCisgICAgICAgIGFwcGVuZF9jX2FuZF9jeHhfZmxhZ3MoIi1tMzIiKSAjIEdlbmVyYXRlIDMyIGJpdCBJQS0zMiBhcmNoaXRlY3R1cmUgY29kZQorICAgICAgICBhcHBlbmRfY19hbmRfY3h4X2ZsYWdzKCItbXNzZTIiKSAjIEFsbG93IHVzZSBvZiBTdHJlYW1pbmcgU0lNRCBJbnN0cnVjdGlvbnMKKyAgICBlbHNlaWYoJHtBUk19KQorICAgICAgICBhcHBlbmRfY19hbmRfY3h4X2ZsYWdzKCItbWFybSIpICMgVGFyZ2V0IHRoZSBBUk0gYXJjaGl0ZWN0dXJlCisgICAgZW5kaWYoKQorICAgIGFwcGVuZF9jX2FuZF9jeHhfZmxhZ3MoIi1Xbm8tdW51c2VkLXZhbHVlIikgIyBEb24ndCB3YXJuIGFib3V0IHVudXNlZCB2YWx1ZXMKKyAgICBhcHBlbmRfY19hbmRfY3h4X2ZsYWdzKCItV25vLXN3aXRjaCIpICMgRG9uJ3Qgd2FybiBhYm91dCBzd2l0Y2ggc3RhdGVtZW50cyB0aGF0IGRvbid0IGNvdmVyIGVudGlyZSByYW5nZSBvZiB2YWx1ZXMKKyAgICBzZXQoJHtpbnB1dF9jX2ZsYWdzfSAgICR7JHtpbnB1dF9jX2ZsYWdzfX0gICAiJHtsb2NhbF9jX2ZsYWdzfSIgUEFSRU5UX1NDT1BFKQorICAgIHNldCgke2lucHV0X2N4eF9mbGFnc30gJHske2lucHV0X2N4eF9mbGFnc319ICIke2xvY2FsX2N4eF9mbGFnc30iIFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIExpbmtlciBmbGFncworZnVuY3Rpb24oYXBwZW5kX2NvbXBpbGVyX3NwZWNpZmljX2xpbmtlcl9mbGFncyBpbnB1dF9sZF9mbGFncyBpbnB1dF9sZF9mbGFnc19saWJzKQorICAgIHNldChsb2NhbF9sZF9mbGFncykKKyAgICBzZXQobG9jYWxfbGRfZmxhZ3NfbGlicykKKyAgICBpZigke0lBMzJ9KQorICAgICAgICBhcHBlbmRfbGlua2VyX2ZsYWdzKCItbTMyIikKKyAgICAgICAgYXBwZW5kX2xpbmtlcl9mbGFncygiLW1zc2UyIikKKyAgICBlbmRpZigpCisgICAgc2V0KCR7aW5wdXRfbGRfZmxhZ3N9ICAgICAgJHske2lucHV0X2xkX2ZsYWdzfX0gICAgICAiJHtsb2NhbF9sZF9mbGFnc30iICAgICAgIFBBUkVOVF9TQ09QRSkKKyAgICBzZXQoJHtpbnB1dF9sZF9mbGFnc19saWJzfSAkeyR7aW5wdXRfbGRfZmxhZ3NfbGlic319ICIke2xvY2FsX2xkX2ZsYWdzX2xpYnN9IiAgUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQorCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL2NtYWtlL0NvbW1vbkZsYWdzLmNtYWtlIGIvZmluYWwvcnVudGltZS9jbWFrZS9Db21tb25GbGFncy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDFhM2M0Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9jbWFrZS9Db21tb25GbGFncy5jbWFrZQpAQCAtMCwwICsxLDEzMyBAQAorIyBUaGlzIGZpbGUgaG9sZHMgdGhlIGNvbW1vbiBmbGFncyBpbmRlcGVuZGVudCBvZiBjb21waWxlcgorIyBUaGUgZmxhZyB0eXBlcyBhcmU6IAorIyAgIDEpIEFzc2VtYmx5IGZsYWdzICAgICAgICAgIChhcHBlbmRfYXNtX2ZsYWdzX2NvbW1vbikKKyMgICAyKSBDL0MrKyBDb21waWxlciBmbGFncyAgICAoYXBwZW5kX2NfYW5kX2N4eF9mbGFnc19jb21tb24pCisjICAgMykgRm9ydHJhbiBDb21waWxlciBmbGFncyAgKGFwcGVuZF9mb3J0X2ZsYWdzX2NvbW1vbikKKyMgICA0KSBMaW5rZXIgZmxhZ3MgICAgICAgICAgICAoYXBwZW5kX2xpbmtlcl9mbGFnc19jb21tb24pCisjICAgNSkgQXJjaGl2ZXIgZmxhZ3MgICAgICAgICAgKGFwcGVuZF9hcmNoaXZlcl9mbGFnc19jb21tb24pCisKKyMgVGhlc2UgYXBwZW5kXyogbWFjcm9zIGFsbCBhcHBlbmQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgbGlzdCB2YXJpYWJsZSBob2xkaW5nIHRoZSBmbGFncy4KK21hY3JvKGFwcGVuZF9jX2ZsYWdzIG5ld19mbGFnKQorICAgIGxpc3QoQVBQRU5EIGxvY2FsX2NfZmxhZ3MgICAgIiR7bmV3X2ZsYWd9IikKK2VuZG1hY3JvKCkKKworbWFjcm8oYXBwZW5kX2N4eF9mbGFncyBuZXdfZmxhZykKKyAgICBsaXN0KEFQUEVORCBsb2NhbF9jeHhfZmxhZ3MgICIke25ld19mbGFnfSIpCitlbmRtYWNybygpCisKK21hY3JvKGFwcGVuZF9jX2FuZF9jeHhfZmxhZ3MgbmV3X2ZsYWcpCisgICAgYXBwZW5kX2NfZmxhZ3MoIiR7bmV3X2ZsYWd9IikKKyAgICBhcHBlbmRfY3h4X2ZsYWdzKCIke25ld19mbGFnfSIpCitlbmRtYWNybygpCisKK21hY3JvKGFwcGVuZF9hc21fZmxhZ3MgbmV3X2ZsYWcpCisgICAgbGlzdChBUFBFTkQgbG9jYWxfYXNtX2ZsYWdzICAiJHtuZXdfZmxhZ30iKQorZW5kbWFjcm8oKQorCittYWNybyhhcHBlbmRfZm9ydF9mbGFncyBuZXdfZmxhZykKKyAgICBsaXN0KEFQUEVORCBsb2NhbF9mb3J0X2ZsYWdzICIke25ld19mbGFnfSIpCitlbmRtYWNybygpCisKKyMgVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBsaW5rZXJfZmxhZ3MgYW5kIGxpbmtlcl9mbGFnc19saWJzIGlzIGxpbmtlcl9mbGFnc19saWJzCisjIGlzIHB1dCBhdCB0aGUgZW5kIG9mIHRoZSBsaW5rZXIgY29tbWFuZCB3aGVyZSBsaW5raW5nIGxpYnJhcmllcyBzaG91bGQgYmUgZG9uZS4KK21hY3JvKGFwcGVuZF9saW5rZXJfZmxhZ3MgbmV3X2ZsYWcpCisgICAgbGlzdChBUFBFTkQgbG9jYWxfbGRfZmxhZ3MgICAiJHtuZXdfZmxhZ30iKQorZW5kbWFjcm8oKQorCittYWNybyhhcHBlbmRfbGlua2VyX2ZsYWdzX2xpYnJhcnkgbmV3X2ZsYWcpCisgICAgbGlzdChBUFBFTkQgbG9jYWxfbGRfZmxhZ3NfbGlicyAiJHtuZXdfZmxhZ30iKQorZW5kbWFjcm8oKQorCittYWNybyhhcHBlbmRfYXJjaGl2ZXJfZmxhZ3MgbmV3X2ZsYWcpCisgICAgbGlzdChBUFBFTkQgbG9jYWxfYXJfZmxhZ3MgICAiJHtuZXdfZmxhZ30iKQorZW5kbWFjcm8oKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgR2xvYmFsIEFzc2VtYmx5IGZsYWdzCitmdW5jdGlvbihhcHBlbmRfYXNtX2ZsYWdzX2NvbW1vbiBpbnB1dF9hc21fZmxhZ3MpCisgICAgc2V0KGxvY2FsX2FzbV9mbGFncykKKyAgICBzZXQoJHtpbnB1dF9hc21fZmxhZ3N9ICIkeyR7aW5wdXRfYXNtX2ZsYWdzfX0iICIke2xvY2FsX2FzbV9mbGFnc30iICIke1VTRVJfQVNNX0ZMQUdTfSIgUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgR2xvYmFsIEMvQysrIENvbXBpbGVyIGZsYWdzCitmdW5jdGlvbihhcHBlbmRfY19hbmRfY3h4X2ZsYWdzX2NvbW1vbiBpbnB1dF9jX2ZsYWdzIGlucHV0X2N4eF9mbGFncykKKyAgICBzZXQobG9jYWxfY19mbGFncykKKyAgICBzZXQobG9jYWxfY3h4X2ZsYWdzKQorICAgIHNldCgke2lucHV0X2NfZmxhZ3N9ICAgIiR7JHtpbnB1dF9jX2ZsYWdzfX0iICAgIiR7bG9jYWxfY19mbGFnc30iICAgIiR7VVNFUl9DX0ZMQUdTfSIgICBQQVJFTlRfU0NPUEUpCisgICAgc2V0KCR7aW5wdXRfY3h4X2ZsYWdzfSAiJHske2lucHV0X2N4eF9mbGFnc319IiAiJHtsb2NhbF9jeHhfZmxhZ3N9IiAiJHtVU0VSX0NYWF9GTEFHU30iIFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEdsb2JhbCBGb3J0cmFuIENvbXBpbGVyIGZsYWdzIChmb3IgY3JlYXRpbmcgLm1vZCBmaWxlcykKK2Z1bmN0aW9uKGFwcGVuZF9mb3J0X2ZsYWdzX2NvbW1vbiBpbnB1dF9mb3J0X2ZsYWdzKQorICAgIHNldChsb2NhbF9mb3J0X2ZsYWdzKQorICAgIHNldCgke2lucHV0X2ZvcnRfZmxhZ3N9ICIkeyR7aW5wdXRfZm9ydF9mbGFnc319IiAiJHtsb2NhbF9mb3J0X2ZsYWdzfSIgIiR7VVNFUl9GX0ZMQUdTfSIgUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTGlua2VyIGZsYWdzCitmdW5jdGlvbihhcHBlbmRfbGlua2VyX2ZsYWdzX2NvbW1vbiBpbnB1dF9sZF9mbGFncyBpbnB1dF9sZF9mbGFnc19saWJzKQorICAgIHNldChsb2NhbF9sZF9mbGFncykKKyAgICBzZXQobG9jYWxfbGRfZmxhZ3NfbGlicykKKworICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMgV2luZG93cyBsaW5rZXIgZmxhZ3MKKyAgICBpZigke1dJTkRPV1N9KSAKKworICAgICMjIyMjIyMjIyMjIyMjIyMjIworICAgICMgTUFDIGxpbmtlciBmbGFncworICAgIGVsc2VpZigke01BQ30pCisgICAgICAgIGlmKCR7VVNFX1BSRURFRklORURfTElOS0VSX0ZMQUdTfSkKKyAgICAgICAgICAgIGFwcGVuZF9saW5rZXJfZmxhZ3MoIi1zaW5nbGVfbW9kdWxlIikKKyAgICAgICAgICAgIGFwcGVuZF9saW5rZXJfZmxhZ3MoIi1jdXJyZW50X3ZlcnNpb24gJHt2ZXJzaW9ufS4wIikKKyAgICAgICAgICAgIGFwcGVuZF9saW5rZXJfZmxhZ3MoIi1jb21wYXRpYmlsaXR5X3ZlcnNpb24gJHt2ZXJzaW9ufS4wIikKKyAgICAgICAgZW5kaWYoKQorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZSAoSW50ZWwoUikgTUlDIEFyY2hpdGVjdHVyZSkgbGlua2VyIGZsYWdzCisgICAgZWxzZWlmKCR7TUlDfSkKKyAgICAgICAgaWYoJHtVU0VfUFJFREVGSU5FRF9MSU5LRVJfRkxBR1N9KQorICAgICAgICAgICAgYXBwZW5kX2xpbmtlcl9mbGFncygiLVdsLC14IikKKyAgICAgICAgICAgIGFwcGVuZF9saW5rZXJfZmxhZ3MoIi1XbCwtLXdhcm4tc2hhcmVkLXRleHRyZWwiKSAjICBXYXJuIGlmIHRoZSBsaW5rZXIgYWRkcyBhIERUX1RFWFRSRUwgdG8gYSBzaGFyZWQgb2JqZWN0LgorICAgICAgICAgICAgYXBwZW5kX2xpbmtlcl9mbGFncygiLVdsLC0tYXMtbmVlZGVkIikKKyAgICAgICAgICAgIGFwcGVuZF9saW5rZXJfZmxhZ3MoIi1XbCwtLXZlcnNpb24tc2NyaXB0PSR7c3JjX2Rpcn0vZXhwb3J0c19zby50eHQiKSAjIFVzZSBleHBvcnRzX3NvLnR4dCBhcyB2ZXJzaW9uIHNjcmlwdCB0byBjcmVhdGUgdmVyc2lvbmVkIHN5bWJvbHMgZm9yIEVMRiBsaWJyYXJpZXMKKyAgICAgICAgICAgIGlmKE5PVCAke1NUVUJTX0xJQlJBUll9KQorICAgICAgICAgICAgICAgIGFwcGVuZF9saW5rZXJfZmxhZ3NfbGlicmFyeSgiLXB0aHJlYWQiKSAjIGxpbmsgaW4gcHRocmVhZCBsaWJyYXJ5CisgICAgICAgICAgICAgICAgYXBwZW5kX2xpbmtlcl9mbGFnc19saWJyYXJ5KCItbGRsIikgIyBsaW5rIGluIGxpYmRsIChkeW5hbWljIGxvYWRlciBsaWJyYXJ5KQorICAgICAgICAgICAgZW5kaWYoKQorICAgICAgICAgICAgaWYoJHtTVEFUU19HQVRIRVJJTkd9KQorICAgICAgICAgICAgICAgIGFwcGVuZF9saW5rZXJfZmxhZ3NfbGlicmFyeSgiLVdsLC1sc3RkYysrIikgIyBsaW5rIGluIHN0YW5kYXJkIGMrKyBsaWJyYXJ5IChzdGF0cy1nYXRoZXJpbmcgbmVlZHMgaXQpCisgICAgICAgICAgICBlbmRpZigpCisgICAgICAgIGVuZGlmKCkKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIyBVbml4IGJhc2VkIGxpbmtlciBmbGFncworICAgIGVsc2UoKQorICAgICAgICAjIEZvciBub3csIGFsd2F5cyBpbmNsdWRlIC0tdmVyc2lvbi1zY3JpcHQgZmxhZyBvbiBVbml4IHN5c3RlbXMuCisgICAgICAgIGFwcGVuZF9saW5rZXJfZmxhZ3MoIi1XbCwtLXZlcnNpb24tc2NyaXB0PSR7c3JjX2Rpcn0vZXhwb3J0c19zby50eHQiKSAjIFVzZSBleHBvcnRzX3NvLnR4dCBhcyB2ZXJzaW9uIHNjcmlwdCB0byBjcmVhdGUgdmVyc2lvbmVkIHN5bWJvbHMgZm9yIEVMRiBsaWJyYXJpZXMKKyAgICAgICAgaWYoJHtVU0VfUFJFREVGSU5FRF9MSU5LRVJfRkxBR1N9KQorICAgICAgICAgICAgYXBwZW5kX2xpbmtlcl9mbGFncygiLVdsLC16LG5vZXhlY3N0YWNrIikgIyAgTWFya3MgdGhlIG9iamVjdCBhcyBub3QgcmVxdWlyaW5nIGV4ZWN1dGFibGUgc3RhY2suCisgICAgICAgICAgICBhcHBlbmRfbGlua2VyX2ZsYWdzKCItV2wsLS1hcy1uZWVkZWQiKSAgICAjICBPbmx5IGFkZHMgbGlicmFyeSBkZXBlbmRlbmNpZXMgYXMgdGhleSBhcmUgbmVlZGVkLiAoaWYgbGliaW9tcDUgYWN0dWFsbHkgdXNlcyBhIGZ1bmN0aW9uIGZyb20gdGhlIGxpYnJhcnksIHRoZW4gYWRkIGl0KQorICAgICAgICAgICAgaWYoTk9UICR7U1RVQlNfTElCUkFSWX0pCisgICAgICAgICAgICAgICAgYXBwZW5kX2xpbmtlcl9mbGFncygiLVdsLC0td2Fybi1zaGFyZWQtdGV4dHJlbCIpICMgIFdhcm4gaWYgdGhlIGxpbmtlciBhZGRzIGEgRFRfVEVYVFJFTCB0byBhIHNoYXJlZCBvYmplY3QuCisgICAgICAgICAgICAgICAgYXBwZW5kX2xpbmtlcl9mbGFncygiLVdsLC1maW5pPV9fa21wX2ludGVybmFsX2VuZF9maW5pIikgIyBXaGVuIGNyZWF0aW5nIGFuIEVMRiBleGVjdXRhYmxlIG9yIHNoYXJlZCBvYmplY3QsIGNhbGwgTkFNRSB3aGVuIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGV4ZWN1dGFibGUgb3Igc2hhcmVkIG9iamVjdCBpcyB1bmxvYWRlZCwgYnkgc2V0dGluZyBEVF9GSU5JIHRvIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uLiAgQnkgZGVmYXVsdCwgdGhlIGxpbmtlciB1c2VzICJfZmluaSIgYXMgdGhlIGZ1bmN0aW9uIHRvIGNhbGwuCisgICAgICAgICAgICAgICAgYXBwZW5kX2xpbmtlcl9mbGFnc19saWJyYXJ5KCItcHRocmVhZCIpICMgbGluayBwdGhyZWFkIGxpYnJhcnkKKyAgICAgICAgICAgICAgICBpZihOT1QgJHtGUkVFQlNEfSkKKyAgICAgICAgICAgICAgICAgICAgYXBwZW5kX2xpbmtlcl9mbGFnc19saWJyYXJ5KCItV2wsLWxkbCIpICMgbGluayBpbiBsaWJkbCAoZHluYW1pYyBsb2FkZXIgbGlicmFyeSkKKyAgICAgICAgICAgICAgICBlbmRpZigpCisgICAgICAgICAgICBlbmRpZigpCisgICAgICAgIGVuZGlmKCkgIyBpZigke1VTRV9QUkVERUZJTkVEX0xJTktFUl9GTEFHU30pCisgICAgZW5kaWYoKSAjIGlmKCR7T1BFUkFUSU5HX1NZU1RFTX0pIC4uLgorCisgICAgc2V0KCR7aW5wdXRfbGRfZmxhZ3N9ICAgICAgIiR7JHtpbnB1dF9sZF9mbGFnc319IiAgICAgICIke2xvY2FsX2xkX2ZsYWdzfSIgICAgICAiJHtVU0VSX0xEX0ZMQUdTfSIgICAgIFBBUkVOVF9TQ09QRSkKKyAgICBzZXQoJHtpbnB1dF9sZF9mbGFnc19saWJzfSAiJHske2lucHV0X2xkX2ZsYWdzX2xpYnN9fSIgIiR7bG9jYWxfbGRfZmxhZ3NfbGlic30iICIke1VTRVJfTERfTElCX0ZMQUdTfSIgUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQXJjaGl2ZXIgRmxhZ3MKK2Z1bmN0aW9uKGFwcGVuZF9hcmNoaXZlcl9mbGFnc19jb21tb24gaW5wdXRfYXJfZmxhZ3MpCisgICAgc2V0KGxvY2FsX2FyX2ZsYWdzKQorICAgIHNldCgke2lucHV0X2FyX2ZsYWdzfSAiJHske2lucHV0X2FyX2ZsYWdzfX0iICIke2xvY2FsX2FyX2ZsYWdzfSIgUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQorCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL2NtYWtlL0RlZmluaXRpb25zLmNtYWtlIGIvZmluYWwvcnVudGltZS9jbWFrZS9EZWZpbml0aW9ucy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGQxMWFiCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9jbWFrZS9EZWZpbml0aW9ucy5jbWFrZQpAQCAtMCwwICsxLDEzOCBAQAorIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCisjIHZvaWQgYXBwZW5kX2RlZmluaXRpb25zKHN0cmluZyBuZXdfZmxhZyk7CisjIC0gYXBwZW5kcyBuZXdfZmxhZyB0byBjcHBfZmxhZ3MgbGlzdAorbWFjcm8oYXBwZW5kX2RlZmluaXRpb25zIG5ld19mbGFnKQorICAgIGxpc3QoQVBQRU5EIGxvY2FsX2NwcF9mbGFncyAiJHtuZXdfZmxhZ30iKQorZW5kbWFjcm8oKQorCitmdW5jdGlvbihhcHBlbmRfY3BwX2ZsYWdzIGlucHV0X2NwcF9mbGFncykKKyAgICBzZXQobG9jYWxfY3BwX2ZsYWdzKQorCisgICAgYXBwZW5kX2RlZmluaXRpb25zKCItRCBVU0VfSVRUX0JVSUxEIikKKyAgICBhcHBlbmRfZGVmaW5pdGlvbnMoIi1EIEtNUF9BUkNIX1NUUj1cIlxcXFxcIiR7bGVnYWxfYXJjaH1cXFxcXCJcIiIpCisgICAgYXBwZW5kX2RlZmluaXRpb25zKCItRCBCVUlMRF9JOCIpCisgICAgYXBwZW5kX2RlZmluaXRpb25zKCItRCBLTVBfTElCUkFSWV9GSUxFPVxcXFxcIiR7bGliX2ZpbGV9XFxcXFwiIikgIyB5ZXMuLi4geW91IG5lZWQgNSBiYWNrc2xhc2hlcy4uLgorICAgIGFwcGVuZF9kZWZpbml0aW9ucygiLUQgS01QX1ZFUlNJT05fTUFKT1I9JHt2ZXJzaW9ufSIpCisgICAgCisgICAgIyBjdXN0b21pemUgdG8gMTI4IGJ5dGVzIGZvciBwcGM2NAorICAgIGlmKCR7UFBDNjR9KQorICAgIAlhcHBlbmRfZGVmaW5pdGlvbnMoIi1EIENBQ0hFX0xJTkU9MTI4IikKKyAgICBlbHNlKCkKKyAgICAJYXBwZW5kX2RlZmluaXRpb25zKCItRCBDQUNIRV9MSU5FPTY0IikKKyAgICBlbmRpZigpCisgICAgCisgICAgYXBwZW5kX2RlZmluaXRpb25zKCItRCBLTVBfQURKVVNUX0JMT0NLVElNRT0xIikKKyAgICBhcHBlbmRfZGVmaW5pdGlvbnMoIi1EIEJVSUxEX1BBUkFMTEVMX09SREVSRUQiKQorICAgIGFwcGVuZF9kZWZpbml0aW9ucygiLUQgS01QX0FTTV9JTlRSSU5TIikKKyAgICBpZigke1VTRV9JVFRfTk9USUZZfSkKKyAgICAgICAgYXBwZW5kX2RlZmluaXRpb25zKCItRCBVU0VfSVRUX05PVElGWT0xIikKKyAgICBlbHNlKCkKKyAgICAgICAgYXBwZW5kX2RlZmluaXRpb25zKCItRCBVU0VfSVRUX05PVElGWT0wIikKKyAgICAgICAgYXBwZW5kX2RlZmluaXRpb25zKCItRCBJTlRFTF9OT19JVFROT1RJRllfQVBJIikKKyAgICBlbmRpZigpCisgICAgYXBwZW5kX2RlZmluaXRpb25zKCItRCBJTlRFTF9JVFROT1RJRllfUFJFRklYPV9fa21wX2l0dF8iKQorCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIyBXaW5kb3dzIGRlZmluaXRpb25zCisgICAgaWYoJHtXSU5ET1dTfSkKKyAgICAgICAgYXBwZW5kX2RlZmluaXRpb25zKCItRCBfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyIpCisgICAgICAgIGFwcGVuZF9kZWZpbml0aW9ucygiLUQgX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIikKKyAgICAgICAgYXBwZW5kX2RlZmluaXRpb25zKCItRCBfV0lORE9XUyIpCisgICAgICAgIGFwcGVuZF9kZWZpbml0aW9ucygiLUQgX1dJTk5UIikKKyAgICAgICAgYXBwZW5kX2RlZmluaXRpb25zKCItRCBfV0lOMzJfV0lOTlQ9MHgwNTAxIikKKyAgICAgICAgYXBwZW5kX2RlZmluaXRpb25zKCItRCBLTVBfV0lOX0NERUNMIikKKyAgICAgICAgYXBwZW5kX2RlZmluaXRpb25zKCItRCBfVVNSRExMIikKKyAgICAgICAgaWYoJHtERUJVR19CVUlMRH0pCisgICAgICAgICAgICBhcHBlbmRfZGVmaW5pdGlvbnMoIi1EIF9JVEVSQVRPUl9ERUJVR19MRVZFTD0wIikKKyAgICAgICAgZW5kaWYoKQorICAgIGVsc2UoKSAjIE90aGVyIHRoYW4gd2luZG93cy4uLiAoVW5peCBiYXNlZCBzeXN0ZW1zLCBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUgKEludGVsKFIpIE1JQyBBcmNoaXRlY3R1cmUpLCBhbmQgTWFjKQorICAgICAgICBhcHBlbmRfZGVmaW5pdGlvbnMoIi1EIF9HTlVfU09VUkNFIikKKyAgICAgICAgYXBwZW5kX2RlZmluaXRpb25zKCItRCBfUkVFTlRSQU5UIikKKyAgICAgICAgYXBwZW5kX2RlZmluaXRpb25zKCItRCBCVUlMRF9UViIpCisgICAgICAgIGFwcGVuZF9kZWZpbml0aW9ucygiLUQgVVNFX0NCTEtEQVRBIikKKyAgICAgICAgaWYoTk9UICIke3ZlcnNpb259IiBTVFJFUVVBTCAiNCIpCisgICAgICAgICAgICBhcHBlbmRfZGVmaW5pdGlvbnMoIi1EIEtNUF9HT01QX0NPTVBBVCIpCisgICAgICAgIGVuZGlmKCkKKyAgICBlbmRpZigpCisKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjIEludGVsKFIpIE1JQyBBcmNoaXRlY3R1cmUgZGVmaW5pdGlvbnMKKyAgICBpZigke01JQ30pCisgICAgICAgIGFwcGVuZF9kZWZpbml0aW9ucygiLUQgS01QX1REQVRBX0dUSUQiKQorICAgIGVsc2UoKSAjIE90aGVyIHRoYW4gSW50ZWwoUikgTUlDIEFyY2hpdGVjdHVyZS4uLgorICAgICAgICBhcHBlbmRfZGVmaW5pdGlvbnMoIi1EIFVTRV9MT0FEX0JBTEFOQ0UiKQorICAgIGVuZGlmKCkKKworICAgICMjIyMjIyMjIyMjIyMjIyMjIworICAgICMgVW5peCBkZWZpbml0aW9ucworICAgIGlmKCR7TElOVVh9KQorICAgICAgICBhcHBlbmRfZGVmaW5pdGlvbnMoIi1EIEtNUF9UREFUQV9HVElEIikKKyAgICBlbmRpZigpCisKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIyBPdGhlciBjb25kaXRpb25hbCBkZWZpbml0aW9ucworICAgIGFwcGVuZF9kZWZpbml0aW9ucygiLUQgS01QX1VTRV9BU1NFUlQiKQorICAgIGFwcGVuZF9kZWZpbml0aW9ucygiLUQgR1VJREVETExfRVhQT1JUUyIpIAorICAgIGlmKCR7U1RVQlNfTElCUkFSWX0pIAorICAgICAgICBhcHBlbmRfZGVmaW5pdGlvbnMoIi1EIEtNUF9TVFVCIikgCisgICAgZW5kaWYoKQorICAgIGlmKCR7REVCVUdfQlVJTER9IE9SICR7UkVMV0lUSERFQklORk9fQlVJTER9KSAKKyAgICAgICAgYXBwZW5kX2RlZmluaXRpb25zKCItRCBLTVBfREVCVUciKSAKKyAgICBlbmRpZigpCisgICAgaWYoJHtERUJVR19CVUlMRH0pCisgICAgICAgIGFwcGVuZF9kZWZpbml0aW9ucygiLUQgX0RFQlVHIikKKyAgICAgICAgYXBwZW5kX2RlZmluaXRpb25zKCItRCBCVUlMRF9ERUJVRyIpCisgICAgZW5kaWYoKQorICAgIGlmKCR7U1RBVFNfR0FUSEVSSU5HfSkKKyAgICAgICAgYXBwZW5kX2RlZmluaXRpb25zKCItRCBLTVBfU1RBVFNfRU5BQkxFRD0xIikKKyAgICBlbHNlKCkKKyAgICAgICAgYXBwZW5kX2RlZmluaXRpb25zKCItRCBLTVBfU1RBVFNfRU5BQkxFRD0wIikKKyAgICBlbmRpZigpCisKKyAgICAjIE9wZW5NUCB2ZXJzaW9uIGZsYWdzCisgICAgc2V0KGhhdmVfb21wXzUwIDApCisgICAgc2V0KGhhdmVfb21wXzQxIDApCisgICAgc2V0KGhhdmVfb21wXzQwIDApCisgICAgc2V0KGhhdmVfb21wXzMwIDApCisgICAgaWYoJHtvbXBfdmVyc2lvbn0gRVFVQUwgNTAgT1IgJHtvbXBfdmVyc2lvbn0gR1JFQVRFUiA1MCkKKyAgICAgICAgc2V0KGhhdmVfb21wXzUwIDEpCisgICAgZW5kaWYoKQorICAgIGlmKCR7b21wX3ZlcnNpb259IEVRVUFMIDQxIE9SICR7b21wX3ZlcnNpb259IEdSRUFURVIgNDEpCisgICAgICAgIHNldChoYXZlX29tcF80MSAxKQorICAgIGVuZGlmKCkKKyAgICBpZigke29tcF92ZXJzaW9ufSBFUVVBTCA0MCBPUiAke29tcF92ZXJzaW9ufSBHUkVBVEVSIDQwKQorICAgICAgICBzZXQoaGF2ZV9vbXBfNDAgMSkKKyAgICBlbmRpZigpCisgICAgaWYoJHtvbXBfdmVyc2lvbn0gRVFVQUwgMzAgT1IgJHtvbXBfdmVyc2lvbn0gR1JFQVRFUiAzMCkKKyAgICAgICAgc2V0KGhhdmVfb21wXzMwIDEpCisgICAgZW5kaWYoKQorICAgIGFwcGVuZF9kZWZpbml0aW9ucygiLUQgT01QXzUwX0VOQUJMRUQ9JHtoYXZlX29tcF81MH0iKQorICAgIGFwcGVuZF9kZWZpbml0aW9ucygiLUQgT01QXzQxX0VOQUJMRUQ9JHtoYXZlX29tcF80MX0iKQorICAgIGFwcGVuZF9kZWZpbml0aW9ucygiLUQgT01QXzQwX0VOQUJMRUQ9JHtoYXZlX29tcF80MH0iKQorICAgIGFwcGVuZF9kZWZpbml0aW9ucygiLUQgT01QXzMwX0VOQUJMRUQ9JHtoYXZlX29tcF8zMH0iKQorCisgICAgIyBBcmNoaXRlY3R1cmFsIGRlZmluaXRpb25zCisgICAgaWYoJHtJTlRFTDY0fSBPUiAke0lBMzJ9KQorICAgICAgICBpZigke1VTRV9BREFQVElWRV9MT0NLU30pCisgICAgICAgICAgICBhcHBlbmRfZGVmaW5pdGlvbnMoIi1EIEtNUF9VU0VfQURBUFRJVkVfTE9DS1M9MSIpCisgICAgICAgIGVsc2UoKQorICAgICAgICAgICAgYXBwZW5kX2RlZmluaXRpb25zKCItRCBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTPTAiKQorICAgICAgICBlbmRpZigpCisgICAgICAgIGFwcGVuZF9kZWZpbml0aW9ucygiLUQgS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTPTAiKQorICAgIGVsc2UoKQorICAgICAgICBhcHBlbmRfZGVmaW5pdGlvbnMoIi1EIEtNUF9VU0VfQURBUFRJVkVfTE9DS1M9MCIpCisgICAgICAgIGFwcGVuZF9kZWZpbml0aW9ucygiLUQgS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTPTAiKQorICAgIGVuZGlmKCkKKyAgICBzZXQoJHtpbnB1dF9jcHBfZmxhZ3N9ICIkeyR7aW5wdXRfY3BwX2ZsYWdzfX0iICIke2xvY2FsX2NwcF9mbGFnc30iICIke1VTRVJfQ1BQX0ZMQUdTfSIgIiRFTlZ7Q1BQRkxBR1N9IiBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvY21ha2UvR05VL0FzbUZsYWdzLmNtYWtlIGIvZmluYWwvcnVudGltZS9jbWFrZS9HTlUvQXNtRmxhZ3MuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFmY2NiMAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvY21ha2UvR05VL0FzbUZsYWdzLmNtYWtlCkBAIC0wLDAgKzEsMTYgQEAKKyMgVGhpcyBmaWxlIGhvbGRzIEdOVSAoZ2NjL2crKykgc3BlY2lmaWMgY29tcGlsZXIgZGVwZW5kZW50IGZsYWdzCisjIFRoZSBmbGFnIHR5cGVzIGFyZToKKyMgICAxKSBBc3NlbWJseSBmbGFncworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQXNzZW1ibHkgZmxhZ3MKK2Z1bmN0aW9uKGFwcGVuZF9hc3NlbWJsZXJfc3BlY2lmaWNfYXNtX2ZsYWdzIGlucHV0X2FzbV9mbGFncykKKyAgICBzZXQobG9jYWxfYXNtX2ZsYWdzKQorICAgIGFwcGVuZF9hc21fZmxhZ3MoIi14IGFzc2VtYmxlci13aXRoLWNwcCIpICMgQXNzZW1ibHkgZmlsZSB0aGF0IG5lZWRzIHRvIGJlIHByZXByb2Nlc3NlZAorICAgIGlmKCR7SUEzMn0pCisgICAgICAgIGFwcGVuZF9hc21fZmxhZ3MoIi1tMzIiKSAjIEdlbmVyYXRlIDMyIGJpdCBJQS0zMiBhcmNoaXRlY3R1cmUgY29kZSAKKyAgICAgICAgYXBwZW5kX2FzbV9mbGFncygiLW1zc2UyIikgIyBBbGxvdyB1c2Ugb2YgU3RyZWFtaW5nIFNJTUQgSW5zdHJ1Y3Rpb25zCisgICAgZW5kaWYoKQorICAgIHNldCgke2lucHV0X2FzbV9mbGFnc30gJHske2lucHV0X2FzbV9mbGFnc319ICIke2xvY2FsX2FzbV9mbGFnc30iIFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9jbWFrZS9HTlUvQ0ZsYWdzLmNtYWtlIGIvZmluYWwvcnVudGltZS9jbWFrZS9HTlUvQ0ZsYWdzLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NjU0Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL2NtYWtlL0dOVS9DRmxhZ3MuY21ha2UKQEAgLTAsMCArMSw0NSBAQAorIyBUaGlzIGZpbGUgaG9sZHMgR05VIChnY2MvZysrKSBzcGVjaWZpYyBjb21waWxlciBkZXBlbmRlbnQgZmxhZ3MKKyMgVGhlIGZsYWcgdHlwZXMgYXJlOgorIyAgIDIpIEMvQysrIENvbXBpbGVyIGZsYWdzCisjICAgNCkgTGlua2VyIGZsYWdzCit1bnNldChDT01QSUxFUl9TVVBQT1JUU19RVUFEX1BSRUNJU0lPTiBDQUNIRSkKK3NldChDT01QSUxFUl9TVVBQT1JUU19RVUFEX1BSRUNJU0lPTiB0cnVlIENBQ0hFIEJPT0wgIkRvZXMgdGhlIGNvbXBpbGVyIHN1cHBvcnQgYSAxMjgtYml0IGZsb2F0aW5nIHBvaW50IHR5cGU/IikKK3NldChDT01QSUxFUl9RVUFEX1RZUEUgX19mbG9hdDEyOCkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEMvQysrIENvbXBpbGVyIGZsYWdzCitmdW5jdGlvbihhcHBlbmRfY29tcGlsZXJfc3BlY2lmaWNfY19hbmRfY3h4X2ZsYWdzIGlucHV0X2NfZmxhZ3MgaW5wdXRfY3h4X2ZsYWdzKQorICAgIHNldChsb2NhbF9jX2ZsYWdzKQorICAgIHNldChsb2NhbF9jeHhfZmxhZ3MpCisgICAgYXBwZW5kX2NfYW5kX2N4eF9mbGFncygiLXN0ZD1jKysweCIpICMgRW5hYmxlcyBzdXBwb3J0IGZvciBtYW55IEMrKzExIChmb3JtZXJseSBrbm93biBhcyBDKysweCkgZmVhdHVyZXMuIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSBtb3N0IHJlY2VudGx5IGFkZGVkIGZlYXR1cmVzOgorICAgIGFwcGVuZF9jX2FuZF9jeHhfZmxhZ3MoIi1mbm8tZXhjZXB0aW9ucyIpICMgRXhjZXB0aW9uIGhhbmRsaW5nIHRhYmxlIGdlbmVyYXRpb24gaXMgZGlzYWJsZWQuCisgICAgYXBwZW5kX2NfYW5kX2N4eF9mbGFncygiLXggYysrIikgIyBDb21waWxlIEMgZmlsZXMgYXMgQysrIGZpbGVzCisgICAgaWYoJHtJQTMyfSkKKyAgICAgICAgYXBwZW5kX2NfYW5kX2N4eF9mbGFncygiLW0zMiIpICMgR2VuZXJhdGUgMzIgYml0IElBLTMyIGFyY2hpdGVjdHVyZSBjb2RlCisgICAgICAgIGFwcGVuZF9jX2FuZF9jeHhfZmxhZ3MoIi1tc3NlMiIpICMgQWxsb3cgdXNlIG9mIFN0cmVhbWluZyBTSU1EIEluc3RydWN0aW9ucworICAgIGVsc2VpZigke0FSTX0pCisgICAgICAgIGFwcGVuZF9jX2FuZF9jeHhfZmxhZ3MoIi1tYXJtIikgIyBUYXJnZXQgdGhlIEFSTSBhcmNoaXRlY3R1cmUKKyAgICBlbmRpZigpCisgICAgc2V0KCR7aW5wdXRfY19mbGFnc30gJHske2lucHV0X2NfZmxhZ3N9fSAiJHtsb2NhbF9jX2ZsYWdzfSIgUEFSRU5UX1NDT1BFKQorICAgIHNldCgke2lucHV0X2N4eF9mbGFnc30gJHske2lucHV0X2N4eF9mbGFnc319ICIke2xvY2FsX2N4eF9mbGFnc30iIFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIExpbmtlciBmbGFncworZnVuY3Rpb24oYXBwZW5kX2NvbXBpbGVyX3NwZWNpZmljX2xpbmtlcl9mbGFncyBpbnB1dF9sZF9mbGFncyBpbnB1dF9sZF9mbGFnc19saWJzKQorICAgIHNldChsb2NhbF9sZF9mbGFncykKKyAgICBzZXQobG9jYWxfbGRfZmxhZ3NfbGlicykKKyAgICBpZigke1dJTkRPV1N9KQorICAgIGVsc2VpZigke01BQ30pCisgICAgZWxzZWlmKCR7TUlDfSkKKyAgICBlbHNlKCkKKyAgICAgICAgYXBwZW5kX2xpbmtlcl9mbGFncygiLXN0YXRpYy1saWJnY2MiKSAjIENhdXNlcyBsaWJnY2MgdG8gYmUgbGlua2VkIGluIHN0YXRpY2FsbHkKKyAgICBlbmRpZigpCisgICAgaWYoJHtJQTMyfSkKKyAgICAgICAgYXBwZW5kX2xpbmtlcl9mbGFncygiLW0zMiIpCisgICAgICAgIGFwcGVuZF9saW5rZXJfZmxhZ3MoIi1tc3NlMiIpCisgICAgZW5kaWYoKQorICAgIHNldCgke2lucHV0X2xkX2ZsYWdzfSAgICAgICR7JHtpbnB1dF9sZF9mbGFnc319ICAgICAgIiR7bG9jYWxfbGRfZmxhZ3N9IiAgICAgICBQQVJFTlRfU0NPUEUpCisgICAgc2V0KCR7aW5wdXRfbGRfZmxhZ3NfbGlic30gJHske2lucHV0X2xkX2ZsYWdzX2xpYnN9fSAiJHtsb2NhbF9sZF9mbGFnc19saWJzfSIgIFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9jbWFrZS9HTlUvRm9ydHJhbkZsYWdzLmNtYWtlIGIvZmluYWwvcnVudGltZS9jbWFrZS9HTlUvRm9ydHJhbkZsYWdzLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNDc5YjIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL2NtYWtlL0dOVS9Gb3J0cmFuRmxhZ3MuY21ha2UKQEAgLTAsMCArMSwxNCBAQAorIyBUaGlzIGZpbGUgaG9sZHMgR05VIChnY2MvZysrKSBzcGVjaWZpYyBjb21waWxlciBkZXBlbmRlbnQgZmxhZ3MKKyMgVGhlIGZsYWcgdHlwZXMgYXJlOgorIyAgIDEpIEZvcnRyYW4gQ29tcGlsZXIgZmxhZ3MKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEZvcnRyYW4gQ29tcGlsZXIgZmxhZ3MgKGZvciBjcmVhdGluZyAubW9kIGZpbGVzKQorZnVuY3Rpb24oYXBwZW5kX2ZvcnRyYW5fY29tcGlsZXJfc3BlY2lmaWNfZm9ydF9mbGFncyBpbnB1dF9mb3J0X2ZsYWdzKQorICAgIHNldChsb2NhbF9mb3J0X2ZsYWdzKQorICAgIGlmKCR7SUEzMn0pCisgICAgICAgIGFwcGVuZF9mb3J0X2ZsYWdzKCItbTMyIikKKyAgICAgICAgYXBwZW5kX2ZvcnRfZmxhZ3MoIi1tc3NlMiIpCisgICAgZW5kaWYoKQorICAgIHNldCgke2lucHV0X2ZvcnRfZmxhZ3N9ICR7JHtpbnB1dF9mb3J0X2ZsYWdzfX0gIiR7bG9jYWxfZm9ydF9mbGFnc30iIFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvY21ha2UvSGVscGVyRnVuY3Rpb25zLmNtYWtlIGIvZmluYWwvcnVudGltZS9jbWFrZS9IZWxwZXJGdW5jdGlvbnMuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhlMzA5YgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvY21ha2UvSGVscGVyRnVuY3Rpb25zLmNtYWtlCkBAIC0wLDAgKzEsMjU2IEBACisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBGVU5DVElPTlMvTUFDUk9TICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgaW4gY21ha2UsIGZ1bmN0aW9ucyBjYW4gb25seSBiZSB1c2VkIG9uIGEgc2luZ2xlIGxpbmUgd2l0aCB0aGUgcmV0dXJuIHZhbHVlCisjIHN0b3JlZCBpbiBhIHBhcmFtZXRlciB5b3Ugc2VuZCB0byB0aGUgZnVuY3Rpb24uICBUaGVyZSBpc24ndCBhIHRydWUgcmV0dXJuIHZhbHVlLiAgU28gdGVjaG5pY2FsbHksIAorIyBhbGwgZnVuY3Rpb25zIHdvdWxkIGhhdmUgYSBDL0MrKyBwcm90b3R5cGUgb2Y6CisjIHZvaWQgZnVuY3Rpb25fbmFtZShwYXJhbWV0ZXIxLCBwYXJhbWV0ZXIyLCAuLi4pOworIyAgCisjIElmIHlvdSB3YW50IGEgcmV0dXJuIHZhbHVlLCB5b3UgaGF2ZSB0byB1c2UgYSBwYXJhbWV0ZXIgc28gdGhlIGZ1bmN0aW9uIHByb3RvdHlwZSB3b3VsZCBiZToKKyMgdm9pZCBmdW5jdGlvbl9uYW1lKGlucHV0X3BhcmFtZXRlcjEsIGlucHV0X3BhcmFtZXRlcjIsIC4uLiwgIHJldHVybl92YWx1ZSkKKyMgIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgdm9pZCBzYXkoc3RyaW5nIG1lc3NhZ2VfdG9fdXNlcik7CisjIC0gcHJpbnRzIG91dCBtZXNzYWdlX3RvX3VzZXIKK21hY3JvKHNheSBtZXNzYWdlX3RvX3VzZXIpCisgICAgbWVzc2FnZSgiJHttZXNzYWdlX3RvX3VzZXJ9IikKK2VuZG1hY3JvKCkKKworIyB2b2lkIHdhcm5pbmdfc2F5KHN0cmluZyBtZXNzYWdlX3RvX3VzZXIpOworIyAtIHByaW50cyBvdXQgbWVzc2FnZV90b191c2VyIHdpdGggYSB3YXJuaW5nCittYWNybyh3YXJuaW5nX3NheSBtZXNzYWdlX3RvX3VzZXIpCisgICAgbWVzc2FnZShXQVJOSU5HICIke21lc3NhZ2VfdG9fdXNlcn0iKQorZW5kbWFjcm8oKQorCisjIHZvaWQgZXJyb3Jfc2F5KHN0cmluZyBtZXNzYWdlX3RvX3VzZXIpOworIyAtIHByaW50cyBvdXQgbWVzc2FnZV90b191c2VyIHdpdGggYW4gZXJyb3IgYW5kIGV4aXRzIGNtYWtlCittYWNybyhlcnJvcl9zYXkgbWVzc2FnZV90b191c2VyKQorICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIiR7bWVzc2FnZV90b191c2VyfSIpCitlbmRtYWNybygpCisKKyMgdm9pZCBkZWJ1Z19zYXkoc3RyaW5nIG1lc3NhZ2VfdG9fZGV2ZWxvcGVyKTsKKyMgLSBwcmludHMgb3V0IG1lc3NhZ2Ugd2hlbiBHTE9CQUxfREVCVUcgPT0gMSAoZm9yIGRlYnVnZ2luZyBjbWFrZSBidWlsZCkKK21hY3JvKGRlYnVnX3NheSBtZXNzYWdlX3RvX2RldmVsb3BlcikKKyAgICBpZigke0dMT0JBTF9ERUJVR30gU1RSRVFVQUwgIjEiKQorICAgICAgICBzYXkoIkRFQlVHOiAke21lc3NhZ2VfdG9fZGV2ZWxvcGVyfSIpCisgICAgZW5kaWYoKQorZW5kbWFjcm8oKQorCisjIHZvaWQgZGVidWdfc2F5X3Zhcih2YXJpYWJsZSB2YXIpOworIyAtIHByaW50cyB0aGUgdmFyaWFibGUgbmFtZSBhbmQgaXRzIHZhbHVlIChmb3IgZGVidWdnaW5nIGNtYWtlIGJ1aWxkKQorbWFjcm8oZGVidWdfc2F5X3ZhciB2YXIpCisgICAgaWYoJHtHTE9CQUxfREVCVUd9IFNUUkVRVUFMICIxIikKKyAgICAgICAgc2F5KCJERUJVRzogVmFyaWFibGU6ICR7dmFyfSA9ICR7JHt2YXJ9fSAiKQorICAgIGVuZGlmKCkKK2VuZG1hY3JvKCkKKworIyB2b2lkIHNldF9sZWdhbF9hcmNoKHN0cmluZyogcmV0dXJuX2FyY2hfc3RyaW5nKTsKKyMgLSByZXR1cm5zICh0aHJvdWdoIHJldHVybl9hcmNoX3N0cmluZykgdGhlIGZvcm1hbCBhcmNoaXRlY3R1cmUgCisjICAgc3RyaW5nIG9yIHdhcm5zIHVzZXIgb2YgdW5rbm93biBhcmNoaXRlY3R1cmUKK2Z1bmN0aW9uKHNldF9sZWdhbF9hcmNoIHJldHVybl9hcmNoX3N0cmluZykKKyAgICBpZigke0lBMzJ9KSAKKyAgICAgICAgc2V0KCR7cmV0dXJuX2FyY2hfc3RyaW5nfSAiSUEtMzIiIFBBUkVOVF9TQ09QRSkKKyAgICBlbHNlaWYoJHtJTlRFTDY0fSkKKyAgICAgICAgc2V0KCR7cmV0dXJuX2FyY2hfc3RyaW5nfSAiSW50ZWwoUikgNjQiIFBBUkVOVF9TQ09QRSkKKyAgICBlbHNlaWYoJHtNSUN9KQorICAgICAgICBzZXQoJHtyZXR1cm5fYXJjaF9zdHJpbmd9ICJJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUiIFBBUkVOVF9TQ09QRSkKKyAgICBlbHNlaWYoJHthcmNofSBTVFJFUVVBTCAibDEiKQorICAgICAgICBzZXQoJHtyZXR1cm5fYXJjaF9zdHJpbmd9ICJMMU9NIiBQQVJFTlRfU0NPUEUpCisgICAgZWxzZWlmKCR7QVJNfSkKKyAgICAgICAgc2V0KCR7cmV0dXJuX2FyY2hfc3RyaW5nfSAiQVJNIiBQQVJFTlRfU0NPUEUpCisJZWxzZWlmKCR7UFBDNjR9KQorCSAgICBzZXQoJHtyZXR1cm5fYXJjaF9zdHJpbmd9ICJQUEM2NCIgUEFSRU5UX1NDT1BFKQorICAgIGVsc2UoKQorICAgICAgICB3YXJuaW5nX3NheSgic2V0X2xlZ2FsX2FyY2goKTogV2FybmluZzogVW5rbm93biBhcmNoaXRlY3R1cmUuLi4iKQorICAgIGVuZGlmKCkKK2VuZGZ1bmN0aW9uKCkKKworIyB2b2lkIGNoZWNrX3ZhcmlhYmxlKHN0cmluZyB2YXIsIHN0cmluZyB2YXJfbmFtZSwgbGlzdDxzdHJpbmc+dmFsdWVzX2xpc3QpOworIyAtIHJ1bnMgdGhyb3VnaCB2YWx1ZXNfbGlzdCBjaGVja2luZyBpZiAke3Zhcn0gPT0gdmFsdWVzX2xpc3RbaV0gZm9yIGFueSBpLgorIyAtIGlmIHRoZSB2YXIgaXMgZm91bmQsIHRoZW4ganVzdCBwcmludCBpdCBvdXQKKyMgLSBpZiB0aGUgdmFyIGlzIG5vdCBmb3VuZCwgdGhlbiB3YXJuIHVzZXIKK2Z1bmN0aW9uKGNoZWNrX3ZhcmlhYmxlIHZhciB2YWx1ZXNfbGlzdCkKKyAgICBzZXQodmFsaWRfZmxhZyAwKQorICAgIGZvcmVhY2godmFsdWUgSU4gTElTVFMgdmFsdWVzX2xpc3QpCisgICAgICAgIGlmKCIkeyR7dmFyfX0iIFNUUkVRVUFMICIke3ZhbHVlfSIpCisgICAgICAgICAgICBzZXQodmFsaWRfZmxhZyAxKQorICAgICAgICAgICAgc2V0KHRoZV92YWx1ZSAiJHt2YWx1ZX0iKQorICAgICAgICBlbmRpZigpCisgICAgZW5kZm9yZWFjaCgpCisgICAgaWYoJHt2YWxpZF9mbGFnfSBFUVVBTCAwKQorICAgICAgICBlcnJvcl9zYXkoImNoZWNrX3ZhcmlhYmxlKCk6ICR7dmFyfSA9ICR7JHt2YXJ9fSBpcyB1bmtub3duIikKKyAgICBlbmRpZigpCitlbmRmdW5jdGlvbigpCisKKyMgdm9pZCBfZXhwb3J0X2xpYl9kaXIoc3RyaW5nIGV4cG9ydF9kaXIsIHN0cmluZyBwbGF0Zm9ybSwgc3RyaW5nIHN1ZmZpeCwgc3RyaW5nKiByZXR1cm5fdmFsdWUpOworIyAtIGJhc2ljYWxseSBhIHNwZWNpYWwgY2FzZSBmb3IgbWFjIHBsYXRmb3JtcyB3aGVyZSBpdCBhZGRzICcudGhpbicgdG8gdGhlIG91dHB1dCBsaWIgZGlyZWN0b3J5CitmdW5jdGlvbihfZXhwb3J0X2xpYl9kaXIgcGx0ZnJtIHJldHVybl92YWx1ZSkKKyAgICBpZigke01BQ30pCisgICAgICAgIHNldCgke3JldHVybl92YWx1ZX0gIiR7ZXhwb3J0X2Rpcn0vJHtwbHRmcm19JHtzdWZmaXh9L2xpYi50aGluIiBQQVJFTlRfU0NPUEUpCisgICAgZWxzZSgpCisgICAgICAgIHNldCgke3JldHVybl92YWx1ZX0gIiR7ZXhwb3J0X2Rpcn0vJHtwbHRmcm19JHtzdWZmaXh9L2xpYiIgUEFSRU5UX1NDT1BFKQorICAgIGVuZGlmKCkKK2VuZGZ1bmN0aW9uKCkKKworIyB2b2lkIF9leHBvcnRfbGliX2ZhdF9kaXIoc3RyaW5nIGV4cG9ydF9kaXIsIHN0cmluZyBwbGF0Zm9ybSwgc3RyaW5nIHN1ZmZpeCwgc3RyaW5nKiByZXR1cm5fdmFsdWUpOworIyAtIGFub3RoZXIgbWFjIHNwZWNpYWx0eSBjYXNlIGZvciBmYXQgbGlicmFyaWVzLgorIyAtIHRoaXMgc2V0cyBleHBvcnRfbGliX2ZhdF9kaXIgaW4gdGhlIE1BSU4gcGFydCBvZiBDTWFrZUxpc3RzLnR4dAorZnVuY3Rpb24oX2V4cG9ydF9saWJfZmF0X2RpciBwbHRmcm0gcmV0dXJuX3ZhbHVlKQorICAgIHNldCgke3JldHVybl92YWx1ZX0gIiR7ZXhwb3J0X2Rpcn0vJHtwbHRmcm19JHtzdWZmaXh9L2xpYiIgUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQorCisjIHZvaWQgZ2V0X2J1aWxkX251bWJlcihzdHJpbmcgc3JjX2Rpciwgc3RyaW5nKiByZXR1cm5fYnVpbGRfbnVtYmVyKTsKKyMgLSBncmFiIHRoZSBlaWdodCBkaWdpdCBidWlsZCBudW1iZXIgKG9yIDAwMDAwMDAwKSBmcm9tIGttcF92ZXJzaW9uLmMKK2Z1bmN0aW9uKGdldF9idWlsZF9udW1iZXIgc3JjX2RpciByZXR1cm5fYnVpbGRfbnVtYmVyKQorICAgICMgc2V0cyBmaWxlX2xpbmVzX2xpc3QgdG8gYSBsaXN0IG9mIGFsbCBsaW5lcyBpbiBrbXBfdmVyc2lvbi5jCisgICAgZmlsZShTVFJJTkdTICIke3NyY19kaXJ9L3NyYy9rbXBfdmVyc2lvbi5jIiBmaWxlX2xpbmVzX2xpc3QpCisKKyAgICAjIHJ1bnMgdGhyb3VnaCBlYWNoIGxpbmUgaW4ga21wX3ZlcnNpb24uYworICAgIGZvcmVhY2gobGluZSBJTiBMSVNUUyBmaWxlX2xpbmVzX2xpc3QpCisgICAgICAgICMgaWYgdGhlIGxpbmUgYmVnaW5zIHdpdGggIiNkZWZpbmUgS01QX1ZFUlNJT05fQlVJTEQiIHRoZW4gd2UgdGFrZSBub3Qgb2YgdGhlIGJ1aWxkIG51bWJlcgorICAgICAgICBzdHJpbmcoUkVHRVggTUFUQ0ggIl5bIFx0XSojZGVmaW5lWyBcdF0rS01QX1ZFUlNJT05fQlVJTEQiIHZhbGlkICIke2xpbmV9IikKKyAgICAgICAgaWYoTk9UICIke3ZhbGlkfSIgU1RSRVFVQUwgIiIpICMgaWYgd2UgbWF0Y2hlZCAiI2RlZmluZSBLTVBfVkVSU0lPTl9CVUlMRCIsIHRoZW4gZ3JhYiB0aGUgYnVpbGQgbnVtYmVyCisgICAgICAgICAgICBzdHJpbmcoUkVHRVggUkVQTEFDRSAiXlsgXHRdKiNkZWZpbmVbIFx0XStLTVBfVkVSU0lPTl9CVUlMRFsgXHRdKyhbMC05XSspIiAiXFwxIgorICAgICAgICAgICAgICAgICAgIGJ1aWxkX251bWJlciAiJHtsaW5lfSIKKyAgICAgICAgICAgICkKKyAgICAgICAgZW5kaWYoKQorICAgIGVuZGZvcmVhY2goKQorICAgIHNldCgke3JldHVybl9idWlsZF9udW1iZXJ9ICIke2J1aWxkX251bWJlcn0iIFBBUkVOVF9TQ09QRSkgIyByZXR1cm4gYnVpbGQgbnVtYmVyCitlbmRmdW5jdGlvbigpCisKKyMgdm9pZCBzZXRfbGVnYWxfdHlwZShzdHJpbmcqIHJldHVybl9sZWdhbF90eXBlKTsKKyMgLSBzZXQgdGhlIGxlZ2FsIHR5cGUgbmFtZSBQZXJmb3JtYW5jZS9Qcm9maWxpbmcvU3R1YgorZnVuY3Rpb24oc2V0X2xlZ2FsX3R5cGUgcmV0dXJuX2xlZ2FsX3R5cGUpCisgICAgaWYoJHtOT1JNQUxfTElCUkFSWX0pCisgICAgICAgIHNldCgke3JldHVybl9sZWdhbF90eXBlfSAiUGVyZm9ybWFuY2UiIFBBUkVOVF9TQ09QRSkKKyAgICBlbHNlaWYoJHtQUk9GSUxFX0xJQlJBUll9KQorICAgICAgICBzZXQoJHtyZXR1cm5fbGVnYWxfdHlwZX0gIlByb2ZpbGluZyIgUEFSRU5UX1NDT1BFKQorICAgIGVsc2VpZigke1NUVUJTX0xJQlJBUll9KQorICAgICAgICBzZXQoJHtyZXR1cm5fbGVnYWxfdHlwZX0gIlN0dWIiIFBBUkVOVF9TQ09QRSkKKyAgICBlbmRpZigpCitlbmRmdW5jdGlvbigpCisKKyMgdm9pZCBzZXRfbWFjX29zX25ldyhib29sKiByZXR1cm5fbWFjX29zX25ldyk7CisjIC0gc2V0cyB0aGUgcmV0dXJuX21hY19vc19uZXcgdmFyaWFibGUgdG8gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBtYWNvc3ggdmVyc2lvbgorIyAtIG5vIHJlYWwgImNtYWtleSIgd2F5IHRvIGRvIHRoaXMuICBIYXZlIHRvIGNhbGwgZXhlY3V0ZV9wcm9jZXNzKCkKK2Z1bmN0aW9uKHNldF9tYWNfb3NfbmV3IHJldHVybl9tYWNfb3NfbmV3KQorICAgIGV4ZWN1dGVfcHJvY2VzcyhDT01NQU5EICJzd192ZXJzIiAiLXByb2R1Y3RWZXJzaW9uIiBPVVRQVVRfVkFSSUFCTEUgbWFjX29zeF92ZXJzaW9uKQorICAgIGlmKCIke21hY19vc3hfdmVyc2lvbn0iIFZFUlNJT05fR1JFQVRFUiAiMTAuNiIpCisgICAgICAgIHNldCgke3JldHVybl9tYWNfb3NfbmV3fSBUUlVFIFBBUkVOVF9TQ09QRSkKKyAgICBlbHNlKCkKKyAgICAgICAgc2V0KCR7cmV0dXJuX21hY19vc19uZXd9IEZBTFNFIFBBUkVOVF9TQ09QRSkKKyAgICBlbmRpZigpCitlbmRmdW5jdGlvbigpCisKKyMgdm9pZCBhZGRfcHJlZml4KHN0cmluZyBwcmVmaXgsIGxpc3Q8c3RyaW5nPiogbGlzdF9vZl9pdGVtcyk7CisjIC0gcmV0dXJucyBsaXN0X29mX2l0ZW1zIHdpdGggcHJlZml4IHByZXBlbmRlZCB0byBhbGwgaXRlbXMKKyMgLSBvcmlnaW5hbCBsaXN0IGlzIG1vZGlmaWVkCitmdW5jdGlvbihhZGRfcHJlZml4IHByZWZpeCBsaXN0X29mX2l0ZW1zKQorICAgIHNldChsb2NhbF9saXN0ICIiKQorICAgIGZvcmVhY2goaXRlbSBJTiBMSVNUUyAiJHtsaXN0X29mX2l0ZW1zfSIpCisgICAgICAgIGlmKE5PVCAiJHtpdGVtfSIgU1RSRVFVQUwgIiIpCisgICAgICAgICAgICBsaXN0KEFQUEVORCBsb2NhbF9saXN0ICIke3ByZWZpeH0ke2l0ZW19IikKKyAgICAgICAgZW5kaWYoKQorICAgIGVuZGZvcmVhY2goKQorICAgIHNldCgke2xpc3Rfb2ZfaXRlbXN9ICIke2xvY2FsX2xpc3R9IiBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCisKKyMgdm9pZCBhZGRfc3VmZml4KHN0cmluZyBzdWZmaXgsIGxpc3Q8c3RyaW5nPiogbGlzdF9vZl9pdGVtcyk7CisjIC0gcmV0dXJucyBsaXN0X29mX2l0ZW1zIHdpdGggc3VmZml4IGFwcGVuZGVkIHRvIGFsbCBpdGVtcworIyAtIG9yaWdpbmFsIGxpc3QgaXMgbW9kaWZpZWQKK2Z1bmN0aW9uKGFkZF9zdWZmaXggc3VmZml4IGxpc3Rfb2ZfaXRlbXMpCisgICAgc2V0KGxvY2FsX2xpc3QgIiIpCisgICAgZm9yZWFjaChpdGVtIElOIExJU1RTICIke2xpc3Rfb2ZfaXRlbXN9IikKKyAgICAgICAgaWYoTk9UICIke2l0ZW19IiBTVFJFUVVBTCAiIikKKyAgICAgICAgICAgIGxpc3QoQVBQRU5EIGxvY2FsX2xpc3QgIiR7aXRlbX0ke3N1ZmZpeH0iKQorICAgICAgICBlbmRpZigpCisgICAgZW5kZm9yZWFjaCgpCisgICAgc2V0KCR7bGlzdF9vZl9pdGVtc30gIiR7bG9jYWxfbGlzdH0iIFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKKworIyB2b2lkIHN0cmlwX3N1ZmZpeChsaXN0PHN0cmluZz4gbGlzdF9vZl9pdGVtcywgbGlzdDxzdHJpbmc+KiByZXR1cm5fbGlzdCk7CisjIC0gcmV0dXJucyBhIG5ldyBsaXN0IHdpdGggc3VmZml4IHN0cmlwcGVkIChpLmUuLCBmb28uYyA9PiBmb28pCisjIC0gbGlzdF9vZl9pdGVtcyBpcyBub3QgbW9kaWZpZWQsIHJldHVybl9saXN0IGlzIG1vZGlmaWVkCitmdW5jdGlvbihzdHJpcF9zdWZmaXggbGlzdF9vZl9pdGVtcyByZXR1cm5fbGlzdCkKKyAgICBzZXQobG9jYWxfbGlzdCAiIikKKyAgICBmb3JlYWNoKGl0ZW0gSU4gTElTVFMgIiR7bGlzdF9vZl9pdGVtc30iKQorICAgICAgICBpZihOT1QgIiR7aXRlbX0iIFNUUkVRVUFMICIiKQorICAgICAgICAgICAgZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChmaWxlbmFtZSAiJHtpdGVtfSIgTkFNRV9XRSkKKyAgICAgICAgICAgIGxpc3QoQVBQRU5EIGxvY2FsX2xpc3QgIiR7ZmlsZW5hbWV9IikKKyAgICAgICAgZW5kaWYoKQorICAgIGVuZGZvcmVhY2goKQorICAgIHNldCgke3JldHVybl9saXN0fSAiJHtsb2NhbF9saXN0fSIgUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQorCisjIHZvaWQgbGlzdF90b19zdHJpbmcobGlzdDxzdHJpbmc+IGxpc3Rfb2ZfdGhpbmdzLCBzdHJpbmcqIHJldHVybl9zdHJpbmcpOworIyAtIGNvbnZlcnRzIGEgbGlzdCB0byBhIHNwYWNlIHNlcGFyYXRlZCBzdHJpbmcKK2Z1bmN0aW9uKGxpc3RfdG9fc3RyaW5nIGxpc3Rfb2ZfdGhpbmdzIHJldHVybl9zdHJpbmcpCisgICAgc3RyaW5nKFJFUExBQ0UgIjsiICIgIiBvdXRwdXRfdmFyaWFibGUgIiR7bGlzdF9vZl90aGluZ3N9IikKKyAgICBzZXQoJHtyZXR1cm5fc3RyaW5nfSAiJHtvdXRwdXRfdmFyaWFibGV9IiBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCisKKyMgdm9pZCBzdHJpbmdfdG9fbGlzdChzdHJpbmcgc3RyLCBsaXN0PHN0cmluZz4qIHJldHVybl9saXN0KTsKKyMgLSBjb252ZXJ0cyBhIHN0cmluZyB0byBhIHNlbWljb2xvbiBzZXBhcmF0ZWQgbGlzdAorIyAtIHdoYXQgaXQgcmVhbGx5IGRvZXMgaXMganVzdCBzdHJpbmdfcmVwbGFjZSBhbGwgcnVubmluZyB3aGl0ZXNwYWNlIHRvIGEgc2VtaWNvbG9uCisjIC0gaW4gY21ha2UsIGEgbGlzdCBpcyBzdHJpbmdzIHNlcGFyYXRlZCBieSBzZW1pY29sb25zOiBpLmUuLCBsaXN0IG9mIGZvdXIgaXRlbXMsIGxpc3QgPSAiaXRlbTE7aXRlbTI7aXRlbTM7aXRlbTQiCitmdW5jdGlvbihzdHJpbmdfdG9fbGlzdCBzdHIgcmV0dXJuX2xpc3QpCisgICAgc2V0KG91dHN0cikKKyAgICBzdHJpbmcoUkVHRVggUkVQTEFDRSAiWyBcdF0rIiAiOyIgb3V0c3RyICIke3N0cn0iKQorICAgIHNldCgke3JldHVybl9saXN0fSAiJHtvdXRzdHJ9IiBQQVJFTlRfU0NPUEUpIAorZW5kZnVuY3Rpb24oKQorCisjIHZvaWQgZ2V0X2RhdGUoc3RyaW5nKiByZXR1cm5fZGF0ZSk7CisjIC0gcmV0dXJucyB0aGUgY3VycmVudCBkYXRlICJ5eXl5LW1tLWRkIGhoOm1tOnNzIFVUQyIKKyMgLSB0aGlzIGZ1bmN0aW9uIGFsb25lIGNhdXNlcyB0aGUgbmVlZCBmb3IgQ01ha2UgdjIuOC4xMSAoVElNRVNUQU1QKQorI2Z1bmN0aW9uKGdldF9kYXRlIHJldHVybl9kYXRlKQorIyAgICBzdHJpbmcoVElNRVNUQU1QIGxvY2FsX2RhdGUgIiVZLSVtLSVkICVIOiVNOiVTIFVUQyIgVVRDKQorIyAgICBzZXQoJHtyZXR1cm5fZGF0ZX0gJHtsb2NhbF9kYXRlfSBQQVJFTlRfU0NPUEUpCisjZW5kZnVuY3Rpb24oKQorCisjIHZvaWQgZmluZF9hX3Byb2dyYW0oc3RyaW5nIHByb2dyYW1fbmFtZSwgbGlzdDxzdHJpbmc+IGV4dHJhX3BhdGhzLCBib29sIGZhaWxfb25fbm90X2ZvdW5kLCBzdHJpbmcgcmV0dXJuX3ZhcmlhYmxlX25hbWUpOworIyAtIHJldHVybnMgdGhlIGZ1bGwgcGF0aCBvZiBhIHByb2dyYW1fbmFtZQorIyAtIGZpcnN0IGxvb2tzIGluIHRoZSBsaXN0IG9mIGV4dHJhX3BhdGhzCisjIC0gaWYgbm90IGZvdW5kIGluIGV4dHJhX3BhdGhzLCB0aGVuIGxvb2sgdGhyb3VnaCBzeXN0ZW0gcGF0aAorIyAtIGVycm9ycyBvdXQgaWYgZmFpbF9vbl9ub3RfZm91bmQgPT0gdHJ1ZSBhbmQgY21ha2UgY291bGQgbm90IGZpbmQgcHJvZ3JhbV9uYW1lLgorZnVuY3Rpb24oZmluZF9hX3Byb2dyYW0gcHJvZ3JhbV9uYW1lIGV4dHJhX3BhdGhzIGZhaWxfb25fbm90X2ZvdW5kIHJldHVybl92YXJpYWJsZV9uYW1lKQorICAgICMgZmlyc3QgdHJ5IHRvIGZpbmQgdGhlIHByb2dyYW0gaW4gdGhlIGV4dHJhX3BhdGhzCisgICAgZmluZF9wcm9ncmFtKCR7cmV0dXJuX3ZhcmlhYmxlX25hbWV9ICIke3Byb2dyYW1fbmFtZX0iIFBBVEhTICIke2V4dHJhX3BhdGhzfSIgRE9DICJQYXRoIHRvICR7cHJvZ3JhbV9uYW1lfSIgTk9fQ01BS0VfRU5WSVJPTk1FTlRfUEFUSCBOT19DTUFLRV9QQVRIIE5PX1NZU1RFTV9FTlZJUk9OTUVOVF9QQVRIIE5PX0NNQUtFX1NZU1RFTV9QQVRIKQorICAgIGlmKCIkeyR7cmV0dXJuX3ZhcmlhYmxlX25hbWV9fSIgTUFUQ0hFUyBOT1RGT1VORCkKKyAgICAgICAgIyBpZiBubyBleHRyYV9wYXRocywgb3IgY291bGRuJ3QgZmluZCBpdCwgdGhlbiBsb29rIGluIHN5c3RlbSAkUEFUSAorICAgICAgICBmaW5kX3Byb2dyYW0oJHtyZXR1cm5fdmFyaWFibGVfbmFtZX0gIiR7cHJvZ3JhbV9uYW1lfSIgRE9DICJQYXRoIHRvICR7cHJvZ3JhbV9uYW1lfSIpCisgICAgICAgIGlmKCIkeyR7cmV0dXJuX3ZhcmlhYmxlX25hbWV9fSIgTUFUQ0hFUyBOT1RGT1VORCBBTkQgJHtmYWlsX29uX25vdF9mb3VuZH0pCisgICAgICAgICAgICBlcnJvcl9zYXkoIkVycm9yOiBDb3VsZCBub3QgZmluZCBwcm9ncmFtOiAke3Byb2dyYW1fbmFtZX0iKQorICAgICAgICBlbmRpZigpCisgICAgZW5kaWYoKQorCisgICAgaWYoTk9UICIkeyR7cmV0dXJuX3ZhcmlhYmxlX25hbWV9fSIgTUFUQ0hFUyBOT1RGT1VORCkKKyAgICAgICAgc2F5KCItLSBGb3VuZCAke3Byb2dyYW1fbmFtZX06ICR7JHtyZXR1cm5fdmFyaWFibGVfbmFtZX19IikKKyAgICBlbmRpZigpCisKKyAgICBzZXQoJHtyZXR1cm5fdmFyaWFibGVfbmFtZX0gJHske3JldHVybl92YXJpYWJsZV9uYW1lfX0gUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQorCisjIFdJTkRPV1MgU1BFQ0lGSUMgCisjIHZvaWQgcmVwbGFjZV9tZF93aXRoX210KHN0cmluZyBmbGFnc192YXIpCisjIC0gVGhpcyBtYWNybyByZXBsYWNlcyB0aGUgL01EIGNvbXBpbGVyIGZsYWdzIChXaW5kb3dzIHNwZWNpZmljKSB3aXRoIC9NVCBjb21waWxlciBmbGFncworIyAtIFRoaXMgZG9lcyBub3RoaW5nIGlmIG5vIC9NRCBmbGFncyB3ZXJlIHJlcGxhY2VkLgorbWFjcm8ocmVwbGFjZV9tZF93aXRoX210IGZsYWdzX3ZhcikKKyAgICBzZXQoZmxhZ3NfdmFyX25hbWUgICR7ZmxhZ3NfdmFyfSkgIyBpLmUuLCBDTUFLRV9DX0ZMQUdTX1JFTEVBU0UKKyAgICBzZXQoZmxhZ3NfdmFyX3ZhbHVlICR7JHtmbGFnc192YXJ9fSkgIyBpLmUuLCAiL01EIC9PMiAuLi4iCisgICAgc3RyaW5nKFJFUExBQ0UgL01EIC9NVCB0ZW1wX291dCAiJHtmbGFnc192YXJfdmFsdWV9IikKKyAgICBzdHJpbmcoQ09NUEFSRSBOT1RFUVVBTCAiJHt0ZW1wX291dH0iICIke2ZsYWdzX3Zhcl92YWx1ZX0iIHNvbWV0aGluZ193YXNfcmVwbGFjZWQpCisgICAgaWYoIiR7c29tZXRoaW5nX3dhc19yZXBsYWNlZH0iKQorICAgICAgICB1bnNldCgke2ZsYWdzX3Zhcl9uYW1lfSBDQUNIRSkKKyAgICAgICAgc2V0KCR7ZmxhZ3NfdmFyX25hbWV9ICR7dGVtcF9vdXR9IENBQ0hFIFNUUklORyAiUmVwbGFjZWQgL01EIHdpdGggL01UIGNvbXBpbGVyIGZsYWdzIikKKyAgICBlbmRpZigpCitlbmRtYWNybygpCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvY21ha2UvSW50ZWwvQXNtRmxhZ3MuY21ha2UgYi9maW5hbC9ydW50aW1lL2NtYWtlL0ludGVsL0FzbUZsYWdzLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZDIyZDkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL2NtYWtlL0ludGVsL0FzbUZsYWdzLmNtYWtlCkBAIC0wLDAgKzEsMzEgQEAKKyMgVGhpcyBmaWxlIGhvbGRzIEludGVsKFIpIEMgQ29tcGlsZXIgLyBJbnRlbChSKSBDKysgQ29tcGlsZXIgLyBJbnRlbChSKSBGb3J0cmFuIENvbXBpbGVyIChpY2MvaWNwYy9pY2wuZXhlL2lmb3J0KSBkZXBlbmRlbnQgZmxhZ3MKKyMgVGhlIGZsYWcgdHlwZXMgYXJlOgorIyAgIDEpIEFzc2VtYmx5IGZsYWdzCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBBc3NlbWJseSBmbGFncworZnVuY3Rpb24oYXBwZW5kX2Fzc2VtYmxlcl9zcGVjaWZpY19hc21fZmxhZ3MgaW5wdXRfYXNtX2ZsYWdzKQorICAgIHNldChsb2NhbF9hc21fZmxhZ3MpCisgICAgYXBwZW5kX2FzbV9mbGFncygiLXggYXNzZW1ibGVyLXdpdGgtY3BwIikgIyBBc3NlbWJseSBmaWxlIHRoYXQgbmVlZHMgdG8gYmUgcHJlcHJvY2Vzc2VkCisgICAgaWYoJHtJQTMyfSkKKyAgICAgICAgYXBwZW5kX2FzbV9mbGFncygiLXNhZmVzZWgiKSAjIFJlZ2lzdGVycyBleGNlcHRpb24gaGFuZGxlcnMgZm9yIHNhZmUgZXhjZXB0aW9uIGhhbmRsaW5nLgorICAgICAgICBhcHBlbmRfYXNtX2ZsYWdzKCItY29mZiIpICMgR2VuZXJhdGVzIGNvbW1vbiBvYmplY3QgZmlsZSBmb3JtYXQgKENPRkYpIHR5cGUgb2Ygb2JqZWN0IG1vZHVsZS4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBHZW5lcmFsbHkgcmVxdWlyZWQgZm9yIFdpbjMyIGFzc2VtYmx5IGxhbmd1YWdlIGRldmVsb3BtZW50LgorICAgICAgICBhcHBlbmRfYXNtX2ZsYWdzKCItRCBfTV9JQTMyIikKKyAgICBlbHNlaWYoJHtJTlRFTDY0fSkKKyAgICAgICAgYXBwZW5kX2FzbV9mbGFncygiLUQgX01fQU1ENjQiKQorICAgIGVuZGlmKCkKKyAgICBpZigke01JQ30pCisgICAgICAgIGFwcGVuZF9hc21fZmxhZ3MoIi1tbWljIikgIyBCdWlsZCBJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlIG5hdGl2ZSBjb2RlCisgICAgZW5kaWYoKQorICAgIGlmKCR7V0lORE9XU30pCisgICAgICAgICMgQ01ha2UgcHJlZmVycyB0aGUgL01EIGZsYWdzIHdoZW4gY29tcGlsaW5nIFdpbmRvd3Mgc291cmNlcywgYnV0IGxpYmlvbXA1IG5lZWRzIHRvIHVzZSAvTVQgaW5zdGVhZAorICAgICAgICAjIFNvIHdlIHJlcGxhY2UgdGhlc2UgL01EIGluc3RhbmNlcyB3aXRoIC9NVCB3aXRoaW4gdGhlIENNQUtFXypfRkxBR1MgdmFyaWFibGVzIGFuZCBwdXQgdGhhdCBvdXQgdG8gdGhlIENBQ0hFLgorICAgICAgICAjIHJlcGxhY2VfbWRfd2l0aF9tdCgpIGlzIGluIEhlbHBlckZ1bmN0aW9ucy5jbWFrZQorICAgICAgICByZXBsYWNlX21kX3dpdGhfbXQoQ01BS0VfQVNNX01BU01fRkxBR1MpCisgICAgICAgIHJlcGxhY2VfbWRfd2l0aF9tdChDTUFLRV9BU01fTUFTTV9GTEFHU19SRUxFQVNFKQorICAgICAgICByZXBsYWNlX21kX3dpdGhfbXQoQ01BS0VfQVNNX01BU01fRkxBR1NfUkVMV0lUSERFQklORk8pCisgICAgICAgIHJlcGxhY2VfbWRfd2l0aF9tdChDTUFLRV9BU01fTUFTTV9GTEFHU19ERUJVRykKKyAgICBlbmRpZigpCisgICAgc2V0KCR7aW5wdXRfYXNtX2ZsYWdzfSAkeyR7aW5wdXRfYXNtX2ZsYWdzfX0gIiR7bG9jYWxfYXNtX2ZsYWdzfSIgUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9jbWFrZS9JbnRlbC9DRmxhZ3MuY21ha2UgYi9maW5hbC9ydW50aW1lL2NtYWtlL0ludGVsL0NGbGFncy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTIyZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9jbWFrZS9JbnRlbC9DRmxhZ3MuY21ha2UKQEAgLTAsMCArMSwxNDggQEAKKyMgVGhpcyBmaWxlIGhvbGRzIEludGVsKFIpIEMgQ29tcGlsZXIgLyBJbnRlbChSKSBDKysgQ29tcGlsZXIgLyBJbnRlbChSKSBGb3J0cmFuIENvbXBpbGVyIChpY2MvaWNwYy9pY2wuZXhlL2lmb3J0KSBkZXBlbmRlbnQgZmxhZ3MKKyMgVGhlIGZsYWcgdHlwZXMgYXJlOgorIyAgIDIpIEMvQysrIENvbXBpbGVyIGZsYWdzCisjICAgNCkgTGlua2VyIGZsYWdzCisKKyMgaWNjIGhhcyBhIDEyOC1iaXQgZmxvYXRpbmcgcG9pbnQgdHlwZSBjYWxsZWQgX1F1YWQuICBBbHdheXMgY29tcGlsZSB3aXRoIDEyOC1iaXQgZmxvYXRpbmcgcG9pbnQgaWYgaXQgZXhpc3RzLgordW5zZXQoQ09NUElMRVJfU1VQUE9SVFNfUVVBRF9QUkVDSVNJT04gQ0FDSEUpCitzZXQoQ09NUElMRVJfU1VQUE9SVFNfUVVBRF9QUkVDSVNJT04gdHJ1ZSBDQUNIRSBCT09MICJEb2VzIHRoZSBjb21waWxlciBzdXBwb3J0IGEgMTI4LWJpdCBmbG9hdGluZyBwb2ludCB0eXBlPyIpCitzZXQoQ09NUElMRVJfUVVBRF9UWVBFIF9RdWFkKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgaWNjIEMvQysrIENvbXBpbGVyIGZsYWdzCitmdW5jdGlvbihhcHBlbmRfY29tcGlsZXJfc3BlY2lmaWNfY19hbmRfY3h4X2ZsYWdzIGlucHV0X2NfZmxhZ3MgaW5wdXRfY3h4X2ZsYWdzKQorICAgIHNldChsb2NhbF9jX2ZsYWdzKQorICAgIHNldChsb2NhbF9jeHhfZmxhZ3MpCisgICAgaWYoJHtXSU5ET1dTfSkKKyAgICAgICAgCisgICAgICAgIGFwcGVuZF9jX2ZsYWdzKCItVFAiKSAjIFRlbGxzIHRoZSBjb21waWxlciB0byBwcm9jZXNzIGEgZmlsZSBhcyBhIEMrKyBzb3VyY2UgZmlsZS4KKyAgICAgICAgYXBwZW5kX2N4eF9mbGFncygiLUVIc2MiKSAjIEVuYWJsZSBDKysgZXhjZXB0aW9uIGhhbmRsaW5nLgorICAgICAgICBhcHBlbmRfY19hbmRfY3h4X2ZsYWdzKCItbm9sb2dvIikgIyBUdXJuIG9mZiB0b29sIGJhbm5lci4KKyAgICAgICAgYXBwZW5kX2NfYW5kX2N4eF9mbGFncygiLVczIikgIyBFbmFibGVzIGRpYWdub3N0aWNzIGZvciByZW1hcmtzLCB3YXJuaW5ncywgYW5kIGVycm9ycy4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQWRkaXRpb25hbCB3YXJuaW5ncyBhcmUgYWxzbyBlbmFibGVkIGFib3ZlIGxldmVsIDIgd2FybmluZ3MuCisgICAgICAgIGFwcGVuZF9jX2FuZF9jeHhfZmxhZ3MoIi1XWCIpICMgQ2hhbmdlIGFsbCBXYXJuaW5ncyB0byBFcnJvcnMKKyAgICAgICAgYXBwZW5kX2NfYW5kX2N4eF9mbGFncygiLUdTIikgIyBMZXRzIHlvdSBjb250cm9sIHRoZSB0aHJlc2hvbGQgYXQgd2hpY2ggdGhlIHN0YWNrIGNoZWNraW5nIHJvdXRpbmUgaXMgY2FsbGVkIG9yIG5vdCBjYWxsZWQuCisgICAgICAgIGFwcGVuZF9jX2FuZF9jeHhfZmxhZ3MoIi1Rb3B0aW9uLGNwcCwtLWV4dGVuZGVkX2Zsb2F0X3R5cGVzIikgIyBFbmFibGVkIF9RdWFkIHR5cGUuCisgICAgICAgIGlmKCR7SUEzMn0pCisgICAgICAgICAgIGFwcGVuZF9jX2FuZF9jeHhfZmxhZ3MoIi1hcmNoOmlhMzIiKSAjIFRlbGxzIHRoZSBjb21waWxlciB3aGljaCBmZWF0dXJlcyBpdCBtYXkgdGFyZ2V0IChpYTMyKQorICAgICAgICAgICBhcHBlbmRfY19hbmRfY3h4X2ZsYWdzKCItT3ktIikgIyBlcXVpdmFsZW50IHRvIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyCisgICAgICAgIGVuZGlmKCkKKyAgICAgICAgYXBwZW5kX2NfYW5kX2N4eF9mbGFncygiLVFsb25nX2RvdWJsZSIpICMgZW5hYmxlIGxvbmcgZG91YmxlCisgICAgICAgIGFwcGVuZF9jX2FuZF9jeHhfZmxhZ3MoIi1RZGlhZy1kaXNhYmxlOjE3NyIpICMgRGlzYWJsZSB3YXJuaW5nOiAiLi4uIGRlY2xhcmVkIGJ1dCBuZXZlciByZWZlcmVuY2VkIgorICAgICAgICBpZigke0lBMzJ9KQorICAgICAgICAgICAgYXBwZW5kX2NfYW5kX2N4eF9mbGFncygiLVFzYWZlc2VoIikgIyBSZWdpc3RlcnMgZXhjZXB0aW9uIGhhbmRsZXJzIGZvciBzYWZlIGV4Y2VwdGlvbiBoYW5kbGluZy4KKyAgICAgICAgZW5kaWYoKQorICAgICAgICBpZigke1JFTEVBU0VfQlVJTER9IE9SICR7UkVMV0lUSERFQklORk9fQlVJTER9KQorICAgICAgICAgICAgYXBwZW5kX2NfYW5kX2N4eF9mbGFncygiLVFpbmxpbmUtbWluLXNpemU9MSIpICMgU3BlY2lmaWVzIHRoZSB1cHBlciBsaW1pdCBmb3IgdGhlIHNpemUgb2Ygd2hhdCB0aGUgaW5saW5lciBjb25zaWRlcnMgdG8gYmUgYSBzbWFsbCByb3V0aW5lLgorICAgICAgICBlbHNlKCkKKyAgICAgICAgICAgIGFwcGVuZF9jX2FuZF9jeHhfZmxhZ3MoIi1PZCIpICMgRGlzYWJsZXMgYWxsIG9wdGltaXphdGlvbnMuCisgICAgICAgICAgICBhcHBlbmRfY19hbmRfY3h4X2ZsYWdzKCItUlRDMSIpICMgRW5hYmxlcyBydW4tdGltZSBjaGVja3Mgb2YgdGhlIHN0YWNrIGZyYW1lLCBhbmQgZW5hYmxlcyBydW4tdGltZSBjaGVja3MgZm9yIHVuaW50aWFsaXplZCB2YXJpYWJsZXMuCisgICAgICAgICAgICBhcHBlbmRfY19hbmRfY3h4X2ZsYWdzKCItTVRkIikgIyBUZWxscyB0aGUgbGlua2VyIHRvIHNlYXJjaCBmb3IgdW5yZXNvbHZlZCByZWZlcmVuY2VzIGluIGEgbXVsdGl0aHJlYWRlZCwgc3RhdGljIHJ1bi10aW1lIGxpYnJhcnkuCisgICAgICAgIGVuZGlmKCkKKyAgICBlbHNlKCkKKyAgICAgICAgYXBwZW5kX2NfYW5kX2N4eF9mbGFncygiLVdzaWduLWNvbXBhcmUiKSAjIHdhcm4gb24gc2lnbiBjb21wYXJpc29ucworICAgICAgICBhcHBlbmRfY19hbmRfY3h4X2ZsYWdzKCItV2Vycm9yIikgIyBDaGFuZ2VzIGFsbCB3YXJuaW5ncyB0byBlcnJvcnMuCisgICAgICAgIGFwcGVuZF9jX2FuZF9jeHhfZmxhZ3MoIi1Rb3B0aW9uLGNwcCwtLWV4dGVuZGVkX2Zsb2F0X3R5cGVzIikgIyBFbmFibGVkIF9RdWFkIHR5cGUuCisgICAgICAgIGFwcGVuZF9jX2FuZF9jeHhfZmxhZ3MoIi1mbm8tZXhjZXB0aW9ucyIpICMgRXhjZXB0aW9uIGhhbmRsaW5nIHRhYmxlIGdlbmVyYXRpb24gaXMgZGlzYWJsZWQuCisgICAgICAgIGFwcGVuZF9jX2FuZF9jeHhfZmxhZ3MoIi14IGMrKyIpICMgQ29tcGlsZSBDIGZpbGVzIGFzIEMrKyBmaWxlcworICAgICAgICBpZigke01JQ30pCisgICAgICAgICAgICBhcHBlbmRfY19hbmRfY3h4X2ZsYWdzKCItbW1pYyIpICMgQnVpbGQgSW50ZWwoUikgTUlDIEFyY2hpdGVjdHVyZSBuYXRpdmUgY29kZQorICAgICAgICAgICAgYXBwZW5kX2NfYW5kX2N4eF9mbGFncygiLWZ0bHMtbW9kZWw9aW5pdGlhbC1leGVjIikgIyBDaGFuZ2VzIHRoZSB0aHJlYWQgbG9jYWwgc3RvcmFnZSAoVExTKSBtb2RlbC4gR2VuZXJhdGVzIGEgcmVzdHJpY3RpdmUsIG9wdGltaXplZCBUTFMgY29kZS4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRvIHVzZSB0aGlzIHNldHRpbmcsIHRoZSB0aHJlYWQtbG9jYWwgdmFyaWFibGVzIGFjY2Vzc2VkIG11c3QgYmUgZGVmaW5lZCBpbiBvbmUgb2YgdGhlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBtb2R1bGVzIGF2YWlsYWJsZSB0byB0aGUgcHJvZ3JhbS4KKyAgICAgICAgICAgIGFwcGVuZF9jX2FuZF9jeHhfZmxhZ3MoIi1vcHQtc3RyZWFtaW5nLXN0b3JlcyBuZXZlciIpICMgRGlzYWJsZXMgZ2VuZXJhdGlvbiBvZiBzdHJlYW1pbmcgc3RvcmVzIGZvciBvcHRpbWl6YXRpb24uCisgICAgICAgICAgICBhcHBlbmRfY19hbmRfY3h4X2ZsYWdzKCItc294IikgIyBUZWxscyB0aGUgY29tcGlsZXIgdG8gc2F2ZSB0aGUgY29tcGlsYXRpb24gb3B0aW9ucyBhbmQgdmVyc2lvbiBudW1iZXIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpbiB0aGUgZXhlY3V0YWJsZSBmaWxlLiBJdCBhbHNvIGxldHMgeW91IGNob29zZSB3aGV0aGVyIHRvIGluY2x1ZGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBsaXN0cyBvZiBjZXJ0YWluIGZ1bmN0aW9ucy4KKyAgICAgICAgZWxzZWlmKCR7TElOVVh9KQorICAgICAgICAgICAgYXBwZW5kX2NfYW5kX2N4eF9mbGFncygiLVdlcnJvciIpICMgQ2hhbmdlcyBhbGwgd2FybmluZ3MgdG8gZXJyb3JzLgorICAgICAgICAgICAgYXBwZW5kX2NfYW5kX2N4eF9mbGFncygiLXNveCIpIAorICAgICAgICAgICAgaWYoJHtJQTMyfSkKKyAgICAgICAgICAgICAgICBhcHBlbmRfY19hbmRfY3h4X2ZsYWdzKCItZmFsaWduLXN0YWNrPW1haW50YWluLTE2LWJ5dGUiKSAjIFRlbGxzIHRoZSBjb21waWxlciB0aGUgc3RhY2sgYWxpZ25tZW50IHRvIHVzZSBvbiBlbnRyeSB0byByb3V0aW5lcy4KKyAgICAgICAgICAgICAgICBhcHBlbmRfY19hbmRfY3h4X2ZsYWdzKCItbWlhMzIiKSAgIyBUZWxscyB0aGUgY29tcGlsZXIgd2hpY2ggZmVhdHVyZXMgaXQgbWF5IHRhcmdldCAoaWEzMikKKyAgICAgICAgICAgIGVuZGlmKCkKKyAgICAgICAgZW5kaWYoKQorICAgIGVuZGlmKCkKKyAgICAjIENNYWtlIHByZWZlcnMgdGhlIC9NRCBmbGFncyB3aGVuIGNvbXBpbGluZyBXaW5kb3dzIHNvdXJjZXMsIGJ1dCBsaWJpb21wNSBuZWVkcyB0byB1c2UgL01UIGluc3RlYWQKKyAgICAjIFNvIHdlIHJlcGxhY2UgdGhlc2UgL01EIGluc3RhbmNlcyB3aXRoIC9NVCB3aXRoaW4gdGhlIENNQUtFXypfRkxBR1MgdmFyaWFibGVzIGFuZCBwdXQgdGhhdCBvdXQgdG8gdGhlIENBQ0hFLgorICAgICMgcmVwbGFjZV9tZF93aXRoX210KCkgaXMgaW4gSGVscGVyRnVuY3Rpb25zLmNtYWtlCisgICAgaWYoJHtXSU5ET1dTfSkKKyAgICAgICAgcmVwbGFjZV9tZF93aXRoX210KENNQUtFX0NfRkxBR1MpCisgICAgICAgIHJlcGxhY2VfbWRfd2l0aF9tdChDTUFLRV9DX0ZMQUdTX1JFTEVBU0UpCisgICAgICAgIHJlcGxhY2VfbWRfd2l0aF9tdChDTUFLRV9DX0ZMQUdTX1JFTFdJVEhERUJJTkZPKQorICAgICAgICByZXBsYWNlX21kX3dpdGhfbXQoQ01BS0VfQ19GTEFHU19ERUJVRykKKyAgICAgICAgcmVwbGFjZV9tZF93aXRoX210KENNQUtFX0NYWF9GTEFHUykKKyAgICAgICAgcmVwbGFjZV9tZF93aXRoX210KENNQUtFX0NYWF9GTEFHU19SRUxFQVNFKQorICAgICAgICByZXBsYWNlX21kX3dpdGhfbXQoQ01BS0VfQ1hYX0ZMQUdTX1JFTFdJVEhERUJJTkZPKQorICAgICAgICByZXBsYWNlX21kX3dpdGhfbXQoQ01BS0VfQ1hYX0ZMQUdTX0RFQlVHKQorICAgIGVuZGlmKCkKKyAgICBzZXQoJHtpbnB1dF9jX2ZsYWdzfSAgICR7JHtpbnB1dF9jX2ZsYWdzfX0gICAiJHtsb2NhbF9jX2ZsYWdzfSIgUEFSRU5UX1NDT1BFKQorICAgIHNldCgke2lucHV0X2N4eF9mbGFnc30gJHske2lucHV0X2N4eF9mbGFnc319ICIke2xvY2FsX2N4eF9mbGFnc30iIFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGljYyBMaW5rZXIgZmxhZ3MKK2Z1bmN0aW9uKGFwcGVuZF9jb21waWxlcl9zcGVjaWZpY19saW5rZXJfZmxhZ3MgaW5wdXRfbGRfZmxhZ3MgaW5wdXRfbGRfZmxhZ3NfbGlicykKKyAgICBzZXQobG9jYWxfbGRfZmxhZ3MpCisgICAgc2V0KGxvY2FsX2xkX2ZsYWdzX2xpYnMpCisgICAgaWYoJHtXSU5ET1dTfSkKKyAgICAgICAgIyBIYXZlIGljYyB1c2UgbGluay5leGUgZGlyZWN0bHkgd2hlbiBXaW5kb3dzCisgICAgICAgIHNldChDTUFLRV9DX0NSRUFURV9TSEFSRURfTElCUkFSWSAibGluay5leGUgL291dDo8VEFSR0VUPiA8TElOS19GTEFHUz4gPE9CSkVDVFM+IDxMSU5LX0xJQlJBUklFUz4iIFBBUkVOVF9TQ09QRSkKKyAgICAgICAgc2V0KENNQUtFX1NIQVJFRF9MSU5LRVJfRkxBR1MgIiRFTlZ7TERGTEFHU30iIENBQ0hFIFNUUklORyAiTGlua2VyIEZsYWdzIiBGT1JDRSkKKyAgICAgICAgYXBwZW5kX2xpbmtlcl9mbGFncygiLW5vbG9nbyIpICMgVHVybiBvZmYgdG9vbCBiYW5uZXIuCisgICAgICAgIGFwcGVuZF9saW5rZXJfZmxhZ3MoIi1kbGwiKSAKKyAgICAgICAgYXBwZW5kX2xpbmtlcl9mbGFncygiLVdYOk5PIikKKyAgICAgICAgYXBwZW5kX2xpbmtlcl9mbGFncygiLWluY3JlbWVudGFsOm5vIikKKyAgICAgICAgYXBwZW5kX2xpbmtlcl9mbGFncygiLXZlcnNpb246JHt2ZXJzaW9ufS4wIikKKyAgICAgICAgYXBwZW5kX2xpbmtlcl9mbGFncygiLU5YQ29tcGF0IikKKyAgICAgICAgYXBwZW5kX2xpbmtlcl9mbGFncygiLUR5bmFtaWNCYXNlIikgIyBUaGlzIG9wdGlvbiBtb2RpZmllcyB0aGUgaGVhZGVyIG9mIGFuIGV4ZWN1dGFibGUgdG8gaW5kaWNhdGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgd2hldGhlciB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGJlIHJhbmRvbWx5IHJlYmFzZWQgYXQgbG9hZCB0aW1lLgorICAgICAgICBpZigke0lBMzJ9KQorICAgICAgICAgICAgYXBwZW5kX2xpbmtlcl9mbGFncygiLW1hY2hpbmU6aTM4NiIpCisgICAgICAgICAgICBhcHBlbmRfbGlua2VyX2ZsYWdzKCItc2FmZXNlaCIpCisgICAgICAgIGVsc2VpZigke0lOVEVMNjR9KQorICAgICAgICAgICAgYXBwZW5kX2xpbmtlcl9mbGFncygiLW1hY2hpbmU6YW1kNjQiKQorICAgICAgICBlbmRpZigpCisgICAgICAgIGlmKCR7REVCVUdfQlVJTER9IE9SICR7UkVMV0lUSERFQklORk9fQlVJTER9KQorICAgICAgICAgICAgaWYoTk9UICIke3BkYl9maWxlfSIgU1RSRVFVQUwgIiIpCisgICAgICAgICAgICAgICAgYXBwZW5kX2xpbmtlcl9mbGFncygiLWRlYnVnIikKKyAgICAgICAgICAgICAgICBhcHBlbmRfbGlua2VyX2ZsYWdzKCItcGRiOiR7cGRiX2ZpbGV9IikKKyAgICAgICAgICAgIGVuZGlmKCkKKyAgICAgICAgZWxzZSgpCisgICAgICAgICAgICBpZihOT1QgIiR7cGRiX2ZpbGV9IiBTVFJFUVVBTCAiIikKKyAgICAgICAgICAgICAgICBhcHBlbmRfbGlua2VyX2ZsYWdzKCItZGVidWciKQorICAgICAgICAgICAgICAgIGFwcGVuZF9saW5rZXJfZmxhZ3MoIi1wZGI6JHtwZGJfZmlsZX0iKQorICAgICAgICAgICAgICAgIGFwcGVuZF9saW5rZXJfZmxhZ3MoIi1wZGJzdHJpcHBlZDoke3BkYl9maWxlfS5zdHJpcHBlZCIpCisgICAgICAgICAgICBlbmRpZigpCisgICAgICAgIGVuZGlmKCkKKyAgICAgICAgaWYoTk9UICIke2ltcF9maWxlfSIgU1RSRVFVQUwgIiIpCisgICAgICAgICAgICBhcHBlbmRfbGlua2VyX2ZsYWdzKCItaW1wbGliOiR7bGliX2ZpbGV9JHtsaWJ9IikKKyAgICAgICAgZW5kaWYoKQorICAgICAgICBpZihOT1QgIiR7ZGVmX2ZpbGV9IiBTVFJFUVVBTCAiIikKKyAgICAgICAgICAgIGFwcGVuZF9saW5rZXJfZmxhZ3MoIi1kZWY6JHtkZWZfZmlsZX0iKQorICAgICAgICBlbmRpZigpCisgICAgZWxzZWlmKCR7TUFDfSkKKyAgICAgICAgYXBwZW5kX2xpbmtlcl9mbGFncygiLW5vLWludGVsLWV4dGVuc2lvbnMiKQorICAgICAgICBpZihOT1QgJHtTVFVCU19MSUJSQVJZfSkKKyAgICAgICAgICAgIGFwcGVuZF9saW5rZXJfZmxhZ3NfbGlicmFyeSgiLXB0aHJlYWQiKSAjIGxpbmsgaW4gcHRocmVhZCBsaWJyYXJ5CisgICAgICAgICAgICBhcHBlbmRfbGlua2VyX2ZsYWdzX2xpYnJhcnkoIi1sZGwiKSAjIGxpbmsgaW4gbGliZGwgKGR5bmFtaWMgbG9hZGVyIGxpYnJhcnkpCisgICAgICAgIGVuZGlmKCkKKyAgICAgICAgaWYoJHtTVEFUU19HQVRIRVJJTkd9KQorICAgICAgICAgICAgYXBwZW5kX2xpbmtlcl9mbGFnc19saWJyYXJ5KCItV2wsLWxzdGRjKysiKSAjIGxpbmsgaW4gc3RhbmRhcmQgYysrIGxpYnJhcnkgKHN0YXRzLWdhdGhlcmluZyBuZWVkcyBpdCkKKyAgICAgICAgZW5kaWYoKQorICAgIGVsc2VpZigke01JQ30pCisgICAgICAgIGFwcGVuZF9saW5rZXJfZmxhZ3MoIi1tbWljIikgIyBlbmFibGUgTUlDIGxpbmtpbmcKKyAgICAgICAgYXBwZW5kX2xpbmtlcl9mbGFncygiLXN0YXRpYy1pbnRlbCIpICMgQ2F1c2VzIEludGVsLXByb3ZpZGVkIGxpYnJhcmllcyB0byBiZSBsaW5rZWQgaW4gc3RhdGljYWxseS4gCisgICAgICAgIGFwcGVuZF9saW5rZXJfZmxhZ3MoIi1uby1pbnRlbC1leHRlbnNpb25zIikgIyBFbmFibGVzIG9yIGRpc2FibGVzIGFsbCBJbnRlbCBDIGFuZCBJbnRlbCBDKysgbGFuZ3VhZ2UgZXh0ZW5zaW9ucy4KKyAgICBlbHNlKCkKKyAgICAgICAgYXBwZW5kX2xpbmtlcl9mbGFncygiLXN0YXRpYy1pbnRlbCIpICMgQ2F1c2VzIEludGVsLXByb3ZpZGVkIGxpYnJhcmllcyB0byBiZSBsaW5rZWQgaW4gc3RhdGljYWxseS4KKyAgICAgICAgYXBwZW5kX2xpbmtlcl9mbGFncygiLVdlcnJvciIpICMgV2FybmluZ3MgYmVjb21lIGVycm9ycworICAgICAgICBpZigke0lBMzJ9KQorICAgICAgICAgICAgYXBwZW5kX2xpbmtlcl9mbGFnc19saWJyYXJ5KCItbGlyY19waWMiKSAjIGxpbmsgaW4gbGliaXJjX3BpYworICAgICAgICBlbmRpZigpCisgICAgZW5kaWYoKQorCisgICAgc2V0KCR7aW5wdXRfbGRfZmxhZ3N9ICAgICAgJHske2lucHV0X2xkX2ZsYWdzfX0gICAgICAiJHtsb2NhbF9sZF9mbGFnc30iICAgICAgIFBBUkVOVF9TQ09QRSkKKyAgICBzZXQoJHtpbnB1dF9sZF9mbGFnc19saWJzfSAkeyR7aW5wdXRfbGRfZmxhZ3NfbGlic319ICIke2xvY2FsX2xkX2ZsYWdzX2xpYnN9IiAgUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQorCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL2NtYWtlL0ludGVsL0ZvcnRyYW5GbGFncy5jbWFrZSBiL2ZpbmFsL3J1bnRpbWUvY21ha2UvSW50ZWwvRm9ydHJhbkZsYWdzLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNzlhODgKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL2NtYWtlL0ludGVsL0ZvcnRyYW5GbGFncy5jbWFrZQpAQCAtMCwwICsxLDI5IEBACisjIFRoaXMgZmlsZSBob2xkcyBJbnRlbChSKSBDIENvbXBpbGVyIC8gSW50ZWwoUikgQysrIENvbXBpbGVyIC8gSW50ZWwoUikgRm9ydHJhbiBDb21waWxlciAoaWNjL2ljcGMvaWNsLmV4ZS9pZm9ydCkgZGVwZW5kZW50IGZsYWdzCisjIFRoZSBmbGFnIHR5cGVzIGFyZToKKyMgICAxKSBGb3J0cmFuIENvbXBpbGVyIGZsYWdzCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBpY2MgRm9ydHJhbiBDb21waWxlciBmbGFncyAoZm9yIGNyZWF0aW5nIC5tb2QgZmlsZXMpCitmdW5jdGlvbihhcHBlbmRfZm9ydHJhbl9jb21waWxlcl9zcGVjaWZpY19mb3J0X2ZsYWdzIGlucHV0X2ZvcnRfZmxhZ3MpCisgICAgc2V0KGxvY2FsX2ZvcnRfZmxhZ3MpCisgICAgI3NldChDTUFLRV9Gb3J0cmFuX0ZMQUdTICAgICAgIiRFTlZ7RkZMQUdTfSIgICBDQUNIRSBTVFJJTkcgIkZvcnRyYW4gZmxhZ3MiICBGT1JDRSkKKyAgICAjc2V0KENNQUtFX0ZvcnRyYW5fRkxBR1NfUkVMRUFTRSAgICAgICAgICAiIiAgIENBQ0hFIFNUUklORyAiRm9ydHJhbiBmbGFncyIgIEZPUkNFKQorICAgICNzZXQoQ01BS0VfRm9ydHJhbl9GTEFHU19ERUJVRyAgICAgICAgICAgICIiICAgQ0FDSEUgU1RSSU5HICJGb3J0cmFuIGZsYWdzIiAgRk9SQ0UpCisgICAgI3NldChDTUFLRV9Gb3J0cmFuX0ZMQUdTX1JFTFdJVEhERUJJTkZPICAgIiIgICBDQUNIRSBTVFJJTkcgIkZvcnRyYW4gZmxhZ3MiICBGT1JDRSkKKyAgICBpZigke1dJTkRPV1N9KQorICAgICAgICBhcHBlbmRfZm9ydF9mbGFncygiLVFkaWFnLWRpc2FibGU6MTc3LDUwODIiKQorICAgICAgICBhcHBlbmRfZm9ydF9mbGFncygiLVFzb3giKQorICAgICAgICBhcHBlbmRfZm9ydF9mbGFncygiLW5vbG9nbyIpCisgICAgICAgIGFwcGVuZF9mb3J0X2ZsYWdzKCItR1MiKQorICAgICAgICBhcHBlbmRfZm9ydF9mbGFncygiLUR5bmFtaWNCYXNlIikKKyAgICAgICAgYXBwZW5kX2ZvcnRfZmxhZ3MoIi1aaSIpCisgICAgZWxzZSgpCisgICAgICAgIGlmKCR7TUlDfSkKKyAgICAgICAgICAgIGFwcGVuZF9mb3J0X2ZsYWdzKCItbW1pYyIpCisgICAgICAgIGVuZGlmKCkKKyAgICAgICAgaWYoTk9UICR7TUFDfSkKKyAgICAgICAgICAgIGFwcGVuZF9mb3J0X2ZsYWdzKCItc294IikKKyAgICAgICAgZW5kaWYoKQorICAgIGVuZGlmKCkKKyAgICBzZXQoJHtpbnB1dF9mb3J0X2ZsYWdzfSAkeyR7aW5wdXRfZm9ydF9mbGFnc319ICIke2xvY2FsX2ZvcnRfZmxhZ3N9IiBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL2NtYWtlL01TVkMvQXNtRmxhZ3MuY21ha2UgYi9maW5hbC9ydW50aW1lL2NtYWtlL01TVkMvQXNtRmxhZ3MuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNjODMwMgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvY21ha2UvTVNWQy9Bc21GbGFncy5jbWFrZQpAQCAtMCwwICsxLDI2IEBACisjIFRoaXMgZmlsZSBob2xkcyBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBkZXBlbmRlbnQgZmxhZ3MKKyMgVGhlIGZsYWcgdHlwZXMgYXJlOgorIyAgIDEpIEFzc2VtYmx5IGZsYWdzCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBBc3NlbWJseSBmbGFncworZnVuY3Rpb24oYXBwZW5kX2Fzc2VtYmxlcl9zcGVjaWZpY19hc21fZmxhZ3MgaW5wdXRfYXNtX2ZsYWdzKQorICAgIHNldChsb2NhbF9hc21fZmxhZ3MpCisgICAgYXBwZW5kX2FzbV9mbGFncygiLW5vbG9nbyIpICMgVHVybiBvZmYgdG9vbCBiYW5uZXIuCisgICAgaWYoJHtJQTMyfSkKKyAgICAgICAgYXBwZW5kX2FzbV9mbGFncygiLXNhZmVzZWgiKSAjIFJlZ2lzdGVycyBleGNlcHRpb24gaGFuZGxlcnMgZm9yIHNhZmUgZXhjZXB0aW9uIGhhbmRsaW5nLgorICAgICAgICBhcHBlbmRfYXNtX2ZsYWdzKCItY29mZiIpICMgR2VuZXJhdGVzIGNvbW1vbiBvYmplY3QgZmlsZSBmb3JtYXQgKENPRkYpIHR5cGUgb2Ygb2JqZWN0IG1vZHVsZS4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBHZW5lcmFsbHkgcmVxdWlyZWQgZm9yIFdpbjMyIGFzc2VtYmx5IGxhbmd1YWdlIGRldmVsb3BtZW50LgorICAgICAgICBhcHBlbmRfYXNtX2ZsYWdzKCItRCBfTV9JQTMyIikKKyAgICBlbHNlaWYoJHtJTlRFTDY0fSkKKyAgICAgICAgYXBwZW5kX2FzbV9mbGFncygiLUQgX01fQU1ENjQiKQorICAgIGVuZGlmKCkKKyAgICAjIENNYWtlIHByZWZlcnMgdGhlIC9NRCBmbGFncyB3aGVuIGNvbXBpbGluZyBXaW5kb3dzIHNvdXJjZXMsIGJ1dCBsaWJpb21wNSBuZWVkcyB0byB1c2UgL01UIGluc3RlYWQKKyAgICAjIFNvIHdlIHJlcGxhY2UgdGhlc2UgL01EIGluc3RhbmNlcyB3aXRoIC9NVCB3aXRoaW4gdGhlIENNQUtFXypfRkxBR1MgdmFyaWFibGVzIGFuZCBwdXQgdGhhdCBvdXQgdG8gdGhlIENBQ0hFLgorICAgICMgcmVwbGFjZV9tZF93aXRoX210KCkgaXMgaW4gSGVscGVyRnVuY3Rpb25zLmNtYWtlCisgICAgcmVwbGFjZV9tZF93aXRoX210KENNQUtFX0FTTV9NQVNNX0ZMQUdTKQorICAgIHJlcGxhY2VfbWRfd2l0aF9tdChDTUFLRV9BU01fTUFTTV9GTEFHU19SRUxFQVNFKQorICAgIHJlcGxhY2VfbWRfd2l0aF9tdChDTUFLRV9BU01fTUFTTV9GTEFHU19SRUxXSVRIREVCSU5GTykKKyAgICByZXBsYWNlX21kX3dpdGhfbXQoQ01BS0VfQVNNX01BU01fRkxBR1NfREVCVUcpCisgICAgc2V0KCR7aW5wdXRfYXNtX2ZsYWdzfSAkeyR7aW5wdXRfYXNtX2ZsYWdzfX0gIiR7bG9jYWxfYXNtX2ZsYWdzfSIgUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9jbWFrZS9NU1ZDL0NGbGFncy5jbWFrZSBiL2ZpbmFsL3J1bnRpbWUvY21ha2UvTVNWQy9DRmxhZ3MuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc2MTQ3YQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvY21ha2UvTVNWQy9DRmxhZ3MuY21ha2UKQEAgLTAsMCArMSw2NCBAQAorIyBUaGlzIGZpbGUgaG9sZHMgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gZGVwZW5kZW50IGZsYWdzCisjIFRoZSBmbGFnIHR5cGVzIGFyZToKKyMgICAxKSBDL0MrKyBDb21waWxlciBmbGFncworIyAgIDIpIEZvcnRyYW4gQ29tcGlsZXIgZmxhZ3MKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFZpc3VhbCBTdHVkaW8gQy9DKysgQ29tcGlsZXIgZmxhZ3MKK2Z1bmN0aW9uKGFwcGVuZF9jb21waWxlcl9zcGVjaWZpY19jX2FuZF9jeHhfZmxhZ3MgaW5wdXRfY19mbGFncyBpbnB1dF9jeHhfZmxhZ3MpCisgICAgc2V0KGxvY2FsX2NfZmxhZ3MpCisgICAgc2V0KGxvY2FsX2N4eF9mbGFncykKKyAgICBhcHBlbmRfY19mbGFncygiLVRQIikgIyBUZWxscyB0aGUgY29tcGlsZXIgdG8gcHJvY2VzcyBhIGZpbGUgYXMgYSBDKysgc291cmNlIGZpbGUuCisgICAgYXBwZW5kX2N4eF9mbGFncygiLUVIc2MiKSAjIEVuYWJsZSBDKysgZXhjZXB0aW9uIGhhbmRsaW5nLgorICAgIGFwcGVuZF9jX2FuZF9jeHhfZmxhZ3MoIi1XMyIpICMgRW5hYmxlcyBkaWFnbm9zdGljcyBmb3IgcmVtYXJrcywgd2FybmluZ3MsIGFuZCBlcnJvcnMuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQWRkaXRpb25hbCB3YXJuaW5ncyBhcmUgYWxzbyBlbmFibGVkIGFib3ZlIGxldmVsIDIgd2FybmluZ3MuCisgICAgYXBwZW5kX2NfYW5kX2N4eF9mbGFncygiLUdTIikgIyBMZXRzIHlvdSBjb250cm9sIHRoZSB0aHJlc2hvbGQgYXQgd2hpY2ggdGhlIHN0YWNrIGNoZWNraW5nIHJvdXRpbmUgaXMgY2FsbGVkIG9yIG5vdCBjYWxsZWQuCisgICAgaWYoJHtJQTMyfSkKKyAgICAgICAgYXBwZW5kX2NfYW5kX2N4eF9mbGFncygiLWFyY2g6aWEzMiIpICMgVGVsbHMgdGhlIGNvbXBpbGVyIHdoaWNoIGZlYXR1cmVzIGl0IG1heSB0YXJnZXQgKGlhMzIpCisgICAgICAgIGFwcGVuZF9jX2FuZF9jeHhfZmxhZ3MoIi1PeS0iKSAjIGVxdWl2YWxlbnQgdG8gLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIKKyAgICBlbmRpZigpCisgICAgIyBDTWFrZSBwcmVmZXJzIHRoZSAvTUQgZmxhZ3Mgd2hlbiBjb21waWxpbmcgV2luZG93cyBzb3VyY2VzLCBidXQgbGliaW9tcDUgbmVlZHMgdG8gdXNlIC9NVCBpbnN0ZWFkCisgICAgIyBTbyB3ZSByZXBsYWNlIHRoZXNlIC9NRCBpbnN0YW5jZXMgd2l0aCAvTVQgd2l0aGluIHRoZSBDTUFLRV8qX0ZMQUdTIHZhcmlhYmxlcyBhbmQgcHV0IHRoYXQgb3V0IHRvIHRoZSBDQUNIRS4KKyAgICAjIHJlcGxhY2VfbWRfd2l0aF9tdCgpIGlzIGluIEhlbHBlckZ1bmN0aW9ucy5jbWFrZQorICAgIHJlcGxhY2VfbWRfd2l0aF9tdChDTUFLRV9DX0ZMQUdTKQorICAgIHJlcGxhY2VfbWRfd2l0aF9tdChDTUFLRV9DX0ZMQUdTX1JFTEVBU0UpCisgICAgcmVwbGFjZV9tZF93aXRoX210KENNQUtFX0NfRkxBR1NfUkVMV0lUSERFQklORk8pCisgICAgcmVwbGFjZV9tZF93aXRoX210KENNQUtFX0NfRkxBR1NfREVCVUcpCisgICAgcmVwbGFjZV9tZF93aXRoX210KENNQUtFX0NYWF9GTEFHUykKKyAgICByZXBsYWNlX21kX3dpdGhfbXQoQ01BS0VfQ1hYX0ZMQUdTX1JFTEVBU0UpCisgICAgcmVwbGFjZV9tZF93aXRoX210KENNQUtFX0NYWF9GTEFHU19SRUxXSVRIREVCSU5GTykKKyAgICByZXBsYWNlX21kX3dpdGhfbXQoQ01BS0VfQ1hYX0ZMQUdTX0RFQlVHKQorICAgIHJlcGxhY2VfbWRfd2l0aF9tdChDTUFLRV9BU01fTUFTTV9GTEFHUykKKyAgICByZXBsYWNlX21kX3dpdGhfbXQoQ01BS0VfQVNNX01BU01fRkxBR1NfUkVMRUFTRSkKKyAgICByZXBsYWNlX21kX3dpdGhfbXQoQ01BS0VfQVNNX01BU01fRkxBR1NfUkVMV0lUSERFQklORk8pCisgICAgcmVwbGFjZV9tZF93aXRoX210KENNQUtFX0FTTV9NQVNNX0ZMQUdTX0RFQlVHKQorICAgIHNldCgke2lucHV0X2NfZmxhZ3N9ICAgJHske2lucHV0X2NfZmxhZ3N9fSAgICIke2xvY2FsX2NfZmxhZ3N9IiBQQVJFTlRfU0NPUEUpCisgICAgc2V0KCR7aW5wdXRfY3h4X2ZsYWdzfSAkeyR7aW5wdXRfY3h4X2ZsYWdzfX0gIiR7bG9jYWxfY3h4X2ZsYWdzfSIgUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVmlzdWFsIFN0dWRpbyBMaW5rZXIgZmxhZ3MKK2Z1bmN0aW9uKGFwcGVuZF9jb21waWxlcl9zcGVjaWZpY19saW5rZXJfZmxhZ3MgaW5wdXRfbGRfZmxhZ3MgaW5wdXRfbGRfZmxhZ3NfbGlicykKKyAgICBzZXQobG9jYWxfbGRfZmxhZ3MpCisgICAgc2V0KGxvY2FsX2xkX2ZsYWdzX2xpYnMpCisgICAgYXBwZW5kX2xpbmtlcl9mbGFncygiLVdYOk5PIikKKyAgICBhcHBlbmRfbGlua2VyX2ZsYWdzKCItdmVyc2lvbjoke3ZlcnNpb259LjAiKQorICAgIGFwcGVuZF9saW5rZXJfZmxhZ3MoIi1OWENvbXBhdCIpCisgICAgYXBwZW5kX2xpbmtlcl9mbGFncygiLUR5bmFtaWNCYXNlIikgIyBUaGlzIG9wdGlvbiBtb2RpZmllcyB0aGUgaGVhZGVyIG9mIGFuIGV4ZWN1dGFibGUgdG8gaW5kaWNhdGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgYmUgcmFuZG9tbHkgcmViYXNlZCBhdCBsb2FkIHRpbWUuCisgICAgaWYoJHtJQTMyfSkKKyAgICAgICAgYXBwZW5kX2xpbmtlcl9mbGFncygiLW1hY2hpbmU6aTM4NiIpCisgICAgICAgIGFwcGVuZF9saW5rZXJfZmxhZ3MoIi1zYWZlc2VoIikKKyAgICBlbHNlaWYoJHtJTlRFTDY0fSkKKyAgICAgICAgYXBwZW5kX2xpbmtlcl9mbGFncygiLW1hY2hpbmU6YW1kNjQiKQorICAgIGVuZGlmKCkKKyAgICBpZihOT1QgIiR7ZGVmX2ZpbGV9IiBTVFJFUVVBTCAiIikKKyAgICAgICAgYXBwZW5kX2xpbmtlcl9mbGFncygiLWRlZjoke2RlZl9maWxlfSIpCisgICAgZW5kaWYoKQorICAgICMgSGF2ZSBWaXN1YWwgU3R1ZGlvIHVzZSBsaW5rLmV4ZSBkaXJlY3RseQorICAgICNzZXQoQ01BS0VfQ19DUkVBVEVfU0hBUkVEX0xJQlJBUlkgImxpbmsuZXhlIC9vdXQ6PFRBUkdFVD4gPExJTktfRkxBR1M+IDxPQkpFQ1RTPiA8TElOS19MSUJSQVJJRVM+IiBQQVJFTlRfU0NPUEUpCisgICAgI3NldChDTUFLRV9TSEFSRURfTElOS0VSX0ZMQUdTICIkRU5We0xETEZBR1N9IiBDQUNIRSBTVFJJTkcgIkxpbmtlciBGbGFncyIgRk9SQ0UpCisgICAgc2V0KCR7aW5wdXRfbGRfZmxhZ3N9ICAgICAgJHske2lucHV0X2xkX2ZsYWdzfX0gICAgICAiJHtsb2NhbF9sZF9mbGFnc30iICAgICAgIFBBUkVOVF9TQ09QRSkKKyAgICBzZXQoJHtpbnB1dF9sZF9mbGFnc19saWJzfSAkeyR7aW5wdXRfbGRfZmxhZ3NfbGlic319ICIke2xvY2FsX2xkX2ZsYWdzX2xpYnN9IiAgUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQorCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL2NtYWtlL01pY3JvVGVzdHMuY21ha2UgYi9maW5hbC9ydW50aW1lL2NtYWtlL01pY3JvVGVzdHMuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBiZWI1OQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvY21ha2UvTWljcm9UZXN0cy5jbWFrZQpAQCAtMCwwICsxLDI3NyBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE1JQ1JPIFRFU1RTCisjIFRoZSBmb2xsb3dpbmcgbWljcm8tdGVzdHMgYXJlIHNtYWxsIHRlc3RzIHRvIHBlcmZvcm0gb24gCisjIHRoZSBsaWJyYXJ5IGp1c3QgY3JlYXRlZCBpbiAke2J1aWxkX2Rpcn0vLCB0aGVyZSBhcmUgY3VycmVudGx5CisjIGZpdmUgbWljcm8tdGVzdHM6IAorIyAoMSkgdGVzdC10b3VjaCAKKyMgICAgLSBDb21waWxlIGFuZCBydW4gYSBzbWFsbCBwcm9ncmFtIHVzaW5nIG5ld2x5IGNyZWF0ZWQgbGliaW9tcDUgbGlicmFyeQorIyAgICAtIEZhaWxzIGlmIHRlc3QtdG91Y2guYyBkb2VzIG5vdCBjb21waWxlIG9yIGlmIHRlc3QtdG91Y2guYyBkb2VzIG5vdCBydW4gYWZ0ZXIgY29tcGlsYXRpb24KKyMgICAgLSBQcm9ncmFtIGRlcGVuZGVuY2llczogZ2NjIG9yIGcrKywgZ3JlcCwgYm91cm5lIHNoZWxsCisjICAgIC0gQXZhaWxhYmxlIGZvciBhbGwgTGludXgsTWFjLFdpbmRvd3MgYnVpbGRzLiAgTm90IGF2YWlsYmxlIG9uIEludGVsKFIpIE1JQyBBcmNoaXRlY3R1cmUgYnVpbGRzLgorIyAoMikgdGVzdC1yZWxvCisjICAgIC0gVGVzdHMgZHluYW1pYyBsaWJyYXJpZXMgZm9yIHBvc2l0aW9uLWRlcGVuZGVudCBjb2RlIChjYW4gbm90IGhhdmUgYW55IHBvc2l0aW9uIGRlcGVuZGVudCBjb2RlKQorIyAgICAtIEZhaWxzIGlmIFRFWFRSRUwgaXMgaW4gb3V0cHV0IG9mIHJlYWRlbGYgLWQgbGliaW9tcDUuc28gY29tbWFuZAorIyAgICAtIFByb2dyYW0gZGVwZW5kZW5jaWVzOiByZWFkZWxmLCBncmVwLCBib3VybmUgc2hlbGwKKyMgICAgLSBBdmFpbGFibGUgZm9yIExpbnV4LCBJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlIGR5bmFtaWMgbGlicmFyeSBidWlsZHMuIE5vdCBhdmFpbGFibGUgb3RoZXJ3aXNlLgorIyAoMykgdGVzdC1leGVjc3RhY2sgCisjICAgIC0gVGVzdHMgaWYgc3RhY2sgaXMgZXhlY3V0YWJsZQorIyAgICAtIEZhaWxzIGlmIHN0YWNrIGlzIGV4ZWN1dGFibGUuIFNob3VsZCBvbmx5IGJlIHJlYWRhYmxlIGFuZCB3cml0YWJsZS4gTm90IGV4ZWN0dWFibGUuCisjICAgIC0gUHJvZ3JhbSBkZXBlbmRlbmNpZXM6IHBlcmwsIHJlYWRlbGYKKyMgICAgLSBBdmFpbGFibGUgZm9yIExpbnV4IGR5bmFtaWMgbGlicmFyeSBidWlsZHMuIE5vdCBhdmFpbGFibGUgb3RoZXJ3aXNlLgorIyAoNCkgdGVzdC1pbnN0ciAoSW50ZWwoUikgTUlDIEFyY2hpdGVjdXRyZSBvbmx5KSAKKyMgICAgLSBUZXN0cyBJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlIGxpYnJhcmllcyBmb3IgdmFsaWQgaW5zdHJ1Y3Rpb24gc2V0CisjICAgIC0gRmFpbHMgaWYgZmluZHMgaW52YWxpZCBpbnN0cnVjdGlvbiBmb3IgSW50ZWwoUikgTUlDIEFyY2hpdGVjdHVyZSAod2Fzbid0IGNvbXBpbGVkIHdpdGggY29ycmVjdCBmbGFncykKKyMgICAgLSBQcm9ncmFtIGRlcGVuZGVuY2llczogcGVybCwgb2JqZHVtcCAKKyMgICAgLSBBdmFpbGFibGUgZm9yIEludGVsKFIpIE1JQyBBcmNoaXRlY3R1cmUgYnVpbGRzLiBOb3QgYXZhaWxhYmxlIG90aGVyd2lzZS4KKyMgKDUpIHRlc3QtZGVwcyAgICAgIAorIyAgICAtIFRlc3RzIG5ld2x5IGNyZWF0ZWQgbGliaW9tcDUgZm9yIGxpYnJhcnkgZGVwZW5kZW5jaWVzCisjICAgIC0gRmFpbHMgaWYgc2VlcyBhIGRlcGVuZGVuY2Ugbm90IGxpc3RlZCBpbiB0ZF9leHAgdmFyaWFibGUgYmVsb3cKKyMgICAgLSBQcm9ncmFtIGRlcGVuZGVuY2llczogcGVybCwgKGxpbnV4KXJlYWRlbGYsIChtYWMpb3Rvb2xbNjRdLCAod2luZG93cylsaW5rLmV4ZQorIyAgICAtIEF2YWlsYWJsZSBmb3IgTGludXgsTWFjLFdpbmRvd3MsIEludGVsKFIpIE1JQyBBcmNoaXRlY3R1cmUgZHluYW1pYyBidWlsZHMgYW5kIFdpbmRvd3Mgc3RhdGljIGJ1aWxkcy4gTm90IGF2YWlsYWJsZSBvdGhlcndpc2UuCisjCisjIEFsbCB0ZXN0cyBjYW4gYmUgdHVybmVkIG9mZiBieSBpbmNsdWRpbmcgLUR0ZXN0cz1vZmYgd2hlbiBjYWxsaW5nIGNtYWtlCisjIEFuIGluZGl2aWR1YWwgdGVzdCBjYW4gYmUgdHVybmVkIG9mZiBieSBpc3N1aW5nIHNvbWV0aGluZyBsaWtlIC1EdGVzdF90b3VjaD1vZmYgd2hlbiBjYWxsaW5nIGNtYWtlCisKKyMgdGVzdC10b3VjaAoraWYoTk9UICR7TUlDfSBBTkQgJHt0ZXN0X3RvdWNofSBBTkQgJHt0ZXN0c30pCisgICAgaWYoJHtXSU5ET1dTfSkKKyAgICAgICAgc2V0KGRvX3Rlc3RfdG91Y2hfbXQgVFJVRSkKKyAgICAgICAgaWYoJHtkb190ZXN0X3RvdWNoX210fSkKKyAgICAgICAgICAgIHNldCh0ZXN0X3RvdWNoX2l0ZW1zICR7dGVzdF90b3VjaF9pdGVtc30gdGVzdC10b3VjaC1tZCB0ZXN0LXRvdWNoLW10KQorICAgICAgICBlbHNlKCkKKyAgICAgICAgICAgIHNldCh0ZXN0X3RvdWNoX2l0ZW1zICR7dGVzdF90b3VjaF9pdGVtc30gdGVzdC10b3VjaC1tZCkKKyAgICAgICAgZW5kaWYoKQorICAgIGVsc2UoKQorICAgICAgICBzZXQodGVzdF90b3VjaF9pdGVtcyAke3Rlc3RfdG91Y2hfaXRlbXN9IHRlc3QtdG91Y2gtcnQpCisgICAgZW5kaWYoKQorICAgIHNldChyZWd1bGFyX3Rlc3RfdG91Y2hfaXRlbXMgIiR7dGVzdF90b3VjaF9pdGVtc30iKQorICAgIGFkZF9zdWZmaXgoIi8uc3VjY2VzcyIgIHJlZ3VsYXJfdGVzdF90b3VjaF9pdGVtcykKKyAgICAjIHRlc3QtdG91Y2ggOiAke3Rlc3RfdG91Y2hfaXRlbXN9Ly5zdWNjZXNzCisgICAgc2V0KGxkZXBzICIke3JlZ3VsYXJfdGVzdF90b3VjaF9pdGVtc30iKQorICAgIGFkZF9jdXN0b21fdGFyZ2V0KCB0ZXN0LXRvdWNoIERFUEVORFMgJHtsZGVwc30pCisKKyAgICBpZigke1dJTkRPV1N9KQorICAgICAgICAjIHBpY2sgdGVzdC10b3VjaCBjb21waWxlcgorICAgICAgICBzZXQodHQtYyBjbCkKKyAgICAgICAgIyB0ZXN0LXRvdWNoIGNvbXBpbGF0aW9uIGZsYWdzCisgICAgICAgIGxpc3QoQVBQRU5EIHR0LWMtZmxhZ3MgLW5vbG9nbykKKyAgICAgICAgaWYoJHtSRUxFQVNFX0JVSUxEfSBPUiAke1JFTFdJVEhERUJJTkZPX0JVSUxEfSkKKyAgICAgICAgICAgIGxpc3QoQVBQRU5EIHR0LWMtZmxhZ3MtbXQgLU1UKQorICAgICAgICAgICAgbGlzdChBUFBFTkQgdHQtYy1mbGFncy1tZCAtTUQpCisgICAgICAgIGVsc2UoKQorICAgICAgICAgICAgbGlzdChBUFBFTkQgdHQtYy1mbGFncy1tdCAtTVRkKQorICAgICAgICAgICAgbGlzdChBUFBFTkQgdHQtYy1mbGFncy1tZCAtTURkKQorICAgICAgICBlbmRpZigpCisgICAgICAgIGxpc3QoQVBQRU5EIHR0LWxpYnMgJHtidWlsZF9kaXJ9LyR7aW1wX2ZpbGV9KQorICAgICAgICBsaXN0KEFQUEVORCB0dC1sZC1mbGFncyAtbGluayAtbm9kZWZhdWx0bGliOm9sZG5hbWVzKQorICAgICAgICBpZigke0lBMzJ9KQorICAgICAgICAgICAgbGlzdChBUFBFTkQgdHQtbGQtZmxhZ3MgLXNhZmVzZWgpCisgICAgICAgIGVuZGlmKCkKKyAgICAgICAgbGlzdChBUFBFTkQgdHQtbGQtZmxhZ3MtdiAtdmVyYm9zZSkKKyAgICBlbHNlKCkgIyAoVW5peCBiYXNlZCBzeXN0ZW1zLCBJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlLCBhbmQgTWFjKQorICAgICAgICAjIHBpY2sgdGVzdC10b3VjaCBjb21waWxlcgorICAgICAgICBpZigke1NURF9DUFBfTElCfSkKKyAgICAgICAgICAgIHNldCh0dC1jICR7Q01BS0VfQ1hYX0NPTVBJTEVSfSkKKyAgICAgICAgZWxzZSgpCisgICAgICAgICAgICBzZXQodHQtYyAke0NNQUtFX0NfQ09NUElMRVJ9KQorICAgICAgICBlbmRpZigpCisgICAgICAgICMgdGVzdC10b3VjaCBjb21waWxhdGlvbiBmbGFncworICAgICAgICBpZigke0xJTlVYfSkKKyAgICAgICAgICAgIGxpc3QoQVBQRU5EIHR0LWMtZmxhZ3MgLXB0aHJlYWQpCisgICAgICAgIGVuZGlmKCkKKyAgICAgICAgaWYoJHtJQTMyfSkKKyAgICAgICAgICAgIGxpc3QoQVBQRU5EIHR0LWMtZmxhZ3MgLW0zMikKKyAgICAgICAgZWxzZWlmKCR7SU5URUw2NH0pCisgICAgICAgICAgICBsaXN0KEFQUEVORCB0dC1jLWZsYWdzIC1tNjQpCisgICAgICAgIGVuZGlmKCkKKyAgICAgICAgbGlzdChBUFBFTkQgdHQtbGlicyAke2J1aWxkX2Rpcn0vJHtsaWJfZmlsZX0pCisgICAgICAgIGlmKCR7TUFDfSkKKyAgICAgICAgICAgIGxpc3QoQVBQRU5EIHR0LWxkLWZsYWdzLXYgLVdsLC10KQorICAgICAgICAgICAgc2V0KHR0LWVudiAiRFlMRF9MSUJSQVJZX1BBVEg9LjokRU5We0RZTERfTElCUkFSWV9QQVRIfSIpCisgICAgICAgIGVsc2UoKQorICAgICAgICAgICAgbGlzdChBUFBFTkQgdHQtbGQtZmxhZ3MtdiAtV2wsLS12ZXJib3NlKQorICAgICAgICAgICAgc2V0KHR0LWVudiBMRF9MSUJSQVJZX1BBVEg9Ii46JHtidWlsZF9kaXJ9OiRFTlZ7TERfTElCUkFSWV9QQVRIfSIpCisgICAgICAgIGVuZGlmKCkKKyAgICBlbmRpZigpCisgICAgbGlzdChBUFBFTkQgdHQtYy1mbGFncyAiJHt0dC1jLWZsYWdzLXJ0fSIpCisgICAgbGlzdChBUFBFTkQgdHQtZW52ICJLTVBfVkVSU0lPTj0xIikKKworICAgIG1hY3JvKHRlc3RfdG91Y2hfcmVjaXBlIHRlc3RfdG91Y2hfZGlyKQorICAgICAgICBmaWxlKE1BS0VfRElSRUNUT1JZICR7YnVpbGRfZGlyfS8ke3Rlc3RfdG91Y2hfZGlyfSkKKyAgICAgICAgc2V0KGxkZXBzICR7c3JjX2Rpcn0vdGVzdC10b3VjaC5jICR7YnVpbGRfZGlyfS8ke2xpYl9maWxlfSkKKyAgICAgICAgc2V0KHR0LWV4ZS1maWxlICR7dGVzdF90b3VjaF9kaXJ9L3Rlc3QtdG91Y2gke2V4ZX0pCisgICAgICAgIGlmKCR7V0lORE9XU30pCisgICAgICAgICAgICAjICoqKioqKiBsaXN0KEFQUEVORCB0dC1jLWZsYWdzIC1GbyQoZGlyICRAKXRlc3QtdG91Y2gke29ian0gLUZlJChkaXIgJEApdGVzdC10b3VjaCR7ZXhlfSkgKioqKioqKgorICAgICAgICAgICAgc2V0KHR0LWMtZmxhZ3Mtb3V0IC1GbyR7dGVzdF90b3VjaF9kaXJ9L3Rlc3QtdG91Y2gke29ian0gLUZlJHt0ZXN0X3RvdWNoX2Rpcn0vdGVzdC10b3VjaCR7ZXhlfSkKKyAgICAgICAgICAgIGxpc3QoQVBQRU5EIGxkZXBzICR7YnVpbGRfZGlyfS8ke2ltcF9maWxlfSkKKyAgICAgICAgZWxzZSgpCisgICAgICAgICAgICAjICoqKioqKiBsaXN0KEFQUEVORCB0dC1jLWZsYWdzIC1vICQoZGlyICRAKXRlc3QtdG91Y2gke2V4ZX0pICoqKioqKioqCisgICAgICAgICAgICBzZXQodHQtYy1mbGFncy1vdXQgLW8gJHt0ZXN0X3RvdWNoX2Rpcn0vdGVzdC10b3VjaCR7ZXhlfSkKKyAgICAgICAgZW5kaWYoKQorICAgICAgICBhZGRfY3VzdG9tX2NvbW1hbmQoCisgICAgICAgICAgICBPVVRQVVQgICR7dGVzdF90b3VjaF9kaXJ9Ly5zdWNjZXNzCisgICAgICAgICAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgcmVtb3ZlIC1mICR7dGVzdF90b3VjaF9kaXJ9LyoKKyAgICAgICAgICAgIENPTU1BTkQgJHt0dC1jfSAke3R0LWMtZmxhZ3Mtb3V0fSAke3R0LWMtZmxhZ3N9ICR7c3JjX2Rpcn0vdGVzdC10b3VjaC5jICR7dHQtbGlic30gJHt0dC1sZC1mbGFnc30KKyAgICAgICAgICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSByZW1vdmUgLWYgJHt0dC1leGUtZmlsZX0KKyAgICAgICAgICAgIENPTU1BTkQgJHt0dC1jfSAke3R0LWMtZmxhZ3Mtb3V0fSAke3R0LWMtZmxhZ3N9ICR7c3JjX2Rpcn0vdGVzdC10b3VjaC5jICR7dHQtbGlic30gJHt0dC1sZC1mbGFnc30gJHt0dC1sZC1mbGFncy12fSA+ICR7dGVzdF90b3VjaF9kaXJ9L2J1aWxkLmxvZyAyPiYxCisgICAgICAgICAgICBDT01NQU5EICR7dHQtZW52fSAke3R0LWV4ZS1maWxlfQorICAgICAgICAgICAgI0NPTU1BTkQgZ3JlcCAtaSAtZSBcIlteX11saWJpcmNcIiAke3Rlc3RfdG91Y2hfZGlyfS9idWlsZC5sb2cgPiAke3Rlc3RfdG91Y2hfZGlyfS9saWJpcmMubG9nIFw7IFsgJCQ/IC1lcSAxIF0KKyAgICAgICAgICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSB0b3VjaCAke3Rlc3RfdG91Y2hfZGlyfS8uc3VjY2VzcworICAgICAgICAgICAgREVQRU5EUyAke2xkZXBzfQorICAgICAgICApCisgICAgZW5kbWFjcm8oKQorICAgIGlmKCR7V0lORE9XU30pCisgICAgICAgIHRlc3RfdG91Y2hfcmVjaXBlKHRlc3QtdG91Y2gtbXQpCisgICAgICAgIHRlc3RfdG91Y2hfcmVjaXBlKHRlc3QtdG91Y2gtbWQpCisgICAgZWxzZSgpCisgICAgICAgIHRlc3RfdG91Y2hfcmVjaXBlKHRlc3QtdG91Y2gtcnQpCisgICAgZW5kaWYoKQorZWxzZSgpCisgICAgYWRkX2N1c3RvbV90YXJnZXQodGVzdC10b3VjaCBERVBFTkRTIHRlc3QtdG91Y2gvLnN1Y2Nlc3MpCisgICAgbWFjcm8odGVzdF90b3VjaF9yZWNpcGVfc2tpcCB0ZXN0X3RvdWNoX2RpcikKKyAgICAgICAgaWYoJHt0ZXN0c30gQU5EICR7dGVzdF90b3VjaH0pCisgICAgICAgICAgICBzZXQodGVzdF90b3VjaF9tZXNzYWdlICd0ZXN0LXRvdWNoIGlzIG5vdCBhdmFpbGFibGUgZm9yIHRoZSBJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlLiAgV2lsbCBub3QgcGVyZm9ybSBpdC4nKQorICAgICAgICBlbHNlKCkKKyAgICAgICAgICAgIHNldCh0ZXN0X3RvdWNoX21lc3NhZ2UgInRlc3QtdG91Y2ggaXMgdHVybmVkIG9mZi4gIFdpbGwgbm90IHBlcmZvcm0gaXQuIikKKyAgICAgICAgZW5kaWYoKQorICAgICAgICBhZGRfY3VzdG9tX2NvbW1hbmQoCisgICAgICAgICAgICBPVVRQVVQgJHt0ZXN0X3RvdWNoX2Rpcn0vLnN1Y2Nlc3MKKyAgICAgICAgICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBlY2hvICR7dGVzdF90b3VjaF9tZXNzYWdlfQorICAgICAgICApCisgICAgZW5kbWFjcm8oKQorICAgIHRlc3RfdG91Y2hfcmVjaXBlX3NraXAodGVzdC10b3VjaC1ydCkKKyAgICB0ZXN0X3RvdWNoX3JlY2lwZV9za2lwKHRlc3QtdG91Y2gtbXQpCisgICAgdGVzdF90b3VjaF9yZWNpcGVfc2tpcCh0ZXN0LXRvdWNoLW1kKQorZW5kaWYoKQorCisjIHRlc3QtcmVsbyAKK2FkZF9jdXN0b21fdGFyZ2V0KHRlc3QtcmVsbyBERVBFTkRTIHRlc3QtcmVsby8uc3VjY2VzcykKK2lmKCgke0xJTlVYfSBPUiAke01JQ30pIEFORCAke3Rlc3RfcmVsb30gQU5EICR7dGVzdHN9KQorICAgIGZpbGUoTUFLRV9ESVJFQ1RPUlkgJHtidWlsZF9kaXJ9L3Rlc3QtcmVsbykKKyAgICBhZGRfY3VzdG9tX2NvbW1hbmQoCisgICAgICAgIE9VVFBVVCAgdGVzdC1yZWxvLy5zdWNjZXNzCisgICAgICAgIENPTU1BTkQgcmVhZGVsZiAtZCAke2J1aWxkX2Rpcn0vJHtsaWJfZmlsZX0gPiB0ZXN0LXJlbG8vcmVhZGVsZi5sb2cKKyAgICAgICAgQ09NTUFORCBncmVwIC1lIFRFWFRSRUwgdGVzdC1yZWxvL3JlYWRlbGYubG9nIFw7IFsgJCQ/IC1lcSAxIF0KKyAgICAgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIHRvdWNoIHRlc3QtcmVsby8uc3VjY2VzcworICAgICAgICBERVBFTkRTICR7YnVpbGRfZGlyfS8ke2xpYl9maWxlfQorICAgICkKK2Vsc2UoKQorICAgIGlmKCR7dGVzdHN9IEFORCAke3Rlc3RfcmVsb30pCisgICAgICAgIHNldCh0ZXN0X3JlbG9fbWVzc2FnZSAndGVzdC1yZWxvIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBkeW5hbWljIGxpYnJhcnkgb24gTGludXggb3IgSW50ZWwoUikgTUlDIEFyY2hpdGVjdHVyZS4gIFdpbGwgbm90IHBlcmZvcm0gaXQuJykKKyAgICBlbHNlKCkKKyAgICAgICAgc2V0KHRlc3RfcmVsb19tZXNzYWdlICJ0ZXN0LXJlbG8gaXMgdHVybmVkIG9mZi4gIFdpbGwgbm90IHBlcmZvcm0gaXQuIikKKyAgICBlbmRpZigpCisgICAgYWRkX2N1c3RvbV9jb21tYW5kKAorICAgICAgICBPVVRQVVQgIHRlc3QtcmVsby8uc3VjY2VzcworICAgICAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgZWNobyAke3Rlc3RfcmVsb19tZXNzYWdlfQorICAgICkKK2VuZGlmKCkKKworIyB0ZXN0LWV4ZWNzdGFjaworYWRkX2N1c3RvbV90YXJnZXQodGVzdC1leGVjc3RhY2sgREVQRU5EUyB0ZXN0LWV4ZWNzdGFjay8uc3VjY2VzcykKK2lmKCR7TElOVVh9IEFORCAke3Rlc3RfZXhlY3N0YWNrfSBBTkQgJHt0ZXN0c30pCisgICAgZmlsZShNQUtFX0RJUkVDVE9SWSAke2J1aWxkX2Rpcn0vdGVzdC1leGVjc3RhY2spCisgICAgYWRkX2N1c3RvbV9jb21tYW5kKAorICAgICAgICBPVVRQVVQgIHRlc3QtZXhlY3N0YWNrLy5zdWNjZXNzCisgICAgICAgIENPTU1BTkQgJHtQRVJMX0VYRUNVVEFCTEV9ICR7dG9vbHNfZGlyfS9jaGVjay1leGVjc3RhY2sucGwgJHtidWlsZF9kaXJ9LyR7bGliX2ZpbGV9CisgICAgICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSB0b3VjaCB0ZXN0LWV4ZWNzdGFjay8uc3VjY2VzcworICAgICAgICBERVBFTkRTICR7YnVpbGRfZGlyfS8ke2xpYl9maWxlfQorICAgICkKK2Vsc2UoKQorICAgIGlmKCR7dGVzdHN9IEFORCAke3Rlc3RfZXhlY3N0YWNrfSkKKyAgICAgICAgc2V0KHRlc3RfZXhlY3N0YWNrX21lc3NhZ2UgInRlc3QtZXhlY3N0YWNrIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBkeW5hbWljIGxpYnJhcnkgb24gTGludXguICBXaWxsIG5vdCBwZXJmb3JtIGl0LiIpCisgICAgZWxzZSgpCisgICAgICAgIHNldCh0ZXN0X2V4ZWNzdGFja19tZXNzYWdlICJ0ZXN0LWV4ZWNzdGFjayBpcyB0dXJuZWQgb2ZmLiAgV2lsbCBub3QgcGVyZm9ybSBpdC4iKQorICAgIGVuZGlmKCkKKyAgICBhZGRfY3VzdG9tX2NvbW1hbmQoCisgICAgICAgIE9VVFBVVCAgdGVzdC1leGVjc3RhY2svLnN1Y2Nlc3MKKyAgICAgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGVjaG8gJHt0ZXN0X2V4ZWNzdGFja19tZXNzYWdlfQorICAgICkKK2VuZGlmKCkKKworIyB0ZXN0LWluc3RyCithZGRfY3VzdG9tX3RhcmdldCh0ZXN0LWluc3RyIERFUEVORFMgdGVzdC1pbnN0ci8uc3VjY2VzcykKK2lmKCR7TUlDfSBBTkQgJHt0ZXN0X2luc3RyfSBBTkQgJHt0ZXN0c30pCisgICAgZmlsZShNQUtFX0RJUkVDVE9SWSAke2J1aWxkX2Rpcn0vdGVzdC1pbnN0cikKKyAgICBhZGRfY3VzdG9tX2NvbW1hbmQoCisgICAgICAgIE9VVFBVVCAgdGVzdC1pbnN0ci8uc3VjY2VzcworICAgICAgICBDT01NQU5EICR7UEVSTF9FWEVDVVRBQkxFfSAke3Rvb2xzX2Rpcn0vY2hlY2staW5zdHJ1Y3Rpb24tc2V0LnBsICR7b2Ffb3B0c30gLS1zaG93IC0tbWljLWFyY2g9JHttaWNfYXJjaH0gLS1taWMtb3M9JHttaWNfb3N9ICR7YnVpbGRfZGlyfS8ke2xpYl9maWxlfQorICAgICAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgdG91Y2ggdGVzdC1pbnN0ci8uc3VjY2VzcworICAgICAgICBERVBFTkRTICR7YnVpbGRfZGlyfS8ke2xpYl9maWxlfSAke3Rvb2xzX2Rpcn0vY2hlY2staW5zdHJ1Y3Rpb24tc2V0LnBsCisgICAgKQorZWxzZSgpCisgICAgaWYoJHt0ZXN0c30gQU5EICR7dGVzdF9pbnN0cn0pCisgICAgICAgIHNldCh0ZXN0X2luc3RyX21lc3NhZ2UgJ3Rlc3QtaW5zdHIgaXMgb25seSBhdmFpbGFibGUgZm9yIEludGVsKFIpIE1JQyBBcmNoaXRlY3R1cmUgbGlicmFyaWVzLiAgV2lsbCBub3QgcGVyZm9ybSBpdC4nKQorICAgIGVsc2UoKQorICAgICAgICBzZXQodGVzdF9pbnN0cl9tZXNzYWdlICJ0ZXN0LWluc3RyIGlzIHR1cm5lZCBvZmYuICBXaWxsIG5vdCBwZXJmb3JtIGl0LiIpCisgICAgZW5kaWYoKQorICAgIGFkZF9jdXN0b21fY29tbWFuZCgKKyAgICAgICAgT1VUUFVUICB0ZXN0LWluc3RyLy5zdWNjZXNzCisgICAgICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBlY2hvICR7dGVzdF9pbnN0cl9tZXNzYWdlfQorICAgICkKK2VuZGlmKCkKKworIyB0ZXN0LWRlcHMKK2FkZF9jdXN0b21fdGFyZ2V0KHRlc3QtZGVwcyBERVBFTkRTIHRlc3QtZGVwcy8uc3VjY2VzcykKK2lmKCR7dGVzdF9kZXBzfSBBTkQgJHt0ZXN0c30pCisgICAgc2V0KHRkX2V4cCkKKyAgICBpZigke0ZSRUVCU0R9KQorICAgICAgICBzZXQodGRfZXhwIGxpYmMuc28uNyBsaWJ0aHIuc28uMyBsaWJ1bndpbmQuc28uNSkKKyAgICBlbHNlaWYoJHtMSU5VWH0pCisgICAgICAgIHNldCh0ZF9leHAgbGliZGwuc28uMixsaWJnY2Nfcy5zby4xKQorICAgICAgICBpZihOT1QgJHtJQTMyfSBBTkQgTk9UICR7SU5URUw2NH0pCisgICAgICAgICAgICBzZXQodGRfZXhwICR7dGRfZXhwfSxsaWJmZmkuc28uNixsaWJmZmkuc28uNSkKKyAgICAgICAgZW5kaWYoKQorICAgICAgICBpZigke0lBMzJ9KQorICAgICAgICAgICAgc2V0KHRkX2V4cCAke3RkX2V4cH0sbGliYy5zby42LGxkLWxpbnV4LnNvLjIpICAKKyAgICAgICAgZWxzZWlmKCR7SU5URUw2NH0pCisgICAgICAgICAgICBzZXQodGRfZXhwICR7dGRfZXhwfSxsaWJjLnNvLjYsbGQtbGludXgteDg2LTY0LnNvLjIpICAKKyAgICAgICAgZWxzZWlmKCR7QVJNfSkKKyAgICAgICAgICAgIHNldCh0ZF9leHAgJHt0ZF9leHB9LGxpYmMuc28uNixsZC1saW51eC1hcm1oZi5zby4zKSAgCisgICAgICAgIGVuZGlmKCkKKyAgICAgICAgaWYoJHtTVERfQ1BQX0xJQn0pCisgICAgICAgICAgICBzZXQodGRfZXhwICR7dGRfZXhwfSxsaWJzdGRjKysuc28uNikKKyAgICAgICAgZW5kaWYoKQorICAgICAgICBpZihOT1QgJHtTVFVCU19MSUJSQVJZfSkKKyAgICAgICAgICAgIHNldCh0ZF9leHAgJHt0ZF9leHB9LGxpYnB0aHJlYWQuc28uMCkKKyAgICAgICAgZW5kaWYoKQorICAgIGVsc2VpZigke01JQ30pCisgICAgICAgIGlmKCIke21pY19vc30iIFNUUkVRVUFMICJsaW4iKQorICAgICAgICAgICAgc2V0KHRkX2V4cCBsaWJjLnNvLjYsbGlicHRocmVhZC5zby4wLGxpYmRsLnNvLjIpCisgICAgICAgICAgICBpZigke1NURF9DUFBfTElCfSkKKyAgICAgICAgICAgICAgICBzZXQodGRfZXhwICR7dGRfZXhwfSxsaWJzdGRjKysuc28uNikKKyAgICAgICAgICAgIGVuZGlmKCkKKyAgICAgICAgICAgIGlmKCIke21pY19hcmNofSIgU1RSRVFVQUwgImtuZiIpCisgICAgICAgICAgICAgICAgc2V0KHRkX2V4cCAke3RkX2V4cH0sbGQtbGludXgtbDFvbS5zby4yLGxpYmdjY19zLnNvLjEpCisgICAgICAgICAgICBlbHNlaWYoIiR7bWljX2FyY2h9IiBTVFJFUVVBTCAia25jIikKKyAgICAgICAgICAgICAgICBzZXQodGRfZXhwICR7dGRfZXhwfSxsZC1saW51eC1rMW9tLnNvLjIpCisgICAgICAgICAgICBlbmRpZigpCisgICAgICAgIGVsc2VpZigiJHttaWNfb3N9IiBTVFJFUVVBTCAiYnNkIikKKyAgICAgICAgICAgIHNldCh0ZF9leHAgbGliYy5zby43LGxpYnRoci5zby4zLGxpYnVud2luZC5zby41KQorICAgICAgICBlbmRpZigpCisgICAgZWxzZWlmKCR7TUFDfSkKKyAgICAgICAgc2V0KHRkX2V4cCAvdXNyL2xpYi9saWJTeXN0ZW0uQi5keWxpYikKKyAgICBlbHNlaWYoJHtXSU5ET1dTfSkKKyAgICAgICAgc2V0KHRkX2V4cCBrZXJuZWwzMi5kbGwpCisgICAgZW5kaWYoKQorCisgICAgZmlsZShNQUtFX0RJUkVDVE9SWSAke2J1aWxkX2Rpcn0vdGVzdC1kZXBzKQorICAgIGFkZF9jdXN0b21fY29tbWFuZCgKKyAgICAgICAgT1VUUFVUICB0ZXN0LWRlcHMvLnN1Y2Nlc3MKKyAgICAgICAgQ09NTUFORCAke1BFUkxfRVhFQ1VUQUJMRX0gJHt0b29sc19kaXJ9L2NoZWNrLWRlcGVuZHMucGwgJHtvYV9vcHRzfSAtLWV4cGVjdGVkPSIke3RkX2V4cH0iICR7YnVpbGRfZGlyfS8ke2xpYl9maWxlfQorICAgICAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgdG91Y2ggdGVzdC1kZXBzLy5zdWNjZXNzCisgICAgICAgIERFUEVORFMgJHtidWlsZF9kaXJ9LyR7bGliX2ZpbGV9ICR7dG9vbHNfZGlyfS9jaGVjay1kZXBlbmRzLnBsCisgICAgKQorZWxzZSgpCisgICAgaWYoJHt0ZXN0c30gQU5EICR7dGVzdF9kZXBzfSkKKyAgICAgICAgc2V0KHRlc3RfZGVwc19tZXNzYWdlICd0ZXN0LWRlcHMgaXMgYXZhaWxhYmxlIGZvciBkeW5hbWljIGxpYnJhcmllcyBvbiBMaW51eCwgTWFjLCBJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlLCBXaW5kb3dzIGFuZCBzdGF0aWMgbGlicmFyaWVzIG9uIFdpbmRvd3MuICBXaWxsIG5vdCBwZXJmb3JtIGl0LicpCisgICAgZWxzZSgpCisgICAgICAgIHNldCh0ZXN0X2RlcHNfbWVzc2FnZSAidGVzdC1kZXBzIGlzIHR1cm5lZCBvZmYuICBXaWxsIG5vdCBwZXJmb3JtIGl0LiIpCisgICAgZW5kaWYoKQorICAgIGFkZF9jdXN0b21fY29tbWFuZCgKKyAgICAgICAgT1VUUFVUICB0ZXN0LWRlcHMvLnN1Y2Nlc3MKKyAgICAgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGVjaG8gJHt0ZXN0X2RlcHNfbWVzc2FnZX0KKyAgICApCitlbmRpZigpCisjIEVORCBPRiBURVNUUworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL2NtYWtlL1BlcmxGbGFncy5jbWFrZSBiL2ZpbmFsL3J1bnRpbWUvY21ha2UvUGVybEZsYWdzLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNGQyOWQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL2NtYWtlL1BlcmxGbGFncy5jbWFrZQpAQCAtMCwwICsxLDkwIEBACisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgdm9pZCBhcHBlbmRfZXZfZmxhZ3Moc3RyaW5nIG5ld19mbGFnKTsKKyMgLSBhcHBlbmRzIG5ld19mbGFnIHRvIGV2X2ZsYWdzIGxpc3QKK21hY3JvKGFwcGVuZF9ldl9mbGFncyBuZXdfZmxhZykKKyAgICBsaXN0KEFQUEVORCBsb2NhbF9ldl9mbGFncyAiJHtuZXdfZmxhZ30iKQorZW5kbWFjcm8oKQorCisjIHZvaWQgYXBwZW5kX2dkX2ZsYWdzKHN0cmluZyBuZXdfZmxhZyk7CisjIC0gYXBwZW5kcyBuZXdfZmxhZyB0byBnZF9mbGFncyBsaXN0CittYWNybyhhcHBlbmRfZ2RfZmxhZ3MgbmV3X2ZsYWcpCisgICAgbGlzdChBUFBFTkQgbG9jYWxfZ2RfZmxhZ3MgIiR7bmV3X2ZsYWd9IikKK2VuZG1hY3JvKCkKKworaW5jbHVkZShIZWxwZXJGdW5jdGlvbnMpICMgZm9yIHNldF9sZWdhbF90eXBlKCksIHNldF9sZWdhbF9hcmNoKCkKKworIyBQZXJsIGV4cGFuZC12YXJzLnBsIGZsYWdzCitmdW5jdGlvbihzZXRfZXZfZmxhZ3MgaW5wdXRfZXZfZmxhZ3MpCisgICAgc2V0KGxvY2FsX2V2X2ZsYWdzKQorICAgIHNldF9sZWdhbF90eXBlKCIke2xpYl90eXBlfSIgbGVnYWxfdHlwZSkKKyAgICBzZXRfbGVnYWxfYXJjaCgiJHthcmNofSIgbGVnYWxfYXJjaCkKKyAgICAjIG5lZWQgLUQgUmV2aXNpb249IlwkUmV2aXNpb24iIHRvIHNob3cgdXAKKyAgICBhcHBlbmRfZXZfZmxhZ3MoIi1EIFJldmlzaW9uPVwiXFxcXCQkUmV2aXNpb25cIiIpIAorICAgIGFwcGVuZF9ldl9mbGFncygiLUQgRGF0ZT1cIlxcXFwkJERhdGVcIiIpCisgICAgYXBwZW5kX2V2X2ZsYWdzKCItRCBLTVBfVFlQRT1cIiR7bGVnYWxfdHlwZX1cIiIpCisgICAgYXBwZW5kX2V2X2ZsYWdzKCItRCBLTVBfQVJDSD1cIiR7bGVnYWxfYXJjaH1cIiIpCisgICAgYXBwZW5kX2V2X2ZsYWdzKCItRCBLTVBfVkVSU0lPTl9NQUpPUj0ke3ZlcnNpb259IikKKyAgICBhcHBlbmRfZXZfZmxhZ3MoIi1EIEtNUF9WRVJTSU9OX01JTk9SPTAiKQorICAgIGFwcGVuZF9ldl9mbGFncygiLUQgS01QX1ZFUlNJT05fQlVJTEQ9JHtidWlsZF9udW1iZXJ9IikKKyAgICBhcHBlbmRfZXZfZmxhZ3MoIi1EIEtNUF9CVUlMRF9EQVRFPVwiJHtkYXRlfVwiIikKKyAgICBhcHBlbmRfZXZfZmxhZ3MoIi1EIEtNUF9UQVJHRVRfQ09NUElMRVI9MTIiKQorICAgIGlmKCR7REVCVUdfQlVJTER9IE9SICR7UkVMV0lUSERFQklORk9fQlVJTER9KQorICAgICAgICBhcHBlbmRfZXZfZmxhZ3MoIi1EIEtNUF9ESUFHPTEiKQorICAgICAgICBhcHBlbmRfZXZfZmxhZ3MoIi1EIEtNUF9ERUJVR19JTkZPPTEiKQorICAgIGVsc2UoKQorICAgICAgICBhcHBlbmRfZXZfZmxhZ3MoIi1EIEtNUF9ESUFHPTAiKQorICAgICAgICBhcHBlbmRfZXZfZmxhZ3MoIi1EIEtNUF9ERUJVR19JTkZPPTAiKQorICAgIGVuZGlmKCkKKyAgICBpZigke29tcF92ZXJzaW9ufSBFUVVBTCA0MCkKKyAgICAgICAgYXBwZW5kX2V2X2ZsYWdzKCItRCBPTVBfVkVSU0lPTj0yMDEzMDciKQorICAgIGVsc2VpZigke29tcF92ZXJzaW9ufSBFUVVBTCAzMCkKKyAgICAgICAgYXBwZW5kX2V2X2ZsYWdzKCItRCBPTVBfVkVSU0lPTj0yMDExMDciKQorICAgIGVsc2UoKQorICAgICAgICBhcHBlbmRfZXZfZmxhZ3MoIi1EIE9NUF9WRVJTSU9OPTIwMDUwNSIpCisgICAgZW5kaWYoKQorICAgIHNldCgke2lucHV0X2V2X2ZsYWdzfSAiJHtsb2NhbF9ldl9mbGFnc30iIFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKKworZnVuY3Rpb24oc2V0X2dkX2ZsYWdzIGlucHV0X2dkX2ZsYWdzKQorICAgIHNldChsb2NhbF9nZF9mbGFncykKKyAgICBpZigke0lBMzJ9KQorICAgICAgICBhcHBlbmRfZ2RfZmxhZ3MoIi1EIGFyY2hfMzIiKQorICAgIGVsc2VpZigke0lOVEVMNjR9KQorICAgICAgICBhcHBlbmRfZ2RfZmxhZ3MoIi1EIGFyY2hfMzJlIikKKyAgICBlbHNlKCkKKyAgICAgICAgYXBwZW5kX2dkX2ZsYWdzKCItRCBhcmNoXyR7YXJjaH0iKQorICAgIGVuZGlmKCkKKyAgICBpZigke05PUk1BTF9MSUJSQVJZfSkKKyAgICAgICAgYXBwZW5kX2dkX2ZsYWdzKCItRCBub3JtIikKKyAgICBlbHNlaWYoJHtQUk9GSUxFX0xJQlJBUll9KQorICAgICAgICBhcHBlbmRfZ2RfZmxhZ3MoIi1EIHByb2YiKQorICAgIGVsc2VpZigke1NUVUJTX0xJQlJBUll9KQorICAgICAgICBhcHBlbmRfZ2RfZmxhZ3MoIi1EIHN0dWIiKQorICAgIGVuZGlmKCkKKyAgICBpZigke29tcF92ZXJzaW9ufSBHUkVBVEVSIDQwIE9SICR7b21wX3ZlcnNpb259IEVRVUFMIDQwKQorICAgICAgICBhcHBlbmRfZ2RfZmxhZ3MoIi1EIE9NUF80MCIpCisgICAgZW5kaWYoKQorICAgIGlmKCR7b21wX3ZlcnNpb259IEdSRUFURVIgMzAgT1IgJHtvbXBfdmVyc2lvbn0gRVFVQUwgMzApCisgICAgICAgIGFwcGVuZF9nZF9mbGFncygiLUQgT01QXzMwIikKKyAgICBlbmRpZigpCisgICAgaWYoTk9UICIke3ZlcnNpb259IiBTVFJFUVVBTCAiNCIpCisgICAgICAgIGFwcGVuZF9nZF9mbGFncygiLUQgbXN2Y19jb21wYXQiKQorICAgIGVuZGlmKCkKKyAgICBpZigke0RFQlVHX0JVSUxEfSBPUiAke1JFTFdJVEhERUJJTkZPX0JVSUxEfSkKKyAgICAgICAgYXBwZW5kX2dkX2ZsYWdzKCItRCBLTVBfREVCVUciKQorICAgIGVuZGlmKCkKKyAgICBpZigke0NPTVBJTEVSX1NVUFBPUlRTX1FVQURfUFJFQ0lTSU9OfSkKKyAgICAgICAgYXBwZW5kX2dkX2ZsYWdzKCItRCBIQVZFX1FVQUQiKQorICAgIGVuZGlmKCkKKyAgICBzZXQoJHtpbnB1dF9nZF9mbGFnc30gIiR7bG9jYWxfZ2RfZmxhZ3N9IiBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL2NtYWtlL1NvdXJjZUZpbGVzLmNtYWtlIGIvZmluYWwvcnVudGltZS9jbWFrZS9Tb3VyY2VGaWxlcy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODg0ZmVhCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9jbWFrZS9Tb3VyY2VGaWxlcy5jbWFrZQpAQCAtMCwwICsxLDExMCBAQAorIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCittYWNybyhhcHBlbmRfY19zb3VyY2VfZmlsZSBuZXdfY19maWxlKQorICAgIGxpc3QoQVBQRU5EIGxvY2FsX2Nfc291cmNlX2ZpbGVzICIke25ld19jX2ZpbGV9IikKK2VuZG1hY3JvKCkKKworbWFjcm8oYXBwZW5kX2NwcF9zb3VyY2VfZmlsZSBuZXdfY3BwX2ZpbGUpCisgICAgbGlzdChBUFBFTkQgbG9jYWxfY3BwX3NvdXJjZV9maWxlcyAiJHtuZXdfY3BwX2ZpbGV9IikKK2VuZG1hY3JvKCkKKworbWFjcm8oYXBwZW5kX2FzbV9zb3VyY2VfZmlsZSBuZXdfYXNtX2ZpbGUpCisgICAgbGlzdChBUFBFTkQgbG9jYWxfYXNtX3NvdXJjZV9maWxlcyAiJHtuZXdfYXNtX2ZpbGV9IikKK2VuZG1hY3JvKCkKKworbWFjcm8oYXBwZW5kX2ltcF9jX3NvdXJjZV9maWxlIG5ld19pbXBvcnRfY19maWxlKQorICAgIGxpc3QoQVBQRU5EIGxvY2FsX2ltcF9jX2ZpbGVzICIke25ld19pbXBvcnRfY19maWxlfSIpCitlbmRtYWNybygpCisKKyMgZmlsZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSBzcmMgZGlyZWN0b3J5CisKK2Z1bmN0aW9uKHNldF9jX2ZpbGVzIGlucHV0X2Nfc291cmNlX2ZpbGVzKSAKKyAgICBzZXQobG9jYWxfY19zb3VyY2VfZmlsZXMgIiIpCisgICAgYXBwZW5kX2Nfc291cmNlX2ZpbGUoImttcF9mdG5fY2RlY2wuYyIpCisgICAgYXBwZW5kX2Nfc291cmNlX2ZpbGUoImttcF9mdG5fZXh0cmEuYyIpCisgICAgYXBwZW5kX2Nfc291cmNlX2ZpbGUoImttcF92ZXJzaW9uLmMiKQorICAgIGlmKCR7U1RVQlNfTElCUkFSWX0pCisgICAgICAgIGFwcGVuZF9jX3NvdXJjZV9maWxlKCJrbXBfc3R1Yi5jIikKKyAgICBlbHNlKCkKKyAgICAgICAgYXBwZW5kX2Nfc291cmNlX2ZpbGUoImttcF9hbGxvYy5jIikKKyAgICAgICAgYXBwZW5kX2Nfc291cmNlX2ZpbGUoImttcF9hdG9taWMuYyIpCisgICAgICAgIGFwcGVuZF9jX3NvdXJjZV9maWxlKCJrbXBfY3N1cHBvcnQuYyIpCisgICAgICAgIGFwcGVuZF9jX3NvdXJjZV9maWxlKCJrbXBfZGVidWcuYyIpCisgICAgICAgIGFwcGVuZF9jX3NvdXJjZV9maWxlKCJrbXBfaXR0LmMiKQorICAgICAgICBhcHBlbmRfY19zb3VyY2VfZmlsZSgia21wX2Vudmlyb25tZW50LmMiKQorICAgICAgICBhcHBlbmRfY19zb3VyY2VfZmlsZSgia21wX2Vycm9yLmMiKQorICAgICAgICBhcHBlbmRfY19zb3VyY2VfZmlsZSgia21wX2dsb2JhbC5jIikKKyAgICAgICAgYXBwZW5kX2Nfc291cmNlX2ZpbGUoImttcF9pMThuLmMiKQorICAgICAgICBhcHBlbmRfY19zb3VyY2VfZmlsZSgia21wX2lvLmMiKQorICAgICAgICBhcHBlbmRfY19zb3VyY2VfZmlsZSgia21wX3J1bnRpbWUuYyIpCisgICAgICAgIGFwcGVuZF9jX3NvdXJjZV9maWxlKCJrbXBfc2V0dGluZ3MuYyIpCisgICAgICAgIGFwcGVuZF9jX3NvdXJjZV9maWxlKCJrbXBfc3RyLmMiKQorICAgICAgICBhcHBlbmRfY19zb3VyY2VfZmlsZSgia21wX3Rhc2tpbmcuYyIpCisgICAgICAgIGFwcGVuZF9jX3NvdXJjZV9maWxlKCJrbXBfdGFza3EuYyIpCisgICAgICAgIGFwcGVuZF9jX3NvdXJjZV9maWxlKCJrbXBfdGhyZWFkcHJpdmF0ZS5jIikKKyAgICAgICAgYXBwZW5kX2Nfc291cmNlX2ZpbGUoImttcF91dGlsaXR5LmMiKQorICAgICAgICBpZigke1VTRV9JVFRfTk9USUZZfSkKKyAgICAgICAgICAgIGFwcGVuZF9jX3NvdXJjZV9maWxlKCJ0aGlyZHBhcnR5L2l0dG5vdGlmeS9pdHRub3RpZnlfc3RhdGljLmMiKQorICAgICAgICBlbmRpZigpCisgICAgICAgIGlmKCR7V0lORE9XU30pCisgICAgICAgICAgICBhcHBlbmRfY19zb3VyY2VfZmlsZSgiel9XaW5kb3dzX05UX3V0aWwuYyIpCisgICAgICAgICAgICBhcHBlbmRfY19zb3VyY2VfZmlsZSgiel9XaW5kb3dzX05ULTU4Nl91dGlsLmMiKQorICAgICAgICBlbHNlKCkKKyAgICAgICAgICAgIGFwcGVuZF9jX3NvdXJjZV9maWxlKCJ6X0xpbnV4X3V0aWwuYyIpCisgICAgICAgICAgICBhcHBlbmRfY19zb3VyY2VfZmlsZSgia21wX2dzdXBwb3J0LmMiKQorICAgICAgICBlbmRpZigpCisgICAgZW5kaWYoKQorICAgIHNldCgke2lucHV0X2Nfc291cmNlX2ZpbGVzfSAiJHtsb2NhbF9jX3NvdXJjZV9maWxlc30iIFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKKworZnVuY3Rpb24oc2V0X2NwcF9maWxlcyBpbnB1dF9jcHBfc291cmNlX2ZpbGVzKSAKKyAgICBzZXQobG9jYWxfY3BwX3NvdXJjZV9maWxlcyAiIikKKyAgICBpZihOT1QgJHtTVFVCU19MSUJSQVJZfSkKKyAgICAgICAgI2FwcGVuZF9jcHBfc291cmNlX2ZpbGUoImttcF9iYXJyaWVyLmNwcCIpCisgICAgICAgIGFwcGVuZF9jcHBfc291cmNlX2ZpbGUoImttcF9hZmZpbml0eS5jcHAiKQorICAgICAgICBhcHBlbmRfY3BwX3NvdXJjZV9maWxlKCJrbXBfZGlzcGF0Y2guY3BwIikKKyAgICAgICAgYXBwZW5kX2NwcF9zb3VyY2VfZmlsZSgia21wX2xvY2suY3BwIikKKyAgICAgICAgYXBwZW5kX2NwcF9zb3VyY2VfZmlsZSgia21wX3NjaGVkLmNwcCIpCisgICAgICAgIGlmKCIke29tcF92ZXJzaW9ufSIgU1RSRVFVQUwgIjQwIikKKyAgICAgICAgICAgIGFwcGVuZF9jcHBfc291cmNlX2ZpbGUoImttcF90YXNrZGVwcy5jcHAiKQorICAgICAgICAgICAgYXBwZW5kX2NwcF9zb3VyY2VfZmlsZSgia21wX2NhbmNlbC5jcHAiKQorICAgICAgICBlbmRpZigpCisgICAgICAgICNpZigke1NUQVRTX0dBVEhFUklOR30pCisgICAgICAgICMgICBhcHBlbmRfY3BwX3NvdXJjZV9maWxlKCJrbXBfc3RhdHMuY3BwIikKKyAgICAgICAgIyAgICBhcHBlbmRfY3BwX3NvdXJjZV9maWxlKCJrbXBfc3RhdHNfdGltaW5nLmNwcCIpCisgICAgICAgICNlbmRpZigpCisgICAgZW5kaWYoKQorCisgICAgc2V0KCR7aW5wdXRfY3BwX3NvdXJjZV9maWxlc30gIiR7bG9jYWxfY3BwX3NvdXJjZV9maWxlc30iIFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKKworCitmdW5jdGlvbihzZXRfYXNtX2ZpbGVzIGlucHV0X2FzbV9zb3VyY2VfZmlsZXMpIAorICAgIHNldChsb2NhbF9hc21fc291cmNlX2ZpbGVzICIiKQorICAgIGlmKE5PVCAke1NUVUJTX0xJQlJBUll9KQorICAgICAgICBpZigke1dJTkRPV1N9KQorICAgICAgICAgICAgYXBwZW5kX2FzbV9zb3VyY2VfZmlsZSgiel9XaW5kb3dzX05ULTU4Nl9hc20uYXNtIikKKyAgICAgICAgZWxzZSgpCisgICAgICAgICAgICBhcHBlbmRfYXNtX3NvdXJjZV9maWxlKCJ6X0xpbnV4X2FzbS5zIikKKyAgICAgICAgZW5kaWYoKQorICAgIGVuZGlmKCkKKyAgICBzZXQoJHtpbnB1dF9hc21fc291cmNlX2ZpbGVzfSAiJHtsb2NhbF9hc21fc291cmNlX2ZpbGVzfSIgUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQorCisKK2Z1bmN0aW9uKHNldF9pbXBfY19maWxlcyBpbnB1dF9pbXBfY19maWxlcykKKyAgICBzZXQobG9jYWxfaW1wX2NfZmlsZXMgIiIpCisgICAgaWYoJHtXSU5ET1dTfSkKKyAgICAgICAgYXBwZW5kX2ltcF9jX3NvdXJjZV9maWxlKCJrbXBfaW1wb3J0LmMiKQorICAgIGVuZGlmKCkKKyAgICBzZXQoJHtpbnB1dF9pbXBfY19maWxlc30gIiR7bG9jYWxfaW1wX2NfZmlsZXN9IiBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL2RvYy9SZWZlcmVuY2UucGRmIGIvZmluYWwvcnVudGltZS9kb2MvUmVmZXJlbmNlLnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODBmOThjCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9kb2MvUmVmZXJlbmNlLnBkZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL2RvYy9kb3h5Z2VuL2NvbmZpZyBiL2ZpbmFsL3J1bnRpbWUvZG9jL2RveHlnZW4vY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4Mzc3Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL2RvYy9kb3h5Z2VuL2NvbmZpZwpAQCAtMCwwICsxLDE4MjIgQEAKKyMgRG94eWZpbGUgMS5vOC4yDQorDQorIyBUaGlzIGZpbGUgZGVzY3JpYmVzIHRoZSBzZXR0aW5ncyB0byBiZSB1c2VkIGJ5IHRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbQ0KKyMgZG94eWdlbiAod3d3LmRveHlnZW4ub3JnKSBmb3IgYSBwcm9qZWN0Lg0KKyMNCisjIEFsbCB0ZXh0IGFmdGVyIGEgaGFzaCAoIykgaXMgY29uc2lkZXJlZCBhIGNvbW1lbnQgYW5kIHdpbGwgYmUgaWdub3JlZC4NCisjIFRoZSBmb3JtYXQgaXM6DQorIyAgICAgICBUQUcgPSB2YWx1ZSBbdmFsdWUsIC4uLl0NCisjIEZvciBsaXN0cyBpdGVtcyBjYW4gYWxzbyBiZSBhcHBlbmRlZCB1c2luZzoNCisjICAgICAgIFRBRyArPSB2YWx1ZSBbdmFsdWUsIC4uLl0NCisjIFZhbHVlcyB0aGF0IGNvbnRhaW4gc3BhY2VzIHNob3VsZCBiZSBwbGFjZWQgYmV0d2VlbiBxdW90ZXMgKCIgIikuDQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgUHJvamVjdCByZWxhdGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisjIFRoaXMgdGFnIHNwZWNpZmllcyB0aGUgZW5jb2RpbmcgdXNlZCBmb3IgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIGNvbmZpZyBmaWxlDQorIyB0aGF0IGZvbGxvdy4gVGhlIGRlZmF1bHQgaXMgVVRGLTggd2hpY2ggaXMgYWxzbyB0aGUgZW5jb2RpbmcgdXNlZCBmb3IgYWxsDQorIyB0ZXh0IGJlZm9yZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGlzIHRhZy4gRG94eWdlbiB1c2VzIGxpYmljb252IChvciB0aGUNCisjIGljb252IGJ1aWx0IGludG8gbGliYykgZm9yIHRoZSB0cmFuc2NvZGluZy4gU2VlDQorIyBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvbGliaWNvbnYgZm9yIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGVuY29kaW5ncy4NCisNCitET1hZRklMRV9FTkNPRElORyAgICAgID0gVVRGLTgNCisNCisjIFRoZSBQUk9KRUNUX05BTUUgdGFnIGlzIGEgc2luZ2xlIHdvcmQgKG9yIHNlcXVlbmNlIG9mIHdvcmRzKSB0aGF0IHNob3VsZA0KKyMgaWRlbnRpZnkgdGhlIHByb2plY3QuIE5vdGUgdGhhdCBpZiB5b3UgZG8gbm90IHVzZSBEb3h5d2l6YXJkIHlvdSBuZWVkDQorIyB0byBwdXQgcXVvdGVzIGFyb3VuZCB0aGUgcHJvamVjdCBuYW1lIGlmIGl0IGNvbnRhaW5zIHNwYWNlcy4NCisNCitQUk9KRUNUX05BTUUgICAgICAgICAgID0gIkludGVsJnJlZzsmbmJzcDtPcGVuTVAqIFJ1bnRpbWUgTGlicmFyeSINCisNCisjIFRoZSBQUk9KRUNUX05VTUJFUiB0YWcgY2FuIGJlIHVzZWQgdG8gZW50ZXIgYSBwcm9qZWN0IG9yIHJldmlzaW9uIG51bWJlci4NCisjIFRoaXMgY291bGQgYmUgaGFuZHkgZm9yIGFyY2hpdmluZyB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24gb3INCisjIGlmIHNvbWUgdmVyc2lvbiBjb250cm9sIHN5c3RlbSBpcyB1c2VkLg0KKw0KK1BST0pFQ1RfTlVNQkVSICAgICAgICAgPQ0KKw0KKyMgVXNpbmcgdGhlIFBST0pFQ1RfQlJJRUYgdGFnIG9uZSBjYW4gcHJvdmlkZSBhbiBvcHRpb25hbCBvbmUgbGluZSBkZXNjcmlwdGlvbg0KKyMgZm9yIGEgcHJvamVjdCB0aGF0IGFwcGVhcnMgYXQgdGhlIHRvcCBvZiBlYWNoIHBhZ2UgYW5kIHNob3VsZCBnaXZlIHZpZXdlcg0KKyMgYSBxdWljayBpZGVhIGFib3V0IHRoZSBwdXJwb3NlIG9mIHRoZSBwcm9qZWN0LiBLZWVwIHRoZSBkZXNjcmlwdGlvbiBzaG9ydC4NCisNCitQUk9KRUNUX0JSSUVGICAgICAgICAgID0NCisNCisjIFdpdGggdGhlIFBST0pFQ1RfTE9HTyB0YWcgb25lIGNhbiBzcGVjaWZ5IGFuIGxvZ28gb3IgaWNvbiB0aGF0IGlzDQorIyBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gVGhlIG1heGltdW0gaGVpZ2h0IG9mIHRoZSBsb2dvIHNob3VsZCBub3QNCisjIGV4Y2VlZCA1NSBwaXhlbHMgYW5kIHRoZSBtYXhpbXVtIHdpZHRoIHNob3VsZCBub3QgZXhjZWVkIDIwMCBwaXhlbHMuDQorIyBEb3h5Z2VuIHdpbGwgY29weSB0aGUgbG9nbyB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4NCisNCitQUk9KRUNUX0xPR08gICAgICAgICAgID0NCisNCisjIFRoZSBPVVRQVVRfRElSRUNUT1JZIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIChyZWxhdGl2ZSBvciBhYnNvbHV0ZSkNCisjIGJhc2UgcGF0aCB3aGVyZSB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24gd2lsbCBiZSBwdXQuDQorIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCwgaXQgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24NCisjIHdoZXJlIGRveHlnZW4gd2FzIHN0YXJ0ZWQuIElmIGxlZnQgYmxhbmsgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdpbGwgYmUgdXNlZC4NCisNCitPVVRQVVRfRElSRUNUT1JZICAgICAgID0gZG9jL2RveHlnZW4vZ2VuZXJhdGVkDQorDQorIyBJZiB0aGUgQ1JFQVRFX1NVQkRJUlMgdGFnIGlzIHNldCB0byBZRVMsIHRoZW4gZG94eWdlbiB3aWxsIGNyZWF0ZQ0KKyMgNDA5NiBzdWItZGlyZWN0b3JpZXMgKGluIDIgbGV2ZWxzKSB1bmRlciB0aGUgb3V0cHV0IGRpcmVjdG9yeSBvZiBlYWNoIG91dHB1dA0KKyMgZm9ybWF0IGFuZCB3aWxsIGRpc3RyaWJ1dGUgdGhlIGdlbmVyYXRlZCBmaWxlcyBvdmVyIHRoZXNlIGRpcmVjdG9yaWVzLg0KKyMgRW5hYmxpbmcgdGhpcyBvcHRpb24gY2FuIGJlIHVzZWZ1bCB3aGVuIGZlZWRpbmcgZG94eWdlbiBhIGh1Z2UgYW1vdW50IG9mDQorIyBzb3VyY2UgZmlsZXMsIHdoZXJlIHB1dHRpbmcgYWxsIGdlbmVyYXRlZCBmaWxlcyBpbiB0aGUgc2FtZSBkaXJlY3Rvcnkgd291bGQNCisjIG90aGVyd2lzZSBjYXVzZSBwZXJmb3JtYW5jZSBwcm9ibGVtcyBmb3IgdGhlIGZpbGUgc3lzdGVtLg0KKw0KK0NSRUFURV9TVUJESVJTICAgICAgICAgPSBOTw0KKw0KKyMgVGhlIE9VVFBVVF9MQU5HVUFHRSB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBsYW5ndWFnZSBpbiB3aGljaCBhbGwNCisjIGRvY3VtZW50YXRpb24gZ2VuZXJhdGVkIGJ5IGRveHlnZW4gaXMgd3JpdHRlbi4gRG94eWdlbiB3aWxsIHVzZSB0aGlzDQorIyBpbmZvcm1hdGlvbiB0byBnZW5lcmF0ZSBhbGwgY29uc3RhbnQgb3V0cHV0IGluIHRoZSBwcm9wZXIgbGFuZ3VhZ2UuDQorIyBUaGUgZGVmYXVsdCBsYW5ndWFnZSBpcyBFbmdsaXNoLCBvdGhlciBzdXBwb3J0ZWQgbGFuZ3VhZ2VzIGFyZToNCisjIEFmcmlrYWFucywgQXJhYmljLCBCcmF6aWxpYW4sIENhdGFsYW4sIENoaW5lc2UsIENoaW5lc2UtVHJhZGl0aW9uYWwsDQorIyBDcm9hdGlhbiwgQ3plY2gsIERhbmlzaCwgRHV0Y2gsIEVzcGVyYW50bywgRmFyc2ksIEZpbm5pc2gsIEZyZW5jaCwgR2VybWFuLA0KKyMgR3JlZWssIEh1bmdhcmlhbiwgSXRhbGlhbiwgSmFwYW5lc2UsIEphcGFuZXNlLWVuIChKYXBhbmVzZSB3aXRoIEVuZ2xpc2gNCisjIG1lc3NhZ2VzKSwgS29yZWFuLCBLb3JlYW4tZW4sIExpdGh1YW5pYW4sIE5vcndlZ2lhbiwgTWFjZWRvbmlhbiwgUGVyc2lhbiwNCisjIFBvbGlzaCwgUG9ydHVndWVzZSwgUm9tYW5pYW4sIFJ1c3NpYW4sIFNlcmJpYW4sIFNlcmJpYW4tQ3lyaWxsaWMsIFNsb3ZhaywNCisjIFNsb3ZlbmUsIFNwYW5pc2gsIFN3ZWRpc2gsIFVrcmFpbmlhbiwgYW5kIFZpZXRuYW1lc2UuDQorDQorT1VUUFVUX0xBTkdVQUdFICAgICAgICA9IEVuZ2xpc2gNCisNCisjIElmIHRoZSBCUklFRl9NRU1CRVJfREVTQyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbA0KKyMgaW5jbHVkZSBicmllZiBtZW1iZXIgZGVzY3JpcHRpb25zIGFmdGVyIHRoZSBtZW1iZXJzIHRoYXQgYXJlIGxpc3RlZCBpbg0KKyMgdGhlIGZpbGUgYW5kIGNsYXNzIGRvY3VtZW50YXRpb24gKHNpbWlsYXIgdG8gSmF2YURvYykuDQorIyBTZXQgdG8gTk8gdG8gZGlzYWJsZSB0aGlzLg0KKw0KK0JSSUVGX01FTUJFUl9ERVNDICAgICAgPSBZRVMNCisNCisjIElmIHRoZSBSRVBFQVRfQlJJRUYgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwgcHJlcGVuZA0KKyMgdGhlIGJyaWVmIGRlc2NyaXB0aW9uIG9mIGEgbWVtYmVyIG9yIGZ1bmN0aW9uIGJlZm9yZSB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24uDQorIyBOb3RlOiBpZiBib3RoIEhJREVfVU5ET0NfTUVNQkVSUyBhbmQgQlJJRUZfTUVNQkVSX0RFU0MgYXJlIHNldCB0byBOTywgdGhlDQorIyBicmllZiBkZXNjcmlwdGlvbnMgd2lsbCBiZSBjb21wbGV0ZWx5IHN1cHByZXNzZWQuDQorDQorUkVQRUFUX0JSSUVGICAgICAgICAgICA9IFlFUw0KKw0KKyMgVGhpcyB0YWcgaW1wbGVtZW50cyBhIHF1YXNpLWludGVsbGlnZW50IGJyaWVmIGRlc2NyaXB0aW9uIGFiYnJldmlhdG9yDQorIyB0aGF0IGlzIHVzZWQgdG8gZm9ybSB0aGUgdGV4dCBpbiB2YXJpb3VzIGxpc3RpbmdzLiBFYWNoIHN0cmluZw0KKyMgaW4gdGhpcyBsaXN0LCBpZiBmb3VuZCBhcyB0aGUgbGVhZGluZyB0ZXh0IG9mIHRoZSBicmllZiBkZXNjcmlwdGlvbiwgd2lsbCBiZQ0KKyMgc3RyaXBwZWQgZnJvbSB0aGUgdGV4dCBhbmQgdGhlIHJlc3VsdCBhZnRlciBwcm9jZXNzaW5nIHRoZSB3aG9sZSBsaXN0LCBpcw0KKyMgdXNlZCBhcyB0aGUgYW5ub3RhdGVkIHRleHQuIE90aGVyd2lzZSwgdGhlIGJyaWVmIGRlc2NyaXB0aW9uIGlzIHVzZWQgYXMtaXMuDQorIyBJZiBsZWZ0IGJsYW5rLCB0aGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgdXNlZCAoIiRuYW1lIiBpcyBhdXRvbWF0aWNhbGx5DQorIyByZXBsYWNlZCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBlbnRpdHkpOiAiVGhlICRuYW1lIGNsYXNzIiAiVGhlICRuYW1lIHdpZGdldCINCisjICJUaGUgJG5hbWUgZmlsZSIgImlzIiAicHJvdmlkZXMiICJzcGVjaWZpZXMiICJjb250YWlucyINCisjICJyZXByZXNlbnRzIiAiYSIgImFuIiAidGhlIg0KKw0KK0FCQlJFVklBVEVfQlJJRUYgICAgICAgPQ0KKw0KKyMgSWYgdGhlIEFMV0FZU19ERVRBSUxFRF9TRUMgYW5kIFJFUEVBVF9CUklFRiB0YWdzIGFyZSBib3RoIHNldCB0byBZRVMgdGhlbg0KKyMgRG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZGV0YWlsZWQgc2VjdGlvbiBldmVuIGlmIHRoZXJlIGlzIG9ubHkgYSBicmllZg0KKyMgZGVzY3JpcHRpb24uDQorDQorQUxXQVlTX0RFVEFJTEVEX1NFQyAgICA9IE5PDQorDQorIyBJZiB0aGUgSU5MSU5FX0lOSEVSSVRFRF9NRU1CIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgc2hvdyBhbGwNCisjIGluaGVyaXRlZCBtZW1iZXJzIG9mIGEgY2xhc3MgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhhdCBjbGFzcyBhcyBpZiB0aG9zZQ0KKyMgbWVtYmVycyB3ZXJlIG9yZGluYXJ5IGNsYXNzIG1lbWJlcnMuIENvbnN0cnVjdG9ycywgZGVzdHJ1Y3RvcnMgYW5kIGFzc2lnbm1lbnQNCisjIG9wZXJhdG9ycyBvZiB0aGUgYmFzZSBjbGFzc2VzIHdpbGwgbm90IGJlIHNob3duLg0KKw0KK0lOTElORV9JTkhFUklURURfTUVNQiAgPSBOTw0KKw0KKyMgSWYgdGhlIEZVTExfUEFUSF9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIERveHlnZW4gd2lsbCBwcmVwZW5kIHRoZSBmdWxsDQorIyBwYXRoIGJlZm9yZSBmaWxlcyBuYW1lIGluIHRoZSBmaWxlIGxpc3QgYW5kIGluIHRoZSBoZWFkZXIgZmlsZXMuIElmIHNldA0KKyMgdG8gTk8gdGhlIHNob3J0ZXN0IHBhdGggdGhhdCBtYWtlcyB0aGUgZmlsZSBuYW1lIHVuaXF1ZSB3aWxsIGJlIHVzZWQuDQorDQorRlVMTF9QQVRIX05BTUVTICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgRlVMTF9QQVRIX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIFNUUklQX0ZST01fUEFUSCB0YWcNCisjIGNhbiBiZSB1c2VkIHRvIHN0cmlwIGEgdXNlci1kZWZpbmVkIHBhcnQgb2YgdGhlIHBhdGguIFN0cmlwcGluZyBpcw0KKyMgb25seSBkb25lIGlmIG9uZSBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3MgbWF0Y2hlcyB0aGUgbGVmdC1oYW5kIHBhcnQgb2YNCisjIHRoZSBwYXRoLiBUaGUgdGFnIGNhbiBiZSB1c2VkIHRvIHNob3cgcmVsYXRpdmUgcGF0aHMgaW4gdGhlIGZpbGUgbGlzdC4NCisjIElmIGxlZnQgYmxhbmsgdGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIGRveHlnZW4gaXMgcnVuIGlzIHVzZWQgYXMgdGhlDQorIyBwYXRoIHRvIHN0cmlwLiBOb3RlIHRoYXQgeW91IHNwZWNpZnkgYWJzb2x1dGUgcGF0aHMgaGVyZSwgYnV0IGFsc28NCisjIHJlbGF0aXZlIHBhdGhzLCB3aGljaCB3aWxsIGJlIHJlbGF0aXZlIGZyb20gdGhlIGRpcmVjdG9yeSB3aGVyZSBkb3h5Z2VuIGlzDQorIyBzdGFydGVkLg0KKw0KK1NUUklQX0ZST01fUEFUSCAgICAgICAgPQ0KKw0KKyMgVGhlIFNUUklQX0ZST01fSU5DX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHN0cmlwIGEgdXNlci1kZWZpbmVkIHBhcnQgb2YNCisjIHRoZSBwYXRoIG1lbnRpb25lZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiBhIGNsYXNzLCB3aGljaCB0ZWxscw0KKyMgdGhlIHJlYWRlciB3aGljaCBoZWFkZXIgZmlsZSB0byBpbmNsdWRlIGluIG9yZGVyIHRvIHVzZSBhIGNsYXNzLg0KKyMgSWYgbGVmdCBibGFuayBvbmx5IHRoZSBuYW1lIG9mIHRoZSBoZWFkZXIgZmlsZSBjb250YWluaW5nIHRoZSBjbGFzcw0KKyMgZGVmaW5pdGlvbiBpcyB1c2VkLiBPdGhlcndpc2Ugb25lIHNob3VsZCBzcGVjaWZ5IHRoZSBpbmNsdWRlIHBhdGhzIHRoYXQNCisjIGFyZSBub3JtYWxseSBwYXNzZWQgdG8gdGhlIGNvbXBpbGVyIHVzaW5nIHRoZSAtSSBmbGFnLg0KKw0KK1NUUklQX0ZST01fSU5DX1BBVEggICAgPQ0KKw0KKyMgSWYgdGhlIFNIT1JUX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgbXVjaCBzaG9ydGVyDQorIyAoYnV0IGxlc3MgcmVhZGFibGUpIGZpbGUgbmFtZXMuIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3VyIGZpbGUgc3lzdGVtDQorIyBkb2Vzbid0IHN1cHBvcnQgbG9uZyBuYW1lcyBsaWtlIG9uIERPUywgTWFjLCBvciBDRC1ST00uDQorDQorU0hPUlRfTkFNRVMgICAgICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgSkFWQURPQ19BVVRPQlJJRUYgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBEb3h5Z2VuDQorIyB3aWxsIGludGVycHJldCB0aGUgZmlyc3QgbGluZSAodW50aWwgdGhlIGZpcnN0IGRvdCkgb2YgYSBKYXZhRG9jLXN0eWxlDQorIyBjb21tZW50IGFzIHRoZSBicmllZiBkZXNjcmlwdGlvbi4gSWYgc2V0IHRvIE5PLCB0aGUgSmF2YURvYw0KKyMgY29tbWVudHMgd2lsbCBiZWhhdmUganVzdCBsaWtlIHJlZ3VsYXIgUXQtc3R5bGUgY29tbWVudHMNCisjICh0aHVzIHJlcXVpcmluZyBhbiBleHBsaWNpdCBAYnJpZWYgY29tbWFuZCBmb3IgYSBicmllZiBkZXNjcmlwdGlvbi4pDQorDQorSkFWQURPQ19BVVRPQlJJRUYgICAgICA9IE5PDQorDQorIyBJZiB0aGUgUVRfQVVUT0JSSUVGIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gRG94eWdlbiB3aWxsDQorIyBpbnRlcnByZXQgdGhlIGZpcnN0IGxpbmUgKHVudGlsIHRoZSBmaXJzdCBkb3QpIG9mIGEgUXQtc3R5bGUNCisjIGNvbW1lbnQgYXMgdGhlIGJyaWVmIGRlc2NyaXB0aW9uLiBJZiBzZXQgdG8gTk8sIHRoZSBjb21tZW50cw0KKyMgd2lsbCBiZWhhdmUganVzdCBsaWtlIHJlZ3VsYXIgUXQtc3R5bGUgY29tbWVudHMgKHRodXMgcmVxdWlyaW5nDQorIyBhbiBleHBsaWNpdCBcYnJpZWYgY29tbWFuZCBmb3IgYSBicmllZiBkZXNjcmlwdGlvbi4pDQorDQorUVRfQVVUT0JSSUVGICAgICAgICAgICA9IE5PDQorDQorIyBUaGUgTVVMVElMSU5FX0NQUF9JU19CUklFRiB0YWcgY2FuIGJlIHNldCB0byBZRVMgdG8gbWFrZSBEb3h5Z2VuDQorIyB0cmVhdCBhIG11bHRpLWxpbmUgQysrIHNwZWNpYWwgY29tbWVudCBibG9jayAoaS5lLiBhIGJsb2NrIG9mIC8vISBvciAvLy8NCisjIGNvbW1lbnRzKSBhcyBhIGJyaWVmIGRlc2NyaXB0aW9uLiBUaGlzIHVzZWQgdG8gYmUgdGhlIGRlZmF1bHQgYmVoYXZpb3VyLg0KKyMgVGhlIG5ldyBkZWZhdWx0IGlzIHRvIHRyZWF0IGEgbXVsdGktbGluZSBDKysgY29tbWVudCBibG9jayBhcyBhIGRldGFpbGVkDQorIyBkZXNjcmlwdGlvbi4gU2V0IHRoaXMgdGFnIHRvIFlFUyBpZiB5b3UgcHJlZmVyIHRoZSBvbGQgYmVoYXZpb3VyIGluc3RlYWQuDQorDQorTVVMVElMSU5FX0NQUF9JU19CUklFRiA9IE5PDQorDQorIyBJZiB0aGUgSU5IRVJJVF9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbiBhbiB1bmRvY3VtZW50ZWQNCisjIG1lbWJlciBpbmhlcml0cyB0aGUgZG9jdW1lbnRhdGlvbiBmcm9tIGFueSBkb2N1bWVudGVkIG1lbWJlciB0aGF0IGl0DQorIyByZS1pbXBsZW1lbnRzLg0KKw0KK0lOSEVSSVRfRE9DUyAgICAgICAgICAgPSBZRVMNCisNCisjIElmIHRoZSBTRVBBUkFURV9NRU1CRVJfUEFHRVMgdGFnIGlzIHNldCB0byBZRVMsIHRoZW4gZG94eWdlbiB3aWxsIHByb2R1Y2UNCisjIGEgbmV3IHBhZ2UgZm9yIGVhY2ggbWVtYmVyLiBJZiBzZXQgdG8gTk8sIHRoZSBkb2N1bWVudGF0aW9uIG9mIGEgbWVtYmVyIHdpbGwNCisjIGJlIHBhcnQgb2YgdGhlIGZpbGUvY2xhc3MvbmFtZXNwYWNlIHRoYXQgY29udGFpbnMgaXQuDQorDQorU0VQQVJBVEVfTUVNQkVSX1BBR0VTICA9IE5PDQorDQorIyBUaGUgVEFCX1NJWkUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbnVtYmVyIG9mIHNwYWNlcyBpbiBhIHRhYi4NCisjIERveHlnZW4gdXNlcyB0aGlzIHZhbHVlIHRvIHJlcGxhY2UgdGFicyBieSBzcGFjZXMgaW4gY29kZSBmcmFnbWVudHMuDQorDQorVEFCX1NJWkUgICAgICAgICAgICAgICA9IDgNCisNCisjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBudW1iZXIgb2YgYWxpYXNlcyB0aGF0IGFjdHMNCisjIGFzIGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLiBBbiBhbGlhcyBoYXMgdGhlIGZvcm0gIm5hbWU9dmFsdWUiLg0KKyMgRm9yIGV4YW1wbGUgYWRkaW5nICJzaWRlZWZmZWN0PVxwYXIgU2lkZSBFZmZlY3RzOlxuIiB3aWxsIGFsbG93IHlvdSB0bw0KKyMgcHV0IHRoZSBjb21tYW5kIFxzaWRlZWZmZWN0IChvciBAc2lkZWVmZmVjdCkgaW4gdGhlIGRvY3VtZW50YXRpb24sIHdoaWNoDQorIyB3aWxsIHJlc3VsdCBpbiBhIHVzZXItZGVmaW5lZCBwYXJhZ3JhcGggd2l0aCBoZWFkaW5nICJTaWRlIEVmZmVjdHM6Ii4NCisjIFlvdSBjYW4gcHV0IFxuJ3MgaW4gdGhlIHZhbHVlIHBhcnQgb2YgYW4gYWxpYXMgdG8gaW5zZXJ0IG5ld2xpbmVzLg0KKw0KK0FMSUFTRVMgICAgICAgICAgICAgICAgPSAib3RoZXI9PHN1cD4qPC9zdXA+Ig0KKw0KKyMgVGhpcyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIG51bWJlciBvZiB3b3JkLWtleXdvcmQgbWFwcGluZ3MgKFRDTCBvbmx5KS4NCisjIEEgbWFwcGluZyBoYXMgdGhlIGZvcm0gIm5hbWU9dmFsdWUiLiBGb3IgZXhhbXBsZSBhZGRpbmcNCisjICJjbGFzcz1pdGNsOjpjbGFzcyIgd2lsbCBhbGxvdyB5b3UgdG8gdXNlIHRoZSBjb21tYW5kIGNsYXNzIGluIHRoZQ0KKyMgaXRjbDo6Y2xhc3MgbWVhbmluZy4NCisNCitUQ0xfU1VCU1QgICAgICAgICAgICAgID0NCisNCisjIFNldCB0aGUgT1BUSU1JWkVfT1VUUFVUX0ZPUl9DIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIEMNCisjIHNvdXJjZXMgb25seS4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgbW9yZSB0YWlsb3JlZCBmb3IgQy4NCisjIEZvciBpbnN0YW5jZSwgc29tZSBvZiB0aGUgbmFtZXMgdGhhdCBhcmUgdXNlZCB3aWxsIGJlIGRpZmZlcmVudC4gVGhlIGxpc3QNCisjIG9mIGFsbCBtZW1iZXJzIHdpbGwgYmUgb21pdHRlZCwgZXRjLg0KKw0KK09QVElNSVpFX09VVFBVVF9GT1JfQyAgPSBOTw0KKw0KKyMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfSkFWQSB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBKYXZhDQorIyBzb3VyY2VzIG9ubHkuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIG1vcmUgdGFpbG9yZWQgZm9yDQorIyBKYXZhLiBGb3IgaW5zdGFuY2UsIG5hbWVzcGFjZXMgd2lsbCBiZSBwcmVzZW50ZWQgYXMgcGFja2FnZXMsIHF1YWxpZmllZA0KKyMgc2NvcGVzIHdpbGwgbG9vayBkaWZmZXJlbnQsIGV0Yy4NCisNCitPUFRJTUlaRV9PVVRQVVRfSkFWQSAgID0gTk8NCisNCisjIFNldCB0aGUgT1BUSU1JWkVfRk9SX0ZPUlRSQU4gdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgRm9ydHJhbg0KKyMgc291cmNlcyBvbmx5LiBEb3h5Z2VuIHdpbGwgdGhlbiBnZW5lcmF0ZSBvdXRwdXQgdGhhdCBpcyBtb3JlIHRhaWxvcmVkIGZvcg0KKyMgRm9ydHJhbi4NCisNCitPUFRJTUlaRV9GT1JfRk9SVFJBTiAgID0gTk8NCisNCisjIFNldCB0aGUgT1BUSU1JWkVfT1VUUFVUX1ZIREwgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgVkhETA0KKyMgc291cmNlcy4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgdGFpbG9yZWQgZm9yDQorIyBWSERMLg0KKw0KK09QVElNSVpFX09VVFBVVF9WSERMICAgPSBOTw0KKw0KKyMgRG94eWdlbiBzZWxlY3RzIHRoZSBwYXJzZXIgdG8gdXNlIGRlcGVuZGluZyBvbiB0aGUgZXh0ZW5zaW9uIG9mIHRoZSBmaWxlcyBpdA0KKyMgcGFyc2VzLiBXaXRoIHRoaXMgdGFnIHlvdSBjYW4gYXNzaWduIHdoaWNoIHBhcnNlciB0byB1c2UgZm9yIGEgZ2l2ZW4NCisjIGV4dGVuc2lvbi4gRG94eWdlbiBoYXMgYSBidWlsdC1pbiBtYXBwaW5nLCBidXQgeW91IGNhbiBvdmVycmlkZSBvciBleHRlbmQgaXQNCisjIHVzaW5nIHRoaXMgdGFnLiBUaGUgZm9ybWF0IGlzIGV4dD1sYW5ndWFnZSwgd2hlcmUgZXh0IGlzIGEgZmlsZSBleHRlbnNpb24sDQorIyBhbmQgbGFuZ3VhZ2UgaXMgb25lIG9mIHRoZSBwYXJzZXJzIHN1cHBvcnRlZCBieSBkb3h5Z2VuOiBJREwsIEphdmEsDQorIyBKYXZhc2NyaXB0LCBDU2hhcnAsIEMsIEMrKywgRCwgUEhQLCBPYmplY3RpdmUtQywgUHl0aG9uLCBGb3J0cmFuLCBWSERMLCBDLA0KKyMgQysrLiBGb3IgaW5zdGFuY2UgdG8gbWFrZSBkb3h5Z2VuIHRyZWF0IC5pbmMgZmlsZXMgYXMgRm9ydHJhbiBmaWxlcyAoZGVmYXVsdA0KKyMgaXMgUEhQKSwgYW5kIC5mIGZpbGVzIGFzIEMgKGRlZmF1bHQgaXMgRm9ydHJhbiksIHVzZTogaW5jPUZvcnRyYW4gZj1DLiBOb3RlDQorIyB0aGF0IGZvciBjdXN0b20gZXh0ZW5zaW9ucyB5b3UgYWxzbyBuZWVkIHRvIHNldCBGSUxFX1BBVFRFUk5TIG90aGVyd2lzZSB0aGUNCisjIGZpbGVzIGFyZSBub3QgcmVhZCBieSBkb3h5Z2VuLg0KKw0KK0VYVEVOU0lPTl9NQVBQSU5HICAgICAgPQ0KKw0KKyMgSWYgTUFSS0RPV05fU1VQUE9SVCBpcyBlbmFibGVkICh0aGUgZGVmYXVsdCkgdGhlbiBkb3h5Z2VuIHByZS1wcm9jZXNzZXMgYWxsDQorIyBjb21tZW50cyBhY2NvcmRpbmcgdG8gdGhlIE1hcmtkb3duIGZvcm1hdCwgd2hpY2ggYWxsb3dzIGZvciBtb3JlIHJlYWRhYmxlDQorIyBkb2N1bWVudGF0aW9uLiBTZWUgaHR0cDovL2RhcmluZ2ZpcmViYWxsLm5ldC9wcm9qZWN0cy9tYXJrZG93bi8gZm9yIGRldGFpbHMuDQorIyBUaGUgb3V0cHV0IG9mIG1hcmtkb3duIHByb2Nlc3NpbmcgaXMgZnVydGhlciBwcm9jZXNzZWQgYnkgZG94eWdlbiwgc28geW91DQorIyBjYW4gbWl4IGRveHlnZW4sIEhUTUwsIGFuZCBYTUwgY29tbWFuZHMgd2l0aCBNYXJrZG93biBmb3JtYXR0aW5nLg0KKyMgRGlzYWJsZSBvbmx5IGluIGNhc2Ugb2YgYmFja3dhcmQgY29tcGF0aWJpbGl0aWVzIGlzc3Vlcy4NCisNCitNQVJLRE9XTl9TVVBQT1JUICAgICAgID0gWUVTDQorDQorIyBXaGVuIGVuYWJsZWQgZG94eWdlbiB0cmllcyB0byBsaW5rIHdvcmRzIHRoYXQgY29ycmVzcG9uZCB0byBkb2N1bWVudGVkIGNsYXNzZXMsDQorIyBvciBuYW1lc3BhY2VzIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgZG9jdW1lbnRhdGlvbi4gU3VjaCBhIGxpbmsgY2FuIGJlDQorIyBwcmV2ZW50ZWQgaW4gaW5kaXZpZHVhbCBjYXNlcyBieSBieSBwdXR0aW5nIGEgJSBzaWduIGluIGZyb250IG9mIHRoZSB3b3JkIG9yDQorIyBnbG9iYWxseSBieSBzZXR0aW5nIEFVVE9MSU5LX1NVUFBPUlQgdG8gTk8uDQorDQorQVVUT0xJTktfU1VQUE9SVCAgICAgICA9IFlFUw0KKw0KKyMgSWYgeW91IHVzZSBTVEwgY2xhc3NlcyAoaS5lLiBzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3IsIGV0Yy4pIGJ1dCBkbyBub3Qgd2FudA0KKyMgdG8gaW5jbHVkZSAoYSB0YWcgZmlsZSBmb3IpIHRoZSBTVEwgc291cmNlcyBhcyBpbnB1dCwgdGhlbiB5b3Ugc2hvdWxkDQorIyBzZXQgdGhpcyB0YWcgdG8gWUVTIGluIG9yZGVyIHRvIGxldCBkb3h5Z2VuIG1hdGNoIGZ1bmN0aW9ucyBkZWNsYXJhdGlvbnMgYW5kDQorIyBkZWZpbml0aW9ucyB3aG9zZSBhcmd1bWVudHMgY29udGFpbiBTVEwgY2xhc3NlcyAoZS5nLiBmdW5jKHN0ZDo6c3RyaW5nKTsgdi5zLg0KKyMgZnVuYyhzdGQ6OnN0cmluZykge30pLiBUaGlzIGFsc28gbWFrZXMgdGhlIGluaGVyaXRhbmNlIGFuZCBjb2xsYWJvcmF0aW9uDQorIyBkaWFncmFtcyB0aGF0IGludm9sdmUgU1RMIGNsYXNzZXMgbW9yZSBjb21wbGV0ZSBhbmQgYWNjdXJhdGUuDQorDQorQlVJTFRJTl9TVExfU1VQUE9SVCAgICA9IE5PDQorDQorIyBJZiB5b3UgdXNlIE1pY3Jvc29mdCdzIEMrKy9DTEkgbGFuZ3VhZ2UsIHlvdSBzaG91bGQgc2V0IHRoaXMgb3B0aW9uIHRvIFlFUyB0bw0KKyMgZW5hYmxlIHBhcnNpbmcgc3VwcG9ydC4NCisNCitDUFBfQ0xJX1NVUFBPUlQgICAgICAgID0gTk8NCisNCisjIFNldCB0aGUgU0lQX1NVUFBPUlQgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2Ygc2lwIHNvdXJjZXMgb25seS4NCisjIERveHlnZW4gd2lsbCBwYXJzZSB0aGVtIGxpa2Ugbm9ybWFsIEMrKyBidXQgd2lsbCBhc3N1bWUgYWxsIGNsYXNzZXMgdXNlIHB1YmxpYw0KKyMgaW5zdGVhZCBvZiBwcml2YXRlIGluaGVyaXRhbmNlIHdoZW4gbm8gZXhwbGljaXQgcHJvdGVjdGlvbiBrZXl3b3JkIGlzIHByZXNlbnQuDQorDQorU0lQX1NVUFBPUlQgICAgICAgICAgICA9IE5PDQorDQorIyBGb3IgTWljcm9zb2Z0J3MgSURMIHRoZXJlIGFyZSBwcm9wZ2V0IGFuZCBwcm9wcHV0IGF0dHJpYnV0ZXMgdG8NCisjIGluZGljYXRlIGdldHRlciBhbmQgc2V0dGVyIG1ldGhvZHMgZm9yIGEgcHJvcGVydHkuIFNldHRpbmcgdGhpcw0KKyMgb3B0aW9uIHRvIFlFUyAodGhlIGRlZmF1bHQpIHdpbGwgbWFrZSBkb3h5Z2VuIHJlcGxhY2UgdGhlIGdldCBhbmQNCisjIHNldCBtZXRob2RzIGJ5IGEgcHJvcGVydHkgaW4gdGhlIGRvY3VtZW50YXRpb24uIFRoaXMgd2lsbCBvbmx5IHdvcmsNCisjIGlmIHRoZSBtZXRob2RzIGFyZSBpbmRlZWQgZ2V0dGluZyBvciBzZXR0aW5nIGEgc2ltcGxlIHR5cGUuIElmIHRoaXMNCisjIGlzIG5vdCB0aGUgY2FzZSwgb3IgeW91IHdhbnQgdG8gc2hvdyB0aGUgbWV0aG9kcyBhbnl3YXksIHlvdSBzaG91bGQNCisjIHNldCB0aGlzIG9wdGlvbiB0byBOTy4NCisNCitJRExfUFJPUEVSVFlfU1VQUE9SVCAgID0gWUVTDQorDQorIyBJZiBtZW1iZXIgZ3JvdXBpbmcgaXMgdXNlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQgdGhlIERJU1RSSUJVVEVfR1JPVVBfRE9DDQorIyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlbiBkb3h5Z2VuIHdpbGwgcmV1c2UgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGZpcnN0DQorIyBtZW1iZXIgaW4gdGhlIGdyb3VwIChpZiBhbnkpIGZvciB0aGUgb3RoZXIgbWVtYmVycyBvZiB0aGUgZ3JvdXAuIEJ5IGRlZmF1bHQNCisjIGFsbCBtZW1iZXJzIG9mIGEgZ3JvdXAgbXVzdCBiZSBkb2N1bWVudGVkIGV4cGxpY2l0bHkuDQorDQorRElTVFJJQlVURV9HUk9VUF9ET0MgICA9IE5PDQorDQorIyBTZXQgdGhlIFNVQkdST1VQSU5HIHRhZyB0byBZRVMgKHRoZSBkZWZhdWx0KSB0byBhbGxvdyBjbGFzcyBtZW1iZXIgZ3JvdXBzIG9mDQorIyB0aGUgc2FtZSB0eXBlIChmb3IgaW5zdGFuY2UgYSBncm91cCBvZiBwdWJsaWMgZnVuY3Rpb25zKSB0byBiZSBwdXQgYXMgYQ0KKyMgc3ViZ3JvdXAgb2YgdGhhdCB0eXBlIChlLmcuIHVuZGVyIHRoZSBQdWJsaWMgRnVuY3Rpb25zIHNlY3Rpb24pLiBTZXQgaXQgdG8NCisjIE5PIHRvIHByZXZlbnQgc3ViZ3JvdXBpbmcuIEFsdGVybmF0aXZlbHksIHRoaXMgY2FuIGJlIGRvbmUgcGVyIGNsYXNzIHVzaW5nDQorIyB0aGUgXG5vc3ViZ3JvdXBpbmcgY29tbWFuZC4NCisNCitTVUJHUk9VUElORyAgICAgICAgICAgID0gWUVTDQorDQorIyBXaGVuIHRoZSBJTkxJTkVfR1JPVVBFRF9DTEFTU0VTIHRhZyBpcyBzZXQgdG8gWUVTLCBjbGFzc2VzLCBzdHJ1Y3RzIGFuZA0KKyMgdW5pb25zIGFyZSBzaG93biBpbnNpZGUgdGhlIGdyb3VwIGluIHdoaWNoIHRoZXkgYXJlIGluY2x1ZGVkIChlLmcuIHVzaW5nDQorIyBAaW5ncm91cCkgaW5zdGVhZCBvZiBvbiBhIHNlcGFyYXRlIHBhZ2UgKGZvciBIVE1MIGFuZCBNYW4gcGFnZXMpIG9yDQorIyBzZWN0aW9uIChmb3IgTGFUZVggYW5kIFJURikuDQorDQorSU5MSU5FX0dST1VQRURfQ0xBU1NFUyA9IE5PDQorDQorIyBXaGVuIHRoZSBJTkxJTkVfU0lNUExFX1NUUlVDVFMgdGFnIGlzIHNldCB0byBZRVMsIHN0cnVjdHMsIGNsYXNzZXMsIGFuZA0KKyMgdW5pb25zIHdpdGggb25seSBwdWJsaWMgZGF0YSBmaWVsZHMgd2lsbCBiZSBzaG93biBpbmxpbmUgaW4gdGhlIGRvY3VtZW50YXRpb24NCisjIG9mIHRoZSBzY29wZSBpbiB3aGljaCB0aGV5IGFyZSBkZWZpbmVkIChpLmUuIGZpbGUsIG5hbWVzcGFjZSwgb3IgZ3JvdXANCisjIGRvY3VtZW50YXRpb24pLCBwcm92aWRlZCB0aGlzIHNjb3BlIGlzIGRvY3VtZW50ZWQuIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpLA0KKyMgc3RydWN0cywgY2xhc3NlcywgYW5kIHVuaW9ucyBhcmUgc2hvd24gb24gYSBzZXBhcmF0ZSBwYWdlIChmb3IgSFRNTCBhbmQgTWFuDQorIyBwYWdlcykgb3Igc2VjdGlvbiAoZm9yIExhVGVYIGFuZCBSVEYpLg0KKw0KK0lOTElORV9TSU1QTEVfU1RSVUNUUyAgPSBOTw0KKw0KKyMgV2hlbiBUWVBFREVGX0hJREVTX1NUUlVDVCBpcyBlbmFibGVkLCBhIHR5cGVkZWYgb2YgYSBzdHJ1Y3QsIHVuaW9uLCBvciBlbnVtDQorIyBpcyBkb2N1bWVudGVkIGFzIHN0cnVjdCwgdW5pb24sIG9yIGVudW0gd2l0aCB0aGUgbmFtZSBvZiB0aGUgdHlwZWRlZi4gU28NCisjIHR5cGVkZWYgc3RydWN0IFR5cGVTIHt9IFR5cGVULCB3aWxsIGFwcGVhciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhcyBhIHN0cnVjdA0KKyMgd2l0aCBuYW1lIFR5cGVULiBXaGVuIGRpc2FibGVkIHRoZSB0eXBlZGVmIHdpbGwgYXBwZWFyIGFzIGEgbWVtYmVyIG9mIGEgZmlsZSwNCisjIG5hbWVzcGFjZSwgb3IgY2xhc3MuIEFuZCB0aGUgc3RydWN0IHdpbGwgYmUgbmFtZWQgVHlwZVMuIFRoaXMgY2FuIHR5cGljYWxseQ0KKyMgYmUgdXNlZnVsIGZvciBDIGNvZGUgaW4gY2FzZSB0aGUgY29kaW5nIGNvbnZlbnRpb24gZGljdGF0ZXMgdGhhdCBhbGwgY29tcG91bmQNCisjIHR5cGVzIGFyZSB0eXBlZGVmJ2VkIGFuZCBvbmx5IHRoZSB0eXBlZGVmIGlzIHJlZmVyZW5jZWQsIG5ldmVyIHRoZSB0YWcgbmFtZS4NCisNCitUWVBFREVGX0hJREVTX1NUUlVDVCAgID0gTk8NCisNCisjIFRoZSBTWU1CT0xfQ0FDSEVfU0laRSBkZXRlcm1pbmVzIHRoZSBzaXplIG9mIHRoZSBpbnRlcm5hbCBjYWNoZSB1c2UgdG8NCisjIGRldGVybWluZSB3aGljaCBzeW1ib2xzIHRvIGtlZXAgaW4gbWVtb3J5IGFuZCB3aGljaCB0byBmbHVzaCB0byBkaXNrLg0KKyMgV2hlbiB0aGUgY2FjaGUgaXMgZnVsbCwgbGVzcyBvZnRlbiB1c2VkIHN5bWJvbHMgd2lsbCBiZSB3cml0dGVuIHRvIGRpc2suDQorIyBGb3Igc21hbGwgdG8gbWVkaXVtIHNpemUgcHJvamVjdHMgKDwxMDAwIGlucHV0IGZpbGVzKSB0aGUgZGVmYXVsdCB2YWx1ZSBpcw0KKyMgcHJvYmFibHkgZ29vZCBlbm91Z2guIEZvciBsYXJnZXIgcHJvamVjdHMgYSB0b28gc21hbGwgY2FjaGUgc2l6ZSBjYW4gY2F1c2UNCisjIGRveHlnZW4gdG8gYmUgYnVzeSBzd2FwcGluZyBzeW1ib2xzIHRvIGFuZCBmcm9tIGRpc2sgbW9zdCBvZiB0aGUgdGltZQ0KKyMgY2F1c2luZyBhIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIHBlbmFsdHkuDQorIyBJZiB0aGUgc3lzdGVtIGhhcyBlbm91Z2ggcGh5c2ljYWwgbWVtb3J5IGluY3JlYXNpbmcgdGhlIGNhY2hlIHdpbGwgaW1wcm92ZSB0aGUNCisjIHBlcmZvcm1hbmNlIGJ5IGtlZXBpbmcgbW9yZSBzeW1ib2xzIGluIG1lbW9yeS4gTm90ZSB0aGF0IHRoZSB2YWx1ZSB3b3JrcyBvbg0KKyMgYSBsb2dhcml0aG1pYyBzY2FsZSBzbyBpbmNyZWFzaW5nIHRoZSBzaXplIGJ5IG9uZSB3aWxsIHJvdWdobHkgZG91YmxlIHRoZQ0KKyMgbWVtb3J5IHVzYWdlLiBUaGUgY2FjaGUgc2l6ZSBpcyBnaXZlbiBieSB0aGlzIGZvcm11bGE6DQorIyAyXigxNitTWU1CT0xfQ0FDSEVfU0laRSkuIFRoZSB2YWxpZCByYW5nZSBpcyAwLi45LCB0aGUgZGVmYXVsdCBpcyAwLA0KKyMgY29ycmVzcG9uZGluZyB0byBhIGNhY2hlIHNpemUgb2YgMl4xNiA9IDY1NTM2IHN5bWJvbHMuDQorDQorU1lNQk9MX0NBQ0hFX1NJWkUgICAgICA9IDANCisNCisjIFNpbWlsYXIgdG8gdGhlIFNZTUJPTF9DQUNIRV9TSVpFIHRoZSBzaXplIG9mIHRoZSBzeW1ib2wgbG9va3VwIGNhY2hlIGNhbiBiZQ0KKyMgc2V0IHVzaW5nIExPT0tVUF9DQUNIRV9TSVpFLiBUaGlzIGNhY2hlIGlzIHVzZWQgdG8gcmVzb2x2ZSBzeW1ib2xzIGdpdmVuDQorIyB0aGVpciBuYW1lIGFuZCBzY29wZS4gU2luY2UgdGhpcyBjYW4gYmUgYW4gZXhwZW5zaXZlIHByb2Nlc3MgYW5kIG9mdGVuIHRoZQ0KKyMgc2FtZSBzeW1ib2wgYXBwZWFyIG11bHRpcGxlIHRpbWVzIGluIHRoZSBjb2RlLCBkb3h5Z2VuIGtlZXBzIGEgY2FjaGUgb2YNCisjIHByZS1yZXNvbHZlZCBzeW1ib2xzLiBJZiB0aGUgY2FjaGUgaXMgdG9vIHNtYWxsIGRveHlnZW4gd2lsbCBiZWNvbWUgc2xvd2VyLg0KKyMgSWYgdGhlIGNhY2hlIGlzIHRvbyBsYXJnZSwgbWVtb3J5IGlzIHdhc3RlZC4gVGhlIGNhY2hlIHNpemUgaXMgZ2l2ZW4gYnkgdGhpcw0KKyMgZm9ybXVsYTogMl4oMTYrTE9PS1VQX0NBQ0hFX1NJWkUpLiBUaGUgdmFsaWQgcmFuZ2UgaXMgMC4uOSwgdGhlIGRlZmF1bHQgaXMgMCwNCisjIGNvcnJlc3BvbmRpbmcgdG8gYSBjYWNoZSBzaXplIG9mIDJeMTYgPSA2NTUzNiBzeW1ib2xzLg0KKw0KK0xPT0tVUF9DQUNIRV9TSVpFICAgICAgPSAwDQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgQnVpbGQgcmVsYXRlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorIyBJZiB0aGUgRVhUUkFDVF9BTEwgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGFzc3VtZSBhbGwgZW50aXRpZXMgaW4NCisjIGRvY3VtZW50YXRpb24gYXJlIGRvY3VtZW50ZWQsIGV2ZW4gaWYgbm8gZG9jdW1lbnRhdGlvbiB3YXMgYXZhaWxhYmxlLg0KKyMgUHJpdmF0ZSBjbGFzcyBtZW1iZXJzIGFuZCBzdGF0aWMgZmlsZSBtZW1iZXJzIHdpbGwgYmUgaGlkZGVuIHVubGVzcw0KKyMgdGhlIEVYVFJBQ1RfUFJJVkFURSBhbmQgRVhUUkFDVF9TVEFUSUMgdGFncyBhcmUgc2V0IHRvIFlFUw0KKw0KK0VYVFJBQ1RfQUxMICAgICAgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIEVYVFJBQ1RfUFJJVkFURSB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgcHJpdmF0ZSBtZW1iZXJzIG9mIGEgY2xhc3MNCisjIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uDQorDQorRVhUUkFDVF9QUklWQVRFICAgICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIEVYVFJBQ1RfUEFDS0FHRSB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgbWVtYmVycyB3aXRoIHBhY2thZ2Ugb3IgaW50ZXJuYWwNCisjIHNjb3BlIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uDQorDQorRVhUUkFDVF9QQUNLQUdFICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgRVhUUkFDVF9TVEFUSUMgdGFnIGlzIHNldCB0byBZRVMgYWxsIHN0YXRpYyBtZW1iZXJzIG9mIGEgZmlsZQ0KKyMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4NCisNCitFWFRSQUNUX1NUQVRJQyAgICAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgRVhUUkFDVF9MT0NBTF9DTEFTU0VTIHRhZyBpcyBzZXQgdG8gWUVTIGNsYXNzZXMgKGFuZCBzdHJ1Y3RzKQ0KKyMgZGVmaW5lZCBsb2NhbGx5IGluIHNvdXJjZSBmaWxlcyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLg0KKyMgSWYgc2V0IHRvIE5PIG9ubHkgY2xhc3NlcyBkZWZpbmVkIGluIGhlYWRlciBmaWxlcyBhcmUgaW5jbHVkZWQuDQorDQorRVhUUkFDVF9MT0NBTF9DTEFTU0VTICA9IFlFUw0KKw0KKyMgVGhpcyBmbGFnIGlzIG9ubHkgdXNlZnVsIGZvciBPYmplY3RpdmUtQyBjb2RlLiBXaGVuIHNldCB0byBZRVMgbG9jYWwNCisjIG1ldGhvZHMsIHdoaWNoIGFyZSBkZWZpbmVkIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBzZWN0aW9uIGJ1dCBub3QgaW4NCisjIHRoZSBpbnRlcmZhY2UgYXJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLg0KKyMgSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgb25seSBtZXRob2RzIGluIHRoZSBpbnRlcmZhY2UgYXJlIGluY2x1ZGVkLg0KKw0KK0VYVFJBQ1RfTE9DQUxfTUVUSE9EUyAgPSBOTw0KKw0KKyMgSWYgdGhpcyBmbGFnIGlzIHNldCB0byBZRVMsIHRoZSBtZW1iZXJzIG9mIGFub255bW91cyBuYW1lc3BhY2VzIHdpbGwgYmUNCisjIGV4dHJhY3RlZCBhbmQgYXBwZWFyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFzIGEgbmFtZXNwYWNlIGNhbGxlZA0KKyMgJ2Fub255bW91c19uYW1lc3BhY2V7ZmlsZX0nLCB3aGVyZSBmaWxlIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgYmFzZQ0KKyMgbmFtZSBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBhbm9ueW1vdXMgbmFtZXNwYWNlLiBCeSBkZWZhdWx0DQorIyBhbm9ueW1vdXMgbmFtZXNwYWNlcyBhcmUgaGlkZGVuLg0KKw0KK0VYVFJBQ1RfQU5PTl9OU1BBQ0VTICAgPSBOTw0KKw0KKyMgSWYgdGhlIEhJREVfVU5ET0NfTUVNQkVSUyB0YWcgaXMgc2V0IHRvIFlFUywgRG94eWdlbiB3aWxsIGhpZGUgYWxsDQorIyB1bmRvY3VtZW50ZWQgbWVtYmVycyBvZiBkb2N1bWVudGVkIGNsYXNzZXMsIGZpbGVzIG9yIG5hbWVzcGFjZXMuDQorIyBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVzZSBtZW1iZXJzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlDQorIyB2YXJpb3VzIG92ZXJ2aWV3cywgYnV0IG5vIGRvY3VtZW50YXRpb24gc2VjdGlvbiBpcyBnZW5lcmF0ZWQuDQorIyBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IGlmIEVYVFJBQ1RfQUxMIGlzIGVuYWJsZWQuDQorDQorSElERV9VTkRPQ19NRU1CRVJTICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIEhJREVfVU5ET0NfQ0xBU1NFUyB0YWcgaXMgc2V0IHRvIFlFUywgRG94eWdlbiB3aWxsIGhpZGUgYWxsDQorIyB1bmRvY3VtZW50ZWQgY2xhc3NlcyB0aGF0IGFyZSBub3JtYWxseSB2aXNpYmxlIGluIHRoZSBjbGFzcyBoaWVyYXJjaHkuDQorIyBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVzZSBjbGFzc2VzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHZhcmlvdXMNCisjIG92ZXJ2aWV3cy4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBpZiBFWFRSQUNUX0FMTCBpcyBlbmFibGVkLg0KKw0KK0hJREVfVU5ET0NfQ0xBU1NFUyAgICAgPSBZRVMNCisNCisjIElmIHRoZSBISURFX0ZSSUVORF9DT01QT1VORFMgdGFnIGlzIHNldCB0byBZRVMsIERveHlnZW4gd2lsbCBoaWRlIGFsbA0KKyMgZnJpZW5kIChjbGFzc3xzdHJ1Y3R8dW5pb24pIGRlY2xhcmF0aW9ucy4NCisjIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIHRoZXNlIGRlY2xhcmF0aW9ucyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZQ0KKyMgZG9jdW1lbnRhdGlvbi4NCisNCitISURFX0ZSSUVORF9DT01QT1VORFMgID0gTk8NCisNCisjIElmIHRoZSBISURFX0lOX0JPRFlfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUywgRG94eWdlbiB3aWxsIGhpZGUgYW55DQorIyBkb2N1bWVudGF0aW9uIGJsb2NrcyBmb3VuZCBpbnNpZGUgdGhlIGJvZHkgb2YgYSBmdW5jdGlvbi4NCisjIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIHRoZXNlIGJsb2NrcyB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZQ0KKyMgZnVuY3Rpb24ncyBkZXRhaWxlZCBkb2N1bWVudGF0aW9uIGJsb2NrLg0KKw0KK0hJREVfSU5fQk9EWV9ET0NTICAgICAgPSBOTw0KKw0KKyMgVGhlIElOVEVSTkFMX0RPQ1MgdGFnIGRldGVybWluZXMgaWYgZG9jdW1lbnRhdGlvbg0KKyMgdGhhdCBpcyB0eXBlZCBhZnRlciBhIFxpbnRlcm5hbCBjb21tYW5kIGlzIGluY2x1ZGVkLiBJZiB0aGUgdGFnIGlzIHNldA0KKyMgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVuIHRoZSBkb2N1bWVudGF0aW9uIHdpbGwgYmUgZXhjbHVkZWQuDQorIyBTZXQgaXQgdG8gWUVTIHRvIGluY2x1ZGUgdGhlIGludGVybmFsIGRvY3VtZW50YXRpb24uDQorDQorSU5URVJOQUxfRE9DUyAgICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgQ0FTRV9TRU5TRV9OQU1FUyB0YWcgaXMgc2V0IHRvIE5PIHRoZW4gRG94eWdlbiB3aWxsIG9ubHkgZ2VuZXJhdGUNCisjIGZpbGUgbmFtZXMgaW4gbG93ZXItY2FzZSBsZXR0ZXJzLiBJZiBzZXQgdG8gWUVTIHVwcGVyLWNhc2UgbGV0dGVycyBhcmUgYWxzbw0KKyMgYWxsb3dlZC4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUgY2xhc3NlcyBvciBmaWxlcyB3aG9zZSBuYW1lcyBvbmx5IGRpZmZlcg0KKyMgaW4gY2FzZSBhbmQgaWYgeW91ciBmaWxlIHN5c3RlbSBzdXBwb3J0cyBjYXNlIHNlbnNpdGl2ZSBmaWxlIG5hbWVzLiBXaW5kb3dzDQorIyBhbmQgTWFjIHVzZXJzIGFyZSBhZHZpc2VkIHRvIHNldCB0aGlzIG9wdGlvbiB0byBOTy4NCisNCitDQVNFX1NFTlNFX05BTUVTICAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgSElERV9TQ09QRV9OQU1FUyB0YWcgaXMgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlbiBEb3h5Z2VuDQorIyB3aWxsIHNob3cgbWVtYmVycyB3aXRoIHRoZWlyIGZ1bGwgY2xhc3MgYW5kIG5hbWVzcGFjZSBzY29wZXMgaW4gdGhlDQorIyBkb2N1bWVudGF0aW9uLiBJZiBzZXQgdG8gWUVTIHRoZSBzY29wZSB3aWxsIGJlIGhpZGRlbi4NCisNCitISURFX1NDT1BFX05BTUVTICAgICAgID0gTk8NCisNCisjIElmIHRoZSBTSE9XX0lOQ0xVREVfRklMRVMgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGVuIERveHlnZW4NCisjIHdpbGwgcHV0IGEgbGlzdCBvZiB0aGUgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgYnkgYSBmaWxlIGluIHRoZSBkb2N1bWVudGF0aW9uDQorIyBvZiB0aGF0IGZpbGUuDQorDQorU0hPV19JTkNMVURFX0ZJTEVTICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIEZPUkNFX0xPQ0FMX0lOQ0xVREVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gRG94eWdlbg0KKyMgd2lsbCBsaXN0IGluY2x1ZGUgZmlsZXMgd2l0aCBkb3VibGUgcXVvdGVzIGluIHRoZSBkb2N1bWVudGF0aW9uDQorIyByYXRoZXIgdGhhbiB3aXRoIHNoYXJwIGJyYWNrZXRzLg0KKw0KK0ZPUkNFX0xPQ0FMX0lOQ0xVREVTICAgPSBOTw0KKw0KKyMgSWYgdGhlIElOTElORV9JTkZPIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbiBhIHRhZyBbaW5saW5lXQ0KKyMgaXMgaW5zZXJ0ZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gZm9yIGlubGluZSBtZW1iZXJzLg0KKw0KK0lOTElORV9JTkZPICAgICAgICAgICAgPSBZRVMNCisNCisjIElmIHRoZSBTT1JUX01FTUJFUl9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbiBkb3h5Z2VuDQorIyB3aWxsIHNvcnQgdGhlIChkZXRhaWxlZCkgZG9jdW1lbnRhdGlvbiBvZiBmaWxlIGFuZCBjbGFzcyBtZW1iZXJzDQorIyBhbHBoYWJldGljYWxseSBieSBtZW1iZXIgbmFtZS4gSWYgc2V0IHRvIE5PIHRoZSBtZW1iZXJzIHdpbGwgYXBwZWFyIGluDQorIyBkZWNsYXJhdGlvbiBvcmRlci4NCisNCitTT1JUX01FTUJFUl9ET0NTICAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgU09SVF9CUklFRl9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNvcnQgdGhlDQorIyBicmllZiBkb2N1bWVudGF0aW9uIG9mIGZpbGUsIG5hbWVzcGFjZSBhbmQgY2xhc3MgbWVtYmVycyBhbHBoYWJldGljYWxseQ0KKyMgYnkgbWVtYmVyIG5hbWUuIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIHRoZSBtZW1iZXJzIHdpbGwgYXBwZWFyIGluDQorIyBkZWNsYXJhdGlvbiBvcmRlci4NCisNCitTT1JUX0JSSUVGX0RPQ1MgICAgICAgID0gTk8NCisNCisjIElmIHRoZSBTT1JUX01FTUJFUlNfQ1RPUlNfMVNUIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbg0KKyMgd2lsbCBzb3J0IHRoZSAoYnJpZWYgYW5kIGRldGFpbGVkKSBkb2N1bWVudGF0aW9uIG9mIGNsYXNzIG1lbWJlcnMgc28gdGhhdA0KKyMgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBhcmUgbGlzdGVkIGZpcnN0LiBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KQ0KKyMgdGhlIGNvbnN0cnVjdG9ycyB3aWxsIGFwcGVhciBpbiB0aGUgcmVzcGVjdGl2ZSBvcmRlcnMgZGVmaW5lZCBieQ0KKyMgU09SVF9NRU1CRVJfRE9DUyBhbmQgU09SVF9CUklFRl9ET0NTLg0KKyMgVGhpcyB0YWcgd2lsbCBiZSBpZ25vcmVkIGZvciBicmllZiBkb2NzIGlmIFNPUlRfQlJJRUZfRE9DUyBpcyBzZXQgdG8gTk8NCisjIGFuZCBpZ25vcmVkIGZvciBkZXRhaWxlZCBkb2NzIGlmIFNPUlRfTUVNQkVSX0RPQ1MgaXMgc2V0IHRvIE5PLg0KKw0KK1NPUlRfTUVNQkVSU19DVE9SU18xU1QgPSBOTw0KKw0KKyMgSWYgdGhlIFNPUlRfR1JPVVBfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUNCisjIGhpZXJhcmNoeSBvZiBncm91cCBuYW1lcyBpbnRvIGFscGhhYmV0aWNhbCBvcmRlci4gSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkNCisjIHRoZSBncm91cCBuYW1lcyB3aWxsIGFwcGVhciBpbiB0aGVpciBkZWZpbmVkIG9yZGVyLg0KKw0KK1NPUlRfR1JPVVBfTkFNRVMgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIFNPUlRfQllfU0NPUEVfTkFNRSB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIGNsYXNzIGxpc3Qgd2lsbCBiZQ0KKyMgc29ydGVkIGJ5IGZ1bGx5LXF1YWxpZmllZCBuYW1lcywgaW5jbHVkaW5nIG5hbWVzcGFjZXMuIElmIHNldCB0bw0KKyMgTk8gKHRoZSBkZWZhdWx0KSwgdGhlIGNsYXNzIGxpc3Qgd2lsbCBiZSBzb3J0ZWQgb25seSBieSBjbGFzcyBuYW1lLA0KKyMgbm90IGluY2x1ZGluZyB0aGUgbmFtZXNwYWNlIHBhcnQuDQorIyBOb3RlOiBUaGlzIG9wdGlvbiBpcyBub3QgdmVyeSB1c2VmdWwgaWYgSElERV9TQ09QRV9OQU1FUyBpcyBzZXQgdG8gWUVTLg0KKyMgTm90ZTogVGhpcyBvcHRpb24gYXBwbGllcyBvbmx5IHRvIHRoZSBjbGFzcyBsaXN0LCBub3QgdG8gdGhlDQorIyBhbHBoYWJldGljYWwgbGlzdC4NCisNCitTT1JUX0JZX1NDT1BFX05BTUUgICAgID0gTk8NCisNCisjIElmIHRoZSBTVFJJQ1RfUFJPVE9fTUFUQ0hJTkcgb3B0aW9uIGlzIGVuYWJsZWQgYW5kIGRveHlnZW4gZmFpbHMgdG8NCisjIGRvIHByb3BlciB0eXBlIHJlc29sdXRpb24gb2YgYWxsIHBhcmFtZXRlcnMgb2YgYSBmdW5jdGlvbiBpdCB3aWxsIHJlamVjdCBhDQorIyBtYXRjaCBiZXR3ZWVuIHRoZSBwcm90b3R5cGUgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhIG1lbWJlciBmdW5jdGlvbiBldmVuDQorIyBpZiB0aGVyZSBpcyBvbmx5IG9uZSBjYW5kaWRhdGUgb3IgaXQgaXMgb2J2aW91cyB3aGljaCBjYW5kaWRhdGUgdG8gY2hvb3NlDQorIyBieSBkb2luZyBhIHNpbXBsZSBzdHJpbmcgbWF0Y2guIEJ5IGRpc2FibGluZyBTVFJJQ1RfUFJPVE9fTUFUQ0hJTkcgZG94eWdlbg0KKyMgd2lsbCBzdGlsbCBhY2NlcHQgYSBtYXRjaCBiZXR3ZWVuIHByb3RvdHlwZSBhbmQgaW1wbGVtZW50YXRpb24gaW4gc3VjaCBjYXNlcy4NCisNCitTVFJJQ1RfUFJPVE9fTUFUQ0hJTkcgID0gTk8NCisNCisjIFRoZSBHRU5FUkFURV9UT0RPTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yDQorIyBkaXNhYmxlIChOTykgdGhlIHRvZG8gbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcdG9kbw0KKyMgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uDQorDQorR0VORVJBVEVfVE9ET0xJU1QgICAgICA9IFlFUw0KKw0KKyMgVGhlIEdFTkVSQVRFX1RFU1RMSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKFlFUykgb3INCisjIGRpc2FibGUgKE5PKSB0aGUgdGVzdCBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFx0ZXN0DQorIyBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4NCisNCitHRU5FUkFURV9URVNUTElTVCAgICAgID0gWUVTDQorDQorIyBUaGUgR0VORVJBVEVfQlVHTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yDQorIyBkaXNhYmxlIChOTykgdGhlIGJ1ZyBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFxidWcNCisjIGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLg0KKw0KK0dFTkVSQVRFX0JVR0xJU1QgICAgICAgPSBZRVMNCisNCisjIFRoZSBHRU5FUkFURV9ERVBSRUNBVEVETElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yDQorIyBkaXNhYmxlIChOTykgdGhlIGRlcHJlY2F0ZWQgbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZw0KKyMgXGRlcHJlY2F0ZWQgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uDQorDQorR0VORVJBVEVfREVQUkVDQVRFRExJU1Q9IFlFUw0KKw0KKyMgVGhlIEVOQUJMRURfU0VDVElPTlMgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSBjb25kaXRpb25hbA0KKyMgZG9jdW1lbnRhdGlvbiBzZWN0aW9ucywgbWFya2VkIGJ5IFxpZiBzZWN0aW9ubmFtZSAuLi4gXGVuZGlmLg0KKw0KK0VOQUJMRURfU0VDVElPTlMgICAgICAgPQ0KKw0KKyMgVGhlIE1BWF9JTklUSUFMSVpFUl9MSU5FUyB0YWcgZGV0ZXJtaW5lcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgbGluZXMNCisjIHRoZSBpbml0aWFsIHZhbHVlIG9mIGEgdmFyaWFibGUgb3IgbWFjcm8gY29uc2lzdHMgb2YgZm9yIGl0IHRvIGFwcGVhciBpbg0KKyMgdGhlIGRvY3VtZW50YXRpb24uIElmIHRoZSBpbml0aWFsaXplciBjb25zaXN0cyBvZiBtb3JlIGxpbmVzIHRoYW4gc3BlY2lmaWVkDQorIyBoZXJlIGl0IHdpbGwgYmUgaGlkZGVuLiBVc2UgYSB2YWx1ZSBvZiAwIHRvIGhpZGUgaW5pdGlhbGl6ZXJzIGNvbXBsZXRlbHkuDQorIyBUaGUgYXBwZWFyYW5jZSBvZiB0aGUgaW5pdGlhbGl6ZXIgb2YgaW5kaXZpZHVhbCB2YXJpYWJsZXMgYW5kIG1hY3JvcyBpbiB0aGUNCisjIGRvY3VtZW50YXRpb24gY2FuIGJlIGNvbnRyb2xsZWQgdXNpbmcgXHNob3dpbml0aWFsaXplciBvciBcaGlkZWluaXRpYWxpemVyDQorIyBjb21tYW5kIGluIHRoZSBkb2N1bWVudGF0aW9uIHJlZ2FyZGxlc3Mgb2YgdGhpcyBzZXR0aW5nLg0KKw0KK01BWF9JTklUSUFMSVpFUl9MSU5FUyAgPSAzMA0KKw0KKyMgU2V0IHRoZSBTSE9XX1VTRURfRklMRVMgdGFnIHRvIE5PIHRvIGRpc2FibGUgdGhlIGxpc3Qgb2YgZmlsZXMgZ2VuZXJhdGVkDQorIyBhdCB0aGUgYm90dG9tIG9mIHRoZSBkb2N1bWVudGF0aW9uIG9mIGNsYXNzZXMgYW5kIHN0cnVjdHMuIElmIHNldCB0byBZRVMgdGhlDQorIyBsaXN0IHdpbGwgbWVudGlvbiB0aGUgZmlsZXMgdGhhdCB3ZXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGRvY3VtZW50YXRpb24uDQorDQorU0hPV19VU0VEX0ZJTEVTICAgICAgICA9IFlFUw0KKw0KKyMgU2V0IHRoZSBTSE9XX0ZJTEVTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBGaWxlcyBwYWdlLg0KKyMgVGhpcyB3aWxsIHJlbW92ZSB0aGUgRmlsZXMgZW50cnkgZnJvbSB0aGUgUXVpY2sgSW5kZXggYW5kIGZyb20gdGhlDQorIyBGb2xkZXIgVHJlZSBWaWV3IChpZiBzcGVjaWZpZWQpLiBUaGUgZGVmYXVsdCBpcyBZRVMuDQorDQorIyBXZSBwcm9iYWJseSB3aWxsIHdhbnQgdGhpcywgYnV0IHdlIGhhdmUgbm8gZmlsZSBkb2N1bWVudGF0aW9uIHlldCBzbyBpdCdzIHNpbXBsZXIgdG8gcmVtb3ZlDQorIyBpdCBmb3Igbm93Lg0KK1NIT1dfRklMRVMgICAgICAgICAgICAgPSBOTw0KKw0KKyMgU2V0IHRoZSBTSE9XX05BTUVTUEFDRVMgdGFnIHRvIE5PIHRvIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gb2YgdGhlDQorIyBOYW1lc3BhY2VzIHBhZ2UuDQorIyBUaGlzIHdpbGwgcmVtb3ZlIHRoZSBOYW1lc3BhY2VzIGVudHJ5IGZyb20gdGhlIFF1aWNrIEluZGV4DQorIyBhbmQgZnJvbSB0aGUgRm9sZGVyIFRyZWUgVmlldyAoaWYgc3BlY2lmaWVkKS4gVGhlIGRlZmF1bHQgaXMgWUVTLg0KKw0KK1NIT1dfTkFNRVNQQUNFUyAgICAgICAgPSBZRVMNCisNCisjIFRoZSBGSUxFX1ZFUlNJT05fRklMVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcHJvZ3JhbSBvciBzY3JpcHQgdGhhdA0KKyMgZG94eWdlbiBzaG91bGQgaW52b2tlIHRvIGdldCB0aGUgY3VycmVudCB2ZXJzaW9uIGZvciBlYWNoIGZpbGUgKHR5cGljYWxseSBmcm9tDQorIyB0aGUgdmVyc2lvbiBjb250cm9sIHN5c3RlbSkuIERveHlnZW4gd2lsbCBpbnZva2UgdGhlIHByb2dyYW0gYnkgZXhlY3V0aW5nICh2aWENCisjIHBvcGVuKCkpIHRoZSBjb21tYW5kIDxjb21tYW5kPiA8aW5wdXQtZmlsZT4sIHdoZXJlIDxjb21tYW5kPiBpcyB0aGUgdmFsdWUgb2YNCisjIHRoZSBGSUxFX1ZFUlNJT05fRklMVEVSIHRhZywgYW5kIDxpbnB1dC1maWxlPiBpcyB0aGUgbmFtZSBvZiBhbiBpbnB1dCBmaWxlDQorIyBwcm92aWRlZCBieSBkb3h5Z2VuLiBXaGF0ZXZlciB0aGUgcHJvZ3JhbSB3cml0ZXMgdG8gc3RhbmRhcmQgb3V0cHV0DQorIyBpcyB1c2VkIGFzIHRoZSBmaWxlIHZlcnNpb24uIFNlZSB0aGUgbWFudWFsIGZvciBleGFtcGxlcy4NCisNCitGSUxFX1ZFUlNJT05fRklMVEVSICAgID0NCisNCisjIFRoZSBMQVlPVVRfRklMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGxheW91dCBmaWxlIHdoaWNoIHdpbGwgYmUgcGFyc2VkDQorIyBieSBkb3h5Z2VuLiBUaGUgbGF5b3V0IGZpbGUgY29udHJvbHMgdGhlIGdsb2JhbCBzdHJ1Y3R1cmUgb2YgdGhlIGdlbmVyYXRlZA0KKyMgb3V0cHV0IGZpbGVzIGluIGFuIG91dHB1dCBmb3JtYXQgaW5kZXBlbmRlbnQgd2F5LiBUbyBjcmVhdGUgdGhlIGxheW91dCBmaWxlDQorIyB0aGF0IHJlcHJlc2VudHMgZG94eWdlbidzIGRlZmF1bHRzLCBydW4gZG94eWdlbiB3aXRoIHRoZSAtbCBvcHRpb24uDQorIyBZb3UgY2FuIG9wdGlvbmFsbHkgc3BlY2lmeSBhIGZpbGUgbmFtZSBhZnRlciB0aGUgb3B0aW9uLCBpZiBvbWl0dGVkDQorIyBEb3h5Z2VuTGF5b3V0LnhtbCB3aWxsIGJlIHVzZWQgYXMgdGhlIG5hbWUgb2YgdGhlIGxheW91dCBmaWxlLg0KKw0KK0xBWU9VVF9GSUxFICAgICAgICAgICAgPQ0KKw0KKyMgVGhlIENJVEVfQklCX0ZJTEVTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGJpYiBmaWxlcw0KKyMgY29udGFpbmluZyB0aGUgcmVmZXJlbmNlcyBkYXRhLiBUaGlzIG11c3QgYmUgYSBsaXN0IG9mIC5iaWIgZmlsZXMuIFRoZQ0KKyMgLmJpYiBleHRlbnNpb24gaXMgYXV0b21hdGljYWxseSBhcHBlbmRlZCBpZiBvbWl0dGVkLiBVc2luZyB0aGlzIGNvbW1hbmQNCisjIHJlcXVpcmVzIHRoZSBiaWJ0ZXggdG9vbCB0byBiZSBpbnN0YWxsZWQuIFNlZSBhbHNvDQorIyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JpYlRlWCBmb3IgbW9yZSBpbmZvLiBGb3IgTGFUZVggdGhlIHN0eWxlDQorIyBvZiB0aGUgYmlibGlvZ3JhcGh5IGNhbiBiZSBjb250cm9sbGVkIHVzaW5nIExBVEVYX0JJQl9TVFlMRS4gVG8gdXNlIHRoaXMNCisjIGZlYXR1cmUgeW91IG5lZWQgYmlidGV4IGFuZCBwZXJsIGF2YWlsYWJsZSBpbiB0aGUgc2VhcmNoIHBhdGguDQorDQorQ0lURV9CSUJfRklMRVMgICAgICAgICA9DQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gd2FybmluZyBhbmQgcHJvZ3Jlc3MgbWVzc2FnZXMNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorIyBUaGUgUVVJRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSBtZXNzYWdlcyB0aGF0IGFyZSBnZW5lcmF0ZWQNCisjIGJ5IGRveHlnZW4uIFBvc3NpYmxlIHZhbHVlcyBhcmUgWUVTIGFuZCBOTy4gSWYgbGVmdCBibGFuayBOTyBpcyB1c2VkLg0KKw0KK1FVSUVUICAgICAgICAgICAgICAgICAgPSBOTw0KKw0KKyMgVGhlIFdBUk5JTkdTIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIG9uL29mZiB0aGUgd2FybmluZyBtZXNzYWdlcyB0aGF0IGFyZQ0KKyMgZ2VuZXJhdGVkIGJ5IGRveHlnZW4uIFBvc3NpYmxlIHZhbHVlcyBhcmUgWUVTIGFuZCBOTy4gSWYgbGVmdCBibGFuaw0KKyMgTk8gaXMgdXNlZC4NCisNCitXQVJOSU5HUyAgICAgICAgICAgICAgID0gWUVTDQorDQorIyBJZiBXQVJOX0lGX1VORE9DVU1FTlRFRCBpcyBzZXQgdG8gWUVTLCB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSB3YXJuaW5ncw0KKyMgZm9yIHVuZG9jdW1lbnRlZCBtZW1iZXJzLiBJZiBFWFRSQUNUX0FMTCBpcyBzZXQgdG8gWUVTIHRoZW4gdGhpcyBmbGFnIHdpbGwNCisjIGF1dG9tYXRpY2FsbHkgYmUgZGlzYWJsZWQuDQorDQorV0FSTl9JRl9VTkRPQ1VNRU5URUQgICA9IFlFUw0KKw0KKyMgSWYgV0FSTl9JRl9ET0NfRVJST1IgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIHdhcm5pbmdzIGZvcg0KKyMgcG90ZW50aWFsIGVycm9ycyBpbiB0aGUgZG9jdW1lbnRhdGlvbiwgc3VjaCBhcyBub3QgZG9jdW1lbnRpbmcgc29tZQ0KKyMgcGFyYW1ldGVycyBpbiBhIGRvY3VtZW50ZWQgZnVuY3Rpb24sIG9yIGRvY3VtZW50aW5nIHBhcmFtZXRlcnMgdGhhdA0KKyMgZG9uJ3QgZXhpc3Qgb3IgdXNpbmcgbWFya3VwIGNvbW1hbmRzIHdyb25nbHkuDQorDQorV0FSTl9JRl9ET0NfRVJST1IgICAgICA9IFlFUw0KKw0KKyMgVGhlIFdBUk5fTk9fUEFSQU1ET0Mgb3B0aW9uIGNhbiBiZSBlbmFibGVkIHRvIGdldCB3YXJuaW5ncyBmb3INCisjIGZ1bmN0aW9ucyB0aGF0IGFyZSBkb2N1bWVudGVkLCBidXQgaGF2ZSBubyBkb2N1bWVudGF0aW9uIGZvciB0aGVpciBwYXJhbWV0ZXJzDQorIyBvciByZXR1cm4gdmFsdWUuIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIGRveHlnZW4gd2lsbCBvbmx5IHdhcm4gYWJvdXQNCisjIHdyb25nIG9yIGluY29tcGxldGUgcGFyYW1ldGVyIGRvY3VtZW50YXRpb24sIGJ1dCBub3QgYWJvdXQgdGhlIGFic2VuY2Ugb2YNCisjIGRvY3VtZW50YXRpb24uDQorDQorV0FSTl9OT19QQVJBTURPQyAgICAgICA9IE5PDQorDQorIyBUaGUgV0FSTl9GT1JNQVQgdGFnIGRldGVybWluZXMgdGhlIGZvcm1hdCBvZiB0aGUgd2FybmluZyBtZXNzYWdlcyB0aGF0DQorIyBkb3h5Z2VuIGNhbiBwcm9kdWNlLiBUaGUgc3RyaW5nIHNob3VsZCBjb250YWluIHRoZSAkZmlsZSwgJGxpbmUsIGFuZCAkdGV4dA0KKyMgdGFncywgd2hpY2ggd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgZmlsZSBhbmQgbGluZSBudW1iZXIgZnJvbSB3aGljaCB0aGUNCisjIHdhcm5pbmcgb3JpZ2luYXRlZCBhbmQgdGhlIHdhcm5pbmcgdGV4dC4gT3B0aW9uYWxseSB0aGUgZm9ybWF0IG1heSBjb250YWluDQorIyAkdmVyc2lvbiwgd2hpY2ggd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgdmVyc2lvbiBvZiB0aGUgZmlsZSAoaWYgaXQgY291bGQNCisjIGJlIG9idGFpbmVkIHZpYSBGSUxFX1ZFUlNJT05fRklMVEVSKQ0KKw0KK1dBUk5fRk9STUFUICAgICAgICAgICAgPQ0KKw0KKyMgVGhlIFdBUk5fTE9HRklMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGZpbGUgdG8gd2hpY2ggd2FybmluZw0KKyMgYW5kIGVycm9yIG1lc3NhZ2VzIHNob3VsZCBiZSB3cml0dGVuLiBJZiBsZWZ0IGJsYW5rIHRoZSBvdXRwdXQgaXMgd3JpdHRlbg0KKyMgdG8gc3RkZXJyLg0KKw0KK1dBUk5fTE9HRklMRSAgICAgICAgICAgPQ0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBpbnB1dCBmaWxlcw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisjIFRoZSBJTlBVVCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZXMgYW5kL29yIGRpcmVjdG9yaWVzIHRoYXQgY29udGFpbg0KKyMgZG9jdW1lbnRlZCBzb3VyY2UgZmlsZXMuIFlvdSBtYXkgZW50ZXIgZmlsZSBuYW1lcyBsaWtlICJteWZpbGUuY3BwIiBvcg0KKyMgZGlyZWN0b3JpZXMgbGlrZSAiL3Vzci9zcmMvbXlwcm9qZWN0Ii4gU2VwYXJhdGUgdGhlIGZpbGVzIG9yIGRpcmVjdG9yaWVzDQorIyB3aXRoIHNwYWNlcy4NCisNCitJTlBVVCAgICAgICAgICAgICAgICAgID0gc3JjICBkb2MvZG94eWdlbi9saWJvbXBfaW50ZXJmYWNlLmggDQorIyBUaGUgaXR0bm90aWZ5IGNvZGUgYWxzbyBoYXMgZG94eWdlbiBkb2N1bWVudGF0aW9uLCBidXQgaWYgd2UgaW5jbHVkZSBpdCBoZXJlDQorIyBpdCB0YWtlcyBvdmVyIGZyb20gdXMhDQorIyBzcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkgICAgICAgICAgICAgICAgICAgICAgICAgDQorDQorIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBjaGFyYWN0ZXIgZW5jb2Rpbmcgb2YgdGhlIHNvdXJjZSBmaWxlcw0KKyMgdGhhdCBkb3h5Z2VuIHBhcnNlcy4gSW50ZXJuYWxseSBkb3h5Z2VuIHVzZXMgdGhlIFVURi04IGVuY29kaW5nLCB3aGljaCBpcw0KKyMgYWxzbyB0aGUgZGVmYXVsdCBpbnB1dCBlbmNvZGluZy4gRG94eWdlbiB1c2VzIGxpYmljb252IChvciB0aGUgaWNvbnYgYnVpbHQNCisjIGludG8gbGliYykgZm9yIHRoZSB0cmFuc2NvZGluZy4gU2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9saWJpY29udiBmb3INCisjIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGVuY29kaW5ncy4NCisNCitJTlBVVF9FTkNPRElORyAgICAgICAgID0gVVRGLTgNCisNCisjIElmIHRoZSB2YWx1ZSBvZiB0aGUgSU5QVVQgdGFnIGNvbnRhaW5zIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHVzZSB0aGUNCisjIEZJTEVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybiAobGlrZSAqLmNwcA0KKyMgYW5kICouaCkgdG8gZmlsdGVyIG91dCB0aGUgc291cmNlLWZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4gSWYgbGVmdA0KKyMgYmxhbmsgdGhlIGZvbGxvd2luZyBwYXR0ZXJucyBhcmUgdGVzdGVkOg0KKyMgKi5jICouY2MgKi5jeHggKi5jcHAgKi5jKysgKi5kICouamF2YSAqLmlpICouaXh4ICouaXBwICouaSsrICouaW5sICouaCAqLmhoDQorIyAqLmh4eCAqLmhwcCAqLmgrKyAqLmlkbCAqLm9kbCAqLmNzICoucGhwICoucGhwMyAqLmluYyAqLm0gKi5tbSAqLmRveCAqLnB5DQorIyAqLmY5MCAqLmYgKi5mb3IgKi52aGQgKi52aGRsDQorDQorRklMRV9QQVRURVJOUyAgICAgICAgICA9ICouYyAqLmggKi5jcHAgDQorIyBXZSBtYXkgYWxzbyB3YW50IHRvIGluY2x1ZGUgdGhlIGFzbSBmaWxlcyB3aXRoIGFwcHJvcHJpYXRlIGlmZGVmIHRvIGVuc3VyZQ0KKyMgZG94eWdlbiBkb2Vzbid0IHNlZSB0aGUgY29udGVudCwganVzdCB0aGUgZG9jdW1lbnRhdGlvbi4uLg0KKw0KKyMgVGhlIFJFQ1VSU0lWRSB0YWcgY2FuIGJlIHVzZWQgdG8gdHVybiBzcGVjaWZ5IHdoZXRoZXIgb3Igbm90IHN1YmRpcmVjdG9yaWVzDQorIyBzaG91bGQgYmUgc2VhcmNoZWQgZm9yIGlucHV0IGZpbGVzIGFzIHdlbGwuIFBvc3NpYmxlIHZhbHVlcyBhcmUgWUVTIGFuZCBOTy4NCisjIElmIGxlZnQgYmxhbmsgTk8gaXMgdXNlZC4NCisNCisjIE9ubHkgbG9vayBpbiB0aGUgb25lIGRpcmVjdG9yeS4NCitSRUNVUlNJVkUgICAgICAgICAgICAgID0gTk8NCisNCisjIFRoZSBFWENMVURFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGZpbGVzIGFuZC9vciBkaXJlY3RvcmllcyB0aGF0IHNob3VsZCBiZQ0KKyMgZXhjbHVkZWQgZnJvbSB0aGUgSU5QVVQgc291cmNlIGZpbGVzLiBUaGlzIHdheSB5b3UgY2FuIGVhc2lseSBleGNsdWRlIGENCisjIHN1YmRpcmVjdG9yeSBmcm9tIGEgZGlyZWN0b3J5IHRyZWUgd2hvc2Ugcm9vdCBpcyBzcGVjaWZpZWQgd2l0aCB0aGUgSU5QVVQgdGFnLg0KKyMgTm90ZSB0aGF0IHJlbGF0aXZlIHBhdGhzIGFyZSByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggZG94eWdlbiBpcw0KKyMgcnVuLg0KKw0KK0VYQ0xVREUgICAgICAgICAgICAgICAgPSBzcmMvdGVzdC10b3VjaC5jDQorDQorIyBUaGUgRVhDTFVERV9TWU1MSU5LUyB0YWcgY2FuIGJlIHVzZWQgdG8gc2VsZWN0IHdoZXRoZXIgb3Igbm90IGZpbGVzIG9yDQorIyBkaXJlY3RvcmllcyB0aGF0IGFyZSBzeW1ib2xpYyBsaW5rcyAoYSBVbml4IGZpbGUgc3lzdGVtIGZlYXR1cmUpIGFyZSBleGNsdWRlZA0KKyMgZnJvbSB0aGUgaW5wdXQuDQorDQorRVhDTFVERV9TWU1MSU5LUyAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgdmFsdWUgb2YgdGhlIElOUFVUIHRhZyBjb250YWlucyBkaXJlY3RvcmllcywgeW91IGNhbiB1c2UgdGhlDQorIyBFWENMVURFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkIHBhdHRlcm5zIHRvIGV4Y2x1ZGUNCisjIGNlcnRhaW4gZmlsZXMgZnJvbSB0aG9zZSBkaXJlY3Rvcmllcy4gTm90ZSB0aGF0IHRoZSB3aWxkY2FyZHMgYXJlIG1hdGNoZWQNCisjIGFnYWluc3QgdGhlIGZpbGUgd2l0aCBhYnNvbHV0ZSBwYXRoLCBzbyB0byBleGNsdWRlIGFsbCB0ZXN0IGRpcmVjdG9yaWVzDQorIyBmb3IgZXhhbXBsZSB1c2UgdGhlIHBhdHRlcm4gKi90ZXN0LyoNCisNCitFWENMVURFX1BBVFRFUk5TICAgICAgID0NCisNCisjIFRoZSBFWENMVURFX1NZTUJPTFMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgc3ltYm9sIG5hbWVzDQorIyAobmFtZXNwYWNlcywgY2xhc3NlcywgZnVuY3Rpb25zLCBldGMuKSB0aGF0IHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIHRoZQ0KKyMgb3V0cHV0LiBUaGUgc3ltYm9sIG5hbWUgY2FuIGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUsIGEgd29yZCwgb3IgaWYgdGhlDQorIyB3aWxkY2FyZCAqIGlzIHVzZWQsIGEgc3Vic3RyaW5nLiBFeGFtcGxlczogQU5hbWVzcGFjZSwgQUNsYXNzLA0KKyMgQUNsYXNzOjpBTmFtZXNwYWNlLCBBTmFtZXNwYWNlOjoqVGVzdA0KKw0KK0VYQ0xVREVfU1lNQk9MUyAgICAgICAgPQ0KKw0KKyMgVGhlIEVYQU1QTEVfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBmaWxlcyBvcg0KKyMgZGlyZWN0b3JpZXMgdGhhdCBjb250YWluIGV4YW1wbGUgY29kZSBmcmFnbWVudHMgdGhhdCBhcmUgaW5jbHVkZWQgKHNlZQ0KKyMgdGhlIFxpbmNsdWRlIGNvbW1hbmQpLg0KKw0KK0VYQU1QTEVfUEFUSCAgICAgICAgICAgPQ0KKw0KKyMgSWYgdGhlIHZhbHVlIG9mIHRoZSBFWEFNUExFX1BBVEggdGFnIGNvbnRhaW5zIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHVzZSB0aGUNCisjIEVYQU1QTEVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybiAobGlrZSAqLmNwcA0KKyMgYW5kICouaCkgdG8gZmlsdGVyIG91dCB0aGUgc291cmNlLWZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4gSWYgbGVmdA0KKyMgYmxhbmsgYWxsIGZpbGVzIGFyZSBpbmNsdWRlZC4NCisNCitFWEFNUExFX1BBVFRFUk5TICAgICAgID0NCisNCisjIElmIHRoZSBFWEFNUExFX1JFQ1VSU0lWRSB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHN1YmRpcmVjdG9yaWVzIHdpbGwgYmUNCisjIHNlYXJjaGVkIGZvciBpbnB1dCBmaWxlcyB0byBiZSB1c2VkIHdpdGggdGhlIFxpbmNsdWRlIG9yIFxkb250aW5jbHVkZQ0KKyMgY29tbWFuZHMgaXJyZXNwZWN0aXZlIG9mIHRoZSB2YWx1ZSBvZiB0aGUgUkVDVVJTSVZFIHRhZy4NCisjIFBvc3NpYmxlIHZhbHVlcyBhcmUgWUVTIGFuZCBOTy4gSWYgbGVmdCBibGFuayBOTyBpcyB1c2VkLg0KKw0KK0VYQU1QTEVfUkVDVVJTSVZFICAgICAgPSBOTw0KKw0KKyMgVGhlIElNQUdFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZmlsZXMgb3INCisjIGRpcmVjdG9yaWVzIHRoYXQgY29udGFpbiBpbWFnZSB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlDQorIyB0aGUgXGltYWdlIGNvbW1hbmQpLg0KKw0KK0lNQUdFX1BBVEggICAgICAgICAgICAgPQ0KKw0KKyMgVGhlIElOUFVUX0ZJTFRFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHByb2dyYW0gdGhhdCBkb3h5Z2VuIHNob3VsZA0KKyMgaW52b2tlIHRvIGZpbHRlciBmb3IgZWFjaCBpbnB1dCBmaWxlLiBEb3h5Z2VuIHdpbGwgaW52b2tlIHRoZSBmaWx0ZXIgcHJvZ3JhbQ0KKyMgYnkgZXhlY3V0aW5nICh2aWEgcG9wZW4oKSkgdGhlIGNvbW1hbmQgPGZpbHRlcj4gPGlucHV0LWZpbGU+LCB3aGVyZSA8ZmlsdGVyPg0KKyMgaXMgdGhlIHZhbHVlIG9mIHRoZSBJTlBVVF9GSUxURVIgdGFnLCBhbmQgPGlucHV0LWZpbGU+IGlzIHRoZSBuYW1lIG9mIGFuDQorIyBpbnB1dCBmaWxlLiBEb3h5Z2VuIHdpbGwgdGhlbiB1c2UgdGhlIG91dHB1dCB0aGF0IHRoZSBmaWx0ZXIgcHJvZ3JhbSB3cml0ZXMNCisjIHRvIHN0YW5kYXJkIG91dHB1dC4NCisjIElmIEZJTFRFUl9QQVRURVJOUyBpcyBzcGVjaWZpZWQsIHRoaXMgdGFnIHdpbGwgYmUNCisjIGlnbm9yZWQuDQorDQorSU5QVVRfRklMVEVSICAgICAgICAgICA9DQorDQorIyBUaGUgRklMVEVSX1BBVFRFUk5TIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGZpbHRlcnMgb24gYSBwZXIgZmlsZSBwYXR0ZXJuDQorIyBiYXNpcy4NCisjIERveHlnZW4gd2lsbCBjb21wYXJlIHRoZSBmaWxlIG5hbWUgd2l0aCBlYWNoIHBhdHRlcm4gYW5kIGFwcGx5IHRoZQ0KKyMgZmlsdGVyIGlmIHRoZXJlIGlzIGEgbWF0Y2guDQorIyBUaGUgZmlsdGVycyBhcmUgYSBsaXN0IG9mIHRoZSBmb3JtOg0KKyMgcGF0dGVybj1maWx0ZXIgKGxpa2UgKi5jcHA9bXlfY3BwX2ZpbHRlcikuIFNlZSBJTlBVVF9GSUxURVIgZm9yIGZ1cnRoZXINCisjIGluZm8gb24gaG93IGZpbHRlcnMgYXJlIHVzZWQuIElmIEZJTFRFUl9QQVRURVJOUyBpcyBlbXB0eSBvciBpZg0KKyMgbm9uIG9mIHRoZSBwYXR0ZXJucyBtYXRjaCB0aGUgZmlsZSBuYW1lLCBJTlBVVF9GSUxURVIgaXMgYXBwbGllZC4NCisNCitGSUxURVJfUEFUVEVSTlMgICAgICAgID0NCisNCisjIElmIHRoZSBGSUxURVJfU09VUkNFX0ZJTEVTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgaW5wdXQgZmlsdGVyIChpZiBzZXQgdXNpbmcNCisjIElOUFVUX0ZJTFRFUikgd2lsbCBiZSB1c2VkIHRvIGZpbHRlciB0aGUgaW5wdXQgZmlsZXMgd2hlbiBwcm9kdWNpbmcgc291cmNlDQorIyBmaWxlcyB0byBicm93c2UgKGkuZS4gd2hlbiBTT1VSQ0VfQlJPV1NFUiBpcyBzZXQgdG8gWUVTKS4NCisNCitGSUxURVJfU09VUkNFX0ZJTEVTICAgID0gTk8NCisNCisjIFRoZSBGSUxURVJfU09VUkNFX1BBVFRFUk5TIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHNvdXJjZSBmaWx0ZXJzIHBlciBmaWxlDQorIyBwYXR0ZXJuLiBBIHBhdHRlcm4gd2lsbCBvdmVycmlkZSB0aGUgc2V0dGluZyBmb3IgRklMVEVSX1BBVFRFUk4gKGlmIGFueSkNCisjIGFuZCBpdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGRpc2FibGUgc291cmNlIGZpbHRlcmluZyBmb3IgYSBzcGVjaWZpYyBwYXR0ZXJuDQorIyB1c2luZyAqLmV4dD0gKHNvIHdpdGhvdXQgbmFtaW5nIGEgZmlsdGVyKS4gVGhpcyBvcHRpb24gb25seSBoYXMgZWZmZWN0IHdoZW4NCisjIEZJTFRFUl9TT1VSQ0VfRklMRVMgaXMgZW5hYmxlZC4NCisNCitGSUxURVJfU09VUkNFX1BBVFRFUk5TID0NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byBzb3VyY2UgYnJvd3NpbmcNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorIyBJZiB0aGUgU09VUkNFX0JST1dTRVIgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBhIGxpc3Qgb2Ygc291cmNlIGZpbGVzIHdpbGwNCisjIGJlIGdlbmVyYXRlZC4gRG9jdW1lbnRlZCBlbnRpdGllcyB3aWxsIGJlIGNyb3NzLXJlZmVyZW5jZWQgd2l0aCB0aGVzZSBzb3VyY2VzLg0KKyMgTm90ZTogVG8gZ2V0IHJpZCBvZiBhbGwgc291cmNlIGNvZGUgaW4gdGhlIGdlbmVyYXRlZCBvdXRwdXQsIG1ha2Ugc3VyZSBhbHNvDQorIyBWRVJCQVRJTV9IRUFERVJTIGlzIHNldCB0byBOTy4NCisNCitTT1VSQ0VfQlJPV1NFUiAgICAgICAgID0gWUVTDQorDQorIyBTZXR0aW5nIHRoZSBJTkxJTkVfU09VUkNFUyB0YWcgdG8gWUVTIHdpbGwgaW5jbHVkZSB0aGUgYm9keQ0KKyMgb2YgZnVuY3Rpb25zIGFuZCBjbGFzc2VzIGRpcmVjdGx5IGluIHRoZSBkb2N1bWVudGF0aW9uLg0KKw0KK0lOTElORV9TT1VSQ0VTICAgICAgICAgPSBOTw0KKw0KKyMgU2V0dGluZyB0aGUgU1RSSVBfQ09ERV9DT01NRU5UUyB0YWcgdG8gWUVTICh0aGUgZGVmYXVsdCkgd2lsbCBpbnN0cnVjdA0KKyMgZG94eWdlbiB0byBoaWRlIGFueSBzcGVjaWFsIGNvbW1lbnQgYmxvY2tzIGZyb20gZ2VuZXJhdGVkIHNvdXJjZSBjb2RlDQorIyBmcmFnbWVudHMuIE5vcm1hbCBDLCBDKysgYW5kIEZvcnRyYW4gY29tbWVudHMgd2lsbCBhbHdheXMgcmVtYWluIHZpc2libGUuDQorDQorU1RSSVBfQ09ERV9DT01NRU5UUyAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIFJFRkVSRU5DRURfQllfUkVMQVRJT04gdGFnIGlzIHNldCB0byBZRVMNCisjIHRoZW4gZm9yIGVhY2ggZG9jdW1lbnRlZCBmdW5jdGlvbiBhbGwgZG9jdW1lbnRlZA0KKyMgZnVuY3Rpb25zIHJlZmVyZW5jaW5nIGl0IHdpbGwgYmUgbGlzdGVkLg0KKw0KK1JFRkVSRU5DRURfQllfUkVMQVRJT04gPSBZRVMNCisNCisjIElmIHRoZSBSRUZFUkVOQ0VTX1JFTEFUSU9OIHRhZyBpcyBzZXQgdG8gWUVTDQorIyB0aGVuIGZvciBlYWNoIGRvY3VtZW50ZWQgZnVuY3Rpb24gYWxsIGRvY3VtZW50ZWQgZW50aXRpZXMNCisjIGNhbGxlZC91c2VkIGJ5IHRoYXQgZnVuY3Rpb24gd2lsbCBiZSBsaXN0ZWQuDQorDQorUkVGRVJFTkNFU19SRUxBVElPTiAgICA9IE5PDQorDQorIyBJZiB0aGUgUkVGRVJFTkNFU19MSU5LX1NPVVJDRSB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpDQorIyBhbmQgU09VUkNFX0JST1dTRVIgdGFnIGlzIHNldCB0byBZRVMsIHRoZW4gdGhlIGh5cGVybGlua3MgZnJvbQ0KKyMgZnVuY3Rpb25zIGluIFJFRkVSRU5DRVNfUkVMQVRJT04gYW5kIFJFRkVSRU5DRURfQllfUkVMQVRJT04gbGlzdHMgd2lsbA0KKyMgbGluayB0byB0aGUgc291cmNlIGNvZGUuDQorIyBPdGhlcndpc2UgdGhleSB3aWxsIGxpbmsgdG8gdGhlIGRvY3VtZW50YXRpb24uDQorDQorUkVGRVJFTkNFU19MSU5LX1NPVVJDRSA9IFlFUw0KKw0KKyMgSWYgdGhlIFVTRV9IVEFHUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHRoZSByZWZlcmVuY2VzIHRvIHNvdXJjZSBjb2RlDQorIyB3aWxsIHBvaW50IHRvIHRoZSBIVE1MIGdlbmVyYXRlZCBieSB0aGUgaHRhZ3MoMSkgdG9vbCBpbnN0ZWFkIG9mIGRveHlnZW4NCisjIGJ1aWx0LWluIHNvdXJjZSBicm93c2VyLiBUaGUgaHRhZ3MgdG9vbCBpcyBwYXJ0IG9mIEdOVSdzIGdsb2JhbCBzb3VyY2UNCisjIHRhZ2dpbmcgc3lzdGVtIChzZWUgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2dsb2JhbC9nbG9iYWwuaHRtbCkuIFlvdQ0KKyMgd2lsbCBuZWVkIHZlcnNpb24gNC44LjYgb3IgaGlnaGVyLg0KKw0KK1VTRV9IVEFHUyAgICAgICAgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIFZFUkJBVElNX0hFQURFUlMgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGVuIERveHlnZW4NCisjIHdpbGwgZ2VuZXJhdGUgYSB2ZXJiYXRpbSBjb3B5IG9mIHRoZSBoZWFkZXIgZmlsZSBmb3IgZWFjaCBjbGFzcyBmb3INCisjIHdoaWNoIGFuIGluY2x1ZGUgaXMgc3BlY2lmaWVkLiBTZXQgdG8gTk8gdG8gZGlzYWJsZSB0aGlzLg0KKw0KK1ZFUkJBVElNX0hFQURFUlMgICAgICAgPSBZRVMNCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgYWxwaGFiZXRpY2FsIGNsYXNzIGluZGV4DQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyMgSWYgdGhlIEFMUEhBQkVUSUNBTF9JTkRFWCB0YWcgaXMgc2V0IHRvIFlFUywgYW4gYWxwaGFiZXRpY2FsIGluZGV4DQorIyBvZiBhbGwgY29tcG91bmRzIHdpbGwgYmUgZ2VuZXJhdGVkLiBFbmFibGUgdGhpcyBpZiB0aGUgcHJvamVjdA0KKyMgY29udGFpbnMgYSBsb3Qgb2YgY2xhc3Nlcywgc3RydWN0cywgdW5pb25zIG9yIGludGVyZmFjZXMuDQorDQorQUxQSEFCRVRJQ0FMX0lOREVYICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIGFscGhhYmV0aWNhbCBpbmRleCBpcyBlbmFibGVkIChzZWUgQUxQSEFCRVRJQ0FMX0lOREVYKSB0aGVuDQorIyB0aGUgQ09MU19JTl9BTFBIQV9JTkRFWCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbnVtYmVyIG9mIGNvbHVtbnMNCisjIGluIHdoaWNoIHRoaXMgbGlzdCB3aWxsIGJlIHNwbGl0IChjYW4gYmUgYSBudW1iZXIgaW4gdGhlIHJhbmdlIFsxLi4yMF0pDQorDQorQ09MU19JTl9BTFBIQV9JTkRFWCAgICA9IDUNCisNCisjIEluIGNhc2UgYWxsIGNsYXNzZXMgaW4gYSBwcm9qZWN0IHN0YXJ0IHdpdGggYSBjb21tb24gcHJlZml4LCBhbGwNCisjIGNsYXNzZXMgd2lsbCBiZSBwdXQgdW5kZXIgdGhlIHNhbWUgaGVhZGVyIGluIHRoZSBhbHBoYWJldGljYWwgaW5kZXguDQorIyBUaGUgSUdOT1JFX1BSRUZJWCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBwcmVmaXhlcyB0aGF0DQorIyBzaG91bGQgYmUgaWdub3JlZCB3aGlsZSBnZW5lcmF0aW5nIHRoZSBpbmRleCBoZWFkZXJzLg0KKw0KK0lHTk9SRV9QUkVGSVggICAgICAgICAgPQ0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBIVE1MIG91dHB1dA0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisjIElmIHRoZSBHRU5FUkFURV9IVE1MIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsDQorIyBnZW5lcmF0ZSBIVE1MIG91dHB1dC4NCisNCitHRU5FUkFURV9IVE1MICAgICAgICAgID0gWUVTDQorDQorIyBUaGUgSFRNTF9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgSFRNTCBkb2NzIHdpbGwgYmUgcHV0Lg0KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZQ0KKyMgcHV0IGluIGZyb250IG9mIGl0LiBJZiBsZWZ0IGJsYW5rIGBodG1sJyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgcGF0aC4NCisNCitIVE1MX09VVFBVVCAgICAgICAgICAgID0NCisNCisjIFRoZSBIVE1MX0ZJTEVfRVhURU5TSU9OIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlIGV4dGVuc2lvbiBmb3INCisjIGVhY2ggZ2VuZXJhdGVkIEhUTUwgcGFnZSAoZm9yIGV4YW1wbGU6IC5odG0sLnBocCwuYXNwKS4gSWYgaXQgaXMgbGVmdCBibGFuaw0KKyMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGZpbGVzIHdpdGggLmh0bWwgZXh0ZW5zaW9uLg0KKw0KK0hUTUxfRklMRV9FWFRFTlNJT04gICAgPSAuaHRtbA0KKw0KKyMgVGhlIEhUTUxfSEVBREVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcGVyc29uYWwgSFRNTCBoZWFkZXIgZm9yDQorIyBlYWNoIGdlbmVyYXRlZCBIVE1MIHBhZ2UuIElmIGl0IGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGENCisjIHN0YW5kYXJkIGhlYWRlci4gTm90ZSB0aGF0IHdoZW4gdXNpbmcgYSBjdXN0b20gaGVhZGVyIHlvdSBhcmUgcmVzcG9uc2libGUNCisjICBmb3IgdGhlIHByb3BlciBpbmNsdXNpb24gb2YgYW55IHNjcmlwdHMgYW5kIHN0eWxlIHNoZWV0cyB0aGF0IGRveHlnZW4NCisjIG5lZWRzLCB3aGljaCBpcyBkZXBlbmRlbnQgb24gdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB1c2VkLg0KKyMgSXQgaXMgYWR2aXNlZCB0byBnZW5lcmF0ZSBhIGRlZmF1bHQgaGVhZGVyIHVzaW5nICJkb3h5Z2VuIC13IGh0bWwNCisjIGhlYWRlci5odG1sIGZvb3Rlci5odG1sIHN0eWxlc2hlZXQuY3NzIFlvdXJDb25maWdGaWxlIiBhbmQgdGhlbiBtb2RpZnkNCisjIHRoYXQgaGVhZGVyLiBOb3RlIHRoYXQgdGhlIGhlYWRlciBpcyBzdWJqZWN0IHRvIGNoYW5nZSBzbyB5b3UgdHlwaWNhbGx5DQorIyBoYXZlIHRvIHJlZG8gdGhpcyB3aGVuIHVwZ3JhZGluZyB0byBhIG5ld2VyIHZlcnNpb24gb2YgZG94eWdlbiBvciB3aGVuDQorIyBjaGFuZ2luZyB0aGUgdmFsdWUgb2YgY29uZmlndXJhdGlvbiBzZXR0aW5ncyBzdWNoIGFzIEdFTkVSQVRFX1RSRUVWSUVXIQ0KKw0KK0hUTUxfSEVBREVSICAgICAgICAgICAgPQ0KKw0KKyMgVGhlIEhUTUxfRk9PVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcGVyc29uYWwgSFRNTCBmb290ZXIgZm9yDQorIyBlYWNoIGdlbmVyYXRlZCBIVE1MIHBhZ2UuIElmIGl0IGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGENCisjIHN0YW5kYXJkIGZvb3Rlci4NCisNCitIVE1MX0ZPT1RFUiAgICAgICAgICAgID0NCisNCisjIFRoZSBIVE1MX1NUWUxFU0hFRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSB1c2VyLWRlZmluZWQgY2FzY2FkaW5nDQorIyBzdHlsZSBzaGVldCB0aGF0IGlzIHVzZWQgYnkgZWFjaCBIVE1MIHBhZ2UuIEl0IGNhbiBiZSB1c2VkIHRvDQorIyBmaW5lLXR1bmUgdGhlIGxvb2sgb2YgdGhlIEhUTUwgb3V0cHV0LiBJZiBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbA0KKyMgZ2VuZXJhdGUgYSBkZWZhdWx0IHN0eWxlIHNoZWV0LiBOb3RlIHRoYXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlDQorIyBIVE1MX0VYVFJBX1NUWUxFU0hFRVQgaW5zdGVhZCBvZiB0aGlzIG9uZSwgYXMgaXQgaXMgbW9yZSByb2J1c3QgYW5kIHRoaXMNCisjIHRhZyB3aWxsIGluIHRoZSBmdXR1cmUgYmVjb21lIG9ic29sZXRlLg0KKw0KK0hUTUxfU1RZTEVTSEVFVCAgICAgICAgPQ0KKw0KKyMgVGhlIEhUTUxfRVhUUkFfU1RZTEVTSEVFVCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhbiBhZGRpdGlvbmFsDQorIyB1c2VyLWRlZmluZWQgY2FzY2FkaW5nIHN0eWxlIHNoZWV0IHRoYXQgaXMgaW5jbHVkZWQgYWZ0ZXIgdGhlIHN0YW5kYXJkDQorIyBzdHlsZSBzaGVldHMgY3JlYXRlZCBieSBkb3h5Z2VuLiBVc2luZyB0aGlzIG9wdGlvbiBvbmUgY2FuIG92ZXJydWxlDQorIyBjZXJ0YWluIHN0eWxlIGFzcGVjdHMuIFRoaXMgaXMgcHJlZmVycmVkIG92ZXIgdXNpbmcgSFRNTF9TVFlMRVNIRUVUDQorIyBzaW5jZSBpdCBkb2VzIG5vdCByZXBsYWNlIHRoZSBzdGFuZGFyZCBzdHlsZSBzaGVldCBhbmQgaXMgdGhlcmVmb3IgbW9yZQ0KKyMgcm9idXN0IGFnYWluc3QgZnV0dXJlIHVwZGF0ZXMuIERveHlnZW4gd2lsbCBjb3B5IHRoZSBzdHlsZSBzaGVldCBmaWxlIHRvDQorIyB0aGUgb3V0cHV0IGRpcmVjdG9yeS4NCisNCitIVE1MX0VYVFJBX1NUWUxFU0hFRVQgID0NCisNCisjIFRoZSBIVE1MX0VYVFJBX0ZJTEVTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGV4dHJhIGltYWdlcyBvcg0KKyMgb3RoZXIgc291cmNlIGZpbGVzIHdoaWNoIHNob3VsZCBiZSBjb3BpZWQgdG8gdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeS4gTm90ZQ0KKyMgdGhhdCB0aGVzZSBmaWxlcyB3aWxsIGJlIGNvcGllZCB0byB0aGUgYmFzZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkuIFVzZSB0aGUNCisjICRyZWxwYXRoJCBtYXJrZXIgaW4gdGhlIEhUTUxfSEVBREVSIGFuZC9vciBIVE1MX0ZPT1RFUiBmaWxlcyB0byBsb2FkIHRoZXNlDQorIyBmaWxlcy4gSW4gdGhlIEhUTUxfU1RZTEVTSEVFVCBmaWxlLCB1c2UgdGhlIGZpbGUgbmFtZSBvbmx5LiBBbHNvIG5vdGUgdGhhdA0KKyMgdGhlIGZpbGVzIHdpbGwgYmUgY29waWVkIGFzLWlzOyB0aGVyZSBhcmUgbm8gY29tbWFuZHMgb3IgbWFya2VycyBhdmFpbGFibGUuDQorDQorSFRNTF9FWFRSQV9GSUxFUyAgICAgICA9DQorDQorIyBUaGUgSFRNTF9DT0xPUlNUWUxFX0hVRSB0YWcgY29udHJvbHMgdGhlIGNvbG9yIG9mIHRoZSBIVE1MIG91dHB1dC4NCisjIERveHlnZW4gd2lsbCBhZGp1c3QgdGhlIGNvbG9ycyBpbiB0aGUgc3R5bGUgc2hlZXQgYW5kIGJhY2tncm91bmQgaW1hZ2VzDQorIyBhY2NvcmRpbmcgdG8gdGhpcyBjb2xvci4gSHVlIGlzIHNwZWNpZmllZCBhcyBhbiBhbmdsZSBvbiBhIGNvbG9yd2hlZWwsDQorIyBzZWUgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9IdWUgZm9yIG1vcmUgaW5mb3JtYXRpb24uDQorIyBGb3IgaW5zdGFuY2UgdGhlIHZhbHVlIDAgcmVwcmVzZW50cyByZWQsIDYwIGlzIHllbGxvdywgMTIwIGlzIGdyZWVuLA0KKyMgMTgwIGlzIGN5YW4sIDI0MCBpcyBibHVlLCAzMDAgcHVycGxlLCBhbmQgMzYwIGlzIHJlZCBhZ2Fpbi4NCisjIFRoZSBhbGxvd2VkIHJhbmdlIGlzIDAgdG8gMzU5Lg0KKw0KK0hUTUxfQ09MT1JTVFlMRV9IVUUgICAgPSAyMjANCisNCisjIFRoZSBIVE1MX0NPTE9SU1RZTEVfU0FUIHRhZyBjb250cm9scyB0aGUgcHVyaXR5IChvciBzYXR1cmF0aW9uKSBvZg0KKyMgdGhlIGNvbG9ycyBpbiB0aGUgSFRNTCBvdXRwdXQuIEZvciBhIHZhbHVlIG9mIDAgdGhlIG91dHB1dCB3aWxsIHVzZQ0KKyMgZ3JheXNjYWxlcyBvbmx5LiBBIHZhbHVlIG9mIDI1NSB3aWxsIHByb2R1Y2UgdGhlIG1vc3Qgdml2aWQgY29sb3JzLg0KKw0KK0hUTUxfQ09MT1JTVFlMRV9TQVQgICAgPSAxMDANCisNCisjIFRoZSBIVE1MX0NPTE9SU1RZTEVfR0FNTUEgdGFnIGNvbnRyb2xzIHRoZSBnYW1tYSBjb3JyZWN0aW9uIGFwcGxpZWQgdG8NCisjIHRoZSBsdW1pbmFuY2UgY29tcG9uZW50IG9mIHRoZSBjb2xvcnMgaW4gdGhlIEhUTUwgb3V0cHV0LiBWYWx1ZXMgYmVsb3cNCisjIDEwMCBncmFkdWFsbHkgbWFrZSB0aGUgb3V0cHV0IGxpZ2h0ZXIsIHdoZXJlYXMgdmFsdWVzIGFib3ZlIDEwMCBtYWtlDQorIyB0aGUgb3V0cHV0IGRhcmtlci4gVGhlIHZhbHVlIGRpdmlkZWQgYnkgMTAwIGlzIHRoZSBhY3R1YWwgZ2FtbWEgYXBwbGllZCwNCisjIHNvIDgwIHJlcHJlc2VudHMgYSBnYW1tYSBvZiAwLjgsIFRoZSB2YWx1ZSAyMjAgcmVwcmVzZW50cyBhIGdhbW1hIG9mIDIuMiwNCisjIGFuZCAxMDAgZG9lcyBub3QgY2hhbmdlIHRoZSBnYW1tYS4NCisNCitIVE1MX0NPTE9SU1RZTEVfR0FNTUEgID0gODANCisNCisjIElmIHRoZSBIVE1MX1RJTUVTVEFNUCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHRoZSBmb290ZXIgb2YgZWFjaCBnZW5lcmF0ZWQgSFRNTA0KKyMgcGFnZSB3aWxsIGNvbnRhaW4gdGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgcGFnZSB3YXMgZ2VuZXJhdGVkLiBTZXR0aW5nDQorIyB0aGlzIHRvIE5PIGNhbiBoZWxwIHdoZW4gY29tcGFyaW5nIHRoZSBvdXRwdXQgb2YgbXVsdGlwbGUgcnVucy4NCisNCitIVE1MX1RJTUVTVEFNUCAgICAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgSFRNTF9EWU5BTUlDX1NFQ1RJT05TIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIGdlbmVyYXRlZCBIVE1MDQorIyBkb2N1bWVudGF0aW9uIHdpbGwgY29udGFpbiBzZWN0aW9ucyB0aGF0IGNhbiBiZSBoaWRkZW4gYW5kIHNob3duIGFmdGVyIHRoZQ0KKyMgcGFnZSBoYXMgbG9hZGVkLg0KKw0KK0hUTUxfRFlOQU1JQ19TRUNUSU9OUyAgPSBOTw0KKw0KKyMgV2l0aCBIVE1MX0lOREVYX05VTV9FTlRSSUVTIG9uZSBjYW4gY29udHJvbCB0aGUgcHJlZmVycmVkIG51bWJlciBvZg0KKyMgZW50cmllcyBzaG93biBpbiB0aGUgdmFyaW91cyB0cmVlIHN0cnVjdHVyZWQgaW5kaWNlcyBpbml0aWFsbHk7IHRoZSB1c2VyDQorIyBjYW4gZXhwYW5kIGFuZCBjb2xsYXBzZSBlbnRyaWVzIGR5bmFtaWNhbGx5IGxhdGVyIG9uLiBEb3h5Z2VuIHdpbGwgZXhwYW5kDQorIyB0aGUgdHJlZSB0byBzdWNoIGEgbGV2ZWwgdGhhdCBhdCBtb3N0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVudHJpZXMgYXJlDQorIyB2aXNpYmxlICh1bmxlc3MgYSBmdWxseSBjb2xsYXBzZWQgdHJlZSBhbHJlYWR5IGV4Y2VlZHMgdGhpcyBhbW91bnQpLg0KKyMgU28gc2V0dGluZyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgMSB3aWxsIHByb2R1Y2UgYSBmdWxsIGNvbGxhcHNlZCB0cmVlIGJ5DQorIyBkZWZhdWx0LiAwIGlzIGEgc3BlY2lhbCB2YWx1ZSByZXByZXNlbnRpbmcgYW4gaW5maW5pdGUgbnVtYmVyIG9mIGVudHJpZXMNCisjIGFuZCB3aWxsIHJlc3VsdCBpbiBhIGZ1bGwgZXhwYW5kZWQgdHJlZSBieSBkZWZhdWx0Lg0KKw0KK0hUTUxfSU5ERVhfTlVNX0VOVFJJRVMgPSAxMDANCisNCisjIElmIHRoZSBHRU5FUkFURV9ET0NTRVQgdGFnIGlzIHNldCB0byBZRVMsIGFkZGl0aW9uYWwgaW5kZXggZmlsZXMNCisjIHdpbGwgYmUgZ2VuZXJhdGVkIHRoYXQgY2FuIGJlIHVzZWQgYXMgaW5wdXQgZm9yIEFwcGxlJ3MgWGNvZGUgMw0KKyMgaW50ZWdyYXRlZCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCwgaW50cm9kdWNlZCB3aXRoIE9TWCAxMC41IChMZW9wYXJkKS4NCisjIFRvIGNyZWF0ZSBhIGRvY3VtZW50YXRpb24gc2V0LCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBNYWtlZmlsZSBpbiB0aGUNCisjIEhUTUwgb3V0cHV0IGRpcmVjdG9yeS4gUnVubmluZyBtYWtlIHdpbGwgcHJvZHVjZSB0aGUgZG9jc2V0IGluIHRoYXQNCisjIGRpcmVjdG9yeSBhbmQgcnVubmluZyAibWFrZSBpbnN0YWxsIiB3aWxsIGluc3RhbGwgdGhlIGRvY3NldCBpbg0KKyMgfi9MaWJyYXJ5L0RldmVsb3Blci9TaGFyZWQvRG9jdW1lbnRhdGlvbi9Eb2NTZXRzIHNvIHRoYXQgWGNvZGUgd2lsbCBmaW5kDQorIyBpdCBhdCBzdGFydHVwLg0KKyMgU2VlIGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL3Rvb2xzL2NyZWF0aW5nZG9jc2V0c3dpdGhkb3h5Z2VuLmh0bWwNCisjIGZvciBtb3JlIGluZm9ybWF0aW9uLg0KKw0KK0dFTkVSQVRFX0RPQ1NFVCAgICAgICAgPSBOTw0KKw0KKyMgV2hlbiBHRU5FUkFURV9ET0NTRVQgdGFnIGlzIHNldCB0byBZRVMsIHRoaXMgdGFnIGRldGVybWluZXMgdGhlIG5hbWUgb2YgdGhlDQorIyBmZWVkLiBBIGRvY3VtZW50YXRpb24gZmVlZCBwcm92aWRlcyBhbiB1bWJyZWxsYSB1bmRlciB3aGljaCBtdWx0aXBsZQ0KKyMgZG9jdW1lbnRhdGlvbiBzZXRzIGZyb20gYSBzaW5nbGUgcHJvdmlkZXIgKHN1Y2ggYXMgYSBjb21wYW55IG9yIHByb2R1Y3Qgc3VpdGUpDQorIyBjYW4gYmUgZ3JvdXBlZC4NCisNCitET0NTRVRfRkVFRE5BTUUgICAgICAgID0gIkRveHlnZW4gZ2VuZXJhdGVkIGRvY3MiDQorDQorIyBXaGVuIEdFTkVSQVRFX0RPQ1NFVCB0YWcgaXMgc2V0IHRvIFlFUywgdGhpcyB0YWcgc3BlY2lmaWVzIGEgc3RyaW5nIHRoYXQNCisjIHNob3VsZCB1bmlxdWVseSBpZGVudGlmeSB0aGUgZG9jdW1lbnRhdGlvbiBzZXQgYnVuZGxlLiBUaGlzIHNob3VsZCBiZSBhDQorIyByZXZlcnNlIGRvbWFpbi1uYW1lIHN0eWxlIHN0cmluZywgZS5nLiBjb20ubXljb21wYW55Lk15RG9jU2V0LiBEb3h5Z2VuDQorIyB3aWxsIGFwcGVuZCAuZG9jc2V0IHRvIHRoZSBuYW1lLg0KKw0KK0RPQ1NFVF9CVU5ETEVfSUQgICAgICAgPSBvcmcuZG94eWdlbi5Qcm9qZWN0DQorDQorIyBXaGVuIEdFTkVSQVRFX1BVQkxJU0hFUl9JRCB0YWcgc3BlY2lmaWVzIGEgc3RyaW5nIHRoYXQgc2hvdWxkIHVuaXF1ZWx5DQorIyBpZGVudGlmeSB0aGUgZG9jdW1lbnRhdGlvbiBwdWJsaXNoZXIuIFRoaXMgc2hvdWxkIGJlIGEgcmV2ZXJzZSBkb21haW4tbmFtZQ0KKyMgc3R5bGUgc3RyaW5nLCBlLmcuIGNvbS5teWNvbXBhbnkuTXlEb2NTZXQuZG9jdW1lbnRhdGlvbi4NCisNCitET0NTRVRfUFVCTElTSEVSX0lEICAgID0gb3JnLmRveHlnZW4uUHVibGlzaGVyDQorDQorIyBUaGUgR0VORVJBVEVfUFVCTElTSEVSX05BTUUgdGFnIGlkZW50aWZpZXMgdGhlIGRvY3VtZW50YXRpb24gcHVibGlzaGVyLg0KKw0KK0RPQ1NFVF9QVUJMSVNIRVJfTkFNRSAgPSBQdWJsaXNoZXINCisNCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgYWRkaXRpb25hbCBpbmRleCBmaWxlcw0KKyMgd2lsbCBiZSBnZW5lcmF0ZWQgdGhhdCBjYW4gYmUgdXNlZCBhcyBpbnB1dCBmb3IgdG9vbHMgbGlrZSB0aGUNCisjIE1pY3Jvc29mdCBIVE1MIGhlbHAgd29ya3Nob3AgdG8gZ2VuZXJhdGUgYSBjb21waWxlZCBIVE1MIGhlbHAgZmlsZSAoLmNobSkNCisjIG9mIHRoZSBnZW5lcmF0ZWQgSFRNTCBkb2N1bWVudGF0aW9uLg0KKw0KK0dFTkVSQVRFX0hUTUxIRUxQICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgQ0hNX0ZJTEUgdGFnIGNhbg0KKyMgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlIG5hbWUgb2YgdGhlIHJlc3VsdGluZyAuY2htIGZpbGUuIFlvdQ0KKyMgY2FuIGFkZCBhIHBhdGggaW4gZnJvbnQgb2YgdGhlIGZpbGUgaWYgdGhlIHJlc3VsdCBzaG91bGQgbm90IGJlDQorIyB3cml0dGVuIHRvIHRoZSBodG1sIG91dHB1dCBkaXJlY3RvcnkuDQorDQorQ0hNX0ZJTEUgICAgICAgICAgICAgICA9DQorDQorIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBISENfTE9DQVRJT04gdGFnIGNhbg0KKyMgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiAoYWJzb2x1dGUgcGF0aCBpbmNsdWRpbmcgZmlsZSBuYW1lKSBvZg0KKyMgdGhlIEhUTUwgaGVscCBjb21waWxlciAoaGhjLmV4ZSkuIElmIG5vbi1lbXB0eSBkb3h5Z2VuIHdpbGwgdHJ5IHRvIHJ1bg0KKyMgdGhlIEhUTUwgaGVscCBjb21waWxlciBvbiB0aGUgZ2VuZXJhdGVkIGluZGV4LmhocC4NCisNCitISENfTE9DQVRJT04gICAgICAgICAgID0NCisNCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIEdFTkVSQVRFX0NISSBmbGFnDQorIyBjb250cm9scyBpZiBhIHNlcGFyYXRlIC5jaGkgaW5kZXggZmlsZSBpcyBnZW5lcmF0ZWQgKFlFUykgb3IgdGhhdA0KKyMgaXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBtYXN0ZXIgLmNobSBmaWxlIChOTykuDQorDQorR0VORVJBVEVfQ0hJICAgICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBDSE1fSU5ERVhfRU5DT0RJTkcNCisjIGlzIHVzZWQgdG8gZW5jb2RlIEh0bWxIZWxwIGluZGV4IChoaGspLCBjb250ZW50IChoaGMpIGFuZCBwcm9qZWN0IGZpbGUNCisjIGNvbnRlbnQuDQorDQorQ0hNX0lOREVYX0VOQ09ESU5HICAgICA9DQorDQorIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBCSU5BUllfVE9DIGZsYWcNCisjIGNvbnRyb2xzIHdoZXRoZXIgYSBiaW5hcnkgdGFibGUgb2YgY29udGVudHMgaXMgZ2VuZXJhdGVkIChZRVMpIG9yIGENCisjIG5vcm1hbCB0YWJsZSBvZiBjb250ZW50cyAoTk8pIGluIHRoZSAuY2htIGZpbGUuDQorDQorQklOQVJZX1RPQyAgICAgICAgICAgICA9IE5PDQorDQorIyBUaGUgVE9DX0VYUEFORCBmbGFnIGNhbiBiZSBzZXQgdG8gWUVTIHRvIGFkZCBleHRyYSBpdGVtcyBmb3IgZ3JvdXAgbWVtYmVycw0KKyMgdG8gdGhlIGNvbnRlbnRzIG9mIHRoZSBIVE1MIGhlbHAgZG9jdW1lbnRhdGlvbiBhbmQgdG8gdGhlIHRyZWUgdmlldy4NCisNCitUT0NfRVhQQU5EICAgICAgICAgICAgID0gTk8NCisNCisjIElmIHRoZSBHRU5FUkFURV9RSFAgdGFnIGlzIHNldCB0byBZRVMgYW5kIGJvdGggUUhQX05BTUVTUEFDRSBhbmQNCisjIFFIUF9WSVJUVUFMX0ZPTERFUiBhcmUgc2V0LCBhbiBhZGRpdGlvbmFsIGluZGV4IGZpbGUgd2lsbCBiZSBnZW5lcmF0ZWQNCisjIHRoYXQgY2FuIGJlIHVzZWQgYXMgaW5wdXQgZm9yIFF0J3MgcWhlbHBnZW5lcmF0b3IgdG8gZ2VuZXJhdGUgYQ0KKyMgUXQgQ29tcHJlc3NlZCBIZWxwICgucWNoKSBvZiB0aGUgZ2VuZXJhdGVkIEhUTUwgZG9jdW1lbnRhdGlvbi4NCisNCitHRU5FUkFURV9RSFAgICAgICAgICAgID0gTk8NCisNCisjIElmIHRoZSBRSEdfTE9DQVRJT04gdGFnIGlzIHNwZWNpZmllZCwgdGhlIFFDSF9GSUxFIHRhZyBjYW4NCisjIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZSBuYW1lIG9mIHRoZSByZXN1bHRpbmcgLnFjaCBmaWxlLg0KKyMgVGhlIHBhdGggc3BlY2lmaWVkIGlzIHJlbGF0aXZlIHRvIHRoZSBIVE1MIG91dHB1dCBmb2xkZXIuDQorDQorUUNIX0ZJTEUgICAgICAgICAgICAgICA9DQorDQorIyBUaGUgUUhQX05BTUVTUEFDRSB0YWcgc3BlY2lmaWVzIHRoZSBuYW1lc3BhY2UgdG8gdXNlIHdoZW4gZ2VuZXJhdGluZw0KKyMgUXQgSGVscCBQcm9qZWN0IG91dHB1dC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZQ0KKyMgaHR0cDovL2RvYy50cm9sbHRlY2guY29tL3F0aGVscHByb2plY3QuaHRtbCNuYW1lc3BhY2UNCisNCitRSFBfTkFNRVNQQUNFICAgICAgICAgID0gb3JnLmRveHlnZW4uUHJvamVjdA0KKw0KKyMgVGhlIFFIUF9WSVJUVUFMX0ZPTERFUiB0YWcgc3BlY2lmaWVzIHRoZSBuYW1lc3BhY2UgdG8gdXNlIHdoZW4gZ2VuZXJhdGluZw0KKyMgUXQgSGVscCBQcm9qZWN0IG91dHB1dC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZQ0KKyMgaHR0cDovL2RvYy50cm9sbHRlY2guY29tL3F0aGVscHByb2plY3QuaHRtbCN2aXJ0dWFsLWZvbGRlcnMNCisNCitRSFBfVklSVFVBTF9GT0xERVIgICAgID0gZG9jDQorDQorIyBJZiBRSFBfQ1VTVF9GSUxURVJfTkFNRSBpcyBzZXQsIGl0IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIGN1c3RvbSBmaWx0ZXIgdG8NCisjIGFkZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZQ0KKyMgaHR0cDovL2RvYy50cm9sbHRlY2guY29tL3F0aGVscHByb2plY3QuaHRtbCNjdXN0b20tZmlsdGVycw0KKw0KK1FIUF9DVVNUX0ZJTFRFUl9OQU1FICAgPQ0KKw0KKyMgVGhlIFFIUF9DVVNUX0ZJTFRfQVRUUlMgdGFnIHNwZWNpZmllcyB0aGUgbGlzdCBvZiB0aGUgYXR0cmlidXRlcyBvZiB0aGUNCisjIGN1c3RvbSBmaWx0ZXIgdG8gYWRkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlDQorIyA8YSBocmVmPSJodHRwOi8vZG9jLnRyb2xsdGVjaC5jb20vcXRoZWxwcHJvamVjdC5odG1sI2N1c3RvbS1maWx0ZXJzIj4NCisjIFF0IEhlbHAgUHJvamVjdCAvIEN1c3RvbSBGaWx0ZXJzPC9hPi4NCisNCitRSFBfQ1VTVF9GSUxURVJfQVRUUlMgID0NCisNCisjIFRoZSBRSFBfU0VDVF9GSUxURVJfQVRUUlMgdGFnIHNwZWNpZmllcyB0aGUgbGlzdCBvZiB0aGUgYXR0cmlidXRlcyB0aGlzDQorIyBwcm9qZWN0J3MNCisjIGZpbHRlciBzZWN0aW9uIG1hdGNoZXMuDQorIyA8YSBocmVmPSJodHRwOi8vZG9jLnRyb2xsdGVjaC5jb20vcXRoZWxwcHJvamVjdC5odG1sI2ZpbHRlci1hdHRyaWJ1dGVzIj4NCisjIFF0IEhlbHAgUHJvamVjdCAvIEZpbHRlciBBdHRyaWJ1dGVzPC9hPi4NCisNCitRSFBfU0VDVF9GSUxURVJfQVRUUlMgID0NCisNCisjIElmIHRoZSBHRU5FUkFURV9RSFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBRSEdfTE9DQVRJT04gdGFnIGNhbg0KKyMgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiBRdCdzIHFoZWxwZ2VuZXJhdG9yLg0KKyMgSWYgbm9uLWVtcHR5IGRveHlnZW4gd2lsbCB0cnkgdG8gcnVuIHFoZWxwZ2VuZXJhdG9yIG9uIHRoZSBnZW5lcmF0ZWQNCisjIC5xaHAgZmlsZS4NCisNCitRSEdfTE9DQVRJT04gICAgICAgICAgID0NCisNCisjIElmIHRoZSBHRU5FUkFURV9FQ0xJUFNFSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgYWRkaXRpb25hbCBpbmRleCBmaWxlcw0KKyMgIHdpbGwgYmUgZ2VuZXJhdGVkLCB3aGljaCB0b2dldGhlciB3aXRoIHRoZSBIVE1MIGZpbGVzLCBmb3JtIGFuIEVjbGlwc2UgaGVscA0KKyMgcGx1Z2luLiBUbyBpbnN0YWxsIHRoaXMgcGx1Z2luIGFuZCBtYWtlIGl0IGF2YWlsYWJsZSB1bmRlciB0aGUgaGVscCBjb250ZW50cw0KKyMgbWVudSBpbiBFY2xpcHNlLCB0aGUgY29udGVudHMgb2YgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBIVE1MIGFuZCBYTUwNCisjIGZpbGVzIG5lZWRzIHRvIGJlIGNvcGllZCBpbnRvIHRoZSBwbHVnaW5zIGRpcmVjdG9yeSBvZiBlY2xpcHNlLiBUaGUgbmFtZSBvZg0KKyMgdGhlIGRpcmVjdG9yeSB3aXRoaW4gdGhlIHBsdWdpbnMgZGlyZWN0b3J5IHNob3VsZCBiZSB0aGUgc2FtZSBhcw0KKyMgdGhlIEVDTElQU0VfRE9DX0lEIHZhbHVlLiBBZnRlciBjb3B5aW5nIEVjbGlwc2UgbmVlZHMgdG8gYmUgcmVzdGFydGVkIGJlZm9yZQ0KKyMgdGhlIGhlbHAgYXBwZWFycy4NCisNCitHRU5FUkFURV9FQ0xJUFNFSEVMUCAgID0gTk8NCisNCisjIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBlY2xpcHNlIGhlbHAgcGx1Z2luLiBXaGVuIGluc3RhbGxpbmcgdGhlIHBsdWdpbg0KKyMgdGhlIGRpcmVjdG9yeSBuYW1lIGNvbnRhaW5pbmcgdGhlIEhUTUwgYW5kIFhNTCBmaWxlcyBzaG91bGQgYWxzbyBoYXZlDQorIyB0aGlzIG5hbWUuDQorDQorRUNMSVBTRV9ET0NfSUQgICAgICAgICA9IG9yZy5kb3h5Z2VuLlByb2plY3QNCisNCisjIFRoZSBESVNBQkxFX0lOREVYIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIG9uL29mZiB0aGUgY29uZGVuc2VkIGluZGV4ICh0YWJzKQ0KKyMgYXQgdG9wIG9mIGVhY2ggSFRNTCBwYWdlLiBUaGUgdmFsdWUgTk8gKHRoZSBkZWZhdWx0KSBlbmFibGVzIHRoZSBpbmRleCBhbmQNCisjIHRoZSB2YWx1ZSBZRVMgZGlzYWJsZXMgaXQuIFNpbmNlIHRoZSB0YWJzIGhhdmUgdGhlIHNhbWUgaW5mb3JtYXRpb24gYXMgdGhlDQorIyBuYXZpZ2F0aW9uIHRyZWUgeW91IGNhbiBzZXQgdGhpcyBvcHRpb24gdG8gTk8gaWYgeW91IGFscmVhZHkgc2V0DQorIyBHRU5FUkFURV9UUkVFVklFVyB0byBZRVMuDQorDQorRElTQUJMRV9JTkRFWCAgICAgICAgICA9IE5PDQorDQorIyBUaGUgR0VORVJBVEVfVFJFRVZJRVcgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGV0aGVyIGEgdHJlZS1saWtlIGluZGV4DQorIyBzdHJ1Y3R1cmUgc2hvdWxkIGJlIGdlbmVyYXRlZCB0byBkaXNwbGF5IGhpZXJhcmNoaWNhbCBpbmZvcm1hdGlvbi4NCisjIElmIHRoZSB0YWcgdmFsdWUgaXMgc2V0IHRvIFlFUywgYSBzaWRlIHBhbmVsIHdpbGwgYmUgZ2VuZXJhdGVkDQorIyBjb250YWluaW5nIGEgdHJlZS1saWtlIGluZGV4IHN0cnVjdHVyZSAoanVzdCBsaWtlIHRoZSBvbmUgdGhhdA0KKyMgaXMgZ2VuZXJhdGVkIGZvciBIVE1MIEhlbHApLiBGb3IgdGhpcyB0byB3b3JrIGEgYnJvd3NlciB0aGF0IHN1cHBvcnRzDQorIyBKYXZhU2NyaXB0LCBESFRNTCwgQ1NTIGFuZCBmcmFtZXMgaXMgcmVxdWlyZWQgKGkuZS4gYW55IG1vZGVybiBicm93c2VyKS4NCisjIFdpbmRvd3MgdXNlcnMgYXJlIHByb2JhYmx5IGJldHRlciBvZmYgdXNpbmcgdGhlIEhUTUwgaGVscCBmZWF0dXJlLg0KKyMgU2luY2UgdGhlIHRyZWUgYmFzaWNhbGx5IGhhcyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBhcyB0aGUgdGFiIGluZGV4IHlvdQ0KKyMgY291bGQgY29uc2lkZXIgdG8gc2V0IERJU0FCTEVfSU5ERVggdG8gTk8gd2hlbiBlbmFibGluZyB0aGlzIG9wdGlvbi4NCisNCitHRU5FUkFURV9UUkVFVklFVyAgICAgID0gTk8NCisNCisjIFRoZSBFTlVNX1ZBTFVFU19QRVJfTElORSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBudW1iZXIgb2YgZW51bSB2YWx1ZXMNCisjIChyYW5nZSBbMCwxLi4yMF0pIHRoYXQgZG94eWdlbiB3aWxsIGdyb3VwIG9uIG9uZSBsaW5lIGluIHRoZSBnZW5lcmF0ZWQgSFRNTA0KKyMgZG9jdW1lbnRhdGlvbi4gTm90ZSB0aGF0IGEgdmFsdWUgb2YgMCB3aWxsIGNvbXBsZXRlbHkgc3VwcHJlc3MgdGhlIGVudW0NCisjIHZhbHVlcyBmcm9tIGFwcGVhcmluZyBpbiB0aGUgb3ZlcnZpZXcgc2VjdGlvbi4NCisNCitFTlVNX1ZBTFVFU19QRVJfTElORSAgID0gNA0KKw0KKyMgSWYgdGhlIHRyZWV2aWV3IGlzIGVuYWJsZWQgKHNlZSBHRU5FUkFURV9UUkVFVklFVykgdGhlbiB0aGlzIHRhZyBjYW4gYmUNCisjIHVzZWQgdG8gc2V0IHRoZSBpbml0aWFsIHdpZHRoIChpbiBwaXhlbHMpIG9mIHRoZSBmcmFtZSBpbiB3aGljaCB0aGUgdHJlZQ0KKyMgaXMgc2hvd24uDQorDQorVFJFRVZJRVdfV0lEVEggICAgICAgICA9IDI1MA0KKw0KKyMgV2hlbiB0aGUgRVhUX0xJTktTX0lOX1dJTkRPVyBvcHRpb24gaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgb3Blbg0KKyMgbGlua3MgdG8gZXh0ZXJuYWwgc3ltYm9scyBpbXBvcnRlZCB2aWEgdGFnIGZpbGVzIGluIGEgc2VwYXJhdGUgd2luZG93Lg0KKw0KK0VYVF9MSU5LU19JTl9XSU5ET1cgICAgPSBOTw0KKw0KKyMgVXNlIHRoaXMgdGFnIHRvIGNoYW5nZSB0aGUgZm9udCBzaXplIG9mIExhdGV4IGZvcm11bGFzIGluY2x1ZGVkDQorIyBhcyBpbWFnZXMgaW4gdGhlIEhUTUwgZG9jdW1lbnRhdGlvbi4gVGhlIGRlZmF1bHQgaXMgMTAuIE5vdGUgdGhhdA0KKyMgd2hlbiB5b3UgY2hhbmdlIHRoZSBmb250IHNpemUgYWZ0ZXIgYSBzdWNjZXNzZnVsIGRveHlnZW4gcnVuIHlvdSBuZWVkDQorIyB0byBtYW51YWxseSByZW1vdmUgYW55IGZvcm1fKi5wbmcgaW1hZ2VzIGZyb20gdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeQ0KKyMgdG8gZm9yY2UgdGhlbSB0byBiZSByZWdlbmVyYXRlZC4NCisNCitGT1JNVUxBX0ZPTlRTSVpFICAgICAgID0gMTANCisNCisjIFVzZSB0aGUgRk9STVVMQV9UUkFOUEFSRU5UIHRhZyB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgdGhlIGltYWdlcw0KKyMgZ2VuZXJhdGVkIGZvciBmb3JtdWxhcyBhcmUgdHJhbnNwYXJlbnQgUE5Hcy4gVHJhbnNwYXJlbnQgUE5HcyBhcmUNCisjIG5vdCBzdXBwb3J0ZWQgcHJvcGVybHkgZm9yIElFIDYuMCwgYnV0IGFyZSBzdXBwb3J0ZWQgb24gYWxsIG1vZGVybiBicm93c2Vycy4NCisjIE5vdGUgdGhhdCB3aGVuIGNoYW5naW5nIHRoaXMgb3B0aW9uIHlvdSBuZWVkIHRvIGRlbGV0ZSBhbnkgZm9ybV8qLnBuZyBmaWxlcw0KKyMgaW4gdGhlIEhUTUwgb3V0cHV0IGJlZm9yZSB0aGUgY2hhbmdlcyBoYXZlIGVmZmVjdC4NCisNCitGT1JNVUxBX1RSQU5TUEFSRU5UICAgID0gWUVTDQorDQorIyBFbmFibGUgdGhlIFVTRV9NQVRISkFYIG9wdGlvbiB0byByZW5kZXIgTGFUZVggZm9ybXVsYXMgdXNpbmcgTWF0aEpheA0KKyMgKHNlZSBodHRwOi8vd3d3Lm1hdGhqYXgub3JnKSB3aGljaCB1c2VzIGNsaWVudCBzaWRlIEphdmFzY3JpcHQgZm9yIHRoZQ0KKyMgcmVuZGVyaW5nIGluc3RlYWQgb2YgdXNpbmcgcHJlcmVuZGVyZWQgYml0bWFwcy4gVXNlIHRoaXMgaWYgeW91IGRvIG5vdA0KKyMgaGF2ZSBMYVRlWCBpbnN0YWxsZWQgb3IgaWYgeW91IHdhbnQgdG8gZm9ybXVsYXMgbG9vayBwcmV0dGllciBpbiB0aGUgSFRNTA0KKyMgb3V0cHV0LiBXaGVuIGVuYWJsZWQgeW91IG1heSBhbHNvIG5lZWQgdG8gaW5zdGFsbCBNYXRoSmF4IHNlcGFyYXRlbHkgYW5kDQorIyBjb25maWd1cmUgdGhlIHBhdGggdG8gaXQgdXNpbmcgdGhlIE1BVEhKQVhfUkVMUEFUSCBvcHRpb24uDQorDQorVVNFX01BVEhKQVggICAgICAgICAgICA9IE5PDQorDQorIyBXaGVuIE1hdGhKYXggaXMgZW5hYmxlZCB5b3UgbmVlZCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiByZWxhdGl2ZSB0byB0aGUNCisjIEhUTUwgb3V0cHV0IGRpcmVjdG9yeSB1c2luZyB0aGUgTUFUSEpBWF9SRUxQQVRIIG9wdGlvbi4gVGhlIGRlc3RpbmF0aW9uDQorIyBkaXJlY3Rvcnkgc2hvdWxkIGNvbnRhaW4gdGhlIE1hdGhKYXguanMgc2NyaXB0LiBGb3IgaW5zdGFuY2UsIGlmIHRoZSBtYXRoamF4DQorIyBkaXJlY3RvcnkgaXMgbG9jYXRlZCBhdCB0aGUgc2FtZSBsZXZlbCBhcyB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5LCB0aGVuDQorIyBNQVRISkFYX1JFTFBBVEggc2hvdWxkIGJlIC4uL21hdGhqYXguIFRoZSBkZWZhdWx0IHZhbHVlIHBvaW50cyB0bw0KKyMgdGhlIE1hdGhKYXggQ29udGVudCBEZWxpdmVyeSBOZXR3b3JrIHNvIHlvdSBjYW4gcXVpY2tseSBzZWUgdGhlIHJlc3VsdCB3aXRob3V0DQorIyBpbnN0YWxsaW5nIE1hdGhKYXguDQorIyBIb3dldmVyLCBpdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBpbnN0YWxsIGEgbG9jYWwNCisjIGNvcHkgb2YgTWF0aEpheCBmcm9tIGh0dHA6Ly93d3cubWF0aGpheC5vcmcgYmVmb3JlIGRlcGxveW1lbnQuDQorDQorTUFUSEpBWF9SRUxQQVRIICAgICAgICA9IGh0dHA6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QNCisNCisjIFRoZSBNQVRISkFYX0VYVEVOU0lPTlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIE1hdGhKYXggZXh0ZW5zaW9uDQorIyBuYW1lcyB0aGF0IHNob3VsZCBiZSBlbmFibGVkIGR1cmluZyBNYXRoSmF4IHJlbmRlcmluZy4NCisNCitNQVRISkFYX0VYVEVOU0lPTlMgICAgID0NCisNCisjIFdoZW4gdGhlIFNFQVJDSEVOR0lORSB0YWcgaXMgZW5hYmxlZCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBzZWFyY2ggYm94DQorIyBmb3IgdGhlIEhUTUwgb3V0cHV0LiBUaGUgdW5kZXJseWluZyBzZWFyY2ggZW5naW5lIHVzZXMgamF2YXNjcmlwdA0KKyMgYW5kIERIVE1MIGFuZCBzaG91bGQgd29yayBvbiBhbnkgbW9kZXJuIGJyb3dzZXIuIE5vdGUgdGhhdCB3aGVuIHVzaW5nDQorIyBIVE1MIGhlbHAgKEdFTkVSQVRFX0hUTUxIRUxQKSwgUXQgaGVscCAoR0VORVJBVEVfUUhQKSwgb3IgZG9jc2V0cw0KKyMgKEdFTkVSQVRFX0RPQ1NFVCkgdGhlcmUgaXMgYWxyZWFkeSBhIHNlYXJjaCBmdW5jdGlvbiBzbyB0aGlzIG9uZSBzaG91bGQNCisjIHR5cGljYWxseSBiZSBkaXNhYmxlZC4gRm9yIGxhcmdlIHByb2plY3RzIHRoZSBqYXZhc2NyaXB0IGJhc2VkIHNlYXJjaCBlbmdpbmUNCisjIGNhbiBiZSBzbG93LCB0aGVuIGVuYWJsaW5nIFNFUlZFUl9CQVNFRF9TRUFSQ0ggbWF5IHByb3ZpZGUgYSBiZXR0ZXIgc29sdXRpb24uDQorDQorU0VBUkNIRU5HSU5FICAgICAgICAgICA9IFlFUw0KKw0KKyMgV2hlbiB0aGUgU0VSVkVSX0JBU0VEX1NFQVJDSCB0YWcgaXMgZW5hYmxlZCB0aGUgc2VhcmNoIGVuZ2luZSB3aWxsIGJlDQorIyBpbXBsZW1lbnRlZCB1c2luZyBhIFBIUCBlbmFibGVkIHdlYiBzZXJ2ZXIgaW5zdGVhZCBvZiBhdCB0aGUgd2ViIGNsaWVudA0KKyMgdXNpbmcgSmF2YXNjcmlwdC4gRG94eWdlbiB3aWxsIGdlbmVyYXRlIHRoZSBzZWFyY2ggUEhQIHNjcmlwdCBhbmQgaW5kZXgNCisjIGZpbGUgdG8gcHV0IG9uIHRoZSB3ZWIgc2VydmVyLiBUaGUgYWR2YW50YWdlIG9mIHRoZSBzZXJ2ZXINCisjIGJhc2VkIGFwcHJvYWNoIGlzIHRoYXQgaXQgc2NhbGVzIGJldHRlciB0byBsYXJnZSBwcm9qZWN0cyBhbmQgYWxsb3dzDQorIyBmdWxsIHRleHQgc2VhcmNoLiBUaGUgZGlzYWR2YW50YWdlcyBhcmUgdGhhdCBpdCBpcyBtb3JlIGRpZmZpY3VsdCB0byBzZXR1cA0KKyMgYW5kIGRvZXMgbm90IGhhdmUgbGl2ZSBzZWFyY2hpbmcgY2FwYWJpbGl0aWVzLg0KKw0KK1NFUlZFUl9CQVNFRF9TRUFSQ0ggICAgPSBOTw0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBMYVRlWCBvdXRwdXQNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorIyBJZiB0aGUgR0VORVJBVEVfTEFURVggdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwNCisjIGdlbmVyYXRlIExhdGV4IG91dHB1dC4NCisNCitHRU5FUkFURV9MQVRFWCAgICAgICAgID0gWUVTDQorDQorIyBUaGUgTEFURVhfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIExhVGVYIGRvY3Mgd2lsbCBiZSBwdXQuDQorIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlDQorIyBwdXQgaW4gZnJvbnQgb2YgaXQuIElmIGxlZnQgYmxhbmsgYGxhdGV4JyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgcGF0aC4NCisNCitMQVRFWF9PVVRQVVQgICAgICAgICAgID0NCisNCisjIFRoZSBMQVRFWF9DTURfTkFNRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgTGFUZVggY29tbWFuZCBuYW1lIHRvIGJlDQorIyBpbnZva2VkLiBJZiBsZWZ0IGJsYW5rIGBsYXRleCcgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IGNvbW1hbmQgbmFtZS4NCisjIE5vdGUgdGhhdCB3aGVuIGVuYWJsaW5nIFVTRV9QREZMQVRFWCB0aGlzIG9wdGlvbiBpcyBvbmx5IHVzZWQgZm9yDQorIyBnZW5lcmF0aW5nIGJpdG1hcHMgZm9yIGZvcm11bGFzIGluIHRoZSBIVE1MIG91dHB1dCwgYnV0IG5vdCBpbiB0aGUNCisjIE1ha2VmaWxlIHRoYXQgaXMgd3JpdHRlbiB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4NCisNCitMQVRFWF9DTURfTkFNRSAgICAgICAgID0gbGF0ZXgNCisNCisjIFRoZSBNQUtFSU5ERVhfQ01EX05BTUUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGNvbW1hbmQgbmFtZSB0bw0KKyMgZ2VuZXJhdGUgaW5kZXggZm9yIExhVGVYLiBJZiBsZWZ0IGJsYW5rIGBtYWtlaW5kZXgnIHdpbGwgYmUgdXNlZCBhcyB0aGUNCisjIGRlZmF1bHQgY29tbWFuZCBuYW1lLg0KKw0KK01BS0VJTkRFWF9DTURfTkFNRSAgICAgPSBtYWtlaW5kZXgNCisNCisjIElmIHRoZSBDT01QQUNUX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gZ2VuZXJhdGVzIG1vcmUgY29tcGFjdA0KKyMgTGFUZVggZG9jdW1lbnRzLiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIHNtYWxsIHByb2plY3RzIGFuZCBtYXkgaGVscCB0bw0KKyMgc2F2ZSBzb21lIHRyZWVzIGluIGdlbmVyYWwuDQorDQorQ09NUEFDVF9MQVRFWCAgICAgICAgICA9IE5PDQorDQorIyBUaGUgUEFQRVJfVFlQRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBwYXBlciB0eXBlIHRoYXQgaXMgdXNlZA0KKyMgYnkgdGhlIHByaW50ZXIuIFBvc3NpYmxlIHZhbHVlcyBhcmU6IGE0LCBsZXR0ZXIsIGxlZ2FsIGFuZA0KKyMgZXhlY3V0aXZlLiBJZiBsZWZ0IGJsYW5rIGE0d2lkZSB3aWxsIGJlIHVzZWQuDQorDQorUEFQRVJfVFlQRSAgICAgICAgICAgICA9IGE0d2lkZQ0KKw0KKyMgVGhlIEVYVFJBX1BBQ0tBR0VTIHRhZyBjYW4gYmUgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBuYW1lcyBvZiBMYVRlWA0KKyMgcGFja2FnZXMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIExhVGVYIG91dHB1dC4NCisNCitFWFRSQV9QQUNLQUdFUyAgICAgICAgID0NCisNCisjIFRoZSBMQVRFWF9IRUFERVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwZXJzb25hbCBMYVRlWCBoZWFkZXIgZm9yDQorIyB0aGUgZ2VuZXJhdGVkIGxhdGV4IGRvY3VtZW50LiBUaGUgaGVhZGVyIHNob3VsZCBjb250YWluIGV2ZXJ5dGhpbmcgdW50aWwNCisjIHRoZSBmaXJzdCBjaGFwdGVyLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhDQorIyBzdGFuZGFyZCBoZWFkZXIuIE5vdGljZTogb25seSB1c2UgdGhpcyB0YWcgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nIQ0KKw0KK0xBVEVYX0hFQURFUiAgICAgICAgICAgPSBkb2MvZG94eWdlbi9oZWFkZXIudGV4DQorDQorIyBUaGUgTEFURVhfRk9PVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcGVyc29uYWwgTGFUZVggZm9vdGVyIGZvcg0KKyMgdGhlIGdlbmVyYXRlZCBsYXRleCBkb2N1bWVudC4gVGhlIGZvb3RlciBzaG91bGQgY29udGFpbiBldmVyeXRoaW5nIGFmdGVyDQorIyB0aGUgbGFzdCBjaGFwdGVyLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhDQorIyBzdGFuZGFyZCBmb290ZXIuIE5vdGljZTogb25seSB1c2UgdGhpcyB0YWcgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nIQ0KKw0KK0xBVEVYX0ZPT1RFUiAgICAgICAgICAgPQ0KKw0KKyMgSWYgdGhlIFBERl9IWVBFUkxJTktTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgTGFUZVggdGhhdCBpcyBnZW5lcmF0ZWQNCisjIGlzIHByZXBhcmVkIGZvciBjb252ZXJzaW9uIHRvIHBkZiAodXNpbmcgcHMycGRmKS4gVGhlIHBkZiBmaWxlIHdpbGwNCisjIGNvbnRhaW4gbGlua3MgKGp1c3QgbGlrZSB0aGUgSFRNTCBvdXRwdXQpIGluc3RlYWQgb2YgcGFnZSByZWZlcmVuY2VzDQorIyBUaGlzIG1ha2VzIHRoZSBvdXRwdXQgc3VpdGFibGUgZm9yIG9ubGluZSBicm93c2luZyB1c2luZyBhIHBkZiB2aWV3ZXIuDQorDQorUERGX0hZUEVSTElOS1MgICAgICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIFVTRV9QREZMQVRFWCB0YWcgaXMgc2V0IHRvIFlFUywgcGRmbGF0ZXggd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YNCisjIHBsYWluIGxhdGV4IGluIHRoZSBnZW5lcmF0ZWQgTWFrZWZpbGUuIFNldCB0aGlzIG9wdGlvbiB0byBZRVMgdG8gZ2V0IGENCisjIGhpZ2hlciBxdWFsaXR5IFBERiBkb2N1bWVudGF0aW9uLg0KKw0KK1VTRV9QREZMQVRFWCAgICAgICAgICAgPSBZRVMNCisNCisjIElmIHRoZSBMQVRFWF9CQVRDSE1PREUgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBhZGQgdGhlIFxcYmF0Y2htb2RlLg0KKyMgY29tbWFuZCB0byB0aGUgZ2VuZXJhdGVkIExhVGVYIGZpbGVzLiBUaGlzIHdpbGwgaW5zdHJ1Y3QgTGFUZVggdG8ga2VlcA0KKyMgcnVubmluZyBpZiBlcnJvcnMgb2NjdXIsIGluc3RlYWQgb2YgYXNraW5nIHRoZSB1c2VyIGZvciBoZWxwLg0KKyMgVGhpcyBvcHRpb24gaXMgYWxzbyB1c2VkIHdoZW4gZ2VuZXJhdGluZyBmb3JtdWxhcyBpbiBIVE1MLg0KKw0KK0xBVEVYX0JBVENITU9ERSAgICAgICAgPSBOTw0KKw0KKyMgSWYgTEFURVhfSElERV9JTkRJQ0VTIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgbm90DQorIyBpbmNsdWRlIHRoZSBpbmRleCBjaGFwdGVycyAoc3VjaCBhcyBGaWxlIEluZGV4LCBDb21wb3VuZCBJbmRleCwgZXRjLikNCisjIGluIHRoZSBvdXRwdXQuDQorDQorTEFURVhfSElERV9JTkRJQ0VTICAgICA9IE5PDQorDQorIyBJZiBMQVRFWF9TT1VSQ0VfQ09ERSBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGluY2x1ZGUNCisjIHNvdXJjZSBjb2RlIHdpdGggc3ludGF4IGhpZ2hsaWdodGluZyBpbiB0aGUgTGFUZVggb3V0cHV0Lg0KKyMgTm90ZSB0aGF0IHdoaWNoIHNvdXJjZXMgYXJlIHNob3duIGFsc28gZGVwZW5kcyBvbiBvdGhlciBzZXR0aW5ncw0KKyMgc3VjaCBhcyBTT1VSQ0VfQlJPV1NFUi4NCisNCitMQVRFWF9TT1VSQ0VfQ09ERSAgICAgID0gTk8NCisNCisjIFRoZSBMQVRFWF9CSUJfU1RZTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHN0eWxlIHRvIHVzZSBmb3IgdGhlDQorIyBiaWJsaW9ncmFwaHksIGUuZy4gcGxhaW5uYXQsIG9yIGllZWV0ci4gVGhlIGRlZmF1bHQgc3R5bGUgaXMgInBsYWluIi4gU2VlDQorIyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JpYlRlWCBmb3IgbW9yZSBpbmZvLg0KKw0KK0xBVEVYX0JJQl9TVFlMRSAgICAgICAgPSBwbGFpbg0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBSVEYgb3V0cHV0DQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyMgSWYgdGhlIEdFTkVSQVRFX1JURiB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgUlRGIG91dHB1dA0KKyMgVGhlIFJURiBvdXRwdXQgaXMgb3B0aW1pemVkIGZvciBXb3JkIDk3IGFuZCBtYXkgbm90IGxvb2sgdmVyeSBwcmV0dHkgd2l0aA0KKyMgb3RoZXIgUlRGIHJlYWRlcnMgb3IgZWRpdG9ycy4NCisNCitHRU5FUkFURV9SVEYgICAgICAgICAgID0gTk8NCisNCisjIFRoZSBSVEZfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIFJURiBkb2NzIHdpbGwgYmUgcHV0Lg0KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZQ0KKyMgcHV0IGluIGZyb250IG9mIGl0LiBJZiBsZWZ0IGJsYW5rIGBydGYnIHdpbGwgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBwYXRoLg0KKw0KK1JURl9PVVRQVVQgICAgICAgICAgICAgPQ0KKw0KKyMgSWYgdGhlIENPTVBBQ1RfUlRGIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gZ2VuZXJhdGVzIG1vcmUgY29tcGFjdA0KKyMgUlRGIGRvY3VtZW50cy4gVGhpcyBtYXkgYmUgdXNlZnVsIGZvciBzbWFsbCBwcm9qZWN0cyBhbmQgbWF5IGhlbHAgdG8NCisjIHNhdmUgc29tZSB0cmVlcyBpbiBnZW5lcmFsLg0KKw0KK0NPTVBBQ1RfUlRGICAgICAgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIFJURl9IWVBFUkxJTktTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgUlRGIHRoYXQgaXMgZ2VuZXJhdGVkDQorIyB3aWxsIGNvbnRhaW4gaHlwZXJsaW5rIGZpZWxkcy4gVGhlIFJURiBmaWxlIHdpbGwNCisjIGNvbnRhaW4gbGlua3MgKGp1c3QgbGlrZSB0aGUgSFRNTCBvdXRwdXQpIGluc3RlYWQgb2YgcGFnZSByZWZlcmVuY2VzLg0KKyMgVGhpcyBtYWtlcyB0aGUgb3V0cHV0IHN1aXRhYmxlIGZvciBvbmxpbmUgYnJvd3NpbmcgdXNpbmcgV09SRCBvciBvdGhlcg0KKyMgcHJvZ3JhbXMgd2hpY2ggc3VwcG9ydCB0aG9zZSBmaWVsZHMuDQorIyBOb3RlOiB3b3JkcGFkICh3cml0ZSkgYW5kIG90aGVycyBkbyBub3Qgc3VwcG9ydCBsaW5rcy4NCisNCitSVEZfSFlQRVJMSU5LUyAgICAgICAgID0gTk8NCisNCisjIExvYWQgc3R5bGUgc2hlZXQgZGVmaW5pdGlvbnMgZnJvbSBmaWxlLiBTeW50YXggaXMgc2ltaWxhciB0byBkb3h5Z2VuJ3MNCisjIGNvbmZpZyBmaWxlLCBpLmUuIGEgc2VyaWVzIG9mIGFzc2lnbm1lbnRzLiBZb3Ugb25seSBoYXZlIHRvIHByb3ZpZGUNCisjIHJlcGxhY2VtZW50cywgbWlzc2luZyBkZWZpbml0aW9ucyBhcmUgc2V0IHRvIHRoZWlyIGRlZmF1bHQgdmFsdWUuDQorDQorUlRGX1NUWUxFU0hFRVRfRklMRSAgICA9DQorDQorIyBTZXQgb3B0aW9uYWwgdmFyaWFibGVzIHVzZWQgaW4gdGhlIGdlbmVyYXRpb24gb2YgYW4gcnRmIGRvY3VtZW50Lg0KKyMgU3ludGF4IGlzIHNpbWlsYXIgdG8gZG94eWdlbidzIGNvbmZpZyBmaWxlLg0KKw0KK1JURl9FWFRFTlNJT05TX0ZJTEUgICAgPQ0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBtYW4gcGFnZSBvdXRwdXQNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorIyBJZiB0aGUgR0VORVJBVEVfTUFOIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsDQorIyBnZW5lcmF0ZSBtYW4gcGFnZXMNCisNCitHRU5FUkFURV9NQU4gICAgICAgICAgID0gTk8NCisNCisjIFRoZSBNQU5fT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIG1hbiBwYWdlcyB3aWxsIGJlIHB1dC4NCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUNCisjIHB1dCBpbiBmcm9udCBvZiBpdC4gSWYgbGVmdCBibGFuayBgbWFuJyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgcGF0aC4NCisNCitNQU5fT1VUUFVUICAgICAgICAgICAgID0NCisNCisjIFRoZSBNQU5fRVhURU5TSU9OIHRhZyBkZXRlcm1pbmVzIHRoZSBleHRlbnNpb24gdGhhdCBpcyBhZGRlZCB0bw0KKyMgdGhlIGdlbmVyYXRlZCBtYW4gcGFnZXMgKGRlZmF1bHQgaXMgdGhlIHN1YnJvdXRpbmUncyBzZWN0aW9uIC4zKQ0KKw0KK01BTl9FWFRFTlNJT04gICAgICAgICAgPQ0KKw0KKyMgSWYgdGhlIE1BTl9MSU5LUyB0YWcgaXMgc2V0IHRvIFlFUyBhbmQgRG94eWdlbiBnZW5lcmF0ZXMgbWFuIG91dHB1dCwNCisjIHRoZW4gaXQgd2lsbCBnZW5lcmF0ZSBvbmUgYWRkaXRpb25hbCBtYW4gZmlsZSBmb3IgZWFjaCBlbnRpdHkNCisjIGRvY3VtZW50ZWQgaW4gdGhlIHJlYWwgbWFuIHBhZ2UocykuIFRoZXNlIGFkZGl0aW9uYWwgZmlsZXMNCisjIG9ubHkgc291cmNlIHRoZSByZWFsIG1hbiBwYWdlLCBidXQgd2l0aG91dCB0aGVtIHRoZSBtYW4gY29tbWFuZA0KKyMgd291bGQgYmUgdW5hYmxlIHRvIGZpbmQgdGhlIGNvcnJlY3QgcGFnZS4gVGhlIGRlZmF1bHQgaXMgTk8uDQorDQorTUFOX0xJTktTICAgICAgICAgICAgICA9IE5PDQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIFhNTCBvdXRwdXQNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorIyBJZiB0aGUgR0VORVJBVEVfWE1MIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbA0KKyMgZ2VuZXJhdGUgYW4gWE1MIGZpbGUgdGhhdCBjYXB0dXJlcyB0aGUgc3RydWN0dXJlIG9mDQorIyB0aGUgY29kZSBpbmNsdWRpbmcgYWxsIGRvY3VtZW50YXRpb24uDQorDQorR0VORVJBVEVfWE1MICAgICAgICAgICA9IE5PDQorDQorIyBUaGUgWE1MX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBYTUwgcGFnZXMgd2lsbCBiZSBwdXQuDQorIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlDQorIyBwdXQgaW4gZnJvbnQgb2YgaXQuIElmIGxlZnQgYmxhbmsgYHhtbCcgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhdGguDQorDQorWE1MX09VVFBVVCAgICAgICAgICAgICA9IHhtbA0KKw0KKyMgVGhlIFhNTF9TQ0hFTUEgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYW4gWE1MIHNjaGVtYSwNCisjIHdoaWNoIGNhbiBiZSB1c2VkIGJ5IGEgdmFsaWRhdGluZyBYTUwgcGFyc2VyIHRvIGNoZWNrIHRoZQ0KKyMgc3ludGF4IG9mIHRoZSBYTUwgZmlsZXMuDQorDQorWE1MX1NDSEVNQSAgICAgICAgICAgICA9DQorDQorIyBUaGUgWE1MX0RURCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhbiBYTUwgRFRELA0KKyMgd2hpY2ggY2FuIGJlIHVzZWQgYnkgYSB2YWxpZGF0aW5nIFhNTCBwYXJzZXIgdG8gY2hlY2sgdGhlDQorIyBzeW50YXggb2YgdGhlIFhNTCBmaWxlcy4NCisNCitYTUxfRFREICAgICAgICAgICAgICAgID0NCisNCisjIElmIHRoZSBYTUxfUFJPR1JBTUxJU1RJTkcgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsDQorIyBkdW1wIHRoZSBwcm9ncmFtIGxpc3RpbmdzIChpbmNsdWRpbmcgc3ludGF4IGhpZ2hsaWdodGluZw0KKyMgYW5kIGNyb3NzLXJlZmVyZW5jaW5nIGluZm9ybWF0aW9uKSB0byB0aGUgWE1MIG91dHB1dC4gTm90ZSB0aGF0DQorIyBlbmFibGluZyB0aGlzIHdpbGwgc2lnbmlmaWNhbnRseSBpbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgWE1MIG91dHB1dC4NCisNCitYTUxfUFJPR1JBTUxJU1RJTkcgICAgID0gWUVTDQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgQXV0b0dlbiBEZWZpbml0aW9ucyBvdXRwdXQNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorIyBJZiB0aGUgR0VORVJBVEVfQVVUT0dFTl9ERUYgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsDQorIyBnZW5lcmF0ZSBhbiBBdXRvR2VuIERlZmluaXRpb25zIChzZWUgYXV0b2dlbi5zZi5uZXQpIGZpbGUNCisjIHRoYXQgY2FwdHVyZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgY29kZSBpbmNsdWRpbmcgYWxsDQorIyBkb2N1bWVudGF0aW9uLiBOb3RlIHRoYXQgdGhpcyBmZWF0dXJlIGlzIHN0aWxsIGV4cGVyaW1lbnRhbA0KKyMgYW5kIGluY29tcGxldGUgYXQgdGhlIG1vbWVudC4NCisNCitHRU5FUkFURV9BVVRPR0VOX0RFRiAgID0gTk8NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgUGVybCBtb2R1bGUgb3V0cHV0DQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyMgSWYgdGhlIEdFTkVSQVRFX1BFUkxNT0QgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsDQorIyBnZW5lcmF0ZSBhIFBlcmwgbW9kdWxlIGZpbGUgdGhhdCBjYXB0dXJlcyB0aGUgc3RydWN0dXJlIG9mDQorIyB0aGUgY29kZSBpbmNsdWRpbmcgYWxsIGRvY3VtZW50YXRpb24uIE5vdGUgdGhhdCB0aGlzDQorIyBmZWF0dXJlIGlzIHN0aWxsIGV4cGVyaW1lbnRhbCBhbmQgaW5jb21wbGV0ZSBhdCB0aGUNCisjIG1vbWVudC4NCisNCitHRU5FUkFURV9QRVJMTU9EICAgICAgID0gTk8NCisNCisjIElmIHRoZSBQRVJMTU9EX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbCBnZW5lcmF0ZQ0KKyMgdGhlIG5lY2Vzc2FyeSBNYWtlZmlsZSBydWxlcywgUGVybCBzY3JpcHRzIGFuZCBMYVRlWCBjb2RlIHRvIGJlIGFibGUNCisjIHRvIGdlbmVyYXRlIFBERiBhbmQgRFZJIG91dHB1dCBmcm9tIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQuDQorDQorUEVSTE1PRF9MQVRFWCAgICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgUEVSTE1PRF9QUkVUVFkgdGFnIGlzIHNldCB0byBZRVMgdGhlIFBlcmwgbW9kdWxlIG91dHB1dCB3aWxsIGJlDQorIyBuaWNlbHkgZm9ybWF0dGVkIHNvIGl0IGNhbiBiZSBwYXJzZWQgYnkgYSBodW1hbiByZWFkZXIuDQorIyBUaGlzIGlzIHVzZWZ1bA0KKyMgaWYgeW91IHdhbnQgdG8gdW5kZXJzdGFuZCB3aGF0IGlzIGdvaW5nIG9uLg0KKyMgT24gdGhlIG90aGVyIGhhbmQsIGlmIHRoaXMNCisjIHRhZyBpcyBzZXQgdG8gTk8gdGhlIHNpemUgb2YgdGhlIFBlcmwgbW9kdWxlIG91dHB1dCB3aWxsIGJlIG11Y2ggc21hbGxlcg0KKyMgYW5kIFBlcmwgd2lsbCBwYXJzZSBpdCBqdXN0IHRoZSBzYW1lLg0KKw0KK1BFUkxNT0RfUFJFVFRZICAgICAgICAgPSBZRVMNCisNCisjIFRoZSBuYW1lcyBvZiB0aGUgbWFrZSB2YXJpYWJsZXMgaW4gdGhlIGdlbmVyYXRlZCBkb3h5cnVsZXMubWFrZSBmaWxlDQorIyBhcmUgcHJlZml4ZWQgd2l0aCB0aGUgc3RyaW5nIGNvbnRhaW5lZCBpbiBQRVJMTU9EX01BS0VWQVJfUFJFRklYLg0KKyMgVGhpcyBpcyB1c2VmdWwgc28gZGlmZmVyZW50IGRveHlydWxlcy5tYWtlIGZpbGVzIGluY2x1ZGVkIGJ5IHRoZSBzYW1lDQorIyBNYWtlZmlsZSBkb24ndCBvdmVyd3JpdGUgZWFjaCBvdGhlcidzIHZhcmlhYmxlcy4NCisNCitQRVJMTU9EX01BS0VWQVJfUFJFRklYID0NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgcHJlcHJvY2Vzc29yDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyMgSWYgdGhlIEVOQUJMRV9QUkVQUk9DRVNTSU5HIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsDQorIyBldmFsdWF0ZSBhbGwgQy1wcmVwcm9jZXNzb3IgZGlyZWN0aXZlcyBmb3VuZCBpbiB0aGUgc291cmNlcyBhbmQgaW5jbHVkZQ0KKyMgZmlsZXMuDQorDQorRU5BQkxFX1BSRVBST0NFU1NJTkcgICA9IFlFUw0KKw0KKyMgSWYgdGhlIE1BQ1JPX0VYUEFOU0lPTiB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwgZXhwYW5kIGFsbCBtYWNybw0KKyMgbmFtZXMgaW4gdGhlIHNvdXJjZSBjb2RlLiBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSBvbmx5IGNvbmRpdGlvbmFsDQorIyBjb21waWxhdGlvbiB3aWxsIGJlIHBlcmZvcm1lZC4gTWFjcm8gZXhwYW5zaW9uIGNhbiBiZSBkb25lIGluIGEgY29udHJvbGxlZA0KKyMgd2F5IGJ5IHNldHRpbmcgRVhQQU5EX09OTFlfUFJFREVGIHRvIFlFUy4NCisNCitNQUNST19FWFBBTlNJT04gICAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgRVhQQU5EX09OTFlfUFJFREVGIGFuZCBNQUNST19FWFBBTlNJT04gdGFncyBhcmUgYm90aCBzZXQgdG8gWUVTDQorIyB0aGVuIHRoZSBtYWNybyBleHBhbnNpb24gaXMgbGltaXRlZCB0byB0aGUgbWFjcm9zIHNwZWNpZmllZCB3aXRoIHRoZQ0KKyMgUFJFREVGSU5FRCBhbmQgRVhQQU5EX0FTX0RFRklORUQgdGFncy4NCisNCitFWFBBTkRfT05MWV9QUkVERUYgICAgID0gWUVTDQorDQorIyBJZiB0aGUgU0VBUkNIX0lOQ0xVREVTIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlIGluY2x1ZGVzIGZpbGVzDQorIyBwb2ludGVkIHRvIGJ5IElOQ0xVREVfUEFUSCB3aWxsIGJlIHNlYXJjaGVkIHdoZW4gYSAjaW5jbHVkZSBpcyBmb3VuZC4NCisNCitTRUFSQ0hfSU5DTFVERVMgICAgICAgID0gWUVTDQorDQorIyBUaGUgSU5DTFVERV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQNCisjIGNvbnRhaW4gaW5jbHVkZSBmaWxlcyB0aGF0IGFyZSBub3QgaW5wdXQgZmlsZXMgYnV0IHNob3VsZCBiZSBwcm9jZXNzZWQgYnkNCisjIHRoZSBwcmVwcm9jZXNzb3IuDQorDQorSU5DTFVERV9QQVRIICAgICAgICAgICA9DQorDQorIyBZb3UgY2FuIHVzZSB0aGUgSU5DTFVERV9GSUxFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkDQorIyBwYXR0ZXJucyAobGlrZSAqLmggYW5kICouaHBwKSB0byBmaWx0ZXIgb3V0IHRoZSBoZWFkZXItZmlsZXMgaW4gdGhlDQorIyBkaXJlY3Rvcmllcy4gSWYgbGVmdCBibGFuaywgdGhlIHBhdHRlcm5zIHNwZWNpZmllZCB3aXRoIEZJTEVfUEFUVEVSTlMgd2lsbA0KKyMgYmUgdXNlZC4NCisNCitJTkNMVURFX0ZJTEVfUEFUVEVSTlMgID0NCisNCisjIFRoZSBQUkVERUZJTkVEIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIG1hY3JvIG5hbWVzIHRoYXQNCisjIGFyZSBkZWZpbmVkIGJlZm9yZSB0aGUgcHJlcHJvY2Vzc29yIGlzIHN0YXJ0ZWQgKHNpbWlsYXIgdG8gdGhlIC1EIG9wdGlvbiBvZg0KKyMgZ2NjKS4gVGhlIGFyZ3VtZW50IG9mIHRoZSB0YWcgaXMgYSBsaXN0IG9mIG1hY3JvcyBvZiB0aGUgZm9ybTogbmFtZQ0KKyMgb3IgbmFtZT1kZWZpbml0aW9uIChubyBzcGFjZXMpLiBJZiB0aGUgZGVmaW5pdGlvbiBhbmQgdGhlID0gYXJlDQorIyBvbWl0dGVkID0xIGlzIGFzc3VtZWQuIFRvIHByZXZlbnQgYSBtYWNybyBkZWZpbml0aW9uIGZyb20gYmVpbmcNCisjIHVuZGVmaW5lZCB2aWEgI3VuZGVmIG9yIHJlY3Vyc2l2ZWx5IGV4cGFuZGVkIHVzZSB0aGUgOj0gb3BlcmF0b3INCisjIGluc3RlYWQgb2YgdGhlID0gb3BlcmF0b3IuDQorDQorUFJFREVGSU5FRCAgICAgICAgICAgICA9IE9NUF8zMF9FTkFCTEVEPTEsIE9NUF80MF9FTkFCTEVEPTENCisNCisjIElmIHRoZSBNQUNST19FWFBBTlNJT04gYW5kIEVYUEFORF9PTkxZX1BSRURFRiB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4NCisjIHRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBsaXN0IG9mIG1hY3JvIG5hbWVzIHRoYXQgc2hvdWxkIGJlIGV4cGFuZGVkLg0KKyMgVGhlIG1hY3JvIGRlZmluaXRpb24gdGhhdCBpcyBmb3VuZCBpbiB0aGUgc291cmNlcyB3aWxsIGJlIHVzZWQuDQorIyBVc2UgdGhlIFBSRURFRklORUQgdGFnIGlmIHlvdSB3YW50IHRvIHVzZSBhIGRpZmZlcmVudCBtYWNybyBkZWZpbml0aW9uIHRoYXQNCisjIG92ZXJydWxlcyB0aGUgZGVmaW5pdGlvbiBmb3VuZCBpbiB0aGUgc291cmNlIGNvZGUuDQorDQorRVhQQU5EX0FTX0RFRklORUQgICAgICA9DQorDQorIyBJZiB0aGUgU0tJUF9GVU5DVElPTl9NQUNST1MgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGVuDQorIyBkb3h5Z2VuJ3MgcHJlcHJvY2Vzc29yIHdpbGwgcmVtb3ZlIGFsbCByZWZlcmVuY2VzIHRvIGZ1bmN0aW9uLWxpa2UgbWFjcm9zDQorIyB0aGF0IGFyZSBhbG9uZSBvbiBhIGxpbmUsIGhhdmUgYW4gYWxsIHVwcGVyY2FzZSBuYW1lLCBhbmQgZG8gbm90IGVuZCB3aXRoIGENCisjIHNlbWljb2xvbiwgYmVjYXVzZSB0aGVzZSB3aWxsIGNvbmZ1c2UgdGhlIHBhcnNlciBpZiBub3QgcmVtb3ZlZC4NCisNCitTS0lQX0ZVTkNUSU9OX01BQ1JPUyAgID0gWUVTDQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgQ29uZmlndXJhdGlvbjo6YWRkaXRpb25zIHJlbGF0ZWQgdG8gZXh0ZXJuYWwgcmVmZXJlbmNlcw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisjIFRoZSBUQUdGSUxFUyBvcHRpb24gY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB0YWdmaWxlcy4gRm9yIGVhY2gNCisjIHRhZyBmaWxlIHRoZSBsb2NhdGlvbiBvZiB0aGUgZXh0ZXJuYWwgZG9jdW1lbnRhdGlvbiBzaG91bGQgYmUgYWRkZWQuIFRoZQ0KKyMgZm9ybWF0IG9mIGEgdGFnIGZpbGUgd2l0aG91dCB0aGlzIGxvY2F0aW9uIGlzIGFzIGZvbGxvd3M6DQorIw0KKyMgVEFHRklMRVMgPSBmaWxlMSBmaWxlMiAuLi4NCisjIEFkZGluZyBsb2NhdGlvbiBmb3IgdGhlIHRhZyBmaWxlcyBpcyBkb25lIGFzIGZvbGxvd3M6DQorIw0KKyMgVEFHRklMRVMgPSBmaWxlMT1sb2MxICJmaWxlMiA9IGxvYzIiIC4uLg0KKyMgd2hlcmUgImxvYzEiIGFuZCAibG9jMiIgY2FuIGJlIHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGhzDQorIyBvciBVUkxzLiBOb3RlIHRoYXQgZWFjaCB0YWcgZmlsZSBtdXN0IGhhdmUgYSB1bmlxdWUgbmFtZSAod2hlcmUgdGhlIG5hbWUgZG9lcw0KKyMgTk9UIGluY2x1ZGUgdGhlIHBhdGgpLiBJZiBhIHRhZyBmaWxlIGlzIG5vdCBsb2NhdGVkIGluIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2gNCisjIGRveHlnZW4gaXMgcnVuLCB5b3UgbXVzdCBhbHNvIHNwZWNpZnkgdGhlIHBhdGggdG8gdGhlIHRhZ2ZpbGUgaGVyZS4NCisNCitUQUdGSUxFUyAgICAgICAgICAgICAgID0NCisNCisjIFdoZW4gYSBmaWxlIG5hbWUgaXMgc3BlY2lmaWVkIGFmdGVyIEdFTkVSQVRFX1RBR0ZJTEUsIGRveHlnZW4gd2lsbCBjcmVhdGUNCisjIGEgdGFnIGZpbGUgdGhhdCBpcyBiYXNlZCBvbiB0aGUgaW5wdXQgZmlsZXMgaXQgcmVhZHMuDQorDQorR0VORVJBVEVfVEFHRklMRSAgICAgICA9DQorDQorIyBJZiB0aGUgQUxMRVhURVJOQUxTIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBleHRlcm5hbCBjbGFzc2VzIHdpbGwgYmUgbGlzdGVkDQorIyBpbiB0aGUgY2xhc3MgaW5kZXguIElmIHNldCB0byBOTyBvbmx5IHRoZSBpbmhlcml0ZWQgZXh0ZXJuYWwgY2xhc3Nlcw0KKyMgd2lsbCBiZSBsaXN0ZWQuDQorDQorQUxMRVhURVJOQUxTICAgICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgRVhURVJOQUxfR1JPVVBTIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBleHRlcm5hbCBncm91cHMgd2lsbCBiZSBsaXN0ZWQNCisjIGluIHRoZSBtb2R1bGVzIGluZGV4LiBJZiBzZXQgdG8gTk8sIG9ubHkgdGhlIGN1cnJlbnQgcHJvamVjdCdzIGdyb3VwcyB3aWxsDQorIyBiZSBsaXN0ZWQuDQorDQorRVhURVJOQUxfR1JPVVBTICAgICAgICA9IFlFUw0KKw0KKyMgVGhlIFBFUkxfUEFUSCBzaG91bGQgYmUgdGhlIGFic29sdXRlIHBhdGggYW5kIG5hbWUgb2YgdGhlIHBlcmwgc2NyaXB0DQorIyBpbnRlcnByZXRlciAoaS5lLiB0aGUgcmVzdWx0IG9mIGB3aGljaCBwZXJsJykuDQorDQorUEVSTF9QQVRIICAgICAgICAgICAgICA9DQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGRvdCB0b29sDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyMgSWYgdGhlIENMQVNTX0RJQUdSQU1TIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsDQorIyBnZW5lcmF0ZSBhIGluaGVyaXRhbmNlIGRpYWdyYW0gKGluIEhUTUwsIFJURiBhbmQgTGFUZVgpIGZvciBjbGFzc2VzIHdpdGggYmFzZQ0KKyMgb3Igc3VwZXIgY2xhc3Nlcy4gU2V0dGluZyB0aGUgdGFnIHRvIE5PIHR1cm5zIHRoZSBkaWFncmFtcyBvZmYuIE5vdGUgdGhhdA0KKyMgdGhpcyBvcHRpb24gYWxzbyB3b3JrcyB3aXRoIEhBVkVfRE9UIGRpc2FibGVkLCBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8NCisjIGluc3RhbGwgYW5kIHVzZSBkb3QsIHNpbmNlIGl0IHlpZWxkcyBtb3JlIHBvd2VyZnVsIGdyYXBocy4NCisNCitDTEFTU19ESUFHUkFNUyAgICAgICAgID0gWUVTDQorDQorIyBZb3UgY2FuIGRlZmluZSBtZXNzYWdlIHNlcXVlbmNlIGNoYXJ0cyB3aXRoaW4gZG94eWdlbiBjb21tZW50cyB1c2luZyB0aGUgXG1zYw0KKyMgY29tbWFuZC4gRG94eWdlbiB3aWxsIHRoZW4gcnVuIHRoZSBtc2NnZW4gdG9vbCAoc2VlDQorIyBodHRwOi8vd3d3Lm1jdGVybmFuLm1lLnVrL21zY2dlbi8pIHRvIHByb2R1Y2UgdGhlIGNoYXJ0IGFuZCBpbnNlcnQgaXQgaW4gdGhlDQorIyBkb2N1bWVudGF0aW9uLiBUaGUgTVNDR0VOX1BBVEggdGFnIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgZGlyZWN0b3J5IHdoZXJlDQorIyB0aGUgbXNjZ2VuIHRvb2wgcmVzaWRlcy4gSWYgbGVmdCBlbXB0eSB0aGUgdG9vbCBpcyBhc3N1bWVkIHRvIGJlIGZvdW5kIGluIHRoZQ0KKyMgZGVmYXVsdCBzZWFyY2ggcGF0aC4NCisNCitNU0NHRU5fUEFUSCAgICAgICAgICAgID0NCisNCisjIElmIHNldCB0byBZRVMsIHRoZSBpbmhlcml0YW5jZSBhbmQgY29sbGFib3JhdGlvbiBncmFwaHMgd2lsbCBoaWRlDQorIyBpbmhlcml0YW5jZSBhbmQgdXNhZ2UgcmVsYXRpb25zIGlmIHRoZSB0YXJnZXQgaXMgdW5kb2N1bWVudGVkDQorIyBvciBpcyBub3QgYSBjbGFzcy4NCisNCitISURFX1VORE9DX1JFTEFUSU9OUyAgID0gWUVTDQorDQorIyBJZiB5b3Ugc2V0IHRoZSBIQVZFX0RPVCB0YWcgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGFzc3VtZSB0aGUgZG90IHRvb2wgaXMNCisjIGF2YWlsYWJsZSBmcm9tIHRoZSBwYXRoLiBUaGlzIHRvb2wgaXMgcGFydCBvZiBHcmFwaHZpeiwgYSBncmFwaCB2aXN1YWxpemF0aW9uDQorIyB0b29sa2l0IGZyb20gQVQmVCBhbmQgTHVjZW50IEJlbGwgTGFicy4gVGhlIG90aGVyIG9wdGlvbnMgaW4gdGhpcyBzZWN0aW9uDQorIyBoYXZlIG5vIGVmZmVjdCBpZiB0aGlzIG9wdGlvbiBpcyBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KQ0KKw0KK0hBVkVfRE9UICAgICAgICAgICAgICAgPSBOTw0KKw0KKyMgVGhlIERPVF9OVU1fVEhSRUFEUyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBkb3QgaW52b2NhdGlvbnMgZG94eWdlbiBpcw0KKyMgYWxsb3dlZCB0byBydW4gaW4gcGFyYWxsZWwuIFdoZW4gc2V0IHRvIDAgKHRoZSBkZWZhdWx0KSBkb3h5Z2VuIHdpbGwNCisjIGJhc2UgdGhpcyBvbiB0aGUgbnVtYmVyIG9mIHByb2Nlc3NvcnMgYXZhaWxhYmxlIGluIHRoZSBzeXN0ZW0uIFlvdSBjYW4gc2V0IGl0DQorIyBleHBsaWNpdGx5IHRvIGEgdmFsdWUgbGFyZ2VyIHRoYW4gMCB0byBnZXQgY29udHJvbCBvdmVyIHRoZSBiYWxhbmNlDQorIyBiZXR3ZWVuIENQVSBsb2FkIGFuZCBwcm9jZXNzaW5nIHNwZWVkLg0KKw0KK0RPVF9OVU1fVEhSRUFEUyAgICAgICAgPSAwDQorDQorIyBCeSBkZWZhdWx0IGRveHlnZW4gd2lsbCB1c2UgdGhlIEhlbHZldGljYSBmb250IGZvciBhbGwgZG90IGZpbGVzIHRoYXQNCisjIGRveHlnZW4gZ2VuZXJhdGVzLiBXaGVuIHlvdSB3YW50IGEgZGlmZmVyZW50bHkgbG9va2luZyBmb250IHlvdSBjYW4gc3BlY2lmeQ0KKyMgdGhlIGZvbnQgbmFtZSB1c2luZyBET1RfRk9OVE5BTUUuIFlvdSBuZWVkIHRvIG1ha2Ugc3VyZSBkb3QgaXMgYWJsZSB0byBmaW5kDQorIyB0aGUgZm9udCwgd2hpY2ggY2FuIGJlIGRvbmUgYnkgcHV0dGluZyBpdCBpbiBhIHN0YW5kYXJkIGxvY2F0aW9uIG9yIGJ5IHNldHRpbmcNCisjIHRoZSBET1RGT05UUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciBieSBzZXR0aW5nIERPVF9GT05UUEFUSCB0byB0aGUNCisjIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBmb250Lg0KKw0KK0RPVF9GT05UTkFNRSAgICAgICAgICAgPSBIZWx2ZXRpY2ENCisNCisjIFRoZSBET1RfRk9OVFNJWkUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgc2l6ZSBvZiB0aGUgZm9udCBvZiBkb3QgZ3JhcGhzLg0KKyMgVGhlIGRlZmF1bHQgc2l6ZSBpcyAxMHB0Lg0KKw0KK0RPVF9GT05UU0laRSAgICAgICAgICAgPSAxMA0KKw0KKyMgQnkgZGVmYXVsdCBkb3h5Z2VuIHdpbGwgdGVsbCBkb3QgdG8gdXNlIHRoZSBIZWx2ZXRpY2EgZm9udC4NCisjIElmIHlvdSBzcGVjaWZ5IGEgZGlmZmVyZW50IGZvbnQgdXNpbmcgRE9UX0ZPTlROQU1FIHlvdSBjYW4gdXNlIERPVF9GT05UUEFUSCB0bw0KKyMgc2V0IHRoZSBwYXRoIHdoZXJlIGRvdCBjYW4gZmluZCBpdC4NCisNCitET1RfRk9OVFBBVEggICAgICAgICAgID0NCisNCisjIElmIHRoZSBDTEFTU19HUkFQSCBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4NCisjIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGNsYXNzIHNob3dpbmcgdGhlIGRpcmVjdCBhbmQNCisjIGluZGlyZWN0IGluaGVyaXRhbmNlIHJlbGF0aW9ucy4gU2V0dGluZyB0aGlzIHRhZyB0byBZRVMgd2lsbCBmb3JjZSB0aGUNCisjIENMQVNTX0RJQUdSQU1TIHRhZyB0byBOTy4NCisNCitDTEFTU19HUkFQSCAgICAgICAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgQ09MTEFCT1JBVElPTl9HUkFQSCBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4NCisjIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGNsYXNzIHNob3dpbmcgdGhlIGRpcmVjdCBhbmQNCisjIGluZGlyZWN0IGltcGxlbWVudGF0aW9uIGRlcGVuZGVuY2llcyAoaW5oZXJpdGFuY2UsIGNvbnRhaW5tZW50LCBhbmQNCisjIGNsYXNzIHJlZmVyZW5jZXMgdmFyaWFibGVzKSBvZiB0aGUgY2xhc3Mgd2l0aCBvdGhlciBkb2N1bWVudGVkIGNsYXNzZXMuDQorDQorQ09MTEFCT1JBVElPTl9HUkFQSCAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIEdST1VQX0dSQVBIUyBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4NCisjIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZ3JvdXBzLCBzaG93aW5nIHRoZSBkaXJlY3QgZ3JvdXBzIGRlcGVuZGVuY2llcw0KKw0KK0dST1VQX0dSQVBIUyAgICAgICAgICAgPSBZRVMNCisNCisjIElmIHRoZSBVTUxfTE9PSyB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgaW5oZXJpdGFuY2UgYW5kDQorIyBjb2xsYWJvcmF0aW9uIGRpYWdyYW1zIGluIGEgc3R5bGUgc2ltaWxhciB0byB0aGUgT01HJ3MgVW5pZmllZCBNb2RlbGluZw0KKyMgTGFuZ3VhZ2UuDQorDQorVU1MX0xPT0sgICAgICAgICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgVU1MX0xPT0sgdGFnIGlzIGVuYWJsZWQsIHRoZSBmaWVsZHMgYW5kIG1ldGhvZHMgYXJlIHNob3duIGluc2lkZQ0KKyMgdGhlIGNsYXNzIG5vZGUuIElmIHRoZXJlIGFyZSBtYW55IGZpZWxkcyBvciBtZXRob2RzIGFuZCBtYW55IG5vZGVzIHRoZQ0KKyMgZ3JhcGggbWF5IGJlY29tZSB0b28gYmlnIHRvIGJlIHVzZWZ1bC4gVGhlIFVNTF9MSU1JVF9OVU1fRklFTERTDQorIyB0aHJlc2hvbGQgbGltaXRzIHRoZSBudW1iZXIgb2YgaXRlbXMgZm9yIGVhY2ggdHlwZSB0byBtYWtlIHRoZSBzaXplIG1vcmUNCisjIG1hbmFnYWJsZS4gU2V0IHRoaXMgdG8gMCBmb3Igbm8gbGltaXQuIE5vdGUgdGhhdCB0aGUgdGhyZXNob2xkIG1heSBiZQ0KKyMgZXhjZWVkZWQgYnkgNTAlIGJlZm9yZSB0aGUgbGltaXQgaXMgZW5mb3JjZWQuDQorDQorVU1MX0xJTUlUX05VTV9GSUVMRFMgICA9IDEwDQorDQorIyBJZiBzZXQgdG8gWUVTLCB0aGUgaW5oZXJpdGFuY2UgYW5kIGNvbGxhYm9yYXRpb24gZ3JhcGhzIHdpbGwgc2hvdyB0aGUNCisjIHJlbGF0aW9ucyBiZXR3ZWVuIHRlbXBsYXRlcyBhbmQgdGhlaXIgaW5zdGFuY2VzLg0KKw0KK1RFTVBMQVRFX1JFTEFUSU9OUyAgICAgPSBZRVMNCisNCisjIElmIHRoZSBFTkFCTEVfUFJFUFJPQ0VTU0lORywgU0VBUkNIX0lOQ0xVREVTLCBJTkNMVURFX0dSQVBILCBhbmQgSEFWRV9ET1QNCisjIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkDQorIyBmaWxlIHNob3dpbmcgdGhlIGRpcmVjdCBhbmQgaW5kaXJlY3QgaW5jbHVkZSBkZXBlbmRlbmNpZXMgb2YgdGhlIGZpbGUgd2l0aA0KKyMgb3RoZXIgZG9jdW1lbnRlZCBmaWxlcy4NCisNCitJTkNMVURFX0dSQVBIICAgICAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgRU5BQkxFX1BSRVBST0NFU1NJTkcsIFNFQVJDSF9JTkNMVURFUywgSU5DTFVERURfQllfR1JBUEgsIGFuZA0KKyMgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvciBlYWNoDQorIyBkb2N1bWVudGVkIGhlYWRlciBmaWxlIHNob3dpbmcgdGhlIGRvY3VtZW50ZWQgZmlsZXMgdGhhdCBkaXJlY3RseSBvcg0KKyMgaW5kaXJlY3RseSBpbmNsdWRlIHRoaXMgZmlsZS4NCisNCitJTkNMVURFRF9CWV9HUkFQSCAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgQ0FMTF9HUkFQSCBhbmQgSEFWRV9ET1Qgb3B0aW9ucyBhcmUgc2V0IHRvIFlFUyB0aGVuDQorIyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBjYWxsIGRlcGVuZGVuY3kgZ3JhcGggZm9yIGV2ZXJ5IGdsb2JhbCBmdW5jdGlvbg0KKyMgb3IgY2xhc3MgbWV0aG9kLiBOb3RlIHRoYXQgZW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlDQorIyB0aGUgdGltZSBvZiBhIHJ1bi4gU28gaW4gbW9zdCBjYXNlcyBpdCB3aWxsIGJlIGJldHRlciB0byBlbmFibGUgY2FsbCBncmFwaHMNCisjIGZvciBzZWxlY3RlZCBmdW5jdGlvbnMgb25seSB1c2luZyB0aGUgXGNhbGxncmFwaCBjb21tYW5kLg0KKw0KK0NBTExfR1JBUEggICAgICAgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIENBTExFUl9HUkFQSCBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuDQorIyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBjYWxsZXIgZGVwZW5kZW5jeSBncmFwaCBmb3IgZXZlcnkgZ2xvYmFsIGZ1bmN0aW9uDQorIyBvciBjbGFzcyBtZXRob2QuIE5vdGUgdGhhdCBlbmFibGluZyB0aGlzIG9wdGlvbiB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UNCisjIHRoZSB0aW1lIG9mIGEgcnVuLiBTbyBpbiBtb3N0IGNhc2VzIGl0IHdpbGwgYmUgYmV0dGVyIHRvIGVuYWJsZSBjYWxsZXINCisjIGdyYXBocyBmb3Igc2VsZWN0ZWQgZnVuY3Rpb25zIG9ubHkgdXNpbmcgdGhlIFxjYWxsZXJncmFwaCBjb21tYW5kLg0KKw0KK0NBTExFUl9HUkFQSCAgICAgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIEdSQVBISUNBTF9ISUVSQVJDSFkgYW5kIEhBVkVfRE9UIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuDQorIyB3aWxsIGdlbmVyYXRlIGEgZ3JhcGhpY2FsIGhpZXJhcmNoeSBvZiBhbGwgY2xhc3NlcyBpbnN0ZWFkIG9mIGEgdGV4dHVhbCBvbmUuDQorDQorR1JBUEhJQ0FMX0hJRVJBUkNIWSAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIERJUkVDVE9SWV9HUkFQSCBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUw0KKyMgdGhlbiBkb3h5Z2VuIHdpbGwgc2hvdyB0aGUgZGVwZW5kZW5jaWVzIGEgZGlyZWN0b3J5IGhhcyBvbiBvdGhlciBkaXJlY3Rvcmllcw0KKyMgaW4gYSBncmFwaGljYWwgd2F5LiBUaGUgZGVwZW5kZW5jeSByZWxhdGlvbnMgYXJlIGRldGVybWluZWQgYnkgdGhlICNpbmNsdWRlDQorIyByZWxhdGlvbnMgYmV0d2VlbiB0aGUgZmlsZXMgaW4gdGhlIGRpcmVjdG9yaWVzLg0KKw0KK0RJUkVDVE9SWV9HUkFQSCAgICAgICAgPSBZRVMNCisNCisjIFRoZSBET1RfSU1BR0VfRk9STUFUIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIGltYWdlIGZvcm1hdCBvZiB0aGUgaW1hZ2VzDQorIyBnZW5lcmF0ZWQgYnkgZG90LiBQb3NzaWJsZSB2YWx1ZXMgYXJlIHN2ZywgcG5nLCBqcGcsIG9yIGdpZi4NCisjIElmIGxlZnQgYmxhbmsgcG5nIHdpbGwgYmUgdXNlZC4gSWYgeW91IGNob29zZSBzdmcgeW91IG5lZWQgdG8gc2V0DQorIyBIVE1MX0ZJTEVfRVhURU5TSU9OIHRvIHhodG1sIGluIG9yZGVyIHRvIG1ha2UgdGhlIFNWRyBmaWxlcw0KKyMgdmlzaWJsZSBpbiBJRSA5KyAob3RoZXIgYnJvd3NlcnMgZG8gbm90IGhhdmUgdGhpcyByZXF1aXJlbWVudCkuDQorDQorRE9UX0lNQUdFX0ZPUk1BVCAgICAgICA9IHBuZw0KKw0KKyMgSWYgRE9UX0lNQUdFX0ZPUk1BVCBpcyBzZXQgdG8gc3ZnLCB0aGVuIHRoaXMgb3B0aW9uIGNhbiBiZSBzZXQgdG8gWUVTIHRvDQorIyBlbmFibGUgZ2VuZXJhdGlvbiBvZiBpbnRlcmFjdGl2ZSBTVkcgaW1hZ2VzIHRoYXQgYWxsb3cgem9vbWluZyBhbmQgcGFubmluZy4NCisjIE5vdGUgdGhhdCB0aGlzIHJlcXVpcmVzIGEgbW9kZXJuIGJyb3dzZXIgb3RoZXIgdGhhbiBJbnRlcm5ldCBFeHBsb3Jlci4NCisjIFRlc3RlZCBhbmQgd29ya2luZyBhcmUgRmlyZWZveCwgQ2hyb21lLCBTYWZhcmksIGFuZCBPcGVyYS4gRm9yIElFIDkrIHlvdQ0KKyMgbmVlZCB0byBzZXQgSFRNTF9GSUxFX0VYVEVOU0lPTiB0byB4aHRtbCBpbiBvcmRlciB0byBtYWtlIHRoZSBTVkcgZmlsZXMNCisjIHZpc2libGUuIE9sZGVyIHZlcnNpb25zIG9mIElFIGRvIG5vdCBoYXZlIFNWRyBzdXBwb3J0Lg0KKw0KK0lOVEVSQUNUSVZFX1NWRyAgICAgICAgPSBOTw0KKw0KKyMgVGhlIHRhZyBET1RfUEFUSCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBwYXRoIHdoZXJlIHRoZSBkb3QgdG9vbCBjYW4gYmUNCisjIGZvdW5kLiBJZiBsZWZ0IGJsYW5rLCBpdCBpcyBhc3N1bWVkIHRoZSBkb3QgdG9vbCBjYW4gYmUgZm91bmQgaW4gdGhlIHBhdGguDQorDQorRE9UX1BBVEggICAgICAgICAgICAgICA9DQorDQorIyBUaGUgRE9URklMRV9ESVJTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQNCisjIGNvbnRhaW4gZG90IGZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uIChzZWUgdGhlDQorIyBcZG90ZmlsZSBjb21tYW5kKS4NCisNCitET1RGSUxFX0RJUlMgICAgICAgICAgID0NCisNCisjIFRoZSBNU0NGSUxFX0RJUlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMgdGhhdA0KKyMgY29udGFpbiBtc2MgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUNCisjIFxtc2NmaWxlIGNvbW1hbmQpLg0KKw0KK01TQ0ZJTEVfRElSUyAgICAgICAgICAgPQ0KKw0KKyMgVGhlIERPVF9HUkFQSF9NQVhfTk9ERVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbWF4aW11bSBudW1iZXIgb2YNCisjIG5vZGVzIHRoYXQgd2lsbCBiZSBzaG93biBpbiB0aGUgZ3JhcGguIElmIHRoZSBudW1iZXIgb2Ygbm9kZXMgaW4gYSBncmFwaA0KKyMgYmVjb21lcyBsYXJnZXIgdGhhbiB0aGlzIHZhbHVlLCBkb3h5Z2VuIHdpbGwgdHJ1bmNhdGUgdGhlIGdyYXBoLCB3aGljaCBpcw0KKyMgdmlzdWFsaXplZCBieSByZXByZXNlbnRpbmcgYSBub2RlIGFzIGEgcmVkIGJveC4gTm90ZSB0aGF0IGRveHlnZW4gaWYgdGhlDQorIyBudW1iZXIgb2YgZGlyZWN0IGNoaWxkcmVuIG9mIHRoZSByb290IG5vZGUgaW4gYSBncmFwaCBpcyBhbHJlYWR5IGxhcmdlciB0aGFuDQorIyBET1RfR1JBUEhfTUFYX05PREVTIHRoZW4gdGhlIGdyYXBoIHdpbGwgbm90IGJlIHNob3duIGF0IGFsbC4gQWxzbyBub3RlDQorIyB0aGF0IHRoZSBzaXplIG9mIGEgZ3JhcGggY2FuIGJlIGZ1cnRoZXIgcmVzdHJpY3RlZCBieSBNQVhfRE9UX0dSQVBIX0RFUFRILg0KKw0KK0RPVF9HUkFQSF9NQVhfTk9ERVMgICAgPSA1MA0KKw0KKyMgVGhlIE1BWF9ET1RfR1JBUEhfREVQVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbWF4aW11bSBkZXB0aCBvZiB0aGUNCisjIGdyYXBocyBnZW5lcmF0ZWQgYnkgZG90LiBBIGRlcHRoIHZhbHVlIG9mIDMgbWVhbnMgdGhhdCBvbmx5IG5vZGVzIHJlYWNoYWJsZQ0KKyMgZnJvbSB0aGUgcm9vdCBieSBmb2xsb3dpbmcgYSBwYXRoIHZpYSBhdCBtb3N0IDMgZWRnZXMgd2lsbCBiZSBzaG93bi4gTm9kZXMNCisjIHRoYXQgbGF5IGZ1cnRoZXIgZnJvbSB0aGUgcm9vdCBub2RlIHdpbGwgYmUgb21pdHRlZC4gTm90ZSB0aGF0IHNldHRpbmcgdGhpcw0KKyMgb3B0aW9uIHRvIDEgb3IgMiBtYXkgZ3JlYXRseSByZWR1Y2UgdGhlIGNvbXB1dGF0aW9uIHRpbWUgbmVlZGVkIGZvciBsYXJnZQ0KKyMgY29kZSBiYXNlcy4gQWxzbyBub3RlIHRoYXQgdGhlIHNpemUgb2YgYSBncmFwaCBjYW4gYmUgZnVydGhlciByZXN0cmljdGVkIGJ5DQorIyBET1RfR1JBUEhfTUFYX05PREVTLiBVc2luZyBhIGRlcHRoIG9mIDAgbWVhbnMgbm8gZGVwdGggcmVzdHJpY3Rpb24uDQorDQorTUFYX0RPVF9HUkFQSF9ERVBUSCAgICA9IDANCisNCisjIFNldCB0aGUgRE9UX1RSQU5TUEFSRU5UIHRhZyB0byBZRVMgdG8gZ2VuZXJhdGUgaW1hZ2VzIHdpdGggYSB0cmFuc3BhcmVudA0KKyMgYmFja2dyb3VuZC4gVGhpcyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LCBiZWNhdXNlIGRvdCBvbiBXaW5kb3dzIGRvZXMgbm90DQorIyBzZWVtIHRvIHN1cHBvcnQgdGhpcyBvdXQgb2YgdGhlIGJveC4gV2FybmluZzogRGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybSB1c2VkLA0KKyMgZW5hYmxpbmcgdGhpcyBvcHRpb24gbWF5IGxlYWQgdG8gYmFkbHkgYW50aS1hbGlhc2VkIGxhYmVscyBvbiB0aGUgZWRnZXMgb2YNCisjIGEgZ3JhcGggKGkuZS4gdGhleSBiZWNvbWUgaGFyZCB0byByZWFkKS4NCisNCitET1RfVFJBTlNQQVJFTlQgICAgICAgID0gTk8NCisNCisjIFNldCB0aGUgRE9UX01VTFRJX1RBUkdFVFMgdGFnIHRvIFlFUyBhbGxvdyBkb3QgdG8gZ2VuZXJhdGUgbXVsdGlwbGUgb3V0cHV0DQorIyBmaWxlcyBpbiBvbmUgcnVuIChpLmUuIG11bHRpcGxlIC1vIGFuZCAtVCBvcHRpb25zIG9uIHRoZSBjb21tYW5kIGxpbmUpLiBUaGlzDQorIyBtYWtlcyBkb3QgcnVuIGZhc3RlciwgYnV0IHNpbmNlIG9ubHkgbmV3ZXIgdmVyc2lvbnMgb2YgZG90ICg+MS44LjEwKQ0KKyMgc3VwcG9ydCB0aGlzLCB0aGlzIGZlYXR1cmUgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4NCisNCitET1RfTVVMVElfVEFSR0VUUyAgICAgID0gTk8NCisNCisjIElmIHRoZSBHRU5FUkFURV9MRUdFTkQgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwNCisjIGdlbmVyYXRlIGEgbGVnZW5kIHBhZ2UgZXhwbGFpbmluZyB0aGUgbWVhbmluZyBvZiB0aGUgdmFyaW91cyBib3hlcyBhbmQNCisjIGFycm93cyBpbiB0aGUgZG90IGdlbmVyYXRlZCBncmFwaHMuDQorDQorR0VORVJBVEVfTEVHRU5EICAgICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIERPVF9DTEVBTlVQIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsDQorIyByZW1vdmUgdGhlIGludGVybWVkaWF0ZSBkb3QgZmlsZXMgdGhhdCBhcmUgdXNlZCB0byBnZW5lcmF0ZQ0KKyMgdGhlIHZhcmlvdXMgZ3JhcGhzLg0KKw0KK0RPVF9DTEVBTlVQICAgICAgICAgICAgPSBZRVMNCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL2RvYy9kb3h5Z2VuL2hlYWRlci50ZXggYi9maW5hbC9ydW50aW1lL2RvYy9kb3h5Z2VuL2hlYWRlci50ZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJjNzVhMwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvZG9jL2RveHlnZW4vaGVhZGVyLnRleApAQCAtMCwwICsxLDkyIEBACislIExhdGV4IGhlYWRlciBmb3IgZG94eWdlbiAxLjguMy4xCitcZG9jdW1lbnRjbGFzc3tib29rfQorXHVzZXBhY2thZ2VbYTRwYXBlcix0b3A9Mi41Y20sYm90dG9tPTIuNWNtLGxlZnQ9Mi41Y20scmlnaHQ9Mi41Y21de2dlb21ldHJ5fQorXHVzZXBhY2thZ2V7bWFrZWlkeH0KK1x1c2VwYWNrYWdle25hdGJpYn0KK1x1c2VwYWNrYWdle2dyYXBoaWN4fQorXHVzZXBhY2thZ2V7bXVsdGljb2x9CitcdXNlcGFja2FnZXtmbG9hdH0KK1x1c2VwYWNrYWdle2xpc3RpbmdzfQorXHVzZXBhY2thZ2V7Y29sb3J9CitcdXNlcGFja2FnZXtpZnRoZW59CitcdXNlcGFja2FnZVt0YWJsZV17eGNvbG9yfQorXHVzZXBhY2thZ2V7dGV4dGNvbXB9CitcdXNlcGFja2FnZXthbGx0dH0KK1x1c2VwYWNrYWdle2lmcGRmfQorXGlmcGRmCitcdXNlcGFja2FnZVtwZGZ0ZXgsCisgICAgICAgICAgICBwYWdlYmFja3JlZj10cnVlLAorICAgICAgICAgICAgY29sb3JsaW5rcz10cnVlLAorICAgICAgICAgICAgbGlua2NvbG9yPWJsdWUsCisgICAgICAgICAgICB1bmljb2RlCisgICAgICAgICAgIF17aHlwZXJyZWZ9CitcZWxzZQorXHVzZXBhY2thZ2VbcHMycGRmLAorICAgICAgICAgICAgcGFnZWJhY2tyZWY9dHJ1ZSwKKyAgICAgICAgICAgIGNvbG9ybGlua3M9dHJ1ZSwKKyAgICAgICAgICAgIGxpbmtjb2xvcj1ibHVlLAorICAgICAgICAgICAgdW5pY29kZQorICAgICAgICAgICBde2h5cGVycmVmfQorXHVzZXBhY2thZ2V7cHNwaWN0dXJlfQorXGZpCitcdXNlcGFja2FnZVt1dGY4XXtpbnB1dGVuY30KK1x1c2VwYWNrYWdle21hdGhwdG14fQorXHVzZXBhY2thZ2Vbc2NhbGVkPS45MF17aGVsdmV0fQorXHVzZXBhY2thZ2V7Y291cmllcn0KK1x1c2VwYWNrYWdle3NlY3RzdHl9CitcdXNlcGFja2FnZXthbXNzeW1ifQorXHVzZXBhY2thZ2VbdGl0bGVzXXt0b2Nsb2Z0fQorXHVzZXBhY2thZ2V7ZG94eWdlbn0KK1xsc3RzZXR7bGFuZ3VhZ2U9QysrLGlucHV0ZW5jb2Rpbmc9dXRmOCxiYXNpY3N0eWxlPVxmb290bm90ZXNpemUsYnJlYWtsaW5lcz10cnVlLGJyZWFrYXR3aGl0ZXNwYWNlPXRydWUsdGFic2l6ZT00LG51bWJlcnM9bGVmdCB9CitcbWFrZWluZGV4Citcc2V0Y291bnRlcnt0b2NkZXB0aH17M30KK1xyZW5ld2NvbW1hbmR7XGZvb3RydWxld2lkdGh9ezAuNHB0fQorXHJlbmV3Y29tbWFuZHtcZmFtaWx5ZGVmYXVsdH17XHNmZGVmYXVsdH0KK1xoZnV6ej0xNXB0Citcc2V0bGVuZ3Roe1xlbWVyZ2VuY3lzdHJldGNofXsxNXB0fQorXGhiYWRuZXNzPTc1MAorXHRvbGVyYW5jZT03NTAKK1xiZWdpbntkb2N1bWVudH0KK1xoeXBlcnNldHVwe3BhZ2VhbmNob3I9ZmFsc2UsY2l0ZWNvbG9yPWJsdWV9CitcYmVnaW57dGl0bGVwYWdlfQorXHZzcGFjZSp7N2NtfQorXGJlZ2lue2NlbnRlcn0KK3tcTGFyZ2UgSW50ZWxcdGV4dHN1cGVyc2NyaXB0e1x0ZXh0cmVnaXN0ZXJlZH0gIE9wZW5NUFx0ZXh0c3VwZXJzY3JpcHR7Kn0gUnVudGltZSBMaWJyYXJ5IH1cXAorXHZzcGFjZSp7MWNtfQore1xsYXJnZSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAkZG94eWdlbnZlcnNpb24gfVxcCitcdnNwYWNlKnswLjVjbX0KK3tcc21hbGwgJGRhdGV0aW1lIH1cXAorXGVuZHtjZW50ZXJ9CitcZW5ke3RpdGxlcGFnZX0KKwore1xiZiBGVEMgT3B0aW1pemF0aW9uIE5vdGljZX0KK1xcCitJbnRlbCdzIGNvbXBpbGVycyBtYXkgb3IgbWF5IG5vdCBvcHRpbWl6ZSB0byB0aGUgc2FtZSBkZWdyZWUgZm9yIG5vbi1JbnRlbCBtaWNyb3Byb2Nlc3NvcnMgZm9yCitvcHRpbWl6YXRpb25zIHRoYXQgYXJlIG5vdCB1bmlxdWUgdG8gSW50ZWwgbWljcm9wcm9jZXNzb3JzLiBUaGVzZSBvcHRpbWl6YXRpb25zIGluY2x1ZGUgU1NFMiwKK1NTRTMsIGFuZCBTU0UzIGluc3RydWN0aW9uIHNldHMgYW5kIG90aGVyIG9wdGltaXphdGlvbnMuIEludGVsIGRvZXMgbm90IGd1YXJhbnRlZSB0aGUKK2F2YWlsYWJpbGl0eSwgZnVuY3Rpb25hbGl0eSwgb3IgZWZmZWN0aXZlbmVzcyBvZiBhbnkgb3B0aW1pemF0aW9uIG9uIG1pY3JvcHJvY2Vzc29ycyBub3QKK21hbnVmYWN0dXJlZCBieSBJbnRlbC4KKworTWljcm9wcm9jZXNzb3ItZGVwZW5kZW50IG9wdGltaXphdGlvbnMgaW4gdGhpcyBwcm9kdWN0IGFyZSBpbnRlbmRlZCBmb3IgdXNlIHdpdGggSW50ZWwKK21pY3JvcHJvY2Vzc29ycy4gQ2VydGFpbiBvcHRpbWl6YXRpb25zIG5vdCBzcGVjaWZpYyB0byBJbnRlbCBtaWNyb2FyY2hpdGVjdHVyZSBhcmUgcmVzZXJ2ZWQgZm9yCitJbnRlbCBtaWNyb3Byb2Nlc3NvcnMuIFBsZWFzZSByZWZlciB0byB0aGUgYXBwbGljYWJsZSBwcm9kdWN0IFVzZXIgYW5kIFJlZmVyZW5jZSBHdWlkZXMgZm9yCittb3JlIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgc3BlY2lmaWMgaW5zdHJ1Y3Rpb24gc2V0cyBjb3ZlcmVkIGJ5IHRoaXMgbm90aWNlLgorCitOb3RpY2UgcmV2aXNpb24gXCMyMDExMDgwNAorCit7XGJmIFRyYWRlbWFya3N9CitcXAorSW50ZWwsIFhlb24sIGFuZCBJbnRlbCBYZW9uIFBoaSBhcmUgdHJhZGVtYXJrcyBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBpbiB0aGUgVS5TLiBhbmQvb3Igb3RoZXIgY291bnRyaWVzLgorCitcdGV4dHN1cGVyc2NyaXB0eyp9IE90aGVyIG5hbWVzIGFuZCBicmFuZHMgbWF5IGJlIGNsYWltZWQgYXMgdGhlIHByb3BlcnR5IG9mIG90aGVycy4KKworVGhlIE9wZW5NUCBuYW1lIGFuZCB0aGUgT3Blbk1QIGxvZ28gYXJlIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiB0aGUgT3Blbk1QIEFyY2hpdGVjdHVyZSBSZXZpZXcgQm9hcmQuCisKK1RoaXMgZG9jdW1lbnQgaXMgQ29weXJpZ2h0IFx0ZXh0Y29weXJpZ2h0IDIwMTMsIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAKKyAKK1xjbGVhcmVtcHR5ZG91YmxlcGFnZQorXHBhZ2VudW1iZXJpbmd7cm9tYW59CitcdGFibGVvZmNvbnRlbnRzCitcY2xlYXJlbXB0eWRvdWJsZXBhZ2UKK1xwYWdlbnVtYmVyaW5ne2FyYWJpY30KK1xoeXBlcnNldHVwe3BhZ2VhbmNob3I9dHJ1ZSxjaXRlY29sb3I9Ymx1ZX0KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvZG9jL2RveHlnZW4vbGlib21wX2ludGVyZmFjZS5oIGIvZmluYWwvcnVudGltZS9kb2MvZG94eWdlbi9saWJvbXBfaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRiZTc1YwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvZG9jL2RveHlnZW4vbGlib21wX2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsMzI2IEBACisvLyBUaGlzIGZpbGUgZG9lcyBub3QgY29udGFpbiBhbnkgY29kZTsgaXQganVzdCBjb250YWlucyBhZGRpdGlvbmFsIHRleHQgYW5kIGZvcm1hdHRpbmcNCisvLyBmb3IgZG94eWdlbi4NCisNCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKw0KKy8qISBAbWFpbnBhZ2UgSW50ZWwmcmVnOyZuYnNwOyBPcGVuTVAqIFJ1bnRpbWUgTGlicmFyeSBJbnRlcmZhY2UNCitAc2VjdGlvbiBzZWNfaW50cm8gSW50cm9kdWN0aW9uDQorDQorVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIGludGVyZmFjZSBwcm92aWRlZCBieSB0aGUNCitJbnRlbCZyZWc7Jm5ic3A7T3Blbk1QXG90aGVyIHJ1bnRpbWUgbGlicmFyeSB0byB0aGUgY29tcGlsZXIuDQorUm91dGluZXMgdGhhdCBhcmUgZGlyZWN0bHkgY2FsbGVkIGFzIHNpbXBsZSBmdW5jdGlvbnMgYnkgdXNlciBjb2RlIGFyZQ0KK25vdCBjdXJyZW50bHkgZGVzY3JpYmVkIGhlcmUsIHNpbmNlIHRoZWlyIGRlZmluaXRpb24gaXMgaW4gdGhlIE9wZW5NUA0KK3NwZWNpZmljYXRpb24gYXZhaWxhYmxlIGZyb20gaHR0cDovL29wZW5tcC5vcmcNCisNCitUaGUgYWltIGhlcmUgaXMgdG8gZXhwbGFpbiB0aGUgaW50ZXJmYWNlIGZyb20gdGhlIGNvbXBpbGVyIHRvIHRoZSBydW50aW1lLg0KKw0KK1RoZSBvdmVyYWxsIGRlc2lnbiBpcyBkZXNjcmliZWQsIGFuZCBlYWNoIGZ1bmN0aW9uIGluIHRoZSBpbnRlcmZhY2UNCitoYXMgaXRzIG93biBkZXNjcmlwdGlvbi4gKEF0IGxlYXN0LCB0aGF0J3MgdGhlIGFtYml0aW9uLCB3ZSBtYXkgbm90IGJlIHRoZXJlIHlldCkuDQorDQorQHNlY3Rpb24gc2VjX2J1aWxkaW5nIEJ1aWxkaW5nIHRoZSBSdW50aW1lDQorRm9yIHRoZSBpbXBhdGllbnQsIHdlIGNvdmVyIGJ1aWxkaW5nIHRoZSBydW50aW1lIGFzIHRoZSBmaXJzdCB0b3BpYyBoZXJlLg0KKw0KK0EgdG9wLWxldmVsIE1ha2VmaWxlIGlzIHByb3ZpZGVkIHRoYXQgYXR0ZW1wdHMgdG8gZGVyaXZlIGEgc3VpdGFibGUNCitjb25maWd1cmF0aW9uIGZvciB0aGUgbW9zdCBjb21tb25seSB1c2VkIGVudmlyb25tZW50cy4gIFRvIHNlZSB0aGUNCitkZWZhdWx0IHNldHRpbmdzLCB0eXBlOg0KK0Bjb2RlDQorJSBtYWtlIGluZm8NCitAZW5kY29kZQ0KKw0KK1lvdSBjYW4gY2hhbmdlIHRoZSBNYWtlZmlsZSdzIGJlaGF2aW9yIHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25zOg0KKw0KKyAtIDxiPm9tcF9yb290PC9iPjogICAgVGhlIHBhdGggdG8gdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgdG9wLWxldmVsDQorICAgICAgICAgICAgIE1ha2VmaWxlLiAgQnkgZGVmYXVsdCwgdGhpcyB3aWxsIHRha2Ugb24gdGhlIHZhbHVlIG9mIHRoZQ0KKyAgICAgICAgICAgICBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5Lg0KKw0KKyAtIDxiPm9tcF9vczwvYj46ICAgICAgT3BlcmF0aW5nIHN5c3RlbS4gIEJ5IGRlZmF1bHQsIHRoZSBidWlsZCB3aWxsIGF0dGVtcHQgdG8NCisgICAgICAgICAgICAgZGV0ZWN0IHRoaXMuIEN1cnJlbnRseSBzdXBwb3J0cyAibGludXgiLCAibWFjb3MiLCBhbmQNCisgICAgICAgICAgICAgIndpbmRvd3MiLg0KKw0KKyAtIDxiPmFyY2g8L2I+OiAgICAgICAgQXJjaGl0ZWN0dXJlLiBCeSBkZWZhdWx0LCB0aGUgYnVpbGQgd2lsbCBhdHRlbXB0IHRvDQorCSAgICAgZGV0ZWN0IHRoaXMgaWYgbm90IHNwZWNpZmllZCBieSB0aGUgdXNlci4gQ3VycmVudGx5IA0KKwkgICAgIHN1cHBvcnRlZCB2YWx1ZXMgYXJlDQorICAgICAgICAgICAgIC0gIjMyIiBmb3IgSUEtMzIgYXJjaGl0ZWN0dXJlIA0KKyAgICAgICAgICAgICAtICIzMmUiIGZvciBJbnRlbCZyZWc7Jm5ic3A7NjQgYXJjaGl0ZWN0dXJlDQorICAgICAgICAgICAgIC0gIm1pYyIgZm9yIEludGVsJnJlZzsmbmJzcDtNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUgKA0KKyAgICAgICAgICAgICBJZiAibWljIiBpcyBzcGVjaWZpZWQgdGhlbiAiaWNjIiB3aWxsIGJlIHVzZWQgYXMgdGhlDQorICAgICAgICAgICAgIGNvbXBpbGVyLCBhbmQgYXBwcm9wcmlhdGUgazFvbSBiaW51dGlscyB3aWxsIGJlIHVzZWQuIFRoZQ0KKyAgICAgICAgICAgICBuZWNlc3NhcnkgcGFja2FnZXMgbXVzdCBiZSBpbnN0YWxsZWQgb24gdGhlIGJ1aWxkIG1hY2hpbmUNCisgICAgICAgICAgICAgZm9yIHRoaXMgdG8gYmUgcG9zc2libGUsIGJ1dCBhbg0KKwkgICAgIEludGVsJnJlZzsmbmJzcDtYZW9uIFBoaSZ0cmFkZTsmbmJzcDsNCisgICAgICAgICAgICAgY29wcm9jZXNzb3IgaXMgbm90IHJlcXVpcmVkIHRvIGJ1aWxkIHRoZSBsaWJyYXJ5KS4NCisNCisgLSA8Yj5jb21waWxlcjwvYj46ICAgIFdoaWNoIGNvbXBpbGVyIHRvIHVzZSBmb3IgdGhlIGJ1aWxkLiAgRGVmYXVsdHMgdG8gImljYyINCisgICAgICAgICAgICAgb3IgImljbCIgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiBvbXBfb3MuIEFsc28gc3VwcG9ydHMNCisgICAgICAgICAgICAgImdjYyIgd2hlbiBvbXBfb3MgaXMgImxpbnV4IiBmb3IgZ2NjXG90aGVyIHZlcnNpb25zDQorICAgICAgICAgICAgIDQuNi4yIGFuZCBoaWdoZXIuIEZvciBpY2Mgb24gT1MgWFxvdGhlciwgT1MgWFxvdGhlciB2ZXJzaW9ucyANCisJICAgICBncmVhdGVyIHRoYW4gMTAuNiBhcmUgbm90IHN1cHBvcnRlZCBjdXJyZW50bHkuIEFsc28sIGljYw0KKwkgICAgIHZlcnNpb24gMTMuMCBpcyBub3Qgc3VwcG9ydGVkLiBUaGUgc2VsZWN0ZWQgY29tcGlsZXIgc2hvdWxkIGJlDQorICAgICAgICAgICAgIGluc3RhbGxlZCBhbmQgaW4gdGhlIHVzZXIncyBwYXRoLiBUaGUgY29ycmVzcG9uZGluZw0KKyAgICAgICAgICAgICBGb3J0cmFuIGNvbXBpbGVyIHNob3VsZCBhbHNvIGJlIGluIHRoZSBwYXRoLg0KKw0KKyAtIDxiPm1vZGU8L2I+OiAgICAgICAgTGlicmFyeSBtb2RlOiBkZWZhdWx0IGlzICJyZWxlYXNlIi4gIEFsc28gc3VwcG9ydHMgImRlYnVnIi4NCisNCitUbyB1c2UgYW55IG9mIHRoZSBvcHRpb25zIGFib3ZlLCBzaW1wbGUgYWRkICZsdDtvcHRpb25fbmFtZSZndDs9Jmx0O3ZhbHVlJmd0Oy4gIEZvcg0KK2V4YW1wbGUsIGlmIHlvdSB3YW50IHRvIGJ1aWxkIHdpdGggZ2NjIGluc3RlYWQgb2YgaWNjLCB0eXBlOg0KK0Bjb2RlDQorJSBtYWtlIGNvbXBpbGVyPWdjYw0KK0BlbmRjb2RlDQorDQorVW5kZXJuZWF0aCB0aGUgaG9vZCBvZiB0aGUgdG9wLWxldmVsIE1ha2VmaWxlLCB0aGUgcnVudGltZSBpcyBidWlsdCBieQ0KK2EgcGVybCBzY3JpcHQgdGhhdCBpbiB0dXJuIGRyaXZlcyBhIGRldGFpbGVkIHJ1bnRpbWUgc3lzdGVtIG1ha2UuICBUaGUNCitzY3JpcHQgY2FuIGJlIGZvdW5kIGF0IDx0dD50b29scy9idWlsZC5wbDwvdHQ+LCBhbmQgd2lsbCBwcmludA0KK2luZm9ybWF0aW9uIGFib3V0IGFsbCBpdHMgZmxhZ3MgYW5kIGNvbnRyb2xzIGlmIGludm9rZWQgYXMgDQorQGNvZGUgDQorJSB0b29scy9idWlsZC5wbCAtLWhlbHAgDQorQGVuZGNvZGUNCisNCitJZiBpbnZva2VkIHdpdGggbm8gYXJndW1lbnRzLCBpdCB3aWxsIHRyeSB0byBidWlsZCBhIHNldCBvZiBsaWJyYXJpZXMNCit0aGF0IGFyZSBhcHByb3ByaWF0ZSBmb3IgdGhlIG1hY2hpbmUgb24gd2hpY2ggdGhlIGJ1aWxkIGlzIGhhcHBlbmluZy4gDQorVGhlcmUgYXJlIG1hbnkgb3B0aW9ucyBmb3IgYnVpbGRpbmcgb3V0IG9mIHRyZWUsIGFuZCBjb25maWd1cmluZyBsaWJyYXJ5DQorZmVhdHVyZXMgdGhhdCBjYW4gYWxzbyBiZSB1c2VkLiBDb25zdWx0IHRoZSA8dHQ+LS1oZWxwPC90dD4gb3V0cHV0IGZvciBkZXRhaWxzLg0KKw0KK0BzZWN0aW9uIHNlY19zdXBwb3J0ZWQgU3VwcG9ydGVkIFJUTCBCdWlsZCBDb25maWd1cmF0aW9ucw0KKw0KK1RoZSBhcmNoaXRlY3R1cmVzIHN1cHBvcnRlZCBhcmUgSUEtMzIgYXJjaGl0ZWN0dXJlLCBJbnRlbCZyZWc7Jm5ic3A7IDY0LCBhbmQNCitJbnRlbCZyZWc7Jm5ic3A7IE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZS4gIFRoZSBidWlsZCBjb25maWd1cmF0aW9ucw0KK3N1cHBvcnRlZCBhcmUgc2hvd24gaW4gdGhlIHRhYmxlIGJlbG93Lg0KKw0KKzx0YWJsZSBib3JkZXI9MT4NCis8dHI+PHRoPiA8dGg+aWNjL2ljbDx0aD5nY2MNCis8dHI+PHRkPkxpbnV4XG90aGVyIE9TPHRkPlllcygxLDUpPHRkPlllcygyLDQpDQorPHRyPjx0ZD5PUyBYXG90aGVyPHRkPlllcygxLDMsNCk8dGQ+Tm8NCis8dHI+PHRkPldpbmRvd3Ncb3RoZXIgT1M8dGQ+WWVzKDEsNCk8dGQ+Tm8NCis8L3RhYmxlPg0KKygxKSBPbiBJQS0zMiBhcmNoaXRlY3R1cmUgYW5kIEludGVsJnJlZzsmbmJzcDsgNjQsIGljYy9pY2wgdmVyc2lvbnMgMTIueCANCisgICAgYXJlIHN1cHBvcnRlZCAoMTIuMSBpcyByZWNvbW1lbmRlZCkuPGJyPg0KKygyKSBnY2MgdmVyc2lvbiA0LjYuMiBpcyBzdXBwb3J0ZWQuPGJyPg0KKygzKSBGb3IgaWNjIG9uIE9TIFhcb3RoZXIsIE9TIFhcb3RoZXIgdmVyc2lvbiAxMC41LjggaXMgc3VwcG9ydGVkLjxicj4NCisoNCkgSW50ZWwmcmVnOyZuYnNwOyBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUgbm90IHN1cHBvcnRlZC48YnI+DQorKDUpIE9uIEludGVsJnJlZzsmbmJzcDsgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlLCBpY2MvaWNsIHZlcnNpb25zIDEzLjAgb3IgbGF0ZXIgYXJlIHJlcXVpcmVkLg0KKw0KK0BzZWN0aW9uIHNlY19mcm9udGVuZCBGcm9udC1lbmQgQ29tcGlsZXJzIHRoYXQgd29yayB3aXRoIHRoaXMgUlRMDQorDQorVGhlIGZvbGxvd2luZyBjb21waWxlcnMgYXJlIGtub3duIHRvIGRvIGNvbXBhdGlibGUgY29kZSBnZW5lcmF0aW9uIGZvcg0KK3RoaXMgUlRMOiBpY2MvaWNsLCBnY2MuICBDb2RlIGdlbmVyYXRpb24gaXMgZGlzY3Vzc2VkIGluIG1vcmUgZGV0YWlsDQorbGF0ZXIgaW4gdGhpcyBkb2N1bWVudC4NCisNCitAc2VjdGlvbiBzZWNfb3V0bGluaW5nIE91dGxpbmluZw0KKw0KK1RoZSBydW50aW1lIGludGVyZmFjZSBpcyBiYXNlZCBvbiB0aGUgaWRlYSB0aGF0IHRoZSBjb21waWxlcg0KKyJvdXRsaW5lcyIgc2VjdGlvbnMgb2YgY29kZSB0aGF0IGFyZSB0byBydW4gaW4gcGFyYWxsZWwgaW50byBzZXBhcmF0ZQ0KK2Z1bmN0aW9ucyB0aGF0IGNhbiB0aGVuIGJlIGludm9rZWQgaW4gbXVsdGlwbGUgdGhyZWFkcy4gIEZvciBpbnN0YW5jZSwNCitzaW1wbGUgY29kZSBsaWtlIHRoaXMNCisNCitAY29kZQ0KK3ZvaWQgZm9vKCkNCit7DQorI3ByYWdtYSBvbXAgcGFyYWxsZWwNCisgICAgew0KKyAgICAgICAgLi4uIGRvIHNvbWV0aGluZyAuLi4NCisgICAgfQ0KK30NCitAZW5kY29kZQ0KK2lzIGNvbnZlcnRlZCBpbnRvIHNvbWV0aGluZyB0aGF0IGxvb2tzIGNvbmNlcHR1YWxseSBsaWtlIHRoaXMgKHdoZXJlDQordGhlIG5hbWVzIHVzZWQgYXJlIG1lcmVseSBpbGx1c3RyYXRpdmU7IHRoZSByZWFsIGxpYnJhcnkgZnVuY3Rpb24NCituYW1lcyB3aWxsIGJlIHVzZWQgbGF0ZXIgYWZ0ZXIgd2UndmUgZGlzY3Vzc2VkIHNvbWUgbW9yZSBpc3N1ZXMuLi4pDQorDQorQGNvZGUNCitzdGF0aWMgdm9pZCBvdXRsaW5lZEZvb0JvZHkoKQ0KK3sNCisgICAgLi4uIGRvIHNvbWV0aGluZyAuLi4NCit9DQorDQordm9pZCBmb28oKQ0KK3sNCisgICAgX19PTVBfcnVudGltZV9mb3JrKG91dGxpbmVkRm9vQm9keSwgKHZvaWQqKTApOyAgIC8vIE5vdCB0aGUgcmVhbCBmdW5jdGlvbiBuYW1lIQ0KK30NCitAZW5kY29kZQ0KKw0KK0BzdWJzZWN0aW9uIFNFQ19TSEFSRURWQVJTIEFkZHJlc3Npbmcgc2hhcmVkIHZhcmlhYmxlcw0KKw0KK0luIHJlYWwgdXNlcyBvZiB0aGUgT3Blbk1QXG90aGVyIEFQSSB0aGVyZSBhcmUgbm9ybWFsbHkgcmVmZXJlbmNlcyANCitmcm9tIHRoZSBvdXRsaW5lZCBjb2RlICB0byBzaGFyZWQgdmFyaWFibGVzIHRoYXQgYXJlIGluIHNjb3BlIGluIHRoZSBjb250YWluaW5nIGZ1bmN0aW9uLiANCitUaGVyZWZvcmUgdGhlIGNvbnRhaW5pbmcgZnVuY3Rpb24gbXVzdCBiZSBhYmxlIHRvIGFkZHJlc3MgDQordGhlc2UgdmFyaWFibGVzLiBUaGUgcnVudGltZSBzdXBwb3J0cyB0d28gYWx0ZXJuYXRlIHdheXMgb2YgZG9pbmcNCit0aGlzLg0KKw0KK0BzdWJzdWJzZWN0aW9uIFNFQ19TRUNfT1QgQ3VycmVudCBUZWNobmlxdWUNCitUaGUgdGVjaG5pcXVlIGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgdGhlIHJ1bnRpbWUgbGlicmFyeSBpcyB0byByZWNlaXZlDQorYSBzZXBhcmF0ZSBwb2ludGVyIHRvIGVhY2ggc2hhcmVkIHZhcmlhYmxlIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGZyb20NCit0aGUgb3V0bGluZWQgZnVuY3Rpb24uICBUaGlzIGlzIHdoYXQgaXMgc2hvd24gaW4gdGhlIGV4YW1wbGUgYmVsb3cuDQorDQorV2UgaG9wZSBzb29uIHRvIHByb3ZpZGUgYW4gYWx0ZXJuYXRpdmUgaW50ZXJmYWNlIHRvIHN1cHBvcnQgdGhlDQorYWx0ZXJuYXRlIGltcGxlbWVudGF0aW9uIGRlc2NyaWJlZCBpbiB0aGUgbmV4dCBzZWN0aW9uLiBUaGUNCithbHRlcm5hdGl2ZSBpbXBsZW1lbnRhdGlvbiBoYXMgcGVyZm9ybWFuY2UgYWR2YW50YWdlcyBmb3Igc21hbGwNCitwYXJhbGxlbCByZWdpb25zIHRoYXQgaGF2ZSBtYW55IHNoYXJlZCB2YXJpYWJsZXMuDQorDQorQHN1YnN1YnNlY3Rpb24gU0VDX1NFQ19QVCBGdXR1cmUgVGVjaG5pcXVlDQorVGhlIGlkZWEgaXMgdG8gdHJlYXQgdGhlIG91dGxpbmVkIGZ1bmN0aW9uIGFzIHRob3VnaCBpdA0KK3dlcmUgYSBsZXhpY2FsbHkgbmVzdGVkIGZ1bmN0aW9uLCBhbmQgcGFzcyBpdCBhIHNpbmdsZSBhcmd1bWVudCB3aGljaA0KK2lzIHRoZSBwb2ludGVyIHRvIHRoZSBwYXJlbnQncyBzdGFjayBmcmFtZS4gUHJvdmlkZWQgdGhhdCB0aGUgY29tcGlsZXINCitrbm93cyB0aGUgbGF5b3V0IG9mIHRoZSBwYXJlbnQgZnJhbWUgd2hlbiBpdCBpcyBnZW5lcmF0aW5nIHRoZSBvdXRsaW5lZA0KK2Z1bmN0aW9uIGl0IGNhbiB0aGVuIGFjY2VzcyB0aGUgdXAtbGV2ZWwgdmFyaWFibGVzIGF0IGFwcHJvcHJpYXRlDQorb2Zmc2V0cyBmcm9tIHRoZSBwYXJlbnQgZnJhbWUuICBUaGlzIGlzIGEgY2xhc3NpY2FsIGNvbXBpbGVyIHRlY2huaXF1ZQ0KK2Zyb20gdGhlIDE5NjBzIHRvIHN1cHBvcnQgbGFuZ3VhZ2VzIGxpa2UgQWxnb2wgKGFuZCBpdHMgZGVzY2VuZGFudHMpDQordGhhdCBzdXBwb3J0IGxleGljYWxseSBuZXN0ZWQgZnVuY3Rpb25zLg0KKw0KK1RoZSBtYWluIGJlbmVmaXQgb2YgdGhpcyB0ZWNobmlxdWUgaXMgdGhhdCB0aGVyZSBpcyBubyBjb2RlIHJlcXVpcmVkDQorYXQgdGhlIGZvcmsgcG9pbnQgdG8gbWFyc2hhbCB0aGUgYXJndW1lbnRzIHRvIHRoZSBvdXRsaW5lZCBmdW5jdGlvbi4NCitTaW5jZSB0aGUgcnVudGltZSBrbm93cyBzdGF0aWNhbGx5IGhvdyBtYW55IGFyZ3VtZW50cyBtdXN0IGJlIHBhc3NlZCB0byB0aGUNCitvdXRsaW5lZCBmdW5jdGlvbiwgaXQgY2FuIGVhc2lseSBjb3B5IHRoZW0gdG8gdGhlIHRocmVhZCdzIHN0YWNrDQorZnJhbWUuICBUaGVyZWZvcmUgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBmb3JrIGNvZGUgaXMgaW5kZXBlbmRlbnQgb2YNCit0aGUgbnVtYmVyIG9mIHNoYXJlZCB2YXJpYWJsZXMgdGhhdCBhcmUgYWNjZXNzZWQgYnkgdGhlIG91dGxpbmVkDQorZnVuY3Rpb24uDQorDQorSWYgaXQgaXMgaGFyZCB0byBkZXRlcm1pbmUgdGhlIHN0YWNrIGxheW91dCBvZiB0aGUgcGFyZW50IHdoaWxlIGdlbmVyYXRpbmcgdGhlDQorb3V0bGluZWQgY29kZSwgaXQgaXMgc3RpbGwgcG9zc2libGUgdG8gdXNlIHRoaXMgYXBwcm9hY2ggYnkgY29sbGVjdGluZyBhbGwgb2YNCit0aGUgdmFyaWFibGVzIGluIHRoZSBwYXJlbnQgdGhhdCBhcmUgYWNjZXNzZWQgZnJvbSBvdXRsaW5lZCBmdW5jdGlvbnMgaW50bw0KK2Egc2luZ2xlIGBzdHJ1Y3RgIHdoaWNoIGlzIHBsYWNlZCBvbiB0aGUgc3RhY2ssIGFuZCB3aG9zZSBhZGRyZXNzIGlzIHBhc3NlZA0KK3RvIHRoZSBvdXRsaW5lZCBmdW5jdGlvbnMuIEluIHRoaXMgd2F5IHRoZSBvZmZzZXRzIG9mIHRoZSBzaGFyZWQgdmFyaWFibGVzDQorYXJlIGtub3duIChzaW5jZSB0aGV5IGFyZSBpbnNpZGUgdGhlIHN0cnVjdCkgd2l0aG91dCBuZWVkaW5nIHRvIGtub3cNCit0aGUgY29tcGxldGUgbGF5b3V0IG9mIHRoZSBwYXJlbnQgc3RhY2stZnJhbWUuIEZyb20gdGhlIHBvaW50IG9mIHZpZXcNCitvZiB0aGUgcnVudGltZSBlaXRoZXIgb2YgdGhlc2UgdGVjaG5pcXVlcyBpcyBlcXVpdmFsZW50LCBzaW5jZSBpbiBlaXRoZXINCitjYXNlIGl0IG9ubHkgaGFzIHRvIHBhc3MgYSBzaW5nbGUgYXJndW1lbnQgdG8gdGhlIG91dGxpbmVkIGZ1bmN0aW9uIHRvIGFsbG93IA0KK2l0IHRvIGFjY2VzcyBzaGFyZWQgdmFyaWFibGVzLg0KKw0KK0Egc2NoZW1lIGxpa2UgdGhpcyBpcyBob3cgZ2NjXG90aGVyIGdlbmVyYXRlcyBvdXRsaW5lZCBmdW5jdGlvbnMuDQorDQorQHNlY3Rpb24gU0VDX0lOVEVSRkFDRVMgTGlicmFyeSBJbnRlcmZhY2VzDQorVGhlIGxpYnJhcnkgZnVuY3Rpb25zIHVzZWQgZm9yIHNwZWNpZmljIHBhcnRzIG9mIHRoZSBPcGVuTVBcb3RoZXIgbGFuZ3VhZ2UgaW1wbGVtZW50YXRpb24NCithcmUgZG9jdW1lbnRlZCBpbiBkaWZmZXJlbnQgbW9kdWxlcy4NCisNCisgLSBAcmVmIEJBU0lDX1RZUEVTIGZ1bmRhbWVudGFsIHR5cGVzIHVzZWQgYnkgdGhlIHJ1bnRpbWUgaW4gbWFueSBwbGFjZXMNCisgLSBAcmVmIERFUFJFQ0FURUQgIGZ1bmN0aW9ucyB0aGF0IGFyZSBpbiB0aGUgbGlicmFyeSBidXQgYXJlIG5vIGxvbmdlciByZXF1aXJlZA0KKyAtIEByZWYgU1RBUlRVUF9TSFVURE9XTiBmdW5jdGlvbnMgZm9yIGluaXRpYWxpemluZyBhbmQgZmluYWxpemluZyB0aGUgcnVudGltZQ0KKyAtIEByZWYgUEFSQUxMRUwgZnVuY3Rpb25zIGZvciBpbXBsZW1lbnRpbmcgYG9tcCBwYXJhbGxlbGANCisgLSBAcmVmIFRIUkVBRF9TVEFURVMgZnVuY3Rpb25zIGZvciBzdXBwb3J0aW5nIHRocmVhZCBzdGF0ZSBpbnF1aXJpZXMNCisgLSBAcmVmIFdPUktfU0hBUklORyBmdW5jdGlvbnMgZm9yIHdvcmsgc2hhcmluZyBjb25zdHJ1Y3RzIHN1Y2ggYXMgYG9tcCBmb3JgLCBgb21wIHNlY3Rpb25zYA0KKyAtIEByZWYgVEhSRUFEUFJJVkFURSBmdW5jdGlvbnMgdG8gc3VwcG9ydCB0aHJlYWQgcHJpdmF0ZSBkYXRhLCBjb3B5aW4gZXRjDQorIC0gQHJlZiBTWU5DSFJPTklaQVRJT04gZnVuY3Rpb25zIHRvIHN1cHBvcnQgYG9tcCBjcml0aWNhbGAsIGBvbXAgYmFycmllcmAsIGBvbXAgbWFzdGVyYCwgcmVkdWN0aW9ucyBldGMNCisgLSBAcmVmIEFUT01JQ19PUFMgZnVuY3Rpb25zIHRvIHN1cHBvcnQgYXRvbWljIG9wZXJhdGlvbnMNCisgLSBEb2N1bWVudGF0aW9uIG9uIHRhc2tpbmcgaGFzIHN0aWxsIHRvIGJlIHdyaXR0ZW4uLi4NCisNCitAc2VjdGlvbiBTRUNfRVhBTVBMRVMgRXhhbXBsZXMNCitAc3Vic2VjdGlvbiBTRUNfV09SS1NIQVJJTkdfRVhBTVBMRSBXb3JrIFNoYXJpbmcgRXhhbXBsZQ0KK1RoaXMgZXhhbXBsZSBzaG93cyB0aGUgY29kZSBnZW5lcmF0ZWQgZm9yIGEgcGFyYWxsZWwgZm9yIHdpdGggcmVkdWN0aW9uIGFuZCBkeW5hbWljIHNjaGVkdWxpbmcuDQorDQorQGNvZGUNCitleHRlcm4gZmxvYXQgZm9vKCB2b2lkICk7DQorDQoraW50IG1haW4gKCkgew0KKyAgICBpbnQgaTsgDQorICAgIGZsb2F0IHIgPSAwLjA7IA0KKyAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYykgcmVkdWN0aW9uKCs6cikgDQorICAgIGZvciAoIGkgPSAwOyBpIDwgMTA7IGkgKysgKSB7DQorICAgICAgICByICs9IGZvbygpOyANCisgICAgfQ0KK30NCitAZW5kY29kZQ0KKw0KK1RoZSB0cmFuc2Zvcm1lZCBjb2RlIGxvb2tzIGxpa2UgdGhpcy4NCitAY29kZQ0KK2V4dGVybiBmbG9hdCBmb28oIHZvaWQgKTsgDQorDQoraW50IG1haW4gKCkgew0KKyAgICBzdGF0aWMgaW50IHplcm8gPSAwOyANCisgICAgYXV0byBpbnQgZ3RpZDsgDQorICAgIGF1dG8gZmxvYXQgciA9IDAuMDsgDQorICAgIF9fa21wY19iZWdpbiggJiBsb2MzLCAwICk7IA0KKyAgICAvLyBUaGUgZ3RpZCBpcyBub3QgYWN0dWFsbHkgcmVxdWlyZWQgaW4gdGhpcyBleGFtcGxlIHNvIGNvdWxkIGJlIG9taXR0ZWQ7DQorICAgIC8vIFdlIHNob3cgaXRzIGluaXRpYWxpemF0aW9uIGhlcmUgYmVjYXVzZSBpdCBpcyBvZnRlbiByZXF1aXJlZCBmb3IgY2FsbHMgaW50bw0KKyAgICAvLyB0aGUgcnVudGltZSBhbmQgc2hvdWxkIGJlIGxvY2FsbHkgY2FjaGVkIGxpa2UgdGhpcy4NCisgICAgZ3RpZCA9IF9fa21wY19nbG9iYWwgdGhyZWFkIG51bSggJiBsb2MzICk7IA0KKyAgICBfX2ttcGNfZm9yayBjYWxsKCAmIGxvYzcsIDEsIG1haW5fN19wYXJhbGxlbF8zLCAmIHIgKTsgDQorICAgIF9fa21wY19lbmQoICYgbG9jMCApOyANCisgICAgcmV0dXJuIDA7IA0KK30NCisNCitzdHJ1Y3QgbWFpbl8xMF9yZWR1Y3Rpb25fdF81IHsgZmxvYXQgcl8xMF9ycHI7IH07IA0KKw0KK3N0YXRpYyBrbXBfY3JpdGljYWxfbmFtZSBsY2sgPSB7IDAgfTsNCitzdGF0aWMgaWRlbnRfdCBsb2MxMDsgLy8gbG9jMTAuZmxhZ3Mgc2hvdWxkIGNvbnRhaW4gS01QX0lERU5UX0FUT01JQ19SRURVQ0UgYml0IHNldCANCisgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgY29tcGlsZXIgaGFzIGdlbmVyYXRlZCBhbiBhdG9taWMgcmVkdWN0aW9uLg0KKw0KK3ZvaWQgbWFpbl83X3BhcmFsbGVsXzMoIGludCAqZ3RpZCwgaW50ICpidGlkLCBmbG9hdCAqcl83X3NocCApIHsNCisgICAgYXV0byBpbnQgaV83X3ByOyANCisgICAgYXV0byBpbnQgbG93ZXIsIHVwcGVyLCBsaXRlciwgaW5jcjsgDQorICAgIGF1dG8gc3RydWN0IG1haW5fMTBfcmVkdWN0aW9uX3RfNSByZWR1Y2U7IA0KKyAgICByZWR1Y2Uucl8xMF9ycHIgPSAwLkY7IA0KKyAgICBsaXRlciA9IDA7IA0KKyAgICBfX2ttcGNfZGlzcGF0Y2hfaW5pdF80KCAmIGxvYzcsKmd0aWQsIDM1LCAwLCA5LCAxLCAxICk7IA0KKyAgICB3aGlsZSAoIF9fa21wY19kaXNwYXRjaF9uZXh0XzQoICYgbG9jNywgKmd0aWQsICYgbGl0ZXIsICYgbG93ZXIsICYgdXBwZXIsICYgaW5jciApICkgew0KKyAgICAgICAgZm9yKCBpXzdfcHIgPSBsb3dlcjsgdXBwZXIgPj0gaV83X3ByOyBpXzdfcHIgKysgKSANCisgICAgICAgICAgcmVkdWNlLnJfMTBfcnByICs9IGZvbygpOyANCisgICAgfQ0KKyAgICBzd2l0Y2goIF9fa21wY19yZWR1Y2Vfbm93YWl0KCAmIGxvYzEwLCAqZ3RpZCwgMSwgNCwgJiByZWR1Y2UsIG1haW5fMTBfcmVkdWNlXzUsICYgbGNrICkgKSB7DQorICAgICAgICBjYXNlIDE6DQorICAgICAgICAgICAqcl83X3NocCArPSByZWR1Y2Uucl8xMF9ycHI7DQorICAgICAgICAgICBfX2ttcGNfZW5kX3JlZHVjZV9ub3dhaXQoICYgbG9jMTAsICpndGlkLCAmIGxjayApOw0KKyAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIDI6DQorICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGQoICYgbG9jMTAsICpndGlkLCByXzdfc2hwLCByZWR1Y2Uucl8xMF9ycHIgKTsNCisgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDo7DQorICAgIH0NCit9IA0KKw0KK3ZvaWQgbWFpbl8xMF9yZWR1Y2VfNSggc3RydWN0IG1haW5fMTBfcmVkdWN0aW9uX3RfNSAqcmVkdWNlX2xocywgDQorICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbWFpbl8xMF9yZWR1Y3Rpb25fdF81ICpyZWR1Y2VfcmhzICkgDQoreyANCisgICAgcmVkdWNlX2xocy0+cl8xMF9ycHIgKz0gcmVkdWNlX3Jocy0+cl8xMF9ycHI7IA0KK30NCitAZW5kY29kZQ0KKw0KK0BkZWZncm91cCBCQVNJQ19UWVBFUyBCYXNpYyBUeXBlcw0KK1R5cGVzIHRoYXQgYXJlIHVzZWQgdGhyb3VnaG91dCB0aGUgcnVudGltZS4NCisNCitAZGVmZ3JvdXAgREVQUkVDQVRFRCBEZXByZWNhdGVkIEZ1bmN0aW9ucw0KK0Z1bmN0aW9ucyBpbiB0aGlzIGdyb3VwIGFyZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgb25seSwgYW5kDQorc2hvdWxkIG5vdCBiZSB1c2VkIGluIG5ldyBjb2RlLg0KKw0KK0BkZWZncm91cCBTVEFSVFVQX1NIVVRET1dOIFN0YXJ0dXAgYW5kIFNodXRkb3duDQorVGhlc2UgZnVuY3Rpb25zIGFyZSBmb3IgbGlicmFyeSBpbml0aWFsaXphdGlvbiBhbmQgc2h1dGRvd24uDQorDQorQGRlZmdyb3VwIFBBUkFMTEVMIFBhcmFsbGVsIChmb3JrL2pvaW4pDQorVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkIGZvciBpbXBsZW1lbnRpbmcgPHR0PlwjcHJhZ21hIG9tcCBwYXJhbGxlbDwvdHQ+Lg0KKw0KK0BkZWZncm91cCBUSFJFQURfU1RBVEVTIFRocmVhZCBJbmZvcm1hdGlvbg0KK1RoZXNlIGZ1bmN0aW9ucyByZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgdGhyZWFkLg0KKw0KK0BkZWZncm91cCBXT1JLX1NIQVJJTkcgV29yayBTaGFyaW5nDQorVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkIGZvciBpbXBsZW1lbnRpbmcgDQorPHR0PlwjcHJhZ21hIG9tcCBmb3I8L3R0PiwgPHR0PlwjcHJhZ21hIG9tcCBzZWN0aW9uczwvdHQ+LCA8dHQ+XCNwcmFnbWEgb21wIHNpbmdsZTwvdHQ+IGFuZCANCis8dHQ+XCNwcmFnbWEgb21wIG1hc3RlcjwvdHQ+IGNvbnN0cnVjdHMuIA0KKw0KK1doZW4gaGFuZGxpbmcgbG9vcHMsIHRoZXJlIGFyZSBkaWZmZXJlbnQgZnVuY3Rpb25zIGZvciBlYWNoIG9mIHRoZSBzaWduZWQgYW5kIHVuc2lnbmVkIDMyIGFuZCA2NCBiaXQgaW50ZWdlciB0eXBlcw0KK3doaWNoIGhhdmUgdGhlIG5hbWUgc3VmZml4ZXMgYF80YCwgYF80dWAsIGBfOGAgYW5kIGBfOHVgLiBUaGUgc2VtYW50aWNzIG9mIGVhY2ggb2YgdGhlIGZ1bmN0aW9ucyBpcyB0aGUgc2FtZSwNCitzbyB0aGV5IGFyZSBvbmx5IGRlc2NyaWJlZCBvbmNlLg0KKw0KK1N0YXRpYyBsb29wIHNjaGVkdWxpbmcgaXMgaGFuZGxlZCBieSAgQHJlZiBfX2ttcGNfZm9yX3N0YXRpY19pbml0XzQgYW5kIGZyaWVuZHMuIE9ubHkgYSBzaW5nbGUgY2FsbCBpcyBuZWVkZWQsDQorc2luY2UgdGhlIGl0ZXJhdGlvbnMgdG8gYmUgZXhlY3V0ZWQgYnkgYW55IGdpdmUgdGhyZWFkIGNhbiBiZSBkZXRlcm1pbmVkIGFzIHNvb24gYXMgdGhlIGxvb3AgcGFyYW1ldGVycyBhcmUga25vd24uDQorDQorRHluYW1pYyBzY2hlZHVsaW5nIGlzIGhhbmRsZWQgYnkgdGhlIEByZWYgX19rbXBjX2Rpc3BhdGNoX2luaXRfNCBhbmQgQHJlZiBfX2ttcGNfZGlzcGF0Y2hfbmV4dF80IGZ1bmN0aW9ucy4gDQorVGhlIGluaXQgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgaW4gZWFjaCB0aHJlYWQgb3V0c2lkZSB0aGUgbG9vcCwgd2hpbGUgdGhlIG5leHQgZnVuY3Rpb24gaXMgY2FsbGVkIGVhY2gNCit0aW1lIHRoYXQgdGhlIHByZXZpb3VzIGNodW5rIG9mIHdvcmsgaGFzIGJlZW4gZXhoYXVzdGVkLiANCisNCitAZGVmZ3JvdXAgU1lOQ0hST05JWkFUSU9OIFN5bmNocm9uaXphdGlvbg0KK1RoZXNlIGZ1bmN0aW9ucyBhcmUgdXNlZCBmb3IgaW1wbGVtZW50aW5nIGJhcnJpZXJzLg0KKw0KK0BkZWZncm91cCBUSFJFQURQUklWQVRFIFRocmVhZCBwcml2YXRlIGRhdGEgc3VwcG9ydA0KK1RoZXNlIGZ1bmN0aW9ucyBzdXBwb3J0IGNvcHlpbi9vdXQgYW5kIHRocmVhZCBwcml2YXRlIGRhdGEuDQorDQorQGRlZmdyb3VwIFRBU0tJTkcgVGFza2luZyBzdXBwb3J0DQorVGhlc2UgZnVuY3Rpb25zIHN1cHBvcnQgYXJlIHVzZWQgdG8gaW1wbGVtZW50IHRhc2tpbmcgY29uc3RydWN0cy4NCisNCisqLw0KKw0KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL0NNYWtlTGlzdHMudHh0IGIvZmluYWwvcnVudGltZS9zcmMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZjODU0MAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTc5IEBACitzZXQoT01QX1NITElCRVhUICIke0NNQUtFX1NIQVJFRF9MSUJSQVJZX1NVRkZJWH0iKQorCitleGVjdXRlX3Byb2Nlc3MoQ09NTUFORCAiZGF0ZSIgIislWS0lbS0lZCAlSDolTTolUyIgT1VUUFVUX1ZBUklBQkxFIEJVSUxEX1RJTUUpCitzdHJpbmcoUkVHRVggUkVQTEFDRSAiXG4iICIiIEJVSUxEX1RJTUUgJHtCVUlMRF9USU1FfSkKKworaW5jbHVkZV9kaXJlY3RvcmllcygKKyAgLgorICBpbmNsdWRlCisgIGluY2x1ZGUvJHtPTVBfVkVSU0lPTn0KKyAgaTE4bgorICB0aGlyZHBhcnR5L2l0dG5vdGlmeQorICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0KKykKKworaWYoV0lOMzIpCisgIHNldChPU19HRU4gIndpbiIpCitlbHNlaWYoQVBQTEUpCisgIHNldChPU19HRU4gIm1hYyIpCitlbHNlaWYoVU5JWCkKKyAgc2V0KE9TX0dFTiAibGluIikKK2Vsc2UoKQorICBtZXNzYWdlKEZBVEFMX0VSUk9SICJVbnN1cHBvcnRlZCBPUyIpCitlbmRpZigpCisKK2lmKGFyY2gpCQorCXNldChBUkNIICR7YXJjaH0pICNhY3F1aXJlIGZyb20gY29tbWFuZCBsaW5lCitlbHNlKCkgI2Fzc3VtZSBkZWZhdWx0CisgIHNldChBUkNIICIzMmUiKQorZW5kaWYoKQorCitpZigiJHthcmNofSIgU1RSRVFVQUwgIjMyZSIpCisgIHNldChBUkNIX1NUUiAiSW50ZWwoUikgNjQiKQorZWxzZWlmKCIke2FyY2h9IiBTVFJFUVVBTCAicHBjNjQiKQorICBzZXQoQVJDSF9TVFIgIlBQQzY0IikKK2VuZGlmKCkKKworc2V0KEZFQVRVUkVfRkxBR1MgIi1EIFVTRV9JVFRfQlVJTEQiKQorc2V0KEZFQVRVUkVfRkxBR1MgIiR7RkVBVFVSRV9GTEFHU30gLUQgTkRFQlVHIikKK3NldChGRUFUVVJFX0ZMQUdTICIke0ZFQVRVUkVfRkxBR1N9IC1EIEtNUF9BUkNIX1NUUj1cIlxcXCIke0FSQ0hfU1RSfVxcXCJcIiIpCitzZXQoRkVBVFVSRV9GTEFHUyAiJHtGRUFUVVJFX0ZMQUdTfSAtRCBfR05VX1NPVVJDRSIpCitzZXQoRkVBVFVSRV9GTEFHUyAiJHtGRUFUVVJFX0ZMQUdTfSAtRCBfUkVFTlRSQU5UIikKK3NldChGRUFUVVJFX0ZMQUdTICIke0ZFQVRVUkVfRkxBR1N9IC1EIEtNUF9VU0VfQVNTRVJUIikKK3NldChGRUFUVVJFX0ZMQUdTICIke0ZFQVRVUkVfRkxBR1N9IC1EIEJVSUxEX0k4IikKK3NldChGRUFUVVJFX0ZMQUdTICIke0ZFQVRVUkVfRkxBR1N9IC1EIEJVSUxEX1RWIikKKworaWYoQVBQTEUpCisgIHNldChDTUFLRV9TSEFSRURfTElOS0VSX0ZMQUdTICIke0NNQUtFX1NIQVJFRF9MSU5LRVJfRkxBR1N9IC1jdXJyZW50X3ZlcnNpb24gNS4wIikKKyAgc2V0KENNQUtFX1NIQVJFRF9MSU5LRVJfRkxBR1MgIiR7Q01BS0VfU0hBUkVEX0xJTktFUl9GTEFHU30gLWNvbXBhdGliaWxpdHlfdmVyc2lvbiA1LjAiKQorZW5kaWYoKQorCitzZXQoRkVBVFVSRV9GTEFHUyAiJHtGRUFUVVJFX0ZMQUdTfSAtRCBLTVBfTElCUkFSWV9GSUxFPVxcXCJsaWJpb21wNS4ke09NUF9TSExJQkVYVH1cXFwiIikKK3NldChGRUFUVVJFX0ZMQUdTICIke0ZFQVRVUkVfRkxBR1N9IC1EIEtNUF9WRVJTSU9OX01BSk9SPSR7VkVSU0lPTn0iKQorCisjIGN1c3RvbWl6ZSBjYWNoZSBsaW5lIHNpemUgZm9yIHBwYzY0IHRvIDEyOCBieXRlczogNjQgaW4gYWxsIG90aGVyIGNhc2VzCitpZigiJHthcmNofSIgU1RSRVFVQUwgInBwYzY0IikKKwlzZXQoRkVBVFVSRV9GTEFHUyAiJHtGRUFUVVJFX0ZMQUdTfSAtRCBDQUNIRV9MSU5FPTEyOCIpCitlbHNlKCkKKwlzZXQoRkVBVFVSRV9GTEFHUyAiJHtGRUFUVVJFX0ZMQUdTfSAtRCBDQUNIRV9MSU5FPTY0IikJCitlbmRpZigpCisKK3NldChGRUFUVVJFX0ZMQUdTICIke0ZFQVRVUkVfRkxBR1N9IC1EIEtNUF9BREpVU1RfQkxPQ0tUSU1FPTEiKQorc2V0KEZFQVRVUkVfRkxBR1MgIiR7RkVBVFVSRV9GTEFHU30gLUQgQlVJTERfUEFSQUxMRUxfT1JERVJFRCIpCitzZXQoRkVBVFVSRV9GTEFHUyAiJHtGRUFUVVJFX0ZMQUdTfSAtRCBLTVBfQVNNX0lOVFJJTlMiKQorc2V0KEZFQVRVUkVfRkxBR1MgIiR7RkVBVFVSRV9GTEFHU30gLUQgVVNFX0xPQURfQkFMQU5DRSIpCitzZXQoRkVBVFVSRV9GTEFHUyAiJHtGRUFUVVJFX0ZMQUdTfSAtRCBVU0VfQ0JMS0RBVEEiKQorc2V0KEZFQVRVUkVfRkxBR1MgIiR7RkVBVFVSRV9GTEFHU30gLUQgR1VJREVETExfRVhQT1JUUyIpCitzZXQoRkVBVFVSRV9GTEFHUyAiJHtGRUFUVVJFX0ZMQUdTfSAtRCBLTVBfR09NUF9DT01QQVQiKQorCisjYWRhcHRpdmUgbG9ja3MgdXNlIHg4NiBhc3NlbWJseSAtIGRpc2FibGUgZm9yIHBwYzY0CitpZigiJHthcmNofSIgU1RSRVFVQUwgIjMyZSIgT1IgIiR7YXJjaH0iIFNUUkVRVUFMICIzMiIgT1IgIiR7YXJjaH0iIFNUUkVRVUFMICJhcm0iKQorCXNldChGRUFUVVJFX0ZMQUdTICIke0ZFQVRVUkVfRkxBR1N9IC1EIEtNUF9VU0VfQURBUFRJVkVfTE9DS1M9MSIpCisJc2V0KEZFQVRVUkVfRkxBR1MgIiR7RkVBVFVSRV9GTEFHU30gLUQgS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTPTAiKQorZW5kaWYoKQorCitzZXQoRkVBVFVSRV9GTEFHUyAiJHtGRUFUVVJFX0ZMQUdTfSAtRCBPTVBfNTBfRU5BQkxFRD0wIikKK3NldChGRUFUVVJFX0ZMQUdTICIke0ZFQVRVUkVfRkxBR1N9IC1EIE9NUF80MV9FTkFCTEVEPTAiKQorc2V0KEZFQVRVUkVfRkxBR1MgIiR7RkVBVFVSRV9GTEFHU30gLUQgT01QXzQwX0VOQUJMRUQ9MSIpCitzZXQoRkVBVFVSRV9GTEFHUyAiJHtGRUFUVVJFX0ZMQUdTfSAtRCBPTVBfMzBfRU5BQkxFRD0xIikKK3NldChGRUFUVVJFX0ZMQUdTICIke0ZFQVRVUkVfRkxBR1N9IC1EIFVTRV9JVFRfTk9USUZZPTEiKQorc2V0KEZFQVRVUkVfRkxBR1MgIiR7RkVBVFVSRV9GTEFHU30gLUQgSU5URUxfSVRUTk9USUZZX1BSRUZJWD1fX2ttcF9pdHRfIikKK2lmIChOT1QgQVBQTEUpCisgIHNldChGRUFUVVJFX0ZMQUdTICIke0ZFQVRVUkVfRkxBR1N9IC1EIEtNUF9UREFUQV9HVElEIikKK2VuZGlmKCkKK3NldChGRUFUVVJFX0ZMQUdTICIke0ZFQVRVUkVfRkxBR1N9IC1EIF9LTVBfQlVJTERfVElNRT1cIlxcXCIke0JVSUxEX1RJTUV9IFVUQ1xcXCJcIiIpCisKK3NldChDT01NT05fRkxBR1MgIi1mUElDIikKK3NldChDT01NT05fRkxBR1MgIiR7Q09NTU9OX0ZMQUdTfSAtV25vLXVudXNlZC12YWx1ZSIpCitzZXQoQ09NTU9OX0ZMQUdTICIke0NPTU1PTl9GTEFHU30gLVduby1zd2l0Y2giKQorc2V0KENPTU1PTl9GTEFHUyAiJHtDT01NT05fRkxBR1N9IC1Xbm8tZGVwcmVjYXRlZC1yZWdpc3RlciIpCitzZXQoQ09NTU9OX0ZMQUdTICIke0NPTU1PTl9GTEFHU30gLWZuby1leGNlcHRpb25zIikKKworc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9ICR7RkVBVFVSRV9GTEFHU30gJHtDT01NT05fRkxBR1N9IikKK3NldChDTUFLRV9DX0ZMQUdTICIke0NNQUtFX0NfRkxBR1N9ICR7RkVBVFVSRV9GTEFHU30gJHtDT01NT05fRkxBR1N9IikKKworc2V0KEFTTV9TT1VSQ0VTCisgIHpfTGludXhfYXNtLnMKKykKK3NldChTT1VSQ0VTCisgIHRoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeV9zdGF0aWMuYworICBrbXBfYWZmaW5pdHkuY3BwCisgIGttcF9hbGxvYy5jCisgIGttcF9hdG9taWMuYworICBrbXBfY2FuY2VsLmNwcAorICBrbXBfY3N1cHBvcnQuYworICBrbXBfZGVidWcuYworICBrbXBfZGlzcGF0Y2guY3BwCisgIGttcF9lbnZpcm9ubWVudC5jCisgIGttcF9lcnJvci5jCisgIGttcF9mdG5fY2RlY2wuYworICBrbXBfZnRuX2V4dHJhLmMKKyAga21wX2dsb2JhbC5jCisgIGttcF9nc3VwcG9ydC5jCisgIGttcF9pMThuLmMKKyAga21wX2lvLmMKKyAga21wX2l0dC5jCisgIGttcF9sb2NrLmNwcAorICBrbXBfcnVudGltZS5jCisgIGttcF9zY2hlZC5jcHAKKyAga21wX3NldHRpbmdzLmMKKyAga21wX3N0ci5jCisgIGttcF90YXNrZGVwcy5jcHAKKyAga21wX3Rhc2tpbmcuYworICBrbXBfdGFza3EuYworICBrbXBfdGhyZWFkcHJpdmF0ZS5jCisgIGttcF91dGlsaXR5LmMKKyAga21wX3ZlcnNpb24uYworICB6X0xpbnV4X3V0aWwuYworKQorCitzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMoJHtTT1VSQ0VTfSBQUk9QRVJUSUVTIExBTkdVQUdFIENYWCkKK3NldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcygke0FTTV9TT1VSQ0VTfSBQUk9QRVJUSUVTIExBTkdVQUdFIENYWCkKKworYWRkX2N1c3RvbV9jb21tYW5kKAorICBPVVRQVVQga21wX2kxOG5faWQuaW5jCisgICAgQ09NTUFORCBwZXJsICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8uLi90b29scy9tZXNzYWdlLWNvbnZlcnRlci5wbCAtLW9zPSR7T1NfR0VOfSAtLWFyY2g9JHtBUkNIfSAtLXByZWZpeD1rbXBfaTE4biAtLWVudW09a21wX2kxOG5faWQuaW5jICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9pMThuL2VuX1VTLnR4dAorKQorYWRkX2N1c3RvbV9jb21tYW5kKAorICBPVVRQVVQga21wX2kxOG5fZGVmYXVsdC5pbmMKKyAgICBDT01NQU5EIHBlcmwgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9Ly4uL3Rvb2xzL21lc3NhZ2UtY29udmVydGVyLnBsIC0tb3M9JHtPU19HRU59IC0tYXJjaD0ke0FSQ0h9IC0tcHJlZml4PWttcF9pMThuIC0tZGVmYXVsdD1rbXBfaTE4bl9kZWZhdWx0LmluYyAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vaTE4bi9lbl9VUy50eHQKKykKK2FkZF9jdXN0b21fY29tbWFuZCgKKyAgT1VUUFVUIG9tcC5oCisgICAgQ09NTUFORCBwZXJsICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8uLi90b29scy9leHBhbmQtdmFycy5wbCAtLXN0cmljdCAtRCBSZXZpc2lvbj1cIlxcJCRSZXZpc2lvblwiIC1EIERhdGU9XCJcXCQkRGF0ZVwiIC1EIEtNUF9UWVBFPVwiUGVyZm9ybWFuY2VcIiAtRCBLTVBfQVJDSD1cIlxcXCIke0FSQ0hfU1RSfVxcXCJcIiAtRCBLTVBfVkVSU0lPTl9NQUpPUj0ke1ZFUlNJT059IC1EIEtNUF9WRVJTSU9OX01JTk9SPTAgLUQgS01QX1ZFUlNJT05fQlVJTEQ9MDAwMDAwMDAgLUQgS01QX0JVSUxEX0RBVEU9XCIke0JVSUxEX1RJTUV9IFVUQ1wiIC1EIEtNUF9UQVJHRVRfQ09NUElMRVI9MTIgLUQgS01QX0RJQUc9MCAtRCBLTVBfREVCVUdfSU5GTz0wIC1EIE9NUF9WRVJTSU9OPSR7T01QX1ZFUlNJT059ICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9pbmNsdWRlLyR7T01QX1ZFUlNJT05fTlVNfS9vbXAuaC52YXIgb21wLmgKKykKKworaWYoIiR7QVJDSH0iIFNUUkVRVUFMICJwcGM2NCIpCisJYWRkX2N1c3RvbV9jb21tYW5kKAorCQlPVVRQVVQgel9MaW51eF9hc20ubworICAgIAkJICAgICAgIENPTU1BTkQgJHtDTUFLRV9DWFhfQ09NUElMRVJ9IC1jIC1vIHpfTGludXhfYXNtLm8gLUQgS01QX0FTTV9JTlRSSU5TIC1EIEtNUF9HT01QX0NPTVBBVCAtRCBLTVBfQVJDSF9QUEM2NCAteCBhc3NlbWJsZXItd2l0aC1jcHAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9LyR7QVNNX1NPVVJDRVN9CisJCSAgICAgICApCitlbHNlKCkKKwlhZGRfY3VzdG9tX2NvbW1hbmQoCisJCU9VVFBVVCB6X0xpbnV4X2FzbS5vCisgICAgCQkgICAgICAgQ09NTUFORCAke0NNQUtFX0NYWF9DT01QSUxFUn0gLWMgLW8gel9MaW51eF9hc20ubyAtRCBLTVBfQVNNX0lOVFJJTlMgLUQgS01QX0dPTVBfQ09NUEFUIC1EIEtNUF9BUkNIX1g4Nl82NCAteCBhc3NlbWJsZXItd2l0aC1jcHAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9LyR7QVNNX1NPVVJDRVN9CisJCSAgICAgICApCitlbmRpZigpCisKKworYWRkX2N1c3RvbV90YXJnZXQoZ2VuX2ttcF9pMThuIERFUEVORFMga21wX2kxOG5faWQuaW5jIGttcF9pMThuX2RlZmF1bHQuaW5jIG9tcC5oIHpfTGludXhfYXNtLm8pCisKK2lmKE5PVCBBUFBMRSkKKwlpZigke0FSQ0h9IFNUUkVRVUFMICJwcGM2NCIgQU5EICR7T1NfR0VOfSBTVFJFUVVBTCAibGluIikKKyAgCQlzZXQoQ01BS0VfU0hBUkVEX0xJTktFUl9GTEFHUyAiLVdsLC0tdmVyc2lvbi1zY3JpcHQ9JHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2V4cG9ydHNfc28udHh0IC1sZGwiKQorIAllbHNlKCkKKyAgIAkJc2V0KENNQUtFX1NIQVJFRF9MSU5LRVJfRkxBR1MgIi1XbCwtLXZlcnNpb24tc2NyaXB0PSR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9leHBvcnRzX3NvLnR4dCIpCisJZW5kaWYoKQorZW5kaWYoKQorCithZGRfbGlicmFyeShpb21wNSBTSEFSRUQgJHtTT1VSQ0VTfSB6X0xpbnV4X2FzbS5vKQorCisjIFRoaXMgaXMgYSB3b3JrYXJvdW5kIHRvIGEga25vd24gcHBjNjQgaXNzdWUgYWJvdXQgbGlicHRocmVhZC4gRm9yIG1vcmUKKyMgaW5mb3JtYXRpb24gc2VlCisjIGh0dHA6Ly9yeWFuYXJuLmJsb2dzcG90LmNvbS8yMDExLzA3L2N1cmlvdXMtY2FzZS1vZi1wdGhyZWFkYXRmb3JrLW9uLmh0bWwKK2lmKCIke0FSQ0h9IiBTVFJFUVVBTCAicHBjNjQiKQorCSAgICAgIGZpbmRfbGlicmFyeShQVEhSRUFEIE5BTUVTIHB0aHJlYWQpCisJICAgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGlvbXA1ICR7UFRIUkVBRH0pCitlbmRpZigpCisKK2FkZF9kZXBlbmRlbmNpZXMoaW9tcDUgZ2VuX2ttcF9pMThuKQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvZGVmcy5tayBiL2ZpbmFsL3J1bnRpbWUvc3JjL2RlZnMubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDViYTJiZAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2RlZnMubWsKQEAgLTAsMCArMSw2NSBAQAorIyBkZWZzLm1rCisjICRSZXZpc2lvbjogNDIwNjEgJAorIyAkRGF0ZTogMjAxMy0wMi0yOCAxNjozNjoyNCAtMDYwMCAoVGh1LCAyOCBGZWIgMjAxMykgJAorCisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGhpcyBmaWxlIGNvbnRhaW5zIGRlZmluaXRpb25zIGNvbW1vbiBmb3IgT3Blbk1QIFJUTCBhbmQgRFNMIG1ha2VmaWxlcy4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJbmNsdWRlIHJlYWxseSBjb21tb24gZGVmaW5pdGlvbnMuCitpbmNsdWRlICQoTElCT01QX1dPUkspdG9vbHMvc3JjL2NvbW1vbi1kZWZzLm1rCisKKyMKKyMgRGlyZWN0b3JpZXMuCisjCisKKyMgQ2hlY2sgYW5kIG5vcm1hbGl6ZSBMSUJPTVBfRVhQT1JUUy4KK2lmZXEgIiQoTElCT01QX0VYUE9SVFMpIiAiIgorICAgICQoZXJyb3IgTElCT01QX0VYUE9SVFMgZW52aXJvbm1lbnQgdmFyaWFibGUgbXVzdCBiZSBzZXQpCitlbmRpZgoraWZuZXEgIiQod29yZHMgJChMSUJPTVBfRVhQT1JUUykpIiAiMSIKKyAgICAkKGVycm9yIExJQk9NUF9FWFBPUlRTIG11c3Qgbm90IGNvbnRhaW4gc3BhY2VzKQorZW5kaWYKK292ZXJyaWRlIExJQk9NUF9FWFBPUlRTIDo9ICQoc3Vic3QgXCwvLCQoTElCT01QX0VYUE9SVFMpKQoraWZlcSAiJChmaWx0ZXIgJS8sJChMSUJPTVBfRVhQT1JUUykpIiAiIgorICAgIG92ZXJyaWRlIExJQk9NUF9FWFBPUlRTIDo9ICQoTElCT01QX0VYUE9SVFMpLworZW5kaWYKKyMgT3V0cHV0IGRpcmVjdG9yaWVzLgorb3V0X2RpciAgICAgID0gJChMSUJPTVBfRVhQT1JUUykKK291dF9jbW5fZGlyICA9ICQob3V0X2Rpciljb21tb24kKHN1ZmZpeCkvCitvdXRfcHRmX2RpciAgPSAkKG91dF9kaXIpJChwbGF0Zm9ybSkkKHN1ZmZpeCkvCitfb3V0X2xpYl9kaXIgPSAkKG91dF9kaXIpJCgxKSQoc3VmZml4KS9saWIkKGlmICQoZmlsdGVyIG1hY18lLCQoMSkpLC50aGluKS8KK291dF9saWJfZGlyICA9ICQoY2FsbCBfb3V0X2xpYl9kaXIsJChwbGF0Zm9ybSkpCitvdXRfbDEwbl9kaXIgPSAkKG91dF9saWJfZGlyKSQoaWYgJChmaWx0ZXIgbGluIG1hYywkKG9zKSksbG9jYWxlLykKK2lmZXEgIiQob3MpIiAibWFjIgorICAgIF9vdXRfbGliX2ZhdF9kaXIgPSAkKG91dF9kaXIpJCgxKSQoc3VmZml4KS9saWIvCisgICAgb3V0X2xpYl9mYXRfZGlyICA9ICQoY2FsbCBfb3V0X2xpYl9mYXRfZGlyLCQocGxhdGZvcm0pKQorICAgIG91dF9sMTBuX2ZhdF9kaXIgPSAkKG91dF9saWJfZmF0X2Rpcilsb2NhbGUvCitlbmRpZgorCisjCisjIFJldHJpZXZlIGJ1aWxkIG51bWJlciwKKyMKKworaWZlcSAiJChjbGVhbikiICIiCisgICAgIyBQYXJzZSBrbXBfdmVyc2lvbi5jIGZpbGUsIGxvb2sgZm9yICIjZGVmaW5lIEtNUF9WRVJTSU9OX0JVSUxEIHl5eXltbWRkIiBzdHJpbmcsCisgICAgIyBsZWF2ZSBvbmx5ICJ5eXl5bW1kZCIuIE5vdGU6IFNwYWNlIGFmdGVyICQkMSBpcyBpbXBvcnRhbnQsIGl0IGhlbHBzIHRvIGRldGVjdCBwb3NzaWJsZSBlcnJvcnMuCisgICAgYnVpbGQgOj0gJChzdHJpcCAkKHNoZWxsICQocGVybCkgLXAgLWUgJyQkXyA9fiBze14oPzpccypcI2RlZmluZVxzK0tNUF9WRVJTSU9OX0JVSUxEXHMrKFswLTldezh9KXwuKilccypcbn17JCQxIH0nICQoTElCT01QX1dPUkspc3JjL2ttcF92ZXJzaW9uLmMpKQorICAgIGlmbmVxICIkKHdvcmRzICQoYnVpbGQpKSIgIjEiCisgICAgICAgICQoZXJyb3IgRmFpbGVkIHRvIHBhc2UgImttcF92ZXJzaW9uLmMiLCBjYW5ub3QgZXh0cmFjdCBidWlsZCBudW1iZXIpCisgICAgZW5kaWYKKyAgICAkKGNhbGwgc2F5LEJ1aWxkICA6ICQoYnVpbGQpJChpZiAkKGZpbHRlciAwMDAwMDAwMCwkKGJ1aWxkKSksIChkZXZlbG9wbWVudCkpKQorZW5kaWYKKworIyBlbmQgb2YgZmlsZSAjCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9kbGxleHBvcnRzIGIvZmluYWwvcnVudGltZS9zcmMvZGxsZXhwb3J0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzU4ZjRjCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvZGxsZXhwb3J0cwpAQCAtMCwwICsxLDk0NSBAQAorIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCisjIERlcHJlY2F0ZWQgZW50cnkgcG9pbnRzIChudW1iZXJzIGFyZSByZXNlcnZlZCk6CistIF9fa21wY19iYXJyaWVyX3JlZHVjZV9tYXN0ZXIgICAgICAgICAgICAgIDEwOQorLSBfX2ttcGNfZW5kX2JhcnJpZXJfcmVkdWNlX21hc3RlciAgICAgICAgICAxMjIKKy0gX19rbXBjX2Zvcl9pbml0XzQgICAgICAgICAgICAgICAgICAgICAgICAgMTMxCistIF9fa21wY19mb3JfaW5pdF84ICAgICAgICAgICAgICAgICAgICAgICAgIDEzMgorLSBfX2ttcGNfZm9yX25leHRfNCAgICAgICAgICAgICAgICAgICAgICAgICAxMzMKKy0gX19rbXBjX2Zvcl9uZXh0XzggICAgICAgICAgICAgICAgICAgICAgICAgMTM0CistIF9fa21wY19mb3JrX2NhbGxfYm91bmQgICAgICAgICAgICAgICAgICAgIDEzOQorLSBfX2ttcGNfcmVkdWNlX21hc3Rlcl9ub3dhaXQgICAgICAgICAgICAgICAxNDkKKy0gX19rbXBjX29tcF90YXNrX2JlZ2luICAgICAgICAgICAgICAgICAgICAgMTk0CistIF9fa21wY19vbXBfdGFza19jb21wbGV0ZSAgICAgICAgICAgICAgICAgIDE5NQorLSBrbXBjX3NoYXJhYmxlX2NhbGxvYyAgICAgICAgICAgICAgICAgICAgICAyMTgKKy0ga21wY19zaGFyYWJsZV9mcmVlICAgICAgICAgICAgICAgICAgICAgICAgMjE5CistIGttcGNfc2hhcmFibGVfbWFsbG9jICAgICAgICAgICAgICAgICAgICAgIDIyMAorLSBrbXBjX3NoYXJhYmxlX3JlYWxsb2MgICAgICAgICAgICAgICAgICAgICAyMjEKKy0ga21wY19hbGlnbmVkX3NoYXJhYmxlX21hbGxvYyAgICAgICAgICAgICAgMjIzCistIG1wYWk0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwMAorLSBtcGFpOGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MDEKKy0gbXBhcjRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTAyCistIG1wYXI4YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwMworLSBtcGF4NHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MDQKKy0gbXBheDh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTA1CistIG1wb2JhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwNgorLSBtcG9lYnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MDcKKy0gbXBvZm9yayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTA4CistIG1wb2ZyayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwOQorLSBtcG9qb2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTAKKy0gbXBveGJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTExCistIG1wcGFkaiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxMgorLSBtcHBhZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTMKKy0gbXBwYmFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTE0CistIG1wcGJlZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxNQorLSBtcHBkZW8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTYKKy0gbXBwZG54ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTE3CistIG1wcGRueGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxOAorLSBtcHBkb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTkKKy0gbXBwZHhvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTIwCistIG1wcGViciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUyMQorLSBtcHBlY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MjIKKy0gbXBwZW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTIzCistIG1wcGVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUyNAorLSBtcHBlbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MjUKKy0gbXBwZXBhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTI2CistIG1wcGVzcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUyNworLSBtcHBma2QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MjgKKy0gbXBwZmt0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTI5CistIG1wcGZvcmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzMAorLSBtcHBmcmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MzEKKy0gbXBwaW9hICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTMyCistIG1wcGl3cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzMworLSBtcHBqb2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MzQKKy0gbXBwbnRoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTM1CistIG1wcHBxYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzNgorLSBtcHBwcWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MzcKKy0gbXBwcHFzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTM4CistIG1wcHRpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzOQorLSBtcHB0cGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NDAKKy0gbXBwdHBjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTQxCistIG1wcHRweiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU0MgorLSBtcHB2c3kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NDMKKy0gbXBweGJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTQ0CistIG1wcHhjcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU0NQorLSBtcHB4bXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NDYKKy0gbXBweG5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTQ3CistIG1wcHhwYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU0OAorLSBtcHB4cHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NDkKKy0gbXBweHNwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTUwCistIG1wcHh0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU1MQorLSBtcHNiYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NTIKKy0gbXBzY3ByICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTk3CistIG1wc2ViciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU1MworLSBtcHNlcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NTQKKy0gbXBzZmQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTU1CistIG1wc2ZkOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU1NgorLSBtcHNpZDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NTcKKy0gbXBzaWQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTU4CistIG1wc25kNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU1OQorLSBtcHNuZDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NjAKKy0gbXBzb250ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTYxCistIG1wc3JlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU2MgorLSBtcHN1bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NjMKKy0gbXBzeGJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTY0CistIG1wc3hyZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU2NQorLSBtcHRhZGogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NjYKKy0gbXB0YWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTY3CistIG1wdGJhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU2OAorLSBtcHRkZW8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NjkKKy0gbXB0ZGluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTcwCistIG1wdGRpbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU3MQorLSBtcHRkbnggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NzIKKy0gbXB0ZG54ZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTczCistIG1wdGRvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU3NAorLSBtcHRkeG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NzUKKy0gbXB0ZWJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTc2CistIG1wdGVjcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU3NworLSBtcHRlbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NzgKKy0gbXB0ZW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTc5CistIG1wdGVwYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU4MAorLSBtcHRlc3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ODEKKy0gbXB0ZmtkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTgyCistIG1wdHBwYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU4MworLSBtcHRwcGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ODQKKy0gbXB0cHBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTg1CistIG1wdHRwYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU4NgorLSBtcHR0cGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ODcKKy0gbXB0dHB6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTg4CistIG1wdHZzeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU4OQorLSBtcHR4YnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1OTAKKy0gbXB0eGNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTkxCistIG1wdHhtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU5MgorLSBtcHR4bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1OTMKKy0gbXB0eHBhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTk0CistIG1wdHhzcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU5NQorLSBtcHBjcHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1OTYKKy0gZnRuX3NldF9saWJyYXJ5X2dhbmcgICAgICAgICAgICAgICAgICAgICAgNzM2CistIGttcF9zZXRfbGlicmFyeV9nYW5nCistIGttcF9zaGFyYWJsZV9jYWxsb2MgICAgICAgICAgICAgICAgICAgICAgIDc2MAorLSBrbXBfc2hhcmFibGVfZnJlZSAgICAgICAgICAgICAgICAgICAgICAgICA3NjEKKy0ga21wX3NoYXJhYmxlX21hbGxvYyAgICAgICAgICAgICAgICAgICAgICAgNzYyCistIGttcF9zaGFyYWJsZV9yZWFsbG9jICAgICAgICAgICAgICAgICAgICAgIDc2MworLSBrbXBfYWxpZ25lZF9zaGFyYWJsZV9tYWxsb2MgICAgICAgICAgICAgICA3NjQKKy0ga21wX2RlZmVycmVkX2F0b21pY19hZGRfaTQgICAgICAgICAgICAgICAgNzY1CistIGttcF9kZWZlcnJlZF9hdG9taWNfYWRkX2k4ICAgICAgICAgICAgICAgIDc2NgorLSBrbXBfZGVmZXJyZWRfYXRvbWljX2FkZF9yNCAgICAgICAgICAgICAgICA3NjcKKy0ga21wX2RlZmVycmVkX2F0b21pY19hZGRfcjggICAgICAgICAgICAgICAgNzY4CistIGttcF9sb2NrX2NvbmRfd2FpdCAgICAgICAgICAgICAgICAgICAgICAgIDc3MAorLSBrbXBfbG9ja19jb25kX3NpZ25hbCAgICAgICAgICAgICAgICAgICAgICA3NzEKKy0ga21wX2xvY2tfY29uZF9icm9hZGNhc3QgICAgICAgICAgICAgICAgICAgNzcyCistIGttcF9uZXN0X2xvY2tfY29uZF93YWl0ICAgICAgICAgICAgICAgICAgIDc3MworLSBrbXBfbmVzdF9sb2NrX2NvbmRfc2lnbmFsICAgICAgICAgICAgICAgICA3NzQKKy0ga21wX25lc3RfbG9ja19jb25kX2Jyb2FkY2FzdCAgICAgICAgICAgICAgNzc1CistIGttcF9nZXRfcHJvY2Vzc19udW0gICAgICAgICAgICAgICAgICAgICAgIDc4MQorLSBrbXBfZ2V0X251bV9wcm9jZXNzZXMgICAgICAgICAgICAgICAgICAgICA3ODIKKy0ga21wX2dldF9wcm9jZXNzX3RocmVhZF9udW0gICAgICAgICAgICAgICAgNzgzCistIGttcF9wcml2YXRlX21tYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDc4NCAgICMgbm90IGltcGxlbWVudGVkPworLSBrbXBfc2hhcmFibGVfbW1hcCAgICAgICAgICAgICAgICAgICAgICAgICA3ODUgICAjIG5vdCBpbXBsZW1lbnRlZD8KKy0ga21wX3ByaXZhdGVfbXVubWFwICAgICAgICAgICAgICAgICAgICAgICAgNzg2ICAgIyBub3QgaW1wbGVtZW50ZWQ/CistIGttcF9zaGFyYWJsZV9tdW5tYXAgICAgICAgICAgICAgICAgICAgICAgIDc4NyAgICMgbm90IGltcGxlbWVudGVkPworLSBrbXBfaXNfc2hhcmFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICA3ODggICAjIG5vdCBpbXBsZW1lbnRlZD8KKworJWlmbmRlZiBzdHViCisKKworICAgICMKKyAgICAjIFRoZSBmb2xsb3dpbmcgZW50cnkgcG9pbnRzIGFyZSBhZGRlZCBzbyB0aGF0IHRoZSBiYWNrdHJhY2VzIGZyb20KKyAgICAjIHRoZSB0b29scyBjb250YWluIG1lYW5pbmdmdWwgbmFtZXMgZm9yIGFsbCB0aGUgZnVuY3Rpb25zIHRoYXQgbWlnaHQKKyAgICAjIGFwcGVhciBpbiBhIGJhY2t0cmFjZSBvZiBhIHRocmVhZCB3aGljaCBpcyBibG9ja2VkIGluIHRoZSBSVEwuCisgICAgIworCisgICAgIyBSZWd1bGFyIGVudHJ5IHBvaW50cworICAgICAgICBfX2ttcF93YWl0X3lpZWxkXzQKKyAgICAgICAgX19rbXBfd2FpdF95aWVsZF84CisgICAgICAgIF9fa21wX3dhaXRfc2xlZXAKKyAgICAgICAgX19rbXBfZm9ya19jYWxsCisgICAgICAgIF9fa21wX2ludm9rZV9taWNyb3Rhc2sKKyAgICAgICAgX19rbXBfcmVsZWFzZQorICAgICAgICBfX2ttcF9sYXVuY2hfbW9uaXRvcgorICAgICAgICBfX2ttcF9sYXVuY2hfd29ya2VyCisgICAgICAgIF9fa21wX3JlYXBfbW9uaXRvcgorICAgICAgICBfX2ttcF9yZWFwX3dvcmtlcgorICAgICAgICBfX2ttcF9hY3F1aXJlX3Rhc19sb2NrCisgICAgICAgIF9fa21wX2FjcXVpcmVfbmVzdGVkX3Rhc19sb2NrCisgICAgICAgIF9fa21wX2FjcXVpcmVfdGlja2V0X2xvY2sKKyAgICAgICAgX19rbXBfYWNxdWlyZV9uZXN0ZWRfdGlja2V0X2xvY2sKKyAgICAgICAgX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2sKKyAgICAgICAgX19rbXBfYWNxdWlyZV9uZXN0ZWRfcXVldWluZ19sb2NrCisgICAgICAgIF9fa21wX2FjcXVpcmVfZHJkcGFfbG9jaworICAgICAgICBfX2ttcF9hY3F1aXJlX25lc3RlZF9kcmRwYV9sb2NrCisKKyAgICAlaWZkZWYgS01QX0RFQlVHCisgICAgICAgICMgYWxsb3dzIGNvbnNvbGUgb3V0cHV0IGNhcGFiaWxpdHkgZm9yIGFwcGxpY2F0aW9ucyB0aG9zZSBkb24ndCBoYXZlIGl0CisgICAgICAgIF9fa21wX3ByaW50ZgorICAgICVlbmRpZgorCisKKworICAgICAgICAjIFN5bWJvbHMgZm9yIE1TIG11dHVhbCBkZXRlY3Rpb246CisgICAgICAgIF9Zb3VfbXVzdF9saW5rX3dpdGhfZXhhY3RseV9vbmVfT3Blbk1QX2xpYnJhcnkgICAgREFUQQorICAgICAgICBfWW91X211c3RfbGlua193aXRoX0ludGVsX09wZW5NUF9saWJyYXJ5ICAgICAgICAgIERBVEEKKyAgICAgICAgJWlmZGVmIG1zdmNfY29tcGF0CisgICAgICAgICAgICBfWW91X211c3RfbGlua193aXRoX01pY3Jvc29mdF9PcGVuTVBfbGlicmFyeSAgREFUQQorICAgICAgICAlZW5kaWYKKworIyAgICBWVF9nZXR0aGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorIyAgICB2dGd0aGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgorCisgICAgX19rbXBjX2F0b21pY180ICAgICAgICAgICAgICAgICAgICAgICAgIDEwMAorICAgIF9fa21wY19hdG9taWNfOCAgICAgICAgICAgICAgICAgICAgICAgICAxMDEKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGQgICAgICAgICAgICAgICAgMTAyCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfYWRkICAgICAgICAgICAgICAgIDEwMworICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X2FkZCAgICAgICAgICAgICAgICAxMDQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGQgICAgICAgICAgICAgICAgMTA1CisgICAgX19rbXBjX2JhcnJpZXIgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNgorICAgIF9fa21wY19iYXJyaWVyX21hc3RlciAgICAgICAgICAgICAgICAgICAxMDcKKyAgICBfX2ttcGNfYmFycmllcl9tYXN0ZXJfbm93YWl0ICAgICAgICAgICAgMTA4CisgICAgX19rbXBjX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMAorICAgIF9fa21wY19ib3VuZF9udW1fdGhyZWFkcyAgICAgICAgICAgICAgICAxMTEKKyAgICBfX2ttcGNfYm91bmRfdGhyZWFkX251bSAgICAgICAgICAgICAgICAgMTEyCisgICAgX19rbXBjX2NyaXRpY2FsICAgICAgICAgICAgICAgICAgICAgICAgIDExMworICAgIF9fa21wY19kaXNwYXRjaF9maW5pXzQgICAgICAgICAgICAgICAgICAxMTQKKyAgICBfX2ttcGNfZGlzcGF0Y2hfZmluaV84ICAgICAgICAgICAgICAgICAgMTE1CisgICAgX19rbXBjX2Rpc3BhdGNoX2luaXRfNCAgICAgICAgICAgICAgICAgIDExNgorICAgIF9fa21wY19kaXNwYXRjaF9pbml0XzggICAgICAgICAgICAgICAgICAxMTcKKyAgICBfX2ttcGNfZGlzcGF0Y2hfbmV4dF80ICAgICAgICAgICAgICAgICAgMTE4CisgICAgX19rbXBjX2Rpc3BhdGNoX25leHRfOCAgICAgICAgICAgICAgICAgIDExOQorICAgIF9fa21wY19lbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjAKKyAgICBfX2ttcGNfZW5kX2JhcnJpZXJfbWFzdGVyICAgICAgICAgICAgICAgMTIxCisgICAgX19rbXBjX2VuZF9jcml0aWNhbCAgICAgICAgICAgICAgICAgICAgIDEyMworICAgIF9fa21wY19lbmRfbWFzdGVyICAgICAgICAgICAgICAgICAgICAgICAxMjQKKyAgICBfX2ttcGNfZW5kX29yZGVyZWQgICAgICAgICAgICAgICAgICAgICAgMTI1CisgICAgX19rbXBjX2VuZF9zZXJpYWxpemVkX3BhcmFsbGVsICAgICAgICAgIDEyNgorICAgIF9fa21wY19lbmRfc2luZ2xlICAgICAgICAgICAgICAgICAgICAgICAxMjcKKyAgICBfX2ttcGNfZW5kX3Rhc2txICAgICAgICAgICAgICAgICAgICAgICAgMTI4CisgICAgX19rbXBjX2VuZF90YXNrcV90YXNrICAgICAgICAgICAgICAgICAgIDEyOQorICAgIF9fa21wY19mbHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzAKKyAgICBfX2ttcGNfZm9yX3N0YXRpY19maW5pICAgICAgICAgICAgICAgICAgMTM1CisgICAgX19rbXBjX2Zvcl9zdGF0aWNfaW5pdF80ICAgICAgICAgICAgICAgIDEzNgorICAgIF9fa21wY19mb3Jfc3RhdGljX2luaXRfOCAgICAgICAgICAgICAgICAxMzcKKyAgICBfX2ttcGNfZm9ya19jYWxsICAgICAgICAgICAgICAgICAgICAgICAgMTM4CisgICAgX19rbXBjX2dsb2JhbF9udW1fdGhyZWFkcyAgICAgICAgICAgICAgIDE0MAorICAgIF9fa21wY19nbG9iYWxfdGhyZWFkX251bSAgICAgICAgICAgICAgICAxNDEKKyAgICBfX2ttcGNfaW5fcGFyYWxsZWwgICAgICAgICAgICAgICAgICAgICAgMTQyCisgICAgX19rbXBjX2ludm9rZV90YXNrX2Z1bmMgICAgICAgICAgICAgICAgIDE0MworICAgIF9fa21wY19tYXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDQKKyAgICBfX2ttcGNfb2tfdG9fZm9yayAgICAgICAgICAgICAgICAgICAgICAgMTQ1CisgICAgX19rbXBjX29yZGVyZWQgICAgICAgICAgICAgICAgICAgICAgICAgIDE0NgorICAgIF9fa21wY19wb3BfbnVtX3RocmVhZHMgICAgICAgICAgICAgICAgICAxNDcKKyAgICBfX2ttcGNfcHVzaF9udW1fdGhyZWFkcyAgICAgICAgICAgICAgICAgMTQ4CisgICAgX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWwgICAgICAgICAgICAgIDE1MAorICAgIF9fa21wY19zaW5nbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTEKKyAgICBfX2ttcGNfdGFzayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUyCisgICAgX19rbXBjX3Rhc2tfYnVmZmVyICAgICAgICAgICAgICAgICAgICAgIDE1MworICAgIF9fa21wY190YXNrcSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTQKKyAgICBfX2ttcGNfdGFza3FfdGFzayAgICAgICAgICAgICAgICAgICAgICAgMTU1CisgICAgX19rbXBjX3RocmVhZHByaXZhdGUgICAgICAgICAgICAgICAgICAgIDE1NgorICAgIF9fa21wY190aHJlYWRwcml2YXRlX2NhY2hlZCAgICAgICAgICAgICAxNTcKKyAgICBfX2ttcGNfdGhyZWFkcHJpdmF0ZV9yZWdpc3RlciAgICAgICAgICAgMTU4CisgICAgX19rbXBjX3RocmVhZHByaXZhdGVfcmVnaXN0ZXJfdmVjICAgICAgIDE1OQorIyAgICBfX2ttcGNfc3NwX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgMTYwCisjICAgIF9fa21wY19zc3BfZm9yayAgICAgICAgICAgICAgICAgICAgICAgICAxNjEKKyMgICAgX19rbXBjX3NzcF9lbmQgICAgICAgICAgICAgICAgICAgICAgICAgIDE2MgorIyAgICBfX2ttcGNfc3NwX3Bvc3RfNCAgICAgICAgICAgICAgICAgICAgICAgMTYzCisjICAgIF9fa21wY19zc3BfcG9zdF84ICAgICAgICAgICAgICAgICAgICAgICAxNjQKKyMgICAgX19rbXBjX3NzcF93YWl0XzQgICAgICAgICAgICAgICAgICAgICAgIDE2NQorIyAgICBfX2ttcGNfc3NwX3dhaXRfOCAgICAgICAgICAgICAgICAgICAgICAgMTY2CisjICAgIF9fa21wY19zc3BfZGlzdGFuY2VfNCAgICAgICAgICAgICAgICAgICAxNjcKKyMgICAgX19rbXBjX3NzcF9kaXN0YW5jZV84ICAgICAgICAgICAgICAgICAgIDE2OAorIyAgICBfX2ttcGNfaW5fc3NwICAgICAgICAgICAgICAgICAgICAgICAgICAgMTY5CisjICAgIF9fa21wY19zc3BfdGhyZWFkX251bSAgICAgICAgICAgICAgICAgICAxNzAKKyMgICAgX19rbXBjX3NzcF9udW1fdGhyZWFkcyAgICAgICAgICAgICAgICAgIDE3MQorICAgIF9fa21wY19jb3B5cHJpdmF0ZSAgICAgICAgICAgICAgICAgICAgICAxNzIKKyMgICAgX19rbXBjX3NzcF9nZXRfbWF4X3RocmVhZHMgICAgICAgICAgICAgIDE3MworIyAgICBfX2ttcGNfc3NwX3NldF9tYXhfdGhyZWFkcyAgICAgICAgICAgICAgMTc0CisgICAgX19rbXBjX2luaXRfbG9jayAgICAgICAgICAgICAgICAgICAgICAgIDE3NQorICAgIF9fa21wY19kZXN0cm95X2xvY2sgICAgICAgICAgICAgICAgICAgICAxNzYKKyAgICBfX2ttcGNfc2V0X2xvY2sgICAgICAgICAgICAgICAgICAgICAgICAgMTc3CisgICAgX19rbXBjX3Vuc2V0X2xvY2sgICAgICAgICAgICAgICAgICAgICAgIDE3OAorICAgIF9fa21wY190ZXN0X2xvY2sgICAgICAgICAgICAgICAgICAgICAgICAxNzkKKyAgICBfX2ttcGNfaW5pdF9uZXN0X2xvY2sgICAgICAgICAgICAgICAgICAgMTgwCisgICAgX19rbXBjX2Rlc3Ryb3lfbmVzdF9sb2NrICAgICAgICAgICAgICAgIDE4MQorICAgIF9fa21wY19zZXRfbmVzdF9sb2NrICAgICAgICAgICAgICAgICAgICAxODIKKyAgICBfX2ttcGNfdW5zZXRfbmVzdF9sb2NrICAgICAgICAgICAgICAgICAgMTgzCisgICAgX19rbXBjX3Rlc3RfbmVzdF9sb2NrICAgICAgICAgICAgICAgICAgIDE4NAorIyAgICBfX2ttcGNfc3NwX2luaXRfdGhyZWFkICAgICAgICAgICAgICAgICAgMTg1CisjICAgIF9fa21wY19zc3Bfc2V0X2V2ZW50ICAgICAgICAgICAgICAgICAgICAxODYKKyAgICBfX2ttcGNfcmVkdWNlX25vd2FpdCAgICAgICAgICAgICAgICAgICAgMTg3CisgICAgX19rbXBjX2VuZF9yZWR1Y2Vfbm93YWl0ICAgICAgICAgICAgICAgIDE4OAorICAgIF9fa21wY19yZWR1Y2UgICAgICAgICAgICAgICAgICAgICAgICAgICAxODkKKyAgICBfX2ttcGNfZW5kX3JlZHVjZSAgICAgICAgICAgICAgICAgICAgICAgMTkwCisKKyMgT3Blbk1QIDMuMAorCislaWZkZWYgT01QXzMwCisgICAgX19rbXBjX29tcF90YXNrX2FsbG9jICAgICAgICAgICAgICAgICAgIDE5MQorICAgIF9fa21wY19vbXBfdGFzayAgICAgICAgICAgICAgICAgICAgICAgICAxOTIKKyAgICBfX2ttcGNfb21wX3Rhc2t3YWl0ICAgICAgICAgICAgICAgICAgICAgMTkzCisgICAgX19rbXBjX29tcF90YXNrX2JlZ2luX2lmMCAgICAgICAgICAgICAgIDE5NgorICAgIF9fa21wY19vbXBfdGFza19jb21wbGV0ZV9pZjAgICAgICAgICAgICAxOTcKKyAgICBfX2ttcGNfb21wX3Rhc2tfcGFydHMgICAgICAgICAgICAgICAgICAgMTk4CislZW5kaWYgIyBPTVBfMzAKKworIyAgIF9fb21wX2NvbGxlY3Rvcl9hcGkgICAgICAgICAgICAgICAgICAxOTkKKworICAgICMgVGhlc2UgZnVuY3Rpb25zIGFyZSBmb3IgdGVzdGluZyBwdXJwb3Nlcy4gVGhlcmUgaXMgbm8gbmVlZCBpbiBzdGFibGUgb3JkaW5hbCBudW1iZXI6CisgICAgX19rbXBfZ2V0X3JlZHVjZV9tZXRob2QKKworJWVuZGlmICAjIG5vdCBkZWZpbmVkIHN0dWIKKwora21wY19jYWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAKK2ttcGNfZnJlZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAxCislaWZuZGVmIHN0dWIKKyAgICAjIFRoZXNlIGZ1bmN0aW9ucyBhcmUgZXhwb3J0ZWQgZnJvbSBsaWJndWlkZSwgYnV0IGRlY2xhcmVkIG5laXRoZXIgaW4gb21wLmggbm90IGluIG9tcF9saWIuaC4KKyMgICAga21wY19nZXRfYmFubmVyICAgICAgICAgICAgICAgICAgICAgICAgIDIwMgorIyAgICBrbXBjX2dldF9wb29sbW9kZSAgICAgICAgICAgICAgICAgICAgICAgMjAzCisjICAgIGttcGNfZ2V0X3Bvb2xzaXplICAgICAgICAgICAgICAgICAgICAgICAyMDQKKyMgICAga21wY19nZXRfcG9vbHN0YXQgICAgICAgICAgICAgICAgICAgICAgIDIwNQorIyAgICBrbXBjX3Bvb2xwcmludCAgICAgICAgICAgICAgICAgICAgICAgICAgMjA3CisjICAgIGttcGNfcHJpbnRfYmFubmVyICAgICAgICAgICAgICAgICAgICAgICAyMDgKKyMgICAga21wY19zZXRfcG9vbG1vZGUgICAgICAgICAgICAgICAgICAgICAgIDIxNAorIyAgICBrbXBjX3NldF9wb29sc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgMjE1CislZW5kaWYKK2ttcGNfbWFsbG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA2CitrbXBjX3JlYWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwOQora21wY19zZXRfYmxvY2t0aW1lICAgICAgICAgICAgICAgICAgICAgICAgICAyMTEKK2ttcGNfc2V0X2xpYnJhcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjEyCisjIGttcGNfc2V0X3BhcmFsbGVsX25hbWUgICAgICAgICAgICAgICAgICAgICAgMjEzCitrbXBjX3NldF9zdGFja3NpemUgICAgICAgICAgICAgICAgICAgICAgICAgIDIxNgora21wY19zZXRfc3RhY2tzaXplX3MgICAgICAgICAgICAgICAgICAgICAgICAyMjIKKyMga21wY19zZXRfc3RhdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMTcKK2ttcGNfc2V0X2RlZmF1bHRzICAgICAgICAgICAgICAgICAgICAgICAgICAgMjI0CisKKyMgT01QIDMuMCBlbnRyeSBwb2ludHMgZm9yIHVuc2lnbmVkIGxvb3AgaXRlcmF0aW9uIHZhcmlhYmxlcworJWlmbmRlZiBzdHViCisgICAgJWlmZGVmIE9NUF8zMAorICAgICAgICBfX2ttcGNfZm9yX3N0YXRpY19pbml0Xzh1ICAgICAgICAgICAyMjUKKyAgICAgICAgX19rbXBjX2Rpc3BhdGNoX2luaXRfOHUgICAgICAgICAgICAgMjI2CisgICAgICAgIF9fa21wY19kaXNwYXRjaF9uZXh0Xzh1ICAgICAgICAgICAgIDIyNworICAgICAgICBfX2ttcGNfZGlzcGF0Y2hfZmluaV84dSAgICAgICAgICAgICAyMjgKKyAgICAgICAgX19rbXBjX2Zvcl9zdGF0aWNfaW5pdF80dSAgICAgICAgICAgMjI5CisgICAgICAgIF9fa21wY19kaXNwYXRjaF9pbml0XzR1ICAgICAgICAgICAgIDIzMAorICAgICAgICBfX2ttcGNfZGlzcGF0Y2hfbmV4dF80dSAgICAgICAgICAgICAyMzEKKyAgICAgICAgX19rbXBjX2Rpc3BhdGNoX2ZpbmlfNHUgICAgICAgICAgICAgMjMyCisgICAgJWVuZGlmICMgT01QXzMwCislZW5kaWYKKworJWlmbmRlZiBzdHViCisgICAgX19rbXBjX2dldF90YXNraWQgICAgICAgICAgICAgICAgICAgICAgIDIzMworICAgIF9fa21wY19nZXRfcGFyZW50X3Rhc2tpZCAgICAgICAgICAgICAgICAyMzQKKyVlbmRpZgorCisjIE9wZW5NUCAzLjEgZW50cnkgcG9pbnRzCislaWZuZGVmIHN0dWIKKyAgICAlaWZkZWYgT01QXzMwCisgICAgICAgIF9fa21wY19vbXBfdGFza3lpZWxkICAgICAgICAgICAgICAgIDIzNQorICAgICVlbmRpZiAjIE9NUF8zMAorICAgIF9fa21wY19wbGFjZV90aHJlYWRzICAgICAgICAgICAgICAgICAgICAyMzYKKyVlbmRpZgorCisjIE9wZW5NUCA0LjAgZW50cnkgcG9pbnRzCislaWZuZGVmIHN0dWIKKyAgICAlaWZkZWYgT01QXzQwCisgICAgICAgIF9fa21wY19wdXNoX3Byb2NfYmluZCAgICAgICAgICAgICAgIDIzNworICAgICAgICBfX2ttcGNfdGFza2dyb3VwICAgICAgICAgICAgICAgICAgICAyMzgKKyAgICAgICAgX19rbXBjX2VuZF90YXNrZ3JvdXAgICAgICAgICAgICAgICAgMjM5CisgICAgICAgIF9fa21wY19wdXNoX251bV90ZWFtcyAgICAgICAgICAgICAgIDI0MAorICAgICAgICBfX2ttcGNfZm9ya190ZWFtcyAgICAgICAgICAgICAgICAgICAyNDEKKyAgICAgICAgX19rbXBjX29tcF90YXNrX3dpdGhfZGVwcyAgICAgICAgICAgMjQyCisgICAgICAgIF9fa21wY19vbXBfd2FpdF9kZXBzICAgICAgICAgICAgICAgIDI0MworICAgICAgICBfX2ttcGNfY2FuY2VsICAgICAgICAgICAgICAgICAgICAgICAyNDQKKyAgICAgICAgX19rbXBjX2NhbmNlbGxhdGlvbnBvaW50ICAgICAgICAgICAgMjQ1CisgICAgICAgIF9fa21wY19jYW5jZWxfYmFycmllciAgICAgICAgICAgICAgIDI0NgorICAgICVlbmRpZiAjIE9NUF80MAorJWVuZGlmCisKKyMgVXNlciBBUEkgZW50cnkgcG9pbnRzIHRoYXQgaGF2ZSBib3RoIGxvd2VyLSBhbmQgdXBwZXItIGNhc2UgdmVyc2lvbnMgZm9yIEZvcnRyYW4uCisjIE51bWJlciBmb3IgbG93ZXJjYXNlIHZlcnNpb24gaXMgaW5kaWNhdGVkLiAgTnVtYmVyIGZvciB1cHBlcmNhc2UgaXMgb2J0YWluZWQgYnkgYWRkaW5nIDEwMDAuCisjIFVzZXIgQVBJIGVudHJ5IHBvaW50cyBhcmUgZW50cnkgcG9pbnRzIHRoYXQgc3RhcnQgd2l0aCAna21wXycgb3IgJ29tcF8nLgorCitvbXBfZGVzdHJveV9sb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcwMAorb21wX2Rlc3Ryb3lfbmVzdF9sb2NrICAgICAgICAgICAgICAgICAgICAgICA3MDEKK29tcF9nZXRfZHluYW1pYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzAyCitvbXBfZ2V0X21heF90aHJlYWRzICAgICAgICAgICAgICAgICAgICAgICAgIDcwMworb21wX2dldF9uZXN0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MDQKK29tcF9nZXRfbnVtX3Byb2NzICAgICAgICAgICAgICAgICAgICAgICAgICAgNzA1CitvbXBfZ2V0X251bV90aHJlYWRzICAgICAgICAgICAgICAgICAgICAgICAgIDcwNgorb21wX2dldF90aHJlYWRfbnVtICAgICAgICAgICAgICAgICAgICAgICAgICA3MDcKK29tcF9nZXRfd3RpY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzA4CitvbXBfZ2V0X3d0aW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcwOQorb21wX2luX3BhcmFsbGVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MTAKK29tcF9pbml0X2xvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzExCitvbXBfaW5pdF9uZXN0X2xvY2sgICAgICAgICAgICAgICAgICAgICAgICAgIDcxMgorb21wX3NldF9keW5hbWljICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MTMKK29tcF9zZXRfbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzE0CitvbXBfc2V0X25lc3RfbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgIDcxNQorb21wX3NldF9uZXN0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MTYKK29tcF9zZXRfbnVtX3RocmVhZHMgICAgICAgICAgICAgICAgICAgICAgICAgNzE3CitvbXBfdGVzdF9sb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcxOAorb21wX3Rlc3RfbmVzdF9sb2NrICAgICAgICAgICAgICAgICAgICAgICAgICA3MTkKK29tcF91bnNldF9sb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzIwCitvbXBfdW5zZXRfbmVzdF9sb2NrICAgICAgICAgICAgICAgICAgICAgICAgIDcyMQorCitvbXBjX3NldF9keW5hbWljICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyMgorb21wY19zZXRfbmVzdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MjMKK29tcGNfc2V0X251bV90aHJlYWRzICAgICAgICAgICAgICAgICAgICAgICAgNzI0CisKK2ttcF9jYWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzI1CitrbXBfZnJlZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyNgora21wX2dldF9ibG9ja3RpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICA3MjcKK2ttcF9nZXRfbGlicmFyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzI4CitrbXBfZ2V0X3N0YWNrc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyOQora21wX21hbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MzAKKyNrbXBfcHJpbnRfYmFubmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDczMQora21wX3JlYWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MzIKK2ttcF9zZXRfYmxvY2t0aW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgNzM0CitrbXBfc2V0X2xpYnJhcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDczNQora21wX3NldF9saWJyYXJ5X3NlcmlhbCAgICAgICAgICAgICAgICAgICAgICA3MzcKK2ttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0ICAgICAgICAgICAgICAgICAgNzM4CitrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZCAgICAgICAgICAgICAgICAgIDczOQorIyBrbXBfc2V0X3BhcmFsbGVsX25hbWUgICAgICAgICAgICAgICAgICAgICAgIDc0MAora21wX3NldF9zdGFja3NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICA3NDEKKyMga21wX3NldF9zdGF0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3NDIKK2ttcF9nZXRfbnVtX2tub3duX3RocmVhZHMgICAgICAgICAgICAgICAgICAgNzQzCitrbXBfc2V0X3N0YWNrc2l6ZV9zICAgICAgICAgICAgICAgICAgICAgICAgIDc0NAora21wX2dldF9zdGFja3NpemVfcyAgICAgICAgICAgICAgICAgICAgICAgICA3NDUKK2ttcF9zZXRfZGVmYXVsdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzQ2CitrbXBfc2V0X3dhcm5pbmdzX29uICAgICAgICAgICAgICAgICAgICAgICAgIDc3OQora21wX3NldF93YXJuaW5nc19vZmYgICAgICAgICAgICAgICAgICAgICAgICA3ODAKKworJWlmZGVmIE9NUF8zMAorICAgIG9tcF9nZXRfYWN0aXZlX2xldmVsICAgICAgICAgICAgICAgICAgICA3ODkKKyAgICBvbXBfZ2V0X2xldmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgNzkwCisgICAgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtICAgICAgICAgICAgIDc5MQorICAgIG9tcF9nZXRfdGVhbV9zaXplICAgICAgICAgICAgICAgICAgICAgICA3OTIKKyAgICBvbXBfZ2V0X3RocmVhZF9saW1pdCAgICAgICAgICAgICAgICAgICAgNzkzCisgICAgb21wX2dldF9tYXhfYWN0aXZlX2xldmVscyAgICAgICAgICAgICAgIDc5NAorICAgIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMgICAgICAgICAgICAgICA3OTUKKyAgICBvbXBfZ2V0X3NjaGVkdWxlICAgICAgICAgICAgICAgICAgICAgICAgNzk2CisgICAgb21wX3NldF9zY2hlZHVsZSAgICAgICAgICAgICAgICAgICAgICAgIDc5NworICAgIG9tcGNfc2V0X21heF9hY3RpdmVfbGV2ZWxzICAgICAgICAgICAgICA3OTgKKyAgICBvbXBjX3NldF9zY2hlZHVsZSAgICAgICAgICAgICAgICAgICAgICAgNzk5CisgICAgb21wY19nZXRfYW5jZXN0b3JfdGhyZWFkX251bSAgICAgICAgICAgIDgwMAorICAgIG9tcGNfZ2V0X3RlYW1fc2l6ZSAgICAgICAgICAgICAgICAgICAgICA4MDEKKyAgICBrbXBfc2V0X2FmZmluaXR5ICAgICAgICAgICAgICAgICAgICAgICAgODUwCisgICAga21wX2dldF9hZmZpbml0eSAgICAgICAgICAgICAgICAgICAgICAgIDg1MQorICAgIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MgICAgICAgICAgICAgICA4NTIKKyAgICBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sgICAgICAgICAgICAgICAgODUzCisgICAga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzayAgICAgICAgICAgICAgIDg1NAorICAgIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jICAgICAgICAgICAgICA4NTUKKyAgICBrbXBjX3NldF9hZmZpbml0eV9tYXNrX3Byb2MgICAgICAgICAgICAgODU2CisgICAga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyAgICAgICAgICAgIDg1NworICAgIGttcGNfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jICAgICAgICAgICA4NTgKKyAgICBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyAgICAgICAgICAgICAgODU5CisgICAga21wY19nZXRfYWZmaW5pdHlfbWFza19wcm9jICAgICAgICAgICAgIDg2MAorJWVuZGlmICMgT01QXzMwCisKKyMgT3Blbk1QIDMuMQorCislaWZkZWYgT01QXzMwCisgICAgb21wX2luX2ZpbmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg2MQorJWVuZGlmICMgT01QXzMwCisKKyMgT3Blbk1QIDQwCisKKyVpZmRlZiBPTVBfNDAKKyAgICBvbXBfZ2V0X3Byb2NfYmluZCAgICAgICAgICAgICAgICAgICAgICAgODYyCisgICAjb21wX3NldF9wcm9jX2JpbmQgICAgICAgICAgICAgICAgICAgICAgIDg2MworICAgI29tcF9jdXJyX3Byb2NfYmluZCAgICAgICAgICAgICAgICAgICAgICA4NjQKKyAgICBvbXBfZ2V0X251bV90ZWFtcyAgICAgICAgICAgICAgICAgICAgICAgODY1CisgICAgb21wX2dldF90ZWFtX251bSAgICAgICAgICAgICAgICAgICAgICAgIDg2NgorICAgIG9tcF9nZXRfY2FuY2VsbGF0aW9uICAgICAgICAgICAgICAgICAgICA4NjcKKyAgICBrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMgICAgICAgICAgICAgODY4CislZW5kaWYgIyBPTVBfNDAKKworJWlmbmRlZiBzdHViCisgICAgIyBPcmRpbmFscyBiZXR3ZWVuIDkwMCBhbmQgOTk5IGFyZSByZXNlcnZlZAorCisgICAgIyBPcmRpbmFscyBiZXR3ZWVuIDEwMDAgYW5kIDE5OTkgYXJlIHJlc2VydmVkCisgICAgIyBmb3IgdXNlci1jYWxsYWJsZSB1cHBlcmNhc2UgRm9ydHJhbiBlbnRyaWVzLgorCisKKyAgICAjIEFUT01JQyBlbnRyaWVzCisKKyAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2RpdiAgICAgICAgICAgICAgMjAwMAorICAgICVlbmRpZgorCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfYWRkICAgICAgICAgICAgICAgMjAwMQorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGIgICAgICAgICAgICAgIDIwMDIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXYgICAgICAgICAgICAgICAyMDAzCisgICAgX19rbXBjX2F0b21pY19maXhlZDF1X2RpdiAgICAgICAgICAgICAgMjAwNAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX211bCAgICAgICAgICAgICAgIDIwMDUKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmIgICAgICAgICAgICAgICAyMDA2CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc2hsICAgICAgICAgICAgICAgMjAwNworICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3NociAgICAgICAgICAgICAgIDIwMDgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc2hyICAgICAgICAgICAgICAyMDA5CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc3ViICAgICAgICAgICAgICAgMjAxMAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3hvciAgICAgICAgICAgICAgIDIwMTEKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2FkZCAgICAgICAgICAgICAgIDIwMTIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRiICAgICAgICAgICAgICAyMDEzCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfZGl2ICAgICAgICAgICAgICAgMjAxNAorICAgIF9fa21wY19hdG9taWNfZml4ZWQydV9kaXYgICAgICAgICAgICAgIDIwMTUKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWwgICAgICAgICAgICAgICAyMDE2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfb3JiICAgICAgICAgICAgICAgMjAxNworICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3NobCAgICAgICAgICAgICAgIDIwMTgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaHIgICAgICAgICAgICAgICAyMDE5CisgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X3NociAgICAgICAgICAgICAgMjAyMAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3N1YiAgICAgICAgICAgICAgIDIwMjEKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl94b3IgICAgICAgICAgICAgICAyMDIyCisKKyAgICNfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGQgICAgICAgICAgICMgZGVjbGFyZWQgYWJvdmUgIzEwMgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1YiAgICAgICAgICAgICAgIDIwMjQKKyAgICNfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGQgICAgICAgICAgICMgZGVjbGFyZWQgYWJvdmUgIzEwNAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1YiAgICAgICAgICAgICAgIDIwMjYKKyAgICNfX2ttcGNfYXRvbWljX2ZpeGVkOF9hZGQgICAgICAgICAgICMgZGVjbGFyZWQgYWJvdmUgIzEwMworICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1YiAgICAgICAgICAgICAgIDIwMjgKKyAgICNfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGQgICAgICAgICAgICMgZGVjbGFyZWQgYWJvdmUgIzEwNQorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X3N1YiAgICAgICAgICAgICAgIDIwMzAKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2FuZGIgICAgICAgICAgICAgIDIwMzEKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXYgICAgICAgICAgICAgICAyMDMyCisgICAgX19rbXBjX2F0b21pY19maXhlZDR1X2RpdiAgICAgICAgICAgICAgMjAzMworICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X211bCAgICAgICAgICAgICAgIDIwMzQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9vcmIgICAgICAgICAgICAgICAyMDM1CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc2hsICAgICAgICAgICAgICAgMjAzNgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3NociAgICAgICAgICAgICAgIDIwMzcKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc2hyICAgICAgICAgICAgICAyMDM4CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfeG9yICAgICAgICAgICAgICAgMjAzOQorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGIgICAgICAgICAgICAgIDIwNDAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXYgICAgICAgICAgICAgICAyMDQxCisgICAgX19rbXBjX2F0b21pY19maXhlZDh1X2RpdiAgICAgICAgICAgICAgMjA0MgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X211bCAgICAgICAgICAgICAgIDIwNDMKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmIgICAgICAgICAgICAgICAyMDQ0CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc2hsICAgICAgICAgICAgICAgMjA0NQorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3NociAgICAgICAgICAgICAgIDIwNDYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc2hyICAgICAgICAgICAgICAyMDQ3CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfeG9yICAgICAgICAgICAgICAgMjA0OAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X2RpdiAgICAgICAgICAgICAgIDIwNDkKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWwgICAgICAgICAgICAgICAyMDUwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfZGl2ICAgICAgICAgICAgICAgMjA1MQorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X211bCAgICAgICAgICAgICAgIDIwNTIKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGwgICAgICAgICAgICAgIDIwNTMKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmwgICAgICAgICAgICAgICAyMDU0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfYW5kbCAgICAgICAgICAgICAgMjA1NQorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX29ybCAgICAgICAgICAgICAgIDIwNTYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hbmRsICAgICAgICAgICAgICAyMDU3CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfb3JsICAgICAgICAgICAgICAgMjA1OAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGwgICAgICAgICAgICAgIDIwNTkKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmwgICAgICAgICAgICAgICAyMDYwCisKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tYXggICAgICAgICAgICAgICAyMDYxCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfbWluICAgICAgICAgICAgICAgMjA2MgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX21heCAgICAgICAgICAgICAgIDIwNjMKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9taW4gICAgICAgICAgICAgICAyMDY0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfbWF4ICAgICAgICAgICAgICAgMjA2NQorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X21pbiAgICAgICAgICAgICAgIDIwNjYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tYXggICAgICAgICAgICAgICAyMDY3CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfbWluICAgICAgICAgICAgICAgMjA2OAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X21heCAgICAgICAgICAgICAgIDIwNjkKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9taW4gICAgICAgICAgICAgICAyMDcwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfbWF4ICAgICAgICAgICAgICAgMjA3MQorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X21pbiAgICAgICAgICAgICAgIDIwNzIKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQxX25lcXYgICAgICAgICAgICAgIDIwNzMKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9uZXF2ICAgICAgICAgICAgICAyMDc0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfbmVxdiAgICAgICAgICAgICAgMjA3NQorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X25lcXYgICAgICAgICAgICAgIDIwNzYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9lcXYgICAgICAgICAgICAgICAyMDc3CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfZXF2ICAgICAgICAgICAgICAgMjA3OAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2VxdiAgICAgICAgICAgICAgIDIwNzkKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9lcXYgICAgICAgICAgICAgICAyMDgwCisKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkICAgICAgICAgICAgICAyMDgxCisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3N1YiAgICAgICAgICAgICAgMjA4MgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9tdWwgICAgICAgICAgICAgIDIwODMKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2ICAgICAgICAgICAgICAyMDg0CisKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9hZGQgICAgICAgICAgICAgICAyMDg1CisgICAgX19rbXBjX2F0b21pY19jbXBseDRfc3ViICAgICAgICAgICAgICAgMjA4NgorICAgIF9fa21wY19hdG9taWNfY21wbHg0X211bCAgICAgICAgICAgICAgIDIwODcKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXYgICAgICAgICAgICAgICAyMDg4CisgICAgX19rbXBjX2F0b21pY19jbXBseDhfYWRkICAgICAgICAgICAgICAgMjA4OQorICAgIF9fa21wY19hdG9taWNfY21wbHg4X3N1YiAgICAgICAgICAgICAgIDIwOTAKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9tdWwgICAgICAgICAgICAgICAyMDkxCisgICAgX19rbXBjX2F0b21pY19jbXBseDhfZGl2ICAgICAgICAgICAgICAgMjA5MgorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9hZGQgICAgICAgICAgICAgIDIwOTMKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3ViICAgICAgICAgICAgICAyMDk0CisgICAgX19rbXBjX2F0b21pY19jbXBseDEwX211bCAgICAgICAgICAgICAgMjA5NQorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9kaXYgICAgICAgICAgICAgIDIwOTYKKyAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2FkZCAgICAgICAgICAgICAgMjA5NworICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWIgICAgICAgICAgICAgIDIwOTgKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsICAgICAgICAgICAgICAyMDk5CisgICAjX19rbXBjX2F0b21pY19jbXBseDE2X2RpdiAgICAgICAgICAgICAgMjAwMCAjIG1vdmVkIHVwIGJlY2F1c2Ugb2YgbWlzdGFrZSBpbiBudW1iZXIgKHN1cHBvc2VkIHRvIGJlIDIxMDApCisKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYWRkICAgICAgICAgICAgICAyMTAxCisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1YiAgICAgICAgICAgICAgMjEwMgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9tdWwgICAgICAgICAgICAgIDIxMDMKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2ICAgICAgICAgICAgICAyMTA0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X21heCAgICAgICAgICAgICAgMjEwNQorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9taW4gICAgICAgICAgICAgIDIxMDYKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FkZF9mcCAgICAgICAgICAgIDIxMDcKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfZnAgICAgICAgICAgICAyMTA4CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfbXVsX2ZwICAgICAgICAgICAgMjEwOQorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9mcCAgICAgICAgICAgIDIxMTAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X2ZwICAgICAgICAgICAyMTExCisKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hZGRfZnAgICAgICAgICAgICAyMTEyCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfc3ViX2ZwICAgICAgICAgICAgMjExMworICAgIF9fa21wY19hdG9taWNfZml4ZWQyX211bF9mcCAgICAgICAgICAgIDIxMTQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfZnAgICAgICAgICAgICAyMTE1CisgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9mcCAgICAgICAgICAgMjExNgorCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfYWRkX2ZwICAgICAgICAgICAgMjExNworICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9mcCAgICAgICAgICAgIDIxMTgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWxfZnAgICAgICAgICAgICAyMTE5CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfZGl2X2ZwICAgICAgICAgICAgMjEyMAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXZfZnAgICAgICAgICAgIDIxMjEKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FkZF9mcCAgICAgICAgICAgIDIxMjIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfZnAgICAgICAgICAgICAyMTIzCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfbXVsX2ZwICAgICAgICAgICAgMjEyNAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9mcCAgICAgICAgICAgIDIxMjUKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2X2ZwICAgICAgICAgICAyMTI2CisKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGRfZnAgICAgICAgICAgICAyMTI3CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2ZwICAgICAgICAgICAgMjEyOAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X211bF9mcCAgICAgICAgICAgIDIxMjkKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfZnAgICAgICAgICAgICAyMTMwCisKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGRfZnAgICAgICAgICAgICAyMTMxCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2ZwICAgICAgICAgICAgMjEzMgorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X211bF9mcCAgICAgICAgICAgIDIxMzMKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfZnAgICAgICAgICAgICAyMTM0CisKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkX2ZwICAgICAgICAgICAyMTM1CisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9mcCAgICAgICAgICAgMjEzNgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9tdWxfZnAgICAgICAgICAgIDIxMzcKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X2ZwICAgICAgICAgICAyMTM4CisgICAgJWVuZGlmCisKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tdWxfZmxvYXQ4ICAgICAgICAyMTY5CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2Zsb2F0OCAgICAgICAgMjE3MAorCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfbXVsX2Zsb2F0OCAgICAgICAgMjE3NAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9mbG9hdDggICAgICAgIDIxNzUKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X211bF9mbG9hdDggICAgICAgIDIxNzkKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfZmxvYXQ4ICAgICAgICAyMTgwCisKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWxfZmxvYXQ4ICAgICAgICAyMTg0CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2Zsb2F0OCAgICAgICAgMjE4NQorCisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfYWRkX2Zsb2F0OCAgICAgICAgMjE4NworICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9mbG9hdDggICAgICAgIDIxODgKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWxfZmxvYXQ4ICAgICAgICAyMTg5CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X2Zsb2F0OCAgICAgICAgMjE5MAorCisgICAgX19rbXBjX2F0b21pY19jbXBseDRfYWRkX2NtcGx4OCAgICAgICAgMjIzMQorICAgIF9fa21wY19hdG9taWNfY21wbHg0X3N1Yl9jbXBseDggICAgICAgIDIyMzIKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9tdWxfY21wbHg4ICAgICAgICAyMjMzCisgICAgX19rbXBjX2F0b21pY19jbXBseDRfZGl2X2NtcGx4OCAgICAgICAgMjIzNAorCisgICAgX19rbXBjX2F0b21pY18xICAgICAgICAgICAgICAgICAgICAgICAgMjI0NworICAgIF9fa21wY19hdG9taWNfMiAgICAgICAgICAgICAgICAgICAgICAgIDIyNDgKKyAgICNfX2ttcGNfYXRvbWljXzQgICAgICAgICAgICAgICAgICAgICMgZGVjbGFyZWQgYWJvdmUgIzEwMAorICAgI19fa21wY19hdG9taWNfOCAgICAgICAgICAgICAgICAgICAgIyBkZWNsYXJlZCBhYm92ZSAjMTAxCisgICAgX19rbXBjX2F0b21pY18xMCAgICAgICAgICAgICAgICAgICAgICAgMjI1MQorICAgIF9fa21wY19hdG9taWNfMTYgICAgICAgICAgICAgICAgICAgICAgIDIyNTIKKyAgICBfX2ttcGNfYXRvbWljXzIwICAgICAgICAgICAgICAgICAgICAgICAyMjUzCisgICAgX19rbXBjX2F0b21pY18zMiAgICAgICAgICAgICAgICAgICAgICAgMjI1NAorCisgICAgJWlmZGVmIGFyY2hfMzIKKworICAgICAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9hZGRfYTE2ICAgICAgMjI1NQorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2ExNiAgICAgIDIyNTYKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X211bF9hMTYgICAgICAyMjU3CisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfYTE2ICAgICAgMjI1OAorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWF4X2ExNiAgICAgIDIyNTkKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X21pbl9hMTYgICAgICAyMjYwCisKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2FkZF9hMTYgICAgICAyMjYxCisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfYTE2ICAgICAgMjI2MgorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsX2ExNiAgICAgIDIyNjMKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9hMTYgICAgICAyMjY0CisgICAgICAgICVlbmRpZgorCisgICAgJWVuZGlmCisKKyAgICAlaWZuZGVmIGFyY2hfNjQKKworICAgICAgICAjIEFUT01JQyBleHRlbnNpb25zIGZvciBPcGVuTVAgMy4xIHNwZWMgKHg4NiBhbmQgeDY0IG9ubHkpCisKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfcmQgICAgICAgICAgICAgICAgMjI2NQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9yZCAgICAgICAgICAgICAgICAyMjY2CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3JkICAgICAgICAgICAgICAgIDIyNjcKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfcmQgICAgICAgICAgICAgICAgMjI2OAorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9yZCAgICAgICAgICAgICAgICAyMjY5CisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X3JkICAgICAgICAgICAgICAgIDIyNzAKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3JkICAgICAgICAgICAgICAgMjI3MQorICAgICAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9yZCAgICAgICAgICAgICAgIDIyNzIKKyAgICAgICAgJWVuZGlmCisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg0X3JkICAgICAgICAgICAgICAgIDIyNzMKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDhfcmQgICAgICAgICAgICAgICAgMjI3NAorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfcmQgICAgICAgICAgICAgICAyMjc1CisgICAgICAgICVpZmRlZiBIQVZFX1FVQUQKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3JkICAgICAgICAgICAgICAgMjI3NgorICAgICAgICAgICAgJWlmZGVmIGFyY2hfMzIKKyAgICAgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYTE2X3JkICAgICAgIDIyNzcKKyAgICAgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYTE2X3JkICAgICAgIDIyNzgKKyAgICAgICAgICAgICVlbmRpZgorICAgICAgICAlZW5kaWYKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfd3IgICAgICAgICAgICAgICAgMjI3OQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl93ciAgICAgICAgICAgICAgICAyMjgwCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3dyICAgICAgICAgICAgICAgIDIyODEKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfd3IgICAgICAgICAgICAgICAgMjI4MgorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF93ciAgICAgICAgICAgICAgICAyMjgzCisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X3dyICAgICAgICAgICAgICAgIDIyODQKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3dyICAgICAgICAgICAgICAgMjI4NQorICAgICAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl93ciAgICAgICAgICAgICAgIDIyODYKKyAgICAgICAgJWVuZGlmCisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg0X3dyICAgICAgICAgICAgICAgIDIyODcKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDhfd3IgICAgICAgICAgICAgICAgMjI4OAorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfd3IgICAgICAgICAgICAgICAyMjg5CisgICAgICAgICVpZmRlZiBIQVZFX1FVQUQKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3dyICAgICAgICAgICAgICAgMjI5MAorICAgICAgICAlaWZkZWYgYXJjaF8zMgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2ExNl93ciAgICAgICAyMjkxCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYTE2X3dyICAgICAgIDIyOTIKKyAgICAgICAgJWVuZGlmCisgICAgICAgICVlbmRpZgorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hZGRfY3B0ICAgICAgICAgICAyMjkzCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGJfY3B0ICAgICAgICAgIDIyOTQKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2NwdCAgICAgICAgICAgMjI5NQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X2NwdCAgICAgICAgICAyMjk2CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX211bF9jcHQgICAgICAgICAgIDIyOTcKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfb3JiX2NwdCAgICAgICAgICAgMjI5OAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaGxfY3B0ICAgICAgICAgICAyMjk5CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3Nocl9jcHQgICAgICAgICAgIDIzMDAKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDF1X3Nocl9jcHQgICAgICAgICAgMjMwMQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfY3B0ICAgICAgICAgICAyMzAyCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3hvcl9jcHQgICAgICAgICAgIDIzMDMKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfYWRkX2NwdCAgICAgICAgICAgMjMwNAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRiX2NwdCAgICAgICAgICAyMzA1CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9jcHQgICAgICAgICAgIDIzMDYKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9jcHQgICAgICAgICAgMjMwNworICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWxfY3B0ICAgICAgICAgICAyMzA4CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX29yYl9jcHQgICAgICAgICAgIDIzMDkKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfc2hsX2NwdCAgICAgICAgICAgMjMxMAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaHJfY3B0ICAgICAgICAgICAyMzExCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQydV9zaHJfY3B0ICAgICAgICAgIDIzMTIKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfc3ViX2NwdCAgICAgICAgICAgMjMxMworICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl94b3JfY3B0ICAgICAgICAgICAyMzE0CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2FkZF9jcHQgICAgICAgICAgIDIzMTUKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfc3ViX2NwdCAgICAgICAgICAgMjMxNgorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGRfY3B0ICAgICAgICAgICAyMzE3CisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9jcHQgICAgICAgICAgIDIzMTgKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfYWRkX2NwdCAgICAgICAgICAgMjMxOQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfY3B0ICAgICAgICAgICAyMzIwCisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X2FkZF9jcHQgICAgICAgICAgIDIzMjEKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2NwdCAgICAgICAgICAgMjMyMgorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hbmRiX2NwdCAgICAgICAgICAyMzIzCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9jcHQgICAgICAgICAgIDIzMjQKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDR1X2Rpdl9jcHQgICAgICAgICAgMjMyNQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWxfY3B0ICAgICAgICAgICAyMzI2CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X29yYl9jcHQgICAgICAgICAgIDIzMjcKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfc2hsX2NwdCAgICAgICAgICAgMjMyOAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHJfY3B0ICAgICAgICAgICAyMzI5CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHJfY3B0ICAgICAgICAgIDIzMzAKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfeG9yX2NwdCAgICAgICAgICAgMjMzMQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hbmRiX2NwdCAgICAgICAgICAyMzMyCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9jcHQgICAgICAgICAgIDIzMzMKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9jcHQgICAgICAgICAgMjMzNAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWxfY3B0ICAgICAgICAgICAyMzM1CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X29yYl9jcHQgICAgICAgICAgIDIzMzYKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfc2hsX2NwdCAgICAgICAgICAgMjMzNworICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHJfY3B0ICAgICAgICAgICAyMzM4CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zaHJfY3B0ICAgICAgICAgIDIzMzkKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfeG9yX2NwdCAgICAgICAgICAgMjM0MAorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfY3B0ICAgICAgICAgICAyMzQxCisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X211bF9jcHQgICAgICAgICAgIDIzNDIKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDhfZGl2X2NwdCAgICAgICAgICAgMjM0MworICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tdWxfY3B0ICAgICAgICAgICAyMzQ0CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGxfY3B0ICAgICAgICAgIDIzNDUKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfb3JsX2NwdCAgICAgICAgICAgMjM0NgorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRsX2NwdCAgICAgICAgICAyMzQ3CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX29ybF9jcHQgICAgICAgICAgIDIzNDgKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfYW5kbF9jcHQgICAgICAgICAgMjM0OQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9vcmxfY3B0ICAgICAgICAgICAyMzUwCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGxfY3B0ICAgICAgICAgIDIzNTEKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfb3JsX2NwdCAgICAgICAgICAgMjM1MgorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tYXhfY3B0ICAgICAgICAgICAyMzUzCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX21pbl9jcHQgICAgICAgICAgIDIzNTQKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfbWF4X2NwdCAgICAgICAgICAgMjM1NQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9taW5fY3B0ICAgICAgICAgICAyMzU2CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X21heF9jcHQgICAgICAgICAgIDIzNTcKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfbWluX2NwdCAgICAgICAgICAgMjM1OAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tYXhfY3B0ICAgICAgICAgICAyMzU5CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X21pbl9jcHQgICAgICAgICAgIDIzNjAKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDRfbWF4X2NwdCAgICAgICAgICAgMjM2MQorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9taW5fY3B0ICAgICAgICAgICAyMzYyCisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X21heF9jcHQgICAgICAgICAgIDIzNjMKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDhfbWluX2NwdCAgICAgICAgICAgMjM2NAorICAgICAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9tYXhfY3B0ICAgICAgICAgIDIzNjUKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X21pbl9jcHQgICAgICAgICAgMjM2NgorICAgICAgICAlZW5kaWYKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfbmVxdl9jcHQgICAgICAgICAgMjM2NworICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9uZXF2X2NwdCAgICAgICAgICAyMzY4CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X25lcXZfY3B0ICAgICAgICAgIDIzNjkKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfbmVxdl9jcHQgICAgICAgICAgMjM3MAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9lcXZfY3B0ICAgICAgICAgICAyMzcxCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2Vxdl9jcHQgICAgICAgICAgIDIzNzIKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfZXF2X2NwdCAgICAgICAgICAgMjM3MworICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9lcXZfY3B0ICAgICAgICAgICAyMzc0CisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9hZGRfY3B0ICAgICAgICAgIDIzNzUKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9jcHQgICAgICAgICAgMjM3NgorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfbXVsX2NwdCAgICAgICAgICAyMzc3CisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfY3B0ICAgICAgICAgIDIzNzgKKyAgICAgICAgJWlmZGVmIEhBVkVfUVVBRAorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYWRkX2NwdCAgICAgICAgICAyMzc5CisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfY3B0ICAgICAgICAgIDIzODAKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X211bF9jcHQgICAgICAgICAgMjM4MQorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2NwdCAgICAgICAgICAyMzgyCisgICAgICAgICVlbmRpZgorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9hZGRfY3B0ICAgICAgICAgICAyMzgzCisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg0X3N1Yl9jcHQgICAgICAgICAgIDIzODQKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDRfbXVsX2NwdCAgICAgICAgICAgMjM4NQorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXZfY3B0ICAgICAgICAgICAyMzg2CisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg4X2FkZF9jcHQgICAgICAgICAgIDIzODcKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDhfc3ViX2NwdCAgICAgICAgICAgMjM4OAorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9tdWxfY3B0ICAgICAgICAgICAyMzg5CisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg4X2Rpdl9jcHQgICAgICAgICAgIDIzOTAKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDEwX2FkZF9jcHQgICAgICAgICAgMjM5MQorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3ViX2NwdCAgICAgICAgICAyMzkyCisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9tdWxfY3B0ICAgICAgICAgIDIzOTMKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDEwX2Rpdl9jcHQgICAgICAgICAgMjM5NAorICAgICAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9hZGRfY3B0ICAgICAgICAgIDIzOTUKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9jcHQgICAgICAgICAgMjM5NgorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsX2NwdCAgICAgICAgICAyMzk3CisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfY3B0ICAgICAgICAgIDIzOTgKKyAgICAgICAgJWVuZGlmCisgICAgICAgI19fa21wY19hdG9taWNfY21wbHg0X2FkZF9jcHRfdG1wICAgICAgICAgICAgMjQwOQorCisgICAgICAgICVpZmRlZiBhcmNoXzMyCisgICAgICAgICVpZmRlZiBIQVZFX1FVQUQKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9hZGRfYTE2X2NwdCAgMjM5OQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9hMTZfY3B0ICAyNDAwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbXVsX2ExNl9jcHQgIDI0MDEKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfYTE2X2NwdCAgMjQwMgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X21heF9hMTZfY3B0ICAyNDAzCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWluX2ExNl9jcHQgIDI0MDQKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9hZGRfYTE2X2NwdCAgMjQwNQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9hMTZfY3B0ICAyNDA2CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsX2ExNl9jcHQgIDI0MDcKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfYTE2X2NwdCAgMjQwOAorICAgICAgICAlZW5kaWYKKyAgICAgICAgJWVuZGlmCisKKyAgICAgICAgX19rbXBjX2F0b21pY19zdGFydCAgICAgICAgICAgICAgICAgICAgMjQxMAorICAgICAgICBfX2ttcGNfYXRvbWljX2VuZCAgICAgICAgICAgICAgICAgICAgICAyNDExCisKKyAgICAgICAgJWlmZGVmIE9NUF80MAorCisgICAgICAgICAgICAjIEFUT01JQyBleHRlbnNpb25zIGZvciBPcGVuTVAgNC4wIHNwZWMgKHg4NiBhbmQgeDY0IG9ubHkpCisKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3N3cCAgICAgICAgICAgMjQxMgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfc3dwICAgICAgICAgICAyNDEzCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zd3AgICAgICAgICAgIDI0MTQKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3N3cCAgICAgICAgICAgMjQxNQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDRfc3dwICAgICAgICAgICAyNDE2CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zd3AgICAgICAgICAgIDI0MTcKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9zd3AgICAgICAgICAgMjQxOAorICAgICAgICAgICAgJWlmZGVmIEhBVkVfUVVBRAorICAgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3dwICAgICAgICAyNDE5CisgICAgICAgICAgICAlZW5kaWYKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg0X3N3cCAgICAgICAgICAgMjQyMAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDhfc3dwICAgICAgICAgICAyNDIxCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3dwICAgICAgICAgIDI0MjIKKyAgICAgICAgICAgICVpZmRlZiBIQVZFX1FVQUQKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9zd3AgICAgICAgICAgMjQyMworCisgICAgICAgICAgICAlaWZkZWYgYXJjaF8zMgorICAgICAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9hMTZfc3dwICAyNDI0CisgICAgICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2ExNl9zd3AgIDI0MjUKKyAgICAgICAgICAgICVlbmRpZgorICAgICAgICAgICAgJWVuZGlmCisKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3N1Yl9jcHRfcmV2ICAgMjQyNgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2NwdF9yZXYgICAyNDI3CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X2NwdF9yZXYgIDI0MjgKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3NobF9jcHRfcmV2ICAgMjQyOQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfc2hyX2NwdF9yZXYgICAyNDMwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc2hyX2NwdF9yZXYgIDI0MzEKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9jcHRfcmV2ICAgMjQzMgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfZGl2X2NwdF9yZXYgICAyNDMzCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2X2NwdF9yZXYgIDI0MzQKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3NobF9jcHRfcmV2ICAgMjQzNQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfc2hyX2NwdF9yZXYgICAyNDM2CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfc2hyX2NwdF9yZXYgIDI0MzcKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9jcHRfcmV2ICAgMjQzOAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfZGl2X2NwdF9yZXYgICAyNDM5CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X2NwdF9yZXYgIDI0NDAKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3NobF9jcHRfcmV2ICAgMjQ0MQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfc2hyX2NwdF9yZXYgICAyNDQyCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc2hyX2NwdF9yZXYgIDI0NDMKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1Yl9jcHRfcmV2ICAgMjQ0NAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2NwdF9yZXYgICAyNDQ1CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2X2NwdF9yZXYgIDI0NDYKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3NobF9jcHRfcmV2ICAgMjQ0NworICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfc2hyX2NwdF9yZXYgICAyNDQ4CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc2hyX2NwdF9yZXYgIDI0NDkKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9jcHRfcmV2ICAgMjQ1MAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X2NwdF9yZXYgICAyNDUxCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWJfY3B0X3JldiAgIDI0NTIKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X2Rpdl9jcHRfcmV2ICAgMjQ1MworICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9jcHRfcmV2ICAyNDU0CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X2NwdF9yZXYgIDI0NTUKKyAgICAgICAgICAgICVpZmRlZiBIQVZFX1FVQUQKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfY3B0X3JldiAgMjQ1NgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9jcHRfcmV2ICAyNDU3CisgICAgICAgICAgICAlZW5kaWYKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg0X3N1Yl9jcHRfcmV2ICAgMjQ1OAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDRfZGl2X2NwdF9yZXYgICAyNDU5CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9zdWJfY3B0X3JldiAgIDI0NjAKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg4X2Rpdl9jcHRfcmV2ICAgMjQ2MQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDEwX3N1Yl9jcHRfcmV2ICAyNDYyCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfZGl2X2NwdF9yZXYgIDI0NjMKKyAgICAgICAgICAgICVpZmRlZiBIQVZFX1FVQUQKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfY3B0X3JldiAgMjQ2NAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9jcHRfcmV2ICAyNDY1CisKKyAgICAgICAgICAgICVpZmRlZiBhcmNoXzMyCisgICAgICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9hMTZfY3B0X3JldiAgMjQ2NgorICAgICAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfYTE2X2NwdF9yZXYgIDI0NjcKKyAgICAgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2ExNl9jcHRfcmV2ICAyNDY4CisgICAgICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9hMTZfY3B0X3JldiAgMjQ2OQorICAgICAgICAgICAgJWVuZGlmCisgICAgICAgICAgICAlZW5kaWYKKworICAgICAgICAlZW5kaWYgICAjIE9NUF80MAorCisKKyAgICAlZW5kaWYgICAjIGFyY2hfNjQKKworJWVuZGlmCisKKyMgZW5kIG9mIGZpbGUgIwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvZXhwb3J0c19zby50eHQgYi9maW5hbC9ydW50aW1lL3NyYy9leHBvcnRzX3NvLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWNlNzhmCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvZXhwb3J0c19zby50eHQKQEAgLTAsMCArMSwxMDUgQEAKKyMgZXhwb3J0c19zby50eHQgIworCisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgVGhpcyBpcyB2ZXJzaW9uIHNjcmlwdCBmb3IgT01QIFJUTCBzaGFyZWQgbGlicmFyeSAobGliaW9tcDUqLnNvKQorCitWRVJTSU9OIHsKKworICAgIGdsb2JhbDogIyBFeHBvcnRlZCBzeW1ib2xzLgorCisgICAgICAgICMKKyAgICAgICAgIyAiTm9ybWFsIiBzeW1ib2xzLgorICAgICAgICAjCisgICAgICAgIG9tcF8qOyAgICAgIyBTdGFuZGFyZCBPcGVuTVAgZnVuY3Rpb25zLgorICAgICAgICBvbXBjXyo7ICAgICMgb21wLmggcmVuYW1lcyBzb21lIHN0YW5kYXJkIGZ1bmN0aW9ucyB0byBvbXBjXyouCisgICAgICAgIGttcF8qOyAgICAgIyBJbnRlbCBleHRlbnNpb25zLgorICAgICAgICBrbXBjXyo7ICAgICMgSW50ZWwgZXh0ZW5zaW9ucy4KKyAgICAgICAgX19rbXBjXyo7ICAjIEZ1bmN0aW9ucyBjYWxsZWQgYnkgY29tcGlsZXItZ2VuZXJhdGVkIGNvZGUuCisgICAgICAgIEdPTVBfKjsgICAgIyBHTlUgQyBjb21wYXRpYmlsaXR5IGZ1bmN0aW9ucy4KKworICAgICAgICBfWW91X211c3RfbGlua193aXRoXyo7ICAgICAjIE11dHVhbCBkZXRlY3Rpb24vTVMgY29tcGF0aWJpbGl0eSBzeW1ib2xzLgorCisKKworICAgICAgICAjCisgICAgICAgICMgSW50ZXJuYWwgZnVuY3Rpb25zIGV4cG9ydGVkIGZvciB0ZXN0aW5nIHB1cnBvc2VzLgorICAgICAgICAjCisgICAgICAgIF9fa21wX2dldF9yZWR1Y2VfbWV0aG9kOworICAgICAgICBfX19rbXBfYWxsb2NhdGU7CisgICAgICAgIF9fX2ttcF9mcmVlOworICAgICAgICBfX2ttcF90aHJlYWRfcG9vbDsKKyAgICAgICAgX19rbXBfdGhyZWFkX3Bvb2xfbnRoOworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAjCisgICAgICAgICMgSVRUIHN1cHBvcnQuCisgICAgICAgICMKKyAgICAgICAgIyBUaGUgZm9sbG93aW5nIGVudHJ5IHBvaW50cyBhcmUgYWRkZWQgc28gdGhhdCB0aGUgYmFja3RyYWNlcyBmcm9tCisgICAgICAgICMgdGhlIHRvb2xzIGNvbnRhaW4gbWVhbmluZ2Z1bCBuYW1lcyBmb3IgYWxsIHRoZSBmdW5jdGlvbnMgdGhhdCBtaWdodAorICAgICAgICAjIGFwcGVhciBpbiBhIGJhY2t0cmFjZSBvZiBhIHRocmVhZCB3aGljaCBpcyBibG9ja2VkIGluIHRoZSBSVEwuCisgICAgICAgIF9fa21wX2FjcXVpcmVfZHJkcGFfbG9jazsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9uZXN0ZWRfZHJkcGFfbG9jazsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9uZXN0ZWRfcXVldWluZ19sb2NrOworICAgICAgICBfX2ttcF9hY3F1aXJlX25lc3RlZF90YXNfbG9jazsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9uZXN0ZWRfdGlja2V0X2xvY2s7CisgICAgICAgIF9fa21wX2FjcXVpcmVfcXVldWluZ19sb2NrOworICAgICAgICBfX2ttcF9hY3F1aXJlX3Rhc19sb2NrOworICAgICAgICBfX2ttcF9hY3F1aXJlX3RpY2tldF9sb2NrOworICAgICAgICBfX2ttcF9mb3JrX2NhbGw7CisgICAgICAgIF9fa21wX2dldF9yZWR1Y2VfbWV0aG9kOworICAgICAgICBfX2ttcF9pbnZva2VfbWljcm90YXNrOworICAgICAgICBfX2ttcF9pdHRfZmluaV9pdHRsaWI7CisgICAgICAgIF9fa21wX2l0dF9pbml0X2l0dGxpYjsKKyAgICAgICAgX19rbXBfbGF1bmNoX21vbml0b3I7CisgICAgICAgIF9fa21wX2xhdW5jaF93b3JrZXI7CisgICAgICAgIF9fa21wX3JlYXBfbW9uaXRvcjsKKyAgICAgICAgX19rbXBfcmVhcF93b3JrZXI7CisgICAgICAgIF9fa21wX3JlbGVhc2U7CisgICAgICAgIF9fa21wX3dhaXRfc2xlZXA7CisgICAgICAgIF9fa21wX3dhaXRfeWllbGRfNDsKKyAgICAgICAgX19rbXBfd2FpdF95aWVsZF84OworCisgICAgICAgICMgaXR0bm90aWZ5IHN5bWJvbHMgdG8gYmUgdXNlZCBieSBkZWJ1Z2dlcgorICAgICAgICBfX2ttcF9pdHRfZmluaV9pdHRsaWI7CisgICAgICAgIF9fa21wX2l0dF9pbml0X2l0dGxpYjsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICBsb2NhbDogIyBOb24tZXhwb3J0ZWQgc3ltYm9scy4KKworICAgICAgICAqOyAgICAgICAgICMgQWxsIG90aGVyIHN5bWJvbHMgYXJlIG5vdCBleHBvcnRlZC4KKworfTsgIyBWRVJTSU9OCisKKyMgc2V0cyB1cCBHQ0MgT01QXyB2ZXJzaW9uIGRlcGVuZGVuY3kgY2hhaW4KK09NUF8xLjAgeworfTsKK09NUF8yLjAgeworfSBPTVBfMS4wOworT01QXzMuMCB7Cit9IE9NUF8yLjA7CitPTVBfMy4xIHsKK30gT01QXzMuMDsKK09NUF80LjAgeworfSBPTVBfMy4xOworCisjIHNldHMgdXAgR0NDIEdPTVBfIHZlcnNpb24gZGVwZW5kZW5jeSBjaGFpbgorR09NUF8xLjAgeworfTsKK0dPTVBfMi4wIHsKK30gR09NUF8xLjA7CitHT01QXzMuMCB7Cit9IEdPTVBfMi4wOworR09NUF80LjAgeworfSBHT01QXzMuMDsKKworIyBlbmQgb2YgZmlsZSAjCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9leHRyYWN0RXh0ZXJuYWwuY3BwIGIvZmluYWwvcnVudGltZS9zcmMvZXh0cmFjdEV4dGVybmFsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjE1YzhlCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvZXh0cmFjdEV4dGVybmFsLmNwcApAQCAtMCwwICsxLDQ5OSBAQAorLyoKKyAqIGV4dHJhY3RFeHRlcm5hbC5jcHAKKyAqICRSZXZpc2lvbjogNDIxODEgJAorICogJERhdGU6IDIwMTMtMDMtMjYgMTU6MDQ6NDUgLTA1MDAgKFR1ZSwgMjYgTWFyIDIwMTMpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHN0cnN0cmVhbT4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8bWFwPgorCisvKiBHaXZlbiBhIHNldCBvZiBuIG9iamVjdCBmaWxlcyBoICgnZXh0ZXJuYWwnIG9iamVjdCBmaWxlcykgYW5kIGEgc2V0IG9mIG0KKyAgIG9iamVjdCBmaWxlcyBvICgnaW50ZXJuYWwnIG9iamVjdCBmaWxlcyksCisgICAxLiBEZXRlcm1pbmVzIHIsIHRoZSBzdWJzZXQgb2YgaCB0aGF0IG8gZGVwZW5kcyBvbiwgZGlyZWN0bHkgb3IgaW5kaXJlY3RseQorICAgMi4gUmVtb3ZlcyB0aGUgZmlsZXMgaW4gaCAtIHIgZnJvbSB0aGUgZmlsZSBzeXN0ZW0KKyAgIDMuIEZvciBlYWNoIGV4dGVybmFsIHN5bWJvbCBkZWZpbmVkIGluIHNvbWUgZmlsZSBpbiByLCByZW5hbWUgaXQgaW4gciBVIG8KKyAgICAgIGJ5IHByZWZpeGluZyBpdCB3aXRoICJfX2ttcF9leHRlcm5hbF8iCisgICBVc2FnZToKKyAgIGhpZGUuZXhlIDxuPiA8ZmlsZW5hbWVzIGZvciBoPiA8ZmlsZW5hbWVzIGZvciBvPgorCisgICBUaHVzLCB0aGUgcHJlZml4ZWQgc3ltYm9scyBiZWNvbWUgaGlkZGVuIGluIHRoZSBzZW5zZSB0aGF0IHRoZXkgbm93IGhhdmUgYSBzcGVjaWFsCisgICBwcmVmaXguCisqLworCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCit2b2lkIHN0b3AoY2hhciogZXJyb3JNc2cpIHsKKyAgICBwcmludGYoIiVzXG4iLCBlcnJvck1zZyk7CisgICAgZXhpdCgxKTsKK30KKworLy8gYW4gZW50cnkgaW4gdGhlIHN5bWJvbCB0YWJsZSBvZiBhIC5PQkogZmlsZQorY2xhc3MgU3ltYm9sIHsKK3B1YmxpYzoKKyAgICBfX2ludDY0IG5hbWU7CisgICAgdW5zaWduZWQgdmFsdWU7CisgICAgdW5zaWduZWQgc2hvcnQgc2VjdGlvbk51bSwgdHlwZTsKKyAgICBjaGFyIHN0b3JhZ2VDbGFzcywgbkF1eDsKK307CisKK2NsYXNzIF9yc3RyZWFtIDogcHVibGljIGlzdHJzdHJlYW0geworcHJpdmF0ZToKKyAgICBjb25zdCBjaGFyICpidWY7Citwcm90ZWN0ZWQ6CisgICAgX3JzdHJlYW0ocGFpcjxjb25zdCBjaGFyKiwgc3RyZWFtc2l6ZT4gcCk6aXN0cnN0cmVhbShwLmZpcnN0LHAuc2Vjb25kKSxidWYocC5maXJzdCl7fQorICAgIH5fcnN0cmVhbSgpIHsKKwlkZWxldGVbXWJ1ZjsKKyAgICB9Cit9OworCisvKiBBIHN0cmVhbSBlbmNhcHVzbGF0aW5nIHRoZSBjb250ZW50IG9mIGEgZmlsZSBvciB0aGUgY29udGVudCBvZiBhIHN0cmluZywgb3ZlcnJpZGluZyB0aGUKKyAgID4+IG9wZXJhdG9yIHRvIHJlYWQgdmFyaW91cyBpbnRlZ2VyIHR5cGVzIGluIGJpbmFyeSBmb3JtLCBhcyB3ZWxsIGFzIGEgc3ltYm9sIHRhYmxlCisgICBlbnRyeS4KKyovCitjbGFzcyByc3RyZWFtIDogcHVibGljIF9yc3RyZWFtIHsKK3ByaXZhdGU6CisgICAgdGVtcGxhdGU8Y2xhc3MgVD4KKyAgICBpbmxpbmUgcnN0cmVhbSYgZG9SZWFkKFQgJngpIHsKKwlyZWFkKChjaGFyKikmeCwgc2l6ZW9mKFQpKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgfQorICAgIHN0YXRpYyBwYWlyPGNvbnN0IGNoYXIqLCBzdHJlYW1zaXplPiBnZXRCdWYoY29uc3QgY2hhciAqZmlsZU5hbWUpIHsKKwlpZnN0cmVhbSByYXcoZmlsZU5hbWUsaW9zOjpiaW5hcnkgfCBpb3M6OmluKTsKKwlpZighcmF3LmlzX29wZW4oKSkKKwkgICAgc3RvcCgicnN0cmVhbS5nZXRCdWY6IEVycm9yIG9wZW5pbmcgZmlsZSIpOworCXJhdy5zZWVrZygwLGlvczo6ZW5kKTsKKwlzdHJlYW1wb3MgZmlsZVNpemUgPSByYXcudGVsbGcoKTsKKwlpZihmaWxlU2l6ZSA8IDApCisJICAgIHN0b3AoInJzdHJlYW0uZ2V0QnVmOiBFcnJvciByZWFkaW5nIGZpbGUiKTsKKwljaGFyICpidWYgPSBuZXcgY2hhcltmaWxlU2l6ZV07CisJcmF3LnNlZWtnKDAsaW9zOjpiZWcpOworCXJhdy5yZWFkKGJ1ZiwgZmlsZVNpemUpOworCXJldHVybiBwYWlyPGNvbnN0IGNoYXIqLCBzdHJlYW1zaXplPihidWYsZmlsZVNpemUpOworICAgIH0KK3B1YmxpYzoKKyAgICAvLyBjb25zdHJ1Y3QgZnJvbSBhIHN0cmluZworICAgIHJzdHJlYW0oY29uc3QgY2hhciAqYnVmLHN0cmVhbXNpemUgc2l6ZSk6X3JzdHJlYW0ocGFpcjxjb25zdCBjaGFyKixzdHJlYW1zaXplPihidWYsIHNpemUpKXt9CisgICAgLyogY29uc3RydWN0IGZyb20gYSBmaWxlIHdob2xlIGNvbnRlbnQgaXMgZnVsbHkgcmVhZCBvbmNlIHRvIGluaXRpYWxpemUgdGhlIGNvbnRlbnQgb2YKKyAgICAgICB0aGlzIHN0cmVhbQorICAgICovCisgICAgcnN0cmVhbShjb25zdCBjaGFyICpmaWxlTmFtZSk6X3JzdHJlYW0oZ2V0QnVmKGZpbGVOYW1lKSl7fQorICAgIHJzdHJlYW0mIG9wZXJhdG9yPj4oaW50ICZ4KSB7CisJcmV0dXJuIGRvUmVhZCh4KTsKKyAgICB9CisgICAgcnN0cmVhbSYgb3BlcmF0b3I+Pih1bnNpZ25lZCAmeCkgeworCXJldHVybiBkb1JlYWQoeCk7CisgICAgfQorICAgIHJzdHJlYW0mIG9wZXJhdG9yPj4oc2hvcnQgJngpIHsKKwlyZXR1cm4gZG9SZWFkKHgpOworICAgIH0KKyAgICByc3RyZWFtJiBvcGVyYXRvcj4+KHVuc2lnbmVkIHNob3J0ICZ4KSB7CisJcmV0dXJuIGRvUmVhZCh4KTsKKyAgICB9CisgICAgcnN0cmVhbSYgb3BlcmF0b3I+PihTeW1ib2wgJmUpIHsKKwlyZWFkKChjaGFyKikmZSwgMTgpOworCXJldHVybiAqdGhpczsKKyAgICB9Cit9OworCisvLyBzdHJpbmcgdGFibGUgaW4gYSAuT0JKIGZpbGUKK2NsYXNzIFN0cmluZ1RhYmxlIHsKK3ByaXZhdGU6CisgICAgbWFwPHN0cmluZywgdW5zaWduZWQ+IGRpcmVjdG9yeTsKKyAgICBzaXplX3QgbGVuZ3RoOworICAgIGNoYXIgKmRhdGE7CisKKyAgICAvLyBtYWtlIDxkaXJlY3Rvcnk+IGZyb20gPGxlbmd0aD4gYnl0ZXMgaW4gPGRhdGE+CisgICAgdm9pZCBtYWtlRGlyZWN0b3J5KHZvaWQpIHsKKwl1bnNpZ25lZCBpID0gNDsKKwl3aGlsZShpIDwgbGVuZ3RoKSB7CisJICAgIHN0cmluZyBzID0gc3RyaW5nKGRhdGEgKyBpKTsKKwkgICAgZGlyZWN0b3J5Lmluc2VydChtYWtlX3BhaXIocywgaSkpOworCSAgICBpICs9IHMuc2l6ZSgpICsgMTsKKwl9CisgICAgfQorICAgIC8vIGluaXRpYWxpemUgPGxlbmd0aD4gYW5kIDxkYXRhPiB3aXRoIGNvbnRlbnRzIHNwZWNpZmllZCBieSB0aGUgYXJndW1lbnRzCisgICAgdm9pZCBpbml0KGNvbnN0IGNoYXIgKl9kYXRhKSB7CisJdW5zaWduZWQgX2xlbmd0aCA9ICoodW5zaWduZWQqKV9kYXRhOworCisJaWYoX2xlbmd0aCA8IHNpemVvZih1bnNpZ25lZCkgfHwgX2xlbmd0aCAhPSAqKHVuc2lnbmVkKilfZGF0YSkKKwkgICAgc3RvcCgiU3RyaW5nVGFibGUuaW5pdDogSW52YWxpZCBzeW1ib2wgdGFibGUiKTsKKwlpZihfZGF0YVtfbGVuZ3RoIC0gMV0pIHsKKwkgICAgLy8gdG8gcHJldmVudCBydW5hd2F5IHN0cmluZ3MsIG1ha2Ugc3VyZSB0aGUgZGF0YSBlbmRzIHdpdGggYSB6ZXJvCisJICAgIGRhdGEgPSBuZXcgY2hhcltsZW5ndGggPSBfbGVuZ3RoICsgMV07CisJICAgIGRhdGFbX2xlbmd0aF0gPSAwOworCX0gZWxzZSB7CisJICAgIGRhdGEgPSBuZXcgY2hhcltsZW5ndGggPSBfbGVuZ3RoXTsKKwl9CisJKih1bnNpZ25lZCopZGF0YSA9IGxlbmd0aDsKKwltZW1jcHkoZGF0YSArIHNpemVvZih1bnNpZ25lZCksIF9kYXRhICsgc2l6ZW9mKHVuc2lnbmVkKSwKKwkgICAgICAgbGVuZ3RoIC0gc2l6ZW9mKHVuc2lnbmVkKSk7CisJbWFrZURpcmVjdG9yeSgpOworICAgIH0KK3B1YmxpYzoKKyAgICBTdHJpbmdUYWJsZShyc3RyZWFtICZmKSB7CisJLyogQ29uc3RydWN0IHN0cmluZyB0YWJsZSBieSByZWFkaW5nIGZyb20gZi4KKwkgKi8KKwlzdHJlYW1wb3MgczsKKwl1bnNpZ25lZCBzdHJTaXplOworCWNoYXIgKnN0ckRhdGE7CisKKwlzID0gZi50ZWxsZygpOworCWY+PnN0clNpemU7CisJaWYoc3RyU2l6ZSA8IHNpemVvZih1bnNpZ25lZCkpCisJICAgIHN0b3AoIlN0cmluZ1RhYmxlOiBJbnZhbGlkIHN0cmluZyB0YWJsZSIpOworCXN0ckRhdGEgPSBuZXcgY2hhcltzdHJTaXplXTsKKwkqKHVuc2lnbmVkKilzdHJEYXRhID0gc3RyU2l6ZTsKKwkvLyByZWFkIHRoZSByYXcgZGF0YSBpbnRvIDxzdHJEYXRhPgorCWYucmVhZChzdHJEYXRhICsgc2l6ZW9mKHVuc2lnbmVkKSwgc3RyU2l6ZSAtIHNpemVvZih1bnNpZ25lZCkpOworCXMgPSBmLnRlbGxnKCkgLSBzOworCWlmKHMgPCBzdHJTaXplKQorCSAgICBzdG9wKCJTdHJpbmdUYWJsZTogVW5leHBlY3RlZCBFT0YiKTsKKwlpbml0KHN0ckRhdGEpOworCWRlbGV0ZVtdc3RyRGF0YTsKKyAgICB9CisgICAgU3RyaW5nVGFibGUoY29uc3Qgc2V0PHN0cmluZz4gJnN0cmluZ3MpIHsKKwkvKiBDb25zdHJ1Y3Qgc3RyaW5nIHRhYmxlIGZyb20gZ2l2ZW4gc3RyaW5ncy4KKwkgKi8KKwljaGFyICpwOworCXNldDxzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdDsKKwlzaXplX3QgczsKKworCS8vIGNvdW50IHJlcXVpcmVkIHNpemUgZm9yIGRhdGEKKwlmb3IobGVuZ3RoID0gc2l6ZW9mKHVuc2lnbmVkKSwgaXQgPSBzdHJpbmdzLmJlZ2luKCk7IGl0ICE9IHN0cmluZ3MuZW5kKCk7ICsraXQpIHsKKwkgICAgc2l6ZV90IGwgPSAoKml0KS5zaXplKCk7CisKKwkgICAgaWYobCA+ICh1bnNpZ25lZCkgMHhGRkZGRkZGRikKKwkJc3RvcCgiU3RyaW5nVGFibGU6IFN0cmluZyB0b28gbG9uZyIpOworCSAgICBpZihsID4gOCkgeworCQlsZW5ndGggKz0gbCArIDE7CisJCWlmKGxlbmd0aCA+ICh1bnNpZ25lZCkgMHhGRkZGRkZGRikKKwkJICAgIHN0b3AoIlN0cmluZ1RhYmxlOiBTeW1ib2wgdGFibGUgdG9vIGxvbmciKTsKKwkgICAgfQorCX0KKwlkYXRhID0gbmV3IGNoYXJbbGVuZ3RoXTsKKwkqKHVuc2lnbmVkKilkYXRhID0gbGVuZ3RoOworCS8vIHBvcHVsYXRlIGRhdGEgYW5kIGRpcmVjdG9yeQorCWZvcihwID0gZGF0YSArIHNpemVvZih1bnNpZ25lZCksIGl0ID0gc3RyaW5ncy5iZWdpbigpOyBpdCAhPSBzdHJpbmdzLmVuZCgpOyArK2l0KSB7CisJICAgIGNvbnN0IHN0cmluZyAmc3RyID0gKml0OworCSAgICBzaXplX3QgbCA9IHN0ci5zaXplKCk7CisJICAgIGlmKGwgPiA4KSB7CisJCWRpcmVjdG9yeS5pbnNlcnQobWFrZV9wYWlyKHN0ciwgcCAtIGRhdGEpKTsKKwkJbWVtY3B5KHAsIHN0ci5jX3N0cigpLCBsKTsKKwkJcFtsXSA9IDA7CisJCXAgKz0gbCArIDE7CisJICAgIH0KKwl9CisgICAgfQorICAgIH5TdHJpbmdUYWJsZSgpIHsKKwlkZWxldGVbXSBkYXRhOworICAgIH0KKyAgICAvKiBSZXR1cm5zIGVuY29kaW5nIGZvciBnaXZlbiBzdHJpbmcgYmFzZWQgb24gdGhpcyBzdHJpbmcgdGFibGUuCisgICAgICAgRXJyb3IgaWYgc3RyaW5nIGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gOCBidXQgc3RyaW5nIGlzIG5vdCBpbgorICAgICAgIHRoZSBzdHJpbmcgdGFibGUtLXJldHVybnMgMC4KKyAgICAqLworICAgIF9faW50NjQgZW5jb2RlKGNvbnN0IHN0cmluZyAmc3RyKSB7CisJX19pbnQ2NCByOworCisJaWYoc3RyLnNpemUoKSA8PSA4KSB7CisJICAgIC8vIGVuY29kZWQgZGlyZWN0bHkKKwkgICAgKChjaGFyKikmcilbN10gPSAwOworCSAgICBzdHJuY3B5KChjaGFyKikmciwgc3RyLmNfc3RyKCksIDgpOworCSAgICByZXR1cm4gcjsKKwl9IGVsc2UgeworCSAgICAvLyByZXByZXNlbnRlZCBhcyBpbmRleCBpbnRvIHRhYmxlCisJICAgIG1hcDxzdHJpbmcsdW5zaWduZWQ+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGRpcmVjdG9yeS5maW5kKHN0cik7CisJICAgIGlmKGl0ID09IGRpcmVjdG9yeS5lbmQoKSkKKwkJc3RvcCgiU3RyaW5nVGFibGU6OmVuY29kZTogU3RyaW5nIG5vdyBmb3VuZCBpbiBzdHJpbmcgdGFibGUiKTsKKwkgICAgKCh1bnNpZ25lZCopJnIpWzBdID0gMDsKKwkgICAgKCh1bnNpZ25lZCopJnIpWzFdID0gKCppdCkuc2Vjb25kOworCSAgICByZXR1cm4gcjsKKwl9CisgICAgfQorICAgIC8qIFJldHVybnMgc3RyaW5nIHJlcHJlc2VudGVkIGJ5IHggYmFzZWQgb24gdGhpcyBzdHJpbmcgdGFibGUuCisgICAgICAgRXJyb3IgaWYgeCByZWZlcmVuY2VzIGFuIGludmFsaWQgcG9zaXRpb24gaW4gdGhlIHRhYmxlLS1yZXR1cm5zCisgICAgICAgdGhlIGVtcHR5IHN0cmluZy4KKyAgICAqLworICAgIHN0cmluZyBkZWNvZGUoX19pbnQ2NCB4KSBjb25zdCB7CisJaWYoKih1bnNpZ25lZCopJnggPT0gMCkgeworCSAgICAvLyByZXByZXNlbnRlZCBhcyBpbmRleCBpbnRvIHRhYmxlCisJICAgIHVuc2lnbmVkICZwID0gKCh1bnNpZ25lZCopJngpWzFdOworCSAgICBpZihwID49IGxlbmd0aCkKKwkJc3RvcCgiU3RyaW5nVGFibGU6OmRlY29kZTogSW52YWxpZCBzdHJpbmcgdGFibGUgbG9va3VwIik7CisJICAgIHJldHVybiBzdHJpbmcoZGF0YSArIHApOworCX0gZWxzZSB7CisJICAgIC8vIGVuY29kZWQgZGlyZWN0bHkKKwkgICAgY2hhciAqcCA9IChjaGFyKikmeDsKKwkgICAgaW50IGk7CisKKwkgICAgZm9yKGkgPSAwOyBpIDwgOCAmJiBwW2ldOyArK2kpOworCSAgICByZXR1cm4gc3RyaW5nKHAsIGkpOworCX0KKyAgICB9CisgICAgdm9pZCB3cml0ZShvc3RyZWFtICZvcykgeworCW9zLndyaXRlKGRhdGEsIGxlbmd0aCk7CisgICAgfQorfTsKKworLyogZm9yIHRoZSBuYW1lZCBvYmplY3QgZmlsZSwgZGV0ZXJtaW5lcyB0aGUgc2V0IG9mIGRlZmluZWQgc3ltYm9scyBhbmQgdGhlIHNldCBvZiB1bmRlZmluZWQgZXh0ZXJuYWwgc3ltYm9scworICAgYW5kIHdyaXRlcyB0aGVtIHRvIDxkZWZpbmVkPiBhbmQgPHVuZGVmaW5lZD4gcmVzcGVjdGl2ZWx5CisqLwordm9pZCBjb21wdXRlRXh0ZXJuYWxTeW1ib2xzKGNvbnN0IGNoYXIgKmZpbGVOYW1lLCBzZXQ8c3RyaW5nPiAqZGVmaW5lZCwgc2V0PHN0cmluZz4gKnVuZGVmaW5lZCl7CisgICAgc3RyZWFtcG9zIGZpbGVTaXplOworICAgIHNpemVfdCBzdHJUYWJTdGFydDsKKyAgICB1bnNpZ25lZCBzeW1UYWJTdGFydCwgc3ltTkVudHJpZXM7CisgICAgcnN0cmVhbSBmKGZpbGVOYW1lKTsKKworICAgIGYuc2Vla2coMCxpb3M6OmVuZCk7CisgICAgZmlsZVNpemUgPSBmLnRlbGxnKCk7CisKKyAgICBmLnNlZWtnKDgpOworICAgIGYgPj4gc3ltVGFiU3RhcnQgPj4gc3ltTkVudHJpZXM7CisgICAgLy8gc2VlayB0byB0aGUgc3RyaW5nIHRhYmxlCisgICAgZi5zZWVrZyhzdHJUYWJTdGFydCA9IHN5bVRhYlN0YXJ0ICsgMTggKiAoc2l6ZV90KXN5bU5FbnRyaWVzKTsKKyAgICBpZihmLmVvZigpKSB7CisJcHJpbnRmKCJjb21wdXRlRXh0ZXJuYWxTeW1ib2xzOiBmaWxlTmFtZT0nJXMnLCBmaWxlU2l6ZSA9ICVsdSwgc3ltVGFiU3RhcnQgPSAldSwgc3ltTkVudHJpZXMgPSAldVxuIiwKKwkgICAgICAgZmlsZU5hbWUsICh1bnNpZ25lZCBsb25nKSBmaWxlU2l6ZSwgc3ltVGFiU3RhcnQsIHN5bU5FbnRyaWVzKTsKKwlzdG9wKCJjb21wdXRlRXh0ZXJuYWxTeW1ib2xzOiBVbmV4cGVjdGVkIEVPRiAxIik7CisgICAgfQorICAgIFN0cmluZ1RhYmxlIHN0cmluZ1RhYmxlKGYpOyAvLyByZWFkIHRoZSBzdHJpbmcgdGFibGUKKyAgICBpZihmLnRlbGxnKCkgIT0gZmlsZVNpemUpCisJc3RvcCgiY29tcHV0ZUV4dGVybmFsU3ltYm9sczogVW5leHBlY3RlZCBkYXRhIGFmdGVyIHN0cmluZyB0YWJsZSIpOworCisgICAgZi5jbGVhcigpOworICAgIGYuc2Vla2coc3ltVGFiU3RhcnQpOyAvLyBzZWVrIHRvIHRoZSBzeW1ib2wgdGFibGUKKworICAgIGRlZmluZWQtPmNsZWFyKCk7IHVuZGVmaW5lZC0+Y2xlYXIoKTsKKyAgICBmb3IoaW50IGkgPSAwOyBpIDwgc3ltTkVudHJpZXM7ICsraSkgeworCS8vIHByb2Nlc3MgZWFjaCBlbnRyeQorCVN5bWJvbCBlOworCisJaWYoZi5lb2YoKSkKKwkgICAgc3RvcCgiY29tcHV0ZUV4dGVybmFsU3ltYm9sczogVW5leHBlY3RlZCBFT0YgMiIpOworCWY+PmU7CisJaWYoZi5mYWlsKCkpCisJICAgIHN0b3AoImNvbXB1dGVFeHRlcm5hbFN5bWJvbHM6IEZpbGUgcmVhZCBlcnJvciIpOworCWlmKGUubkF1eCkgeyAvLyBhdXhpbGlhcnkgZW50cnk6IHNraXAKKwkgICAgZi5zZWVrZyhlLm5BdXggKiAxOCwgaW9zOjpjdXIpOworCSAgICBpICs9IGUubkF1eDsKKwl9CisJLy8gaWYgc3ltYm9sIGlzIGV4dGVybiBhbmQgZGVmaW5lZCBpbiB0aGUgY3VycmVudCBmaWxlLCBpbnNlcnQgaXQKKwlpZihlLnN0b3JhZ2VDbGFzcyA9PSAyKQorCSAgICBpZihlLnNlY3Rpb25OdW0pCisJCWRlZmluZWQtPmluc2VydChzdHJpbmdUYWJsZS5kZWNvZGUoZS5uYW1lKSk7CisJICAgIGVsc2UKKwkJdW5kZWZpbmVkLT5pbnNlcnQoc3RyaW5nVGFibGUuZGVjb2RlKGUubmFtZSkpOworICAgIH0KK30KKworLyogRm9yIGVhY2ggb2NjdXJyZW5jZSBvZiBhbiBleHRlcm5hbCBzeW1ib2wgaW4gdGhlIG9iamVjdCBmaWxlIG5hbWVkIGJ5CisgICBieSA8ZmlsZU5hbWU+IHRoYXQgaXMgYSBtZW1iZXIgb2YgPGhpZGU+LCByZW5hbWVzIGl0IGJ5IHByZWZpeGluZworICAgd2l0aCAiX19rbXBfZXh0ZXJuYWxfIiwgd3JpdGluZyBiYWNrIHRoZSBmaWxlIGluLXBsYWNlCisqLwordm9pZCBoaWRlU3ltYm9scyhjaGFyICpmaWxlTmFtZSwgY29uc3Qgc2V0PHN0cmluZz4gJmhpZGUpIHsKKyAgICBzdGF0aWMgY29uc3Qgc3RyaW5nIHByZWZpeCgiX19rbXBfZXh0ZXJuYWxfIik7CisgICAgc2V0PHN0cmluZz4gc3RyaW5nczsgLy8gc2V0IG9mIGFsbCBvY2N1cnJpbmcgc3ltYm9scywgYXBwcm9wcmlhdGVseSBwcmVmaXhlZAorICAgIHN0cmVhbXBvcyBmaWxlU2l6ZTsKKyAgICBzaXplX3Qgc3RyVGFiU3RhcnQ7CisgICAgdW5zaWduZWQgc3ltVGFiU3RhcnQsIHN5bU5FbnRyaWVzOworICAgIGludCBpOworICAgIHJzdHJlYW0gaW4oZmlsZU5hbWUpOworCisgICAgaW4uc2Vla2coMCxpb3M6OmVuZCk7CisgICAgZmlsZVNpemUgPSBpbi50ZWxsZygpOworCisgICAgaW4uc2Vla2coOCk7CisgICAgaW4gPj4gc3ltVGFiU3RhcnQgPj4gc3ltTkVudHJpZXM7CisgICAgaW4uc2Vla2coc3RyVGFiU3RhcnQgPSBzeW1UYWJTdGFydCArIDE4ICogKHNpemVfdClzeW1ORW50cmllcyk7CisgICAgaWYoaW4uZW9mKCkpCisJc3RvcCgiaGlkZVN5bWJvbHM6IFVuZXhwZWN0ZWQgRU9GIik7CisgICAgU3RyaW5nVGFibGUgc3RyaW5nVGFibGVPbGQoaW4pOyAvLyByZWFkIG9yaWdpbmFsIHN0cmluZyB0YWJsZQorCisgICAgaWYoaW4udGVsbGcoKSAhPSBmaWxlU2l6ZSkKKwlzdG9wKCJoaWRlU3ltYm9sczogVW5leHBlY3RlZCBkYXRhIGFmdGVyIHN0cmluZyB0YWJsZSIpOworCisgICAgLy8gY29tcHV0ZSBzZXQgb2Ygb2NjdXJyaW5nIHN0cmluZ3Mgd2l0aCBwcmVmaXggYWRkZWQKKyAgICBmb3IoaSA9IDA7IGkgPCBzeW1ORW50cmllczsgKytpKSB7CisJU3ltYm9sIGU7CisKKwlpbi5zZWVrZyhzeW1UYWJTdGFydCArIGkgKiAxOCk7CisJaWYoaW4uZW9mKCkpCisJICAgIHN0b3AoImhpZGVTeW1ib2xzOiBVbmV4cGVjdGVkIEVPRiIpOworCWluID4+IGU7CisJaWYoaW4uZmFpbCgpKQorCSAgICBzdG9wKCJoaWRlU3ltYm9sczogRmlsZSByZWFkIGVycm9yIik7CisJaWYoZS5uQXV4KQorCSAgICBpICs9IGUubkF1eDsKKwljb25zdCBzdHJpbmcgJnMgPSBzdHJpbmdUYWJsZU9sZC5kZWNvZGUoZS5uYW1lKTsKKwkvLyBpZiBzeW1ib2wgaXMgZXh0ZXJuIGFuZCBmb3VuZCBpbiA8aGlkZT4sIHByZWZpeCBhbmQgaW5zZXJ0IGludG8gc3RyaW5ncywKKwkvLyBvdGhlcndpc2UsIGp1c3QgaW5zZXJ0IGludG8gc3RyaW5ncyB3aXRob3V0IHByZWZpeAorCXN0cmluZ3MuaW5zZXJ0KCAoZS5zdG9yYWdlQ2xhc3MgPT0gMiAmJiBoaWRlLmZpbmQocykgIT0gaGlkZS5lbmQoKSkgPworCQkJcHJlZml4ICsgcyA6IHMpOworICAgIH0KKworICAgIG9mc3RyZWFtIG91dChmaWxlTmFtZSwgaW9zOjp0cnVuYyB8IGlvczo6b3V0IHwgaW9zOjpiaW5hcnkpOworICAgIGlmKCFvdXQuaXNfb3BlbigpKQorCXN0b3AoImhpZGVTeW1ib2xzOiBFcnJvciBvcGVuaW5nIG91dHB1dCBmaWxlIik7CisKKyAgICAvLyBtYWtlIG5ldyBzdHJpbmcgdGFibGUgZnJvbSBzdHJpbmcgc2V0CisgICAgU3RyaW5nVGFibGUgc3RyaW5nVGFibGVOZXcgPSBTdHJpbmdUYWJsZShzdHJpbmdzKTsKKworICAgIC8vIGNvcHkgaW5wdXQgZmlsZSB0byBvdXRwdXQgZmlsZSB1cCB0byBqdXN0IGJlZm9yZSB0aGUgc3ltYm9sIHRhYmxlCisgICAgaW4uc2Vla2coMCk7CisgICAgY2hhciAqYnVmID0gbmV3IGNoYXJbc3ltVGFiU3RhcnRdOworICAgIGluLnJlYWQoYnVmLCBzeW1UYWJTdGFydCk7CisgICAgb3V0LndyaXRlKGJ1Ziwgc3ltVGFiU3RhcnQpOworICAgIGRlbGV0ZSBbXWJ1ZjsKKworICAgIC8vIGNvcHkgaW5wdXQgc3ltYm9sIHRhYmxlIHRvIG91dHB1dCBzeW1ib2wgdGFibGUgd2l0aCBuYW1lIHRyYW5zbGF0aW9uCisgICAgZm9yKGkgPSAwOyBpIDwgc3ltTkVudHJpZXM7ICsraSkgeworCVN5bWJvbCBlOworCisJaW4uc2Vla2coc3ltVGFiU3RhcnQgKyBpKjE4KTsKKwlpZihpbi5lb2YoKSkKKwkgICAgc3RvcCgiaGlkZVN5bWJvbHM6IFVuZXhwZWN0ZWQgRU9GIik7CisJaW4gPj4gZTsKKwlpZihpbi5mYWlsKCkpCisJICAgIHN0b3AoImhpZGVTeW1ib2xzOiBGaWxlIHJlYWQgZXJyb3IiKTsKKwljb25zdCBzdHJpbmcgJnMgPSBzdHJpbmdUYWJsZU9sZC5kZWNvZGUoZS5uYW1lKTsKKwlvdXQuc2Vla3Aoc3ltVGFiU3RhcnQgKyBpKjE4KTsKKwllLm5hbWUgPSBzdHJpbmdUYWJsZU5ldy5lbmNvZGUoIChlLnN0b3JhZ2VDbGFzcyA9PSAyICYmIGhpZGUuZmluZChzKSAhPSBoaWRlLmVuZCgpKSA/CisJCQkJCXByZWZpeCArIHMgOiBzKTsKKwlvdXQud3JpdGUoKGNoYXIqKSZlLCAxOCk7CisJaWYob3V0LmZhaWwoKSkKKwkgICAgc3RvcCgiaGlkZVN5bWJvbHM6IEZpbGUgd3JpdGUgZXJyb3IiKTsKKwlpZihlLm5BdXgpIHsKKwkgICAgLy8gY29weSBhdXhpbGlhcnkgc3ltYm9sIHRhYmxlIGVudHJpZXMKKwkgICAgaW50IG5BdXggPSBlLm5BdXg7CisJICAgIGZvcihpbnQgaiA9IDE7IGogPD0gbkF1eDsgKytqKSB7CisJCWluID4+IGU7CisJCW91dC5zZWVrcChzeW1UYWJTdGFydCArIChpICsgaikgKiAxOCk7CisJCW91dC53cml0ZSgoY2hhciopJmUsIDE4KTsKKwkgICAgfQorCSAgICBpICs9IG5BdXg7CisJfQorICAgIH0KKyAgICAvLyBvdXRwdXQgc3RyaW5nIHRhYmxlCisgICAgc3RyaW5nVGFibGVOZXcud3JpdGUob3V0KTsKK30KKworLy8gcmV0dXJucyB0cnVlIGlmZiA8YT4gYW5kIDxiPiBoYXZlIG5vIGNvbW1vbiBlbGVtZW50Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2Jvb2wgaXNEaXNqb2ludChjb25zdCBzZXQ8VD4gJmEsIGNvbnN0IHNldDxUPiAmYikgeworICAgIHNldDxUPjo6Y29uc3RfaXRlcmF0b3IgaXRhLCBpdGI7CisKKyAgICBmb3IoaXRhID0gYS5iZWdpbigpLCBpdGIgPSBiLmJlZ2luKCk7IGl0YSAhPSBhLmVuZCgpICYmIGl0YiAhPSBiLmVuZCgpOykgeworCWNvbnN0IFQgJnRhID0gKml0YSwgJnRiID0gKml0YjsKKwlpZih0YSA8IHRiKQorCSAgICArK2l0YTsKKwllbHNlIGlmICh0YiA8IHRhKQorCSAgICArK2l0YjsKKwllbHNlCisJICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qIHByZWNvbmRpdGlvbjogPGRlZmluZWQ+IGFuZCA8dW5kZWZpbmVkPiBhcmUgYXJyYXlzIHdpdGggPG5Ub3RhbD4gZWxlbWVudHMgd2hlcmUKKyAgIDxuVG90YWw+ID49IDxuRXh0ZXJuYWw+LiAgVGhlIGZpcnN0IDxuRXh0ZXJuYWw+IGVsZW1lbnRzIGNvcnJlc3BvbmQgdG8gdGhlIGV4dGVybmFsIG9iamVjdAorICAgZmlsZXMgYW5kIHRoZSByZXN0IGNvcnJlc3BvbmQgdG8gdGhlIGludGVybmFsIG9iamVjdCBmaWxlcy4KKyAgIHBvc3Rjb25kaXRpb246IGZpbGUgeCBpcyBzYWlkIHRvIGRlcGVuZCBvbiBmaWxlIHkgaWYgdW5kZWZpbmVkW3hdIGFuZCBkZWZpbmVkW3ldIGFyZSBub3QKKyAgIGRpc2pvaW50LiAgUmV0dXJucyB0aGUgdHJhbnNpdGl2ZSBjbG9zdXJlIG9mIHRoZSBzZXQgb2YgaW50ZXJuYWwgb2JqZWN0IGZpbGVzLCBhcyBhIHNldCBvZgorICAgZmlsZSBpbmRleGVzLCB1bmRlciB0aGUgJ2RlcGVuZHMgb24nIHJlbGF0aW9uLCBtaW51cyB0aGUgc2V0IG9mIGludGVybmFsIG9iamVjdCBmaWxlcy4KKyovCitzZXQ8aW50PiAqZmluZFJlcXVpcmVkRXh0ZXJuYWwoaW50IG5FeHRlcm5hbCwgaW50IG5Ub3RhbCwgc2V0PHN0cmluZz4gKmRlZmluZWQsIHNldDxzdHJpbmc+ICp1bmRlZmluZWQpIHsKKyAgICBzZXQ8aW50PiAqcmVxdWlyZWQgPSBuZXcgc2V0PGludD47CisgICAgc2V0PGludD4gZnJlc2hbMl07CisgICAgaW50IGksIGN1ciA9IDA7CisgICAgYm9vbCBjaGFuZ2VkOworCisgICAgZm9yKGkgPSBuVG90YWwgLSAxOyBpID49IG5FeHRlcm5hbDsgLS1pKQorCWZyZXNoW2N1cl0uaW5zZXJ0KGkpOworICAgIGRvIHsKKwljaGFuZ2VkID0gZmFsc2U7CisJZm9yKHNldDxpbnQ+OjppdGVyYXRvciBpdCA9IGZyZXNoW2N1cl0uYmVnaW4oKTsgaXQgIT0gZnJlc2hbY3VyXS5lbmQoKTsgKytpdCkgeworCSAgICBzZXQ8c3RyaW5nPiAmcyA9IHVuZGVmaW5lZFsqaXRdOworCisJICAgIGZvcihpID0gMDsgaSA8IG5FeHRlcm5hbDsgKytpKSB7CisJCWlmKHJlcXVpcmVkLT5maW5kKGkpID09IHJlcXVpcmVkLT5lbmQoKSkgeworCQkgICAgaWYoIWlzRGlzam9pbnQoZGVmaW5lZFtpXSwgcykpIHsKKwkJCS8vIGZvdW5kIGEgbmV3IHF1YWxpZnlpbmcgZWxlbWVudAorCQkJcmVxdWlyZWQtPmluc2VydChpKTsKKwkJCWZyZXNoWzEgLSBjdXJdLmluc2VydChpKTsKKwkJCWNoYW5nZWQgPSB0cnVlOworCQkgICAgfQorCQl9CisJICAgIH0KKwl9CisJZnJlc2hbY3VyXS5jbGVhcigpOworCWN1ciA9IDEgLSBjdXI7CisgICAgfSB3aGlsZShjaGFuZ2VkKTsKKyAgICByZXR1cm4gcmVxdWlyZWQ7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIGludCBuRXh0ZXJuYWwsIG5JbnRlcm5hbCwgaTsKKyAgICBzZXQ8c3RyaW5nPiAqZGVmaW5lZCwgKnVuZGVmaW5lZDsKKyAgICBzZXQ8aW50Pjo6aXRlcmF0b3IgaXQ7CisKKyAgICBpZihhcmdjIDwgMykKKwlzdG9wKCJQbGVhc2Ugc3BlY2lmeSBhIHBvc2l0aXZlIGludGVnZXIgZm9sbG93ZWQgYnkgYSBsaXN0IG9mIG9iamVjdCBmaWxlbmFtZXMiKTsKKyAgICBuRXh0ZXJuYWwgPSBhdG9pKGFyZ3ZbMV0pOworICAgIGlmKG5FeHRlcm5hbCA8PSAwKQorCXN0b3AoIlBsZWFzZSBzcGVjaWZ5IGEgcG9zaXRpdmUgaW50ZWdlciBmb2xsb3dlZCBieSBhIGxpc3Qgb2Ygb2JqZWN0IGZpbGVuYW1lcyIpOworICAgIGlmKG5FeHRlcm5hbCArICAyID4gYXJnYykKKwlzdG9wKCJUb28gZmV3IGV4dGVybmFsIG9iamVjdHMiKTsKKyAgICBuSW50ZXJuYWwgPSBhcmdjIC0gbkV4dGVybmFsIC0gMjsKKyAgICBkZWZpbmVkID0gbmV3IHNldDxzdHJpbmc+W2FyZ2MgLSAyXTsKKyAgICB1bmRlZmluZWQgPSBuZXcgc2V0PHN0cmluZz5bYXJnYyAtIDJdOworCisgICAgLy8gZGV0ZXJtaW5lIHRoZSBzZXQgb2YgZGVmaW5lZCBhbmQgdW5kZWZpbmVkIGV4dGVybmFsIHN5bWJvbHMKKyAgICBmb3IoaSA9IDI7IGkgPCBhcmdjOyArK2kpCisJY29tcHV0ZUV4dGVybmFsU3ltYm9scyhhcmd2W2ldLCBkZWZpbmVkICsgaSAtIDIsIHVuZGVmaW5lZCArIGkgLSAyKTsKKworICAgIC8vIGRldGVybWluZSB0aGUgc2V0IG9mIHJlcXVpcmVkIGV4dGVybmFsIGZpbGVzCisgICAgc2V0PGludD4gKnJlcXVpcmVkRXh0ZXJuYWwgPSBmaW5kUmVxdWlyZWRFeHRlcm5hbChuRXh0ZXJuYWwsIGFyZ2MgLSAyLCBkZWZpbmVkLCB1bmRlZmluZWQpOworICAgIHNldDxzdHJpbmc+IGhpZGU7CisKKyAgICAvKiBkZXRlcm1pbmUgdGhlIHNldCBvZiBzeW1ib2xzIHRvIGhpZGUtLW5hbWVseSBkZWZpbmVkIGV4dGVybmFsIHN5bWJvbHMgb2YgdGhlCisgICAgICAgcmVxdWlyZWQgZXh0ZXJuYWwgZmlsZXMKKyAgICAqLworICAgIGZvcihpdCA9IHJlcXVpcmVkRXh0ZXJuYWwtPmJlZ2luKCk7IGl0ICE9IHJlcXVpcmVkRXh0ZXJuYWwtPmVuZCgpOyArK2l0KSB7CisJaW50IGlkeCA9ICppdDsKKwlzZXQ8c3RyaW5nPjo6aXRlcmF0b3IgaXQyOworCS8qIFdlIGhhdmUgdG8gaW5zZXJ0IG9uZSBlbGVtZW50IGF0IGEgdGltZSBpbnN0ZWFkIG9mIGluc2VydGluZyBhIHJhbmdlIGJlY2F1c2UKKwkgICB0aGUgaW5zZXJ0IG1lbWJlciBmdW5jdGlvbiB0YWtpbmcgYSByYW5nZSBkb2Vzbid0IGV4aXN0IG9uIFdpbmRvd3MqIE9TLCBhdCBsZWFzdAorCSAgIGF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZy4KKwkqLworCWZvcihpdDIgPSBkZWZpbmVkW2lkeF0uYmVnaW4oKTsgaXQyICE9IGRlZmluZWRbaWR4XS5lbmQoKTsgKytpdDIpCisJICAgIGhpZGUuaW5zZXJ0KCppdDIpOworICAgIH0KKworICAgIC8qIHByb2Nlc3MgdGhlIGV4dGVybmFsIGZpbGVzLS1yZW1vdmluZyB0aG9zZSB0aGF0IGFyZSBub3QgcmVxdWlyZWQgYW5kIGhpZGluZworICAgICAgIHRoZSBhcHByb3ByaWF0ZSBzeW1ib2xzIGluIHRoZSBvdGhlcnMKKyAgICAqLworICAgIGZvcihpID0gMDsgaSA8IG5FeHRlcm5hbDsgKytpKQorCWlmKHJlcXVpcmVkRXh0ZXJuYWwtPmZpbmQoaSkgIT0gcmVxdWlyZWRFeHRlcm5hbC0+ZW5kKCkpCisJICAgIGhpZGVTeW1ib2xzKGFyZ3ZbMiArIGldLCBoaWRlKTsKKwllbHNlCisJICAgIHJlbW92ZShhcmd2WzIgKyBpXSk7CisgICAgLy8gaGlkZSB0aGUgYXBwcm9wcmlhdGUgc3ltYm9scyBpbiB0aGUgaW50ZXJuYWwgZmlsZXMKKyAgICBmb3IoaSA9IG5FeHRlcm5hbCArIDI7IGkgPCBhcmdjOyArK2kpCisJaGlkZVN5bWJvbHMoYXJndltpXSwgaGlkZSk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9pMThuL2VuX1VTLnR4dCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2kxOG4vZW5fVVMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNzJkM2UKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9pMThuL2VuX1VTLnR4dApAQCAtMCwwICsxLDQ2NCBAQAorIyBlbl9VUy50eHQgIworIyAkUmV2aXNpb246IDQyNjU5ICQKKyMgJERhdGU6IDIwMTMtMDktMTIgMDk6MjI6NDggLTA1MDAgKFRodSwgMTIgU2VwIDIwMTMpICQKKworIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCisjIERlZmF1bHQgbWVzc2FnZXMsIGVtYmVkZGVkIGludG8gdGhlIE9wZW5NUCBSVEwsIGFuZCBzb3VyY2UgZm9yIEVuZ2xpc2ggY2F0YWxvZy4KKworCisjIENvbXBhdGlibGUgY2hhbmdlcyAod2hpY2ggZG9lcyBub3QgcmVxdWlyZSB2ZXJzaW9uIGJ1bXBpbmcpOgorIyAgICAgKiBFZGl0aW5nIG1lc3NhZ2UgKG51bWJlciBhbmQgdHlwZSBvZiBwbGFjZWhvbGRlcnMgbXVzdCByZW1haW4sIHJlbGF0aXZlIG9yZGVyIG9mCisjICAgICAgIHBsYWNlaG9sZGVycyBtYXkgYmUgY2hhbmdlZCwgZS5nLiAiRmlsZSAlMSRzIGxpbmUgJTIkZCIgbWF5IGJlIHNhZmVseSBlZGl0ZWQgdG8KKyMgICAgICAgIkxpbmUgJTIkZCBmaWxlICUxJHMiKS4KKyMgICAgICogQWRkaW5nIG5ldyBtZXNzYWdlIHRvIHRoZSBlbmQgb2Ygc2VjdGlvbi4KKyMgSW5jb21wYXRpYmxlIGNoYW5nZXMgKHZlcnNpb24gbXVzdCBiZSBidW1iZWQgYnkgMSk6CisjICAgICAqIEludHJvZHVjaW5nIG5ldyBwbGFjZWhvbGRlcnMgdG8gZXhpc3RpbmcgbWVzc2FnZXMuCisjICAgICAqIENoYW5naW5nIHR5cGUgb2YgcGxhY2Vob2xkZXJzIChlLmcuICJsaW5lICUxJGQiIC0+ICJsaW5lICUxJHMiKS4KKyMgICAgICogUmVhcnJhbmdpbmcgb3JkZXIgb2YgbWVzc2FnZXMuCisjICAgICAqIERlbGV0aW5nIG1lc3NhZ2VzLgorIyBVc2Ugc3BlY2lhbCAiT0JTT0xFVEUiIHBzZXVkb2lkZW50aWZpZXIgZm9yIG9ic29sZXRlIGVudHJpZXMsIHdoaWNoIGlzIGtlcHQgb25seSBmb3IgYmFja3dhcmQKKyMgY29tcGF0aWJpbGl0eS4gV2hlbiB2ZXJzaW9uIGlzIGJ1bXBlZCwgZG8gbm90IGZvcmdldCB0byBkZWxldGUgYWxsIG9ic29sZXRlIGVudHJpZXMuCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLSotIE1FVEEgLSotCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgTWV0YSBpbmZvcm1hdGlvbiBhYm91dCBtZXNzYWdlIGNhdGFsb2cuCisKK0xhbmd1YWdlICJFbmdsaXNoIgorQ291bnRyeSAgIlVTQSIKK0xhbmdJZCAgICIxMDMzIgorVmVyc2lvbiAgIjIiCitSZXZpc2lvbiAiMjAxMzA5MTEiCisKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistKi0gU1RSSU5HUyAtKi0KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBTdHJpbmdzIGFyZSBub3QgY29tcGxldGUgbWVzc2FnZXMsIGp1c3QgZnJhZ21lbnRzLiBXZSBuZWVkIHRvIHdvcmsgb24gaXQgYW5kIHJlZHVjZSBudW1iZXIgb2YKKyMgc3RyaW5ncyAodG8gemVybz8pLgorCitFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciIKK1Vua25vd25GaWxlICAgICAgICAgICAgICAgICAgIih1bmtub3duIGZpbGUpIgorTm90QU51bWJlciAgICAgICAgICAgICAgICAgICAibm90IGEgbnVtYmVyIgorQmFkVW5pdCAgICAgICAgICAgICAgICAgICAgICAiYmFkIHVuaXQiCitJbGxlZ2FsQ2hhcmFjdGVycyAgICAgICAgICAgICJpbGxlZ2FsIGNoYXJhY3RlcnMiCitWYWx1ZVRvb0xhcmdlICAgICAgICAgICAgICAgICJ2YWx1ZSB0b28gbGFyZ2UiCitWYWx1ZVRvb1NtYWxsICAgICAgICAgICAgICAgICJ2YWx1ZSB0b28gc21hbGwiCitOb3RNdWx0aXBsZTRLICAgICAgICAgICAgICAgICJ2YWx1ZSBpcyBub3QgYSBtdWx0aXBsZSBvZiA0ayIKK1Vua25vd25Ub3BvbG9neSAgICAgICAgICAgICAgIlVua25vd24gcHJvY2Vzc29yIHRvcG9sb2d5IgorQ2FudE9wZW5DcHVpbmZvICAgICAgICAgICAgICAiQ2Fubm90IG9wZW4gL3Byb2MvY3B1aW5mbyIKK1Byb2NDcHVpbmZvICAgICAgICAgICAgICAgICAgIi9wcm9jL2NwdWluZm8iCitOb1Byb2NSZWNvcmRzICAgICAgICAgICAgICAgICJjcHVpbmZvIGZpbGUgaW52YWxpZCAoTm8gcHJvY2Vzc29yIHJlY29yZHMpIgorVG9vTWFueVByb2NSZWNvcmRzICAgICAgICAgICAiY3B1aW5mbyBmaWxlIGludmFsaWQgKFRvbyBtYW55IHByb2Nlc3NvciByZWNvcmRzKSIKK0NhbnRSZXdpbmRDcHVpbmZvICAgICAgICAgICAgIkNhbm5vdCByZXdpbmQgY3B1aW5mbyBmaWxlIgorTG9uZ0xpbmVDcHVpbmZvICAgICAgICAgICAgICAiY3B1aW5mbyBmaWxlIGludmFsaWQgKGxvbmcgbGluZSkiCitUb29NYW55RW50cmllcyAgICAgICAgICAgICAgICJjcHVpbmZvIGZpbGUgY29udGFpbnMgdG9vIG1hbnkgZW50cmllcyIKK01pc3NpbmdQcm9jRmllbGQgICAgICAgICAgICAgImNwdWluZm8gZmlsZSBtaXNzaW5nIHByb2Nlc3NvciBmaWVsZCIKK01pc3NpbmdQaHlzaWNhbElERmllbGQgICAgICAgImNwdWluZm8gZmlsZSBtaXNzaW5nIHBoeXNpY2FsIGlkIGZpZWxkIgorTWlzc2luZ1ZhbENwdWluZm8gICAgICAgICAgICAiY3B1aW5mbyBmaWxlIGludmFsaWQgKG1pc3NpbmcgdmFsKSIKK0R1cGxpY2F0ZUZpZWxkQ3B1aW5mbyAgICAgICAgImNwdWluZm8gZmlsZSBpbnZhbGlkIChkdXBsaWNhdGUgZmllbGQpIgorUGh5c2ljYWxJRHNOb3RVbmlxdWUgICAgICAgICAiUGh5c2ljYWwgbm9kZS9wa2cvY29yZS90aHJlYWQgaWRzIG5vdCB1bmlxdWUiCitBcGljTm90UHJlc2VudCAgICAgICAgICAgICAgICJBUElDIG5vdCBwcmVzZW50IgorSW52YWxpZENwdWlkSW5mbyAgICAgICAgICAgICAiSW52YWxpZCBjcHVpZCBpbmZvIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiQVBJQyBpZHMgbm90IHVuaXF1ZSIKK0luY29uc2lzdGVudENwdWlkSW5mbyAgICAgICAgIkluY29uc2lzdGVudCBjcHVpZCBpbmZvIgorT3V0T2ZIZWFwTWVtb3J5ICAgICAgICAgICAgICAiT3V0IG9mIGhlYXAgbWVtb3J5IgorTWVtb3J5QWxsb2NGYWlsZWQgICAgICAgICAgICAiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIgorQ29yZSAgICAgICAgICAgICAgICAgICAgICAgICAiY29yZSIKK1RocmVhZCAgICAgICAgICAgICAgICAgICAgICAgInRocmVhZCIKK1BhY2thZ2UgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2UiCitOb2RlICAgICAgICAgICAgICAgICAgICAgICAgICJub2RlIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiPHVuZGVmPiIKK0RlY29kaW5nTGVnYWN5QVBJQyAgICAgICAgICAgImRlY29kaW5nIGxlZ2FjeSBBUElDIGlkcyIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgInBhcnNpbmcgL3Byb2MvY3B1aW5mbyIKK05vdERlZmluZWQgICAgICAgICAgICAgICAgICAgInZhbHVlIGlzIG5vdCBkZWZpbmVkIgorRWZmZWN0aXZlU2V0dGluZ3MgICAgICAgICAgICAiRWZmZWN0aXZlIHNldHRpbmdzOiIKK1VzZXJTZXR0aW5ncyAgICAgICAgICAgICAgICAgIlVzZXIgc2V0dGluZ3M6IgorU3RvcmFnZU1hcFdhcm5pbmcgICAgICAgICAgICAid2FybmluZzogcG9pbnRlcnMgb3Igc2l6ZSBkb24ndCBtYWtlIHNlbnNlIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiQ1BVIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiVFBVIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiVFBVcyBwZXIgcGFja2FnZSIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIkhUIGVuYWJsZWQiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICJIVCBkaXNhYmxlZCIKK0RlY29kaW5neDJBUElDICAgICAgICAgICAgICAgImRlY29kaW5nIHgyQVBJQyBpZHMiCitOb0xlYWYxMVN1cHBvcnQgICAgICAgICAgICAgICJjcHVpZCBsZWFmIDExIG5vdCBzdXBwb3J0ZWQiCitOb0xlYWY0U3VwcG9ydCAgICAgICAgICAgICAgICJjcHVpZCBsZWFmIDQgbm90IHN1cHBvcnRlZCIKK1RocmVhZElEc05vdFVuaXF1ZSAgICAgICAgICAgInRocmVhZCBpZHMgbm90IHVuaXF1ZSIKK1VzaW5nUHRocmVhZCAgICAgICAgICAgICAgICAgInVzaW5nIHB0aHJlYWQgaW5mbyIKK0xlZ2FjeUFwaWNJRHNOb3RVbmlxdWUgICAgICAgImxlZ2FjeSBBUElDIGlkcyBub3QgdW5pcXVlIgoreDJBcGljSURzTm90VW5pcXVlICAgICAgICAgICAieDJBUElDIGlkcyBub3QgdW5pcXVlIgorRGlzcGxheUVudkJlZ2luCQkgICAgICJPUEVOTVAgRElTUExBWSBFTlZJUk9OTUVOVCBCRUdJTiIKK0Rpc3BsYXlFbnZFbmQJCSAgICAgIk9QRU5NUCBESVNQTEFZIEVOVklST05NRU5UIEVORCIKK0RldmljZQkJCSAgICAgIltkZXZpY2VdIgorSG9zdAkJCSAgICAgIltob3N0XSIKKworCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0qLSBGT1JNQVRTIC0qLQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICJPTVA6IEluZm8gIyUxJGQ6ICUyJHNcbiIKK1dhcm5pbmcgICAgICAgICAgICAgICAgICAgICAgIk9NUDogV2FybmluZyAjJTEkZDogJTIkc1xuIgorRmF0YWwgICAgICAgICAgICAgICAgICAgICAgICAiT01QOiBFcnJvciAjJTEkZDogJTIkc1xuIgorU3lzRXJyICAgICAgICAgICAgICAgICAgICAgICAiT01QOiBTeXN0ZW0gZXJyb3IgIyUxJGQ6ICUyJHNcbiIKK0hpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIk9NUDogSGludDogJTIkc1xuIgorCitQcmFnbWEgICAgICAgICAgICAgICAgICAgICAgICIlMSRzIHByYWdtYSAoYXQgJTIkczolMyRzKCk6JTQkcykiCisgICAgIyAlMSBpcyBwcmFnbWEgbmFtZSAobGlrZSAicGFyYWxsZWwiIG9yICJtYXN0ZXIiLAorICAgICMgJTIgaXMgZmlsZSBuYW1lLAorICAgICMgJTMgaXMgZnVuY3Rpb24gKHJvdXRpbmUpIG5hbWUsCisgICAgIyAlNCBpcyB0aGUgbGluZSBudW1iZXIgKGFzIHN0cmluZywgc28gInMiIHR5cGUgc3BlY2lmaWVyIHNob3VsZCBiZSB1c2VkKS4KKworCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0qLSBNRVNTQUdFUyAtKi0KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBNZXNzYWdlcyBvZiBhbnkgc2V2ZXJpdHk6IGluZm9ybWF0aW9uYWwsIHdhcm5pbmcsIG9yIGZhdGFsLgorIyBUbyBtYWludGFpbiBtZXNzYWdlIG51bWJlcnMgKHRoZXkgYXJlIHZpc2libGUgdG8gY3VzdG9tZXJzKSwgYWRkIG5ldyBtZXNzYWdlcyB0byB0aGUgZW5kLgorCisjIFVzZSBmb2xsb3dpbmcgcHJlZml4ZXMgZm9yIG1lc3NhZ2VzIGFuZCBoaW50cyB3aGVuIGFwcHJvcHJpYXRlOgorIyAgICBBZmYgLS0gQWZmaW5pdHkgbWVzc2FnZXMuCisjICAgIENucyAtLSBDb25zaXN0ZW5jeSBjaGVjayBmYWlsdXJlcyAoS01QX0NPTlNJU1RFTkNZX0NIRUNLKS4KKyMgICAgSXR0IC0tIElUVCBOb3RpZnktcmVsYXRlZCBtZXNzYWdlcy4KKyMgICAgUm1sIC0tIFJNTC1yZWxhdGVkIG1lc3NhZ2VzLgorCitMaWJyYXJ5SXNTZXJpYWwgICAgICAgICAgICAgICJMaWJyYXJ5IGlzIFwic2VyaWFsXCIuIgorQ2FudE9wZW5NZXNzYWdlQ2F0YWxvZyAgICAgICAiQ2Fubm90IG9wZW4gbWVzc2FnZSBjYXRhbG9nIFwiJTEkc1wiOiIKK1dpbGxVc2VEZWZhdWx0TWVzc2FnZXMgICAgICAgIkRlZmF1bHQgbWVzc2FnZXMgd2lsbCBiZSB1c2VkLiIKK0xvY2tJc1VuaW5pdGlhbGl6ZWQgICAgICAgICAgIiUxJHM6IExvY2sgaXMgdW5pbml0aWFsaXplZCIKK0xvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSAgICAgIiUxJHM6IExvY2sgd2FzIGluaXRpYWxpemVkIGFzIHNpbXBsZSwgYnV0IHVzZWQgYXMgbmVzdGFibGUiCitMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUgICAgICIlMSRzOiBMb2NrIHdhcyBpbml0aWFsaXplZCBhcyBuZXN0YWJsZSwgYnV0IHVzZWQgYXMgc2ltcGxlIgorTG9ja0lzQWxyZWFkeU93bmVkICAgICAgICAgICAiJTEkczogTG9jayBpcyBhbHJlYWR5IG93bmVkIGJ5IHJlcXVlc3RpbmcgdGhyZWFkIgorTG9ja1N0aWxsT3duZWQgICAgICAgICAgICAgICAiJTEkczogTG9jayBpcyBzdGlsbCBvd25lZCBieSBhIHRocmVhZCIKK0xvY2tVbnNldHRpbmdGcmVlICAgICAgICAgICAgIiUxJHM6IEF0dGVtcHQgdG8gcmVsZWFzZSBhIGxvY2sgbm90IG93bmVkIGJ5IGFueSB0aHJlYWQiCitMb2NrVW5zZXR0aW5nU2V0QnlBbm90aGVyICAgICIlMSRzOiBBdHRlbXB0IHRvIHJlbGVhc2UgYSBsb2NrIG93bmVkIGJ5IGFub3RoZXIgdGhyZWFkIgorU3RhY2tPdmVyZmxvdyAgICAgICAgICAgICAgICAiU3RhY2sgb3ZlcmZsb3cgZGV0ZWN0ZWQgZm9yIE9wZW5NUCB0aHJlYWQgIyUxJGQiCitTdGFja092ZXJsYXAgICAgICAgICAgICAgICAgICJTdGFjayBvdmVybGFwIGRldGVjdGVkLiAiCitBc3NlcnRpb25GYWlsdXJlICAgICAgICAgICAgICJBc3NlcnRpb24gZmFpbHVyZSBhdCAlMSRzKCUyJGQpLiIKK0NhbnRSZWdpc3Rlck5ld1RocmVhZCAgICAgICAgIlVuYWJsZSB0byByZWdpc3RlciBhIG5ldyB1c2VyIHRocmVhZC4iCitEdXBsaWNhdGVMaWJyYXJ5ICAgICAgICAgICAgICJJbml0aWFsaXppbmcgJTEkcywgYnV0IGZvdW5kICUyJHMgYWxyZWFkeSBpbml0aWFsaXplZC4iCitDYW50T3BlbkZpbGVGb3JSZWFkaW5nICAgICAgICJDYW5ub3Qgb3BlbiBmaWxlIFwiJTEkc1wiIGZvciByZWFkaW5nOiIKK0NhbnRHZXRFbnZWYXIgICAgICAgICAgICAgICAgIkdldHRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUgXCIlMSRzXCIgZmFpbGVkOiIKK0NhbnRTZXRFbnZWYXIgICAgICAgICAgICAgICAgIlNldHRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUgXCIlMSRzXCIgZmFpbGVkOiIKK0NhbnRHZXRFbnZpcm9ubWVudCAgICAgICAgICAgIkdldHRpbmcgZW52aXJvbm1lbnQgZmFpbGVkOiIKK0JhZEJvb2xWYWx1ZSAgICAgICAgICAgICAgICAgIiUxJHM9XCIlMiRzXCI6IFdyb25nIHZhbHVlLCBib29sZWFuIGV4cGVjdGVkLiIKK1NTUE5vdEJ1aWx0SW4gICAgICAgICAgICAgICAgIk5vIEhlbHBlciBUaHJlYWQgc3VwcG9ydCBidWlsdCBpbiB0aGlzIE9NUCBsaWJyYXJ5LiIKK1NQUFNvdGZUZXJtaW5hdGVGYWlsZWQgICAgICAgIkhlbHBlciB0aHJlYWQgZmFpbGVkIHRvIHNvZnQgdGVybWluYXRlLiIKK0J1ZmZlck92ZXJmbG93ICAgICAgICAgICAgICAgIkJ1ZmZlciBvdmVyZmxvdyBkZXRlY3RlZC4iCitSZWFsVGltZVNjaGVkTm90U3VwcG9ydGVkICAgICJSZWFsLXRpbWUgc2NoZWR1bGluZyBwb2xpY3kgaXMgbm90IHN1cHBvcnRlZC4iCitSdW5uaW5nQXRNYXhQcmlvcml0eSAgICAgICAgICJPTVAgYXBwbGljYXRpb24gaXMgcnVubmluZyBhdCBtYXhpbXVtIHByaW9yaXR5IHdpdGggcmVhbC10aW1lIHNjaGVkdWxpbmcgcG9saWN5LiAiCitDYW50Q2hhbmdlTW9uaXRvclByaW9yaXR5ICAgICJDaGFuZ2luZyBwcmlvcml0eSBvZiB0aGUgbW9uaXRvciB0aHJlYWQgZmFpbGVkOiIKK01vbml0b3JXaWxsU3RhcnZlICAgICAgICAgICAgIkRlYWRsb2NrcyBhcmUgaGlnaGx5IHBvc3NpYmxlIGR1ZSB0byBtb25pdG9yIHRocmVhZCBzdGFydmF0aW9uLiIKK0NhbnRTZXRNb25pdG9yU3RhY2tTaXplICAgICAgIlVuYWJsZSB0byBzZXQgbW9uaXRvciB0aHJlYWQgc3RhY2sgc2l6ZSB0byAlMSRsdSBieXRlczoiCitDYW50U2V0V29ya2VyU3RhY2tTaXplICAgICAgICJVbmFibGUgdG8gc2V0IE9NUCB0aHJlYWQgc3RhY2sgc2l6ZSB0byAlMSRsdSBieXRlczoiCitDYW50SW5pdFRocmVhZEF0dHJzICAgICAgICAgICJUaHJlYWQgYXR0cmlidXRlIGluaXRpYWxpemF0aW9uIGZhaWxlZDoiCitDYW50RGVzdHJveVRocmVhZEF0dHJzICAgICAgICJUaHJlYWQgYXR0cmlidXRlIGRlc3Ryb3lpbmcgZmFpbGVkOiIKK0NhbnRTZXRXb3JrZXJTdGF0ZSAgICAgICAgICAgIk9NUCB0aHJlYWQgam9pbmFibGUgc3RhdGUgc2V0dGluZyBmYWlsZWQ6IgorQ2FudFNldE1vbml0b3JTdGF0ZSAgICAgICAgICAiTW9uaXRvciB0aHJlYWQgam9pbmFibGUgc3RhdGUgc2V0dGluZyBmYWlsZWQ6IgorTm9SZXNvdXJjZXNGb3JXb3JrZXJUaHJlYWQgICAiU3lzdGVtIHVuYWJsZSB0byBhbGxvY2F0ZSBuZWNlc3NhcnkgcmVzb3VyY2VzIGZvciBPTVAgdGhyZWFkOiIKK05vUmVzb3VyY2VzRm9yTW9uaXRvclRocmVhZCAgIlN5c3RlbSB1bmFibGUgdG8gYWxsb2NhdGUgbmVjZXNzYXJ5IHJlc291cmNlcyBmb3IgdGhlIG1vbml0b3IgdGhyZWFkOiIKK0NhbnRUZXJtaW5hdGVXb3JrZXJUaHJlYWQgICAgIlVuYWJsZSB0byB0ZXJtaW5hdGUgT01QIHRocmVhZDoiCitTY2hlZHVsZUtpbmRPdXRPZlJhbmdlICAgICAgICJXcm9uZyBzY2hlZHVsZSB0eXBlICUxJGQsIHNlZSA8b21wLmg+IG9yIDxvbXBfbGliLmg+IGZpbGUgZm9yIHRoZSBsaXN0IG9mIHZhbHVlcyBzdXBwb3J0ZWQuIgorVW5rbm93blNjaGVkdWxpbmdUeXBlICAgICAgICAiVW5rbm93biBzY2hlZHVsaW5nIHR5cGUgXCIlMSRkXCIuIgorSW52YWxpZFZhbHVlICAgICAgICAgICAgICAgICAiJTEkcyB2YWx1ZSBcIiUyJHNcIiBpcyBpbnZhbGlkLiIKK1NtYWxsVmFsdWUgICAgICAgICAgICAgICAgICAgIiUxJHMgdmFsdWUgXCIlMiRzXCIgaXMgdG9vIHNtYWxsLiIKK0xhcmdlVmFsdWUgICAgICAgICAgICAgICAgICAgIiUxJHMgdmFsdWUgXCIlMiRzXCIgaXMgdG9vIGxhcmdlLiIKK1N0Z0ludmFsaWRWYWx1ZSAgICAgICAgICAgICAgIiUxJHM6IFwiJTIkc1wiIGlzIGFuIGludmFsaWQgdmFsdWU7IGlnbm9yZWQuIgorQmFyclJlbGVhc2VWYWx1ZUludmFsaWQgICAgICAiJTEkcyByZWxlYXNlIHZhbHVlIFwiJTIkc1wiIGlzIGludmFsaWQuIgorQmFyckdhdGhlclZhbHVlSW52YWxpZCAgICAgICAiJTEkcyBnYXRoZXIgdmFsdWUgXCIlMiRzXCIgaXMgaW52YWxpZC4iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzIHN1cHBvcnRlZCBvbmx5IG9uIGRlYnVnIGJ1aWxkczsgaWdub3JlZC4iCitQYXJSYW5nZVN5bnRheCAgICAgICAgICAgICAgICJTeW50YXggZXJyb3I6IFVzYWdlOiAlMSRzPVsgcm91dGluZT08ZnVuYz4gfCBmaWxlbmFtZT08ZmlsZT4gfCByYW5nZT08bGI+Ojx1Yj4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifCBleGNsX3JhbmdlPTxsYj46PHViPiBdLC4uLiIKK1VuYmFsYW5jZWRRdW90ZXMgICAgICAgICAgICAgIlVuYmFsYW5jZWQgcXVvdGVzIGluICUxJHMuIgorRW1wdHlTdHJpbmcgICAgICAgICAgICAgICAgICAiRW1wdHkgc3RyaW5nIHNwZWNpZmllZCBmb3IgJTEkczsgaWdub3JlZC4iCitMb25nVmFsdWUgICAgICAgICAgICAgICAgICAgICIlMSRzIHZhbHVlIGlzIHRvbyBsb25nOyBpZ25vcmVkLiIKK0ludmFsaWRDbGF1c2UgICAgICAgICAgICAgICAgIiUxJHM6IEludmFsaWQgY2xhdXNlIGluIFwiJTIkc1wiLiIKK0VtcHR5Q2xhdXNlICAgICAgICAgICAgICAgICAgIkVtcHR5IGNsYXVzZSBpbiAlMSRzLiIKK0ludmFsaWRDaHVuayAgICAgICAgICAgICAgICAgIiUxJHMgdmFsdWUgXCIlMiRzXCIgaXMgaW52YWxpZCBjaHVuayBzaXplLiIKK0xhcmdlQ2h1bmsgICAgICAgICAgICAgICAgICAgIiUxJHMgdmFsdWUgXCIlMiRzXCIgaXMgdG8gbGFyZ2UgY2h1bmsgc2l6ZS4iCitJZ25vcmVDaHVuayAgICAgICAgICAgICAgICAgICIlMSRzIHZhbHVlIFwiJTIkc1wiIGlzIGlnbm9yZWQuIgorQ2FudEdldFByb2NGcmVxICAgICAgICAgICAgICAiQ2Fubm90IGdldCBwcm9jZXNzb3IgZnJlcXVlbmN5LCB1c2luZyB6ZXJvIEtNUF9JVFRfUFJFUEFSRV9ERUxBWS4iCitFbnZQYXJhbGxlbFdhcm4gICAgICAgICAgICAgICIlMSRzIG11c3QgYmUgc2V0IHByaW9yIHRvIGZpcnN0IHBhcmFsbGVsIHJlZ2lvbjsgaWdub3JlZC4iCitBZmZQYXJhbURlZmluZWQgICAgICAgICAgICAgICIlMSRzOiBwYXJhbWV0ZXIgaGFzIGJlZW4gc3BlY2lmaWVkIGFscmVhZHksIGlnbm9yaW5nIFwiJTIkc1wiLiIKK0FmZkludmFsaWRQYXJhbSAgICAgICAgICAgICAgIiUxJHM6IHBhcmFtZXRlciBpbnZhbGlkLCBpZ25vcmluZyBcIiUyJHNcIi4iCitBZmZNYW55UGFyYW1zICAgICAgICAgICAgICAgICIlMSRzOiB0b28gbWFueSBpbnRlZ2VyIHBhcmFtZXRlcnMgc3BlY2lmaWVkLCBpZ25vcmluZyBcIiUyJHNcIi4iCitBZmZNYW55UGFyYW1zRm9yTG9naWMgICAgICAgICIlMSRzOiB0b28gbWFueSBpbnRlZ2VyIHBhcmFtZXRlcnMgc3BlY2lmaWVkIGZvciBsb2dpY2FsIG9yIHBoeXNpY2FsIHR5cGUsIGlnbm9yaW5nIFwiJTIkZFwiLiIKK0FmZk5vUGFyYW0gICAgICAgICAgICAgICAgICAgIiUxJHM6ICclMiRzJyB0eXBlIGRvZXMgbm90IHRha2UgYW55IGludGVnZXIgcGFyYW1ldGVycywgaWdub3JpbmcgdGhlbS4iCitBZmZOb1Byb2NMaXN0ICAgICAgICAgICAgICAgICIlMSRzOiBwcm9jbGlzdCBub3Qgc3BlY2lmaWVkIHdpdGggZXhwbGljaXQgYWZmaW5pdHkgdHlwZSwgdXNpbmcgXCJub25lXCIuIgorQWZmUHJvY0xpc3ROb1R5cGUgICAgICAgICAgICAiJTEkczogcHJvY2xpc3Qgc3BlY2lmaWVkLCBzZXR0aW5nIGFmZmluaXR5IHR5cGUgdG8gXCJleHBsaWNpdFwiLiIKK0FmZlByb2NMaXN0Tm90RXhwbGljaXQgICAgICAgIiUxJHM6IHByb2NsaXN0IHNwZWNpZmllZCB3aXRob3V0IFwiZXhwbGljaXRcIiBhZmZpbml0eSB0eXBlLCBwcm9jbGlzdCBpZ25vcmVkLiIKK0FmZlN5bnRheEVycm9yICAgICAgICAgICAgICAgIiUxJHM6IHN5bnRheCBlcnJvciwgbm90IHVzaW5nIGFmZmluaXR5LiIKK0FmZlplcm9TdHJpZGUgICAgICAgICAgICAgICAgIiUxJHM6IHJhbmdlIGVycm9yICh6ZXJvIHN0cmlkZSksIG5vdCB1c2luZyBhZmZpbml0eS4iCitBZmZTdGFydEdyZWF0ZXJFbmQgICAgICAgICAgICIlMSRzOiByYW5nZSBlcnJvciAoJTIkZCA+ICUzJGQpLCBub3QgdXNpbmcgYWZmaW5pdHkuIgorQWZmU3RyaWRlTGVzc1plcm8gICAgICAgICAgICAiJTEkczogcmFuZ2UgZXJyb3IgKCUyJGQgPCAlMyRkICYgc3RyaWRlIDwgMCksIG5vdCB1c2luZyBhZmZpbml0eS4iCitBZmZSYW5nZVRvb0JpZyAgICAgICAgICAgICAgICIlMSRzOiByYW5nZSBlcnJvciAoKCUyJGQtJTMkZCkvJTQkZCB0b28gYmlnKSwgbm90IHVzaW5nIGFmZmluaXR5LiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6ICUyJHMgaXMgZGVmaW5lZC4gJTMkcyB3aWxsIGJlIGlnbm9yZWQuIgorQWZmTm90U3VwcG9ydGVkICAgICAgICAgICAgICAiJTEkczogYWZmaW5pdHkgbm90IHN1cHBvcnRlZCwgdXNpbmcgXCJkaXNhYmxlZFwiLiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IGFmZmluaXR5IG9ubHkgc3VwcG9ydGVkIGZvciBJbnRlbChSKSBwcm9jZXNzb3JzLiIKK0dldEFmZlN5c0NhbGxOb3RTdXBwb3J0ZWQgICAgIiUxJHM6IGdldGFmZmluaXR5IHN5c3RlbSBjYWxsIG5vdCBzdXBwb3J0ZWQuIgorU2V0QWZmU3lzQ2FsbE5vdFN1cHBvcnRlZCAgICAiJTEkczogc2V0YWZmaW5pdHkgc3lzdGVtIGNhbGwgbm90IHN1cHBvcnRlZC4iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBwdGhyZWFkX2FmZl9zZXRfbnAgY2FsbCBub3QgZm91bmQuIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogcHRocmVhZF9nZXRfbnVtX3Jlc291cmNlc19ucCBjYWxsIG5vdCBmb3VuZC4iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiB0aGUgT1Mga2VybmVsIGRvZXMgbm90IHN1cHBvcnQgYWZmaW5pdHkuIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogcHRocmVhZF9nZXRfbnVtX3Jlc291cmNlc19ucCByZXR1cm5lZCAlMiRkLiIKK0FmZkNhbnRHZXRNYXNrU2l6ZSAgICAgICAgICAgIiUxJHM6IGNhbm5vdCBkZXRlcm1pbmUgcHJvcGVyIGFmZmluaXR5IG1hc2sgc2l6ZS4iCitQYXJzZVNpemVJbnRXYXJuICAgICAgICAgICAgICIlMSRzPVwiJTIkc1wiOiAlMyRzLiIKK1BhcnNlRXh0cmFDaGFyc1dhcm4gICAgICAgICAgIiUxJHM6IGV4dHJhIHRyYWlsaW5nIGNoYXJhY3RlcnMgaWdub3JlZDogXCIlMiRzXCIuIgorVW5rbm93bkZvcmNlUmVkdWN0aW9uICAgICAgICAiJTEkczogdW5rbm93biBtZXRob2QgXCIlMiRzXCIuIgorVGltZXJVc2VHZXR0aW1lb2ZkYXkgICAgICAgICAiS01QX1NUQVRTX1RJTUVSOiBjbG9ja19nZXR0aW1lIGlzIHVuZGVmaW5lZCwgdXNpbmcgZ2V0dGltZW9mZGF5LiIKK1RpbWVyTmVlZE1vcmVQYXJhbSAgICAgICAgICAgIktNUF9TVEFUU19USU1FUjogXCIlMSRzXCIgbmVlZHMgYWRkaXRpb25hbCBwYXJhbWV0ZXIsIGUuZy4gJ2Nsb2NrX2dldHRpbWUsMicuIFVzaW5nIGdldHRpbWVvZmRheS4iCitUaW1lckludmFsaWRQYXJhbSAgICAgICAgICAgICJLTVBfU1RBVFNfVElNRVI6IGNsb2NrX2dldHRpbWUgcGFyYW1ldGVyIFwiJTEkc1wiIGlzIGludmFsaWQsIHVzaW5nIGdldHRpbWVvZmRheS4iCitUaW1lckdldHRpbWVGYWlsZWQgICAgICAgICAgICJLTVBfU1RBVFNfVElNRVI6IGNsb2NrX2dldHRpbWUgZmFpbGVkLCB1c2luZyBnZXR0aW1lb2ZkYXkuIgorVGltZXJVbmtub3duRnVuY3Rpb24gICAgICAgICAiS01QX1NUQVRTX1RJTUVSOiBjbG9jayBmdW5jdGlvbiB1bmtub3duIChpZ25vcmluZyB2YWx1ZSBcIiUxJHNcIikuIgorVW5rbm93blNjaGVkVHlwZURldGVjdGVkICAgICAiVW5rbm93biBzY2hlZHVsaW5nIHR5cGUgZGV0ZWN0ZWQuIgorRGlzcGF0Y2hNYW55VGhyZWFkcyAgICAgICAgICAiVG9vIG1hbnkgdGhyZWFkcyB0byB1c2UgYW5hbHl0aWNhbCBndWlkZWQgc2NoZWR1bGluZyAtIHN3aXRjaGluZyB0byBpdGVyYXRpdmUgZ3VpZGVkIHNjaGVkdWxpbmcuIgorSXR0TG9va3VwRmFpbGVkICAgICAgICAgICAgICAiaXR0bm90aWZ5OiBMb29rdXAgb2YgXCIlMSRzXCIgZnVuY3Rpb24gaW4gXCIlMiRzXCIgbGlicmFyeSBmYWlsZWQuIgorSXR0TG9hZExpYkZhaWxlZCAgICAgICAgICAgICAiaXR0bm90aWZ5OiBMb2FkaW5nIFwiJTEkc1wiIGxpYnJhcnkgZmFpbGVkLiIKK0l0dEFsbE5vdGlmRGlzYWJsZWQgICAgICAgICAgIml0dG5vdGlmeTogQWxsIGl0dCBub3RpZmljYXRpb25zIGRpc2FibGVkLiIKK0l0dE9iak5vdGlmRGlzYWJsZWQgICAgICAgICAgIml0dG5vdGlmeTogT2JqZWN0IHN0YXRlIGl0dCBub3RpZmljYXRpb25zIGRpc2FibGVkLiIKK0l0dE1hcmtOb3RpZkRpc2FibGVkICAgICAgICAgIml0dG5vdGlmeTogTWFyayBpdHQgbm90aWZpY2F0aW9ucyBkaXNhYmxlZC4iCitJdHRVbmxvYWRMaWJGYWlsZWQgICAgICAgICAgICJpdHRub3RpZnk6IFVubG9hZGluZyBcIiUxJHNcIiBsaWJyYXJ5IGZhaWxlZC4iCitDYW50Rm9ybVRoclRlYW0gICAgICAgICAgICAgICJDYW5ub3QgZm9ybSBhIHRlYW0gd2l0aCAlMSRkIHRocmVhZHMsIHVzaW5nICUyJGQgaW5zdGVhZC4iCitBY3RpdmVMZXZlbHNOZWdhdGl2ZSAgICAgICAgICJSZXF1ZXN0ZWQgbnVtYmVyIG9mIGFjdGl2ZSBwYXJhbGxlbCBsZXZlbHMgXCIlMSRkXCIgaXMgbmVnYXRpdmU7IGlnbm9yZWQuIgorQWN0aXZlTGV2ZWxzRXhjZWVkTGltaXQgICAgICAiUmVxdWVzdGVkIG51bWJlciBvZiBhY3RpdmUgcGFyYWxsZWwgbGV2ZWxzIFwiJTEkZFwiIGV4Y2VlZHMgc3VwcG9ydGVkIGxpbWl0OyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgZm9sbG93aW5nIGxpbWl0IHZhbHVlIHdpbGwgYmUgdXNlZDogXCIlMSRkXCIuIgorU2V0TGlicmFyeUluY29ycmVjdENhbGwgICAgICAia21wX3NldF9saWJyYXJ5IG11c3Qgb25seSBiZSBjYWxsZWQgZnJvbSB0aGUgdG9wIGxldmVsIHNlcmlhbCB0aHJlYWQ7IGlnbm9yZWQuIgorRmF0YWxTeXNFcnJvciAgICAgICAgICAgICAgICAiRmF0YWwgc3lzdGVtIGVycm9yIGRldGVjdGVkLiIKK091dE9mSGVhcE1lbW9yeSAgICAgICAgICAgICAgIk91dCBvZiBoZWFwIG1lbW9yeS4iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICJDbGVhcmluZyBfX0tNUF9SRUdJU1RFUkVEX0xJQiBlbnYgdmFyIGZhaWxlZC4iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICJSZWdpc3RlcmluZyBsaWJyYXJ5IHdpdGggZW52IHZhciBmYWlsZWQuIgorVXNpbmdfaW50X1ZhbHVlICAgICAgICAgICAgICAiJTEkcyB2YWx1ZSBcIiUyJGRcIiB3aWxsIGJlIHVzZWQuIgorVXNpbmdfdWludF9WYWx1ZSAgICAgICAgICAgICAiJTEkcyB2YWx1ZSBcIiUyJHVcIiB3aWxsIGJlIHVzZWQuIgorVXNpbmdfdWludDY0X1ZhbHVlICAgICAgICAgICAiJTEkcyB2YWx1ZSBcIiUyJHNcIiB3aWxsIGJlIHVzZWQuIgorVXNpbmdfc3RyX1ZhbHVlICAgICAgICAgICAgICAiJTEkcyB2YWx1ZSBcIiUyJHNcIiB3aWxsIGJlIHVzZWQuIgorTWF4VmFsdWVVc2luZyAgICAgICAgICAgICAgICAiJTEkcyBtYXhpbXVtIHZhbHVlIFwiJTIkZFwiIHdpbGwgYmUgdXNlZC4iCitNaW5WYWx1ZVVzaW5nICAgICAgICAgICAgICAgICIlMSRzIG1pbmltdW0gdmFsdWUgXCIlMiRkXCIgd2lsbCBiZSB1c2VkLiIKK01lbW9yeUFsbG9jRmFpbGVkICAgICAgICAgICAgIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC4iCitGaWxlTmFtZVRvb0xvbmcgICAgICAgICAgICAgICJGaWxlIG5hbWUgdG9vIGxvbmcuIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiTG9jayB0YWJsZSBvdmVyZmxvdy4iCitNYW55VGhyZWFkc0ZvclRQRGlyZWN0aXZlICAgICJUb28gbWFueSB0aHJlYWRzIHRvIHVzZSB0aHJlYWRwcml2YXRlIGRpcmVjdGl2ZS4iCitBZmZpbml0eUludmFsaWRNYXNrICAgICAgICAgICIlMSRzOiBpbnZhbGlkIG1hc2suIgorV3JvbmdEZWZpbml0aW9uICAgICAgICAgICAgICAiV3JvbmcgZGVmaW5pdGlvbi4iCitUTFNTZXRWYWx1ZUZhaWxlZCAgICAgICAgICAgICJXaW5kb3dzKiBPUzogVExTIFNldCBWYWx1ZSBmYWlsZWQuIgorVExTT3V0T2ZJbmRleGVzICAgICAgICAgICAgICAiV2luZG93cyogT1M6IFRMUyBvdXQgb2YgaW5kZXhlcy4iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICJQRE9ORSBkaXJlY3RpdmUgbXVzdCBiZSBuZXN0ZWQgd2l0aGluIGEgRE8gZGlyZWN0aXZlLiIKK0NhbnRHZXROdW1BdmFpbENQVSAgICAgICAgICAgIkNhbm5vdCBnZXQgbnVtYmVyIG9mIGF2YWlsYWJsZSBDUFVzLiIKK0Fzc3VtZWROdW1DUFUgICAgICAgICAgICAgICAgIkFzc3VtZWQgbnVtYmVyIG9mIENQVXMgaXMgMi4iCitFcnJvckluaXRpYWxpemVBZmZpbml0eSAgICAgICJFcnJvciBpbml0aWFsaXppbmcgYWZmaW5pdHkgLSBub3QgdXNpbmcgYWZmaW5pdHkuIgorQWZmVGhyZWFkc01heU1pZ3JhdGUgICAgICAgICAiVGhyZWFkcyBtYXkgbWlncmF0ZSBhY3Jvc3MgYWxsIGF2YWlsYWJsZSBPUyBwcm9jcyAoZ3JhbnVsYXJpdHkgc2V0dGluZyB0b28gY29hcnNlKS4iCitBZmZJZ25vcmVJbnZhbGlkUHJvY0lEICAgICAgICJJZ25vcmluZyBpbnZhbGlkIE9TIHByb2MgSUQgJTEkZC4iCitBZmZOb1ZhbGlkUHJvY0lEICAgICAgICAgICAgICJObyB2YWxpZCBPUyBwcm9jIElEcyBzcGVjaWZpZWQgLSBub3QgdXNpbmcgYWZmaW5pdHkuIgorVXNpbmdGbGF0T1MgICAgICAgICAgICAgICAgICAiJTEkcyAtIHVzaW5nIFwiZmxhdFwiIE9TIDwtPiBwaHlzaWNhbCBwcm9jIG1hcHBpbmcuIgorVXNpbmdGbGF0T1NGaWxlICAgICAgICAgICAgICAiJTEkczogJTIkcyAtIHVzaW5nIFwiZmxhdFwiIE9TIDwtPiBwaHlzaWNhbCBwcm9jIG1hcHBpbmcuIgorVXNpbmdGbGF0T1NGaWxlTGluZSAgICAgICAgICAiJTEkcywgbGluZSAlMiRkOiAlMyRzIC0gdXNpbmcgXCJmbGF0XCIgT1MgPC0+IHBoeXNpY2FsIHByb2MgbWFwcGluZy4iCitGaWxlTXNnRXhpdGluZyAgICAgICAgICAgICAgICIlMSRzOiAlMiRzIC0gZXhpdGluZy4iCitGaWxlTGluZU1zZ0V4aXRpbmcgICAgICAgICAgICIlMSRzLCBsaW5lICUyJGQ6ICUzJHMgLSBleGl0aW5nLiIKK0NvbnN0cnVjdElkZW50SW52YWxpZCAgICAgICAgIkNvbnN0cnVjdCBpZGVudGlmaWVyIGludmFsaWQuIgorVGhyZWFkSWRlbnRJbnZhbGlkICAgICAgICAgICAiVGhyZWFkIGlkZW50aWZpZXIgaW52YWxpZC4iCitSVExOb3RJbml0aWFsaXplZCAgICAgICAgICAgICJydW50aW1lIGxpYnJhcnkgbm90IGluaXRpYWxpemVkLiIKK1RQQ29tbW9uQmxvY2tzSW5jb25zaXN0ICAgICAgIkluY29uc2lzdGVudCBUSFJFQURQUklWQVRFIGNvbW1vbiBibG9jayBkZWNsYXJhdGlvbnMgYXJlIG5vbi1jb25mb3JtaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuZCBhcmUgdW5zdXBwb3J0ZWQuIEVpdGhlciBhbGwgdGhyZWFkcHJpdmF0ZSBjb21tb24gYmxvY2tzIG11c3QgYmUgZGVjbGFyZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWRlbnRpY2FsbHksIG9yIHRoZSBsYXJnZXN0IGluc3RhbmNlIG9mIGVhY2ggdGhyZWFkcHJpdmF0ZSBjb21tb24gYmxvY2sgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXVzdCBiZSByZWZlcmVuY2VkIGZpcnN0IGR1cmluZyB0aGUgcnVuLiIKK0NhbnRTZXRUaHJlYWRBZmZNYXNrICAgICAgICAgIkNhbm5vdCBzZXQgdGhyZWFkIGFmZmluaXR5IG1hc2suIgorQ2FudFNldFRocmVhZFByaW9yaXR5ICAgICAgICAiQ2Fubm90IHNldCB0aHJlYWQgcHJpb3JpdHkuIgorQ2FudENyZWF0ZVRocmVhZCAgICAgICAgICAgICAiQ2Fubm90IGNyZWF0ZSB0aHJlYWQuIgorQ2FudENyZWF0ZUV2ZW50ICAgICAgICAgICAgICAiQ2Fubm90IGNyZWF0ZSBldmVudC4iCitDYW50U2V0RXZlbnQgICAgICAgICAgICAgICAgICJDYW5ub3Qgc2V0IGV2ZW50LiIKK0NhbnRDbG9zZUhhbmRsZSAgICAgICAgICAgICAgIkNhbm5vdCBjbG9zZSBoYW5kbGUuIgorVW5rbm93bkxpYnJhcnlUeXBlICAgICAgICAgICAiVW5rbm93biBsaWJyYXJ5IHR5cGU6ICUxJGQuIgorUmVhcE1vbml0b3JFcnJvciAgICAgICAgICAgICAiTW9uaXRvciBkaWQgbm90IHJlYXAgcHJvcGVybHkuIgorUmVhcFdvcmtlckVycm9yICAgICAgICAgICAgICAiV29ya2VyIHRocmVhZCBmYWlsZWQgdG8gam9pbi4iCitDaGFuZ2VUaHJlYWRBZmZNYXNrRXJyb3IgICAgICJDYW5ub3QgY2hhbmdlIHRocmVhZCBhZmZpbml0eSBtYXNrLiIKK1RocmVhZHNNaWdyYXRlICAgICAgICAgICAgICAgIiUxJHM6IFRocmVhZHMgbWF5IG1pZ3JhdGUgYWNyb3NzICUyJGQgaW5uZXJtb3N0IGxldmVscyBvZiBtYWNoaW5lIgorRGVjcmVhc2VUb1RocmVhZHMgICAgICAgICAgICAiJTEkczogZGVjcmVhc2UgdG8gJTIkZCB0aHJlYWRzIgorSW5jcmVhc2VUb1RocmVhZHMgICAgICAgICAgICAiJTEkczogaW5jcmVhc2UgdG8gJTIkZCB0aHJlYWRzIgorQm91bmRUb09TUHJvY1NldCAgICAgICAgICAgICAiJTEkczogSW50ZXJuYWwgdGhyZWFkICUyJGQgYm91bmQgdG8gT1MgcHJvYyBzZXQgJTMkcyIKK0FmZkNhcGFibGVVc2VDcHVpbmZvICAgICAgICAgIiUxJHM6IEFmZmluaXR5IGNhcGFibGUsIHVzaW5nIGNwdWluZm8gZmlsZSIKK0FmZlVzZUdsb2JDcHVpZCAgICAgICAgICAgICAgIiUxJHM6IEFmZmluaXR5IGNhcGFibGUsIHVzaW5nIGdsb2JhbCBjcHVpZCBpbmZvIgorQWZmQ2FwYWJsZVVzZUZsYXQgICAgICAgICAgICAiJTEkczogQWZmaW5pdHkgY2FwYWJsZSwgdXNpbmcgZGVmYXVsdCBcImZsYXRcIiB0b3BvbG9neSIKK0FmZk5vdENhcGFibGVVc2VMb2NDcHVpZCAgICAgIiUxJHM6IEFmZmluaXR5IG5vdCBjYXBhYmxlLCB1c2luZyBsb2NhbCBjcHVpZCBpbmZvIgorQWZmTm90Q2FwYWJsZVVzZUNwdWluZm8gICAgICAiJTEkczogQWZmaW5pdHkgbm90IGNhcGFibGUsIHVzaW5nIGNwdWluZm8gZmlsZSIKK0FmZkZsYXRUb3BvbG9neSAgICAgICAgICAgICAgIiUxJHM6IEFmZmluaXR5IG5vdCBjYXBhYmxlLCBhc3N1bW1pbmcgXCJmbGF0XCIgdG9wb2xvZ3kiCitJbml0T1NQcm9jU2V0UmVzcGVjdCAgICAgICAgICIlMSRzOiBJbml0aWFsIE9TIHByb2Mgc2V0IHJlc3BlY3RlZDogJTIkcyIKK0luaXRPU1Byb2NTZXROb3RSZXNwZWN0ICAgICAgIiUxJHM6IEluaXRpYWwgT1MgcHJvYyBzZXQgbm90IHJlc3BlY3RlZDogJTIkcyIKK0F2YWlsYWJsZU9TUHJvYyAgICAgICAgICAgICAgIiUxJHM6ICUyJGQgYXZhaWxhYmxlIE9TIHByb2NzIgorVW5pZm9ybSAgICAgICAgICAgICAgICAgICAgICAiJTEkczogVW5pZm9ybSB0b3BvbG9neSIKK05vblVuaWZvcm0gICAgICAgICAgICAgICAgICAgIiUxJHM6IE5vbnVuaWZvcm0gdG9wb2xvZ3kiCitUb3BvbG9neSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiAlMiRkIHBhY2thZ2VzIHggJTMkZCBjb3Jlcy9wa2cgeCAlNCRkIHRocmVhZHMvY29yZSAoJTUkZCB0b3RhbCBjb3JlcykiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBPUyBwcm9jIHRvIHBoeXNpY2FsIHRocmVhZCBtYXAgKFtdID0+IGxldmVsIG5vdCBpbiBtYXApOiIKK09TUHJvY1RvUGFja2FnZSAgICAgICAgICAgICAgIiUxJHM6IE9TIHByb2MgPG4+IG1hcHMgdG8gPG4+dGggcGFja2FnZSBjb3JlIDAiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBPUyBwcm9jICUyJGQgbWFwcyB0byBwYWNrYWdlICUzJGQgW2NvcmUgJTQkZF0gW3RocmVhZCAlNSRkXSIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IE9TIHByb2MgJTIkZCBtYXBzIHRvIFtwYWNrYWdlICUzJGRdIFtjb3JlICU0JGRdIFt0aHJlYWQgJTUkZF0iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBPUyBwcm9jICUyJGQgbWFwcyB0byBbcGFja2FnZSAlMyRkXSBbY29yZSAlNCRkXSB0aHJlYWQgJTUkZCIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IE9TIHByb2MgJTIkZCBtYXBzIHRvIFtwYWNrYWdlICUzJGRdIGNvcmUgJTQkZCBbdGhyZWFkICU1JGRdIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogT1MgcHJvYyAlMiRkIG1hcHMgdG8gcGFja2FnZSAlMyRkIFtjb3JlICU0JGRdIFt0aHJlYWQgJTUkZF0iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBPUyBwcm9jICUyJGQgbWFwcyB0byBbcGFja2FnZSAlMyRkXSBjb3JlICU0JGQgdGhyZWFkICU1JGQiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBPUyBwcm9jICUyJGQgbWFwcyB0byBwYWNrYWdlICUzJGQgY29yZSAlNCRkIFt0aHJlYWQgJTUkZF0iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBPUyBwcm9jICUyJGQgbWFwcyB0byBwYWNrYWdlICUzJGQgW2NvcmUgJTQkZF0gdGhyZWFkICU1JGQiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBPUyBwcm9jICUyJGQgbWFwcyB0byBwYWNrYWdlICUzJGQgY29yZSAlNCRkIHRocmVhZCAlNSRkIgorT1NQcm9jTWFwVG9QYWNrICAgICAgICAgICAgICAiJTEkczogT1MgcHJvYyAlMiRkIG1hcHMgdG8gJTMkcyIKK0NoYW5nZUFmZk1hc2sgICAgICAgICAgICAgICAgIiUxJHM6IEludGVybmFsIHRocmVhZCAlMiRkIGNoYW5nZWQgYWZmaW5pdHkgbWFzayBmcm9tICUzJHMgdG8gJTQkcyIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IE9TIHByb2MgJTIkZCBtYXBzIHRvIHBhY2thZ2UgJTMkZCwgQ1BVICU0JGQsIFRQVSAlNSRkIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogT1MgcHJvYyAlMiRkIG1hcHMgdG8gcGFja2FnZSAlMyRkLCBDUFUgJTQkZCIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IEhUIGVuYWJsZWQ7ICUyJGQgcGFja2FnZXM7ICUzJGQgVFBVOyAlNCRkIFRQVXMgcGVyIHBhY2thZ2UiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBIVCBkaXNhYmxlZDsgJTIkZCBwYWNrYWdlcyIKK0JhcnJpZXJzSW5EaWZmZXJlbnRPcmRlciAgICAgIlRocmVhZHMgZW5jb3VudGVyZWQgYmFycmllcnMgaW4gZGlmZmVyZW50IG9yZGVyLiAiCitGdW5jdGlvbkVycm9yICAgICAgICAgICAgICAgICJGdW5jdGlvbiAlMSRzIGZhaWxlZDoiCitUb3BvbG9neUV4dHJhICAgICAgICAgICAgICAgICIlMSRzOiAlMiRzIHBhY2thZ2VzIHggJTMkZCBjb3Jlcy9wa2cgeCAlNCRkIHRocmVhZHMvY29yZSAoJTUkZCB0b3RhbCBjb3JlcykiCitXcm9uZ01lc3NhZ2VDYXRhbG9nICAgICAgICAgICJJbmNvbXBhdGlibGUgbWVzc2FnZSBjYXRhbG9nIFwiJTEkc1wiOiBWZXJzaW9uIFwiJTIkc1wiIGZvdW5kLCB2ZXJzaW9uIFwiJTMkc1wiIGV4cGVjdGVkLiIKK1N0Z0lnbm9yZWQgICAgICAgICAgICAgICAgICAgIiUxJHM6IGlnbm9yZWQgYmVjYXVzZSAlMyRzIGhhcyBiZWVuIGRlZmluZWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICUxLCAlMiAtLSBuYW1lIGFuZCB2YWx1ZSBvZiBpZ25vcmVkIHZhcmlhYmxlLCAlMyAtLSBuYW1lIG9mIHZhcmlhYmxlIHdpdGggaGlnaGVyIHByaW9yaXR5LgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogb3ZlcnJpZGVzICUzJHMgc3BlY2lmaWVkIGJlZm9yZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgJTEsICUyIC0tIG5hbWUgYW5kIHZhbHVlIG9mIHRoZSBvdmVycmlkaW5nIHZhcmlhYmxlLCAlMyAtLSBuYW1lIG9mIG92ZXJyaWRlbiB2YXJpYWJsZS4KKworIyAtLS0gT3Blbk1QIGVycm9ycyBkZXRlY3RlZCBhdCBydW50aW1lIC0tLQorIworIyAgICAlMSBpcyB0aGUgbmFtZSBvZiBPcGVuTVAgY29uc3RydWN0IChmb3JtYXR0ZWQgd2l0aCAiUHJhZ21hIiBmb3JtYXQpLgorIworQ25zQm91bmRUb1dvcmtzaGFyaW5nICAgICAgICAiJTEkcyBtdXN0IGJlIGJvdW5kIHRvIGEgd29yay1zaGFyaW5nIG9yIHdvcmstcXVldWluZyBjb25zdHJ1Y3Qgd2l0aCBhbiBcIm9yZGVyZWRcIiBjbGF1c2UiCitDbnNEZXRlY3RlZEVuZCAgICAgICAgICAgICAgICJEZXRlY3RlZCBlbmQgb2YgJTEkcyB3aXRob3V0IGZpcnN0IGV4ZWN1dGluZyBhIGNvcnJlc3BvbmRpbmcgYmVnaW5uaW5nLiIKK0Nuc0l0ZXJhdGlvblJhbmdlVG9vTGFyZ2UgICAgIkl0ZXJhdGlvbiByYW5nZSB0b28gbGFyZ2UgaW4gJTEkcy4iCitDbnNMb29wSW5jclplcm9Qcm9oaWJpdGVkICAgICIlMSRzIG11c3Qgbm90IGhhdmUgYSBsb29wIGluY3JlbWVudCB0aGF0IGV2YWx1YXRlcyB0byB6ZXJvLiIKKyMKKyMgICAgJTEgaXMgdGhlIG5hbWUgb2YgdGhlIGZpcnN0IE9wZW5NUCBjb25zdHJ1Y3QsICUyIC0tIHRoZSBuYW1lIG9mIHRoZSBzZWNvbmQgb25lIChib3RoIGZvcm1hdHRlZCB3aXRoICJQcmFnbWEiIGZvcm1hdCkuCisjCitDbnNFeHBlY3RlZEVuZCAgICAgICAgICAgICAgICJFeHBlY3RlZCBlbmQgb2YgJTEkczsgJTIkcywgaG93ZXZlciwgaGFzIG1vc3QgcmVjZW50bHkgYmVndW4gZXhlY3V0aW9uLiIKK0Nuc0ludmFsaWROZXN0aW5nICAgICAgICAgICAgIiUxJHMgaXMgaW5jb3JyZWN0bHkgbmVzdGVkIHdpdGhpbiAlMiRzIgorQ25zTXVsdGlwbGVOZXN0aW5nICAgICAgICAgICAiJTEkcyBjYW5ub3QgYmUgZXhlY3V0ZWQgbXVsdGlwbGUgdGltZXMgZHVyaW5nIGV4ZWN1dGlvbiBvZiBvbmUgcGFyYWxsZWwgaXRlcmF0aW9uL3NlY3Rpb24gb2YgJTIkcyIKK0Nuc05lc3RpbmdTYW1lTmFtZSAgICAgICAgICAgIiUxJHMgaXMgaW5jb3JyZWN0bHkgbmVzdGVkIHdpdGhpbiAlMiRzIG9mIHRoZSBzYW1lIG5hbWUiCitDbnNOb09yZGVyZWRDbGF1c2UgICAgICAgICAgICIlMSRzIGlzIGluY29ycmVjdGx5IG5lc3RlZCB3aXRoaW4gJTIkcyB0aGF0IGRvZXMgbm90IGhhdmUgYW4gXCJvcmRlcmVkXCIgY2xhdXNlIgorQ25zTm90SW5UYXNrQ29uc3RydWN0ICAgICAgICAiJTEkcyBpcyBpbmNvcnJlY3RseSBuZXN0ZWQgd2l0aGluICUyJHMgYnV0IG5vdCB3aXRoaW4gYW55IG9mIGl0cyBcInRhc2tcIiBjb25zdHJ1Y3RzIgorQ25zVGhyZWFkc0F0QmFycmllciAgICAgICAgICAiT25lIHRocmVhZCBhdCAlMSRzIHdoaWxlIGFub3RoZXIgdGhyZWFkIGlzIGF0ICUyJHMuIgorCisjIE5ldyBlcnJvcnMKK0NhbnRDb25uZWN0ICAgICAgICAgICAgICAgICAgIkNhbm5vdCBjb25uZWN0IHRvICUxJHMiCitDYW50Q29ubmVjdFVzaW5nICAgICAgICAgICAgICJDYW5ub3QgY29ubmVjdCB0byAlMSRzIC0gVXNpbmcgJTIkcyIKK0xpYk5vdFN1cHBvcnQgICAgICAgICAgICAgICAgIiUxJHMgZG9lcyBub3Qgc3VwcG9ydCAlMiRzLiBDb250aW51aW5nIHdpdGhvdXQgdXNpbmcgJTIkcy4iCitMaWJOb3RTdXBwb3J0Rm9yICAgICAgICAgICAgICIlMSRzIGRvZXMgbm90IHN1cHBvcnQgJTIkcyBmb3IgJTMkcy4gQ29udGludWluZyB3aXRob3V0IHVzaW5nICUyJHMuIgorU3RhdGljTGliTm90U3VwcG9ydCAgICAgICAgICAiU3RhdGljICUxJHMgZG9lcyBub3Qgc3VwcG9ydCAlMiRzLiBDb250aW51aW5nIHdpdGhvdXQgdXNpbmcgJTIkcy4iCitEeW5JUk1Md29Vc2VJcm1sICAgICAgICAgICAgICJLTVBfRFlOQU1JQ19NT0RFPWlybWwgY2Fubm90IGJlIHVzZWQgd2l0aCBLTVBfVVNFX0lSTUw9MCIKK0l0dFVua25vd25Hcm91cCAgICAgICAgICAgICAgIml0dG5vdGlmeTogVW5rbm93biBncm91cCBcIiUyJHNcIiBzcGVjaWZpZWQgaW4gZW52aXJvbm1lbnQgdmFyaWFibGUgXCIlMSRzXCIuIgorSXR0RW52VmFyVG9vTG9uZyAgICAgICAgICAgICAiaXR0bm90aWZ5OiBFbnZpcm9ubWVudCB2YXJpYWJsZSBcIiUxJHNcIiB0b28gbG9uZzogQWN0dWFsIGxlbmd0aHMgaXMgJTIkbHUsIG1heCBhbGxvd2VkIGxlbmd0aCBpcyAlMyRsdS4iCitBZmZVc2VHbG9iQ3B1aWRMMTEgICAgICAgICAgICIlMSRzOiBBZmZpbml0eSBjYXBhYmxlLCB1c2luZyBnbG9iYWwgY3B1aWQgbGVhZiAxMSBpbmZvIgorQWZmTm90Q2FwYWJsZVVzZUxvY0NwdWlkTDExICAiJTEkczogQWZmaW5pdHkgbm90IGNhcGFibGUsIHVzaW5nIGxvY2FsIGNwdWlkIGxlYWYgMTEgaW5mbyIKK0FmZkluZm9TdHIgICAgICAgICAgICAgICAgICAgIiUxJHM6ICUyJHMuIgorQWZmSW5mb1N0clN0ciAgICAgICAgICAgICAgICAiJTEkczogJTIkcyAtICUzJHMuIgorT1NQcm9jVG9QaHlzaWNhbFRocmVhZE1hcCAgICAiJTEkczogT1MgcHJvYyB0byBwaHlzaWNhbCB0aHJlYWQgbWFwOiIKK0FmZlVzaW5nRmxhdE9TICAgICAgICAgICAgICAgIiUxJHM6IHVzaW5nIFwiZmxhdFwiIE9TIDwtPiBwaHlzaWNhbCBwcm9jIG1hcHBpbmcuIgorQWZmUGFyc2VGaWxlbmFtZSAgICAgICAgICAgICAiJTEkczogcGFyc2luZyAlMiRzLiIKK01zZ0V4aXRpbmcgICAgICAgICAgICAgICAgICAgIiUxJHMgLSBleGl0aW5nLiIKK0luY29tcGF0aWJsZUxpYnJhcnkgICAgICAgICAgIkluY29tcGF0aWJsZSAlMSRzIGxpYnJhcnkgd2l0aCB2ZXJzaW9uICUyJHMgZm91bmQuIgorSXR0RnVuY3Rpb25FcnJvciAgICAgICAgICAgICAiaXR0bm90aWZ5OiBGdW5jdGlvbiAlMSRzIGZhaWxlZDoiCitJdHRVbmtub3duRXJyb3IgICAgICAgICAgICAgICJpdHRub2ZpZnk6IEVycm9yICMlMSRkLiIKK0Vudk1pZGRsZVdhcm4gICAgICAgICAgICAgICAgIiUxJHMgbXVzdCBiZSBzZXQgcHJpb3IgdG8gZmlyc3QgcGFyYWxsZWwgcmVnaW9uIG9yIGNlcnRhaW4gQVBJIGNhbGxzOyBpZ25vcmVkLiIKK0Nuc0xvY2tOb3REZXN0cm95ZWQgICAgICAgICAgIkxvY2sgaW5pdGlhbGl6ZWQgYXQgJTEkcyglMyRkKSB3YXMgbm90IGRlc3Ryb3llZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgJTEsICUyLCAlMywgJTQgLS0gZmlsZSwgZnVuYywgbGluZSwgY29sCitDYW50TG9hZEJhbFVzaW5nICAgICAgICAgICAgICJDYW5ub3QgZGV0ZXJtaW5lIG1hY2hpbmUgbG9hZCBiYWxhbmNlIC0gVXNpbmcgJTEkcyIKK0FmZk5vdENhcGFibGVVc2VQdGhyZWFkICAgICAgIiUxJHM6IEFmZmluaXR5IG5vdCBjYXBhYmxlLCB1c2luZyBwdGhyZWFkIGluZm8iCitBZmZVc2VQdGhyZWFkICAgICAgICAgICAgICAgICIlMSRzOiBBZmZpbml0eSBjYXBhYmxlLCB1c2luZyBwdGhyZWFkIGluZm8iCitSbWxMb2FkTGliRmFpbGVkICAgICAgICAgICAgICJMb2FkaW5nIFwiJTEkc1wiIGxpYnJhcnkgZmFpbGVkOiIKK1JtbExvb2t1cEZhaWxlZCAgICAgICAgICAgICAgIkxvb2t1cCBvZiBcIiUxJHNcIiBmdW5jdGlvbiBmYWlsZWQ6IgorUm1sQnVmZmVyVG9vU21hbGwgICAgICAgICAgICAiQnVmZmVyIHRvbyBzbWFsbC4iCitSbWxVbmtub3duRXJyb3IgICAgICAgICAgICAgICJFcnJvciAjJTEkZC4iCitOdGhTeW50YXhFcnJvciAgICAgICAgICAgICAgICIlMSRzOiBJbnZhbGlkIHN5bWJvbHMgZm91bmQuIENoZWNrIHRoZSB2YWx1ZSBcIiUyJHNcIi4iCitOdGhTcGFjZXNOb3RBbGxvd2VkICAgICAgICAgICIlMSRzOiBTcGFjZXMgYmV0d2VlbiBkaWdpdHMgYXJlIG5vdCBhbGxvd2VkIFwiJTIkc1wiLiIKK0FmZlN0clBhcnNlRmlsZW5hbWUgICAgICAgICAgIiUxJHM6ICUyJHMgLSBwYXJzaW5nICUzJHMuIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkcyBjYW5ub3QgYmUgc3BlY2lmaWVkIHZpYSBrbXBfc2V0X2RlZmF1bHRzKCkgb24gdGhpcyBtYWNoaW5lIGJlY2F1c2UgaXQgaGFzIG1vcmUgdGhhbiBvbmUgcHJvY2Vzc29yIGdyb3VwLiIKK0FmZlR5cGVDYW50VXNlTXVsdEdyb3VwcyAgICAgIkNhbm5vdCB1c2UgYWZmaW5pdHkgdHlwZSBcIiUxJHNcIiB3aXRoIG11bHRpcGxlIFdpbmRvd3MqIE9TIHByb2Nlc3NvciBncm91cHMsIHVzaW5nIFwiJTIkc1wiLiIKK0FmZkdyYW5DYW50VXNlTXVsdEdyb3VwcyAgICAgIkNhbm5vdCB1c2UgYWZmaW5pdHkgZ3JhbnVsYXJpdHkgXCIlMSRzXCIgd2l0aCBtdWx0aXBsZSBXaW5kb3dzKiBPUyBwcm9jZXNzb3IgZ3JvdXBzLCB1c2luZyBcIiUyJHNcIi4iCitBZmZXaW5kb3dzUHJvY0dyb3VwTWFwICAgICAgICIlMSRzOiBNYXBwaW5nIFdpbmRvd3MqIE9TIHByb2Nlc3NvciBncm91cCA8aT4gcHJvYyA8aj4gdG8gT1MgcHJvYyA2NCo8aT4rPGo+LiIKK0FmZk9TUHJvY1RvR3JvdXAgICAgICAgICAgICAgIiUxJHM6IE9TIHByb2MgJTIkZCBtYXBzIHRvIFdpbmRvd3MqIE9TIHByb2Nlc3NvciBncm91cCAlMyRkIHByb2MgJTQkZCIKK0FmZkJhbGFuY2VkTm90QXZhaWwgICAgICAgICAgIiUxJHM6IEFmZmluaXR5IGJhbGFuY2VkIGlzIG5vdCBhdmFpbGFibGUuIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogZ3JhbnVsYXJpdHk9Y29yZSB3aWxsIGJlIHVzZWQuIgorRW52TG9ja1dhcm4gICAgICAgICAgICAgICAgICAiJTEkcyBtdXN0IGJlIHNldCBwcmlvciB0byBmaXJzdCBPTVAgbG9jayBjYWxsIG9yIGNyaXRpY2FsIHNlY3Rpb247IGlnbm9yZWQuIgorRnV0ZXhOb3RTdXBwb3J0ZWQgICAgICAgICAgICAiZnV0ZXggc3lzdGVtIGNhbGwgbm90IHN1cHBvcnRlZDsgJTEkcz0lMiRzIGlnbm9yZWQuIgorQWZmR3JhblVzaW5nICAgICAgICAgICAgICAgICAiJTEkczogZ3JhbnVsYXJpdHk9JTIkcyB3aWxsIGJlIHVzZWQuIgorQWZmVGhyUGxhY2VJbnZhbGlkICAgICAgICAgICAiJTEkczogaW52YWxpZCB2YWx1ZSBcIiUyJHNcIiwgdmFsaWQgZm9ybWF0IGlzIFwibkMsbVRbLGtPXVwiLiIKK0FmZlRoclBsYWNlVW5zdXBwb3J0ZWQgICAgICAgIktNUF9QTEFDRV9USFJFQURTIGlnbm9yZWQ6IHVuc3VwcG9ydGVkIGFyY2hpdGVjdHVyZS4iCitBZmZUaHJQbGFjZU1hbnlDb3JlcyAgICAgICAgICJLTVBfUExBQ0VfVEhSRUFEUyBpZ25vcmVkOiB0b28gbWFueSBjb3JlcyByZXF1ZXN0ZWQuIgorU3ludGF4RXJyb3JVc2luZyAgICAgICAgICAgICAiJTEkczogc3ludGF4IGVycm9yLCB1c2luZyAlMiRzLiIKK0FkYXB0aXZlTm90U3VwcG9ydGVkICAgICAgICAgIiUxJHM6IEFkYXB0aXZlIGxvY2tzIGFyZSBub3Qgc3VwcG9ydGVkOyB1c2luZyBxdWV1aW5nLiIgCitFbnZTeW50YXhFcnJvciAgICAgICAgICAgICAgICIlMSRzOiBJbnZhbGlkIHN5bWJvbHMgZm91bmQuIENoZWNrIHRoZSB2YWx1ZSBcIiUyJHNcIi4iIAorRW52U3BhY2VzTm90QWxsb3dlZCAgICAgICAgICAiJTEkczogU3BhY2VzIGJldHdlZW4gZGlnaXRzIGFyZSBub3QgYWxsb3dlZCBcIiUyJHNcIi4iIAorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistKi0gSElOVFMgLSotCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSGludHMuIEhpbnQgbWF5IGJlIHByaW50ZWQgYWZ0ZXIgYSBtZXNzYWdlLiBVc3VhbGx5IGl0IGlzIGxvbmdlciBleHBsYW5hdGlvbiB0ZXh0IG9yIHN1Z2dlc3Rpb24uCisjIFRvIG1haW50YWluIGhpbnQgbnVtYmVycyAodGhleSBhcmUgdmlzaWJsZSB0byBjdXN0b21lcnMpLCBhZGQgbmV3IGhpbnRzIHRvIHRoZSBlbmQuCisKK1N1Ym1pdEJ1Z1JlcG9ydCAgICAgICAgICAgICAgIlBsZWFzZSBzdWJtaXQgYSBidWcgcmVwb3J0IHdpdGggdGhpcyBtZXNzYWdlLCBjb21waWxlIGFuZCBydW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tbWFuZHMgdXNlZCwgYW5kIG1hY2hpbmUgY29uZmlndXJhdGlvbiBpbmZvIGluY2x1ZGluZyBuYXRpdmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tcGlsZXIgYW5kIG9wZXJhdGluZyBzeXN0ZW0gdmVyc2lvbnMuIEZhc3RlciByZXNwb25zZSB3aWxsIGJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9idGFpbmVkIGJ5IGluY2x1ZGluZyBhbGwgcHJvZ3JhbSBzb3VyY2VzLiBGb3IgaW5mb3JtYXRpb24gb24gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3VibWl0dGluZyB0aGlzIGlzc3VlLCBwbGVhc2Ugc2VlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly93d3cuaW50ZWwuY29tL3NvZnR3YXJlL3Byb2R1Y3RzL3N1cHBvcnQvLiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIkNoZWNrIE5MU1BBVEggZW52aXJvbm1lbnQgdmFyaWFibGUsIGl0cyB2YWx1ZSBpcyBcIiUxJHNcIi4iCitDaGFuZ2VTdGFja0xpbWl0ICAgICAgICAgICAgICJQbGVhc2UgdHJ5IGNoYW5naW5nIHRoZSBzaGVsbCBzdGFjayBsaW1pdCBvciBhZGp1c3RpbmcgdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9NUF9TVEFDS1NJWkUgZW52aXJvbm1lbnQgdmFyaWFibGUuIgorVW5zZXRfQUxMX1RIUkVBRFMgICAgICAgICAgICAiQ29uc2lkZXIgdW5zZXR0aW5nIEtNUF9BTExfVEhSRUFEUyBhbmQgT01QX1RIUkVBRF9MSU1JVCAoaWYgZWl0aGVyIGlzIHNldCkuIgorU2V0X0FMTF9USFJFQURQUklWQVRFICAgICAgICAiQ29uc2lkZXIgc2V0dGluZyBLTVBfQUxMX1RIUkVBRFBSSVZBVEUgdG8gYSB2YWx1ZSBsYXJnZXIgdGhhbiAlMSRkLiIKK1Bvc3NpYmxlU3lzdGVtTGltaXRPblRocmVhZHMgIlRoaXMgY291bGQgYWxzbyBiZSBkdWUgdG8gYSBzeXN0ZW0tcmVsYXRlZCBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIHRocmVhZHMuIgorRHVwbGljYXRlTGlicmFyeSAgICAgICAgICAgICAiVGhpcyBtZWFucyB0aGF0IG11bHRpcGxlIGNvcGllcyBvZiB0aGUgT3Blbk1QIHJ1bnRpbWUgaGF2ZSBiZWVuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpbmtlZCBpbnRvIHRoZSBwcm9ncmFtLiBUaGF0IGlzIGRhbmdlcm91cywgc2luY2UgaXQgY2FuIGRlZ3JhZGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGVyZm9ybWFuY2Ugb3IgY2F1c2UgaW5jb3JyZWN0IHJlc3VsdHMuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBiZXN0IHRoaW5nIHRvIGRvIGlzIHRvIGVuc3VyZSB0aGF0IG9ubHkgYSBzaW5nbGUgT3Blbk1QIHJ1bnRpbWUgaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGlua2VkIGludG8gdGhlIHByb2Nlc3MsIGUuZy4gYnkgYXZvaWRpbmcgc3RhdGljIGxpbmtpbmcgb2YgdGhlIE9wZW5NUCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJydW50aW1lIGluIGFueSBsaWJyYXJ5LiBBcyBhbiB1bnNhZmUsIHVuc3VwcG9ydGVkLCB1bmRvY3VtZW50ZWQgd29ya2Fyb3VuZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ5b3UgY2FuIHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgS01QX0RVUExJQ0FURV9MSUJfT0s9VFJVRSB0byBhbGxvdyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgcHJvZ3JhbSB0byBjb250aW51ZSB0byBleGVjdXRlLCBidXQgdGhhdCBtYXkgY2F1c2UgY3Jhc2hlcyBvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaWxlbnRseSBwcm9kdWNlIGluY29ycmVjdCByZXN1bHRzLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHNlZSBodHRwOi8vd3d3LmludGVsLmNvbS9zb2Z0d2FyZS9wcm9kdWN0cy9zdXBwb3J0Ly4iCitOYW1lQ29tZXNGcm9tX0NQVUlORk9fRklMRSAgICJUaGlzIG5hbWUgaXMgc3BlY2lmaWVkIGluIGVudmlyb25tZW50IHZhcmlhYmxlIEtNUF9DUFVJTkZPX0ZJTEUuIgorTm90RW5vdWdoTWVtb3J5ICAgICAgICAgICAgICAiU2VlbXMgYXBwbGljYXRpb24gcmVxdWlyZWQgdG9vIG11Y2ggbWVtb3J5LiIKK1ZhbGlkQm9vbFZhbHVlcyAgICAgICAgICAgICAgIlVzZSBcIjBcIiwgXCJGQUxTRVwiLiBcIi5GLlwiLCBcIm9mZlwiLCBcIm5vXCIgYXMgZmFsc2UgdmFsdWVzLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIjFcIiwgXCJUUlVFXCIsIFwiLlQuXCIsIFwib25cIiwgXCJ5ZXNcIiBhcyB0cnVlIHZhbHVlcy4iCitCdWZmZXJPdmVyZmxvdyAgICAgICAgICAgICAgICJQZXJoYXBzIHRvbyBtYW55IHRocmVhZHMuIgorUnVubmluZ0F0TWF4UHJpb3JpdHkgICAgICAgICAiRGVjcmVhc2UgcHJpb3JpdHkgb2YgYXBwbGljYXRpb24uICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgd2lsbCBhbGxvdyB0aGUgbW9uaXRvciB0aHJlYWQgcnVuIGF0IGhpZ2hlciBwcmlvcml0eSB0aGFuIG90aGVyIHRocmVhZHMuIgorQ2hhbmdlTW9uaXRvclN0YWNrU2l6ZSAgICAgICAiVHJ5IGNoYW5naW5nIEtNUF9NT05JVE9SX1NUQUNLU0laRSBvciB0aGUgc2hlbGwgc3RhY2sgbGltaXQuIgorQ2hhbmdlV29ya2VyU3RhY2tTaXplICAgICAgICAiVHJ5IGNoYW5naW5nIE9NUF9TVEFDS1NJWkUgYW5kL29yIHRoZSBzaGVsbCBzdGFjayBsaW1pdC4iCitJbmNyZWFzZVdvcmtlclN0YWNrU2l6ZSAgICAgICJUcnkgaW5jcmVhc2luZyBPTVBfU1RBQ0tTSVpFIG9yIHRoZSBzaGVsbCBzdGFjayBsaW1pdC4iCitEZWNyZWFzZVdvcmtlclN0YWNrU2l6ZSAgICAgICJUcnkgZGVjcmVhc2luZyBPTVBfU1RBQ0tTSVpFLiIKK0RlY3JlYXNlX05VTV9USFJFQURTICAgICAgICAgIlRyeSBkZWNyZWFzaW5nIHRoZSB2YWx1ZSBvZiBPTVBfTlVNX1RIUkVBRFMuIgorSW5jcmVhc2VNb25pdG9yU3RhY2tTaXplICAgICAiVHJ5IGluY3JlYXNpbmcgS01QX01PTklUT1JfU1RBQ0tTSVpFLiIKK0RlY3JlYXNlTW9uaXRvclN0YWNrU2l6ZSAgICAgIlRyeSBkZWNyZWFzaW5nIEtNUF9NT05JVE9SX1NUQUNLU0laRS4iCitEZWNyZWFzZU51bWJlck9mVGhyZWFkc0luVXNlICJUcnkgZGVjcmVhc2luZyB0aGUgbnVtYmVyIG9mIHRocmVhZHMgaW4gdXNlIHNpbXVsdGFuZW91c2x5LiIKK0RlZmF1bHRTY2hlZHVsZUtpbmRVc2VkICAgICAgIldpbGwgdXNlIGRlZmF1bHQgc2NoZWR1bGUgdHlwZSAoJTEkcykuIgorR2V0TmV3ZXJMaWJyYXJ5ICAgICAgICAgICAgICAiSXQgY291bGQgYmUgYSByZXN1bHQgb2YgdXNpbmcgYW4gb2xkZXIgT01QIGxpYnJhcnkgd2l0aCBhIG5ld2VyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBpbGVyIG9yIG1lbW9yeSBjb3JydXB0aW9uLiBZb3UgbWF5IGNoZWNrIHRoZSBwcm9wZXIgT01QIGxpYnJhcnkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXMgbGlua2VkIHRvIHRoZSBhcHBsaWNhdGlvbi4iCitDaGVja0VudlZhciAgICAgICAgICAgICAgICAgICJDaGVjayAlMSRzIGVudmlyb25tZW50IHZhcmlhYmxlLCBpdHMgdmFsdWUgaXMgXCIlMiRzXCIuIgorR2V0TmV3ZXJJT01QTGlicmFyeSAgICAgICAgICAiWW91IG1heSB3YW50IHRvIHVzZSBhbiAlMSRzIGxpYnJhcnkgdGhhdCBzdXBwb3J0cyAlMiRzIGludGVyZmFjZSB3aXRoIHZlcnNpb24gJTMkcy4iCitHZXROZXdlcklSTUxMaWJyYXJ5ICAgICAgICAgICJZb3UgbWF5IHdhbnQgdG8gdXNlIGFuICUxJHMgbGlicmFyeSB3aXRoIHZlcnNpb24gJTIkcy4iCitCYWRFeGVGb3JtYXQgICAgICAgICAgICAgICAgICJTeXN0ZW0gZXJyb3IgIzE5MyBpcyBcIkJhZCBmb3JtYXQgb2YgRVhFIG9yIERMTCBmaWxlXCIuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVzdWFsbHkgaXQgbWVhbnMgdGhlIGZpbGUgaXMgZm91bmQsIGJ1dCBpdCBpcyBjb3JydXB0ZWQgb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYSBmaWxlIGZvciBhbm90aGVyIGFyY2hpdGVjdHVyZS4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hlY2sgd2hldGhlciBcIiUxJHNcIiBpcyBhIGZpbGUgZm9yICUyJHMgYXJjaGl0ZWN0dXJlLiIKK1N5c3RlbUxpbWl0T25UaHJlYWRzICAgICAgICAgIlN5c3RlbS1yZWxhdGVkIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgdGhyZWFkcy4iCisKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGVuZCBvZiBmaWxlICMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS8yNS9pb21wLmgudmFyIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS8yNS9pb21wLmgudmFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YjI0ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzI1L2lvbXAuaC52YXIKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIGluY2x1ZGUvMjUvaW9tcC5oLnZhcgorICogJFJldmlzaW9uOiA0MjA2MSAkCisgKiAkRGF0ZTogMjAxMy0wMi0yOCAxNjozNjoyNCAtMDYwMCAoVGh1LCAyOCBGZWIgMjAxMykgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIF9fSU9NUF9ICisjICAgZGVmaW5lIF9fSU9NUF9ICisKKyMgICBkZWZpbmUgS01QX1ZFUlNJT05fTUFKT1IgICAgJEtNUF9WRVJTSU9OX01BSk9SCisjICAgZGVmaW5lIEtNUF9WRVJTSU9OX01JTk9SICAgICRLTVBfVkVSU0lPTl9NSU5PUgorIyAgIGRlZmluZSBLTVBfVkVSU0lPTl9CVUlMRCAgICAkS01QX1ZFUlNJT05fQlVJTEQKKyMgICBkZWZpbmUgS01QX0JVSUxEX0RBVEUgICAgICAgIiRLTVBfQlVJTERfREFURSIKKworIyAgIGlmZGVmIF9fY3BsdXNwbHVzCisgICAgICAgIGV4dGVybiAiQyIgeworIyAgIGVuZGlmCisKKyMgICAgICAgZGVmaW5lIGttcF9zZXRfc3RhY2tzaXplICAgICAga21wY19zZXRfc3RhY2tzaXplCisjICAgICAgIGRlZmluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zICAgIGttcGNfc2V0X3N0YWNrc2l6ZV9zCisjICAgICAgIGRlZmluZSBrbXBfc2V0X2Jsb2NrdGltZSAgICAgIGttcGNfc2V0X2Jsb2NrdGltZQorIyAgICAgICBkZWZpbmUga21wX3NldF9saWJyYXJ5ICAgICAgICBrbXBjX3NldF9saWJyYXJ5CisjICAgICAgIGRlZmluZSBrbXBfc2V0X2RlZmF1bHRzICAgICAgIGttcGNfc2V0X2RlZmF1bHRzCisKKyMgICAgICAgZGVmaW5lIGttcF9tYWxsb2MgICAgICAgICAgICAga21wY19tYWxsb2MKKyMgICAgICAgZGVmaW5lIGttcF9jYWxsb2MgICAgICAgICAgICAga21wY19jYWxsb2MKKyMgICAgICAgZGVmaW5lIGttcF9yZWFsbG9jICAgICAgICAgICAga21wY19yZWFsbG9jCisjICAgICAgIGRlZmluZSBrbXBfZnJlZSAgICAgICAgICAgICAgIGttcGNfZnJlZQorCisjICAgaWYgZGVmaW5lZChfV0lOMzIpCisjICAgICAgIGRlZmluZSBfX0tBSV9LTVBDX0NPTlZFTlRJT04gX19jZGVjbAorIyAgIGVsc2UKKyMgICAgICAgZGVmaW5lIF9fS0FJX0tNUENfQ09OVkVOVElPTgorIyAgIGVuZGlmCisKKyMgICBpbmNsdWRlIDxzdGRsaWIuaD4KKyAgICAvKiBrbXAgQVBJIGZ1bmN0aW9ucyAqLworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X3N0YWNrc2l6ZSAgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfc3RhY2tzaXplICAgICAgICAgIChpbnQpOworICAgIGV4dGVybiBzaXplX3QgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X3N0YWNrc2l6ZV9zICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfc3RhY2tzaXplX3MgICAgICAgIChzaXplX3QpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2Jsb2NrdGltZSAgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfbGlicmFyeSAgICAgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9ibG9ja3RpbWUgICAgICAgICAgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfbGlicmFyeSAgICAgICAgICAgIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2RlZmF1bHRzICAgICAgICAgICAoY2hhciBjb25zdCAqKTsKKworICAgIGV4dGVybiB2b2lkICogX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfbWFsbG9jICAoc2l6ZV90KTsKKyAgICBleHRlcm4gdm9pZCAqIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2NhbGxvYyAgKHNpemVfdCwgc2l6ZV90KTsKKyAgICBleHRlcm4gdm9pZCAqIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3JlYWxsb2MgKHZvaWQgKiwgc2l6ZV90KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2ZyZWUgICAgKHZvaWQgKik7CisKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF93YXJuaW5nc19vbih2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF93YXJuaW5nc19vZmYodm9pZCk7CisKKyMgICB1bmRlZiBfX0tBSV9LTVBDX0NPTlZFTlRJT04KKworICAgIC8qIFdhcm5pbmc6CisgICAgICAgVGhlIGZvbGxvd2luZyB0eXBlZGVmcyBhcmUgbm90IHN0YW5kYXJkLCBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4KKyAgICAqLworICAgIHR5cGVkZWYgaW50ICAgICBvbXBfaW50X3Q7CisgICAgdHlwZWRlZiBkb3VibGUgIG9tcF93dGltZV90OworCisjICAgaWZkZWYgX19jcGx1c3BsdXMKKyAgICAgICAgfQorIyAgIGVuZGlmCisKKyNlbmRpZiAvKiBfX0lPTVBfSCAqLworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzI1L2lvbXBfbGliLmgudmFyIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS8yNS9pb21wX2xpYi5oLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDRmMDEyCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS8yNS9pb21wX2xpYi5oLnZhcgpAQCAtMCwwICsxLDY2IEBACishIGluY2x1ZGUvMjUvaW9tcF9saWIuaC52YXIKKyEgJFJldmlzaW9uOiA0MjA2MSAkCishICREYXRlOiAyMDEzLTAyLTI4IDE2OjM2OjI0IC0wNjAwIChUaHUsIDI4IEZlYiAyMDEzKSAkCisKKyEKKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIS8vCishLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIS8vCishLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIS8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIS8vCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEKKworISoqKgorISoqKiBvbXBfaW50ZWdlcl9raW5kIGFuZCBvbXBfbG9naWNhbF9raW5kIGFwcGVhciB0byBiZSBwcmVkZWZpbmVkIGJ5IGdjYyBhbmQKKyEqKiogZ2ZvcnRyYW4gKGRlZmluaXRpb25zIGRvIG5vdCBhcHBlYXIgaW4gdGhlIG9tcC5oIC8gb21wX2xpYi5oIC9vbXBfbGliLmYpLgorISoqKiBvbXBfcmVhbF9raW5kIGlzIG5vdCBwcmVkZWZpbmVkLCBob3dldmVyLgorISoqKgorCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9tYWpvciA9ICRLTVBfVkVSU0lPTl9NQUpPUgorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWlub3IgPSAkS01QX1ZFUlNJT05fTUlOT1IKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX2J1aWxkID0gJEtNUF9WRVJTSU9OX0JVSUxECisgICAgICAgIGNoYXJhY3RlcigqKSAgICAgICAgICBrbXBfYnVpbGRfZGF0ZQorICAgICAgICBwYXJhbWV0ZXIoIGttcF9idWlsZF9kYXRlID0gJyRLTVBfQlVJTERfREFURScgKQorCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfcmVhbF9raW5kID0gNAorCishKioqCishKioqIGttcF8qIHR5cGUgZXh0ZW5zaW9ucworISoqKgorCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfcG9pbnRlcl9raW5kID0gJEtNUF9JTlRfUFRSX0tJTkQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9zaXplX3Rfa2luZCAgPSAkS01QX0lOVF9QVFJfS0lORAorCishKioqCishKioqIGttcF8qIGVudHJ5IHBvaW50cworISoqKgorCisgICAgICAgIGV4dGVybmFsIGttcF9zZXRfc3RhY2tzaXplCisgICAgICAgIGV4dGVybmFsIGttcF9zZXRfc3RhY2tzaXplX3MKKyAgICAgICAgZXh0ZXJuYWwga21wX3NldF9ibG9ja3RpbWUKKyAgICAgICAgZXh0ZXJuYWwga21wX3NldF9saWJyYXJ5X3NlcmlhbAorICAgICAgICBleHRlcm5hbCBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorICAgICAgICBleHRlcm5hbCBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorICAgICAgICBleHRlcm5hbCBrbXBfc2V0X2xpYnJhcnkKKyAgICAgICAgZXh0ZXJuYWwga21wX3NldF9kZWZhdWx0cworICAgICAgICBleHRlcm5hbCBrbXBfZ2V0X3N0YWNrc2l6ZQorICAgICAgICBpbnRlZ2VyIGttcF9nZXRfc3RhY2tzaXplCisgICAgICAgIGV4dGVybmFsIGttcF9nZXRfc3RhY2tzaXplX3MKKyAgICAgICAgaW50ZWdlciAoa2luZCA9IGttcF9zaXplX3Rfa2luZCkga21wX2dldF9zdGFja3NpemVfcworICAgICAgICBleHRlcm5hbCBrbXBfZ2V0X2Jsb2NrdGltZQorICAgICAgICBpbnRlZ2VyIGttcF9nZXRfYmxvY2t0aW1lCisgICAgICAgIGV4dGVybmFsIGttcF9nZXRfbGlicmFyeQorICAgICAgICBpbnRlZ2VyIGttcF9nZXRfbGlicmFyeQorICAgICAgICBleHRlcm5hbCBrbXBfbWFsbG9jCisgICAgICAgIGludGVnZXIgKGtpbmQgPSBrbXBfcG9pbnRlcl9raW5kKSBrbXBfbWFsbG9jCisgICAgICAgIGV4dGVybmFsIGttcF9jYWxsb2MKKyAgICAgICAgaW50ZWdlciAoa2luZCA9IGttcF9wb2ludGVyX2tpbmQpIGttcF9jYWxsb2MKKyAgICAgICAgZXh0ZXJuYWwga21wX3JlYWxsb2MKKyAgICAgICAgaW50ZWdlciAoa2luZCA9IGttcF9wb2ludGVyX2tpbmQpIGttcF9yZWFsbG9jCisgICAgICAgIGV4dGVybmFsIGttcF9mcmVlCisgICAgICAgIGV4dGVybmFsIGttcF9zZXRfd2FybmluZ3Nfb24KKyAgICAgICAgZXh0ZXJuYWwga21wX3NldF93YXJuaW5nc19vZmYKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS8yNS9vbXAuaC52YXIgYi9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzI1L29tcC5oLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDNmNDc0Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS8yNS9vbXAuaC52YXIKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiBpbmNsdWRlLzI1L29tcC5oLnZhcgorICogJFJldmlzaW9uOiA0MjA2MSAkCisgKiAkRGF0ZTogMjAxMy0wMi0yOCAxNjozNjoyNCAtMDYwMCAoVGh1LCAyOCBGZWIgMjAxMykgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIF9fT01QX0gKKyMgICBkZWZpbmUgX19PTVBfSAorCisjICAgZGVmaW5lIEtNUF9WRVJTSU9OX01BSk9SICAgICRLTVBfVkVSU0lPTl9NQUpPUgorIyAgIGRlZmluZSBLTVBfVkVSU0lPTl9NSU5PUiAgICAkS01QX1ZFUlNJT05fTUlOT1IKKyMgICBkZWZpbmUgS01QX1ZFUlNJT05fQlVJTEQgICAgJEtNUF9WRVJTSU9OX0JVSUxECisjICAgZGVmaW5lIEtNUF9CVUlMRF9EQVRFICAgICAgICIkS01QX0JVSUxEX0RBVEUiCisKKyMgICBpZmRlZiBfX2NwbHVzcGx1cworICAgIGV4dGVybiAiQyIgeworIyAgIGVuZGlmCisKKyMgICAgICAgZGVmaW5lIG9tcF9zZXRfbnVtX3RocmVhZHMgICAgb21wY19zZXRfbnVtX3RocmVhZHMKKyMgICAgICAgZGVmaW5lIG9tcF9zZXRfZHluYW1pYyAgICAgICAgb21wY19zZXRfZHluYW1pYworIyAgICAgICBkZWZpbmUgb21wX3NldF9uZXN0ZWQgICAgICAgICBvbXBjX3NldF9uZXN0ZWQKKworIyAgICAgICBkZWZpbmUga21wX3NldF9zdGFja3NpemUgICAgICBrbXBjX3NldF9zdGFja3NpemUKKyMgICAgICAgZGVmaW5lIGttcF9zZXRfc3RhY2tzaXplX3MgICAga21wY19zZXRfc3RhY2tzaXplX3MKKyMgICAgICAgZGVmaW5lIGttcF9zZXRfYmxvY2t0aW1lICAgICAga21wY19zZXRfYmxvY2t0aW1lCisjICAgICAgIGRlZmluZSBrbXBfc2V0X2xpYnJhcnkgICAgICAgIGttcGNfc2V0X2xpYnJhcnkKKyMgICAgICAgZGVmaW5lIGttcF9zZXRfZGVmYXVsdHMgICAgICAga21wY19zZXRfZGVmYXVsdHMKKworIyAgICAgICBkZWZpbmUga21wX21hbGxvYyAgICAgICAgICAgICBrbXBjX21hbGxvYworIyAgICAgICBkZWZpbmUga21wX2NhbGxvYyAgICAgICAgICAgICBrbXBjX2NhbGxvYworIyAgICAgICBkZWZpbmUga21wX3JlYWxsb2MgICAgICAgICAgICBrbXBjX3JlYWxsb2MKKyMgICAgICAgZGVmaW5lIGttcF9mcmVlICAgICAgICAgICAgICAga21wY19mcmVlCisKKworIyAgIGlmIGRlZmluZWQoX1dJTjMyKQorIyAgICAgICBkZWZpbmUgX19LQUlfS01QQ19DT05WRU5USU9OIF9fY2RlY2wKKyMgICBlbHNlCisjICAgICAgIGRlZmluZSBfX0tBSV9LTVBDX0NPTlZFTlRJT04KKyMgICBlbmRpZgorCisgICAgLyogc2V0IEFQSSBmdW5jdGlvbnMgKi8KKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9udW1fdGhyZWFkcyAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9keW5hbWljICAgICAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9uZXN0ZWQgICAgICAoaW50KTsKKworICAgIC8qIHF1ZXJ5IEFQSSBmdW5jdGlvbnMgKi8KKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9udW1fdGhyZWFkcyAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X2R5bmFtaWMgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbmVzdGVkICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9tYXhfdGhyZWFkcyAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3RocmVhZF9udW0gICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbnVtX3Byb2NzICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2luX3BhcmFsbGVsICAgICAgKHZvaWQpOworCisgICAgLyogbG9jayBBUEkgZnVuY3Rpb25zICovCisgICAgdHlwZWRlZiBzdHJ1Y3Qgb21wX2xvY2tfdCB7CisgICAgICAgIHZvaWQgKiBfbGs7CisgICAgfSBvbXBfbG9ja190OworCisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9pbml0X2xvY2sgICAgKG9tcF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfbG9jayAgICAgKG9tcF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF91bnNldF9sb2NrICAgKG9tcF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9kZXN0cm95X2xvY2sgKG9tcF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF90ZXN0X2xvY2sgICAgKG9tcF9sb2NrX3QgKik7CisKKyAgICAvKiBuZXN0ZWQgbG9jayBBUEkgZnVuY3Rpb25zICovCisgICAgdHlwZWRlZiBzdHJ1Y3Qgb21wX25lc3RfbG9ja190IHsKKyAgICAgICAgdm9pZCAqIF9sazsKKyAgICB9IG9tcF9uZXN0X2xvY2tfdDsKKworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfaW5pdF9uZXN0X2xvY2sgICAgKG9tcF9uZXN0X2xvY2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9uZXN0X2xvY2sgICAgIChvbXBfbmVzdF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF91bnNldF9uZXN0X2xvY2sgICAob21wX25lc3RfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZGVzdHJveV9uZXN0X2xvY2sgKG9tcF9uZXN0X2xvY2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3Rlc3RfbmVzdF9sb2NrICAgIChvbXBfbmVzdF9sb2NrX3QgKik7CisKKyAgICAvKiB0aW1lIEFQSSBmdW5jdGlvbnMgKi8KKyAgICBleHRlcm4gZG91YmxlIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF93dGltZSAodm9pZCk7CisgICAgZXh0ZXJuIGRvdWJsZSBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfd3RpY2sgKHZvaWQpOworCisjICAgaW5jbHVkZSA8c3RkbGliLmg+CisgICAgLyoga21wIEFQSSBmdW5jdGlvbnMgKi8KKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9zdGFja3NpemUgICAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3N0YWNrc2l6ZSAgICAgICAgICAoaW50KTsKKyAgICBleHRlcm4gc2l6ZV90IF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9zdGFja3NpemVfcyAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3N0YWNrc2l6ZV9zICAgICAgICAoc2l6ZV90KTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9ibG9ja3RpbWUgICAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2xpYnJhcnkgICAgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfYmxvY2t0aW1lICAgICAgICAgIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnkgICAgICAgICAgICAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9saWJyYXJ5X3NlcmlhbCAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZCAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0ICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9kZWZhdWx0cyAgICAgICAgICAgKGNoYXIgY29uc3QgKik7CisKKyAgICBleHRlcm4gdm9pZCAqIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX21hbGxvYyAgKHNpemVfdCk7CisgICAgZXh0ZXJuIHZvaWQgKiBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9jYWxsb2MgIChzaXplX3QsIHNpemVfdCk7CisgICAgZXh0ZXJuIHZvaWQgKiBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9yZWFsbG9jICh2b2lkICosIHNpemVfdCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9mcmVlICAgICh2b2lkICopOworCisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfd2FybmluZ3Nfb24odm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfd2FybmluZ3Nfb2ZmKHZvaWQpOworCisjICAgdW5kZWYgX19LQUlfS01QQ19DT05WRU5USU9OCisKKyAgICAvKiBXYXJuaW5nOgorICAgICAgIFRoZSBmb2xsb3dpbmcgdHlwZWRlZnMgYXJlIG5vdCBzdGFuZGFyZCwgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuCisgICAgKi8KKyAgICB0eXBlZGVmIGludCAgICAgb21wX2ludF90OworICAgIHR5cGVkZWYgZG91YmxlICBvbXBfd3RpbWVfdDsKKworIyAgIGlmZGVmIF9fY3BsdXNwbHVzCisgICAgfQorIyAgIGVuZGlmCisKKyNlbmRpZiAvKiBfX09NUF9IICovCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvMjUvb21wX2xpYi5mLnZhciBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvMjUvb21wX2xpYi5mLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDYyMmVhCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS8yNS9vbXBfbGliLmYudmFyCkBAIC0wLDAgKzEsNDcyIEBACishIGluY2x1ZGUvMjUvb21wX2xpYi5mLnZhcgorISAkUmV2aXNpb246IDQyMTgxICQKKyEgJERhdGU6IDIwMTMtMDMtMjYgMTU6MDQ6NDUgLTA1MDAgKFR1ZSwgMjYgTWFyIDIwMTMpICQKKworIQorIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishLy8KKyEvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCishLy8KKyEvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCishLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCishLy8KKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIQorCishKioqCishKioqIFNvbWUgb2YgdGhlIGRpcmVjdGl2ZXMgZm9yIHRoZSBmb2xsb3dpbmcgcm91dGluZSBleHRlbmQgcGFzdCBjb2x1bW4gNzIsCishKioqIHNvIHByb2Nlc3MgdGhpcyBmaWxlIGluIDEzMi1jb2x1bW4gbW9kZS4KKyEqKioKKworIWRlYyQgZml4ZWRmb3JtbGluZXNpemU6MTMyCisKKyAgICAgIG1vZHVsZSBvbXBfbGliX2tpbmRzCisKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9pbnRlZ2VyX2tpbmQgICA9IDQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2dpY2FsX2tpbmQgICA9IDQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9yZWFsX2tpbmQgICAgICA9IDQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2tpbmQgICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbmVzdF9sb2NrX2tpbmQgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3BvaW50ZXJfa2luZCAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9zaXplX3Rfa2luZCAgICA9IGludF9wdHJfa2luZCgpCisKKyAgICAgIGVuZCBtb2R1bGUgb21wX2xpYl9raW5kcworCisgICAgICBtb2R1bGUgb21wX2xpYgorCisgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisKKyAgICAgICAgaW50ZWdlciwgICAgICBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWFqb3IgPSAkS01QX1ZFUlNJT05fTUFKT1IKKyAgICAgICAgaW50ZWdlciwgICAgICBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWlub3IgPSAkS01QX1ZFUlNJT05fTUlOT1IKKyAgICAgICAgaW50ZWdlciwgICAgICBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fYnVpbGQgPSAkS01QX1ZFUlNJT05fQlVJTEQKKyAgICAgICAgY2hhcmFjdGVyKCopLCBwYXJhbWV0ZXIgOjoga21wX2J1aWxkX2RhdGUgICAgPSAnJEtNUF9CVUlMRF9EQVRFJworICAgICAgICBpbnRlZ2VyLCAgICAgIHBhcmFtZXRlciA6OiBvcGVubXBfdmVyc2lvbiAgICA9IDIwMDUwNQorCisgICAgICAgIGludGVyZmFjZQorCishICAgICAgICAgKioqCishICAgICAgICAgKioqIG9tcF8qIGVudHJ5IHBvaW50cworISAgICAgICAgICoqKgorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzKG50aHJlYWRzKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbnRocmVhZHMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYyhlbmFibGUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBlbmFibGUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWMKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWQoZW5hYmxlKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgZW5hYmxlCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWQKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fdGhyZWFkcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV90aHJlYWRzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X3RocmVhZHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGhyZWFkX251bQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0KKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3Byb2NzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfaW5fcGFyYWxsZWwoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2luX3BhcmFsbGVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9keW5hbWljKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfZHluYW1pYworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfbmVzdGVkCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBkb3VibGUgcHJlY2lzaW9uIG9tcF9nZXRfd3RpbWUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGltZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGljayAoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGRvdWJsZSBwcmVjaXNpb24gb21wX2dldF93dGljaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aWNrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbG9jayhsb2NrdmFyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jayhsb2NrdmFyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfdGVzdF9sb2NrCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9jayhsb2NrdmFyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3Vuc2V0X25lc3RfbG9jayhsb2NrdmFyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X25lc3RfbG9jaworCisgICAgICAgICAgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfdGVzdF9uZXN0X2xvY2sKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jaworCishICAgICAgICAgKioqCishICAgICAgICAgKioqIGttcF8qIGVudHJ5IHBvaW50cworISAgICAgICAgICoqKgorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZShzaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgc2l6ZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3Moc2l6ZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgc2l6ZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9ibG9ja3RpbWUobXNlYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG1zZWMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbAorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0KCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5KGxpYm51bSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGxpYm51bQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzKHN0cmluZykKKyAgICAgICAgICAgIGNoYXJhY3RlciooKikgc3RyaW5nCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0cworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9zdGFja3NpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3MoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYmxvY2t0aW1lCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9saWJyYXJ5CisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX21hbGxvYyhzaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX21hbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX21hbGxvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2NhbGxvYyhuZWxlbSwgZWxzaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX2NhbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIG5lbGVtCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgZWxzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9jYWxsb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9yZWFsbG9jKHB0ciwgc2l6ZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9yZWFsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIHB0cgorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3JlYWxsb2MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX2ZyZWUocHRyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkgcHRyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2ZyZWUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbigpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24KKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29mZgorCisgICAgICAgZW5kIGludGVyZmFjZQorCishZGVjJCBpZiBkZWZpbmVkKF9XSU4zMikKKyFkZWMkICAgaWYgZGVmaW5lZChfV0lONjQpIC5vci4gZGVmaW5lZChfTV9BTUQ2NCkKKworISoqKgorISoqKiBUaGUgRm9ydHJhbiBlbnRyeSBwb2ludHMgbXVzdCBiZSBpbiB1cHBlcmNhc2UsIGV2ZW4gaWYgdGhlIC9RbG93ZXJjYXNlCishKioqIG9wdGlvbiBpcyBzcGVjaWZpZWQuICBUaGUgYWxpYXMgYXR0cmlidXRlIGVuc3VyZXMgdGhhdCB0aGUgc3BlY2lmaWVkCishKioqIHN0cmluZyBpcyB1c2VkIGFzIHRoZSBlbnRyeSBwb2ludC4KKyEqKioKKyEqKiogT24gdGhlIFdpbmRvd3MqIE9TIElBLTMyIGFyY2hpdGVjdHVyZSwgdGhlIEZvcnRyYW4gZW50cnkgcG9pbnRzIGhhdmUgYW4KKyEqKiogdW5kZXJzY29yZSBwcmVwZW5kZWQuICBPbiB0aGUgV2luZG93cyogT1MgSW50ZWwoUikgNjQKKyEqKiogYXJjaGl0ZWN0dXJlLCBubyB1bmRlcnNjb3JlIGlzIHByZXBlbmRlZC4KKyEqKioKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9OVU1fVEhSRUFEUycgOjogb21wX3NldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9EWU5BTUlDJyA6OiBvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfTkVTVEVEJyA6OiBvbXBfc2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9OVU1fVEhSRUFEUycgOjogb21wX2dldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9NQVhfVEhSRUFEUycgOjogb21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9USFJFQURfTlVNJyA6OiBvbXBfZ2V0X3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTlVNX1BST0NTJyA6OiBvbXBfZ2V0X251bV9wcm9jcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0lOX1BBUkFMTEVMJyA6OiBvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfRFlOQU1JQycgOjogb21wX2dldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05FU1RFRCcgOjogb21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfV1RJTUUnIDo6IG9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfV1RJQ0snIDo6IG9tcF9nZXRfd3RpY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbG9jaycgOjogb21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbG9jaycgOjogb21wX2Rlc3Ryb3lfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9sb2NrJyA6OiBvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9sb2NrJyA6OiBvbXBfdW5zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbG9jaycgOjogb21wX3Rlc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbmVzdF9sb2NrJyA6OiBvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X25lc3RfbG9jaycgOjogb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X25lc3RfbG9jaycgOjogb21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9uZXN0X2xvY2snIDo6IG9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X25lc3RfbG9jaycgOjogb21wX3Rlc3RfbmVzdF9sb2NrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfU1RBQ0tTSVpFJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfU1RBQ0tTSVpFX1MnOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0JMT0NLVElNRSc6OmttcF9zZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUllfU0VSSUFMJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQnOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQnOjprbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX1NUQUNLU0laRSc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX1NUQUNLU0laRV9TJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9CTE9DS1RJTUUnOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9MSUJSQVJZJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfTUFMTE9DJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0NBTExPQyc6OmttcF9jYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9SRUFMTE9DJzo6a21wX3JlYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9GUkVFJzo6a21wX2ZyZWUKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9XQVJOSU5HU19PTic6OmttcF9zZXRfd2FybmluZ3Nfb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfV0FSTklOR1NfT0ZGJzo6a21wX3NldF93YXJuaW5nc19vZmYKKworIWRlYyQgICBlbHNlCisKKyEqKioKKyEqKiogT24gV2luZG93cyogT1MgSUEtMzIgYXJjaGl0ZWN0dXJlLCB0aGUgRm9ydHJhbiBlbnRyeSBwb2ludHMgaGF2ZSBhbiAKKyEqKiogdW5kZXJzY29yZSBwcmVwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX05VTV9USFJFQURTJyA6OiBvbXBfc2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9EWU5BTUlDJyA6OiBvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX05FU1RFRCcgOjogb21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX05VTV9USFJFQURTJyA6OiBvbXBfZ2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9NQVhfVEhSRUFEUycgOjogb21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfVEhSRUFEX05VTScgOjogb21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9OVU1fUFJPQ1MnIDo6IG9tcF9nZXRfbnVtX3Byb2NzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0lOX1BBUkFMTEVMJyA6OiBvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0RZTkFNSUMnIDo6IG9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTkVTVEVEJyA6OiBvbXBfZ2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfV1RJTUUnIDo6IG9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1dUSUNLJyA6OiBvbXBfZ2V0X3d0aWNrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9sb2NrJyA6OiBvbXBfaW5pdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbG9jaycgOjogb21wX2Rlc3Ryb3lfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbG9jaycgOjogb21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X2xvY2snIDo6IG9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbG9jaycgOjogb21wX3Rlc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X25lc3RfbG9jaycgOjogb21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbmVzdF9sb2NrJyA6OiBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X25lc3RfbG9jaycgOjogb21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbmVzdF9sb2NrJyA6OiBvbXBfdW5zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbmVzdF9sb2NrJyA6OiBvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfU1RBQ0tTSVpFJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX1NUQUNLU0laRV9TJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfQkxPQ0tUSU1FJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUllfU0VSSUFMJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWV9UVVJOQVJPVU5EJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUllfVEhST1VHSFBVVCc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9MSUJSQVJZJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9TVEFDS1NJWkUnOjprbXBfZ2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfU1RBQ0tTSVpFX1MnOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9CTE9DS1RJTUUnOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfTElCUkFSWSc6OmttcF9nZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9NQUxMT0MnOjprbXBfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0NBTExPQyc6OmttcF9jYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfUkVBTExPQyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0ZSRUUnOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9XQVJOSU5HU19PTic6OmttcF9zZXRfd2FybmluZ3Nfb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX1dBUk5JTkdTX09GRic6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyFkZWMkICAgZW5kaWYKKyFkZWMkIGVuZGlmCisKKyFkZWMkIGlmIGRlZmluZWQoX19saW51eCkKKworISoqKgorISoqKiBUaGUgTGludXgqIE9TIGVudHJ5IHBvaW50cyBhcmUgaW4gbG93ZXJjYXNlLCB3aXRoIGFuIHVuZGVyc2NvcmUgYXBwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbnVtX3RocmVhZHNfJzo6b21wX3NldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9keW5hbWljXyc6Om9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9uZXN0ZWRfJzo6b21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbnVtX3RocmVhZHNfJzo6b21wX2dldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9tYXhfdGhyZWFkc18nOjpvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3RocmVhZF9udW1fJzo6b21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X251bV9wcm9jc18nOjpvbXBfZ2V0X251bV9wcm9jcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luX3BhcmFsbGVsXyc6Om9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9keW5hbWljXyc6Om9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9uZXN0ZWRfJzo6b21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfd3RpbWVfJzo6b21wX2dldF93dGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF93dGlja18nOjpvbXBfZ2V0X3d0aWNrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X2xvY2tfJzo6b21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbG9ja18nOjpvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X2xvY2tfJzo6b21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbG9ja18nOjpvbXBfdW5zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbG9ja18nOjpvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9uZXN0X2xvY2tfJzo6b21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9uZXN0X2xvY2tfJzo6b21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X25lc3RfbG9ja18nOjpvbXBfc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Vuc2V0X25lc3RfbG9ja18nOjpvbXBfdW5zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9uZXN0X2xvY2tfJzo6b21wX3Rlc3RfbmVzdF9sb2NrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfc3RhY2tzaXplXyc6OmttcF9zZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9zZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfYmxvY2t0aW1lXyc6OmttcF9zZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2xpYnJhcnlfc2VyaWFsXyc6OmttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kXyc6OmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dF8nOjprbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9saWJyYXJ5Xyc6OmttcF9zZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9zdGFja3NpemVfJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfc3RhY2tzaXplX3NfJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9ibG9ja3RpbWVfJzo6a21wX2dldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfbGlicmFyeV8nOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9tYWxsb2NfJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2NhbGxvY18nOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfcmVhbGxvY18nOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2ZyZWVfJzo6a21wX2ZyZWUKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF93YXJuaW5nc19vbl8nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X3dhcm5pbmdzX29mZl8nOjprbXBfc2V0X3dhcm5pbmdzX29mZgorCishZGVjJCBlbmRpZgorCishZGVjJCBpZiBkZWZpbmVkKF9fQVBQTEVfXykKKworISoqKgorISoqKiBUaGUgTWFjIGVudHJ5IHBvaW50cyBhcmUgaW4gbG93ZXJjYXNlLCB3aXRoIGFuIGJvdGggYW4gdW5kZXJzY29yZQorISoqKiBhcHBlbmRlZCBhbmQgYW4gdW5kZXJzY29yZSBwcmVwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X251bV90aHJlYWRzXyc6Om9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X2R5bmFtaWNfJzo6b21wX3NldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9uZXN0ZWRfJzo6b21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X251bV90aHJlYWRzXyc6Om9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X21heF90aHJlYWRzXyc6Om9tcF9nZXRfbWF4X3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3RocmVhZF9udW1fJzo6b21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9udW1fcHJvY3NfJzo6b21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5fcGFyYWxsZWxfJzo6b21wX2luX3BhcmFsbGVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9keW5hbWljXyc6Om9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbmVzdGVkXyc6Om9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF93dGltZV8nOjpvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF93dGlja18nOjpvbXBfZ2V0X3d0aWNrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9sb2NrXyc6Om9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9sb2NrXyc6Om9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X2xvY2tfJzo6b21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X2xvY2tfJzo6b21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9sb2NrXyc6Om9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9uZXN0X2xvY2tfJzo6b21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbmVzdF9sb2NrXyc6Om9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbmVzdF9sb2NrXyc6Om9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X25lc3RfbG9ja18nOjpvbXBfdW5zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbmVzdF9sb2NrXyc6Om9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9zdGFja3NpemVfJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9zZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2Jsb2NrdGltZV8nOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV9zZXJpYWxfJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kXyc6OmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9zdGFja3NpemVfJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9nZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2Jsb2NrdGltZV8nOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfbGlicmFyeV8nOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfbWFsbG9jXyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfY2FsbG9jXyc6OmttcF9jYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfcmVhbGxvY18nOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9mcmVlXyc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3dhcm5pbmdzX29uXyc6OmttcF9zZXRfd2FybmluZ3Nfb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3dhcm5pbmdzX29mZl8nOjprbXBfc2V0X3dhcm5pbmdzX29mZgorCishZGVjJCBlbmRpZgorCisgICAgICBlbmQgbW9kdWxlIG9tcF9saWIKKworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzI1L29tcF9saWIuZjkwLnZhciBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvMjUvb21wX2xpYi5mOTAudmFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxYmY3MjUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzI1L29tcF9saWIuZjkwLnZhcgpAQCAtMCwwICsxLDI1NiBAQAorISBpbmNsdWRlLzI1L29tcF9saWIuZjkwLnZhcgorISAkUmV2aXNpb246IDQyMDYxICQKKyEgJERhdGU6IDIwMTMtMDItMjggMTY6MzY6MjQgLTA2MDAgKFRodSwgMjggRmViIDIwMTMpICQKKworIQorIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishLy8KKyEvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCishLy8KKyEvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCishLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCishLy8KKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIQorCisgICAgICBtb2R1bGUgb21wX2xpYl9raW5kcworCisgICAgICAgIHVzZSwgaW50cmluc2ljIDo6IGlzb19jX2JpbmRpbmcKKworICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2ludGVnZXJfa2luZCAgICAgICA9IGNfaW50CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbG9naWNhbF9raW5kICAgICAgID0gNAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3JlYWxfa2luZCAgICAgICAgICA9IGNfZmxvYXQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9kb3VibGVfa2luZCAgICAgICAgPSBjX2RvdWJsZQorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfa2luZCAgICAgICAgICA9IGNfaW50cHRyX3QKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9uZXN0X2xvY2tfa2luZCAgICAgPSBjX2ludHB0cl90CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfcG9pbnRlcl9raW5kICAgICAgID0gY19pbnRwdHJfdAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3NpemVfdF9raW5kICAgICAgICA9IGNfc2l6ZV90CisKKyAgICAgIGVuZCBtb2R1bGUgb21wX2xpYl9raW5kcworCisgICAgICBtb2R1bGUgb21wX2xpYgorCisgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisKKyAgICAgICAgaW50ZWdlciwgICAgICBwYXJhbWV0ZXIgOjogb3Blbm1wX3ZlcnNpb24gICAgPSAyMDA1MDUKKyAgICAgICAgaW50ZWdlciwgICAgICBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWFqb3IgPSAkS01QX1ZFUlNJT05fTUFKT1IKKyAgICAgICAgaW50ZWdlciwgICAgICBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWlub3IgPSAkS01QX1ZFUlNJT05fTUlOT1IKKyAgICAgICAgaW50ZWdlciwgICAgICBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fYnVpbGQgPSAkS01QX1ZFUlNJT05fQlVJTEQKKyAgICAgICAgY2hhcmFjdGVyKCopICAgICAgICAgICAgICAga21wX2J1aWxkX2RhdGUKKyAgICAgICAgcGFyYW1ldGVyKCBrbXBfYnVpbGRfZGF0ZSA9ICckS01QX0JVSUxEX0RBVEUnICkKKworICAgICAgICBpbnRlcmZhY2UKKworISAgICAgICAgICoqKgorISAgICAgICAgICoqKiBvbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgICAqKioKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkcyhudGhyZWFkcykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IG50aHJlYWRzCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkcworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWMoZW5hYmxlKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSwgdmFsdWUgOjogZW5hYmxlCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkKGVuYWJsZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCksIHZhbHVlIDo6IGVuYWJsZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV90aHJlYWRzKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fdGhyZWFkcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV90aHJlYWRzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9tYXhfdGhyZWFkcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0oKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9udW0KKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jcygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3Byb2NzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfaW5fcGFyYWxsZWwoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaW5fcGFyYWxsZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWMoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X2R5bmFtaWMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9keW5hbWljCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X25lc3RlZCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfbmVzdGVkCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIHJlYWwgKGtpbmQ9a21wX2RvdWJsZV9raW5kKSBvbXBfZ2V0X3d0aW1lCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpbWUKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2soKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgcmVhbCAoa2luZD1rbXBfZG91YmxlX2tpbmQpIG9tcF9nZXRfd3RpY2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGljaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sobG9ja3ZhcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2sobG9ja3ZhcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF90ZXN0X2xvY2sKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfdGVzdF9uZXN0X2xvY2sKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jaworCishICAgICAgICAgKioqCishICAgICAgICAgKioqIGttcF8qIGVudHJ5IHBvaW50cworISAgICAgICAgICoqKgorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZShzaXplKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3Moc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9ibG9ja3RpbWUobXNlYykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IG1zZWMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5KGxpYm51bSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGxpYm51bQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzKHN0cmluZykgYmluZChjKQorICAgICAgICAgICAgdXNlLCBpbnRyaW5zaWMgOjogaXNvX2NfYmluZGluZworICAgICAgICAgICAgY2hhcmFjdGVyIChraW5kPWNfY2hhcikgOjogc3RyaW5nKCopCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0cworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkga21wX2dldF9zdGFja3NpemVfcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYmxvY2t0aW1lCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2xpYnJhcnkKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfbWFsbG9jKHNpemUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9tYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfbWFsbG9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfY2FsbG9jKG5lbGVtLCBlbHNpemUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9jYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogbmVsZW0KKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogZWxzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9jYWxsb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9yZWFsbG9jKHB0ciwgc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX3JlYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCksIHZhbHVlIDo6IHB0cgorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9yZWFsbG9jCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9mcmVlKHB0cikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCksIHZhbHVlIDo6IHB0cgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9mcmVlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24oKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24KKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyAgICAgICAgZW5kIGludGVyZmFjZQorCisgICAgICBlbmQgbW9kdWxlIG9tcF9saWIKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvMjUvb21wX2xpYi5oLnZhciBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvMjUvb21wX2xpYi5oLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDUyN2UwCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS8yNS9vbXBfbGliLmgudmFyCkBAIC0wLDAgKzEsNDYwIEBACishIGluY2x1ZGUvMjUvb21wX2xpYi5oLnZhcgorISAkUmV2aXNpb246IDQyMTgxICQKKyEgJERhdGU6IDIwMTMtMDMtMjYgMTU6MDQ6NDUgLTA1MDAgKFR1ZSwgMjYgTWFyIDIwMTMpICQKKworIQorIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishLy8KKyEvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCishLy8KKyEvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCishLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCishLy8KKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIQorCishKioqCishKioqIFNvbWUgb2YgdGhlIGRpcmVjdGl2ZXMgZm9yIHRoZSBmb2xsb3dpbmcgcm91dGluZSBleHRlbmQgcGFzdCBjb2x1bW4gNzIsCishKioqIHNvIHByb2Nlc3MgdGhpcyBmaWxlIGluIDEzMi1jb2x1bW4gbW9kZS4KKyEqKioKKworIWRlYyQgZml4ZWRmb3JtbGluZXNpemU6MTMyCisKKyAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKworICAgICAgaW50ZWdlciwgICAgICBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWFqb3IgPSAkS01QX1ZFUlNJT05fTUFKT1IKKyAgICAgIGludGVnZXIsICAgICAgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21pbm9yID0gJEtNUF9WRVJTSU9OX01JTk9SCisgICAgICBpbnRlZ2VyLCAgICAgIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9idWlsZCA9ICRLTVBfVkVSU0lPTl9CVUlMRAorICAgICAgY2hhcmFjdGVyKCopLCBwYXJhbWV0ZXIgOjoga21wX2J1aWxkX2RhdGUgICAgPSAnJEtNUF9CVUlMRF9EQVRFJworICAgICAgaW50ZWdlciwgICAgICBwYXJhbWV0ZXIgOjogb3Blbm1wX3ZlcnNpb24gICAgPSAyMDA1MDUKKworICAgICAgaW50ZXJmYWNlCisKKyEgICAgICAgKioqCishICAgICAgICoqKiBvbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgKioqCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzKG50aHJlYWRzKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG50aHJlYWRzCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYyhlbmFibGUpCisgICAgICAgICAgaW5jbHVkZSAnb21wX2xpYl9raW5kcy5oJworICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgZW5hYmxlCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWQoZW5hYmxlKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIGVuYWJsZQorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMoKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3RocmVhZHMKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzKCkKKyAgICAgICAgICBpbmNsdWRlICdvbXBfbGliX2tpbmRzLmgnCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF90aHJlYWRzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtKCkKKyAgICAgICAgICBpbmNsdWRlICdvbXBfbGliX2tpbmRzLmgnCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9udW0KKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzKCkKKyAgICAgICAgICBpbmNsdWRlICdvbXBfbGliX2tpbmRzLmgnCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV9wcm9jcworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MKKworICAgICAgICBmdW5jdGlvbiBvbXBfaW5fcGFyYWxsZWwoKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pbl9wYXJhbGxlbAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9keW5hbWljKCkKKyAgICAgICAgICBpbmNsdWRlICdvbXBfbGliX2tpbmRzLmgnCisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X2R5bmFtaWMKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkKCkKKyAgICAgICAgICBpbmNsdWRlICdvbXBfbGliX2tpbmRzLmgnCisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X25lc3RlZAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lKCkKKyAgICAgICAgICBpbmNsdWRlICdvbXBfbGliX2tpbmRzLmgnCisgICAgICAgICAgZG91YmxlIHByZWNpc2lvbiBvbXBfZ2V0X3d0aW1lCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGljayAoKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgICBkb3VibGUgcHJlY2lzaW9uIG9tcF9nZXRfd3RpY2sKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICBpbmNsdWRlICdvbXBfbGliX2tpbmRzLmgnCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICBpbmNsdWRlICdvbXBfbGliX2tpbmRzLmgnCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbG9jayhsb2NrdmFyKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jayhsb2NrdmFyKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2sKKworICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgaW5jbHVkZSAnb21wX2xpYl9raW5kcy5oJworICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX3Rlc3RfbG9jaworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgaW5jbHVkZSAnb21wX2xpYl9raW5kcy5oJworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgaW5jbHVkZSAnb21wX2xpYl9raW5kcy5oJworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICBpbmNsdWRlICdvbXBfbGliX2tpbmRzLmgnCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICBpbmNsdWRlICdvbXBfbGliX2tpbmRzLmgnCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X25lc3RfbG9jaworCisgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jayhsb2NrdmFyKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF90ZXN0X25lc3RfbG9jaworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sKKworISAgICAgICAqKioKKyEgICAgICAgKioqIGttcF8qIGVudHJ5IHBvaW50cworISAgICAgICAqKioKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplKHNpemUpCisgICAgICAgICAgaW5jbHVkZSAnb21wX2xpYl9raW5kcy5oJworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgc2l6ZQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZQorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcyhzaXplKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgc2l6ZQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZShtc2VjKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG1zZWMKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9ibG9ja3RpbWUKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwoKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbAorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQoKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0KCkKKyAgICAgICAgICBpbmNsdWRlICdvbXBfbGliX2tpbmRzLmgnCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkobGlibnVtKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGxpYm51bQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMoc3RyaW5nKQorICAgICAgICAgIGNoYXJhY3RlciooKikgc3RyaW5nCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZSgpCisgICAgICAgICAgaW5jbHVkZSAnb21wX2xpYl9raW5kcy5oJworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9zdGFja3NpemUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcygpCisgICAgICAgICAgaW5jbHVkZSAnb21wX2xpYl9raW5kcy5oJworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUoKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYmxvY2t0aW1lCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZQorCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeSgpCisgICAgICAgICAgaW5jbHVkZSAnb21wX2xpYl9raW5kcy5oJworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9saWJyYXJ5CisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkKKworICAgICAgICBmdW5jdGlvbiBrbXBfbWFsbG9jKHNpemUpCisgICAgICAgICAgaW5jbHVkZSAnb21wX2xpYl9raW5kcy5oJworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX21hbGxvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBzaXplCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfbWFsbG9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2NhbGxvYyhuZWxlbSwgZWxzaXplKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9jYWxsb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgbmVsZW0KKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgZWxzaXplCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfY2FsbG9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX3JlYWxsb2MocHRyLCBzaXplKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9yZWFsbG9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBwdHIKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgc2l6ZQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3JlYWxsb2MKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9mcmVlKHB0cikKKyAgICAgICAgICBpbmNsdWRlICdvbXBfbGliX2tpbmRzLmgnCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBwdHIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2ZyZWUKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24oKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbgorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYoKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYKKworICAgICAgZW5kIGludGVyZmFjZQorCishZGVjJCBpZiBkZWZpbmVkKF9XSU4zMikKKyFkZWMkICAgaWYgZGVmaW5lZChfV0lONjQpIC5vci4gZGVmaW5lZChfTV9BTUQ2NCkKKworISoqKgorISoqKiBUaGUgRm9ydHJhbiBlbnRyeSBwb2ludHMgbXVzdCBiZSBpbiB1cHBlcmNhc2UsIGV2ZW4gaWYgdGhlIC9RbG93ZXJjYXNlCishKioqIG9wdGlvbiBpcyBzcGVjaWZpZWQuICBUaGUgYWxpYXMgYXR0cmlidXRlIGVuc3VyZXMgdGhhdCB0aGUgc3BlY2lmaWVkCishKioqIHN0cmluZyBpcyB1c2VkIGFzIHRoZSBlbnRyeSBwb2ludC4KKyEqKioKKyEqKiogT24gdGhlIFdpbmRvd3MqIE9TIElBLTMyIGFyY2hpdGVjdHVyZSwgdGhlIEZvcnRyYW4gZW50cnkgcG9pbnRzIGhhdmUgYW4KKyEqKiogdW5kZXJzY29yZSBwcmVwZW5kZWQuICBPbiB0aGUgV2luZG93cyogT1MgSW50ZWwoUikgNjQKKyEqKiogYXJjaGl0ZWN0dXJlLCBubyB1bmRlcnNjb3JlIGlzIHByZXBlbmRlZC4KKyEqKioKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9OVU1fVEhSRUFEUyc6Om9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfRFlOQU1JQyc6Om9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9ORVNURUQnOjpvbXBfc2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9OVU1fVEhSRUFEUyc6Om9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTUFYX1RIUkVBRFMnOjpvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1RIUkVBRF9OVU0nOjpvbXBfZ2V0X3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTlVNX1BST0NTJzo6b21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9JTl9QQVJBTExFTCc6Om9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9EWU5BTUlDJzo6b21wX2dldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05FU1RFRCc6Om9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1dUSU1FJzo6b21wX2dldF93dGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9XVElDSyc6Om9tcF9nZXRfd3RpY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbG9jayc6Om9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X2xvY2snOjpvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X2xvY2snOjpvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9sb2NrJzo6b21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X2xvY2snOjpvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9uZXN0X2xvY2snOjpvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X25lc3RfbG9jayc6Om9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9uZXN0X2xvY2snOjpvbXBfc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Vuc2V0X25lc3RfbG9jayc6Om9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X25lc3RfbG9jayc6Om9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1NUQUNLU0laRSc6OmttcF9zZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1NUQUNLU0laRV9TJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9CTE9DS1RJTUUnOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZX1NFUklBTCc6OmttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfTElCUkFSWV9UVVJOQVJPVU5EJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfTElCUkFSWV9USFJPVUdIUFVUJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfTElCUkFSWSc6OmttcF9zZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9ERUZBVUxUUyc6OmttcF9zZXRfZGVmYXVsdHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfU1RBQ0tTSVpFJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfU1RBQ0tTSVpFX1MnOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0JMT0NLVElNRSc6OmttcF9nZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0xJQlJBUlknOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9NQUxMT0MnOjprbXBfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfQ0FMTE9DJzo6a21wX2NhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1JFQUxMT0MnOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0ZSRUUnOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1dBUk5JTkdTX09OJzo6a21wX3NldF93YXJuaW5nc19vbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9XQVJOSU5HU19PRkYnOjprbXBfc2V0X3dhcm5pbmdzX29mZgorCishZGVjJCAgIGVsc2UKKworISoqKgorISoqKiBPbiBXaW5kb3dzKiBPUyBJQS0zMiBhcmNoaXRlY3R1cmUsIHRoZSBGb3J0cmFuIGVudHJ5IHBvaW50cyBoYXZlIGFuIAorISoqKiB1bmRlcnNjb3JlIHByZXBlbmRlZC4KKyEqKioKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfTlVNX1RIUkVBRFMnOjpvbXBfc2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9EWU5BTUlDJzo6b21wX3NldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9ORVNURUQnOjpvbXBfc2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTlVNX1RIUkVBRFMnOjpvbXBfZ2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9NQVhfVEhSRUFEUyc6Om9tcF9nZXRfbWF4X3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1RIUkVBRF9OVU0nOjpvbXBfZ2V0X3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX05VTV9QUk9DUyc6Om9tcF9nZXRfbnVtX3Byb2NzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0lOX1BBUkFMTEVMJzo6b21wX2luX3BhcmFsbGVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9EWU5BTUlDJzo6b21wX2dldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9ORVNURUQnOjpvbXBfZ2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfV1RJTUUnOjpvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9XVElDSyc6Om9tcF9nZXRfd3RpY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X2xvY2snOjpvbXBfaW5pdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbG9jayc6Om9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X2xvY2snOjpvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbG9jayc6Om9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbG9jayc6Om9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9uZXN0X2xvY2snOjpvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9uZXN0X2xvY2snOjpvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X25lc3RfbG9jayc6Om9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X25lc3RfbG9jayc6Om9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9uZXN0X2xvY2snOjpvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfU1RBQ0tTSVpFJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX1NUQUNLU0laRV9TJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfQkxPQ0tUSU1FJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUllfU0VSSUFMJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWV9UVVJOQVJPVU5EJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUllfVEhST1VHSFBVVCc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9MSUJSQVJZJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9ERUZBVUxUUyc6OmttcF9zZXRfZGVmYXVsdHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX1NUQUNLU0laRSc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9TVEFDS1NJWkVfUyc6OmttcF9nZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0JMT0NLVElNRSc6OmttcF9nZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9MSUJSQVJZJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX01BTExPQyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfQ0FMTE9DJzo6a21wX2NhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9SRUFMTE9DJzo6a21wX3JlYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfRlJFRSc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX1dBUk5JTkdTX09OJzo6a21wX3NldF93YXJuaW5nc19vbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfV0FSTklOR1NfT0ZGJzo6a21wX3NldF93YXJuaW5nc19vZmYKKworIWRlYyQgICBlbmRpZgorIWRlYyQgZW5kaWYKKworIWRlYyQgaWYgZGVmaW5lZChfX2xpbnV4KQorCishKioqCishKioqIFRoZSBMaW51eCogT1MgZW50cnkgcG9pbnRzIGFyZSBpbiBsb3dlcmNhc2UsIHdpdGggYW4gdW5kZXJzY29yZSBhcHBlbmRlZC4KKyEqKioKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9udW1fdGhyZWFkc18nOjpvbXBfc2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X2R5bmFtaWNfJzo6b21wX3NldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X25lc3RlZF8nOjpvbXBfc2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9udW1fdGhyZWFkc18nOjpvbXBfZ2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X21heF90aHJlYWRzXyc6Om9tcF9nZXRfbWF4X3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfdGhyZWFkX251bV8nOjpvbXBfZ2V0X3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbnVtX3Byb2NzXyc6Om9tcF9nZXRfbnVtX3Byb2NzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5fcGFyYWxsZWxfJzo6b21wX2luX3BhcmFsbGVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X2R5bmFtaWNfJzo6b21wX2dldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X25lc3RlZF8nOjpvbXBfZ2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF93dGltZV8nOjpvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3d0aWNrXyc6Om9tcF9nZXRfd3RpY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbG9ja18nOjpvbXBfaW5pdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9sb2NrXyc6Om9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbG9ja18nOjpvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9sb2NrXyc6Om9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9sb2NrXyc6Om9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X25lc3RfbG9ja18nOjpvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X25lc3RfbG9ja18nOjpvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbmVzdF9sb2NrXyc6Om9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbmVzdF9sb2NrXyc6Om9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X25lc3RfbG9ja18nOjpvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9zdGFja3NpemVfJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfc3RhY2tzaXplX3NfJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9ibG9ja3RpbWVfJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV9zZXJpYWxfJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0Xyc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2xpYnJhcnlfJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2RlZmF1bHRzXyc6OmttcF9zZXRfZGVmYXVsdHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfc3RhY2tzaXplXyc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9nZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfYmxvY2t0aW1lXyc6OmttcF9nZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2xpYnJhcnlfJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfbWFsbG9jXyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9jYWxsb2NfJzo6a21wX2NhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3JlYWxsb2NfJzo6a21wX3JlYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9mcmVlXyc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfd2FybmluZ3Nfb25fJzo6a21wX3NldF93YXJuaW5nc19vbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF93YXJuaW5nc19vZmZfJzo6a21wX3NldF93YXJuaW5nc19vZmYKKworIWRlYyQgZW5kaWYKKworIWRlYyQgaWYgZGVmaW5lZChfX0FQUExFX18pCisKKyEqKioKKyEqKiogVGhlIE1hYyBlbnRyeSBwb2ludHMgYXJlIGluIGxvd2VyY2FzZSwgd2l0aCBhbiBib3RoIGFuIHVuZGVyc2NvcmUKKyEqKiogYXBwZW5kZWQgYW5kIGFuIHVuZGVyc2NvcmUgcHJlcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9udW1fdGhyZWFkc18nOjpvbXBfc2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9keW5hbWljXyc6Om9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbmVzdGVkXyc6Om9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9udW1fdGhyZWFkc18nOjpvbXBfZ2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9tYXhfdGhyZWFkc18nOjpvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF90aHJlYWRfbnVtXyc6Om9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbnVtX3Byb2NzXyc6Om9tcF9nZXRfbnVtX3Byb2NzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luX3BhcmFsbGVsXyc6Om9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfZHluYW1pY18nOjpvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X25lc3RlZF8nOjpvbXBfZ2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfd3RpbWVfJzo6b21wX2dldF93dGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfd3RpY2tfJzo6b21wX2dldF93dGljaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbG9ja18nOjpvbXBfaW5pdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbG9ja18nOjpvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9sb2NrXyc6Om9tcF9zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF91bnNldF9sb2NrXyc6Om9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbG9ja18nOjpvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbmVzdF9sb2NrXyc6Om9tcF9pbml0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9kZXN0cm95X25lc3RfbG9ja18nOjpvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X25lc3RfbG9ja18nOjpvbXBfc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF91bnNldF9uZXN0X2xvY2tfJzo6b21wX3Vuc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF90ZXN0X25lc3RfbG9ja18nOjpvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfc3RhY2tzaXplXyc6OmttcF9zZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9zdGFja3NpemVfc18nOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9ibG9ja3RpbWVfJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfc2VyaWFsXyc6OmttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZF8nOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0Xyc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9saWJyYXJ5Xyc6OmttcF9zZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfZGVmYXVsdHNfJzo6a21wX3NldF9kZWZhdWx0cworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfc3RhY2tzaXplXyc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9zdGFja3NpemVfc18nOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9ibG9ja3RpbWVfJzo6a21wX2dldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2xpYnJhcnlfJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX21hbGxvY18nOjprbXBfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2NhbGxvY18nOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3JlYWxsb2NfJzo6a21wX3JlYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZnJlZV8nOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF93YXJuaW5nc19vbl8nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF93YXJuaW5nc19vZmZfJzo6a21wX3NldF93YXJuaW5nc19vZmYKKworIWRlYyQgZW5kaWYKKworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzMwL2lvbXAuaC52YXIgYi9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzMwL2lvbXAuaC52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVmYTNkMQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvMzAvaW9tcC5oLnZhcgpAQCAtMCwwICsxLDk4IEBACisvKgorICogaW5jbHVkZS8zMC9pb21wLmgudmFyCisgKiAkUmV2aXNpb246IDQyMDYxICQKKyAqICREYXRlOiAyMDEzLTAyLTI4IDE2OjM2OjI0IC0wNjAwIChUaHUsIDI4IEZlYiAyMDEzKSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgX19JT01QX0gKKyMgICBkZWZpbmUgX19JT01QX0gKKworIyAgIGRlZmluZSBLTVBfVkVSU0lPTl9NQUpPUiAgICAkS01QX1ZFUlNJT05fTUFKT1IKKyMgICBkZWZpbmUgS01QX1ZFUlNJT05fTUlOT1IgICAgJEtNUF9WRVJTSU9OX01JTk9SCisjICAgZGVmaW5lIEtNUF9WRVJTSU9OX0JVSUxEICAgICRLTVBfVkVSU0lPTl9CVUlMRAorIyAgIGRlZmluZSBLTVBfQlVJTERfREFURSAgICAgICAiJEtNUF9CVUlMRF9EQVRFIgorCisjICAgaWZkZWYgX19jcGx1c3BsdXMKKyAgICAgICAgZXh0ZXJuICJDIiB7CisjICAgZW5kaWYKKworIyAgICAgICBkZWZpbmUga21wX3NldF9zdGFja3NpemUgICAgICAgICAgICBrbXBjX3NldF9zdGFja3NpemUKKyMgICAgICAgZGVmaW5lIGttcF9zZXRfc3RhY2tzaXplX3MgICAgICAgICAga21wY19zZXRfc3RhY2tzaXplX3MKKyMgICAgICAgZGVmaW5lIGttcF9zZXRfYmxvY2t0aW1lICAgICAgICAgICAga21wY19zZXRfYmxvY2t0aW1lCisjICAgICAgIGRlZmluZSBrbXBfc2V0X2xpYnJhcnkgICAgICAgICAgICAgIGttcGNfc2V0X2xpYnJhcnkKKyMgICAgICAgZGVmaW5lIGttcF9zZXRfZGVmYXVsdHMgICAgICAgICAgICAga21wY19zZXRfZGVmYXVsdHMKKyMgICAgICAgZGVmaW5lIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jICAga21wY19zZXRfYWZmaW5pdHlfbWFza19wcm9jCisjICAgICAgIGRlZmluZSBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jIGttcGNfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisjICAgICAgIGRlZmluZSBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyAgIGttcGNfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworCisjICAgICAgIGRlZmluZSBrbXBfbWFsbG9jICAgICAgICAgICAgICAgICAgIGttcGNfbWFsbG9jCisjICAgICAgIGRlZmluZSBrbXBfY2FsbG9jICAgICAgICAgICAgICAgICAgIGttcGNfY2FsbG9jCisjICAgICAgIGRlZmluZSBrbXBfcmVhbGxvYyAgICAgICAgICAgICAgICAgIGttcGNfcmVhbGxvYworIyAgICAgICBkZWZpbmUga21wX2ZyZWUgICAgICAgICAgICAgICAgICAgICBrbXBjX2ZyZWUKKworIyAgIGlmIGRlZmluZWQoX1dJTjMyKQorIyAgICAgICBkZWZpbmUgX19LQUlfS01QQ19DT05WRU5USU9OIF9fY2RlY2wKKyMgICBlbHNlCisjICAgICAgIGRlZmluZSBfX0tBSV9LTVBDX0NPTlZFTlRJT04KKyMgICBlbmRpZgorCisjICAgaW5jbHVkZSA8c3RkbGliLmg+CisgICAgLyoga21wIEFQSSBmdW5jdGlvbnMgKi8KKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9zdGFja3NpemUgICAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3N0YWNrc2l6ZSAgICAgICAgICAoaW50KTsKKyAgICBleHRlcm4gc2l6ZV90IF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9zdGFja3NpemVfcyAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3N0YWNrc2l6ZV9zICAgICAgICAoc2l6ZV90KTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9ibG9ja3RpbWUgICAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2xpYnJhcnkgICAgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfYmxvY2t0aW1lICAgICAgICAgIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnkgICAgICAgICAgICAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9saWJyYXJ5X3NlcmlhbCAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZCAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0ICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9kZWZhdWx0cyAgICAgICAgICAgKGNoYXIgY29uc3QgKik7CisKKyAgICAvKiBhZmZpbml0eSBBUEkgZnVuY3Rpb25zICovCisgICAgdHlwZWRlZiB2b2lkICoga21wX2FmZmluaXR5X21hc2tfdDsKKworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2FmZmluaXR5ICAgICAgICAgICAgIChrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2FmZmluaXR5ICAgICAgICAgICAgIChrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrICAgICAoa21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzayAgICAoa21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MgICAoaW50LCBrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jIChpbnQsIGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jICAgKGludCwga21wX2FmZmluaXR5X21hc2tfdCAqKTsKKworICAgIGV4dGVybiB2b2lkICogX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfbWFsbG9jICAoc2l6ZV90KTsKKyAgICBleHRlcm4gdm9pZCAqIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2NhbGxvYyAgKHNpemVfdCwgc2l6ZV90KTsKKyAgICBleHRlcm4gdm9pZCAqIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3JlYWxsb2MgKHZvaWQgKiwgc2l6ZV90KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2ZyZWUgICAgKHZvaWQgKik7CisKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF93YXJuaW5nc19vbih2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF93YXJuaW5nc19vZmYodm9pZCk7CisKKyMgICB1bmRlZiBfX0tBSV9LTVBDX0NPTlZFTlRJT04KKworICAgIC8qIFdhcm5pbmc6CisgICAgICAgVGhlIGZvbGxvd2luZyB0eXBlZGVmcyBhcmUgbm90IHN0YW5kYXJkLCBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4KKyAgICAqLworICAgIHR5cGVkZWYgaW50ICAgICBvbXBfaW50X3Q7CisgICAgdHlwZWRlZiBkb3VibGUgIG9tcF93dGltZV90OworCisjICAgaWZkZWYgX19jcGx1c3BsdXMKKyAgICAgICAgfQorIyAgIGVuZGlmCisKKyNlbmRpZiAvKiBfX0lPTVBfSCAqLworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzMwL2lvbXBfbGliLmgudmFyIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS8zMC9pb21wX2xpYi5oLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjJhOGUyCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS8zMC9pb21wX2xpYi5oLnZhcgpAQCAtMCwwICsxLDgzIEBACishIGluY2x1ZGUvMzAvaW9tcF9saWIuaC52YXIKKyEgJFJldmlzaW9uOiA0MjA2MSAkCishICREYXRlOiAyMDEzLTAyLTI4IDE2OjM2OjI0IC0wNjAwIChUaHUsIDI4IEZlYiAyMDEzKSAkCisKKyEKKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIS8vCishLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIS8vCishLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIS8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIS8vCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEKKworISoqKgorISoqKiBvbXBfaW50ZWdlcl9raW5kIGFuZCBvbXBfbG9naWNhbF9raW5kIGFwcGVhciB0byBiZSBwcmVkZWZpbmVkIGJ5IGdjYyBhbmQKKyEqKiogZ2ZvcnRyYW4gKGRlZmluaXRpb25zIGRvIG5vdCBhcHBlYXIgaW4gdGhlIG9tcC5oIC8gb21wX2xpYi5oIC9vbXBfbGliLmYpLgorISoqKiBvbXBfcmVhbF9raW5kIGlzIG5vdCBwcmVkZWZpbmVkLCBob3dldmVyLgorISoqKgorCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9tYWpvciA9ICRLTVBfVkVSU0lPTl9NQUpPUgorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWlub3IgPSAkS01QX1ZFUlNJT05fTUlOT1IKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX2J1aWxkID0gJEtNUF9WRVJTSU9OX0JVSUxECisgICAgICAgIGNoYXJhY3RlcigqKSAgICAgICAgICBrbXBfYnVpbGRfZGF0ZQorICAgICAgICBwYXJhbWV0ZXIoIGttcF9idWlsZF9kYXRlID0gJyRLTVBfQlVJTERfREFURScgKQorCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfcmVhbF9raW5kID0gNAorCishKioqCishKioqIGttcF8qIHR5cGUgZXh0ZW5zaW9ucworISoqKgorCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfcG9pbnRlcl9raW5kICAgICAgID0gJEtNUF9JTlRfUFRSX0tJTkQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9zaXplX3Rfa2luZCAgICAgICAgPSAkS01QX0lOVF9QVFJfS0lORAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX2FmZmluaXR5X21hc2tfa2luZCA9ICRLTVBfSU5UX1BUUl9LSU5ECisKKyEqKioKKyEqKioga21wXyogZW50cnkgcG9pbnRzCishKioqCisKKyAgICAgICAgZXh0ZXJuYWwga21wX3NldF9zdGFja3NpemUKKyAgICAgICAgZXh0ZXJuYWwga21wX3NldF9zdGFja3NpemVfcworICAgICAgICBleHRlcm5hbCBrbXBfc2V0X2Jsb2NrdGltZQorICAgICAgICBleHRlcm5hbCBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsCisgICAgICAgIGV4dGVybmFsIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCisgICAgICAgIGV4dGVybmFsIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CisgICAgICAgIGV4dGVybmFsIGttcF9zZXRfbGlicmFyeQorICAgICAgICBleHRlcm5hbCBrbXBfc2V0X2RlZmF1bHRzCisgICAgICAgIGV4dGVybmFsIGttcF9nZXRfc3RhY2tzaXplCisgICAgICAgIGludGVnZXIga21wX2dldF9zdGFja3NpemUKKyAgICAgICAgZXh0ZXJuYWwga21wX2dldF9zdGFja3NpemVfcworICAgICAgICBpbnRlZ2VyIChraW5kID0ga21wX3NpemVfdF9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisgICAgICAgIGV4dGVybmFsIGttcF9nZXRfYmxvY2t0aW1lCisgICAgICAgIGludGVnZXIga21wX2dldF9ibG9ja3RpbWUKKyAgICAgICAgZXh0ZXJuYWwga21wX2dldF9saWJyYXJ5CisgICAgICAgIGludGVnZXIga21wX2dldF9saWJyYXJ5CisgICAgICAgIGV4dGVybmFsIGttcF9zZXRfYWZmaW5pdHkKKyAgICAgICAgaW50ZWdlciBrbXBfc2V0X2FmZmluaXR5CisgICAgICAgIGV4dGVybmFsIGttcF9nZXRfYWZmaW5pdHkKKyAgICAgICAgaW50ZWdlciBrbXBfZ2V0X2FmZmluaXR5CisgICAgICAgIGV4dGVybmFsIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyAgICAgICAgaW50ZWdlciBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisgICAgICAgIGV4dGVybmFsIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworICAgICAgICBleHRlcm5hbCBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCisgICAgICAgIGV4dGVybmFsIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgIGludGVnZXIga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgZXh0ZXJuYWwga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICBpbnRlZ2VyIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgZXh0ZXJuYWwga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgaW50ZWdlciBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICBleHRlcm5hbCBrbXBfbWFsbG9jCisgICAgICAgIGludGVnZXIgKGtpbmQgPSBrbXBfcG9pbnRlcl9raW5kKSBrbXBfbWFsbG9jCisgICAgICAgIGV4dGVybmFsIGttcF9jYWxsb2MKKyAgICAgICAgaW50ZWdlciAoa2luZCA9IGttcF9wb2ludGVyX2tpbmQpIGttcF9jYWxsb2MKKyAgICAgICAgZXh0ZXJuYWwga21wX3JlYWxsb2MKKyAgICAgICAgaW50ZWdlciAoa2luZCA9IGttcF9wb2ludGVyX2tpbmQpIGttcF9yZWFsbG9jCisgICAgICAgIGV4dGVybmFsIGttcF9mcmVlCisKKyAgICAgICAgZXh0ZXJuYWwga21wX3NldF93YXJuaW5nc19vbgorICAgICAgICBleHRlcm5hbCBrbXBfc2V0X3dhcm5pbmdzX29mZgorCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvMzAvb21wLmgudmFyIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS8zMC9vbXAuaC52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzljMzQwMAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvMzAvb21wLmgudmFyCkBAIC0wLDAgKzEsMTY1IEBACisvKgorICogaW5jbHVkZS8zMC9vbXAuaC52YXIKKyAqICRSZXZpc2lvbjogNDIwNjEgJAorICogJERhdGU6IDIwMTMtMDItMjggMTY6MzY6MjQgLTA2MDAgKFRodSwgMjggRmViIDIwMTMpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBfX09NUF9ICisjICAgZGVmaW5lIF9fT01QX0gKKworIyAgIGRlZmluZSBLTVBfVkVSU0lPTl9NQUpPUiAgICAkS01QX1ZFUlNJT05fTUFKT1IKKyMgICBkZWZpbmUgS01QX1ZFUlNJT05fTUlOT1IgICAgJEtNUF9WRVJTSU9OX01JTk9SCisjICAgZGVmaW5lIEtNUF9WRVJTSU9OX0JVSUxEICAgICRLTVBfVkVSU0lPTl9CVUlMRAorIyAgIGRlZmluZSBLTVBfQlVJTERfREFURSAgICAgICAiJEtNUF9CVUlMRF9EQVRFIgorCisjICAgaWZkZWYgX19jcGx1c3BsdXMKKyAgICBleHRlcm4gIkMiIHsKKyMgICBlbmRpZgorCisjICAgICAgIGRlZmluZSBvbXBfc2V0X251bV90aHJlYWRzICAgICAgICAgIG9tcGNfc2V0X251bV90aHJlYWRzCisjICAgICAgIGRlZmluZSBvbXBfc2V0X2R5bmFtaWMgICAgICAgICAgICAgIG9tcGNfc2V0X2R5bmFtaWMKKyMgICAgICAgZGVmaW5lIG9tcF9zZXRfbmVzdGVkICAgICAgICAgICAgICAgb21wY19zZXRfbmVzdGVkCisjICAgICAgIGRlZmluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzICAgIG9tcGNfc2V0X21heF9hY3RpdmVfbGV2ZWxzCisjICAgICAgIGRlZmluZSBvbXBfc2V0X3NjaGVkdWxlICAgICAgICAgICAgIG9tcGNfc2V0X3NjaGVkdWxlCisjICAgICAgIGRlZmluZSBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0gIG9tcGNfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyMgICAgICAgZGVmaW5lIG9tcF9nZXRfdGVhbV9zaXplICAgICAgICAgICAgb21wY19nZXRfdGVhbV9zaXplCisKKworIyAgICAgICBkZWZpbmUga21wX3NldF9zdGFja3NpemUgICAgICAgICAgICBrbXBjX3NldF9zdGFja3NpemUKKyMgICAgICAgZGVmaW5lIGttcF9zZXRfc3RhY2tzaXplX3MgICAgICAgICAga21wY19zZXRfc3RhY2tzaXplX3MKKyMgICAgICAgZGVmaW5lIGttcF9zZXRfYmxvY2t0aW1lICAgICAgICAgICAga21wY19zZXRfYmxvY2t0aW1lCisjICAgICAgIGRlZmluZSBrbXBfc2V0X2xpYnJhcnkgICAgICAgICAgICAgIGttcGNfc2V0X2xpYnJhcnkKKyMgICAgICAgZGVmaW5lIGttcF9zZXRfZGVmYXVsdHMgICAgICAgICAgICAga21wY19zZXRfZGVmYXVsdHMKKyMgICAgICAgZGVmaW5lIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jICAga21wY19zZXRfYWZmaW5pdHlfbWFza19wcm9jCisjICAgICAgIGRlZmluZSBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jIGttcGNfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisjICAgICAgIGRlZmluZSBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyAgIGttcGNfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworCisjICAgICAgIGRlZmluZSBrbXBfbWFsbG9jICAgICAgICAgICAgICAgICAgIGttcGNfbWFsbG9jCisjICAgICAgIGRlZmluZSBrbXBfY2FsbG9jICAgICAgICAgICAgICAgICAgIGttcGNfY2FsbG9jCisjICAgICAgIGRlZmluZSBrbXBfcmVhbGxvYyAgICAgICAgICAgICAgICAgIGttcGNfcmVhbGxvYworIyAgICAgICBkZWZpbmUga21wX2ZyZWUgICAgICAgICAgICAgICAgICAgICBrbXBjX2ZyZWUKKworCisjICAgaWYgZGVmaW5lZChfV0lOMzIpCisjICAgICAgIGRlZmluZSBfX0tBSV9LTVBDX0NPTlZFTlRJT04gX19jZGVjbAorIyAgIGVsc2UKKyMgICAgICAgZGVmaW5lIF9fS0FJX0tNUENfQ09OVkVOVElPTgorIyAgIGVuZGlmCisKKyAgICAvKiBzY2hlZHVsZSBraW5kIGNvbnN0YW50cyAqLworICAgIHR5cGVkZWYgZW51bSBvbXBfc2NoZWRfdCB7CisJb21wX3NjaGVkX3N0YXRpYyAgPSAxLAorCW9tcF9zY2hlZF9keW5hbWljID0gMiwKKwlvbXBfc2NoZWRfZ3VpZGVkICA9IDMsCisJb21wX3NjaGVkX2F1dG8gICAgPSA0CisgICAgfSBvbXBfc2NoZWRfdDsKKworICAgIC8qIHNldCBBUEkgZnVuY3Rpb25zICovCisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfbnVtX3RocmVhZHMgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfZHluYW1pYyAgICAgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfbmVzdGVkICAgICAgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfc2NoZWR1bGUgICAgICAgICAgKG9tcF9zY2hlZF90LCBpbnQpOworCisgICAgLyogcXVlcnkgQVBJIGZ1bmN0aW9ucyAqLworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X251bV90aHJlYWRzICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfZHluYW1pYyAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9uZXN0ZWQgICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X21heF90aHJlYWRzICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfdGhyZWFkX251bSAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9udW1fcHJvY3MgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfaW5fcGFyYWxsZWwgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfYWN0aXZlX2xldmVsICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbGV2ZWwgICAgICAgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bSAoaW50KTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF90ZWFtX3NpemUgICAgICAgICAgIChpbnQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3RocmVhZF9saW1pdCAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3NjaGVkdWxlICAgICAgICAgICAgKG9tcF9zY2hlZF90ICosIGludCAqKTsKKworICAgIC8qIGxvY2sgQVBJIGZ1bmN0aW9ucyAqLworICAgIHR5cGVkZWYgc3RydWN0IG9tcF9sb2NrX3QgeworICAgICAgICB2b2lkICogX2xrOworICAgIH0gb21wX2xvY2tfdDsKKworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfaW5pdF9sb2NrICAgIChvbXBfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X2xvY2sgICAgIChvbXBfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdW5zZXRfbG9jayAgIChvbXBfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZGVzdHJveV9sb2NrIChvbXBfbG9ja190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdGVzdF9sb2NrICAgIChvbXBfbG9ja190ICopOworCisgICAgLyogbmVzdGVkIGxvY2sgQVBJIGZ1bmN0aW9ucyAqLworICAgIHR5cGVkZWYgc3RydWN0IG9tcF9uZXN0X2xvY2tfdCB7CisgICAgICAgIHZvaWQgKiBfbGs7CisgICAgfSBvbXBfbmVzdF9sb2NrX3Q7CisKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2luaXRfbmVzdF9sb2NrICAgIChvbXBfbmVzdF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfbmVzdF9sb2NrICAgICAob21wX25lc3RfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdW5zZXRfbmVzdF9sb2NrICAgKG9tcF9uZXN0X2xvY2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrIChvbXBfbmVzdF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF90ZXN0X25lc3RfbG9jayAgICAob21wX25lc3RfbG9ja190ICopOworCisgICAgLyogdGltZSBBUEkgZnVuY3Rpb25zICovCisgICAgZXh0ZXJuIGRvdWJsZSBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfd3RpbWUgKHZvaWQpOworICAgIGV4dGVybiBkb3VibGUgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3d0aWNrICh2b2lkKTsKKworIyAgIGluY2x1ZGUgPHN0ZGxpYi5oPgorICAgIC8qIGttcCBBUEkgZnVuY3Rpb25zICovCisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfc3RhY2tzaXplICAgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9zdGFja3NpemUgICAgICAgICAgKGludCk7CisgICAgZXh0ZXJuIHNpemVfdCBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfc3RhY2tzaXplX3MgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9zdGFja3NpemVfcyAgICAgICAgKHNpemVfdCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfYmxvY2t0aW1lICAgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9saWJyYXJ5ICAgICAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2Jsb2NrdGltZSAgICAgICAgICAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9saWJyYXJ5ICAgICAgICAgICAgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfbGlicmFyeV9zZXJpYWwgICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dCAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfZGVmYXVsdHMgICAgICAgICAgIChjaGFyIGNvbnN0ICopOworCisgICAgLyogYWZmaW5pdHkgQVBJIGZ1bmN0aW9ucyAqLworICAgIHR5cGVkZWYgdm9pZCAqIGttcF9hZmZpbml0eV9tYXNrX3Q7CisKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9hZmZpbml0eSAgICAgICAgICAgICAoa21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9hZmZpbml0eSAgICAgICAgICAgICAoa21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYyAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzayAgICAgKGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sgICAgKGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jICAgKGludCwga21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyAoaW50LCBrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyAgIChpbnQsIGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisKKyAgICBleHRlcm4gdm9pZCAqIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX21hbGxvYyAgKHNpemVfdCk7CisgICAgZXh0ZXJuIHZvaWQgKiBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9jYWxsb2MgIChzaXplX3QsIHNpemVfdCk7CisgICAgZXh0ZXJuIHZvaWQgKiBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9yZWFsbG9jICh2b2lkICosIHNpemVfdCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9mcmVlICAgICh2b2lkICopOworCisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfd2FybmluZ3Nfb24odm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfd2FybmluZ3Nfb2ZmKHZvaWQpOworCisjICAgdW5kZWYgX19LQUlfS01QQ19DT05WRU5USU9OCisKKyAgICAvKiBXYXJuaW5nOgorICAgICAgIFRoZSBmb2xsb3dpbmcgdHlwZWRlZnMgYXJlIG5vdCBzdGFuZGFyZCwgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuCisgICAgKi8KKyAgICB0eXBlZGVmIGludCAgICAgb21wX2ludF90OworICAgIHR5cGVkZWYgZG91YmxlICBvbXBfd3RpbWVfdDsKKworIyAgIGlmZGVmIF9fY3BsdXNwbHVzCisgICAgfQorIyAgIGVuZGlmCisKKyNlbmRpZiAvKiBfX09NUF9IICovCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvMzAvb21wX2xpYi5mLnZhciBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvMzAvb21wX2xpYi5mLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2M1NDZiCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS8zMC9vbXBfbGliLmYudmFyCkBAIC0wLDAgKzEsNjM1IEBACishIGluY2x1ZGUvMzAvb21wX2xpYi5mLnZhcgorISAkUmV2aXNpb246IDQyMTgxICQKKyEgJERhdGU6IDIwMTMtMDMtMjYgMTU6MDQ6NDUgLTA1MDAgKFR1ZSwgMjYgTWFyIDIwMTMpICQKKworIQorIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishLy8KKyEvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCishLy8KKyEvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCishLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCishLy8KKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIQorCishKioqCishKioqIFNvbWUgb2YgdGhlIGRpcmVjdGl2ZXMgZm9yIHRoZSBmb2xsb3dpbmcgcm91dGluZSBleHRlbmQgcGFzdCBjb2x1bW4gNzIsCishKioqIHNvIHByb2Nlc3MgdGhpcyBmaWxlIGluIDEzMi1jb2x1bW4gbW9kZS4KKyEqKioKKworIWRlYyQgZml4ZWRmb3JtbGluZXNpemU6MTMyCisKKyAgICAgIG1vZHVsZSBvbXBfbGliX2tpbmRzCisKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9pbnRlZ2VyX2tpbmQgICAgICAgPSA0CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbG9naWNhbF9raW5kICAgICAgID0gNAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3JlYWxfa2luZCAgICAgICAgICA9IDQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2tpbmQgICAgICAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX25lc3RfbG9ja19raW5kICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfa2luZCAgICAgICAgID0gb21wX2ludGVnZXJfa2luZAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3BvaW50ZXJfa2luZCAgICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfc2l6ZV90X2tpbmQgICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9hZmZpbml0eV9tYXNrX2tpbmQgPSBpbnRfcHRyX2tpbmQoKQorCisgICAgICBlbmQgbW9kdWxlIG9tcF9saWJfa2luZHMKKworICAgICAgbW9kdWxlIG9tcF9saWIKKworICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9tYWpvciA9ICRLTVBfVkVSU0lPTl9NQUpPUgorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWlub3IgPSAkS01QX1ZFUlNJT05fTUlOT1IKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX2J1aWxkID0gJEtNUF9WRVJTSU9OX0JVSUxECisgICAgICAgIGNoYXJhY3RlcigqKSwgcGFyYW1ldGVyIDo6IGttcF9idWlsZF9kYXRlICAgID0gJyRLTVBfQlVJTERfREFURScKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IG9wZW5tcF92ZXJzaW9uICAgID0gJE9NUF9WRVJTSU9OCisKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9zdGF0aWMgID0gMQorICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2R5bmFtaWMgPSAyCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfZ3VpZGVkICA9IDMKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9hdXRvICAgID0gNAorCisgICAgICAgIGludGVyZmFjZQorCishICAgICAgICAgKioqCishICAgICAgICAgKioqIG9tcF8qIGVudHJ5IHBvaW50cworISAgICAgICAgICoqKgorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzKG50aHJlYWRzKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbnRocmVhZHMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYyhlbmFibGUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBlbmFibGUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWMKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWQoZW5hYmxlKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgZW5hYmxlCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWQKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fdGhyZWFkcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV90aHJlYWRzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X3RocmVhZHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGhyZWFkX251bQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0KKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3Byb2NzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfaW5fcGFyYWxsZWwoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2luX3BhcmFsbGVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9keW5hbWljKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfZHluYW1pYworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfbmVzdGVkCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9saW1pdAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdAorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzKG1heF9sZXZlbHMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBtYXhfbGV2ZWxzCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbGV2ZWwoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9sZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2xldmVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtKGxldmVsKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbGV2ZWwKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90ZWFtX3NpemUobGV2ZWwpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBsZXZlbAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RlYW1fc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fc2l6ZQorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X3NjaGVkdWxlKGtpbmQsIG1vZGlmaWVyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3NjaGVkX2tpbmQpIGtpbmQKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbW9kaWZpZXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X3NjaGVkdWxlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9nZXRfc2NoZWR1bGUoa2luZCwgbW9kaWZpZXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCkga2luZAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBtb2RpZmllcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9nZXRfc2NoZWR1bGUKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpbWUoKQorICAgICAgICAgICAgZG91YmxlIHByZWNpc2lvbiBvbXBfZ2V0X3d0aW1lCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpbWUKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2sgKCkKKyAgICAgICAgICAgIGRvdWJsZSBwcmVjaXNpb24gb21wX2dldF93dGljaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aWNrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbG9jayhsb2NrdmFyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jayhsb2NrdmFyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfdGVzdF9sb2NrCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9jayhsb2NrdmFyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3Vuc2V0X25lc3RfbG9jayhsb2NrdmFyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X25lc3RfbG9jaworCisgICAgICAgICAgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfdGVzdF9uZXN0X2xvY2sKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jaworCishICAgICAgICAgKioqCishICAgICAgICAgKioqIGttcF8qIGVudHJ5IHBvaW50cworISAgICAgICAgICoqKgorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZShzaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgc2l6ZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3Moc2l6ZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgc2l6ZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9ibG9ja3RpbWUobXNlYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG1zZWMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsKCkKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kKCkKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dCgpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5KGxpYm51bSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGxpYm51bQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzKHN0cmluZykKKyAgICAgICAgICAgIGNoYXJhY3RlciooKikgc3RyaW5nCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0cworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9zdGFja3NpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3MoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYmxvY2t0aW1lCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9saWJyYXJ5CisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eShtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3NldF9hZmZpbml0eQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHkKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHkobWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHkKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sobWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzayhtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBwcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBwcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9tYWxsb2Moc2l6ZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9tYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9tYWxsb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9jYWxsb2MobmVsZW0sIGVsc2l6ZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9jYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBuZWxlbQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIGVsc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfY2FsbG9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfcmVhbGxvYyhwdHIsIHNpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfcmVhbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBwdHIKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9yZWFsbG9jCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9mcmVlKHB0cikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIHB0cgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9mcmVlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24oKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24KKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYoKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyAgICAgICAgZW5kIGludGVyZmFjZQorCishZGVjJCBpZiBkZWZpbmVkKF9XSU4zMikKKyFkZWMkICAgaWYgZGVmaW5lZChfV0lONjQpIC5vci4gZGVmaW5lZChfTV9BTUQ2NCkKKworISoqKgorISoqKiBUaGUgRm9ydHJhbiBlbnRyeSBwb2ludHMgbXVzdCBiZSBpbiB1cHBlcmNhc2UsIGV2ZW4gaWYgdGhlIC9RbG93ZXJjYXNlCishKioqIG9wdGlvbiBpcyBzcGVjaWZpZWQuICBUaGUgYWxpYXMgYXR0cmlidXRlIGVuc3VyZXMgdGhhdCB0aGUgc3BlY2lmaWVkCishKioqIHN0cmluZyBpcyB1c2VkIGFzIHRoZSBlbnRyeSBwb2ludC4KKyEqKioKKyEqKiogT24gdGhlIFdpbmRvd3MqIE9TIElBLTMyIGFyY2hpdGVjdHVyZSwgdGhlIEZvcnRyYW4gZW50cnkgcG9pbnRzIGhhdmUgYW4KKyEqKiogdW5kZXJzY29yZSBwcmVwZW5kZWQuICBPbiB0aGUgV2luZG93cyogT1MgSW50ZWwoUikgNjQKKyEqKiogYXJjaGl0ZWN0dXJlLCBubyB1bmRlcnNjb3JlIGlzIHByZXBlbmRlZC4KKyEqKioKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9OVU1fVEhSRUFEUycgOjogb21wX3NldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9EWU5BTUlDJyA6OiBvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfTkVTVEVEJyA6OiBvbXBfc2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9OVU1fVEhSRUFEUycgOjogb21wX2dldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9NQVhfVEhSRUFEUycgOjogb21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9USFJFQURfTlVNJyA6OiBvbXBfZ2V0X3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTlVNX1BST0NTJyA6OiBvbXBfZ2V0X251bV9wcm9jcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0lOX1BBUkFMTEVMJyA6OiBvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfRFlOQU1JQycgOjogb21wX2dldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05FU1RFRCcgOjogb21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfVEhSRUFEX0xJTUlUJyA6OiBvbXBfZ2V0X3RocmVhZF9saW1pdAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9NQVhfQUNUSVZFX0xFVkVMUycgOjogb21wX3NldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9NQVhfQUNUSVZFX0xFVkVMUycgOjogb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9MRVZFTCcgOjogb21wX2dldF9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9BQ1RJVkVfTEVWRUwnIDo6IG9tcF9nZXRfYWN0aXZlX2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU0nIDo6IG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9URUFNX1NJWkUnIDo6IG9tcF9nZXRfdGVhbV9zaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX1NDSEVEVUxFJyA6OiBvbXBfc2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1NDSEVEVUxFJyA6OiBvbXBfZ2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1dUSU1FJyA6OiBvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1dUSUNLJyA6OiBvbXBfZ2V0X3d0aWNrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X2xvY2snIDo6IG9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X2xvY2snIDo6IG9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbG9jaycgOjogb21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbG9jaycgOjogb21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X2xvY2snIDo6IG9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X25lc3RfbG9jaycgOjogb21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9uZXN0X2xvY2snIDo6IG9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9uZXN0X2xvY2snIDo6IG9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbmVzdF9sb2NrJyA6OiBvbXBfdW5zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9uZXN0X2xvY2snIDo6IG9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1NUQUNLU0laRSc6OmttcF9zZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1NUQUNLU0laRV9TJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9CTE9DS1RJTUUnOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZX1NFUklBTCc6OmttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfTElCUkFSWV9UVVJOQVJPVU5EJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfTElCUkFSWV9USFJPVUdIUFVUJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfTElCUkFSWSc6OmttcF9zZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9TVEFDS1NJWkUnOjprbXBfZ2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9TVEFDS1NJWkVfUyc6OmttcF9nZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfQkxPQ0tUSU1FJzo6a21wX2dldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfTElCUkFSWSc6OmttcF9nZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9BRkZJTklUWSc6OmttcF9zZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfQUZGSU5JVFknOjprbXBfZ2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0FGRklOSVRZX01BWF9QUk9DJzo6a21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0NSRUFURV9BRkZJTklUWV9NQVNLJzo6a21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfREVTVFJPWV9BRkZJTklUWV9NQVNLJzo6a21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1VOU0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9NQUxMT0MnOjprbXBfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfQ0FMTE9DJzo6a21wX2NhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1JFQUxMT0MnOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0ZSRUUnOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1dBUk5JTkdTX09OJzo6a21wX3NldF93YXJuaW5nc19vbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9XQVJOSU5HU19PRkYnOjprbXBfc2V0X3dhcm5pbmdzX29mZgorCishZGVjJCAgIGVsc2UKKworISoqKgorISoqKiBPbiBXaW5kb3dzKiBPUyBJQS0zMiBhcmNoaXRlY3R1cmUsIHRoZSBGb3J0cmFuIGVudHJ5IHBvaW50cyBoYXZlIGFuIHVuZGVyc2NvcmUgcHJlcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9OVU1fVEhSRUFEUycgOjogb21wX3NldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfRFlOQU1JQycgOjogb21wX3NldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9ORVNURUQnIDo6IG9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9OVU1fVEhSRUFEUycgOjogb21wX2dldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTUFYX1RIUkVBRFMnIDo6IG9tcF9nZXRfbWF4X3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1RIUkVBRF9OVU0nIDo6IG9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTlVNX1BST0NTJyA6OiBvbXBfZ2V0X251bV9wcm9jcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9JTl9QQVJBTExFTCcgOjogb21wX2luX3BhcmFsbGVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9EWU5BTUlDJyA6OiBvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX05FU1RFRCcgOjogb21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1RIUkVBRF9MSU1JVCcgOjogb21wX2dldF90aHJlYWRfbGltaXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX01BWF9BQ1RJVkVfTEVWRUxTJyA6OiBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9NQVhfQUNUSVZFX0xFVkVMUycgOjogb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTEVWRUwnIDo6IG9tcF9nZXRfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0FDVElWRV9MRVZFTCcgOjogb21wX2dldF9hY3RpdmVfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU0nIDo6IG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfVEVBTV9TSVpFJyA6OiBvbXBfZ2V0X3RlYW1fc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfU0NIRURVTEUnIDo6IG9tcF9zZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1NDSEVEVUxFJyA6OiBvbXBfZ2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9XVElNRScgOjogb21wX2dldF93dGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfV1RJQ0snIDo6IG9tcF9nZXRfd3RpY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X2xvY2snIDo6IG9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9sb2NrJyA6OiBvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9sb2NrJyA6OiBvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbG9jaycgOjogb21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9sb2NrJyA6OiBvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbmVzdF9sb2NrJyA6OiBvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9uZXN0X2xvY2snIDo6IG9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbmVzdF9sb2NrJyA6OiBvbXBfc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF91bnNldF9uZXN0X2xvY2snIDo6IG9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9uZXN0X2xvY2snIDo6IG9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9TVEFDS1NJWkUnOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfU1RBQ0tTSVpFX1MnOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9CTE9DS1RJTUUnOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWV9TRVJJQUwnOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQnOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWV9USFJPVUdIUFVUJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUlknOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX1NUQUNLU0laRSc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9TVEFDS1NJWkVfUyc6OmttcF9nZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0JMT0NLVElNRSc6OmttcF9nZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9MSUJSQVJZJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9BRkZJTklUWSc6OmttcF9zZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0FGRklOSVRZJzo6a21wX2dldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQUZGSU5JVFlfTUFYX1BST0MnOjprbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0NSRUFURV9BRkZJTklUWV9NQVNLJzo6a21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0RFU1RST1lfQUZGSU5JVFlfTUFTSyc6OmttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1VOU0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX01BTExPQyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfQ0FMTE9DJzo6a21wX2NhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9SRUFMTE9DJzo6a21wX3JlYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfRlJFRSc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX1dBUk5JTkdTX09OJzo6a21wX3NldF93YXJuaW5nc19vbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfV0FSTklOR1NfT0ZGJzo6a21wX3NldF93YXJuaW5nc19vZmYKKworIWRlYyQgICBlbmRpZgorIWRlYyQgZW5kaWYKKworIWRlYyQgaWYgZGVmaW5lZChfX2xpbnV4KQorCishKioqCishKioqIFRoZSBMaW51eCogT1MgZW50cnkgcG9pbnRzIGFyZSBpbiBsb3dlcmNhc2UsIHdpdGggYW4gdW5kZXJzY29yZSBhcHBlbmRlZC4KKyEqKioKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9udW1fdGhyZWFkc18nOjpvbXBfc2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X2R5bmFtaWNfJzo6b21wX3NldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X25lc3RlZF8nOjpvbXBfc2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9udW1fdGhyZWFkc18nOjpvbXBfZ2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X21heF90aHJlYWRzXyc6Om9tcF9nZXRfbWF4X3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfdGhyZWFkX251bV8nOjpvbXBfZ2V0X3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbnVtX3Byb2NzXyc6Om9tcF9nZXRfbnVtX3Byb2NzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5fcGFyYWxsZWxfJzo6b21wX2luX3BhcmFsbGVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X2R5bmFtaWNfJzo6b21wX2dldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X25lc3RlZF8nOjpvbXBfZ2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF90aHJlYWRfbGltaXRfJzo6b21wX2dldF90aHJlYWRfbGltaXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHNfJzo6b21wX3NldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9tYXhfYWN0aXZlX2xldmVsc18nOjpvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X2xldmVsXyc6Om9tcF9nZXRfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfYWN0aXZlX2xldmVsXyc6Om9tcF9nZXRfYWN0aXZlX2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW1fJzo6b21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3RlYW1fc2l6ZV8nOjpvbXBfZ2V0X3RlYW1fc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9zY2hlZHVsZV8nOjpvbXBfc2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3NjaGVkdWxlXyc6Om9tcF9nZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfd3RpbWVfJzo6b21wX2dldF93dGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF93dGlja18nOjpvbXBfZ2V0X3d0aWNrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X2xvY2tfJzo6b21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbG9ja18nOjpvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X2xvY2tfJzo6b21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbG9ja18nOjpvbXBfdW5zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbG9ja18nOjpvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9uZXN0X2xvY2tfJzo6b21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9uZXN0X2xvY2tfJzo6b21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X25lc3RfbG9ja18nOjpvbXBfc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Vuc2V0X25lc3RfbG9ja18nOjpvbXBfdW5zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9uZXN0X2xvY2tfJzo6b21wX3Rlc3RfbmVzdF9sb2NrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfc3RhY2tzaXplXyc6OmttcF9zZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9zZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfYmxvY2t0aW1lXyc6OmttcF9zZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2xpYnJhcnlfc2VyaWFsXyc6OmttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kXyc6OmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dF8nOjprbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9saWJyYXJ5Xyc6OmttcF9zZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9zdGFja3NpemVfJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfc3RhY2tzaXplX3NfJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9ibG9ja3RpbWVfJzo6a21wX2dldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfbGlicmFyeV8nOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfYWZmaW5pdHlfJzo6a21wX3NldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9hZmZpbml0eV8nOjprbXBfZ2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jXyc6OmttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9jcmVhdGVfYWZmaW5pdHlfbWFza18nOjprbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9kZXN0cm95X2FmZmluaXR5X21hc2tfJzo6a21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9tYWxsb2NfJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2NhbGxvY18nOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfcmVhbGxvY18nOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2ZyZWVfJzo6a21wX2ZyZWUKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF93YXJuaW5nc19vbl8nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X3dhcm5pbmdzX29mZl8nOjprbXBfc2V0X3dhcm5pbmdzX29mZgorCishZGVjJCBlbmRpZgorCishZGVjJCBpZiBkZWZpbmVkKF9fQVBQTEVfXykKKworISoqKgorISoqKiBUaGUgTWFjIGVudHJ5IHBvaW50cyBhcmUgaW4gbG93ZXJjYXNlLCB3aXRoIGFuIGJvdGggYW4gdW5kZXJzY29yZQorISoqKiBhcHBlbmRlZCBhbmQgYW4gdW5kZXJzY29yZSBwcmVwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X251bV90aHJlYWRzXyc6Om9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X2R5bmFtaWNfJzo6b21wX3NldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9uZXN0ZWRfJzo6b21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X251bV90aHJlYWRzXyc6Om9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X21heF90aHJlYWRzXyc6Om9tcF9nZXRfbWF4X3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3RocmVhZF9udW1fJzo6b21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9udW1fcHJvY3NfJzo6b21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5fcGFyYWxsZWxfJzo6b21wX2luX3BhcmFsbGVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9keW5hbWljXyc6Om9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbmVzdGVkXyc6Om9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF90aHJlYWRfbGltaXRfJzo6b21wX2dldF90aHJlYWRfbGltaXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzXyc6Om9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzXyc6Om9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X2xldmVsXyc6Om9tcF9nZXRfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X2FjdGl2ZV9sZXZlbF8nOjpvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bV8nOjpvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3RlYW1fc2l6ZV8nOjpvbXBfZ2V0X3RlYW1fc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfc2NoZWR1bGVfJzo6b21wX3NldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfc2NoZWR1bGVfJzo6b21wX2dldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfd3RpbWVfJzo6b21wX2dldF93dGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfd3RpY2tfJzo6b21wX2dldF93dGljaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbG9ja18nOjpvbXBfaW5pdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbG9ja18nOjpvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9sb2NrXyc6Om9tcF9zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF91bnNldF9sb2NrXyc6Om9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbG9ja18nOjpvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbmVzdF9sb2NrXyc6Om9tcF9pbml0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9kZXN0cm95X25lc3RfbG9ja18nOjpvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X25lc3RfbG9ja18nOjpvbXBfc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF91bnNldF9uZXN0X2xvY2tfJzo6b21wX3Vuc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF90ZXN0X25lc3RfbG9ja18nOjpvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfc3RhY2tzaXplXyc6OmttcF9zZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9zdGFja3NpemVfc18nOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9ibG9ja3RpbWVfJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfc2VyaWFsXyc6OmttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZF8nOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0Xyc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9saWJyYXJ5Xyc6OmttcF9zZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfc3RhY2tzaXplXyc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9zdGFja3NpemVfc18nOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9ibG9ja3RpbWVfJzo6a21wX2dldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2xpYnJhcnlfJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9hZmZpbml0eV8nOjprbXBfc2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9hZmZpbml0eV8nOjprbXBfZ2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9hZmZpbml0eV9tYXhfcHJvY18nOjprbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrXyc6OmttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9kZXN0cm95X2FmZmluaXR5X21hc2tfJzo6a21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfbWFsbG9jXyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfY2FsbG9jXyc6OmttcF9jYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfcmVhbGxvY18nOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9mcmVlXyc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3dhcm5pbmdzX29uXyc6OmttcF9zZXRfd2FybmluZ3Nfb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3dhcm5pbmdzX29mZl8nOjprbXBfc2V0X3dhcm5pbmdzX29mZgorCishZGVjJCBlbmRpZgorCisgICAgICBlbmQgbW9kdWxlIG9tcF9saWIKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS8zMC9vbXBfbGliLmY5MC52YXIgYi9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzMwL29tcF9saWIuZjkwLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjZkZGZkCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS8zMC9vbXBfbGliLmY5MC52YXIKQEAgLTAsMCArMSwzNTUgQEAKKyEgaW5jbHVkZS8zMC9vbXBfbGliLmY5MC52YXIKKyEgJFJldmlzaW9uOiA0MjA2MSAkCishICREYXRlOiAyMDEzLTAyLTI4IDE2OjM2OjI0IC0wNjAwIChUaHUsIDI4IEZlYiAyMDEzKSAkCisKKyEKKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIS8vCishLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIS8vCishLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIS8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIS8vCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEKKworICAgICAgbW9kdWxlIG9tcF9saWJfa2luZHMKKworICAgICAgICB1c2UsIGludHJpbnNpYyA6OiBpc29fY19iaW5kaW5nCisKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9pbnRlZ2VyX2tpbmQgICAgICAgPSBjX2ludAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvZ2ljYWxfa2luZCAgICAgICA9IDQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9yZWFsX2tpbmQgICAgICAgICAgPSBjX2Zsb2F0CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfZG91YmxlX2tpbmQgICAgICAgID0gY19kb3VibGUKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2tpbmQgICAgICAgICAgPSBjX2ludHB0cl90CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbmVzdF9sb2NrX2tpbmQgICAgID0gY19pbnRwdHJfdAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2tpbmQgICAgICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9wb2ludGVyX2tpbmQgICAgICAgPSBjX2ludHB0cl90CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfc2l6ZV90X2tpbmQgICAgICAgID0gY19zaXplX3QKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9hZmZpbml0eV9tYXNrX2tpbmQgPSBjX2ludHB0cl90CisKKyAgICAgIGVuZCBtb2R1bGUgb21wX2xpYl9raW5kcworCisgICAgICBtb2R1bGUgb21wX2xpYgorCisgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IG9wZW5tcF92ZXJzaW9uICAgID0gJE9NUF9WRVJTSU9OCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9tYWpvciA9ICRLTVBfVkVSU0lPTl9NQUpPUgorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWlub3IgPSAkS01QX1ZFUlNJT05fTUlOT1IKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX2J1aWxkID0gJEtNUF9WRVJTSU9OX0JVSUxECisgICAgICAgIGNoYXJhY3RlcigqKSAgICAgICAgICAgICAgIGttcF9idWlsZF9kYXRlCisgICAgICAgIHBhcmFtZXRlcigga21wX2J1aWxkX2RhdGUgPSAnJEtNUF9CVUlMRF9EQVRFJyApCisKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9zdGF0aWMgID0gMQorICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2R5bmFtaWMgPSAyCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfZ3VpZGVkICA9IDMKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9hdXRvICAgID0gNAorCisgICAgICAgIGludGVyZmFjZQorCishICAgICAgICAgKioqCishICAgICAgICAgKioqIG9tcF8qIGVudHJ5IHBvaW50cworISAgICAgICAgICoqKgorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzKG50aHJlYWRzKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbnRocmVhZHMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYyhlbmFibGUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpLCB2YWx1ZSA6OiBlbmFibGUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWMKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWQoZW5hYmxlKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSwgdmFsdWUgOjogZW5hYmxlCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWQKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV90aHJlYWRzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF90aHJlYWRzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGhyZWFkX251bQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0KKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fcHJvY3MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pbl9wYXJhbGxlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfaW5fcGFyYWxsZWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfZHluYW1pYworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9uZXN0ZWQKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX2xpbWl0KCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90aHJlYWRfbGltaXQKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbGltaXQKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscyhtYXhfbGV2ZWxzKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbWF4X2xldmVscworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbGV2ZWwoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSA6OiBvbXBfZ2V0X2xldmVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbGV2ZWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfYWN0aXZlX2xldmVsKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgOjogb21wX2dldF9hY3RpdmVfbGV2ZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9hY3RpdmVfbGV2ZWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bShsZXZlbCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBsZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9zaXplKGxldmVsKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RlYW1fc2l6ZQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbGV2ZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90ZWFtX3NpemUKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZShraW5kLCBtb2RpZmllcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCB2YWx1ZSA6OiBraW5kCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBtb2RpZmllcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGUKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZShraW5kLCBtb2RpZmllcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3NjaGVkX2tpbmQpICAgOjoga2luZAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSA6OiBtb2RpZmllcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9nZXRfc2NoZWR1bGUKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpbWUoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgcmVhbCAoa2luZD1rbXBfZG91YmxlX2tpbmQpIG9tcF9nZXRfd3RpbWUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGltZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGljaygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICByZWFsIChraW5kPWttcF9kb3VibGVfa2luZCkgb21wX2dldF93dGljaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aWNrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2sobG9ja3ZhcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jayhsb2NrdmFyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2xvY2sobG9ja3ZhcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jayhsb2NrdmFyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX3Rlc3RfbG9jaworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X25lc3RfbG9jaworCisgICAgICAgICAgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF90ZXN0X25lc3RfbG9jaworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrCisKKyEgICAgICAgICAqKioKKyEgICAgICAgICAqKioga21wXyogZW50cnkgcG9pbnRzCishICAgICAgICAgKioqCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplKHNpemUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcyhzaXplKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZShtc2VjKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbXNlYworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwoKSBiaW5kKGMpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbAorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZCgpIGJpbmQoYykKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dCgpIGJpbmQoYykKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkobGlibnVtKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbGlibnVtCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5CisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMoc3RyaW5nKSBiaW5kKGMpCisgICAgICAgICAgICB1c2UsIGludHJpbnNpYyA6OiBpc29fY19iaW5kaW5nCisgICAgICAgICAgICBjaGFyYWN0ZXIgKGtpbmQ9Y19jaGFyKSA6OiBzdHJpbmcoKikKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfc3RhY2tzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9ibG9ja3RpbWUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfbGlicmFyeQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHkobWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3NldF9hZmZpbml0eQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHkKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHkobWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHkKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrKG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzayhtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBwcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX21hbGxvYyhzaXplKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfbWFsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX21hbGxvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2NhbGxvYyhuZWxlbSwgZWxzaXplKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfY2FsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IG5lbGVtCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IGVsc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfY2FsbG9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfcmVhbGxvYyhwdHIsIHNpemUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9yZWFsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpLCB2YWx1ZSA6OiBwdHIKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfcmVhbGxvYworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfZnJlZShwdHIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpLCB2YWx1ZSA6OiBwdHIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZnJlZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uKCkgYmluZChjKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24KKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYoKSBiaW5kKGMpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYKKworICAgICAgICBlbmQgaW50ZXJmYWNlCisKKyAgICAgIGVuZCBtb2R1bGUgb21wX2xpYgpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS8zMC9vbXBfbGliLmgudmFyIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS8zMC9vbXBfbGliLmgudmFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZTNmYzcKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzMwL29tcF9saWIuaC52YXIKQEAgLTAsMCArMSw2MzEgQEAKKyEgaW5jbHVkZS8zMC9vbXBfbGliLmgudmFyCishICRSZXZpc2lvbjogNDIxODEgJAorISAkRGF0ZTogMjAxMy0wMy0yNiAxNTowNDo0NSAtMDUwMCAoVHVlLCAyNiBNYXIgMjAxMykgJAorCishCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEvLworIS8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyEvLworIS8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyEvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyEvLworIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishCisKKyEqKioKKyEqKiogU29tZSBvZiB0aGUgZGlyZWN0aXZlcyBmb3IgdGhlIGZvbGxvd2luZyByb3V0aW5lIGV4dGVuZCBwYXN0IGNvbHVtbiA3MiwKKyEqKiogc28gcHJvY2VzcyB0aGlzIGZpbGUgaW4gMTMyLWNvbHVtbiBtb2RlLgorISoqKgorCishZGVjJCBmaXhlZGZvcm1saW5lc2l6ZToxMzIKKworICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9pbnRlZ2VyX2tpbmQgICAgICAgPSA0CisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvZ2ljYWxfa2luZCAgICAgICA9IDQKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfcmVhbF9raW5kICAgICAgICAgID0gNAorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2tpbmQgICAgICAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9uZXN0X2xvY2tfa2luZCAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9raW5kICAgICAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3BvaW50ZXJfa2luZCAgICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3NpemVfdF9raW5kICAgICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX2FmZmluaXR5X21hc2tfa2luZCA9IGludF9wdHJfa2luZCgpCisKKyAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfc3RhdGljICA9IDEKKyAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfZHluYW1pYyA9IDIKKyAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfZ3VpZGVkICA9IDMKKyAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfYXV0byAgICA9IDQKKworICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21ham9yID0gJEtNUF9WRVJTSU9OX01BSk9SCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWlub3IgPSAkS01QX1ZFUlNJT05fTUlOT1IKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9idWlsZCA9ICRLTVBfVkVSU0lPTl9CVUlMRAorICAgICAgY2hhcmFjdGVyKCopICAgICAgICAgICAgICAga21wX2J1aWxkX2RhdGUKKyAgICAgIHBhcmFtZXRlcigga21wX2J1aWxkX2RhdGUgPSAnJEtNUF9CVUlMRF9EQVRFJyApCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjogb3Blbm1wX3ZlcnNpb24gICAgPSAkT01QX1ZFUlNJT04KKworICAgICAgaW50ZXJmYWNlCisKKyEgICAgICAgKioqCishICAgICAgICoqKiBvbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgKioqCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzKG50aHJlYWRzKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbnRocmVhZHMKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkcworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljKGVuYWJsZSkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIGVuYWJsZQorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWMKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkKGVuYWJsZSkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIGVuYWJsZQorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMoKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fdGhyZWFkcworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMoKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9tYXhfdGhyZWFkcworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bSgpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9udW0KKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzKCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3Byb2NzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jcworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbCgpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaW5fcGFyYWxsZWwKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYygpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X2R5bmFtaWMKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkKCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfbmVzdGVkCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X25lc3RlZAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX2xpbWl0KCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdAorCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscyhtYXhfbGV2ZWxzKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbWF4X2xldmVscworICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscygpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9sZXZlbCgpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2xldmVsCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2xldmVsCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hY3RpdmVfbGV2ZWwoKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9hY3RpdmVfbGV2ZWwKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfYWN0aXZlX2xldmVsCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtKGxldmVsKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbGV2ZWwKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF90ZWFtX3NpemUobGV2ZWwpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBsZXZlbAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90ZWFtX3NpemUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9zaXplCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X3NjaGVkdWxlKGtpbmQsIG1vZGlmaWVyKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3NjaGVkX2tpbmQpIGtpbmQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG1vZGlmaWVyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGUKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9nZXRfc2NoZWR1bGUoa2luZCwgbW9kaWZpZXIpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCkga2luZAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbW9kaWZpZXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpbWUoKQorICAgICAgICAgIGRvdWJsZSBwcmVjaXNpb24gb21wX2dldF93dGltZQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGltZQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2sgKCkKKyAgICAgICAgICBkb3VibGUgcHJlY2lzaW9uIG9tcF9nZXRfd3RpY2sKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jayhsb2NrdmFyKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jayhsb2NrdmFyKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jaworCisgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF90ZXN0X2xvY2sKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jayhsb2NrdmFyKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9jayhsb2NrdmFyKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X25lc3RfbG9jaworCisgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jayhsb2NrdmFyKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX3Rlc3RfbmVzdF9sb2NrCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jaworCishICAgICAgICoqKgorISAgICAgICAqKioga21wXyogZW50cnkgcG9pbnRzCishICAgICAgICoqKgorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUoc2l6ZSkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHNpemUKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3Moc2l6ZSkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgc2l6ZQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZShtc2VjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbXNlYworICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZQorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbCgpCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kKCkKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0KCkKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeShsaWJudW0pCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBsaWJudW0KKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5CisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzKHN0cmluZykKKyAgICAgICAgICBjaGFyYWN0ZXIqKCopIHN0cmluZworICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUoKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9zdGFja3NpemUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcygpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIGttcF9nZXRfc3RhY2tzaXplX3MKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3MKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZSgpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2Jsb2NrdGltZQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkoKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9saWJyYXJ5CisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkKKworICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5KG1hc2spCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfc2V0X2FmZmluaXR5CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5CisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eShtYXNrKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eQorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eQorCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MoKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworCisgICAgICAgIHN1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrKG1hc2spCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworCisgICAgICAgIHN1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzayhtYXNrKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCisKKyAgICAgICAgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBwcm9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgIGZ1bmN0aW9uIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHByb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHByb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX21hbGxvYyhzaXplKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX21hbGxvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBzaXplCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfbWFsbG9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2NhbGxvYyhuZWxlbSwgZWxzaXplKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX2NhbGxvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBuZWxlbQorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBlbHNpemUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9jYWxsb2MKKworICAgICAgICBmdW5jdGlvbiBrbXBfcmVhbGxvYyhwdHIsIHNpemUpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfcmVhbGxvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkgcHRyCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIHNpemUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9yZWFsbG9jCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfZnJlZShwdHIpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBwdHIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2ZyZWUKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24oKQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29mZigpCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyAgICAgIGVuZCBpbnRlcmZhY2UKKworIWRlYyQgaWYgZGVmaW5lZChfV0lOMzIpCishZGVjJCAgIGlmIGRlZmluZWQoX1dJTjY0KSAub3IuIGRlZmluZWQoX01fQU1ENjQpCisKKyEqKioKKyEqKiogVGhlIEZvcnRyYW4gZW50cnkgcG9pbnRzIG11c3QgYmUgaW4gdXBwZXJjYXNlLCBldmVuIGlmIHRoZSAvUWxvd2VyY2FzZQorISoqKiBvcHRpb24gaXMgc3BlY2lmaWVkLiAgVGhlIGFsaWFzIGF0dHJpYnV0ZSBlbnN1cmVzIHRoYXQgdGhlIHNwZWNpZmllZAorISoqKiBzdHJpbmcgaXMgdXNlZCBhcyB0aGUgZW50cnkgcG9pbnQuCishKioqCishKioqIE9uIHRoZSBXaW5kb3dzKiBPUyBJQS0zMiBhcmNoaXRlY3R1cmUsIHRoZSBGb3J0cmFuIGVudHJ5IHBvaW50cyBoYXZlIGFuCishKioqIHVuZGVyc2NvcmUgcHJlcGVuZGVkLiAgT24gdGhlIFdpbmRvd3MqIE9TIEludGVsKFIpIDY0CishKioqIGFyY2hpdGVjdHVyZSwgbm8gdW5kZXJzY29yZSBpcyBwcmVwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfTlVNX1RIUkVBRFMnOjpvbXBfc2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX0RZTkFNSUMnOjpvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfTkVTVEVEJzo6b21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTlVNX1RIUkVBRFMnOjpvbXBfZ2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX01BWF9USFJFQURTJzo6b21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9USFJFQURfTlVNJzo6b21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05VTV9QUk9DUyc6Om9tcF9nZXRfbnVtX3Byb2NzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfSU5fUEFSQUxMRUwnOjpvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfRFlOQU1JQyc6Om9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9ORVNURUQnOjpvbXBfZ2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9USFJFQURfTElNSVQnOjpvbXBfZ2V0X3RocmVhZF9saW1pdAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9NQVhfQUNUSVZFX0xFVkVMUyc6Om9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTUFYX0FDVElWRV9MRVZFTFMnOjpvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0xFVkVMJzo6b21wX2dldF9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9BQ1RJVkVfTEVWRUwnOjpvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9BTkNFU1RPUl9USFJFQURfTlVNJzo6b21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1RFQU1fU0laRSc6Om9tcF9nZXRfdGVhbV9zaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX1NDSEVEVUxFJzo6b21wX3NldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9TQ0hFRFVMRSc6Om9tcF9nZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfV1RJTUUnOjpvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1dUSUNLJzo6b21wX2dldF93dGljaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9sb2NrJzo6b21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbG9jayc6Om9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbG9jayc6Om9tcF9zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Vuc2V0X2xvY2snOjpvbXBfdW5zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbG9jayc6Om9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X25lc3RfbG9jayc6Om9tcF9pbml0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbmVzdF9sb2NrJzo6b21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X25lc3RfbG9jayc6Om9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbmVzdF9sb2NrJzo6b21wX3Vuc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbmVzdF9sb2NrJzo6b21wX3Rlc3RfbmVzdF9sb2NrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfU1RBQ0tTSVpFJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfU1RBQ0tTSVpFX1MnOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0JMT0NLVElNRSc6OmttcF9zZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUllfU0VSSUFMJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQnOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQnOjprbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0RFRkFVTFRTJzo6a21wX3NldF9kZWZhdWx0cworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9TVEFDS1NJWkUnOjprbXBfZ2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9TVEFDS1NJWkVfUyc6OmttcF9nZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfQkxPQ0tUSU1FJzo6a21wX2dldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfTElCUkFSWSc6OmttcF9nZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9BRkZJTklUWSc6OmttcF9zZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfQUZGSU5JVFknOjprbXBfZ2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0FGRklOSVRZX01BWF9QUk9DJzo6a21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0NSRUFURV9BRkZJTklUWV9NQVNLJzo6a21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfREVTVFJPWV9BRkZJTklUWV9NQVNLJzo6a21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1VOU0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9NQUxMT0MnOjprbXBfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfQ0FMTE9DJzo6a21wX2NhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1JFQUxMT0MnOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0ZSRUUnOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1dBUk5JTkdTX09OJzo6a21wX3NldF93YXJuaW5nc19vbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9XQVJOSU5HU19PRkYnOjprbXBfc2V0X3dhcm5pbmdzX29mZgorCishZGVjJCAgIGVsc2UKKworISoqKgorISoqKiBPbiBXaW5kb3dzKiBPUyBJQS0zMiBhcmNoaXRlY3R1cmUsIHRoZSBGb3J0cmFuIGVudHJ5IHBvaW50cyBoYXZlIGFuIHVuZGVyc2NvcmUgcHJlcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9OVU1fVEhSRUFEUyc6Om9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX0RZTkFNSUMnOjpvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX05FU1RFRCc6Om9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9OVU1fVEhSRUFEUyc6Om9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX01BWF9USFJFQURTJzo6b21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfVEhSRUFEX05VTSc6Om9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTlVNX1BST0NTJzo6b21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfSU5fUEFSQUxMRUwnOjpvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0RZTkFNSUMnOjpvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX05FU1RFRCc6Om9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9USFJFQURfTElNSVQnOjpvbXBfZ2V0X3RocmVhZF9saW1pdAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfTUFYX0FDVElWRV9MRVZFTFMnOjpvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9NQVhfQUNUSVZFX0xFVkVMUyc6Om9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0xFVkVMJzo6b21wX2dldF9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfQUNUSVZFX0xFVkVMJzo6b21wX2dldF9hY3RpdmVfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU0nOjpvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1RFQU1fU0laRSc6Om9tcF9nZXRfdGVhbV9zaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9TQ0hFRFVMRSc6Om9tcF9zZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1NDSEVEVUxFJzo6b21wX2dldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfV1RJTUUnOjpvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9XVElDSyc6Om9tcF9nZXRfd3RpY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X2xvY2snOjpvbXBfaW5pdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbG9jayc6Om9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X2xvY2snOjpvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbG9jayc6Om9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbG9jayc6Om9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9uZXN0X2xvY2snOjpvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9uZXN0X2xvY2snOjpvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X25lc3RfbG9jayc6Om9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X25lc3RfbG9jayc6Om9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9uZXN0X2xvY2snOjpvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfU1RBQ0tTSVpFJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX1NUQUNLU0laRV9TJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfQkxPQ0tUSU1FJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUllfU0VSSUFMJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWV9UVVJOQVJPVU5EJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUllfVEhST1VHSFBVVCc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9MSUJSQVJZJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9ERUZBVUxUUyc6OmttcF9zZXRfZGVmYXVsdHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX1NUQUNLU0laRSc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9TVEFDS1NJWkVfUyc6OmttcF9nZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0JMT0NLVElNRSc6OmttcF9nZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9MSUJSQVJZJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9BRkZJTklUWSc6OmttcF9zZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0FGRklOSVRZJzo6a21wX2dldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQUZGSU5JVFlfTUFYX1BST0MnOjprbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0NSRUFURV9BRkZJTklUWV9NQVNLJzo6a21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0RFU1RST1lfQUZGSU5JVFlfTUFTSyc6OmttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1VOU0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX01BTExPQyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfQ0FMTE9DJzo6a21wX2NhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9SRUFMTE9DJzo6a21wX3JlYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfRlJFRSc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX1dBUk5JTkdTX09OJzo6a21wX3NldF93YXJuaW5nc19vbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfV0FSTklOR1NfT0ZGJzo6a21wX3NldF93YXJuaW5nc19vZmYKKworIWRlYyQgICBlbmRpZgorIWRlYyQgZW5kaWYKKworIWRlYyQgaWYgZGVmaW5lZChfX2xpbnV4KQorCishKioqCishKioqIFRoZSBMaW51eCogT1MgZW50cnkgcG9pbnRzIGFyZSBpbiBsb3dlcmNhc2UsIHdpdGggYW4gdW5kZXJzY29yZSBhcHBlbmRlZC4KKyEqKioKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9udW1fdGhyZWFkc18nOjpvbXBfc2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X2R5bmFtaWNfJzo6b21wX3NldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X25lc3RlZF8nOjpvbXBfc2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9udW1fdGhyZWFkc18nOjpvbXBfZ2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X21heF90aHJlYWRzXyc6Om9tcF9nZXRfbWF4X3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfdGhyZWFkX251bV8nOjpvbXBfZ2V0X3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbnVtX3Byb2NzXyc6Om9tcF9nZXRfbnVtX3Byb2NzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5fcGFyYWxsZWxfJzo6b21wX2luX3BhcmFsbGVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X2R5bmFtaWNfJzo6b21wX2dldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X25lc3RlZF8nOjpvbXBfZ2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF90aHJlYWRfbGltaXRfJzo6b21wX2dldF90aHJlYWRfbGltaXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHNfJzo6b21wX3NldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9tYXhfYWN0aXZlX2xldmVsc18nOjpvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X2xldmVsXyc6Om9tcF9nZXRfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfYWN0aXZlX2xldmVsXyc6Om9tcF9nZXRfYWN0aXZlX2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW1fJzo6b21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3RlYW1fc2l6ZV8nOjpvbXBfZ2V0X3RlYW1fc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9zY2hlZHVsZV8nOjpvbXBfc2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3NjaGVkdWxlXyc6Om9tcF9nZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfd3RpbWVfJzo6b21wX2dldF93dGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF93dGlja18nOjpvbXBfZ2V0X3d0aWNrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X2xvY2tfJzo6b21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbG9ja18nOjpvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X2xvY2tfJzo6b21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbG9ja18nOjpvbXBfdW5zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbG9ja18nOjpvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9uZXN0X2xvY2tfJzo6b21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9uZXN0X2xvY2tfJzo6b21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X25lc3RfbG9ja18nOjpvbXBfc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Vuc2V0X25lc3RfbG9ja18nOjpvbXBfdW5zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9uZXN0X2xvY2tfJzo6b21wX3Rlc3RfbmVzdF9sb2NrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfc3RhY2tzaXplXyc6OmttcF9zZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9zZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfYmxvY2t0aW1lXyc6OmttcF9zZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2xpYnJhcnlfc2VyaWFsXyc6OmttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kXyc6OmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dF8nOjprbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9saWJyYXJ5Xyc6OmttcF9zZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9kZWZhdWx0c18nOjprbXBfc2V0X2RlZmF1bHRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X3N0YWNrc2l6ZV8nOjprbXBfZ2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9zdGFja3NpemVfc18nOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2Jsb2NrdGltZV8nOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9saWJyYXJ5Xyc6OmttcF9nZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9hZmZpbml0eV8nOjprbXBfc2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2FmZmluaXR5Xyc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfJzo6a21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrXyc6OmttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza18nOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX21hbGxvY18nOjprbXBfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfY2FsbG9jXyc6OmttcF9jYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9yZWFsbG9jXyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZnJlZV8nOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X3dhcm5pbmdzX29uXyc6OmttcF9zZXRfd2FybmluZ3Nfb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfd2FybmluZ3Nfb2ZmXyc6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyFkZWMkIGVuZGlmCisKKyFkZWMkIGlmIGRlZmluZWQoX19BUFBMRV9fKQorCishKioqCishKioqIFRoZSBNYWMgZW50cnkgcG9pbnRzIGFyZSBpbiBsb3dlcmNhc2UsIHdpdGggYW4gYm90aCBhbiB1bmRlcnNjb3JlCishKioqIGFwcGVuZGVkIGFuZCBhbiB1bmRlcnNjb3JlIHByZXBlbmRlZC4KKyEqKioKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbnVtX3RocmVhZHNfJzo6b21wX3NldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfZHluYW1pY18nOjpvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X25lc3RlZF8nOjpvbXBfc2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbnVtX3RocmVhZHNfJzo6b21wX2dldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbWF4X3RocmVhZHNfJzo6b21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfdGhyZWFkX251bV8nOjpvbXBfZ2V0X3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X251bV9wcm9jc18nOjpvbXBfZ2V0X251bV9wcm9jcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbl9wYXJhbGxlbF8nOjpvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X2R5bmFtaWNfJzo6b21wX2dldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9uZXN0ZWRfJzo6b21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3RocmVhZF9saW1pdF8nOjpvbXBfZ2V0X3RocmVhZF9saW1pdAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHNfJzo6b21wX3NldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHNfJzo6b21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbGV2ZWxfJzo6b21wX2dldF9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfYWN0aXZlX2xldmVsXyc6Om9tcF9nZXRfYWN0aXZlX2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtXyc6Om9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfdGVhbV9zaXplXyc6Om9tcF9nZXRfdGVhbV9zaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9zY2hlZHVsZV8nOjpvbXBfc2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9zY2hlZHVsZV8nOjpvbXBfZ2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF93dGltZV8nOjpvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF93dGlja18nOjpvbXBfZ2V0X3d0aWNrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9sb2NrXyc6Om9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9sb2NrXyc6Om9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X2xvY2tfJzo6b21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X2xvY2tfJzo6b21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9sb2NrXyc6Om9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9uZXN0X2xvY2tfJzo6b21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbmVzdF9sb2NrXyc6Om9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbmVzdF9sb2NrXyc6Om9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X25lc3RfbG9ja18nOjpvbXBfdW5zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbmVzdF9sb2NrXyc6Om9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9zdGFja3NpemVfJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9zZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2Jsb2NrdGltZV8nOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV9zZXJpYWxfJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kXyc6OmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9kZWZhdWx0c18nOjprbXBfc2V0X2RlZmF1bHRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9zdGFja3NpemVfJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9nZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2Jsb2NrdGltZV8nOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfbGlicmFyeV8nOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2FmZmluaXR5Xyc6OmttcF9zZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2FmZmluaXR5Xyc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jXyc6OmttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfJzo6a21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza18nOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9tYWxsb2NfJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9jYWxsb2NfJzo6a21wX2NhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9yZWFsbG9jXyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2ZyZWVfJzo6a21wX2ZyZWUKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfd2FybmluZ3Nfb25fJzo6a21wX3NldF93YXJuaW5nc19vbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfd2FybmluZ3Nfb2ZmXyc6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyFkZWMkIGVuZGlmCisKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS80MC9pb21wLmgudmFyIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS80MC9pb21wLmgudmFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZWIzOGMKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzQwL2lvbXAuaC52YXIKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBpbmNsdWRlLzQwL2lvbXAuaC52YXIKKyAqICRSZXZpc2lvbjogNDE2NzQgJAorICogJERhdGU6IDIwMTItMDYtMDUgMDg6MzM6MzUgLTA1MDAgKFR1ZSwgMDUgSnVuIDIwMTIpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBfX0lPTVBfSAorIyAgIGRlZmluZSBfX0lPTVBfSAorCisjICAgZGVmaW5lIEtNUF9WRVJTSU9OX01BSk9SICAgICRLTVBfVkVSU0lPTl9NQUpPUgorIyAgIGRlZmluZSBLTVBfVkVSU0lPTl9NSU5PUiAgICAkS01QX1ZFUlNJT05fTUlOT1IKKyMgICBkZWZpbmUgS01QX1ZFUlNJT05fQlVJTEQgICAgJEtNUF9WRVJTSU9OX0JVSUxECisjICAgZGVmaW5lIEtNUF9CVUlMRF9EQVRFICAgICAgICIkS01QX0JVSUxEX0RBVEUiCisKKyMgICBpZmRlZiBfX2NwbHVzcGx1cworICAgICAgICBleHRlcm4gIkMiIHsKKyMgICBlbmRpZgorCisjICAgICAgIGRlZmluZSBrbXBfc2V0X3N0YWNrc2l6ZSAgICAgICAgICAgIGttcGNfc2V0X3N0YWNrc2l6ZQorIyAgICAgICBkZWZpbmUga21wX3NldF9zdGFja3NpemVfcyAgICAgICAgICBrbXBjX3NldF9zdGFja3NpemVfcworIyAgICAgICBkZWZpbmUga21wX3NldF9ibG9ja3RpbWUgICAgICAgICAgICBrbXBjX3NldF9ibG9ja3RpbWUKKyMgICAgICAgZGVmaW5lIGttcF9zZXRfbGlicmFyeSAgICAgICAgICAgICAga21wY19zZXRfbGlicmFyeQorIyAgICAgICBkZWZpbmUga21wX3NldF9kZWZhdWx0cyAgICAgICAgICAgICBrbXBjX3NldF9kZWZhdWx0cworIyAgICAgICBkZWZpbmUga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MgICBrbXBjX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyMgICAgICAgZGVmaW5lIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2Mga21wY191bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyMgICAgICAgZGVmaW5lIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jICAga21wY19nZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyMgICAgICAgZGVmaW5lIGttcF9tYWxsb2MgICAgICAgICAgICAgICAgICAga21wY19tYWxsb2MKKyMgICAgICAgZGVmaW5lIGttcF9jYWxsb2MgICAgICAgICAgICAgICAgICAga21wY19jYWxsb2MKKyMgICAgICAgZGVmaW5lIGttcF9yZWFsbG9jICAgICAgICAgICAgICAgICAga21wY19yZWFsbG9jCisjICAgICAgIGRlZmluZSBrbXBfZnJlZSAgICAgICAgICAgICAgICAgICAgIGttcGNfZnJlZQorCisjICAgaWYgZGVmaW5lZChfV0lOMzIpCisjICAgICAgIGRlZmluZSBfX0tBSV9LTVBDX0NPTlZFTlRJT04gX19jZGVjbAorIyAgIGVsc2UKKyMgICAgICAgZGVmaW5lIF9fS0FJX0tNUENfQ09OVkVOVElPTgorIyAgIGVuZGlmCisKKyMgICBpbmNsdWRlIDxzdGRsaWIuaD4KKyAgICAvKiBrbXAgQVBJIGZ1bmN0aW9ucyAqLworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X3N0YWNrc2l6ZSAgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfc3RhY2tzaXplICAgICAgICAgIChpbnQpOworICAgIGV4dGVybiBzaXplX3QgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X3N0YWNrc2l6ZV9zICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfc3RhY2tzaXplX3MgICAgICAgIChzaXplX3QpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2Jsb2NrdGltZSAgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfbGlicmFyeSAgICAgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9ibG9ja3RpbWUgICAgICAgICAgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfbGlicmFyeSAgICAgICAgICAgIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2RlZmF1bHRzICAgICAgICAgICAoY2hhciBjb25zdCAqKTsKKworICAgIC8qIGFmZmluaXR5IEFQSSBmdW5jdGlvbnMgKi8KKyAgICB0eXBlZGVmIHZvaWQgKiBrbXBfYWZmaW5pdHlfbWFza190OworCisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfYWZmaW5pdHkgICAgICAgICAgICAgKGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfYWZmaW5pdHkgICAgICAgICAgICAgKGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sgICAgIChrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrICAgIChrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyAgIChpbnQsIGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MgKGludCwga21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MgICAoaW50LCBrbXBfYWZmaW5pdHlfbWFza190ICopOworCisgICAgZXh0ZXJuIHZvaWQgKiBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9tYWxsb2MgIChzaXplX3QpOworICAgIGV4dGVybiB2b2lkICogX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfY2FsbG9jICAoc2l6ZV90LCBzaXplX3QpOworICAgIGV4dGVybiB2b2lkICogX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfcmVhbGxvYyAodm9pZCAqLCBzaXplX3QpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZnJlZSAgICAodm9pZCAqKTsKKworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3dhcm5pbmdzX29uKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3dhcm5pbmdzX29mZih2b2lkKTsKKworICAgIC8qIHNjaGVkdWxlIGtpbmQgY29uc3RhbnRzICovCisgICAgdHlwZWRlZiBlbnVtIGttcF9jYW5jZWxfa2luZF90IHsKKyAgICAgICAga21wX2NhbmNlbF9wYXJhbGxlbCAgPSAxLAorICAgICAgICBrbXBfY2FuY2VsX2xvb3AgPSAyLAorICAgICAgICBrbXBfY2FuY2VsX3NlY3Rpb25zICA9IDMsCisgICAgICAgIGttcF9jYW5jZWxfdGFza2dyb3VwID0gNAorICAgIH0ga21wX2NhbmNlbF9raW5kX3Q7CisKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzKGttcF9jYW5jZWxfa2luZF90KTsKKyAgICAKKyMgICB1bmRlZiBfX0tBSV9LTVBDX0NPTlZFTlRJT04KKworICAgIC8qIFdhcm5pbmc6CisgICAgICAgVGhlIGZvbGxvd2luZyB0eXBlZGVmcyBhcmUgbm90IHN0YW5kYXJkLCBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4KKyAgICAqLworICAgIHR5cGVkZWYgaW50ICAgICBvbXBfaW50X3Q7CisgICAgdHlwZWRlZiBkb3VibGUgIG9tcF93dGltZV90OworCisjICAgaWZkZWYgX19jcGx1c3BsdXMKKyAgICAgICAgfQorIyAgIGVuZGlmCisKKyNlbmRpZiAvKiBfX0lPTVBfSCAqLworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzQwL2lvbXBfbGliLmgudmFyIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS80MC9pb21wX2xpYi5oLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2M2M2Y4Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS80MC9pb21wX2xpYi5oLnZhcgpAQCAtMCwwICsxLDgzIEBACishIGluY2x1ZGUvNDAvaW9tcF9saWIuaC52YXIKKyEgJFJldmlzaW9uOiA0MTY3NCAkCishICREYXRlOiAyMDEyLTA2LTA1IDA4OjMzOjM1IC0wNTAwIChUdWUsIDA1IEp1biAyMDEyKSAkCisKKyEKKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIS8vCishLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIS8vCishLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIS8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIS8vCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEKKworISoqKgorISoqKiBvbXBfaW50ZWdlcl9raW5kIGFuZCBvbXBfbG9naWNhbF9raW5kIGFwcGVhciB0byBiZSBwcmVkZWZpbmVkIGJ5IGdjYyBhbmQKKyEqKiogZ2ZvcnRyYW4gKGRlZmluaXRpb25zIGRvIG5vdCBhcHBlYXIgaW4gdGhlIG9tcC5oIC8gb21wX2xpYi5oIC9vbXBfbGliLmYpLgorISoqKiBvbXBfcmVhbF9raW5kIGlzIG5vdCBwcmVkZWZpbmVkLCBob3dldmVyLgorISoqKgorCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9tYWpvciA9ICRLTVBfVkVSU0lPTl9NQUpPUgorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWlub3IgPSAkS01QX1ZFUlNJT05fTUlOT1IKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX2J1aWxkID0gJEtNUF9WRVJTSU9OX0JVSUxECisgICAgICAgIGNoYXJhY3RlcigqKSAgICAgICAgICBrbXBfYnVpbGRfZGF0ZQorICAgICAgICBwYXJhbWV0ZXIoIGttcF9idWlsZF9kYXRlID0gJyRLTVBfQlVJTERfREFURScgKQorCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfcmVhbF9raW5kID0gNAorCishKioqCishKioqIGttcF8qIHR5cGUgZXh0ZW5zaW9ucworISoqKgorCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfcG9pbnRlcl9raW5kICAgICAgID0gJEtNUF9JTlRfUFRSX0tJTkQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9zaXplX3Rfa2luZCAgICAgICAgPSAkS01QX0lOVF9QVFJfS0lORAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX2FmZmluaXR5X21hc2tfa2luZCA9ICRLTVBfSU5UX1BUUl9LSU5ECisKKyEqKioKKyEqKioga21wXyogZW50cnkgcG9pbnRzCishKioqCisKKyAgICAgICAgZXh0ZXJuYWwga21wX3NldF9zdGFja3NpemUKKyAgICAgICAgZXh0ZXJuYWwga21wX3NldF9zdGFja3NpemVfcworICAgICAgICBleHRlcm5hbCBrbXBfc2V0X2Jsb2NrdGltZQorICAgICAgICBleHRlcm5hbCBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsCisgICAgICAgIGV4dGVybmFsIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCisgICAgICAgIGV4dGVybmFsIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CisgICAgICAgIGV4dGVybmFsIGttcF9zZXRfbGlicmFyeQorICAgICAgICBleHRlcm5hbCBrbXBfc2V0X2RlZmF1bHRzCisgICAgICAgIGV4dGVybmFsIGttcF9nZXRfc3RhY2tzaXplCisgICAgICAgIGludGVnZXIga21wX2dldF9zdGFja3NpemUKKyAgICAgICAgZXh0ZXJuYWwga21wX2dldF9zdGFja3NpemVfcworICAgICAgICBpbnRlZ2VyIChraW5kID0ga21wX3NpemVfdF9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisgICAgICAgIGV4dGVybmFsIGttcF9nZXRfYmxvY2t0aW1lCisgICAgICAgIGludGVnZXIga21wX2dldF9ibG9ja3RpbWUKKyAgICAgICAgZXh0ZXJuYWwga21wX2dldF9saWJyYXJ5CisgICAgICAgIGludGVnZXIga21wX2dldF9saWJyYXJ5CisgICAgICAgIGV4dGVybmFsIGttcF9zZXRfYWZmaW5pdHkKKyAgICAgICAgaW50ZWdlciBrbXBfc2V0X2FmZmluaXR5CisgICAgICAgIGV4dGVybmFsIGttcF9nZXRfYWZmaW5pdHkKKyAgICAgICAgaW50ZWdlciBrbXBfZ2V0X2FmZmluaXR5CisgICAgICAgIGV4dGVybmFsIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyAgICAgICAgaW50ZWdlciBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisgICAgICAgIGV4dGVybmFsIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworICAgICAgICBleHRlcm5hbCBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCisgICAgICAgIGV4dGVybmFsIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgIGludGVnZXIga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgZXh0ZXJuYWwga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICBpbnRlZ2VyIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgZXh0ZXJuYWwga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgaW50ZWdlciBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICBleHRlcm5hbCBrbXBfbWFsbG9jCisgICAgICAgIGludGVnZXIgKGtpbmQgPSBrbXBfcG9pbnRlcl9raW5kKSBrbXBfbWFsbG9jCisgICAgICAgIGV4dGVybmFsIGttcF9jYWxsb2MKKyAgICAgICAgaW50ZWdlciAoa2luZCA9IGttcF9wb2ludGVyX2tpbmQpIGttcF9jYWxsb2MKKyAgICAgICAgZXh0ZXJuYWwga21wX3JlYWxsb2MKKyAgICAgICAgaW50ZWdlciAoa2luZCA9IGttcF9wb2ludGVyX2tpbmQpIGttcF9yZWFsbG9jCisgICAgICAgIGV4dGVybmFsIGttcF9mcmVlCisKKyAgICAgICAgZXh0ZXJuYWwga21wX3NldF93YXJuaW5nc19vbgorICAgICAgICBleHRlcm5hbCBrbXBfc2V0X3dhcm5pbmdzX29mZgorCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wLmgudmFyIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS80MC9vbXAuaC52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZkZDRjZAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wLmgudmFyCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICogaW5jbHVkZS80MC9vbXAuaC52YXIKKyAqICRSZXZpc2lvbjogNDE2NzQgJAorICogJERhdGU6IDIwMTItMDYtMDUgMDg6MzM6MzUgLTA1MDAgKFR1ZSwgMDUgSnVuIDIwMTIpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBfX09NUF9ICisjICAgZGVmaW5lIF9fT01QX0gKKworIyAgIGRlZmluZSBLTVBfVkVSU0lPTl9NQUpPUiAgICAkS01QX1ZFUlNJT05fTUFKT1IKKyMgICBkZWZpbmUgS01QX1ZFUlNJT05fTUlOT1IgICAgJEtNUF9WRVJTSU9OX01JTk9SCisjICAgZGVmaW5lIEtNUF9WRVJTSU9OX0JVSUxEICAgICRLTVBfVkVSU0lPTl9CVUlMRAorIyAgIGRlZmluZSBLTVBfQlVJTERfREFURSAgICAgICAiJEtNUF9CVUlMRF9EQVRFIgorCisjICAgaWZkZWYgX19jcGx1c3BsdXMKKyAgICBleHRlcm4gIkMiIHsKKyMgICBlbmRpZgorCisjICAgaWYgZGVmaW5lZChfV0lOMzIpCisjICAgICAgIGRlZmluZSBfX0tBSV9LTVBDX0NPTlZFTlRJT04gX19jZGVjbAorIyAgIGVsc2UKKyMgICAgICAgZGVmaW5lIF9fS0FJX0tNUENfQ09OVkVOVElPTgorIyAgIGVuZGlmCisKKyAgICAvKiBzY2hlZHVsZSBraW5kIGNvbnN0YW50cyAqLworICAgIHR5cGVkZWYgZW51bSBvbXBfc2NoZWRfdCB7CisJb21wX3NjaGVkX3N0YXRpYyAgPSAxLAorCW9tcF9zY2hlZF9keW5hbWljID0gMiwKKwlvbXBfc2NoZWRfZ3VpZGVkICA9IDMsCisJb21wX3NjaGVkX2F1dG8gICAgPSA0CisgICAgfSBvbXBfc2NoZWRfdDsKKworICAgIC8qIHNldCBBUEkgZnVuY3Rpb25zICovCisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfbnVtX3RocmVhZHMgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfZHluYW1pYyAgICAgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfbmVzdGVkICAgICAgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfc2NoZWR1bGUgICAgICAgICAgKG9tcF9zY2hlZF90LCBpbnQpOworCisgICAgLyogcXVlcnkgQVBJIGZ1bmN0aW9ucyAqLworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X251bV90aHJlYWRzICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfZHluYW1pYyAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9uZXN0ZWQgICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X21heF90aHJlYWRzICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfdGhyZWFkX251bSAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9udW1fcHJvY3MgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfaW5fcGFyYWxsZWwgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfYWN0aXZlX2xldmVsICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbGV2ZWwgICAgICAgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bSAoaW50KTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF90ZWFtX3NpemUgICAgICAgICAgIChpbnQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3RocmVhZF9saW1pdCAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3NjaGVkdWxlICAgICAgICAgICAgKG9tcF9zY2hlZF90ICosIGludCAqKTsKKworICAgIC8qIGxvY2sgQVBJIGZ1bmN0aW9ucyAqLworICAgIHR5cGVkZWYgc3RydWN0IG9tcF9sb2NrX3QgeworICAgICAgICB2b2lkICogX2xrOworICAgIH0gb21wX2xvY2tfdDsKKworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfaW5pdF9sb2NrICAgIChvbXBfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X2xvY2sgICAgIChvbXBfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdW5zZXRfbG9jayAgIChvbXBfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZGVzdHJveV9sb2NrIChvbXBfbG9ja190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdGVzdF9sb2NrICAgIChvbXBfbG9ja190ICopOworCisgICAgLyogbmVzdGVkIGxvY2sgQVBJIGZ1bmN0aW9ucyAqLworICAgIHR5cGVkZWYgc3RydWN0IG9tcF9uZXN0X2xvY2tfdCB7CisgICAgICAgIHZvaWQgKiBfbGs7CisgICAgfSBvbXBfbmVzdF9sb2NrX3Q7CisKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2luaXRfbmVzdF9sb2NrICAgIChvbXBfbmVzdF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfbmVzdF9sb2NrICAgICAob21wX25lc3RfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdW5zZXRfbmVzdF9sb2NrICAgKG9tcF9uZXN0X2xvY2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrIChvbXBfbmVzdF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF90ZXN0X25lc3RfbG9jayAgICAob21wX25lc3RfbG9ja190ICopOworCisgICAgLyogdGltZSBBUEkgZnVuY3Rpb25zICovCisgICAgZXh0ZXJuIGRvdWJsZSBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfd3RpbWUgKHZvaWQpOworICAgIGV4dGVybiBkb3VibGUgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3d0aWNrICh2b2lkKTsKKworICAgIC8qIE9wZW5NUCA0LjAgKi8KKyAgICBleHRlcm4gaW50ICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UgKHZvaWQpOworICAgIGV4dGVybiB2b2lkIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9kZWZhdWx0X2RldmljZSAoaW50KTsKKyAgICBleHRlcm4gaW50ICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbnVtX2RldmljZXMgKHZvaWQpOworICAgIGV4dGVybiBpbnQgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9udW1fdGVhbXMgKHZvaWQpOworICAgIGV4dGVybiBpbnQgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF90ZWFtX251bSAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X2NhbmNlbGxhdGlvbiAodm9pZCk7CisKKyMgICBpbmNsdWRlIDxzdGRsaWIuaD4KKyAgICAvKiBrbXAgQVBJIGZ1bmN0aW9ucyAqLworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X3N0YWNrc2l6ZSAgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfc3RhY2tzaXplICAgICAgICAgIChpbnQpOworICAgIGV4dGVybiBzaXplX3QgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X3N0YWNrc2l6ZV9zICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfc3RhY2tzaXplX3MgICAgICAgIChzaXplX3QpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2Jsb2NrdGltZSAgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfbGlicmFyeSAgICAgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9ibG9ja3RpbWUgICAgICAgICAgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfbGlicmFyeSAgICAgICAgICAgIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2RlZmF1bHRzICAgICAgICAgICAoY2hhciBjb25zdCAqKTsKKworICAgIC8qIEludGVsIGFmZmluaXR5IEFQSSAqLworICAgIHR5cGVkZWYgdm9pZCAqIGttcF9hZmZpbml0eV9tYXNrX3Q7CisKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9hZmZpbml0eSAgICAgICAgICAgICAoa21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9hZmZpbml0eSAgICAgICAgICAgICAoa21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYyAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzayAgICAgKGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sgICAgKGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jICAgKGludCwga21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyAoaW50LCBrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyAgIChpbnQsIGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisKKyAgICAvKiBPcGVuTVAgNC4wIGFmZmluaXR5IEFQSSAqLworICAgIHR5cGVkZWYgZW51bSBvbXBfcHJvY19iaW5kX3QgeworICAgICAgICBvbXBfcHJvY19iaW5kX2ZhbHNlID0gMCwKKyAgICAgICAgb21wX3Byb2NfYmluZF90cnVlID0gMSwKKyAgICAgICAgb21wX3Byb2NfYmluZF9tYXN0ZXIgPSAyLAorICAgICAgICBvbXBfcHJvY19iaW5kX2Nsb3NlID0gMywKKyAgICAgICAgb21wX3Byb2NfYmluZF9zcHJlYWQgPSA0CisgICAgfSBvbXBfcHJvY19iaW5kX3Q7CisKKyAgICBleHRlcm4gb21wX3Byb2NfYmluZF90IF9fS0FJX0tNUENfQ09OVkVOVElPTiBvbXBfZ2V0X3Byb2NfYmluZCAodm9pZCk7CisKKyAgICBleHRlcm4gdm9pZCAqIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX21hbGxvYyAgKHNpemVfdCk7CisgICAgZXh0ZXJuIHZvaWQgKiBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9jYWxsb2MgIChzaXplX3QsIHNpemVfdCk7CisgICAgZXh0ZXJuIHZvaWQgKiBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9yZWFsbG9jICh2b2lkICosIHNpemVfdCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9mcmVlICAgICh2b2lkICopOworCisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfd2FybmluZ3Nfb24odm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfd2FybmluZ3Nfb2ZmKHZvaWQpOworCisjICAgdW5kZWYgX19LQUlfS01QQ19DT05WRU5USU9OCisKKyAgICAvKiBXYXJuaW5nOgorICAgICAgIFRoZSBmb2xsb3dpbmcgdHlwZWRlZnMgYXJlIG5vdCBzdGFuZGFyZCwgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuCisgICAgKi8KKyAgICB0eXBlZGVmIGludCAgICAgb21wX2ludF90OworICAgIHR5cGVkZWYgZG91YmxlICBvbXBfd3RpbWVfdDsKKworIyAgIGlmZGVmIF9fY3BsdXNwbHVzCisgICAgfQorIyAgIGVuZGlmCisKKyNlbmRpZiAvKiBfX09NUF9IICovCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wX2xpYi5mLnZhciBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wX2xpYi5mLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjliMmYyCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS80MC9vbXBfbGliLmYudmFyCkBAIC0wLDAgKzEsNzUwIEBACishIGluY2x1ZGUvNDAvb21wX2xpYi5mLnZhcgorISAkUmV2aXNpb246IDQxNjc0ICQKKyEgJERhdGU6IDIwMTItMDYtMDUgMDg6MzM6MzUgLTA1MDAgKFR1ZSwgMDUgSnVuIDIwMTIpICQKKworIQorIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishLy8KKyEvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCishLy8KKyEvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCishLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCishLy8KKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIQorCishKioqCishKioqIFNvbWUgb2YgdGhlIGRpcmVjdGl2ZXMgZm9yIHRoZSBmb2xsb3dpbmcgcm91dGluZSBleHRlbmQgcGFzdCBjb2x1bW4gNzIsCishKioqIHNvIHByb2Nlc3MgdGhpcyBmaWxlIGluIDEzMi1jb2x1bW4gbW9kZS4KKyEqKioKKworIWRlYyQgZml4ZWRmb3JtbGluZXNpemU6MTMyCisKKyAgICAgIG1vZHVsZSBvbXBfbGliX2tpbmRzCisKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9pbnRlZ2VyX2tpbmQgICAgICAgPSA0CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbG9naWNhbF9raW5kICAgICAgID0gNAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3JlYWxfa2luZCAgICAgICAgICA9IDQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2tpbmQgICAgICAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX25lc3RfbG9ja19raW5kICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfa2luZCAgICAgICAgID0gb21wX2ludGVnZXJfa2luZAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9raW5kICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9wb2ludGVyX2tpbmQgICAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3NpemVfdF9raW5kICAgICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfYWZmaW5pdHlfbWFza19raW5kID0gaW50X3B0cl9raW5kKCkKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9jYW5jZWxfa2luZCAgICAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisKKyAgICAgIGVuZCBtb2R1bGUgb21wX2xpYl9raW5kcworCisgICAgICBtb2R1bGUgb21wX2xpYgorCisgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21ham9yID0gJEtNUF9WRVJTSU9OX01BSk9SCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9taW5vciA9ICRLTVBfVkVSU0lPTl9NSU5PUgorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fYnVpbGQgPSAkS01QX1ZFUlNJT05fQlVJTEQKKyAgICAgICAgY2hhcmFjdGVyKCopLCBwYXJhbWV0ZXIgOjoga21wX2J1aWxkX2RhdGUgICAgPSAnJEtNUF9CVUlMRF9EQVRFJworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjogb3Blbm1wX3ZlcnNpb24gICAgPSAkT01QX1ZFUlNJT04KKworICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX3N0YXRpYyAgPSAxCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfZHluYW1pYyA9IDIKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9ndWlkZWQgID0gMworICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2F1dG8gICAgPSA0CisKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9mYWxzZSA9IDAKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF90cnVlID0gMQorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX21hc3RlciA9IDIKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9jbG9zZSA9IDMKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9zcHJlYWQgPSA0CisKKyAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF9wYXJhbGxlbCA9IDEKKyAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF9sb29wID0gMgorICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX3NlY3Rpb25zID0gMworICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX3Rhc2tncm91cCA9IDQKKworICAgICAgICBpbnRlcmZhY2UKKworISAgICAgICAgICoqKgorISAgICAgICAgICoqKiBvbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgICAqKioKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkcyhudGhyZWFkcykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG50aHJlYWRzCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkcworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWMoZW5hYmxlKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgZW5hYmxlCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkKGVuYWJsZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIGVuYWJsZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV90aHJlYWRzKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3RocmVhZHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF90aHJlYWRzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9udW0KKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jcygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV9wcm9jcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pbl9wYXJhbGxlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfaW5fcGFyYWxsZWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X2R5bmFtaWMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9keW5hbWljCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X25lc3RlZCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X25lc3RlZAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X25lc3RlZAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbGltaXQoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90aHJlYWRfbGltaXQKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbGltaXQKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscyhtYXhfbGV2ZWxzKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbWF4X2xldmVscworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2xldmVsKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbGV2ZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9sZXZlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hY3RpdmVfbGV2ZWwoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9hY3RpdmVfbGV2ZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9hY3RpdmVfbGV2ZWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bShsZXZlbCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGxldmVsCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9zaXplKGxldmVsKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbGV2ZWwKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90ZWFtX3NpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90ZWFtX3NpemUKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZShraW5kLCBtb2RpZmllcikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9zY2hlZF9raW5kKSBraW5kCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG1vZGlmaWVyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZQorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZ2V0X3NjaGVkdWxlKGtpbmQsIG1vZGlmaWVyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3NjaGVkX2tpbmQpIGtpbmQKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbW9kaWZpZXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZ2V0X3NjaGVkdWxlCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3Byb2NfYmluZCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpIG9tcF9nZXRfcHJvY19iaW5kCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfcHJvY19iaW5kCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lKCkKKyAgICAgICAgICAgIGRvdWJsZSBwcmVjaXNpb24gb21wX2dldF93dGltZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3d0aWNrICgpCisgICAgICAgICAgICBkb3VibGUgcHJlY2lzaW9uIG9tcF9nZXRfd3RpY2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGljaworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9kZWZhdWx0X2RldmljZSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9kZWZhdWx0X2RldmljZShkZmx0X2RldmljZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGRmbHRfZGV2aWNlCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9kZWZhdWx0X2RldmljZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fZGV2aWNlcygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV9kZXZpY2VzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX2RldmljZXMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RlYW1zKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3RlYW1zCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RlYW1zCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fbnVtKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGVhbV9udW0KKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90ZWFtX251bQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9jYW5jZWxsYXRpb24oKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9jYW5jZWxsYXRpb24KKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9jYW5jZWxsYXRpb24KKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jayhsb2NrdmFyKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2luaXRfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sobG9ja3ZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9kZXN0cm95X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2xvY2sobG9ja3ZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9zZXRfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2sobG9ja3ZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF91bnNldF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrKGxvY2t2YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdGVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX3Rlc3RfbG9jaworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrKGxvY2t2YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfaW5pdF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrKGxvY2t2YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sobG9ja3ZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9zZXRfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3Vuc2V0X25lc3RfbG9jayhsb2NrdmFyKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Vuc2V0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jayhsb2NrdmFyKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Rlc3RfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX3Rlc3RfbmVzdF9sb2NrCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sKKworISAgICAgICAgICoqKgorISAgICAgICAgICoqKiBrbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgICAqKioKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUoc2l6ZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHNpemUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zKHNpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIHNpemUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lKG1zZWMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBtc2VjCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9ibG9ja3RpbWUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbCgpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbAorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZCgpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQoKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeShsaWJudW0pCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBsaWJudW0KKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0cyhzdHJpbmcpCisgICAgICAgICAgICBjaGFyYWN0ZXIqKCopIHN0cmluZworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfc3RhY2tzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkga21wX2dldF9zdGFja3NpemVfcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2Jsb2NrdGltZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5KCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfbGlicmFyeQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHkobWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHkKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5KG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5CisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrKG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sobWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfbWFsbG9jKHNpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfbWFsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfbWFsbG9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfY2FsbG9jKG5lbGVtLCBlbHNpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfY2FsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgbmVsZW0KKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBlbHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2NhbGxvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3JlYWxsb2MocHRyLCBzaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX3JlYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkgcHRyCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfcmVhbGxvYworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfZnJlZShwdHIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBwdHIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZnJlZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uKCkKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmKCkKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29mZgorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzKGNhbmNlbGtpbmQpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpIGNhbmNlbGtpbmQKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cworICAgICAgICBlbmQgaW50ZXJmYWNlCisKKyFkZWMkIGlmIGRlZmluZWQoX1dJTjMyKQorIWRlYyQgICBpZiBkZWZpbmVkKF9XSU42NCkgLm9yLiBkZWZpbmVkKF9NX0FNRDY0KQorCishKioqCishKioqIFRoZSBGb3J0cmFuIGVudHJ5IHBvaW50cyBtdXN0IGJlIGluIHVwcGVyY2FzZSwgZXZlbiBpZiB0aGUgL1Fsb3dlcmNhc2UKKyEqKiogb3B0aW9uIGlzIHNwZWNpZmllZC4gIFRoZSBhbGlhcyBhdHRyaWJ1dGUgZW5zdXJlcyB0aGF0IHRoZSBzcGVjaWZpZWQKKyEqKiogc3RyaW5nIGlzIHVzZWQgYXMgdGhlIGVudHJ5IHBvaW50LgorISoqKgorISoqKiBPbiB0aGUgV2luZG93cyogT1MgSUEtMzIgYXJjaGl0ZWN0dXJlLCB0aGUgRm9ydHJhbiBlbnRyeSBwb2ludHMgaGF2ZSBhbgorISoqKiB1bmRlcnNjb3JlIHByZXBlbmRlZC4gIE9uIHRoZSBXaW5kb3dzKiBPUyBJbnRlbChSKSA2NAorISoqKiBhcmNoaXRlY3R1cmUsIG5vIHVuZGVyc2NvcmUgaXMgcHJlcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX05VTV9USFJFQURTJyA6OiBvbXBfc2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX0RZTkFNSUMnIDo6IG9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9ORVNURUQnIDo6IG9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05VTV9USFJFQURTJyA6OiBvbXBfZ2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX01BWF9USFJFQURTJyA6OiBvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1RIUkVBRF9OVU0nIDo6IG9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9OVU1fUFJPQ1MnIDo6IG9tcF9nZXRfbnVtX3Byb2NzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfSU5fUEFSQUxMRUwnIDo6IG9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9EWU5BTUlDJyA6OiBvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTkVTVEVEJyA6OiBvbXBfZ2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9USFJFQURfTElNSVQnIDo6IG9tcF9nZXRfdGhyZWFkX2xpbWl0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX01BWF9BQ1RJVkVfTEVWRUxTJyA6OiBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX01BWF9BQ1RJVkVfTEVWRUxTJyA6OiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0xFVkVMJyA6OiBvbXBfZ2V0X2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0FDVElWRV9MRVZFTCcgOjogb21wX2dldF9hY3RpdmVfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfQU5DRVNUT1JfVEhSRUFEX05VTScgOjogb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1RFQU1fU0laRScgOjogb21wX2dldF90ZWFtX3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfU0NIRURVTEUnIDo6IG9tcF9zZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfU0NIRURVTEUnIDo6IG9tcF9nZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfUFJPQ19CSU5EJyA6OiBvbXBfZ2V0X3Byb2NfYmluZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9XVElNRScgOjogb21wX2dldF93dGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9XVElDSycgOjogb21wX2dldF93dGljaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9ERUZBVUxUX0RFVklDRScgOjogb21wX2dldF9kZWZhdWx0X2RldmljZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9ERUZBVUxUX0RFVklDRScgOjogb21wX3NldF9kZWZhdWx0X2RldmljZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9OVU1fREVWSUNFUycgOjogb21wX2dldF9udW1fZGV2aWNlcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9OVU1fVEVBTVMnIDo6IG9tcF9nZXRfbnVtX3RlYW1zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1RFQU1fTlVNJyA6OiBvbXBfZ2V0X3RlYW1fbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0NBTkNFTExBVElPTicgOjogb21wX2dldF9jYW5jZWxsYXRpb24KKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbG9jaycgOjogb21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbG9jaycgOjogb21wX2Rlc3Ryb3lfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9sb2NrJyA6OiBvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9sb2NrJyA6OiBvbXBfdW5zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbG9jaycgOjogb21wX3Rlc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbmVzdF9sb2NrJyA6OiBvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X25lc3RfbG9jaycgOjogb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X25lc3RfbG9jaycgOjogb21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9uZXN0X2xvY2snIDo6IG9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X25lc3RfbG9jaycgOjogb21wX3Rlc3RfbmVzdF9sb2NrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfU1RBQ0tTSVpFJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfU1RBQ0tTSVpFX1MnOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0JMT0NLVElNRSc6OmttcF9zZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUllfU0VSSUFMJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQnOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQnOjprbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX1NUQUNLU0laRSc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX1NUQUNLU0laRV9TJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9CTE9DS1RJTUUnOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9MSUJSQVJZJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0FGRklOSVRZJzo6a21wX3NldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9BRkZJTklUWSc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfQUZGSU5JVFlfTUFYX1BST0MnOjprbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfQ1JFQVRFX0FGRklOSVRZX01BU0snOjprbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9ERVNUUk9ZX0FGRklOSVRZX01BU0snOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfVU5TRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX01BTExPQyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9DQUxMT0MnOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfUkVBTExPQyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfRlJFRSc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfV0FSTklOR1NfT04nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1dBUk5JTkdTX09GRic6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfQ0FOQ0VMTEFUSU9OX1NUQVRVUycgOjoga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzCisKKyFkZWMkICAgZWxzZQorCishKioqCishKioqIE9uIFdpbmRvd3MqIE9TIElBLTMyIGFyY2hpdGVjdHVyZSwgdGhlIEZvcnRyYW4gZW50cnkgcG9pbnRzIGhhdmUgYW4gdW5kZXJzY29yZSBwcmVwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX05VTV9USFJFQURTJyA6OiBvbXBfc2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9EWU5BTUlDJyA6OiBvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX05FU1RFRCcgOjogb21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX05VTV9USFJFQURTJyA6OiBvbXBfZ2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9NQVhfVEhSRUFEUycgOjogb21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfVEhSRUFEX05VTScgOjogb21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9OVU1fUFJPQ1MnIDo6IG9tcF9nZXRfbnVtX3Byb2NzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0lOX1BBUkFMTEVMJyA6OiBvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0RZTkFNSUMnIDo6IG9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTkVTVEVEJyA6OiBvbXBfZ2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfVEhSRUFEX0xJTUlUJyA6OiBvbXBfZ2V0X3RocmVhZF9saW1pdAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfTUFYX0FDVElWRV9MRVZFTFMnIDo6IG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX01BWF9BQ1RJVkVfTEVWRUxTJyA6OiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9MRVZFTCcgOjogb21wX2dldF9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfQUNUSVZFX0xFVkVMJyA6OiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfQU5DRVNUT1JfVEhSRUFEX05VTScgOjogb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9URUFNX1NJWkUnIDo6IG9tcF9nZXRfdGVhbV9zaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9TQ0hFRFVMRScgOjogb21wX3NldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfU0NIRURVTEUnIDo6IG9tcF9nZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1BST0NfQklORCcgOjogb21wX2dldF9wcm9jX2JpbmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1dUSU1FJyA6OiBvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9XVElDSycgOjogb21wX2dldF93dGljaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfREVGQVVMVF9ERVZJQ0UnIDo6IG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX0RFRkFVTFRfREVWSUNFJyA6OiBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9OVU1fREVWSUNFUycgOjogb21wX2dldF9udW1fZGV2aWNlcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTlVNX1RFQU1TJyA6OiBvbXBfZ2V0X251bV90ZWFtcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfVEVBTV9OVU0nIDo6IG9tcF9nZXRfdGVhbV9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0NBTkNFTExBVElPTicgOjogb21wX2dldF9jYW5jZWxsYXRpb24KKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X2xvY2snIDo6IG9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9sb2NrJyA6OiBvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9sb2NrJyA6OiBvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbG9jaycgOjogb21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9sb2NrJyA6OiBvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbmVzdF9sb2NrJyA6OiBvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9uZXN0X2xvY2snIDo6IG9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbmVzdF9sb2NrJyA6OiBvbXBfc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF91bnNldF9uZXN0X2xvY2snIDo6IG9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9uZXN0X2xvY2snIDo6IG9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9TVEFDS1NJWkUnOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfU1RBQ0tTSVpFX1MnOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9CTE9DS1RJTUUnOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWV9TRVJJQUwnOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQnOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWV9USFJPVUdIUFVUJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUlknOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX1NUQUNLU0laRSc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9TVEFDS1NJWkVfUyc6OmttcF9nZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0JMT0NLVElNRSc6OmttcF9nZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9MSUJSQVJZJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9BRkZJTklUWSc6OmttcF9zZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0FGRklOSVRZJzo6a21wX2dldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQUZGSU5JVFlfTUFYX1BST0MnOjprbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0NSRUFURV9BRkZJTklUWV9NQVNLJzo6a21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0RFU1RST1lfQUZGSU5JVFlfTUFTSyc6OmttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1VOU0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX01BTExPQyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfQ0FMTE9DJzo6a21wX2NhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9SRUFMTE9DJzo6a21wX3JlYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfRlJFRSc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX1dBUk5JTkdTX09OJzo6a21wX3NldF93YXJuaW5nc19vbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfV0FSTklOR1NfT0ZGJzo6a21wX3NldF93YXJuaW5nc19vZmYKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQ0FOQ0VMTEFUSU9OX1NUQVRVUycgOjoga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzCisKKyFkZWMkICAgZW5kaWYKKyFkZWMkIGVuZGlmCisKKyFkZWMkIGlmIGRlZmluZWQoX19saW51eCkKKworISoqKgorISoqKiBUaGUgTGludXgqIE9TIGVudHJ5IHBvaW50cyBhcmUgaW4gbG93ZXJjYXNlLCB3aXRoIGFuIHVuZGVyc2NvcmUgYXBwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbnVtX3RocmVhZHNfJzo6b21wX3NldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9keW5hbWljXyc6Om9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9uZXN0ZWRfJzo6b21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbnVtX3RocmVhZHNfJzo6b21wX2dldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9tYXhfdGhyZWFkc18nOjpvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3RocmVhZF9udW1fJzo6b21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X251bV9wcm9jc18nOjpvbXBfZ2V0X251bV9wcm9jcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luX3BhcmFsbGVsXyc6Om9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9keW5hbWljXyc6Om9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9uZXN0ZWRfJzo6b21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfdGhyZWFkX2xpbWl0Xyc6Om9tcF9nZXRfdGhyZWFkX2xpbWl0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzXyc6Om9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHNfJzo6b21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9sZXZlbF8nOjpvbXBfZ2V0X2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X2FjdGl2ZV9sZXZlbF8nOjpvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtXyc6Om9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF90ZWFtX3NpemVfJzo6b21wX2dldF90ZWFtX3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfc2NoZWR1bGVfJzo6b21wX3NldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9zY2hlZHVsZV8nOjpvbXBfZ2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3Byb2NfYmluZF8nIDo6IG9tcF9nZXRfcHJvY19iaW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3d0aW1lXyc6Om9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfd3RpY2tfJzo6b21wX2dldF93dGljaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9kZWZhdWx0X2RldmljZV8nOjpvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X2RlZmF1bHRfZGV2aWNlXyc6Om9tcF9zZXRfZGVmYXVsdF9kZXZpY2UKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbnVtX2RldmljZXNfJzo6b21wX2dldF9udW1fZGV2aWNlcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9udW1fdGVhbXNfJzo6b21wX2dldF9udW1fdGVhbXMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfdGVhbV9udW1fJzo6b21wX2dldF90ZWFtX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9jYW5jZWxsYXRpb25fJzo6b21wX2dldF9jYW5jZWxsYXRpb24KKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbG9ja18nOjpvbXBfaW5pdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9sb2NrXyc6Om9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbG9ja18nOjpvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9sb2NrXyc6Om9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9sb2NrXyc6Om9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X25lc3RfbG9ja18nOjpvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X25lc3RfbG9ja18nOjpvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbmVzdF9sb2NrXyc6Om9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbmVzdF9sb2NrXyc6Om9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X25lc3RfbG9ja18nOjpvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9zdGFja3NpemVfJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfc3RhY2tzaXplX3NfJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9ibG9ja3RpbWVfJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV9zZXJpYWxfJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0Xyc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2xpYnJhcnlfJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X3N0YWNrc2l6ZV8nOjprbXBfZ2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9zdGFja3NpemVfc18nOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2Jsb2NrdGltZV8nOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9saWJyYXJ5Xyc6OmttcF9nZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9hZmZpbml0eV8nOjprbXBfc2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2FmZmluaXR5Xyc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfJzo6a21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrXyc6OmttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza18nOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX21hbGxvY18nOjprbXBfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfY2FsbG9jXyc6OmttcF9jYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9yZWFsbG9jXyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZnJlZV8nOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X3dhcm5pbmdzX29uXyc6OmttcF9zZXRfd2FybmluZ3Nfb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfd2FybmluZ3Nfb2ZmXyc6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXNfJzo6a21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzCisKKyFkZWMkIGVuZGlmCisKKyFkZWMkIGlmIGRlZmluZWQoX19BUFBMRV9fKQorCishKioqCishKioqIFRoZSBNYWMgZW50cnkgcG9pbnRzIGFyZSBpbiBsb3dlcmNhc2UsIHdpdGggYW4gYm90aCBhbiB1bmRlcnNjb3JlCishKioqIGFwcGVuZGVkIGFuZCBhbiB1bmRlcnNjb3JlIHByZXBlbmRlZC4KKyEqKioKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbnVtX3RocmVhZHNfJzo6b21wX3NldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfZHluYW1pY18nOjpvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X25lc3RlZF8nOjpvbXBfc2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbnVtX3RocmVhZHNfJzo6b21wX2dldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbWF4X3RocmVhZHNfJzo6b21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfdGhyZWFkX251bV8nOjpvbXBfZ2V0X3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X251bV9wcm9jc18nOjpvbXBfZ2V0X251bV9wcm9jcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbl9wYXJhbGxlbF8nOjpvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X2R5bmFtaWNfJzo6b21wX2dldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9uZXN0ZWRfJzo6b21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3RocmVhZF9saW1pdF8nOjpvbXBfZ2V0X3RocmVhZF9saW1pdAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHNfJzo6b21wX3NldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHNfJzo6b21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbGV2ZWxfJzo6b21wX2dldF9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfYWN0aXZlX2xldmVsXyc6Om9tcF9nZXRfYWN0aXZlX2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtXyc6Om9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfdGVhbV9zaXplXyc6Om9tcF9nZXRfdGVhbV9zaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9zY2hlZHVsZV8nOjpvbXBfc2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9zY2hlZHVsZV8nOjpvbXBfZ2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9wcm9jX2JpbmRfJyA6OiBvbXBfZ2V0X3Byb2NfYmluZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfd3RpbWVfJzo6b21wX2dldF93dGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfd3RpY2tfJzo6b21wX2dldF93dGljaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbnVtX3RlYW1zXyc6Om9tcF9nZXRfbnVtX3RlYW1zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF90ZWFtX251bV8nOjpvbXBfZ2V0X3RlYW1fbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9jYW5jZWxsYXRpb25fJzo6b21wX2dldF9jYW5jZWxsYXRpb24KKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X2xvY2tfJzo6b21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9kZXN0cm95X2xvY2tfJzo6b21wX2Rlc3Ryb3lfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbG9ja18nOjpvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbG9ja18nOjpvbXBfdW5zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF90ZXN0X2xvY2tfJzo6b21wX3Rlc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X25lc3RfbG9ja18nOjpvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9uZXN0X2xvY2tfJzo6b21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9uZXN0X2xvY2tfJzo6b21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbmVzdF9sb2NrXyc6Om9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9uZXN0X2xvY2tfJzo6b21wX3Rlc3RfbmVzdF9sb2NrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3N0YWNrc2l6ZV8nOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfc3RhY2tzaXplX3NfJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfYmxvY2t0aW1lXyc6OmttcF9zZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9saWJyYXJ5X3NlcmlhbF8nOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dF8nOjprbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV8nOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X3N0YWNrc2l6ZV8nOjprbXBfZ2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfc3RhY2tzaXplX3NfJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfYmxvY2t0aW1lXyc6OmttcF9nZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9saWJyYXJ5Xyc6OmttcF9nZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfYWZmaW5pdHlfJzo6a21wX3NldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfYWZmaW5pdHlfJzo6a21wX2dldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfJzo6a21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9jcmVhdGVfYWZmaW5pdHlfbWFza18nOjprbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrXyc6OmttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX21hbGxvY18nOjprbXBfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2NhbGxvY18nOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3JlYWxsb2NfJzo6a21wX3JlYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZnJlZV8nOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF93YXJuaW5nc19vbl8nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF93YXJuaW5nc19vZmZfJzo6a21wX3NldF93YXJuaW5nc19vZmYKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1c18nOjprbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMKKworIWRlYyQgZW5kaWYKKworICAgICAgZW5kIG1vZHVsZSBvbXBfbGliCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wX2xpYi5mOTAudmFyIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS80MC9vbXBfbGliLmY5MC52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc4NTM1MgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wX2xpYi5mOTAudmFyCkBAIC0wLDAgKzEsNDQwIEBACishIGluY2x1ZGUvNDAvb21wX2xpYi5mOTAudmFyCishICRSZXZpc2lvbjogNDE2NzQgJAorISAkRGF0ZTogMjAxMi0wNi0wNSAwODozMzozNSAtMDUwMCAoVHVlLCAwNSBKdW4gMjAxMikgJAorCishCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEvLworIS8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyEvLworIS8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyEvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyEvLworIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishCisKKyAgICAgIG1vZHVsZSBvbXBfbGliX2tpbmRzCisKKyAgICAgICAgdXNlLCBpbnRyaW5zaWMgOjogaXNvX2NfYmluZGluZworCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfaW50ZWdlcl9raW5kICAgICAgID0gY19pbnQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2dpY2FsX2tpbmQgICAgICAgPSA0CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfcmVhbF9raW5kICAgICAgICAgID0gY19mbG9hdAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX2RvdWJsZV9raW5kICAgICAgICA9IGNfZG91YmxlCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbG9ja19raW5kICAgICAgICAgID0gY19pbnRwdHJfdAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX25lc3RfbG9ja19raW5kICAgICA9IGNfaW50cHRyX3QKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9raW5kICAgICAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX2tpbmQgICAgID0gb21wX2ludGVnZXJfa2luZAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3BvaW50ZXJfa2luZCAgICAgICA9IGNfaW50cHRyX3QKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9zaXplX3Rfa2luZCAgICAgICAgPSBjX3NpemVfdAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX2FmZmluaXR5X21hc2tfa2luZCA9IGNfaW50cHRyX3QKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9jYW5jZWxfa2luZCAgICAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisKKyAgICAgIGVuZCBtb2R1bGUgb21wX2xpYl9raW5kcworCisgICAgICBtb2R1bGUgb21wX2xpYgorCisgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IG9wZW5tcF92ZXJzaW9uICAgID0gJE9NUF9WRVJTSU9OCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9tYWpvciA9ICRLTVBfVkVSU0lPTl9NQUpPUgorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWlub3IgPSAkS01QX1ZFUlNJT05fTUlOT1IKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX2J1aWxkID0gJEtNUF9WRVJTSU9OX0JVSUxECisgICAgICAgIGNoYXJhY3RlcigqKSAgICAgICAgICAgICAgIGttcF9idWlsZF9kYXRlCisgICAgICAgIHBhcmFtZXRlcigga21wX2J1aWxkX2RhdGUgPSAnJEtNUF9CVUlMRF9EQVRFJyApCisKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9zdGF0aWMgID0gMQorICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2R5bmFtaWMgPSAyCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfZ3VpZGVkICA9IDMKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9hdXRvICAgID0gNAorCisKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9mYWxzZSA9IDAKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF90cnVlID0gMQorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX21hc3RlciA9IDIKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9jbG9zZSA9IDMKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9zcHJlYWQgPSA0CisKKyAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF9wYXJhbGxlbCA9IDEKKyAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF9sb29wID0gMgorICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX3NlY3Rpb25zID0gMworICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX3Rhc2tncm91cCA9IDQKKworICAgICAgICBpbnRlcmZhY2UKKworISAgICAgICAgICoqKgorISAgICAgICAgICoqKiBvbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgICAqKioKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkcyhudGhyZWFkcykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IG50aHJlYWRzCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkcworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWMoZW5hYmxlKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSwgdmFsdWUgOjogZW5hYmxlCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkKGVuYWJsZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCksIHZhbHVlIDo6IGVuYWJsZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV90aHJlYWRzKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fdGhyZWFkcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV90aHJlYWRzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9tYXhfdGhyZWFkcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0oKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9udW0KKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jcygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3Byb2NzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfaW5fcGFyYWxsZWwoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaW5fcGFyYWxsZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWMoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X2R5bmFtaWMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9keW5hbWljCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X25lc3RlZCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfbmVzdGVkCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMobWF4X2xldmVscykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IG1heF9sZXZlbHMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2xldmVsKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9sZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2xldmVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfYWN0aXZlX2xldmVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfYWN0aXZlX2xldmVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0obGV2ZWwpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbGV2ZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fc2l6ZShsZXZlbCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90ZWFtX3NpemUKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGxldmVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9zaXplCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGUoa2luZCwgbW9kaWZpZXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9zY2hlZF9raW5kKSwgdmFsdWUgOjoga2luZAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbW9kaWZpZXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X3NjaGVkdWxlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9nZXRfc2NoZWR1bGUoa2luZCwgbW9kaWZpZXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9zY2hlZF9raW5kKSBraW5kCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG1vZGlmaWVyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9wcm9jX2JpbmQoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpIG9tcF9nZXRfcHJvY19iaW5kCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfcHJvY19iaW5kCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIHJlYWwgKGtpbmQ9a21wX2RvdWJsZV9raW5kKSBvbXBfZ2V0X3d0aW1lCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpbWUKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2soKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgcmVhbCAoa2luZD1rbXBfZG91YmxlX2tpbmQpIG9tcF9nZXRfd3RpY2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGljaworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9kZWZhdWx0X2RldmljZSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9kZWZhdWx0X2RldmljZQorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlKGRmbHRfZGV2aWNlKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogZGZsdF9kZXZpY2UKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV9kZXZpY2VzKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fZGV2aWNlcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9kZXZpY2VzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV90ZWFtcygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3RlYW1zCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RlYW1zCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fbnVtKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90ZWFtX251bQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2NhbmNlbGxhdGlvbigpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfY2FuY2VsbGF0aW9uCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfY2FuY2VsbGF0aW9uCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2luaXRfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2Rlc3Ryb3lfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfc2V0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF91bnNldF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF90ZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfdGVzdF9sb2NrCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2luaXRfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3NldF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF91bnNldF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Rlc3RfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX3Rlc3RfbmVzdF9sb2NrCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sKKworISAgICAgICAgICoqKgorISAgICAgICAgICoqKiBrbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgICAqKioKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUoc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zKHNpemUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lKG1zZWMpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBtc2VjCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9ibG9ja3RpbWUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbCgpIGJpbmQoYykKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kKCkgYmluZChjKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0KCkgYmluZChjKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeShsaWJudW0pIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBsaWJudW0KKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0cyhzdHJpbmcpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSwgaW50cmluc2ljIDo6IGlzb19jX2JpbmRpbmcKKyAgICAgICAgICAgIGNoYXJhY3RlciAoa2luZD1jX2NoYXIpIDo6IHN0cmluZygqKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9zdGFja3NpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3MoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIGttcF9nZXRfc3RhY2tzaXplX3MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2Jsb2NrdGltZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5KCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9saWJyYXJ5CisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eShtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfc2V0X2FmZmluaXR5CisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eShtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5CisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sobWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrKG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfbWFsbG9jKHNpemUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9tYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfbWFsbG9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfY2FsbG9jKG5lbGVtLCBlbHNpemUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9jYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogbmVsZW0KKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogZWxzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9jYWxsb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9yZWFsbG9jKHB0ciwgc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX3JlYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCksIHZhbHVlIDo6IHB0cgorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9yZWFsbG9jCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9mcmVlKHB0cikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCksIHZhbHVlIDo6IHB0cgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9mcmVlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24oKSBiaW5kKGMpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbgorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29mZigpIGJpbmQoYykKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29mZgorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzKGNhbmNlbGtpbmQpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHZhbHVlIDo6IGNhbmNlbGtpbmQKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cworCisgICAgICAgIGVuZCBpbnRlcmZhY2UKKworICAgICAgZW5kIG1vZHVsZSBvbXBfbGliCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzQwL29tcF9saWIuaC52YXIgYi9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzQwL29tcF9saWIuaC52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE3NDhmYQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wX2xpYi5oLnZhcgpAQCAtMCwwICsxLDU0NiBAQAorISBpbmNsdWRlLzQwL29tcF9saWIuaC52YXIKKyEgJFJldmlzaW9uOiA0MTY3NCAkCishICREYXRlOiAyMDEyLTA2LTA1IDA4OjMzOjM1IC0wNTAwIChUdWUsIDA1IEp1biAyMDEyKSAkCisKKyEKKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIS8vCishLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIS8vCishLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIS8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIS8vCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEKKworISoqKgorISoqKiBTb21lIG9mIHRoZSBkaXJlY3RpdmVzIGZvciB0aGUgZm9sbG93aW5nIHJvdXRpbmUgZXh0ZW5kIHBhc3QgY29sdW1uIDcyLAorISoqKiBzbyBwcm9jZXNzIHRoaXMgZmlsZSBpbiAxMzItY29sdW1uIG1vZGUuCishKioqCisKKyFESVIkIGZpeGVkZm9ybWxpbmVzaXplOjEzMgorCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2ludGVnZXJfa2luZCAgICAgICA9IDQKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbG9naWNhbF9raW5kICAgICAgID0gNAorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9yZWFsX2tpbmQgICAgICAgICAgPSA0CisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfa2luZCAgICAgICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX25lc3RfbG9ja19raW5kICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2tpbmQgICAgICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX2tpbmQgICAgID0gb21wX2ludGVnZXJfa2luZAorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9wb2ludGVyX2tpbmQgICAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9zaXplX3Rfa2luZCAgICAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9hZmZpbml0eV9tYXNrX2tpbmQgPSBpbnRfcHRyX2tpbmQoKQorCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjogb3Blbm1wX3ZlcnNpb24gICAgPSAkT01QX1ZFUlNJT04KKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9tYWpvciA9ICRLTVBfVkVSU0lPTl9NQUpPUgorICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21pbm9yID0gJEtNUF9WRVJTSU9OX01JTk9SCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fYnVpbGQgPSAkS01QX1ZFUlNJT05fQlVJTEQKKyAgICAgIGNoYXJhY3RlcigqKSAgICAgICAgICAgICAgIGttcF9idWlsZF9kYXRlCisgICAgICBwYXJhbWV0ZXIoIGttcF9idWlsZF9kYXRlID0gJyRLTVBfQlVJTERfREFURScgKQorCisgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX3N0YXRpYyAgPSAxCisgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2R5bmFtaWMgPSAyCisgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2d1aWRlZCAgPSAzCisgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2F1dG8gICAgPSA0CisKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfZmFsc2UgPSAwCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX3RydWUgPSAxCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX21hc3RlciA9IDIKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfY2xvc2UgPSAzCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX3NwcmVhZCA9IDQKKworICAgICAgaW50ZXJmYWNlCisKKyEgICAgICAgKioqCishICAgICAgICoqKiBvbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgKioqCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzKG50aHJlYWRzKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbnRocmVhZHMKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkcworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljKGVuYWJsZSkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCksIHZhbHVlIDo6IGVuYWJsZQorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWMKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkKGVuYWJsZSkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCksIHZhbHVlIDo6IGVuYWJsZQorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV90aHJlYWRzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV90aHJlYWRzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X3RocmVhZHMKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0oKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9udW0KKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fcHJvY3MKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2luX3BhcmFsbGVsCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfaW5fcGFyYWxsZWwKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWMoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X2R5bmFtaWMKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9uZXN0ZWQKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbGltaXQoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9saW1pdAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbGltaXQKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMobWF4X2xldmVscykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IG1heF9sZXZlbHMKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9sZXZlbCgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbGV2ZWwKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbGV2ZWwKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbCgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfYWN0aXZlX2xldmVsCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bShsZXZlbCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbGV2ZWwKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9zaXplKGxldmVsKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RlYW1fc2l6ZQorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGxldmVsCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fc2l6ZQorCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZShraW5kLCBtb2RpZmllcikgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCB2YWx1ZSA6OiBraW5kCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbW9kaWZpZXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZQorCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZShraW5kLCBtb2RpZmllcikgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3NjaGVkX2tpbmQpIGtpbmQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG1vZGlmaWVyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9nZXRfc2NoZWR1bGUKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3Byb2NfYmluZCgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCkgb21wX2dldF9wcm9jX2JpbmQKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfcHJvY19iaW5kCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGltZSgpIGJpbmQoYykKKyAgICAgICAgICBkb3VibGUgcHJlY2lzaW9uIG9tcF9nZXRfd3RpbWUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpbWUKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3d0aWNrKCkgYmluZChjKQorICAgICAgICAgIGRvdWJsZSBwcmVjaXNpb24gb21wX2dldF93dGljaworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGljaworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlKGRmbHRfZGV2aWNlKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogZGZsdF9kZXZpY2UKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9kZWZhdWx0X2RldmljZQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX2RldmljZXMoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV9kZXZpY2VzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9kZXZpY2VzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fdGVhbXMoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV90ZWFtcworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fdGVhbXMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fbnVtKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90ZWFtX251bQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90ZWFtX251bQorCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfaW5pdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9kZXN0cm95X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfc2V0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Vuc2V0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrCisKKyAgICAgICAgZnVuY3Rpb24gb21wX3Rlc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdGVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX3Rlc3RfbG9jaworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9pbml0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfc2V0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3Vuc2V0X25lc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdW5zZXRfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sKKworICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Rlc3RfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX3Rlc3RfbmVzdF9sb2NrCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jaworCishICAgICAgICoqKgorISAgICAgICAqKioga21wXyogZW50cnkgcG9pbnRzCishICAgICAgICoqKgorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUoc2l6ZSkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3Moc2l6ZSkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZShtc2VjKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbXNlYworICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZQorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbCgpIGJpbmQoYykKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbAorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQoKSBiaW5kKGMpCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dCgpIGJpbmQoYykKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeShsaWJudW0pIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBsaWJudW0KKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5CisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzKHN0cmluZykgYmluZChjKQorICAgICAgICAgIGNoYXJhY3RlciBzdHJpbmcoKikKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0cworCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9zdGFja3NpemUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkga21wX2dldF9zdGFja3NpemVfcworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcworCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9ibG9ja3RpbWUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5KCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9saWJyYXJ5CisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkKKworICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5KG1hc2spIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHkKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHkKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5KG1hc2spIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHkKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHkKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworCisgICAgICAgIHN1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrKG1hc2spIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrKG1hc2spIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworCisgICAgICAgIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICBmdW5jdGlvbiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBwcm9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBwcm9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgIGZ1bmN0aW9uIGttcF9tYWxsb2Moc2l6ZSkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX21hbGxvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX21hbGxvYworCisgICAgICAgIGZ1bmN0aW9uIGttcF9jYWxsb2MobmVsZW0sIGVsc2l6ZSkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX2NhbGxvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogbmVsZW0KKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IGVsc2l6ZQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2NhbGxvYworCisgICAgICAgIGZ1bmN0aW9uIGttcF9yZWFsbG9jKHB0ciwgc2l6ZSkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX3JlYWxsb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpLCB2YWx1ZSA6OiBwdHIKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9yZWFsbG9jCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfZnJlZShwdHIpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpLCB2YWx1ZSA6OiBwdHIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2ZyZWUKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24oKSBiaW5kKGMpCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24KKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmKCkgYmluZChjKQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29mZgorCisgICAgICBlbmQgaW50ZXJmYWNlCisKKyFESVIkIElGIERFRklORUQgKF9fSU5URUxfT0ZGTE9BRCkKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3NldF9udW1fdGhyZWFkcworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfc2V0X2R5bmFtaWMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3NldF9uZXN0ZWQKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9udW1fdGhyZWFkcworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X21heF90aHJlYWRzCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfdGhyZWFkX251bQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X251bV9wcm9jcworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfaW5fcGFyYWxsZWwKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9keW5hbWljCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfbmVzdGVkCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfdGhyZWFkX2xpbWl0CishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X2xldmVsCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfYWN0aXZlX2xldmVsCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X3RlYW1fc2l6ZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfc2V0X3NjaGVkdWxlCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfc2NoZWR1bGUKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9wcm9jX2JpbmQKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF93dGltZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X3d0aWNrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3NldF9kZWZhdWx0X2RldmljZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X251bV9kZXZpY2VzCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfbnVtX3RlYW1zCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfdGVhbV9udW0KKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2luaXRfbG9jaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZGVzdHJveV9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9zZXRfbG9jaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfdW5zZXRfbG9jaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfdGVzdF9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9pbml0X25lc3RfbG9jaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3NldF9uZXN0X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3Vuc2V0X25lc3RfbG9jaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfdGVzdF9uZXN0X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9zdGFja3NpemUKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9zdGFja3NpemVfcworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X2Jsb2NrdGltZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfbGlicmFyeQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X2RlZmF1bHRzCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9nZXRfc3RhY2tzaXplCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9nZXRfc3RhY2tzaXplX3MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2dldF9ibG9ja3RpbWUKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2dldF9saWJyYXJ5CishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfYWZmaW5pdHkKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2dldF9hZmZpbml0eQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX21hbGxvYworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfY2FsbG9jCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9yZWFsbG9jCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9mcmVlCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfd2FybmluZ3Nfb24KKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF93YXJuaW5nc19vZmYKKworIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3NldF9udW1fdGhyZWFkcyApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfc2V0X2R5bmFtaWMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3NldF9uZXN0ZWQgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9udW1fdGhyZWFkcyApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X21heF90aHJlYWRzICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfdGhyZWFkX251bSApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X251bV9wcm9jcyApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfaW5fcGFyYWxsZWwgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9keW5hbWljICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfbmVzdGVkICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfdGhyZWFkX2xpbWl0ICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9tYXhfYWN0aXZlX2xldmVscyApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X2xldmVsICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfYWN0aXZlX2xldmVsICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bSApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X3RlYW1fc2l6ZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfc2V0X3NjaGVkdWxlICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfc2NoZWR1bGUgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9wcm9jX2JpbmQgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF93dGltZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X3d0aWNrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3NldF9kZWZhdWx0X2RldmljZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X251bV9kZXZpY2VzICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfbnVtX3RlYW1zICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfdGVhbV9udW0gKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2luaXRfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZGVzdHJveV9sb2NrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9zZXRfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfdW5zZXRfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfdGVzdF9sb2NrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9pbml0X25lc3RfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZGVzdHJveV9uZXN0X2xvY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3NldF9uZXN0X2xvY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3Vuc2V0X25lc3RfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfdGVzdF9uZXN0X2xvY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9zdGFja3NpemUgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9zdGFja3NpemVfcyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X2Jsb2NrdGltZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X2xpYnJhcnlfc2VyaWFsICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0ICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfbGlicmFyeSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X2RlZmF1bHRzICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9nZXRfc3RhY2tzaXplICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9nZXRfc3RhY2tzaXplX3MgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2dldF9ibG9ja3RpbWUgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2dldF9saWJyYXJ5ICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfYWZmaW5pdHkgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2dldF9hZmZpbml0eSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzayApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX21hbGxvYyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfY2FsbG9jICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9yZWFsbG9jICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9mcmVlICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfd2FybmluZ3Nfb24gKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF93YXJuaW5nc19vZmYgKQorIURJUiQgRU5ESUYKKyFESVIkIEVORElGCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcC5oIGIvZmluYWwvcnVudGltZS9zcmMva21wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVkZDEwZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcC5oCkBAIC0wLDAgKzEsMzQzOSBAQAorLyohIFxmaWxlICovCisvKgorICoga21wLmggLS0gS1BUUyBydW50aW1lIGhlYWRlciBmaWxlLgorICogJFJldmlzaW9uOiA0MjgxNiAkCisgKiAkRGF0ZTogMjAxMy0xMS0xMSAxNTozMzozNyAtMDYwMCAoTW9uLCAxMSBOb3YgMjAxMykgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIEtNUF9ICisjZGVmaW5lIEtNUF9ICisKKy8qICNkZWZpbmUgQlVJTERfUEFSQUxMRUxfT1JERVJFRCAxICovCisKKy8qIFRoaXMgZml4IHJlcGxhY2VzIGdldHRpbWVvZmRheSB3aXRoIGNsb2NrX2dldHRpbWUgZm9yIGJldHRlciBzY2FsYWJpbGl0eSBvbgorICAgdGhlIEFsdGl4LiAgUmVxdWlyZXMgdXNlciBjb2RlIHRvIGJlIGxpbmtlZCB3aXRoIC1scnQuCisqLworLy8jZGVmaW5lIEZJWF9TR0lfQ0xPQ0sKKworLyogRGVmaW5lcyBmb3IgT3Blbk1QIDMuMCB0YXNraW5nIGFuZCBhdXRvIHNjaGVkdWxpbmcgKi8KKworI2lmIE9NUF8zMF9FTkFCTEVECisKKyMgaWZuZGVmIEtNUF9TVEFUSUNfU1RFQUxfRU5BQkxFRAorIyAgZGVmaW5lIEtNUF9TVEFUSUNfU1RFQUxfRU5BQkxFRCAxCisjIGVuZGlmCisKKyNkZWZpbmUgVEFTS19DVVJSRU5UX05PVF9RVUVVRUQgIDAKKyNkZWZpbmUgVEFTS19DVVJSRU5UX1FVRVVFRCAgICAgIDEKKworI2RlZmluZSBUQVNLX0RFUVVFX0JJVFMgICAgICAgICAgOCAgLy8gVXNlZCBzb2xlbHkgdG8gZGVmaW5lIFRBU0tfREVRVUVfU0laRSBhbmQgVEFTS19ERVFVRV9NQVNLLgorI2RlZmluZSBUQVNLX0RFUVVFX1NJWkUgICAgICAgICAgKCAxIDw8IFRBU0tfREVRVUVfQklUUyApCisjZGVmaW5lIFRBU0tfREVRVUVfTUFTSyAgICAgICAgICAoIFRBU0tfREVRVUVfU0laRSAtIDEgKQorCisjaWZkZWYgQlVJTERfVElFRF9UQVNLX1NUQUNLCisjZGVmaW5lIFRBU0tfU1RBQ0tfRU1QVFkgICAgICAgICAwICAvLyBlbnRyaWVzIHdoZW4gdGhlIHN0YWNrIGlzIGVtcHR5CisKKyNkZWZpbmUgVEFTS19TVEFDS19CTE9DS19CSVRTICAgIDUgIC8vIFVzZWQgdG8gZGVmaW5lIFRBU0tfU1RBQ0tfU0laRSBhbmQgVEFTS19TVEFDS19NQVNLCisjZGVmaW5lIFRBU0tfU1RBQ0tfQkxPQ0tfU0laRSAgICAoIDEgPDwgVEFTS19TVEFDS19CTE9DS19CSVRTICkgLy8gTnVtYmVyIG9mIGVudHJpZXMgaW4gZWFjaCB0YXNrIHN0YWNrIGFycmF5CisjZGVmaW5lIFRBU0tfU1RBQ0tfSU5ERVhfTUFTSyAgICAoIFRBU0tfU1RBQ0tfQkxPQ0tfU0laRSAtIDEgKSAgLy8gTWFzayBmb3IgZGV0ZXJtaW5pbmcgaW5kZXggaW50byBzdGFjayBibG9jaworI2VuZGlmIC8vIEJVSUxEX1RJRURfVEFTS19TVEFDSworCisjZGVmaW5lIFRBU0tfTk9UX1BVU0hFRCAgICAgICAgICAxCisjZGVmaW5lIFRBU0tfU1VDQ0VTU0ZVTExZX1BVU0hFRCAwCisjZGVmaW5lIFRBU0tfVElFRCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFRBU0tfVU5USUVEICAgICAgICAgICAgICAwCisjZGVmaW5lIFRBU0tfRVhQTElDSVQgICAgICAgICAgICAxCisjZGVmaW5lIFRBU0tfSU1QTElDSVQgICAgICAgICAgICAwCisKKyNlbmRpZiAgLy8gT01QXzMwX0VOQUJMRUQKKworI2RlZmluZSBLTVBfQ0FOQ0VMX1RIUkVBRFMKKyNkZWZpbmUgS01QX1RIUkVBRF9BVFRSCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorLyogIGluY2x1ZGUgPGN0eXBlLmg+IGRvbid0IHVzZTsgcHJvYmxlbXMgd2l0aCAvTUQgb24gV2luZG93cyogT1MgTlQgZHVlIHRvIGJhZCBNaWNyb3NvZnQgbGlicmFyeSAgKi8KKy8qICBzb21lIG1hY3JvcyBwcm92aWRlZCBiZWxvdyB0byByZXBsYWNlIHNvbWUgb2YgdGhlc2UgZnVuY3Rpb25zICAqLworI2lmbmRlZiBfX0FCU09GVF9XSU4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlICJrbXBfb3MuaCIKKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyNpbmNsdWRlIDx4bW1pbnRyaW4uaD4KKyNlbmRpZgorCisjaW5jbHVkZSAia21wX3ZlcnNpb24uaCIKKyNpbmNsdWRlICJrbXBfZGVidWcuaCIKKyNpbmNsdWRlICJrbXBfbG9jay5oIgorI2luY2x1ZGUgImttcF9pMThuLmgiCisKKyNkZWZpbmUgS01QX0hBTkRMRV9TSUdOQUxTIChLTVBfT1NfTElOVVggfHwgS01QX09TX0ZSRUVCU0QgfHwgS01QX09TX1dJTkRPV1MgfHwgS01QX09TX0RBUldJTikKKworI2lmZGVmIEtNUF9TRVRWRVJTSU9OCisvKiAgZnJvbSBmYWN0b3J5L0luY2x1ZGUsIHRvIGdldCBWRVJTSU9OX1NUUklORyBlbWJlZGRlZCBmb3IgJ3doYXQnICAqLworI2luY2x1ZGUgImthaWNvbmZpZy5oIgorI2luY2x1ZGUgImV5ZS5oIgorI2luY2x1ZGUgIm93bi5oIgorI2luY2x1ZGUgInNldHZlcnNpb24uaCIKKyNlbmRpZgorCisjaW5jbHVkZSAia21wX3dyYXBwZXJfbWFsbG9jLmgiCisjaWYgS01QX09TX1VOSVgKKyMgaW5jbHVkZSA8dW5pc3RkLmg+CisjIGlmICFkZWZpbmVkIE5TSUcgJiYgZGVmaW5lZCBfTlNJRworIyAgZGVmaW5lIE5TSUcgX05TSUcKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgS01QX09TX0xJTlVYCisjIHByYWdtYSB3ZWFrIGNsb2NrX2dldHRpbWUKKyNlbmRpZgorCisvKlNlbGVjdCBkYXRhIHBsYWNlbWVudCBpbiBOVU1BIG1lbW9yeSAqLworI2RlZmluZSBOT19GSVJTVF9UT1VDSCAwCisjZGVmaW5lIEZJUlNUX1RPVUNIIDEgICAgICAgLyogRXhwbG9pdCBTR0kncyBmaXJzdCB0b3VjaCBwYWdlIHBsYWNlbWVudCBhbGdvICovCisKKy8qIElmIG5vdCBzcGVjaWZpZWQgb24gY29tcGlsZSBjb21tYW5kIGxpbmUsIGFzc3VtZSBubyBmaXJzdCB0b3VjaCAqLworI2lmbmRlZiBCVUlMRF9NRU1PUlkKKyNkZWZpbmUgQlVJTERfTUVNT1JZIE5PX0ZJUlNUX1RPVUNICisjZW5kaWYKKworLy8gMCAtIG5vIGZhc3QgbWVtb3J5IGFsbG9jYXRpb24sIGFsaWdubWVudDogOC1ieXRlIG9uIHg4NiwgMTYtYnl0ZSBvbiB4NjQuCisvLyAzIC0gZmFzdCBhbGxvY2F0aW9uIHVzaW5nIHN5bmMsIG5vbi1zeW5jIGZyZWUgbGlzdHMgb2YgYW55IHNpemUsIG5vbi1zZWxmIGZyZWUgbGlzdHMgb2YgbGltaXRlZCBzaXplLgorI2lmbmRlZiBVU0VfRkFTVF9NRU1PUlkKKyNkZWZpbmUgVVNFX0ZBU1RfTUVNT1JZIDMKKyNlbmRpZgorCisvLyBBc3N1bWUgdXNpbmcgQkdFVCBjb21wYXJlX2V4Y2hhbmdlIGluc3RydWN0aW9uIGluc3RlYWQgb2YgbG9jayBieSBkZWZhdWx0LgorI2lmbmRlZiBVU0VfQ01QX1hDSEdfRk9SX0JHRVQKKyNkZWZpbmUgVVNFX0NNUF9YQ0hHX0ZPUl9CR0VUIDEKKyNlbmRpZgorCisvLyBUZXN0IHRvIHNlZSBpZiBxdWV1aW5nIGxvY2sgaXMgYmV0dGVyIHRoYW4gYm9vdHN0cmFwIGxvY2sgZm9yIGJnZXQKKy8vICNpZm5kZWYgVVNFX1FVRVVJTkdfTE9DS19GT1JfQkdFVAorLy8gI2RlZmluZSBVU0VfUVVFVUlOR19MT0NLX0ZPUl9CR0VUCisvLyAjZW5kaWYKKworI2lmbmRlZiBOU0VDX1BFUl9TRUMKKyMgZGVmaW5lIE5TRUNfUEVSX1NFQyAxMDAwMDAwMDAwTAorI2VuZGlmCisKKyNpZm5kZWYgVVNFQ19QRVJfU0VDCisjIGRlZmluZSBVU0VDX1BFUl9TRUMgMTAwMDAwMEwKKyNlbmRpZgorCisvLyBGb3IgZXJyb3IgbWVzc2FnZXMKKyNkZWZpbmUgS01QX0lPTVBfTkFNRSAgICAgICAiSW50ZWwoUikgT01QIgorCisvKiEKK0Bpbmdyb3VwIEJBU0lDX1RZUEVTCitAeworKi8KKworLy8gRklYTUUgRE9YWUdFTi4uLiBuZWVkIHRvIGdyb3VwIHRoZXNlIGZsYWdzIHNvbWVob3cgKE1ha2luZyB0aGVtIGFuIGFub255bW91cyBlbnVtIHdvdWxkIGRvIGl0Li4uKQorLyohCitWYWx1ZXMgZm9yIGJpdCBmbGFncyB1c2VkIGluIHRoZSBpZGVudF90IHRvIGRlc2NyaWJlIHRoZSBmaWVsZHMuCisqLworLyohIFVzZSB0cmFtcG9saW5lIGZvciBpbnRlcm5hbCBtaWNyb3Rhc2tzICovCisjZGVmaW5lIEtNUF9JREVOVF9JTUIgICAgICAgICAgICAgMHgwMQorLyohIFVzZSBjLXN0eWxlIGlkZW50IHN0cnVjdHVyZSAqLworI2RlZmluZSBLTVBfSURFTlRfS01QQyAgICAgICAgICAgIDB4MDIKKy8qIDB4MDQgaXMgbm8gbG9uZ2VyIHVzZWQgKi8KKy8qISBFbnRyeSBwb2ludCBnZW5lcmF0ZWQgYnkgYXV0by1wYXJhbGxlbGl6YXRpb24gKi8KKyNkZWZpbmUgS01QX0lERU5UX0FVVE9QQVIgICAgICAgICAweDA4CisvKiEgQ29tcGlsZXIgZ2VuZXJhdGVzIGF0b21pYyByZWR1Y3Rpb24gb3B0aW9uIGZvciBrbXBjX3JlZHVjZSogKi8KKyNkZWZpbmUgS01QX0lERU5UX0FUT01JQ19SRURVQ0UgICAweDEwCisvKiEgVG8gbWFyayBhICdiYXJyaWVyJyBkaXJlY3RpdmUgaW4gdXNlciBjb2RlICovCisjZGVmaW5lIEtNUF9JREVOVF9CQVJSSUVSX0VYUEwgICAgMHgyMAorLyohIFRvIE1hcmsgaW1wbGljaXQgYmFycmllcnMuICovCisjZGVmaW5lIEtNUF9JREVOVF9CQVJSSUVSX0lNUEwgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBLTVBfSURFTlRfQkFSUklFUl9JTVBMX01BU0sgICAgICAweDAxQzAKKyNkZWZpbmUgS01QX0lERU5UX0JBUlJJRVJfSU1QTF9GT1IgICAgICAgMHgwMDQwCisjZGVmaW5lIEtNUF9JREVOVF9CQVJSSUVSX0lNUExfU0VDVElPTlMgIDB4MDBDMAorCisjZGVmaW5lIEtNUF9JREVOVF9CQVJSSUVSX0lNUExfU0lOR0xFICAgIDB4MDE0MAorI2RlZmluZSBLTVBfSURFTlRfQkFSUklFUl9JTVBMX1dPUktTSEFSRSAweDAxQzAKKworLyohCisgKiBUaGUgaWRlbnQgc3RydWN0dXJlIHRoYXQgZGVzY3JpYmVzIGEgc291cmNlIGxvY2F0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdCBpZGVudCB7CisgICAga21wX2ludDMyIHJlc2VydmVkXzE7ICAgLyoqPCAgbWlnaHQgYmUgdXNlZCBpbiBGb3J0cmFuOyBzZWUgYWJvdmUgICovCisgICAga21wX2ludDMyIGZsYWdzOyAgICAgICAgLyoqPCAgYWxzbyBmLmZsYWdzOyBLTVBfSURFTlRfeHh4IGZsYWdzOyBLTVBfSURFTlRfS01QQyBpZGVudGlmaWVzIHRoaXMgdW5pb24gbWVtYmVyICAqLworICAgIGttcF9pbnQzMiByZXNlcnZlZF8yOyAgIC8qKjwgIG5vdCByZWFsbHkgdXNlZCBpbiBGb3J0cmFuIGFueSBtb3JlOyBzZWUgYWJvdmUgKi8KKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJ1dCBjdXJyZW50bHkgdXNlZCBmb3Igc3RvcmluZyByZWdpb24tc3BlY2lmaWMgSVRUICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGNvbnRleHR1YWwgaW5mb3JtYXRpb24uICovCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgIGttcF9pbnQzMiByZXNlcnZlZF8zOyAgIC8qKjwgc291cmNlWzRdIGluIEZvcnRyYW4sIGRvIG5vdCB1c2UgZm9yIEMrKyAgKi8KKyAgICBjaGFyIGNvbnN0ICpwc291cmNlOyAgICAvKio8IFN0cmluZyBkZXNjcmliaW5nIHRoZSBzb3VyY2UgbG9jYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHN0cmluZyBpcyBjb21wb3NlZCBvZiBzZW1pLWNvbG9uIHNlcGFyYXRlZCBmaWVsZHMgd2hpY2ggZGVzY3JpYmUgdGhlIHNvdXJjZSBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmdW5jdGlvbiBhbmQgYSBwYWlyIG9mIGxpbmUgbnVtYmVycyB0aGF0IGRlbGltaXQgdGhlIGNvbnN0cnVjdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK30gaWRlbnRfdDsKKy8qIQorQH0KKyovCisKKy8vIFNvbWUgZm9yd2FyZCBkZWNsYXJhdGlvbnMuCisKK3R5cGVkZWYgdW5pb24gIGttcF90ZWFtICAgICAga21wX3RlYW1fdDsKK3R5cGVkZWYgc3RydWN0IGttcF90YXNrZGF0YSAga21wX3Rhc2tkYXRhX3Q7Cit0eXBlZGVmIHVuaW9uICBrbXBfdGFza190ZWFtIGttcF90YXNrX3RlYW1fdDsKK3R5cGVkZWYgdW5pb24gIGttcF90ZWFtICAgICAga21wX3RlYW1fcDsKK3R5cGVkZWYgdW5pb24gIGttcF9pbmZvICAgICAga21wX2luZm9fcDsKK3R5cGVkZWYgdW5pb24gIGttcF9yb290ICAgICAga21wX3Jvb3RfcDsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFBhY2sgdHdvIDMyLWJpdCBzaWduZWQgaW50ZWdlcnMgaW50byBhIDY0LWJpdCBzaWduZWQgaW50ZWdlciAqLworLyogVG9EbzogRml4IHdvcmQgb3JkZXJpbmcgZm9yIGJpZy1lbmRpYW4gbWFjaGluZXMuICovCisjZGVmaW5lIEtNUF9QQUNLXzY0KEhJR0hfMzIsTE9XXzMyKSBcCisgICAgKCAoa21wX2ludDY0KSAoKCgoa21wX3VpbnQ2NCkoSElHSF8zMikpPDwzMikgfCAoa21wX3VpbnQ2NCkoTE9XXzMyKSkgKQorCisKKy8qCisgKiBHZW5lcmljIHN0cmluZyBtYW5pcHVsYXRpb24gbWFjcm9zLgorICogQXNzdW1lIHRoYXQgX3ggaXMgb2YgdHlwZSBjaGFyICoKKyAqLworI2RlZmluZSBTS0lQX1dTKF94KSAgICAgeyB3aGlsZSAoKihfeCkgPT0gJyAnIHx8ICooX3gpID09ICdcdCcpIChfeCkrKzsgfQorI2RlZmluZSBTS0lQX0RJR0lUUyhfeCkgeyB3aGlsZSAoKihfeCkgPj0gJzAnICYmICooX3gpIDw9ICc5JykgKF94KSsrOyB9CisjZGVmaW5lIFNLSVBfVE8oX3gsX2MpICB7IHdoaWxlICgqKF94KSAhPSAnXDAnICYmICooX3gpICE9IChfYykpIChfeCkrKzsgfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEtNUF9NQVgoIHgsIHkgKSAoICh4KSA+ICh5KSA/ICh4KSA6ICh5KSApCisjZGVmaW5lIEtNUF9NSU4oIHgsIHkgKSAoICh4KSA8ICh5KSA/ICh4KSA6ICh5KSApCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworLyogRW51bWVyYXRpb24gdHlwZXMgKi8KKworZW51bSBrbXBfc3RhdGVfdGltZXIgeworICAgIHRzX3N0b3AsCisgICAgdHNfc3RhcnQsCisgICAgdHNfcGF1c2UsCisKKyAgICB0c19sYXN0X3N0YXRlCit9OworCitlbnVtIGR5bmFtaWNfbW9kZSB7CisgICAgZHluYW1pY19kZWZhdWx0LAorI2lmZGVmIFVTRV9MT0FEX0JBTEFOQ0UKKyAgICBkeW5hbWljX2xvYWRfYmFsYW5jZSwKKyNlbmRpZiAvKiBVU0VfTE9BRF9CQUxBTkNFICovCisgICAgZHluYW1pY19yYW5kb20sCisgICAgZHluYW1pY190aHJlYWRfbGltaXQsCisgICAgZHluYW1pY19tYXgKK307CisKKy8qIGV4dGVybmFsIHNjaGVkdWxlIGNvbnN0YW50cywgZHVwbGljYXRlIGVudW0gb21wX3NjaGVkIGluIG9tcC5oIGluIG9yZGVyIHRvIG5vdCBpbmNsdWRlIGl0IGhlcmUgKi8KKyNpZm5kZWYgS01QX1NDSEVEX1RZUEVfREVGSU5FRAorI2RlZmluZSBLTVBfU0NIRURfVFlQRV9ERUZJTkVECit0eXBlZGVmIGVudW0ga21wX3NjaGVkIHsKKyAgICBrbXBfc2NoZWRfbG93ZXIgICAgICAgICAgICAgPSAwLCAgICAgLy8gbG93ZXIgYW5kIHVwcGVyIGJvdW5kcyBhcmUgZm9yIHJvdXRpbmUgcGFyYW1ldGVyIGNoZWNrCisgICAgLy8gTm90ZTogbmVlZCB0byBhZGp1c3QgX19rbXBfc2NoX21hcCBnbG9iYWwgYXJyYXkgaW4gY2FzZSB0aGlzIGVudW0gaXMgY2hhbmdlZAorICAgIGttcF9zY2hlZF9zdGF0aWMgICAgICAgICAgICA9IDEsICAgICAvLyBtYXBwZWQgdG8ga21wX3NjaF9zdGF0aWNfY2h1bmtlZCAgICAgICAgICAgKDMzKQorICAgIGttcF9zY2hlZF9keW5hbWljICAgICAgICAgICA9IDIsICAgICAvLyBtYXBwZWQgdG8ga21wX3NjaF9keW5hbWljX2NodW5rZWQgICAgICAgICAgKDM1KQorICAgIGttcF9zY2hlZF9ndWlkZWQgICAgICAgICAgICA9IDMsICAgICAvLyBtYXBwZWQgdG8ga21wX3NjaF9ndWlkZWRfY2h1bmtlZCAgICAgICAgICAgKDM2KQorICAgIGttcF9zY2hlZF9hdXRvICAgICAgICAgICAgICA9IDQsICAgICAvLyBtYXBwZWQgdG8ga21wX3NjaF9hdXRvICAgICAgICAgICAgICAgICAgICAgKDM4KQorICAgIGttcF9zY2hlZF91cHBlcl9zdGQgICAgICAgICA9IDUsICAgICAvLyB1cHBlciBib3VuZCBmb3Igc3RhbmRhcmQgc2NoZWR1bGVzCisgICAga21wX3NjaGVkX2xvd2VyX2V4dCAgICAgICAgID0gMTAwLCAgIC8vIGxvd2VyIGJvdW5kIG9mIEludGVsIGV4dGVuc2lvbiBzY2hlZHVsZXMKKyAgICBrbXBfc2NoZWRfdHJhcGV6b2lkYWwgICAgICAgPSAxMDEsICAgLy8gbWFwcGVkIHRvIGttcF9zY2hfdHJhcGV6b2lkYWwgICAgICAgICAgICAgICgzOSkKKy8vICBrbXBfc2NoZWRfc3RhdGljX3N0ZWFsICAgICAgPSAxMDIsICAgLy8gbWFwcGVkIHRvIGttcF9zY2hfc3RhdGljX3N0ZWFsICAgICAgICAgICAgICg0NCkKKyAgICBrbXBfc2NoZWRfdXBwZXIgICAgICAgICAgICAgPSAxMDIsCisgICAga21wX3NjaGVkX2RlZmF1bHQgPSBrbXBfc2NoZWRfc3RhdGljIC8vIGRlZmF1bHQgc2NoZWR1bGluZworfSBrbXBfc2NoZWRfdDsKKyNlbmRpZgorCisvKiEKKyBAaW5ncm91cCBXT1JLX1NIQVJJTkcKKyAqIERlc2NyaWJlcyB0aGUgbG9vcCBzY2hlZHVsZSB0byBiZSB1c2VkIGZvciBhIHBhcmFsbGVsIGZvciBsb29wLgorICovCitlbnVtIHNjaGVkX3R5cGUgeworICAgIGttcF9zY2hfbG93ZXIgICAgICAgICAgICAgICAgICAgICA9IDMyLCAgIC8qKjwgbG93ZXIgYm91bmQgZm9yIHVub3JkZXJlZCB2YWx1ZXMgKi8KKyAgICBrbXBfc2NoX3N0YXRpY19jaHVua2VkICAgICAgICAgICAgPSAzMywKKyAgICBrbXBfc2NoX3N0YXRpYyAgICAgICAgICAgICAgICAgICAgPSAzNCwgICAvKio8IHN0YXRpYyB1bnNwZWNpYWxpemVkICovCisgICAga21wX3NjaF9keW5hbWljX2NodW5rZWQgICAgICAgICAgID0gMzUsCisgICAga21wX3NjaF9ndWlkZWRfY2h1bmtlZCAgICAgICAgICAgID0gMzYsICAgLyoqPCBndWlkZWQgdW5zcGVjaWFsaXplZCAqLworICAgIGttcF9zY2hfcnVudGltZSAgICAgICAgICAgICAgICAgICA9IDM3LAorICAgIGttcF9zY2hfYXV0byAgICAgICAgICAgICAgICAgICAgICA9IDM4LCAgIC8qKjwgYXV0byAqLworICAgIGttcF9zY2hfdHJhcGV6b2lkYWwgICAgICAgICAgICAgICA9IDM5LAorCisgICAgLyogYWNjZXNzaWJsZSBvbmx5IHRocm91Z2ggS01QX1NDSEVEVUxFIGVudmlyb25tZW50IHZhcmlhYmxlICovCisgICAga21wX3NjaF9zdGF0aWNfZ3JlZWR5ICAgICAgICAgICAgID0gNDAsCisgICAga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQgICAgICAgICAgID0gNDEsCisgICAgLyogYWNjZXNzaWJsZSBvbmx5IHRocm91Z2ggS01QX1NDSEVEVUxFIGVudmlyb25tZW50IHZhcmlhYmxlICovCisgICAga21wX3NjaF9ndWlkZWRfaXRlcmF0aXZlX2NodW5rZWQgID0gNDIsCisgICAga21wX3NjaF9ndWlkZWRfYW5hbHl0aWNhbF9jaHVua2VkID0gNDMsCisKKyAgICBrbXBfc2NoX3N0YXRpY19zdGVhbCAgICAgICAgICAgICAgPSA0NCwgICAvKio8IGFjY2Vzc2libGUgb25seSB0aHJvdWdoIEtNUF9TQ0hFRFVMRSBlbnZpcm9ubWVudCB2YXJpYWJsZSAqLworCisgICAgLyogYWNjZXNzaWJsZSBvbmx5IHRocm91Z2ggS01QX1NDSEVEVUxFIGVudmlyb25tZW50IHZhcmlhYmxlICovCisgICAga21wX3NjaF91cHBlciAgICAgICAgICAgICAgICAgICAgID0gNDUsICAgLyoqPCB1cHBlciBib3VuZCBmb3IgdW5vcmRlcmVkIHZhbHVlcyAqLworCisgICAga21wX29yZF9sb3dlciAgICAgICAgICAgICAgICAgICAgID0gNjQsICAgLyoqPCBsb3dlciBib3VuZCBmb3Igb3JkZXJlZCB2YWx1ZXMsIG11c3QgYmUgcG93ZXIgb2YgMiAqLworICAgIGttcF9vcmRfc3RhdGljX2NodW5rZWQgICAgICAgICAgICA9IDY1LAorICAgIGttcF9vcmRfc3RhdGljICAgICAgICAgICAgICAgICAgICA9IDY2LCAgIC8qKjwgb3JkZXJlZCBzdGF0aWMgdW5zcGVjaWFsaXplZCAqLworICAgIGttcF9vcmRfZHluYW1pY19jaHVua2VkICAgICAgICAgICA9IDY3LAorICAgIGttcF9vcmRfZ3VpZGVkX2NodW5rZWQgICAgICAgICAgICA9IDY4LAorICAgIGttcF9vcmRfcnVudGltZSAgICAgICAgICAgICAgICAgICA9IDY5LAorICAgIGttcF9vcmRfYXV0byAgICAgICAgICAgICAgICAgICAgICA9IDcwLCAgIC8qKjwgb3JkZXJlZCBhdXRvICovCisgICAga21wX29yZF90cmFwZXpvaWRhbCAgICAgICAgICAgICAgID0gNzEsCisgICAga21wX29yZF91cHBlciAgICAgICAgICAgICAgICAgICAgID0gNzIsICAgLyoqPCB1cHBlciBib3VuZCBmb3Igb3JkZXJlZCB2YWx1ZXMgKi8KKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgLyogU2NoZWR1bGVzIGZvciBEaXN0cmlidXRlIGNvbnN0cnVjdCAqLworICAgIGttcF9kaXN0cmlidXRlX3N0YXRpY19jaHVua2VkICAgICA9IDkxLCAgIC8qKjwgZGlzdHJpYnV0ZSBzdGF0aWMgY2h1bmtlZCAqLworICAgIGttcF9kaXN0cmlidXRlX3N0YXRpYyAgICAgICAgICAgICA9IDkyLCAgIC8qKjwgZGlzdHJpYnV0ZSBzdGF0aWMgdW5zcGVjaWFsaXplZCAqLworI2VuZGlmCisKKyAgICAvKgorICAgICAqIEZvciB0aGUgIm5vbWVyZ2UiIHZlcnNpb25zLCBrbXBfZGlzcGF0Y2hfbmV4dCooKSB3aWxsIGFsd2F5cyByZXR1cm4KKyAgICAgKiBhIHNpbmdsZSBpdGVyYXRpb24vY2h1bmssIGV2ZW4gaWYgdGhlIGxvb3AgaXMgc2VyaWFsaXplZC4gIEZvciB0aGUKKyAgICAgKiBzY2hlZHVsZSB0eXBlcyBsaXN0ZWQgYWJvdmUsIHRoZSBlbnRpcmUgaXRlcmF0aW9uIHZlY3RvciBpcyByZXR1cm5lZAorICAgICAqIGlmIHRoZSBsb29wIGlzIHNlcmlhbGl6ZWQuICBUaGlzIGRvZXNuJ3Qgd29yayBmb3IgZ2NjL2djb21wIHNlY3Rpb25zLgorICAgICAqLworICAgIGttcF9ubV9sb3dlciAgICAgICAgICAgICAgICAgICAgICA9IDE2MCwgIC8qKjwgbG93ZXIgYm91bmQgZm9yIG5vbWVyZ2UgdmFsdWVzICovCisKKyAgICBrbXBfbm1fc3RhdGljX2NodW5rZWQgICAgICAgICAgICAgPSAoa21wX3NjaF9zdGF0aWNfY2h1bmtlZCAtIGttcF9zY2hfbG93ZXIgKyBrbXBfbm1fbG93ZXIpLAorICAgIGttcF9ubV9zdGF0aWMgICAgICAgICAgICAgICAgICAgICA9IDE2MiwgIC8qKjwgc3RhdGljIHVuc3BlY2lhbGl6ZWQgKi8KKyAgICBrbXBfbm1fZHluYW1pY19jaHVua2VkICAgICAgICAgICAgPSAxNjMsCisgICAga21wX25tX2d1aWRlZF9jaHVua2VkICAgICAgICAgICAgID0gMTY0LCAgLyoqPCBndWlkZWQgdW5zcGVjaWFsaXplZCAqLworICAgIGttcF9ubV9ydW50aW1lICAgICAgICAgICAgICAgICAgICA9IDE2NSwKKyAgICBrbXBfbm1fYXV0byAgICAgICAgICAgICAgICAgICAgICAgPSAxNjYsICAvKio8IGF1dG8gKi8KKyAgICBrbXBfbm1fdHJhcGV6b2lkYWwgICAgICAgICAgICAgICAgPSAxNjcsCisKKyAgICAvKiBhY2Nlc3NpYmxlIG9ubHkgdGhyb3VnaCBLTVBfU0NIRURVTEUgZW52aXJvbm1lbnQgdmFyaWFibGUgKi8KKyAgICBrbXBfbm1fc3RhdGljX2dyZWVkeSAgICAgICAgICAgICAgPSAxNjgsCisgICAga21wX25tX3N0YXRpY19iYWxhbmNlZCAgICAgICAgICAgID0gMTY5LAorICAgIC8qIGFjY2Vzc2libGUgb25seSB0aHJvdWdoIEtNUF9TQ0hFRFVMRSBlbnZpcm9ubWVudCB2YXJpYWJsZSAqLworICAgIGttcF9ubV9ndWlkZWRfaXRlcmF0aXZlX2NodW5rZWQgICA9IDE3MCwKKyAgICBrbXBfbm1fZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZCAgPSAxNzEsCisgICAga21wX25tX3N0YXRpY19zdGVhbCAgICAgICAgICAgICAgID0gMTcyLCAgLyogYWNjZXNzaWJsZSBvbmx5IHRocm91Z2ggT01QX1NDSEVEVUxFIGVudmlyb25tZW50IHZhcmlhYmxlICovCisKKyAgICBrbXBfbm1fb3JkX3N0YXRpY19jaHVua2VkICAgICAgICAgPSAxOTMsCisgICAga21wX25tX29yZF9zdGF0aWMgICAgICAgICAgICAgICAgID0gMTk0LCAgLyoqPCBvcmRlcmVkIHN0YXRpYyB1bnNwZWNpYWxpemVkICovCisgICAga21wX25tX29yZF9keW5hbWljX2NodW5rZWQgICAgICAgID0gMTk1LAorICAgIGttcF9ubV9vcmRfZ3VpZGVkX2NodW5rZWQgICAgICAgICA9IDE5NiwKKyAgICBrbXBfbm1fb3JkX3J1bnRpbWUgICAgICAgICAgICAgICAgPSAxOTcsCisgICAga21wX25tX29yZF9hdXRvICAgICAgICAgICAgICAgICAgID0gMTk4LCAgLyoqPCBhdXRvICovCisgICAga21wX25tX29yZF90cmFwZXpvaWRhbCAgICAgICAgICAgID0gMTk5LAorICAgIGttcF9ubV91cHBlciAgICAgICAgICAgICAgICAgICAgICA9IDIwMCwgIC8qKjwgdXBwZXIgYm91bmQgZm9yIG5vbWVyZ2UgdmFsdWVzICovCisKKyAgICBrbXBfc2NoX2RlZmF1bHQgPSBrbXBfc2NoX3N0YXRpYyAgLyoqPCBkZWZhdWx0IHNjaGVkdWxpbmcgYWxnb3JpdGhtICovCit9OworCisvKiBUeXBlIHRvIGtlZXAgcnVudGltZSBzY2hlZHVsZSBzZXQgdmlhIE9NUF9TQ0hFRFVMRSBvciBvbXBfc2V0X3NjaGVkdWxlKCkgKi8KK3R5cGVkZWYgc3RydWN0IGttcF9yX3NjaGVkIHsKKyAgICBlbnVtIHNjaGVkX3R5cGUgcl9zY2hlZF90eXBlOworICAgIGludCAgICAgICAgICAgICBjaHVuazsKK30ga21wX3Jfc2NoZWRfdDsKKworZXh0ZXJuIGVudW0gc2NoZWRfdHlwZSBfX2ttcF9zY2hfbWFwW107IC8vIG1hcCBPTVAgMy4wIHNjaGVkdWxlIHR5cGVzIHdpdGggb3VyIGludGVybmFsIHNjaGVkdWxlIHR5cGVzCisKK2VudW0gbGlicmFyeV90eXBlIHsKKyAgICBsaWJyYXJ5X25vbmUsCisgICAgbGlicmFyeV9zZXJpYWwsCisgICAgbGlicmFyeV90dXJuYXJvdW5kLAorICAgIGxpYnJhcnlfdGhyb3VnaHB1dAorfTsKKworI2lmIEtNUF9PU19MSU5VWAorZW51bSBjbG9ja19mdW5jdGlvbl90eXBlIHsKKyAgICBjbG9ja19mdW5jdGlvbl9nZXR0aW1lb2ZkYXksCisgICAgY2xvY2tfZnVuY3Rpb25fY2xvY2tfZ2V0dGltZQorfTsKKyNlbmRpZiAvKiBLTVBfT1NfTElOVVggKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLSBmYXN0IHJlZHVjdGlvbiBzdHVmZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI3VuZGVmIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisjZGVmaW5lIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSIDEKKworI3VuZGVmIEtNUF9GQVNUX1JFRFVDVElPTl9DT1JFX0RVTworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyAgICAjZGVmaW5lIEtNUF9GQVNUX1JFRFVDVElPTl9DT1JFX0RVTyAxCisjZW5kaWYKKworZW51bSBfcmVkdWN0aW9uX21ldGhvZCB7CisgICAgcmVkdWN0aW9uX21ldGhvZF9ub3RfZGVmaW5lZCA9IDAsCisgICAgY3JpdGljYWxfcmVkdWNlX2Jsb2NrICAgICAgICA9ICggMSA8PCA4ICksCisgICAgYXRvbWljX3JlZHVjZV9ibG9jayAgICAgICAgICA9ICggMiA8PCA4ICksCisgICAgdHJlZV9yZWR1Y2VfYmxvY2sgICAgICAgICAgICA9ICggMyA8PCA4ICksCisgICAgZW1wdHlfcmVkdWNlX2Jsb2NrICAgICAgICAgICA9ICggNCA8PCA4ICkKK307CisKKy8vIGRlc2NyaXB0aW9uIG9mIHRoZSBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCB2YXJpYWJsZQorLy8gdGhlIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kIHZhcmlhYmxlIGNvbnNpc3RzIG9mIHR3byBlbnVtIHR5cGVzIHZhcmlhYmxlcyB0aGF0IGFyZSBwYWNrZWQgdG9nZXRoZXIgaW50byAwLXRoIGJ5dGUgYW5kIDEtc3QgYnl0ZToKKy8vIDA6ICggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgJiAweDAwMDAwMEZGICkgaXMgYSAnZW51bSBiYXJyaWVyX3R5cGUnIHZhbHVlIG9mIGJhcnJpZXIgdGhhdCB3aWxsIGJlIHVzZWQgaW4gZmFzdCByZWR1Y3Rpb246IGJzX3BsYWluX2JhcnJpZXIgb3IgYnNfcmVkdWN0aW9uX2JhcnJpZXIKKy8vIDE6ICggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgJiAweDAwMDBGRjAwICkgaXMgYSByZWR1Y3Rpb24gbWV0aG9kIHRoYXQgd2lsbCBiZSB1c2VkIGluIGZhc3QgcmVkdWN0aW9uOworLy8gcmVkdWN0aW9uIG1ldGhvZCBpcyBvZiAnZW51bSBfcmVkdWN0aW9uX21ldGhvZCcgdHlwZSBhbmQgaXQncyBkZWZpbmVkIHRoZSB3YXkgc28gdGhhdCB0aGUgYml0cyBvZiAwLXRoIGJ5dGUgYXJlIGVtcHR5LAorLy8gc28gbm8gbmVlZCB0byBleGVjdXRlIGEgc2hpZnQgaW5zdHJ1Y3Rpb24gd2hpbGUgcGFja2luZy91bnBhY2tpbmcKKworI2lmIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgI2RlZmluZSBQQUNLX1JFRFVDVElPTl9NRVRIT0RfQU5EX0JBUlJJRVIocmVkdWN0aW9uX21ldGhvZCxiYXJyaWVyX3R5cGUpIFwKKyAgICAgICAgICAgICggKCByZWR1Y3Rpb25fbWV0aG9kICkgfCAoIGJhcnJpZXJfdHlwZSApICkKKworICAgICNkZWZpbmUgVU5QQUNLX1JFRFVDVElPTl9NRVRIT0QocGFja2VkX3JlZHVjdGlvbl9tZXRob2QpIFwKKyAgICAgICAgICAgICggKCBlbnVtIF9yZWR1Y3Rpb25fbWV0aG9kICkoICggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgKSAmICggMHgwMDAwRkYwMCApICkgKQorCisgICAgI2RlZmluZSBVTlBBQ0tfUkVEVUNUSU9OX0JBUlJJRVIocGFja2VkX3JlZHVjdGlvbl9tZXRob2QpIFwKKyAgICAgICAgICAgICggKCBlbnVtIGJhcnJpZXJfdHlwZSApKCAgICAgICggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgKSAmICggMHgwMDAwMDBGRiApICkgKQorI2Vsc2UKKyAgICAjZGVmaW5lIFBBQ0tfUkVEVUNUSU9OX01FVEhPRF9BTkRfQkFSUklFUihyZWR1Y3Rpb25fbWV0aG9kLGJhcnJpZXJfdHlwZSkgXAorICAgICAgICAgICAgKCByZWR1Y3Rpb25fbWV0aG9kICkKKworICAgICNkZWZpbmUgVU5QQUNLX1JFRFVDVElPTl9NRVRIT0QocGFja2VkX3JlZHVjdGlvbl9tZXRob2QpIFwKKyAgICAgICAgICAgICggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgKQorCisgICAgI2RlZmluZSBVTlBBQ0tfUkVEVUNUSU9OX0JBUlJJRVIocGFja2VkX3JlZHVjdGlvbl9tZXRob2QpIFwKKyAgICAgICAgICAgICggYnNfcGxhaW5fYmFycmllciApCisjZW5kaWYKKworI2RlZmluZSBURVNUX1JFRFVDVElPTl9NRVRIT0QocGFja2VkX3JlZHVjdGlvbl9tZXRob2Qsd2hpY2hfcmVkdWN0aW9uX2Jsb2NrKSBcCisgICAgICAgICAgICAoICggVU5QQUNLX1JFRFVDVElPTl9NRVRIT0QoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kICkgKSA9PSAoIHdoaWNoX3JlZHVjdGlvbl9ibG9jayApICkKKworI2lmIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgI2RlZmluZSBUUkVFX1JFRFVDRV9CTE9DS19XSVRIX1JFRFVDVElPTl9CQVJSSUVSIFwKKyAgICAgICAgICAgICggUEFDS19SRURVQ1RJT05fTUVUSE9EX0FORF9CQVJSSUVSKCB0cmVlX3JlZHVjZV9ibG9jaywgYnNfcmVkdWN0aW9uX2JhcnJpZXIgKSApCisKKyAgICAjZGVmaW5lIFRSRUVfUkVEVUNFX0JMT0NLX1dJVEhfUExBSU5fQkFSUklFUiBcCisgICAgICAgICAgICAoIFBBQ0tfUkVEVUNUSU9OX01FVEhPRF9BTkRfQkFSUklFUiggdHJlZV9yZWR1Y2VfYmxvY2ssIGJzX3BsYWluX2JhcnJpZXIgKSApCisjZW5kaWYKKwordHlwZWRlZiBpbnQgUEFDS0VEX1JFRFVDVElPTl9NRVRIT0RfVDsKKworLyogLS0gZW5kIG9mIGZhc3QgcmVkdWN0aW9uIHN0dWZmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBLTVBfT1NfV0lORE9XUworIyBkZWZpbmUgVVNFX0NCTEtEQVRBCisjIHByYWdtYSB3YXJuaW5nKCBwdXNoICkKKyMgcHJhZ21hIHdhcm5pbmcoIGRpc2FibGU6IDI3MSAzMTAgKQorIyBpbmNsdWRlIDx3aW5kb3dzLmg+CisjIHByYWdtYSB3YXJuaW5nKCBwb3AgKQorI2VuZGlmCisKKyNpZiBLTVBfT1NfVU5JWAorIyBpbmNsdWRlIDxwdGhyZWFkLmg+CisjIGluY2x1ZGUgPGRsZmNuLmg+CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIE9ubHkgTGludXgqIE9TIGFuZCBXaW5kb3dzKiBPUyBzdXBwb3J0IHRocmVhZCBhZmZpbml0eS4KKyAqLworI2lmIChLTVBfT1NfTElOVVggfHwgS01QX09TX1dJTkRPV1MpICYmICFLTVBfT1NfQ05LICYmICFLTVBfQVJDSF9QUEM2NAorIyBkZWZpbmUgS01QX0FGRklOSVRZX1NVUFBPUlRFRCAxCisjZWxpZiBLTVBfT1NfREFSV0lOIHx8IEtNUF9PU19GUkVFQlNEIHx8IEtNUF9PU19DTksgfHwgS01QX0FSQ0hfUFBDNjQKKy8vIGFmZmluaXR5IG5vdCBzdXBwb3J0ZWQKKyMgZGVmaW5lIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgMAorI2Vsc2UKKyMgZXJyb3IgIlVua25vd24gb3IgdW5zdXBwb3J0ZWQgT1MiCisjZW5kaWYKKworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKworZXh0ZXJuIHNpemVfdCBfX2ttcF9hZmZpbl9tYXNrX3NpemU7CisjIGRlZmluZSBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpIChfX2ttcF9hZmZpbl9tYXNrX3NpemUgPiAwKQorIyBkZWZpbmUgS01QX0NQVV9TRVRTSVpFICAgICAgICAoX19rbXBfYWZmaW5fbWFza19zaXplICogQ0hBUl9CSVQpCisKKyMgaWYgS01QX09TX0xJTlVYCisvLworLy8gT24gTGludXgqIE9TLCB0aGUgbWFzayBpcyBhY3R1YWxseSBhIHZlY3RvciBvZiBsZW5ndGggX19rbXBfYWZmaW5fbWFza19zaXplCisvLyAoaW4gYnl0ZXMpLiAgSXQgc2hvdWxkIGJlIGFsbG9jYXRlZCBvbiBhIHdvcmQgYm91bmRhcnkuCisvLworLy8gV0FSTklORyEhISAgV2UgaGF2ZSBtYWRlIHRoZSBiYXNlIHR5cGUgb2YgdGhlIGFmZmluaXR5IG1hc2sgdW5zaWduZWQgY2hhciwKKy8vIGluIG9yZGVyIHRvIGVsaW1pbmF0ZSBhIGxvdCBvZiBjaGVja3MgdGhhdCB0aGUgdHJ1ZSBzeXN0ZW0gbWFzayBzaXplIGlzCisvLyByZWFsbHkgYSBtdWx0aXBsZSBvZiA0IGJ5dGVzIChvbiBMaW51eCogT1MpLgorLy8KKy8vIFRIRVNFIE1BQ1JPUyBXT04nVCBXT1JLIFBST1BFUkxZIE9OIEJJRyBFTkRJQU4gTUFDSElORVMhISEKKy8vCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBrbXBfYWZmaW5fbWFza190OworCisjICBkZWZpbmUgX0tNUF9DUFVfU0VUKGksbWFzaykgICAobWFza1tpL0NIQVJfQklUXSB8PSAoKChrbXBfYWZmaW5fbWFza190KTEpIDw8IChpICUgQ0hBUl9CSVQpKSkKKyMgIGRlZmluZSBLTVBfQ1BVX1NFVChpLG1hc2spICAgIF9LTVBfQ1BVX1NFVCgoaSksICgoa21wX2FmZmluX21hc2tfdCAqKShtYXNrKSkpCisjICBkZWZpbmUgX0tNUF9DUFVfSVNTRVQoaSxtYXNrKSAoISEobWFza1tpL0NIQVJfQklUXSAmICgoKGttcF9hZmZpbl9tYXNrX3QpMSkgPDwgKGkgJSBDSEFSX0JJVCkpKSkKKyMgIGRlZmluZSBLTVBfQ1BVX0lTU0VUKGksbWFzaykgIF9LTVBfQ1BVX0lTU0VUKChpKSwgKChrbXBfYWZmaW5fbWFza190ICopKG1hc2spKSkKKyMgIGRlZmluZSBfS01QX0NQVV9DTFIoaSxtYXNrKSAgIChtYXNrW2kvQ0hBUl9CSVRdICY9IH4oKChrbXBfYWZmaW5fbWFza190KTEpIDw8IChpICUgQ0hBUl9CSVQpKSkKKyMgIGRlZmluZSBLTVBfQ1BVX0NMUihpLG1hc2spICAgIF9LTVBfQ1BVX0NMUigoaSksICgoa21wX2FmZmluX21hc2tfdCAqKShtYXNrKSkpCisKKyMgIGRlZmluZSBLTVBfQ1BVX1pFUk8obWFzaykgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzaXplX3QgX19pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciAoX19pID0gMDsgX19pIDwgX19rbXBfYWZmaW5fbWFza19zaXplOyBfX2krKykgeyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICgoa21wX2FmZmluX21hc2tfdCAqKShtYXNrKSlbX19pXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfQorCisjICBkZWZpbmUgS01QX0NQVV9DT1BZKGRlc3QsIHNyYykgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzaXplX3QgX19pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciAoX19pID0gMDsgX19pIDwgX19rbXBfYWZmaW5fbWFza19zaXplOyBfX2krKykgeyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICgoa21wX2FmZmluX21hc2tfdCAqKShkZXN0KSlbX19pXSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICA9ICgoa21wX2FmZmluX21hc2tfdCAqKShzcmMpKVtfX2ldOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9CisKKyMgIGRlZmluZSBLTVBfQ1BVX0NPTVBMRU1FTlQobWFzaykgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzaXplX3QgX19pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciAoX19pID0gMDsgX19pIDwgX19rbXBfYWZmaW5fbWFza19zaXplOyBfX2krKykgeyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICgoa21wX2FmZmluX21hc2tfdCAqKShtYXNrKSlbX19pXSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICA9IH4oKGttcF9hZmZpbl9tYXNrX3QgKikobWFzaykpW19faV07ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9CisKKyMgIGRlZmluZSBLTVBfQ1BVX1VOSU9OKGRlc3QsIHNyYykgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzaXplX3QgX19pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciAoX19pID0gMDsgX19pIDwgX19rbXBfYWZmaW5fbWFza19zaXplOyBfX2krKykgeyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICgoa21wX2FmZmluX21hc2tfdCAqKShkZXN0KSlbX19pXSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICB8PSAoKGttcF9hZmZpbl9tYXNrX3QgKikoc3JjKSlbX19pXTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9CisKKyMgZW5kaWYgLyogS01QX09TX0xJTlVYICovCisKKyMgaWYgS01QX09TX1dJTkRPV1MKKy8vCisvLyBPbiBXaW5kb3dzKiBPUywgdGhlIG1hc2sgc2l6ZSBpcyA0IGJ5dGVzIGZvciBJQS0zMiBhcmNoaXRlY3R1cmUsIGFuZCBvbgorLy8gSW50ZWwoUikgNjQgaXQgaXMgOCBieXRlcyB0aW1lcyB0aGUgbnVtYmVyIG9mIHByb2Nlc3NvciBncm91cHMuCisvLworCisjICBpZiBLTVBfQVJDSF9YODZfNjQKKwordHlwZWRlZiBzdHJ1Y3QgR1JPVVBfQUZGSU5JVFkgeworICAgIEtBRkZJTklUWSBtYXNrOworICAgIFdPUkQgZ3JvdXA7CisgICAgV09SRCByZXNlcnZlZFszXTsKK30gR1JPVVBfQUZGSU5JVFk7CisKK3R5cGVkZWYgRFdPUkRfUFRSIGttcF9hZmZpbl9tYXNrX3Q7CisKK2V4dGVybiBpbnQgX19rbXBfbnVtX3Byb2NfZ3JvdXBzOworCisjICAgZGVmaW5lIF9LTVBfQ1BVX1NFVChpLG1hc2spIFwKKyAgICAgICAgKG1hc2tbaS8oQ0hBUl9CSVQgKiBzaXplb2Yoa21wX2FmZmluX21hc2tfdCkpXSB8PSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKChrbXBfYWZmaW5fbWFza190KTEpIDw8IChpICUgKENIQVJfQklUICogc2l6ZW9mKGttcF9hZmZpbl9tYXNrX3QpKSkpKQorCisjICAgZGVmaW5lIEtNUF9DUFVfU0VUKGksbWFzaykgXAorICAgICAgICBfS01QX0NQVV9TRVQoKGkpLCAoKGttcF9hZmZpbl9tYXNrX3QgKikobWFzaykpKQorCisjICAgZGVmaW5lIF9LTVBfQ1BVX0lTU0VUKGksbWFzaykgXAorICAgICAgICAoISEobWFza1tpLyhDSEFSX0JJVCAqIHNpemVvZihrbXBfYWZmaW5fbWFza190KSldICYgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgoKGttcF9hZmZpbl9tYXNrX3QpMSkgPDwgKGkgJSAoQ0hBUl9CSVQgKiBzaXplb2Yoa21wX2FmZmluX21hc2tfdCkpKSkpKQorCisjICAgZGVmaW5lIEtNUF9DUFVfSVNTRVQoaSxtYXNrKSBcCisgICAgICAgIF9LTVBfQ1BVX0lTU0VUKChpKSwgKChrbXBfYWZmaW5fbWFza190ICopKG1hc2spKSkKKworIyAgIGRlZmluZSBfS01QX0NQVV9DTFIoaSxtYXNrKSBcCisgICAgICAgIChtYXNrW2kvKENIQVJfQklUICogc2l6ZW9mKGttcF9hZmZpbl9tYXNrX3QpKV0gJj0gICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfigoKGttcF9hZmZpbl9tYXNrX3QpMSkgPDwgKGkgJSAoQ0hBUl9CSVQgKiBzaXplb2Yoa21wX2FmZmluX21hc2tfdCkpKSkpCisKKyMgICBkZWZpbmUgS01QX0NQVV9DTFIoaSxtYXNrKSBcCisgICAgICAgIF9LTVBfQ1BVX0NMUigoaSksICgoa21wX2FmZmluX21hc2tfdCAqKShtYXNrKSkpCisKKyMgICBkZWZpbmUgS01QX0NQVV9aRVJPKG1hc2spIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW50IF9faTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IgKF9faSA9IDA7IF9faSA8IF9fa21wX251bV9wcm9jX2dyb3VwczsgX19pKyspIHsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAoKGttcF9hZmZpbl9tYXNrX3QgKikobWFzaykpW19faV0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0KKworIyAgIGRlZmluZSBLTVBfQ1BVX0NPUFkoZGVzdCwgc3JjKSBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGludCBfX2k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yIChfX2kgPSAwOyBfX2kgPCBfX2ttcF9udW1fcHJvY19ncm91cHM7IF9faSsrKSB7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKChrbXBfYWZmaW5fbWFza190ICopKGRlc3QpKVtfX2ldICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgID0gKChrbXBfYWZmaW5fbWFza190ICopKHNyYykpW19faV07ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0KKworIyAgIGRlZmluZSBLTVBfQ1BVX0NPTVBMRU1FTlQobWFzaykgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgX19pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciAoX19pID0gMDsgX19pIDwgX19rbXBfbnVtX3Byb2NfZ3JvdXBzOyBfX2krKykgeyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICgoa21wX2FmZmluX21hc2tfdCAqKShtYXNrKSlbX19pXSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICA9IH4oKGttcF9hZmZpbl9tYXNrX3QgKikobWFzaykpW19faV07ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9CisKKyMgICBkZWZpbmUgS01QX0NQVV9VTklPTihkZXN0LCBzcmMpIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW50IF9faTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IgKF9faSA9IDA7IF9faSA8IF9fa21wX251bV9wcm9jX2dyb3VwczsgX19pKyspIHsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAoKGttcF9hZmZpbl9tYXNrX3QgKikoZGVzdCkpW19faV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgfD0gKChrbXBfYWZmaW5fbWFza190ICopKHNyYykpW19faV07ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfQorCit0eXBlZGVmIERXT1JEICgqa21wX0dldEFjdGl2ZVByb2Nlc3NvckNvdW50X3QpKFdPUkQpOworZXh0ZXJuIGttcF9HZXRBY3RpdmVQcm9jZXNzb3JDb3VudF90IF9fa21wX0dldEFjdGl2ZVByb2Nlc3NvckNvdW50OworCit0eXBlZGVmIFdPUkQgKCprbXBfR2V0QWN0aXZlUHJvY2Vzc29yR3JvdXBDb3VudF90KSh2b2lkKTsKK2V4dGVybiBrbXBfR2V0QWN0aXZlUHJvY2Vzc29yR3JvdXBDb3VudF90IF9fa21wX0dldEFjdGl2ZVByb2Nlc3Nvckdyb3VwQ291bnQ7CisKK3R5cGVkZWYgQk9PTCAoKmttcF9HZXRUaHJlYWRHcm91cEFmZmluaXR5X3QpKEhBTkRMRSwgR1JPVVBfQUZGSU5JVFkgKik7CitleHRlcm4ga21wX0dldFRocmVhZEdyb3VwQWZmaW5pdHlfdCBfX2ttcF9HZXRUaHJlYWRHcm91cEFmZmluaXR5OworCit0eXBlZGVmIEJPT0wgKCprbXBfU2V0VGhyZWFkR3JvdXBBZmZpbml0eV90KShIQU5ETEUsIGNvbnN0IEdST1VQX0FGRklOSVRZICosIEdST1VQX0FGRklOSVRZICopOworZXh0ZXJuIGttcF9TZXRUaHJlYWRHcm91cEFmZmluaXR5X3QgX19rbXBfU2V0VGhyZWFkR3JvdXBBZmZpbml0eTsKKworZXh0ZXJuIGludCBfX2ttcF9nZXRfcHJvY19ncm91cChrbXBfYWZmaW5fbWFza190IGNvbnN0ICptYXNrKTsKKworIyAgZWxzZQorCit0eXBlZGVmIERXT1JEIGttcF9hZmZpbl9tYXNrX3Q7IC8qIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgd2luYmFzZS5oICovCisKKyMgICBkZWZpbmUgS01QX0NQVV9TRVQoaSxtYXNrKSAgICAgICgqKG1hc2spIHw9ICgoKGttcF9hZmZpbl9tYXNrX3QpMSkgPDwgKGkpKSkKKyMgICBkZWZpbmUgS01QX0NQVV9JU1NFVChpLG1hc2spICAgICghISgqKG1hc2spICYgKCgoa21wX2FmZmluX21hc2tfdCkxKSA8PCAoaSkpKSkKKyMgICBkZWZpbmUgS01QX0NQVV9DTFIoaSxtYXNrKSAgICAgICgqKG1hc2spICY9IH4oKChrbXBfYWZmaW5fbWFza190KTEpIDw8IChpKSkpCisjICAgZGVmaW5lIEtNUF9DUFVfWkVSTyhtYXNrKSAgICAgICAoKihtYXNrKSA9IDApCisjICAgZGVmaW5lIEtNUF9DUFVfQ09QWShkZXN0LCBzcmMpICAoKihkZXN0KSA9ICooc3JjKSkKKyMgICBkZWZpbmUgS01QX0NQVV9DT01QTEVNRU5UKG1hc2spICgqKG1hc2spID0gfioobWFzaykpCisjICAgZGVmaW5lIEtNUF9DUFVfVU5JT04oZGVzdCwgc3JjKSAoKihkZXN0KSB8PSAqKHNyYykpCisKKyMgIGVuZGlmIC8qIEtNUF9BUkNIX1g4NiAqLworCisjIGVuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCisKKy8vCisvLyBfX2ttcF9hbGxvY2F0ZSgpIHdpbGwgcmV0dXJuIG1lbW9yeSBhbGxvY2F0ZWQgb24gYSA0LWJ5dGVzIGJvdW5kYXJ5LgorLy8gYWZ0ZXIgemVyb2luZyBpdCAtIGl0IHRha2VzIGNhcmUgb2YgdGhvc2UgYXNzdW1wdGlvbnMgc3RhdGVkIGFib3ZlLgorLy8KKyMgZGVmaW5lIEtNUF9DUFVfQUxMT0MocHRyKSBcCisgICAgICAgIChwdHIgPSAoKGttcF9hZmZpbl9tYXNrX3QgKilfX2ttcF9hbGxvY2F0ZShfX2ttcF9hZmZpbl9tYXNrX3NpemUpKSkKKyMgZGVmaW5lIEtNUF9DUFVfRlJFRShwdHIpIF9fa21wX2ZyZWUocHRyKQorCisvLworLy8gVGhlIGZvbGxvd2luZyBtYWNybyBzaG91bGQgYmUgdXNlZCB0byBpbmRleCBhbiBhcnJheSBvZiBtYXNrcy4KKy8vIFRoZSBhcnJheSBzaG91bGQgYmUgZGVjbGFyZWQgYXMgImttcF9hZmZpbml0eV90ICoiIGFuZCBhbGxvY2F0ZWQgd2l0aAorLy8gc2l6ZSAiX19rbXBfYWZmaW5pdHlfbWFza19zaXplICogbGVuIi4gIFRoZSBtYWNybyB0YWtlcyBjYXJlIG9mIHRoZSBmYWN0CisvLyB0aGF0IG9uIFdpbmRvd3MqIE9TLCBzaXplb2Yoa21wX2FmZmluX3QpIGlzIHJlYWxseSB0aGUgc2l6ZSBvZiB0aGUgbWFzaywgYnV0CisvLyBvbiBMaW51eCogT1MsIHNpemVvZihrbXBfYWZmaW5fdCkgaXMgMS4KKy8vCisjIGRlZmluZSBLTVBfQ1BVX0lOREVYKGFycmF5LGkpIFwKKyAgICAgICAgKChrbXBfYWZmaW5fbWFza190ICopKCgoY2hhciAqKShhcnJheSkpICsgKGkpICogX19rbXBfYWZmaW5fbWFza19zaXplKSkKKworLy8KKy8vIERlY2xhcmUgbG9jYWwgY2hhciBidWZmZXJzIHdpdGggdGhpcyBzaXplIGZvciBwcmludGluZyBkZWJ1ZyBhbmQgaW5mbworLy8gbWVzc2FnZXMsIHVzaW5nIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soKS4KKy8vCisjZGVmaW5lIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiAgICAgICAgMTAyNAorCitlbnVtIGFmZmluaXR5X3R5cGUgeworICAgIGFmZmluaXR5X25vbmUgPSAwLAorICAgIGFmZmluaXR5X3BoeXNpY2FsLAorICAgIGFmZmluaXR5X2xvZ2ljYWwsCisgICAgYWZmaW5pdHlfY29tcGFjdCwKKyAgICBhZmZpbml0eV9zY2F0dGVyLAorICAgIGFmZmluaXR5X2V4cGxpY2l0LAorI2lmIEtNUF9NSUMKKyAgICBhZmZpbml0eV9iYWxhbmNlZCwKKyNlbmRpZgorICAgIGFmZmluaXR5X2Rpc2FibGVkLCAgLy8gbm90IHVzZWQgb3V0c2l6ZSB0aGUgZW52IHZhciBwYXJzZXIKKyAgICBhZmZpbml0eV9kZWZhdWx0Cit9OworCitlbnVtIGFmZmluaXR5X2dyYW4geworICAgIGFmZmluaXR5X2dyYW5fZmluZSA9IDAsCisgICAgYWZmaW5pdHlfZ3Jhbl90aHJlYWQsCisgICAgYWZmaW5pdHlfZ3Jhbl9jb3JlLAorICAgIGFmZmluaXR5X2dyYW5fcGFja2FnZSwKKyAgICBhZmZpbml0eV9ncmFuX25vZGUsCisjaWYgS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2XzY0CisgICAgLy8KKyAgICAvLyBUaGUgImdyb3VwIiBncmFudWxhcml0eSBpc24ndCBuZWNlc3NzYXJpbHkgY29hcnNlciB0aGFuIGFsbCBvZiB0aGUKKyAgICAvLyBvdGhlciBsZXZlbHMsIGJ1dCB3ZSBwdXQgaXQgbGFzdCBpbiB0aGUgZW51bS4KKyAgICAvLworICAgIGFmZmluaXR5X2dyYW5fZ3JvdXAsCisjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2XzY0ICovCisgICAgYWZmaW5pdHlfZ3Jhbl9kZWZhdWx0Cit9OworCitlbnVtIGFmZmluaXR5X3RvcF9tZXRob2QgeworICAgIGFmZmluaXR5X3RvcF9tZXRob2RfYWxsID0gMCwgLy8gdHJ5IGFsbCAoc3VwcG9ydGVkKSBtZXRob2RzLCBpbiBvcmRlcgorI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyAgICBhZmZpbml0eV90b3BfbWV0aG9kX2FwaWNpZCwKKyAgICBhZmZpbml0eV90b3BfbWV0aG9kX3gyYXBpY2lkLAorI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKyAgICBhZmZpbml0eV90b3BfbWV0aG9kX2NwdWluZm8sIC8vIEtNUF9DUFVJTkZPX0ZJTEUgaXMgdXNhYmxlIG9uIFdpbmRvd3MqIE9TLCB0b28KKyNpZiBLTVBfT1NfV0lORE9XUyAmJiBLTVBfQVJDSF9YODZfNjQKKyAgICBhZmZpbml0eV90b3BfbWV0aG9kX2dyb3VwLAorI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4Nl82NCAqLworICAgIGFmZmluaXR5X3RvcF9tZXRob2RfZmxhdCwKKyAgICBhZmZpbml0eV90b3BfbWV0aG9kX2RlZmF1bHQKK307CisKKyNkZWZpbmUgYWZmaW5pdHlfcmVzcGVjdF9tYXNrX2RlZmF1bHQgICAoLTEpCisKK2V4dGVybiBlbnVtIGFmZmluaXR5X3R5cGUgX19rbXBfYWZmaW5pdHlfdHlwZTsgLyogQWZmaW5pdHkgdHlwZSAqLworZXh0ZXJuIGVudW0gYWZmaW5pdHlfZ3JhbiBfX2ttcF9hZmZpbml0eV9ncmFuOyAvKiBBZmZpbml0eSBncmFudWxhcml0eSAqLworZXh0ZXJuIGludCBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVsczsgLyogY29ycmVzcG9uZGluZyBpbnQgdmFsdWUgKi8KK2V4dGVybiBpbnQgX19rbXBfYWZmaW5pdHlfZHVwczsgLyogQWZmaW5pdHkgZHVwbGljYXRlIG1hc2tzICovCitleHRlcm4gZW51bSBhZmZpbml0eV90b3BfbWV0aG9kIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2Q7CitleHRlcm4gaW50IF9fa21wX2FmZmluaXR5X2NvbXBhY3Q7IC8qIEFmZmluaXR5ICdjb21wYWN0JyB2YWx1ZSAqLworZXh0ZXJuIGludCBfX2ttcF9hZmZpbml0eV9vZmZzZXQ7IC8qIEFmZmluaXR5IG9mZnNldCB2YWx1ZSAgKi8KK2V4dGVybiBpbnQgX19rbXBfYWZmaW5pdHlfdmVyYm9zZTsgLyogV2FzIHZlcmJvc2Ugc3BlY2lmaWVkIGZvciBLTVBfQUZGSU5JVFk/ICovCitleHRlcm4gaW50IF9fa21wX2FmZmluaXR5X3dhcm5pbmdzOyAvKiBLTVBfQUZGSU5JVFkgd2FybmluZ3MgZW5hYmxlZCA/ICovCitleHRlcm4gaW50IF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzazsgLyogUmVzcGVjdCBwcm9jZXNzJyBpbml0aWFsIGFmZmluaXR5IG1hc2s/ICovCitleHRlcm4gY2hhciAqIF9fa21wX2FmZmluaXR5X3Byb2NsaXN0OyAvKiBwcm9jIElEIGxpc3QgKi8KK2V4dGVybiBrbXBfYWZmaW5fbWFza190ICpfX2ttcF9hZmZpbml0eV9tYXNrczsKK2V4dGVybiB1bnNpZ25lZCBfX2ttcF9hZmZpbml0eV9udW1fbWFza3M7CitleHRlcm4gaW50IF9fa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkoa21wX2FmZmluX21hc2tfdCAqbWFzaywgaW50IGFib3J0X29uX2Vycm9yKTsKK2V4dGVybiBpbnQgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eShrbXBfYWZmaW5fbWFza190IGNvbnN0ICptYXNrLCBpbnQgYWJvcnRfb25fZXJyb3IpOworZXh0ZXJuIHZvaWQgX19rbXBfYWZmaW5pdHlfYmluZF90aHJlYWQoaW50IHdoaWNoKTsKKworIyBpZiBLTVBfT1NfTElOVVgKK2V4dGVybiBrbXBfYWZmaW5fbWFza190ICpfX2ttcF9hZmZpbml0eV9nZXRfZnVsbE1hc2soKTsKKyMgZW5kaWYgLyogS01QX09TX0xJTlVYICovCitleHRlcm4gY2hhciBjb25zdCAqIF9fa21wX2NwdWluZm9fZmlsZTsKKworI2VuZGlmIC8qIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgKi8KKworI2lmIE9NUF80MF9FTkFCTEVECisKKy8vCisvLyBUaGlzIG5lZWRzIHRvIGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSB2YWx1ZXMgaW4gb21wLmggISEhCisvLwordHlwZWRlZiBlbnVtIGttcF9wcm9jX2JpbmRfdCB7CisgICAgcHJvY19iaW5kX2ZhbHNlID0gMCwKKyAgICBwcm9jX2JpbmRfdHJ1ZSwKKyAgICBwcm9jX2JpbmRfbWFzdGVyLAorICAgIHByb2NfYmluZF9jbG9zZSwKKyAgICBwcm9jX2JpbmRfc3ByZWFkLAorICAgIHByb2NfYmluZF9kaXNhYmxlZCwKKyAgICBwcm9jX2JpbmRfaW50ZWwsICAgIC8vIHVzZSBLTVBfQUZGSU5JVFkgaW50ZXJmYWNlCisgICAgcHJvY19iaW5kX2RlZmF1bHQKK30ga21wX3Byb2NfYmluZF90OworCit0eXBlZGVmIHN0cnVjdCBrbXBfbmVzdGVkX3Byb2NfYmluZF90IHsKKyAgICBrbXBfcHJvY19iaW5kX3QgKmJpbmRfdHlwZXM7CisgICAgaW50IHNpemU7CisgICAgaW50IHVzZWQ7Cit9IGttcF9uZXN0ZWRfcHJvY19iaW5kX3Q7CisKK2V4dGVybiBrbXBfbmVzdGVkX3Byb2NfYmluZF90IF9fa21wX25lc3RlZF9wcm9jX2JpbmQ7CisKKyMgaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorIyAgZGVmaW5lIEtNUF9QTEFDRV9BTEwgICAgICAgKC0xKQorIyAgZGVmaW5lIEtNUF9QTEFDRV9VTkRFRklORUQgKC0yKQorIyBlbmRpZiAvKiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEICovCisKK2V4dGVybiBpbnQgX19rbXBfYWZmaW5pdHlfbnVtX3BsYWNlczsKKworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKyNpZiBPTVBfNDBfRU5BQkxFRAordHlwZWRlZiBlbnVtIGttcF9jYW5jZWxfa2luZF90IHsKKyAgICBjYW5jZWxfbm9yZXEgPSAwLAorICAgIGNhbmNlbF9wYXJhbGxlbCA9IDEsCisgICAgY2FuY2VsX2xvb3AgPSAyLAorICAgIGNhbmNlbF9zZWN0aW9ucyA9IDMsCisgICAgY2FuY2VsX3Rhc2tncm91cCA9IDQKK30ga21wX2NhbmNlbF9raW5kX3Q7CisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKworI2lmIEtNUF9NSUMKK2V4dGVybiB1bnNpZ25lZCBpbnQgX19rbXBfcGxhY2VfbnVtX2NvcmVzOworZXh0ZXJuIHVuc2lnbmVkIGludCBfX2ttcF9wbGFjZV9udW1fdGhyZWFkc19wZXJfY29yZTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgX19rbXBfcGxhY2VfY29yZV9vZmZzZXQ7CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBLTVBfUEFEKHR5cGUsIHN6KSAgICAgKHNpemVvZih0eXBlKSArIChzeiAtICgoc2l6ZW9mKHR5cGUpIC0gMSkgJSAoc3opKSAtIDEpKQorCisvLworLy8gV2UgbmVlZCB0byBhdm9pZCB1c2luZyAtMSBhcyBhIEdUSUQgYXMgKzEgaXMgYWRkZWQgdG8gdGhlIGd0aWQKKy8vIHdoZW4gc3RvcmluZyBpdCBpbiBhIGxvY2ssIGFuZCB0aGUgdmFsdWUgMCBpcyByZXNlcnZlZC4KKy8vCisjZGVmaW5lIEtNUF9HVElEX0RORSAgICAgICAgICAgICgtMikgICAgLyogRG9lcyBub3QgZXhpc3QgKi8KKyNkZWZpbmUgS01QX0dUSURfU0hVVERPV04gICAgICAgKC0zKSAgICAvKiBMaWJyYXJ5IGlzIHNodXR0aW5nIGRvd24gKi8KKyNkZWZpbmUgS01QX0dUSURfTU9OSVRPUiAgICAgICAgKC00KSAgICAvKiBNb25pdG9yIHRocmVhZCBJRCAqLworI2RlZmluZSBLTVBfR1RJRF9VTktOT1dOICAgICAgICAoLTUpICAgIC8qIElzIG5vdCBrbm93biAqLworI2RlZmluZSBLTVBfR1RJRF9NSU4gICAgICAgICAgICAoLTYpICAgIC8qIE1pbmltYWwgZ3RpZCBmb3IgbG93IGJvdW5kIGNoZWNrIGluIERFQlVHICovCisKKyNkZWZpbmUgX19rbXBfZ2V0X2d0aWQoKSAgICAgICAgICAgICAgIF9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkKCkKKyNkZWZpbmUgX19rbXBfZW50cnlfZ3RpZCgpICAgICAgICAgICAgIF9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkX3JlZygpCisKKyNkZWZpbmUgX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKSAgICAgKCBLTVBfREVCVUdfQVNTRVJUKCAoZ3RpZCkgPj0gMCApLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyooX19rbXBfdGhyZWFkc1sgKGd0aWQpIF0tPnRoLnRoX3RlYW1fc2VyaWFsaXplZCkgPyAwIDogKi8gLyogVE9ETyByZW1vdmUgdGhpcyBjaGVjaywgaXQgaXMgcmVkdW5kYW50ICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF90aHJlYWRzWyAoZ3RpZCkgXS0+dGgudGhfaW5mby5kcy5kc190aWQgKQorCisjZGVmaW5lIF9fa21wX2dldF90aWQoKSAgICAgICAgICAgICAgICggX19rbXBfdGlkX2Zyb21fZ3RpZCggX19rbXBfZ2V0X2d0aWQoKSApICkKKyNkZWZpbmUgX19rbXBfZ3RpZF9mcm9tX3RpZCh0aWQsdGVhbSkgKCBLTVBfREVCVUdfQVNTRVJUKCAodGlkKSA+PSAwICYmICh0ZWFtKSAhPSBOVUxMICksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtIC0+IHQudF90aHJlYWRzWyAodGlkKSBdIC0+IHRoLnRoX2luZm8gLmRzLmRzX2d0aWQgKQorCisjZGVmaW5lIF9fa21wX2dldF90ZWFtKCkgICAgICAgICAgICAgICggX19rbXBfdGhyZWFkc1sgKF9fa21wX2dldF9ndGlkKCkpIF0tPiB0aC50aF90ZWFtICkKKyNkZWZpbmUgX19rbXBfdGVhbV9mcm9tX2d0aWQoZ3RpZCkgICAgKCBLTVBfREVCVUdfQVNTRVJUKCAoZ3RpZCkgPj0gMCApLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfdGhyZWFkc1sgKGd0aWQpIF0tPiB0aC50aF90ZWFtICkKKworI2RlZmluZSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKGd0aWQpICAoIEtNUF9ERUJVR19BU1NFUlQoIChndGlkKSA+PSAwICksIF9fa21wX3RocmVhZHNbIChndGlkKSBdICkKKyNkZWZpbmUgX19rbXBfZ2V0X3RocmVhZCgpICAgICAgICAgICAgKCBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCBfX2ttcF9nZXRfZ3RpZCgpICkgKQorCisgICAgLy8gUmV0dXJucyBjdXJyZW50IHRocmVhZCAocG9pbnRlciB0byBrbXBfaW5mb190KS4gSW4gY29udHJhc3QgdG8gX19rbXBfZ2V0X3RocmVhZCgpLCBpdCB3b3JrcworICAgIC8vIHdpdGggcmVnaXN0ZXJlZCBhbmQgbm90LXlldC1yZWdpc3RlcmVkIHRocmVhZHMuCisjZGVmaW5lIF9fa21wX2d0aWRfZnJvbV90aHJlYWQodGhyKSAgICggS01QX0RFQlVHX0FTU0VSVCggKHRocikgIT0gTlVMTCApLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRociktPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCApCisKKy8vIEFUOiBXaGljaCB3YXkgaXMgY29ycmVjdD8KKy8vIEFUOiAxLiBucHJvYyA9IF9fa21wX3RocmVhZHNbICggZ3RpZCApIF0gLT4gdGgudGhfdGVhbSAtPiB0LnRfbnByb2M7CisvLyBBVDogMi4gbnByb2MgPSBfX2ttcF90aHJlYWRzWyAoIGd0aWQgKSBdIC0+IHRoLnRoX3RlYW1fbnByb2M7CisjZGVmaW5lIF9fa21wX2dldF90ZWFtX251bV90aHJlYWRzKGd0aWQpICggX19rbXBfdGhyZWFkc1sgKCBndGlkICkgXSAtPiB0aC50aF90ZWFtIC0+IHQudF9ucHJvYyApCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBLTVBfVUlOVDY0X01BWCAgICAgICAgICh+KChrbXBfdWludDY0KTE8PCgoc2l6ZW9mKGttcF91aW50NjQpKigxPDwzKSktMSkpKQorCisjZGVmaW5lIEtNUF9NSU5fTlRIICAgICAgICAgICAxCisKKyNpZm5kZWYgS01QX01BWF9OVEgKKyMgIGlmZGVmIFBUSFJFQURfVEhSRUFEU19NQVgKKyMgICAgZGVmaW5lIEtNUF9NQVhfTlRIICAgICAgICAgIFBUSFJFQURfVEhSRUFEU19NQVgKKyMgIGVsc2UKKyMgICAgZGVmaW5lIEtNUF9NQVhfTlRIICAgICAgICAgICgzMiAqIDEwMjQpCisjICBlbmRpZgorI2VuZGlmIC8qIEtNUF9NQVhfTlRIICovCisKKyNpZmRlZiBQVEhSRUFEX1NUQUNLX01JTgorIyBkZWZpbmUgS01QX01JTl9TVEtTSVpFICAgICAgICAgUFRIUkVBRF9TVEFDS19NSU4KKyNlbHNlCisjIGRlZmluZSBLTVBfTUlOX1NUS1NJWkUgICAgICAgICAoKHNpemVfdCkoMzIgKiAxMDI0KSkKKyNlbmRpZgorCisjZGVmaW5lIEtNUF9NQVhfU1RLU0laRSAgICAgICAgICAofigoc2l6ZV90KTE8PCgoc2l6ZW9mKHNpemVfdCkqKDE8PDMpKS0xKSkpCisKKyNpZiBLTVBfQVJDSF9YODYKKyMgZGVmaW5lIEtNUF9ERUZBVUxUX1NUS1NJWkUgICAgICgoc2l6ZV90KSgyICogMTAyNCAqIDEwMjQpKQorI2VsaWYgS01QX0FSQ0hfWDg2XzY0CisjIGRlZmluZSBLTVBfREVGQVVMVF9TVEtTSVpFICAgICAoKHNpemVfdCkoNCAqIDEwMjQgKiAxMDI0KSkKKyMgZGVmaW5lIEtNUF9CQUNLVVBfU1RLU0laRSAgICAgICgoc2l6ZV90KSgyICogMTAyNCAqIDEwMjQpKQorI2Vsc2UKKyMgZGVmaW5lIEtNUF9ERUZBVUxUX1NUS1NJWkUgICAgICgoc2l6ZV90KSgxMDI0ICogMTAyNCkpCisjZW5kaWYKKworI2RlZmluZSBLTVBfREVGQVVMVF9NT05JVE9SX1NUS1NJWkUgICAgICgoc2l6ZV90KSg2NCAqIDEwMjQpKQorCisjZGVmaW5lIEtNUF9ERUZBVUxUX01BTExPQ19QT09MX0lOQ1IgICAgKChzaXplX3QpICgxMDI0ICogMTAyNCkpCisjZGVmaW5lIEtNUF9NSU5fTUFMTE9DX1BPT0xfSU5DUiAgICAgICAgKChzaXplX3QpICg0ICogMTAyNCkpCisjZGVmaW5lIEtNUF9NQVhfTUFMTE9DX1BPT0xfSU5DUiAgICAgICAgKH4oKHNpemVfdCkxPDwoKHNpemVvZihzaXplX3QpKigxPDwzKSktMSkpKQorCisjZGVmaW5lIEtNUF9NSU5fU1RLT0ZGU0VUICAgICAgICgwKQorI2RlZmluZSBLTVBfTUFYX1NUS09GRlNFVCAgICAgICBLTVBfTUFYX1NUS1NJWkUKKyNkZWZpbmUgS01QX0RFRkFVTFRfU1RLT0ZGU0VUICAgS01QX01JTl9TVEtPRkZTRVQKKworI2RlZmluZSBLTVBfTUlOX01PTklUT1JfV0FLRVVQUyAgICAgICgxKSAgICAgICAvKiBtaW4gbnVtYmVyIG9mIHRpbWVzIG1vbml0b3Igd2FrZXMgdXAgcGVyIHNlY29uZCAqLworI2RlZmluZSBLTVBfTUFYX01PTklUT1JfV0FLRVVQUyAgICAgICgxMDAwKSAgICAvKiBtYXhpbXVtIG51bWJlciBvZiB0aW1lcyBtb25pdG9yIGNhbiB3YWtlIHVwIHBlciBzZWNvbmQgKi8KKyNkZWZpbmUgS01QX0JMT0NLVElNRV9NVUxUSVBMSUVSICAgICAoMTAwMCkgICAgLyogbnVtYmVyIG9mIGJsb2NrdGltZSB1bml0cyBwZXIgc2Vjb25kICovCisjZGVmaW5lIEtNUF9NSU5fQkxPQ0tUSU1FICAgICAgICAgICAgKDApCisjZGVmaW5lIEtNUF9NQVhfQkxPQ0tUSU1FICAgICAgICAgICAgKElOVF9NQVgpIC8qIE11c3QgYmUgdGhpcyBmb3IgImluZmluaXRlIiBzZXR0aW5nIHRoZSB3b3JrICovCisjZGVmaW5lIEtNUF9ERUZBVUxUX0JMT0NLVElNRSAgICAgICAgKDIwMCkgICAgIC8qICBfX2ttcF9ibG9ja3RpbWUgaXMgaW4gbWlsbGlzZWNvbmRzICAqLworLyogQ2FsY3VsYXRlIG5ldyBudW1iZXIgb2YgbW9uaXRvciB3YWtldXBzIGZvciBhIHNwZWNpZmljIGJsb2NrIHRpbWUgYmFzZWQgb24gcHJldmlvdXMgbW9uaXRvcl93YWtldXBzICovCisvKiBPbmx5IGFsbG93IGluY3JlYXNpbmcgbnVtYmVyIG9mIHdha2V1cHMgKi8KKyNkZWZpbmUgS01QX1dBS0VVUFNfRlJPTV9CTE9DS1RJTUUoYmxvY2t0aW1lLCBtb25pdG9yX3dha2V1cHMpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKChibG9ja3RpbWUpID09IEtNUF9NQVhfQkxPQ0tUSU1FKSA/IChtb25pdG9yX3dha2V1cHMpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGJsb2NrdGltZSkgPT0gS01QX01JTl9CTE9DS1RJTUUpID8gS01QX01BWF9NT05JVE9SX1dBS0VVUFMgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobW9uaXRvcl93YWtldXBzKSA+IChLTVBfQkxPQ0tUSU1FX01VTFRJUExJRVIgLyAoYmxvY2t0aW1lKSkpID8gKG1vbml0b3Jfd2FrZXVwcykgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoS01QX0JMT0NLVElNRV9NVUxUSVBMSUVSKSAvIChibG9ja3RpbWUpICkKKworLyogQ2FsY3VsYXRlIG51bWJlciBvZiBpbnRlcnZhbHMgZm9yIGEgc3BlY2lmaWMgYmxvY2sgdGltZSBiYXNlZCBvbiBtb25pdG9yX3dha2V1cHMgKi8KKyNkZWZpbmUgS01QX0lOVEVSVkFMU19GUk9NX0JMT0NLVElNRShibG9ja3RpbWUsIG1vbml0b3Jfd2FrZXVwcykgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKCAoYmxvY2t0aW1lKSArIChLTVBfQkxPQ0tUSU1FX01VTFRJUExJRVIgLyAobW9uaXRvcl93YWtldXBzKSkgLSAxICkgLyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoS01QX0JMT0NLVElNRV9NVUxUSVBMSUVSIC8gKG1vbml0b3Jfd2FrZXVwcykpICkKKworI2RlZmluZSBLTVBfTUlOX1NUQVRTQ09MUyAgICAgICA0MAorI2RlZmluZSBLTVBfTUFYX1NUQVRTQ09MUyAgICAgICA0MDk2CisjZGVmaW5lIEtNUF9ERUZBVUxUX1NUQVRTQ09MUyAgIDgwCisKKyNkZWZpbmUgS01QX01JTl9JTlRFUlZBTCAgICAgICAgMAorI2RlZmluZSBLTVBfTUFYX0lOVEVSVkFMICAgICAgICAoSU5UX01BWC0xKQorI2RlZmluZSBLTVBfREVGQVVMVF9JTlRFUlZBTCAgICAwCisKKyNkZWZpbmUgS01QX01JTl9DSFVOSyAgICAgICAgICAgMQorI2RlZmluZSBLTVBfTUFYX0NIVU5LICAgICAgICAgICAoSU5UX01BWC0xKQorI2RlZmluZSBLTVBfREVGQVVMVF9DSFVOSyAgICAgICAxCisKKyNkZWZpbmUgS01QX01JTl9JTklUX1dBSVQgICAgICAgMQorI2RlZmluZSBLTVBfTUFYX0lOSVRfV0FJVCAgICAgICAoSU5UX01BWC8yKQorI2RlZmluZSBLTVBfREVGQVVMVF9JTklUX1dBSVQgICAyMDQ4VQorCisjZGVmaW5lIEtNUF9NSU5fTkVYVF9XQUlUICAgICAgIDEKKyNkZWZpbmUgS01QX01BWF9ORVhUX1dBSVQgICAgICAgKElOVF9NQVgvMikKKyNkZWZpbmUgS01QX0RFRkFVTFRfTkVYVF9XQUlUICAgMTAyNFUKKworLy8gbWF4IHBvc3NpYmxlIGR5bmFtaWMgbG9vcHMgaW4gY29uY3VycmVudCBleGVjdXRpb24gcGVyIHRlYW0KKyNkZWZpbmUgS01QX01BWF9ESVNQX0JVRiAgICAgICAgNworI2RlZmluZSBLTVBfTUFYX09SREVSRUQgICAgICAgICA4CisKKyNkZWZpbmUgS01QX01BWF9GSUVMRFMgICAgICAgICAgMzIKKworI2RlZmluZSBLTVBfTUFYX0JSQU5DSF9CSVRTICAgICAzMQorCisjZGVmaW5lIEtNUF9NQVhfQUNUSVZFX0xFVkVMU19MSU1JVCBJTlRfTUFYCisKKy8qIE1pbmltdW0gbnVtYmVyIG9mIHRocmVhZHMgYmVmb3JlIHN3aXRjaCB0byBUTFMgZ3RpZCAoZXhwZXJpbWVudGFsbHkgZGV0ZXJtaW5lZCkgKi8KKy8qIGpvc2ggVE9ETzogd2hhdCBhYm91dCBPUyBYKiB0dW5pbmc/ICovCisjaWYgICBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisjIGRlZmluZSBLTVBfVExTX0dUSURfTUlOICAgICA1CisjZWxzZQorIyBkZWZpbmUgS01QX1RMU19HVElEX01JTiAgICAgSU5UX01BWAorI2VuZGlmCisKKyNkZWZpbmUgS01QX01BU1RFUl9USUQodGlkKSAgICAgICggKHRpZCkgPT0gMCApCisjZGVmaW5lIEtNUF9XT1JLRVJfVElEKHRpZCkgICAgICAoICh0aWQpICE9IDAgKQorCisjZGVmaW5lIEtNUF9NQVNURVJfR1RJRChndGlkKSAgICAoIF9fa21wX3RpZF9mcm9tX2d0aWQoKGd0aWQpKSA9PSAwICkKKyNkZWZpbmUgS01QX1dPUktFUl9HVElEKGd0aWQpICAgICggX19rbXBfdGlkX2Zyb21fZ3RpZCgoZ3RpZCkpICE9IDAgKQorI2RlZmluZSBLTVBfVUJFUl9HVElEKGd0aWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIChndGlkKSA+PSBLTVBfR1RJRF9NSU4gKSwgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAoZ3RpZCkgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5ICksICAgICAgICAgIFwKKyAgICAgICAgKGd0aWQpID49IDAgJiYgX19rbXBfcm9vdFsoZ3RpZCldICYmIF9fa21wX3RocmVhZHNbKGd0aWQpXSAmJiBcCisgICAgICAgIChfX2ttcF90aHJlYWRzWyhndGlkKV0gPT0gX19rbXBfcm9vdFsoZ3RpZCldLT5yLnJfdWJlcl90aHJlYWQpXAorICAgICkKKyNkZWZpbmUgS01QX0lOSVRJQUxfR1RJRChndGlkKSAgICggKGd0aWQpID09IDAgKQorCisjaWZuZGVmIFRSVUUKKyNkZWZpbmUgRkFMU0UgICAwCisjZGVmaW5lIFRSVUUgICAgKCEgRkFMU0UpCisjZW5kaWYKKworLyogTk9URTogYWxsIG9mIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzIG11c3QgYmUgZXZlbiAqLworCisjaWYgS01QX09TX1dJTkRPV1MKKyMgIGRlZmluZSBLTVBfSU5JVF9XQUlUICAgIDY0VSAgICAgICAgICAvKiBpbml0aWFsIG51bWJlciBvZiBzcGluLXRlc3RzICAgKi8KKyMgIGRlZmluZSBLTVBfTkVYVF9XQUlUICAgIDMyVSAgICAgICAgICAvKiBzdXNlcXVlbnQgbnVtYmVyIG9mIHNwaW4tdGVzdHMgKi8KKyNlbGlmIEtNUF9PU19DTksKKyMgIGRlZmluZSBLTVBfSU5JVF9XQUlUICAgIDE2VSAgICAgICAgICAvKiBpbml0aWFsIG51bWJlciBvZiBzcGluLXRlc3RzICAgKi8KKyMgIGRlZmluZSBLTVBfTkVYVF9XQUlUICAgICA4VSAgICAgICAgICAvKiBzdXNlcXVlbnQgbnVtYmVyIG9mIHNwaW4tdGVzdHMgKi8KKyNlbGlmIEtNUF9PU19MSU5VWAorIyAgZGVmaW5lIEtNUF9JTklUX1dBSVQgIDEwMjRVICAgICAgICAgIC8qIGluaXRpYWwgbnVtYmVyIG9mIHNwaW4tdGVzdHMgICAqLworIyAgZGVmaW5lIEtNUF9ORVhUX1dBSVQgICA1MTJVICAgICAgICAgIC8qIHN1c2VxdWVudCBudW1iZXIgb2Ygc3Bpbi10ZXN0cyAqLworI2VsaWYgS01QX09TX0RBUldJTiB8fCBLTVBfT1NfRlJFRUJTRAorLyogVE9ETzogdHVuZSBmb3IgT1MgKi8KKyMgIGRlZmluZSBLTVBfSU5JVF9XQUlUICAxMDI0VSAgICAgICAgICAvKiBpbml0aWFsIG51bWJlciBvZiBzcGluLXRlc3RzICAgKi8KKyMgIGRlZmluZSBLTVBfTkVYVF9XQUlUICAgNTEyVSAgICAgICAgICAvKiBzdXNlcXVlbnQgbnVtYmVyIG9mIHNwaW4tdGVzdHMgKi8KKyNlbHNlCisjICBlcnJvciAiVW5rbm93biBvciB1bnN1cHBvcnRlZCBPUyIKKyNlbmRpZgorCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorc3RydWN0IGttcF9jcHVpZCB7CisgICAga21wX3VpbnQzMiAgZWF4OworICAgIGttcF91aW50MzIgIGVieDsKKyAgICBrbXBfdWludDMyICBlY3g7CisgICAga21wX3VpbnQzMiAgZWR4OworfTsKK2V4dGVybiB2b2lkIF9fa21wX3g4Nl9jcHVpZCggaW50IG1vZGUsIGludCBtb2RlMiwgc3RydWN0IGttcF9jcHVpZCAqcCApOworIyBpZiBLTVBfTUlDCisgIHN0YXRpYyB2b2lkIF9fa21wX3g4Nl9wYXVzZSggdm9pZCApIHsgX21tX2RlbGF5XzMyKCAxMDAgKTsgfTsKKyMgZWxzZQorICBleHRlcm4gdm9pZCBfX2ttcF94ODZfcGF1c2UoIHZvaWQgKTsKKyMgZW5kaWYKKyMgZGVmaW5lIEtNUF9DUFVfUEFVU0UoKSAgICAgICAgX19rbXBfeDg2X3BhdXNlKCkKKyNlbGlmIEtNUF9BUkNIX1BQQzY0CisjIGRlZmluZSBLTVBfUFBDNjRfUFJJX0xPVygpIF9fYXNtX18gdm9sYXRpbGUgKCJvciAxLCAxLCAxIikKKyMgZGVmaW5lIEtNUF9QUEM2NF9QUklfTUVEKCkgX19hc21fXyB2b2xhdGlsZSAoIm9yIDIsIDIsIDIiKQorIyBkZWZpbmUgS01QX1BQQzY0X1BSSV9MT0NfTUIoKSBfX2FzbV9fIHZvbGF0aWxlICgiIiA6IDogOiAibWVtb3J5IikKKyMgZGVmaW5lIEtNUF9DUFVfUEFVU0UoKSBkbyB7IEtNUF9QUEM2NF9QUklfTE9XKCk7IEtNUF9QUEM2NF9QUklfTUVEKCk7IEtNUF9QUEM2NF9QUklfTE9DX01CKCk7IH0gd2hpbGUgKDApCisjZWxzZQorIyBkZWZpbmUgS01QX0NQVV9QQVVTRSgpICAgICAgICAvKiBub3RoaW5nIHRvIGRvICovCisjZW5kaWYKKworI2RlZmluZSBLTVBfSU5JVF9ZSUVMRChjb3VudCkgICAgICAgICAgIHsgKGNvdW50KSA9IF9fa21wX3lpZWxkX2luaXQ7IH0KKworI2RlZmluZSBLTVBfWUlFTEQoY29uZCkgICAgICAgICAgICAgICAgIHsgS01QX0NQVV9QQVVTRSgpOyBfX2ttcF9zdGF0aWNfeWllbGQoIChjb25kKSApOyB9CisKKy8vIE5vdGUgdGhlIGRlY3JlbWVudCBvZiAyIGluIHRoZSBmb2xsb3dpbmcgTWFjcm9zLiAgV2l0aCBLTVBfTElCUkFSWT10dXJuYXJvdW5kLAorLy8gdGhlcmUgc2hvdWxkIGJlIG5vIHlpZWxkaW5nIHNpbmNlIHRoZSBzdGFydGluZyB2YWx1ZSBmcm9tIEtNUF9JTklUX1lJRUxEKCkgaXMgb2RkLgorCisjZGVmaW5lIEtNUF9ZSUVMRF9XSEVOKGNvbmQsY291bnQpICAgICAgeyBLTVBfQ1BVX1BBVVNFKCk7IChjb3VudCkgLT0gMjsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoY291bnQpKSB7IEtNUF9ZSUVMRChjb25kKTsgKGNvdW50KSA9IF9fa21wX3lpZWxkX25leHQ7IH0gfQorI2RlZmluZSBLTVBfWUlFTERfU1BJTihjb3VudCkgICAgICAgICAgIHsgS01QX0NQVV9QQVVTRSgpOyAoY291bnQpIC09MjsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoY291bnQpKSB7IEtNUF9ZSUVMRCgxKTsgKGNvdW50KSA9IF9fa21wX3lpZWxkX25leHQ7IH0gfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIFN1cHBvcnQgZGF0YXR5cGVzIGZvciB0aGUgb3JwaGFuZWQgY29uc3RydWN0IG5lc3RpbmcgY2hlY2tzLiAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2VudW0gY29uc190eXBlIHsKKyAgICBjdF9ub25lLAorICAgIGN0X3BhcmFsbGVsLAorICAgIGN0X3BkbywKKyAgICBjdF9wZG9fb3JkZXJlZCwKKyAgICBjdF9wc2VjdGlvbnMsCisgICAgY3RfcHNpbmdsZSwKKworICAgIC8qIHRoZSBmb2xsb3dpbmcgbXVzdCBiZSBsZWZ0IGluIG9yZGVyIGFuZCBub3Qgc3BsaXQgdXAgKi8KKyAgICBjdF90YXNrcSwKKyAgICBjdF90YXNrLCAgICAgICAgICAgICAgICAgICAgLyogcmVhbGx5IHRhc2sgaW5zaWRlIG5vbi1vcmRlcmVkIHRhc2txLCBjb25zaWRlcmVkIGEgd29ya3NoYXJpbmcgdHlwZSAqLworICAgIGN0X3Rhc2tfb3JkZXJlZCwgICAgICAgICAgICAvKiByZWFsbHkgdGFzayBpbnNpZGUgb3JkZXJlZCB0YXNrcSwgY29uc2lkZXJlZCBhIHdvcmtzaGFyaW5nIHR5cGUgKi8KKyAgICAvKiB0aGUgcHJlY2VkaW5nIG11c3QgYmUgbGVmdCBpbiBvcmRlciBhbmQgbm90IHNwbGl0IHVwICovCisKKyAgICBjdF9jcml0aWNhbCwKKyAgICBjdF9vcmRlcmVkX2luX3BhcmFsbGVsLAorICAgIGN0X29yZGVyZWRfaW5fcGRvLAorICAgIGN0X29yZGVyZWRfaW5fdGFza3EsCisgICAgY3RfbWFzdGVyLAorICAgIGN0X3JlZHVjZSwKKyAgICBjdF9iYXJyaWVyCit9OworCisvKiB0ZXN0IHRvIHNlZSBpZiB3ZSBhcmUgaW4gYSB0YXNrcSBjb25zdHJ1Y3QgKi8KKyMgZGVmaW5lIElTX0NPTlNfVFlQRV9UQVNLUSggY3QgKSAgICAgICAoICgoaW50KShjdCkpID49ICgoaW50KWN0X3Rhc2txKSAmJiAoKGludCkoY3QpKSA8PSAoKGludCljdF90YXNrX29yZGVyZWQpICkKKyMgZGVmaW5lIElTX0NPTlNfVFlQRV9PUkRFUkVEKCBjdCApICAgICAoKGN0KSA9PSBjdF9wZG9fb3JkZXJlZCB8fCAoY3QpID09IGN0X3Rhc2tfb3JkZXJlZCkKKworc3RydWN0IGNvbnNfZGF0YSB7CisgICAgaWRlbnRfdCBjb25zdCAgICAgKmlkZW50OworICAgIGVudW0gY29uc190eXBlICAgICB0eXBlOworICAgIGludCAgICAgICAgICAgICAgICBwcmV2OworICAgIGttcF91c2VyX2xvY2tfcCAgICBuYW1lOyAgICAvKiBhZGRyZXNzIGV4Y2x1c2l2ZWx5IGZvciBjcml0aWNhbCBzZWN0aW9uIG5hbWUgY29tcGFyaXNvbiAqLworfTsKKworc3RydWN0IGNvbnNfaGVhZGVyIHsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHBfdG9wLCB3X3RvcCwgc190b3A7CisgICAgaW50ICAgICAgICAgICAgICAgICBzdGFja19zaXplLCBzdGFja190b3A7CisgICAgc3RydWN0IGNvbnNfZGF0YSAgICpzdGFja19kYXRhOworfTsKKworc3RydWN0IGttcF9yZWdpb25faW5mbyB7CisgICAgY2hhciAgICAgICAgICAgICAgICAqdGV4dDsKKyAgICBpbnQgICAgICAgICAgICAgICAgIG9mZnNldFtLTVBfTUFYX0ZJRUxEU107CisgICAgaW50ICAgICAgICAgICAgICAgICBsZW5ndGhbS01QX01BWF9GSUVMRFNdOworfTsKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBLTVBfT1NfV0lORE9XUworICAgIHR5cGVkZWYgSEFORExFICAgICAgICAgICAgICBrbXBfdGhyZWFkX3Q7CisgICAgdHlwZWRlZiBEV09SRCAgICAgICAgICAgICAgIGttcF9rZXlfdDsKKyNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworCisjaWYgS01QX09TX1VOSVgKKyAgICB0eXBlZGVmIHB0aHJlYWRfdCAgICAgICAgICAga21wX3RocmVhZF90OworICAgIHR5cGVkZWYgcHRocmVhZF9rZXlfdCAgICAgICBrbXBfa2V5X3Q7CisjZW5kaWYKKworZXh0ZXJuIGttcF9rZXlfdCAgX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleTsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX3N5c19pbmZvIHsKKyAgICBsb25nIG1heHJzczsgICAgICAgICAgLyogdGhlIG1heGltdW0gcmVzaWRlbnQgc2V0IHNpemUgdXRpbGl6ZWQgKGluIGtpbG9ieXRlcykgICAgICovCisgICAgbG9uZyBtaW5mbHQ7ICAgICAgICAgIC8qIHRoZSBudW1iZXIgb2YgcGFnZSBmYXVsdHMgc2VydmljZWQgd2l0aG91dCBhbnkgSS9PICAgICAgICAqLworICAgIGxvbmcgbWFqZmx0OyAgICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIHBhZ2UgZmF1bHRzIHNlcnZpY2VkIHRoYXQgcmVxdWlyZWQgSS9PICAgICAgKi8KKyAgICBsb25nIG5zd2FwOyAgICAgICAgICAgLyogdGhlIG51bWJlciBvZiB0aW1lcyBhIHByb2Nlc3Mgd2FzICJzd2FwcGVkIiBvdXQgb2YgbWVtb3J5ICovCisgICAgbG9uZyBpbmJsb2NrOyAgICAgICAgIC8qIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGZpbGUgc3lzdGVtIGhhZCB0byBwZXJmb3JtIGlucHV0ICAqLworICAgIGxvbmcgb3VibG9jazsgICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBmaWxlIHN5c3RlbSBoYWQgdG8gcGVyZm9ybSBvdXRwdXQgKi8KKyAgICBsb25nIG52Y3N3OyAgICAgICAgICAgLyogdGhlIG51bWJlciBvZiB0aW1lcyBhIGNvbnRleHQgc3dpdGNoIHdhcyB2b2x1bnRhcmlseSAgICAgICovCisgICAgbG9uZyBuaXZjc3c7ICAgICAgICAgIC8qIHRoZSBudW1iZXIgb2YgdGltZXMgYSBjb250ZXh0IHN3aXRjaCB3YXMgZm9yY2VkICAgICAgICAgICAqLworfSBrbXBfc3lzX2luZm9fdDsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2NwdWluZm8geworICAgIGludCAgICAgICAgaW5pdGlhbGl6ZWQ7ICAvLyBJZiAwLCBvdGhlciBmaWVsZHMgYXJlIG5vdCBpbml0aWFsaXplZC4KKyAgICBpbnQgICAgICAgIHNpZ25hdHVyZTsgICAgLy8gQ1BVSUQoMSkuRUFYCisgICAgaW50ICAgICAgICBmYW1pbHk7ICAgICAgIC8vIENQVUlEKDEpLkVBWFsyNzoyMF0gKyBDUFVJRCgxKS5FQVhbMTE6OF0gKCBFeHRlbmRlZCBGYW1pbHkgKyBGYW1pbHkgKQorICAgIGludCAgICAgICAgbW9kZWw7ICAgICAgICAvLyAoIENQVUlEKDEpLkVBWFsxOToxNl0gPDwgNCApICsgQ1BVSUQoMSkuRUFYWzc6NF0gKCAoIEV4dGVuZGVkIE1vZGVsIDw8IDQgKSArIE1vZGVsKQorICAgIGludCAgICAgICAgc3RlcHBpbmc7ICAgICAvLyBDUFVJRCgxKS5FQVhbMzowXSAoIFN0ZXBwaW5nICkKKyAgICBpbnQgICAgICAgIHNzZTI7ICAgICAgICAgLy8gMCBpZiBTU0UyIGluc3RydWN0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCwgMSBvdGhlcndpc2UuCisgICAgaW50ICAgICAgICBydG07ICAgICAgICAgIC8vIDAgaWYgUlRNIGluc3RydWN0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCwgMSBvdGhlcndpc2UuCisgICAgaW50ICAgICAgICBjcHVfc3RhY2tvZmZzZXQ7CisgICAgaW50ICAgICAgICBhcGljX2lkOworICAgIGludCAgICAgICAgcGh5c2ljYWxfaWQ7CisgICAgaW50ICAgICAgICBsb2dpY2FsX2lkOworICAgIGttcF91aW50NjQgZnJlcXVlbmN5OyAgICAvLyBOb21pbmFsIENQVSBmcmVxdWVuY3kgaW4gSHouCit9IGttcF9jcHVpbmZvX3Q7CisKKworI2lmZGVmIEJVSUxEX1RWCisKK3N0cnVjdCB0dl90aHJlYWRwcml2YXRlIHsKKyAgICAvKiBSZWNvcmQgdHlwZSAjMSAqLworICAgIHZvaWQgICAgICAgICpnbG9iYWxfYWRkcjsKKyAgICB2b2lkICAgICAgICAqdGhyZWFkX2FkZHI7Cit9OworCitzdHJ1Y3QgdHZfZGF0YSB7CisgICAgc3RydWN0IHR2X2RhdGEgICAgICAqbmV4dDsKKyAgICB2b2lkICAgICAgICAgICAgICAgICp0eXBlOworICAgIHVuaW9uIHR2X3VuaW9uIHsKKyAgICAgICAgc3RydWN0IHR2X3RocmVhZHByaXZhdGUgdHA7CisgICAgfSB1OworfTsKKworZXh0ZXJuIGttcF9rZXlfdCBfX2ttcF90dl9rZXk7CisKKyNlbmRpZiAvKiBCVUlMRF9UViAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIFVTRV9JVFRfQlVJTEQKKy8vIFdlIGNhbm5vdCBpbmNsdWRlICJrbXBfaXR0LmgiIGR1ZSB0byBjaXJjdWxhciBkZXBlbmRlbmN5LiBEZWNsYXJlIHRoZSBvbmx5IHJlcXVpcmVkIHR5cGUgaGVyZS4KKy8vIExhdGVyIHdlIHdpbGwgY2hlY2sgdGhlIHR5cGUgbWVldHMgcmVxdWlyZW1lbnRzLgordHlwZWRlZiBpbnQga21wX2l0dF9tYXJrX3Q7CisjZGVmaW5lIEtNUF9JVFRfREVCVUcgMAorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBUYXNrcSBkYXRhIHN0cnVjdHVyZXMKKyAqLworCisjZGVmaW5lIEhJR0hfV0FURVJfTUFSSyhuc2xvdHMpICAgICAgICAgKCgobnNsb3RzKSAqIDMpIC8gNCkKKyNkZWZpbmUgX19LTVBfVEFTS1FfVEhVTktTX1BFUl9USCAgICAgICAgMSAgICAgIC8qIG51bSB0aHVua3MgdGhhdCBlYWNoIHRocmVhZCBjYW4gc2ltdWx0YW5lb3VzbHkgZXhlY3V0ZSBmcm9tIGEgdGFzayBxdWV1ZSAqLworCisvKiAgZmxhZ3MgZm9yIHRhc2txX2dsb2JhbF9mbGFncywga21wX3Rhc2tfcXVldWVfdCB0cV9mbGFncywga21wY190aHVua190IHRoX2ZsYWdzICAqLworCisjZGVmaW5lIFRRRl9JU19PUkRFUkVEICAgICAgICAgIDB4MDAwMSAgLyogIF9fa21wY190YXNrcSBpbnRlcmZhY2UsIHRhc2txIG9yZGVyZWQgICovCisjZGVmaW5lIFRRRl9JU19MQVNUUFJJVkFURSAgICAgIDB4MDAwMiAgLyogIF9fa21wY190YXNrcSBpbnRlcmZhY2UsIHRhc2txIHdpdGggbGFzdHByaXZhdGUgbGlzdCAgKi8KKyNkZWZpbmUgVFFGX0lTX05PV0FJVCAgICAgICAgICAgMHgwMDA0ICAvKiAgX19rbXBjX3Rhc2txIGludGVyZmFjZSwgZW5kIHRhc2txIG5vd2FpdCAgKi8KKyNkZWZpbmUgVFFGX0hFVVJJU1RJQ1MgICAgICAgICAgMHgwMDA4ICAvKiAgX19rbXBjX3Rhc2txIGludGVyZmFjZSwgdXNlIGhldXJpc3RpY3MgdG8gZGVjaWRlIHRhc2sgcXVldWUgc2l6ZSAgKi8KKyNkZWZpbmUgVFFGX0lOVEVSRkFDRV9SRVNFUlZFRDEgMHgwMDEwICAvKiAgX19rbXBjX3Rhc2txIGludGVyZmFjZSwgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgICovCisjZGVmaW5lIFRRRl9JTlRFUkZBQ0VfUkVTRVJWRUQyIDB4MDAyMCAgLyogIF9fa21wY190YXNrcSBpbnRlcmZhY2UsIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICAqLworI2RlZmluZSBUUUZfSU5URVJGQUNFX1JFU0VSVkVEMyAweDAwNDAgIC8qICBfX2ttcGNfdGFza3EgaW50ZXJmYWNlLCByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAgKi8KKyNkZWZpbmUgVFFGX0lOVEVSRkFDRV9SRVNFUlZFRDQgMHgwMDgwICAvKiAgX19rbXBjX3Rhc2txIGludGVyZmFjZSwgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgICovCisKKyNkZWZpbmUgVFFGX0lOVEVSRkFDRV9GTEFHUyAgICAgMHgwMGZmICAvKiAgYWxsIHRoZSBfX2ttcGNfdGFza3EgaW50ZXJmYWNlIGZsYWdzICAqLworCisjZGVmaW5lIFRRRl9JU19MQVNUX1RBU0sgICAgICAgIDB4MDEwMCAgLyogIGludGVybmFsL3JlYWQgYnkgaW5zdHJ1bWVudGF0aW9uOyBvbmx5IHVzZWQgd2l0aCBUUUZfSVNfTEFTVFBSSVZBVEUgICovCisjZGVmaW5lIFRRRl9UQVNLUV9UQVNLICAgICAgICAgIDB4MDIwMCAgLyogIGludGVybmFsIHVzZSBvbmx5OyB0aGlzIHRodW5rLT50aF90YXNrIGlzIHRoZSB0YXNrcV90YXNrICAqLworI2RlZmluZSBUUUZfUkVMRUFTRV9XT1JLRVJTICAgICAweDA0MDAgIC8qICBpbnRlcm5hbCB1c2Ugb25seTsgbXVzdCByZWxlYXNlIHdvcmtlciB0aHJlYWRzIG9uY2UgQU5ZIHF1ZXVlZCB0YXNrIGV4aXN0cyAoZ2xvYmFsKSAqLworI2RlZmluZSBUUUZfQUxMX1RBU0tTX1FVRVVFRCAgICAweDA4MDAgIC8qICBpbnRlcm5hbCB1c2Ugb25seTsgbm90aWZ5IHdvcmtlcnMgdGhhdCBtYXN0ZXIgaGFzIGZpbmlzaGVkIGVucXVldWluZyB0YXNrcyAqLworI2RlZmluZSBUUUZfUEFSQUxMRUxfQ09OVEVYVCAgICAweDEwMDAgIC8qICBpbnRlcm5hbCB1c2Ugb25seTogdGhpcyBxdWV1ZSBlbmNvdW50ZXJlZCBpbiBhIHBhcmFsbGVsIGNvbnRleHQ6IG5vdCBzZXJpYWxpemVkICovCisjZGVmaW5lIFRRRl9ERUFMTE9DQVRFRCAgICAgICAgIDB4MjAwMCAgLyogIGludGVybmFsIHVzZSBvbmx5OyB0aGlzIHF1ZXVlIGlzIG9uIHRoZSBmcmVlbGlzdCBhbmQgbm90IGluIHVzZSAqLworCisjZGVmaW5lIFRRRl9JTlRFUk5BTF9GTEFHUyAgICAgIDB4M2YwMCAgLyogIGFsbCB0aGUgaW50ZXJuYWwgdXNlIG9ubHkgZmxhZ3MgICovCisKK3R5cGVkZWYgc3RydWN0IEtNUF9BTElHTl9DQUNIRSBrbXBjX2FsaWduZWRfaW50MzJfdCB7CisgICAga21wX2ludDMyICAgICAgICAgICAgICAgICAgICAgIGFpX2RhdGE7Cit9IGttcGNfYWxpZ25lZF9pbnQzMl90OworCit0eXBlZGVmIHN0cnVjdCBLTVBfQUxJR05fQ0FDSEUga21wY19hbGlnbmVkX3F1ZXVlX3Nsb3RfdCB7CisgICAgc3RydWN0IGttcGNfdGh1bmtfdCAgICpxc190aHVuazsKK30ga21wY19hbGlnbmVkX3F1ZXVlX3Nsb3RfdDsKKwordHlwZWRlZiBzdHJ1Y3Qga21wY190YXNrX3F1ZXVlX3QgeworICAgICAgICAvKiB0YXNrIHF1ZXVlIGxpbmthZ2UgZmllbGRzIGZvciBuLWFyeSB0cmVlIG9mIHF1ZXVlcyAobG9ja2VkIHdpdGggZ2xvYmFsIHRhc2txX3RyZWVfbGNrKSAqLworICAgIGttcF9sb2NrX3QgICAgICAgICAgICAgICAgICAgIHRxX2xpbmtfbGNrOyAgICAgICAgICAvKiAgbG9jayBmb3IgY2hpbGQgbGluaywgY2hpbGQgbmV4dC9wcmV2IGxpbmtzIGFuZCBjaGlsZCByZWYgY291bnRzICovCisgICAgdW5pb24geworICAgICAgICBzdHJ1Y3Qga21wY190YXNrX3F1ZXVlX3QgKnRxX3BhcmVudDsgICAgICAgICAgICAvKiAgcG9pbnRlciB0byBwYXJlbnQgdGFza3EsIG5vdCBsb2NrZWQgKi8KKyAgICAgICAgc3RydWN0IGttcGNfdGFza19xdWV1ZV90ICp0cV9uZXh0X2ZyZWU7ICAgICAgICAgLyogIGZvciB0YXNrcSBpbnRlcm5hbCBmcmVlbGlzdHMsIGxvY2tlZCB3aXRoIGdsb2JhbCB0YXNrcV9mcmVlbGlzdF9sY2sgKi8KKyAgICB9IHRxOworICAgIHZvbGF0aWxlIHN0cnVjdCBrbXBjX3Rhc2tfcXVldWVfdCAqdHFfZmlyc3RfY2hpbGQ7ICAvKiAgcG9pbnRlciB0byBsaW5rZWQtbGlzdCBvZiBjaGlsZHJlbiwgbG9ja2VkIGJ5IHRxJ3MgdHFfbGlua19sY2sgKi8KKyAgICBzdHJ1Y3Qga21wY190YXNrX3F1ZXVlX3QgICAgICp0cV9uZXh0X2NoaWxkOyAgICAgICAgLyogIG5leHQgY2hpbGQgaW4gbGlua2VkLWxpc3QsIGxvY2tlZCBieSBwYXJlbnQgdHEncyB0cV9saW5rX2xjayAqLworICAgIHN0cnVjdCBrbXBjX3Rhc2tfcXVldWVfdCAgICAgKnRxX3ByZXZfY2hpbGQ7ICAgICAgICAvKiAgcHJldmlvdXMgY2hpbGQgaW4gbGlua2VkLWxpc3QsIGxvY2tlZCBieSBwYXJlbnQgdHEncyB0cV9saW5rX2xjayAqLworICAgIHZvbGF0aWxlIGttcF9pbnQzMiAgICAgICAgICAgIHRxX3JlZl9jb3VudDsgICAgICAgICAvKiAgcmVmZXJlbmNlIGNvdW50IG9mIHRocmVhZHMgd2l0aCBhY2Nlc3MgdG8gdGhpcyB0YXNrIHF1ZXVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAob3RoZXIgdGhhbiB0aGUgdGhyZWFkIGV4ZWN1dGluZyB0aGUga21wY19lbmRfdGFza3EgY2FsbCkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGxvY2tlZCBieSBwYXJlbnQgdHEncyB0cV9saW5rX2xjayAqLworCisgICAgICAgIC8qIHNoYXJlZCBkYXRhIGZvciB0YXNrIHF1ZXVlICovCisgICAgc3RydWN0IGttcGNfYWxpZ25lZF9zaGFyZWRfdmFyc190ICAgICp0cV9zaGFyZWRzOyAgIC8qICBwZXItdGhyZWFkIGFycmF5IG9mIHBvaW50ZXJzIHRvIHNoYXJlZCB2YXJpYWJsZSBzdHJ1Y3R1cmVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBvbmx5IG9uZSBhcnJheSBlbGVtZW50IGV4aXN0cyBmb3IgYWxsIGJ1dCBvdXRlcm1vc3QgdGFza3EgKi8KKworICAgICAgICAvKiBib29ra2VlcGluZyBmb3Igb3JkZXJlZCB0YXNrIHF1ZXVlICovCisgICAga21wX3VpbnQzMiAgICAgICAgICAgICAgICAgICAgdHFfdGFza251bV9xdWV1aW5nOyAgIC8qICBvcmRlcmVkIHRhc2sgbnVtYmVyIGFzc2lnbmVkIHdoaWxlIHF1ZXVpbmcgdGFza3MgKi8KKyAgICB2b2xhdGlsZSBrbXBfdWludDMyICAgICAgICAgICB0cV90YXNrbnVtX3NlcnZpbmc7ICAgLyogIG9yZGVyZWQgbnVtYmVyIG9mIG5leHQgdGFzayB0byBiZSBzZXJ2ZWQgKGV4ZWN1dGVkKSAqLworCisgICAgICAgIC8qIHRodW5rIHN0b3JhZ2UgbWFuYWdlbWVudCBmb3IgdGFzayBxdWV1ZSAqLworICAgIGttcF9sb2NrX3QgICAgICAgICAgICAgICAgICAgIHRxX2ZyZWVfdGh1bmtzX2xjazsgICAvKiAgbG9jayBmb3IgdGh1bmsgZnJlZWxpc3QgbWFuaXB1bGF0aW9uICovCisgICAgc3RydWN0IGttcGNfdGh1bmtfdCAgICAgICAgICAqdHFfZnJlZV90aHVua3M7ICAgICAgIC8qICB0aHVuayBmcmVlbGlzdCwgY2hhaW5lZCB2aWEgdGgudGhfbmV4dF9mcmVlICAqLworICAgIHN0cnVjdCBrbXBjX3RodW5rX3QgICAgICAgICAgKnRxX3RodW5rX3NwYWNlOyAgICAgICAvKiAgc3BhY2UgYWxsb2NhdGVkIGZvciB0aHVua3MgZm9yIHRoaXMgdGFzayBxdWV1ZSAgKi8KKworICAgICAgICAvKiBkYXRhIGZpZWxkcyBmb3IgcXVldWUgaXRzZWxmICovCisgICAga21wX2xvY2tfdCAgICAgICAgICAgICAgICAgICAgdHFfcXVldWVfbGNrOyAgICAgICAgIC8qICBsb2NrIGZvciBbZGVdZW5xdWV1ZSBvcGVyYXRpb25zOiB0cV9xdWV1ZSwgdHFfaGVhZCwgdHFfdGFpbCwgdHFfbmZ1bGwgKi8KKyAgICBrbXBjX2FsaWduZWRfcXVldWVfc2xvdF90ICAgICp0cV9xdWV1ZTsgICAgICAgICAgICAgLyogIGFycmF5IG9mIHF1ZXVlIHNsb3RzIHRvIGhvbGQgdGh1bmtzIGZvciB0YXNrcyAqLworICAgIHZvbGF0aWxlIHN0cnVjdCBrbXBjX3RodW5rX3QgKnRxX3Rhc2txX3Nsb3Q7ICAgICAgICAvKiAgc3BlY2lhbCBzbG90IGZvciB0YXNrcSB0YXNrIHRodW5rLCBvY2N1cGllZCBpZiBub3QgTlVMTCAgKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICAgICAgICB0cV9uc2xvdHM7ICAgICAgICAgICAgLyogICMgb2YgdHFfdGh1bmtfc3BhY2UgdGh1bmtzIGFsbG9jJ2QgKG5vdCBpbmNsLiB0cV90YXNrcV9zbG90IHNwYWNlKSAgKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICAgICAgICB0cV9oZWFkOyAgICAgICAgICAgICAgLyogIGVucXVldWUgcHV0cyBuZXh0IGl0ZW0gaW4gaGVyZSAoaW5kZXggaW50byB0cV9xdWV1ZSBhcnJheSkgKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICAgICAgICB0cV90YWlsOyAgICAgICAgICAgICAgLyogIGRlcXVldWUgdGFrZXMgbmV4dCBpdGVtIG91dCBvZiBoZXJlIChpbmRleCBpbnRvIHRxX3F1ZXVlIGFycmF5KSAqLworICAgIHZvbGF0aWxlIGttcF9pbnQzMiAgICAgICAgICAgIHRxX25mdWxsOyAgICAgICAgICAgICAvKiAgIyBvZiBvY2N1cGllZCBlbnRyaWVzIGluIHRhc2sgcXVldWUgcmlnaHQgbm93ICAqLworICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgICAgICAgIHRxX2hpd2F0OyAgICAgICAgICAgICAvKiAgaGlnaC13YXRlciBtYXJrIGZvciB0cV9uZnVsbCBhbmQgcXVldWUgc2NoZWR1bGluZyAgKi8KKyAgICB2b2xhdGlsZSBrbXBfaW50MzIgICAgICAgICAgICB0cV9mbGFnczsgICAgICAgICAgICAgLyogIFRRRl94eHggICovCisKKyAgICAgICAgLyogYm9va2tlZXBpbmcgZm9yIG91dHN0YW5kaW5nIHRodW5rcyAqLworICAgIHN0cnVjdCBrbXBjX2FsaWduZWRfaW50MzJfdCAgKnRxX3RoX3RodW5rczsgICAgICAgICAvKiAgcGVyLXRocmVhZCBhcnJheSBmb3IgIyBvZiByZWd1bGFyIHRodW5rcyBjdXJyZW50bHkgYmVpbmcgZXhlY3V0ZWQgKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICAgICAgICB0cV9ucHJvYzsgICAgICAgICAgICAgLyogIG51bWJlciBvZiB0aHVua3MgaW4gdGhlIHRoX3RodW5rcyBhcnJheSAqLworCisgICAgICAgIC8qIHN0YXRpc3RpY3MgbGlicmFyeSBib29ra2VlcGluZyAqLworICAgIGlkZW50X3QgICAgICAgICAgICAgICAgICAgICAgICp0cV9sb2M7ICAgICAgICAgICAgICAvKiAgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uIGZvciB0YXNrcSBkaXJlY3RpdmUgKi8KK30ga21wY190YXNrX3F1ZXVlX3Q7CisKK3R5cGVkZWYgdm9pZCAoKmttcGNfdGFza190KSAoa21wX2ludDMyIGdsb2JhbF90aWQsIHN0cnVjdCBrbXBjX3RodW5rX3QgKnRodW5rKTsKKworLyogIHNpemVvZl9zaGFyZWRzIHBhc3NlZCBhcyBhcmcgdG8gX19rbXBjX3Rhc2txIGNhbGwgICovCit0eXBlZGVmIHN0cnVjdCBrbXBjX3NoYXJlZF92YXJzX3QgeyAgICAgICAgICAgICAvKiAgYWxpZ25lZCBkdXJpbmcgZHluYW1pYyBhbGxvY2F0aW9uICovCisgICAga21wY190YXNrX3F1ZXVlX3QgICAgICAgICAqc3ZfcXVldWU7CisgICAgLyogIChwb2ludGVycyB0bykgc2hhcmVkIHZhcnMgICovCit9IGttcGNfc2hhcmVkX3ZhcnNfdDsKKwordHlwZWRlZiBzdHJ1Y3QgS01QX0FMSUdOX0NBQ0hFIGttcGNfYWxpZ25lZF9zaGFyZWRfdmFyc190IHsKKyAgICB2b2xhdGlsZSBzdHJ1Y3Qga21wY19zaGFyZWRfdmFyc190ICAgICAqYWlfZGF0YTsKK30ga21wY19hbGlnbmVkX3NoYXJlZF92YXJzX3Q7CisKKy8qICBzaXplb2ZfdGh1bmsgcGFzc2VkIGFzIGFyZyB0byBrbXBjX3Rhc2txIGNhbGwgICovCit0eXBlZGVmIHN0cnVjdCBrbXBjX3RodW5rX3QgeyAgICAgICAgICAgICAgICAgICAvKiAgYWxpZ25lZCBkdXJpbmcgZHluYW1pYyBhbGxvY2F0aW9uICovCisgICAgdW5pb24geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgZmllbGQgdXNlZCBmb3IgaW50ZXJuYWwgZnJlZWxpc3RzIHRvbyAgKi8KKyAgICAgICAga21wY19zaGFyZWRfdmFyc190ICAqdGhfc2hhcmVkczsKKyAgICAgICAgc3RydWN0IGttcGNfdGh1bmtfdCAqdGhfbmV4dF9mcmVlOyAgICAgIC8qICBmcmVlbGlzdCBvZiBpbmRpdmlkdWFsIHRodW5rcyB3aXRoaW4gcXVldWUsIGhlYWQgYXQgdHFfZnJlZV90aHVua3MgICovCisgICAgfSB0aDsKKyAgICBrbXBjX3Rhc2tfdCB0aF90YXNrOyAgICAgICAgICAgICAgICAgICAgICAgIC8qICB0YXNrcV90YXNrIGlmIGZsYWdzICYgVFFGX1RBU0tRX1RBU0sgICovCisgICAgc3RydWN0IGttcGNfdGh1bmtfdCAqdGhfZW5jbF90aHVuazsgICAgICAgICAvKiAgcG9pbnRlciB0byBkeW5hbWljYWxseSBlbmNsb3NpbmcgdGh1bmsgb24gdGhpcyB0aHJlYWQncyBjYWxsIHN0YWNrICovCisgICAga21wX2ludDMyIHRoX2ZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgVFFGX3h4eCAodHFfZmxhZ3MgaW50ZXJmYWNlIHBsdXMgcG9zc2libGUgaW50ZXJuYWwgZmxhZ3MpICAqLworICAgIGttcF9pbnQzMiB0aF9zdGF0dXM7CisgICAga21wX3VpbnQzMiB0aF90YXNrbnVtOyAgICAgICAgICAgICAgICAgICAgICAvKiAgdGFzayBudW1iZXIgYXNzaWduZWQgaW4gb3JkZXIgb2YgcXVldWluZywgdXNlZCBmb3Igb3JkZXJlZCBzZWN0aW9ucyAqLworICAgIC8qICBwcml2YXRlIHZhcnMgICovCit9IGttcGNfdGh1bmtfdDsKKwordHlwZWRlZiBzdHJ1Y3QgS01QX0FMSUdOX0NBQ0hFIGttcF90YXNrcSB7CisgICAgaW50ICAgICAgICAgICAgICAgICB0cV9jdXJyX3RodW5rX2NhcGFjaXR5OworCisgICAga21wY190YXNrX3F1ZXVlX3QgICp0cV9yb290OworICAgIGttcF9pbnQzMiAgICAgICAgICAgdHFfZ2xvYmFsX2ZsYWdzOworCisgICAga21wX2xvY2tfdCAgICAgICAgICB0cV9mcmVlbGlzdF9sY2s7CisgICAga21wY190YXNrX3F1ZXVlX3QgICp0cV9mcmVlbGlzdDsKKworICAgIGttcGNfdGh1bmtfdCAgICAgICoqdHFfY3Vycl90aHVuazsKK30ga21wX3Rhc2txX3Q7CisKKy8qIEVORCBUYXNrcSBkYXRhIHN0cnVjdHVyZXMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit0eXBlZGVmIGttcF9pbnQzMiBrbXBfY3JpdGljYWxfbmFtZVs4XTsKKworLyohCitAaW5ncm91cCBQQVJBTExFTAorVGhlIHR5cGUgZm9yIGEgbWljcm90YXNrIHdoaWNoIGdldHMgcGFzc2VkIHRvIEByZWYgX19rbXBjX2ZvcmtfY2FsbCgpLgorVGhlIGFyZ3VtZW50cyB0byB0aGUgb3V0bGluZWQgZnVuY3Rpb24gYXJlCitAcGFyYW0gZ2xvYmFsX3RpZCB0aGUgZ2xvYmFsIHRocmVhZCBpZGVudGl0eSBvZiB0aGUgdGhyZWFkIGV4ZWN1dGluZyB0aGUgZnVuY3Rpb24uCitAcGFyYW0gYm91bmRfdGlkICB0aGUgbG9jYWwgaWRlbnRpdGl5IG9mIHRoZSB0aHJlYWQgZXhlY3V0aW5nIHRoZSBmdW5jdGlvbgorQHBhcmFtIC4uLiBwb2ludGVycyB0byBzaGFyZWQgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHRoZSBmdW5jdGlvbi4KKyovCit0eXBlZGVmIHZvaWQgKCprbXBjX21pY3JvKSAgICAgICAgICAgICAgKCBrbXBfaW50MzIgKiBnbG9iYWxfdGlkLCBrbXBfaW50MzIgKiBib3VuZF90aWQsIC4uLiApOwordHlwZWRlZiB2b2lkICgqa21wY19taWNyb19ib3VuZCkgICAgICAgICgga21wX2ludDMyICogYm91bmRfdGlkLCBrbXBfaW50MzIgKiBib3VuZF9udGgsIC4uLiApOworCisvKiEKK0Bpbmdyb3VwIFRIUkVBRFBSSVZBVEUKK0B7CisqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBUaHJlYWRwcml2YXRlIGluaXRpYWxpemF0aW9uL2ZpbmFsaXphdGlvbiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgKi8KKworLyogIGZvciBub24tYXJyYXkgb2JqZWN0czogIF9fa21wY190aHJlYWRwcml2YXRlX3JlZ2lzdGVyKCkgICovCisKKy8qIQorIFBvaW50ZXIgdG8gdGhlIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLgorIFRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgPHR0PnRoaXM8L3R0PiBwb2ludGVyCisqLwordHlwZWRlZiB2b2lkICooKmttcGNfY3RvcikgICAgKHZvaWQgKik7CisKKy8qIQorIFBvaW50ZXIgdG8gdGhlIGRlc3RydWN0b3IgZnVuY3Rpb24uCisgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSA8dHQ+dGhpczwvdHQ+IHBvaW50ZXIKKyovCit0eXBlZGVmIHZvaWQgKCprbXBjX2R0b3IpICAgICAodm9pZCAqIC8qLCBzaXplX3QgKi8pOyAvKiAybmQgYXJnOiBtYWdpYyBudW1iZXIgZm9yIEtDQyB1bnVzZWQgYnkgSW50ZWwgY29tcGlsZXIgKi8KKy8qIQorIFBvaW50ZXIgdG8gYW4gYWx0ZXJuYXRlIGNvbnN0cnVjdG9yLgorIFRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgPHR0PnRoaXM8L3R0PiBwb2ludGVyLgorKi8KK3R5cGVkZWYgdm9pZCAqKCprbXBjX2NjdG9yKSAgICh2b2lkICosIHZvaWQgKik7CisKKy8qICBmb3IgYXJyYXkgb2JqZWN0czogX19rbXBjX3RocmVhZHByaXZhdGVfcmVnaXN0ZXJfdmVjKCkgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpcnN0IGFyZzogInRoaXMiIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGFzdCBhcmc6IG51bWJlciBvZiBhcnJheSBlbGVtZW50cyAqLworLyohCisgQXJyYXkgY29uc3RydWN0b3IuCisgRmlyc3QgYXJndW1lbnQgaXMgdGhlIDx0dD50aGlzPC90dD4gcG9pbnRlcgorIFNlY29uZCBhcmd1bWVudCB0aGUgbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzLgorKi8KK3R5cGVkZWYgdm9pZCAqKCprbXBjX2N0b3JfdmVjKSAgKHZvaWQgKiwgc2l6ZV90KTsKKy8qIQorIFBvaW50ZXIgdG8gdGhlIGFycmF5IGRlc3RydWN0b3IgZnVuY3Rpb24uCisgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSA8dHQ+dGhpczwvdHQ+IHBvaW50ZXIKKyBTZWNvbmQgYXJndW1lbnQgdGhlIG51bWJlciBvZiBhcnJheSBlbGVtZW50cy4KKyovCit0eXBlZGVmIHZvaWQgKCprbXBjX2R0b3JfdmVjKSAgICh2b2lkICosIHNpemVfdCk7CisvKiEKKyBBcnJheSBjb25zdHJ1Y3Rvci4KKyBGaXJzdCBhcmd1bWVudCBpcyB0aGUgPHR0PnRoaXM8L3R0PiBwb2ludGVyCisgVGhpcmQgYXJndW1lbnQgdGhlIG51bWJlciBvZiBhcnJheSBlbGVtZW50cy4KKyovCit0eXBlZGVmIHZvaWQgKigqa21wY19jY3Rvcl92ZWMpICh2b2lkICosIHZvaWQgKiwgc2l6ZV90KTsgLyogZnVuY3Rpb24gdW51c2VkIGJ5IGNvbXBpbGVyICovCisKKy8qIQorQH0KKyovCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIGtlZXBzIHRyYWNrZWQgb2YgdGhyZWFkcHJpdmF0ZSBjYWNoZSBhbGxvY2F0aW9ucyBmb3IgY2xlYW51cCBsYXRlciAqLwordHlwZWRlZiBzdHJ1Y3Qga21wX2NhY2hlZF9hZGRyIHsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICoqYWRkcjsgICAgICAgICAgIC8qIGFkZHJlc3Mgb2YgYWxsb2NhdGVkIGNhY2hlICovCisgICAgc3RydWN0IGttcF9jYWNoZWRfYWRkciAgICAgKm5leHQ7ICAgICAgICAgICAvKiBwb2ludGVyIHRvIG5leHQgY2FjaGVkIGFkZHJlc3MgKi8KK30ga21wX2NhY2hlZF9hZGRyX3Q7CisKK3N0cnVjdCBwcml2YXRlX2RhdGEgeworICAgIHN0cnVjdCBwcml2YXRlX2RhdGEgKm5leHQ7ICAgICAgICAgIC8qIFRoZSBuZXh0IGRlc2NyaXB0b3IgaW4gdGhlIGxpc3QgICAgICAqLworICAgIHZvaWQgICAgICAgICAgICAgICAgKmRhdGE7ICAgICAgICAgIC8qIFRoZSBkYXRhIGJ1ZmZlciBmb3IgdGhpcyBkZXNjcmlwdG9yICAqLworICAgIGludCAgICAgICAgICAgICAgICAgIG1vcmU7ICAgICAgICAgIC8qIFRoZSByZXBlYXQgY291bnQgZm9yIHRoaXMgZGVzY3JpcHRvciAqLworICAgIHNpemVfdCAgICAgICAgICAgICAgIHNpemU7ICAgICAgICAgIC8qIFRoZSBkYXRhIHNpemUgZm9yIHRoaXMgZGVzY3JpcHRvciAgICAqLworfTsKKworc3RydWN0IHByaXZhdGVfY29tbW9uIHsKKyAgICBzdHJ1Y3QgcHJpdmF0ZV9jb21tb24gICAgICpuZXh0OworICAgIHN0cnVjdCBwcml2YXRlX2NvbW1vbiAgICAgKmxpbms7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqZ2JsX2FkZHI7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqcGFyX2FkZHI7ICAgICAgICAvKiBwYXJfYWRkciA9PSBnYmxfYWRkciBmb3IgTUFTVEVSIHRocmVhZCAqLworICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgIGNtbl9zaXplOworfTsKKworc3RydWN0IHNoYXJlZF9jb21tb24KK3sKKyAgICBzdHJ1Y3Qgc2hhcmVkX2NvbW1vbiAgICAgICpuZXh0OworICAgIHN0cnVjdCBwcml2YXRlX2RhdGEgICAgICAgKnBvZF9pbml0OworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKm9ial9pbml0OworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKmdibF9hZGRyOworICAgIHVuaW9uIHsKKyAgICAgICAga21wY19jdG9yICAgICAgICAgICAgICBjdG9yOworICAgICAgICBrbXBjX2N0b3JfdmVjICAgICAgICAgIGN0b3J2OworICAgIH0gY3Q7CisgICAgdW5pb24geworICAgICAgICBrbXBjX2NjdG9yICAgICAgICAgICAgIGNjdG9yOworICAgICAgICBrbXBjX2NjdG9yX3ZlYyAgICAgICAgIGNjdG9ydjsKKyAgICB9IGNjdDsKKyAgICB1bmlvbiB7CisgICAgICAgIGttcGNfZHRvciAgICAgICAgICAgICAgZHRvcjsKKyAgICAgICAga21wY19kdG9yX3ZlYyAgICAgICAgICBkdG9ydjsKKyAgICB9IGR0OworICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgIHZlY19sZW47CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgaXNfdmVjOworICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgIGNtbl9zaXplOworfTsKKworI2RlZmluZSBLTVBfSEFTSF9UQUJMRV9MT0cyICAgICA5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxvZzIgb2YgdGhlIGhhc2ggdGFibGUgc2l6ZSAqLworI2RlZmluZSBLTVBfSEFTSF9UQUJMRV9TSVpFICAgICAoMSA8PCBLTVBfSEFTSF9UQUJMRV9MT0cyKSAgICAgIC8qIHNpemUgb2YgdGhlIGhhc2ggdGFibGUgKi8KKyNkZWZpbmUgS01QX0hBU0hfU0hJRlQgICAgICAgICAgMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aHJvdyBhd2F5IHRoaXMgbWFueSBsb3cgYml0cyBmcm9tIHRoZSBhZGRyZXNzICovCisjZGVmaW5lIEtNUF9IQVNIKHgpICAgICAgICAgICAgICgoKChrbXBfdWludHB0cl90KSB4KSA+PiBLTVBfSEFTSF9TSElGVCkgJiAoS01QX0hBU0hfVEFCTEVfU0laRS0xKSkKKworc3RydWN0IGNvbW1vbl90YWJsZSB7CisgICAgc3RydWN0ICBwcml2YXRlX2NvbW1vbiAgICAgICpkYXRhWyBLTVBfSEFTSF9UQUJMRV9TSVpFIF07Cit9OworCitzdHJ1Y3Qgc2hhcmVkX3RhYmxlIHsKKyAgICBzdHJ1Y3QgIHNoYXJlZF9jb21tb24gICAgICAgKmRhdGFbIEtNUF9IQVNIX1RBQkxFX1NJWkUgXTsKK307CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgS01QX1NUQVRJQ19TVEVBTF9FTkFCTEVECit0eXBlZGVmIHN0cnVjdCBLTVBfQUxJR05fQ0FDSEUgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvMzIgeworICAgIGttcF9pbnQzMiBjb3VudDsKKyAgICBrbXBfaW50MzIgdWI7CisgICAgLyogQWRkaW5nIEtNUF9BTElHTl9DQUNIRSBoZXJlIGRvZXNuJ3QgaGVscCAvIGNhbiBodXJ0IHBlcmZvcm1hbmNlICovCisgICAga21wX2ludDMyIGxiOworICAgIGttcF9pbnQzMiBzdDsKKyAgICBrbXBfaW50MzIgdGM7CisgICAga21wX2ludDMyIHN0YXRpY19zdGVhbF9jb3VudGVyOyAvKiBmb3Igc3RhdGljX3N0ZWFsIG9ubHk7IG1heWJlIGJldHRlciB0byBwdXQgYWZ0ZXIgdWIgKi8KKworICAgIC8vIEtNUF9BTElHTiggMTYgKSBlbnN1cmVzICggaWYgdGhlIEtNUF9BTElHTiBtYWNybyBpcyB0dXJuZWQgb24gKQorICAgIC8vICAgIGEpIHBhcm0zIGlzIHByb3Blcmx5IGFsaWduZWQgYW5kCisgICAgLy8gICAgYikgYWxsIHBhcm0xLTQgYXJlIGluIHRoZSBzYW1lIGNhY2hlIGxpbmUuCisgICAgLy8gQmVjYXVzZSBvZiBwYXJtMS00IGFyZSB1c2VkIHRvZ2V0aGVyLCBwZXJmb3JtYW5jZSBzZWVtcyB0byBiZSBiZXR0ZXIKKyAgICAvLyBpZiB0aGV5IGFyZSBpbiB0aGUgc2FtZSBsaW5lIChub3QgbWVhc3VyZWQgdGhvdWdoKS4KKworICAgIHN0cnVjdCBLTVBfQUxJR04oIDMyICkgeyAvLyBBQzogY2hhbmdlZCAxNiB0byAzMiBpbiBvcmRlciB0byBzaW1wbGlmeSB0ZW1wbGF0ZQorICAgICAgICBrbXBfaW50MzIgcGFybTE7ICAgICAvLyAgICAgc3RydWN0dXJlcyBpbiBrbXBfZGlzcGF0Y2guY3BwLiBUaGlzIHNob3VsZAorICAgICAgICBrbXBfaW50MzIgcGFybTI7ICAgICAvLyAgICAgbWFrZSBubyByZWFsIGNoYW5nZSBhdCBsZWFzdCB3aGlsZSBwYWRkaW5nIGlzIG9mZi4KKyAgICAgICAga21wX2ludDMyIHBhcm0zOworICAgICAgICBrbXBfaW50MzIgcGFybTQ7CisgICAgfTsKKworICAgIGttcF91aW50MzIgb3JkZXJlZF9sb3dlcjsKKyAgICBrbXBfdWludDMyIG9yZGVyZWRfdXBwZXI7CisjaWYgS01QX09TX1dJTkRPV1MKKyAgICAvLyBUaGlzIHZhciBjYW4gYmUgcGxhY2VkIGluIHRoZSBob2xlIGJldHdlZW4gJ3RjJyBhbmQgJ3Bhcm0xJywgaW5zdGVhZCBvZiAnc3RhdGljX3N0ZWFsX2NvdW50ZXInLgorICAgIC8vIEl0IHdvdWxkIGJlIG5pY2UgdG8gbWVhc3VyZSBleGVjdXRpb24gdGltZXMuCisgICAgLy8gQ29uZGl0aW9uYWwgaWYvZW5kaWYgY2FuIGJlIHJlbW92ZWQgYXQgYWxsLgorICAgIGttcF9pbnQzMiBsYXN0X3VwcGVyOworI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCit9IGRpc3BhdGNoX3ByaXZhdGVfaW5mbzMyX3Q7CisKK3R5cGVkZWYgc3RydWN0IEtNUF9BTElHTl9DQUNIRSBkaXNwYXRjaF9wcml2YXRlX2luZm82NCB7CisgICAga21wX2ludDY0IGNvdW50OyAgIC8qIGN1cnJlbnQgY2h1bmsgbnVtYmVyIGZvciBzdGF0aWMgYW5kIHN0YXRpYy1zdGVhbCBzY2hlZHVsaW5nKi8KKyAgICBrbXBfaW50NjQgdWI7ICAgICAgLyogdXBwZXItYm91bmQgKi8KKyAgICAvKiBBZGRpbmcgS01QX0FMSUdOX0NBQ0hFIGhlcmUgZG9lc24ndCBoZWxwIC8gY2FuIGh1cnQgcGVyZm9ybWFuY2UgKi8KKyAgICBrbXBfaW50NjQgbGI7ICAgICAgLyogbG93ZXItYm91bmQgKi8KKyAgICBrbXBfaW50NjQgc3Q7ICAgICAgLyogc3RyaWRlICovCisgICAga21wX2ludDY0IHRjOyAgICAgIC8qIHRyaXAgY291bnQgKG51bWJlciBvZiBpdGVyYXRpb25zKSAqLworICAgIGttcF9pbnQ2NCBzdGF0aWNfc3RlYWxfY291bnRlcjsgLyogZm9yIHN0YXRpY19zdGVhbCBvbmx5OyBtYXliZSBiZXR0ZXIgdG8gcHV0IGFmdGVyIHViICovCisKKyAgICAvKiBwYXJtWzEtNF0gYXJlIHVzZWQgaW4gZGlmZmVyZW50IHdheXMgYnkgZGlmZmVyZW50IHNjaGVkdWxpbmcgYWxnb3JpdGhtcyAqLworCisgICAgLy8gS01QX0FMSUdOKCAzMiApIGVuc3VyZXMgKCBpZiB0aGUgS01QX0FMSUdOIG1hY3JvIGlzIHR1cm5lZCBvbiApCisgICAgLy8gICAgYSkgcGFybTMgaXMgcHJvcGVybHkgYWxpZ25lZCBhbmQKKyAgICAvLyAgICBiKSBhbGwgcGFybTEtNCBhcmUgaW4gdGhlIHNhbWUgY2FjaGUgbGluZS4KKyAgICAvLyBCZWNhdXNlIG9mIHBhcm0xLTQgYXJlIHVzZWQgdG9nZXRoZXIsIHBlcmZvcm1hbmNlIHNlZW1zIHRvIGJlIGJldHRlcgorICAgIC8vIGlmIHRoZXkgYXJlIGluIHRoZSBzYW1lIGxpbmUgKG5vdCBtZWFzdXJlZCB0aG91Z2gpLgorCisgICAgc3RydWN0IEtNUF9BTElHTiggMzIgKSB7CisgICAgICAgIGttcF9pbnQ2NCBwYXJtMTsKKyAgICAgICAga21wX2ludDY0IHBhcm0yOworICAgICAgICBrbXBfaW50NjQgcGFybTM7CisgICAgICAgIGttcF9pbnQ2NCBwYXJtNDsKKyAgICB9OworCisgICAga21wX3VpbnQ2NCBvcmRlcmVkX2xvd2VyOworICAgIGttcF91aW50NjQgb3JkZXJlZF91cHBlcjsKKyNpZiBLTVBfT1NfV0lORE9XUworICAgIC8vIFRoaXMgdmFyIGNhbiBiZSBwbGFjZWQgaW4gdGhlIGhvbGUgYmV0d2VlbiAndGMnIGFuZCAncGFybTEnLCBpbnN0ZWFkIG9mICdzdGF0aWNfc3RlYWxfY291bnRlcicuCisgICAgLy8gSXQgd291bGQgYmUgbmljZSB0byBtZWFzdXJlIGV4ZWN1dGlvbiB0aW1lcy4KKyAgICAvLyBDb25kaXRpb25hbCBpZi9lbmRpZiBjYW4gYmUgcmVtb3ZlZCBhdCBhbGwuCisgICAga21wX2ludDY0IGxhc3RfdXBwZXI7CisjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KK30gZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvNjRfdDsKKyNlbHNlIC8qIEtNUF9TVEFUSUNfU1RFQUxfRU5BQkxFRCAqLwordHlwZWRlZiBzdHJ1Y3QgS01QX0FMSUdOX0NBQ0hFIGRpc3BhdGNoX3ByaXZhdGVfaW5mbzMyIHsKKyAgICBrbXBfaW50MzIgbGI7CisgICAga21wX2ludDMyIHViOworICAgIGttcF9pbnQzMiBzdDsKKyAgICBrbXBfaW50MzIgdGM7CisKKyAgICBrbXBfaW50MzIgcGFybTE7CisgICAga21wX2ludDMyIHBhcm0yOworICAgIGttcF9pbnQzMiBwYXJtMzsKKyAgICBrbXBfaW50MzIgcGFybTQ7CisKKyAgICBrbXBfaW50MzIgY291bnQ7CisKKyAgICBrbXBfdWludDMyIG9yZGVyZWRfbG93ZXI7CisgICAga21wX3VpbnQzMiBvcmRlcmVkX3VwcGVyOworI2lmIEtNUF9PU19XSU5ET1dTCisgICAga21wX2ludDMyIGxhc3RfdXBwZXI7CisjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KK30gZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvMzJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgS01QX0FMSUdOX0NBQ0hFIGRpc3BhdGNoX3ByaXZhdGVfaW5mbzY0IHsKKyAgICBrbXBfaW50NjQgbGI7ICAgICAgLyogbG93ZXItYm91bmQgKi8KKyAgICBrbXBfaW50NjQgdWI7ICAgICAgLyogdXBwZXItYm91bmQgKi8KKyAgICBrbXBfaW50NjQgc3Q7ICAgICAgLyogc3RyaWRlICovCisgICAga21wX2ludDY0IHRjOyAgICAgIC8qIHRyaXAgY291bnQgKG51bWJlciBvZiBpdGVyYXRpb25zKSAqLworCisgICAgLyogcGFybVsxLTRdIGFyZSB1c2VkIGluIGRpZmZlcmVudCB3YXlzIGJ5IGRpZmZlcmVudCBzY2hlZHVsaW5nIGFsZ29yaXRobXMgKi8KKyAgICBrbXBfaW50NjQgcGFybTE7CisgICAga21wX2ludDY0IHBhcm0yOworICAgIGttcF9pbnQ2NCBwYXJtMzsKKyAgICBrbXBfaW50NjQgcGFybTQ7CisKKyAgICBrbXBfaW50NjQgY291bnQ7ICAgLyogY3VycmVudCBjaHVuayBudW1iZXIgZm9yIHN0YXRpYyBzY2hlZHVsaW5nICovCisKKyAgICBrbXBfdWludDY0IG9yZGVyZWRfbG93ZXI7CisgICAga21wX3VpbnQ2NCBvcmRlcmVkX3VwcGVyOworI2lmIEtNUF9PU19XSU5ET1dTCisgICAga21wX2ludDY0IGxhc3RfdXBwZXI7CisjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KK30gZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvNjRfdDsKKyNlbmRpZiAvKiBLTVBfU1RBVElDX1NURUFMX0VOQUJMRUQgKi8KKwordHlwZWRlZiBzdHJ1Y3QgS01QX0FMSUdOX0NBQ0hFIGRpc3BhdGNoX3ByaXZhdGVfaW5mbyB7CisgICAgdW5pb24gcHJpdmF0ZV9pbmZvIHsKKyAgICAgICAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvMzJfdCAgcDMyOworICAgICAgICBkaXNwYXRjaF9wcml2YXRlX2luZm82NF90ICBwNjQ7CisgICAgfSB1OworICAgIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZTsgIC8qIHNjaGVkdWxpbmcgYWxnb3JpdGhtICovCisgICAga21wX2ludDMyICAgICAgIG9yZGVyZWQ7ICAgLyogb3JkZXJlZCBjbGF1c2Ugc3BlY2lmaWVkICovCisgICAga21wX2ludDMyICAgICAgIG9yZGVyZWRfYnVtcGVkOworICAgIGttcF9pbnQzMiAgIG9yZGVyZWRfZHVtbXlbS01QX01BWF9PUkRFUkVELTNdOyAvLyB0byByZXRhaW4gdGhlIHN0cnVjdHVyZSBzaXplIGFmdGVyIG1ha2luZyBvcmRlcmVkX2l0ZXJhdGlvbiBzY2FsYXIKKyAgICBzdHJ1Y3QgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvICogbmV4dDsgLyogc3RhY2sgb2YgYnVmZmVycyBmb3IgbmVzdCBvZiBzZXJpYWwgcmVnaW9ucyAqLworICAgIGttcF9pbnQzMiAgICAgICBub21lcmdlOyAgIC8qIGRvbid0IG1lcmdlIGl0ZXJzIGlmIHNlcmlhbGl6ZWQgKi8KKyAgICBrbXBfaW50MzIgICAgICAgdHlwZV9zaXplOyAvKiB0aGUgc2l6ZSBvZiB0eXBlcyBpbiBwcml2YXRlX2luZm8gKi8KKyAgICBlbnVtIGNvbnNfdHlwZSAgcHVzaGVkX3dzOworfSBkaXNwYXRjaF9wcml2YXRlX2luZm9fdDsKKwordHlwZWRlZiBzdHJ1Y3QgZGlzcGF0Y2hfc2hhcmVkX2luZm8zMiB7CisgICAgLyogY2h1bmsgaW5kZXggdW5kZXIgZHluYW1pYywgbnVtYmVyIG9mIGlkbGUgdGhyZWFkcyB1bmRlciBzdGF0aWMtc3RlYWw7CisgICAgICAgaXRlcmF0aW9uIGluZGV4IG90aGVyd2lzZSAqLworICAgIHZvbGF0aWxlIGttcF91aW50MzIgICAgICBpdGVyYXRpb247CisgICAgdm9sYXRpbGUga21wX3VpbnQzMiAgICAgIG51bV9kb25lOworICAgIHZvbGF0aWxlIGttcF91aW50MzIgICAgICBvcmRlcmVkX2l0ZXJhdGlvbjsKKyAgICBrbXBfaW50MzIgICBvcmRlcmVkX2R1bW15W0tNUF9NQVhfT1JERVJFRC0xXTsgLy8gdG8gcmV0YWluIHRoZSBzdHJ1Y3R1cmUgc2l6ZSBhZnRlciBtYWtpbmcgb3JkZXJlZF9pdGVyYXRpb24gc2NhbGFyCit9IGRpc3BhdGNoX3NoYXJlZF9pbmZvMzJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZGlzcGF0Y2hfc2hhcmVkX2luZm82NCB7CisgICAgLyogY2h1bmsgaW5kZXggdW5kZXIgZHluYW1pYywgbnVtYmVyIG9mIGlkbGUgdGhyZWFkcyB1bmRlciBzdGF0aWMtc3RlYWw7CisgICAgICAgaXRlcmF0aW9uIGluZGV4IG90aGVyd2lzZSAqLworICAgIHZvbGF0aWxlIGttcF91aW50NjQgICAgICBpdGVyYXRpb247CisgICAgdm9sYXRpbGUga21wX3VpbnQ2NCAgICAgIG51bV9kb25lOworICAgIHZvbGF0aWxlIGttcF91aW50NjQgICAgICBvcmRlcmVkX2l0ZXJhdGlvbjsKKyAgICBrbXBfaW50NjQgICBvcmRlcmVkX2R1bW15W0tNUF9NQVhfT1JERVJFRC0xXTsgLy8gdG8gcmV0YWluIHRoZSBzdHJ1Y3R1cmUgc2l6ZSBhZnRlciBtYWtpbmcgb3JkZXJlZF9pdGVyYXRpb24gc2NhbGFyCit9IGRpc3BhdGNoX3NoYXJlZF9pbmZvNjRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZGlzcGF0Y2hfc2hhcmVkX2luZm8geworICAgIHVuaW9uIHNoYXJlZF9pbmZvIHsKKyAgICAgICAgZGlzcGF0Y2hfc2hhcmVkX2luZm8zMl90ICBzMzI7CisgICAgICAgIGRpc3BhdGNoX3NoYXJlZF9pbmZvNjRfdCAgczY0OworICAgIH0gdTsKKy8qICAgIHZvbGF0aWxlIGttcF9pbnQzMiAgICAgIGRpc3BhdGNoX2Fib3J0OyAgZGVwcmljYXRlZCAqLworICAgIHZvbGF0aWxlIGttcF91aW50MzIgICAgIGJ1ZmZlcl9pbmRleDsKK30gZGlzcGF0Y2hfc2hhcmVkX2luZm9fdDsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2Rpc3AgeworICAgIC8qIFZlY3RvciBmb3IgT1JERVJFRCBTRUNUSU9OICovCisgICAgdm9pZCAoKnRoX2Rlb19mY24pKCBpbnQgKiBndGlkLCBpbnQgKiBjaWQsIGlkZW50X3QgKik7CisgICAgLyogVmVjdG9yIGZvciBFTkQgT1JERVJFRCBTRUNUSU9OICovCisgICAgdm9pZCAoKnRoX2R4b19mY24pKCBpbnQgKiBndGlkLCBpbnQgKiBjaWQsIGlkZW50X3QgKik7CisKKyAgICBkaXNwYXRjaF9zaGFyZWRfaW5mb190ICAqdGhfZGlzcGF0Y2hfc2hfY3VycmVudDsKKyAgICBkaXNwYXRjaF9wcml2YXRlX2luZm9fdCAqdGhfZGlzcGF0Y2hfcHJfY3VycmVudDsKKworICAgIGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ICp0aF9kaXNwX2J1ZmZlcjsKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICAgdGhfZGlzcF9pbmRleDsKKyAgICB2b2lkKiBkdW1teV9wYWRkaW5nWzJdOyAvLyBtYWtlIGl0IDY0IGJ5dGVzIG9uIEludGVsKFIpIDY0Cit9IGttcF9kaXNwX3Q7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIEJhcnJpZXIgc3R1ZmYgKi8KKworLyogY29uc3RhbnRzIGZvciBiYXJyaWVyIHN0YXRlIHVwZGF0ZSAqLworI2RlZmluZSBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFICAwICAgICAgIC8qIHNob3VsZCBwcm9iYWJseSBzdGFydCBmcm9tIHplcm8gKi8KKyNkZWZpbmUgS01QX0JBUlJJRVJfU0xFRVBfQklUICAgMCAgICAgICAvKiBiaXQgdXNlZCBmb3Igc3VzcGVuZC9zbGVlcCBwYXJ0IG9mIHN0YXRlICovCisjZGVmaW5lIEtNUF9CQVJSSUVSX1VOVVNFRF9CSVQgIDEgICAgICAgLyogYml0IHRoYXQgbXVzdCBuZXZlciBiZSBzZXQgZm9yIHZhbGlkIHN0YXRlICovCisjZGVmaW5lIEtNUF9CQVJSSUVSX0JVTVBfQklUICAgIDIgICAgICAgLyogbHNiIHVzZWQgZm9yIGJ1bXAgb2YgZ28vYXJyaXZlZCBzdGF0ZSAqLworCisjZGVmaW5lIEtNUF9CQVJSSUVSX1NMRUVQX1NUQVRFICAgICAgICAgKChrbXBfdWludCkgKDEgPDwgS01QX0JBUlJJRVJfU0xFRVBfQklUKSkKKyNkZWZpbmUgS01QX0JBUlJJRVJfVU5VU0VEX1NUQVRFICAgICAgICAoKGttcF91aW50KSAoMSA8PCBLTVBfQkFSUklFUl9VTlVTRURfQklUKSkKKyNkZWZpbmUgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCAgICAgICAgICAoKGttcF91aW50KSAoMSA8PCBLTVBfQkFSUklFUl9CVU1QX0JJVCkpCisKKyNpZiAoS01QX0JBUlJJRVJfU0xFRVBfQklUID49IEtNUF9CQVJSSUVSX0JVTVBfQklUKQorIyBlcnJvciAiQmFycmllciBzbGVlcCBiaXQgbXVzdCBiZSBzbWFsbGVyIHRoYW4gYmFycmllciBidW1wIGJpdCIKKyNlbmRpZgorI2lmIChLTVBfQkFSUklFUl9VTlVTRURfQklUID49IEtNUF9CQVJSSUVSX0JVTVBfQklUKQorIyBlcnJvciAiQmFycmllciB1bnVzZWQgYml0IG11c3QgYmUgc21hbGxlciB0aGFuIGJhcnJpZXIgYnVtcCBiaXQiCisjZW5kaWYKKworCitlbnVtIGJhcnJpZXJfdHlwZSB7CisgICAgYnNfcGxhaW5fYmFycmllciA9IDAsICAgICAgIC8qIDAsIEFsbCBub24tZm9yay9qb2luIGJhcnJpZXJzIChleGNlcHQgcmVkdWN0aW9uIGJhcnJpZXJzIGlmIGVuYWJsZWQpICovCisgICAgYnNfZm9ya2pvaW5fYmFycmllciwgICAgICAgIC8qIDEsIEFsbCBmb3JrL2pvaW4gKHBhcmFsbGVsIHJlZ2lvbikgYmFycmllcnMgKi8KKyAgICAjaWYgS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICAgICAgYnNfcmVkdWN0aW9uX2JhcnJpZXIsICAgLyogMiwgQWxsIGJhcnJpZXJzIHRoYXQgYXJlIHVzZWQgaW4gcmVkdWN0aW9uICovCisgICAgI2VuZGlmIC8vIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgYnNfbGFzdF9iYXJyaWVyICAgICAgICAgICAgIC8qIEp1c3QgYSBwbGFjZWhvbGRlciB0byBtYXJrIHRoZSBlbmQgKi8KK307CisKKy8vIHRvIHdvcmsgd2l0aCByZWR1Y3Rpb24gYmFycmllcnMganVzdCBsaWtlIHdpdGggcGxhaW4gYmFycmllcnMKKyNpZiAhS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICAjZGVmaW5lIGJzX3JlZHVjdGlvbl9iYXJyaWVyIGJzX3BsYWluX2JhcnJpZXIKKyNlbmRpZiAvLyBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorCit0eXBlZGVmIGVudW0ga21wX2Jhcl9wYXQgeyAgICAgIC8qIEJhcnJpZXIgY29tbXVuaWNhdGlvbiBwYXR0ZXJucyAqLworICAgIGJwX2xpbmVhcl9iYXIgPSAwLCAgICAgICAgICAvKiBTaW5nbGUgbGV2ZWwgKGRlZ2VuZXJhdGUpIHRyZWUgKi8KKyAgICBicF90cmVlX2JhciA9IDEsICAgICAgICAgICAgLyogQmFsYW5jZWQgdHJlZSB3aXRoIGJyYW5jaGluZyBmYWN0b3IgMl5uICovCisgICAgYnBfaHlwZXJfYmFyID0gMiwgICAgICAgICAgIC8qIEh5cGVyY3ViZS1lbWJlZGRlZCB0cmVlIHdpdGggbWluIGJyYW5jaGluZyBmYWN0b3IgMl5uICovCisgICAgYnBfbGFzdF9iYXIgPSAzICAgICAgICAgICAgIC8qIFBsYWNlaG9sZGVyIHRvIG1hcmsgdGhlIGVuZCAqLworfSBrbXBfYmFyX3BhdF9lOworCisvKiBUaHJlYWQgYmFycmllciBuZWVkcyB2b2xhdGlsZSBiYXJyaWVyIGZpZWxkcyAqLwordHlwZWRlZiBzdHJ1Y3QgS01QX0FMSUdOX0NBQ0hFIGttcF9ic3RhdGUgeworICAgIHZvbGF0aWxlIGttcF91aW50ICAgYl9hcnJpdmVkOyAgICAgICAgICAgICAgLyogU1RBVEUgPT4gdGFzayByZWFjaGVkIHN5bmNoIHBvaW50LiAqLworICAgICNpZiAoS01QX1BFUkZfVjE5ID09IEtNUF9PTikKKyAgICAgICAgS01QX0FMSUdOX0NBQ0hFCisgICAgI2VuZGlmCisgICAgdm9sYXRpbGUga21wX3VpbnQgICBiX2dvOyAgICAgICAgICAgICAgICAgICAvKiBTVEFURSA9PiB0YXNrIHNob3VsZCBwcm9jZWVkLiAgICAgICovCit9IGttcF9ic3RhdGVfdDsKKwordW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF9iYXJyaWVyX3VuaW9uIHsKKyAgICBkb3VibGUgICAgICAgYl9hbGlnbjsgICAgICAgIC8qIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudCAqLworICAgIGNoYXIgICAgICAgICBiX3BhZFsgS01QX1BBRChrbXBfYnN0YXRlX3QsIENBQ0hFX0xJTkUpIF07CisgICAga21wX2JzdGF0ZV90IGJiOworfTsKKwordHlwZWRlZiB1bmlvbiBrbXBfYmFycmllcl91bmlvbiBrbXBfYmFsaWduX3Q7CisKKy8qIFRlYW0gYmFycmllciBuZWVkcyBvbmx5IG5vbi12b2xhdGlsZSBhcnJpdmVkIGNvdW50ZXIgKi8KK3VuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfYmFycmllcl90ZWFtX3VuaW9uIHsKKyAgICBkb3VibGUgICAgICAgYl9hbGlnbjsgICAgICAgIC8qIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudCAqLworICAgIGNoYXIgICAgICAgICBiX3BhZFsgQ0FDSEVfTElORSBdOworICAgIHN0cnVjdCB7CisgICAgICAgIGttcF91aW50ICAgICBiX2Fycml2ZWQ7ICAgICAgIC8qIFNUQVRFID0+IHRhc2sgcmVhY2hlZCBzeW5jaCBwb2ludC4gKi8KKyAgICB9OworfTsKKwordHlwZWRlZiB1bmlvbiBrbXBfYmFycmllcl90ZWFtX3VuaW9uIGttcF9iYWxpZ25fdGVhbV90OworCisvKgorICogUGFkZGluZyBmb3IgTGludXgqIE9TIHB0aHJlYWRzIGNvbmRpdGlvbiB2YXJpYWJsZXMgYW5kIG11dGV4ZXMgdXNlZCB0byBzaWduYWwKKyAqIHRocmVhZHMgd2hlbiBhIGNvbmRpdGlvbiBjaGFuZ2VzLiAgVGhpcyBpcyB0byB3b3JrYXJvdW5kIGFuIE5QVEwgYnVnCisgKiB3aGVyZSBwYWRkaW5nIHdhcyBhZGRlZCB0byBwdGhyZWFkX2NvbmRfdCB3aGljaCBjYXVzZWQgdGhlIGluaXRpYWxpemF0aW9uCisgKiByb3V0aW5lIHRvIHdyaXRlIG91dHNpZGUgb2YgdGhlIHN0cnVjdHVyZSBpZiBjb21waWxlZCBvbiBwcmUtTlBUTCB0aHJlYWRzLgorICovCisKKyNpZiBLTVBfT1NfV0lORE9XUwordHlwZWRlZiBzdHJ1Y3Qga21wX3dpbjMyX211dGV4Cit7CisgICAgLyogVGhlIExvY2sgKi8KKyAgICBDUklUSUNBTF9TRUNUSU9OIGNzOworfSBrbXBfd2luMzJfbXV0ZXhfdDsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX3dpbjMyX2NvbmQKK3sKKyAgICAvKiBDb3VudCBvZiB0aGUgbnVtYmVyIG9mIHdhaXRlcnMuICovCisgICAgaW50IHdhaXRlcnNfY291bnRfOworCisgICAgLyogU2VyaWFsaXplIGFjY2VzcyB0byA8d2FpdGVyc19jb3VudF8+ICovCisgICAga21wX3dpbjMyX211dGV4X3Qgd2FpdGVyc19jb3VudF9sb2NrXzsKKworICAgIC8qIE51bWJlciBvZiB0aHJlYWRzIHRvIHJlbGVhc2UgdmlhIGEgPGNvbmRfYnJvYWRjYXN0PiBvciBhICovCisgICAgLyogPGNvbmRfc2lnbmFsPiAqLworICAgIGludCByZWxlYXNlX2NvdW50XzsKKworICAgIC8qIEtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50ICJnZW5lcmF0aW9uIiBzbyB0aGF0IHdlIGRvbid0IGFsbG93ICovCisgICAgLyogb25lIHRocmVhZCB0byBzdGVhbCBhbGwgdGhlICJyZWxlYXNlcyIgZnJvbSB0aGUgYnJvYWRjYXN0LiAqLworICAgIGludCB3YWl0X2dlbmVyYXRpb25fY291bnRfOworCisgICAgLyogQSBtYW51YWwtcmVzZXQgZXZlbnQgdGhhdCdzIHVzZWQgdG8gYmxvY2sgYW5kIHJlbGVhc2Ugd2FpdGluZyAqLworICAgIC8qIHRocmVhZHMuICovCisgICAgSEFORExFIGV2ZW50XzsKK30ga21wX3dpbjMyX2NvbmRfdDsKKyNlbmRpZgorCisjaWYgS01QX09TX1VOSVgKKwordW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF9jb25kX3VuaW9uIHsKKyAgICBkb3VibGUgICAgICAgICAgICAgIGNfYWxpZ247CisgICAgY2hhciAgICAgICAgICAgICAgICBjX3BhZFsgQ0FDSEVfTElORSBdOworICAgIHB0aHJlYWRfY29uZF90ICAgICAgY19jb25kOworfTsKKwordHlwZWRlZiB1bmlvbiBrbXBfY29uZF91bmlvbiBrbXBfY29uZF9hbGlnbl90OworCit1bmlvbiBLTVBfQUxJR05fQ0FDSEUga21wX211dGV4X3VuaW9uIHsKKyAgICBkb3VibGUgICAgICAgICAgICAgIG1fYWxpZ247CisgICAgY2hhciAgICAgICAgICAgICAgICBtX3BhZFsgQ0FDSEVfTElORSBdOworICAgIHB0aHJlYWRfbXV0ZXhfdCAgICAgbV9tdXRleDsKK307CisKK3R5cGVkZWYgdW5pb24ga21wX211dGV4X3VuaW9uIGttcF9tdXRleF9hbGlnbl90OworCisjZW5kaWYgLyogS01QX09TX1VOSVggKi8KKwordHlwZWRlZiBzdHJ1Y3Qga21wX2Rlc2NfYmFzZSB7CisgICAgdm9pZCAgICAqZHNfc3RhY2tiYXNlOworICAgIHNpemVfdCAgICAgICAgICAgIGRzX3N0YWNrc2l6ZTsKKyAgICBpbnQgICAgICAgICAgICAgICBkc19zdGFja2dyb3c7CisgICAga21wX3RocmVhZF90ICAgICAgZHNfdGhyZWFkOworICAgIHZvbGF0aWxlIGludCAgICAgIGRzX3RpZDsKKyAgICBpbnQgICAgICAgICAgICAgICBkc19ndGlkOworI2lmIEtNUF9PU19XSU5ET1dTCisgICAgdm9sYXRpbGUgaW50ICAgICAgZHNfYWxpdmU7CisgICAgRFdPUkQgICAgICAgICAgICAgZHNfdGhyZWFkX2lkOworICAgICAgICAvKgorICAgICAgICAgICAgZHNfdGhyZWFkIGtlZXBzIHRocmVhZCBoYW5kbGUgb24gV2luZG93cyogT1MuIEl0IGlzIGVub3VnaCBmb3IgUlRMIHB1cnBvc2VzLiBIb3dldmVyLAorICAgICAgICAgICAgZGVidWdnZXIgc3VwcG9ydCAobGlib21wX2RiKSBjYW5ub3Qgd29yayB3aXRoIGhhbmRsZXMsIGJlY2F1c2UgdGhleSB1bmNvbXBhcmFibGUuIEZvcgorICAgICAgICAgICAgZXhhbXBsZSwgZGVidWdnZXIgcmVxdWVzdHMgaW5mbyBhYm91dCB0aHJlYWQgd2l0aCBoYW5kbGUgaC4gaCBpcyB2YWxpZCB3aXRoaW4gZGVidWdnZXIKKyAgICAgICAgICAgIHByb2Nlc3MsIGFuZCBtZWFuaW5nbGVzcyB3aXRoaW4gZGVidWdlZSBwcm9jZXNzLiBFdmVuIGlmIGggaXMgZHVwZWQgYnkgY2FsbCB0bworICAgICAgICAgICAgRHVwbGljYXRlSGFuZGxlKCksIHNvIHRoZSByZXN1bHQgaCcgaXMgdmFsaWQgd2l0aGluIGRlYnVnZWUgcHJvY2VzcywgYnV0IGl0IGlzIGEgKm5ldyoKKyAgICAgICAgICAgIGhhbmRsZSB3aGljaCBkb2VzICpub3QqIGVxdWFsIHRvIGFueSBvdGhlciBoYW5kbGUgaW4gZGVidWdlZS4uLiBUaGUgb25seSB3YXkgdG8KKyAgICAgICAgICAgIGNvbXBhcmUgaGFuZGxlcyBpcyBjb252ZXJ0IHRoZW0gdG8gc3lzdGVtLXdpZGUgaWRzLiBHZXRUaHJlYWRJZCgpIGZ1bmN0aW9uIGlzCisgICAgICAgICAgICBhdmFpbGFibGUgb25seSBpbiBMb25naG9ybiBhbmQgU2VydmVyIDIwMDMuIDotKCBJbiBjb250cmFzdCwgR2V0Q3VycmVudFRocmVhZElkKCkgaXMKKyAgICAgICAgICAgIGF2YWlsYWJsZSBvbiBhbGwgV2luZG93cyogT1MgZmxhdm91cnMgKGluY2x1ZGluZyBXaW5kb3dzKiA5NSkuIFRodXMsIHdlIGhhdmUgdG8gZ2V0IHRocmVhZCBpZCBieQorICAgICAgICAgICAgY2FsbCB0byBHZXRDdXJyZW50VGhyZWFkSWQoKSBmcm9tIHdpdGhpbiB0aGUgdGhyZWFkIGFuZCBzYXZlIGl0IHRvIGxldCBsaWJvbXBfZGIKKyAgICAgICAgICAgIGlkZW50aWZ5IHRocmVhZHMuCisgICAgICAgICovCisjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KK30ga21wX2Rlc2NfYmFzZV90OworCit0eXBlZGVmIHVuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfZGVzYyB7CisgICAgZG91YmxlICAgICAgICAgICBkc19hbGlnbjsgICAgICAgIC8qIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudCAqLworICAgIGNoYXIgICAgICAgICAgICAgZHNfcGFkWyBLTVBfUEFEKGttcF9kZXNjX2Jhc2VfdCwgQ0FDSEVfTElORSkgXTsKKyAgICBrbXBfZGVzY19iYXNlX3QgIGRzOworfSBrbXBfZGVzY190OworCisKK3R5cGVkZWYgc3RydWN0IGttcF9sb2NhbCB7CisgICAgdm9sYXRpbGUgaW50ICAgICAgICAgICB0aGlzX2NvbnN0cnVjdDsgLyogY291bnQgb2Ygc2luZ2xlJ3MgZW5jb3VudGVyZWQgYnkgdGhyZWFkICovCisgICAgdm9sYXRpbGUgaW50ICAgICAgICAgICBsYXN0X2NvbnN0cnVjdDsgLyogY2FjaGUgZm9yIHRlYW0ncyBjb3VudCB1c2VkIGJ5IG9sZCBhbGdvcml0aG0gKi8KKyAgICB2b2lkICAgICAgICAgICAgICAgICAgKnJlZHVjZV9kYXRhOworI2lmIEtNUF9VU0VfQkdFVAorICAgIHZvaWQgICAgICAgICAgICAgICAgICAqYmdldF9kYXRhOworICAgIHZvaWQgICAgICAgICAgICAgICAgICAqYmdldF9saXN0OworI2lmICEgVVNFX0NNUF9YQ0hHX0ZPUl9CR0VUCisjaWZkZWYgVVNFX1FVRVVJTkdfTE9DS19GT1JfQkdFVAorICAgIGttcF9sb2NrX3QgICAgICAgICAgICAgYmdldF9sb2NrOyAgICAgIC8qIExvY2sgZm9yIGFjY2Vzc2luZyBiZ2V0IGZyZWUgbGlzdCAqLworI2Vsc2UKKyAgICBrbXBfYm9vdHN0cmFwX2xvY2tfdCAgIGJnZXRfbG9jazsgICAgICAvKiBMb2NrIGZvciBhY2Nlc3NpbmcgYmdldCBmcmVlIGxpc3QgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNdXN0IGJlIGJvb3RzdHJhcCBsb2NrIHNvIHdlIGNhbiB1c2UgaXQgYXQgbGlicmFyeSBzaHV0ZG93biAqLworI2VuZGlmIC8qIFVTRV9MT0NLX0ZPUl9CR0VUICovCisjZW5kaWYgLyogISBVU0VfQ01QX1hDSEdfRk9SX0JHRVQgKi8KKyNlbmRpZiAvKiBLTVBfVVNFX0JHRVQgKi8KKworI2lmZGVmIEJVSUxEX1RWCisgICAgc3RydWN0IHR2X2RhdGEgICAgICAgICp0dl9kYXRhOworI2VuZGlmCisKKyAgICBQQUNLRURfUkVEVUNUSU9OX01FVEhPRF9UIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kOyAvKiBzdG9yZWQgYnkgX19rbXBjX3JlZHVjZSooKSwgdXNlZCBieSBfX2ttcGNfZW5kX3JlZHVjZSooKSAqLworCit9IGttcF9sb2NhbF90OworCisvKiBSZWNvcmQgZm9yIGhvbGRpbmcgdGhlIHZhbHVlcyBvZiB0aGUgaW50ZXJuYWwgY29udHJvbHMgc3RhY2sgcmVjb3JkcyAqLwordHlwZWRlZiBzdHJ1Y3QgS01QX0FMSUdOX0NBQ0hFIGttcF9pbnRlcm5hbF9jb250cm9sIHsKKyAgICBpbnQgICAgICAgICAgIHNlcmlhbF9uZXN0aW5nX2xldmVsOyAgLyogY29ycmVzcG9uZHMgdG8gdGhlIHZhbHVlIG9mIHRoZSB0aF90ZWFtX3NlcmlhbGl6ZWQgZmllbGQgKi8KKyAgICBpbnQgICAgICAgICAgIG5lc3RlZDsgICAgICAgICAgICAgICAgLyogaW50ZXJuYWwgY29udHJvbCBmb3IgbmVzdGVkIHBhcmFsbGVsaXNtIChwZXIgdGhyZWFkKSAqLworICAgIGludCAgICAgICAgICAgZHluYW1pYzsgICAgICAgICAgICAgICAvKiBpbnRlcm5hbCBjb250cm9sIGZvciBkeW5hbWljIGFkanVzdG1lbnQgb2YgdGhyZWFkcyAocGVyIHRocmVhZCkgKi8KKyAgICBpbnQgICAgICAgICAgIG5wcm9jOyAgICAgICAgICAgICAgICAgLyogaW50ZXJuYWwgY29udHJvbCBmb3IgIyBvZiB0aHJlYWRzIGZvciBuZXh0IHBhcmFsbGVsIHJlZ2lvbiAocGVyIHRocmVhZCkgKi8KKyAgICBpbnQgICAgICAgICAgIGJsb2NrdGltZTsgICAgICAgICAgICAgLyogaW50ZXJuYWwgY29udHJvbCBmb3IgYmxvY2t0aW1lICovCisgICAgaW50ICAgICAgICAgICBidF9pbnRlcnZhbHM7ICAgICAgICAgIC8qIGludGVybmFsIGNvbnRyb2wgZm9yIGJsb2NrdGltZSBpbnRlcnZhbHMgKi8KKyAgICBpbnQgICAgICAgICAgIGJ0X3NldDsgICAgICAgICAgICAgICAgLyogaW50ZXJuYWwgY29udHJvbCBmb3Igd2hldGhlciBibG9ja3RpbWUgaXMgZXhwbGljaXRseSBzZXQgKi8KKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgIGludCAgICAgICAgICAgbWF4X2FjdGl2ZV9sZXZlbHM7ICAgICAvKiBpbnRlcm5hbCBjb250cm9sIGZvciBtYXhfYWN0aXZlX2xldmVscyAqLworICAgIGttcF9yX3NjaGVkX3Qgc2NoZWQ7ICAgICAgICAgICAgICAgICAvKiBpbnRlcm5hbCBjb250cm9sIGZvciBydW50aW1lIHNjaGVkdWxlIHtzY2hlZCxjaHVua30gcGFpciAqLworI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBrbXBfcHJvY19iaW5kX3QgcHJvY19iaW5kOyAgICAgICAgICAgLyogaW50ZXJuYWwgY29udHJvbCBmb3IgYWZmaW5pdHkgICovCisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKyAgICBzdHJ1Y3Qga21wX2ludGVybmFsX2NvbnRyb2wgKm5leHQ7CisKK30ga21wX2ludGVybmFsX2NvbnRyb2xfdDsKKworI2lmIE9NUF8zMF9FTkFCTEVECitzdGF0aWMgaW5saW5lIHZvaWQKK2NvcHlfaWN2cygga21wX2ludGVybmFsX2NvbnRyb2xfdCAqZHN0LCBrbXBfaW50ZXJuYWxfY29udHJvbF90ICpzcmMgKSB7CisgICAgKmRzdCA9ICpzcmM7Cit9CisjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKworI2lmIE9NUF8zMF9FTkFCTEVECisKKyAgICAjZGVmaW5lIGdldF9fYmxvY2t0aW1lKCB4dGVhbSwgeHRpZCApICAgICAoKHh0ZWFtKS0+dC50X3RocmVhZHNbKHh0aWQpXS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLmJsb2NrdGltZSkKKyAgICAjZGVmaW5lIGdldF9fYnRfc2V0KCB4dGVhbSwgeHRpZCApICAgICAgICAoKHh0ZWFtKS0+dC50X3RocmVhZHNbKHh0aWQpXS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLmJ0X3NldCkKKyAgICAjZGVmaW5lIGdldF9fYnRfaW50ZXJ2YWxzKCB4dGVhbSwgeHRpZCApICAoKHh0ZWFtKS0+dC50X3RocmVhZHNbKHh0aWQpXS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLmJ0X2ludGVydmFscykKKworICAgICNkZWZpbmUgZ2V0X19uZXN0ZWRfMih4dGVhbSx4dGlkKSAgICAgICAgICgoeHRlYW0pLT50LnRfdGhyZWFkc1soeHRpZCldLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMubmVzdGVkKQorICAgICNkZWZpbmUgZ2V0X19keW5hbWljXzIoeHRlYW0seHRpZCkgICAgICAgICgoeHRlYW0pLT50LnRfdGhyZWFkc1soeHRpZCldLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMuZHluYW1pYykKKyAgICAjZGVmaW5lIGdldF9fbnByb2NfMih4dGVhbSx4dGlkKSAgICAgICAgICAoKHh0ZWFtKS0+dC50X3RocmVhZHNbKHh0aWQpXS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLm5wcm9jKQorICAgICNkZWZpbmUgZ2V0X19zY2hlZF8yKHh0ZWFtLHh0aWQpICAgICAgICAgICgoeHRlYW0pLT50LnRfdGhyZWFkc1soeHRpZCldLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMuc2NoZWQpCisKKyAgICAjZGVmaW5lIHNldF9fYmxvY2t0aW1lX3RlYW0oIHh0ZWFtLCB4dGlkLCB4dmFsICkgXAorICAgICAgICAgICAgKCAoICh4dGVhbSktPnQudF90aHJlYWRzWyh4dGlkKV0tPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5ibG9ja3RpbWUgKSAgICA9ICh4dmFsKSApCisKKyAgICAjZGVmaW5lIHNldF9fYnRfaW50ZXJ2YWxzX3RlYW0oIHh0ZWFtLCB4dGlkLCB4dmFsICkgXAorICAgICAgICAgICAgKCAoICh4dGVhbSktPnQudF90aHJlYWRzWyh4dGlkKV0tPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5idF9pbnRlcnZhbHMgKSA9ICh4dmFsKSApCisKKyAgICAjZGVmaW5lIHNldF9fYnRfc2V0X3RlYW0oIHh0ZWFtLCB4dGlkLCB4dmFsICkgXAorICAgICAgICAgICAgKCAoICh4dGVhbSktPnQudF90aHJlYWRzWyh4dGlkKV0tPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5idF9zZXQgKSAgICAgICA9ICh4dmFsKSApCisKKworCisgICAgI2RlZmluZSBzZXRfX25lc3RlZCggeHRocmVhZCwgeHZhbCApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICggKCAoeHRocmVhZCktPnRoLnRoX3NlcmlhbF90ZWFtLT50LnRfdGhyZWFkc1swXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMubmVzdGVkICkgPSBcCisgICAgICAgICAgICAgICggKHh0aHJlYWQpLT50aC50aF90ZWFtICAgICAgIC0+dC50X3RocmVhZHNbKCh4dGhyZWFkKS0+dGgudGhfaW5mby5kcy5kc190aWQpXS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLm5lc3RlZCApID0gXAorICAgICAgICAgICAgICAoeHZhbCkgKQorICAgICNkZWZpbmUgZ2V0X19uZXN0ZWQoIHh0aHJlYWQgKSBcCisgICAgICAgICAgICAoICggKHh0aHJlYWQpLT50aC50aF90ZWFtICAgICAgIC0+dC50X3RocmVhZHNbKCh4dGhyZWFkKS0+dGgudGhfaW5mby5kcy5kc190aWQpXS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLm5lc3RlZCApIFwKKyAgICAgICAgICAgID8gKEZUTl9UUlVFKSA6IChGVE5fRkFMU0UpICkKKworICAgICNkZWZpbmUgc2V0X19keW5hbWljKCB4dGhyZWFkLCB4dmFsICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKCAoICh4dGhyZWFkKS0+dGgudGhfc2VyaWFsX3RlYW0tPnQudF90aHJlYWRzWzBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5keW5hbWljICkgPSBcCisgICAgICAgICAgICAgICggKHh0aHJlYWQpLT50aC50aF90ZWFtICAgICAgIC0+dC50X3RocmVhZHNbKCh4dGhyZWFkKS0+dGgudGhfaW5mby5kcy5kc190aWQpXS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLmR5bmFtaWMgKSA9IFwKKyAgICAgICAgICAgICAgKHh2YWwpICkKKyAgICAjZGVmaW5lIGdldF9fZHluYW1pYyggeHRocmVhZCApIFwKKyAgICAgICAgICAgICggKCAoeHRocmVhZCktPnRoLnRoX3RlYW0gICAgICAgLT50LnRfdGhyZWFkc1soKHh0aHJlYWQpLT50aC50aF9pbmZvLmRzLmRzX3RpZCldLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMuZHluYW1pYyApIFwKKyAgICAgICAgICAgID8gKEZUTl9UUlVFKSA6IChGVE5fRkFMU0UpICkKKworICAgICNkZWZpbmUgc2V0X19ucHJvYyggeHRocmVhZCwgeHZhbCApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICggKCAoeHRocmVhZCktPnRoLnRoX3NlcmlhbF90ZWFtLT50LnRfdGhyZWFkc1swXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMubnByb2MgKSA9IFwKKyAgICAgICAgICAgICAgKCAoeHRocmVhZCktPnRoLnRoX3RlYW0gICAgICAgLT50LnRfdGhyZWFkc1soKHh0aHJlYWQpLT50aC50aF9pbmZvLmRzLmRzX3RpZCldLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMubnByb2MgKSA9IFwKKyAgICAgICAgICAgICAgKHh2YWwpICkKKworICAgICNkZWZpbmUgc2V0X19ucHJvY19wKCB4dGhyZWFkLCB4dmFsICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoICh4dGhyZWFkKS0+dGgudGhfdGVhbSAgICAgICAtPnQudF90aHJlYWRzWygoeHRocmVhZCktPnRoLnRoX2luZm8uZHMuZHNfdGlkKV0tPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5ucHJvYyApID0gXAorICAgICAgICAgICAgICAoeHZhbCkgKQorCisgICAgI2RlZmluZSBzZXRfX21heF9hY3RpdmVfbGV2ZWxzKCB4dGhyZWFkLCB4dmFsICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKCAoICh4dGhyZWFkKS0+dGgudGhfc2VyaWFsX3RlYW0tPnQudF90aHJlYWRzWzBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5tYXhfYWN0aXZlX2xldmVscyApID0gXAorICAgICAgICAgICAgICAoICh4dGhyZWFkKS0+dGgudGhfdGVhbSAgICAgICAtPnQudF90aHJlYWRzWygoeHRocmVhZCktPnRoLnRoX2luZm8uZHMuZHNfdGlkKV0tPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5tYXhfYWN0aXZlX2xldmVscyApID0gXAorICAgICAgICAgICAgICAoeHZhbCkgKQorCisgICAgI2RlZmluZSBzZXRfX3NjaGVkKCB4dGhyZWFkLCB4dmFsICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKCAoICh4dGhyZWFkKS0+dGgudGhfc2VyaWFsX3RlYW0tPnQudF90aHJlYWRzWzBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5zY2hlZCApID0gXAorICAgICAgICAgICAgICAoICh4dGhyZWFkKS0+dGgudGhfdGVhbSAgICAgICAtPnQudF90aHJlYWRzWygoeHRocmVhZCktPnRoLnRoX2luZm8uZHMuZHNfdGlkKV0tPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5zY2hlZCApID0gXAorICAgICAgICAgICAgICAoeHZhbCkgKQorCisjaWYgT01QXzQwX0VOQUJMRUQKKworICAgICNkZWZpbmUgc2V0X19wcm9jX2JpbmQoIHh0aHJlYWQsIHh2YWwgKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoICh4dGhyZWFkKS0+dGgudGhfdGVhbSAgICAgICAtPnQudF90aHJlYWRzWygoeHRocmVhZCktPnRoLnRoX2luZm8uZHMuZHNfdGlkKV0tPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5wcm9jX2JpbmQgKSA9IFwKKyAgICAgICAgICAgICAgKHh2YWwpICkKKworICAgICNkZWZpbmUgZ2V0X19wcm9jX2JpbmQoIHh0aHJlYWQgKSBcCisgICAgICAgICAgICAoICh4dGhyZWFkKS0+dGgudGhfdGVhbSAgICAgICAtPnQudF90aHJlYWRzWygoeHRocmVhZCktPnRoLnRoX2luZm8uZHMuZHNfdGlkKV0tPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5wcm9jX2JpbmQgKQorCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworI2Vsc2UKKworICAgICNkZWZpbmUgZ2V0X19ibG9ja3RpbWUoIHh0ZWFtLCB4dGlkICkgICAgKCh4dGVhbSktPnQudF9zZXRfYmxvY2t0aW1lWyAgICh4dGlkKV0pCisgICAgI2RlZmluZSBnZXRfX2J0X3NldCggeHRlYW0sIHh0aWQgKSAgICAgICAoKHh0ZWFtKS0+dC50X3NldF9idF9zZXRbICAgICAgKHh0aWQpXSkKKyAgICAjZGVmaW5lIGdldF9fYnRfaW50ZXJ2YWxzKCB4dGVhbSwgeHRpZCApICgoeHRlYW0pLT50LnRfc2V0X2J0X2ludGVydmFsc1soeHRpZCldKQorCisgICAgI2RlZmluZSBzZXRfX25lc3RlZCggeHRocmVhZCwgeHZhbCApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICggKCAoeHRocmVhZCktPnRoLnRoX3NlcmlhbF90ZWFtLT50LnRfc2V0X25lc3RlZFswXSApID0gXAorICAgICAgICAgICAgICAoICh4dGhyZWFkKS0+dGgudGhfdGVhbS0+dC50X3NldF9uZXN0ZWRbKCh4dGhyZWFkKS0+dGgudGhfaW5mby5kcy5kc190aWQpXSApID0gXAorICAgICAgICAgICAgICAoeHZhbCkgKQorICAgICNkZWZpbmUgZ2V0X19uZXN0ZWQoIHh0aHJlYWQgKSBcCisgICAgICAgICAgICAoICggKHh0aHJlYWQpLT50aC50aF90ZWFtLT50LnRfc2V0X25lc3RlZFsoKHh0aHJlYWQpLT50aC50aF9pbmZvLmRzLmRzX3RpZCldICkgXAorICAgICAgICAgICAgPyAoRlROX1RSVUUpIDogKEZUTl9GQUxTRSkgKQorCisgICAgI2RlZmluZSBzZXRfX2R5bmFtaWMoIHh0aHJlYWQsIHh2YWwgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAoICggKHh0aHJlYWQpLT50aC50aF9zZXJpYWxfdGVhbS0+dC50X3NldF9keW5hbWljWzBdICkgPSBcCisgICAgICAgICAgICAgICggKHh0aHJlYWQpLT50aC50aF90ZWFtLT50LnRfc2V0X2R5bmFtaWNbKCh4dGhyZWFkKS0+dGgudGhfaW5mby5kcy5kc190aWQpXSApID0gXAorICAgICAgICAgICAgICAoeHZhbCkgKQorICAgICNkZWZpbmUgZ2V0X19keW5hbWljKCB4dGhyZWFkICkgXAorICAgICAgICAgICAgKCAoICh4dGhyZWFkKS0+dGgudGhfdGVhbS0+dC50X3NldF9keW5hbWljWygoeHRocmVhZCktPnRoLnRoX2luZm8uZHMuZHNfdGlkKV0gKSBcCisgICAgICAgICAgICA/IChGVE5fVFJVRSkgOiAoRlROX0ZBTFNFKSApCisKKyAgICAjZGVmaW5lIHNldF9fbnByb2MoIHh0aHJlYWQsIHh2YWwgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAoICggKHh0aHJlYWQpLT50aC50aF9zZXJpYWxfdGVhbS0+dC50X3NldF9ucHJvY1swXSApID0gXAorICAgICAgICAgICAgICAoICh4dGhyZWFkKS0+dGgudGhfdGVhbS0+dC50X3NldF9ucHJvY1soKHh0aHJlYWQpLT50aC50aF9pbmZvLmRzLmRzX3RpZCldICkgPSBcCisgICAgICAgICAgICAgICh4dmFsKSApCisKKyAgICAjZGVmaW5lIHNldF9fbnByb2NfcCggeHRocmVhZCwgeHZhbCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKCAoICh4dGhyZWFkKS0+dGgudGhfdGVhbS0+dC50X3NldF9ucHJvY1soKHh0aHJlYWQpLT50aC50aF9pbmZvLmRzLmRzX3RpZCldICkgPSAoeHZhbCkgKQorCisgICAgI2RlZmluZSBzZXRfX2Jsb2NrdGltZV90ZWFtKCB4dGVhbSwgeHRpZCwgeHZhbCApIFwKKyAgICAgICAgICAgICggKCAoeHRlYW0pLT50LnRfc2V0X2Jsb2NrdGltZVsoeHRpZCldICkgPSAoeHZhbCkgKQorCisgICAgI2RlZmluZSBzZXRfX2J0X2ludGVydmFsc190ZWFtKCB4dGVhbSwgeHRpZCwgeHZhbCApIFwKKyAgICAgICAgICAgICggKCAoeHRlYW0pLT50LnRfc2V0X2J0X2ludGVydmFsc1soeHRpZCldICkgPSAoeHZhbCkgKQorCisgICAgI2RlZmluZSBzZXRfX2J0X3NldF90ZWFtKCB4dGVhbSwgeHRpZCwgeHZhbCApIFwKKyAgICAgICAgICAgICggKCAoeHRlYW0pLT50LnRfc2V0X2J0X3NldFsoeHRpZCldICkgPSAoeHZhbCkgKQorCisgICAgI2RlZmluZSBnZXRfX25lc3RlZF8yKHh0ZWFtLHh0aWQpICAoICh4dGVhbSktPnQudF9zZXRfbmVzdGVkWyh4dGlkKV0gKQorICAgICNkZWZpbmUgZ2V0X19keW5hbWljXzIoeHRlYW0seHRpZCkgKCAoeHRlYW0pLT50LnRfc2V0X2R5bmFtaWNbKHh0aWQpXSApCisgICAgI2RlZmluZSBnZXRfX25wcm9jXzIoeHRlYW0seHRpZCkgICAoICh4dGVhbSktPnQudF9zZXRfbnByb2NbKHh0aWQpXSApCisgICAgI2RlZmluZSBnZXRfX3NjaGVkXzIoeHRlYW0seHRpZCkgICAoICh4dGVhbSktPnQudF9zZXRfc2NoZWRbKHh0aWQpXSApCisKKworI2VuZGlmCisKKyNpZiBPTVBfMzBfRU5BQkxFRAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvLyBPcGVuTVAgdGFza2luZyBkYXRhIHN0cnVjdHVyZXMKKy8vCisKK3R5cGVkZWYgZW51bSBrbXBfdGFza2luZ19tb2RlIHsKKyAgICB0c2ttX2ltbWVkaWF0ZV9leGVjID0gMCwKKyAgICB0c2ttX2V4dHJhX2JhcnJpZXIgPSAxLAorICAgIHRza21fdGFza190ZWFtcyA9IDIsCisgICAgdHNrbV9tYXggPSAyCit9IGttcF90YXNraW5nX21vZGVfdDsKKworZXh0ZXJuIGttcF90YXNraW5nX21vZGVfdCBfX2ttcF90YXNraW5nX21vZGU7ICAgICAgICAgLyogZGV0ZXJtaW5lcyBob3cvd2hlbiB0byBleGVjdXRlIHRhc2tzICovCitleHRlcm4ga21wX2ludDMyIF9fa21wX3Rhc2tfc3RlYWxpbmdfY29uc3RyYWludDsKKworLyogTk9URToga21wX3Rhc2tkYXRhX3QgYW5kIGttcF90YXNrX3Qgc3RydWN0dXJlcyBhbGxvY2F0ZWQgaW4gc2luZ2xlIGJsb2NrIHdpdGggdGFza2RhdGEgZmlyc3QgKi8KKyNkZWZpbmUgS01QX1RBU0tfVE9fVEFTS0RBVEEodGFzaykgICAgICgoKGttcF90YXNrZGF0YV90ICopIHRhc2spIC0gMSkKKyNkZWZpbmUgS01QX1RBU0tEQVRBX1RPX1RBU0sodGFza2RhdGEpIChrbXBfdGFza190ICopICh0YXNrZGF0YSArIDEpCisKKy8vIFRoZSB0dF9mb3VuZF90YXNrcyBmbGFnIGlzIGEgc2lnbmFsIHRvIGFsbCB0aHJlYWRzIGluIHRoZSB0ZWFtIHRoYXQgdGFza3Mgd2VyZSBzcGF3bmVkIGFuZAorLy8gcXVldWVkIHNpbmNlIHRoZSBwcmV2aW91cyBiYXJyaWVyIHJlbGVhc2UuCisvLyBTdGF0ZSBpcyB1c2VkIHRvIGFsdGVybmF0ZSB0YXNrIHRlYW1zIGZvciBzdWNjZXNzaXZlIGJhcnJpZXJzCisjZGVmaW5lIEtNUF9UQVNLSU5HX0VOQUJMRUQodGFza190ZWFtLHN0YXRlKSBcCisgICAgKChUQ1JfU1lOQ180KCh0YXNrX3RlYW0pLT50dC50dF9mb3VuZF90YXNrcykgPT0gVFJVRSkgJiYgXAorICAgICAoVENSXzQoKHRhc2tfdGVhbSktPnR0LnR0X3N0YXRlKSAgICAgICA9PSAoc3RhdGUpKSkKKy8qIQorQGluZ3JvdXAgQkFTSUNfVFlQRVMKK0B7CisqLworCisvKiEKKyAqLwordHlwZWRlZiBrbXBfaW50MzIgKCoga21wX3JvdXRpbmVfZW50cnlfdCkoIGttcF9pbnQzMiwgdm9pZCAqICk7CisKKy8qICBzaXplb2Zfa21wX3Rhc2tfdCBwYXNzZWQgYXMgYXJnIHRvIGttcGNfb21wX3Rhc2sgY2FsbCAgKi8KKy8qIQorICovCit0eXBlZGVmIHN0cnVjdCBrbXBfdGFzayB7ICAgICAgICAgICAgICAgICAgIC8qIEdFSDogU2hvdWxkbid0IHRoaXMgYmUgYWxpZ25lZCBzb21laG93PyAqLworICAgIHZvaWQgKiAgICAgICAgICAgICAgc2hhcmVkczsgICAgICAgICAgICAvKio8IHBvaW50ZXIgdG8gYmxvY2sgb2YgcG9pbnRlcnMgdG8gc2hhcmVkIHZhcnMgICAqLworICAgIGttcF9yb3V0aW5lX2VudHJ5X3Qgcm91dGluZTsgICAgICAgICAgICAvKio8IHBvaW50ZXIgdG8gcm91dGluZSB0byBjYWxsIGZvciBleGVjdXRpbmcgdGFzayAqLworICAgIGttcF9pbnQzMiAgICAgICAgICAgcGFydF9pZDsgICAgICAgICAgICAvKio8IHBhcnQgaWQgZm9yIHRoZSB0YXNrICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmIE9NUF80MF9FTkFCTEVECisgICAga21wX3JvdXRpbmVfZW50cnlfdCBkZXN0cnVjdG9yczsgICAgICAgIC8qIHBvaW50ZXIgdG8gZnVuY3Rpb24gdG8gaW52b2tlIGRlY29uc3RydWN0b3JzIG9mIGZpcnN0cHJpdmF0ZSBDKysgb2JqZWN0cyAqLworI2VuZGlmIC8vIE9NUF80MF9FTkFCTEVECisgICAgLyogIHByaXZhdGUgdmFycyAgKi8KK30ga21wX3Rhc2tfdDsKKworLyohCitAfQorKi8KKworI2lmIE9NUF80MF9FTkFCTEVECit0eXBlZGVmIHN0cnVjdCBrbXBfdGFza2dyb3VwIHsKKyAgICBrbXBfdWludDMyICAgICAgICAgICAgY291bnQ7ICAgLy8gbnVtYmVyIG9mIGFsbG9jYXRlZCBhbmQgbm90IHlldCBjb21wbGV0ZSB0YXNrcworICAgIGttcF9pbnQzMiAgICAgICAgICAgICBjYW5jZWxfcmVxdWVzdDsgLy8gcmVxdWVzdCBmb3IgY2FuY2VsbGF0aW9uIG9mIHRoaXMgdGFza2dyb3VwCisgICAgc3RydWN0IGttcF90YXNrZ3JvdXAgKnBhcmVudDsgIC8vIHBhcmVudCB0YXNrZ3JvdXAKK30ga21wX3Rhc2tncm91cF90OworCisKKy8vIGZvcndhcmQgZGVjbGFyYXRpb25zCit0eXBlZGVmIHVuaW9uIGttcF9kZXBub2RlICAgICAgIGttcF9kZXBub2RlX3Q7Cit0eXBlZGVmIHN0cnVjdCBrbXBfZGVwbm9kZV9saXN0ICBrbXBfZGVwbm9kZV9saXN0X3Q7Cit0eXBlZGVmIHN0cnVjdCBrbXBfZGVwaGFzaF9lbnRyeSBrbXBfZGVwaGFzaF9lbnRyeV90OworCit0eXBlZGVmIHN0cnVjdCBrbXBfZGVwZW5kX2luZm8geworICAgICBrbXBfaW50cHRyX3QgICAgICAgICAgICAgICBiYXNlX2FkZHI7CisgICAgIHNpemVfdCAJICAgICAgICAgICAgICAgIGxlbjsKKyAgICAgc3RydWN0IHsKKyAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgaW46MTsKKyAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgb3V0OjE7CisgICAgIH0gZmxhZ3M7Cit9IGttcF9kZXBlbmRfaW5mb190OworCitzdHJ1Y3Qga21wX2RlcG5vZGVfbGlzdCB7CisgICBrbXBfZGVwbm9kZV90ICogICAgICAgICAgICAgIG5vZGU7CisgICBrbXBfZGVwbm9kZV9saXN0X3QgKiAgICAgICAgIG5leHQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCBrbXBfYmFzZV9kZXBub2RlIHsKKyAgICBrbXBfZGVwbm9kZV9saXN0X3QgICAgICAgICogc3VjY2Vzc29yczsKKyAgICBrbXBfdGFza190ICAgICAgICAgICAgICAgICogdGFzazsKKworICAgIGttcF9sb2NrX3QgCSAgICAgICAgICAgICAgICBsb2NrOworCisjaWYgS01QX1NVUFBPUlRfR1JBUEhfT1VUUFVUCisgICAga21wX3VpbnQzMiAgICAgICAgICAgICAgICAgIGlkOworI2VuZGlmCisKKyAgICB2b2xhdGlsZSBrbXBfaW50MzIgCSAgICAgICAgbnByZWRlY2Vzc29yczsKKyAgICB2b2xhdGlsZSBrbXBfaW50MzIgICAgICAgICAgbnJlZnM7Cit9IGttcF9iYXNlX2RlcG5vZGVfdDsKKwordW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF9kZXBub2RlIHsKKyAgICBkb3VibGUgICAgICAgICAgZG5fYWxpZ247ICAgICAgICAvKiB1c2Ugd29yc3QgY2FzZSBhbGlnbm1lbnQgKi8KKyAgICBjaGFyICAgICAgICAgICAgZG5fcGFkWyBLTVBfUEFEKGttcF9iYXNlX2RlcG5vZGVfdCwgQ0FDSEVfTElORSkgXTsKKyAgICBrbXBfYmFzZV9kZXBub2RlX3QgZG47Cit9OworCitzdHJ1Y3Qga21wX2RlcGhhc2hfZW50cnkgeworICAgIGttcF9pbnRwdHJfdCAgICAgICAgICAgICAgIGFkZHI7CisgICAga21wX2RlcG5vZGVfdCAgICAgCSAgICAgKiBsYXN0X291dDsKKyAgICBrbXBfZGVwbm9kZV9saXN0X3QgCSAgICAgKiBsYXN0X2luczsKKyAgICBrbXBfZGVwaGFzaF9lbnRyeV90ICAgICAgKiBuZXh0X2luX2J1Y2tldDsKK307CisKK3R5cGVkZWYgc3RydWN0IGttcF9kZXBoYXNoIHsKKyAgIGttcF9kZXBoYXNoX2VudHJ5X3QgICAgICoqIGJ1Y2tldHM7CisjaWZkZWYgS01QX0RFQlVHCisgICBrbXBfdWludDMyICAgICAgICAgICAgICAgICBuZWxlbWVudHM7CisgICBrbXBfdWludDMyICAgICAgICAgICAgICAgICBuY29uZmxpY3RzOworI2VuZGlmCit9IGttcF9kZXBoYXNoX3Q7CisKKyNlbmRpZgorCisjaWZkZWYgQlVJTERfVElFRF9UQVNLX1NUQUNLCisKKy8qIFRpZWQgVGFzayBzdGFjayBkZWZpbml0aW9ucyAqLwordHlwZWRlZiBzdHJ1Y3Qga21wX3N0YWNrX2Jsb2NrIHsKKyAgICBrbXBfdGFza2RhdGFfdCAqICAgICAgICAgIHNiX2Jsb2NrWyBUQVNLX1NUQUNLX0JMT0NLX1NJWkUgXTsKKyAgICBzdHJ1Y3Qga21wX3N0YWNrX2Jsb2NrICogIHNiX25leHQ7CisgICAgc3RydWN0IGttcF9zdGFja19ibG9jayAqICBzYl9wcmV2OworfSBrbXBfc3RhY2tfYmxvY2tfdDsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX3Rhc2tfc3RhY2sgeworICAgIGttcF9zdGFja19ibG9ja190ICAgICAgICAgdHNfZmlyc3RfYmxvY2s7ICAvLyBmaXJzdCBibG9jayBvZiBzdGFjayBlbnRyaWVzCisgICAga21wX3Rhc2tkYXRhX3QgKiogICAgICAgICB0c190b3A7ICAgICAgICAgIC8vIHBvaW50ZXIgdG8gdGhlIHRvcCBvZiBzdGFjaworICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgICAgdHNfZW50cmllczsgICAgICAvLyBudW1iZXIgb2YgZW50cmllcyBvbiB0aGUgc3RhY2sKK30ga21wX3Rhc2tfc3RhY2tfdDsKKworI2VuZGlmIC8vIEJVSUxEX1RJRURfVEFTS19TVEFDSworCit0eXBlZGVmIHN0cnVjdCBrbXBfdGFza2luZ19mbGFncyB7ICAgICAgICAgIC8qIFRvdGFsIHN0cnVjdCBtdXN0IGJlIGV4YWN0bHkgMzIgYml0cyAqLworICAgIC8qIENvbXBpbGVyIGZsYWdzICovICAgICAgICAgICAgICAgICAgICAvKiBUb3RhbCBjb21waWxlciBmbGFncyBtdXN0IGJlIDE2IGJpdHMgKi8KKyAgICB1bnNpZ25lZCB0aWVkbmVzcyAgICA6IDE7ICAgICAgICAgICAgICAgLyogdGFzayBpcyBlaXRoZXIgdGllZCAoMSkgb3IgdW50aWVkICgwKSAqLworICAgIHVuc2lnbmVkIGZpbmFsICAgICAgIDogMTsgICAgICAgICAgICAgICAvKiB0YXNrIGlzIGZpbmFsKDEpIHNvIGV4ZWN1dGUgaW1tZWRpYXRlbHkgKi8KKyAgICB1bnNpZ25lZCBtZXJnZWRfaWYwICA6IDE7ICAgICAgICAgICAgICAgLyogbm8gX19rbXBjX3Rhc2tfe2JlZ2luL2NvbXBsZXRlfV9pZjAgY2FsbHMgaW4gaWYwIGNvZGUgcGF0aCAqLworI2lmIE9NUF80MF9FTkFCTEVECisgICAgdW5zaWduZWQgZGVzdHJ1Y3RvcnNfdGh1bmsgOiAxOyAgICAgICAgIC8qIHNldCBpZiB0aGUgY29tcGlsZXIgY3JlYXRlcyBhIHRodW5rIHRvIGludm9rZSBkZXN0cnVjdG9ycyBmcm9tIHRoZSBydW50aW1lICovCisgICAgdW5zaWduZWQgcmVzZXJ2ZWQgICAgOiAxMjsgICAgICAgICAgICAgIC8qIHJlc2VydmVkIGZvciBjb21waWxlciB1c2UgKi8KKyNlbHNlIC8vIE9NUF80MF9FTkFCTEVECisgICAgdW5zaWduZWQgcmVzZXJ2ZWQgICAgOiAxMzsgICAgICAgICAgICAgIC8qIHJlc2VydmVkIGZvciBjb21waWxlciB1c2UgKi8KKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorCisgICAgLyogTGlicmFyeSBmbGFncyAqLyAgICAgICAgICAgICAgICAgICAgIC8qIFRvdGFsIGxpYnJhcnkgZmxhZ3MgbXVzdCBiZSAxNiBiaXRzICovCisgICAgdW5zaWduZWQgdGFza3R5cGUgICAgOiAxOyAgICAgICAgICAgICAgIC8qIHRhc2sgaXMgZWl0aGVyIGV4cGxpY2l0KDEpIG9yIGltcGxpY2l0ICgwKSAqLworICAgIHVuc2lnbmVkIHRhc2tfc2VyaWFsIDogMTsgICAgICAgICAgICAgICAvKiB0aGlzIHRhc2sgaXMgZXhlY3V0ZWQgaW1tZWRpYXRlbHkgKDEpIG9yIGRlZmVycmVkICgwKSAqLworICAgIHVuc2lnbmVkIHRhc2tpbmdfc2VyIDogMTsgICAgICAgICAgICAgICAvKiBhbGwgdGFza3MgaW4gdGVhbSBhcmUgZWl0aGVyIGV4ZWN1dGVkIGltbWVkaWF0ZWx5ICgxKSBvciBtYXkgYmUgZGVmZXJyZWQgKDApICovCisgICAgdW5zaWduZWQgdGVhbV9zZXJpYWwgOiAxOyAgICAgICAgICAgICAgIC8qIGVudGlyZSB0ZWFtIGlzIHNlcmlhbCAoMSkgWzEgdGhyZWFkXSBvciBwYXJhbGxlbCAoMCkgWz49IDIgdGhyZWFkc10gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgZWl0aGVyIHRlYW1fc2VyaWFsIG9yIHRhc2tpbmdfc2VyIGlzIHNldCwgdGFzayB0ZWFtIG1heSBiZSBOVUxMICovCisgICAgLyogVGFzayBTdGF0ZSBGbGFnczogKi8KKyAgICB1bnNpZ25lZCBzdGFydGVkICAgICA6IDE7ICAgICAgICAgICAgICAgLyogMT09c3RhcnRlZCwgMD09bm90IHN0YXJ0ZWQgICAgICovCisgICAgdW5zaWduZWQgZXhlY3V0aW5nICAgOiAxOyAgICAgICAgICAgICAgIC8qIDE9PWV4ZWN1dGluZywgMD09bm90IGV4ZWN1dGluZyAqLworICAgIHVuc2lnbmVkIGNvbXBsZXRlICAgIDogMTsgICAgICAgICAgICAgICAvKiAxPT1jb21wbGV0ZSwgMD09bm90IGNvbXBsZXRlICAgKi8KKyAgICB1bnNpZ25lZCBmcmVlZCAgICAgICA6IDE7ICAgICAgICAgICAgICAgLyogMT09ZnJlZWQsIDA9PWFsbG9jYXRlZWQgICAgICAgICovCisgICAgdW5zaWduZWQgbmF0aXZlICAgICAgOiAxOyAgICAgICAgICAgICAgIC8qIDE9PWdjYy1jb21waWxlZCB0YXNrLCAwPT1pbnRlbCAqLworICAgIHVuc2lnbmVkIHJlc2VydmVkMzEgIDogNzsgICAgICAgICAgICAgICAvKiByZXNlcnZlZCBmb3IgbGlicmFyeSB1c2UgKi8KKworfSBrbXBfdGFza2luZ19mbGFnc190OworCisKK3N0cnVjdCBrbXBfdGFza2RhdGEgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsaWduZWQgZHVyaW5nIGR5bmFtaWMgYWxsb2NhdGlvbiAgICAgICAqLworICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgIHRkX3Rhc2tfaWQ7ICAgICAgICAgICAgICAgLyogaWQsIGFzc2lnbmVkIGJ5IGRlYnVnZ2VyICAgICAgICAgICAgICAgICovCisgICAga21wX3Rhc2tpbmdfZmxhZ3NfdCAgICAgdGRfZmxhZ3M7ICAgICAgICAgICAgICAgICAvKiB0YXNrIGZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBrbXBfdGVhbV90ICogICAgICAgICAgICB0ZF90ZWFtOyAgICAgICAgICAgICAgICAgIC8qIHRlYW0gZm9yIHRoaXMgdGFzayAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGttcF9pbmZvX3AgKiAgICAgICAgICAgIHRkX2FsbG9jX3RocmVhZDsgICAgICAgICAgLyogdGhyZWFkIHRoYXQgYWxsb2NhdGVkIGRhdGEgc3RydWN0dXJlcyAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50bHkgbm90IHVzZWQgZXhjZXB0IGZvciBwZXJoYXBzIElEQiAqLworICAgIGttcF90YXNrZGF0YV90ICogICAgICAgIHRkX3BhcmVudDsgICAgICAgICAgICAgICAgLyogcGFyZW50IHRhc2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgdGRfbGV2ZWw7ICAgICAgICAgICAgICAgICAvKiB0YXNrIG5lc3RpbmcgbGV2ZWwgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZGVudF90ICogICAgICAgICAgICAgICB0ZF9pZGVudDsgICAgICAgICAgICAgICAgIC8qIHRhc2sgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRhc2t3YWl0IGRhdGEuCisgICAgaWRlbnRfdCAqICAgICAgICAgICAgICAgdGRfdGFza3dhaXRfaWRlbnQ7CisgICAga21wX3VpbnQzMiAgICAgICAgICAgICAgdGRfdGFza3dhaXRfY291bnRlcjsKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICB0ZF90YXNrd2FpdF90aHJlYWQ7ICAgICAgIC8qIGd0aWQgKyAxIG9mIHRocmVhZCBlbmNvdW50ZXJlZCB0YXNrd2FpdCAqLworICAgIGttcF9pbnRlcm5hbF9jb250cm9sX3QgIHRkX2ljdnM7ICAgICAgICAgICAgICAgICAgLyogSW50ZXJuYWwgY29udHJvbCB2YXJpYWJsZXMgZm9yIHRoZSB0YXNrICovCisgICAgdm9sYXRpbGUga21wX3VpbnQzMiAgICAgdGRfYWxsb2NhdGVkX2NoaWxkX3Rhc2tzOyAgLyogQ2hpbGQgdGFza3MgKCsgY3VycmVudCB0YXNrKSBub3QgeWV0IGRlYWxsb2NhdGVkICovCisgICAgdm9sYXRpbGUga21wX3VpbnQzMiAgICAgdGRfaW5jb21wbGV0ZV9jaGlsZF90YXNrczsgLyogQ2hpbGQgdGFza3Mgbm90IHlldCBjb21wbGV0ZSAqLworI2lmIE9NUF80MF9FTkFCTEVECisgICAga21wX3Rhc2tncm91cF90ICogICAgICAgdGRfdGFza2dyb3VwOyAgICAgICAgIC8vIEVhY2ggdGFzayBrZWVwcyBwb2ludGVyIHRvIGl0cyBjdXJyZW50IHRhc2tncm91cAorICAgIGttcF9kZXBoYXNoX3QgKiAgICAgICAgIHRkX2RlcGhhc2g7ICAgICAgICAgICAvLyBEZXBlbmRlbmNpZXMgZm9yIGNoaWxkcmVuIHRhc2tzIGFyZSB0cmFja2VkIGZyb20gaGVyZQorICAgIGttcF9kZXBub2RlX3QgKiAgICAgICAgIHRkX2RlcG5vZGU7ICAgICAgICAgICAvLyBQb2ludGVyIHRvIGdyYXBoIG5vZGUgaWYgdGhpcyB0YXNrIGhhcyBkZXBlbmRlbmNpZXMKKyNlbmRpZgorI2lmIEtNUF9IQVZFX1FVQUQKKyAgICBfUXVhZCAgICAgICAgICAgICAgICAgICB0ZF9kdW1teTsgICAgICAgICAgICAgLy8gQWxpZ24gc3RydWN0dXJlIDE2LWJ5dGUgc2l6ZSBzaW5jZSBhbGxvY2F0ZWQganVzdCBiZWZvcmUga21wX3Rhc2tfdAorI2Vsc2UKKyAgICBrbXBfdWludDMyICAgICAgICAgICAgICB0ZF9kdW1teVsyXTsKKyNlbmRpZgorfTsgLy8gc3RydWN0IGttcF90YXNrZGF0YQorCisvLyBNYWtlIHN1cmUgcGFkZGluZyBhYm92ZSB3b3JrZWQKK0tNUF9CVUlMRF9BU1NFUlQoIHNpemVvZihrbXBfdGFza2RhdGFfdCkgJSBzaXplb2Yodm9pZCAqKSA9PSAwICk7CisKKy8vIERhdGEgZm9yIHRhc2sgdGVhbSBidXQgcGVyIHRocmVhZAordHlwZWRlZiBzdHJ1Y3Qga21wX2Jhc2VfdGhyZWFkX2RhdGEgeworICAgIGttcF9pbmZvX3AgKiAgICAgICAgICAgIHRkX3RocjsgICAgICAgICAgICAgICAgLy8gUG9pbnRlciBiYWNrIHRvIHRocmVhZCBpbmZvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2VkIG9ubHkgaW4gX19rbXBfZXhlY3V0ZV90YXNrcywgbWF5YmUgbm90IGF2YWlsIHVudGlsIHRhc2sgaXMgcXVldWVkPworICAgIGttcF9ib290c3RyYXBfbG9ja190ICAgIHRkX2RlcXVlX2xvY2s7ICAgICAgICAgLy8gTG9jayBmb3IgYWNjZXNzaW5nIGRlcXVlCisgICAga21wX3Rhc2tkYXRhX3QgKiogICAgICAgdGRfZGVxdWU7ICAgICAgICAgICAgICAvLyBEZXF1ZSBvZiB0YXNrcyBlbmNvdW50ZXJlZCBieSB0ZF90aHIsIGR5bmFtaWNhbGx5IGFsbG9jYXRlZAorICAgIGttcF91aW50MzIgICAgICAgICAgICAgIHRkX2RlcXVlX2hlYWQ7ICAgICAgICAgLy8gSGVhZCBvZiBkZXF1ZSAod2lsbCB3cmFwKQorICAgIGttcF91aW50MzIgICAgICAgICAgICAgIHRkX2RlcXVlX3RhaWw7ICAgICAgICAgLy8gVGFpbCBvZiBkZXF1ZSAod2lsbCB3cmFwKQorICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgIHRkX2RlcXVlX250YXNrczsgICAgICAgLy8gTnVtYmVyIG9mIHRhc2tzIGluIGRlcXVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHRUg6IHNob3VsZG4ndCB0aGlzIGJlIHZvbGF0aWxlIHNpbmNlIHVzZWQgaW4gd2hpbGUtc3Bpbj8KKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICB0ZF9kZXF1ZV9sYXN0X3N0b2xlbjsgIC8vIFRocmVhZCBudW1iZXIgb2YgbGFzdCBzdWNjZXNzZnVsIHN0ZWFsCisjaWZkZWYgQlVJTERfVElFRF9UQVNLX1NUQUNLCisgICAga21wX3Rhc2tfc3RhY2tfdCAgICAgICAgdGRfc3VzcF90aWVkX3Rhc2tzOyAgICAvLyBTdGFjayBvZiBzdXNwZW5kZWQgdGllZCB0YXNrcyBmb3IgdGFzayBzY2hlZHVsaW5nIGNvbnN0cmFpbnQKKyNlbmRpZiAvLyBCVUlMRF9USUVEX1RBU0tfU1RBQ0sKK30ga21wX2Jhc2VfdGhyZWFkX2RhdGFfdDsKKwordHlwZWRlZiB1bmlvbiBLTVBfQUxJR05fQ0FDSEUga21wX3RocmVhZF9kYXRhIHsKKyAgICBrbXBfYmFzZV90aHJlYWRfZGF0YV90ICB0ZDsKKyAgICBkb3VibGUgICAgICAgICAgICAgICAgICB0ZF9hbGlnbjsgICAgICAgLyogdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50ICovCisgICAgY2hhciAgICAgICAgICAgICAgICAgICAgdGRfcGFkWyBLTVBfUEFEKGttcF9iYXNlX3RocmVhZF9kYXRhX3QsIENBQ0hFX0xJTkUpIF07Cit9IGttcF90aHJlYWRfZGF0YV90OworCisKKy8vIERhdGEgZm9yIHRhc2sgdGVhbXMgd2hpY2ggYXJlIHVzZWQgd2hlbiB0YXNraW5nIGlzIGVuYWJsZWQgZm9yIHRoZSB0ZWFtCit0eXBlZGVmIHN0cnVjdCBrbXBfYmFzZV90YXNrX3RlYW0geworICAgIGttcF9ib290c3RyYXBfbG9ja190ICAgIHR0X3RocmVhZHNfbG9jazsgICAgICAgLyogTG9jayB1c2VkIHRvIGFsbG9jYXRlIHBlci10aHJlYWQgcGFydCBvZiB0YXNrIHRlYW0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11c3QgYmUgYm9vdHN0cmFwIGxvY2sgc2luY2UgdXNlZCBhdCBsaWJyYXJ5IHNodXRkb3duKi8KKyAgICBrbXBfdGFza190ZWFtX3QgKiAgICAgICB0dF9uZXh0OyAgICAgICAgICAgICAgIC8qIEZvciBsaW5raW5nIHRoZSB0YXNrIHRlYW0gZnJlZSBsaXN0ICovCisgICAga21wX3RocmVhZF9kYXRhX3QgKiAgICAgdHRfdGhyZWFkc19kYXRhOyAgICAgICAvKiBBcnJheSBvZiBwZXItdGhyZWFkIHN0cnVjdHVyZXMgZm9yIHRhc2sgdGVhbSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGF0YSBzdXJ2aXZlcyB0YXNrIHRlYW0gZGVhbGxvY2F0aW9uICovCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgdHRfZm91bmRfdGFza3M7ICAgICAgICAvKiBIYXZlIHdlIGZvdW5kIHRhc2tzIGFuZCBxdWV1ZWQgdGhlbSB3aGlsZSBleGVjdXRpbmcgdGhpcyB0ZWFtPyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVFJVRSBtZWFucyB0dF90aHJlYWRzX2RhdGEgaXMgc2V0IHVwIGFuZCBpbml0aWFsaXplZCAqLworICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgIHR0X25wcm9jOyAgICAgICAgICAgICAgLyogI3RocmVhZHMgaW4gdGVhbSAgICAgICAgICAgKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICB0dF9tYXhfdGhyZWFkczsgICAgICAgIC8qIG51bWJlciBvZiBlbnRyaWVzIGFsbG9jYXRlZCBmb3IgdGhyZWFkc19kYXRhIGFycmF5ICovCisKKyAgICBLTVBfQUxJR05fQ0FDSEUKKyAgICB2b2xhdGlsZSBrbXBfdWludDMyICAgICB0dF91bmZpbmlzaGVkX3RocmVhZHM7IC8qICN0aHJlYWRzIHN0aWxsIGFjdGl2ZSAgICAgICovCisKKyAgICBLTVBfQUxJR05fQ0FDSEUKKyAgICB2b2xhdGlsZSBrbXBfdWludDMyICAgICB0dF9hY3RpdmU7ICAgICAgICAgICAgIC8qIGlzIHRoZSB0ZWFtIHN0aWxsIGFjdGl2ZWx5IGV4ZWN1dGluZyB0YXNrcyAqLworCisgICAgS01QX0FMSUdOX0NBQ0hFCisgICAgdm9sYXRpbGUga21wX3VpbnQzMiAgICAgdHRfcmVmX2N0OyAgICAgICAgICAgICAvKiAjdGhyZWFkcyBhY2Nlc3Npbmcgc3RydWN0ICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKG5vdCBpbmNsLiBtYXN0ZXIpICAgICAgICAgKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICB0dF9zdGF0ZTsgICAgICAgICAgICAgIC8qIGFsdGVybmF0aW5nIDAvMSBmb3IgdGFzayB0ZWFtIGlkZW50aWZpY2F0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOb3RlOiBWRVJZIHNlbnNpdGl2ZSB0byBwYWRkaW5nISAqLworfSBrbXBfYmFzZV90YXNrX3RlYW1fdDsKKwordW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF90YXNrX3RlYW0geworICAgIGttcF9iYXNlX3Rhc2tfdGVhbV90IHR0OworICAgIGRvdWJsZSAgICAgICAgICAgICAgIHR0X2FsaWduOyAgICAgICAvKiB1c2Ugd29yc3QgY2FzZSBhbGlnbm1lbnQgKi8KKyAgICBjaGFyICAgICAgICAgICAgICAgICB0dF9wYWRbIEtNUF9QQUQoa21wX2Jhc2VfdGFza190ZWFtX3QsIENBQ0hFX0xJTkUpIF07Cit9OworCisjZW5kaWYgIC8vIE9NUF8zMF9FTkFCTEVECisKKyNpZiAoIFVTRV9GQVNUX01FTU9SWSA9PSAzICkgfHwgKCBVU0VfRkFTVF9NRU1PUlkgPT0gNSApCisvLyBGcmVlIGxpc3RzIGtlZXAgc2FtZS1zaXplIGZyZWUgbWVtb3J5IHNsb3RzIGZvciBmYXN0IG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzCit0eXBlZGVmIHN0cnVjdCBrbXBfZnJlZV9saXN0IHsKKyAgICB2b2lkICAgICAgICAgICAgICp0aF9mcmVlX2xpc3Rfc2VsZjsgICAvLyBTZWxmLWFsbG9jYXRlZCB0YXNrcyBmcmVlIGxpc3QKKyAgICB2b2lkICAgICAgICAgICAgICp0aF9mcmVlX2xpc3Rfc3luYzsgICAvLyBTZWxmLWFsbG9jYXRlZCB0YXNrcyBzdG9sZW4vcmV0dXJuZWQgYnkgb3RoZXIgdGhyZWFkcworICAgIHZvaWQgICAgICAgICAgICAgKnRoX2ZyZWVfbGlzdF9vdGhlcjsgIC8vIE5vbi1zZWxmIGZyZWUgbGlzdCAodG8gYmUgcmV0dXJuZWQgdG8gb3duZXIncyBzeW5jIGxpc3QpCit9IGttcF9mcmVlX2xpc3RfdDsKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8vIE9wZW5NUCB0aHJlYWQgZGF0YSBzdHJ1Y3R1cmVzCisvLworCit0eXBlZGVmIHN0cnVjdCBLTVBfQUxJR05fQ0FDSEUga21wX2Jhc2VfaW5mbyB7CisvKgorICogU3RhcnQgd2l0aCB0aGUgcmVhZG9ubHkgZGF0YSB3aGljaCBpcyBjYWNoZSBhbGlnbmVkIGFuZCBwYWRkZWQuCisgKiB0aGlzIGlzIHdyaXR0ZW4gYmVmb3JlIHRoZSB0aHJlYWQgc3RhcnRzIHdvcmtpbmcgYnkgdGhlIG1hc3Rlci4KKyAqICh1YmVyIG1hc3RlcnMgbWF5IHVwZGF0ZSB0aGVtc2VsdmVzIGxhdGVyKQorICogKHVzYWdlIGRvZXMgbm90IGNvbnNpZGVyIHNlcmlhbGl6ZWQgcmVnaW9ucykKKyAqLworICAgIGttcF9kZXNjX3QgICAgICAgIHRoX2luZm87CisgICAga21wX3RlYW1fcCAgICAgICAqdGhfdGVhbTsgICAgICAgLyogdGVhbSB3ZSBiZWxvbmcgdG8gKi8KKyAgICBrbXBfcm9vdF9wICAgICAgICp0aF9yb290OyAgICAgICAvKiBwb2ludGVyIHRvIHJvb3Qgb2YgdGFzayBoaWVyYXJjaHkgKi8KKyAgICBrbXBfaW5mb19wICAgICAgICp0aF9uZXh0X3Bvb2w7ICAvKiBuZXh0IGF2YWlsYWJsZSB0aHJlYWQgaW4gdGhlIHBvb2wgKi8KKyAgICBrbXBfZGlzcF90ICAgICAgICp0aF9kaXNwYXRjaDsgICAvKiB0aHJlYWQncyBkaXNwYXRjaCBkYXRhICovCisgICAgaW50ICAgICAgICAgICAgICAgdGhfaW5fcG9vbDsgICAgLyogaW4gdGhyZWFkIHBvb2wgKDMyIGJpdHMgZm9yIFRDUi9UQ1cpICovCisKKyAgICAvKiBUaGUgZm9sbG93aW5nIGFyZSBjYWNoZWQgZnJvbSB0aGUgdGVhbSBpbmZvIHN0cnVjdHVyZSAqLworICAgIC8qIFRPRE8gdXNlIHRoZXNlIGluIG1vcmUgcGxhY2VzIGFzIGRldGVybWluZWQgdG8gYmUgbmVlZGVkIHZpYSBwcm9maWxpbmcgKi8KKyAgICBpbnQgICAgICAgICAgICAgICB0aF90ZWFtX25wcm9jOyAgICAgIC8qIG51bWJlciBvZiB0aHJlYWRzIGluIGEgdGVhbSAqLworICAgIGttcF9pbmZvX3AgICAgICAgKnRoX3RlYW1fbWFzdGVyOyAgICAgLyogdGhlIHRlYW0ncyBtYXN0ZXIgdGhyZWFkICovCisgICAgaW50ICAgICAgICAgICAgICAgdGhfdGVhbV9zZXJpYWxpemVkOyAvKiB0ZWFtIGlzIHNlcmlhbGl6ZWQgKi8KKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIG1pY3JvdGFza190ICAgICAgIHRoX3RlYW1fbWljcm90YXNrOyAgLyogc2F2ZSBlbnRyeSBhZGRyZXNzIGZvciB0ZWFtcyBjb25zdHJ1Y3QgKi8KKyAgICBpbnQgICAgICAgICAgICAgICB0aF90ZWFtc19sZXZlbDsgICAgIC8qIHNhdmUgaW5pdGlhbCBsZXZlbCBvZiB0ZWFtcyBjb25zdHJ1Y3QgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGl0IGlzIDAgb24gZGV2aWNlIGJ1dCBtYXkgYmUgYW55IG9uIGhvc3QgKi8KKyNlbmRpZgorCisgICAgLyogVGhlIGJsb2NrdGltZSBpbmZvIGlzIGNvcGllZCBmcm9tIHRoZSB0ZWFtIHN0cnVjdCB0byB0aGUgdGhyZWFkIHNydWN0ICovCisgICAgLyogYXQgdGhlIHN0YXJ0IG9mIGEgYmFycmllciwgYW5kIHRoZSB2YWx1ZXMgc3RvcmVkIGluIHRoZSB0ZWFtIGFyZSB1c2VkICovCisgICAgLyogYXQgcG9pbnRzIGluIHRoZSBjb2RlIHdoZXJlIHRoZSB0ZWFtIHN0cnVjdCBpcyBubyBsb25nZXIgZ3VhcmFudGVlZCAgICovCisgICAgLyogdG8gZXhpc3QgKGZyb20gdGhlIFBPViBvZiB3b3JrZXIgdGhyZWFkcykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaW50ICAgICAgICAgICAgICAgdGhfdGVhbV9idF9pbnRlcnZhbHM7CisgICAgaW50ICAgICAgICAgICAgICAgdGhfdGVhbV9idF9zZXQ7CisKKyAgICBrbXBfaW50ZXJuYWxfY29udHJvbF90ICB0aF9maXhlZF9pY3ZzOyAgICAgICAgICAgIC8qIEluaXRpYWwgSUNWcyBmb3IgdGhlIHRocmVhZCAqLworCisKKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAga21wX2FmZmluX21hc2tfdCAgKnRoX2FmZmluX21hc2s7IC8qIHRocmVhZCdzIGN1cnJlbnQgYWZmaW5pdHkgbWFzayAqLworI2VuZGlmCisKKworLyoKKyAqIFRoZSBkYXRhIHNldCBieSB0aGUgbWFzdGVyIGF0IHJlaW5pdCwgdGhlbiBSL1cgYnkgdGhlIHdvcmtlcgorICovCisgICAgS01QX0FMSUdOX0NBQ0hFIGludCAgICAgdGhfc2V0X25wcm9jOyAgLyogaWYgPiAwLCB0aGVuIG9ubHkgdXNlIHRoaXMgcmVxdWVzdCBmb3IgdGhlIG5leHQgZm9yayAqLworI2lmIE9NUF80MF9FTkFCTEVECisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgdGhfc2V0X250aF90ZWFtczsgLyogbnVtYmVyIG9mIHRocmVhZHMgaW4gcGFyYWxsZWwgbmVzdGVkIGluIHRlYW1zIGNvbnN0cnVjdCAqLworICAgIGttcF9wcm9jX2JpbmRfdCAgICAgICAgIHRoX3NldF9wcm9jX2JpbmQ7IC8qIGlmICE9IHByb2NfYmluZF9kZWZhdWx0LCB1c2UgcmVxdWVzdCBmb3IgbmV4dCBmb3JrICovCisjIGlmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICB0aF9jdXJyZW50X3BsYWNlOyAvKiBwbGFjZSBjdXJyZW50bHkgYm91bmQgdG8gKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICB0aF9uZXdfcGxhY2U7ICAgICAvKiBwbGFjZSB0byBiaW5kIHRvIGluIHBhciByZWcgKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICB0aF9maXJzdF9wbGFjZTsgICAvKiBmaXJzdCBwbGFjZSBpbiBwYXJ0aXRpb24gKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICB0aF9sYXN0X3BsYWNlOyAgICAvKiBsYXN0IHBsYWNlIGluIHBhcnRpdGlvbiAqLworIyBlbmRpZgorI2VuZGlmCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIGttcF91aW50NjQgICAgICAgICAgICAgIHRoX2Jhcl9hcnJpdmVfdGltZTsgICAgICAgICAgIC8qIGFycml2YWwgdG8gYmFycmllciB0aW1lc3RhbXAgKi8KKyAgICBrbXBfdWludDY0ICAgICAgICAgICAgICB0aF9mcmFtZV90aW1lOyAgICAgICAgICAgICAgICAvKiBmcmFtZSB0aW1lc3RhbXAgKi8KKyAgICBrbXBfdWludDY0ICAgICAgICAgICAgICB0aF9mcmFtZV90aW1lX3NlcmlhbGl6ZWQ7ICAgICAvKiBmcmFtZSB0aW1lc3RhbXAgaW4gc2VyaWFsaXplZCBwYXJhbGxlbCAqLworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICBrbXBfbG9jYWxfdCAgICAgICAgICAgICB0aF9sb2NhbDsKKyAgICBzdHJ1Y3QgcHJpdmF0ZV9jb21tb24gICp0aF9wcmlfaGVhZDsKKworLyoKKyAqIE5vdyB0aGUgZGF0YSBvbmx5IHVzZWQgYnkgdGhlIHdvcmtlciAoYWZ0ZXIgaW5pdGlhbCBhbGxvY2F0aW9uKQorICovCisgICAgLyogVE9ETyB0aGUgZmlyc3Qgc2VyaWFsIHRlYW0gc2hvdWxkIGFjdHVhbGx5IGJlIHN0b3JlZCBpbiB0aGUgaW5mb190CisgICAgICogc3RydWN0dXJlLiAgdGhpcyB3aWxsIGhlbHAgcmVkdWNlIGluaXRpYWwgYWxsb2NhdGlvbiBvdmVyaGVhZCAqLworICAgIEtNUF9BTElHTl9DQUNIRSBrbXBfdGVhbV9wICp0aF9zZXJpYWxfdGVhbTsgLypzZXJpYWxpemVkIHRlYW0gaGVsZCBpbiByZXNlcnZlKi8KKy8qIFRoZSBmb2xsb3dpbmcgYXJlIGFsc28gcmVhZCBieSB0aGUgbWFzdGVyIGR1cmluZyByZWluaXQgKi8KKyAgICBzdHJ1Y3QgY29tbW9uX3RhYmxlICAgICp0aF9wcmlfY29tbW9uOworCisgICAgdm9sYXRpbGUga21wX3VpbnQzMiAgICAgdGhfc3Bpbl9oZXJlOyAgIC8qIHRocmVhZC1sb2NhbCBsb2NhdGlvbiBmb3Igc3Bpbm5pbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd2hpbGUgYXdhaXRpbmcgcXVldWluZyBsb2NrIGFjcXVpcmUgKi8KKworICAgIHZvbGF0aWxlIGttcF91aW50MzIgICAgKnRoX3NsZWVwX2xvYzsKKworLyoKKyAqIFR3byB2YXJpYWJsZXMgdXNlZCBmb3IgY29uc2lzdGVuY3kgY2hlY2sgLSBzdHJ1Y3QgY29uc19oZWFkZXIgKnRoX2NvbnMgYW5kIGludGUgdGhfZmlyc3QgbW92ZWQgYmVsb3cKKyAqIGZyb20gaGVyZSBpbiBvcmRlciB0byBhdm9pZCBwZXJmb3JtYW5jZSByZWdyZXNzaW9uCisqLworICAgIGlkZW50X3QgICAgICAgICAgKnRoX2lkZW50OworICAgIHVuc2lnbmVkICAgICAgICAgdGhfeDsgICAgICAgICAgICAgICAgICAgICAvLyBSYW5kb20gbnVtYmVyIGdlbmVyYXRvciBkYXRhCisgICAgdW5zaWduZWQgICAgICAgICB0aF9hOyAgICAgICAgICAgICAgICAgICAgIC8vIFJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGRhdGEKKworI2lmIE9NUF8zMF9FTkFCTEVECisvKgorICogVGFza2luZy1yZWxhdGVkIGRhdGEgZm9yIHRoZSB0aHJlYWQKKyAqLworICAgIGttcF90YXNrX3RlYW1fdCAgICAqIHRoX3Rhc2tfdGVhbTsgICAgICAgICAgIC8vIFRhc2sgdGVhbSBzdHJ1Y3QKKyAgICBrbXBfdGFza2RhdGFfdCAgICAgKiB0aF9jdXJyZW50X3Rhc2s7ICAgICAgICAvLyBJbm5lcm1vc3QgVGFzayBiZWluZyBleGVjdXRlZAorICAgIGttcF91aW50OCAgICAgICAgICAgIHRoX3Rhc2tfc3RhdGU7ICAgICAgICAgIC8vIGFsdGVybmF0aW5nIDAvMSBmb3IgdGFzayB0ZWFtIGlkZW50aWZpY2F0aW9uCisjZW5kaWYgIC8vIE9NUF8zMF9FTkFCTEVECisKKyAgICAvKgorICAgICAqIE1vcmUgc3R1ZmYgZm9yIGtlZXBpbmcgdHJhY2sgb2YgYWN0aXZlL3NsZWVwaW5nIHRocmVhZHMKKyAgICAgKiAodGhpcyBwYXJ0IGlzIHdyaXR0ZW4gYnkgdGhlIHdvcmtlciB0aHJlYWQpCisgICAgICovCisgICAga21wX3VpbnQ4ICAgICAgICAgICAgdGhfYWN0aXZlX2luX3Bvb2w7ICAgICAgLy8gaW5jbHVkZWQgaW4gY291bnQgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAjYWN0aXZlIHRocmVhZHMgaW4gcG9vbAorICAgIGludCAgICAgICAgICAgICAgICAgIHRoX2FjdGl2ZTsgICAgICAgICAgICAgIC8vICEgc2xlZXBpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAzMiBiaXRzIGZvciBUQ1IvVENXCisKKworICAgIHN0cnVjdCBjb25zX2hlYWRlciAqIHRoX2NvbnM7CisgICAgaW50ICAgICAgICAgICAgICAgICAgdGhfZmlyc3Q7CisKKy8qCisgKiBBZGQgdGhlIHN5bmNyb25pemluZyBkYXRhIHdoaWNoIGlzIGNhY2hlIGFsaWduZWQgYW5kIHBhZGRlZC4KKyAqLworICAgIEtNUF9BTElHTl9DQUNIRSBrbXBfYmFsaWduX3QgICAgICB0aF9iYXJbIGJzX2xhc3RfYmFycmllciBdOworCisgICAgS01QX0FMSUdOX0NBQ0hFIHZvbGF0aWxlICAgICBrbXBfaW50MzIgICAgdGhfbmV4dF93YWl0aW5nOyAgLyogZ3RpZCsxIG9mIG5leHQgdGhyZWFkIG9uIGxvY2sgd2FpdCBxdWV1ZSwgMCBpZiBub25lICovCisKKyNpZiAoIFVTRV9GQVNUX01FTU9SWSA9PSAzICkgfHwgKCBVU0VfRkFTVF9NRU1PUlkgPT0gNSApCisgICAgI2RlZmluZSBOVU1fTElTVFMgNAorICAgIGttcF9mcmVlX2xpc3RfdCAgIHRoX2ZyZWVfbGlzdHNbTlVNX0xJU1RTXTsgICAvLyBGcmVlIGxpc3RzIGZvciBmYXN0IG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzCisjZW5kaWYKKworI2lmIEtNUF9PU19XSU5ET1dTCisgICAga21wX3dpbjMyX2NvbmRfdCAgdGhfc3VzcGVuZF9jdjsKKyAgICBrbXBfd2luMzJfbXV0ZXhfdCB0aF9zdXNwZW5kX214OworICAgIGludCAgICAgICAgICAgICAgIHRoX3N1c3BlbmRfaW5pdDsKKyNlbmRpZgorI2lmIEtNUF9PU19VTklYCisgICAga21wX2NvbmRfYWxpZ25fdCAgdGhfc3VzcGVuZF9jdjsKKyAgICBrbXBfbXV0ZXhfYWxpZ25fdCB0aF9zdXNwZW5kX214OworICAgIGludCAgICAgICAgICAgICAgIHRoX3N1c3BlbmRfaW5pdF9jb3VudDsKKyNlbmRpZgorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIGttcF9pdHRfbWFya190ICAgICAgICB0aF9pdHRfbWFya19zaW5nbGU7CisgICAgLy8gYWxpZ25tZW50ID8/PworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KK30ga21wX2Jhc2VfaW5mb190OworCit0eXBlZGVmIHVuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfaW5mbyB7CisgICAgZG91YmxlICAgICAgICAgIHRoX2FsaWduOyAgICAgICAgLyogdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50ICovCisgICAgY2hhciAgICAgICAgICAgIHRoX3BhZFsgS01QX1BBRChrbXBfYmFzZV9pbmZvX3QsIENBQ0hFX0xJTkUpIF07CisgICAga21wX2Jhc2VfaW5mb190IHRoOworfSBrbXBfaW5mb190OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8vIE9wZW5NUCB0aHJlYWQgdGVhbSBkYXRhIHN0cnVjdHVyZXMKKy8vCit0eXBlZGVmIHN0cnVjdCBrbXBfYmFzZV9kYXRhIHsKKyAgICB2b2xhdGlsZSBrbXBfdWludDMyIHRfdmFsdWU7Cit9IGttcF9iYXNlX2RhdGFfdDsKKwordHlwZWRlZiB1bmlvbiBLTVBfQUxJR05fQ0FDSEUga21wX3NsZWVwX3RlYW0geworICAgIGRvdWJsZSAgICAgICAgICAgICAgZHRfYWxpZ247ICAgICAgICAvKiB1c2Ugd29yc3QgY2FzZSBhbGlnbm1lbnQgKi8KKyAgICBjaGFyICAgICAgICAgICAgICAgIGR0X3BhZFsgS01QX1BBRChrbXBfYmFzZV9kYXRhX3QsIENBQ0hFX0xJTkUpIF07CisgICAga21wX2Jhc2VfZGF0YV90ICAgICBkdDsKK30ga21wX3NsZWVwX3RlYW1fdDsKKwordHlwZWRlZiB1bmlvbiBLTVBfQUxJR05fQ0FDSEUga21wX29yZGVyZWRfdGVhbSB7CisgICAgZG91YmxlICAgICAgICAgICAgICBkdF9hbGlnbjsgICAgICAgIC8qIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudCAqLworICAgIGNoYXIgICAgICAgICAgICAgICAgZHRfcGFkWyBLTVBfUEFEKGttcF9iYXNlX2RhdGFfdCwgQ0FDSEVfTElORSkgXTsKKyAgICBrbXBfYmFzZV9kYXRhX3QgICAgIGR0OworfSBrbXBfb3JkZXJlZF90ZWFtX3Q7CisKK3R5cGVkZWYgaW50ICAgICAoKmxhdW5jaF90KSggaW50IGd0aWQgKTsKKworLyogTWluaW11bSBudW1iZXIgb2YgQVJHViBlbnRyaWVzIHRvIG1hbGxvYyBpZiBuZWNlc3NhcnkgKi8KKyNkZWZpbmUgS01QX01JTl9NQUxMT0NfQVJHVl9FTlRSSUVTICAgICAxMDAKKworI2lmIEtNUF9NSUMgJiYgT01QXzMwX0VOQUJMRUQKKyMgZGVmaW5lIEtNUF9CQVJSSUVSX0lDVl9QVUxMICAgMQorI2Vsc2UKKyMgZGVmaW5lIEtNUF9CQVJSSUVSX0lDVl9QVUxMICAgMAorI2VuZGlmCisKKyNpZiAoS01QX1BFUkZfVjEwNiA9PSBLTVBfT04pCisvLworLy8gU2V0IHVwIGhvdyBtYW55IGFyZ3YgcG9pbnRlcnMgd2lsbCBmaXQgaW4gY2FjaGUgbGluZXMgY29udGFpbmluZworLy8gKnRfaW5saW5lX2FyZ3YuIEhpc3RvcmljYWxseSwgd2UgaGF2ZSBzdXBwb3J0ZWQgYXQgbGVhc3QgOTYgYnl0ZXMuCisvLworLy8gVXNpbmcgYSBsYXJnZXIgdmFsdWUgZm9yIG1vcmUgc3BhY2UgYmV0d2VlbiB0aGUgbWFzdGVyIHdyaXRlL3dvcmtlciByZWFkCisvLyBzZWN0aW9uIGFuZCByZWFkL3dyaXRlIGJ5IGFsbCBzZWN0aW9uIHNlZW1zIHRvIGJ1eSBtb3JlIHBlcmZvcm1hbmNlCisvLyBvbiBFUENDIFBBUkFMTEVMLgorLy8KKy8vIyBkZWZpbmUgS01QX0lOTElORV9BUkdWX0JZVEVTICAgICAgICAgICggMiAqIENBQ0hFX0xJTkUgKQorIyBpZiBLTVBfQkFSUklFUl9JQ1ZfUFVMTAorIyAgZGVmaW5lIEtNUF9JTkxJTkVfQVJHVl9CWVRFUyAgICAgICAgICAxOTIKKy8vIyAgZGVmaW5lIEtNUF9JTkxJTkVfQVJHVl9CWVRFUyAgICAgICAgICggMiAqIENBQ0hFX0xJTkUgLSAoICggNSAqIEtNUF9QVFJfU0tJUCArIDEwICogc2l6ZW9mKGludCkgKyBzaXplb2Yoa21wX2ludDY0KSApICUgQ0FDSEVfTElORSApICkKKyMgZWxpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisjICBkZWZpbmUgS01QX0lOTElORV9BUkdWX0JZVEVTICAgICAgICAgKCA0ICogQ0FDSEVfTElORSAtICggKCAzICogS01QX1BUUl9TS0lQICsgMiAqIHNpemVvZihpbnQpICsgMiAqIHNpemVvZihrbXBfaW50OCkgKyBzaXplb2Yoa21wX2ludDE2KSArIHNpemVvZihrbXBfdWludDMyKSApICUgQ0FDSEVfTElORSApICkKKyMgZWxzZQorIyAgZGVmaW5lIEtNUF9JTkxJTkVfQVJHVl9CWVRFUyAgICAgICAgICggMiAqIENBQ0hFX0xJTkUgLSAoICggMyAqIEtNUF9QVFJfU0tJUCArIDIgKiBzaXplb2YoaW50KSApICUgQ0FDSEVfTElORSApICkKKyMgZW5kaWYKKyMgZGVmaW5lIEtNUF9JTkxJTkVfQVJHVl9FTlRSSUVTICAgICAgICAoaW50KSggS01QX0lOTElORV9BUkdWX0JZVEVTIC8gS01QX1BUUl9TS0lQICkKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBLTVBfQUxJR05fQ0FDSEUga21wX2Jhc2VfdGVhbSB7CisvKgorICogU3luY2hyb25pemF0aW9uIERhdGEKKyAqLworICAgIEtNUF9BTElHTl9DQUNIRSBrbXBfb3JkZXJlZF90ZWFtX3QgICAgICAgdF9vcmRlcmVkOworICAgIGttcF9iYWxpZ25fdGVhbV90ICAgICAgICB0X2JhclsgYnNfbGFzdF9iYXJyaWVyIF07CisKKyAgICAvKiBjb3VudCBvZiBzaW5nbGUgZGlyZWN0aXZlIGVuY291bnRlcmVkIGJ5IHRlYW0gKi8KKyAgICB2b2xhdGlsZSBpbnQgICAgICAgICAgICAgdF9jb25zdHJ1Y3Q7CisgICAga21wX2xvY2tfdCAgICAgICAgICAgICAgIHRfc2luZ2xlX2xvY2s7ICAvKiB0ZWFtIHNwZWNpZmljIGxvY2sgKi8KKworLyoKKyAqIE1hc3RlciBvbmx5CisgKi8KKyAgICBLTVBfQUxJR05fQ0FDSEUgaW50ICAgICAgdF9tYXN0ZXJfdGlkOyAgIC8qIHRpZCBvZiBtYXN0ZXIgaW4gcGFyZW50IHRlYW0gKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgdF9tYXN0ZXJfdGhpc19jb25zOyAvKiAidGhpc19jb25zdHJ1Y3QiIHNpbmdsZSBjb3VudGVyIG9mIG1hc3RlciBpbiBwYXJlbnQgdGVhbSAqLworICAgIGludCAgICAgICAgICAgICAgICAgICAgICB0X21hc3Rlcl9sYXN0X2NvbnM7IC8qICJsYXN0X2NvbnN0cnVjdCIgc2luZ2xlIGNvdW50ZXIgb2YgbWFzdGVyIGluIHBhcmVudCB0ZWFtICovCisgICAgaWRlbnRfdCAgICAgICAgICAgICAgICAgKnRfaWRlbnQ7ICAgICAgICAvKiBpZiB2b2xhdGlsZSwgaGF2ZSB0byBjaGFuZ2UgdG9vIG11Y2ggb3RoZXIgY3J1ZCB0byB2b2xhdGlsZSB0b28gKi8KKyAgICBrbXBfdGVhbV9wICAgICAgICAgICAgICAqdF9wYXJlbnQ7ICAgICAgIC8qIHBhcmVudCB0ZWFtICovCisgICAga21wX3RlYW1fcCAgICAgICAgICAgICAgKnRfbmV4dF9wb29sOyAgICAvKiBuZXh0IGZyZWUgdGVhbSBpbiB0aGUgdGVhbSBwb29sICovCisgICAga21wX2Rpc3BfdCAgICAgICAgICAgICAgKnRfZGlzcGF0Y2g7ICAgICAvKiB0aHJlYWQncyBkaXNwYXRjaCBkYXRhICovCisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICBrbXBfdGFza190ZWFtX3QgICAgICAgICAqdF90YXNrX3RlYW07ICAgIC8qIFRhc2sgdGVhbSBzdHJ1Y3QgKi8KKyNlbmRpZiAvKiBPTVBfMzBfRU5BQkxFRCAqLworI2lmIE9NUF80MF9FTkFCTEVECisgICAga21wX3Byb2NfYmluZF90ICAgICAgICAgIHRfcHJvY19iaW5kOyAgICAvKiBiaW5kIHR5cGUgZm9yIHBhciByZWdpb24gKi8KKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorCisvKgorICogTWFzdGVyIHdyaXRlLCB3b3JrZXJzIHJlYWQKKyAqLworICAgIEtNUF9BTElHTl9DQUNIRQorICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAqKnRfYXJndjsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgdF9hcmdjOworI2lmIChLTVBfUEVSRl9WMTA2ID09IEtNUF9PTikKKyAgICAvKiBzd2FwIGNhY2hlIGxpbmVzICBmb3IgdF9ucHJvYyBhbmQgdF9tYXhfYXJnYyAqLworICAgIGludCAgICAgICAgICAgICAgICAgICAgICB0X25wcm9jOyAgICAgICAgLyogbnVtYmVyIG9mIHRocmVhZHMgaW4gdGVhbSAqLworI2Vsc2UKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgdF9tYXhfYXJnYzsKKyNlbmRpZgorICAgIG1pY3JvdGFza190ICAgICAgICAgICAgICB0X3BrZm47CisgICAgbGF1bmNoX3QgICAgICAgICAgICAgICAgIHRfaW52b2tlOyAgICAgICAvKiBwcm9jZWR1cmUgdG8gbGF1bmNoIHRoZSBtaWNyb3Rhc2sgKi8KKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyAgICBrbXBfaW50OCAgICAgICAgICAgICAgICAgdF9mcF9jb250cm9sX3NhdmVkOworICAgIGttcF9pbnQ4ICAgICAgICAgICAgICAgICB0X3BhZDJiOworICAgIGttcF9pbnQxNiAgICAgICAgICAgICAgICB0X3g4N19mcHVfY29udHJvbF93b3JkOyAvKiBGUCBjb250cm9sIHJlZ3MgKi8KKyAgICBrbXBfdWludDMyICAgICAgICAgICAgICAgdF9teGNzcjsKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKyNpZiAoS01QX1BFUkZfVjEwNiA9PSBLTVBfT04pCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgKnRfaW5saW5lX2FyZ3ZbIEtNUF9JTkxJTkVfQVJHVl9FTlRSSUVTIF07CisjZW5kaWYKKworI2lmIChLTVBfUEVSRl9WMTkgPT0gS01QX09OKQorICAgIEtNUF9BTElHTl9DQUNIRQorI2VuZGlmCisgICAga21wX2luZm9fdCAgICAgICAgICAgICAqKnRfdGhyZWFkczsKKyNpZiAoS01QX1BFUkZfVjEwNiA9PSBLTVBfT04pCisgICAgLyogc3dhcCBjYWNoZSBsaW5lcyAgZm9yIHRfbnByb2MgYW5kIHRfbWF4X2FyZ2MgKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgdF9tYXhfYXJnYzsKKyNlbHNlCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgIHRfbnByb2M7ICAgICAgICAvKiBudW1iZXIgb2YgdGhyZWFkcyBpbiB0ZWFtICovCisjZW5kaWYKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgdF9tYXhfbnByb2M7ICAgIC8qIG1heGltdW0gdGhyZWFkcyB0aGlzIHRlYW0gY2FuIGhhbmRsZSAodGhpcyBpcyBkeW5hbWljbHkgZXhwYW5kYWJsZSkgKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgdF9zZXJpYWxpemVkOyAgIC8qIGxldmVscyBkZWVwIG9mIHNlcmlhbGl6ZWQgdGVhbXMgKi8KKyAgICBkaXNwYXRjaF9zaGFyZWRfaW5mb190ICAqdF9kaXNwX2J1ZmZlcjsgIC8qIGJ1ZmZlcnMgZm9yIGRpc3BhdGNoIHN5c3RlbSAqLworICAgIGludCAgICAgICAgICAgICAgICAgICAgICB0X2lkOyAgICAgICAgICAgLy8gdGVhbSdzIGlkLCBhc3NpZ25lZCBieSBkZWJ1Z2dlci4KKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgIGludCAgICAgICAgICAgICAgICAgICAgICB0X2xldmVsOyAgICAgICAgLyogbmVzdGVkIHBhcmFsbGVsIGxldmVsICovCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgIHRfYWN0aXZlX2xldmVsOyAvKiBuZXN0ZWQgYWN0aXZlIHBhcmFsbGVsIGxldmVsICovCisgICAga21wX3Jfc2NoZWRfdCAgICAgICAgICAgIHRfc2NoZWQ7ICAgICAgICAvKiBydW4tdGltZSBzY2hlZHVsZSBmb3IgdGhlIHRlYW0gKi8KKyNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorI2lmIE9NUF80MF9FTkFCTEVEICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgdF9maXJzdF9wbGFjZTsgIC8qIGZpcnN0ICYgbGFzdCBwbGFjZSBpbiAgICAgICovCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgIHRfbGFzdF9wbGFjZTsgICAvKiBwYXJlbnQgdGhyZWFkJ3MgcGFydGl0aW9uLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVzdG9yZSB0aGVzZSB2YWx1ZXMgdG8gICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1hc3RlciBhZnRlciBwYXIgcmVnaW9uLiAgICovCisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQgJiYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorI2lmIEtNUF9NSUMKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgdF9zaXplX2NoYW5nZWQ7IC8qIHRlYW0gc2l6ZSB3YXMgY2hhbmdlZD86IDAgLSBubywgMSAtIHllcywgLTEgLSBjaGFuZ2VkIHZpYSBvbXBfc2V0X251bV90aHJlYWRzKCkgY2FsbCAqLworI2VuZGlmCisKKy8qCisgKiBSZWFkL3dyaXRlIGJ5IHdvcmtlcnMgYXMgd2VsbAorICovCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorICAgIC8vIFVzaW5nIENBQ0hFX0xJTkU9NjQgcmVkdWNlcyBtZW1vcnkgZm9vdHByaW50LAorICAgIC8vICAgIGJ1dCBjYXVzZXMgYSBiaWcgcGVyZiByZWdyZXNzaW9uIG9mIGVwY2MgJ3BhcmFsbGVsJyBhbmQgJ2JhcnJpZXInIG9uIGZ4ZTI1NmxpbjAxLgorICAgIC8vIFRoaXMgZXh0cmEgcGFkZGluZyBzZXJ2ZXMgdG8gZml4IHRoZSBwZXJmb3JtYW5jZSBvZiBlcGNjICdwYXJhbGxlbCcgYW5kICdiYXJyaWVyJyB3aGVuIENBQ0hFX0xJTkU9NjQuCisgICAgLy8gVE9ETzogaW52ZXN0aWdhdGUgbW9yZSBhbmQgZ2V0IHJpZCBpZiB0aGlzIHBhZGRpbmcuCisgICAgY2hhciBkdW1teV9wYWRkaW5nWzEwMjRdOworI2VuZGlmCisgICAgS01QX0FMSUdOX0NBQ0hFCisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICBrbXBfdGFza2RhdGFfdCAgICAgICAgICAqdF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhOyAgLy8gVGFza2RhdGEgZm9yIHRoZSB0aHJlYWQncyBpbXBsaWNpdCB0YXNrCisjZWxzZQorICAgIC8vIEludGVybmFsIGNvbnRyb2wgdmFyaWFibGVzIGZvciBjdXJyZW50IHRocmVhZCB0ZWFtCisgICAgLy8gVE9ETyAgQ29udmVydCB0aGVzZSBmaWVsZHMgdG8gYW4gYXJyYXkgb2YgIGttcF9pbnRlcm5hbF9jb250cm9sX3Qgd2hpY2ggc2ltcGxpZmllcyBwYXJhbWV0ZXIgcGFzc2luZworICAgIC8vICAgICAgIGFuZCBhbHNvIHByZXZlbnRzIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uIGR1ZSB0byBmYWxzZSBzaGFyaW5nIHdoZW4gYWxsIHRocmVhZHMgc2V0IGEgY29udHJvbCB2YXIKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAqdF9zZXRfbnByb2M7ICAgIC8qIGludGVybmFsIGNvbnRyb2wgZm9yICMgb2YgdGhyZWFkcyBmb3IgbmV4dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYWxsZWwgcmVnaW9uIChwZXIgdGhyZWFkKSAqLworICAgIGludCAgICAgICAgICAgICAgICAgICAgICp0X3NldF9uZXN0ZWQ7ICAgLyogaW50ZXJuYWwgY29udHJvbCBmb3IgbmVzdGVkIHBhcmFsbGVsaXNtIChwZXIgdGhyZWFkKSAqLworICAgIGludCAgICAgICAgICAgICAgICAgICAgICp0X3NldF9keW5hbWljOyAgLyogaW50ZXJuYWwgY29udHJvbCBmb3IgZHluYW1pYyBhZGp1c3RtZW50IG9mIHRocmVhZHMgKHBlciB0aHJlYWQpICovCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgKnRfc2V0X2Jsb2NrdGltZTsgLyogaW50ZXJuYWwgY29udHJvbCBmb3IgYmxvY2t0aW1lICovCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgKnRfc2V0X2J0X2ludGVydmFsczsgLyogaW50ZXJuYWwgY29udHJvbCBmb3IgYmxvY2t0aW1lIGludGVydmFscyAqLworICAgIGludCAgICAgICAgICAgICAgICAgICAgICp0X3NldF9idF9zZXQ7ICAgLyogaW50ZXJuYWwgY29udHJvbCBmb3Igd2hldGhlciBibG9ja3RpbWUgaXMgZXhwbGljaXRseSBzZXQgKi8KKyNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorCisgICAga21wX2ludGVybmFsX2NvbnRyb2xfdCAgKnRfY29udHJvbF9zdGFja190b3A7ICAvKiBpbnRlcm5hbCBjb250cm9sIHN0YWNrIGZvciBhZGRpdGlvbmFsIG5lc3RlZCB0ZWFtcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBTRVJJQUxJWkVEIHRlYW1zIG5lc3RlZCAyIG9yIG1vcmUgbGV2ZWxzIGRlZXAgKi8KKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgICB0X2NhbmNlbF9yZXF1ZXN0OyAvKiB0eXBlZCBmbGFnIHRvIHN0b3JlIHJlcXVlc3Qgc3RhdGUgb2YgY2FuY2VsbGF0aW9uICovCisjZW5kaWYKKworICAgIGludCAgICAgICAgICAgICAgICAgICAgICB0X21hc3Rlcl9hY3RpdmU7Lyogc2F2ZSBvbiBmb3JrLCByZXN0b3JlIG9uIGpvaW4gKi8KKyAgICBrbXBfdGFza3FfdCAgICAgICAgICAgICAgdF90YXNrcTsgICAgICAgIC8qIHRoaXMgdGVhbSdzIHRhc2sgcXVldWUgKi8KKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAqdF9jb3B5cHJpdl9kYXRhOyAgLyogdGVhbSBzcGVjaWZpYyBwb2ludGVyIHRvIGNvcHlwcml2YXRlIGRhdGEgYXJyYXkgKi8KKyAgICBrbXBfdWludDMyICAgICAgICAgICAgICAgdF9jb3B5aW5fY291bnRlcjsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgKnRfc3RhY2tfaWQ7ICAgICAgIC8qIHRlYW0gc3BlY2lmaWMgc3RhY2sgc3RpdGNoaW5nIGlkIChmb3IgaXR0bm90aWZ5KSAqLworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KK30ga21wX2Jhc2VfdGVhbV90OworCit1bmlvbiBLTVBfQUxJR05fQ0FDSEUga21wX3RlYW0geworICAgIGttcF9iYXNlX3RlYW1fdCAgICAgdDsKKyAgICBkb3VibGUgICAgICAgICAgICAgIHRfYWxpZ247ICAgICAgIC8qIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudCAqLworICAgIGNoYXIgICAgICAgICAgICAgICAgdF9wYWRbIEtNUF9QQUQoa21wX2Jhc2VfdGVhbV90LCBDQUNIRV9MSU5FKSBdOworfTsKKworCit0eXBlZGVmIHVuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfdGltZV9nbG9iYWwgeworICAgIGRvdWJsZSAgICAgICAgICAgICAgZHRfYWxpZ247ICAgICAgICAvKiB1c2Ugd29yc3QgY2FzZSBhbGlnbm1lbnQgKi8KKyAgICBjaGFyICAgICAgICAgICAgICAgIGR0X3BhZFsgS01QX1BBRChrbXBfYmFzZV9kYXRhX3QsIENBQ0hFX0xJTkUpIF07CisgICAga21wX2Jhc2VfZGF0YV90ICAgICBkdDsKK30ga21wX3RpbWVfZ2xvYmFsX3Q7CisKK3R5cGVkZWYgc3RydWN0IGttcF9iYXNlX2dsb2JhbCB7CisgICAgLyogY2FjaGUtYWxpZ25lZCAqLworICAgIGttcF90aW1lX2dsb2JhbF90ICAgZ190aW1lOworCisgICAgLyogbm9uIGNhY2hlLWFsaWduZWQgKi8KKyAgICB2b2xhdGlsZSBpbnQgICAgICAgIGdfYWJvcnQ7CisgICAgdm9sYXRpbGUgaW50ICAgICAgICBnX2RvbmU7CisKKyAgICBpbnQgICAgICAgICAgICAgICAgIGdfZHluYW1pYzsKKyAgICBlbnVtIGR5bmFtaWNfbW9kZSAgIGdfZHluYW1pY19tb2RlOworCit9IGttcF9iYXNlX2dsb2JhbF90OworCit0eXBlZGVmIHVuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfZ2xvYmFsIHsKKyAgICBrbXBfYmFzZV9nbG9iYWxfdCAgIGc7CisgICAgZG91YmxlICAgICAgICAgICAgICBnX2FsaWduOyAgICAgICAgLyogdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50ICovCisgICAgY2hhciAgICAgICAgICAgICAgICBnX3BhZFsgS01QX1BBRChrbXBfYmFzZV9nbG9iYWxfdCwgQ0FDSEVfTElORSkgXTsKK30ga21wX2dsb2JhbF90OworCisKK3R5cGVkZWYgc3RydWN0IGttcF9iYXNlX3Jvb3QgeworICAgIC8vIFRPRE86IEdFSCAtIGNvbWJpbmUgcl9hY3RpdmUgd2l0aCByX2luX3BhcmFsbGVsIHRoZW4gcl9hY3RpdmUgPT0gKHJfaW5fcGFyYWxsZWw+PSAwKQorICAgIC8vIFRPRE86IEdFSCAtIHRoZW4gcmVwbGFjZSByX2FjdGl2ZSB3aXRoIHRfYWN0aXZlX2xldmVscyBpZiB3ZSBjYW4gdG8gcmVkdWNlIHRoZSBzeW5jaAorICAgIC8vICAgICAgICAgICAgIG92ZXJoZWFkIG9yIGtlZXBpbmcgcl9hY3RpdmUKKworICAgIHZvbGF0aWxlIGludCAgICAgICAgcl9hY3RpdmU7ICAgICAgIC8qIFRSVUUgaWYgc29tZSByZWdpb24gaW4gYSBuZXN0IGhhcyA+IDEgdGhyZWFkICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR0VIOiBUaGlzIGlzIG1pc25hbWVkLCBzaG91bGQgYmUgcl9pbl9wYXJhbGxlbAorICAgIHZvbGF0aWxlIGludCAgICAgICAgcl9uZXN0ZWQ7ICAgICAgIC8vIFRPRE86IEdFSCAtIFRoaXMgaXMgdW51c2VkLCBqdXN0IHJlbW92ZSBpdCBlbnRpcmVseS4KKyAgICBpbnQgICAgICAgICAgICAgICAgIHJfaW5fcGFyYWxsZWw7ICAvKiBrZWVwcyBhIGNvdW50IG9mIGFjdGl2ZSBwYXJhbGxlbCByZWdpb25zIHBlciByb290ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR0VIOiBUaGlzIGlzIG1pc25hbWVkLCBzaG91bGQgYmUgcl9hY3RpdmVfbGV2ZWxzCisgICAga21wX3RlYW1fdCAgICAgICAgICpyX3Jvb3RfdGVhbTsKKyAgICBrbXBfdGVhbV90ICAgICAgICAgKnJfaG90X3RlYW07CisgICAga21wX2luZm9fdCAgICAgICAgICpyX3ViZXJfdGhyZWFkOworICAgIGttcF9sb2NrX3QgICAgICAgICAgcl9iZWdpbl9sb2NrOworICAgIHZvbGF0aWxlIGludCAgICAgICAgcl9iZWdpbjsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHJfYmxvY2t0aW1lOyAvKiBibG9ja3RpbWUgZm9yIHRoaXMgcm9vdCBhbmQgZGVzY2VuZGFudHMgKi8KK30ga21wX2Jhc2Vfcm9vdF90OworCit0eXBlZGVmIHVuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfcm9vdCB7CisgICAga21wX2Jhc2Vfcm9vdF90ICAgICByOworICAgIGRvdWJsZSAgICAgICAgICAgICAgcl9hbGlnbjsgICAgICAgIC8qIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudCAqLworICAgIGNoYXIgICAgICAgICAgICAgICAgcl9wYWRbIEtNUF9QQUQoa21wX2Jhc2Vfcm9vdF90LCBDQUNIRV9MSU5FKSBdOworfSBrbXBfcm9vdF90OworCitzdHJ1Y3QgZm9ydHJhbl9pbnhfaW5mbyB7CisgICAga21wX2ludDMyICAgZGF0YTsKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitleHRlcm4gaW50ICAgICAgX19rbXBfc2V0dGluZ3M7CitleHRlcm4gaW50ICAgICAgX19rbXBfZHVwbGljYXRlX2xpYnJhcnlfb2s7CisjaWYgVVNFX0lUVF9CVUlMRAorZXh0ZXJuIGludCAgICAgIF9fa21wX2Zvcmtqb2luX2ZyYW1lczsKK2V4dGVybiBpbnQgICAgICBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZTsKKyNlbmRpZgorZXh0ZXJuIFBBQ0tFRF9SRURVQ1RJT05fTUVUSE9EX1QgX19rbXBfZm9yY2VfcmVkdWN0aW9uX21ldGhvZDsKK2V4dGVybiBpbnQgICAgICBfX2ttcF9kZXRlcm1fcmVkOworCisjaWZkZWYgS01QX0RFQlVHCitleHRlcm4gaW50ICAgICAga21wX2FfZGVidWc7CitleHRlcm4gaW50ICAgICAga21wX2JfZGVidWc7CitleHRlcm4gaW50ICAgICAga21wX2NfZGVidWc7CitleHRlcm4gaW50ICAgICAga21wX2RfZGVidWc7CitleHRlcm4gaW50ICAgICAga21wX2VfZGVidWc7CitleHRlcm4gaW50ICAgICAga21wX2ZfZGVidWc7CisjZW5kaWYgLyogS01QX0RFQlVHICovCisKKy8qIEZvciBkZWJ1ZyBpbmZvcm1hdGlvbiBsb2dnaW5nIHVzaW5nIHJvdGF0aW5nIGJ1ZmZlciAqLworI2RlZmluZSBLTVBfREVCVUdfQlVGX0xJTkVTX0lOSVQgICAgICAgIDUxMgorI2RlZmluZSBLTVBfREVCVUdfQlVGX0xJTkVTX01JTiAgICAgICAgIDEKKworI2RlZmluZSBLTVBfREVCVUdfQlVGX0NIQVJTX0lOSVQgICAgICAgIDEyOAorI2RlZmluZSBLTVBfREVCVUdfQlVGX0NIQVJTX01JTiAgICAgICAgIDIKKworZXh0ZXJuIGludCAgICAgX19rbXBfZGVidWdfYnVmOyAgICAgICAgICAgIC8qIFRSVUUgbWVhbnMgdXNlIGJ1ZmZlciwgRkFMU0UgbWVhbnMgcHJpbnQgdG8gc3RkZXJyICovCitleHRlcm4gaW50ICAgICBfX2ttcF9kZWJ1Z19idWZfbGluZXM7ICAgICAgLyogSG93IG1hbnkgbGluZXMgb2YgZGVidWcgc3RvcmVkIGluIGJ1ZmZlciAqLworZXh0ZXJuIGludCAgICAgX19rbXBfZGVidWdfYnVmX2NoYXJzOyAgICAgIC8qIEhvdyBtYW55IGNoYXJhY3RlcnMgYWxsb3dlZCBwZXIgbGluZSBpbiBidWZmZXIgKi8KK2V4dGVybiBpbnQgICAgIF9fa21wX2RlYnVnX2J1Zl9hdG9taWM7ICAgICAvKiBUUlVFIG1lYW5zIHVzZSBhdG9taWMgdXBkYXRlIG9mIGJ1ZmZlciBlbnRyeSBwb2ludGVyICovCisKK2V4dGVybiBjaGFyICAgKl9fa21wX2RlYnVnX2J1ZmZlcjsgICAgICAgICAvKiBEZWJ1ZyBidWZmZXIgaXRzZWxmICovCitleHRlcm4gaW50ICAgICBfX2ttcF9kZWJ1Z19jb3VudDsgICAgICAgICAgLyogQ291bnRlciBmb3IgbnVtYmVyIG9mIGxpbmVzIHByaW50ZWQgaW4gYnVmZmVyIHNvIGZhciAqLworZXh0ZXJuIGludCAgICAgX19rbXBfZGVidWdfYnVmX3dhcm5fY2hhcnM7IC8qIEtlZXAgdHJhY2sgb2YgY2hhciBpbmNyZWFzZSByZWNvbW1lbmRlZCBpbiB3YXJuaW5ncyAqLworLyogZW5kIHJvdGF0aW5nIGRlYnVnIGJ1ZmZlciAqLworCitleHRlcm4gaW50ICAgICAgX19rbXBfcGFyX3JhbmdlOyAgICAgICAgICAgLyogKzEgPT4gb25seSBnbyBwYXIgZm9yIGNvbnN0cnVjdHMgaW4gcmFuZ2UgKi8KKworI2RlZmluZSBLTVBfUEFSX1JBTkdFX1JPVVRJTkVfTEVOICAgICAgIDEwMjQKK2V4dGVybiBjaGFyICAgICBfX2ttcF9wYXJfcmFuZ2Vfcm91dGluZVtLTVBfUEFSX1JBTkdFX1JPVVRJTkVfTEVOXTsKKyNkZWZpbmUgS01QX1BBUl9SQU5HRV9GSUxFTkFNRV9MRU4gICAgICAxMDI0CitleHRlcm4gY2hhciAgICAgX19rbXBfcGFyX3JhbmdlX2ZpbGVuYW1lW0tNUF9QQVJfUkFOR0VfRklMRU5BTUVfTEVOXTsKK2V4dGVybiBpbnQgICAgICBfX2ttcF9wYXJfcmFuZ2VfbGI7CitleHRlcm4gaW50ICAgICAgX19rbXBfcGFyX3JhbmdlX3ViOworCisvKiBGb3IgcHJpbnRpbmcgb3V0IGR5bmFtaWMgc3RvcmFnZSBtYXAgZm9yIHRocmVhZHMgYW5kIHRlYW1zICovCitleHRlcm4gaW50ICAgICAgX19rbXBfc3RvcmFnZV9tYXA7ICAgICAgICAgLyogVHJ1ZSBtZWFucyBwcmludCBzdG9yYWdlIG1hcCBmb3IgdGhyZWFkcyBhbmQgdGVhbXMgKi8KK2V4dGVybiBpbnQgICAgICBfX2ttcF9zdG9yYWdlX21hcF92ZXJib3NlOyAvKiBUcnVlIG1lYW5zIHN0b3JhZ2UgbWFwIGluY2x1ZGVzIHBsYWNlbWVudCBpbmZvICovCitleHRlcm4gaW50ICAgICAgX19rbXBfc3RvcmFnZV9tYXBfdmVyYm9zZV9zcGVjaWZpZWQ7CisKK2V4dGVybiBrbXBfY3B1aW5mb190ICAgIF9fa21wX2NwdWluZm87CisKK2V4dGVybiB2b2xhdGlsZSBpbnQgX19rbXBfaW5pdF9zZXJpYWw7CitleHRlcm4gdm9sYXRpbGUgaW50IF9fa21wX2luaXRfZ3RpZDsKK2V4dGVybiB2b2xhdGlsZSBpbnQgX19rbXBfaW5pdF9jb21tb247CitleHRlcm4gdm9sYXRpbGUgaW50IF9fa21wX2luaXRfbWlkZGxlOworZXh0ZXJuIHZvbGF0aWxlIGludCBfX2ttcF9pbml0X3BhcmFsbGVsOworZXh0ZXJuIHZvbGF0aWxlIGludCBfX2ttcF9pbml0X21vbml0b3I7CitleHRlcm4gdm9sYXRpbGUgaW50IF9fa21wX2luaXRfdXNlcl9sb2NrczsKK2V4dGVybiBpbnQgX19rbXBfaW5pdF9jb3VudGVyOworZXh0ZXJuIGludCBfX2ttcF9yb290X2NvdW50ZXI7CitleHRlcm4gaW50IF9fa21wX3ZlcnNpb247CisKKy8qIGxpc3Qgb2YgYWRkcmVzcyBvZiBhbGxvY2F0ZWQgY2FjaGVzIGZvciBjb21tb25zICovCitleHRlcm4ga21wX2NhY2hlZF9hZGRyX3QgKl9fa21wX3RocmVhZHByaXZfY2FjaGVfbGlzdDsKKworLyogQmFycmllciBhbGdvcml0aG0gdHlwZXMgYW5kIG9wdGlvbnMgKi8KK2V4dGVybiBrbXBfdWludDMyICAgIF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JiX2RmbHQ7CitleHRlcm4ga21wX3VpbnQzMiAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYmJfZGZsdDsKK2V4dGVybiBrbXBfYmFyX3BhdF9lIF9fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdF9kZmx0OworZXh0ZXJuIGttcF9iYXJfcGF0X2UgX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdF9kZmx0OworZXh0ZXJuIGttcF91aW50MzIgICAgX19rbXBfYmFycmllcl9nYXRoZXJfYnJhbmNoX2JpdHMgIFsgYnNfbGFzdF9iYXJyaWVyIF07CitleHRlcm4ga21wX3VpbnQzMiAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHMgWyBic19sYXN0X2JhcnJpZXIgXTsKK2V4dGVybiBrbXBfYmFyX3BhdF9lIF9fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdHRlcm4gICAgICBbIGJzX2xhc3RfYmFycmllciBdOworZXh0ZXJuIGttcF9iYXJfcGF0X2UgX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdHRlcm4gICAgIFsgYnNfbGFzdF9iYXJyaWVyIF07CitleHRlcm4gY2hhciBjb25zdCAgICpfX2ttcF9iYXJyaWVyX2JyYW5jaF9iaXRfZW52X25hbWUgWyBic19sYXN0X2JhcnJpZXIgXTsKK2V4dGVybiBjaGFyIGNvbnN0ICAgKl9fa21wX2JhcnJpZXJfcGF0dGVybl9lbnZfbmFtZSAgICBbIGJzX2xhc3RfYmFycmllciBdOworZXh0ZXJuIGNoYXIgY29uc3QgICAqX19rbXBfYmFycmllcl90eXBlX25hbWUgICAgICAgICAgIFsgYnNfbGFzdF9iYXJyaWVyIF07CitleHRlcm4gY2hhciBjb25zdCAgICpfX2ttcF9iYXJyaWVyX3BhdHRlcm5fbmFtZSAgICAgICAgWyBicF9sYXN0X2JhciBdOworCisvKiBHbG9iYWwgTG9ja3MgKi8KK2V4dGVybiBrbXBfYm9vdHN0cmFwX2xvY2tfdCBfX2ttcF9pbml0el9sb2NrOyAgICAgLyogY29udHJvbCBpbml0aWFsaXphdGlvbiAqLworZXh0ZXJuIGttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2Zvcmtqb2luX2xvY2s7ICAvKiBjb250cm9sIGZvcmsvam9pbiBhY2Nlc3MgYW5kIGxvYWQgY2FsY3VsYXRpb24gaWYgcm1sIGlzIHVzZWQqLworZXh0ZXJuIGttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2V4aXRfbG9jazsgICAgICAvKiBleGl0KCkgaXMgbm90IGFsd2F5cyB0aHJlYWQtc2FmZSAqLworZXh0ZXJuIGttcF9ib290c3RyYXBfbG9ja190IF9fa21wX21vbml0b3JfbG9jazsgICAvKiBjb250cm9sIG1vbml0b3IgdGhyZWFkIGNyZWF0aW9uICovCitleHRlcm4ga21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfdHBfY2FjaGVkX2xvY2s7IC8qIHVzZWQgZm9yIHRoZSBoYWNrIHRvIGFsbG93IHRocmVhZHByaXZhdGUgY2FjaGUgYW5kIF9fa21wX3RocmVhZHMgZXhwYW5zaW9uIHRvIGNvLWV4aXN0ICovCisKK2V4dGVybiBrbXBfbG9ja190IF9fa21wX2dsb2JhbF9sb2NrOyAgICAvKiBjb250cm9sIE9TL2dsb2JhbCBhY2Nlc3MgICovCitleHRlcm4ga21wX3F1ZXVpbmdfbG9ja190IF9fa21wX2Rpc3BhdGNoX2xvY2s7ICAvKiBjb250cm9sIGRpc3BhdGNoIGFjY2VzcyAgKi8KK2V4dGVybiBrbXBfbG9ja190IF9fa21wX2RlYnVnX2xvY2s7ICAgICAvKiBjb250cm9sIEkvTyBhY2Nlc3MgZm9yIEtNUF9ERUJVRyAqLworCisvKiB1c2VkIGZvciB5aWVsZGluZyBzcGluLXdhaXRzICovCitleHRlcm4gdW5zaWduZWQgaW50IF9fa21wX2luaXRfd2FpdDsgICAgLyogaW5pdGlhbCBudW1iZXIgb2Ygc3Bpbi10ZXN0cyAgICovCitleHRlcm4gdW5zaWduZWQgaW50IF9fa21wX25leHRfd2FpdDsgICAgLyogc3VzZXF1ZW50IG51bWJlciBvZiBzcGluLXRlc3RzICovCisKK2V4dGVybiBlbnVtIGxpYnJhcnlfdHlwZSBfX2ttcF9saWJyYXJ5OworCitleHRlcm4gZW51bSBzY2hlZF90eXBlICBfX2ttcF9zY2hlZDsgICAgLyogZGVmYXVsdCBydW50aW1lIHNjaGVkdWxpbmcgKi8KK2V4dGVybiBlbnVtIHNjaGVkX3R5cGUgIF9fa21wX3N0YXRpYzsgICAvKiBkZWZhdWx0IHN0YXRpYyBzY2hlZHVsaW5nIG1ldGhvZCAqLworZXh0ZXJuIGVudW0gc2NoZWRfdHlwZSAgX19rbXBfZ3VpZGVkOyAgIC8qIGRlZmF1bHQgZ3VpZGVkIHNjaGVkdWxpbmcgbWV0aG9kICovCisjaWYgT01QXzMwX0VOQUJMRUQKK2V4dGVybiBlbnVtIHNjaGVkX3R5cGUgIF9fa21wX2F1dG87ICAgICAvKiBkZWZhdWx0IGF1dG8gc2NoZWR1bGluZyBtZXRob2QgKi8KKyNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorZXh0ZXJuIGludCAgICAgICAgICAgICAgX19rbXBfY2h1bms7ICAgIC8qIGRlZmF1bHQgcnVudGltZSBjaHVuayBzaXplICovCisKK2V4dGVybiBzaXplX3QgICAgIF9fa21wX3N0a3NpemU7ICAgICAgICAvKiBzdGFjayBzaXplIHBlciB0aHJlYWQgICAgICAgICAqLworZXh0ZXJuIHNpemVfdCAgICAgX19rbXBfbW9uaXRvcl9zdGtzaXplOy8qIHN0YWNrIHNpemUgZm9yIG1vbml0b3IgdGhyZWFkICovCitleHRlcm4gc2l6ZV90ICAgICBfX2ttcF9zdGtvZmZzZXQ7ICAgICAgLyogc3RhY2sgb2Zmc2V0IHBlciB0aHJlYWQgICAgICAgKi8KKworZXh0ZXJuIHNpemVfdCAgICAgX19rbXBfbWFsbG9jX3Bvb2xfaW5jcjsgLyogaW5jcmVtZW50YWwgc2l6ZSBvZiBwb29sIGZvciBrbXBfbWFsbG9jKCkgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2Vudl9jaHVuazsgICAgICAvKiB3YXMgS01QX0NIVU5LIHNwZWNpZmllZD8gICAgICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9lbnZfc3Rrc2l6ZTsgICAgLyogd2FzIEtNUF9TVEFDS1NJWkUgc3BlY2lmaWVkPyAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfZW52X29tcF9zdGtzaXplOy8qIHdhcyBPTVBfU1RBQ0tTSVpFIHNwZWNpZmllZD8gKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2Vudl9hbGxfdGhyZWFkczsgICAgLyogd2FzIEtNUF9BTExfVEhSRUFEUyBvciBLTVBfTUFYX1RIUkVBRFMgc3BlY2lmaWVkPyAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfZW52X29tcF9hbGxfdGhyZWFkczsvKiB3YXMgT01QX1RIUkVBRF9MSU1JVCBzcGVjaWZpZWQ/ICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9lbnZfYmxvY2t0aW1lOyAgLyogd2FzIEtNUF9CTE9DS1RJTUUgc3BlY2lmaWVkPyAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfZW52X2NoZWNrczsgICAgIC8qIHdhcyBLTVBfQ0hFQ0tTIHNwZWNpZmllZD8gICAgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjazsgICAgIC8qIHdhcyBLTVBfQ09OU0lTVEVOQ1lfQ0hFQ0sgc3BlY2lmaWVkPyAgICAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfZ2VuZXJhdGVfd2FybmluZ3M7IC8qIHNob3VsZCB3ZSBpc3N1ZSB3YXJuaW5ncz8gKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX3Jlc2VydmVfd2FybjsgICAvKiBoYXZlIHdlIGlzc3VlZCByZXNlcnZlX3RocmVhZHMgd2FybmluZz8gKi8KKworI2lmZGVmIERFQlVHX1NVU1BFTkQKK2V4dGVybiBpbnQgICAgICAgIF9fa21wX3N1c3BlbmRfY291bnQ7ICAvKiBjb3VudCBpbnNpZGUgX19rbXBfc3VzcGVuZCgpICovCisjZW5kaWYKKworZXh0ZXJuIGttcF91aW50MzIgX19rbXBfeWllbGRfaW5pdDsKK2V4dGVybiBrbXBfdWludDMyIF9fa21wX3lpZWxkX25leHQ7CitleHRlcm4ga21wX3VpbnQzMiBfX2ttcF95aWVsZGluZ19vbjsKK2V4dGVybiBrbXBfdWludDMyIF9fa21wX3lpZWxkX2N5Y2xlOworZXh0ZXJuIGttcF9pbnQzMiAgX19rbXBfeWllbGRfb25fY291bnQ7CitleHRlcm4ga21wX2ludDMyICBfX2ttcF95aWVsZF9vZmZfY291bnQ7CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfYWxsVGhyZWFkc1NwZWNpZmllZDsKKworZXh0ZXJuIHNpemVfdCAgICAgX19rbXBfYWxpZ25fYWxsb2M7CisvKiBmb2xsb3dpbmcgZGF0YSBwcm90ZWN0ZWQgYnkgaW5pdGlhbGl6YXRpb24gcm91dGluZXMgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX3hwcm9jOyAgICAgICAgICAvKiBudW1iZXIgb2YgcHJvY2Vzc29ycyBpbiB0aGUgc3lzdGVtICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9hdmFpbF9wcm9jOyAgICAgIC8qIG51bWJlciBvZiBwcm9jZXNzb3JzIGF2YWlsYWJsZSB0byB0aGUgcHJvY2VzcyAqLworZXh0ZXJuIHNpemVfdCAgICAgX19rbXBfc3lzX21pbl9zdGtzaXplOyAvKiBzeXN0ZW0tZGVmaW5lZCBtaW5pbXVtIHN0YWNrIHNpemUgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX3N5c19tYXhfbnRoOyAgICAvKiBzeXN0ZW0taW1wb3NlZCBtYXhpbXVtIG51bWJlciBvZiB0aHJlYWRzICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9tYXhfbnRoOyAgICAgICAgLyogbWF4aW11bSB0b3RhbCBudW1iZXIgb2YgY29uY3VycmVudGx5LWV4aXN0aW5nIHRocmVhZHMgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX3RocmVhZHNfY2FwYWNpdHk7IC8qIGNhcGFjaXR5IG9mIHRoZSBhcnJheXMgX19rbXBfdGhyZWFkcyBhbmQgX19rbXBfcm9vdCAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfZGZsdF90ZWFtX250aDsgIC8qIGRlZmF1bHQgbnVtYmVyIG9mIHRocmVhZHMgaW4gYSBwYXJhbGxlbCByZWdpb24gYSBsYSBPTVBfTlVNX1RIUkVBRFMgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2RmbHRfdGVhbV9udGhfdWI7IC8qIHVwcGVyIGJvdW5kIG9uICIiIGRldGVybWluZWQgYXQgc2VyaWFsIGluaXRpYWxpemF0aW9uICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF90cF9jYXBhY2l0eTsgICAgLyogY2FwYWNpdHkgb2YgX19rbXBfdGhyZWFkcyBpZiB0aHJlYWRwcml2YXRlIGlzIHVzZWQgKGZpeGVkKSAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfdHBfY2FjaGVkOyAgICAgIC8qIHdoZXRoZXIgdGhyZWFkcHJpdmF0ZSBjYWNoZSBoYXMgYmVlbiBjcmVhdGVkIChfX2ttcGNfdGhyZWFkcHJpdmF0ZV9jYWNoZWQoKSkgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2RmbHRfbmVzdGVkOyAgICAvKiBuZXN0ZWQgcGFyYWxsZWxpc20gZW5hYmxlZCBieSBkZWZhdWx0IGEgbGEgT01QX05FU1RFRCAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfZGZsdF9ibG9ja3RpbWU7IC8qIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUgYmxvY2tpbmcgKGVudiBzZXR0aW5nKSAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfbW9uaXRvcl93YWtldXBzOy8qIG51bWJlciBvZiB0aW1lcyBtb25pdG9yIHdha2VzIHVwIHBlciBzZWNvbmQgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2J0X2ludGVydmFsczsgICAvKiBudW1iZXIgb2YgbW9uaXRvciB0aW1lc3RhbXAgaW50ZXJ2YWxzIGJlZm9yZSBibG9ja2luZyAqLworI2lmZGVmIEtNUF9BREpVU1RfQkxPQ0tUSU1FCitleHRlcm4gaW50ICAgICAgICBfX2ttcF96ZXJvX2J0OyAgICAgICAgLyogd2hldGhlciBibG9ja3RpbWUgaGFzIGJlZW4gZm9yY2VkIHRvIHplcm8gKi8KKyNlbmRpZiAvKiBLTVBfQURKVVNUX0JMT0NLVElNRSAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfaHRfY2FwYWJsZTsgICAgIC8qIHdoZXRoZXIgQ1BVcyBzdXBwb3J0IEludGVsKFIpIEh5cGVyLVRocmVhZGluZyBUZWNobm9sb2d5ICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9odF9lbmFibGVkOyAgICAgLyogd2hldGhlciBJbnRlbChSKSBIeXBlci1UaHJlYWRpbmcgVGVjaG5vbG9neSBpcyBlbmFibGVkIGluIE9TICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9uY29yZXM7ICAgICAgICAgLyogTnVtYmVyIG9mIHBoeXNpY2FsIHByb2NzIGluIEhUIG1hY2hpbmUgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2h0X2xvZ19wZXJfcGh5OyAvKiBNYXhpbXVtIHBvc3NpYmxlIG51bWJlciBvZiBsb2dpY2FsIHByb2Nlc3NvcnMgcGVyIHBhY2thZ2UgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZTsvKiBOdW1iZXIgb2YgaHlwZXJ0aHJlYWRzIHBlciBjb3JlIGluIEhUIG1hY2hpbmUuICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9hYm9ydF9kZWxheTsgICAgLyogTnVtYmVyIG9mIG1pbGxpc2VjcyB0byBkZWxheSBvbiBhYm9ydCBmb3IgVlR1bmUgKi8KKworZXh0ZXJuIGludCAgICAgICAgX19rbXBfbmVlZF9yZWdpc3Rlcl9hdGZvcmtfc3BlY2lmaWVkOworZXh0ZXJuIGludCAgICAgICAgX19rbXBfbmVlZF9yZWdpc3Rlcl9hdGZvcms7LyogQXQgaW5pdGlhbGl6YXRpb24sIGNhbGwgcHRocmVhZF9hdGZvcmsgdG8gaW5zdGFsbCBmb3JrIGhhbmRsZXIgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2d0aWRfbW9kZTsgICAgICAvKiBNZXRob2Qgb2YgZ2V0dGluZyBndGlkLCB2YWx1ZXM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAtIG5vdCBzZXQsIHdpbGwgYmUgc2V0IGF0IHJ1bnRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC0gdXNpbmcgc3RhY2sgc2VhcmNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAtIGR5bmFtaWMgVExTIChwdGhyZWFkX2dldHNwZWNpZmljKExpbnV4KiBPUy9PUyBYKikgb3IgVGxzR2V0VmFsdWUoV2luZG93cyogT1MpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgLSBzdGF0aWMgVExTIChfX2RlY2xzcGVjKHRocmVhZCkgX19rbXBfZ3RpZCksIExpbnV4KiBPUyAuc28gb25seS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2FkanVzdF9ndGlkX21vZGU7IC8qIElmIHRydWUsIGFkanVzdCBtZXRob2QgYmFzZWQgb24gI3RocmVhZHMgKi8KKyNpZmRlZiBLTVBfVERBVEFfR1RJRAorI2lmIEtNUF9PU19XSU5ET1dTCitleHRlcm4gX19kZWNsc3BlYyh0aHJlYWQpIGludCBfX2ttcF9ndGlkOyAvKiBUaGlzIHRocmVhZCdzIGd0aWQsIGlmIF9fa21wX2d0aWRfbW9kZSA9PSAzICovCisjZWxzZQorZXh0ZXJuIF9fdGhyZWFkIGludCBfX2ttcF9ndGlkOworI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTIC0gd29ya2Fyb3VuZCBiZWNhdXNlIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIGNvbXBpbGVyIDIwMTEwMzE2IGRvZXNuJ3QgYWNjZXB0IF9fZGVjbHNwZWMgKi8KKyNlbmRpZgorZXh0ZXJuIGludCAgICAgICAgX19rbXBfdGxzX2d0aWRfbWluOyAgIC8qICN0aHJlYWRzIGJlbG93IHdoaWNoIHVzZSBzcCBzZWFyY2ggZm9yIGd0aWQgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2ZvcmVpZ25fdHA7ICAgICAvKiBJZiB0cnVlLCBzZXBhcmF0ZSBUUCB2YXIgZm9yIGVhY2ggZm9yZWlnbiB0aHJlYWQgKi8KKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CitleHRlcm4gaW50ICAgICAgICBfX2ttcF9pbmhlcml0X2ZwX2NvbnRyb2w7IC8qIGNvcHkgZnAgY3JlZyhzKSBwYXJlbnQtPndvcmtlcnMgYXQgZm9yayAqLworZXh0ZXJuIGttcF9pbnQxNiAgX19rbXBfaW5pdF94ODdfZnB1X2NvbnRyb2xfd29yZDsgLyogaW5pdCB0aHJlYWQncyBGUCBjb250cm9sIHJlZyAqLworZXh0ZXJuIGttcF91aW50MzIgX19rbXBfaW5pdF9teGNzcjsgICAgICAvKiBpbml0IHRocmVhZCdzIG14c2NyICovCisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisjaWYgT01QXzMwX0VOQUJMRUQKK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2RmbHRfbWF4X2FjdGl2ZV9sZXZlbHM7IC8qIG1heF9hY3RpdmVfbGV2ZWxzIGZvciBuZXN0ZWQgcGFyYWxsZWxpc20gZW5hYmxlZCBieSBkZWZhdWx0IGEgbGEgT01QX01BWF9BQ1RJVkVfTEVWRUxTICovCisjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKworIyBpZiBLTVBfT1NfTElOVVgKK2V4dGVybiBlbnVtIGNsb2NrX2Z1bmN0aW9uX3R5cGUgX19rbXBfY2xvY2tfZnVuY3Rpb247CitleHRlcm4gaW50IF9fa21wX2Nsb2NrX2Z1bmN0aW9uX3BhcmFtOworIyBlbmRpZiAvKiBLTVBfT1NfTElOVVggKi8KKworIyBpZmRlZiBVU0VfTE9BRF9CQUxBTkNFCitleHRlcm4gZG91YmxlICAgICAgX19rbXBfbG9hZF9iYWxhbmNlX2ludGVydmFsOyAgIC8qIEludGVydmFsIGZvciB0aGUgbG9hZCBiYWxhbmNlIGFsZ29yaXRobSAqLworIyBlbmRpZiAvKiBVU0VfTE9BRF9CQUxBTkNFICovCisKKy8vIE9wZW5NUCAzLjEgLSBOZXN0ZWQgbnVtIHRocmVhZHMgYXJyYXkKK3R5cGVkZWYgc3RydWN0IGttcF9uZXN0ZWRfbnRocmVhZHNfdCB7CisgICAgaW50ICogbnRoOworICAgIGludCAgIHNpemU7CisgICAgaW50ICAgdXNlZDsKK30ga21wX25lc3RlZF9udGhyZWFkc190OworCitleHRlcm4ga21wX25lc3RlZF9udGhyZWFkc190IF9fa21wX25lc3RlZF9udGg7CisKKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisKKy8vIFBhcmFtZXRlcnMgZm9yIHRoZSBzcGVjdWxhdGl2ZSBsb2NrIGJhY2tvZmYgc3lzdGVtLgorc3RydWN0IGttcF9hZGFwdGl2ZV9iYWNrb2ZmX3BhcmFtc190IHsKKyAgICAvLyBOdW1iZXIgb2Ygc29mdCByZXRyaWVzIGJlZm9yZSBpdCBjb3VudHMgYXMgYSBoYXJkIHJldHJ5LgorICAgIGttcF91aW50MzIgbWF4X3NvZnRfcmV0cmllczsKKyAgICAvLyBCYWRuZXNzIGlzIGEgYml0IG1hc2sgOiAwLDEsMyw3LDE1LC4uLiBvbiBlYWNoIGhhcmQgZmFpbHVyZSB3ZSBtb3ZlIG9uZSB0byB0aGUgcmlnaHQKKyAgICBrbXBfdWludDMyIG1heF9iYWRuZXNzOworfTsKKworZXh0ZXJuIGttcF9hZGFwdGl2ZV9iYWNrb2ZmX3BhcmFtc190IF9fa21wX2FkYXB0aXZlX2JhY2tvZmZfcGFyYW1zOworCisjaWYgS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTCitleHRlcm4gY2hhciAqIF9fa21wX3NwZWN1bGF0aXZlX3N0YXRzZmlsZTsKKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX1VTRV9BREFQVElWRV9MT0NLUworCisjaWYgT01QXzQwX0VOQUJMRUQKK2V4dGVybiBpbnQgX19rbXBfZGlzcGxheV9lbnY7ICAgICAgICAgICAvKiBUUlVFIG9yIEZBTFNFICovCitleHRlcm4gaW50IF9fa21wX2Rpc3BsYXlfZW52X3ZlcmJvc2U7ICAgLyogVFJVRSBpZiBPTVBfRElTUExBWV9FTlY9VkVSQk9TRSAqLworZXh0ZXJuIGludCBfX2ttcF9vbXBfY2FuY2VsbGF0aW9uOyAgICAgIC8qIFRSVUUgb3IgRkFMU0UgKi8KKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogdGhlIGZvbGxvd2luZyBhcmUgcHJvdGVjdGVkIGJ5IHRoZSBmb3JrL2pvaW4gbG9jayAqLworLyogd3JpdGU6IGxvY2sgIHJlYWQ6IGFueXRpbWUgKi8KK2V4dGVybiAgICAgICAgICBrbXBfaW5mb190ICoqX19rbXBfdGhyZWFkczsgICAgICAvKiBEZXNjcmlwdG9ycyBmb3IgdGhlIHRocmVhZHMgKi8KKy8qIHJlYWQvd3JpdGU6IGxvY2sgKi8KK2V4dGVybiB2b2xhdGlsZSBrbXBfdGVhbV90ICAqICAgICBfX2ttcF90ZWFtX3Bvb2w7CitleHRlcm4gdm9sYXRpbGUga21wX2luZm9fdCAgKiAgICAgX19rbXBfdGhyZWFkX3Bvb2w7CisKKy8qIHRvdGFsIG51bWJlciBvZiB0aHJlYWRzIHJlYWNoYWJsZSBmcm9tIHNvbWUgcm9vdCB0aHJlYWQgaW5jbHVkaW5nIGFsbCByb290IHRocmVhZHMqLworZXh0ZXJuIHZvbGF0aWxlIGludCBfX2ttcF9udGg7CisvKiB0b3RhbCBudW1iZXIgb2YgdGhyZWFkcyByZWFjaGFibGUgZnJvbSBzb21lIHJvb3QgdGhyZWFkIGluY2x1ZGluZyBhbGwgcm9vdCB0aHJlYWRzLAorICAgYW5kIHRob3NlIGluIHRoZSB0aHJlYWQgcG9vbCAqLworZXh0ZXJuIHZvbGF0aWxlIGludCBfX2ttcF9hbGxfbnRoOworZXh0ZXJuIGludCBfX2ttcF90aHJlYWRfcG9vbF9udGg7CitleHRlcm4gdm9sYXRpbGUgaW50IF9fa21wX3RocmVhZF9wb29sX2FjdGl2ZV9udGg7CisKK2V4dGVybiBrbXBfcm9vdF90ICoqX19rbXBfcm9vdDsgICAgICAgICAvKiByb290IG9mIHRocmVhZCBoaWVyYXJjaHkgKi8KKy8qIGVuZCBkYXRhIHByb3RlY3RlZCBieSBmb3JrL2pvaW4gbG9jayAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2V4dGVybiBrbXBfZ2xvYmFsX3QgIF9fa21wX2dsb2JhbDsgICAgICAgICAvKiBnbG9iYWwgc3RhdHVzICovCisKK2V4dGVybiBrbXBfaW5mb190IF9fa21wX21vbml0b3I7CitleHRlcm4gdm9sYXRpbGUga21wX3VpbnQzMiBfX2ttcF90ZWFtX2NvdW50ZXI7ICAgICAgLy8gVXNlZCBieSBEZWJ1Z2dpbmcgU3VwcG9ydCBMaWJyYXJ5LgorZXh0ZXJuIHZvbGF0aWxlIGttcF91aW50MzIgX19rbXBfdGFza19jb3VudGVyOyAgICAgIC8vIFVzZWQgYnkgRGVidWdnaW5nIFN1cHBvcnQgTGlicmFyeS4KKworI2RlZmluZSBfS01QX0dFTl9JRCggY291bnRlciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfiAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICkKKworCisKKyNkZWZpbmUgS01QX0dFTl9UQVNLX0lEKCkgICAgX0tNUF9HRU5fSUQoIF9fa21wX3Rhc2tfY291bnRlciApCisjZGVmaW5lIEtNUF9HRU5fVEVBTV9JRCgpICAgIF9LTVBfR0VOX0lEKCBfX2ttcF90ZWFtX2NvdW50ZXIgKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitleHRlcm4gdm9pZCBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCBpbnQgZ3RpZCwgdm9pZCAqcDEsIHZvaWQqIHAyLCBzaXplX3Qgc2l6ZSwgY2hhciBjb25zdCAqZm9ybWF0LCAuLi4gKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfc2VyaWFsX2luaXRpYWxpemUoIHZvaWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX21pZGRsZV9pbml0aWFsaXplKCB2b2lkICk7CitleHRlcm4gdm9pZCBfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCB2b2lkICk7CisKK2V4dGVybiB2b2lkIF9fa21wX2ludGVybmFsX2JlZ2luKCB2b2lkICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbnRlcm5hbF9lbmRfbGlicmFyeSggaW50IGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2ludGVybmFsX2VuZF90aHJlYWQoIGludCBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbnRlcm5hbF9lbmRfYXRleGl0KCB2b2lkICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbnRlcm5hbF9lbmRfZmluaSggdm9pZCApOworZXh0ZXJuIHZvaWQgX19rbXBfaW50ZXJuYWxfZW5kX2R0b3IoIHZvaWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2ludGVybmFsX2VuZF9kZXN0KCB2b2lkKiApOworCitleHRlcm4gaW50ICBfX2ttcF9yZWdpc3Rlcl9yb290KCBpbnQgaW5pdGlhbF90aHJlYWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX3VucmVnaXN0ZXJfcm9vdCggaW50IGd0aWQgKTsKKworZXh0ZXJuIGludCAgX19rbXBfaWdub3JlX21wcGJlZyggdm9pZCApOworZXh0ZXJuIGludCAgX19rbXBfaWdub3JlX21wcGVuZCggdm9pZCApOworCitleHRlcm4gaW50ICBfX2ttcF9lbnRlcl9zaW5nbGUoIGludCBndGlkLCBpZGVudF90ICppZF9yZWYsIGludCBwdXNoX3dzICk7CitleHRlcm4gdm9pZCBfX2ttcF9leGl0X3NpbmdsZSggaW50IGd0aWQgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfcGFyYWxsZWxfZGVvKCBpbnQgKmd0aWRfcmVmLCBpbnQgKmNpZF9yZWYsIGlkZW50X3QgKmxvY19yZWYgKTsKK2V4dGVybiB2b2lkIF9fa21wX3BhcmFsbGVsX2R4byggaW50ICpndGlkX3JlZiwgaW50ICpjaWRfcmVmLCBpZGVudF90ICpsb2NfcmVmICk7CisKKworI2lmZGVmIFVTRV9MT0FEX0JBTEFOQ0UKK2V4dGVybiBpbnQgIF9fa21wX2dldF9sb2FkX2JhbGFuY2UoIGludCApOworI2VuZGlmCisKKyNpZmRlZiBCVUlMRF9UVgorZXh0ZXJuIHZvaWQgX19rbXBfdHZfdGhyZWFkcHJpdmF0ZV9zdG9yZSgga21wX2luZm9fdCAqdGgsIHZvaWQgKmdsb2JhbF9hZGRyLCB2b2lkICp0aHJlYWRfYWRkciApOworI2VuZGlmCisKK2V4dGVybiBpbnQgIF9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkKCB2b2lkICk7CitleHRlcm4gaW50ICBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZF9yZWcoIHZvaWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2V4aXRfdGhyZWFkKCBpbnQgZXhpdF9zdGF0dXMgKTsKK2V4dGVybiB2b2lkIF9fa21wX2Fib3J0KCBjaGFyIGNvbnN0ICogZm9ybWF0LCAuLi4gKTsKK2V4dGVybiB2b2lkIF9fa21wX2Fib3J0X3RocmVhZCggdm9pZCApOworZXh0ZXJuIHZvaWQgX19rbXBfYWJvcnRfcHJvY2Vzcyggdm9pZCApOworZXh0ZXJuIHZvaWQgX19rbXBfd2FybiggY2hhciBjb25zdCAqIGZvcm1hdCwgLi4uICk7CisKK2V4dGVybiB2b2lkIF9fa21wX3NldF9udW1fdGhyZWFkcyggaW50IG5ld19udGgsIGludCBndGlkICk7CisKKy8vIFJldHVybnMgY3VycmVudCB0aHJlYWQgKHBvaW50ZXIgdG8ga21wX2luZm9fdCkuIEN1cnJlbnQgdGhyZWFkICptdXN0KiBiZSByZWdpc3RlcmVkLgorc3RhdGljIGlubGluZSBrbXBfaW5mb190ICogX19rbXBfZW50cnlfdGhyZWFkKCkKK3sKKyAgICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworCisgICAgICByZXR1cm4gX19rbXBfdGhyZWFkc1tndGlkXTsKK30KKworI2lmIE9NUF8zMF9FTkFCTEVECisKK2V4dGVybiB2b2lkIF9fa21wX3NldF9tYXhfYWN0aXZlX2xldmVscyggaW50IGd0aWQsIGludCBuZXdfbWF4X2FjdGl2ZV9sZXZlbHMgKTsKK2V4dGVybiBpbnQgIF9fa21wX2dldF9tYXhfYWN0aXZlX2xldmVscyggaW50IGd0aWQgKTsKK2V4dGVybiBpbnQgIF9fa21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtKCBpbnQgZ3RpZCwgaW50IGxldmVsICk7CitleHRlcm4gaW50ICBfX2ttcF9nZXRfdGVhbV9zaXplKCBpbnQgZ3RpZCwgaW50IGxldmVsICk7CitleHRlcm4gdm9pZCBfX2ttcF9zZXRfc2NoZWR1bGUoIGludCBndGlkLCBrbXBfc2NoZWRfdCBuZXdfc2NoZWQsIGludCBjaHVuayApOworZXh0ZXJuIHZvaWQgX19rbXBfZ2V0X3NjaGVkdWxlKCBpbnQgZ3RpZCwga21wX3NjaGVkX3QgKiBzY2hlZCwgaW50ICogY2h1bmsgKTsKKworI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisKK2V4dGVybiB1bnNpZ25lZCBzaG9ydCBfX2ttcF9nZXRfcmFuZG9tKCBrbXBfaW5mb190ICogdGhyZWFkICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbml0X3JhbmRvbSgga21wX2luZm9fdCAqIHRocmVhZCApOworCitleHRlcm4ga21wX3Jfc2NoZWRfdCBfX2ttcF9nZXRfc2NoZWR1bGVfZ2xvYmFsKCB2b2lkICk7CitleHRlcm4gdm9pZCBfX2ttcF9hZGp1c3RfbnVtX3RocmVhZHMoIGludCBuZXdfbnByb2MgKTsKKworZXh0ZXJuIHZvaWQgKiBfX19rbXBfYWxsb2NhdGUoIHNpemVfdCBzaXplIEtNUF9TUkNfTE9DX0RFQ0wgKTsKK2V4dGVybiB2b2lkICogX19fa21wX3BhZ2VfYWxsb2NhdGUoIHNpemVfdCBzaXplIEtNUF9TUkNfTE9DX0RFQ0wgKTsKK2V4dGVybiB2b2lkICAgX19fa21wX2ZyZWUoIHZvaWQgKiBwdHIgS01QX1NSQ19MT0NfREVDTCApOworI2RlZmluZSBfX2ttcF9hbGxvY2F0ZSggc2l6ZSApICAgICAgX19fa21wX2FsbG9jYXRlKCAoc2l6ZSkgS01QX1NSQ19MT0NfQ1VSUiApCisjZGVmaW5lIF9fa21wX3BhZ2VfYWxsb2NhdGUoIHNpemUgKSBfX19rbXBfcGFnZV9hbGxvY2F0ZSggKHNpemUpIEtNUF9TUkNfTE9DX0NVUlIgKQorI2RlZmluZSBfX2ttcF9mcmVlKCBwdHIgKSAgICAgICAgICAgX19fa21wX2ZyZWUoIChwdHIpIEtNUF9TUkNfTE9DX0NVUlIgKQorCisjaWYgVVNFX0ZBU1RfTUVNT1JZCitleHRlcm4gdm9pZCAqIF9fX2ttcF9mYXN0X2FsbG9jYXRlKCBrbXBfaW5mb190ICp0aGlzX3Rociwgc2l6ZV90IHNpemUgS01QX1NSQ19MT0NfREVDTCApOworZXh0ZXJuIHZvaWQgICBfX19rbXBfZmFzdF9mcmVlKCBrbXBfaW5mb190ICp0aGlzX3Rociwgdm9pZCAqcHRyIEtNUF9TUkNfTE9DX0RFQ0wgKTsKK2V4dGVybiB2b2lkICAgX19rbXBfZnJlZV9mYXN0X21lbW9yeSgga21wX2luZm9fdCAqdGhpc190aHIgKTsKK2V4dGVybiB2b2lkICAgX19rbXBfaW5pdGlhbGl6ZV9mYXN0X21lbW9yeSgga21wX2luZm9fdCAqdGhpc190aHIgKTsKKyNkZWZpbmUgX19rbXBfZmFzdF9hbGxvY2F0ZSggdGhpc190aHIsIHNpemUgKSBfX19rbXBfZmFzdF9hbGxvY2F0ZSggKHRoaXNfdGhyKSwgKHNpemUpIEtNUF9TUkNfTE9DX0NVUlIgKQorI2RlZmluZSBfX2ttcF9mYXN0X2ZyZWUoIHRoaXNfdGhyLCBwdHIgKSAgICAgIF9fX2ttcF9mYXN0X2ZyZWUoICh0aGlzX3RociksIChwdHIpIEtNUF9TUkNfTE9DX0NVUlIgKQorI2VuZGlmCisKK2V4dGVybiB2b2lkICogX19fa21wX3RocmVhZF9tYWxsb2MoIGttcF9pbmZvX3QgKnRoLCBzaXplX3Qgc2l6ZSBLTVBfU1JDX0xPQ19ERUNMICk7CitleHRlcm4gdm9pZCAqIF9fX2ttcF90aHJlYWRfY2FsbG9jKCBrbXBfaW5mb190ICp0aCwgc2l6ZV90IG5lbGVtLCBzaXplX3QgZWxzaXplIEtNUF9TUkNfTE9DX0RFQ0wgKTsKK2V4dGVybiB2b2lkICogX19fa21wX3RocmVhZF9yZWFsbG9jKCBrbXBfaW5mb190ICp0aCwgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSBLTVBfU1JDX0xPQ19ERUNMICk7CitleHRlcm4gdm9pZCAgIF9fX2ttcF90aHJlYWRfZnJlZSgga21wX2luZm9fdCAqdGgsIHZvaWQgKnB0ciBLTVBfU1JDX0xPQ19ERUNMICk7CisjZGVmaW5lIF9fa21wX3RocmVhZF9tYWxsb2MoICB0aCwgc2l6ZSApICAgICAgICAgIF9fX2ttcF90aHJlYWRfbWFsbG9jKCAgKHRoKSwgKHNpemUpICAgICAgICAgICAgS01QX1NSQ19MT0NfQ1VSUiApCisjZGVmaW5lIF9fa21wX3RocmVhZF9jYWxsb2MoICB0aCwgbmVsZW0sIGVsc2l6ZSApIF9fX2ttcF90aHJlYWRfY2FsbG9jKCAgKHRoKSwgKG5lbGVtKSwgKGVsc2l6ZSkgS01QX1NSQ19MT0NfQ1VSUiApCisjZGVmaW5lIF9fa21wX3RocmVhZF9yZWFsbG9jKCB0aCwgcHRyLCBzaXplICkgICAgIF9fX2ttcF90aHJlYWRfcmVhbGxvYyggKHRoKSwgKHB0ciksIChzaXplKSAgICAgS01QX1NSQ19MT0NfQ1VSUiApCisjZGVmaW5lIF9fa21wX3RocmVhZF9mcmVlKCAgICB0aCwgcHRyICkgICAgICAgICAgIF9fX2ttcF90aHJlYWRfZnJlZSggICAgKHRoKSwgKHB0cikgICAgICAgICAgICAgS01QX1NSQ19MT0NfQ1VSUiApCisKKyNkZWZpbmUgS01QX0lOVEVSTkFMX01BTExPQyhzeikgICAgbWFsbG9jKHN6KQorI2RlZmluZSBLTVBfSU5URVJOQUxfRlJFRShwKSAgICAgICBmcmVlKHApCisjZGVmaW5lIEtNUF9JTlRFUk5BTF9SRUFMTE9DKHAsc3opIHJlYWxsb2MoKHApLChzeikpCisjZGVmaW5lIEtNUF9JTlRFUk5BTF9DQUxMT0MobixzeikgIGNhbGxvYygobiksKHN6KSkKKworZXh0ZXJuIHZvaWQgX19rbXBfcHVzaF9udW1fdGhyZWFkcyggaWRlbnRfdCAqbG9jLCBpbnQgZ3RpZCwgaW50IG51bV90aHJlYWRzICk7CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorZXh0ZXJuIHZvaWQgX19rbXBfcHVzaF9wcm9jX2JpbmQoIGlkZW50X3QgKmxvYywgaW50IGd0aWQsIGttcF9wcm9jX2JpbmRfdCBwcm9jX2JpbmQgKTsKK2V4dGVybiB2b2lkIF9fa21wX3B1c2hfbnVtX3RlYW1zKCBpZGVudF90ICpsb2MsIGludCBndGlkLCBpbnQgbnVtX3RlYW1zLCBpbnQgbnVtX3RocmVhZHMgKTsKKyNlbmRpZgorCitleHRlcm4gdm9pZCBfX2ttcF95aWVsZCggaW50IGNvbmQgKTsKK2V4dGVybiB2b2lkIF9fa21wX3JlbGVhc2UoIGttcF9pbmZvX3QgKnRhcmdldF90aHIsIHZvbGF0aWxlIGttcF91aW50ICpzcGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBrbXBfbWVtX2ZlbmNlX3R5cGUgZmV0Y2hhZGRfZmVuY2UgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBjX2Rpc3BhdGNoX2luaXRfNCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwKKyAgICBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsIGttcF9pbnQzMiBsYiwga21wX2ludDMyIHViLCBrbXBfaW50MzIgc3QsCisgICAga21wX2ludDMyIGNodW5rICk7CitleHRlcm4gdm9pZCBfX2ttcGNfZGlzcGF0Y2hfaW5pdF80dSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwKKyAgICBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsIGttcF91aW50MzIgbGIsIGttcF91aW50MzIgdWIsIGttcF9pbnQzMiBzdCwKKyAgICBrbXBfaW50MzIgY2h1bmsgKTsKK2V4dGVybiB2b2lkIF9fa21wY19kaXNwYXRjaF9pbml0XzgoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLCBrbXBfaW50NjQgbGIsIGttcF9pbnQ2NCB1Yiwga21wX2ludDY0IHN0LAorICAgIGttcF9pbnQ2NCBjaHVuayApOworZXh0ZXJuIHZvaWQgX19rbXBjX2Rpc3BhdGNoX2luaXRfOHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLCBrbXBfdWludDY0IGxiLCBrbXBfdWludDY0IHViLCBrbXBfaW50NjQgc3QsCisgICAga21wX2ludDY0IGNodW5rICk7CisKK2V4dGVybiBpbnQgX19rbXBjX2Rpc3BhdGNoX25leHRfNCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwKKyAgICBrbXBfaW50MzIgKnBfbGFzdCwga21wX2ludDMyICpwX2xiLCBrbXBfaW50MzIgKnBfdWIsIGttcF9pbnQzMiAqcF9zdCApOworZXh0ZXJuIGludCBfX2ttcGNfZGlzcGF0Y2hfbmV4dF80dSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwKKyAgICBrbXBfaW50MzIgKnBfbGFzdCwga21wX3VpbnQzMiAqcF9sYiwga21wX3VpbnQzMiAqcF91Yiwga21wX2ludDMyICpwX3N0ICk7CitleHRlcm4gaW50IF9fa21wY19kaXNwYXRjaF9uZXh0XzgoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAga21wX2ludDMyICpwX2xhc3QsIGttcF9pbnQ2NCAqcF9sYiwga21wX2ludDY0ICpwX3ViLCBrbXBfaW50NjQgKnBfc3QgKTsKK2V4dGVybiBpbnQgX19rbXBjX2Rpc3BhdGNoX25leHRfOHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAga21wX2ludDMyICpwX2xhc3QsIGttcF91aW50NjQgKnBfbGIsIGttcF91aW50NjQgKnBfdWIsIGttcF9pbnQ2NCAqcF9zdCApOworCitleHRlcm4gdm9pZCBfX2ttcGNfZGlzcGF0Y2hfZmluaV80KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcGNfZGlzcGF0Y2hfZmluaV84KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcGNfZGlzcGF0Y2hfZmluaV80dSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBjX2Rpc3BhdGNoX2ZpbmlfOHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQgKTsKKworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisKK2V4dGVybiB2b2lkIF9fa21wX2F1eF9kaXNwYXRjaF9pbml0XzQoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLCBrbXBfaW50MzIgbGIsIGttcF9pbnQzMiB1Yiwga21wX2ludDMyIHN0LAorICAgIGttcF9pbnQzMiBjaHVuaywgaW50IHB1c2hfd3MgKTsKK2V4dGVybiB2b2lkIF9fa21wX2F1eF9kaXNwYXRjaF9pbml0XzR1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLAorICAgIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwga21wX3VpbnQzMiBsYiwga21wX3VpbnQzMiB1Yiwga21wX2ludDMyIHN0LAorICAgIGttcF9pbnQzMiBjaHVuaywgaW50IHB1c2hfd3MgKTsKK2V4dGVybiB2b2lkIF9fa21wX2F1eF9kaXNwYXRjaF9pbml0XzgoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLCBrbXBfaW50NjQgbGIsIGttcF9pbnQ2NCB1Yiwga21wX2ludDY0IHN0LAorICAgIGttcF9pbnQ2NCBjaHVuaywgaW50IHB1c2hfd3MgKTsKK2V4dGVybiB2b2lkIF9fa21wX2F1eF9kaXNwYXRjaF9pbml0Xzh1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLAorICAgIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwga21wX3VpbnQ2NCBsYiwga21wX3VpbnQ2NCB1Yiwga21wX2ludDY0IHN0LAorICAgIGttcF9pbnQ2NCBjaHVuaywgaW50IHB1c2hfd3MgKTsKK2V4dGVybiB2b2lkIF9fa21wX2F1eF9kaXNwYXRjaF9maW5pX2NodW5rXzQoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2F1eF9kaXNwYXRjaF9maW5pX2NodW5rXzgoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2F1eF9kaXNwYXRjaF9maW5pX2NodW5rXzR1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9hdXhfZGlzcGF0Y2hfZmluaV9jaHVua184dSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCApOworCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisKKworZXh0ZXJuIGttcF91aW50MzIgX19rbXBfZXFfNCggIGttcF91aW50MzIgdmFsdWUsIGttcF91aW50MzIgY2hlY2tlciApOworZXh0ZXJuIGttcF91aW50MzIgX19rbXBfbmVxXzQoIGttcF91aW50MzIgdmFsdWUsIGttcF91aW50MzIgY2hlY2tlciApOworZXh0ZXJuIGttcF91aW50MzIgX19rbXBfbHRfNCggIGttcF91aW50MzIgdmFsdWUsIGttcF91aW50MzIgY2hlY2tlciApOworZXh0ZXJuIGttcF91aW50MzIgX19rbXBfZ2VfNCggIGttcF91aW50MzIgdmFsdWUsIGttcF91aW50MzIgY2hlY2tlciApOworZXh0ZXJuIGttcF91aW50MzIgX19rbXBfbGVfNCggIGttcF91aW50MzIgdmFsdWUsIGttcF91aW50MzIgY2hlY2tlciApOworCitleHRlcm4ga21wX3VpbnQzMiBfX2ttcF9lcV84KCAga21wX3VpbnQ2NCB2YWx1ZSwga21wX3VpbnQ2NCBjaGVja2VyICk7CitleHRlcm4ga21wX3VpbnQzMiBfX2ttcF9uZXFfOCgga21wX3VpbnQ2NCB2YWx1ZSwga21wX3VpbnQ2NCBjaGVja2VyICk7CitleHRlcm4ga21wX3VpbnQzMiBfX2ttcF9sdF84KCAga21wX3VpbnQ2NCB2YWx1ZSwga21wX3VpbnQ2NCBjaGVja2VyICk7CitleHRlcm4ga21wX3VpbnQzMiBfX2ttcF9nZV84KCAga21wX3VpbnQ2NCB2YWx1ZSwga21wX3VpbnQ2NCBjaGVja2VyICk7CitleHRlcm4ga21wX3VpbnQzMiBfX2ttcF9sZV84KCAga21wX3VpbnQ2NCB2YWx1ZSwga21wX3VpbnQ2NCBjaGVja2VyICk7CisKK2V4dGVybiBrbXBfdWludDMyIF9fa21wX3dhaXRfeWllbGRfNCgga21wX3VpbnQzMiB2b2xhdGlsZSAqIHNwaW5uZXIsIGttcF91aW50MzIgY2hlY2tlciwga21wX3VpbnQzMiAoKnByZWQpIChrbXBfdWludDMyLCBrbXBfdWludDMyKSwgdm9pZCAqIG9iaiApOworZXh0ZXJuIGttcF91aW50NjQgX19rbXBfd2FpdF95aWVsZF84KCBrbXBfdWludDY0IHZvbGF0aWxlICogc3Bpbm5lciwga21wX3VpbnQ2NCBjaGVja2VyLCBrbXBfdWludDMyICgqcHJlZCkgKGttcF91aW50NjQsIGttcF91aW50NjQpLCB2b2lkICogb2JqICk7CisKK2V4dGVybiB2b2lkIF9fa21wX3dhaXRfc2xlZXAoIGttcF9pbmZvX3QgKnRoaXNfdGhyLCB2b2xhdGlsZSBrbXBfdWludCAqc3Bpbm5lciwga21wX3VpbnQgY2hlY2tlciwga21wX2ludCBmaW5hbF9zcGluCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCB2b2lkICogaXR0X3N5bmNfb2JqCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworKTsKK2V4dGVybiB2b2lkIF9fa21wX2luZmluaXRlX2xvb3AoIHZvaWQgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfY2xlYW51cCggdm9pZCApOworCisjaWYgS01QX0hBTkRMRV9TSUdOQUxTCisgICAgZXh0ZXJuIGludCAgX19rbXBfaGFuZGxlX3NpZ25hbHM7CisgICAgZXh0ZXJuIHZvaWQgX19rbXBfaW5zdGFsbF9zaWduYWxzKCBpbnQgcGFyYWxsZWxfaW5pdCApOworICAgIGV4dGVybiB2b2lkIF9fa21wX3JlbW92ZV9zaWduYWxzKCB2b2lkICk7CisjZW5kaWYKKworZXh0ZXJuIHZvaWQgX19rbXBfY2xlYXJfc3lzdGVtX3RpbWUoIHZvaWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX3JlYWRfc3lzdGVtX3RpbWUoIGRvdWJsZSAqZGVsdGEgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfY2hlY2tfc3RhY2tfb3ZlcmxhcCgga21wX2luZm9fdCAqdGhyICk7CisKK2V4dGVybiB2b2lkIF9fa21wX2V4cGFuZF9ob3N0X25hbWUoIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUgKTsKK2V4dGVybiB2b2lkIF9fa21wX2V4cGFuZF9maWxlX25hbWUoIGNoYXIgKnJlc3VsdCwgc2l6ZV90IHJsZW4sIGNoYXIgKnBhdHRlcm4gKTsKKworI2lmIEtNUF9PU19XSU5ET1dTCitleHRlcm4gdm9pZCBfX2ttcF9pbml0aWFsaXplX3N5c3RlbV90aWNrKCB2b2lkICk7ICAvKiBJbml0aWFsaXplIHRpbWVyIHRpY2sgdmFsdWUgKi8KKyNlbmRpZgorCitleHRlcm4gdm9pZCBfX2ttcF9ydW50aW1lX2luaXRpYWxpemUoIHZvaWQgKTsgIC8qIG1hY2hpbmUgc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gKi8KK2V4dGVybiB2b2lkIF9fa21wX3J1bnRpbWVfZGVzdHJveSggdm9pZCApOworCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorZXh0ZXJuIGNoYXIgKl9fa21wX2FmZmluaXR5X3ByaW50X21hc2soY2hhciAqYnVmLCBpbnQgYnVmX2xlbiwga21wX2FmZmluX21hc2tfdCAqbWFzayk7CitleHRlcm4gdm9pZCBfX2ttcF9hZmZpbml0eV9pbml0aWFsaXplKHZvaWQpOworZXh0ZXJuIHZvaWQgX19rbXBfYWZmaW5pdHlfdW5pbml0aWFsaXplKHZvaWQpOworZXh0ZXJuIHZvaWQgX19rbXBfYWZmaW5pdHlfc2V0X2luaXRfbWFzayhpbnQgZ3RpZCwgaW50IGlzYV9yb290KTsgLyogc2V0IGFmZmluaXR5IGFjY29yZGluZyB0byBLTVBfQUZGSU5JVFkgKi8KKyNpZiBPTVBfNDBfRU5BQkxFRAorZXh0ZXJuIHZvaWQgX19rbXBfYWZmaW5pdHlfc2V0X3BsYWNlKGludCBndGlkKTsKKyNlbmRpZgorZXh0ZXJuIHZvaWQgX19rbXBfY2hhbmdlX3RocmVhZF9hZmZpbml0eV9tYXNrKCBpbnQgZ3RpZCwga21wX2FmZmluX21hc2tfdCAqbmV3X21hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9hZmZpbl9tYXNrX3QgKm9sZF9tYXNrICk7CitleHRlcm4gdm9pZCBfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZSggY29uc3QgY2hhciAqZW52X3ZhciApOworZXh0ZXJuIGludCBfX2ttcF9hdXhfc2V0X2FmZmluaXR5KHZvaWQgKiptYXNrKTsKK2V4dGVybiBpbnQgX19rbXBfYXV4X2dldF9hZmZpbml0eSh2b2lkICoqbWFzayk7CitleHRlcm4gaW50IF9fa21wX2F1eF9zZXRfYWZmaW5pdHlfbWFza19wcm9jKGludCBwcm9jLCB2b2lkICoqbWFzayk7CitleHRlcm4gaW50IF9fa21wX2F1eF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MoaW50IHByb2MsIHZvaWQgKiptYXNrKTsKK2V4dGVybiBpbnQgX19rbXBfYXV4X2dldF9hZmZpbml0eV9tYXNrX3Byb2MoaW50IHByb2MsIHZvaWQgKiptYXNrKTsKK2V4dGVybiB2b2lkIF9fa21wX2JhbGFuY2VkX2FmZmluaXR5KCBpbnQgdGlkLCBpbnQgdGVhbV9zaXplICk7CisKKyNlbmRpZiAvKiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEICovCisKKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNKQorCitleHRlcm4gaW50IF9fa21wX2Z1dGV4X2RldGVybWluZV9jYXBhYmxlKCB2b2lkICk7CisKKyNlbmRpZiAvLyBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNKQorCitleHRlcm4gdm9pZCBfX2ttcF9ndGlkX3NldF9zcGVjaWZpYyggaW50IGd0aWQgKTsKK2V4dGVybiBpbnQgIF9fa21wX2d0aWRfZ2V0X3NwZWNpZmljKCB2b2lkICk7CisKK2V4dGVybiBkb3VibGUgX19rbXBfcmVhZF9jcHVfdGltZSggdm9pZCApOworCitleHRlcm4gaW50ICBfX2ttcF9yZWFkX3N5c3RlbV9pbmZvKCBzdHJ1Y3Qga21wX3N5c19pbmZvICppbmZvICk7CisKK2V4dGVybiB2b2lkIF9fa21wX2NyZWF0ZV9tb25pdG9yKCBrbXBfaW5mb190ICp0aCApOworCitleHRlcm4gdm9pZCAqX19rbXBfbGF1bmNoX3RocmVhZCgga21wX2luZm9fdCAqdGhyICk7CisKK2V4dGVybiB2b2lkIF9fa21wX2NyZWF0ZV93b3JrZXIoIGludCBndGlkLCBrbXBfaW5mb190ICp0aCwgc2l6ZV90IHN0YWNrX3NpemUgKTsKKworI2lmIEtNUF9PU19XSU5ET1dTCitleHRlcm4gaW50ICBfX2ttcF9zdGlsbF9ydW5uaW5nKGttcF9pbmZvX3QgKnRoKTsKK2V4dGVybiBpbnQgIF9fa21wX2lzX3RocmVhZF9hbGl2ZSgga21wX2luZm9fdCAqIHRoLCBEV09SRCAqZXhpdF92YWwgKTsKK2V4dGVybiB2b2lkIF9fa21wX2ZyZWVfaGFuZGxlKCBrbXBfdGhyZWFkX3QgdEhhbmRsZSApOworI2VuZGlmCisKK2V4dGVybiB2b2lkIF9fa21wX3JlYXBfbW9uaXRvcigga21wX2luZm9fdCAqdGggKTsKK2V4dGVybiB2b2lkIF9fa21wX3JlYXBfd29ya2VyKCBrbXBfaW5mb190ICp0aCApOworZXh0ZXJuIHZvaWQgX19rbXBfdGVybWluYXRlX3RocmVhZCggaW50IGd0aWQgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfc3VzcGVuZCggaW50IHRoX2d0aWQsIHZvbGF0aWxlIGttcF91aW50ICpzcGlubmVyLCBrbXBfdWludCBjaGVja2VyICk7CitleHRlcm4gdm9pZCBfX2ttcF9yZXN1bWUoIGludCB0YXJnZXRfZ3RpZCwgdm9sYXRpbGUga21wX3VpbnQgKnNwaW5uZXIgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfZWxhcHNlZCggZG91YmxlICogKTsKK2V4dGVybiB2b2lkIF9fa21wX2VsYXBzZWRfdGljayggZG91YmxlICogKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfZW5hYmxlKCBpbnQgb2xkX3N0YXRlICk7CitleHRlcm4gdm9pZCBfX2ttcF9kaXNhYmxlKCBpbnQgKm9sZF9zdGF0ZSApOworCitleHRlcm4gdm9pZCBfX2ttcF90aHJlYWRfc2xlZXAoIGludCBtaWxsaXMgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfY29tbW9uX2luaXRpYWxpemUoIHZvaWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2NvbW1vbl9kZXN0cm95KCB2b2lkICk7CitleHRlcm4gdm9pZCBfX2ttcF9jb21tb25fZGVzdHJveV9ndGlkKCBpbnQgZ3RpZCApOworCisjaWYgS01QX09TX1VOSVgKK2V4dGVybiB2b2lkIF9fa21wX3JlZ2lzdGVyX2F0Zm9yayggdm9pZCApOworI2VuZGlmCitleHRlcm4gdm9pZCBfX2ttcF9zdXNwZW5kX2luaXRpYWxpemUoIHZvaWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX3N1c3BlbmRfdW5pbml0aWFsaXplX3RocmVhZCgga21wX2luZm9fdCAqdGggKTsKKworZXh0ZXJuIGttcF9pbmZvX3QgKiBfX2ttcF9hbGxvY2F0ZV90aHJlYWQoIGttcF9yb290X3QgKnJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3RlYW1fdCAqdGVhbSwgaW50IHRpZCk7CisjaWYgT01QXzQwX0VOQUJMRUQKK2V4dGVybiBrbXBfdGVhbV90ICogX19rbXBfYWxsb2NhdGVfdGVhbSgga21wX3Jvb3RfdCAqcm9vdCwgaW50IG5ld19ucHJvYywgaW50IG1heF9ucHJvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3Byb2NfYmluZF90IHByb2NfYmluZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludGVybmFsX2NvbnRyb2xfdCAqbmV3X2ljdnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcmdjICk7CisjZWxpZiBPTVBfMzBfRU5BQkxFRAorZXh0ZXJuIGttcF90ZWFtX3QgKiBfX2ttcF9hbGxvY2F0ZV90ZWFtKCBrbXBfcm9vdF90ICpyb290LCBpbnQgbmV3X25wcm9jLCBpbnQgbWF4X25wcm9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50ZXJuYWxfY29udHJvbF90ICpuZXdfaWN2cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZ2MgKTsKKyNlbHNlCitleHRlcm4ga21wX3RlYW1fdCAqIF9fa21wX2FsbG9jYXRlX3RlYW0oIGttcF9yb290X3QgKnJvb3QsIGludCBuZXdfbnByb2MsIGludCBtYXhfbnByb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXdfc2V0X25wcm9jLCBpbnQgbmV3X3NldF9keW5hbWljLCBpbnQgbmV3X3NldF9uZXN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXdfc2V0X2Jsb2NrdGltZSwgaW50IG5ld19idF9pbnRlcnZhbHMsIGludCBuZXdfYnRfc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJnYyApOworI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECitleHRlcm4gdm9pZCBfX2ttcF9mcmVlX3RocmVhZCgga21wX2luZm9fdCAqICk7CitleHRlcm4gdm9pZCBfX2ttcF9mcmVlX3RlYW0oIGttcF9yb290X3QgKiwga21wX3RlYW1fdCAqICk7CitleHRlcm4ga21wX3RlYW1fdCAqIF9fa21wX3JlYXBfdGVhbSgga21wX3RlYW1fdCAqICk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitleHRlcm4gdm9pZCBfX2ttcF9pbml0aWFsaXplX2JnZXQoIGttcF9pbmZvX3QgKnRoICk7CitleHRlcm4gdm9pZCBfX2ttcF9maW5hbGl6ZV9iZ2V0KCBrbXBfaW5mb190ICp0aCApOworCitLTVBfRVhQT1JUIHZvaWQgKmttcGNfbWFsbG9jKCBzaXplX3Qgc2l6ZSApOworS01QX0VYUE9SVCB2b2lkICprbXBjX2NhbGxvYyggc2l6ZV90IG5lbGVtLCBzaXplX3QgZWxzaXplICk7CitLTVBfRVhQT1JUIHZvaWQgKmttcGNfcmVhbGxvYyggdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSApOworS01QX0VYUE9SVCB2b2lkICBrbXBjX2ZyZWUoIHZvaWQgKnB0ciApOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIGRlY2xhcmF0aW9ucyBmb3IgaW50ZXJuYWwgdXNlICovCisKK2V4dGVybiBpbnQgIF9fa21wX2JhcnJpZXIoIGVudW0gYmFycmllcl90eXBlIGJ0LCBpbnQgZ3RpZCwgaW50IGlzX3NwbGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJlZHVjZV9zaXplLCB2b2lkICpyZWR1Y2VfZGF0YSwgdm9pZCAoKnJlZHVjZSkodm9pZCAqLCB2b2lkICopICk7CitleHRlcm4gdm9pZCBfX2ttcF9lbmRfc3BsaXRfYmFycmllciAoIGVudW0gYmFycmllcl90eXBlIGJ0LCBpbnQgZ3RpZCApOworCitleHRlcm4gaW50IF9fa21wX2ZvcmtfY2FsbCggaWRlbnRfdCAqbG9jLCBpbnQgZ3RpZCwgaW50IGV4ZWNfbWFzdGVyLAorICBrbXBfaW50MzIgYXJnYywgbWljcm90YXNrX3QgbWljcm90YXNrLCBsYXVuY2hfdCBpbnZva2VyLAorLyogVE9ETzogcmV2ZXJ0IHdvcmthcm91bmQgZm9yIEludGVsKFIpIDY0IHRyYWNrZXIgIzk2ICovCisjaWYgKEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9YODZfNjQpICYmIEtNUF9PU19MSU5VWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0ICphcAorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKK2V4dGVybiB2b2lkIF9fa21wX2pvaW5fY2FsbCggaWRlbnRfdCAqbG9jLCBpbnQgZ3RpZAorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICAgICAgICAgICAgICAgICAsIGludCBleGl0X3RlYW1zID0gMAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCitleHRlcm4gdm9pZCBfX2ttcF9pbnRlcm5hbF9mb3JrKCBpZGVudF90ICppZCwgaW50IGd0aWQsIGttcF90ZWFtX3QgKnRlYW0gKTsKK2V4dGVybiB2b2lkIF9fa21wX2ludGVybmFsX2pvaW4oIGlkZW50X3QgKmlkLCBpbnQgZ3RpZCwga21wX3RlYW1fdCAqdGVhbSApOworZXh0ZXJuIGludCBfX2ttcF9pbnZva2VfdGFza19mdW5jKCBpbnQgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBfcnVuX2JlZm9yZV9pbnZva2VkX3Rhc2soIGludCBndGlkLCBpbnQgdGlkLCBrbXBfaW5mb190ICp0aGlzX3Rociwga21wX3RlYW1fdCAqdGVhbSApOworZXh0ZXJuIHZvaWQgX19rbXBfcnVuX2FmdGVyX2ludm9rZWRfdGFzayggaW50IGd0aWQsIGludCB0aWQsIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBrbXBfdGVhbV90ICp0ZWFtICk7CisKKy8vIHNob3VsZCBuZXZlciBoYXZlIGJlZW4gZXhwb3J0ZWQKK0tNUF9FWFBPUlQgaW50IF9fa21wY19pbnZva2VfdGFza19mdW5jKCBpbnQgZ3RpZCApOworI2lmIE9NUF80MF9FTkFCTEVECitleHRlcm4gaW50ICBfX2ttcF9pbnZva2VfdGVhbXNfbWFzdGVyKCBpbnQgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBfdGVhbXNfbWFzdGVyKCBtaWNyb3Rhc2tfdCBtaWNyb3Rhc2ssIGludCBndGlkICk7CisjZW5kaWYKK2V4dGVybiB2b2lkIF9fa21wX3NhdmVfaW50ZXJuYWxfY29udHJvbHMoIGttcF9pbmZvX3QgKiB0aHJlYWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX3VzZXJfc2V0X2xpYnJhcnkgKGVudW0gbGlicmFyeV90eXBlIGFyZyk7CitleHRlcm4gdm9pZCBfX2ttcF9hdXhfc2V0X2xpYnJhcnkgKGVudW0gbGlicmFyeV90eXBlIGFyZyk7CitleHRlcm4gdm9pZCBfX2ttcF9hdXhfc2V0X3N0YWNrc2l6ZSggc2l6ZV90IGFyZyk7CitleHRlcm4gdm9pZCBfX2ttcF9hdXhfc2V0X2Jsb2NrdGltZSAoaW50IGFyZywga21wX2luZm9fdCAqdGhyZWFkLCBpbnQgdGlkKTsKK2V4dGVybiB2b2lkIF9fa21wX2F1eF9zZXRfZGVmYXVsdHMoIGNoYXIgY29uc3QgKiBzdHIsIGludCBsZW4gKTsKKworLyogRnVuY3Rpb25zIGJlbG93IHB1dCBoZXJlIHRvIGNhbGwgdGhlbSBmcm9tIF9fa21wX2F1eF9lbnZfaW5pdGlhbGl6ZSgpIGluIGttcF9zZXR0aW5ncy5jICovCit2b2lkIGttcGNfc2V0X2Jsb2NrdGltZSAoaW50IGFyZyk7Cit2b2lkIG9tcGNfc2V0X25lc3RlZCggaW50IGZsYWcgKTsKK3ZvaWQgb21wY19zZXRfZHluYW1pYyggaW50IGZsYWcgKTsKK3ZvaWQgb21wY19zZXRfbnVtX3RocmVhZHMoIGludCBhcmcgKTsKKworI2lmIE9NUF8zMF9FTkFCTEVECitleHRlcm4gdm9pZCBfX2ttcF9wdXNoX2N1cnJlbnRfdGFza190b190aHJlYWQoIGttcF9pbmZvX3QgKnRoaXNfdGhyLAorICAgICAgICAgICAgICAgICAga21wX3RlYW1fdCAqdGVhbSwgaW50IHRpZCApOworZXh0ZXJuIHZvaWQgX19rbXBfcG9wX2N1cnJlbnRfdGFza19mcm9tX3RocmVhZCgga21wX2luZm9fdCAqdGhpc190aHIgKTsKK2V4dGVybiBrbXBfdGFza190KiBfX2ttcF90YXNrX2FsbG9jKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwKKyAga21wX3Rhc2tpbmdfZmxhZ3NfdCAqZmxhZ3MsIHNpemVfdCBzaXplb2Zfa21wX3Rhc2tfdCwgc2l6ZV90IHNpemVvZl9zaGFyZWRzLAorICBrbXBfcm91dGluZV9lbnRyeV90IHRhc2tfZW50cnkgKTsKK2V4dGVybiB2b2lkIF9fa21wX2luaXRfaW1wbGljaXRfdGFzayggaWRlbnRfdCAqbG9jX3JlZiwga21wX2luZm9fdCAqdGhpc190aHIsCisgICAgICAgICAgICAgICAgICBrbXBfdGVhbV90ICp0ZWFtLCBpbnQgdGlkLCBpbnQgc2V0X2N1cnJfdGFzayApOworCitleHRlcm4gaW50ICBfX2ttcF9leGVjdXRlX3Rhc2tzKCBrbXBfaW5mb190ICp0aHJlYWQsIGttcF9pbnQzMiBndGlkLCB2b2xhdGlsZSBrbXBfdWludCAqc3Bpbm5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50IGNoZWNrZXIsIGludCBmaW5hbF9zcGluLCBpbnQgKnRocmVhZF9maW5pc2hlZCwKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogaXR0X3N5bmNfb2JqLAorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjICk7CitleHRlcm4gdm9pZCBfX2ttcF9yZWFwX3Rhc2tfdGVhbXMoIHZvaWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX3VucmVmX3Rhc2tfdGVhbSgga21wX3Rhc2tfdGVhbV90ICp0YXNrX3RlYW0sIGttcF9pbmZvX3QgKnRocmVhZCApOworZXh0ZXJuIHZvaWQgX19rbXBfd2FpdF90b191bnJlZl90YXNrX3RlYW1zKCB2b2lkICk7CitleHRlcm4gdm9pZCBfX2ttcF90YXNrX3RlYW1fc2V0dXAgKCBrbXBfaW5mb190ICp0aGlzX3Rociwga21wX3RlYW1fdCAqdGVhbSApOworZXh0ZXJuIHZvaWQgX19rbXBfdGFza190ZWFtX3N5bmMgICgga21wX2luZm9fdCAqdGhpc190aHIsIGttcF90ZWFtX3QgKnRlYW0gKTsKK2V4dGVybiB2b2lkIF9fa21wX3Rhc2tfdGVhbV93YWl0ICAoIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBrbXBfdGVhbV90ICp0ZWFtCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCB2b2lkICogaXR0X3N5bmNfb2JqCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworKTsKK2V4dGVybiB2b2lkIF9fa21wX3Rhc2tpbmdfYmFycmllcigga21wX3RlYW1fdCAqdGVhbSwga21wX2luZm9fdCAqdGhyZWFkLCBpbnQgZ3RpZCApOworCisjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKworZXh0ZXJuIGludCAgX19rbXBfaXNfYWRkcmVzc19tYXBwZWQoIHZvaWQgKmFkZHIgKTsKK2V4dGVybiBrbXBfdWludDY0IF9fa21wX2hhcmR3YXJlX3RpbWVzdGFtcCh2b2lkKTsKKworI2lmIEtNUF9PU19VTklYCitleHRlcm4gaW50ICBfX2ttcF9yZWFkX2Zyb21fZmlsZSggY2hhciBjb25zdCAqcGF0aCwgY2hhciBjb25zdCAqZm9ybWF0LCAuLi4gKTsKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8vCisvLyBBc3NlbWJseSByb3V0aW5lcyB0aGF0IGhhdmUgbm8gY29tcGlsZXIgaW50cmluc2ljIHJlcGxhY2VtZW50CisvLworCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCitleHRlcm4gdm9pZCAgICAgICBfX2ttcF9xdWVyeV9jcHVpZCgga21wX2NwdWluZm9fdCAqcCApOworCisjZGVmaW5lIF9fa21wX2xvYWRfbXhjc3IocCkgX21tX3NldGNzcigqKHApKQorc3RhdGljIGlubGluZSB2b2lkIF9fa21wX3N0b3JlX214Y3NyKCBrbXBfdWludDMyICpwICkgeyAqcCA9IF9tbV9nZXRjc3IoKTsgfQorCitleHRlcm4gdm9pZCBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkKCBrbXBfaW50MTYgKnAgKTsKK2V4dGVybiB2b2lkIF9fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkKCBrbXBfaW50MTYgKnAgKTsKK2V4dGVybiB2b2lkIF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQoKTsKKyMgZGVmaW5lIEtNUF9YODZfTVhDU1JfTUFTSyAgICAgIDB4ZmZmZmZmYzAgICAvKiBpZ25vcmUgc3RhdHVzIGZsYWdzICg2IGxzYikgKi8KKworI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworZXh0ZXJuIGludCBfX2ttcF9pbnZva2VfbWljcm90YXNrKCBtaWNyb3Rhc2tfdCBwa2ZuLCBpbnQgZ3RpZCwgaW50IG5wciwgaW50IGFyZ2MsIHZvaWQgKmFyZ3ZbXSApOworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitLTVBfRVhQT1JUIHZvaWQgICBfX2ttcGNfYmVnaW4gICAgICAgICAgICAgICAgKCBpZGVudF90ICosIGttcF9pbnQzMiBmbGFncyApOworS01QX0VYUE9SVCB2b2lkICAgX19rbXBjX2VuZCAgICAgICAgICAgICAgICAgICggaWRlbnRfdCAqICk7CisKK0tNUF9FWFBPUlQgdm9pZCAgIF9fa21wY190aHJlYWRwcml2YXRlX3JlZ2lzdGVyX3ZlYyAoIGlkZW50X3QgKiwgdm9pZCAqIGRhdGEsIGttcGNfY3Rvcl92ZWMgY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wY19jY3Rvcl92ZWMgY2N0b3IsIGttcGNfZHRvcl92ZWMgZHRvciwgc2l6ZV90IHZlY3Rvcl9sZW5ndGggKTsKK0tNUF9FWFBPUlQgdm9pZCAgIF9fa21wY190aHJlYWRwcml2YXRlX3JlZ2lzdGVyICAgICAoIGlkZW50X3QgKiwgdm9pZCAqIGRhdGEsIGttcGNfY3RvciBjdG9yLCBrbXBjX2NjdG9yIGNjdG9yLCBrbXBjX2R0b3IgZHRvciApOworS01QX0VYUE9SVCB2b2lkICogX19rbXBjX3RocmVhZHByaXZhdGUgICAgICAgICAgICAgICggaWRlbnRfdCAqLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwgdm9pZCAqIGRhdGEsIHNpemVfdCBzaXplICk7CisKK0tNUF9FWFBPUlQga21wX2ludDMyICBfX2ttcGNfZ2xvYmFsX3RocmVhZF9udW0gICggaWRlbnRfdCAqICk7CitLTVBfRVhQT1JUIGttcF9pbnQzMiAgX19rbXBjX2dsb2JhbF9udW1fdGhyZWFkcyAoIGlkZW50X3QgKiApOworS01QX0VYUE9SVCBrbXBfaW50MzIgIF9fa21wY19ib3VuZF90aHJlYWRfbnVtICAgKCBpZGVudF90ICogKTsKK0tNUF9FWFBPUlQga21wX2ludDMyICBfX2ttcGNfYm91bmRfbnVtX3RocmVhZHMgICggaWRlbnRfdCAqICk7CisKK0tNUF9FWFBPUlQga21wX2ludDMyICBfX2ttcGNfb2tfdG9fZm9yayAgICAgKCBpZGVudF90ICogKTsKK0tNUF9FWFBPUlQgdm9pZCAgIF9fa21wY19mb3JrX2NhbGwgICAgICAgICAgKCBpZGVudF90ICosIGttcF9pbnQzMiBuYXJncywga21wY19taWNybyBtaWNyb3Rhc2ssIC4uLiApOworCitLTVBfRVhQT1JUIHZvaWQgICBfX2ttcGNfc2VyaWFsaXplZF9wYXJhbGxlbCAgICAgKCBpZGVudF90ICosIGttcF9pbnQzMiBnbG9iYWxfdGlkICk7CitLTVBfRVhQT1JUIHZvaWQgICBfX2ttcGNfZW5kX3NlcmlhbGl6ZWRfcGFyYWxsZWwgKCBpZGVudF90ICosIGttcF9pbnQzMiBnbG9iYWxfdGlkICk7CisKK0tNUF9FWFBPUlQgdm9pZCAgIF9fa21wY19mbHVzaCAgICAgICAgICAgICAgKCBpZGVudF90ICosIC4uLiApOworS01QX0VYUE9SVCB2b2lkICAgX19rbXBjX2JhcnJpZXIgICAgICAgICAgICAoIGlkZW50X3QgKiwga21wX2ludDMyIGdsb2JhbF90aWQgKTsKK0tNUF9FWFBPUlQga21wX2ludDMyICBfX2ttcGNfbWFzdGVyICAgICAgICAgKCBpZGVudF90ICosIGttcF9pbnQzMiBnbG9iYWxfdGlkICk7CitLTVBfRVhQT1JUIHZvaWQgICBfX2ttcGNfZW5kX21hc3RlciAgICAgICAgICggaWRlbnRfdCAqLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApOworS01QX0VYUE9SVCB2b2lkICAgX19rbXBjX29yZGVyZWQgICAgICAgICAgICAoIGlkZW50X3QgKiwga21wX2ludDMyIGdsb2JhbF90aWQgKTsKK0tNUF9FWFBPUlQgdm9pZCAgIF9fa21wY19lbmRfb3JkZXJlZCAgICAgICAgKCBpZGVudF90ICosIGttcF9pbnQzMiBnbG9iYWxfdGlkICk7CitLTVBfRVhQT1JUIHZvaWQgICBfX2ttcGNfY3JpdGljYWwgICAgICAgICAgICggaWRlbnRfdCAqLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2NyaXRpY2FsX25hbWUgKiApOworS01QX0VYUE9SVCB2b2lkICAgX19rbXBjX2VuZF9jcml0aWNhbCAgICAgICAoIGlkZW50X3QgKiwga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9jcml0aWNhbF9uYW1lICogKTsKKworS01QX0VYUE9SVCBrbXBfaW50MzIgIF9fa21wY19iYXJyaWVyX21hc3RlciAoIGlkZW50X3QgKiwga21wX2ludDMyIGdsb2JhbF90aWQgKTsKK0tNUF9FWFBPUlQgdm9pZCAgIF9fa21wY19lbmRfYmFycmllcl9tYXN0ZXIgKCBpZGVudF90ICosIGttcF9pbnQzMiBnbG9iYWxfdGlkICk7CisKK0tNUF9FWFBPUlQga21wX2ludDMyICBfX2ttcGNfYmFycmllcl9tYXN0ZXJfbm93YWl0ICggaWRlbnRfdCAqLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApOworCitLTVBfRVhQT1JUIGttcF9pbnQzMiAgX19rbXBjX3NpbmdsZSAgICAgICAgICggaWRlbnRfdCAqLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApOworS01QX0VYUE9SVCB2b2lkICAgX19rbXBjX2VuZF9zaW5nbGUgICAgICAgICAoIGlkZW50X3QgKiwga21wX2ludDMyIGdsb2JhbF90aWQgKTsKKworS01QX0VYUE9SVCB2b2lkIEtNUENfRk9SX1NUQVRJQ19JTklUICAgICggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2ludDMyIHNjaGVkdHlwZSwga21wX2ludDMyICpwbGFzdGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50ICpwbG93ZXIsIGttcF9pbnQgKnB1cHBlciwga21wX2ludCAqcHN0cmlkZSwga21wX2ludCBpbmNyLCBrbXBfaW50IGNodW5rICk7CisKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfZm9yX3N0YXRpY19maW5pICAoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQgKTsKKworS01QX0VYUE9SVCB2b2lkIF9fa21wY19jb3B5cHJpdmF0ZSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwgc2l6ZV90IGNweV9zaXplLCB2b2lkICpjcHlfZGF0YSwgdm9pZCgqY3B5X2Z1bmMpKHZvaWQqLHZvaWQqKSwga21wX2ludDMyIGRpZGl0ICk7CisKK2V4dGVybiB2b2lkIEtNUENfU0VUX05VTV9USFJFQURTICAgICAgICAoIGludCBhcmcgKTsKK2V4dGVybiB2b2lkIEtNUENfU0VUX0RZTkFNSUMgICAgICAgICAgICAoIGludCBmbGFnICk7CitleHRlcm4gdm9pZCBLTVBDX1NFVF9ORVNURUQgICAgICAgICAgICAgKCBpbnQgZmxhZyApOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIFRhc2txIGludGVyZmFjZSByb3V0aW5lcworICovCisKK0tNUF9FWFBPUlQga21wY190aHVua190ICogX19rbXBjX3Rhc2txIChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3Rhc2tfdCB0YXNrcV90YXNrLCBzaXplX3Qgc2l6ZW9mX3RodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplb2Zfc2hhcmVkcywga21wX2ludDMyIGZsYWdzLCBrbXBjX3NoYXJlZF92YXJzX3QgKipzaGFyZWRzKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfZW5kX3Rhc2txIChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3RodW5rX3QgKnRodW5rKTsKK0tNUF9FWFBPUlQga21wX2ludDMyIF9fa21wY190YXNrIChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3RodW5rX3QgKnRodW5rKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfdGFza3FfdGFzayAoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190aHVua190ICp0aHVuaywga21wX2ludDMyIHN0YXR1cyk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX2VuZF90YXNrcV90YXNrIChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3RodW5rX3QgKnRodW5rKTsKK0tNUF9FWFBPUlQga21wY190aHVua190ICogX19rbXBjX3Rhc2tfYnVmZmVyIChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3RodW5rX3QgKnRhc2txX3RodW5rLCBrbXBjX3Rhc2tfdCB0YXNrKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBPTVBfMzBfRU5BQkxFRAorLyoKKyAqIE9NUCAzLjAgdGFza2luZyBpbnRlcmZhY2Ugcm91dGluZXMKKyAqLworCitLTVBfRVhQT1JUIGttcF9pbnQzMgorX19rbXBjX29tcF90YXNrKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqIG5ld190YXNrICk7CitLTVBfRVhQT1JUIGttcF90YXNrX3QqCitfX2ttcGNfb21wX3Rhc2tfYWxsb2MoIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplb2Zfa21wX3Rhc2tfdCwgc2l6ZV90IHNpemVvZl9zaGFyZWRzLAorICAgICAgICAgICAgICAgICAgICAgICBrbXBfcm91dGluZV9lbnRyeV90IHRhc2tfZW50cnkgKTsKK0tNUF9FWFBPUlQgdm9pZAorX19rbXBjX29tcF90YXNrX2JlZ2luX2lmMCggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKiB0YXNrICk7CitLTVBfRVhQT1JUIHZvaWQKK19fa21wY19vbXBfdGFza19jb21wbGV0ZV9pZjAoIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICp0YXNrICk7CitLTVBfRVhQT1JUIGttcF9pbnQzMgorX19rbXBjX29tcF90YXNrX3BhcnRzKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqIG5ld190YXNrICk7CitLTVBfRVhQT1JUIGttcF9pbnQzMgorX19rbXBjX29tcF90YXNrd2FpdCggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQgKTsKKworS01QX0VYUE9SVCBrbXBfaW50MzIKK19fa21wY19vbXBfdGFza3lpZWxkKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwgaW50IGVuZF9wYXJ0ICk7CisKKyNpZiBUQVNLX1VOVVNFRAordm9pZCBfX2ttcGNfb21wX3Rhc2tfYmVnaW4oIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICogdGFzayApOwordm9pZCBfX2ttcGNfb21wX3Rhc2tfY29tcGxldGUoIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICp0YXNrICk7CisjZW5kaWYgLy8gVEFTS19VTlVTRUQKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKworI2lmIE9NUF80MF9FTkFCTEVECitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX3Rhc2tncm91cCggaWRlbnRfdCAqIGxvYywgaW50IGd0aWQgKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfZW5kX3Rhc2tncm91cCggaWRlbnRfdCAqIGxvYywgaW50IGd0aWQgKTsKKworS01QX0VYUE9SVCBrbXBfaW50MzIgX19rbXBjX29tcF90YXNrX3dpdGhfZGVwcyAoIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICogbmV3X3Rhc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIG5kZXBzLCBrbXBfZGVwZW5kX2luZm9fdCAqZGVwX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIG5kZXBzX25vYWxpYXMsIGttcF9kZXBlbmRfaW5mb190ICpub2FsaWFzX2RlcF9saXN0ICk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX29tcF93YWl0X2RlcHMgKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyIG5kZXBzLCBrbXBfZGVwZW5kX2luZm9fdCAqZGVwX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgbmRlcHNfbm9hbGlhcywga21wX2RlcGVuZF9pbmZvX3QgKm5vYWxpYXNfZGVwX2xpc3QgKTsKK2V4dGVybiB2b2lkIF9fa21wX3JlbGVhc2VfZGVwcyAoIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza2RhdGFfdCAqdGFzayApOworCisjZW5kaWYKKworI2lmIE9NUF80MF9FTkFCTEVECitLTVBfRVhQT1JUIGttcF9pbnQzMiBfX2ttcGNfY2FuY2VsKGlkZW50X3QqIGxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgY25jbF9raW5kKTsKK0tNUF9FWFBPUlQga21wX2ludDMyIF9fa21wY19jYW5jZWxsYXRpb25wb2ludChpZGVudF90KiBsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyIGNuY2xfa2luZCk7CitLTVBfRVhQT1JUIGttcF9pbnQzMiBfX2ttcGNfY2FuY2VsX2JhcnJpZXIoaWRlbnRfdCogbG9jX3JlZiwga21wX2ludDMyIGd0aWQpOworS01QX0VYUE9SVCBpbnQgX19rbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMoaW50IGNhbmNlbF9raW5kKTsKKyNlbmRpZgorCisvKgorICogTG9jayBpbnRlcmZhY2Ugcm91dGluZXMgKGZhc3QgdmVyc2lvbnMgd2l0aCBndGlkIHBhc3NlZCBpbikKKyAqLworS01QX0VYUE9SVCB2b2lkIF9fa21wY19pbml0X2xvY2soIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsICB2b2lkICoqdXNlcl9sb2NrICk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX2luaXRfbmVzdF9sb2NrKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCB2b2lkICoqdXNlcl9sb2NrICk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX2Rlc3Ryb3lfbG9jayggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKnVzZXJfbG9jayApOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19kZXN0cm95X25lc3RfbG9jayggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKnVzZXJfbG9jayApOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19zZXRfbG9jayggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKnVzZXJfbG9jayApOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19zZXRfbmVzdF9sb2NrKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCB2b2lkICoqdXNlcl9sb2NrICk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX3Vuc2V0X2xvY2soIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKip1c2VyX2xvY2sgKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfdW5zZXRfbmVzdF9sb2NrKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCB2b2lkICoqdXNlcl9sb2NrICk7CitLTVBfRVhQT1JUIGludCBfX2ttcGNfdGVzdF9sb2NrKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCB2b2lkICoqdXNlcl9sb2NrICk7CitLTVBfRVhQT1JUIGludCBfX2ttcGNfdGVzdF9uZXN0X2xvY2soIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKip1c2VyX2xvY2sgKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBJbnRlcmZhY2UgdG8gZmFzdCBzY2FsYWJsZSByZWR1Y2UgbWV0aG9kcyByb3V0aW5lcworICovCisKK0tNUF9FWFBPUlQga21wX2ludDMyIF9fa21wY19yZWR1Y2Vfbm93YWl0KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBudW1fdmFycywgc2l6ZV90IHJlZHVjZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnJlZHVjZV9kYXRhLCB2b2lkICgqcmVkdWNlX2Z1bmMpKHZvaWQgKmxoc19kYXRhLCB2b2lkICpyaHNfZGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2NyaXRpY2FsX25hbWUgKmxjayApOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19lbmRfcmVkdWNlX25vd2FpdCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2NyaXRpY2FsX25hbWUgKmxjayApOworS01QX0VYUE9SVCBrbXBfaW50MzIgX19rbXBjX3JlZHVjZSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBudW1fdmFycywgc2l6ZV90IHJlZHVjZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcmVkdWNlX2RhdGEsIHZvaWQgKCpyZWR1Y2VfZnVuYykodm9pZCAqbGhzX2RhdGEsIHZvaWQgKnJoc19kYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9jcml0aWNhbF9uYW1lICpsY2sgKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfZW5kX3JlZHVjZSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2NyaXRpY2FsX25hbWUgKmxjayApOworCisvKgorICogaW50ZXJuYWwgZmFzdCByZWR1Y3Rpb24gcm91dGluZXMKKyAqLworCitleHRlcm4gUEFDS0VEX1JFRFVDVElPTl9NRVRIT0RfVAorX19rbXBfZGV0ZXJtaW5lX3JlZHVjdGlvbl9tZXRob2QoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIG51bV92YXJzLCBzaXplX3QgcmVkdWNlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcmVkdWNlX2RhdGEsIHZvaWQgKCpyZWR1Y2VfZnVuYykodm9pZCAqbGhzX2RhdGEsIHZvaWQgKnJoc19kYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfY3JpdGljYWxfbmFtZSAqbGNrICk7CisKKy8vIHRoaXMgZnVuY3Rpb24gaXMgZm9yIHRlc3Rpbmcgc2V0L2dldC9kZXRlcm1pbmUgcmVkdWNlIG1ldGhvZAorS01QX0VYUE9SVCBrbXBfaW50MzIgX19rbXBfZ2V0X3JlZHVjZV9tZXRob2QoIHZvaWQgKTsKKworS01QX0VYUE9SVCBrbXBfdWludDY0IF9fa21wY19nZXRfdGFza2lkKCk7CitLTVBfRVhQT1JUIGttcF91aW50NjQgX19rbXBjX2dldF9wYXJlbnRfdGFza2lkKCk7CisKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfcGxhY2VfdGhyZWFkcyhpbnQsaW50LGludCk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8vIEMrKyBwb3J0CisvLyBtaXNzaW5nICdleHRlcm4gIkMiJyBkZWNsYXJhdGlvbnMKKworS01QX0VYUE9SVCBrbXBfaW50MzIgX19rbXBjX2luX3BhcmFsbGVsKCBpZGVudF90ICpsb2MgKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfcG9wX251bV90aHJlYWRzKCAgaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19wdXNoX251bV90aHJlYWRzKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBfaW50MzIgbnVtX3RocmVhZHMgKTsKKworI2lmIE9NUF80MF9FTkFCTEVECitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX3B1c2hfcHJvY19iaW5kKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBpbnQgcHJvY19iaW5kICk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX3B1c2hfbnVtX3RlYW1zKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBfaW50MzIgbnVtX3RlYW1zLCBrbXBfaW50MzIgbnVtX3RocmVhZHMgKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfZm9ya190ZWFtcyhpZGVudF90ICpsb2MsIGttcF9pbnQzMiBhcmdjLCBrbXBjX21pY3JvIG1pY3JvdGFzaywgLi4uKTsKKworI2VuZGlmCisKK0tNUF9FWFBPUlQgdm9pZCoKK19fa21wY190aHJlYWRwcml2YXRlX2NhY2hlZCggaWRlbnRfdCAqIGxvYywga21wX2ludDMyIGdsb2JhbF90aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiBkYXRhLCBzaXplX3Qgc2l6ZSwgdm9pZCAqKiogY2FjaGUgKTsKKworLy8gU3ltYm9scyBmb3IgTVMgbXV0dWFsIGRldGVjdGlvbi4KK2V4dGVybiBpbnQgX1lvdV9tdXN0X2xpbmtfd2l0aF9leGFjdGx5X29uZV9PcGVuTVBfbGlicmFyeTsKK2V4dGVybiBpbnQgX1lvdV9tdXN0X2xpbmtfd2l0aF9JbnRlbF9PcGVuTVBfbGlicmFyeTsKKyNpZiBLTVBfT1NfV0lORE9XUyAmJiAoIEtNUF9WRVJTSU9OX01BSk9SID4gNCApCisgICAgZXh0ZXJuIGludCBfWW91X211c3RfbGlua193aXRoX01pY3Jvc29mdF9PcGVuTVBfbGlicmFyeTsKKyNlbmRpZgorCisKKy8vIFRoZSByb3V0aW5lcyBiZWxvdyBhcmUgbm90IGV4cG9ydGVkLgorLy8gQ29uc2lkZXIgbWFraW5nIHRoZW0gJ3N0YXRpYycgaW4gY29ycmVzcG9uZGluZyBzb3VyY2UgZmlsZXMuCit2b2lkCitrbXBfdGhyZWFkcHJpdmF0ZV9pbnNlcnRfcHJpdmF0ZV9kYXRhKCBpbnQgZ3RpZCwgdm9pZCAqcGNfYWRkciwgdm9pZCAqZGF0YV9hZGRyLCBzaXplX3QgcGNfc2l6ZSApOworc3RydWN0IHByaXZhdGVfY29tbW9uICoKK2ttcF90aHJlYWRwcml2YXRlX2luc2VydCggaW50IGd0aWQsIHZvaWQgKnBjX2FkZHIsIHZvaWQgKmRhdGFfYWRkciwgc2l6ZV90IHBjX3NpemUgKTsKKworLy8KKy8vIG9tcGNfLCBrbXBjXyBlbnRyaWVzIG1vdmVkIGZyb20gb21wLmguCisvLworI2lmIEtNUF9PU19XSU5ET1dTCisjICAgZGVmaW5lIEtNUENfQ09OVkVOVElPTiBfX2NkZWNsCisjZWxzZQorIyAgIGRlZmluZSBLTVBDX0NPTlZFTlRJT04KKyNlbmRpZgorCisjaWYgT01QXzMwX0VOQUJMRUQKKworI2lmbmRlZiBfX09NUF9ICit0eXBlZGVmIGVudW0gb21wX3NjaGVkX3QgeworICAgIG9tcF9zY2hlZF9zdGF0aWMgID0gMSwKKyAgICBvbXBfc2NoZWRfZHluYW1pYyA9IDIsCisgICAgb21wX3NjaGVkX2d1aWRlZCAgPSAzLAorICAgIG9tcF9zY2hlZF9hdXRvICAgID0gNAorfSBvbXBfc2NoZWRfdDsKK3R5cGVkZWYgdm9pZCAqIGttcF9hZmZpbml0eV9tYXNrX3Q7CisjZW5kaWYKKworS01QX0VYUE9SVCB2b2lkIEtNUENfQ09OVkVOVElPTiBvbXBjX3NldF9tYXhfYWN0aXZlX2xldmVscyhpbnQpOworS01QX0VYUE9SVCB2b2lkIEtNUENfQ09OVkVOVElPTiBvbXBjX3NldF9zY2hlZHVsZShvbXBfc2NoZWRfdCwgaW50KTsKK0tNUF9FWFBPUlQgaW50ICBLTVBDX0NPTlZFTlRJT04gb21wY19nZXRfYW5jZXN0b3JfdGhyZWFkX251bShpbnQpOworS01QX0VYUE9SVCBpbnQgIEtNUENfQ09OVkVOVElPTiBvbXBjX2dldF90ZWFtX3NpemUoaW50KTsKK0tNUF9FWFBPUlQgaW50ICBLTVBDX0NPTlZFTlRJT04ga21wY19zZXRfYWZmaW5pdHlfbWFza19wcm9jKGludCwga21wX2FmZmluaXR5X21hc2tfdCAqKTsKK0tNUF9FWFBPUlQgaW50ICBLTVBDX0NPTlZFTlRJT04ga21wY191bnNldF9hZmZpbml0eV9tYXNrX3Byb2MoaW50LCBrbXBfYWZmaW5pdHlfbWFza190ICopOworS01QX0VYUE9SVCBpbnQgIEtNUENfQ09OVkVOVElPTiBrbXBjX2dldF9hZmZpbml0eV9tYXNrX3Byb2MoaW50LCBrbXBfYWZmaW5pdHlfbWFza190ICopOworCisjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKworS01QX0VYUE9SVCB2b2lkIEtNUENfQ09OVkVOVElPTiBrbXBjX3NldF9zdGFja3NpemUoaW50KTsKK0tNUF9FWFBPUlQgdm9pZCBLTVBDX0NPTlZFTlRJT04ga21wY19zZXRfc3RhY2tzaXplX3Moc2l6ZV90KTsKK0tNUF9FWFBPUlQgdm9pZCBLTVBDX0NPTlZFTlRJT04ga21wY19zZXRfbGlicmFyeShpbnQpOworS01QX0VYUE9SVCB2b2lkIEtNUENfQ09OVkVOVElPTiBrbXBjX3NldF9kZWZhdWx0cyhjaGFyIGNvbnN0ICopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogS01QX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2FmZmluaXR5LmNwcCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9hZmZpbml0eS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgyZWM5ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9hZmZpbml0eS5jcHAKQEAgLTAsMCArMSw0NTQ2IEBACisvKgorICoga21wX2FmZmluaXR5LmNwcCAtLSBhZmZpbml0eSBtYW5hZ2VtZW50CisgKiAkUmV2aXNpb246IDQyODEwICQKKyAqICREYXRlOiAyMDEzLTExLTA3IDEyOjA2OjMzIC0wNjAwIChUaHUsIDA3IE5vdiAyMDEzKSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorI2luY2x1ZGUgImttcF9pby5oIgorI2luY2x1ZGUgImttcF9zdHIuaCIKKworCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorCisvLworLy8gUHJpbnQgdGhlIGFmZmluaXR5IG1hc2sgdG8gdGhlIGNoYXJhY3RlciBhcnJheSBpbiBhIHByZXR0eSBmb3JtYXQuCisvLworY2hhciAqCitfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKGNoYXIgKmJ1ZiwgaW50IGJ1Zl9sZW4sIGttcF9hZmZpbl9tYXNrX3QgKm1hc2spCit7CisgICAgS01QX0FTU0VSVChidWZfbGVuID49IDQwKTsKKyAgICBjaGFyICpzY2FuID0gYnVmOworICAgIGNoYXIgKmVuZCA9IGJ1ZiArIGJ1Zl9sZW4gLSAxOworCisgICAgLy8KKyAgICAvLyBGaW5kIGZpcnN0IGVsZW1lbnQgLyBjaGVjayBmb3IgZW1wdHkgc2V0LgorICAgIC8vCisgICAgc2l6ZV90IGk7CisgICAgZm9yIChpID0gMDsgaSA8IEtNUF9DUFVfU0VUU0laRTsgaSsrKSB7CisgICAgICAgIGlmIChLTVBfQ1BVX0lTU0VUKGksIG1hc2spKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaSA9PSBLTVBfQ1BVX1NFVFNJWkUpIHsKKyAgICAgICAgc3ByaW50ZihzY2FuLCAiezxlbXB0eT59Iik7CisgICAgICAgIHdoaWxlICgqc2NhbiAhPSAnXDAnKSBzY2FuKys7CisgICAgICAgIEtNUF9BU1NFUlQoc2NhbiA8PSBlbmQpOworICAgICAgICByZXR1cm4gYnVmOworICAgIH0KKworICAgIHNwcmludGYoc2NhbiwgInslbGQiLCBpKTsKKyAgICB3aGlsZSAoKnNjYW4gIT0gJ1wwJykgc2NhbisrOworICAgIGkrKzsKKyAgICBmb3IgKDsgaSA8IEtNUF9DUFVfU0VUU0laRTsgaSsrKSB7CisgICAgICAgIGlmICghIEtNUF9DUFVfSVNTRVQoaSwgbWFzaykpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQ2hlY2sgZm9yIGJ1ZmZlciBvdmVyZmxvdy4gIEEgc3RyaW5nIG9mIHRoZSBmb3JtICIsPG4+IiB3aWxsIGhhdmUKKyAgICAgICAgLy8gYXQgbW9zdCAxMCBjaGFyYWN0ZXJzLCBwbHVzIHdlIHdhbnQgdG8gbGVhdmUgcm9vbSB0byBwcmludCAiLC4uLn0iCisgICAgICAgIC8vIGlmIHRoZSBzZXQgaXMgdG9vIGxhcmdlIHRvIHByaW50IGZvciBhIHRvdGFsIG9mIDE1IGNoYXJhY3RlcnMuCisgICAgICAgIC8vIFdlIGFscmVhZHkgbGVmdCByb29tIGZvciAnXDAnIGluIHNldHRpbmcgZW5kLgorICAgICAgICAvLworICAgICAgICBpZiAoZW5kIC0gc2NhbiA8IDE1KSB7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHNwcmludGYoc2NhbiwgIiwlLWxkIiwgaSk7CisgICAgICAgIHdoaWxlICgqc2NhbiAhPSAnXDAnKSBzY2FuKys7CisgICAgfQorICAgIGlmIChpIDwgS01QX0NQVV9TRVRTSVpFKSB7CisgICAgICAgIHNwcmludGYoc2NhbiwgIiwuLi4iKTsKKyAgICAgICAgd2hpbGUgKCpzY2FuICE9ICdcMCcpIHNjYW4rKzsKKyAgICB9CisgICAgc3ByaW50ZihzY2FuLCAifSIpOworICAgIHdoaWxlICgqc2NhbiAhPSAnXDAnKSBzY2FuKys7CisgICAgS01QX0FTU0VSVChzY2FuIDw9IGVuZCk7CisgICAgcmV0dXJuIGJ1ZjsKK30KKworCit2b2lkCitfX2ttcF9hZmZpbml0eV9lbnRpcmVfbWFjaGluZV9tYXNrKGttcF9hZmZpbl9tYXNrX3QgKm1hc2spCit7CisgICAgS01QX0NQVV9aRVJPKG1hc2spOworCisjIGlmIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4Nl82NAorCisgICAgaWYgKF9fa21wX251bV9wcm9jX2dyb3VwcyA+IDEpIHsKKyAgICAgICAgaW50IGdyb3VwOworICAgICAgICBzdHJ1Y3QgR1JPVVBfQUZGSU5JVFkgZ2E7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfR2V0QWN0aXZlUHJvY2Vzc29yQ291bnQgIT0gTlVMTCk7CisgICAgICAgIGZvciAoZ3JvdXAgPSAwOyBncm91cCA8IF9fa21wX251bV9wcm9jX2dyb3VwczsgZ3JvdXArKykgeworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBpbnQgbnVtID0gX19rbXBfR2V0QWN0aXZlUHJvY2Vzc29yQ291bnQoZ3JvdXApOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisgICAgICAgICAgICAgICAgS01QX0NQVV9TRVQoaSArIGdyb3VwICogKENIQVJfQklUICogc2l6ZW9mKERXT1JEX1BUUikpLCBtYXNrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisKKyMgZW5kaWYgLyogS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2XzY0ICovCisKKyAgICB7CisgICAgICAgIGludCBwcm9jOworICAgICAgICBmb3IgKHByb2MgPSAwOyBwcm9jIDwgX19rbXBfeHByb2M7IHByb2MrKykgeworICAgICAgICAgICAgS01QX0NQVV9TRVQocHJvYywgbWFzayk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworLy8KKy8vIEluIExpbnV4KiBPUyBkZWJ1ZyAmIGNvdmVyICgtTzApIGJ1aWxkcywgd2UgbmVlZCB0byBhdm9pZCBpbmxpbmUgbWVtYmVyCisvLyBmdW5jdGlvbnMuCisvLworLy8gVGhlIGljYyBjb2RlZ2VuIGVtaXRzIHNlY3Rpb25zIHdpdGggZXh0cmVtZWx5IGxvbmcgbmFtZXMsIG9mIHRoZSBmb3JtCisvLyAiLmdudS5saW5rb25jZS48bWFuZ2xlZF9uYW1lPiIuICBUaGVyZSBzZWVtcyB0byBoYXZlIGJlZW4gYSBsaW5rZXIgYnVnCisvLyBpbnRyb2R1Y2VkIGJldHdlZW4gR05VIGxkIHZlcnNpb24gMi4xNC45MC4wLjQgYW5kIDIuMTUuOTIuMC4yIGludm9sdmluZworLy8gc29tZSBzb3J0IG9mIG1lbW9yeSBjb3JydXB0aW9uIG9yIHRhYmxlIG92ZXJmbG93IHRoYXQgaXMgdHJpZ2dlcmVkIGJ5CisvLyB0aGVzZSBsb25nIHN0cmluZ3MuICBJIGNoZWNrZWQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBsaW5rZXIgLQorLy8gR05VIGxkIChMaW51eCogT1MvR05VIEJpbnV0aWxzKSAyLjE4LjUwLjAuNy4yMDA4MDQyMiAtIGFuZCB0aGUgYnVnIGlzIG5vdAorLy8gZml4ZWQuCisvLworLy8gVW5mb3J0dW5hdGVseSwgbXkgYXR0ZW1wdHMgdG8gcmVwcm9kdWNlIGl0IGluIGEgc21hbGxlciBleGFtcGxlIGhhdmUKKy8vIGZhaWxlZCAtIEknbSBub3Qgc3VyZSB3aGF0IHRoZSBwcm9zcGVjdHMgYXJlIG9mIGdldHRpbmcgaXQgZml4ZWQKKy8vIHByb3Blcmx5IC0gYnV0IHdlIG5lZWQgYSByZXByb2R1Y2VyIHNtYWxsZXIgdGhhbiBhbGwgb2YgbGliaW9tcC4KKy8vCisvLyBXb3JrIGFyb3VuZCB0aGUgcHJvYmxlbSBieSBhdm9pZGluZyBpbmxpbmUgY29uc3RydWN0b3JzIGluIHN1Y2ggYnVpbGRzLgorLy8gV2UgZG8gdGhpcyBmb3IgYWxsIHBsYXRmb3Jtcywgbm90IGp1c3QgTGludXgqIE9TIC0gbm9uLWlubGluZSBmdW5jdGlvbnMgYXJlCisvLyBtb3JlIGRlYnVnZ2FibGUgYW5kIHByb3ZpZGUgYmV0dGVyIGNvdmVyYWdlIGludG8gdGhhbiBpbmxpbmUgZnVuY3Rpb25zLgorLy8gVXNlIGlubGluZSBmdW5jdGlvbnMgaW4gc2hpcHBpbmcgbGlicywgZm9yIHBlcmZvcm1hbmNlLgorLy8KKworIyBpZiAhZGVmaW5lZChLTVBfREVCVUcpICYmICFkZWZpbmVkKENPVkVSKQorCitjbGFzcyBBZGRyZXNzIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgbWF4RGVwdGggPSAzMjsKKyAgICB1bnNpZ25lZCBsYWJlbHNbbWF4RGVwdGhdOworICAgIHVuc2lnbmVkIGNoaWxkTnVtc1ttYXhEZXB0aF07CisgICAgdW5zaWduZWQgZGVwdGg7CisgICAgdW5zaWduZWQgbGVhZGVyOworICAgIEFkZHJlc3ModW5zaWduZWQgX2RlcHRoKQorICAgICAgOiBkZXB0aChfZGVwdGgpLCBsZWFkZXIoRkFMU0UpIHsKKyAgICB9CisgICAgQWRkcmVzcyAmb3BlcmF0b3I9KGNvbnN0IEFkZHJlc3MgJmIpIHsKKyAgICAgICAgZGVwdGggPSBiLmRlcHRoOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZGVwdGg7IGkrKykgeworICAgICAgICAgICAgbGFiZWxzW2ldID0gYi5sYWJlbHNbaV07CisgICAgICAgICAgICBjaGlsZE51bXNbaV0gPSBiLmNoaWxkTnVtc1tpXTsKKyAgICAgICAgfQorICAgICAgICBsZWFkZXIgPSBGQUxTRTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgQWRkcmVzcyAmYikgY29uc3QgeworICAgICAgICBpZiAoZGVwdGggIT0gYi5kZXB0aCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGRlcHRoOyBpKyspCisgICAgICAgICAgICBpZihsYWJlbHNbaV0gIT0gYi5sYWJlbHNbaV0pCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgYm9vbCBpc0Nsb3NlKGNvbnN0IEFkZHJlc3MgJmIsIGludCBsZXZlbCkgY29uc3QgeworICAgICAgICBpZiAoZGVwdGggIT0gYi5kZXB0aCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCh1bnNpZ25lZClsZXZlbCA+PSBkZXB0aCkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgKGRlcHRoIC0gbGV2ZWwpOyBpKyspCisgICAgICAgICAgICBpZihsYWJlbHNbaV0gIT0gYi5sYWJlbHNbaV0pCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEFkZHJlc3MgJmIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICFvcGVyYXRvcj09KGIpOworICAgIH0KK307CisKK2NsYXNzIEFkZHJVbnNQYWlyIHsKK3B1YmxpYzoKKyAgICBBZGRyZXNzIGZpcnN0OworICAgIHVuc2lnbmVkIHNlY29uZDsKKyAgICBBZGRyVW5zUGFpcihBZGRyZXNzIF9maXJzdCwgdW5zaWduZWQgX3NlY29uZCkKKyAgICAgIDogZmlyc3QoX2ZpcnN0KSwgc2Vjb25kKF9zZWNvbmQpIHsKKyAgICB9CisgICAgQWRkclVuc1BhaXIgJm9wZXJhdG9yPShjb25zdCBBZGRyVW5zUGFpciAmYikKKyAgICB7CisgICAgICAgIGZpcnN0ID0gYi5maXJzdDsKKyAgICAgICAgc2Vjb25kID0gYi5zZWNvbmQ7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9Cit9OworCisjIGVsc2UKKworY2xhc3MgQWRkcmVzcyB7CitwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIG1heERlcHRoID0gMzI7CisgICAgdW5zaWduZWQgbGFiZWxzW21heERlcHRoXTsKKyAgICB1bnNpZ25lZCBjaGlsZE51bXNbbWF4RGVwdGhdOworICAgIHVuc2lnbmVkIGRlcHRoOworICAgIHVuc2lnbmVkIGxlYWRlcjsKKyAgICBBZGRyZXNzKHVuc2lnbmVkIF9kZXB0aCk7CisgICAgQWRkcmVzcyAmb3BlcmF0b3I9KGNvbnN0IEFkZHJlc3MgJmIpOworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBBZGRyZXNzICZiKSBjb25zdDsKKyAgICBib29sIGlzQ2xvc2UoY29uc3QgQWRkcmVzcyAmYiwgaW50IGxldmVsKSBjb25zdDsKKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgQWRkcmVzcyAmYikgY29uc3Q7Cit9OworCitBZGRyZXNzOjpBZGRyZXNzKHVuc2lnbmVkIF9kZXB0aCkKK3sKKyAgICBkZXB0aCA9IF9kZXB0aDsKKyAgICBsZWFkZXIgPSBGQUxTRTsKK30KKworQWRkcmVzcyAmQWRkcmVzczo6b3BlcmF0b3I9KGNvbnN0IEFkZHJlc3MgJmIpIHsKKyAgICBkZXB0aCA9IGIuZGVwdGg7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGRlcHRoOyBpKyspIHsKKyAgICAgICAgbGFiZWxzW2ldID0gYi5sYWJlbHNbaV07CisgICAgICAgIGNoaWxkTnVtc1tpXSA9IGIuY2hpbGROdW1zW2ldOworICAgIH0KKyAgICBsZWFkZXIgPSBGQUxTRTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK2Jvb2wgQWRkcmVzczo6b3BlcmF0b3I9PShjb25zdCBBZGRyZXNzICZiKSBjb25zdCB7CisgICAgaWYgKGRlcHRoICE9IGIuZGVwdGgpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZGVwdGg7IGkrKykKKyAgICAgICAgaWYobGFiZWxzW2ldICE9IGIubGFiZWxzW2ldKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEFkZHJlc3M6OmlzQ2xvc2UoY29uc3QgQWRkcmVzcyAmYiwgaW50IGxldmVsKSBjb25zdCB7CisgICAgaWYgKGRlcHRoICE9IGIuZGVwdGgpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoKHVuc2lnbmVkKWxldmVsID49IGRlcHRoKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgKGRlcHRoIC0gbGV2ZWwpOyBpKyspCisgICAgICAgIGlmKGxhYmVsc1tpXSAhPSBiLmxhYmVsc1tpXSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBBZGRyZXNzOjpvcGVyYXRvciE9KGNvbnN0IEFkZHJlc3MgJmIpIGNvbnN0IHsKKyAgICByZXR1cm4gIW9wZXJhdG9yPT0oYik7Cit9CisKK2NsYXNzIEFkZHJVbnNQYWlyIHsKK3B1YmxpYzoKKyAgICBBZGRyZXNzIGZpcnN0OworICAgIHVuc2lnbmVkIHNlY29uZDsKKyAgICBBZGRyVW5zUGFpcihBZGRyZXNzIF9maXJzdCwgdW5zaWduZWQgX3NlY29uZCk7CisgICAgQWRkclVuc1BhaXIgJm9wZXJhdG9yPShjb25zdCBBZGRyVW5zUGFpciAmYik7Cit9OworCitBZGRyVW5zUGFpcjo6QWRkclVuc1BhaXIoQWRkcmVzcyBfZmlyc3QsIHVuc2lnbmVkIF9zZWNvbmQpCisgIDogZmlyc3QoX2ZpcnN0KSwgc2Vjb25kKF9zZWNvbmQpCit7Cit9CisKK0FkZHJVbnNQYWlyICZBZGRyVW5zUGFpcjo6b3BlcmF0b3I9KGNvbnN0IEFkZHJVbnNQYWlyICZiKQoreworICAgIGZpcnN0ID0gYi5maXJzdDsKKyAgICBzZWNvbmQgPSBiLnNlY29uZDsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKKyMgZW5kaWYgLyogIWRlZmluZWQoS01QX0RFQlVHKSAmJiAhZGVmaW5lZChDT1ZFUikgKi8KKworCitzdGF0aWMgaW50CitfX2ttcF9hZmZpbml0eV9jbXBfQWRkcmVzc19sYWJlbHMoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKyAgICBjb25zdCBBZGRyZXNzICphYSA9IChjb25zdCBBZGRyZXNzICopJigoKEFkZHJVbnNQYWlyICopYSkKKyAgICAgIC0+Zmlyc3QpOworICAgIGNvbnN0IEFkZHJlc3MgKmJiID0gKGNvbnN0IEFkZHJlc3MgKikmKCgoQWRkclVuc1BhaXIgKiliKQorICAgICAgLT5maXJzdCk7CisgICAgdW5zaWduZWQgZGVwdGggPSBhYS0+ZGVwdGg7CisgICAgdW5zaWduZWQgaTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKGRlcHRoID09IGJiLT5kZXB0aCk7CisgICAgZm9yIChpICA9IDA7IGkgPCBkZXB0aDsgaSsrKSB7CisgICAgICAgIGlmIChhYS0+bGFiZWxzW2ldIDwgYmItPmxhYmVsc1tpXSkgcmV0dXJuIC0xOworICAgICAgICBpZiAoYWEtPmxhYmVsc1tpXSA+IGJiLT5sYWJlbHNbaV0pIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50CitfX2ttcF9hZmZpbml0eV9jbXBfQWRkcmVzc19jaGlsZF9udW0oY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKyAgICBjb25zdCBBZGRyZXNzICphYSA9IChjb25zdCBBZGRyZXNzICopJigoKEFkZHJVbnNQYWlyICopYSkKKyAgICAgIC0+Zmlyc3QpOworICAgIGNvbnN0IEFkZHJlc3MgKmJiID0gKGNvbnN0IEFkZHJlc3MgKikmKCgoQWRkclVuc1BhaXIgKiliKQorICAgICAgLT5maXJzdCk7CisgICAgdW5zaWduZWQgZGVwdGggPSBhYS0+ZGVwdGg7CisgICAgdW5zaWduZWQgaTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKGRlcHRoID09IGJiLT5kZXB0aCk7CisgICAgS01QX0RFQlVHX0FTU0VSVCgodW5zaWduZWQpX19rbXBfYWZmaW5pdHlfY29tcGFjdCA8PSBkZXB0aCk7CisgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9hZmZpbml0eV9jb21wYWN0ID49IDApOworICAgIGZvciAoaSA9IDA7IGkgPCAodW5zaWduZWQpX19rbXBfYWZmaW5pdHlfY29tcGFjdDsgaSsrKSB7CisgICAgICAgIGludCBqID0gZGVwdGggLSBpIC0gMTsKKyAgICAgICAgaWYgKGFhLT5jaGlsZE51bXNbal0gPCBiYi0+Y2hpbGROdW1zW2pdKSByZXR1cm4gLTE7CisgICAgICAgIGlmIChhYS0+Y2hpbGROdW1zW2pdID4gYmItPmNoaWxkTnVtc1tqXSkgcmV0dXJuIDE7CisgICAgfQorICAgIGZvciAoOyBpIDwgZGVwdGg7IGkrKykgeworICAgICAgICBpbnQgaiA9IGkgLSBfX2ttcF9hZmZpbml0eV9jb21wYWN0OworICAgICAgICBpZiAoYWEtPmNoaWxkTnVtc1tqXSA8IGJiLT5jaGlsZE51bXNbal0pIHJldHVybiAtMTsKKyAgICAgICAgaWYgKGFhLT5jaGlsZE51bXNbal0gPiBiYi0+Y2hpbGROdW1zW2pdKSByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKworLy8KKy8vIFdoZW4gc29ydGluZyBieSBsYWJlbHMsIF9fa21wX2FmZmluaXR5X2Fzc2lnbl9jaGlsZF9udW1zKCkgbXVzdCBmaXJzdCBiZQorLy8gY2FsbGVkIHRvIHJlbnVtYmVyIHRoZSBsYWJlbHMgZnJvbSBbMC4ubl0gYW5kIHBsYWNlIHRoZW0gaW50byB0aGUgY2hpbGRfbnVtCisvLyB2ZWN0b3Igb2YgdGhlIGFkZHJlc3Mgb2JqZWN0LiAgVGhpcyBpcyBkb25lIGluIGNhc2UgdGhlIGxhYmVscyB1c2VkIGZvcgorLy8gdGhlIGNoaWxkcmVuIGF0IG9uZSBub2RlIG9mIHRoZSBoaWVyYXJjaHkgZGlmZmVyIGZyb20gdGhvc2UgdXNlZCBmb3IKKy8vIGFub3RoZXIgbm9kZSBhdCB0aGUgc2FtZSBsZXZlbC4gIEV4YW1wbGU6ICBzdXBwb3NlIHRoZSBtYWNoaW5lIGhhcyAyIG5vZGVzCisvLyB3aXRoIDIgcGFja2FnZXMgZWFjaC4gIFRoZSBmaXJzdCBub2RlIGNvbnRhaW5zIHBhY2thZ2VzIDYwMSBhbmQgNjAyLCBhbmQKKy8vIHNlY29uZCBub2RlIGNvbnRhaW5zIHBhY2thZ2VzIDYwMyBhbmQgNjA0LiAgSWYgd2UgdHJ5IHRvIHNvcnQgdGhlIHRhYmxlCisvLyBmb3IgInNjYXR0ZXIiIGFmZmluaXR5LCB0aGUgdGFibGUgd2lsbCBzdGlsbCBiZSBzb3J0ZWQgNjAxLCA2MDIsIDYwMywgNjA0CisvLyBiZWNhdXNlIHdlIGFyZSBwYXlpbmcgYXR0ZW50aW9uIHRvIHRoZSBsYWJlbHMgdGhlbXNlbHZlcywgbm90IHRoZSBvcmRpbmFsCisvLyBjaGlsZCBudW1iZXJzLiAgQnkgdXNpbmcgdGhlIGNoaWxkIG51bWJlcnMgaW4gdGhlIHNvcnQsIHRoZSByZXN1bHQgaXMKKy8vIHswLDB9PTYwMSwgezAsMX09NjAzLCB7MSwwfT02MDIsIHsxLDF9PTYwNC4KKy8vCitzdGF0aWMgdm9pZAorX19rbXBfYWZmaW5pdHlfYXNzaWduX2NoaWxkX251bXMoQWRkclVuc1BhaXIgKmFkZHJlc3Myb3MsCisgIGludCBudW1BZGRycykKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKG51bUFkZHJzID4gMCk7CisgICAgaW50IGRlcHRoID0gYWRkcmVzczJvcy0+Zmlyc3QuZGVwdGg7CisgICAgdW5zaWduZWQgKmNvdW50cyA9ICh1bnNpZ25lZCAqKV9fa21wX2FsbG9jYXRlKGRlcHRoICogc2l6ZW9mKHVuc2lnbmVkKSk7CisgICAgdW5zaWduZWQgKmxhc3RMYWJlbCA9ICh1bnNpZ25lZCAqKV9fa21wX2FsbG9jYXRlKGRlcHRoCisgICAgICAqIHNpemVvZih1bnNpZ25lZCkpOworICAgIGludCBsYWJDdDsKKyAgICBmb3IgKGxhYkN0ID0gMDsgbGFiQ3QgPCBkZXB0aDsgbGFiQ3QrKykgeworICAgICAgICBhZGRyZXNzMm9zWzBdLmZpcnN0LmNoaWxkTnVtc1tsYWJDdF0gPSBjb3VudHNbbGFiQ3RdID0gMDsKKyAgICAgICAgbGFzdExhYmVsW2xhYkN0XSA9IGFkZHJlc3Myb3NbMF0uZmlyc3QubGFiZWxzW2xhYkN0XTsKKyAgICB9CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMTsgaSA8IG51bUFkZHJzOyBpKyspIHsKKyAgICAgICAgZm9yIChsYWJDdCA9IDA7IGxhYkN0IDwgZGVwdGg7IGxhYkN0KyspIHsKKyAgICAgICAgICAgIGlmIChhZGRyZXNzMm9zW2ldLmZpcnN0LmxhYmVsc1tsYWJDdF0gIT0gbGFzdExhYmVsW2xhYkN0XSkgeworICAgICAgICAgICAgICAgIGludCBsYWJDdDI7CisgICAgICAgICAgICAgICAgZm9yIChsYWJDdDIgPSBsYWJDdCArIDE7IGxhYkN0MiA8IGRlcHRoOyBsYWJDdDIrKykgeworICAgICAgICAgICAgICAgICAgICBjb3VudHNbbGFiQ3QyXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGxhc3RMYWJlbFtsYWJDdDJdID0gYWRkcmVzczJvc1tpXS5maXJzdC5sYWJlbHNbbGFiQ3QyXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY291bnRzW2xhYkN0XSsrOworICAgICAgICAgICAgICAgIGxhc3RMYWJlbFtsYWJDdF0gPSBhZGRyZXNzMm9zW2ldLmZpcnN0LmxhYmVsc1tsYWJDdF07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChsYWJDdCA9IDA7IGxhYkN0IDwgZGVwdGg7IGxhYkN0KyspIHsKKyAgICAgICAgICAgIGFkZHJlc3Myb3NbaV0uZmlyc3QuY2hpbGROdW1zW2xhYkN0XSA9IGNvdW50c1tsYWJDdF07CisgICAgICAgIH0KKyAgICAgICAgZm9yICg7IGxhYkN0IDwgKGludClBZGRyZXNzOjptYXhEZXB0aDsgbGFiQ3QrKykgeworICAgICAgICAgICAgYWRkcmVzczJvc1tpXS5maXJzdC5jaGlsZE51bXNbbGFiQ3RdID0gMDsKKyAgICAgICAgfQorICAgIH0KK30KKworCisvLworLy8gQWxsIG9mIHRoZSBfX2ttcF9hZmZpbml0eV9jcmVhdGVfKl9tYXAoKSByb3V0aW5lcyBzaG91bGQgc2V0CisvLyBfX2ttcF9hZmZpbml0eV9tYXNrcyB0byBhIHZlY3RvciBvZiBhZmZpbml0eSBtYXNrIG9iamVjdHMgb2YgbGVuZ3RoCisvLyBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MsIGlmIF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSwgYW5kCisvLyByZXR1cm4gdGhlIG51bWJlciBvZiBsZXZlbHMgaW4gdGhlIG1hY2hpbmUgdG9wb2xvZ3kgdHJlZSAoemVybyBpZgorLy8gX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKS4KKy8vCisvLyBBbGwgb2YgdGhlIF9fa21wX2FmZmluaXR5X2NyZWF0ZV8qX21hcCgpIHJvdXRpbmVzIHNob3VsZCBzZXQgKmZ1bGxNYXNrCisvLyB0byB0aGUgYWZmaW5pdHkgbWFzayBmb3IgdGhlIGluaXRpYWxpemF0aW9uIHRocmVhZC4gIFRoZXkgbmVlZCB0byBzYXZlIGFuZAorLy8gcmVzdG9yZSB0aGUgbWFzaywgYW5kIGl0IGNvdWxkIGJlIG5lZWRlZCBsYXRlciwgc28gc2F2aW5nIGl0IGlzIGp1c3QgYW4KKy8vIG9wdGltaXphdGlvbiB0byBhdm9pZCBjYWxsaW5nIGttcF9nZXRfc3lzdGVtX2FmZmluaXR5KCkgYWdhaW4uCisvLworc3RhdGljIGttcF9hZmZpbl9tYXNrX3QgKmZ1bGxNYXNrID0gTlVMTDsKKwora21wX2FmZmluX21hc2tfdCAqCitfX2ttcF9hZmZpbml0eV9nZXRfZnVsbE1hc2soKSB7IHJldHVybiBmdWxsTWFzazsgfQorCisKK3N0YXRpYyBpbnQgbkNvcmVzUGVyUGtnLCBuUGFja2FnZXM7CitpbnQgX19rbXBfblRocmVhZHNQZXJDb3JlOworCisvLworLy8gX19rbXBfYWZmaW5pdHlfdW5pZm9ybV90b3BvbG9neSgpIGRvZXNuJ3Qgd29yayB3aGVuIGNhbGxlZCBmcm9tCisvLyBwbGFjZXMgd2hpY2ggc3VwcG9ydCBhcmJpdHJhcmlseSBtYW55IGxldmVscyBpbiB0aGUgbWFjaGluZSB0b3BvbG9neQorLy8gbWFwLCBpLmUuIHRoZSBub24tZGVmYXVsdCBjYXNlcyBpbiBfX2ttcF9hZmZpbml0eV9jcmVhdGVfY3B1aW5mb19tYXAoKQorLy8gX19rbXBfYWZmaW5pdHlfY3JlYXRlX3gyYXBpY2lkX21hcCgpLgorLy8KK2lubGluZSBzdGF0aWMgYm9vbAorX19rbXBfYWZmaW5pdHlfdW5pZm9ybV90b3BvbG9neSgpCit7CisgICAgcmV0dXJuIF9fa21wX2F2YWlsX3Byb2MgPT0gKF9fa21wX25UaHJlYWRzUGVyQ29yZSAqIG5Db3Jlc1BlclBrZyAqIG5QYWNrYWdlcyk7Cit9CisKKworLy8KKy8vIFByaW50IG91dCB0aGUgZGV0YWlsZWQgbWFjaGluZSB0b3BvbG9neSBtYXAsIGkuZS4gdGhlIHBoeXNpY2FsIGxvY2F0aW9ucworLy8gb2YgZWFjaCBPUyBwcm9jLgorLy8KK3N0YXRpYyB2b2lkCitfX2ttcF9hZmZpbml0eV9wcmludF90b3BvbG9neShBZGRyVW5zUGFpciAqYWRkcmVzczJvcywgaW50IGxlbiwgaW50IGRlcHRoLAorICBpbnQgcGtnTGV2ZWwsIGludCBjb3JlTGV2ZWwsIGludCB0aHJlYWRMZXZlbCkKK3sKKyAgICBpbnQgcHJvYzsKKworICAgIEtNUF9JTkZPUk0oT1NQcm9jVG9QaHlzaWNhbFRocmVhZE1hcCwgIktNUF9BRkZJTklUWSIpOworICAgIGZvciAocHJvYyA9IDA7IHByb2MgPCBsZW47IHByb2MrKykgeworICAgICAgICBpbnQgbGV2ZWw7CisgICAgICAgIGttcF9zdHJfYnVmX3QgYnVmOworICAgICAgICBfX2ttcF9zdHJfYnVmX2luaXQoJmJ1Zik7CisgICAgICAgIGZvciAobGV2ZWwgPSAwOyBsZXZlbCA8IGRlcHRoOyBsZXZlbCsrKSB7CisgICAgICAgICAgICBpZiAobGV2ZWwgPT0gdGhyZWFkTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICIlcyAiLCBLTVBfSTE4Tl9TVFIoVGhyZWFkKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChsZXZlbCA9PSBjb3JlTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICIlcyAiLCBLTVBfSTE4Tl9TVFIoQ29yZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobGV2ZWwgPT0gcGtnTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICIlcyAiLCBLTVBfSTE4Tl9TVFIoUGFja2FnZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobGV2ZWwgPiBwa2dMZXZlbCkgeworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoJmJ1ZiwgIiVzXyVkICIsIEtNUF9JMThOX1NUUihOb2RlKSwKKyAgICAgICAgICAgICAgICAgIGxldmVsIC0gcGtnTGV2ZWwgLSAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoJmJ1ZiwgIkwlZCAiLCBsZXZlbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICIlZCAiLAorICAgICAgICAgICAgICBhZGRyZXNzMm9zW3Byb2NdLmZpcnN0LmxhYmVsc1tsZXZlbF0pOworICAgICAgICB9CisgICAgICAgIEtNUF9JTkZPUk0oT1NQcm9jTWFwVG9QYWNrLCAiS01QX0FGRklOSVRZIiwgYWRkcmVzczJvc1twcm9jXS5zZWNvbmQsCisgICAgICAgICAgYnVmLnN0cik7CisgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSgmYnVmKTsKKyAgICB9Cit9CisKKworLy8KKy8vIElmIHdlIGRvbid0IGtub3cgaG93IHRvIHJldHJpZXZlIHRoZSBtYWNoaW5lJ3MgcHJvY2Vzc29yIHRvcG9sb2d5LCBvcgorLy8gZW5jb3VudGVyIGFuIGVycm9yIGluIGRvaW5nIHNvLCB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIGZvcm0gYSAiZmxhdCIKKy8vIG1hcHBpbmcgb2Ygb3MgdGhyZWFkIGlkJ3MgPC0+IHByb2Nlc3NvciBpZCdzLgorLy8KK3N0YXRpYyBpbnQKK19fa21wX2FmZmluaXR5X2NyZWF0ZV9mbGF0X21hcChBZGRyVW5zUGFpciAqKmFkZHJlc3Myb3MsCisgIGttcF9pMThuX2lkX3QgKmNvbnN0IG1zZ19pZCkKK3sKKyAgICAqYWRkcmVzczJvcyA9IE5VTEw7CisgICAgKm1zZ19pZCA9IGttcF9pMThuX251bGw7CisKKyAgICAvLworICAgIC8vIEV2ZW4gaWYgX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lLCB0aGlzIHJvdXRpbmUgbWlnaHQgc3RpbGwKKyAgICAvLyBjYWxsZWQgdG8gc2V0IF9fa21wX2h0X2VuYWJsZWQsICYgX19rbXBfbmNvcmVzLCBhcyB3ZWxsIGFzCisgICAgLy8gX19rbXBfblRocmVhZHNQZXJDb3JlLCBuQ29yZXNQZXJQa2csICYgblBhY2thZ2VzLgorICAgIC8vCisgICAgaWYgKCEgS01QX0FGRklOSVRZX0NBUEFCTEUoKSkgeworICAgICAgICBLTVBfQVNTRVJUKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSk7CisgICAgICAgIF9fa21wX25jb3JlcyA9IG5QYWNrYWdlcyA9IF9fa21wX3hwcm9jOworICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSBuQ29yZXNQZXJQa2cgPSAxOworICAgICAgICBfX2ttcF9odF9lbmFibGVkID0gRkFMU0U7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZkZsYXRUb3BvbG9neSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgS01QX0lORk9STShBdmFpbGFibGVPU1Byb2MsICJLTVBfQUZGSU5JVFkiLCBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgS01QX0lORk9STShUb3BvbG9neSwgIktNUF9BRkZJTklUWSIsIG5QYWNrYWdlcywgbkNvcmVzUGVyUGtnLAorICAgICAgICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUsIF9fa21wX25jb3Jlcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBXaGVuIGFmZmluaXR5IGlzIG9mZiwgdGhpcyByb3V0aW5lIHdpbGwgc3RpbGwgYmUgY2FsbGVkIHRvIHNldAorICAgIC8vIF9fa21wX2h0X2VuYWJsZWQsICYgX19rbXBfbmNvcmVzLCBhcyB3ZWxsIGFzIF9fa21wX25UaHJlYWRzUGVyQ29yZSwKKyAgICAvLyBuQ29yZXNQZXJQa2csICYgblBhY2thZ2VzLiAgTWFrZSBzdXJlIGFsbCB0aGVzZSB2YXJzIGFyZSBzZXQKKyAgICAvLyAgY29ycmVjdGx5LCBhbmQgcmV0dXJuIG5vdyBpZiBhZmZpbml0eSBpcyBub3QgZW5hYmxlZC4KKyAgICAvLworICAgIF9fa21wX25jb3JlcyA9IG5QYWNrYWdlcyA9IF9fa21wX2F2YWlsX3Byb2M7CisgICAgX19rbXBfblRocmVhZHNQZXJDb3JlID0gbkNvcmVzUGVyUGtnID0gMTsKKyAgICBfX2ttcF9odF9lbmFibGVkID0gRkFMU0U7CisgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwgZnVsbE1hc2spOworCisgICAgICAgIEtNUF9JTkZPUk0oQWZmQ2FwYWJsZVVzZUZsYXQsICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzaykgeworICAgICAgICAgICAgS01QX0lORk9STShJbml0T1NQcm9jU2V0UmVzcGVjdCwgIktNUF9BRkZJTklUWSIsIGJ1Zik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEluaXRPU1Byb2NTZXROb3RSZXNwZWN0LCAiS01QX0FGRklOSVRZIiwgYnVmKTsKKyAgICAgICAgfQorICAgICAgICBLTVBfSU5GT1JNKEF2YWlsYWJsZU9TUHJvYywgIktNUF9BRkZJTklUWSIsIF9fa21wX2F2YWlsX3Byb2MpOworICAgICAgICBLTVBfSU5GT1JNKFVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgS01QX0lORk9STShUb3BvbG9neSwgIktNUF9BRkZJTklUWSIsIG5QYWNrYWdlcywgbkNvcmVzUGVyUGtnLAorICAgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSwgX19rbXBfbmNvcmVzKTsKKyAgICB9CisgICAgaWYgKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLworICAgIC8vIENvbnRydWN0IHRoZSBkYXRhIHN0cnVjdHVyZSB0byBiZSByZXR1cm5lZC4KKyAgICAvLworICAgICphZGRyZXNzMm9zID0gKEFkZHJVbnNQYWlyKikKKyAgICAgIF9fa21wX2FsbG9jYXRlKHNpemVvZigqKmFkZHJlc3Myb3MpICogX19rbXBfYXZhaWxfcHJvYyk7CisgICAgaW50IGF2YWlsX2N0ID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgS01QX0NQVV9TRVRTSVpFOyArK2kpIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gU2tpcCB0aGlzIHByb2MgaWYgaXQgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBtYWNoaW5lIG1vZGVsLgorICAgICAgICAvLworICAgICAgICBpZiAoISBLTVBfQ1BVX0lTU0VUKGksIGZ1bGxNYXNrKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBBZGRyZXNzIGFkZHIoMSk7CisgICAgICAgIGFkZHIubGFiZWxzWzBdID0gaTsKKyAgICAgICAgKCphZGRyZXNzMm9zKVthdmFpbF9jdCsrXSA9IEFkZHJVbnNQYWlyKGFkZHIsaSk7CisgICAgfQorICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgIEtNUF9JTkZPUk0oT1NQcm9jVG9QYWNrYWdlLCAiS01QX0FGRklOSVRZIik7CisgICAgfQorCisgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzIDwgMCkgeworICAgICAgICAvLworICAgICAgICAvLyBPbmx5IHRoZSBwYWNrYWdlIGxldmVsIGlzIG1vZGVsZWQgaW4gdGhlIG1hY2hpbmUgdG9wb2xvZ3kgbWFwLAorICAgICAgICAvLyBzbyB0aGUgI2xldmVscyBvZiBncmFudWxhcml0eSBpcyBlaXRoZXIgMCBvciAxLgorICAgICAgICAvLworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA+IGFmZmluaXR5X2dyYW5fcGFja2FnZSkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPSAwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAxOworfQorCisKKyMgaWYgS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2XzY0CisKKy8vCisvLyBJZiBtdWx0aXBsZSBXaW5kb3dzKiBPUyBwcm9jZXNzb3IgZ3JvdXBzIGV4aXN0LCB3ZSBjYW4gY3JlYXRlIGEgMi1sZXZlbAorLy8gdG9wb2xvZ3kgbWFwIHdpdGggdGhlIGdyb3VwcyBhdCBsZXZlbCAwIGFuZCB0aGUgaW5kaXZpZHVhbCBwcm9jcyBhdAorLy8gbGV2ZWwgMS4KKy8vCisvLyBUaGlzIGZhY2lsaXRhdGVzIGxldHRpbmcgdGhlIHRocmVhZHMgZmxvYXQgYW1vbmcgYWxsIHByb2NzIGluIGEgZ3JvdXAsCisvLyBpZiBncmFudWxhcml0eT1ncm91cCAodGhlIGRlZmF1bHQgd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgZ3JvdXBzKS4KKy8vCitzdGF0aWMgaW50CitfX2ttcF9hZmZpbml0eV9jcmVhdGVfcHJvY19ncm91cF9tYXAoQWRkclVuc1BhaXIgKiphZGRyZXNzMm9zLAorICBrbXBfaTE4bl9pZF90ICpjb25zdCBtc2dfaWQpCit7CisgICAgKmFkZHJlc3Myb3MgPSBOVUxMOworICAgICptc2dfaWQgPSBrbXBfaTE4bl9udWxsOworCisgICAgLy8KKyAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIG11bHRpcGxlIHByb2Nlc3NvciBncm91cHMsIHJldHVybiBub3cuCisgICAgLy8gVGhlIGZsYXQgbWFwcGluZyB3aWxsIGJlIHVzZWQuCisgICAgLy8KKyAgICBpZiAoKCEgS01QX0FGRklOSVRZX0NBUEFCTEUoKSkgfHwgKF9fa21wX2dldF9wcm9jX2dyb3VwKGZ1bGxNYXNrKSA+PSAwKSkgeworICAgICAgICAvLyBGSVhNRSBzZXQgKm1zZ19pZAorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBDb250cnVjdCB0aGUgZGF0YSBzdHJ1Y3R1cmUgdG8gYmUgcmV0dXJuZWQuCisgICAgLy8KKyAgICAqYWRkcmVzczJvcyA9IChBZGRyVW5zUGFpciopCisgICAgICBfX2ttcF9hbGxvY2F0ZShzaXplb2YoKiphZGRyZXNzMm9zKSAqIF9fa21wX2F2YWlsX3Byb2MpOworICAgIGludCBhdmFpbF9jdCA9IDA7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IEtNUF9DUFVfU0VUU0laRTsgKytpKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIFNraXAgdGhpcyBwcm9jIGlmIGl0IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgbWFjaGluZSBtb2RlbC4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCEgS01QX0NQVV9JU1NFVChpLCBmdWxsTWFzaykpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgQWRkcmVzcyBhZGRyKDIpOworICAgICAgICBhZGRyLmxhYmVsc1swXSA9IGkgLyAoQ0hBUl9CSVQgKiBzaXplb2YoRFdPUkRfUFRSKSk7CisgICAgICAgIGFkZHIubGFiZWxzWzFdID0gaSAlIChDSEFSX0JJVCAqIHNpemVvZihEV09SRF9QVFIpKTsKKyAgICAgICAgKCphZGRyZXNzMm9zKVthdmFpbF9jdCsrXSA9IEFkZHJVbnNQYWlyKGFkZHIsaSk7CisKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmT1NQcm9jVG9Hcm91cCwgIktNUF9BRkZJTklUWSIsIGksIGFkZHIubGFiZWxzWzBdLAorICAgICAgICAgICAgICBhZGRyLmxhYmVsc1sxXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPCAwKSB7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fZ3JvdXApIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX2ZpbmUpCisgICAgICAgICAgfHwgKF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl90aHJlYWQpKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpncmFuX3N0ciA9IE5VTEw7CisgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX2NvcmUpIHsKKyAgICAgICAgICAgICAgICBncmFuX3N0ciA9ICJjb3JlIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9wYWNrYWdlKSB7CisgICAgICAgICAgICAgICAgZ3Jhbl9zdHIgPSAicGFja2FnZSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fbm9kZSkgeworICAgICAgICAgICAgICAgIGdyYW5fc3RyID0gIm5vZGUiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVCgwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gV2FybmluZzogY2FuJ3QgdXNlIGFmZmluaXR5IGdyYW51bGFyaXR5IFwiZ3JhblwiIHdpdGggZ3JvdXAgdG9wb2xvZ3kgbWV0aG9kLCB1c2luZyAidGhyZWFkIgorICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPSAwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAyOworfQorCisjIGVuZGlmIC8qIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4Nl82NCAqLworCisKKyMgaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCitzdGF0aWMgaW50CitfX2ttcF9jcHVpZF9tYXNrX3dpZHRoKGludCBjb3VudCkgeworICAgIGludCByID0gMDsKKworICAgIHdoaWxlKCgxPDxyKSA8IGNvdW50KQorICAgICAgICArK3I7CisgICAgcmV0dXJuIHI7Cit9CisKKworY2xhc3MgYXBpY1RocmVhZEluZm8geworcHVibGljOgorICAgIHVuc2lnbmVkIG9zSWQ7ICAgICAgICAgICAgICAvLyBwYXJhbSB0byBfX2ttcF9hZmZpbml0eV9iaW5kX3RocmVhZAorICAgIHVuc2lnbmVkIGFwaWNJZDsgICAgICAgICAgICAvLyBmcm9tIGNwdWlkIGFmdGVyIGJpbmRpbmcKKyAgICB1bnNpZ25lZCBtYXhDb3Jlc1BlclBrZzsgICAgLy8gICAgICAiIgorICAgIHVuc2lnbmVkIG1heFRocmVhZHNQZXJQa2c7ICAvLyAgICAgICIiCisgICAgdW5zaWduZWQgcGtnSWQ7ICAgICAgICAgICAgIC8vIGluZmVycmVkIGZyb20gYWJvdmUgdmFsdWVzCisgICAgdW5zaWduZWQgY29yZUlkOyAgICAgICAgICAgIC8vICAgICAgIiIKKyAgICB1bnNpZ25lZCB0aHJlYWRJZDsgICAgICAgICAgLy8gICAgICAiIgorfTsKKworCitzdGF0aWMgaW50CitfX2ttcF9hZmZpbml0eV9jbXBfYXBpY1RocmVhZEluZm9fb3NfaWQoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKyAgICBjb25zdCBhcGljVGhyZWFkSW5mbyAqYWEgPSAoY29uc3QgYXBpY1RocmVhZEluZm8gKilhOworICAgIGNvbnN0IGFwaWNUaHJlYWRJbmZvICpiYiA9IChjb25zdCBhcGljVGhyZWFkSW5mbyAqKWI7CisgICAgaWYgKGFhLT5vc0lkIDwgYmItPm9zSWQpIHJldHVybiAtMTsKKyAgICBpZiAoYWEtPm9zSWQgPiBiYi0+b3NJZCkgcmV0dXJuIDE7CisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAorX19rbXBfYWZmaW5pdHlfY21wX2FwaWNUaHJlYWRJbmZvX3BoeXNfaWQoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKyAgICBjb25zdCBhcGljVGhyZWFkSW5mbyAqYWEgPSAoY29uc3QgYXBpY1RocmVhZEluZm8gKilhOworICAgIGNvbnN0IGFwaWNUaHJlYWRJbmZvICpiYiA9IChjb25zdCBhcGljVGhyZWFkSW5mbyAqKWI7CisgICAgaWYgKGFhLT5wa2dJZCA8IGJiLT5wa2dJZCkgcmV0dXJuIC0xOworICAgIGlmIChhYS0+cGtnSWQgPiBiYi0+cGtnSWQpIHJldHVybiAxOworICAgIGlmIChhYS0+Y29yZUlkIDwgYmItPmNvcmVJZCkgcmV0dXJuIC0xOworICAgIGlmIChhYS0+Y29yZUlkID4gYmItPmNvcmVJZCkgcmV0dXJuIDE7CisgICAgaWYgKGFhLT50aHJlYWRJZCA8IGJiLT50aHJlYWRJZCkgcmV0dXJuIC0xOworICAgIGlmIChhYS0+dGhyZWFkSWQgPiBiYi0+dGhyZWFkSWQpIHJldHVybiAxOworICAgIHJldHVybiAwOworfQorCisKKy8vCisvLyBPbiBJQS0zMiBhcmNoaXRlY3R1cmUgYW5kIEludGVsKFIpIDY0IGFyY2hpdGVjdHVyZSwgd2UgYXR0ZW1wdCB0byB1c2UKKy8vIGFuIGFsZ29yaXRobSB3aGljaCBjeWNsZXMgdGhyb3VnaCB0aGUgYXZhaWxhYmxlIG9zIHRocmVhZHMsIHNldHRpbmcKKy8vIHRoZSBjdXJyZW50IHRocmVhZCdzIGFmZmluaXR5IG1hc2sgdG8gdGhhdCB0aHJlYWQsIGFuZCB0aGVuIHJldHJpZXZlcworLy8gdGhlIEFwaWMgSWQgZm9yIGVhY2ggdGhyZWFkIGNvbnRleHQgdXNpbmcgdGhlIGNwdWlkIGluc3RydWN0aW9uLgorLy8KK3N0YXRpYyBpbnQKK19fa21wX2FmZmluaXR5X2NyZWF0ZV9hcGljaWRfbWFwKEFkZHJVbnNQYWlyICoqYWRkcmVzczJvcywKKyAga21wX2kxOG5faWRfdCAqY29uc3QgbXNnX2lkKQoreworICAgIGludCByYzsKKyAgICAqYWRkcmVzczJvcyA9IE5VTEw7CisgICAgKm1zZ19pZCA9IGttcF9pMThuX251bGw7CisKKyMgIGlmIEtNUF9NSUMKKyAgICB7CisgICAgICAgIC8vIFRoZSBjb2RlIGJlbG93IHdpbGwgdXNlIGNwdWlkKDQpLgorICAgICAgICAvLyBDaGVjayBpZiBjcHVpZCg0KSBpcyBzdXBwb3J0ZWQuCisgICAgICAgIC8vIEZJWE1FPyAtIHRoaXMgcmVhbGx5IGRvZXNuJ3QgbmVlZCB0byBiZSBzcGVjaWZpYyB0byBNSUMuCisgICAgICAgIGttcF9jcHVpZCBidWY7CisgICAgICAgIF9fa21wX3g4Nl9jcHVpZCgwLCAwLCAmYnVmKTsKKyAgICAgICAgaWYgKGJ1Zi5lYXggPCA0KSB7CisgICAgICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX05vTGVhZjRTdXBwb3J0OworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorIyAgZW5kaWYgLy8gS01QX01JQworCisgICAgLy8KKyAgICAvLyBFdmVuIGlmIF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSwgdGhpcyByb3V0aW5lIGlzIHN0aWxsCisgICAgLy8gY2FsbGVkIHRvIHNldCBfX2ttcF9odF9lbmFibGVkLCAmIF9fa21wX25jb3JlcywgYXMgd2VsbCBhcworICAgIC8vIF9fa21wX25UaHJlYWRzUGVyQ29yZSwgbkNvcmVzUGVyUGtnLCAmIG5QYWNrYWdlcy4KKyAgICAvLworICAgIC8vIFRoZSBhbGdvcml0aG0gdXNlZCBzdGFydHMgYnkgc2V0dGluZyB0aGUgYWZmaW5pdHkgdG8gZWFjaCBhdmFpbGFibGUKKyAgICAvLyB0aHJlYWQgYW5kIHJldHJlaXZpbmcgaW5mbyBmcm9tIHRoZSBjcHVpZCBpbnN0cnVjdGlvbiwgc28gaWYgd2UgYXJlIG5vdAorICAgIC8vIGNhcGFibGUgb2YgY2FsbGluZyBfX2ttcF9hZmZpbml0eV9nZXRfbWFwKCkvX19rbXBfYWZmaW5pdHlfZ2V0X21hcCgpLAorICAgIC8vIHRoZW4gd2UgbmVlZCB0byBkbyBzb21ldGhpbmcgZWxzZS4KKyAgICAvLworICAgIGlmICghIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkpIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gSGFjayB0byB0cnkgYW5kIGluZmVyIHRoZSBtYWNoaW5lIHRvcG9sb2d5IHVzaW5nIG9ubHkgdGhlIGRhdGEKKyAgICAgICAgLy8gYXZhaWxhYmxlIGZyb20gY3B1aWQgb24gdGhlIGN1cnJlbnQgdGhyZWFkLCBhbmQgX19rbXBfeHByb2MuCisgICAgICAgIC8vCisgICAgICAgIEtNUF9BU1NFUlQoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKTsKKworICAgICAgICAvLworICAgICAgICAvLyBHZXQgYW4gdXBwZXIgYm91bmQgb24gdGhlIG51bWJlciBvZiB0aHJlYWRzIHBlciBwYWNrYWdlIHVzaW5nCisgICAgICAgIC8vIGNwdWlkKDEpLgorICAgICAgICAvLworICAgICAgICAvLyBPbiBzb21lIE9TL2NocHMgY29tYmluYXRpb25zIHdoZXJlIEhUIGlzIHN1cHBvcnRlZCBieSB0aGUgY2hpcAorICAgICAgICAvLyBidXQgaXMgZGlzYWJsZWQsIHRoaXMgdmFsdWUgd2lsbCBiZSAyIG9uIGEgc2luZ2xlIGNvcmUgY2hpcC4KKyAgICAgICAgLy8gVXN1YWxseSwgaXQgd2lsbCBiZSAyIGlmIEhUIGlzIGVuYWJsZWQgYW5kIDEgaWYgSFQgaXMgZGlzYWJsZWQuCisgICAgICAgIC8vCisgICAgICAgIGttcF9jcHVpZCBidWY7CisgICAgICAgIF9fa21wX3g4Nl9jcHVpZCgxLCAwLCAmYnVmKTsKKyAgICAgICAgaW50IG1heFRocmVhZHNQZXJQa2cgPSAoYnVmLmVieCA+PiAxNikgJiAweGZmOworICAgICAgICBpZiAobWF4VGhyZWFkc1BlclBrZyA9PSAwKSB7CisgICAgICAgICAgICBtYXhUaHJlYWRzUGVyUGtnID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZSBudW0gY29yZXMgcGVyIHBrZyBjb21lcyBmcm9tIGNwdWlkKDQpLgorICAgICAgICAvLyAxIG11c3QgYmUgYWRkZWQgdG8gdGhlIGVuY29kZWQgdmFsdWUuCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZSBhdXRob3Igb2YgY3B1X2NvdW50LmNwcCB0cmVhdGVkIHRoaXMgb25seSBhbiB1cHBlciBib3VuZAorICAgICAgICAvLyBvbiB0aGUgbnVtYmVyIG9mIGNvcmVzLCBidXQgSSBoYXZlbid0IHNlZW4gYW55IGNhc2VzIHdoZXJlIGl0CisgICAgICAgIC8vIHdhcyBncmVhdGVyIHRoYW4gdGhlIGFjdHVhbCBudW1iZXIgb2YgY29yZXMsIHNvIHdlIHdpbGwgdHJlYXQKKyAgICAgICAgLy8gaXQgYXMgZXhhY3QgaW4gdGhpcyBibG9jayBvZiBjb2RlLgorICAgICAgICAvLworICAgICAgICAvLyBGaXJzdCwgd2UgbmVlZCB0byBjaGVjayBpZiBjcHVpZCg0KSBpcyBzdXBwb3J0ZWQgb24gdGhpcyBjaGlwLgorICAgICAgICAvLyBUbyBzZWUgaWYgY3B1aWQobikgaXMgc3VwcG9ydGVkLCBpc3N1ZSBjcHVpZCgwKSBhbmQgY2hlY2sgaWYgZWF4CisgICAgICAgIC8vIGhhcyB0aGUgdmFsdWUgbiBvciBncmVhdGVyLgorICAgICAgICAvLworICAgICAgICBfX2ttcF94ODZfY3B1aWQoMCwgMCwgJmJ1Zik7CisgICAgICAgIGlmIChidWYuZWF4ID49IDQpIHsKKyAgICAgICAgICAgIF9fa21wX3g4Nl9jcHVpZCg0LCAwLCAmYnVmKTsKKyAgICAgICAgICAgIG5Db3Jlc1BlclBrZyA9ICgoYnVmLmVheCA+PiAyNikgJiAweDNmKSArIDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBuQ29yZXNQZXJQa2cgPSAxOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlcmUgaXMgbm8gd2F5IHRvIHJlbGlhYmx5IHRlbGwgaWYgSFQgaXMgZW5hYmxlZCB3aXRob3V0IGlzc3VpbmcKKyAgICAgICAgLy8gdGhlIGNwdWlkIGluc3RydWN0aW9uIGZyb20gZXZlcnkgdGhyZWFkLCBjYW4gY29ycmVsYXRpbmcgdGhlIGNwdWlkCisgICAgICAgIC8vIGluZm8sIHNvIGlmIHRoZSBtYWNoaW5lIGlzIG5vdCBhZmZpbml0eSBjYXBhYmxlLCB3ZSBhc3N1bWUgdGhhdCBIVAorICAgICAgICAvLyBpcyBvZmYuICBXZSBoYXZlIHNlZW4gcXVpdGUgYSBmZXcgbWFjaGluZXMgd2hlcmUgbWF4VGhyZWFkc1BlclBrZworICAgICAgICAvLyBpcyAyLCB5ZXQgdGhlIG1hY2hpbmUgZG9lcyBub3Qgc3VwcG9ydCBIVC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gLSBPbGRlciBPU2VzIGFyZSB1c3VhbGx5IGZvdW5kIG9uIG1hY2hpbmVzIHdpdGggb2xkZXIgY2hpcHMsIHdoaWNoCisgICAgICAgIC8vICAgZG8gbm90IHN1cHBvcnQgSFQuCisgICAgICAgIC8vCisgICAgICAgIC8vIC0gVGhlIHBlcmZvcm1hbmNlIHBlbmFsdHkgZm9yIG1pc3Rha2VubHkgaWRlbnRpZnlpbmcgYSBtYWNoaW5lIGFzCisgICAgICAgIC8vICAgSFQgd2hlbiBpdCBpc24ndCAod2hpY2ggcmVzdWx0cyBpbiBibG9ja3RpbWUgYmVpbmcgaW5jb3JyZWNseSBzZXQKKyAgICAgICAgLy8gICB0byAwKSBpcyBncmVhdGVyIHRoYW4gdGhlIHBlbmFsdHkgd2hlbiBmb3IgbWlzdGFrZW5seSBpZGVudGlmeWluZworICAgICAgICAvLyAgIGEgbWFjaGluZSBhcyBiZWluZyAxIHRocmVhZC9jb3JlIHdoZW4gaXQgaXMgcmVhbGx5IEhUIGVuYWJsZWQKKyAgICAgICAgLy8gICAod2hpY2ggcmVzdWx0cyBpbiBibG9ja3RpbWUgYmVpbmcgaW5jb3JyZWN0bHkgc2V0IHRvIGEgcG9zaXRpdmUKKyAgICAgICAgLy8gICB2YWx1ZSkuCisgICAgICAgIC8vCisgICAgICAgIF9fa21wX25jb3JlcyA9IF9fa21wX3hwcm9jOworICAgICAgICBuUGFja2FnZXMgPSAoX19rbXBfeHByb2MgKyBuQ29yZXNQZXJQa2cgLSAxKSAvIG5Db3Jlc1BlclBrZzsKKyAgICAgICAgX19rbXBfblRocmVhZHNQZXJDb3JlID0gMTsKKyAgICAgICAgX19rbXBfaHRfZW5hYmxlZCA9IEZBTFNFOworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgS01QX0lORk9STShBZmZOb3RDYXBhYmxlVXNlTG9jQ3B1aWQsICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQXZhaWxhYmxlT1NQcm9jLCAiS01QX0FGRklOSVRZIiwgX19rbXBfYXZhaWxfcHJvYyk7CisgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdW5pZm9ybV90b3BvbG9neSgpKSB7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShVbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oTm9uVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgS01QX0lORk9STShUb3BvbG9neSwgIktNUF9BRkZJTklUWSIsIG5QYWNrYWdlcywgbkNvcmVzUGVyUGtnLAorICAgICAgICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUsIF9fa21wX25jb3Jlcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8KKyAgICAvLworICAgIC8vIEZyb20gaGVyZSBvbiwgd2UgY2FuIGFzc3VtZSB0aGF0IGl0IGlzIHNhZmUgdG8gY2FsbAorICAgIC8vIF9fa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkoKSBhbmQgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eSgpLAorICAgIC8vIGV2ZW4gaWYgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X25vbmUuCisgICAgLy8KKworICAgIC8vCisgICAgLy8gU2F2ZSB0aGUgYWZmaW5pdHkgbWFzayBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLgorICAgIC8vCisgICAga21wX2FmZmluX21hc2tfdCAqb2xkTWFzazsKKyAgICBLTVBfQ1BVX0FMTE9DKG9sZE1hc2spOworICAgIEtNUF9BU1NFUlQob2xkTWFzayAhPSBOVUxMKTsKKyAgICBfX2ttcF9nZXRfc3lzdGVtX2FmZmluaXR5KG9sZE1hc2ssIFRSVUUpOworCisgICAgLy8KKyAgICAvLyBSdW4gdGhyb3VnaCBlYWNoIG9mIHRoZSBhdmFpbGFibGUgY29udGV4dHMsIGJpbmRpbmcgdGhlIGN1cnJlbnQgdGhyZWFkCisgICAgLy8gdG8gaXQsIGFuZCBvYnRhaW5pbmcgdGhlIHBlcnRpbmVudCBpbmZvcm1hdGlvbiB1c2luZyB0aGUgY3B1aWQgaW5zdHIuCisgICAgLy8KKyAgICAvLyBUaGUgcmVsZXZhbnQgaW5mb3JtYXRpb24gaXM6CisgICAgLy8KKyAgICAvLyBBcGljIElkOiBCaXRzIDI0OjMxIG9mIGVieCBhZnRlciBpc3N1aW5nIGNwdWlkKDEpIC0gZWFjaCB0aHJlYWQgY29udGV4dAorICAgIC8vICAgIGhhcyBhIHVuaXFpZSBBcGljIElkLCB3aGljaCBpcyBvZiB0aGUgZm9ybSBwa2cjIDogY29yZSMgOiB0aHJlYWQjLgorICAgIC8vCisgICAgLy8gTWF4IFRocmVhZHMgUGVyIFBrZzogQml0cyAxNjoyMyBvZiBlYnggYWZ0ZXIgaXNzdWluZyBjcHVpZCgxKS4gIFRoZQorICAgIC8vICAgIHZhbHVlIG9mIHRoaXMgZmllbGQgZGV0ZXJtaW5lcyB0aGUgd2lkdGggb2YgdGhlIGNvcmUjICsgdGhyZWFkIworICAgIC8vICAgIGZpZWxkcyBpbiB0aGUgQXBpYyBJZC4gIEl0IGlzIGFsc28gYW4gdXBwZXIgYm91bmQgb24gdGhlIG51bWJlcgorICAgIC8vICAgIG9mIHRocmVhZHMgcGVyIHBhY2thZ2UsIGJ1dCBpdCBoYXMgYmVlbiB2ZXJpZmllZCB0aGF0IHNpdHVhdGlvbnMKKyAgICAvLyAgICBoYXBwZW4gd2VyZSBpdCBpcyBub3QgZXhhY3QuICBJbiBwYXJ0aWN1bGFyLCBvbiBjZXJ0YWluIE9TL2NoaXAKKyAgICAvLyAgICBjb21iaW5hdGlvbnMgd2hlcmUgSW50ZWwoUikgSHlwZXItVGhyZWFkaW5nIFRlY2hub2xvZ3kgaXMgc3VwcG9ydGVkCisgICAgLy8gICAgYnkgdGhlIGNoaXAgYnV0IGhhcworICAgIC8vICAgIGJlZW4gZGlzYWJsZWQsIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIHdpbGwgYmUgMiAoZm9yIGEgc2luZ2xlIGNvcmUKKyAgICAvLyAgICBjaGlwKS4gIE9uIG90aGVyIE9TL2NoaXAgY29tYmluYXRpb25zIHN1cHBvcnRpbmcKKyAgICAvLyAgICBJbnRlbChSKSBIeXBlci1UaHJlYWRpbmcgVGVjaG5vbG9neSwgdGhlIHZhbHVlIG9mCisgICAgLy8gICAgdGhpcyBmaWVsZCB3aWxsIGJlIDEgd2hlbiBJbnRlbChSKSBIeXBlci1UaHJlYWRpbmcgVGVjaG5vbG9neSBpcworICAgIC8vICAgIGRpc2FibGVkIGFuZCAyIHdoZW4gaXQgaXMgZW5hYmxlZC4KKyAgICAvLworICAgIC8vIE1heCBDb3JlcyBQZXIgUGtnOiAgQml0cyAyNjozMSBvZiBlYXggYWZ0ZXIgaXNzdWluZyBjcHVpZCg0KS4gIFRoZQorICAgIC8vICAgIHZhbHVlIG9mIHRoaXMgZmllbGQgKCsxKSBkZXRlcm1pbmVzIHRoZSB3aWR0aCBvZiB0aGUgY29yZSMgZmllbGQgaW4KKyAgICAvLyAgICB0aGUgQXBpYyBJZC4gIFRoZSBjb21tZW50cyBpbiAiY3B1Y291bnQuY3BwIiBzYXkgdGhhdCB0aGlzIHZhbHVlIGlzCisgICAgLy8gICAgYW4gdXBwZXIgYm91bmQsIGJ1dCB0aGUgSUEtMzIgYXJjaGl0ZWN0dXJlIG1hbnVhbCBzYXlzIHRoYXQgaXQgaXMKKyAgICAvLyAgICBleGFjdGx5IHRoZSBudW1iZXIgb2YgY29yZXMgcGVyIHBhY2thZ2UsIGFuZCBJIGhhdmVuJ3Qgc2VlbiBhbnkKKyAgICAvLyAgICBjYXNlIHdoZXJlIGl0IHdhc24ndC4KKyAgICAvLworICAgIC8vIEZyb20gdGhpcyBpbmZvcm1hdGlvbiwgZGVkdWNlIHRoZSBwYWNrYWdlIElkLCBjb3JlIElkLCBhbmQgdGhyZWFkIElkLAorICAgIC8vIGFuZCBzZXQgdGhlIGNvcnJlc3BvbmRpbmcgZmllbGRzIGluIHRoZSBhcGljVGhyZWFkSW5mbyBzdHJ1Y3QuCisgICAgLy8KKyAgICB1bnNpZ25lZCBpOworICAgIGFwaWNUaHJlYWRJbmZvICp0aHJlYWRJbmZvID0gKGFwaWNUaHJlYWRJbmZvICopX19rbXBfYWxsb2NhdGUoCisgICAgICBfX2ttcF9hdmFpbF9wcm9jICogc2l6ZW9mKGFwaWNUaHJlYWRJbmZvKSk7CisgICAgdW5zaWduZWQgbkFwaWNzID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgS01QX0NQVV9TRVRTSVpFOyArK2kpIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gU2tpcCB0aGlzIHByb2MgaWYgaXQgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBtYWNoaW5lIG1vZGVsLgorICAgICAgICAvLworICAgICAgICBpZiAoISBLTVBfQ1BVX0lTU0VUKGksIGZ1bGxNYXNrKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCgoaW50KW5BcGljcyA8IF9fa21wX2F2YWlsX3Byb2MpOworCisgICAgICAgIF9fa21wX2FmZmluaXR5X2JpbmRfdGhyZWFkKGkpOworICAgICAgICB0aHJlYWRJbmZvW25BcGljc10ub3NJZCA9IGk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlIGFwaWMgaWQgYW5kIG1heCB0aHJlYWRzIHBlciBwa2cgY29tZSBmcm9tIGNwdWlkKDEpLgorICAgICAgICAvLworICAgICAgICBrbXBfY3B1aWQgYnVmOworICAgICAgICBfX2ttcF94ODZfY3B1aWQoMSwgMCwgJmJ1Zik7CisgICAgICAgIGlmICghIChidWYuZWR4ID4+IDkpICYgMSkgeworICAgICAgICAgICAgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eShvbGRNYXNrLCBUUlVFKTsKKyAgICAgICAgICAgIF9fa21wX2ZyZWUodGhyZWFkSW5mbyk7CisgICAgICAgICAgICBLTVBfQ1BVX0ZSRUUob2xkTWFzayk7CisgICAgICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX0FwaWNOb3RQcmVzZW50OworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHRocmVhZEluZm9bbkFwaWNzXS5hcGljSWQgPSAoYnVmLmVieCA+PiAyNCkgJiAweGZmOworICAgICAgICB0aHJlYWRJbmZvW25BcGljc10ubWF4VGhyZWFkc1BlclBrZyA9IChidWYuZWJ4ID4+IDE2KSAmIDB4ZmY7CisgICAgICAgIGlmICh0aHJlYWRJbmZvW25BcGljc10ubWF4VGhyZWFkc1BlclBrZyA9PSAwKSB7CisgICAgICAgICAgICB0aHJlYWRJbmZvW25BcGljc10ubWF4VGhyZWFkc1BlclBrZyA9IDE7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBNYXggY29yZXMgcGVyIHBrZyBjb21lcyBmcm9tIGNwdWlkKDQpLgorICAgICAgICAvLyAxIG11c3QgYmUgYWRkZWQgdG8gdGhlIGVuY29kZWQgdmFsdWUuCisgICAgICAgIC8vCisgICAgICAgIC8vIEZpcnN0LCB3ZSBuZWVkIHRvIGNoZWNrIGlmIGNwdWlkKDQpIGlzIHN1cHBvcnRlZCBvbiB0aGlzIGNoaXAuCisgICAgICAgIC8vIFRvIHNlZSBpZiBjcHVpZChuKSBpcyBzdXBwb3J0ZWQsIGlzc3VlIGNwdWlkKDApIGFuZCBjaGVjayBpZiBlYXgKKyAgICAgICAgLy8gaGFzIHRoZSB2YWx1ZSBuIG9yIGdyZWF0ZXIuCisgICAgICAgIC8vCisgICAgICAgIF9fa21wX3g4Nl9jcHVpZCgwLCAwLCAmYnVmKTsKKyAgICAgICAgaWYgKGJ1Zi5lYXggPj0gNCkgeworICAgICAgICAgICAgX19rbXBfeDg2X2NwdWlkKDQsIDAsICZidWYpOworICAgICAgICAgICAgdGhyZWFkSW5mb1tuQXBpY3NdLm1heENvcmVzUGVyUGtnID0gKChidWYuZWF4ID4+IDI2KSAmIDB4M2YpICsgMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHRocmVhZEluZm9bbkFwaWNzXS5tYXhDb3Jlc1BlclBrZyA9IDE7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBJbmZlciB0aGUgcGtnSWQgLyBjb3JlSWQgLyB0aHJlYWRJZCB1c2luZyBvbmx5IHRoZSBpbmZvCisgICAgICAgIC8vIG9idGFpbmVkIGxvY2FsbHkuCisgICAgICAgIC8vCisgICAgICAgIGludCB3aWR0aENUID0gX19rbXBfY3B1aWRfbWFza193aWR0aCgKKyAgICAgICAgICB0aHJlYWRJbmZvW25BcGljc10ubWF4VGhyZWFkc1BlclBrZyk7CisgICAgICAgIHRocmVhZEluZm9bbkFwaWNzXS5wa2dJZCA9IHRocmVhZEluZm9bbkFwaWNzXS5hcGljSWQgPj4gd2lkdGhDVDsKKworICAgICAgICBpbnQgd2lkdGhDID0gX19rbXBfY3B1aWRfbWFza193aWR0aCgKKyAgICAgICAgICB0aHJlYWRJbmZvW25BcGljc10ubWF4Q29yZXNQZXJQa2cpOworICAgICAgICBpbnQgd2lkdGhUID0gd2lkdGhDVCAtIHdpZHRoQzsKKyAgICAgICAgaWYgKHdpZHRoVCA8IDApIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBJJ3ZlIG5ldmVyIHNlZW4gdGhpcyBvbmUgaGFwcGVuLCBidXQgSSBzdXBwb3NlIGl0IGNvdWxkLCBpZgorICAgICAgICAgICAgLy8gdGhlIGNwdWlkIGluc3RydWN0aW9uIG9uIGEgY2hpcCB3YXMgcmVhbGx5IHNjcmV3ZWQgdXAuCisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdG8gcmVzdG9yZSB0aGUgYWZmaW5pdHkgbWFzayBiZWZvcmUgdGhlIHRhaWwgY2FsbC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KG9sZE1hc2ssIFRSVUUpOworICAgICAgICAgICAgX19rbXBfZnJlZSh0aHJlYWRJbmZvKTsKKyAgICAgICAgICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICAgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfSW52YWxpZENwdWlkSW5mbzsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBtYXNrQyA9ICgxIDw8IHdpZHRoQykgLSAxOworICAgICAgICB0aHJlYWRJbmZvW25BcGljc10uY29yZUlkID0gKHRocmVhZEluZm9bbkFwaWNzXS5hcGljSWQgPj4gd2lkdGhUKQorICAgICAgICAgICZtYXNrQzsKKworICAgICAgICBpbnQgbWFza1QgPSAoMSA8PCB3aWR0aFQpIC0gMTsKKyAgICAgICAgdGhyZWFkSW5mb1tuQXBpY3NdLnRocmVhZElkID0gdGhyZWFkSW5mb1tuQXBpY3NdLmFwaWNJZCAmbWFza1Q7CisKKyAgICAgICAgbkFwaWNzKys7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBXZSd2ZSBjb2xsZWN0ZWQgYWxsIHRoZSBpbmZvIHdlIG5lZWQuCisgICAgLy8gUmVzdG9yZSB0aGUgb2xkIGFmZmluaXR5IG1hc2sgZm9yIHRoaXMgdGhyZWFkLgorICAgIC8vCisgICAgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eShvbGRNYXNrLCBUUlVFKTsKKworICAgIC8vCisgICAgLy8gSWYgdGhlcmUncyBvbmx5IG9uZSB0aHJlYWQgY29udGV4dCB0byBiaW5kIHRvLCBmb3JtIGFuIEFkZHJlc3Mgb2JqZWN0CisgICAgLy8gd2l0aCBkZXB0aCAxIGFuZCByZXR1cm4gaW1tZWRpYXRlbHkgKG9yLCBpZiBhZmZpbml0eSBpcyBvZmYsIHNldAorICAgIC8vIGFkZHJlc3Myb3MgdG8gTlVMTCBhbmQgcmV0dXJuKS4KKyAgICAvLworICAgIC8vIElmIGl0IGlzIGNvbmZpZ3VyZWQgdG8gb21pdCB0aGUgcGFja2FnZSBsZXZlbCB3aGVuIHRoZXJlIGlzIG9ubHkgYQorICAgIC8vIHNpbmdsZSBwYWNrYWdlLCB0aGUgbG9naWMgYXQgdGhlIGVuZCBvZiB0aGlzIHJvdXRpbmUgd29uJ3Qgd29yayBpZgorICAgIC8vIHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgdGhyZWFkIC0gaXQgd291bGQgdHJ5IHRvIGZvcm0gYW4gQWRkcmVzcworICAgIC8vIG9iamVjdCB3aXRoIGRlcHRoIDAuCisgICAgLy8KKyAgICBLTVBfQVNTRVJUKG5BcGljcyA+IDApOworICAgIGlmIChuQXBpY3MgPT0gMSkgeworICAgICAgICBfX2ttcF9uY29yZXMgPSBuUGFja2FnZXMgPSAxOworICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSBuQ29yZXNQZXJQa2cgPSAxOworICAgICAgICBfX2ttcF9odF9lbmFibGVkID0gRkFMU0U7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwgb2xkTWFzayk7CisKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmVXNlR2xvYkNwdWlkLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrKSB7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShJbml0T1NQcm9jU2V0UmVzcGVjdCwgIktNUF9BRkZJTklUWSIsIGJ1Zik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldE5vdFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBidWYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgS01QX0lORk9STShBdmFpbGFibGVPU1Byb2MsICJLTVBfQUZGSU5JVFkiLCBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgS01QX0lORk9STShUb3BvbG9neSwgIktNUF9BRkZJTklUWSIsIG5QYWNrYWdlcywgbkNvcmVzUGVyUGtnLAorICAgICAgICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUsIF9fa21wX25jb3Jlcyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKSB7CisgICAgICAgICAgICBfX2ttcF9mcmVlKHRocmVhZEluZm8pOworICAgICAgICAgICAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICAqYWRkcmVzczJvcyA9IChBZGRyVW5zUGFpciopX19rbXBfYWxsb2NhdGUoc2l6ZW9mKEFkZHJVbnNQYWlyKSk7CisgICAgICAgIEFkZHJlc3MgYWRkcigxKTsKKyAgICAgICAgYWRkci5sYWJlbHNbMF0gPSB0aHJlYWRJbmZvWzBdLnBrZ0lkOworICAgICAgICAoKmFkZHJlc3Myb3MpWzBdID0gQWRkclVuc1BhaXIoYWRkciwgdGhyZWFkSW5mb1swXS5vc0lkKTsKKworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPCAwKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfdG9wb2xvZ3koKmFkZHJlc3Myb3MsIDEsIDEsIDAsIC0xLCAtMSk7CisgICAgICAgIH0KKworICAgICAgICBfX2ttcF9mcmVlKHRocmVhZEluZm8pOworICAgICAgICBLTVBfQ1BVX0ZSRUUob2xkTWFzayk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIC8vCisgICAgLy8gU29ydCB0aGUgdGhyZWFkSW5mbyB0YWJsZSBieSBwaHlzaWNhbCBJZC4KKyAgICAvLworICAgIHFzb3J0KHRocmVhZEluZm8sIG5BcGljcywgc2l6ZW9mKCp0aHJlYWRJbmZvKSwKKyAgICAgIF9fa21wX2FmZmluaXR5X2NtcF9hcGljVGhyZWFkSW5mb19waHlzX2lkKTsKKworICAgIC8vCisgICAgLy8gVGhlIHRhYmxlIGlzIG5vdyBzb3J0ZWQgYnkgcGtnSWQgLyBjb3JlSWQgLyB0aHJlYWRJZCwgYnV0IHdlIHJlYWxseQorICAgIC8vIGRvbid0IGtub3cgdGhlIHJhZGl4IG9mIGFueSBvZiB0aGUgZmllbGRzLiAgcGtnSWQncyBtYXkgYmUgc3BhcnNlbHkKKyAgICAvLyBhc3NpZ25lZCBhbW9uZyB0aGUgY2hpcHMgb24gYSBzeXN0ZW0uICBBbHRob3VnaCBjb3JlSWQncyBhcmUgdXN1YWxseQorICAgIC8vIGFzc2lnbmVkIFswIC4uIGNvcmVzUGVyUGtnLTFdIGFuZCB0aHJlYWRJZCdzIGFyZSB1c3VhbGx5IGFzc2lnbmVkCisgICAgLy8gWzAuLnRocmVhZHNQZXJDb3JlLTFdLCB3ZSBkb24ndCB3YW50IHRvIG1ha2UgYW55IHN1Y2ggYXNzdW1wdGlvbnMuCisgICAgLy8KKyAgICAvLyBGb3IgdGhhdCBtYXR0ZXIsIHdlIGRvbid0IGtub3cgd2hhdCBjb3Jlc1BlclBrZyBhbmQgdGhyZWFkc1BlckNvcmUKKyAgICAvLyAob3IgdGhlIHRvdGFsICMgcGFja2FnZXMpIGFyZSBhdCB0aGlzIHBvaW50IC0gd2Ugd2FudCB0byBkZXRlcm1pbmUKKyAgICAvLyB0aGF0IG5vdy4gIFdlIG9ubHkgaGF2ZSBhbiB1cHBlciBib3VuZCBvbiB0aGUgZmlyc3QgdHdvIGZpZ3VyZXMuCisgICAgLy8KKyAgICAvLyBXZSBhbHNvIHBlcmZvcm0gYSBjb25zaXN0ZW5jeSBjaGVjayBhdCB0aGlzIHBvaW50OiB0aGUgdmFsdWVzIHJldHVybmVkCisgICAgLy8gYnkgdGhlIGNwdWlkIGluc3RydWN0aW9uIGZvciBhbnkgdGhyZWFkIGJvdW5kIHRvIGEgZ2l2ZW4gcGFja2FnZSBoYWQKKyAgICAvLyBiZXR0ZXIgcmV0dXJuIHRoZSBzYW1lIGluZm8gZm9yIG1heFRocmVhZHNQZXJQa2cgYW5kIG1heENvcmVzUGVyUGtnLgorICAgIC8vCisgICAgblBhY2thZ2VzID0gMTsKKyAgICBuQ29yZXNQZXJQa2cgPSAxOworICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IDE7CisgICAgdW5zaWduZWQgbkNvcmVzID0gMTsKKworICAgIHVuc2lnbmVkIHBrZ0N0ID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHJhZGlpCisgICAgdW5zaWduZWQgbGFzdFBrZ0lkID0gdGhyZWFkSW5mb1swXS5wa2dJZDsKKyAgICB1bnNpZ25lZCBjb3JlQ3QgPSAxOworICAgIHVuc2lnbmVkIGxhc3RDb3JlSWQgPSB0aHJlYWRJbmZvWzBdLmNvcmVJZDsKKyAgICB1bnNpZ25lZCB0aHJlYWRDdCA9IDE7CisgICAgdW5zaWduZWQgbGFzdFRocmVhZElkID0gdGhyZWFkSW5mb1swXS50aHJlYWRJZDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50cmEtcGtnIGNvbnNpc3QgY2hlY2tzCisgICAgdW5zaWduZWQgcHJldk1heENvcmVzUGVyUGtnID0gdGhyZWFkSW5mb1swXS5tYXhDb3Jlc1BlclBrZzsKKyAgICB1bnNpZ25lZCBwcmV2TWF4VGhyZWFkc1BlclBrZyA9IHRocmVhZEluZm9bMF0ubWF4VGhyZWFkc1BlclBrZzsKKworICAgIGZvciAoaSA9IDE7IGkgPCBuQXBpY3M7IGkrKykgeworICAgICAgICBpZiAodGhyZWFkSW5mb1tpXS5wa2dJZCAhPSBsYXN0UGtnSWQpIHsKKyAgICAgICAgICAgIG5Db3JlcysrOworICAgICAgICAgICAgcGtnQ3QrKzsKKyAgICAgICAgICAgIGxhc3RQa2dJZCA9IHRocmVhZEluZm9baV0ucGtnSWQ7CisgICAgICAgICAgICBpZiAoKGludCljb3JlQ3QgPiBuQ29yZXNQZXJQa2cpIG5Db3Jlc1BlclBrZyA9IGNvcmVDdDsKKyAgICAgICAgICAgIGNvcmVDdCA9IDE7CisgICAgICAgICAgICBsYXN0Q29yZUlkID0gdGhyZWFkSW5mb1tpXS5jb3JlSWQ7CisgICAgICAgICAgICBpZiAoKGludCl0aHJlYWRDdCA+IF9fa21wX25UaHJlYWRzUGVyQ29yZSkgX19rbXBfblRocmVhZHNQZXJDb3JlID0gdGhyZWFkQ3Q7CisgICAgICAgICAgICB0aHJlYWRDdCA9IDE7CisgICAgICAgICAgICBsYXN0VGhyZWFkSWQgPSB0aHJlYWRJbmZvW2ldLnRocmVhZElkOworCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGRpZmZlcmVudCBwYWNrYWdlLCBzbyBnbyBvbiB0byB0aGUgbmV4dCBpdGVyYXRpb24KKyAgICAgICAgICAgIC8vIHdpdGhvdXQgZG9pbmcgYW55IGNvbnNpc3RlbmN5IGNoZWNrcy4gIFJlc2V0IHRoZSBjb25zaXN0ZW5jeQorICAgICAgICAgICAgLy8gY2hlY2sgdmFycywgdGhvdWdoLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIHByZXZNYXhDb3Jlc1BlclBrZyA9IHRocmVhZEluZm9baV0ubWF4Q29yZXNQZXJQa2c7CisgICAgICAgICAgICBwcmV2TWF4VGhyZWFkc1BlclBrZyA9IHRocmVhZEluZm9baV0ubWF4VGhyZWFkc1BlclBrZzsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRocmVhZEluZm9baV0uY29yZUlkICE9IGxhc3RDb3JlSWQpIHsKKyAgICAgICAgICAgIG5Db3JlcysrOworICAgICAgICAgICAgY29yZUN0Kys7CisgICAgICAgICAgICBsYXN0Q29yZUlkID0gdGhyZWFkSW5mb1tpXS5jb3JlSWQ7CisgICAgICAgICAgICBpZiAoKGludCl0aHJlYWRDdCA+IF9fa21wX25UaHJlYWRzUGVyQ29yZSkgX19rbXBfblRocmVhZHNQZXJDb3JlID0gdGhyZWFkQ3Q7CisgICAgICAgICAgICB0aHJlYWRDdCA9IDE7CisgICAgICAgICAgICBsYXN0VGhyZWFkSWQgPSB0aHJlYWRJbmZvW2ldLnRocmVhZElkOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHRocmVhZEluZm9baV0udGhyZWFkSWQgIT0gbGFzdFRocmVhZElkKSB7CisgICAgICAgICAgICB0aHJlYWRDdCsrOworICAgICAgICAgICAgbGFzdFRocmVhZElkID0gdGhyZWFkSW5mb1tpXS50aHJlYWRJZDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX2ZyZWUodGhyZWFkSW5mbyk7CisgICAgICAgICAgICBLTVBfQ1BVX0ZSRUUob2xkTWFzayk7CisgICAgICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX0xlZ2FjeUFwaWNJRHNOb3RVbmlxdWU7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBDaGVjayB0byBtYWtlIGNlcnRhaW4gdGhhdCB0aGUgbWF4Q29yZXNQZXJQa2cgYW5kIG1heFRocmVhZHNQZXJQa2cKKyAgICAgICAgLy8gZmllbGRzIGFncmVlIGJldHdlZW4gYWxsIHRoZSB0aHJlYWRzIGJvdW5kcyB0byBhIGdpdmVuIHBhY2thZ2UuCisgICAgICAgIC8vCisgICAgICAgIGlmICgocHJldk1heENvcmVzUGVyUGtnICE9IHRocmVhZEluZm9baV0ubWF4Q29yZXNQZXJQa2cpCisgICAgICAgICAgfHwgKHByZXZNYXhUaHJlYWRzUGVyUGtnICE9IHRocmVhZEluZm9baV0ubWF4VGhyZWFkc1BlclBrZykpIHsKKyAgICAgICAgICAgIF9fa21wX2ZyZWUodGhyZWFkSW5mbyk7CisgICAgICAgICAgICBLTVBfQ1BVX0ZSRUUob2xkTWFzayk7CisgICAgICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX0luY29uc2lzdGVudENwdWlkSW5mbzsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBuUGFja2FnZXMgPSBwa2dDdDsKKyAgICBpZiAoKGludCljb3JlQ3QgPiBuQ29yZXNQZXJQa2cpIG5Db3Jlc1BlclBrZyA9IGNvcmVDdDsKKyAgICBpZiAoKGludCl0aHJlYWRDdCA+IF9fa21wX25UaHJlYWRzUGVyQ29yZSkgX19rbXBfblRocmVhZHNQZXJDb3JlID0gdGhyZWFkQ3Q7CisKKyAgICAvLworICAgIC8vIFdoZW4gYWZmaW5pdHkgaXMgb2ZmLCB0aGlzIHJvdXRpbmUgd2lsbCBzdGlsbCBiZSBjYWxsZWQgdG8gc2V0CisgICAgLy8gX19rbXBfaHRfZW5hYmxlZCwgJiBfX2ttcF9uY29yZXMsIGFzIHdlbGwgYXMgX19rbXBfblRocmVhZHNQZXJDb3JlLAorICAgIC8vIG5Db3Jlc1BlclBrZywgJiBuUGFja2FnZXMuICBNYWtlIHN1cmUgYWxsIHRoZXNlIHZhcnMgYXJlIHNldAorICAgIC8vIGNvcnJlY3RseSwgYW5kIHJldHVybiBub3cgaWYgYWZmaW5pdHkgaXMgbm90IGVuYWJsZWQuCisgICAgLy8KKyAgICBfX2ttcF9odF9lbmFibGVkID0gKF9fa21wX25UaHJlYWRzUGVyQ29yZSA+IDEpOworICAgIF9fa21wX25jb3JlcyA9IG5Db3JlczsKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKGJ1ZiwgS01QX0FGRklOX01BU0tfUFJJTlRfTEVOLCBvbGRNYXNrKTsKKworICAgICAgICBLTVBfSU5GT1JNKEFmZlVzZUdsb2JDcHVpZCwgIktNUF9BRkZJTklUWSIpOworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrKSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEluaXRPU1Byb2NTZXRSZXNwZWN0LCAiS01QX0FGRklOSVRZIiwgYnVmKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldE5vdFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBidWYpOworICAgICAgICB9CisgICAgICAgIEtNUF9JTkZPUk0oQXZhaWxhYmxlT1NQcm9jLCAiS01QX0FGRklOSVRZIiwgX19rbXBfYXZhaWxfcHJvYyk7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV91bmlmb3JtX3RvcG9sb2d5KCkpIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgS01QX0lORk9STShOb25Vbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgIH0KKyAgICAgICAgS01QX0lORk9STShUb3BvbG9neSwgIktNUF9BRkZJTklUWSIsIG5QYWNrYWdlcywgbkNvcmVzUGVyUGtnLAorICAgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSwgX19rbXBfbmNvcmVzKTsKKworICAgIH0KKworICAgIGlmIChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpIHsKKyAgICAgICAgX19rbXBfZnJlZSh0aHJlYWRJbmZvKTsKKyAgICAgICAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLworICAgIC8vIE5vdyB0aGF0IHdlJ3ZlIGRldGVybWluZWQgdGhlIG51bWJlciBvZiBwYWNrYWdlcywgdGhlIG51bWJlciBvZiBjb3JlcworICAgIC8vIHBlciBwYWNrYWdlLCBhbmQgdGhlIG51bWJlciBvZiB0aHJlYWRzIHBlciBjb3JlLCB3ZSBjYW4gY29uc3RydWN0IHRoZQorICAgIC8vIGRhdGEgc3RydWN0dXJlIHRoYXQgaXMgdG8gYmUgcmV0dXJuZWQuCisgICAgLy8KKyAgICBpbnQgcGtnTGV2ZWwgPSAwOworICAgIGludCBjb3JlTGV2ZWwgPSAobkNvcmVzUGVyUGtnIDw9IDEpID8gLTEgOiAxOworICAgIGludCB0aHJlYWRMZXZlbCA9IChfX2ttcF9uVGhyZWFkc1BlckNvcmUgPD0gMSkgPyAtMSA6ICgoY29yZUxldmVsID49IDApID8gMiA6IDEpOworICAgIHVuc2lnbmVkIGRlcHRoID0gKHBrZ0xldmVsID49IDApICsgKGNvcmVMZXZlbCA+PSAwKSArICh0aHJlYWRMZXZlbCA+PSAwKTsKKworICAgIEtNUF9BU1NFUlQoZGVwdGggPiAwKTsKKyAgICAqYWRkcmVzczJvcyA9IChBZGRyVW5zUGFpciopX19rbXBfYWxsb2NhdGUoc2l6ZW9mKEFkZHJVbnNQYWlyKSAqIG5BcGljcyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbkFwaWNzOyArK2kpIHsKKyAgICAgICAgQWRkcmVzcyBhZGRyKGRlcHRoKTsKKyAgICAgICAgdW5zaWduZWQgb3MgPSB0aHJlYWRJbmZvW2ldLm9zSWQ7CisgICAgICAgIGludCBkID0gMDsKKworICAgICAgICBpZiAocGtnTGV2ZWwgPj0gMCkgeworICAgICAgICAgICAgYWRkci5sYWJlbHNbZCsrXSA9IHRocmVhZEluZm9baV0ucGtnSWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvcmVMZXZlbCA+PSAwKSB7CisgICAgICAgICAgICBhZGRyLmxhYmVsc1tkKytdID0gdGhyZWFkSW5mb1tpXS5jb3JlSWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRocmVhZExldmVsID49IDApIHsKKyAgICAgICAgICAgIGFkZHIubGFiZWxzW2QrK10gPSB0aHJlYWRJbmZvW2ldLnRocmVhZElkOworICAgICAgICB9CisgICAgICAgICgqYWRkcmVzczJvcylbaV0gPSBBZGRyVW5zUGFpcihhZGRyLCBvcyk7CisgICAgfQorCisgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzIDwgMCkgeworICAgICAgICAvLworICAgICAgICAvLyBTZXQgdGhlIGdyYW51bGFyaXR5IGxldmVsIGJhc2VkIG9uIHdoYXQgbGV2ZWxzIGFyZSBtb2RlbGVkCisgICAgICAgIC8vIGluIHRoZSBtYWNoaW5lIHRvcG9sb2d5IG1hcC4KKyAgICAgICAgLy8KKyAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPSAwOworICAgICAgICBpZiAoKHRocmVhZExldmVsID49IDApCisgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X2dyYW4gPiBhZmZpbml0eV9ncmFuX3RocmVhZCkpIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChjb3JlTGV2ZWwgPj0gMCkgJiYgKF9fa21wX2FmZmluaXR5X2dyYW4gPiBhZmZpbml0eV9ncmFuX2NvcmUpKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscysrOworICAgICAgICB9CisgICAgICAgIGlmICgocGtnTGV2ZWwgPj0gMCkgJiYgKF9fa21wX2FmZmluaXR5X2dyYW4gPiBhZmZpbml0eV9ncmFuX3BhY2thZ2UpKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscysrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfdG9wb2xvZ3koKmFkZHJlc3Myb3MsIG5BcGljcywgZGVwdGgsIHBrZ0xldmVsLAorICAgICAgICAgIGNvcmVMZXZlbCwgdGhyZWFkTGV2ZWwpOworICAgIH0KKworICAgIF9fa21wX2ZyZWUodGhyZWFkSW5mbyk7CisgICAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICAgIHJldHVybiBkZXB0aDsKK30KKworCisvLworLy8gSW50ZWwoUikgbWljcm9hcmNoaXRlY3R1cmUgY29kZSBuYW1lIE5laGFsZW0sIER1bm5pbmd0b24gYW5kIGxhdGVyCisvLyBhcmNoaXRlY3R1cmVzIHN1cHBvcnQgYSBuZXdlciBpbnRlcmZhY2UgZm9yIHNwZWNpZnlpbmcgdGhlIHgyQVBJQyBJZHMsCisvLyBiYXNlZCBvbiBjcHVpZCBsZWFmIDExLgorLy8KK3N0YXRpYyBpbnQKK19fa21wX2FmZmluaXR5X2NyZWF0ZV94MmFwaWNpZF9tYXAoQWRkclVuc1BhaXIgKiphZGRyZXNzMm9zLAorICBrbXBfaTE4bl9pZF90ICpjb25zdCBtc2dfaWQpCit7CisgICAga21wX2NwdWlkIGJ1ZjsKKworICAgICphZGRyZXNzMm9zID0gTlVMTDsKKyAgICAqbXNnX2lkID0ga21wX2kxOG5fbnVsbDsKKworICAgIC8vCisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIGNwdWlkIGxlYWYgMTEgaXMgc3VwcG9ydGVkLgorICAgIC8vCisgICAgX19rbXBfeDg2X2NwdWlkKDAsIDAsICZidWYpOworICAgIGlmIChidWYuZWF4IDwgMTEpIHsKKyAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9Ob0xlYWYxMVN1cHBvcnQ7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgX19rbXBfeDg2X2NwdWlkKDExLCAwLCAmYnVmKTsKKyAgICBpZiAoYnVmLmVieCA9PSAwKSB7CisgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfTm9MZWFmMTFTdXBwb3J0OworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBGaW5kIHRoZSBudW1iZXIgb2YgbGV2ZWxzIGluIHRoZSBtYWNoaW5lIHRvcG9sb2d5LiAgV2hpbGUgd2UncmUgYXQgaXQsCisgICAgLy8gZ2V0IHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgX19rbXBfblRocmVhZHNQZXJDb3JlICYgbkNvcmVzUGVyUGtnLiAgV2Ugd2lsbAorICAgIC8vIHRyeSB0byBnZXQgbW9yZSBhY2N1cmF0ZSB2YWx1ZXMgbGF0ZXIgYnkgZXhwbGljaXRseSBjb3VudGluZyB0aGVtLAorICAgIC8vIGJ1dCBnZXQgcmVhc29uYWJsZSBkZWZhdWx0cyBub3csIGluIGNhc2Ugd2UgcmV0dXJuIGVhcmx5LgorICAgIC8vCisgICAgaW50IGxldmVsOworICAgIGludCB0aHJlYWRMZXZlbCA9IC0xOworICAgIGludCBjb3JlTGV2ZWwgPSAtMTsKKyAgICBpbnQgcGtnTGV2ZWwgPSAtMTsKKyAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSBuQ29yZXNQZXJQa2cgPSBuUGFja2FnZXMgPSAxOworCisgICAgZm9yIChsZXZlbCA9IDA7OyBsZXZlbCsrKSB7CisgICAgICAgIGlmIChsZXZlbCA+IDMxKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gRklYTUU6IEhhY2sgZm9yIERQRDIwMDE2MzE4MAorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIElmIGxldmVsIGlzIGJpZyB0aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nIC0+IGV4aXRpbmcKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBUaGVyZSBjb3VsZCBhY3R1YWxseSBiZSAzMiB2YWxpZCBsZXZlbHMgaW4gdGhlIG1hY2hpbmUgdG9wb2xvZ3ksCisgICAgICAgICAgICAvLyBidXQgc28gZmFyLCB0aGUgb25seSBtYWNoaW5lIHdlIGhhdmUgc2VlbiB3aGljaCBkb2VzIG5vdCBleGl0CisgICAgICAgICAgICAvLyB0aGlzIGxvb3AgYmVmb3JlIGl0ZXJhdGlvbiAzMiBoYXMgZnViYXIgeDJBUElDIHNldHRpbmdzLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIEZvciBub3csIGp1c3QgcmVqZWN0IHRoaXMgY2FzZSBiYXNlZCB1cG9uIGxvb3AgdHJpcCBjb3VudC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX0ludmFsaWRDcHVpZEluZm87CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfeDg2X2NwdWlkKDExLCBsZXZlbCwgJmJ1Zik7CisgICAgICAgIGlmIChidWYuZWJ4ID09IDApIHsKKyAgICAgICAgICAgIGlmIChwa2dMZXZlbCA8IDApIHsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIFdpbGwgaW5mZXIgblBhY2thZ2VzIGZyb20gX19rbXBfeHByb2MKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIHBrZ0xldmVsID0gbGV2ZWw7CisgICAgICAgICAgICAgICAgbGV2ZWwrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGludCBraW5kID0gKGJ1Zi5lY3ggPj4gOCkgJiAweGZmOworICAgICAgICBpZiAoa2luZCA9PSAxKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gU01UIGxldmVsCisgICAgICAgICAgICAvLworICAgICAgICAgICAgdGhyZWFkTGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgICAgIGNvcmVMZXZlbCA9IC0xOworICAgICAgICAgICAgcGtnTGV2ZWwgPSAtMTsKKyAgICAgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IGJ1Zi5lYnggJiAweGZmOworICAgICAgICAgICAgaWYgKF9fa21wX25UaHJlYWRzUGVyQ29yZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9JbnZhbGlkQ3B1aWRJbmZvOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChraW5kID09IDIpIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBjb3JlIGxldmVsCisgICAgICAgICAgICAvLworICAgICAgICAgICAgY29yZUxldmVsID0gbGV2ZWw7CisgICAgICAgICAgICBwa2dMZXZlbCA9IC0xOworICAgICAgICAgICAgbkNvcmVzUGVyUGtnID0gYnVmLmVieCAmIDB4ZmY7CisgICAgICAgICAgICBpZiAobkNvcmVzUGVyUGtnID09IDApIHsKKyAgICAgICAgICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX0ludmFsaWRDcHVpZEluZm87CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKGxldmVsIDw9IDApIHsKKyAgICAgICAgICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX0ludmFsaWRDcHVpZEluZm87CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBrZ0xldmVsID49IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBrZ0xldmVsID0gbGV2ZWw7CisgICAgICAgICAgICBuUGFja2FnZXMgPSBidWYuZWJ4ICYgMHhmZjsKKyAgICAgICAgICAgIGlmIChuUGFja2FnZXMgPT0gMCkgeworICAgICAgICAgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfSW52YWxpZENwdWlkSW5mbzsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaW50IGRlcHRoID0gbGV2ZWw7CisKKyAgICAvLworICAgIC8vIEluIHRoZSBhYm92ZSBsb29wLCAibGV2ZWwiIHdhcyBjb3VudGVkIGZyb20gdGhlIGZpbmVzdCBsZXZlbCAodXN1YWxseQorICAgIC8vIHRocmVhZCkgdG8gdGhlIGNvYXJzZXN0LiAgVGhlIGNhbGxlciBleHBlY3RzIHRoYXQgd2Ugd2lsbCBwbGFjZSB0aGUKKyAgICAvLyBsYWJlbHMgaW4gKCphZGRyZXNzMm9zKVtdLmZpcnN0LmxhYmVsc1tdIGluIHRoZSBpbnZlcnNlIG9yZGVyLCBzbworICAgIC8vIHdlIG5lZWQgdG8gaW52ZXJ0IHRoZSB2YXJzIHNheWluZyB3aGljaCBsZXZlbCBtZWFucyB3aGF0LgorICAgIC8vCisgICAgaWYgKHRocmVhZExldmVsID49IDApIHsKKyAgICAgICAgdGhyZWFkTGV2ZWwgPSBkZXB0aCAtIHRocmVhZExldmVsIC0gMTsKKyAgICB9CisgICAgaWYgKGNvcmVMZXZlbCA+PSAwKSB7CisgICAgICAgIGNvcmVMZXZlbCA9IGRlcHRoIC0gY29yZUxldmVsIC0gMTsKKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVChwa2dMZXZlbCA+PSAwKTsKKyAgICBwa2dMZXZlbCA9IGRlcHRoIC0gcGtnTGV2ZWwgLSAxOworCisgICAgLy8KKyAgICAvLyBUaGUgYWxnb3JpdGhtIHVzZWQgc3RhcnRzIGJ5IHNldHRpbmcgdGhlIGFmZmluaXR5IHRvIGVhY2ggYXZhaWxhYmxlCisgICAgLy8gdGhyZWFkIGFuZCByZXRyaWV2aW5nIGluZm8gZnJvbSB0aGUgY3B1aWQgaW5zdHJ1Y3Rpb24sIHNvIGlmIHdlIGFyZSBub3QKKyAgICAvLyBjYXBhYmxlIG9mIGNhbGxpbmcgX19rbXBfYWZmaW5pdHlfZ2V0X21hcCgpL19fa21wX2FmZmluaXR5X2dldF9tYXAoKSwKKyAgICAvLyB0aGVuIHdlIG5lZWQgdG8gZG8gc29tZXRoaW5nIGVsc2UgLSB1c2UgdGhlIGRlZmF1bHRzIHRoYXQgd2UgY2FsY3VsYXRlZAorICAgIC8vIGZyb20gaXNzdWluZyBjcHVpZCB3aXRob3V0IGJpbmRpbmcgdG8gZWFjaCBwcm9jLgorICAgIC8vCisgICAgaWYgKCEgS01QX0FGRklOSVRZX0NBUEFCTEUoKSkKKyAgICB7CisgICAgICAgIC8vCisgICAgICAgIC8vIEhhY2sgdG8gdHJ5IGFuZCBpbmZlciB0aGUgbWFjaGluZSB0b3BvbG9neSB1c2luZyBvbmx5IHRoZSBkYXRhCisgICAgICAgIC8vIGF2YWlsYWJsZSBmcm9tIGNwdWlkIG9uIHRoZSBjdXJyZW50IHRocmVhZCwgYW5kIF9fa21wX3hwcm9jLgorICAgICAgICAvLworICAgICAgICBLTVBfQVNTRVJUKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSk7CisKKyAgICAgICAgX19rbXBfbmNvcmVzID0gX19rbXBfeHByb2MgLyBfX2ttcF9uVGhyZWFkc1BlckNvcmU7CisgICAgICAgIG5QYWNrYWdlcyA9IChfX2ttcF94cHJvYyArIG5Db3Jlc1BlclBrZyAtIDEpIC8gbkNvcmVzUGVyUGtnOworICAgICAgICBfX2ttcF9odF9lbmFibGVkID0gKF9fa21wX25UaHJlYWRzUGVyQ29yZSA+IDEpOworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgS01QX0lORk9STShBZmZOb3RDYXBhYmxlVXNlTG9jQ3B1aWRMMTEsICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQXZhaWxhYmxlT1NQcm9jLCAiS01QX0FGRklOSVRZIiwgX19rbXBfYXZhaWxfcHJvYyk7CisgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdW5pZm9ybV90b3BvbG9neSgpKSB7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShVbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oTm9uVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgS01QX0lORk9STShUb3BvbG9neSwgIktNUF9BRkZJTklUWSIsIG5QYWNrYWdlcywgbkNvcmVzUGVyUGtnLAorICAgICAgICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUsIF9fa21wX25jb3Jlcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8KKyAgICAvLworICAgIC8vIEZyb20gaGVyZSBvbiwgd2UgY2FuIGFzc3VtZSB0aGF0IGl0IGlzIHNhZmUgdG8gY2FsbAorICAgIC8vIF9fa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkoKSBhbmQgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eSgpLAorICAgIC8vIGV2ZW4gaWYgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X25vbmUuCisgICAgLy8KKworICAgIC8vCisgICAgLy8gU2F2ZSB0aGUgYWZmaW5pdHkgbWFzayBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLgorICAgIC8vCisgICAga21wX2FmZmluX21hc2tfdCAqb2xkTWFzazsKKyAgICBLTVBfQ1BVX0FMTE9DKG9sZE1hc2spOworICAgIF9fa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkob2xkTWFzaywgVFJVRSk7CisKKyAgICAvLworICAgIC8vIEFsbG9jYXRlIHRoZSBkYXRhIHN0cnVjdHVyZSB0byBiZSByZXR1cm5lZC4KKyAgICAvLworICAgIEFkZHJVbnNQYWlyICpyZXR2YWwgPSAoQWRkclVuc1BhaXIgKikKKyAgICAgIF9fa21wX2FsbG9jYXRlKHNpemVvZihBZGRyVW5zUGFpcikgKiBfX2ttcF9hdmFpbF9wcm9jKTsKKworICAgIC8vCisgICAgLy8gUnVuIHRocm91Z2ggZWFjaCBvZiB0aGUgYXZhaWxhYmxlIGNvbnRleHRzLCBiaW5kaW5nIHRoZSBjdXJyZW50IHRocmVhZAorICAgIC8vIHRvIGl0LCBhbmQgb2J0YWluaW5nIHRoZSBwZXJ0aW5lbnQgaW5mb3JtYXRpb24gdXNpbmcgdGhlIGNwdWlkIGluc3RyLgorICAgIC8vCisgICAgdW5zaWduZWQgaW50IHByb2M7CisgICAgaW50IG5BcGljcyA9IDA7CisgICAgZm9yIChwcm9jID0gMDsgcHJvYyA8IEtNUF9DUFVfU0VUU0laRTsgKytwcm9jKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIFNraXAgdGhpcyBwcm9jIGlmIGl0IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgbWFjaGluZSBtb2RlbC4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCEgS01QX0NQVV9JU1NFVChwcm9jLCBmdWxsTWFzaykpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQobkFwaWNzIDwgX19rbXBfYXZhaWxfcHJvYyk7CisKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfYmluZF90aHJlYWQocHJvYyk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRXh0cmFjaCB0aGUgbGFiZWxzIGZvciBlYWNoIGxldmVsIGluIHRoZSBtYWNoaW5lIHRvcG9sb2d5IG1hcAorICAgICAgICAvLyBmcm9tIHRoZSBBcGljIElELgorICAgICAgICAvLworICAgICAgICBBZGRyZXNzIGFkZHIoZGVwdGgpOworICAgICAgICBpbnQgcHJldl9zaGlmdCA9IDA7CisKKyAgICAgICAgZm9yIChsZXZlbCA9IDA7IGxldmVsIDwgZGVwdGg7IGxldmVsKyspIHsKKyAgICAgICAgICAgIF9fa21wX3g4Nl9jcHVpZCgxMSwgbGV2ZWwsICZidWYpOworICAgICAgICAgICAgdW5zaWduZWQgYXBpY0lkID0gYnVmLmVkeDsKKyAgICAgICAgICAgIGlmIChidWYuZWJ4ID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAobGV2ZWwgIT0gZGVwdGggLSAxKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9JbmNvbnNpc3RlbnRDcHVpZEluZm87CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYWRkci5sYWJlbHNbZGVwdGggLSBsZXZlbCAtIDFdID0gYXBpY0lkID4+IHByZXZfc2hpZnQ7CisgICAgICAgICAgICAgICAgbGV2ZWwrKzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBzaGlmdCA9IGJ1Zi5lYXggJiAweDFmOworICAgICAgICAgICAgaW50IG1hc2sgPSAoMSA8PCBzaGlmdCkgLSAxOworICAgICAgICAgICAgYWRkci5sYWJlbHNbZGVwdGggLSBsZXZlbCAtIDFdID0gKGFwaWNJZCAmIG1hc2spID4+IHByZXZfc2hpZnQ7CisgICAgICAgICAgICBwcmV2X3NoaWZ0ID0gc2hpZnQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxldmVsICE9IGRlcHRoKSB7CisgICAgICAgICAgICBLTVBfQ1BVX0ZSRUUob2xkTWFzayk7CisgICAgICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX0luY29uc2lzdGVudENwdWlkSW5mbzsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHZhbFtuQXBpY3NdID0gQWRkclVuc1BhaXIoYWRkciwgcHJvYyk7CisgICAgICAgIG5BcGljcysrOworICAgIH0KKworICAgIC8vCisgICAgLy8gV2UndmUgY29sbGVjdGVkIGFsbCB0aGUgaW5mbyB3ZSBuZWVkLgorICAgIC8vIFJlc3RvcmUgdGhlIG9sZCBhZmZpbml0eSBtYXNrIGZvciB0aGlzIHRocmVhZC4KKyAgICAvLworICAgIF9fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkob2xkTWFzaywgVFJVRSk7CisKKyAgICAvLworICAgIC8vIElmIHRoZXJlJ3Mgb25seSBvbmUgdGhyZWFkIGNvbnRleHQgdG8gYmluZCB0bywgcmV0dXJuIG5vdy4KKyAgICAvLworICAgIEtNUF9BU1NFUlQobkFwaWNzID4gMCk7CisgICAgaWYgKG5BcGljcyA9PSAxKSB7CisgICAgICAgIF9fa21wX25jb3JlcyA9IG5QYWNrYWdlcyA9IDE7CisgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IG5Db3Jlc1BlclBrZyA9IDE7CisgICAgICAgIF9fa21wX2h0X2VuYWJsZWQgPSBGQUxTRTsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgIGNoYXIgYnVmW0tNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTl07CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKGJ1ZiwgS01QX0FGRklOX01BU0tfUFJJTlRfTEVOLCBvbGRNYXNrKTsKKworICAgICAgICAgICAgS01QX0lORk9STShBZmZVc2VHbG9iQ3B1aWRMMTEsICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2spIHsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEluaXRPU1Byb2NTZXRSZXNwZWN0LCAiS01QX0FGRklOSVRZIiwgYnVmKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShJbml0T1NQcm9jU2V0Tm90UmVzcGVjdCwgIktNUF9BRkZJTklUWSIsIGJ1Zik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBLTVBfSU5GT1JNKEF2YWlsYWJsZU9TUHJvYywgIktNUF9BRkZJTklUWSIsIF9fa21wX2F2YWlsX3Byb2MpOworICAgICAgICAgICAgS01QX0lORk9STShVbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICBLTVBfSU5GT1JNKFRvcG9sb2d5LCAiS01QX0FGRklOSVRZIiwgblBhY2thZ2VzLCBuQ29yZXNQZXJQa2csCisgICAgICAgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSwgX19rbXBfbmNvcmVzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpIHsKKyAgICAgICAgICAgIF9fa21wX2ZyZWUocmV0dmFsKTsKKyAgICAgICAgICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRm9ybSBhbiBBZGRyZXNzIG9iamVjdCB3aGljaCBvbmx5IGluY2x1ZGVzIHRoZSBwYWNrYWdlIGxldmVsLgorICAgICAgICAvLworICAgICAgICBBZGRyZXNzIGFkZHIoMSk7CisgICAgICAgIGFkZHIubGFiZWxzWzBdID0gcmV0dmFsWzBdLmZpcnN0LmxhYmVsc1twa2dMZXZlbF07CisgICAgICAgIHJldHZhbFswXS5maXJzdCA9IGFkZHI7CisKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzIDwgMCkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X3RvcG9sb2d5KHJldHZhbCwgMSwgMSwgMCwgLTEsIC0xKTsKKyAgICAgICAgfQorCisgICAgICAgICphZGRyZXNzMm9zID0gcmV0dmFsOworICAgICAgICBLTVBfQ1BVX0ZSRUUob2xkTWFzayk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIC8vCisgICAgLy8gU29ydCB0aGUgdGFibGUgYnkgcGh5c2ljYWwgSWQuCisgICAgLy8KKyAgICBxc29ydChyZXR2YWwsIG5BcGljcywgc2l6ZW9mKCpyZXR2YWwpLCBfX2ttcF9hZmZpbml0eV9jbXBfQWRkcmVzc19sYWJlbHMpOworCisgICAgLy8KKyAgICAvLyBGaW5kIHRoZSByYWRpeCBhdCBlYWNoIG9mIHRoZSBsZXZlbHMuCisgICAgLy8KKyAgICB1bnNpZ25lZCAqdG90YWxzID0gKHVuc2lnbmVkICopX19rbXBfYWxsb2NhdGUoZGVwdGggKiBzaXplb2YodW5zaWduZWQpKTsKKyAgICB1bnNpZ25lZCAqY291bnRzID0gKHVuc2lnbmVkICopX19rbXBfYWxsb2NhdGUoZGVwdGggKiBzaXplb2YodW5zaWduZWQpKTsKKyAgICB1bnNpZ25lZCAqbWF4Q3QgPSAodW5zaWduZWQgKilfX2ttcF9hbGxvY2F0ZShkZXB0aCAqIHNpemVvZih1bnNpZ25lZCkpOworICAgIHVuc2lnbmVkICpsYXN0ID0gKHVuc2lnbmVkICopX19rbXBfYWxsb2NhdGUoZGVwdGggKiBzaXplb2YodW5zaWduZWQpKTsKKyAgICBmb3IgKGxldmVsID0gMDsgbGV2ZWwgPCBkZXB0aDsgbGV2ZWwrKykgeworICAgICAgICB0b3RhbHNbbGV2ZWxdID0gMTsKKyAgICAgICAgbWF4Q3RbbGV2ZWxdID0gMTsKKyAgICAgICAgY291bnRzW2xldmVsXSA9IDE7CisgICAgICAgIGxhc3RbbGV2ZWxdID0gcmV0dmFsWzBdLmZpcnN0LmxhYmVsc1tsZXZlbF07CisgICAgfQorCisgICAgLy8KKyAgICAvLyBGcm9tIGhlcmUgb24sIHRoZSBpdGVyYXRpb24gdmFyaWFibGUgImxldmVsIiBydW5zIGZyb20gdGhlIGZpbmVzdAorICAgIC8vIGxldmVsIHRvIHRoZSBjb2Fyc2VzdCwgaS5lLiB3ZSBpdGVyYXRlIGZvcndhcmQgdGhyb3VnaAorICAgIC8vICgqYWRkcmVzczJvcylbXS5maXJzdC5sYWJlbHNbXSAtIGluIHRoZSBwcmV2aW91cyBsb29wcywgd2UgaXRlcmF0ZWQKKyAgICAvLyBiYWNrd2FyZHMuCisgICAgLy8KKyAgICBmb3IgKHByb2MgPSAxOyAoaW50KXByb2MgPCBuQXBpY3M7IHByb2MrKykgeworICAgICAgICBpbnQgbGV2ZWw7CisgICAgICAgIGZvciAobGV2ZWwgPSAwOyBsZXZlbCA8IGRlcHRoOyBsZXZlbCsrKSB7CisgICAgICAgICAgICBpZiAocmV0dmFsW3Byb2NdLmZpcnN0LmxhYmVsc1tsZXZlbF0gIT0gbGFzdFtsZXZlbF0pIHsKKyAgICAgICAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSBsZXZlbCArIDE7IGogPCBkZXB0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIHRvdGFsc1tqXSsrOworICAgICAgICAgICAgICAgICAgICBjb3VudHNbal0gPSAxOworICAgICAgICAgICAgICAgICAgICAvLyBUaGUgbGluZSBiZWxvdyBjYXVzZXMgcHJpbnRpbmcgaW5jb3JyZWN0IHRvcG9sb2d5IGluZm9ybWF0aW9uCisgICAgICAgICAgICAgICAgICAgIC8vIGluIGNhc2UgdGhlIG1heCB2YWx1ZSBmb3Igc29tZSBsZXZlbCAobWF4Q3RbbGV2ZWxdKSBpcyBlbmNvdW50ZXJlZCBlYXJsaWVyIHRoYW4KKyAgICAgICAgICAgICAgICAgICAgLy8gc29tZSBsZXNzIHZhbHVlIHdoaWxlIGdvaW5nIHRocm91Z2ggdGhlIGFycmF5LgorICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZXhhbXBsZSwgbGV0IHBrZzAgaGFzIDQgY29yZXMgYW5kIHBrZzEgaGFzIDIgY29yZXMuIFRoZW4gbWF4Q3RbMV0gPT0gMgorICAgICAgICAgICAgICAgICAgICAvLyB3aGVyZWFzIGl0IG11c3QgYmUgNC4KKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyEhISBDaGVjayBpZiBpdCBjYW4gYmUgY29tbWVudGVkIHNhZmVseQorICAgICAgICAgICAgICAgICAgICAvL21heEN0W2pdID0gMTsKKyAgICAgICAgICAgICAgICAgICAgbGFzdFtqXSA9IHJldHZhbFtwcm9jXS5maXJzdC5sYWJlbHNbal07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRvdGFsc1tsZXZlbF0rKzsKKyAgICAgICAgICAgICAgICBjb3VudHNbbGV2ZWxdKys7CisgICAgICAgICAgICAgICAgaWYgKGNvdW50c1tsZXZlbF0gPiBtYXhDdFtsZXZlbF0pIHsKKyAgICAgICAgICAgICAgICAgICAgbWF4Q3RbbGV2ZWxdID0gY291bnRzW2xldmVsXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGFzdFtsZXZlbF0gPSByZXR2YWxbcHJvY10uZmlyc3QubGFiZWxzW2xldmVsXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGxldmVsID09IGRlcHRoIC0gMSkgeworICAgICAgICAgICAgICAgIF9fa21wX2ZyZWUobGFzdCk7CisgICAgICAgICAgICAgICAgX19rbXBfZnJlZShtYXhDdCk7CisgICAgICAgICAgICAgICAgX19rbXBfZnJlZShjb3VudHMpOworICAgICAgICAgICAgICAgIF9fa21wX2ZyZWUodG90YWxzKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9mcmVlKHJldHZhbCk7CisgICAgICAgICAgICAgICAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICAgICAgICAgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfeDJBcGljSURzTm90VW5pcXVlOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vCisgICAgLy8gV2hlbiBhZmZpbml0eSBpcyBvZmYsIHRoaXMgcm91dGluZSB3aWxsIHN0aWxsIGJlIGNhbGxlZCB0byBzZXQKKyAgICAvLyBfX2ttcF9odF9lbmFibGVkLCAmIF9fa21wX25jb3JlcywgYXMgd2VsbCBhcyBfX2ttcF9uVGhyZWFkc1BlckNvcmUsCisgICAgLy8gbkNvcmVzUGVyUGtnLCAmIG5QYWNrYWdlcy4gIE1ha2Ugc3VyZSBhbGwgdGhlc2UgdmFycyBhcmUgc2V0CisgICAgLy8gY29ycmVjdGx5LCBhbmQgcmV0dXJuIGlmIGFmZmluaXR5IGlzIG5vdCBlbmFibGVkLgorICAgIC8vCisgICAgaWYgKHRocmVhZExldmVsID49IDApIHsKKyAgICAgICAgX19rbXBfblRocmVhZHNQZXJDb3JlID0gbWF4Q3RbdGhyZWFkTGV2ZWxdOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfblRocmVhZHNQZXJDb3JlID0gMTsKKyAgICB9CisgICAgX19rbXBfaHRfZW5hYmxlZCA9IChfX2ttcF9uVGhyZWFkc1BlckNvcmUgPiAxKTsKKworICAgIG5QYWNrYWdlcyA9IHRvdGFsc1twa2dMZXZlbF07CisKKyAgICBpZiAoY29yZUxldmVsID49IDApIHsKKyAgICAgICAgX19rbXBfbmNvcmVzID0gdG90YWxzW2NvcmVMZXZlbF07CisgICAgICAgIG5Db3Jlc1BlclBrZyA9IG1heEN0W2NvcmVMZXZlbF07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBfX2ttcF9uY29yZXMgPSBuUGFja2FnZXM7CisgICAgICAgIG5Db3Jlc1BlclBrZyA9IDE7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIG1hY2hpbmUgdG9wb2xvZ3kgaXMgdW5pZm9ybQorICAgIC8vCisgICAgdW5zaWduZWQgcHJvZCA9IG1heEN0WzBdOworICAgIGZvciAobGV2ZWwgPSAxOyBsZXZlbCA8IGRlcHRoOyBsZXZlbCsrKSB7CisgICAgICAgcHJvZCAqPSBtYXhDdFtsZXZlbF07CisgICAgfQorICAgIGJvb2wgdW5pZm9ybSA9IChwcm9kID09IHRvdGFsc1tsZXZlbCAtIDFdKTsKKworICAgIC8vCisgICAgLy8gUHJpbnQgdGhlIG1hY2hpbmUgdG9wb2xvZ3kgc3VtbWFyeS4KKyAgICAvLworICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgIGNoYXIgbWFza1tLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKG1hc2ssIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwgb2xkTWFzayk7CisKKyAgICAgICAgS01QX0lORk9STShBZmZVc2VHbG9iQ3B1aWRMMTEsICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzaykgeworICAgICAgICAgICAgS01QX0lORk9STShJbml0T1NQcm9jU2V0UmVzcGVjdCwgIktNUF9BRkZJTklUWSIsIG1hc2spOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgS01QX0lORk9STShJbml0T1NQcm9jU2V0Tm90UmVzcGVjdCwgIktNUF9BRkZJTklUWSIsIG1hc2spOworICAgICAgICB9CisgICAgICAgIEtNUF9JTkZPUk0oQXZhaWxhYmxlT1NQcm9jLCAiS01QX0FGRklOSVRZIiwgX19rbXBfYXZhaWxfcHJvYyk7CisgICAgICAgIGlmICh1bmlmb3JtKSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKFVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oTm9uVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICB9CisKKyAgICAgICAga21wX3N0cl9idWZfdCBidWY7CisgICAgICAgIF9fa21wX3N0cl9idWZfaW5pdCgmYnVmKTsKKworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICIlZCIsIHRvdGFsc1swXSk7CisgICAgICAgIGZvciAobGV2ZWwgPSAxOyBsZXZlbCA8PSBwa2dMZXZlbDsgbGV2ZWwrKykgeworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiIHggJWQiLCBtYXhDdFtsZXZlbF0pOworICAgICAgICB9CisgICAgICAgIEtNUF9JTkZPUk0oVG9wb2xvZ3lFeHRyYSwgIktNUF9BRkZJTklUWSIsIGJ1Zi5zdHIsIG5Db3Jlc1BlclBrZywKKyAgICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUsIF9fa21wX25jb3Jlcyk7CisKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCZidWYpOworICAgIH0KKworICAgIGlmIChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpIHsKKyAgICAgICAgX19rbXBfZnJlZShsYXN0KTsKKyAgICAgICAgX19rbXBfZnJlZShtYXhDdCk7CisgICAgICAgIF9fa21wX2ZyZWUoY291bnRzKTsKKyAgICAgICAgX19rbXBfZnJlZSh0b3RhbHMpOworICAgICAgICBfX2ttcF9mcmVlKHJldHZhbCk7CisgICAgICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBGaW5kIGFueSBsZXZlbHMgd2l0aCByYWRpaXggMSwgYW5kIHJlbW92ZSB0aGVtIGZyb20gdGhlIG1hcAorICAgIC8vIChleGNlcHQgZm9yIHRoZSBwYWNrYWdlIGxldmVsKS4KKyAgICAvLworICAgIGludCBuZXdfZGVwdGggPSAwOworICAgIGZvciAobGV2ZWwgPSAwOyBsZXZlbCA8IGRlcHRoOyBsZXZlbCsrKSB7CisgICAgICAgIGlmICgobWF4Q3RbbGV2ZWxdID09IDEpICYmIChsZXZlbCAhPSBwa2dMZXZlbCkpIHsKKyAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgbmV3X2RlcHRoKys7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBJZiB3ZSBhcmUgcmVtb3ZpbmcgYW55IGxldmVscywgYWxsb2NhdGUgYSBuZXcgdmVjdG9yIHRvIHJldHVybiwKKyAgICAvLyBhbmQgY29weSB0aGUgcmVsZXZhbnQgaW5mb3JtYXRpb24gdG8gaXQuCisgICAgLy8KKyAgICBpZiAobmV3X2RlcHRoICE9IGRlcHRoKSB7CisgICAgICAgIEFkZHJVbnNQYWlyICpuZXdfcmV0dmFsID0gKEFkZHJVbnNQYWlyICopX19rbXBfYWxsb2NhdGUoCisgICAgICAgICAgc2l6ZW9mKEFkZHJVbnNQYWlyKSAqIG5BcGljcyk7CisgICAgICAgIGZvciAocHJvYyA9IDA7IChpbnQpcHJvYyA8IG5BcGljczsgcHJvYysrKSB7CisgICAgICAgICAgICBBZGRyZXNzIGFkZHIobmV3X2RlcHRoKTsKKyAgICAgICAgICAgIG5ld19yZXR2YWxbcHJvY10gPSBBZGRyVW5zUGFpcihhZGRyLCByZXR2YWxbcHJvY10uc2Vjb25kKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgbmV3X2xldmVsID0gMDsKKyAgICAgICAgZm9yIChsZXZlbCA9IDA7IGxldmVsIDwgZGVwdGg7IGxldmVsKyspIHsKKyAgICAgICAgICAgIGlmICgobWF4Q3RbbGV2ZWxdID09IDEpICYmIChsZXZlbCAhPSBwa2dMZXZlbCkpIHsKKyAgICAgICAgICAgICAgIGlmIChsZXZlbCA9PSB0aHJlYWRMZXZlbCkgeworICAgICAgICAgICAgICAgICAgIHRocmVhZExldmVsID0gLTE7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBlbHNlIGlmICgodGhyZWFkTGV2ZWwgPj0gMCkgJiYgKGxldmVsIDwgdGhyZWFkTGV2ZWwpKSB7CisgICAgICAgICAgICAgICAgICAgdGhyZWFkTGV2ZWwtLTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGlmIChsZXZlbCA9PSBjb3JlTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICAgICBjb3JlTGV2ZWwgPSAtMTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGVsc2UgaWYgKChjb3JlTGV2ZWwgPj0gMCkgJiYgKGxldmVsIDwgY29yZUxldmVsKSkgeworICAgICAgICAgICAgICAgICAgIGNvcmVMZXZlbC0tOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgaWYgKGxldmVsIDwgcGtnTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICAgICBwa2dMZXZlbC0tOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKHByb2MgPSAwOyAoaW50KXByb2MgPCBuQXBpY3M7IHByb2MrKykgeworICAgICAgICAgICAgICAgIG5ld19yZXR2YWxbcHJvY10uZmlyc3QubGFiZWxzW25ld19sZXZlbF0KKyAgICAgICAgICAgICAgICAgID0gcmV0dmFsW3Byb2NdLmZpcnN0LmxhYmVsc1tsZXZlbF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuZXdfbGV2ZWwrKzsKKyAgICAgICAgfQorCisgICAgICAgIF9fa21wX2ZyZWUocmV0dmFsKTsKKyAgICAgICAgcmV0dmFsID0gbmV3X3JldHZhbDsKKyAgICAgICAgZGVwdGggPSBuZXdfZGVwdGg7CisgICAgfQorCisgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzIDwgMCkgeworICAgICAgICAvLworICAgICAgICAvLyBTZXQgdGhlIGdyYW51bGFyaXR5IGxldmVsIGJhc2VkIG9uIHdoYXQgbGV2ZWxzIGFyZSBtb2RlbGVkCisgICAgICAgIC8vIGluIHRoZSBtYWNoaW5lIHRvcG9sb2d5IG1hcC4KKyAgICAgICAgLy8KKyAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPSAwOworICAgICAgICBpZiAoKHRocmVhZExldmVsID49IDApICYmIChfX2ttcF9hZmZpbml0eV9ncmFuID4gYWZmaW5pdHlfZ3Jhbl90aHJlYWQpKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscysrOworICAgICAgICB9CisgICAgICAgIGlmICgoY29yZUxldmVsID49IDApICYmIChfX2ttcF9hZmZpbml0eV9ncmFuID4gYWZmaW5pdHlfZ3Jhbl9jb3JlKSkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA+IGFmZmluaXR5X2dyYW5fcGFja2FnZSkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X3RvcG9sb2d5KHJldHZhbCwgbkFwaWNzLCBkZXB0aCwgcGtnTGV2ZWwsCisgICAgICAgICAgY29yZUxldmVsLCB0aHJlYWRMZXZlbCk7CisgICAgfQorCisgICAgX19rbXBfZnJlZShsYXN0KTsKKyAgICBfX2ttcF9mcmVlKG1heEN0KTsKKyAgICBfX2ttcF9mcmVlKGNvdW50cyk7CisgICAgX19rbXBfZnJlZSh0b3RhbHMpOworICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICAqYWRkcmVzczJvcyA9IHJldHZhbDsKKyAgICByZXR1cm4gZGVwdGg7Cit9CisKKworIyBlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKworI2RlZmluZSBvc0lkSW5kZXggICAgICAgMAorI2RlZmluZSB0aHJlYWRJZEluZGV4ICAgMQorI2RlZmluZSBjb3JlSWRJbmRleCAgICAgMgorI2RlZmluZSBwa2dJZEluZGV4ICAgICAgMworI2RlZmluZSBub2RlSWRJbmRleCAgICAgNAorCit0eXBlZGVmIHVuc2lnbmVkICpQcm9jQ3B1SW5mbzsKK3N0YXRpYyB1bnNpZ25lZCBtYXhJbmRleCA9IHBrZ0lkSW5kZXg7CisKKworc3RhdGljIGludAorX19rbXBfYWZmaW5pdHlfY21wX1Byb2NDcHVJbmZvX29zX2lkKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisgICAgY29uc3QgdW5zaWduZWQgKmFhID0gKGNvbnN0IHVuc2lnbmVkICopYTsKKyAgICBjb25zdCB1bnNpZ25lZCAqYmIgPSAoY29uc3QgdW5zaWduZWQgKiliOworICAgIGlmIChhYVtvc0lkSW5kZXhdIDwgYmJbb3NJZEluZGV4XSkgcmV0dXJuIC0xOworICAgIGlmIChhYVtvc0lkSW5kZXhdID4gYmJbb3NJZEluZGV4XSkgcmV0dXJuIDE7CisgICAgcmV0dXJuIDA7Cit9OworCisKK3N0YXRpYyBpbnQKK19fa21wX2FmZmluaXR5X2NtcF9Qcm9jQ3B1SW5mb19waHlzX2lkKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisgICAgdW5zaWduZWQgaTsKKyAgICBjb25zdCB1bnNpZ25lZCAqYWEgPSAqKChjb25zdCB1bnNpZ25lZCAqKilhKTsKKyAgICBjb25zdCB1bnNpZ25lZCAqYmIgPSAqKChjb25zdCB1bnNpZ25lZCAqKiliKTsKKyAgICBmb3IgKGkgPSBtYXhJbmRleDsgOyBpLS0pIHsKKyAgICAgICAgaWYgKGFhW2ldIDwgYmJbaV0pIHJldHVybiAtMTsKKyAgICAgICAgaWYgKGFhW2ldID4gYmJbaV0pIHJldHVybiAxOworICAgICAgICBpZiAoaSA9PSBvc0lkSW5kZXgpIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCisvLworLy8gUGFyc2UgL3Byb2MvY3B1aW5mbyAob3IgYW4gYWx0ZXJuYXRlIGZpbGUgaW4gdGhlIHNhbWUgZm9ybWF0KSB0byBvYnRhaW4gdGhlCisvLyBhZmZpbml0eSBtYXAuCisvLworc3RhdGljIGludAorX19rbXBfYWZmaW5pdHlfY3JlYXRlX2NwdWluZm9fbWFwKEFkZHJVbnNQYWlyICoqYWRkcmVzczJvcywgaW50ICpsaW5lLAorICBrbXBfaTE4bl9pZF90ICpjb25zdCBtc2dfaWQsIEZJTEUgKmYpCit7CisgICAgKmFkZHJlc3Myb3MgPSBOVUxMOworICAgICptc2dfaWQgPSBrbXBfaTE4bl9udWxsOworCisgICAgLy8KKyAgICAvLyBTY2FuIG9mIHRoZSBmaWxlLCBhbmQgY291bnQgdGhlIG51bWJlciBvZiAicHJvY2Vzc29yIiAob3NJZCkgZmllbGRzLAorICAgIC8vIGFuZCBmaW5kIHRoZSBoaWdoZXN0IHZhbHVlIG9mIDxuPiBmb3IgYSBub2RlXzxuPiBmaWVsZC4KKyAgICAvLworICAgIGNoYXIgYnVmWzI1Nl07CisgICAgdW5zaWduZWQgbnVtX3JlY29yZHMgPSAwOworICAgIHdoaWxlICghIGZlb2YoZikpIHsKKyAgICAgICAgYnVmW3NpemVvZihidWYpIC0gMV0gPSAxOworICAgICAgICBpZiAoISBmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmKSkgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFJlYWQgZXJyb3JzIHByZXN1bWFibHkgYmVjYXVzZSBvZiBFT0YKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNoYXIgczFbXSA9ICJwcm9jZXNzb3IiOworICAgICAgICBpZiAoc3RybmNtcChidWYsIHMxLCBzaXplb2YoczEpIC0gMSkgPT0gMCkgeworICAgICAgICAgICAgbnVtX3JlY29yZHMrKzsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRklYTUUgLSB0aGlzIHdpbGwgbWF0Y2ggIm5vZGVfPG4+IDxnYXJiYWdlPiIKKyAgICAgICAgLy8KKyAgICAgICAgdW5zaWduZWQgbGV2ZWw7CisgICAgICAgIGlmIChzc2NhbmYoYnVmLCAibm9kZV8lZCBpZCIsICZsZXZlbCkgPT0gMSkgeworICAgICAgICAgICAgaWYgKG5vZGVJZEluZGV4ICsgbGV2ZWwgPj0gbWF4SW5kZXgpIHsKKyAgICAgICAgICAgICAgICBtYXhJbmRleCA9IG5vZGVJZEluZGV4ICsgbGV2ZWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vCisgICAgLy8gQ2hlY2sgZm9yIGVtcHR5IGZpbGUgLyBubyB2YWxpZCBwcm9jZXNzb3IgcmVjb3Jkcywgb3IgdG9vIG1hbnkuCisgICAgLy8gVGhlIG51bWJlciBvZiByZWNvcmRzIGNhbid0IGV4Y2VlZCB0aGUgbnVtYmVyIG9mIHZhbGlkIGJpdHMgaW4gdGhlCisgICAgLy8gYWZmaW5pdHkgbWFzay4KKyAgICAvLworICAgIGlmIChudW1fcmVjb3JkcyA9PSAwKSB7CisgICAgICAgICpsaW5lID0gMDsKKyAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9Ob1Byb2NSZWNvcmRzOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChudW1fcmVjb3JkcyA+ICh1bnNpZ25lZClfX2ttcF94cHJvYykgeworICAgICAgICAqbGluZSA9IDA7CisgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfVG9vTWFueVByb2NSZWNvcmRzOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBTZXQgdGhlIGZpbGUgcG9pbnRlciBiYWNrIHRvIHRoZSBiZWdnaW5uaW5nLCBzbyB0aGF0IHdlIGNhbiBzY2FuIHRoZQorICAgIC8vIGZpbGUgYWdhaW4sIHRoaXMgdGltZSBwZXJmb3JtaW5nIGEgZnVsbCBwYXJzZSBvZiB0aGUgZGF0YS4KKyAgICAvLyBBbGxvY2F0ZSBhIHZlY3RvciBvZiBQcm9jQ3B1SW5mbyBvYmplY3QsIHdoZXJlIHdlIHdpbGwgcGxhY2UgdGhlIGRhdGEuCisgICAgLy8gQWRkaW5nIGFuIGV4dHJhIGVsZW1lbnQgYXQgdGhlIGVuZCBhbGxvd3MgdXMgdG8gcmVtb3ZlIGEgbG90IG9mIGV4dHJhCisgICAgLy8gY2hlY2tzIGZvciB0ZXJtaW5hdGlvbiBjb25kaXRpb25zLgorICAgIC8vCisgICAgaWYgKGZzZWVrKGYsIDAsIFNFRUtfU0VUKSAhPSAwKSB7CisgICAgICAgICpsaW5lID0gMDsKKyAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9DYW50UmV3aW5kQ3B1aW5mbzsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8vCisgICAgLy8gQWxsb2NhdGUgdGhlIGFycmF5IG9mIHJlY29yZHMgdG8gc3RvcmUgdGhlIHByb2MgaW5mbyBpbi4gIFRoZSBkdW1teQorICAgIC8vIGVsZW1lbnQgYXQgdGhlIGVuZCBtYWtlcyB0aGUgbG9naWMgaW4gZmlsbGluZyB0aGVtIG91dCBlYXNpZXIgdG8gY29kZS4KKyAgICAvLworICAgIHVuc2lnbmVkICoqdGhyZWFkSW5mbyA9ICh1bnNpZ25lZCAqKilfX2ttcF9hbGxvY2F0ZSgobnVtX3JlY29yZHMgKyAxKQorICAgICAgKiBzaXplb2YodW5zaWduZWQgKikpOworICAgIHVuc2lnbmVkIGk7CisgICAgZm9yIChpID0gMDsgaSA8PSBudW1fcmVjb3JkczsgaSsrKSB7CisgICAgICAgIHRocmVhZEluZm9baV0gPSAodW5zaWduZWQgKilfX2ttcF9hbGxvY2F0ZSgobWF4SW5kZXggKyAxKQorICAgICAgICAgICogc2l6ZW9mKHVuc2lnbmVkKSk7CisgICAgfQorCisjZGVmaW5lIENMRUFOVVBfVEhSRUFEX0lORk8gXAorICAgIGZvciAoaSA9IDA7IGkgPD0gbnVtX3JlY29yZHM7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfX2ttcF9mcmVlKHRocmVhZEluZm9baV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX2ZyZWUodGhyZWFkSW5mbyk7CisKKyAgICAvLworICAgIC8vIEEgdmFsdWUgb2YgVUlOVF9NQVggbWVhbnMgdGhhdCB3ZSBkaWRuJ3QgZmluZCB0aGUgZmllbGQKKyAgICAvLworICAgIHVuc2lnbmVkIF9faW5kZXg7CisKKyNkZWZpbmUgSU5JVF9QUk9DX0lORk8ocCkgXAorICAgIGZvciAoX19pbmRleCA9IDA7IF9faW5kZXggPD0gbWF4SW5kZXg7IF9faW5kZXgrKykgeyAgICAgICAgICAgICAgICAgXAorICAgICAgICAocClbX19pbmRleF0gPSBVSU5UX01BWDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPD0gbnVtX3JlY29yZHM7IGkrKykgeworICAgICAgICBJTklUX1BST0NfSU5GTyh0aHJlYWRJbmZvW2ldKTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBudW1fYXZhaWwgPSAwOworICAgICpsaW5lID0gMDsKKyAgICB3aGlsZSAoISBmZW9mKGYpKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIENyZWF0ZSBhbiBpbm5lciBzY29waW5nIGxldmVsLCBzbyB0aGF0IGFsbCB0aGUgZ290byB0YXJnZXRzIGF0IHRoZQorICAgICAgICAvLyBlbmQgb2YgdGhlIGxvb3AgYXBwZWFyIGluIGFuIG91dGVyIHNjb3BpbmcgbGV2ZWwuICBUaGlzIGF2b2lkcworICAgICAgICAvLyB3YXJuaW5ncyBhYm91dCBqdW1waW5nIHBhc3QgYW4gaW5pdGlhbGl6YXRpb24gdG8gYSB0YXJnZXQgaW4gdGhlCisgICAgICAgIC8vIHNhbWUgYmxvY2suCisgICAgICAgIC8vCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1ZltzaXplb2YoYnVmKSAtIDFdID0gMTsKKyAgICAgICAgICAgIGJvb2wgbG9uZ19saW5lID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoISBmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmKSkgeworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gUmVhZCBlcnJvcnMgcHJlc3VtYWJseSBiZWNhdXNlIG9mIEVPRgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgdmFsaWQgZGF0YSBpbiB0aHJlYWRJbmZvW251bV9hdmFpbF0sIHRoZW4gZmFrZQorICAgICAgICAgICAgICAgIC8vIGEgYmxhbmsgbGluZSBpbiBlbnN1cmUgdGhhdCB0aGUgbGFzdCBhZGRyZXNzIGdldHMgcGFyc2VkLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgYm9vbCB2YWxpZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gbWF4SW5kZXg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkSW5mb1tudW1fYXZhaWxdW2ldICE9IFVJTlRfTUFYKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCEgdmFsaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ1ZlswXSA9IDA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFidWZbc2l6ZW9mKGJ1ZikgLSAxXSkgeworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gVGhlIGxpbmUgaXMgbG9uZ2VyIHRoYW4gdGhlIGJ1ZmZlci4gIFNldCBhIGZsYWcgYW5kIGRvbid0CisgICAgICAgICAgICAgICAgLy8gZW1pdCBhbiBlcnJvciBpZiB3ZSB3ZXJlIGdvaW5nIHRvIGlnbm9yZSB0aGUgbGluZSwgYW55d2F5LgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgbG9uZ19saW5lID0gdHJ1ZTsKKworI2RlZmluZSBDSEVDS19MSU5FIFwKKyAgICBpZiAobG9uZ19saW5lKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQ0xFQU5VUF9USFJFQURfSU5GTzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9Mb25nTGluZUNwdWluZm87ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAoKmxpbmUpKys7CisKKyAgICAgICAgICAgIGNoYXIgczFbXSA9ICJwcm9jZXNzb3IiOworICAgICAgICAgICAgaWYgKHN0cm5jbXAoYnVmLCBzMSwgc2l6ZW9mKHMxKSAtIDEpID09IDApIHsKKyAgICAgICAgICAgICAgICBDSEVDS19MSU5FOworICAgICAgICAgICAgICAgIGNoYXIgKnAgPSBzdHJjaHIoYnVmICsgc2l6ZW9mKHMxKSAtIDEsICc6Jyk7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgdmFsOworICAgICAgICAgICAgICAgIGlmICgocCA9PSBOVUxMKSB8fCAoc3NjYW5mKHAgKyAxLCAiJXVcbiIsICZ2YWwpICE9IDEpKSBnb3RvIG5vX3ZhbDsKKyAgICAgICAgICAgICAgICBpZiAodGhyZWFkSW5mb1tudW1fYXZhaWxdW29zSWRJbmRleF0gIT0gVUlOVF9NQVgpIGdvdG8gZHVwX2ZpZWxkOworICAgICAgICAgICAgICAgIHRocmVhZEluZm9bbnVtX2F2YWlsXVtvc0lkSW5kZXhdID0gdmFsOworI2lmIEtNUF9PU19MSU5VWCAmJiBVU0VfU1lTRlNfSU5GTworICAgICAgICAgICAgICAgIGNoYXIgcGF0aFsyNTZdOworICAgICAgICAgICAgICAgIHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwKKyAgICAgICAgICAgICAgICAgICAgIi9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdSV1L3RvcG9sb2d5L3BoeXNpY2FsX3BhY2thZ2VfaWQiLAorICAgICAgICAgICAgICAgICAgICB0aHJlYWRJbmZvW251bV9hdmFpbF1bb3NJZEluZGV4XSk7CisgICAgICAgICAgICAgICAgX19rbXBfcmVhZF9mcm9tX2ZpbGUocGF0aCwgIiV1IiwgJnRocmVhZEluZm9bbnVtX2F2YWlsXVtwa2dJZEluZGV4XSk7CisKKyAgICAgICAgICAgICAgICBzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksCisgICAgICAgICAgICAgICAgICAgICIvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHUldS90b3BvbG9neS9jb3JlX2lkIiwKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkSW5mb1tudW1fYXZhaWxdW29zSWRJbmRleF0pOworICAgICAgICAgICAgICAgIF9fa21wX3JlYWRfZnJvbV9maWxlKHBhdGgsICIldSIsICZ0aHJlYWRJbmZvW251bV9hdmFpbF1bY29yZUlkSW5kZXhdKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyNlbHNlCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGFyIHMyW10gPSAicGh5c2ljYWwgaWQiOworICAgICAgICAgICAgaWYgKHN0cm5jbXAoYnVmLCBzMiwgc2l6ZW9mKHMyKSAtIDEpID09IDApIHsKKyAgICAgICAgICAgICAgICBDSEVDS19MSU5FOworICAgICAgICAgICAgICAgIGNoYXIgKnAgPSBzdHJjaHIoYnVmICsgc2l6ZW9mKHMyKSAtIDEsICc6Jyk7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgdmFsOworICAgICAgICAgICAgICAgIGlmICgocCA9PSBOVUxMKSB8fCAoc3NjYW5mKHAgKyAxLCAiJXVcbiIsICZ2YWwpICE9IDEpKSBnb3RvIG5vX3ZhbDsKKyAgICAgICAgICAgICAgICBpZiAodGhyZWFkSW5mb1tudW1fYXZhaWxdW3BrZ0lkSW5kZXhdICE9IFVJTlRfTUFYKSBnb3RvIGR1cF9maWVsZDsKKyAgICAgICAgICAgICAgICB0aHJlYWRJbmZvW251bV9hdmFpbF1bcGtnSWRJbmRleF0gPSB2YWw7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGFyIHMzW10gPSAiY29yZSBpZCI7CisgICAgICAgICAgICBpZiAoc3RybmNtcChidWYsIHMzLCBzaXplb2YoczMpIC0gMSkgPT0gMCkgeworICAgICAgICAgICAgICAgIENIRUNLX0xJTkU7CisgICAgICAgICAgICAgICAgY2hhciAqcCA9IHN0cmNocihidWYgKyBzaXplb2YoczMpIC0gMSwgJzonKTsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCB2YWw7CisgICAgICAgICAgICAgICAgaWYgKChwID09IE5VTEwpIHx8IChzc2NhbmYocCArIDEsICIldVxuIiwgJnZhbCkgIT0gMSkpIGdvdG8gbm9fdmFsOworICAgICAgICAgICAgICAgIGlmICh0aHJlYWRJbmZvW251bV9hdmFpbF1bY29yZUlkSW5kZXhdICE9IFVJTlRfTUFYKSBnb3RvIGR1cF9maWVsZDsKKyAgICAgICAgICAgICAgICB0aHJlYWRJbmZvW251bV9hdmFpbF1bY29yZUlkSW5kZXhdID0gdmFsOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworI2VuZGlmIC8vIEtNUF9PU19MSU5VWCAmJiBVU0VfU1lTRlNfSU5GTworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2hhciBzNFtdID0gInRocmVhZCBpZCI7CisgICAgICAgICAgICBpZiAoc3RybmNtcChidWYsIHM0LCBzaXplb2YoczQpIC0gMSkgPT0gMCkgeworICAgICAgICAgICAgICAgIENIRUNLX0xJTkU7CisgICAgICAgICAgICAgICAgY2hhciAqcCA9IHN0cmNocihidWYgKyBzaXplb2YoczQpIC0gMSwgJzonKTsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCB2YWw7CisgICAgICAgICAgICAgICAgaWYgKChwID09IE5VTEwpIHx8IChzc2NhbmYocCArIDEsICIldVxuIiwgJnZhbCkgIT0gMSkpIGdvdG8gbm9fdmFsOworICAgICAgICAgICAgICAgIGlmICh0aHJlYWRJbmZvW251bV9hdmFpbF1bdGhyZWFkSWRJbmRleF0gIT0gVUlOVF9NQVgpIGdvdG8gZHVwX2ZpZWxkOworICAgICAgICAgICAgICAgIHRocmVhZEluZm9bbnVtX2F2YWlsXVt0aHJlYWRJZEluZGV4XSA9IHZhbDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVuc2lnbmVkIGxldmVsOworICAgICAgICAgICAgaWYgKHNzY2FuZihidWYsICJub2RlXyVkIGlkIiwgJmxldmVsKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgQ0hFQ0tfTElORTsKKyAgICAgICAgICAgICAgICBjaGFyICpwID0gc3RyY2hyKGJ1ZiArIHNpemVvZihzNCkgLSAxLCAnOicpOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIHZhbDsKKyAgICAgICAgICAgICAgICBpZiAoKHAgPT0gTlVMTCkgfHwgKHNzY2FuZihwICsgMSwgIiV1XG4iLCAmdmFsKSAhPSAxKSkgZ290byBub192YWw7CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVChub2RlSWRJbmRleCArIGxldmVsIDw9IG1heEluZGV4KTsKKyAgICAgICAgICAgICAgICBpZiAodGhyZWFkSW5mb1tudW1fYXZhaWxdW25vZGVJZEluZGV4ICsgbGV2ZWxdICE9IFVJTlRfTUFYKSBnb3RvIGR1cF9maWVsZDsKKyAgICAgICAgICAgICAgICB0aHJlYWRJbmZvW251bV9hdmFpbF1bbm9kZUlkSW5kZXggKyBsZXZlbF0gPSB2YWw7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBXZSBkaWRuJ3QgcmVjb2duaXplIHRoZSBsZWFkaW5nIHRva2VuIG9uIHRoZSBsaW5lLgorICAgICAgICAgICAgLy8gVGhlcmUgYXJlIGxvdHMgb2YgbGVhZGluZyB0b2tlbnMgdGhhdCB3ZSBkb24ndCByZWNvZ25pemUgLQorICAgICAgICAgICAgLy8gaWYgdGhlIGxpbmUgaXNuJ3QgZW1wdHksIGdvIG9uIHRvIHRoZSBuZXh0IGxpbmUuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaWYgKCgqYnVmICE9IDApICYmICgqYnVmICE9ICdcbicpKSB7CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbGluZSBpcyBsb25nZXIgdGhhbiB0aGUgYnVmZmVyLCByZWFkIGNoYXJhY3RlcnMKKyAgICAgICAgICAgICAgICAvLyB1bnRpbCB3ZSBmaW5kIGEgbmV3bGluZS4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIGlmIChsb25nX2xpbmUpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNoOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKChjaCA9IGZnZXRjKGYpKSAhPSBFT0YpICYmIChjaCAhPSAnXG4nKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gQSBuZXdsaW5lIGhhcyBzaWduYWxsZWQgdGhlIGVuZCBvZiB0aGUgcHJvY2Vzc29yIHJlY29yZC4KKyAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgdGhlcmUgYXJlbid0IHRvbyBtYW55IHByb2NzIHNwZWNpZmllZC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBpZiAobnVtX2F2YWlsID09IF9fa21wX3hwcm9jKSB7CisgICAgICAgICAgICAgICAgQ0xFQU5VUF9USFJFQURfSU5GTzsKKyAgICAgICAgICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX1Rvb01hbnlFbnRyaWVzOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIENoZWNrIGZvciBtaXNzaW5nIGZpZWxkcy4gIFRoZSBvc0lkIGZpZWxkIG11c3QgYmUgdGhlcmUsIGFuZCB3ZQorICAgICAgICAgICAgLy8gY3VycmVudGx5IHJlcXVpcmUgdGhhdCB0aGUgcGh5c2ljYWwgaWQgZmllbGQgaXMgc3BlY2lmaWVkLCBhbHNvLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmICh0aHJlYWRJbmZvW251bV9hdmFpbF1bb3NJZEluZGV4XSA9PSBVSU5UX01BWCkgeworICAgICAgICAgICAgICAgIENMRUFOVVBfVEhSRUFEX0lORk87CisgICAgICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9NaXNzaW5nUHJvY0ZpZWxkOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0aHJlYWRJbmZvWzBdW3BrZ0lkSW5kZXhdID09IFVJTlRfTUFYKSB7CisgICAgICAgICAgICAgICAgQ0xFQU5VUF9USFJFQURfSU5GTzsKKyAgICAgICAgICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX01pc3NpbmdQaHlzaWNhbElERmllbGQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gU2tpcCB0aGlzIHByb2MgaWYgaXQgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBtYWNoaW5lIG1vZGVsLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmICghIEtNUF9DUFVfSVNTRVQodGhyZWFkSW5mb1tudW1fYXZhaWxdW29zSWRJbmRleF0sIGZ1bGxNYXNrKSkgeworICAgICAgICAgICAgICAgIElOSVRfUFJPQ19JTkZPKHRocmVhZEluZm9bbnVtX2F2YWlsXSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBXZSBoYXZlIGEgc3VjY2Vzc2Z1bCBwYXJzZSBvZiB0aGlzIHByb2MncyBpbmZvLgorICAgICAgICAgICAgLy8gSW5jcmVtZW50IHRoZSBjb3VudGVyLCBhbmQgcHJlcGFyZSBmb3IgdGhlIG5leHQgcHJvYy4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBudW1fYXZhaWwrKzsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQobnVtX2F2YWlsIDw9IG51bV9yZWNvcmRzKTsKKyAgICAgICAgICAgIElOSVRfUFJPQ19JTkZPKHRocmVhZEluZm9bbnVtX2F2YWlsXSk7CisgICAgICAgIH0KKyAgICAgICAgY29udGludWU7CisKKyAgICAgICAgbm9fdmFsOgorICAgICAgICBDTEVBTlVQX1RIUkVBRF9JTkZPOworICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX01pc3NpbmdWYWxDcHVpbmZvOworICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgZHVwX2ZpZWxkOgorICAgICAgICBDTEVBTlVQX1RIUkVBRF9JTkZPOworICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX0R1cGxpY2F0ZUZpZWxkQ3B1aW5mbzsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAqbGluZSA9IDA7CisKKyMgaWYgS01QX01JQyAmJiBSRURVQ0VfVEVBTV9TSVpFCisgICAgdW5zaWduZWQgdGVhbVNpemUgPSAwOworIyBlbmRpZiAvLyBLTVBfTUlDICYmIFJFRFVDRV9URUFNX1NJWkUKKworICAgIC8vIGNoZWNrIGZvciBudW1fcmVjb3JkcyA9PSBfX2ttcF94cHJvYyA/Pz8KKworICAgIC8vCisgICAgLy8gSWYgdGhlcmUncyBvbmx5IG9uZSB0aHJlYWQgY29udGV4dCB0byBiaW5kIHRvLCBmb3JtIGFuIEFkZHJlc3Mgb2JqZWN0CisgICAgLy8gd2l0aCBkZXB0aCAxIGFuZCByZXR1cm4gaW1tZWRpYXRlbHkgKG9yLCBpZiBhZmZpbml0eSBpcyBvZmYsIHNldAorICAgIC8vIGFkZHJlc3Myb3MgdG8gTlVMTCBhbmQgcmV0dXJuKS4KKyAgICAvLworICAgIC8vIElmIGl0IGlzIGNvbmZpZ3VyZWQgdG8gb21pdCB0aGUgcGFja2FnZSBsZXZlbCB3aGVuIHRoZXJlIGlzIG9ubHkgYQorICAgIC8vIHNpbmdsZSBwYWNrYWdlLCB0aGUgbG9naWMgYXQgdGhlIGVuZCBvZiB0aGlzIHJvdXRpbmUgd29uJ3Qgd29yayBpZgorICAgIC8vIHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgdGhyZWFkIC0gaXQgd291bGQgdHJ5IHRvIGZvcm0gYW4gQWRkcmVzcworICAgIC8vIG9iamVjdCB3aXRoIGRlcHRoIDAuCisgICAgLy8KKyAgICBLTVBfQVNTRVJUKG51bV9hdmFpbCA+IDApOworICAgIEtNUF9BU1NFUlQobnVtX2F2YWlsIDw9IG51bV9yZWNvcmRzKTsKKyAgICBpZiAobnVtX2F2YWlsID09IDEpIHsKKyAgICAgICAgX19rbXBfbmNvcmVzID0gMTsKKyAgICAgICAgX19rbXBfblRocmVhZHNQZXJDb3JlID0gbkNvcmVzUGVyUGtnID0gblBhY2thZ2VzID0gMTsKKyAgICAgICAgX19rbXBfaHRfZW5hYmxlZCA9IEZBTFNFOworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgaWYgKCEgS01QX0FGRklOSVRZX0NBUEFCTEUoKSkgeworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmTm90Q2FwYWJsZVVzZUNwdWluZm8sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEF2YWlsYWJsZU9TUHJvYywgIktNUF9BRkZJTklUWSIsIF9fa21wX2F2YWlsX3Byb2MpOworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKGJ1ZiwgS01QX0FGRklOX01BU0tfUFJJTlRfTEVOLAorICAgICAgICAgICAgICAgICAgZnVsbE1hc2spOworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmQ2FwYWJsZVVzZUNwdWluZm8sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBidWYpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldE5vdFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBidWYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEF2YWlsYWJsZU9TUHJvYywgIktNUF9BRkZJTklUWSIsIF9fa21wX2F2YWlsX3Byb2MpOworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGluZGV4OworICAgICAgICAgICAga21wX3N0cl9idWZfdCBidWY7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2luaXQoJmJ1Zik7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICIxIik7CisgICAgICAgICAgICBmb3IgKGluZGV4ID0gbWF4SW5kZXggLSAxOyBpbmRleCA+IHBrZ0lkSW5kZXg7IGluZGV4LS0pIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICIgeCAxIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBLTVBfSU5GT1JNKFRvcG9sb2d5RXh0cmEsICJLTVBfQUZGSU5JVFkiLCBidWYuc3RyLCAxLCAxLCAxKTsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSgmYnVmKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpIHsKKyAgICAgICAgICAgIENMRUFOVVBfVEhSRUFEX0lORk87CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgICphZGRyZXNzMm9zID0gKEFkZHJVbnNQYWlyKilfX2ttcF9hbGxvY2F0ZShzaXplb2YoQWRkclVuc1BhaXIpKTsKKyAgICAgICAgQWRkcmVzcyBhZGRyKDEpOworICAgICAgICBhZGRyLmxhYmVsc1swXSA9IHRocmVhZEluZm9bMF1bcGtnSWRJbmRleF07CisgICAgICAgICgqYWRkcmVzczJvcylbMF0gPSBBZGRyVW5zUGFpcihhZGRyLCB0aHJlYWRJbmZvWzBdW29zSWRJbmRleF0pOworCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA8IDApIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF90b3BvbG9neSgqYWRkcmVzczJvcywgMSwgMSwgMCwgLTEsIC0xKTsKKyAgICAgICAgfQorCisgICAgICAgIENMRUFOVVBfVEhSRUFEX0lORk87CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIC8vCisgICAgLy8gU29ydCB0aGUgdGhyZWFkSW5mbyB0YWJsZSBieSBwaHlzaWNhbCBJZC4KKyAgICAvLworICAgIHFzb3J0KHRocmVhZEluZm8sIG51bV9hdmFpbCwgc2l6ZW9mKCp0aHJlYWRJbmZvKSwKKyAgICAgIF9fa21wX2FmZmluaXR5X2NtcF9Qcm9jQ3B1SW5mb19waHlzX2lkKTsKKworICAgIC8vCisgICAgLy8gVGhlIHRhYmxlIGlzIG5vdyBzb3J0ZWQgYnkgcGtnSWQgLyBjb3JlSWQgLyB0aHJlYWRJZCwgYnV0IHdlIHJlYWxseQorICAgIC8vIGRvbid0IGtub3cgdGhlIHJhZGl4IG9mIGFueSBvZiB0aGUgZmllbGRzLiAgcGtnSWQncyBtYXkgYmUgc3BhcnNlbHkKKyAgICAvLyBhc3NpZ25lZCBhbW9uZyB0aGUgY2hpcHMgb24gYSBzeXN0ZW0uICBBbHRob3VnaCBjb3JlSWQncyBhcmUgdXN1YWxseQorICAgIC8vIGFzc2lnbmVkIFswIC4uIGNvcmVzUGVyUGtnLTFdIGFuZCB0aHJlYWRJZCdzIGFyZSB1c3VhbGx5IGFzc2lnbmVkCisgICAgLy8gWzAuLnRocmVhZHNQZXJDb3JlLTFdLCB3ZSBkb24ndCB3YW50IHRvIG1ha2UgYW55IHN1Y2ggYXNzdW1wdGlvbnMuCisgICAgLy8KKyAgICAvLyBGb3IgdGhhdCBtYXR0ZXIsIHdlIGRvbid0IGtub3cgd2hhdCBjb3Jlc1BlclBrZyBhbmQgdGhyZWFkc1BlckNvcmUKKyAgICAvLyAob3IgdGhlIHRvdGFsICMgcGFja2FnZXMpIGFyZSBhdCB0aGlzIHBvaW50IC0gd2Ugd2FudCB0byBkZXRlcm1pbmUKKyAgICAvLyB0aGF0IG5vdy4gIFdlIG9ubHkgaGF2ZSBhbiB1cHBlciBib3VuZCBvbiB0aGUgZmlyc3QgdHdvIGZpZ3VyZXMuCisgICAgLy8KKyAgICB1bnNpZ25lZCAqY291bnRzID0gKHVuc2lnbmVkICopX19rbXBfYWxsb2NhdGUoKG1heEluZGV4ICsgMSkKKyAgICAgICogc2l6ZW9mKHVuc2lnbmVkKSk7CisgICAgdW5zaWduZWQgKm1heEN0ID0gKHVuc2lnbmVkICopX19rbXBfYWxsb2NhdGUoKG1heEluZGV4ICsgMSkKKyAgICAgICogc2l6ZW9mKHVuc2lnbmVkKSk7CisgICAgdW5zaWduZWQgKnRvdGFscyA9ICh1bnNpZ25lZCAqKV9fa21wX2FsbG9jYXRlKChtYXhJbmRleCArIDEpCisgICAgICAqIHNpemVvZih1bnNpZ25lZCkpOworICAgIHVuc2lnbmVkICpsYXN0SWQgPSAodW5zaWduZWQgKilfX2ttcF9hbGxvY2F0ZSgobWF4SW5kZXggKyAxKQorICAgICAgKiBzaXplb2YodW5zaWduZWQpKTsKKworICAgIGJvb2wgYXNzaWduX3RocmVhZF9pZHMgPSBmYWxzZTsKKyAgICB1bnNpZ25lZCB0aHJlYWRJZEN0OworICAgIHVuc2lnbmVkIGluZGV4OworCisgICAgcmVzdGFydF9yYWRpeF9jaGVjazoKKyAgICB0aHJlYWRJZEN0ID0gMDsKKworICAgIC8vCisgICAgLy8gSW5pdGlhbGl6ZSB0aGUgY291bnRlciBhcnJheXMgd2l0aCBkYXRhIGZyb20gdGhyZWFkSW5mb1swXS4KKyAgICAvLworICAgIGlmIChhc3NpZ25fdGhyZWFkX2lkcykgeworICAgICAgICBpZiAodGhyZWFkSW5mb1swXVt0aHJlYWRJZEluZGV4XSA9PSBVSU5UX01BWCkgeworICAgICAgICAgICAgdGhyZWFkSW5mb1swXVt0aHJlYWRJZEluZGV4XSA9IHRocmVhZElkQ3QrKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0aHJlYWRJZEN0IDw9IHRocmVhZEluZm9bMF1bdGhyZWFkSWRJbmRleF0pIHsKKyAgICAgICAgICAgIHRocmVhZElkQ3QgPSB0aHJlYWRJbmZvWzBdW3RocmVhZElkSW5kZXhdICsgMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPD0gbWF4SW5kZXg7IGluZGV4KyspIHsKKyAgICAgICAgY291bnRzW2luZGV4XSA9IDE7CisgICAgICAgIG1heEN0W2luZGV4XSA9IDE7CisgICAgICAgIHRvdGFsc1tpbmRleF0gPSAxOworICAgICAgICBsYXN0SWRbaW5kZXhdID0gdGhyZWFkSW5mb1swXVtpbmRleF07OworICAgIH0KKworICAgIC8vCisgICAgLy8gUnVuIHRocm91Z2ggdGhlIHJlc3Qgb2YgdGhlIE9TIHByb2NzLgorICAgIC8vCisgICAgZm9yIChpID0gMTsgaSA8IG51bV9hdmFpbDsgaSsrKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIEZpbmQgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgaW5kZXggd2hvc2UgaWQgZGlmZmVycworICAgICAgICAvLyBmcm9tIHRoZSBpZCBmb3IgdGhlIHByZXZpb3VzIE9TIHByb2MuCisgICAgICAgIC8vCisgICAgICAgIGZvciAoaW5kZXggPSBtYXhJbmRleDsgaW5kZXggPj0gdGhyZWFkSWRJbmRleDsgaW5kZXgtLSkgeworICAgICAgICAgICAgaWYgKGFzc2lnbl90aHJlYWRfaWRzICYmIChpbmRleCA9PSB0aHJlYWRJZEluZGV4KSkgeworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gQXV0by1hc3NpZ24gdGhlIHRocmVhZCBpZCBmaWVsZCBpZiBpdCB3YXNuJ3Qgc3BlY2lmaWVkLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgaWYgKHRocmVhZEluZm9baV1bdGhyZWFkSWRJbmRleF0gPT0gVUlOVF9NQVgpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkSW5mb1tpXVt0aHJlYWRJZEluZGV4XSA9IHRocmVhZElkQ3QrKzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIEFwYXJyZW50bHkgdGhlIHRocmVhZCBpZCBmaWVsZCB3YXMgc3BlY2lmaWVkIGZvciBzb21lCisgICAgICAgICAgICAgICAgLy8gZW50cmllcyBhbmQgbm90IG90aGVycy4gIFN0YXJ0IHRoZSB0aHJlYWQgaWQgY291bnRlcgorICAgICAgICAgICAgICAgIC8vIG9mZiBhdCB0aGUgbmV4dCBoaWdoZXIgdGhyZWFkIGlkLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhyZWFkSWRDdCA8PSB0aHJlYWRJbmZvW2ldW3RocmVhZElkSW5kZXhdKSB7CisgICAgICAgICAgICAgICAgICAgIHRocmVhZElkQ3QgPSB0aHJlYWRJbmZvW2ldW3RocmVhZElkSW5kZXhdICsgMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodGhyZWFkSW5mb1tpXVtpbmRleF0gIT0gbGFzdElkW2luZGV4XSkgeworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gUnVuIHRocm91Z2ggYWxsIGluZGljZXMgd2hpY2ggYXJlIGxlc3Mgc2lnbmlmaWNhbnQsCisgICAgICAgICAgICAgICAgLy8gYW5kIHJlc2V0IHRoZSBjb3VudHMgdG8gMS4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIEF0IGFsbCBsZXZlbHMgdXAgdG8gYW5kIGluY2x1ZGluZyBpbmRleCwgd2UgbmVlZCB0bworICAgICAgICAgICAgICAgIC8vIGluY3JlbWVudCB0aGUgdG90YWxzIGFuZCByZWNvcmQgdGhlIGxhc3QgaWQuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbmRleDI7CisgICAgICAgICAgICAgICAgZm9yIChpbmRleDIgPSB0aHJlYWRJZEluZGV4OyBpbmRleDIgPCBpbmRleDsgaW5kZXgyKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdG90YWxzW2luZGV4Ml0rKzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50c1tpbmRleDJdID4gbWF4Q3RbaW5kZXgyXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWF4Q3RbaW5kZXgyXSA9IGNvdW50c1tpbmRleDJdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvdW50c1tpbmRleDJdID0gMTsKKyAgICAgICAgICAgICAgICAgICAgbGFzdElkW2luZGV4Ml0gPSB0aHJlYWRJbmZvW2ldW2luZGV4Ml07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvdW50c1tpbmRleF0rKzsKKyAgICAgICAgICAgICAgICB0b3RhbHNbaW5kZXhdKys7CisgICAgICAgICAgICAgICAgbGFzdElkW2luZGV4XSA9IHRocmVhZEluZm9baV1baW5kZXhdOworCisgICAgICAgICAgICAgICAgaWYgKGFzc2lnbl90aHJlYWRfaWRzICYmIChpbmRleCA+IHRocmVhZElkSW5kZXgpKSB7CisKKyMgaWYgS01QX01JQyAmJiBSRURVQ0VfVEVBTV9TSVpFCisgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBkZWZhdWx0IHRlYW0gc2l6ZSBpcyB0aGUgdG90YWwgI3RocmVhZHMgaW4gdGhlIG1hY2hpbmUKKyAgICAgICAgICAgICAgICAgICAgLy8gbWludXMgMSB0aHJlYWQgZm9yIGV2ZXJ5IGNvcmUgdGhhdCBoYXMgMyBvciBtb3JlIHRocmVhZHMuCisgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgIHRlYW1TaXplICs9ICggdGhyZWFkSWRDdCA8PSAyICkgPyAoIHRocmVhZElkQ3QgKSA6ICggdGhyZWFkSWRDdCAtIDEgKTsKKyMgZW5kaWYgLy8gS01QX01JQyAmJiBSRURVQ0VfVEVBTV9TSVpFCisKKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgLy8gUmVzdGFydCB0aGUgdGhyZWFkIGNvdW50ZXIsIGFzIHdlIGFyZSBvbiBhIG5ldyBjb3JlLgorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICB0aHJlYWRJZEN0ID0gMDsKKworICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAvLyBBdXRvLWFzc2lnbiB0aGUgdGhyZWFkIGlkIGZpZWxkIGlmIGl0IHdhc24ndCBzcGVjaWZpZWQuCisgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgIGlmICh0aHJlYWRJbmZvW2ldW3RocmVhZElkSW5kZXhdID09IFVJTlRfTUFYKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRJbmZvW2ldW3RocmVhZElkSW5kZXhdID0gdGhyZWFkSWRDdCsrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgLy8gQXBhcnJlbnRseSB0aGUgdGhyZWFkIGlkIGZpZWxkIHdhcyBzcGVjaWZpZWQgZm9yIHNvbWUKKyAgICAgICAgICAgICAgICAgICAgLy8gZW50cmllcyBhbmQgbm90IG90aGVycy4gIFN0YXJ0IHRoZSB0aHJlYWQgaWQgY291bnRlcgorICAgICAgICAgICAgICAgICAgICAvLyBvZmYgYXQgdGhlIG5leHQgaGlnaGVyIHRocmVhZCBpZC4KKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhyZWFkSWRDdCA8PSB0aHJlYWRJbmZvW2ldW3RocmVhZElkSW5kZXhdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRJZEN0ID0gdGhyZWFkSW5mb1tpXVt0aHJlYWRJZEluZGV4XSArIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGluZGV4IDwgdGhyZWFkSWRJbmRleCkgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIElmIHRocmVhZCBpZHMgd2VyZSBzcGVjaWZpZWQsIGl0IGlzIGFuIGVycm9yIGlmIHRoZXkgYXJlIG5vdAorICAgICAgICAgICAgLy8gdW5pcXVlLiAgQWxzbywgY2hlY2sgdGhhdCB3ZSB3YXZlbid0IGFscmVhZHkgcmVzdGFydGVkIHRoZQorICAgICAgICAgICAgLy8gbG9vcCAodG8gYmUgc2FmZSAtIHNob3VsZG4ndCBuZWVkIHRvKS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBpZiAoKHRocmVhZEluZm9baV1bdGhyZWFkSWRJbmRleF0gIT0gVUlOVF9NQVgpCisgICAgICAgICAgICAgIHx8IGFzc2lnbl90aHJlYWRfaWRzKSB7CisgICAgICAgICAgICAgICAgX19rbXBfZnJlZShsYXN0SWQpOworICAgICAgICAgICAgICAgIF9fa21wX2ZyZWUodG90YWxzKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9mcmVlKG1heEN0KTsKKyAgICAgICAgICAgICAgICBfX2ttcF9mcmVlKGNvdW50cyk7CisgICAgICAgICAgICAgICAgQ0xFQU5VUF9USFJFQURfSU5GTzsKKyAgICAgICAgICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX1BoeXNpY2FsSURzTm90VW5pcXVlOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIElmIHRoZSB0aHJlYWQgaWRzIHdlcmUgbm90IHNwZWNpZmllZCBhbmQgd2Ugc2VlIGVudHJpZXMKKyAgICAgICAgICAgIC8vIGVudHJpZXMgdGhhdCBhcmUgZHVwbGljYXRlcywgc3RhcnQgdGhlIGxvb3Agb3ZlciBhbmQKKyAgICAgICAgICAgIC8vIGFzc2lnbiB0aGUgdGhyZWFkIGlkcyBtYW51YWxseS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBhc3NpZ25fdGhyZWFkX2lkcyA9IHRydWU7CisgICAgICAgICAgICBnb3RvIHJlc3RhcnRfcmFkaXhfY2hlY2s7CisgICAgICAgIH0KKyAgICB9CisKKyMgaWYgS01QX01JQyAmJiBSRURVQ0VfVEVBTV9TSVpFCisgICAgLy8KKyAgICAvLyBUaGUgZGVmYXVsdCB0ZWFtIHNpemUgaXMgdGhlIHRvdGFsICN0aHJlYWRzIGluIHRoZSBtYWNoaW5lCisgICAgLy8gbWludXMgMSB0aHJlYWQgZm9yIGV2ZXJ5IGNvcmUgdGhhdCBoYXMgMyBvciBtb3JlIHRocmVhZHMuCisgICAgLy8KKyAgICB0ZWFtU2l6ZSArPSAoIHRocmVhZElkQ3QgPD0gMiApID8gKCB0aHJlYWRJZEN0ICkgOiAoIHRocmVhZElkQ3QgLSAxICk7CisjIGVuZGlmIC8vIEtNUF9NSUMgJiYgUkVEVUNFX1RFQU1fU0laRQorCisgICAgZm9yIChpbmRleCA9IHRocmVhZElkSW5kZXg7IGluZGV4IDw9IG1heEluZGV4OyBpbmRleCsrKSB7CisgICAgICAgIGlmIChjb3VudHNbaW5kZXhdID4gbWF4Q3RbaW5kZXhdKSB7CisgICAgICAgICAgICBtYXhDdFtpbmRleF0gPSBjb3VudHNbaW5kZXhdOworICAgICAgICB9CisgICAgfQorCisgICAgX19rbXBfblRocmVhZHNQZXJDb3JlID0gbWF4Q3RbdGhyZWFkSWRJbmRleF07CisgICAgbkNvcmVzUGVyUGtnID0gbWF4Q3RbY29yZUlkSW5kZXhdOworICAgIG5QYWNrYWdlcyA9IHRvdGFsc1twa2dJZEluZGV4XTsKKworICAgIC8vCisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBtYWNoaW5lIHRvcG9sb2d5IGlzIHVuaWZvcm0KKyAgICAvLworICAgIHVuc2lnbmVkIHByb2QgPSB0b3RhbHNbbWF4SW5kZXhdOworICAgIGZvciAoaW5kZXggPSB0aHJlYWRJZEluZGV4OyBpbmRleCA8IG1heEluZGV4OyBpbmRleCsrKSB7CisgICAgICAgcHJvZCAqPSBtYXhDdFtpbmRleF07CisgICAgfQorICAgIGJvb2wgdW5pZm9ybSA9IChwcm9kID09IHRvdGFsc1t0aHJlYWRJZEluZGV4XSk7CisKKyAgICAvLworICAgIC8vIFdoZW4gYWZmaW5pdHkgaXMgb2ZmLCB0aGlzIHJvdXRpbmUgd2lsbCBzdGlsbCBiZSBjYWxsZWQgdG8gc2V0CisgICAgLy8gX19rbXBfaHRfZW5hYmxlZCwgJiBfX2ttcF9uY29yZXMsIGFzIHdlbGwgYXMgX19rbXBfblRocmVhZHNQZXJDb3JlLAorICAgIC8vIG5Db3Jlc1BlclBrZywgJiBuUGFja2FnZXMuICBNYWtlIHN1cmUgYWxsIHRoZXNlIHZhcnMgYXJlIHNldAorICAgIC8vIGNvcnJlY3RseSwgYW5kIHJldHVybiBub3cgaWYgYWZmaW5pdHkgaXMgbm90IGVuYWJsZWQuCisgICAgLy8KKyAgICBfX2ttcF9odF9lbmFibGVkID0gKG1heEN0W3RocmVhZElkSW5kZXhdID4gMSk7IC8vIHRocmVhZHMgcGVyIGNvcmUgPiAxCisgICAgX19rbXBfbmNvcmVzID0gdG90YWxzW2NvcmVJZEluZGV4XTsKKworICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgIGlmICghIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkpIHsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZk5vdENhcGFibGVVc2VDcHVpbmZvLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShBdmFpbGFibGVPU1Byb2MsICJLTVBfQUZGSU5JVFkiLCBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICAgICAgICAgICAgICBpZiAodW5pZm9ybSkgeworICAgICAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKFVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKE5vblVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwgZnVsbE1hc2spOworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmQ2FwYWJsZVVzZUNwdWluZm8sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBidWYpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldE5vdFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBidWYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEF2YWlsYWJsZU9TUHJvYywgIktNUF9BRkZJTklUWSIsIF9fa21wX2F2YWlsX3Byb2MpOworICAgICAgICAgICAgICAgIGlmICh1bmlmb3JtKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oTm9uVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBrbXBfc3RyX2J1Zl90IGJ1ZjsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCZidWYpOworCisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoJmJ1ZiwgIiVkIiwgdG90YWxzW21heEluZGV4XSk7CisgICAgICAgIGZvciAoaW5kZXggPSBtYXhJbmRleCAtIDE7IGluZGV4ID49IHBrZ0lkSW5kZXg7IGluZGV4LS0pIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoJmJ1ZiwgIiB4ICVkIiwgbWF4Q3RbaW5kZXhdKTsKKyAgICAgICAgfQorICAgICAgICBLTVBfSU5GT1JNKFRvcG9sb2d5RXh0cmEsICJLTVBfQUZGSU5JVFkiLCBidWYuc3RyLCAgbWF4Q3RbY29yZUlkSW5kZXhdLAorICAgICAgICAgIG1heEN0W3RocmVhZElkSW5kZXhdLCBfX2ttcF9uY29yZXMpOworCisgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSgmYnVmKTsKKyAgICB9CisKKyMgaWYgS01QX01JQyAmJiBSRURVQ0VfVEVBTV9TSVpFCisgICAgLy8KKyAgICAvLyBTZXQgdGhlIGRlZmF1bHQgdGVhbSBzaXplLgorICAgIC8vCisgICAgaWYgKChfX2ttcF9kZmx0X3RlYW1fbnRoID09IDApICYmICh0ZWFtU2l6ZSA+IDApKSB7CisgICAgICAgIF9fa21wX2RmbHRfdGVhbV9udGggPSB0ZWFtU2l6ZTsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfYWZmaW5pdHlfY3JlYXRlX2NwdWluZm9fbWFwOiBzZXR0aW5nIF9fa21wX2RmbHRfdGVhbV9udGggPSAlZFxuIiwKKyAgICAgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoKSk7CisgICAgfQorIyBlbmRpZiAvLyBLTVBfTUlDICYmIFJFRFVDRV9URUFNX1NJWkUKKworICAgIGlmIChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpIHsKKyAgICAgICAgX19rbXBfZnJlZShsYXN0SWQpOworICAgICAgICBfX2ttcF9mcmVlKHRvdGFscyk7CisgICAgICAgIF9fa21wX2ZyZWUobWF4Q3QpOworICAgICAgICBfX2ttcF9mcmVlKGNvdW50cyk7CisgICAgICAgIENMRUFOVVBfVEhSRUFEX0lORk87CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vCisgICAgLy8gQ291bnQgdGhlIG51bWJlciBvZiBsZXZlbHMgd2hpY2ggaGF2ZSBtb3JlIG5vZGVzIGF0IHRoYXQgbGV2ZWwgdGhhbgorICAgIC8vIGF0IHRoZSBwYXJlbnQncyBsZXZlbCAod2l0aCB0aGVyZSBiZWluZyBhbiBpbXBsaWNpdCByb290IG5vZGUgb2YKKyAgICAvLyB0aGUgdG9wIGxldmVsKS4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byBzYXlpbmcgdGhhdCB0aGVyZSBpcyBhdCBsZWFzdAorICAgIC8vIG9uZSBub2RlIGF0IHRoaXMgbGV2ZWwgd2hpY2ggaGFzIGEgc2libGluZy4gIFRoZXNlIGxldmVscyBhcmUgaW4gdGhlCisgICAgLy8gbWFwLCBhbmQgdGhlIHBhY2thZ2UgbGV2ZWwgaXMgYWx3YXlzIGluIHRoZSBtYXAuCisgICAgLy8KKyAgICBib29sICppbk1hcCA9IChib29sICopX19rbXBfYWxsb2NhdGUoKG1heEluZGV4ICsgMSkgKiBzaXplb2YoYm9vbCkpOworICAgIGludCBsZXZlbCA9IDA7CisgICAgZm9yIChpbmRleCA9IHRocmVhZElkSW5kZXg7IGluZGV4IDwgbWF4SW5kZXg7IGluZGV4KyspIHsKKyAgICAgICAgS01QX0FTU0VSVCh0b3RhbHNbaW5kZXhdID49IHRvdGFsc1tpbmRleCArIDFdKTsKKyAgICAgICAgaW5NYXBbaW5kZXhdID0gKHRvdGFsc1tpbmRleF0gPiB0b3RhbHNbaW5kZXggKyAxXSk7CisgICAgfQorICAgIGluTWFwW21heEluZGV4XSA9ICh0b3RhbHNbbWF4SW5kZXhdID4gMSk7CisgICAgaW5NYXBbcGtnSWRJbmRleF0gPSB0cnVlOworCisgICAgaW50IGRlcHRoID0gMDsKKyAgICBmb3IgKGluZGV4ID0gdGhyZWFkSWRJbmRleDsgaW5kZXggPD0gbWF4SW5kZXg7IGluZGV4KyspIHsKKyAgICAgICAgaWYgKGluTWFwW2luZGV4XSkgeworICAgICAgICAgICAgZGVwdGgrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBLTVBfQVNTRVJUKGRlcHRoID4gMCk7CisKKyAgICAvLworICAgIC8vIENvbnN0cnVjdCB0aGUgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBpcyB0byBiZSByZXR1cm5lZC4KKyAgICAvLworICAgICphZGRyZXNzMm9zID0gKEFkZHJVbnNQYWlyKikKKyAgICAgIF9fa21wX2FsbG9jYXRlKHNpemVvZihBZGRyVW5zUGFpcikgKiBudW1fYXZhaWwpOworICAgIGludCBwa2dMZXZlbCA9IC0xOworICAgIGludCBjb3JlTGV2ZWwgPSAtMTsKKyAgICBpbnQgdGhyZWFkTGV2ZWwgPSAtMTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fYXZhaWw7ICsraSkgeworICAgICAgICBBZGRyZXNzIGFkZHIoZGVwdGgpOworICAgICAgICB1bnNpZ25lZCBvcyA9IHRocmVhZEluZm9baV1bb3NJZEluZGV4XTsKKyAgICAgICAgaW50IHNyY19pbmRleDsKKyAgICAgICAgaW50IGRzdF9pbmRleCA9IDA7CisKKyAgICAgICAgZm9yIChzcmNfaW5kZXggPSBtYXhJbmRleDsgc3JjX2luZGV4ID49IHRocmVhZElkSW5kZXg7IHNyY19pbmRleC0tKSB7CisgICAgICAgICAgICBpZiAoISBpbk1hcFtzcmNfaW5kZXhdKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhZGRyLmxhYmVsc1tkc3RfaW5kZXhdID0gdGhyZWFkSW5mb1tpXVtzcmNfaW5kZXhdOworICAgICAgICAgICAgaWYgKHNyY19pbmRleCA9PSBwa2dJZEluZGV4KSB7CisgICAgICAgICAgICAgICAgcGtnTGV2ZWwgPSBkc3RfaW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChzcmNfaW5kZXggPT0gY29yZUlkSW5kZXgpIHsKKyAgICAgICAgICAgICAgICBjb3JlTGV2ZWwgPSBkc3RfaW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChzcmNfaW5kZXggPT0gdGhyZWFkSWRJbmRleCkgeworICAgICAgICAgICAgICAgIHRocmVhZExldmVsID0gZHN0X2luZGV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZHN0X2luZGV4Kys7CisgICAgICAgIH0KKyAgICAgICAgKCphZGRyZXNzMm9zKVtpXSA9IEFkZHJVbnNQYWlyKGFkZHIsIG9zKTsKKyAgICB9CisKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPCAwKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIFNldCB0aGUgZ3JhbnVsYXJpdHkgbGV2ZWwgYmFzZWQgb24gd2hhdCBsZXZlbHMgYXJlIG1vZGVsZWQKKyAgICAgICAgLy8gaW4gdGhlIG1hY2hpbmUgdG9wb2xvZ3kgbWFwLgorICAgICAgICAvLworICAgICAgICB1bnNpZ25lZCBzcmNfaW5kZXg7CisgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID0gMDsKKyAgICAgICAgZm9yIChzcmNfaW5kZXggPSB0aHJlYWRJZEluZGV4OyBzcmNfaW5kZXggPD0gbWF4SW5kZXg7IHNyY19pbmRleCsrKSB7CisgICAgICAgICAgICBpZiAoISBpbk1hcFtzcmNfaW5kZXhdKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKHNyY19pbmRleCkgeworICAgICAgICAgICAgICAgIGNhc2UgdGhyZWFkSWRJbmRleDoKKyAgICAgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA+IGFmZmluaXR5X2dyYW5fdGhyZWFkKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzKys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBjb3JlSWRJbmRleDoKKyAgICAgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA+IGFmZmluaXR5X2dyYW5fY29yZSkgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgcGtnSWRJbmRleDoKKyAgICAgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA+IGFmZmluaXR5X2dyYW5fcGFja2FnZSkgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X3RvcG9sb2d5KCphZGRyZXNzMm9zLCBudW1fYXZhaWwsIGRlcHRoLCBwa2dMZXZlbCwKKyAgICAgICAgICBjb3JlTGV2ZWwsIHRocmVhZExldmVsKTsKKyAgICB9CisKKyAgICBfX2ttcF9mcmVlKGluTWFwKTsKKyAgICBfX2ttcF9mcmVlKGxhc3RJZCk7CisgICAgX19rbXBfZnJlZSh0b3RhbHMpOworICAgIF9fa21wX2ZyZWUobWF4Q3QpOworICAgIF9fa21wX2ZyZWUoY291bnRzKTsKKyAgICBDTEVBTlVQX1RIUkVBRF9JTkZPOworICAgIHJldHVybiBkZXB0aDsKK30KKworCisvLworLy8gQ3JlYXRlIGFuZCByZXR1cm4gYSB0YWJsZSBvZiBhZmZpbml0eSBtYXNrcywgaW5kZXhlZCBieSBPUyB0aHJlYWQgSUQuCisvLyBUaGlzIHJvdXRpbmUgaGFuZGxlcyBPUidpbmcgdG9nZXRoZXIgYWxsIHRoZSBhZmZpbml0eSBtYXNrcyBvZiB0aHJlYWRzCisvLyB0aGF0IGFyZSBzdWZmaWNpZW50bHkgY2xvc2UsIGlmIGdyYW51bGFyaXR5ID4gZmluZS4KKy8vCitzdGF0aWMga21wX2FmZmluX21hc2tfdCAqCitfX2ttcF9jcmVhdGVfbWFza3ModW5zaWduZWQgKm1heEluZGV4LCB1bnNpZ25lZCAqbnVtVW5pcXVlLAorICBBZGRyVW5zUGFpciAqYWRkcmVzczJvcywgdW5zaWduZWQgbnVtQWRkcnMpCit7CisgICAgLy8KKyAgICAvLyBGaXJzdCBmb3JtIGEgdGFibGUgb2YgYWZmaW5pdHkgbWFza3MgaW4gb3JkZXIgb2YgT1MgdGhyZWFkIGlkLgorICAgIC8vCisgICAgdW5zaWduZWQgZGVwdGg7CisgICAgdW5zaWduZWQgbWF4T3NJZDsKKyAgICB1bnNpZ25lZCBpOworCisgICAgS01QX0FTU0VSVChudW1BZGRycyA+IDApOworICAgIGRlcHRoID0gYWRkcmVzczJvc1swXS5maXJzdC5kZXB0aDsKKworICAgIG1heE9zSWQgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBudW1BZGRyczsgaSsrKSB7CisgICAgICAgIHVuc2lnbmVkIG9zSWQgPSBhZGRyZXNzMm9zW2ldLnNlY29uZDsKKyAgICAgICAgaWYgKG9zSWQgPiBtYXhPc0lkKSB7CisgICAgICAgICAgICBtYXhPc0lkID0gb3NJZDsKKyAgICAgICAgfQorICAgIH0KKyAgICBrbXBfYWZmaW5fbWFza190ICpvc0lkMk1hc2sgPSAoa21wX2FmZmluX21hc2tfdCAqKV9fa21wX2FsbG9jYXRlKAorICAgICAgKG1heE9zSWQgKyAxKSAqIF9fa21wX2FmZmluX21hc2tfc2l6ZSk7CisKKyAgICAvLworICAgIC8vIFNvcnQgdGhlIGFkZHJlc3Myb3MgdGFibGUgYWNjb3JkaW5nIHRvIHBoeXNpY2FsIG9yZGVyLiAgRG9pbmcgc28KKyAgICAvLyB3aWxsIHB1dCBhbGwgdGhyZWFkcyBvbiB0aGUgc2FtZSBjb3JlL3BhY2thZ2Uvbm9kZSBpbiBjb25zZWN1dGl2ZQorICAgIC8vIGxvY2F0aW9ucy4KKyAgICAvLworICAgIHFzb3J0KGFkZHJlc3Myb3MsIG51bUFkZHJzLCBzaXplb2YoKmFkZHJlc3Myb3MpLAorICAgICAgX19rbXBfYWZmaW5pdHlfY21wX0FkZHJlc3NfbGFiZWxzKTsKKworICAgIEtNUF9BU1NFUlQoX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPj0gMCk7CisgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgJiYgKF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID4gMCkpIHsKKyAgICAgICAgS01QX0lORk9STShUaHJlYWRzTWlncmF0ZSwgIktNUF9BRkZJTklUWSIsICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyk7CisgICAgfQorICAgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA+PSAoaW50KWRlcHRoKSB7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpKSkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmVGhyZWFkc01heU1pZ3JhdGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8KKyAgICAvLyBSdW4gdGhyb3VnaCB0aGUgdGFibGUsIGZvcm1pbmcgdGhlIG1hc2tzIGZvciBhbGwgdGhyZWFkcyBvbiBlYWNoCisgICAgLy8gY29yZS4gIFRocmVhZHMgb24gdGhlIHNhbWUgY29yZSB3aWxsIGhhdmUgaWRlbnRpY2FsICJBZGRyZXNzIgorICAgIC8vIG9iamVjdHMsIG5vdCBjb25zaWRlcmluZyB0aGUgbGFzdCBsZXZlbCwgd2hpY2ggbXVzdCBiZSB0aGUgdGhyZWFkCisgICAgLy8gaWQuICBBbGwgdGhyZWFkcyBvbiBhIGNvcmUgd2lsbCBhcHBlYXIgY29uc2VjdXRpdmVseS4KKyAgICAvLworICAgIHVuc2lnbmVkIHVuaXF1ZSA9IDA7CisgICAgdW5zaWduZWQgaiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmRleCBvZiAxc3QgdGhyZWFkIG9uIGNvcmUKKyAgICB1bnNpZ25lZCBsZWFkZXIgPSAwOworICAgIEFkZHJlc3MgKmxlYWRlckFkZHIgPSAmKGFkZHJlc3Myb3NbMF0uZmlyc3QpOworICAgIGttcF9hZmZpbl9tYXNrX3QgKnN1bQorICAgICAgPSAoa21wX2FmZmluX21hc2tfdCAqKWFsbG9jYShfX2ttcF9hZmZpbl9tYXNrX3NpemUpOworICAgIEtNUF9DUFVfWkVSTyhzdW0pOworICAgIEtNUF9DUFVfU0VUKGFkZHJlc3Myb3NbMF0uc2Vjb25kLCBzdW0pOworICAgIGZvciAoaSA9IDE7IGkgPCBudW1BZGRyczsgaSsrKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIElmIHRoaXMgdGhyZWFkIGlzIHN1ZmZpY2llbnRseSBjbG9zZSB0byB0aGUgbGVhZGVyICh3aXRoaW4gdGhlCisgICAgICAgIC8vIGdyYW51bGFyaXR5IHNldHRpbmcpLCB0aGVuIHNldCB0aGUgYml0IGZvciB0aGlzIG9zIHRocmVhZCBpbiB0aGUKKyAgICAgICAgLy8gYWZmaW5pdHkgbWFzayBmb3IgdGhpcyBncm91cCwgYW5kIGdvIG9uIHRvIHRoZSBuZXh0IHRocmVhZC4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKGxlYWRlckFkZHItPmlzQ2xvc2UoYWRkcmVzczJvc1tpXS5maXJzdCwKKyAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscykpIHsKKyAgICAgICAgICAgIEtNUF9DUFVfU0VUKGFkZHJlc3Myb3NbaV0uc2Vjb25kLCBzdW0pOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBGb3IgZXZlcnkgdGhyZWFkIGluIHRoaXMgZ3JvdXAsIGNvcHkgdGhlIG1hc2sgdG8gdGhlIHRocmVhZCdzCisgICAgICAgIC8vIGVudHJ5IGluIHRoZSBvc0lkMk1hc2sgdGFibGUuICBNYXJrIHRoZSBmaXJzdCBhZGRyZXNzIGFzIGEKKyAgICAgICAgLy8gbGVhZGVyLgorICAgICAgICAvLworICAgICAgICBmb3IgKDsgaiA8IGk7IGorKykgeworICAgICAgICAgICAgdW5zaWduZWQgb3NJZCA9IGFkZHJlc3Myb3Nbal0uc2Vjb25kOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChvc0lkIDw9IG1heE9zSWQpOworICAgICAgICAgICAga21wX2FmZmluX21hc2tfdCAqbWFzayA9IEtNUF9DUFVfSU5ERVgob3NJZDJNYXNrLCBvc0lkKTsKKyAgICAgICAgICAgIEtNUF9DUFVfQ09QWShtYXNrLCBzdW0pOworICAgICAgICAgICAgYWRkcmVzczJvc1tqXS5maXJzdC5sZWFkZXIgPSAoaiA9PSBsZWFkZXIpOworICAgICAgICB9CisgICAgICAgIHVuaXF1ZSsrOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFN0YXJ0IGEgbmV3IG1hc2suCisgICAgICAgIC8vCisgICAgICAgIGxlYWRlciA9IGk7CisgICAgICAgIGxlYWRlckFkZHIgPSAmKGFkZHJlc3Myb3NbaV0uZmlyc3QpOworICAgICAgICBLTVBfQ1BVX1pFUk8oc3VtKTsKKyAgICAgICAgS01QX0NQVV9TRVQoYWRkcmVzczJvc1tpXS5zZWNvbmQsIHN1bSk7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBGb3IgZXZlcnkgdGhyZWFkIGluIGxhc3QgZ3JvdXAsIGNvcHkgdGhlIG1hc2sgdG8gdGhlIHRocmVhZCdzCisgICAgLy8gZW50cnkgaW4gdGhlIG9zSWQyTWFzayB0YWJsZS4KKyAgICAvLworICAgIGZvciAoOyBqIDwgaTsgaisrKSB7CisgICAgICAgIHVuc2lnbmVkIG9zSWQgPSBhZGRyZXNzMm9zW2pdLnNlY29uZDsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChvc0lkIDw9IG1heE9zSWQpOworICAgICAgICBrbXBfYWZmaW5fbWFza190ICptYXNrID0gS01QX0NQVV9JTkRFWChvc0lkMk1hc2ssIG9zSWQpOworICAgICAgICBLTVBfQ1BVX0NPUFkobWFzaywgc3VtKTsKKyAgICAgICAgYWRkcmVzczJvc1tqXS5maXJzdC5sZWFkZXIgPSAoaiA9PSBsZWFkZXIpOworICAgIH0KKyAgICB1bmlxdWUrKzsKKworICAgICptYXhJbmRleCA9IG1heE9zSWQ7CisgICAgKm51bVVuaXF1ZSA9IHVuaXF1ZTsKKyAgICByZXR1cm4gb3NJZDJNYXNrOworfQorCisKKy8vCisvLyBTdHVmZiBmb3IgdGhlIGFmZmluaXR5IHByb2NsaXN0IHBhcnNlcnMuICBJdCdzIGVhc2llciB0byBkZWNsYXJlIHRoZXNlIHZhcnMKKy8vIGFzIGZpbGUtc3RhdGljIHRoYW4gdG8gdHJ5IGFuZCBwYXNzIHRoZW0gdGhyb3VnaCB0aGUgY2FsbGluZyBzZXF1ZW5jZSBvZgorLy8gdGhlIHJlY3Vyc2l2ZS1kZXNjZW50IE9NUF9QTEFDRVMgcGFyc2VyLgorLy8KK3N0YXRpYyBrbXBfYWZmaW5fbWFza190ICpuZXdNYXNrczsKK3N0YXRpYyBpbnQgbnVtTmV3TWFza3M7CitzdGF0aWMgaW50IG5leHROZXdNYXNrOworCisjZGVmaW5lIEFERF9NQVNLKF9tYXNrKSBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChuZXh0TmV3TWFzayA+PSBudW1OZXdNYXNrcykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBudW1OZXdNYXNrcyAqPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBuZXdNYXNrcyA9IChrbXBfYWZmaW5fbWFza190ICopS01QX0lOVEVSTkFMX1JFQUxMT0MobmV3TWFza3MsIFwKKyAgICAgICAgICAgICAgbnVtTmV3TWFza3MgKiBfX2ttcF9hZmZpbl9tYXNrX3NpemUpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NQVV9DT1BZKEtNUF9DUFVfSU5ERVgobmV3TWFza3MsIG5leHROZXdNYXNrKSwgKF9tYXNrKSk7ICAgIFwKKyAgICAgICAgbmV4dE5ld01hc2srKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyNkZWZpbmUgQUREX01BU0tfT1NJRChfb3NJZCxfb3NJZDJNYXNrLF9tYXhPc0lkKSBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoKF9vc0lkKSA+IF9tYXhPc0lkKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKCEgS01QX0NQVV9JU1NFVCgoX29zSWQpLCBLTVBfQ1BVX0lOREVYKF9vc0lkMk1hc2ssIChfb3NJZCkpKSkpIHtcCisgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCAoX19rbXBfYWZmaW5pdHlfd2FybmluZ3MgICAgICBcCisgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpKSkgeyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmSWdub3JlSW52YWxpZFByb2NJRCwgX29zSWQpOyAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBRERfTUFTSyhLTVBfQ1BVX0lOREVYKF9vc0lkMk1hc2ssIChfb3NJZCkpKTsgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisKKy8vCisvLyBSZS1wYXJzZSB0aGUgcHJvY2xpc3QgKGZvciB0aGUgZXhwbGljaXQgYWZmaW5pdHkgdHlwZSksIGFuZCBmb3JtIHRoZSBsaXN0CisvLyBvZiBhZmZpbml0eSBuZXdNYXNrcyBpbmRleGVkIGJ5IGd0aWQuCisvLworc3RhdGljIHZvaWQKK19fa21wX2FmZmluaXR5X3Byb2Nlc3NfcHJvY2xpc3Qoa21wX2FmZmluX21hc2tfdCAqKm91dF9tYXNrcywKKyAgdW5zaWduZWQgaW50ICpvdXRfbnVtTWFza3MsIGNvbnN0IGNoYXIgKnByb2NsaXN0LAorICBrbXBfYWZmaW5fbWFza190ICpvc0lkMk1hc2ssIGludCBtYXhPc0lkKQoreworICAgIGNvbnN0IGNoYXIgKnNjYW4gPSBwcm9jbGlzdDsKKyAgICBjb25zdCBjaGFyICpuZXh0ID0gcHJvY2xpc3Q7CisKKyAgICAvLworICAgIC8vIFdlIHVzZSBtYWxsb2MoKSBmb3IgdGhlIHRlbXBvcmFyeSBtYXNrIHZlY3RvciwKKyAgICAvLyBzbyB0aGF0IHdlIGNhbiB1c2UgcmVhbGxvYygpIHRvIGV4dGVuZCBpdC4KKyAgICAvLworICAgIG51bU5ld01hc2tzID0gMjsKKyAgICBuZXdNYXNrcyA9IChrbXBfYWZmaW5fbWFza190ICopS01QX0lOVEVSTkFMX01BTExPQyhudW1OZXdNYXNrcworICAgICAgKiBfX2ttcF9hZmZpbl9tYXNrX3NpemUpOworICAgIG5leHROZXdNYXNrID0gMDsKKyAgICBrbXBfYWZmaW5fbWFza190ICpzdW1NYXNrID0gKGttcF9hZmZpbl9tYXNrX3QgKilfX2ttcF9hbGxvY2F0ZSgKKyAgICAgIF9fa21wX2FmZmluX21hc2tfc2l6ZSk7CisgICAgaW50IHNldFNpemUgPSAwOworCisgICAgZm9yICg7OykgeworICAgICAgICBpbnQgc3RhcnQsIGVuZCwgc3RyaWRlOworCisgICAgICAgIFNLSVBfV1Moc2Nhbik7CisgICAgICAgIG5leHQgPSBzY2FuOworICAgICAgICBpZiAoKm5leHQgPT0gJ1wwJykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKm5leHQgPT0gJ3snKSB7CisgICAgICAgICAgICBpbnQgbnVtOworICAgICAgICAgICAgc2V0U2l6ZSA9IDA7CisgICAgICAgICAgICBuZXh0Kys7ICAgICAvLyBza2lwICd7JworICAgICAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgICAgIHNjYW4gPSBuZXh0OworCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gUmVhZCB0aGUgZmlyc3QgaW50ZWdlciBpbiB0aGUgc2V0LgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIEtNUF9BU1NFUlQyKCgqbmV4dCA+PSAnMCcpICYmICgqbmV4dCA8PSAnOScpLAorICAgICAgICAgICAgICAiYmFkIHByb2NsaXN0Iik7CisgICAgICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgICAgIG51bSA9IF9fa21wX3N0cl90b19pbnQoc2NhbiwgKm5leHQpOworICAgICAgICAgICAgS01QX0FTU0VSVDIobnVtID49IDAsICJiYWQgZXhwbGljaXQgcHJvYyBsaXN0Iik7CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBDb3B5IHRoZSBtYXNrIGZvciB0aGF0IG9zSWQgdG8gdGhlIHN1bSAodW5pb24pIG1hc2suCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaWYgKChudW0gPiBtYXhPc0lkKSB8fAorICAgICAgICAgICAgICAoISBLTVBfQ1BVX0lTU0VUKG51bSwgS01QX0NQVV9JTkRFWChvc0lkMk1hc2ssIG51bSkpKSkgeworICAgICAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkpKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZklnbm9yZUludmFsaWRQcm9jSUQsIG51bSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEtNUF9DUFVfWkVSTyhzdW1NYXNrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9DUFVfQ09QWShzdW1NYXNrLCBLTVBfQ1BVX0lOREVYKG9zSWQyTWFzaywgbnVtKSk7CisgICAgICAgICAgICAgICAgc2V0U2l6ZSA9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBlbmQgb2Ygc2V0LgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgICAgICAgICBpZiAoKm5leHQgPT0gJ30nKSB7CisgICAgICAgICAgICAgICAgICAgIG5leHQrKzsgICAgIC8vIHNraXAgJ30nCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gU2tpcCBvcHRpb25hbCBjb21tYS4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIGlmICgqbmV4dCA9PSAnLCcpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV4dCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTS0lQX1dTKG5leHQpOworCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBSZWFkIHRoZSBuZXh0IGludGVnZXIgaW4gdGhlIHNldC4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIHNjYW4gPSBuZXh0OworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQyKCgqbmV4dCA+PSAnMCcpICYmICgqbmV4dCA8PSAnOScpLAorICAgICAgICAgICAgICAgICAgImJhZCBleHBsaWNpdCBwcm9jIGxpc3QiKTsKKworICAgICAgICAgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICAgICAgICAgIG51bSA9IF9fa21wX3N0cl90b19pbnQoc2NhbiwgKm5leHQpOworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQyKG51bSA+PSAwLCAiYmFkIGV4cGxpY2l0IHByb2MgbGlzdCIpOworCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIG1hc2sgZm9yIHRoYXQgb3NJZCB0byB0aGUgc3VtIG1hc2suCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBpZiAoKG51bSA+IG1heE9zSWQpIHx8CisgICAgICAgICAgICAgICAgICAoISBLTVBfQ1BVX0lTU0VUKG51bSwgS01QX0NQVV9JTkRFWChvc0lkMk1hc2ssIG51bSkpKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCAoX19rbXBfYWZmaW5pdHlfd2FybmluZ3MKKyAgICAgICAgICAgICAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9ub25lKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZklnbm9yZUludmFsaWRQcm9jSUQsIG51bSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfVU5JT04oc3VtTWFzaywgS01QX0NQVV9JTkRFWChvc0lkMk1hc2ssIG51bSkpOworICAgICAgICAgICAgICAgICAgICBzZXRTaXplKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNldFNpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgQUREX01BU0soc3VtTWFzayk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgICAgICBpZiAoKm5leHQgPT0gJywnKSB7CisgICAgICAgICAgICAgICAgbmV4dCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2NhbiA9IG5leHQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIFJlYWQgdGhlIGZpcnN0IGludGVnZXIuCisgICAgICAgIC8vCisgICAgICAgIEtNUF9BU1NFUlQyKCgqbmV4dCA+PSAnMCcpICYmICgqbmV4dCA8PSAnOScpLCAiYmFkIGV4cGxpY2l0IHByb2MgbGlzdCIpOworICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgc3RhcnQgPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgICAgICAgS01QX0FTU0VSVDIoc3RhcnQgPj0gMCwgImJhZCBleHBsaWNpdCBwcm9jIGxpc3QiKTsKKyAgICAgICAgU0tJUF9XUyhuZXh0KTsKKworICAgICAgICAvLworICAgICAgICAvLyBJZiB0aGlzIGlzbid0IGEgcmFuZ2UsIHRoZW4gYWRkIGEgbWFzayB0byB0aGUgbGlzdCBhbmQgZ28gb24uCisgICAgICAgIC8vCisgICAgICAgIGlmICgqbmV4dCAhPSAnLScpIHsKKyAgICAgICAgICAgIEFERF9NQVNLX09TSUQoc3RhcnQsIG9zSWQyTWFzaywgbWF4T3NJZCk7CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBTa2lwIG9wdGlvbmFsIGNvbW1hLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmICgqbmV4dCA9PSAnLCcpIHsKKyAgICAgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzY2FuID0gbmV4dDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhpcyBpcyBhIHJhbmdlLiAgU2tpcCBvdmVyIHRoZSAnLScgYW5kIHJlYWQgaW4gdGhlIDJuZCBpbnQuCisgICAgICAgIC8vCisgICAgICAgIG5leHQrKzsgICAgICAgICAvLyBza2lwICctJworICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICBzY2FuID0gbmV4dDsKKyAgICAgICAgS01QX0FTU0VSVDIoKCpuZXh0ID49ICcwJykgJiYgKCpuZXh0IDw9ICc5JyksICJiYWQgZXhwbGljaXQgcHJvYyBsaXN0Iik7CisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBlbmQgPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgICAgICAgS01QX0FTU0VSVDIoZW5kID49IDAsICJiYWQgZXhwbGljaXQgcHJvYyBsaXN0Iik7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQ2hlY2sgZm9yIGEgc3RyaWRlIHBhcmFtZXRlcgorICAgICAgICAvLworICAgICAgICBzdHJpZGUgPSAxOworICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICBpZiAoKm5leHQgPT0gJzonKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gQSBzdHJpZGUgaXMgc3BlY2lmaWVkLiAgU2tpcCBvdmVyIHRoZSAnOiIgYW5kIHJlYWQgdGhlIDNyZCBpbnQuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaW50IHNpZ24gPSArMTsKKyAgICAgICAgICAgIG5leHQrKzsgICAgICAgICAvLyBza2lwICc6JworICAgICAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgICAgIHNjYW4gPSBuZXh0OworICAgICAgICAgICAgaWYgKCpuZXh0ID09ICctJykgeworICAgICAgICAgICAgICAgIHNpZ24gPSAtMTsKKyAgICAgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgICAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgICAgICAgICBzY2FuID0gbmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtNUF9BU1NFUlQyKCgqbmV4dCA+PSAgJzAnKSAmJiAoKm5leHQgPD0gJzknKSwKKyAgICAgICAgICAgICAgImJhZCBleHBsaWNpdCBwcm9jIGxpc3QiKTsKKyAgICAgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICAgICAgc3RyaWRlID0gX19rbXBfc3RyX3RvX2ludChzY2FuLCAqbmV4dCk7CisgICAgICAgICAgICBLTVBfQVNTRVJUMihzdHJpZGUgPj0gMCwgImJhZCBleHBsaWNpdCBwcm9jIGxpc3QiKTsKKyAgICAgICAgICAgIHN0cmlkZSAqPSBzaWduOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRG8gc29tZSByYW5nZSBjaGVja3MuCisgICAgICAgIC8vCisgICAgICAgIEtNUF9BU1NFUlQyKHN0cmlkZSAhPSAwLCAiYmFkIGV4cGxpY2l0IHByb2MgbGlzdCIpOworICAgICAgICBpZiAoc3RyaWRlID4gMCkgeworICAgICAgICAgICAgS01QX0FTU0VSVDIoc3RhcnQgPD0gZW5kLCAiYmFkIGV4cGxpY2l0IHByb2MgbGlzdCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgS01QX0FTU0VSVDIoc3RhcnQgPj0gZW5kLCAiYmFkIGV4cGxpY2l0IHByb2MgbGlzdCIpOworICAgICAgICB9CisgICAgICAgIEtNUF9BU1NFUlQyKChlbmQgLSBzdGFydCkgLyBzdHJpZGUgPD0gNjU1MzYsICJiYWQgZXhwbGljaXQgcHJvYyBsaXN0Iik7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQWRkIHRoZSBtYXNrIGZvciBlYWNoIE9TIHByb2MgIyB0byB0aGUgbGlzdC4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKHN0cmlkZSA+IDApIHsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBBRERfTUFTS19PU0lEKHN0YXJ0LCBvc0lkMk1hc2ssIG1heE9zSWQpOworICAgICAgICAgICAgICAgIHN0YXJ0ICs9IHN0cmlkZTsKKyAgICAgICAgICAgIH0gd2hpbGUgKHN0YXJ0IDw9IGVuZCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgQUREX01BU0tfT1NJRChzdGFydCwgb3NJZDJNYXNrLCBtYXhPc0lkKTsKKyAgICAgICAgICAgICAgICBzdGFydCArPSBzdHJpZGU7CisgICAgICAgICAgICB9IHdoaWxlIChzdGFydCA+PSBlbmQpOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gU2tpcCBvcHRpb25hbCBjb21tYS4KKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgaWYgKCpuZXh0ID09ICcsJykgeworICAgICAgICAgICAgbmV4dCsrOworICAgICAgICB9CisgICAgICAgIHNjYW4gPSBuZXh0OworICAgIH0KKworICAgICpvdXRfbnVtTWFza3MgPSBuZXh0TmV3TWFzazsKKyAgICBpZiAobmV4dE5ld01hc2sgPT0gMCkgeworICAgICAgICAqb3V0X21hc2tzID0gTlVMTDsKKyAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUobmV3TWFza3MpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgICpvdXRfbWFza3MKKyAgICAgID0gKGttcF9hZmZpbl9tYXNrX3QgKilfX2ttcF9hbGxvY2F0ZShuZXh0TmV3TWFzayAqIF9fa21wX2FmZmluX21hc2tfc2l6ZSk7CisgICAgbWVtY3B5KCpvdXRfbWFza3MsIG5ld01hc2tzLCBuZXh0TmV3TWFzayAqIF9fa21wX2FmZmluX21hc2tfc2l6ZSk7CisgICAgX19rbXBfZnJlZShzdW1NYXNrKTsKKyAgICBLTVBfSU5URVJOQUxfRlJFRShuZXdNYXNrcyk7Cit9CisKKworIyBpZiBPTVBfNDBfRU5BQkxFRAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1JlLXBhcnNlIHRoZSBPTVBfUExBQ0VTIHByb2MgaWQgbGlzdCwgZm9ybWluZyB0aGUgbmV3TWFza3MgZm9yIHRoZSBkaWZmZXJlbnQKK3BsYWNlcy4gIEFnYWluLCBIZXJlIGlzIHRoZSBncmFtbWFyOgorCitwbGFjZV9saXN0IDo9IHBsYWNlCitwbGFjZV9saXN0IDo9IHBsYWNlICwgcGxhY2VfbGlzdAorcGxhY2UgOj0gbnVtCitwbGFjZSA6PSBwbGFjZSA6IG51bQorcGxhY2UgOj0gcGxhY2UgOiBudW0gOiBzaWduZWQKK3BsYWNlIDo9IHsgc3VicGxhY2VsaXN0IH0KK3BsYWNlIDo9ICEgcGxhY2UgICAgICAgICAgICAgICAgICAvLyAobG93ZXN0IHByaW9yaXR5KQorc3VicGxhY2VfbGlzdCA6PSBzdWJwbGFjZQorc3VicGxhY2VfbGlzdCA6PSBzdWJwbGFjZSAsIHN1YnBsYWNlX2xpc3QKK3N1YnBsYWNlIDo9IG51bQorc3VicGxhY2UgOj0gbnVtIDogbnVtCitzdWJwbGFjZSA6PSBudW0gOiBudW0gOiBzaWduZWQKK3NpZ25lZCA6PSBudW0KK3NpZ25lZCA6PSArIHNpZ25lZAorc2lnbmVkIDo9IC0gc2lnbmVkCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQKK19fa21wX3Byb2Nlc3Nfc3VicGxhY2VfbGlzdChjb25zdCBjaGFyICoqc2Nhbiwga21wX2FmZmluX21hc2tfdCAqb3NJZDJNYXNrLAorICBpbnQgbWF4T3NJZCwga21wX2FmZmluX21hc2tfdCAqdGVtcE1hc2ssIGludCAqc2V0U2l6ZSkKK3sKKyAgICBjb25zdCBjaGFyICpuZXh0OworCisgICAgZm9yICg7OykgeworICAgICAgICBpbnQgc3RhcnQsIGNvdW50LCBzdHJpZGUsIGk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gUmVhZCBpbiB0aGUgc3RhcnRpbmcgcHJvYyBpZAorICAgICAgICAvLworICAgICAgICBTS0lQX1dTKCpzY2FuKTsKKyAgICAgICAgS01QX0FTU0VSVDIoKCoqc2NhbiA+PSAnMCcpICYmICgqKnNjYW4gPD0gJzknKSwKKyAgICAgICAgICAiYmFkIGV4cGxpY2l0IHBsYWNlcyBsaXN0Iik7CisgICAgICAgIG5leHQgPSAqc2NhbjsKKyAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgIHN0YXJ0ID0gX19rbXBfc3RyX3RvX2ludCgqc2NhbiwgKm5leHQpOworICAgICAgICBLTVBfQVNTRVJUKHN0YXJ0ID49IDApOworICAgICAgICAqc2NhbiA9IG5leHQ7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gdmFsaWQgZm9sbG93IHNldHMgYXJlICcsJyAnOicgYW5kICd9JworICAgICAgICAvLworICAgICAgICBTS0lQX1dTKCpzY2FuKTsKKyAgICAgICAgaWYgKCoqc2NhbiA9PSAnfScgfHwgKipzY2FuID09ICcsJykgeworICAgICAgICAgICAgaWYgKChzdGFydCA+IG1heE9zSWQpIHx8CisgICAgICAgICAgICAgICghIEtNUF9DUFVfSVNTRVQoc3RhcnQsIEtNUF9DUFVfSU5ERVgob3NJZDJNYXNrLCBzdGFydCkpKSkgeworICAgICAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkpKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZklnbm9yZUludmFsaWRQcm9jSUQsIHN0YXJ0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBLTVBfQ1BVX1VOSU9OKHRlbXBNYXNrLCBLTVBfQ1BVX0lOREVYKG9zSWQyTWFzaywgc3RhcnQpKTsKKyAgICAgICAgICAgICAgICAoKnNldFNpemUpKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKipzY2FuID09ICd9JykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKCpzY2FuKSsrOyAgLy8gc2tpcCAnLCcKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIEtNUF9BU1NFUlQyKCoqc2NhbiA9PSAnOicsICJiYWQgZXhwbGljaXQgcGxhY2VzIGxpc3QiKTsKKyAgICAgICAgKCpzY2FuKSsrOyAgICAgIC8vIHNraXAgJzonCisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gUmVhZCBjb3VudCBwYXJhbWV0ZXIKKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUygqc2Nhbik7CisgICAgICAgIEtNUF9BU1NFUlQyKCgqKnNjYW4gPj0gJzAnKSAmJiAoKipzY2FuIDw9ICc5JyksCisgICAgICAgICAgImJhZCBleHBsaWNpdCBwbGFjZXMgbGlzdCIpOworICAgICAgICBuZXh0ID0gKnNjYW47CisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBjb3VudCA9IF9fa21wX3N0cl90b19pbnQoKnNjYW4sICpuZXh0KTsKKyAgICAgICAgS01QX0FTU0VSVChjb3VudCA+PSAwKTsKKyAgICAgICAgKnNjYW4gPSBuZXh0OworCisgICAgICAgIC8vCisgICAgICAgIC8vIHZhbGlkIGZvbGxvdyBzZXRzIGFyZSAnLCcgJzonIGFuZCAnfScKKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUygqc2Nhbik7CisgICAgICAgIGlmICgqKnNjYW4gPT0gJ30nIHx8ICoqc2NhbiA9PSAnLCcpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKChzdGFydCA+IG1heE9zSWQpIHx8CisgICAgICAgICAgICAgICAgICAoISBLTVBfQ1BVX0lTU0VUKHN0YXJ0LCBLTVBfQ1BVX0lOREVYKG9zSWQyTWFzaywgc3RhcnQpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgKF9fa21wX2FmZmluaXR5X3dhcm5pbmdzCisgICAgICAgICAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfV0FSTklORyhBZmZJZ25vcmVJbnZhbGlkUHJvY0lELCBzdGFydCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAvLyBkb24ndCBwcm9saWZlcmF0ZSB3YXJuaW5ncyBmb3IgbGFyZ2UgY291bnQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfVU5JT04odGVtcE1hc2ssIEtNUF9DUFVfSU5ERVgob3NJZDJNYXNrLCBzdGFydCkpOworICAgICAgICAgICAgICAgICAgICBzdGFydCsrOworICAgICAgICAgICAgICAgICAgICAoKnNldFNpemUpKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCoqc2NhbiA9PSAnfScpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICgqc2NhbikrKzsgIC8vIHNraXAgJywnCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBLTVBfQVNTRVJUMigqKnNjYW4gPT0gJzonLCAiYmFkIGV4cGxpY2l0IHBsYWNlcyBsaXN0Iik7CisgICAgICAgICgqc2NhbikrKzsgICAgICAvLyBza2lwICc6JworCisgICAgICAgIC8vCisgICAgICAgIC8vIFJlYWQgc3RyaWRlIHBhcmFtZXRlcgorICAgICAgICAvLworICAgICAgICBpbnQgc2lnbiA9ICsxOworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBTS0lQX1dTKCpzY2FuKTsKKyAgICAgICAgICAgIGlmICgqKnNjYW4gPT0gJysnKSB7CisgICAgICAgICAgICAgICAgKCpzY2FuKSsrOyAvLyBza2lwICcrJworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCoqc2NhbiA9PSAnLScpIHsKKyAgICAgICAgICAgICAgICBzaWduICo9IC0xOworICAgICAgICAgICAgICAgICgqc2NhbikrKzsgLy8gc2tpcCAnLScKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIFNLSVBfV1MoKnNjYW4pOworICAgICAgICBLTVBfQVNTRVJUMigoKipzY2FuID49ICcwJykgJiYgKCoqc2NhbiA8PSAnOScpLAorICAgICAgICAgICJiYWQgZXhwbGljaXQgcGxhY2VzIGxpc3QiKTsKKyAgICAgICAgbmV4dCA9ICpzY2FuOworICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgc3RyaWRlID0gX19rbXBfc3RyX3RvX2ludCgqc2NhbiwgKm5leHQpOworICAgICAgICBLTVBfQVNTRVJUKHN0cmlkZSA+PSAwKTsKKyAgICAgICAgKnNjYW4gPSBuZXh0OworICAgICAgICBzdHJpZGUgKj0gc2lnbjsKKworICAgICAgICAvLworICAgICAgICAvLyB2YWxpZCBmb2xsb3cgc2V0cyBhcmUgJywnIGFuZCAnfScKKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUygqc2Nhbik7CisgICAgICAgIGlmICgqKnNjYW4gPT0gJ30nIHx8ICoqc2NhbiA9PSAnLCcpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKChzdGFydCA+IG1heE9zSWQpIHx8CisgICAgICAgICAgICAgICAgICAoISBLTVBfQ1BVX0lTU0VUKHN0YXJ0LCBLTVBfQ1BVX0lOREVYKG9zSWQyTWFzaywgc3RhcnQpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgKF9fa21wX2FmZmluaXR5X3dhcm5pbmdzCisgICAgICAgICAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfV0FSTklORyhBZmZJZ25vcmVJbnZhbGlkUHJvY0lELCBzdGFydCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAvLyBkb24ndCBwcm9saWZlcmF0ZSB3YXJuaW5ncyBmb3IgbGFyZ2UgY291bnQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfVU5JT04odGVtcE1hc2ssIEtNUF9DUFVfSU5ERVgob3NJZDJNYXNrLCBzdGFydCkpOworICAgICAgICAgICAgICAgICAgICBzdGFydCArPSBzdHJpZGU7CisgICAgICAgICAgICAgICAgICAgICgqc2V0U2l6ZSkrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKipzY2FuID09ICd9JykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKCpzY2FuKSsrOyAgLy8gc2tpcCAnLCcKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgS01QX0FTU0VSVDIoMCwgImJhZCBleHBsaWNpdCBwbGFjZXMgbGlzdCIpOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZAorX19rbXBfcHJvY2Vzc19wbGFjZShjb25zdCBjaGFyICoqc2Nhbiwga21wX2FmZmluX21hc2tfdCAqb3NJZDJNYXNrLAorICBpbnQgbWF4T3NJZCwga21wX2FmZmluX21hc2tfdCAqdGVtcE1hc2ssIGludCAqc2V0U2l6ZSkKK3sKKyAgICBjb25zdCBjaGFyICpuZXh0OworCisgICAgLy8KKyAgICAvLyB2YWxpZCBmb2xsb3cgc2V0cyBhcmUgJ3snICchJyBhbmQgbnVtCisgICAgLy8KKyAgICBTS0lQX1dTKCpzY2FuKTsKKyAgICBpZiAoKipzY2FuID09ICd7JykgeworICAgICAgICAoKnNjYW4pKys7ICAgICAgLy8gc2tpcCAneycKKyAgICAgICAgX19rbXBfcHJvY2Vzc19zdWJwbGFjZV9saXN0KHNjYW4sIG9zSWQyTWFzaywgbWF4T3NJZCAsIHRlbXBNYXNrLAorICAgICAgICAgIHNldFNpemUpOworICAgICAgICBLTVBfQVNTRVJUMigqKnNjYW4gPT0gJ30nLCAiYmFkIGV4cGxpY2l0IHBsYWNlcyBsaXN0Iik7CisgICAgICAgICgqc2NhbikrKzsgICAgICAvLyBza2lwICd9JworICAgIH0KKyAgICBlbHNlIGlmICgqKnNjYW4gPT0gJyEnKSB7CisgICAgICAgIF9fa21wX3Byb2Nlc3NfcGxhY2Uoc2Nhbiwgb3NJZDJNYXNrLCBtYXhPc0lkLCB0ZW1wTWFzaywgc2V0U2l6ZSk7CisgICAgICAgIEtNUF9DUFVfQ09NUExFTUVOVCh0ZW1wTWFzayk7CisgICAgICAgICgqc2NhbikrKzsgICAgICAvLyBza2lwICchJworICAgIH0KKyAgICBlbHNlIGlmICgoKipzY2FuID49ICcwJykgJiYgKCoqc2NhbiA8PSAnOScpKSB7CisgICAgICAgIG5leHQgPSAqc2NhbjsKKyAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgIGludCBudW0gPSBfX2ttcF9zdHJfdG9faW50KCpzY2FuLCAqbmV4dCk7CisgICAgICAgIEtNUF9BU1NFUlQobnVtID49IDApOworICAgICAgICBpZiAoKG51bSA+IG1heE9zSWQpIHx8CisgICAgICAgICAgKCEgS01QX0NQVV9JU1NFVChudW0sIEtNUF9DUFVfSU5ERVgob3NJZDJNYXNrLCBudW0pKSkpIHsKKyAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9ub25lKSkpIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyhBZmZJZ25vcmVJbnZhbGlkUHJvY0lELCBudW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgS01QX0NQVV9VTklPTih0ZW1wTWFzaywgS01QX0NQVV9JTkRFWChvc0lkMk1hc2ssIG51bSkpOworICAgICAgICAgICAgKCpzZXRTaXplKSsrOworICAgICAgICB9CisgICAgICAgICpzY2FuID0gbmV4dDsgIC8vIHNraXAgbnVtCisgICAgICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS01QX0FTU0VSVDIoMCwgImJhZCBleHBsaWNpdCBwbGFjZXMgbGlzdCIpOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZAorX19rbXBfYWZmaW5pdHlfcHJvY2Vzc19wbGFjZWxpc3Qoa21wX2FmZmluX21hc2tfdCAqKm91dF9tYXNrcywKKyAgdW5zaWduZWQgaW50ICpvdXRfbnVtTWFza3MsIGNvbnN0IGNoYXIgKnBsYWNlbGlzdCwKKyAga21wX2FmZmluX21hc2tfdCAqb3NJZDJNYXNrLCBpbnQgbWF4T3NJZCkKK3sKKyAgICBjb25zdCBjaGFyICpzY2FuID0gcGxhY2VsaXN0OworICAgIGNvbnN0IGNoYXIgKm5leHQgPSBwbGFjZWxpc3Q7CisKKyAgICBudW1OZXdNYXNrcyA9IDI7CisgICAgbmV3TWFza3MgPSAoa21wX2FmZmluX21hc2tfdCAqKUtNUF9JTlRFUk5BTF9NQUxMT0MobnVtTmV3TWFza3MKKyAgICAgICogX19rbXBfYWZmaW5fbWFza19zaXplKTsKKyAgICBuZXh0TmV3TWFzayA9IDA7CisKKyAgICBrbXBfYWZmaW5fbWFza190ICp0ZW1wTWFzayA9IChrbXBfYWZmaW5fbWFza190ICopX19rbXBfYWxsb2NhdGUoCisgICAgICBfX2ttcF9hZmZpbl9tYXNrX3NpemUpOworICAgIEtNUF9DUFVfWkVSTyh0ZW1wTWFzayk7CisgICAgaW50IHNldFNpemUgPSAwOworCisgICAgZm9yICg7OykgeworICAgICAgICBfX2ttcF9wcm9jZXNzX3BsYWNlKCZzY2FuLCBvc0lkMk1hc2ssIG1heE9zSWQsIHRlbXBNYXNrLCAmc2V0U2l6ZSk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gdmFsaWQgZm9sbG93IHNldHMgYXJlICcsJyAnOicgYW5kIEVPTAorICAgICAgICAvLworICAgICAgICBTS0lQX1dTKHNjYW4pOworICAgICAgICBpZiAoKnNjYW4gPT0gJ1wwJyB8fCAqc2NhbiA9PSAnLCcpIHsKKyAgICAgICAgICAgIGlmIChzZXRTaXplID4gMCkgeworICAgICAgICAgICAgICAgIEFERF9NQVNLKHRlbXBNYXNrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtNUF9DUFVfWkVSTyh0ZW1wTWFzayk7CisgICAgICAgICAgICBzZXRTaXplID0gMDsKKyAgICAgICAgICAgIGlmICgqc2NhbiA9PSAnXDAnKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzY2FuKys7ICAgICAvLyBza2lwICcsJworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBLTVBfQVNTRVJUMigqc2NhbiA9PSAnOicsICJiYWQgZXhwbGljaXQgcGxhY2VzIGxpc3QiKTsKKyAgICAgICAgc2NhbisrOyAgICAgICAgIC8vIHNraXAgJzonCisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gUmVhZCBjb3VudCBwYXJhbWV0ZXIKKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUyhzY2FuKTsKKyAgICAgICAgS01QX0FTU0VSVDIoKCpzY2FuID49ICcwJykgJiYgKCpzY2FuIDw9ICc5JyksCisgICAgICAgICAgImJhZCBleHBsaWNpdCBwbGFjZXMgbGlzdCIpOworICAgICAgICBuZXh0ID0gc2NhbjsKKyAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgIGludCBjb3VudCA9IF9fa21wX3N0cl90b19pbnQoc2NhbiwgKm5leHQpOworICAgICAgICBLTVBfQVNTRVJUKGNvdW50ID49IDApOworICAgICAgICBzY2FuID0gbmV4dDsKKworICAgICAgICAvLworICAgICAgICAvLyB2YWxpZCBmb2xsb3cgc2V0cyBhcmUgJywnICc6JyBhbmQgRU9MCisgICAgICAgIC8vCisgICAgICAgIFNLSVBfV1Moc2Nhbik7CisgICAgICAgIGlmICgqc2NhbiA9PSAnXDAnIHx8ICpzY2FuID09ICcsJykgeworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGludCBqOworICAgICAgICAgICAgICAgIGlmIChzZXRTaXplID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFERF9NQVNLKHRlbXBNYXNrKTsKKyAgICAgICAgICAgICAgICBzZXRTaXplID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSBfX2ttcF9hZmZpbl9tYXNrX3NpemUgKiBDSEFSX0JJVCAtIDE7IGogPiAwOyBqLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgLy8gVXNlIGEgdGVtcCB2YXIgaW4gY2FzZSBtYWNybyBpcyBjaGFuZ2VkIHRvIGV2YWx1YXRlCisgICAgICAgICAgICAgICAgICAgIC8vIGFyZ3MgbXVsdGlwbGUgdGltZXMuCisgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgIGlmIChLTVBfQ1BVX0lTU0VUKGogLSAxLCB0ZW1wTWFzaykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfU0VUKGosIHRlbXBNYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldFNpemUrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfQ0xSKGosIHRlbXBNYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKDsgaiA+PSAwOyBqLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0NQVV9DTFIoaiwgdGVtcE1hc2spOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtNUF9DUFVfWkVSTyh0ZW1wTWFzayk7CisgICAgICAgICAgICBzZXRTaXplID0gMDsKKworICAgICAgICAgICAgaWYgKCpzY2FuID09ICdcMCcpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNjYW4rKzsgICAgIC8vIHNraXAgJywnCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEtNUF9BU1NFUlQyKCpzY2FuID09ICc6JywgImJhZCBleHBsaWNpdCBwbGFjZXMgbGlzdCIpOworICAgICAgICBzY2FuKys7ICAgICAgICAgLy8gc2tpcCAnOicKKworICAgICAgICAvLworICAgICAgICAvLyBSZWFkIHN0cmlkZSBwYXJhbWV0ZXIKKyAgICAgICAgLy8KKyAgICAgICAgaW50IHNpZ24gPSArMTsKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgU0tJUF9XUyhzY2FuKTsKKyAgICAgICAgICAgIGlmICgqc2NhbiA9PSAnKycpIHsKKyAgICAgICAgICAgICAgICBzY2FuKys7IC8vIHNraXAgJysnCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKnNjYW4gPT0gJy0nKSB7CisgICAgICAgICAgICAgICAgc2lnbiAqPSAtMTsKKyAgICAgICAgICAgICAgICBzY2FuKys7IC8vIHNraXAgJy0nCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBTS0lQX1dTKHNjYW4pOworICAgICAgICBLTVBfQVNTRVJUMigoKnNjYW4gPj0gJzAnKSAmJiAoKnNjYW4gPD0gJzknKSwKKyAgICAgICAgICAiYmFkIGV4cGxpY2l0IHBsYWNlcyBsaXN0Iik7CisgICAgICAgIG5leHQgPSBzY2FuOworICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgaW50IHN0cmlkZSA9IF9fa21wX3N0cl90b19pbnQoc2NhbiwgKm5leHQpOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHN0cmlkZSA+PSAwKTsKKyAgICAgICAgc2NhbiA9IG5leHQ7CisgICAgICAgIHN0cmlkZSAqPSBzaWduOworCisgICAgICAgIGlmIChzdHJpZGUgPiAwKSB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IGo7CisgICAgICAgICAgICAgICAgaWYgKHNldFNpemUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUREX01BU0sodGVtcE1hc2spOworICAgICAgICAgICAgICAgIHNldFNpemUgPSAwOworICAgICAgICAgICAgICAgIGZvciAoaiA9IF9fa21wX2FmZmluX21hc2tfc2l6ZSAqIENIQVJfQklUIC0gMTsgaiA+PSBzdHJpZGU7IGotLSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoS01QX0NQVV9JU1NFVChqIC0gc3RyaWRlLCB0ZW1wTWFzaykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfU0VUKGosIHRlbXBNYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldFNpemUrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfQ0xSKGosIHRlbXBNYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKDsgaiA+PSAwOyBqLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0NQVV9DTFIoaiwgdGVtcE1hc2spOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBqOworICAgICAgICAgICAgICAgIGlmIChzZXRTaXplID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFERF9NQVNLKHRlbXBNYXNrKTsKKyAgICAgICAgICAgICAgICBzZXRTaXplID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgKF9fa21wX2FmZmluX21hc2tfc2l6ZSAqIENIQVJfQklUKSArIHN0cmlkZTsKKyAgICAgICAgICAgICAgICAgIGorKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoS01QX0NQVV9JU1NFVChqIC0gc3RyaWRlLCB0ZW1wTWFzaykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfU0VUKGosIHRlbXBNYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldFNpemUrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfQ0xSKGosIHRlbXBNYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKDsgaiA8IF9fa21wX2FmZmluX21hc2tfc2l6ZSAqIENIQVJfQklUOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0NQVV9DTFIoaiwgdGVtcE1hc2spOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBLTVBfQ1BVX1pFUk8odGVtcE1hc2spOworICAgICAgICBzZXRTaXplID0gMDsKKworICAgICAgICAvLworICAgICAgICAvLyB2YWxpZCBmb2xsb3cgc2V0cyBhcmUgJywnIGFuZCBFT0wKKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUyhzY2FuKTsKKyAgICAgICAgaWYgKCpzY2FuID09ICdcMCcpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICgqc2NhbiA9PSAnLCcpIHsKKyAgICAgICAgICAgIHNjYW4rKzsgICAgIC8vIHNraXAgJywnCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEtNUF9BU1NFUlQyKDAsICJiYWQgZXhwbGljaXQgcGxhY2VzIGxpc3QiKTsKKyAgICB9CisKKyAgICAqb3V0X251bU1hc2tzID0gbmV4dE5ld01hc2s7CisgICAgaWYgKG5leHROZXdNYXNrID09IDApIHsKKyAgICAgICAgKm91dF9tYXNrcyA9IE5VTEw7CisgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKG5ld01hc2tzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAqb3V0X21hc2tzCisgICAgICA9IChrbXBfYWZmaW5fbWFza190ICopX19rbXBfYWxsb2NhdGUobmV4dE5ld01hc2sgKiBfX2ttcF9hZmZpbl9tYXNrX3NpemUpOworICAgIG1lbWNweSgqb3V0X21hc2tzLCBuZXdNYXNrcywgbmV4dE5ld01hc2sgKiBfX2ttcF9hZmZpbl9tYXNrX3NpemUpOworICAgIF9fa21wX2ZyZWUodGVtcE1hc2spOworICAgIEtNUF9JTlRFUk5BTF9GUkVFKG5ld01hc2tzKTsKK30KKworIyBlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisjdW5kZWYgQUREX01BU0sKKyN1bmRlZiBBRERfTUFTS19PU0lECisKKworIyBpZiBLTVBfTUlDCisKK3N0YXRpYyB2b2lkCitfX2ttcF9hcHBseV90aHJlYWRfcGxhY2VzKEFkZHJVbnNQYWlyICoqcEFkZHIsIGludCBkZXB0aCkKK3sKKyAgICBpZiAoIF9fa21wX3BsYWNlX251bV9jb3JlcyA9PSAwICkgeworICAgICAgICBpZiAoIF9fa21wX3BsYWNlX251bV90aHJlYWRzX3Blcl9jb3JlID09IDAgKSB7CisgICAgICAgICAgICByZXR1cm47ICAgLy8gbm8gY29yZXMgbGltaXRpbmcgYWN0aW9ucyByZXF1ZXN0ZWQsIGV4aXQKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9wbGFjZV9udW1fY29yZXMgPSBuQ29yZXNQZXJQa2c7ICAgLy8gdXNlIGFsbCBhdmFpbGFibGUgY29yZXMKKyAgICB9CisgICAgaWYgKCAhX19rbXBfYWZmaW5pdHlfdW5pZm9ybV90b3BvbG9neSgpIHx8IGRlcHRoICE9IDMgKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZUaHJQbGFjZVVuc3VwcG9ydGVkICk7CisgICAgICAgIHJldHVybjsgLy8gZG9uJ3Qgc3VwcG9ydCBub24tdW5pZm9ybSB0b3BvbG9neSBvciBub3QtMy1sZXZlbCBhcmNoaXRlY3R1cmUKKyAgICB9CisgICAgaWYgKCBfX2ttcF9wbGFjZV9udW1fdGhyZWFkc19wZXJfY29yZSA9PSAwICkgeworICAgICAgICBfX2ttcF9wbGFjZV9udW1fdGhyZWFkc19wZXJfY29yZSA9IF9fa21wX25UaHJlYWRzUGVyQ29yZTsgIC8vIHVzZSBhbGwgSFcgY29udGV4dHMKKyAgICB9CisgICAgaWYgKCBfX2ttcF9wbGFjZV9jb3JlX29mZnNldCArIF9fa21wX3BsYWNlX251bV9jb3JlcyA+IG5Db3Jlc1BlclBrZyApIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIEFmZlRoclBsYWNlTWFueUNvcmVzICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBZGRyVW5zUGFpciAqbmV3QWRkciA9IChBZGRyVW5zUGFpciAqKV9fa21wX2FsbG9jYXRlKCBzaXplb2YoQWRkclVuc1BhaXIpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuUGFja2FnZXMgKiBfX2ttcF9wbGFjZV9udW1fY29yZXMgKiBfX2ttcF9wbGFjZV9udW1fdGhyZWFkc19wZXJfY29yZSk7CisgICAgaW50IGksIGosIGssIG5fb2xkID0gMCwgbl9uZXcgPSAwOworICAgIGZvciAoIGkgPSAwOyBpIDwgblBhY2thZ2VzOyArK2kgKSB7CisgICAgICAgIGZvciAoIGogPSAwOyBqIDwgbkNvcmVzUGVyUGtnOyArK2ogKSB7CisgICAgICAgICAgICBpZiAoIGogPCBfX2ttcF9wbGFjZV9jb3JlX29mZnNldCB8fCBqID49IF9fa21wX3BsYWNlX2NvcmVfb2Zmc2V0ICsgX19rbXBfcGxhY2VfbnVtX2NvcmVzICkgeworICAgICAgICAgICAgICAgIG5fb2xkICs9IF9fa21wX25UaHJlYWRzUGVyQ29yZTsgICAvLyBza2lwIG5vdC1yZXF1ZXN0ZWQgY29yZQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKCBrID0gMDsgayA8IF9fa21wX25UaHJlYWRzUGVyQ29yZTsgKytrICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIGsgPCBfX2ttcF9wbGFjZV9udW1fdGhyZWFkc19wZXJfY29yZSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0FkZHJbbl9uZXddID0gKCpwQWRkcilbbl9vbGRdOyAgIC8vIGNvcHkgcmVxdWVzdGVkIGNvcmUnIGRhdGEgdG8gbmV3IGxvY2F0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICBuX25ldysrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG5fb2xkKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG5Db3Jlc1BlclBrZyA9IF9fa21wX3BsYWNlX251bV9jb3JlczsgICAgICAgICAgICAgICAgICAgICAvLyBjb3JyZWN0IG5Db3Jlc1BlclBrZworICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IF9fa21wX3BsYWNlX251bV90aHJlYWRzX3Blcl9jb3JlOyAvLyBjb3JyZWN0IF9fa21wX25UaHJlYWRzUGVyQ29yZQorICAgIF9fa21wX2F2YWlsX3Byb2MgPSBuX25ldzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3JyZWN0IGF2YWlsX3Byb2MKKyAgICBfX2ttcF9uY29yZXMgPSBuUGFja2FnZXMgKiBfX2ttcF9wbGFjZV9udW1fY29yZXM7ICAgICAgICAgLy8gY29ycmVjdCBuY29yZXMKKworICAgIF9fa21wX2ZyZWUoICpwQWRkciApOworICAgICpwQWRkciA9IG5ld0FkZHI7ICAgICAgLy8gcmVwbGFjZSBvbGQgdG9wb2xvZ3kgd2l0aCBuZXcgb25lCit9CisKKyMgZW5kaWYgLyogS01QX01JQyAqLworCisKK3N0YXRpYyBBZGRyVW5zUGFpciAqYWRkcmVzczJvcyA9IE5VTEw7CitzdGF0aWMgaW50ICAgICAgICAgICAqIHByb2NhcnIgPSBOVUxMOworc3RhdGljIGludCAgICAgX19rbXBfYWZmX2RlcHRoID0gMDsKKworc3RhdGljIHZvaWQKK19fa21wX2F1eF9hZmZpbml0eV9pbml0aWFsaXplKHZvaWQpCit7CisgICAgaWYgKF9fa21wX2FmZmluaXR5X21hc2tzICE9IE5VTEwpIHsKKyAgICAgICAgS01QX0FTU0VSVChmdWxsTWFzayAhPSBOVUxMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vCisgICAgLy8gQ3JlYXRlIHRoZSAiZnVsbCIgbWFzayAtIHRoaXMgZGVmaW5lcyBhbGwgb2YgdGhlIHByb2Nlc3NvcnMgdGhhdCB3ZQorICAgIC8vIGNvbnNpZGVyIHRvIGJlIGluIHRoZSBtYWNoaW5lIG1vZGVsLiAgSWYgcmVzcGVjdCBpcyBzZXQsIHRoZW4gaXQgaXMKKyAgICAvLyB0aGUgaW5pdGlhbGl6YXRpb24gdGhyZWFkJ3MgYWZmaW5pdHkgbWFzay4gIE90aGVyd2lzZSwgaXQgaXMgYWxsCisgICAgLy8gcHJvY2Vzc29ycyB0aGF0IHdlIGtub3cgYWJvdXQgb24gdGhlIG1hY2hpbmUuCisgICAgLy8KKyAgICBpZiAoZnVsbE1hc2sgPT0gTlVMTCkgeworICAgICAgICBmdWxsTWFzayA9IChrbXBfYWZmaW5fbWFza190ICopX19rbXBfYWxsb2NhdGUoX19rbXBfYWZmaW5fbWFza19zaXplKTsKKyAgICB9CisgICAgaWYgKEtNUF9BRkZJTklUWV9DQVBBQkxFKCkpIHsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzaykgeworICAgICAgICAgICAgX19rbXBfZ2V0X3N5c3RlbV9hZmZpbml0eShmdWxsTWFzaywgVFJVRSk7CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBwcm9jZXNzb3JzLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIHVuc2lnbmVkIGk7CisgICAgICAgICAgICBfX2ttcF9hdmFpbF9wcm9jID0gMDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBLTVBfQ1BVX1NFVFNJWkU7ICsraSkgeworICAgICAgICAgICAgICAgIGlmICghIEtNUF9DUFVfSVNTRVQoaSwgZnVsbE1hc2spKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfX2ttcF9hdmFpbF9wcm9jKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoX19rbXBfYXZhaWxfcHJvYyA+IF9fa21wX3hwcm9jKSB7CisgICAgICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgKF9fa21wX2FmZmluaXR5X3dhcm5pbmdzCisgICAgICAgICAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9ub25lKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoRXJyb3JJbml0aWFsaXplQWZmaW5pdHkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfbm9uZTsKKyAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbl9tYXNrX3NpemUgPSAwOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2VudGlyZV9tYWNoaW5lX21hc2soZnVsbE1hc2spOworICAgICAgICAgICAgX19rbXBfYXZhaWxfcHJvYyA9IF9fa21wX3hwcm9jOworICAgICAgICB9CisgICAgfQorCisgICAgaW50IGRlcHRoID0gLTE7CisgICAga21wX2kxOG5faWRfdCBtc2dfaWQgPSBrbXBfaTE4bl9udWxsOworCisgICAgLy8KKyAgICAvLyBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgc2V0dGluZyBLTVBfQ1BVSU5GT19GSUxFID0+CisgICAgLy8gS01QX1RPUE9MT0dZX01FVEhPRD1jcHVpbmZvCisgICAgLy8KKyAgICBpZiAoKF9fa21wX2NwdWluZm9fZmlsZSAhPSBOVUxMKSAmJgorICAgICAgKF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPT0gYWZmaW5pdHlfdG9wX21ldGhvZF9hbGwpKSB7CisgICAgICAgIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPSBhZmZpbml0eV90b3BfbWV0aG9kX2NwdWluZm87CisgICAgfQorCisgICAgaWYgKF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPT0gYWZmaW5pdHlfdG9wX21ldGhvZF9hbGwpIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gSW4gdGhlIGRlZmF1bHQgY29kZSBwYXRoLCBlcnJvcnMgYXJlIG5vdCBmYXRhbCAtIHdlIGp1c3QgdHJ5IHVzaW5nCisgICAgICAgIC8vIGFub3RoZXIgbWV0aG9kLiAgV2Ugb25seSBlbWl0IGEgd2FybmluZyBtZXNzYWdlIGlmIGFmZmluaXR5IGlzIG9uLAorICAgICAgICAvLyBvciB0aGUgdmVyYm9zZSBmbGFnIGlzIHNldCwgYW4gdGhlIG5vd2FybmluZ3MgZmxhZyB3YXMgbm90IHNldC4KKyAgICAgICAgLy8KKyAgICAgICAgY29uc3QgY2hhciAqZmlsZV9uYW1lID0gTlVMTDsKKyAgICAgICAgaW50IGxpbmUgPSAwOworCisjIGlmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgS01QX0lORk9STShBZmZJbmZvU3RyLCAiS01QX0FGRklOSVRZIiwgS01QX0kxOE5fU1RSKERlY29kaW5neDJBUElDKSk7CisgICAgICAgIH0KKworICAgICAgICBmaWxlX25hbWUgPSBOVUxMOworICAgICAgICBkZXB0aCA9IF9fa21wX2FmZmluaXR5X2NyZWF0ZV94MmFwaWNpZF9tYXAoJmFkZHJlc3Myb3MsICZtc2dfaWQpOworICAgICAgICBpZiAoZGVwdGggPT0gMCkgeworICAgICAgICAgICAgS01QX0FTU0VSVChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpOworICAgICAgICAgICAgS01QX0FTU0VSVChhZGRyZXNzMm9zID09IE5VTEwpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRlcHRoIDwgMCkgeworICAgICAgICAgICAgaWYgKChtc2dfaWQgIT0ga21wX2kxOG5fbnVsbCkKKyAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgKF9fa21wX2FmZmluaXR5X3dhcm5pbmdzCisgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpKSkpIHsKKyMgIGlmIEtNUF9NSUMKKyAgICAgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZkluZm9TdHJTdHIsICJLTVBfQUZGSU5JVFkiLCBfX2ttcF9pMThuX2NhdGdldHMobXNnX2lkKSwKKyAgICAgICAgICAgICAgICAgICAgICBLTVBfSTE4Tl9TVFIoRGVjb2RpbmdMZWdhY3lBUElDKSk7CisgICAgICAgICAgICAgICAgfQorIyAgZWxzZQorICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZkluZm9TdHJTdHIsICJLTVBfQUZGSU5JVFkiLCBfX2ttcF9pMThuX2NhdGdldHMobXNnX2lkKSwKKyAgICAgICAgICAgICAgICAgIEtNUF9JMThOX1NUUihEZWNvZGluZ0xlZ2FjeUFQSUMpKTsKKyMgIGVuZGlmCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbGVfbmFtZSA9IE5VTEw7CisgICAgICAgICAgICBkZXB0aCA9IF9fa21wX2FmZmluaXR5X2NyZWF0ZV9hcGljaWRfbWFwKCZhZGRyZXNzMm9zLCAmbXNnX2lkKTsKKyAgICAgICAgICAgIGlmIChkZXB0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpOworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoYWRkcmVzczJvcyA9PSBOVUxMKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworIyBlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKyMgaWYgS01QX09TX0xJTlVYCisKKyAgICAgICAgaWYgKGRlcHRoIDwgMCkgeworICAgICAgICAgICAgaWYgKChtc2dfaWQgIT0ga21wX2kxOG5fbnVsbCkKKyAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgKF9fa21wX2FmZmluaXR5X3dhcm5pbmdzCisgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpKSkpIHsKKyMgIGlmIEtNUF9NSUMKKyAgICAgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZlN0clBhcnNlRmlsZW5hbWUsICJLTVBfQUZGSU5JVFkiLCBfX2ttcF9pMThuX2NhdGdldHMobXNnX2lkKSwgIi9wcm9jL2NwdWluZm8iKTsKKyAgICAgICAgICAgICAgICB9CisjICBlbHNlCisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmU3RyUGFyc2VGaWxlbmFtZSwgIktNUF9BRkZJTklUWSIsIF9fa21wX2kxOG5fY2F0Z2V0cyhtc2dfaWQpLCAiL3Byb2MvY3B1aW5mbyIpOworIyAgZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZlBhcnNlRmlsZW5hbWUsICJLTVBfQUZGSU5JVFkiLCAiL3Byb2MvY3B1aW5mbyIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBGSUxFICpmID0gZm9wZW4oIi9wcm9jL2NwdWluZm8iLCAiciIpOworICAgICAgICAgICAgaWYgKGYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1zZ19pZCA9IGttcF9pMThuX3N0cl9DYW50T3BlbkNwdWluZm87CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBmaWxlX25hbWUgPSAiL3Byb2MvY3B1aW5mbyI7CisgICAgICAgICAgICAgICAgZGVwdGggPSBfX2ttcF9hZmZpbml0eV9jcmVhdGVfY3B1aW5mb19tYXAoJmFkZHJlc3Myb3MsICZsaW5lLCAmbXNnX2lkLCBmKTsKKyAgICAgICAgICAgICAgICBmY2xvc2UoZik7CisgICAgICAgICAgICAgICAgaWYgKGRlcHRoID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0FTU0VSVChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpOworICAgICAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKGFkZHJlc3Myb3MgPT0gTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworIyBlbmRpZiAvKiBLTVBfT1NfTElOVVggKi8KKworICAgICAgICBpZiAoZGVwdGggPCAwKSB7CisgICAgICAgICAgICBpZiAobXNnX2lkICE9IGttcF9pMThuX251bGwKKyAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgKF9fa21wX2FmZmluaXR5X3dhcm5pbmdzCisgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlsZV9uYW1lID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoVXNpbmdGbGF0T1MsIF9fa21wX2kxOG5fY2F0Z2V0cyhtc2dfaWQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobGluZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKFVzaW5nRmxhdE9TRmlsZSwgZmlsZV9uYW1lLCBfX2ttcF9pMThuX2NhdGdldHMobXNnX2lkKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBLTVBfV0FSTklORyhVc2luZ0ZsYXRPU0ZpbGVMaW5lLCBmaWxlX25hbWUsIGxpbmUsIF9fa21wX2kxOG5fY2F0Z2V0cyhtc2dfaWQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbGVfbmFtZSA9ICIiOworICAgICAgICAgICAgZGVwdGggPSBfX2ttcF9hZmZpbml0eV9jcmVhdGVfZmxhdF9tYXAoJmFkZHJlc3Myb3MsICZtc2dfaWQpOworICAgICAgICAgICAgaWYgKGRlcHRoID09IDApIHsKKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSk7CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVChhZGRyZXNzMm9zID09IE5VTEwpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtNUF9BU1NFUlQoZGVwdGggPiAwKTsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoYWRkcmVzczJvcyAhPSBOVUxMKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vCisgICAgLy8gSWYgdGhlIHVzZXIgaGFzIHNwZWNpZmllZCB0aGF0IGEgcGFyaWN1bGFyIHRvcG9sb2d5IGRpc2NvdmVyeSBtZXRob2QKKyAgICAvLyBpcyB0byBiZSB1c2VkLCB0aGVuIHdlIGFib3J0IGlmIHRoYXQgbWV0aG9kIGZhaWxzLiAgVGhlIGV4Y2VwdGlvbiBpcworICAgIC8vIGdyb3VwIGFmZmluaXR5LCB3aGljaCBtaWdodCBoYXZlIGJlZW4gaW1wbGljaXRseSBzZXQuCisgICAgLy8KKworIyBpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisKKyAgICBlbHNlIGlmIChfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID09IGFmZmluaXR5X3RvcF9tZXRob2RfeDJhcGljaWQpIHsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmSW5mb1N0ciwgIktNUF9BRkZJTklUWSIsCisgICAgICAgICAgICAgIEtNUF9JMThOX1NUUihEZWNvZGluZ3gyQVBJQykpOworICAgICAgICB9CisKKyAgICAgICAgZGVwdGggPSBfX2ttcF9hZmZpbml0eV9jcmVhdGVfeDJhcGljaWRfbWFwKCZhZGRyZXNzMm9zLCAmbXNnX2lkKTsKKyAgICAgICAgaWYgKGRlcHRoID09IDApIHsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKTsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoYWRkcmVzczJvcyA9PSBOVUxMKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZXB0aCA8IDApIHsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQobXNnX2lkICE9IGttcF9pMThuX251bGwpOworICAgICAgICAgICAgS01QX0ZBVEFMKE1zZ0V4aXRpbmcsIF9fa21wX2kxOG5fY2F0Z2V0cyhtc2dfaWQpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID09IGFmZmluaXR5X3RvcF9tZXRob2RfYXBpY2lkKSB7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZkluZm9TdHIsICJLTVBfQUZGSU5JVFkiLAorICAgICAgICAgICAgICBLTVBfSTE4Tl9TVFIoRGVjb2RpbmdMZWdhY3lBUElDKSk7CisgICAgICAgIH0KKworICAgICAgICBkZXB0aCA9IF9fa21wX2FmZmluaXR5X2NyZWF0ZV9hcGljaWRfbWFwKCZhZGRyZXNzMm9zLCAmbXNnX2lkKTsKKyAgICAgICAgaWYgKGRlcHRoID09IDApIHsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKTsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoYWRkcmVzczJvcyA9PSBOVUxMKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZXB0aCA8IDApIHsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQobXNnX2lkICE9IGttcF9pMThuX251bGwpOworICAgICAgICAgICAgS01QX0ZBVEFMKE1zZ0V4aXRpbmcsIF9fa21wX2kxOG5fY2F0Z2V0cyhtc2dfaWQpKTsKKyAgICAgICAgfQorICAgIH0KKworIyBlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKyAgICBlbHNlIGlmIChfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID09IGFmZmluaXR5X3RvcF9tZXRob2RfY3B1aW5mbykgeworICAgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKKyAgICAgICAgaWYgKF9fa21wX2NwdWluZm9fZmlsZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBmaWxlbmFtZSA9IF9fa21wX2NwdWluZm9fZmlsZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGZpbGVuYW1lID0gIi9wcm9jL2NwdWluZm8iOworICAgICAgICB9CisKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmUGFyc2VGaWxlbmFtZSwgIktNUF9BRkZJTklUWSIsIGZpbGVuYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIEZJTEUgKmYgPSBmb3BlbihmaWxlbmFtZSwgInIiKTsKKyAgICAgICAgaWYgKGYgPT0gTlVMTCkgeworICAgICAgICAgICAgaW50IGNvZGUgPSBlcnJubzsKKyAgICAgICAgICAgIGlmIChfX2ttcF9jcHVpbmZvX2ZpbGUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKENhbnRPcGVuRmlsZUZvclJlYWRpbmcsIGZpbGVuYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0VSUihjb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0hOVChOYW1lQ29tZXNGcm9tX0NQVUlORk9fRklMRSksCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKENhbnRPcGVuRmlsZUZvclJlYWRpbmcsIGZpbGVuYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0VSUihjb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGludCBsaW5lID0gMDsKKyAgICAgICAgZGVwdGggPSBfX2ttcF9hZmZpbml0eV9jcmVhdGVfY3B1aW5mb19tYXAoJmFkZHJlc3Myb3MsICZsaW5lLCAmbXNnX2lkLCBmKTsKKyAgICAgICAgZmNsb3NlKGYpOworICAgICAgICBpZiAoZGVwdGggPCAwKSB7CisgICAgICAgICAgICBLTVBfQVNTRVJUKG1zZ19pZCAhPSBrbXBfaTE4bl9udWxsKTsKKyAgICAgICAgICAgIGlmIChsaW5lID4gMCkgeworICAgICAgICAgICAgICAgIEtNUF9GQVRBTChGaWxlTGluZU1zZ0V4aXRpbmcsIGZpbGVuYW1lLCBsaW5lLCBfX2ttcF9pMThuX2NhdGdldHMobXNnX2lkKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBLTVBfRkFUQUwoRmlsZU1zZ0V4aXRpbmcsIGZpbGVuYW1lLCBfX2ttcF9pMThuX2NhdGdldHMobXNnX2lkKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSkgeworICAgICAgICAgICAgS01QX0FTU0VSVChkZXB0aCA9PSAwKTsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoYWRkcmVzczJvcyA9PSBOVUxMKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworIyBpZiBLTVBfT1NfV0lORE9XUyAmJiBLTVBfQVJDSF9YODZfNjQKKworICAgIGVsc2UgaWYgKF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPT0gYWZmaW5pdHlfdG9wX21ldGhvZF9ncm91cCkgeworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgS01QX0lORk9STShBZmZXaW5kb3dzUHJvY0dyb3VwTWFwLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgIH0KKworICAgICAgICBkZXB0aCA9IF9fa21wX2FmZmluaXR5X2NyZWF0ZV9wcm9jX2dyb3VwX21hcCgmYWRkcmVzczJvcywgJm1zZ19pZCk7CisgICAgICAgIEtNUF9BU1NFUlQoZGVwdGggIT0gMCk7CisKKyAgICAgICAgaWYgKGRlcHRoIDwgMCkgeworICAgICAgICAgICAgaWYgKChtc2dfaWQgIT0ga21wX2kxOG5fbnVsbCkKKyAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgKF9fa21wX2FmZmluaXR5X3dhcm5pbmdzCisgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpKSkpIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyhVc2luZ0ZsYXRPUywgX19rbXBfaTE4bl9jYXRnZXRzKG1zZ19pZCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZXB0aCA9IF9fa21wX2FmZmluaXR5X2NyZWF0ZV9mbGF0X21hcCgmYWRkcmVzczJvcywgJm1zZ19pZCk7CisgICAgICAgICAgICBpZiAoZGVwdGggPT0gMCkgeworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKTsKKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKGFkZHJlc3Myb3MgPT0gTlVMTCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBmYWlsCisgICAgICAgICAgICBLTVBfQVNTRVJUKGRlcHRoID4gMCk7CisgICAgICAgICAgICBLTVBfQVNTRVJUKGFkZHJlc3Myb3MgIT0gTlVMTCk7CisgICAgICAgIH0KKyAgICB9CisKKyMgZW5kaWYgLyogS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2XzY0ICovCisKKyAgICBlbHNlIGlmIChfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID09IGFmZmluaXR5X3RvcF9tZXRob2RfZmxhdCkgeworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgS01QX0lORk9STShBZmZVc2luZ0ZsYXRPUywgIktNUF9BRkZJTklUWSIpOworICAgICAgICB9CisKKyAgICAgICAgZGVwdGggPSBfX2ttcF9hZmZpbml0eV9jcmVhdGVfZmxhdF9tYXAoJmFkZHJlc3Myb3MsICZtc2dfaWQpOworICAgICAgICBpZiAoZGVwdGggPT0gMCkgeworICAgICAgICAgICAgS01QX0FTU0VSVChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpOworICAgICAgICAgICAgS01QX0FTU0VSVChhZGRyZXNzMm9zID09IE5VTEwpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIHNob3VsZCBub3QgZmFpbAorICAgICAgICBLTVBfQVNTRVJUKGRlcHRoID4gMCk7CisgICAgICAgIEtNUF9BU1NFUlQoYWRkcmVzczJvcyAhPSBOVUxMKTsKKyAgICB9CisKKyAgICBpZiAoYWRkcmVzczJvcyA9PSBOVUxMKSB7CisgICAgICAgIGlmIChLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpCisgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgKF9fa21wX2FmZmluaXR5X3dhcm5pbmdzCisgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkpKSkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoRXJyb3JJbml0aWFsaXplQWZmaW5pdHkpOworICAgICAgICB9CisgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9ub25lOworICAgICAgICBfX2ttcF9hZmZpbl9tYXNrX3NpemUgPSAwOworICAgICAgICByZXR1cm47CisgICAgfQorCisjIGlmIEtNUF9NSUMKKyAgICBfX2ttcF9hcHBseV90aHJlYWRfcGxhY2VzKCZhZGRyZXNzMm9zLCBkZXB0aCk7CisjIGVuZGlmCisKKyAgICAvLworICAgIC8vIENyZWF0ZSB0aGUgdGFibGUgb2YgbWFza3MsIGluZGV4ZWQgYnkgdGhyZWFkIElkLgorICAgIC8vCisgICAgdW5zaWduZWQgbWF4SW5kZXg7CisgICAgdW5zaWduZWQgbnVtVW5pcXVlOworICAgIGttcF9hZmZpbl9tYXNrX3QgKm9zSWQyTWFzayA9IF9fa21wX2NyZWF0ZV9tYXNrcygmbWF4SW5kZXgsICZudW1VbmlxdWUsCisgICAgICBhZGRyZXNzMm9zLCBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPT0gMCkgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKG51bVVuaXF1ZSA9PSBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFNldCB0aGUgY2hpbGROdW1zIHZlY3RvciBpbiBhbGwgQWRkcmVzcyBvYmplY3RzLiAgVGhpcyBtdXN0IGJlIGRvbmUKKyAgICAvLyBiZWZvcmUgd2UgY2FuIHNvcnQgdXNpbmcgX19rbXBfYWZmaW5pdHlfY21wX0FkZHJlc3NfY2hpbGRfbnVtKCksCisgICAgLy8gd2hpY2ggdGFrZXMgaW50byBhY2NvdW50IHRoZSBzZXR0aW5nIG9mIF9fa21wX2FmZmluaXR5X2NvbXBhY3QuCisgICAgLy8KKyAgICBfX2ttcF9hZmZpbml0eV9hc3NpZ25fY2hpbGRfbnVtcyhhZGRyZXNzMm9zLCBfX2ttcF9hdmFpbF9wcm9jKTsKKworICAgIHN3aXRjaCAoX19rbXBfYWZmaW5pdHlfdHlwZSkgeworCisgICAgICAgIGNhc2UgYWZmaW5pdHlfZXhwbGljaXQ6CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfYWZmaW5pdHlfcHJvY2xpc3QgIT0gTlVMTCk7CisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgIGlmIChfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPT0gcHJvY19iaW5kX2ludGVsKQorIyBlbmRpZgorICAgICAgICB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9wcm9jZXNzX3Byb2NsaXN0KCZfX2ttcF9hZmZpbml0eV9tYXNrcywKKyAgICAgICAgICAgICAgJl9fa21wX2FmZmluaXR5X251bV9tYXNrcywgX19rbXBfYWZmaW5pdHlfcHJvY2xpc3QsIG9zSWQyTWFzaywKKyAgICAgICAgICAgICAgbWF4SW5kZXgpOworICAgICAgICB9CisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJvY2Vzc19wbGFjZWxpc3QoJl9fa21wX2FmZmluaXR5X21hc2tzLAorICAgICAgICAgICAgICAmX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzLCBfX2ttcF9hZmZpbml0eV9wcm9jbGlzdCwgb3NJZDJNYXNrLAorICAgICAgICAgICAgICBtYXhJbmRleCk7CisgICAgICAgIH0KKyMgZW5kaWYKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X251bV9tYXNrcyA9PSAwKSB7CisgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCAoX19rbXBfYWZmaW5pdHlfd2FybmluZ3MKKyAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkpKSB7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmTm9WYWxpZFByb2NJRCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfbm9uZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgICAvLworICAgICAgICAvLyBUaGUgb3RoZXIgYWZmaW5pdHkgdHlwZXMgcmVseSBvbiBzb3J0aW5nIHRoZSBBZGRyZXNzZXMgYWNjb3JkaW5nCisgICAgICAgIC8vIHRvIHNvbWUgcGVybXV0YXRpb24gb2YgdGhlIG1hY2hpbmUgdG9wb2xvZ3kgdHJlZS4gIFNldAorICAgICAgICAvLyBfX2ttcF9hZmZpbml0eV9jb21wYWN0IGFuZCBfX2ttcF9hZmZpbml0eV9vZmZzZXQgYXBwcm9wcmlhdGVseSwKKyAgICAgICAgLy8gdGhlbiBqdW1wIHRvIGEgY29tbW9uIGNvZGUgZnJhZ21lbnQgdG8gZG8gdGhlIHNvcnQgYW5kIGNyZWF0ZQorICAgICAgICAvLyB0aGUgYXJyYXkgb2YgYWZmaW5pdHkgbWFza3MuCisgICAgICAgIC8vCisKKyAgICAgICAgY2FzZSBhZmZpbml0eV9sb2dpY2FsOgorICAgICAgICBfX2ttcF9hZmZpbml0eV9jb21wYWN0ID0gMDsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X29mZnNldCkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfb2Zmc2V0ID0gX19rbXBfblRocmVhZHNQZXJDb3JlICogX19rbXBfYWZmaW5pdHlfb2Zmc2V0CisgICAgICAgICAgICAgICUgX19rbXBfYXZhaWxfcHJvYzsKKyAgICAgICAgfQorICAgICAgICBnb3RvIHNvcnRBZGRyZXNzZXM7CisKKyAgICAgICAgY2FzZSBhZmZpbml0eV9waHlzaWNhbDoKKyAgICAgICAgaWYgKF9fa21wX25UaHJlYWRzUGVyQ29yZSA+IDEpIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2NvbXBhY3QgPSAxOworICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X2NvbXBhY3QgPj0gZGVwdGgpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9jb21wYWN0ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2NvbXBhY3QgPSAwOworICAgICAgICB9CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9vZmZzZXQpIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X29mZnNldCA9IF9fa21wX25UaHJlYWRzUGVyQ29yZSAqIF9fa21wX2FmZmluaXR5X29mZnNldAorICAgICAgICAgICAgICAlIF9fa21wX2F2YWlsX3Byb2M7CisgICAgICAgIH0KKyAgICAgICAgZ290byBzb3J0QWRkcmVzc2VzOworCisgICAgICAgIGNhc2UgYWZmaW5pdHlfc2NhdHRlcjoKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X2NvbXBhY3QgPj0gZGVwdGgpIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2NvbXBhY3QgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfY29tcGFjdCA9IGRlcHRoIC0gMSAtIF9fa21wX2FmZmluaXR5X2NvbXBhY3Q7CisgICAgICAgIH0KKyAgICAgICAgZ290byBzb3J0QWRkcmVzc2VzOworCisgICAgICAgIGNhc2UgYWZmaW5pdHlfY29tcGFjdDoKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X2NvbXBhY3QgPj0gZGVwdGgpIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2NvbXBhY3QgPSBkZXB0aCAtIDE7CisgICAgICAgIH0KKyAgICAgICAgZ290byBzb3J0QWRkcmVzc2VzOworCisjIGlmIEtNUF9NSUMKKyAgICAgICAgY2FzZSBhZmZpbml0eV9iYWxhbmNlZDoKKyAgICAgICAgLy8gQmFsYW5jZWQgd29ya3Mgb25seSBmb3IgdGhlIGNhc2Ugb2YgYSBzaW5nbGUgcGFja2FnZSBhbmQgdW5pZm9ybSB0b3BvbG9neQorICAgICAgICBpZiggblBhY2thZ2VzID4gMSApIHsKKyAgICAgICAgICAgIGlmKCBfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IF9fa21wX2FmZmluaXR5X3dhcm5pbmdzICkgeworICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZCYWxhbmNlZE5vdEF2YWlsLCAiS01QX0FGRklOSVRZIiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X25vbmU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiggX19rbXBfYWZmaW5pdHlfdW5pZm9ybV90b3BvbG9neSgpICkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSB7IC8vIE5vbi11bmlmb3JtIHRvcG9sb2d5CisKKyAgICAgICAgICAgIC8vIFNhdmUgdGhlIGRlcHRoIGZvciBmdXJ0aGVyIHVzYWdlCisgICAgICAgICAgICBfX2ttcF9hZmZfZGVwdGggPSBkZXB0aDsKKworICAgICAgICAgICAgLy8gTnVtYmVyIG9mIGh5cGVyIHRocmVhZHMgcGVyIGNvcmUgaW4gSFQgbWFjaGluZQorICAgICAgICAgICAgaW50IG50aF9wZXJfY29yZSA9IF9fa21wX25UaHJlYWRzUGVyQ29yZTsKKworICAgICAgICAgICAgaW50IGNvcmVfbGV2ZWw7CisgICAgICAgICAgICBpZiggbnRoX3Blcl9jb3JlID4gMSApIHsKKyAgICAgICAgICAgICAgICBjb3JlX2xldmVsID0gZGVwdGggLSAyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb3JlX2xldmVsID0gZGVwdGggLSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IG5jb3JlcyA9IGFkZHJlc3Myb3NbIF9fa21wX2F2YWlsX3Byb2MgLSAxIF0uZmlyc3QubGFiZWxzWyBjb3JlX2xldmVsIF0gKyAxOworICAgICAgICAgICAgaW50IG5wcm9jID0gbnRoX3Blcl9jb3JlICogbmNvcmVzOworCisgICAgICAgICAgICBwcm9jYXJyID0gKCBpbnQgKiApX19rbXBfYWxsb2NhdGUoIHNpemVvZiggaW50ICkgKiBucHJvYyApOworICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBucHJvYzsgaSsrICkgeworICAgICAgICAgICAgICAgIHByb2NhcnJbIGkgXSA9IC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IF9fa21wX2F2YWlsX3Byb2M7IGkrKyApIHsKKyAgICAgICAgICAgICAgICBpbnQgcHJvYyA9IGFkZHJlc3Myb3NbIGkgXS5zZWNvbmQ7CisgICAgICAgICAgICAgICAgLy8gSWYgZGVwdGggPT0gMyB0aGVuIGxldmVsPTAgLSBwYWNrYWdlLCBsZXZlbD0xIC0gY29yZSwgbGV2ZWw9MiAtIHRocmVhZC4KKyAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBvbmx5IG9uZSB0aHJlYWQgcGVyIGNvcmUgdGhlbiBkZXB0aCA9PSAyOiBsZXZlbCAwIC0gcGFja2FnZSwKKyAgICAgICAgICAgICAgICAvLyBsZXZlbCAxIC0gY29yZS4KKyAgICAgICAgICAgICAgICBpbnQgbGV2ZWwgPSBkZXB0aCAtIDE7CisKKyAgICAgICAgICAgICAgICAvLyBfX2ttcF9udGhfcGVyX2NvcmUgPT0gMQorICAgICAgICAgICAgICAgIGludCB0aHJlYWQgPSAwOworICAgICAgICAgICAgICAgIGludCBjb3JlID0gYWRkcmVzczJvc1sgaSBdLmZpcnN0LmxhYmVsc1sgbGV2ZWwgXTsKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdGhyZWFkIGxldmVsIGV4aXN0cywgdGhhdCBpcyB3ZSBoYXZlIG1vcmUgdGhhbiBvbmUgdGhyZWFkIGNvbnRleHQgcGVyIGNvcmUKKyAgICAgICAgICAgICAgICBpZiggbnRoX3Blcl9jb3JlID4gMSApIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkID0gYWRkcmVzczJvc1sgaSBdLmZpcnN0LmxhYmVsc1sgbGV2ZWwgXSAlIG50aF9wZXJfY29yZTsKKyAgICAgICAgICAgICAgICAgICAgY29yZSA9IGFkZHJlc3Myb3NbIGkgXS5maXJzdC5sYWJlbHNbIGxldmVsIC0gMSBdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcm9jYXJyWyBjb3JlICogbnRoX3Blcl9jb3JlICsgdGhyZWFkIF0gPSBwcm9jOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorIyBlbmRpZgorCisgICAgICAgIHNvcnRBZGRyZXNzZXM6CisgICAgICAgIC8vCisgICAgICAgIC8vIEFsbG9jYXRlIHRoZSBndGlkLT5hZmZpbml0eSBtYXNrIHRhYmxlLgorICAgICAgICAvLworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfZHVwcykgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzID0gX19rbXBfYXZhaWxfcHJvYzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X251bV9tYXNrcyA9IG51bVVuaXF1ZTsKKyAgICAgICAgfQorCisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgIGlmICggKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gIT0gcHJvY19iaW5kX2ludGVsICkKKyAgICAgICAgICAmJiAoIF9fa21wX2FmZmluaXR5X251bV9wbGFjZXMgPiAwICkKKyAgICAgICAgICAmJiAoICh1bnNpZ25lZClfX2ttcF9hZmZpbml0eV9udW1fcGxhY2VzIDwgX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzICkgKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgPSBfX2ttcF9hZmZpbml0eV9udW1fcGxhY2VzOworICAgICAgICB9CisjIGVuZGlmCisKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfbWFza3MgPSAoa21wX2FmZmluX21hc2tfdCopX19rbXBfYWxsb2NhdGUoCisgICAgICAgICAgX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzICogX19rbXBfYWZmaW5fbWFza19zaXplKTsKKworICAgICAgICAvLworICAgICAgICAvLyBTb3J0IHRoZSBhZGRyZXNzMm9zIHRhYmxlIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBzZXR0aW5nIG9mCisgICAgICAgIC8vIF9fa21wX2FmZmluaXR5X2NvbXBhY3QsIHRoZW4gZmlsbCBvdXQgX19rbXBfYWZmaW5pdHlfbWFza3MuCisgICAgICAgIC8vCisgICAgICAgIHFzb3J0KGFkZHJlc3Myb3MsIF9fa21wX2F2YWlsX3Byb2MsIHNpemVvZigqYWRkcmVzczJvcyksCisgICAgICAgICAgX19rbXBfYWZmaW5pdHlfY21wX0FkZHJlc3NfY2hpbGRfbnVtKTsKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICB1bnNpZ25lZCBqOworICAgICAgICAgICAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBfX2ttcF9hdmFpbF9wcm9jOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoKCEgX19rbXBfYWZmaW5pdHlfZHVwcykgJiYgKCEgYWRkcmVzczJvc1tpXS5maXJzdC5sZWFkZXIpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBvc0lkID0gYWRkcmVzczJvc1tpXS5zZWNvbmQ7CisgICAgICAgICAgICAgICAga21wX2FmZmluX21hc2tfdCAqc3JjID0gS01QX0NQVV9JTkRFWChvc0lkMk1hc2ssIG9zSWQpOworICAgICAgICAgICAgICAgIGttcF9hZmZpbl9tYXNrX3QgKmRlc3QKKyAgICAgICAgICAgICAgICAgID0gS01QX0NQVV9JTkRFWChfX2ttcF9hZmZpbml0eV9tYXNrcywgaik7CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVChLTVBfQ1BVX0lTU0VUKG9zSWQsIHNyYykpOworICAgICAgICAgICAgICAgIEtNUF9DUFVfQ09QWShkZXN0LCBzcmMpOworICAgICAgICAgICAgICAgIGlmICgrK2ogPj0gX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoaiA9PSBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIEtNUF9BU1NFUlQyKDAsICJVbmV4cGVjdGVkIGFmZmluaXR5IHNldHRpbmciKTsKKyAgICB9CisKKyAgICBfX2ttcF9mcmVlKG9zSWQyTWFzayk7Cit9CisKKwordm9pZAorX19rbXBfYWZmaW5pdHlfaW5pdGlhbGl6ZSh2b2lkKQoreworICAgIC8vCisgICAgLy8gTXVjaCBvZiB0aGUgY29kZSBhYm92ZSB3YXMgd3JpdHRlbiBhc3N1bW1pbmcgdGhhdCBpZiBhIG1hY2hpbmUgd2FzIG5vdAorICAgIC8vIGFmZmluaXR5IGNhcGFibGUsIHRoZW4gX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lLiAgV2Ugbm93CisgICAgLy8gZXhwbGljaXRseSByZXByZXNlbnQgdGhpcyBhcyBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X2Rpc2FibGVkLgorICAgIC8vCisgICAgLy8gVGhlcmUgYXJlIHRvbyBtYW55IGNoZWNrcyBmb3IgX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lCisgICAgLy8gaW4gdGhpcyBjb2RlLiAgSW5zdGVhZCBvZiB0cnlpbmcgdG8gY2hhbmdlIHRoZW0gYWxsLCBjaGVjayBpZgorICAgIC8vIF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfZGlzYWJsZWQsIGFuZCBpZiBzbywgc2xhbSBpdCB3aXRoCisgICAgLy8gYWZmaW5pdHlfbm9uZSwgY2FsbCB0aGUgcmVhbCBpbml0aWFsaXphdGlvbiByb3V0aW5lLCB0aGVuIHJlc3RvcmUKKyAgICAvLyBfX2ttcF9hZmZpbml0eV90eXBlIHRvIGFmZmluaXR5X2Rpc2FibGVkLgorICAgIC8vCisgICAgaW50IGRpc2FibGVkID0gKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfZGlzYWJsZWQpOworICAgIGlmICghIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkpIHsKKyAgICAgICAgS01QX0FTU0VSVChkaXNhYmxlZCk7CisgICAgfQorICAgIGlmIChkaXNhYmxlZCkgeworICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfbm9uZTsKKyAgICB9CisgICAgX19rbXBfYXV4X2FmZmluaXR5X2luaXRpYWxpemUoKTsKKyAgICBpZiAoZGlzYWJsZWQpIHsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X2Rpc2FibGVkOworICAgIH0KK30KKworCit2b2lkCitfX2ttcF9hZmZpbml0eV91bmluaXRpYWxpemUodm9pZCkKK3sKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfbWFza3MgIT0gTlVMTCkgeworICAgICAgICBfX2ttcF9mcmVlKF9fa21wX2FmZmluaXR5X21hc2tzKTsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfbWFza3MgPSBOVUxMOworICAgIH0KKyAgICBpZiAoZnVsbE1hc2sgIT0gTlVMTCkgeworICAgICAgICBLTVBfQ1BVX0ZSRUUoZnVsbE1hc2spOworICAgICAgICBmdWxsTWFzayA9IE5VTEw7CisgICAgfQorICAgIF9fa21wX2FmZmluaXR5X251bV9tYXNrcyA9IDA7CisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgX19rbXBfYWZmaW5pdHlfbnVtX3BsYWNlcyA9IDA7CisjIGVuZGlmCisgICAgaWYgKF9fa21wX2FmZmluaXR5X3Byb2NsaXN0ICE9IE5VTEwpIHsKKyAgICAgICAgX19rbXBfZnJlZShfX2ttcF9hZmZpbml0eV9wcm9jbGlzdCk7CisgICAgICAgIF9fa21wX2FmZmluaXR5X3Byb2NsaXN0ID0gTlVMTDsKKyAgICB9CisgICAgaWYoIGFkZHJlc3Myb3MgIT0gTlVMTCApIHsKKyAgICAgICAgX19rbXBfZnJlZSggYWRkcmVzczJvcyApOworICAgICAgICBhZGRyZXNzMm9zID0gTlVMTDsKKyAgICB9CisgICAgaWYoIHByb2NhcnIgIT0gTlVMTCApIHsKKyAgICAgICAgX19rbXBfZnJlZSggcHJvY2FyciApOworICAgICAgICBwcm9jYXJyID0gTlVMTDsKKyAgICB9Cit9CisKKwordm9pZAorX19rbXBfYWZmaW5pdHlfc2V0X2luaXRfbWFzayhpbnQgZ3RpZCwgaW50IGlzYV9yb290KQoreworICAgIGlmICghIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGttcF9pbmZvX3QgKnRoID0gKGttcF9pbmZvX3QgKilUQ1JfU1lOQ19QVFIoX19rbXBfdGhyZWFkc1tndGlkXSk7CisgICAgaWYgKHRoLT50aC50aF9hZmZpbl9tYXNrID09IE5VTEwpIHsKKyAgICAgICAgS01QX0NQVV9BTExPQyh0aC0+dGgudGhfYWZmaW5fbWFzayk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBLTVBfQ1BVX1pFUk8odGgtPnRoLnRoX2FmZmluX21hc2spOworICAgIH0KKworICAgIC8vCisgICAgLy8gQ29weSB0aGUgdGhyZWFkIG1hc2sgdG8gdGhlIGttcF9pbmZvX3Qgc3RydWN1dHVyZS4KKyAgICAvLyBJZiBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUsIGNvcHkgdGhlICJmdWxsIiBtYXNrLCBpLmUuIG9uZQorICAgIC8vIHRoYXQgaGFzIGFsbCBvZiB0aGUgT1MgcHJvYyBpZHMgc2V0LCBvciBpZiBfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2sKKyAgICAvLyBpcyBzZXQsIHRoZW4gdGhlIGZ1bGwgbWFzayBpcyB0aGUgc2FtZSBhcyB0aGUgbWFzayBvZiB0aGUgaW5pdGlhbGl6YXRpb24KKyAgICAvLyB0aHJlYWQuCisgICAgLy8KKyAgICBrbXBfYWZmaW5fbWFza190ICptYXNrOworICAgIGludCBpOworCisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgaWYgKF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9PSBwcm9jX2JpbmRfaW50ZWwpCisjIGVuZGlmCisgICAgeworICAgICAgICBpZiAoKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSkKKyMgaWYgS01QX01JQworICAgICAgICAgIHx8IChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X2JhbGFuY2VkKQorIyBlbmRpZgorICAgICAgICAgICkgeworIyBpZiBLTVBfT1NfV0lORE9XUyAmJiBLTVBfQVJDSF9YODZfNjQKKyAgICAgICAgICAgIGlmIChfX2ttcF9udW1fcHJvY19ncm91cHMgPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorIyBlbmRpZgorICAgICAgICAgICAgS01QX0FTU0VSVChmdWxsTWFzayAhPSBOVUxMKTsKKyAgICAgICAgICAgIGkgPSAtMTsKKyAgICAgICAgICAgIG1hc2sgPSBmdWxsTWFzazsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2FmZmluaXR5X251bV9tYXNrcyA+IDAgKTsKKyAgICAgICAgICAgIGkgPSAoZ3RpZCArIF9fa21wX2FmZmluaXR5X29mZnNldCkgJSBfX2ttcF9hZmZpbml0eV9udW1fbWFza3M7CisgICAgICAgICAgICBtYXNrID0gS01QX0NQVV9JTkRFWChfX2ttcF9hZmZpbml0eV9tYXNrcywgaSk7CisgICAgICAgIH0KKyAgICB9CisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgZWxzZSB7CisgICAgICAgIGlmICgoISBpc2Ffcm9vdCkKKyAgICAgICAgICB8fCAoX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID09IHByb2NfYmluZF9mYWxzZSkpIHsKKyMgIGlmIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4Nl82NAorICAgICAgICAgICAgaWYgKF9fa21wX251bV9wcm9jX2dyb3VwcyA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisjICBlbmRpZgorICAgICAgICAgICAgS01QX0FTU0VSVChmdWxsTWFzayAhPSBOVUxMKTsKKyAgICAgICAgICAgIGkgPSBLTVBfUExBQ0VfQUxMOworICAgICAgICAgICAgbWFzayA9IGZ1bGxNYXNrOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIGludCBpID0gc29tZSBoYXNoIGZ1bmN0aW9uIG9yIGp1c3QgYSBjb3VudGVyIHRoYXQgZG9lc24ndAorICAgICAgICAgICAgLy8gYWx3YXlzIHN0YXJ0IGF0IDAuICBVc2UgZ3RpZCBmb3Igbm93LgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2FmZmluaXR5X251bV9tYXNrcyA+IDAgKTsKKyAgICAgICAgICAgIGkgPSAoZ3RpZCArIF9fa21wX2FmZmluaXR5X29mZnNldCkgJSBfX2ttcF9hZmZpbml0eV9udW1fbWFza3M7CisgICAgICAgICAgICBtYXNrID0gS01QX0NQVV9JTkRFWChfX2ttcF9hZmZpbml0eV9tYXNrcywgaSk7CisgICAgICAgIH0KKyAgICB9CisjIGVuZGlmCisKKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICB0aC0+dGgudGhfY3VycmVudF9wbGFjZSA9IGk7CisgICAgaWYgKGlzYV9yb290KSB7CisgICAgICAgIHRoLT50aC50aF9uZXdfcGxhY2UgPSBpOworICAgICAgICB0aC0+dGgudGhfZmlyc3RfcGxhY2UgPSAwOworICAgICAgICB0aC0+dGgudGhfbGFzdF9wbGFjZSA9IF9fa21wX2FmZmluaXR5X251bV9tYXNrcyAtIDE7CisgICAgfQorCisgICAgaWYgKGkgPT0gS01QX1BMQUNFX0FMTCkgeworICAgICAgICBLQV9UUkFDRSgxMDAsICgiX19rbXBfYWZmaW5pdHlfc2V0X2luaXRfbWFzazogYmluZGluZyBUIyVkIHRvIGFsbCBwbGFjZXNcbiIsCisgICAgICAgICAgZ3RpZCkpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS0FfVFJBQ0UoMTAwLCAoIl9fa21wX2FmZmluaXR5X3NldF9pbml0X21hc2s6IGJpbmRpbmcgVCMlZCB0byBwbGFjZSAlZFxuIiwKKyAgICAgICAgICBndGlkLCBpKSk7CisgICAgfQorIyBlbHNlCisgICAgaWYgKGkgPT0gLTEpIHsKKyAgICAgICAgS0FfVFJBQ0UoMTAwLCAoIl9fa21wX2FmZmluaXR5X3NldF9pbml0X21hc2s6IGJpbmRpbmcgVCMlZCB0byBmdWxsTWFza1xuIiwKKyAgICAgICAgICBndGlkKSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBLQV9UUkFDRSgxMDAsICgiX19rbXBfYWZmaW5pdHlfc2V0X2luaXRfbWFzazogYmluZGluZyBUIyVkIHRvIG1hc2sgJWRcbiIsCisgICAgICAgICAgZ3RpZCwgaSkpOworICAgIH0KKyMgZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworICAgIEtNUF9DUFVfQ09QWSh0aC0+dGgudGhfYWZmaW5fbWFzaywgbWFzayk7CisKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKGJ1ZiwgS01QX0FGRklOX01BU0tfUFJJTlRfTEVOLAorICAgICAgICAgIHRoLT50aC50aF9hZmZpbl9tYXNrKTsKKyAgICAgICAgS01QX0lORk9STShCb3VuZFRvT1NQcm9jU2V0LCAiS01QX0FGRklOSVRZIiwgZ3RpZCwgYnVmKTsKKyAgICB9CisKKyMgaWYgS01QX09TX1dJTkRPV1MKKyAgICAvLworICAgIC8vIE9uIFdpbmRvd3MqIE9TLCB0aGUgcHJvY2VzcyBhZmZpbml0eSBtYXNrIG1pZ2h0IGhhdmUgY2hhbmdlZC4KKyAgICAvLyBJZiB0aGUgdXNlciBkaWRuJ3QgcmVxdWVzdCBhZmZpbml0eSBhbmQgdGhpcyBjYWxsIGZhaWxzLAorICAgIC8vIGp1c3QgY29udGludWUgc2lsZW50bHkuICBTZWUgQ1ExNzEzOTMuCisgICAgLy8KKyAgICBpZiAoIF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSApIHsKKyAgICAgICAgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eSh0aC0+dGgudGhfYWZmaW5fbWFzaywgRkFMU0UpOworICAgIH0KKyAgICBlbHNlCisjIGVuZGlmCisgICAgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eSh0aC0+dGgudGhfYWZmaW5fbWFzaywgVFJVRSk7Cit9CisKKworIyBpZiBPTVBfNDBfRU5BQkxFRAorCit2b2lkCitfX2ttcF9hZmZpbml0eV9zZXRfcGxhY2UoaW50IGd0aWQpCit7CisgICAgaW50IHJldHZhbDsKKworICAgIGlmICghIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGttcF9pbmZvX3QgKnRoID0gKGttcF9pbmZvX3QgKilUQ1JfU1lOQ19QVFIoX19rbXBfdGhyZWFkc1tndGlkXSk7CisKKyAgICBLQV9UUkFDRSgxMDAsICgiX19rbXBfYWZmaW5pdHlfc2V0X3BsYWNlOiBiaW5kaW5nIFQjJWQgdG8gcGxhY2UgJWQgKGN1cnJlbnQgcGxhY2UgPSAlZClcbiIsCisgICAgICBndGlkLCB0aC0+dGgudGhfbmV3X3BsYWNlLCB0aC0+dGgudGhfY3VycmVudF9wbGFjZSkpOworCisgICAgLy8KKyAgICAvLyBDaGVjayB0aGF0IHRoZSBuZXcgcGxhY2UgaXMgd2l0aGluIHRoaXMgdGhyZWFkJ3MgcGFydGl0aW9uLgorICAgIC8vCisgICAgS01QX0RFQlVHX0FTU0VSVCh0aC0+dGgudGhfYWZmaW5fbWFzayAhPSBOVUxMKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRoLT50aC50aF9uZXdfcGxhY2UgPj0gMCk7CisgICAgS01QX0RFQlVHX0FTU0VSVCgodW5zaWduZWQpdGgtPnRoLnRoX25ld19wbGFjZSA8PSBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MpOworICAgIGlmICh0aC0+dGgudGhfZmlyc3RfcGxhY2UgPD0gdGgtPnRoLnRoX2xhc3RfcGxhY2UpIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCgodGgtPnRoLnRoX25ld19wbGFjZSA+PSB0aC0+dGgudGhfZmlyc3RfcGxhY2UpCisgICAgICAgICAmJiAodGgtPnRoLnRoX25ld19wbGFjZSA8PSB0aC0+dGgudGhfbGFzdF9wbGFjZSkpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCgodGgtPnRoLnRoX25ld19wbGFjZSA8PSB0aC0+dGgudGhfZmlyc3RfcGxhY2UpCisgICAgICAgICB8fCAodGgtPnRoLnRoX25ld19wbGFjZSA+PSB0aC0+dGgudGhfbGFzdF9wbGFjZSkpOworICAgIH0KKworICAgIC8vCisgICAgLy8gQ29weSB0aGUgdGhyZWFkIG1hc2sgdG8gdGhlIGttcF9pbmZvX3Qgc3RydWN1dHVyZSwKKyAgICAvLyBhbmQgc2V0IHRoaXMgdGhyZWFkJ3MgYWZmaW5pdHkuCisgICAgLy8KKyAgICBrbXBfYWZmaW5fbWFza190ICptYXNrID0gS01QX0NQVV9JTkRFWChfX2ttcF9hZmZpbml0eV9tYXNrcywKKyAgICAgIHRoLT50aC50aF9uZXdfcGxhY2UpOworICAgIEtNUF9DUFVfQ09QWSh0aC0+dGgudGhfYWZmaW5fbWFzaywgbWFzayk7CisgICAgdGgtPnRoLnRoX2N1cnJlbnRfcGxhY2UgPSB0aC0+dGgudGhfbmV3X3BsYWNlOworCisgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwKKyAgICAgICAgICB0aC0+dGgudGhfYWZmaW5fbWFzayk7CisgICAgICAgIEtNUF9JTkZPUk0oQm91bmRUb09TUHJvY1NldCwgIk9NUF9QUk9DX0JJTkQiLCBndGlkLCBidWYpOworICAgIH0KKyAgICBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KHRoLT50aC50aF9hZmZpbl9tYXNrLCBUUlVFKTsKK30KKworIyBlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisKK2ludAorX19rbXBfYXV4X3NldF9hZmZpbml0eSh2b2lkICoqbWFzaykKK3sKKyAgICBpbnQgZ3RpZDsKKyAgICBrbXBfaW5mb190ICp0aDsKKyAgICBpbnQgcmV0dmFsOworCisgICAgaWYgKCEgS01QX0FGRklOSVRZX0NBUEFCTEUoKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICBLQV9UUkFDRSgxMDAwLCA7eworICAgICAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKGJ1ZiwgS01QX0FGRklOX01BU0tfUFJJTlRfTEVOLAorICAgICAgICAgIChrbXBfYWZmaW5fbWFza190ICopKCptYXNrKSk7CisgICAgICAgIF9fa21wX2RlYnVnX3ByaW50Zigia21wX3NldF9hZmZpbml0eTogc2V0dGluZyBhZmZpbml0eSBtYXNrIGZvciB0aHJlYWQgJWQgPSAlc1xuIiwKKyAgICAgICAgICBndGlkLCBidWYpOworICAgIH0pOworCisgICAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgICBpZiAoKG1hc2sgPT0gTlVMTCkgfHwgKCptYXNrID09IE5VTEwpKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoQWZmaW5pdHlJbnZhbGlkTWFzaywgImttcF9zZXRfYWZmaW5pdHkiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIHByb2M7CisgICAgICAgICAgICBpbnQgbnVtX3Byb2NzID0gMDsKKworICAgICAgICAgICAgZm9yIChwcm9jID0gMDsgcHJvYyA8IEtNUF9DUFVfU0VUU0laRTsgcHJvYysrKSB7CisgICAgICAgICAgICAgICAgaWYgKCEgS01QX0NQVV9JU1NFVChwcm9jLCAoa21wX2FmZmluX21hc2tfdCAqKSgqbWFzaykpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBudW1fcHJvY3MrKzsKKyAgICAgICAgICAgICAgICBpZiAoISBLTVBfQ1BVX0lTU0VUKHByb2MsIGZ1bGxNYXNrKSkgeworICAgICAgICAgICAgICAgICAgICBLTVBfRkFUQUwoQWZmaW5pdHlJbnZhbGlkTWFzaywgImttcF9zZXRfYWZmaW5pdHkiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG51bV9wcm9jcyA9PSAwKSB7CisgICAgICAgICAgICAgICAgS01QX0ZBVEFMKEFmZmluaXR5SW52YWxpZE1hc2ssICJrbXBfc2V0X2FmZmluaXR5Iik7CisgICAgICAgICAgICB9CisKKyMgaWYgS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2XzY0CisgICAgICAgICAgICBpZiAoX19rbXBfZ2V0X3Byb2NfZ3JvdXAoKGttcF9hZmZpbl9tYXNrX3QgKikoKm1hc2spKSA8IDApIHsKKyAgICAgICAgICAgICAgICBLTVBfRkFUQUwoQWZmaW5pdHlJbnZhbGlkTWFzaywgImttcF9zZXRfYWZmaW5pdHkiKTsKKyAgICAgICAgICAgIH0KKyMgZW5kaWYgLyogS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2XzY0ICovCisKKyAgICAgICAgfQorICAgIH0KKworICAgIHRoID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRoLT50aC50aF9hZmZpbl9tYXNrICE9IE5VTEwpOworICAgIHJldHZhbCA9IF9fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkoKGttcF9hZmZpbl9tYXNrX3QgKikoKm1hc2spLCBGQUxTRSk7CisgICAgaWYgKHJldHZhbCA9PSAwKSB7CisgICAgICAgIEtNUF9DUFVfQ09QWSh0aC0+dGgudGhfYWZmaW5fbWFzaywgKGttcF9hZmZpbl9tYXNrX3QgKikoKm1hc2spKTsKKyAgICB9CisKKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICB0aC0+dGgudGhfY3VycmVudF9wbGFjZSA9IEtNUF9QTEFDRV9VTkRFRklORUQ7CisgICAgdGgtPnRoLnRoX25ld19wbGFjZSA9IEtNUF9QTEFDRV9VTkRFRklORUQ7CisgICAgdGgtPnRoLnRoX2ZpcnN0X3BsYWNlID0gMDsKKyAgICB0aC0+dGgudGhfbGFzdF9wbGFjZSA9IF9fa21wX2FmZmluaXR5X251bV9tYXNrcyAtIDE7CisjIGVuZGlmCisKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisKK2ludAorX19rbXBfYXV4X2dldF9hZmZpbml0eSh2b2lkICoqbWFzaykKK3sKKyAgICBpbnQgZ3RpZDsKKyAgICBpbnQgcmV0dmFsOworICAgIGttcF9pbmZvX3QgKnRoOworCisgICAgaWYgKCEgS01QX0FGRklOSVRZX0NBUEFCTEUoKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICB0aCA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgICAgS01QX0RFQlVHX0FTU0VSVCh0aC0+dGgudGhfYWZmaW5fbWFzayAhPSBOVUxMKTsKKworICAgIEtBX1RSQUNFKDEwMDAsIDt7CisgICAgICAgIGNoYXIgYnVmW0tNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTl07CisgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sCisgICAgICAgICAgdGgtPnRoLnRoX2FmZmluX21hc2spOworICAgICAgICBfX2ttcF9wcmludGYoImttcF9nZXRfYWZmaW5pdHk6IHN0b3JlZCBhZmZpbml0eSBtYXNrIGZvciB0aHJlYWQgJWQgPSAlc1xuIiwgZ3RpZCwgYnVmKTsKKyAgICB9KTsKKworICAgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICAgICAgaWYgKChtYXNrID09IE5VTEwpIHx8ICgqbWFzayA9PSBOVUxMKSkgeworICAgICAgICAgICAgS01QX0ZBVEFMKEFmZmluaXR5SW52YWxpZE1hc2ssICJrbXBfZ2V0X2FmZmluaXR5Iik7CisgICAgICAgIH0KKyAgICB9CisKKyMgaWYgIUtNUF9PU19XSU5ET1dTCisKKyAgICByZXR2YWwgPSBfX2ttcF9nZXRfc3lzdGVtX2FmZmluaXR5KChrbXBfYWZmaW5fbWFza190ICopKCptYXNrKSwgRkFMU0UpOworICAgIEtBX1RSQUNFKDEwMDAsIDt7CisgICAgICAgIGNoYXIgYnVmW0tNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTl07CisgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sCisgICAgICAgICAgKGttcF9hZmZpbl9tYXNrX3QgKikoKm1hc2spKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCJrbXBfZ2V0X2FmZmluaXR5OiBzeXN0ZW0gYWZmaW5pdHkgbWFzayBmb3IgdGhyZWFkICVkID0gJXNcbiIsIGd0aWQsIGJ1Zik7CisgICAgfSk7CisgICAgcmV0dXJuIHJldHZhbDsKKworIyBlbHNlCisKKyAgICBLTVBfQ1BVX0NPUFkoKGttcF9hZmZpbl9tYXNrX3QgKikoKm1hc2spLCB0aC0+dGgudGhfYWZmaW5fbWFzayk7CisgICAgcmV0dXJuIDA7CisKKyMgZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KKworfQorCisKK2ludAorX19rbXBfYXV4X3NldF9hZmZpbml0eV9tYXNrX3Byb2MoaW50IHByb2MsIHZvaWQgKiptYXNrKQoreworICAgIGludCByZXR2YWw7CisKKyAgICBpZiAoISBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBLQV9UUkFDRSgxMDAwLCA7eworICAgICAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwKKyAgICAgICAgICAoa21wX2FmZmluX21hc2tfdCAqKSgqbWFzaykpOworICAgICAgICBfX2ttcF9kZWJ1Z19wcmludGYoImttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jOiBzZXR0aW5nIHByb2MgJWQgaW4gYWZmaW5pdHkgbWFzayBmb3IgdGhyZWFkICVkID0gJXNcbiIsCisgICAgICAgICAgcHJvYywgZ3RpZCwgYnVmKTsKKyAgICB9KTsKKworICAgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICAgICAgaWYgKChtYXNrID09IE5VTEwpIHx8ICgqbWFzayA9PSBOVUxMKSkgeworICAgICAgICAgICAgS01QX0ZBVEFMKEFmZmluaXR5SW52YWxpZE1hc2ssICJrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyIpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChwcm9jIDwgMCkgfHwgKCh1bnNpZ25lZClwcm9jID49IEtNUF9DUFVfU0VUU0laRSkpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoISBLTVBfQ1BVX0lTU0VUKHByb2MsIGZ1bGxNYXNrKSkgeworICAgICAgICByZXR1cm4gLTI7CisgICAgfQorCisgICAgS01QX0NQVV9TRVQocHJvYywgKGttcF9hZmZpbl9tYXNrX3QgKikoKm1hc2spKTsKKyAgICByZXR1cm4gMDsKK30KKworCitpbnQKK19fa21wX2F1eF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MoaW50IHByb2MsIHZvaWQgKiptYXNrKQoreworICAgIGludCByZXR2YWw7CisKKyAgICBpZiAoISBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBLQV9UUkFDRSgxMDAwLCA7eworICAgICAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwKKyAgICAgICAgICAoa21wX2FmZmluX21hc2tfdCAqKSgqbWFzaykpOworICAgICAgICBfX2ttcF9kZWJ1Z19wcmludGYoImttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2M6IHVuc2V0dGluZyBwcm9jICVkIGluIGFmZmluaXR5IG1hc2sgZm9yIHRocmVhZCAlZCA9ICVzXG4iLAorICAgICAgICAgIHByb2MsIGd0aWQsIGJ1Zik7CisgICAgfSk7CisKKyAgICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICAgIGlmICgobWFzayA9PSBOVUxMKSB8fCAoKm1hc2sgPT0gTlVMTCkpIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTChBZmZpbml0eUludmFsaWRNYXNrLCAia21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyIpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChwcm9jIDwgMCkgfHwgKCh1bnNpZ25lZClwcm9jID49IEtNUF9DUFVfU0VUU0laRSkpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoISBLTVBfQ1BVX0lTU0VUKHByb2MsIGZ1bGxNYXNrKSkgeworICAgICAgICByZXR1cm4gLTI7CisgICAgfQorCisgICAgS01QX0NQVV9DTFIocHJvYywgKGttcF9hZmZpbl9tYXNrX3QgKikoKm1hc2spKTsKKyAgICByZXR1cm4gMDsKK30KKworCitpbnQKK19fa21wX2F1eF9nZXRfYWZmaW5pdHlfbWFza19wcm9jKGludCBwcm9jLCB2b2lkICoqbWFzaykKK3sKKyAgICBpbnQgcmV0dmFsOworCisgICAgaWYgKCEgS01QX0FGRklOSVRZX0NBUEFCTEUoKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgS0FfVFJBQ0UoMTAwMCwgO3sKKyAgICAgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgICAgIGNoYXIgYnVmW0tNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTl07CisgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sCisgICAgICAgICAgKGttcF9hZmZpbl9tYXNrX3QgKikoKm1hc2spKTsKKyAgICAgICAgX19rbXBfZGVidWdfcHJpbnRmKCJrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYzogZ2V0dGluZyBwcm9jICVkIGluIGFmZmluaXR5IG1hc2sgZm9yIHRocmVhZCAlZCA9ICVzXG4iLAorICAgICAgICAgIHByb2MsIGd0aWQsIGJ1Zik7CisgICAgfSk7CisKKyAgICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICAgIGlmICgobWFzayA9PSBOVUxMKSB8fCAoKm1hc2sgPT0gTlVMTCkpIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTChBZmZpbml0eUludmFsaWRNYXNrLCAia21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgocHJvYyA8IDApIHx8ICgodW5zaWduZWQpcHJvYyA+PSBLTVBfQ1BVX1NFVFNJWkUpKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoISBLTVBfQ1BVX0lTU0VUKHByb2MsIGZ1bGxNYXNrKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gS01QX0NQVV9JU1NFVChwcm9jLCAoa21wX2FmZmluX21hc2tfdCAqKSgqbWFzaykpOworfQorCisjIGlmIEtNUF9NSUMKKworLy8gRHluYW1pYyBhZmZpbml0eSBzZXR0aW5ncyAtIEFmZmluaXR5IGJhbGFuY2VkCit2b2lkIF9fa21wX2JhbGFuY2VkX2FmZmluaXR5KCBpbnQgdGlkLCBpbnQgbnRocmVhZHMgKQoreworICAgIGlmKCBfX2ttcF9hZmZpbml0eV91bmlmb3JtX3RvcG9sb2d5KCkgKSB7CisgICAgICAgIGludCBjb3JlSUQ7CisgICAgICAgIGludCB0aHJlYWRJRDsKKyAgICAgICAgLy8gTnVtYmVyIG9mIGh5cGVyIHRocmVhZHMgcGVyIGNvcmUgaW4gSFQgbWFjaGluZQorICAgICAgICBpbnQgX19rbXBfbnRoX3Blcl9jb3JlID0gX19rbXBfYXZhaWxfcHJvYyAvIF9fa21wX25jb3JlczsKKyAgICAgICAgLy8gTnVtYmVyIG9mIGNvcmVzCisgICAgICAgIGludCBuY29yZXMgPSBfX2ttcF9uY29yZXM7CisgICAgICAgIC8vIEhvdyBtYW55IHRocmVhZHMgd2lsbCBiZSBib3VuZCB0byBlYWNoIGNvcmUKKyAgICAgICAgaW50IGNodW5rID0gbnRocmVhZHMgLyBuY29yZXM7CisgICAgICAgIC8vIEhvdyBtYW55IGNvcmVzIHdpbGwgaGF2ZSBhbiBhZGRpdGlvbmFsIHRocmVhZCBib3VuZCB0byBpdCAtICJiaWcgY29yZXMiCisgICAgICAgIGludCBiaWdfY29yZXMgPSBudGhyZWFkcyAlIG5jb3JlczsKKyAgICAgICAgLy8gTnVtYmVyIG9mIHRocmVhZHMgb24gdGhlIGJpZyBjb3JlcworICAgICAgICBpbnQgYmlnX250aCA9ICggY2h1bmsgKyAxICkgKiBiaWdfY29yZXM7CisgICAgICAgIGlmKCB0aWQgPCBiaWdfbnRoICkgeworICAgICAgICAgICAgY29yZUlEID0gdGlkIC8gKGNodW5rICsgMSApOworICAgICAgICAgICAgdGhyZWFkSUQgPSAoIHRpZCAlIChjaHVuayArIDEgKSApICUgX19rbXBfbnRoX3Blcl9jb3JlIDsKKyAgICAgICAgfSBlbHNlIHsgLy90aWQgPj0gYmlnX250aAorICAgICAgICAgICAgY29yZUlEID0gKCB0aWQgLSBiaWdfY29yZXMgKSAvIGNodW5rOworICAgICAgICAgICAgdGhyZWFkSUQgPSAoICggdGlkIC0gYmlnX2NvcmVzICkgJSBjaHVuayApICUgX19rbXBfbnRoX3Blcl9jb3JlIDsKKyAgICAgICAgfQorCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQyKEtNUF9BRkZJTklUWV9DQVBBQkxFKCksCisgICAgICAgICAgIklsbGVnYWwgc2V0IGFmZmluaXR5IG9wZXJhdGlvbiB3aGVuIG5vdCBjYXBhYmxlIik7CisKKyAgICAgICAga21wX2FmZmluX21hc2tfdCAqbWFzayA9IChrbXBfYWZmaW5fbWFza190ICopYWxsb2NhKF9fa21wX2FmZmluX21hc2tfc2l6ZSk7CisgICAgICAgIEtNUF9DUFVfWkVSTyhtYXNrKTsKKworICAgICAgICAvLyBHcmFudWxhcml0eSA9PSB0aHJlYWQKKyAgICAgICAgaWYoIF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9maW5lIHx8IF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl90aHJlYWQpIHsKKyAgICAgICAgICAgIGludCBvc0lEID0gYWRkcmVzczJvc1sgY29yZUlEICogX19rbXBfbnRoX3Blcl9jb3JlICsgdGhyZWFkSUQgXS5zZWNvbmQ7CisgICAgICAgICAgICBLTVBfQ1BVX1NFVCggb3NJRCwgbWFzayk7CisgICAgICAgIH0gZWxzZSBpZiggX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX2NvcmUgKSB7IC8vIEdyYW51bGFyaXR5ID09IGNvcmUKKyAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgX19rbXBfbnRoX3Blcl9jb3JlOyBpKysgKSB7CisgICAgICAgICAgICAgICAgaW50IG9zSUQ7CisgICAgICAgICAgICAgICAgb3NJRCA9IGFkZHJlc3Myb3NbIGNvcmVJRCAqIF9fa21wX250aF9wZXJfY29yZSArIGkgXS5zZWNvbmQ7CisgICAgICAgICAgICAgICAgS01QX0NQVV9TRVQoIG9zSUQsIG1hc2spOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwgbWFzayk7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEJvdW5kVG9PU1Byb2NTZXQsICJLTVBfQUZGSU5JVFkiLCB0aWQsIGJ1Zik7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eSggbWFzaywgVFJVRSApOworICAgIH0gZWxzZSB7IC8vIE5vbi11bmlmb3JtIHRvcG9sb2d5CisKKyAgICAgICAga21wX2FmZmluX21hc2tfdCAqbWFzayA9IChrbXBfYWZmaW5fbWFza190ICopYWxsb2NhKF9fa21wX2FmZmluX21hc2tfc2l6ZSk7CisgICAgICAgIEtNUF9DUFVfWkVSTyhtYXNrKTsKKworICAgICAgICAvLyBOdW1iZXIgb2YgaHlwZXIgdGhyZWFkcyBwZXIgY29yZSBpbiBIVCBtYWNoaW5lCisgICAgICAgIGludCBudGhfcGVyX2NvcmUgPSBfX2ttcF9uVGhyZWFkc1BlckNvcmU7CisgICAgICAgIGludCBjb3JlX2xldmVsOworICAgICAgICBpZiggbnRoX3Blcl9jb3JlID4gMSApIHsKKyAgICAgICAgICAgIGNvcmVfbGV2ZWwgPSBfX2ttcF9hZmZfZGVwdGggLSAyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29yZV9sZXZlbCA9IF9fa21wX2FmZl9kZXB0aCAtIDE7CisgICAgICAgIH0KKworICAgICAgICAvLyBOdW1iZXIgb2YgY29yZXMgLSBtYXhpbXVtIHZhbHVlOyBpdCBkb2VzIG5vdCBjb3VudCB0cmFpbCBjb3JlcyB3aXRoIDAgcHJvY2Vzc29ycworICAgICAgICBpbnQgbmNvcmVzID0gYWRkcmVzczJvc1sgX19rbXBfYXZhaWxfcHJvYyAtIDEgXS5maXJzdC5sYWJlbHNbIGNvcmVfbGV2ZWwgXSArIDE7CisKKyAgICAgICAgLy8gRm9yIHBlcmZvcm1hbmNlIGdhaW4gY29uc2lkZXIgdGhlIHNwZWNpYWwgY2FzZSBudGhyZWFkcyA9PSBfX2ttcF9hdmFpbF9wcm9jCisgICAgICAgIGlmKCBudGhyZWFkcyA9PSBfX2ttcF9hdmFpbF9wcm9jICkgeworICAgICAgICAgICAgaWYoIF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9maW5lIHx8IF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl90aHJlYWQpIHsKKyAgICAgICAgICAgICAgICBpbnQgb3NJRCA9IGFkZHJlc3Myb3NbIHRpZCBdLnNlY29uZDsKKyAgICAgICAgICAgICAgICBLTVBfQ1BVX1NFVCggb3NJRCwgbWFzayk7CisgICAgICAgICAgICB9IGVsc2UgaWYoIF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9jb3JlICkgeyAvLyBHcmFudWxhcml0eSA9PSBjb3JlCisgICAgICAgICAgICAgICAgaW50IGNvcmVJRCA9IGFkZHJlc3Myb3NbIHRpZCBdLmZpcnN0LmxhYmVsc1sgY29yZV9sZXZlbCBdOworICAgICAgICAgICAgICAgIC8vIFdlJ2xsIGNvdW50IGZvdW5kIG9zSURzIGZvciB0aGUgY3VycmVudCBjb3JlOyB0aGV5IGNhbiBiZSBub3QgbW9yZSB0aGFuIG50aF9wZXJfY29yZTsKKyAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGUgYWRkcmVzczJvcyBpcyBzb3J0aWVkIHdlIGNhbiBicmVhayB3aGVuIGNudD09bnRoX3Blcl9jb3JlCisgICAgICAgICAgICAgICAgaW50IGNudCA9IDA7CisgICAgICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBfX2ttcF9hdmFpbF9wcm9jOyBpKysgKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBvc0lEID0gYWRkcmVzczJvc1sgaSBdLnNlY29uZDsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNvcmUgPSBhZGRyZXNzMm9zWyBpIF0uZmlyc3QubGFiZWxzWyBjb3JlX2xldmVsIF07CisgICAgICAgICAgICAgICAgICAgIGlmKCBjb3JlID09IGNvcmVJRCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfU0VUKCBvc0lELCBtYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGNudCA9PSBudGhfcGVyX2NvcmUgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiggbnRocmVhZHMgPD0gX19rbXBfbmNvcmVzICkgeworCisgICAgICAgICAgICBpbnQgY29yZSA9IDA7CisgICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IG5jb3JlczsgaSsrICkgeworICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgY29yZSBmcm9tIHByb2NhcnJbXSBpcyBpbiB0aGUgbWFzaworICAgICAgICAgICAgICAgIGludCBpbl9tYXNrID0gMDsKKyAgICAgICAgICAgICAgICBmb3IoIGludCBqID0gMDsgaiA8IG50aF9wZXJfY29yZTsgaisrICkgeworICAgICAgICAgICAgICAgICAgICBpZiggcHJvY2FyclsgaSAqIG50aF9wZXJfY29yZSArIGogXSAhPSAtIDEgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbl9tYXNrID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKCBpbl9tYXNrICkgeworICAgICAgICAgICAgICAgICAgICBpZiggdGlkID09IGNvcmUgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIGludCBqID0gMDsgaiA8IG50aF9wZXJfY29yZTsgaisrICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvc0lEID0gcHJvY2FyclsgaSAqIG50aF9wZXJfY29yZSArIGogXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggb3NJRCAhPSAtMSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0NQVV9TRVQoIG9zSUQsIG1hc2sgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGdyYW51bGFyaXR5PXRocmVhZCBpdCBpcyBlbm91Z2ggdG8gc2V0IHRoZSBmaXJzdCBhdmFpbGFibGUgb3NJRCBmb3IgdGhpcyBjb3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fZmluZSB8fCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fdGhyZWFkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY29yZSsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSB7IC8vIG50aHJlYWRzID4gX19rbXBfbmNvcmVzCisKKyAgICAgICAgICAgIC8vIEFycmF5IHRvIHNhdmUgdGhlIG51bWJlciBvZiBwcm9jZXNzb3JzIGF0IGVhY2ggY29yZQorICAgICAgICAgICAgaW50IG5wcm9jX2F0X2NvcmVbIG5jb3JlcyBdOworICAgICAgICAgICAgLy8gQXJyYXkgdG8gc2F2ZSB0aGUgbnVtYmVyIG9mIGNvcmVzIHdpdGggIngiIGF2YWlsYWJsZSBwcm9jZXNzb3JzOworICAgICAgICAgICAgaW50IG5jb3Jlc193aXRoX3hfcHJvY3NbIG50aF9wZXJfY29yZSArIDEgXTsKKyAgICAgICAgICAgIC8vIEFycmF5IHRvIHNhdmUgdGhlIG51bWJlciBvZiBjb3JlcyB3aXRoICMgcHJvY3MgZnJvbSB4IHRvIG50aF9wZXJfY29yZQorICAgICAgICAgICAgaW50IG5jb3Jlc193aXRoX3hfdG9fbWF4X3Byb2NzWyBudGhfcGVyX2NvcmUgKyAxIF07CisKKyAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDw9IG50aF9wZXJfY29yZTsgaSsrICkgeworICAgICAgICAgICAgICAgIG5jb3Jlc193aXRoX3hfcHJvY3NbIGkgXSA9IDA7CisgICAgICAgICAgICAgICAgbmNvcmVzX3dpdGhfeF90b19tYXhfcHJvY3NbIGkgXSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgbmNvcmVzOyBpKysgKSB7CisgICAgICAgICAgICAgICAgaW50IGNudCA9IDA7CisgICAgICAgICAgICAgICAgZm9yKCBpbnQgaiA9IDA7IGogPCBudGhfcGVyX2NvcmU7IGorKyApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHByb2NhcnJbIGkgKiBudGhfcGVyX2NvcmUgKyBqIF0gIT0gLTEgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjbnQrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBucHJvY19hdF9jb3JlWyBpIF0gPSBjbnQ7CisgICAgICAgICAgICAgICAgbmNvcmVzX3dpdGhfeF9wcm9jc1sgY250IF0rKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPD0gbnRoX3Blcl9jb3JlOyBpKysgKSB7CisgICAgICAgICAgICAgICAgZm9yKCBpbnQgaiA9IGk7IGogPD0gbnRoX3Blcl9jb3JlOyBqKysgKSB7CisgICAgICAgICAgICAgICAgICAgIG5jb3Jlc193aXRoX3hfdG9fbWF4X3Byb2NzWyBpIF0gKz0gbmNvcmVzX3dpdGhfeF9wcm9jc1sgaiBdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gTWF4IG51bWJlciBvZiBwcm9jZXNzb3JzCisgICAgICAgICAgICBpbnQgbnByb2MgPSBudGhfcGVyX2NvcmUgKiBuY29yZXM7CisgICAgICAgICAgICAvLyBBbiBhcnJheSB0byBrZWVwIG51bWJlciBvZiB0aHJlYWRzIHBlciBlYWNoIGNvbnRleHQKKyAgICAgICAgICAgIGludCAqIG5ld2FyciA9ICggaW50ICogKV9fa21wX2FsbG9jYXRlKCBzaXplb2YoIGludCApICogbnByb2MgKTsKKyAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgbnByb2M7IGkrKyApIHsKKyAgICAgICAgICAgICAgICBuZXdhcnJbIGkgXSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBudGggPSBudGhyZWFkczsKKyAgICAgICAgICAgIGludCBmbGFnID0gMDsKKyAgICAgICAgICAgIHdoaWxlKCBudGggPiAwICkgeworICAgICAgICAgICAgICAgIGZvciggaW50IGogPSAxOyBqIDw9IG50aF9wZXJfY29yZTsgaisrICkgeworICAgICAgICAgICAgICAgICAgICBpbnQgY250ID0gbmNvcmVzX3dpdGhfeF90b19tYXhfcHJvY3NbIGogXTsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBuY29yZXM7IGkrKyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgdGhlIGNvcmUgd2l0aCAwIHByb2Nlc3NvcnMKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBucHJvY19hdF9jb3JlWyBpIF0gPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciggaW50IGsgPSAwOyBrIDwgbnRoX3Blcl9jb3JlOyBrKysgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHByb2NhcnJbIGkgKiBudGhfcGVyX2NvcmUgKyBrIF0gIT0gLTEgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBuZXdhcnJbIGkgKiBudGhfcGVyX2NvcmUgKyBrIF0gPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld2FyclsgaSAqIG50aF9wZXJfY29yZSArIGsgXSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbnQtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG50aC0tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggZmxhZyAhPSAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld2FyclsgaSAqIG50aF9wZXJfY29yZSArIGsgXSArKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbnQtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudGgtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjbnQgPT0gMCB8fCBudGggPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiggbnRoID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmbGFnID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBzdW0gPSAwOworICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBucHJvYzsgaSsrICkgeworICAgICAgICAgICAgICAgIHN1bSArPSBuZXdhcnJbIGkgXTsKKyAgICAgICAgICAgICAgICBpZiggc3VtID4gdGlkICkgeworICAgICAgICAgICAgICAgICAgICAvLyBHcmFudWxhcml0eSA9PSB0aHJlYWQKKyAgICAgICAgICAgICAgICAgICAgaWYoIF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9maW5lIHx8IF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl90aHJlYWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBvc0lEID0gcHJvY2FyclsgaSBdOworICAgICAgICAgICAgICAgICAgICAgICAgS01QX0NQVV9TRVQoIG9zSUQsIG1hc2spOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYoIF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9jb3JlICkgeyAvLyBHcmFudWxhcml0eSA9PSBjb3JlCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29yZUlEID0gaSAvIG50aF9wZXJfY29yZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciggaW50IGlpID0gMDsgaWkgPCBudGhfcGVyX2NvcmU7IGlpKysgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9zSUQgPSBwcm9jYXJyWyBjb3JlSUQgKiBudGhfcGVyX2NvcmUgKyBpaSBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBvc0lEICE9IC0xICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfQ1BVX1NFVCggb3NJRCwgbWFzayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9fa21wX2ZyZWUoIG5ld2FyciApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgIGNoYXIgYnVmW0tNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTl07CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKGJ1ZiwgS01QX0FGRklOX01BU0tfUFJJTlRfTEVOLCBtYXNrKTsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQm91bmRUb09TUHJvY1NldCwgIktNUF9BRkZJTklUWSIsIHRpZCwgYnVmKTsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KCBtYXNrLCBUUlVFICk7CisgICAgfQorfQorCisjIGVuZGlmIC8qIEtNUF9NSUMgKi8KKworI2VuZGlmIC8vIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9hbGxvYy5jIGIvZmluYWwvcnVudGltZS9zcmMva21wX2FsbG9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg1NzU0ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9hbGxvYy5jCkBAIC0wLDAgKzEsMjA0NiBAQAorLyoKKyAqIGttcF9hbGxvYy5jIC0tIHByaXZhdGUvc2hhcmVkIGR5YW5taWMgbWVtb3J5IGFsbG9jYXRpb24gYW5kIG1hbmFnZW1lbnQKKyAqICRSZXZpc2lvbjogNDI4MTAgJAorICogJERhdGU6IDIwMTMtMTEtMDcgMTI6MDY6MzMgLTA2MDAgKFRodSwgMDcgTm92IDIwMTMpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF93cmFwcGVyX21hbGxvYy5oIgorI2luY2x1ZGUgImttcF9pby5oIgorCisvLyBEaXNhYmxlIGJnZXQgd2hlbiBpdCBpcyBub3QgdXNlZAorI2lmIEtNUF9VU0VfQkdFVAorCisvKiBUaHJlYWQgcHJpdmF0ZSBidWZmZXIgbWFuYWdlbWVudCBjb2RlICovCisKK3R5cGVkZWYgaW50ICAgKCpiZ2V0X2NvbXBhY3RfdCkoc2l6ZV90LCBpbnQpOwordHlwZWRlZiB2b2lkICooKmJnZXRfYWNxdWlyZV90KShzaXplX3QpOwordHlwZWRlZiB2b2lkICAoKmJnZXRfcmVsZWFzZV90KSh2b2lkICopOworCisvKiBOT1RFOiBidWZzaXplIG11c3QgYmUgYSBzaWduZWQgZGF0YXR5cGUgKi8KKworI2lmIEtNUF9PU19XSU5ET1dTCisjIGlmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9BUk0KKyAgIHR5cGVkZWYga21wX2ludDMyIGJ1ZnNpemU7CisjIGVsc2UKKyAgIHR5cGVkZWYga21wX2ludDY0IGJ1ZnNpemU7CisjIGVuZGlmCisjZWxzZQorICB0eXBlZGVmIHNzaXplX3QgYnVmc2l6ZTsKKyNlbmRpZgorCisvKiBUaGUgdGhyZWUgbW9kZXMgb2Ygb3BlcmF0aW9uIGFyZSwgZmlmbyBzZWFyY2gsIGxpZm8gc2VhcmNoLCBhbmQgYmVzdC1maXQgKi8KKwordHlwZWRlZiBlbnVtIGJnZXRfbW9kZSB7CisgICAgYmdldF9tb2RlX2ZpZm8gPSAwLAorICAgIGJnZXRfbW9kZV9saWZvID0gMSwKKyAgICBiZ2V0X21vZGVfYmVzdCA9IDIKK30gYmdldF9tb2RlX3Q7CisKKworc3RhdGljIHZvaWQgICAgYnBvb2woIGttcF9pbmZvX3QgKnRoLCB2b2lkICpidWZmZXIsIGJ1ZnNpemUgbGVuKTsKK3N0YXRpYyB2b2lkICAgKmJnZXQoIGttcF9pbmZvX3QgKnRoLCBidWZzaXplIHNpemUpOworc3RhdGljIHZvaWQgICAqYmdldHooIGttcF9pbmZvX3QgKnRoLCBidWZzaXplIHNpemUpOworc3RhdGljIHZvaWQgICAqYmdldHIoIGttcF9pbmZvX3QgKnRoLCB2b2lkICpidWZmZXIsIGJ1ZnNpemUgbmV3c2l6ZSk7CitzdGF0aWMgdm9pZCAgICBicmVsKCBrbXBfaW5mb190ICp0aCwgdm9pZCAqYnVmKTsKK3N0YXRpYyB2b2lkICAgIGJlY3RsKCAga21wX2luZm9fdCAqdGgsIGJnZXRfY29tcGFjdF90IGNvbXBhY3QsIGJnZXRfYWNxdWlyZV90IGFjcXVpcmUsIGJnZXRfcmVsZWFzZV90IHJlbGVhc2UsIGJ1ZnNpemUgcG9vbF9pbmNyICk7CisKKyNpZmRlZiBLTVBfREVCVUcKK3N0YXRpYyB2b2lkICAgIGJzdGF0cygga21wX2luZm9fdCAqdGgsIGJ1ZnNpemUgKmN1cmFsbG9jLCBidWZzaXplICp0b3RmcmVlLCBidWZzaXplICptYXhmcmVlLCBsb25nICpuZ2V0LCBsb25nICpucmVsKTsKK3N0YXRpYyB2b2lkICAgIGJzdGF0c2UoIGttcF9pbmZvX3QgKnRoLCBidWZzaXplICpwb29sX2luY3IsIGxvbmcgKm5wb29sLCBsb25nICpucGdldCwgbG9uZyAqbnByZWwsIGxvbmcgKm5kZ2V0LCBsb25nICpuZHJlbCk7CitzdGF0aWMgdm9pZCAgICBidWZkdW1wKCBrbXBfaW5mb190ICp0aCwgdm9pZCAqYnVmKTsKK3N0YXRpYyB2b2lkICAgIGJwb29sZCgga21wX2luZm9fdCAqdGgsIHZvaWQgKnBvb2wsIGludCBkdW1wYWxsb2MsIGludCBkdW1wZnJlZSk7CitzdGF0aWMgaW50ICAgICBicG9vbHYoIGttcF9pbmZvX3QgKnRoLCB2b2lkICpwb29sKTsKKyNlbmRpZgorCisvKiBCR0VUIENPTkZJR1VSQVRJT04gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQnVmZmVyIGFsbG9jYXRpb24gc2l6ZSBxdWFudHVtOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGwgYnVmZmVycyBhbGxvY2F0ZWQgYXJlIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGUgb2YgdGhpcyBzaXplLiAgVGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVVNUIGJlIGEgcG93ZXIgb2YgdHdvLiAqLworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9uIElBLTMyIGFyY2hpdGVjdHVyZSB3aXRoICBMaW51eCogT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbGxvYygpIGRvZXMgbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuc3VyZSAxNiBieXRlIGFsaWdubW5lbnQgKi8KKworI2lmIEtNUF9BUkNIX1g4NiB8fCAhS01QX0hBVkVfUVVBRAorCisjZGVmaW5lIFNpemVRdWFudCAgIDgKKyNkZWZpbmUgQWxpZ25UeXBlICAgZG91YmxlCisKKyNlbHNlCisKKyNkZWZpbmUgU2l6ZVF1YW50ICAgMTYKKyNkZWZpbmUgQWxpZ25UeXBlICAgX1F1YWQKKworI2VuZGlmCisKKyNkZWZpbmUgQnVmU3RhdHMgICAgMSAgICAgICAgICAgICAgICAgLyogRGVmaW5lIHRoaXMgc3ltYm9sIHRvIGVuYWJsZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnN0YXRzKCkgZnVuY3Rpb24gd2hpY2ggY2FsY3VsYXRlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdG90YWwgZnJlZSBzcGFjZSBpbiB0aGUgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvb2wsIHRoZSBsYXJnZXN0IGF2YWlsYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIGFuZCB0aGUgdG90YWwgc3BhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudGx5IGFsbG9jYXRlZC4gKi8KKworI2lmZGVmIEtNUF9ERUJVRworCisjZGVmaW5lIEJ1ZkR1bXAgICAgIDEgICAgICAgICAgICAgICAgIC8qIERlZmluZSB0aGlzIHN5bWJvbCB0byBlbmFibGUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJwb29sZCgpIGZ1bmN0aW9uIHdoaWNoIGR1bXBzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJzIGluIGEgYnVmZmVyIHBvb2wuICovCisKKyNkZWZpbmUgQnVmVmFsaWQgICAgMSAgICAgICAgICAgICAgICAgLyogRGVmaW5lIHRoaXMgc3ltYm9sIHRvIGVuYWJsZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnBvb2x2KCkgZnVuY3Rpb24gZm9yIHZhbGlkYXRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBidWZmZXIgcG9vbC4gKi8KKworI2RlZmluZSBEdW1wRGF0YSAgICAxICAgICAgICAgICAgICAgICAvKiBEZWZpbmUgdGhpcyBzeW1ib2wgdG8gZW5hYmxlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZkdW1wKCkgZnVuY3Rpb24gd2hpY2ggYWxsb3dzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1bXBpbmcgdGhlIGNvbnRlbnRzIG9mIGFuIGFsbG9jYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBmcmVlIGJ1ZmZlci4gKi8KKyNpZmRlZiBOT1RfVVNFRF9OT1cKKworI2RlZmluZSBGcmVlV2lwZSAgICAxICAgICAgICAgICAgICAgICAvKiBXaXBlIGZyZWUgYnVmZmVycyB0byBhIGd1YXJhbnRlZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiBvZiBnYXJiYWdlIHRvIHRyaXAgdXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzY3JlYW50cyB3aG8gYXR0ZW1wdCB0byB1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcnMgaW50byByZWxlYXNlZCBidWZmZXJzLiAqLworCisjZGVmaW5lIEJlc3RGaXQgICAgIDEgICAgICAgICAgICAgICAgIC8qIFVzZSBhIGJlc3QgZml0IGFsZ29yaXRobSB3aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaGluZyBmb3Igc3BhY2UgZm9yIGFuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRpb24gcmVxdWVzdC4gIFRoaXMgdXNlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkgbW9yZSBlZmZpY2llbnRseSwgYnV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRpb24gd2lsbCBiZSBtdWNoIHNsb3dlci4gKi8KKyNlbmRpZiAvKiBOT1RfVVNFRF9OT1cgKi8KKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKworCitzdGF0aWMgYnVmc2l6ZSBiZ2V0X2Jpbl9zaXplWyBdID0geworICAgIDAsCisvLyAgICAxIDw8IDYsICAgIC8qIC41IENhY2hlIGxpbmUgKi8KKyAgICAxIDw8IDcsICAgIC8qIDEgQ2FjaGUgbGluZSwgbmV3ICovCisgICAgMSA8PCA4LCAgICAvKiAyIENhY2hlIGxpbmVzICovCisgICAgMSA8PCA5LCAgICAvKiA0IENhY2hlIGxpbmVzLCBuZXcgKi8KKyAgICAxIDw8IDEwLCAgIC8qIDggQ2FjaGUgbGluZXMgKi8KKyAgICAxIDw8IDExLCAgIC8qIDE2IENhY2hlIGxpbmVzLCBuZXcgKi8KKyAgICAxIDw8IDEyLAorICAgIDEgPDwgMTMsICAgLyogbmV3ICovCisgICAgMSA8PCAxNCwKKyAgICAxIDw8IDE1LCAgIC8qIG5ldyAqLworICAgIDEgPDwgMTYsCisgICAgMSA8PCAxNywKKyAgICAxIDw8IDE4LAorICAgIDEgPDwgMTksCisgICAgMSA8PCAyMCwgICAgLyogIDFNQiAqLworICAgIDEgPDwgMjEsICAgIC8qICAyTUIgKi8KKyAgICAxIDw8IDIyLCAgICAvKiAgNE1CICovCisgICAgMSA8PCAyMywgICAgLyogIDhNQiAqLworICAgIDEgPDwgMjQsICAgIC8qIDE2TUIgKi8KKyAgICAxIDw8IDI1LCAgICAvKiAzMk1CICovCit9OworCisjZGVmaW5lIE1BWF9CR0VUX0JJTlMgICAoaW50KShzaXplb2YoYmdldF9iaW5fc2l6ZSkgLyBzaXplb2YoYnVmc2l6ZSkpCisKK3N0cnVjdCBiZmhlYWQ7CisKKy8qICBEZWNsYXJlIHRoZSBpbnRlcmZhY2UsIGluY2x1ZGluZyB0aGUgcmVxdWVzdGVkIGJ1ZmZlciBzaXplIHR5cGUsCisgICAgYnVmc2l6ZS4gICovCisKKy8qIFF1ZXVlIGxpbmtzICovCisKK3R5cGVkZWYgc3RydWN0IHFsaW5rcyB7CisgICAgc3RydWN0IGJmaGVhZCAqZmxpbms7ICAgICAgICAgICAgIC8qIEZvcndhcmQgbGluayAqLworICAgIHN0cnVjdCBiZmhlYWQgKmJsaW5rOyAgICAgICAgICAgICAvKiBCYWNrd2FyZCBsaW5rICovCit9IHFsaW5rc190OworCisvKiBIZWFkZXIgaW4gYWxsb2NhdGVkIGFuZCBmcmVlIGJ1ZmZlcnMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgYmhlYWQyIHsKKyAgICBrbXBfaW5mb190ICpidGhyOyAgICAgICAgICAgICAgICAgLyogVGhlIHRocmVhZCB3aGljaCBvd25zIHRoZSBidWZmZXIgcG9vbCAqLworICAgIGJ1ZnNpemUgICAgIHByZXZmcmVlOyAgICAgICAgICAgICAvKiBSZWxhdGl2ZSBsaW5rIGJhY2sgdG8gcHJldmlvdXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSBidWZmZXIgaW4gbWVtb3J5IG9yIDAgaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMgYnVmZmVyIGlzIGFsbG9jYXRlZC4gICovCisgICAgYnVmc2l6ZSAgICAgYnNpemU7ICAgICAgICAgICAgICAgIC8qIEJ1ZmZlciBzaXplOiBwb3NpdGl2ZSBpZiBmcmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWdhdGl2ZSBpZiBhbGxvY2F0ZWQuICovCit9IGJoZWFkMl90OworCisvKiBNYWtlIHN1cmUgdGhlIGJoZWFkIHN0cnVjdHVyZSBpcyBhIG11bHRpcGxlIG9mIFNpemVRdWFudCBpbiBzaXplLiAqLworCit0eXBlZGVmIHVuaW9uIGJoZWFkIHsKKyAgICBLTVBfQUxJR04oIFNpemVRdWFudCApCisgICAgQWxpZ25UeXBlICAgICAgICAgICBiX2FsaWduOworICAgIGNoYXIgICAgICAgICAgICAgICAgYl9wYWRbIHNpemVvZihiaGVhZDJfdCkgKyAoU2l6ZVF1YW50IC0gKHNpemVvZihiaGVhZDJfdCkgJSBTaXplUXVhbnQpKSBdOworICAgIGJoZWFkMl90ICAgICAgICAgICAgYmI7Cit9IGJoZWFkX3Q7CisjZGVmaW5lIEJIKHApICAgKChiaGVhZF90ICopIChwKSkKKworLyogIEhlYWRlciBpbiBkaXJlY3RseSBhbGxvY2F0ZWQgYnVmZmVycyAoYnkgYWNxZmNuKSAqLworCit0eXBlZGVmIHN0cnVjdCBiZGhlYWQKK3sKKyAgICBidWZzaXplIHRzaXplOyAgICAgICAgICAgICAgICAgICAgLyogVG90YWwgc2l6ZSwgaW5jbHVkaW5nIG92ZXJoZWFkICovCisgICAgYmhlYWRfdCBiaDsgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbW1vbiBoZWFkZXIgKi8KK30gYmRoZWFkX3Q7CisjZGVmaW5lIEJESChwKSAgKChiZGhlYWRfdCAqKSAocCkpCisKKy8qIEhlYWRlciBpbiBmcmVlIGJ1ZmZlcnMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgYmZoZWFkIHsKKyAgICBiaGVhZF90ICBiaDsgICAgICAgICAgICAgICAgICAgICAgLyogQ29tbW9uIGFsbG9jYXRlZC9mcmVlIGhlYWRlciAqLworICAgIHFsaW5rc190IHFsOyAgICAgICAgICAgICAgICAgICAgICAvKiBMaW5rcyBvbiBmcmVlIGxpc3QgKi8KK30gYmZoZWFkX3Q7CisjZGVmaW5lIEJGSChwKSAgKChiZmhlYWRfdCAqKSAocCkpCisKK3R5cGVkZWYgc3RydWN0IHRocl9kYXRhIHsKKyAgICBiZmhlYWRfdCBmcmVlbGlzdFsgTUFYX0JHRVRfQklOUyBdOworI2lmIEJ1ZlN0YXRzCisgICAgc2l6ZV90IHRvdGFsbG9jOyAgICAgICAgICAgICAgIC8qIFRvdGFsIHNwYWNlIGN1cnJlbnRseSBhbGxvY2F0ZWQgKi8KKyAgICBsb25nIG51bWdldCwgbnVtcmVsOyAgICAgICAgICAgLyogTnVtYmVyIG9mIGJnZXQoKSBhbmQgYnJlbCgpIGNhbGxzICovCisgICAgbG9uZyBudW1wYmxrOyAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBwb29sIGJsb2NrcyAqLworICAgIGxvbmcgbnVtcGdldCwgbnVtcHJlbDsgICAgICAgICAvKiBOdW1iZXIgb2YgYmxvY2sgZ2V0cyBhbmQgcmVscyAqLworICAgIGxvbmcgbnVtZGdldCwgbnVtZHJlbDsgICAgICAgICAvKiBOdW1iZXIgb2YgZGlyZWN0IGdldHMgYW5kIHJlbHMgKi8KKyNlbmRpZiAvKiBCdWZTdGF0cyAqLworCisgICAgLyogQXV0b21hdGljIGV4cGFuc2lvbiBibG9jayBtYW5hZ2VtZW50IGZ1bmN0aW9ucyAqLworICAgIGJnZXRfY29tcGFjdF90IGNvbXBmY247CisgICAgYmdldF9hY3F1aXJlX3QgYWNxZmNuOworICAgIGJnZXRfcmVsZWFzZV90IHJlbGZjbjsKKworICAgIGJnZXRfbW9kZV90ICAgIG1vZGU7ICAgICAgICAgICAgICAvKiB3aGF0IGFsbG9jYXRpb24gbW9kZSB0byB1c2U/ICovCisKKyAgICBidWZzaXplIGV4cF9pbmNyOyAgICAgICAgICAgICAgICAgLyogRXhwYW5zaW9uIGJsb2NrIHNpemUgKi8KKyAgICBidWZzaXplIHBvb2xfbGVuOyAgICAgICAgICAgICAgICAgLyogMDogbm8gYnBvb2wgY2FsbHMgaGF2ZSBiZWVuIG1hZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTE6IG5vdCBhbGwgcG9vbCBibG9ja3MgYXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc2FtZSBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4wOiAoY29tbW9uKSBibG9jayBzaXplIGZvciBhbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJwb29sIGNhbGxzIG1hZGUgc28gZmFyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgYmZoZWFkX3QgKiBsYXN0X3Bvb2w7ICAgICAgICAgICAgIC8qIExhc3QgcG9vbCBvd25lZCBieSB0aGlzIHRocmVhZCAoZGVsYXkgZGVhbG9jYXRpb24pICovCit9IHRocl9kYXRhX3Q7CisKKy8qICBNaW5pbXVtIGFsbG9jYXRpb24gcXVhbnR1bTogKi8KKworI2RlZmluZSBRTFNpemUgIChzaXplb2YocWxpbmtzX3QpKQorI2RlZmluZSBTaXplUSAgICgoU2l6ZVF1YW50ID4gUUxTaXplKSA/IFNpemVRdWFudCA6IFFMU2l6ZSkKKyNkZWZpbmUgTWF4U2l6ZSAoYnVmc2l6ZSkoIH4gKCAoIChidWZzaXplKSggMSApIDw8ICggc2l6ZW9mKCBidWZzaXplICkgKiBDSEFSX0JJVCAtIDEgKSApIHwgKCBTaXplUXVhbnQgLSAxICkgKSApCisgICAgLy8gTWF4aW11biBmb3IgdGhlIHJlcXVlc3RlZCBzaXplLgorCisvKiBFbmQgc2VudGluZWw6IHZhbHVlIHBsYWNlZCBpbiBic2l6ZSBmaWVsZCBvZiBkdW1teSBibG9jayBkZWxpbWl0aW5nCisgICBlbmQgb2YgcG9vbCBibG9jay4gIFRoZSBtb3N0IG5lZ2F0aXZlIG51bWJlciB3aGljaCB3aWxsICBmaXQgIGluICBhCisgICBidWZzaXplLCBkZWZpbmVkIGluIGEgd2F5IHRoYXQgdGhlIGNvbXBpbGVyIHdpbGwgYWNjZXB0LiAqLworCisjZGVmaW5lIEVTZW50ICAgKChidWZzaXplKSAoLSgoKCgoYnVmc2l6ZSkxKTw8KChpbnQpc2l6ZW9mKGJ1ZnNpemUpKjgtMikpLTEpKjIpLTIpKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogVGhyZWFkIERhdGEgbWFuYWdlbWVudCByb3V0aW5lcyAqLworCitzdGF0aWMgaW50CitiZ2V0X2dldF9iaW4oIGJ1ZnNpemUgc2l6ZSApCit7CisgICAgLy8gYmluYXJ5IGNob3AgYmlucworICAgIGludCBsbyA9IDAsIGhpID0gTUFYX0JHRVRfQklOUyAtIDE7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzaXplID4gMCApOworCisgICAgd2hpbGUgKCAoaGkgLSBsbykgPiAxICkgeworICAgICAgICBpbnQgbWlkID0gKGxvICsgaGkpID4+IDE7CisgICAgICAgIGlmIChzaXplIDwgYmdldF9iaW5fc2l6ZVsgbWlkIF0pCisgICAgICAgICAgICBoaSA9IG1pZCAtIDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGxvID0gbWlkOworICAgIH0KKworICAgIEtNUF9ERUJVR19BU1NFUlQoIChsbyA+PSAwKSAmJiAobG8gPCBNQVhfQkdFVF9CSU5TKSApOworCisgICAgcmV0dXJuIGxvOworfQorCitzdGF0aWMgdm9pZAorc2V0X3Rocl9kYXRhKCBrbXBfaW5mb190ICp0aCApCit7CisgICAgaW50IGk7CisgICAgdGhyX2RhdGFfdCAqZGF0YTsKKworICAgIGRhdGEgPQorICAgICAgICAodGhyX2RhdGFfdCAqKSgKKyAgICAgICAgICAgICggISB0aC0+dGgudGhfbG9jYWwuYmdldF9kYXRhICkgPyBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKCAqZGF0YSApICkgOiB0aC0+dGgudGhfbG9jYWwuYmdldF9kYXRhCisgICAgICAgICk7CisKKyAgICBtZW1zZXQoIGRhdGEsICdcMCcsIHNpemVvZiggKmRhdGEgKSApOworCisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9CR0VUX0JJTlM7ICsraSkgeworICAgICAgICBkYXRhLT5mcmVlbGlzdFsgaSBdLnFsLmZsaW5rID0gJiBkYXRhLT5mcmVlbGlzdFsgaSBdOworICAgICAgICBkYXRhLT5mcmVlbGlzdFsgaSBdLnFsLmJsaW5rID0gJiBkYXRhLT5mcmVlbGlzdFsgaSBdOworICAgIH0KKworICAgIHRoLT50aC50aF9sb2NhbC5iZ2V0X2RhdGEgPSBkYXRhOworICAgIHRoLT50aC50aF9sb2NhbC5iZ2V0X2xpc3QgPSAwOworI2lmICEgVVNFX0NNUF9YQ0hHX0ZPUl9CR0VUCisjaWZkZWYgVVNFX1FVRVVJTkdfTE9DS19GT1JfQkdFVAorICAgIF9fa21wX2luaXRfbG9jayggJiB0aC0+dGgudGhfbG9jYWwuYmdldF9sb2NrICk7CisjZWxzZQorICAgIF9fa21wX2luaXRfYm9vdHN0cmFwX2xvY2soICYgdGgtPnRoLnRoX2xvY2FsLmJnZXRfbG9jayApOworI2VuZGlmIC8qIFVTRV9MT0NLX0ZPUl9CR0VUICovCisjZW5kaWYgLyogISBVU0VfQ01QX1hDSEdfRk9SX0JHRVQgKi8KK30KKworc3RhdGljIHRocl9kYXRhX3QgKgorZ2V0X3Rocl9kYXRhKCBrbXBfaW5mb190ICp0aCApCit7CisgICAgdGhyX2RhdGFfdCAqZGF0YTsKKworICAgIGRhdGEgPSAodGhyX2RhdGFfdCAqKSB0aC0+dGgudGhfbG9jYWwuYmdldF9kYXRhOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggZGF0YSAhPSAwICk7CisKKyAgICByZXR1cm4gZGF0YTsKK30KKworCisjaWZkZWYgS01QX0RFQlVHCisKK3N0YXRpYyB2b2lkCitfX2ttcF9iZ2V0X3ZhbGlkYXRlX3F1ZXVlKCBrbXBfaW5mb190ICp0aCApCit7CisgICAgLyogTk9URTogYXNzdW1lIHRoYXQgdGhlIGdsb2JhbF9sb2NrIGlzIGhlbGQgKi8KKworICAgIHZvaWQgKnAgPSAodm9pZCAqKSB0aC0+dGgudGhfbG9jYWwuYmdldF9saXN0OworCisgICAgd2hpbGUgKHAgIT0gMCkgeworICAgICAgICBiZmhlYWRfdCAqYiA9IEJGSCgoKGNoYXIgKikgcCkgLSBzaXplb2YoYmhlYWRfdCkpOworCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoYi0+YmguYmIuYnNpemUgIT0gMCk7CisgICAgICAgIHAgPSAodm9pZCAqKSBiLT5xbC5mbGluazsKKyAgICB9Cit9CisKKyNlbmRpZgorCisvKiBXYWxrIHRoZSBmcmVlIGxpc3QgYW5kIHJlbGVhc2UgdGhlIGVucXVldWVkIGJ1ZmZlcnMgKi8KKworc3RhdGljIHZvaWQKK19fa21wX2JnZXRfZGVxdWV1ZSgga21wX2luZm9fdCAqdGggKQoreworICAgIHZvaWQgKnAgPSBUQ1JfU1lOQ19QVFIodGgtPnRoLnRoX2xvY2FsLmJnZXRfbGlzdCk7CisKKyAgICBpZiAocCAhPSAwKSB7CisgICAgICAgICNpZiBVU0VfQ01QX1hDSEdfRk9SX0JHRVQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2b2xhdGlsZSB2b2lkICpvbGRfdmFsdWUgPSBUQ1JfU1lOQ19QVFIodGgtPnRoLnRoX2xvY2FsLmJnZXRfbGlzdCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9QVFIoCisgICAgICAgICAgICAgICAgICAgICYgdGgtPnRoLnRoX2xvY2FsLmJnZXRfbGlzdCwgb2xkX3ZhbHVlLCBOVUxMICkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICAgICAgICAgICAgICBvbGRfdmFsdWUgPSBUQ1JfU1lOQ19QVFIodGgtPnRoLnRoX2xvY2FsLmJnZXRfbGlzdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHAgPSAodm9pZCAqKSBvbGRfdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICNlbHNlIC8qICEgVVNFX0NNUF9YQ0hHX0ZPUl9CR0VUICovCisgICAgICAgICAgICAjaWZkZWYgVVNFX1FVRVVJTkdfTE9DS19GT1JfQkdFVAorICAgICAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jayggJiB0aC0+dGgudGhfbG9jYWwuYmdldF9sb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCh0aCkgKTsKKyAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiB0aC0+dGgudGhfbG9jYWwuYmdldF9sb2NrICk7CisgICAgICAgICAgICAjZW5kaWYgLyogVVNFX1FVRVVJTkdfTE9DS19GT1JfQkdFVCAqLworCisgICAgICAgICAgICAgcCA9ICh2b2lkICopIHRoLT50aC50aF9sb2NhbC5iZ2V0X2xpc3Q7CisgICAgICAgICAgICAgdGgtPnRoLnRoX2xvY2FsLmJnZXRfbGlzdCA9IDA7CisKKyAgICAgICAgICAgICNpZmRlZiBVU0VfUVVFVUlOR19MT0NLX0ZPUl9CR0VUCisgICAgICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCAmIHRoLT50aC50aF9sb2NhbC5iZ2V0X2xvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKHRoKSApOworICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIHRoLT50aC50aF9sb2NhbC5iZ2V0X2xvY2sgKTsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAjZW5kaWYgLyogVVNFX0NNUF9YQ0hHX0ZPUl9CR0VUICovCisKKyAgICAgICAgLyogQ2hlY2sgYWdhaW4gdG8gbWFrZSBzdXJlIHRoZSBsaXN0IGlzIG5vdCBlbXB0eSAqLworCisgICAgICAgIHdoaWxlIChwICE9IDApIHsKKyAgICAgICAgICAgIHZvaWQgKmJ1ZiA9IHA7CisgICAgICAgICAgICBiZmhlYWRfdCAqYiA9IEJGSCgoKGNoYXIgKikgcCkgLSBzaXplb2YoYmhlYWRfdCkpOworCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBiLT5iaC5iYi5ic2l6ZSAhPSAwICk7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAoIChrbXBfdWludHB0cl90KVRDUl9QVFIoYi0+YmguYmIuYnRocikgJiB+MSApID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrbXBfdWludHB0cl90KXRoICk7IC8vIGNsZWFyIHBvc3NpYmxlIG1hcmsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGItPnFsLmJsaW5rID09IDAgKTsKKworICAgICAgICAgICAgcCA9ICh2b2lkICopIGItPnFsLmZsaW5rOworCisgICAgICAgICAgICBicmVsKCB0aCwgYnVmICk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIENoYWluIHRvZ2V0aGVyIHRoZSBmcmVlIGJ1ZmZlcnMgYnkgdXNpbmcgdGhlIHRocmVhZCBvd25lciBmaWVsZCAqLworCitzdGF0aWMgdm9pZAorX19rbXBfYmdldF9lbnF1ZXVlKCBrbXBfaW5mb190ICp0aCwgdm9pZCAqYnVmCisjaWZkZWYgVVNFX1FVRVVJTkdfTE9DS19GT1JfQkdFVAorICAgICAgICAgICAgICAgICAgICAsIGttcF9pbnQzMiByZWxfZ3RpZAorI2VuZGlmCisgICAgICAgICAgICAgICAgICApCit7CisgICAgYmZoZWFkX3QgKmIgPSBCRkgoKChjaGFyICopIGJ1ZikgLSBzaXplb2YoYmhlYWRfdCkpOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggYi0+YmguYmIuYnNpemUgIT0gMCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoICggKGttcF91aW50cHRyX3QpVENSX1BUUihiLT5iaC5iYi5idGhyKSAmIH4xICkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgIChrbXBfdWludHB0cl90KXRoICk7IC8vIGNsZWFyIHBvc3NpYmxlIG1hcmsKKworICAgIGItPnFsLmJsaW5rID0gMDsKKworICAgIEtDX1RSQUNFKCAxMCwgKCAiX19rbXBfYmdldF9lbnF1ZXVlOiBtb3ZpbmcgYnVmZmVyIHRvIFQjJWQgbGlzdFxuIiwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGggKSApICk7CisKKyNpZiBVU0VfQ01QX1hDSEdfRk9SX0JHRVQKKyAgICB7CisgICAgICAgIHZvbGF0aWxlIHZvaWQgKm9sZF92YWx1ZSA9IFRDUl9QVFIodGgtPnRoLnRoX2xvY2FsLmJnZXRfbGlzdCk7CisgICAgICAgIC8qIHRoZSBuZXh0IHBvaW50ZXIgbXVzdCBiZSBzZXQgYmVmb3JlIHNldHRpbmcgYmdldF9saXN0IHRvIGJ1ZiB0byBhdm9pZAorICAgICAgICAgICBleHBvc2luZyBhIGJyb2tlbiBsaXN0IHRvIG90aGVyIHRocmVhZHMsIGV2ZW4gZm9yIGFuIGluc3RhbnQuICovCisgICAgICAgIGItPnFsLmZsaW5rID0gQkZIKCBvbGRfdmFsdWUgKTsKKworICAgICAgICB3aGlsZSAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1BUUigKKyAgICAgICAgICAgICYgdGgtPnRoLnRoX2xvY2FsLmJnZXRfbGlzdCwgb2xkX3ZhbHVlLCBidWYgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgICAgIG9sZF92YWx1ZSA9IFRDUl9QVFIodGgtPnRoLnRoX2xvY2FsLmJnZXRfbGlzdCk7CisgICAgICAgICAgICAvKiB0aGUgbmV4dCBwb2ludGVyIG11c3QgYmUgc2V0IGJlZm9yZSBzZXR0aW5nIGJnZXRfbGlzdCB0byBidWYgdG8gYXZvaWQKKyAgICAgICAgICAgICAgIGV4cG9zaW5nIGEgYnJva2VuIGxpc3QgdG8gb3RoZXIgdGhyZWFkcywgZXZlbiBmb3IgYW4gaW5zdGFudC4gKi8KKyAgICAgICAgICAgIGItPnFsLmZsaW5rID0gQkZIKCBvbGRfdmFsdWUgKTsKKyAgICAgICAgfQorICAgIH0KKyNlbHNlIC8qICEgVVNFX0NNUF9YQ0hHX0ZPUl9CR0VUICovCisjIGlmZGVmIFVTRV9RVUVVSU5HX0xPQ0tfRk9SX0JHRVQKKyAgICBfX2ttcF9hY3F1aXJlX2xvY2soICYgdGgtPnRoLnRoX2xvY2FsLmJnZXRfbG9jaywgcmVsX2d0aWQgKTsKKyMgZWxzZQorICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgdGgtPnRoLnRoX2xvY2FsLmJnZXRfbG9jayApOworICMgZW5kaWYKKworICAgIGItPnFsLmZsaW5rID0gQkZIKCB0aC0+dGgudGhfbG9jYWwuYmdldF9saXN0ICk7CisgICAgdGgtPnRoLnRoX2xvY2FsLmJnZXRfbGlzdCA9ICh2b2lkICopIGJ1ZjsKKworIyBpZmRlZiBVU0VfUVVFVUlOR19MT0NLX0ZPUl9CR0VUCisgICAgX19rbXBfcmVsZWFzZV9sb2NrKCAmIHRoLT50aC50aF9sb2NhbC5iZ2V0X2xvY2ssIHJlbF9ndGlkICk7CisjIGVsc2UKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIHRoLT50aC50aF9sb2NhbC5iZ2V0X2xvY2sgKTsKKyMgZW5kaWYKKyNlbmRpZiAvKiBVU0VfQ01QX1hDSEdfRk9SX0JHRVQgKi8KK30KKworLyogaW5zZXJ0IGJ1ZmZlciBiYWNrIG9udG8gYSBuZXcgZnJlZWxpc3QgKi8KKworc3RhdGljIHZvaWQKK19fa21wX2JnZXRfaW5zZXJ0X2ludG9fZnJlZWxpc3QoIHRocl9kYXRhX3QgKnRociwgYmZoZWFkX3QgKmIgKQoreworICAgIGludCBiaW47CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCAoKHNpemVfdCliICkgJSBTaXplUXVhbnQgPT0gMCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGItPmJoLmJiLmJzaXplICUgU2l6ZVF1YW50ID09IDAgKTsKKworICAgIGJpbiA9IGJnZXRfZ2V0X2JpbiggYi0+YmguYmIuYnNpemUgKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQodGhyLT5mcmVlbGlzdFsgYmluIF0ucWwuYmxpbmstPnFsLmZsaW5rID09ICZ0aHItPmZyZWVsaXN0WyBiaW4gXSk7CisgICAgS01QX0RFQlVHX0FTU0VSVCh0aHItPmZyZWVsaXN0WyBiaW4gXS5xbC5mbGluay0+cWwuYmxpbmsgPT0gJnRoci0+ZnJlZWxpc3RbIGJpbiBdKTsKKworICAgIGItPnFsLmZsaW5rID0gJnRoci0+ZnJlZWxpc3RbIGJpbiBdOworICAgIGItPnFsLmJsaW5rID0gdGhyLT5mcmVlbGlzdFsgYmluIF0ucWwuYmxpbms7CisKKyAgICB0aHItPmZyZWVsaXN0WyBiaW4gXS5xbC5ibGluayA9IGI7CisgICAgYi0+cWwuYmxpbmstPnFsLmZsaW5rID0gYjsKK30KKworLyogdW5saW5rIHRoZSBidWZmZXIgZnJvbSB0aGUgb2xkIGZyZWVsaXN0ICovCisKK3N0YXRpYyB2b2lkCitfX2ttcF9iZ2V0X3JlbW92ZV9mcm9tX2ZyZWVsaXN0KCBiZmhlYWRfdCAqYiApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVChiLT5xbC5ibGluay0+cWwuZmxpbmsgPT0gYik7CisgICAgS01QX0RFQlVHX0FTU0VSVChiLT5xbC5mbGluay0+cWwuYmxpbmsgPT0gYik7CisKKyAgICBiLT5xbC5ibGluay0+cWwuZmxpbmsgPSBiLT5xbC5mbGluazsKKyAgICBiLT5xbC5mbGluay0+cWwuYmxpbmsgPSBiLT5xbC5ibGluazsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qICBHRVQgU1RBVFMgLS0gY2hlY2sgaW5mbyBvbiBmcmVlIGxpc3QgKi8KKworc3RhdGljIHZvaWQKK2JjaGVjayggIGttcF9pbmZvX3QgKnRoLCBidWZzaXplICptYXhfZnJlZSwgYnVmc2l6ZSAqdG90YWxfZnJlZSApCit7CisgICAgdGhyX2RhdGFfdCAqdGhyID0gZ2V0X3Rocl9kYXRhKCB0aCApOworICAgIGludCBiaW47CisKKyAgICAqdG90YWxfZnJlZSA9ICptYXhfZnJlZSA9IDA7CisKKyAgICBmb3IgKGJpbiA9IDA7IGJpbiA8IE1BWF9CR0VUX0JJTlM7ICsrYmluKSB7CisgICAgICAgIGJmaGVhZF90ICpiLCAqYmVzdDsKKworICAgICAgICBiZXN0ID0gJnRoci0+ZnJlZWxpc3RbIGJpbiBdOworICAgICAgICBiID0gYmVzdC0+cWwuZmxpbms7CisKKyAgICAgICAgd2hpbGUgKGIgIT0gJnRoci0+ZnJlZWxpc3RbIGJpbiBdKSB7CisgICAgICAgICAgICAqdG90YWxfZnJlZSArPSAoYi0+YmguYmIuYnNpemUgLSBzaXplb2YoIGJoZWFkX3QgKSk7CisgICAgICAgICAgICBpZiAoKGJlc3QgPT0gJnRoci0+ZnJlZWxpc3RbIGJpbiBdKSB8fCAoYi0+YmguYmIuYnNpemUgPCBiZXN0LT5iaC5iYi5ic2l6ZSkpCisgICAgICAgICAgICAgICAgYmVzdCA9IGI7CisKKyAgICAgICAgICAgIC8qIExpbmsgdG8gbmV4dCBidWZmZXIgKi8KKyAgICAgICAgICAgIGIgPSBiLT5xbC5mbGluazsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgqbWF4X2ZyZWUgPCBiZXN0LT5iaC5iYi5ic2l6ZSkKKyAgICAgICAgICAgICptYXhfZnJlZSA9IGJlc3QtPmJoLmJiLmJzaXplOworICAgIH0KKworICAgIGlmICgqbWF4X2ZyZWUgPiAoYnVmc2l6ZSlzaXplb2YoIGJoZWFkX3QgKSkKKyAgICAgICAgKm1heF9mcmVlIC09IHNpemVvZiggYmhlYWRfdCApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogIEJHRVQgIC0tICBBbGxvY2F0ZSBhIGJ1ZmZlci4gICovCisKK3N0YXRpYyB2b2lkICoKK2JnZXQoICBrbXBfaW5mb190ICp0aCwgYnVmc2l6ZSByZXF1ZXN0ZWRfc2l6ZSApCit7CisgICAgdGhyX2RhdGFfdCAqdGhyID0gZ2V0X3Rocl9kYXRhKCB0aCApOworICAgIGJ1ZnNpemUgc2l6ZSA9IHJlcXVlc3RlZF9zaXplOworICAgIGJmaGVhZF90ICpiOworICAgIHZvaWQgKmJ1ZjsKKyAgICBpbnQgY29tcGFjdHNlcSA9IDA7CisgICAgaW50IHVzZV9ibGluayA9IDA7CisvKiBGb3IgQmVzdEZpdCAqLworICAgIGJmaGVhZF90ICpiZXN0OworCisgICAgaWYgKCBzaXplIDwgMCB8fCBzaXplICsgc2l6ZW9mKCBiaGVhZF90ICkgPiBNYXhTaXplICkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9OyAvLyBpZgorCisgICAgX19rbXBfYmdldF9kZXF1ZXVlKCB0aCApOyAgICAgICAgIC8qIFJlbGVhc2UgYW55IHF1ZXVlZCBidWZmZXJzICovCisKKyAgICBpZiAoc2l6ZSA8IChidWZzaXplKVNpemVRKSB7ICAgICAgLyogTmVlZCBhdCBsZWFzdCByb29tIGZvciB0aGUgKi8KKyAgICAgICAgc2l6ZSA9IFNpemVROyAgICAgICAgICAgICAgICAgLyogICAgcXVldWUgbGlua3MuICAqLworICAgIH0KKyAgICAjaWYgZGVmaW5lZCggU2l6ZVF1YW50ICkgJiYgKCBTaXplUXVhbnQgPiAxICkKKyAgICAgICAgc2l6ZSA9IChzaXplICsgKFNpemVRdWFudCAtIDEpKSAmICh+KFNpemVRdWFudCAtIDEpKTsKKyAgICAjZW5kaWYKKworICAgIHNpemUgKz0gc2l6ZW9mKGJoZWFkX3QpOyAgICAgLyogQWRkIG92ZXJoZWFkIGluIGFsbG9jYXRlZCBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gc2l6ZSByZXF1aXJlZC4gKi8KKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzaXplID49IDAgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzaXplICUgU2l6ZVF1YW50ID09IDAgKTsKKworICAgIHVzZV9ibGluayA9ICggdGhyLT5tb2RlID09IGJnZXRfbW9kZV9saWZvICk7CisKKyAgICAvKiBJZiBhIGNvbXBhY3QgZnVuY3Rpb24gd2FzIHByb3ZpZGVkIGluIHRoZSBjYWxsIHRvIGJlY3RsKCksIHdyYXAKKyAgICAgICBhIGxvb3AgYXJvdW5kIHRoZSBhbGxvY2F0aW9uIHByb2Nlc3MgIHRvICBhbGxvdyAgY29tcGFjdGlvbiAgdG8KKyAgICAgICBpbnRlcnZlbmUgaW4gY2FzZSB3ZSBkb24ndCBmaW5kIGEgc3VpdGFibGUgYnVmZmVyIGluIHRoZSBjaGFpbi4gKi8KKworICAgIGZvciAoOzspIHsKKyAgICAgICAgaW50IGJpbjsKKworICAgICAgICBmb3IgKGJpbiA9IGJnZXRfZ2V0X2Jpbiggc2l6ZSApOyBiaW4gPCBNQVhfQkdFVF9CSU5TOyArK2JpbikgeworICAgICAgICAgICAgLyogTGluayB0byBuZXh0IGJ1ZmZlciAqLworICAgICAgICAgICAgYiA9ICggdXNlX2JsaW5rID8gdGhyLT5mcmVlbGlzdFsgYmluIF0ucWwuYmxpbmsgOiB0aHItPmZyZWVsaXN0WyBiaW4gXS5xbC5mbGluayApOworCisgICAgICAgICAgICBpZiAodGhyLT5tb2RlID09IGJnZXRfbW9kZV9iZXN0KSB7CisgICAgICAgICAgICAgICAgYmVzdCA9ICZ0aHItPmZyZWVsaXN0WyBiaW4gXTsKKworICAgICAgICAgICAgICAgIC8qIFNjYW4gdGhlIGZyZWUgbGlzdCBzZWFyY2hpbmcgZm9yIHRoZSBmaXJzdCBidWZmZXIgYmlnIGVub3VnaAorICAgICAgICAgICAgICAgICAgIHRvIGhvbGQgdGhlIHJlcXVlc3RlZCBzaXplIGJ1ZmZlci4gKi8KKworICAgICAgICAgICAgICAgIHdoaWxlIChiICE9ICZ0aHItPmZyZWVsaXN0WyBiaW4gXSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYi0+YmguYmIuYnNpemUgPj0gKGJ1ZnNpemUpIHNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYmVzdCA9PSAmdGhyLT5mcmVlbGlzdFsgYmluIF0pIHx8IChiLT5iaC5iYi5ic2l6ZSA8IGJlc3QtPmJoLmJiLmJzaXplKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3QgPSBiOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLyogTGluayB0byBuZXh0IGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgICBiID0gKCB1c2VfYmxpbmsgPyBiLT5xbC5ibGluayA6IGItPnFsLmZsaW5rICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGIgPSBiZXN0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3aGlsZSAoYiAhPSAmdGhyLT5mcmVlbGlzdFsgYmluIF0pIHsKKyAgICAgICAgICAgICAgICBpZiAoKGJ1ZnNpemUpIGItPmJoLmJiLmJzaXplID49IChidWZzaXplKSBzaXplKSB7CisKKyAgICAgICAgICAgICAgICAgICAgLyogQnVmZmVyICBpcyBiaWcgZW5vdWdoIHRvIHNhdGlzZnkgIHRoZSByZXF1ZXN0LiAgQWxsb2NhdGUgaXQKKyAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIGNhbGxlci4gIFdlIG11c3QgZGVjaWRlIHdoZXRoZXIgdGhlIGJ1ZmZlciBpcyAgbGFyZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgZW5vdWdoICB0byAgc3BsaXQgIGludG8gIHRoZSBwYXJ0IGdpdmVuIHRvIHRoZSBjYWxsZXIgYW5kIGEKKyAgICAgICAgICAgICAgICAgICAgICAgZnJlZSBidWZmZXIgdGhhdCByZW1haW5zIG9uIHRoZSBmcmVlIGxpc3QsIG9yICB3aGV0aGVyICB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgZW50aXJlICBidWZmZXIgIHNob3VsZCAgYmUgIHJlbW92ZWQgIGZyb20gdGhlIGZyZWUgbGlzdCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4gdG8gdGhlIGNhbGxlciBpbiBpdHMgZW50aXJldHkuICAgV2UgIG9ubHkgIHNwbGl0ICB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyIGlmIGVub3VnaCByb29tIHJlbWFpbnMgZm9yIGEgaGVhZGVyIHBsdXMgdGhlIG1pbmltdW0KKyAgICAgICAgICAgICAgICAgICAgICAgcXVhbnR1bSBvZiBhbGxvY2F0aW9uLiAqLworCisgICAgICAgICAgICAgICAgICAgIGlmICgoYi0+YmguYmIuYnNpemUgLSAoYnVmc2l6ZSkgc2l6ZSkgPiAoYnVmc2l6ZSkoU2l6ZVEgKyAoc2l6ZW9mKGJoZWFkX3QpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJoZWFkX3QgKmJhLCAqYm47CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhID0gQkgoKChjaGFyICopIGIpICsgKGItPmJoLmJiLmJzaXplIC0gKGJ1ZnNpemUpIHNpemUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJuID0gQkgoKChjaGFyICopIGJhKSArIHNpemUpOworCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGJuLT5iYi5wcmV2ZnJlZSA9PSBiLT5iaC5iYi5ic2l6ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN1YnRyYWN0IHNpemUgZnJvbSBsZW5ndGggb2YgZnJlZSBibG9jay4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGItPmJoLmJiLmJzaXplIC09IChidWZzaXplKSBzaXplOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBMaW5rIGFsbG9jYXRlZCBidWZmZXIgdG8gdGhlIHByZXZpb3VzIGZyZWUgYnVmZmVyLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgYmEtPmJiLnByZXZmcmVlID0gYi0+YmguYmIuYnNpemU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBsdWcgbmVnYXRpdmUgc2l6ZSBpbnRvIHVzZXIgYnVmZmVyLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgYmEtPmJiLmJzaXplID0gLXNpemU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hcmsgdGhpcyBidWZmZXIgYXMgb3duZWQgYnkgdGhpcyB0aHJlYWQuICovCisgICAgICAgICAgICAgICAgICAgICAgICBUQ1dfUFRSKGJhLT5iYi5idGhyLCB0aCk7ICAgLy8gbm90IGFuIGFsbG9jYXRlZCBhZGRyZXNzIChkbyBub3QgbWFyayBpdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hcmsgYnVmZmVyIGFmdGVyIHRoaXMgb25lIG5vdCBwcmVjZWRlZCBieSBmcmVlIGJsb2NrLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgYm4tPmJiLnByZXZmcmVlID0gMDsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogdW5saW5rIHRoZSBidWZmZXIgZnJvbSB0aGUgb2xkIGZyZWVsaXN0LCBhbmQgcmVpbnNlcnQgaXQgaW50byB0aGUgbmV3IGZyZWVsaXN0ICovCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9iZ2V0X3JlbW92ZV9mcm9tX2ZyZWVsaXN0KCBiICk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9iZ2V0X2luc2VydF9pbnRvX2ZyZWVsaXN0KCB0aHIsIGIgKTsKKyNpZiBCdWZTdGF0cworICAgICAgICAgICAgICAgICAgICAgICAgdGhyLT50b3RhbGxvYyArPSAoc2l6ZV90KSBzaXplOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyLT5udW1nZXQrKzsgICAgICAgIC8qIEluY3JlbWVudCBudW1iZXIgb2YgYmdldCgpIGNhbGxzICovCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiA9ICh2b2lkICopICgoKChjaGFyICopIGJhKSArIHNpemVvZihiaGVhZF90KSkpOworICAgICAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKChzaXplX3QpYnVmKSAlIFNpemVRdWFudCA9PSAwICk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnVmOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYmhlYWRfdCAqYmE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhID0gQkgoKChjaGFyICopIGIpICsgYi0+YmguYmIuYnNpemUpOworCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGJhLT5iYi5wcmV2ZnJlZSA9PSBiLT5iaC5iYi5ic2l6ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBidWZmZXIgaXNuJ3QgYmlnIGVub3VnaCB0byBzcGxpdC4gIEdpdmUgIHRoZSAgd2hvbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoZWJhbmcgdG8gdGhlIGNhbGxlciBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGZyZWUgbGlzdC4gKi8KKworICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9iZ2V0X3JlbW92ZV9mcm9tX2ZyZWVsaXN0KCBiICk7CisjaWYgQnVmU3RhdHMKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoci0+dG90YWxsb2MgKz0gKHNpemVfdCkgYi0+YmguYmIuYnNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHItPm51bWdldCsrOyAgICAgICAgLyogSW5jcmVtZW50IG51bWJlciBvZiBiZ2V0KCkgY2FsbHMgKi8KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgLyogTmVnYXRlIHNpemUgdG8gbWFyayBidWZmZXIgYWxsb2NhdGVkLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgYi0+YmguYmIuYnNpemUgPSAtKGItPmJoLmJiLmJzaXplKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogTWFyayB0aGlzIGJ1ZmZlciBhcyBvd25lZCBieSB0aGlzIHRocmVhZC4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIFRDV19QVFIoYmEtPmJiLmJ0aHIsIHRoKTsgICAvLyBub3QgYW4gYWxsb2NhdGVkIGFkZHJlc3MgKGRvIG5vdCBtYXJrIGl0KQorICAgICAgICAgICAgICAgICAgICAgICAgLyogWmVybyB0aGUgYmFjayBwb2ludGVyIGluIHRoZSBuZXh0IGJ1ZmZlciBpbiBtZW1vcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGluZGljYXRlIHRoYXQgdGhpcyBidWZmZXIgaXMgYWxsb2NhdGVkLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgYmEtPmJiLnByZXZmcmVlID0gMDsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogR2l2ZSB1c2VyIGJ1ZmZlciBzdGFydGluZyBhdCBxdWV1ZSBsaW5rcy4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiA9ICAodm9pZCAqKSAmKGItPnFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoICgoc2l6ZV90KWJ1ZikgJSBTaXplUXVhbnQgPT0gMCApOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIExpbmsgdG8gbmV4dCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICBiID0gKCB1c2VfYmxpbmsgPyBiLT5xbC5ibGluayA6IGItPnFsLmZsaW5rICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBXZSBmYWlsZWQgdG8gZmluZCBhIGJ1ZmZlci4gIElmIHRoZXJlJ3MgYSBjb21wYWN0ICBmdW5jdGlvbgorICAgICAgICAgICBkZWZpbmVkLCAgbm90aWZ5ICBpdCAgb2YgdGhlIHNpemUgcmVxdWVzdGVkLiAgSWYgaXQgcmV0dXJucworICAgICAgICAgICBUUlVFLCB0cnkgdGhlIGFsbG9jYXRpb24gYWdhaW4uICovCisKKyAgICAgICAgaWYgKCh0aHItPmNvbXBmY24gPT0gMCkgfHwgKCEoKnRoci0+Y29tcGZjbikoc2l6ZSwgKytjb21wYWN0c2VxKSkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLyogTm8gYnVmZmVyIGF2YWlsYWJsZSB3aXRoIHJlcXVlc3RlZCBzaXplIGZyZWUuICovCisKKyAgICAvKiBEb24ndCBnaXZlIHVwIHlldCAtLSBsb29rIGluIHRoZSByZXNlcnZlIHN1cHBseS4gKi8KKworICAgIGlmICh0aHItPmFjcWZjbiAhPSAwKSB7CisgICAgICAgIGlmIChzaXplID4gKGJ1ZnNpemUpICh0aHItPmV4cF9pbmNyIC0gc2l6ZW9mKGJoZWFkX3QpKSkgeworCisgICAgICAgICAgICAvKiBSZXF1ZXN0ICBpcyAgdG9vICBsYXJnZSAgdG8gIGZpdCBpbiBhIHNpbmdsZSBleHBhbnNpb24KKyAgICAgICAgICAgICAgIGJsb2NrLiAgVHJ5IHRvIHNhdGlzeSBpdCBieSBhIGRpcmVjdCBidWZmZXIgYWNxdWlzaXRpb24uICovCisKKyAgICAgICAgICAgIGJkaGVhZF90ICpiZGg7CisKKyAgICAgICAgICAgIHNpemUgKz0gc2l6ZW9mKGJkaGVhZF90KSAtIHNpemVvZihiaGVhZF90KTsKKworICAgICAgICAgICAgS0VfVFJBQ0UoIDEwLCAoIiUlJSUlJSBNQUxMT0MoICVkIClcbiIsIChpbnQpIHNpemUgKSApOworCisgICAgICAgICAgICAvKiByaWNocnlhbiAqLworICAgICAgICAgICAgYmRoID0gQkRIKCgqdGhyLT5hY3FmY24pKChidWZzaXplKSBzaXplKSk7CisgICAgICAgICAgICBpZiAoYmRoICE9IE5VTEwpIHsKKworICAgICAgICAgICAgICAgIC8qICBNYXJrIHRoZSBidWZmZXIgc3BlY2lhbCBieSBzZXR0aW5nIHRoZSBzaXplIGZpZWxkCisgICAgICAgICAgICAgICAgICAgIG9mIGl0cyBoZWFkZXIgdG8gemVyby4gICovCisgICAgICAgICAgICAgICAgYmRoLT5iaC5iYi5ic2l6ZSA9IDA7CisKKyAgICAgICAgICAgICAgICAvKiBNYXJrIHRoaXMgYnVmZmVyIGFzIG93bmVkIGJ5IHRoaXMgdGhyZWFkLiAqLworICAgICAgICAgICAgICAgIFRDV19QVFIoYmRoLT5iaC5iYi5idGhyLCB0aCk7ICAvLyBkb24ndCBtYXJrIGJ1ZmZlciBhcyBhbGxvY2F0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgZGlyZWN0IGJ1ZmZlciBuZXZlciBnb2VzIHRvIGZyZWUgbGlzdAorICAgICAgICAgICAgICAgIGJkaC0+YmguYmIucHJldmZyZWUgPSAwOworICAgICAgICAgICAgICAgIGJkaC0+dHNpemUgPSBzaXplOworI2lmIEJ1ZlN0YXRzCisgICAgICAgICAgICAgICAgdGhyLT50b3RhbGxvYyArPSAoc2l6ZV90KSBzaXplOworICAgICAgICAgICAgICAgIHRoci0+bnVtZ2V0Kys7ICAgICAgICAvKiBJbmNyZW1lbnQgbnVtYmVyIG9mIGJnZXQoKSBjYWxscyAqLworICAgICAgICAgICAgICAgIHRoci0+bnVtZGdldCsrOyAgICAgICAvKiBEaXJlY3QgYmdldCgpIGNhbGwgY291bnQgKi8KKyNlbmRpZgorICAgICAgICAgICAgICAgIGJ1ZiA9ICAodm9pZCAqKSAoYmRoICsgMSk7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKChzaXplX3QpYnVmKSAlIFNpemVRdWFudCA9PSAwICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAvKiAgVHJ5IHRvIG9idGFpbiBhIG5ldyBleHBhbnNpb24gYmxvY2sgKi8KKworICAgICAgICAgICAgdm9pZCAqbmV3cG9vbDsKKworICAgICAgICAgICAgS0VfVFJBQ0UoIDEwLCAoIiUlJSUlJSBNQUxMT0NCKCAlZCApXG4iLCAoaW50KSB0aHItPmV4cF9pbmNyICkgKTsKKworICAgICAgICAgICAgLyogcmljaHJ5YW4gKi8KKyAgICAgICAgICAgIG5ld3Bvb2wgPSAoKnRoci0+YWNxZmNuKSgoYnVmc2l6ZSkgdGhyLT5leHBfaW5jcik7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAoKHNpemVfdCluZXdwb29sKSAlIFNpemVRdWFudCA9PSAwICk7CisgICAgICAgICAgICBpZiAobmV3cG9vbCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgYnBvb2woIHRoLCBuZXdwb29sLCB0aHItPmV4cF9pbmNyKTsKKyAgICAgICAgICAgICAgICBidWYgPSAgYmdldCggdGgsIHJlcXVlc3RlZF9zaXplKTsgIC8qIFRoaXMgY2FuJ3QsIEkgc2F5LCBjYW4ndCBnZXQgaW50byBhIGxvb3AuICovCisgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qICBTdGlsbCBubyBidWZmZXIgYXZhaWxhYmxlICovCisKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyogIEJHRVRaICAtLSAgQWxsb2NhdGUgYSBidWZmZXIgYW5kIGNsZWFyIGl0cyBjb250ZW50cyB0byB6ZXJvLiAgV2UgY2xlYXIKKyAgICAgICAgICAgICAgIHRoZSAgZW50aXJlICBjb250ZW50cyAgb2YgIHRoZSBidWZmZXIgdG8gemVybywgbm90IGp1c3QgdGhlCisgICAgICAgICAgICAgICByZWdpb24gcmVxdWVzdGVkIGJ5IHRoZSBjYWxsZXIuICovCisKK3N0YXRpYyB2b2lkICoKK2JnZXR6KCAga21wX2luZm9fdCAqdGgsIGJ1ZnNpemUgc2l6ZSApCit7CisgICAgY2hhciAqYnVmID0gKGNoYXIgKikgYmdldCggdGgsIHNpemUpOworCisgICAgaWYgKGJ1ZiAhPSBOVUxMKSB7CisgICAgICAgIGJoZWFkX3QgKmI7CisgICAgICAgIGJ1ZnNpemUgcnNpemU7CisKKyAgICAgICAgYiA9IEJIKGJ1ZiAtIHNpemVvZihiaGVhZF90KSk7CisgICAgICAgIHJzaXplID0gLShiLT5iYi5ic2l6ZSk7CisgICAgICAgIGlmIChyc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICBiZGhlYWRfdCAqYmQ7CisKKyAgICAgICAgICAgIGJkID0gQkRIKGJ1ZiAtIHNpemVvZihiZGhlYWRfdCkpOworICAgICAgICAgICAgcnNpemUgPSBiZC0+dHNpemUgLSAoYnVmc2l6ZSkgc2l6ZW9mKGJkaGVhZF90KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJzaXplIC09IHNpemVvZihiaGVhZF90KTsKKyAgICAgICAgfQorCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQocnNpemUgPj0gc2l6ZSk7CisKKyAgICAgICAgKHZvaWQpIG1lbXNldChidWYsIDAsIChidWZzaXplKSByc2l6ZSk7CisgICAgfQorICAgIHJldHVybiAoKHZvaWQgKikgYnVmKTsKK30KKworLyogIEJHRVRSICAtLSAgUmVhbGxvY2F0ZSBhIGJ1ZmZlci4gIFRoaXMgaXMgYSBtaW5pbWFsIGltcGxlbWVudGF0aW9uLAorICAgICAgICAgICAgICAgc2ltcGx5IGluIHRlcm1zIG9mIGJyZWwoKSAgYW5kICBiZ2V0KCkuICAgSXQgIGNvdWxkICBiZQorICAgICAgICAgICAgICAgZW5oYW5jZWQgdG8gYWxsb3cgdGhlIGJ1ZmZlciB0byBncm93IGludG8gYWRqYWNlbnQgZnJlZQorICAgICAgICAgICAgICAgYmxvY2tzIGFuZCB0byBhdm9pZCBtb3ZpbmcgZGF0YSB1bm5lY2Vzc2FyaWx5LiAgKi8KKworc3RhdGljIHZvaWQgKgorYmdldHIoICBrbXBfaW5mb190ICp0aCwgdm9pZCAqYnVmLCBidWZzaXplIHNpemUpCit7CisgICAgdm9pZCAqbmJ1ZjsKKyAgICBidWZzaXplIG9zaXplOyAgICAgICAgICAgICAgICAgICAgLyogT2xkIHNpemUgb2YgYnVmZmVyICovCisgICAgYmhlYWRfdCAqYjsKKworICAgIG5idWYgPSBiZ2V0KCB0aCwgc2l6ZSApOworICAgIGlmICggbmJ1ZiA9PSBOVUxMICkgeyAvKiBBY3F1aXJlIG5ldyBidWZmZXIgKi8KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICggYnVmID09IE5VTEwgKSB7CisgICAgICAgIHJldHVybiBuYnVmOworICAgIH0KKyAgICBiID0gQkgoKChjaGFyICopIGJ1ZikgLSBzaXplb2YoYmhlYWRfdCkpOworICAgIG9zaXplID0gLWItPmJiLmJzaXplOworICAgIGlmIChvc2l6ZSA9PSAwKSB7CisgICAgICAgIC8qICBCdWZmZXIgYWNxdWlyZWQgZGlyZWN0bHkgdGhyb3VnaCBhY3FmY24uICovCisgICAgICAgIGJkaGVhZF90ICpiZDsKKworICAgICAgICBiZCA9IEJESCgoKGNoYXIgKikgYnVmKSAtIHNpemVvZihiZGhlYWRfdCkpOworICAgICAgICBvc2l6ZSA9IGJkLT50c2l6ZSAtIChidWZzaXplKSBzaXplb2YoYmRoZWFkX3QpOworICAgIH0gZWxzZSB7CisgICAgICAgIG9zaXplIC09IHNpemVvZihiaGVhZF90KTsKKyAgICB9OworCisgICAgS01QX0RFQlVHX0FTU0VSVChvc2l6ZSA+IDApOworCisgICAgKHZvaWQpIG1lbWNweSgoY2hhciAqKSBuYnVmLCAoY2hhciAqKSBidWYsIC8qIENvcHkgdGhlIGRhdGEgKi8KKyAgICAgICAgICAgICAoc2l6ZV90KSAoKHNpemUgPCBvc2l6ZSkgPyBzaXplIDogb3NpemUpKTsKKyAgICBicmVsKCB0aCwgYnVmICk7CisKKyAgICByZXR1cm4gbmJ1ZjsKK30KKworLyogIEJSRUwgIC0tICBSZWxlYXNlIGEgYnVmZmVyLiAgKi8KKworc3RhdGljIHZvaWQKK2JyZWwoICBrbXBfaW5mb190ICp0aCwgdm9pZCAqYnVmICkKK3sKKyAgICB0aHJfZGF0YV90ICp0aHIgPSBnZXRfdGhyX2RhdGEoIHRoICk7CisgICAgYmZoZWFkX3QgKmIsICpibjsKKyAgICBrbXBfaW5mb190ICpidGg7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKGJ1ZiAhPSBOVUxMKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCAoKHNpemVfdClidWYpICUgU2l6ZVF1YW50ID09IDAgKTsKKworICAgIGIgPSBCRkgoKChjaGFyICopIGJ1ZikgLSBzaXplb2YoYmhlYWRfdCkpOworCisgICAgaWYgKGItPmJoLmJiLmJzaXplID09IDApIHsgICAgICAgIC8qIERpcmVjdGx5LWFjcXVpcmVkIGJ1ZmZlcj8gKi8KKyAgICAgICAgYmRoZWFkX3QgKmJkaDsKKworICAgICAgICBiZGggPSBCREgoKChjaGFyICopIGJ1ZikgLSBzaXplb2YoYmRoZWFkX3QpKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChiLT5iaC5iYi5wcmV2ZnJlZSA9PSAwKTsKKyNpZiBCdWZTdGF0cworICAgICAgICB0aHItPnRvdGFsbG9jIC09IChzaXplX3QpIGJkaC0+dHNpemU7CisgICAgICAgIHRoci0+bnVtZHJlbCsrOyAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBkaXJlY3QgcmVsZWFzZXMgKi8KKyAgICAgICAgdGhyLT5udW1yZWwrKzsgICAgICAgICAgICAgICAgLyogSW5jcmVtZW50IG51bWJlciBvZiBicmVsKCkgY2FsbHMgKi8KKyNlbmRpZiAvKiBCdWZTdGF0cyAqLworI2lmZGVmIEZyZWVXaXBlCisgICAgICAgICh2b2lkKSBtZW1zZXQoKGNoYXIgKikgYnVmLCAweDU1LAorICAgICAgICAgICAgICAgICAoc2l6ZV90KSAoYmRoLT50c2l6ZSAtIHNpemVvZihiZGhlYWRfdCkpKTsKKyNlbmRpZiAvKiBGcmVlV2lwZSAqLworCisgICAgICAgIEtFX1RSQUNFKCAxMCwgKCIlJSUlJSUgRlJFRSggJXAgKVxuIiwgKHZvaWQgKikgYmRoICkgKTsKKworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aHItPnJlbGZjbiAhPSAwICk7CisgICAgICAgICgqdGhyLT5yZWxmY24pKCh2b2lkICopIGJkaCk7ICAgICAgLyogUmVsZWFzZSBpdCBkaXJlY3RseS4gKi8KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJ0aCA9IChrbXBfaW5mb190ICopKCAoa21wX3VpbnRwdHJfdClUQ1JfUFRSKGItPmJoLmJiLmJ0aHIpICYgfjEgKTsgLy8gY2xlYXIgcG9zc2libGUgbWFyayBiZWZvcmUgY29tcGFyaXNvbgorICAgIGlmICggYnRoICE9IHRoICkgeworICAgICAgICAvKiBBZGQgdGhpcyBidWZmZXIgdG8gYmUgcmVsZWFzZWQgYnkgdGhlIG93bmluZyB0aHJlYWQgbGF0ZXIgKi8KKyAgICAgICAgX19rbXBfYmdldF9lbnF1ZXVlKCBidGgsIGJ1ZgorI2lmZGVmIFVTRV9RVUVVSU5HX0xPQ0tfRk9SX0JHRVQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRoICkKKyNlbmRpZgorICAgICAgICApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogQnVmZmVyIHNpemUgbXVzdCBiZSBuZWdhdGl2ZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBidWZmZXIgaXMKKyAgICAgICBhbGxvY2F0ZWQuICovCisKKyAgICBpZiAoYi0+YmguYmIuYnNpemUgPj0gMCkgeworICAgICAgICBibiA9IE5VTEw7CisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQoYi0+YmguYmIuYnNpemUgPCAwKTsKKworICAgIC8qICBCYWNrIHBvaW50ZXIgaW4gbmV4dCBidWZmZXIgbXVzdCBiZSB6ZXJvLCBpbmRpY2F0aW5nIHRoZQorICAgICAgICBzYW1lIHRoaW5nOiAqLworCisgICAgS01QX0RFQlVHX0FTU0VSVChCSCgoY2hhciAqKSBiIC0gYi0+YmguYmIuYnNpemUpLT5iYi5wcmV2ZnJlZSA9PSAwKTsKKworI2lmIEJ1ZlN0YXRzCisgICAgdGhyLT5udW1yZWwrKzsgICAgICAgICAgICAgICAgICAgIC8qIEluY3JlbWVudCBudW1iZXIgb2YgYnJlbCgpIGNhbGxzICovCisgICAgdGhyLT50b3RhbGxvYyArPSAoc2l6ZV90KSBiLT5iaC5iYi5ic2l6ZTsKKyNlbmRpZgorCisgICAgLyogSWYgdGhlIGJhY2sgbGluayBpcyBub256ZXJvLCB0aGUgcHJldmlvdXMgYnVmZmVyIGlzIGZyZWUuICAqLworCisgICAgaWYgKGItPmJoLmJiLnByZXZmcmVlICE9IDApIHsKKyAgICAgICAgLyogVGhlIHByZXZpb3VzIGJ1ZmZlciBpcyBmcmVlLiAgQ29uc29saWRhdGUgdGhpcyBidWZmZXIgIHdpdGggIGl0CisgICAgICAgICAgIGJ5ICBhZGRpbmcgIHRoZSAgbGVuZ3RoICBvZiAgdGhpcyAgYnVmZmVyICB0byB0aGUgcHJldmlvdXMgZnJlZQorICAgICAgICAgICBidWZmZXIuICBOb3RlIHRoYXQgd2Ugc3VidHJhY3QgdGhlIHNpemUgIGluICB0aGUgIGJ1ZmZlciAgYmVpbmcKKyAgICAgICAgICAgcmVsZWFzZWQsICBzaW5jZSAgaXQncyAgbmVnYXRpdmUgdG8gaW5kaWNhdGUgdGhhdCB0aGUgYnVmZmVyIGlzCisgICAgICAgICAgIGFsbG9jYXRlZC4gKi8KKworICAgICAgICByZWdpc3RlciBidWZzaXplIHNpemUgPSBiLT5iaC5iYi5ic2l6ZTsKKworICAgICAgICAvKiBNYWtlIHRoZSBwcmV2aW91cyBidWZmZXIgdGhlIG9uZSB3ZSdyZSB3b3JraW5nIG9uLiAqLworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKEJIKChjaGFyICopIGIgLSBiLT5iaC5iYi5wcmV2ZnJlZSktPmJiLmJzaXplID09IGItPmJoLmJiLnByZXZmcmVlKTsKKyAgICAgICAgYiA9IEJGSCgoKGNoYXIgKikgYikgLSBiLT5iaC5iYi5wcmV2ZnJlZSk7CisgICAgICAgIGItPmJoLmJiLmJzaXplIC09IHNpemU7CisKKyAgICAgICAgLyogdW5saW5rIHRoZSBidWZmZXIgZnJvbSB0aGUgb2xkIGZyZWVsaXN0ICovCisgICAgICAgIF9fa21wX2JnZXRfcmVtb3ZlX2Zyb21fZnJlZWxpc3QoIGIgKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIFRoZSBwcmV2aW91cyBidWZmZXIgaXNuJ3QgYWxsb2NhdGVkLiAgTWFyayB0aGlzIGJ1ZmZlcgorICAgICAgICAgICBzaXplIGFzIHBvc2l0aXZlIChpLmUuIGZyZWUpIGFuZCBmYWxsIHRocm91Z2h0IHRvIHBsYWNlCisgICAgICAgICAgIHRoZSBidWZmZXIgb24gdGhlIGZyZWUgbGlzdCBhcyBhbiBpc29sYXRlZCBmcmVlIGJsb2NrLiAqLworCisgICAgICAgIGItPmJoLmJiLmJzaXplID0gLWItPmJoLmJiLmJzaXplOworICAgIH0KKworICAgIC8qIGluc2VydCBidWZmZXIgYmFjayBvbnRvIGEgbmV3IGZyZWVsaXN0ICovCisgICAgX19rbXBfYmdldF9pbnNlcnRfaW50b19mcmVlbGlzdCggdGhyLCBiICk7CisKKworICAgIC8qIE5vdyB3ZSBsb29rIGF0IHRoZSBuZXh0IGJ1ZmZlciBpbiBtZW1vcnksIGxvY2F0ZWQgYnkgYWR2YW5jaW5nIGZyb20KKyAgICAgICB0aGUgIHN0YXJ0ICBvZiAgdGhpcyAgYnVmZmVyICBieSBpdHMgc2l6ZSwgdG8gc2VlIGlmIHRoYXQgYnVmZmVyIGlzCisgICAgICAgZnJlZS4gIElmIGl0IGlzLCB3ZSBjb21iaW5lICB0aGlzICBidWZmZXIgIHdpdGggIHRoZSAgbmV4dCAgb25lICBpbgorICAgICAgIG1lbW9yeSwgZGVjaGFpbmluZyB0aGUgc2Vjb25kIGJ1ZmZlciBmcm9tIHRoZSBmcmVlIGxpc3QuICovCisKKyAgICBibiA9ICBCRkgoKChjaGFyICopIGIpICsgYi0+YmguYmIuYnNpemUpOworICAgIGlmIChibi0+YmguYmIuYnNpemUgPiAwKSB7CisKKyAgICAgICAgLyogVGhlIGJ1ZmZlciBpcyBmcmVlLiAgUmVtb3ZlIGl0IGZyb20gdGhlIGZyZWUgbGlzdCBhbmQgYWRkCisgICAgICAgICAgIGl0cyBzaXplIHRvIHRoYXQgb2Ygb3VyIGJ1ZmZlci4gKi8KKworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKEJIKChjaGFyICopIGJuICsgYm4tPmJoLmJiLmJzaXplKS0+YmIucHJldmZyZWUgPT0gYm4tPmJoLmJiLmJzaXplKTsKKworICAgICAgICBfX2ttcF9iZ2V0X3JlbW92ZV9mcm9tX2ZyZWVsaXN0KCBibiApOworCisgICAgICAgIGItPmJoLmJiLmJzaXplICs9IGJuLT5iaC5iYi5ic2l6ZTsKKworICAgICAgICAvKiB1bmxpbmsgdGhlIGJ1ZmZlciBmcm9tIHRoZSBvbGQgZnJlZWxpc3QsIGFuZCByZWluc2VydCBpdCBpbnRvIHRoZSBuZXcgZnJlZWxpc3QgKi8KKworICAgICAgICBfX2ttcF9iZ2V0X3JlbW92ZV9mcm9tX2ZyZWVsaXN0KCBiICk7CisgICAgICAgIF9fa21wX2JnZXRfaW5zZXJ0X2ludG9fZnJlZWxpc3QoIHRociwgYiApOworCisgICAgICAgIC8qIEZpbmFsbHksICBhZHZhbmNlICB0byAgIHRoZSAgYnVmZmVyICB0aGF0ICAgZm9sbG93cyAgdGhlICBuZXdseQorICAgICAgICAgICBjb25zb2xpZGF0ZWQgZnJlZSBibG9jay4gIFdlIG11c3Qgc2V0IGl0cyAgYmFja3BvaW50ZXIgIHRvICB0aGUKKyAgICAgICAgICAgaGVhZCAgb2YgIHRoZSAgY29uc29saWRhdGVkIGZyZWUgYmxvY2suICBXZSBrbm93IHRoZSBuZXh0IGJsb2NrCisgICAgICAgICAgIG11c3QgYmUgYW4gYWxsb2NhdGVkIGJsb2NrIGJlY2F1c2UgdGhlIHByb2Nlc3Mgb2YgcmVjb21iaW5hdGlvbgorICAgICAgICAgICBndWFyYW50ZWVzICB0aGF0ICB0d28gIGZyZWUgIGJsb2NrcyB3aWxsIG5ldmVyIGJlIGNvbnRpZ3VvdXMgaW4KKyAgICAgICAgICAgbWVtb3J5LiAgKi8KKworICAgICAgICBibiA9IEJGSCgoKGNoYXIgKikgYikgKyBiLT5iaC5iYi5ic2l6ZSk7CisgICAgfQorI2lmZGVmIEZyZWVXaXBlCisgICAgKHZvaWQpIG1lbXNldCgoKGNoYXIgKikgYikgKyBzaXplb2YoYmZoZWFkX3QpLCAweDU1LAorICAgICAgICAgICAgKHNpemVfdCkgKGItPmJoLmJiLmJzaXplIC0gc2l6ZW9mKGJmaGVhZF90KSkpOworI2VuZGlmCisgICAgS01QX0RFQlVHX0FTU0VSVChibi0+YmguYmIuYnNpemUgPCAwKTsKKworICAgIC8qIFRoZSBuZXh0IGJ1ZmZlciBpcyBhbGxvY2F0ZWQuICBTZXQgdGhlIGJhY2twb2ludGVyIGluIGl0ICB0byAgcG9pbnQKKyAgICAgICB0byB0aGlzIGJ1ZmZlcjsgdGhlIHByZXZpb3VzIGZyZWUgYnVmZmVyIGluIG1lbW9yeS4gKi8KKworICAgIGJuLT5iaC5iYi5wcmV2ZnJlZSA9IGItPmJoLmJiLmJzaXplOworCisgICAgLyogIElmICBhICBibG9jay1yZWxlYXNlIGZ1bmN0aW9uIGlzIGRlZmluZWQsIGFuZCB0aGlzIGZyZWUgYnVmZmVyCisgICAgICAgIGNvbnN0aXR1dGVzIHRoZSBlbnRpcmUgYmxvY2ssIHJlbGVhc2UgaXQuICBOb3RlIHRoYXQgIHBvb2xfbGVuCisgICAgICAgIGlzICBkZWZpbmVkICBpbiAgc3VjaCBhIHdheSB0aGF0IHRoZSB0ZXN0IHdpbGwgZmFpbCB1bmxlc3MgYWxsCisgICAgICAgIHBvb2wgYmxvY2tzIGFyZSB0aGUgc2FtZSBzaXplLiAgKi8KKworICAgIGlmICh0aHItPnJlbGZjbiAhPSAwICYmCisgICAgICAgIGItPmJoLmJiLmJzaXplID09IChidWZzaXplKSh0aHItPnBvb2xfbGVuIC0gc2l6ZW9mKGJoZWFkX3QpKSkKKyAgICB7CisjaWYgQnVmU3RhdHMKKyAgICAgICAgaWYgKHRoci0+bnVtcGJsayAhPSAxKSB7ICAgICAgICAvKiBEbyBub3QgcmVsZWFzZSB0aGUgbGFzdCBidWZmZXIgdW50aWwgZmluYWxpemF0aW9uIHRpbWUgKi8KKyNlbmRpZgorCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGItPmJoLmJiLnByZXZmcmVlID09IDApOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChCSCgoY2hhciAqKSBiICsgYi0+YmguYmIuYnNpemUpLT5iYi5ic2l6ZSA9PSBFU2VudCk7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKEJIKChjaGFyICopIGIgKyBiLT5iaC5iYi5ic2l6ZSktPmJiLnByZXZmcmVlID09IGItPmJoLmJiLmJzaXplKTsKKworICAgICAgICAgICAgLyogIFVubGluayB0aGUgYnVmZmVyIGZyb20gdGhlIGZyZWUgbGlzdCAgKi8KKyAgICAgICAgICAgIF9fa21wX2JnZXRfcmVtb3ZlX2Zyb21fZnJlZWxpc3QoIGIgKTsKKworICAgICAgICAgICAgS0VfVFJBQ0UoIDEwLCAoIiUlJSUlJSBGUkVFKCAlcCApXG4iLCAodm9pZCAqKSBiICkgKTsKKworICAgICAgICAgICAgKCp0aHItPnJlbGZjbikoYik7CisjaWYgQnVmU3RhdHMKKyAgICAgICAgICAgIHRoci0+bnVtcHJlbCsrOyAgICAgICAgICAgICAgIC8qIE5yIG9mIGV4cGFuc2lvbiBibG9jayByZWxlYXNlcyAqLworICAgICAgICAgICAgdGhyLT5udW1wYmxrLS07ICAgICAgICAgICAgICAgLyogVG90YWwgbnVtYmVyIG9mIGJsb2NrcyAqLworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0aHItPm51bXBibGsgPT0gdGhyLT5udW1wZ2V0IC0gdGhyLT5udW1wcmVsKTsKKworICAgICAgICAgICAgLyogYXZvaWQgbGVhdmluZyBzdGFsZSBsYXN0X3Bvb2wgcG9pbnRlciBhcm91bmQgaWYgaXQgaXMgYmVpbmcgZGVhbGxvY2VkICovCisgICAgICAgICAgICBpZiAodGhyLT5sYXN0X3Bvb2wgPT0gYikgdGhyLT5sYXN0X3Bvb2wgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdGhyLT5sYXN0X3Bvb2wgPSBiOworICAgICAgICB9CisjZW5kaWYgLyogQnVmU3RhdHMgKi8KKyAgICB9Cit9CisKKy8qICBCRUNUTCAgLS0gIEVzdGFibGlzaCBhdXRvbWF0aWMgcG9vbCBleHBhbnNpb24gY29udHJvbCAgKi8KKworc3RhdGljIHZvaWQKK2JlY3RsKCAga21wX2luZm9fdCAqdGgsIGJnZXRfY29tcGFjdF90IGNvbXBhY3QsIGJnZXRfYWNxdWlyZV90IGFjcXVpcmUsIGJnZXRfcmVsZWFzZV90IHJlbGVhc2UsIGJ1ZnNpemUgcG9vbF9pbmNyKQoreworICAgIHRocl9kYXRhX3QgKnRociA9IGdldF90aHJfZGF0YSggdGggKTsKKworICAgIHRoci0+Y29tcGZjbiA9IGNvbXBhY3Q7CisgICAgdGhyLT5hY3FmY24gPSBhY3F1aXJlOworICAgIHRoci0+cmVsZmNuID0gcmVsZWFzZTsKKyAgICB0aHItPmV4cF9pbmNyID0gcG9vbF9pbmNyOworfQorCisvKiAgQlBPT0wgIC0tICBBZGQgYSByZWdpb24gb2YgbWVtb3J5IHRvIHRoZSBidWZmZXIgcG9vbC4gICovCisKK3N0YXRpYyB2b2lkCiticG9vbCggIGttcF9pbmZvX3QgKnRoLCB2b2lkICpidWYsIGJ1ZnNpemUgbGVuKQoreworLyogICAgaW50IGJpbiA9IDA7ICovCisgICAgdGhyX2RhdGFfdCAqdGhyID0gZ2V0X3Rocl9kYXRhKCB0aCApOworICAgIGJmaGVhZF90ICpiID0gQkZIKGJ1Zik7CisgICAgYmhlYWRfdCAqYm47CisKKyAgICBfX2ttcF9iZ2V0X2RlcXVldWUoIHRoICk7ICAgICAgICAgLyogUmVsZWFzZSBhbnkgcXVldWVkIGJ1ZmZlcnMgKi8KKworI2lmZGVmIFNpemVRdWFudAorICAgIGxlbiAmPSB+KFNpemVRdWFudCAtIDEpOworI2VuZGlmCisgICAgaWYgKHRoci0+cG9vbF9sZW4gPT0gMCkgeworICAgICAgICB0aHItPnBvb2xfbGVuID0gbGVuOworICAgIH0gZWxzZSBpZiAobGVuICE9IHRoci0+cG9vbF9sZW4pIHsKKyAgICAgICAgdGhyLT5wb29sX2xlbiA9IC0xOworICAgIH0KKyNpZiBCdWZTdGF0cworICAgIHRoci0+bnVtcGdldCsrOyAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgYmxvY2sgYWNxdWlzaXRpb25zICovCisgICAgdGhyLT5udW1wYmxrKys7ICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBibG9ja3MgdG90YWwgKi8KKyAgICBLTVBfREVCVUdfQVNTRVJUKHRoci0+bnVtcGJsayA9PSB0aHItPm51bXBnZXQgLSB0aHItPm51bXByZWwpOworI2VuZGlmIC8qIEJ1ZlN0YXRzICovCisKKyAgICAvKiBTaW5jZSB0aGUgYmxvY2sgaXMgaW5pdGlhbGx5IG9jY3VwaWVkIGJ5IGEgc2luZ2xlIGZyZWUgIGJ1ZmZlciwKKyAgICAgICBpdCAgaGFkICBiZXR0ZXIgIG5vdCAgYmUgIChtdWNoKSBsYXJnZXIgdGhhbiB0aGUgbGFyZ2VzdCBidWZmZXIKKyAgICAgICB3aG9zZSBzaXplIHdlIGNhbiBzdG9yZSBpbiBiaGVhZC5iYi5ic2l6ZS4gKi8KKworICAgIEtNUF9ERUJVR19BU1NFUlQobGVuIC0gc2l6ZW9mKGJoZWFkX3QpIDw9IC0oKGJ1ZnNpemUpIEVTZW50ICsgMSkpOworCisgICAgLyogQ2xlYXIgIHRoZSAgYmFja3BvaW50ZXIgYXQgIHRoZSBzdGFydCBvZiB0aGUgYmxvY2sgdG8gaW5kaWNhdGUgdGhhdAorICAgICAgIHRoZXJlICBpcyAgbm8gIGZyZWUgIGJsb2NrICBwcmlvciAgdG8gIHRoaXMgICBvbmUuICAgIFRoYXQgICBibG9ja3MKKyAgICAgICByZWNvbWJpbmF0aW9uIHdoZW4gdGhlIGZpcnN0IGJsb2NrIGluIG1lbW9yeSBpcyByZWxlYXNlZC4gKi8KKworICAgIGItPmJoLmJiLnByZXZmcmVlID0gMDsKKworICAgIC8qIENyZWF0ZSBhIGR1bW15IGFsbG9jYXRlZCBidWZmZXIgYXQgdGhlIGVuZCBvZiB0aGUgcG9vbC4gIFRoaXMgZHVtbXkKKyAgICAgICBidWZmZXIgaXMgc2VlbiB3aGVuIGEgYnVmZmVyIGF0IHRoZSBlbmQgb2YgdGhlIHBvb2wgaXMgcmVsZWFzZWQgYW5kCisgICAgICAgYmxvY2tzICByZWNvbWJpbmF0aW9uICBvZiAgdGhlIGxhc3QgYnVmZmVyIHdpdGggdGhlIGR1bW15IGJ1ZmZlciBhdAorICAgICAgIHRoZSBlbmQuICBUaGUgbGVuZ3RoIGluIHRoZSBkdW1teSBidWZmZXIgIGlzICBzZXQgIHRvICB0aGUgIGxhcmdlc3QKKyAgICAgICBuZWdhdGl2ZSAgbnVtYmVyICB0byAgZGVub3RlICB0aGUgIGVuZCAgb2YgIHRoZSBwb29sIGZvciBkaWFnbm9zdGljCisgICAgICAgcm91dGluZXMgKHRoaXMgc3BlY2lmaWMgdmFsdWUgaXMgIG5vdCAgY291bnRlZCAgb24gIGJ5ICB0aGUgIGFjdHVhbAorICAgICAgIGFsbG9jYXRpb24gYW5kIHJlbGVhc2UgZnVuY3Rpb25zKS4gKi8KKworICAgIGxlbiAtPSBzaXplb2YoYmhlYWRfdCk7CisgICAgYi0+YmguYmIuYnNpemUgPSAoYnVmc2l6ZSkgbGVuOworICAgIC8qIFNldCB0aGUgb3duZXIgb2YgdGhpcyBidWZmZXIgKi8KKyAgICBUQ1dfUFRSKCBiLT5iaC5iYi5idGhyLCAoa21wX2luZm9fdCopKChrbXBfdWludHB0cl90KXRoIHwgMSkgKTsgLy8gbWFyayB0aGUgYnVmZmVyIGFzIGFsbG9jYXRlZCBhZGRyZXNzCisKKyAgICAvKiBDaGFpbiB0aGUgbmV3IGJsb2NrIHRvIHRoZSBmcmVlIGxpc3QuICovCisgICAgX19rbXBfYmdldF9pbnNlcnRfaW50b19mcmVlbGlzdCggdGhyLCBiICk7CisKKyNpZmRlZiBGcmVlV2lwZQorICAgICh2b2lkKSBtZW1zZXQoKChjaGFyICopIGIpICsgc2l6ZW9mKGJmaGVhZF90KSwgMHg1NSwKKyAgICAgICAgICAgICAoc2l6ZV90KSAobGVuIC0gc2l6ZW9mKGJmaGVhZF90KSkpOworI2VuZGlmCisgICAgYm4gPSBCSCgoKGNoYXIgKikgYikgKyBsZW4pOworICAgIGJuLT5iYi5wcmV2ZnJlZSA9IChidWZzaXplKSBsZW47CisgICAgLyogRGVmaW5pdGlvbiBvZiBFU2VudCBhc3N1bWVzIHR3bydzIGNvbXBsZW1lbnQhICovCisgICAgS01QX0RFQlVHX0FTU0VSVCggKH4wKSA9PSAtMSAmJiAoYm4gIT0gMCkgKTsKKworICAgIGJuLT5iYi5ic2l6ZSA9IEVTZW50OworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogIEJGUkVFRCAgLS0gIER1bXAgdGhlIGZyZWUgbGlzdHMgZm9yIHRoaXMgdGhyZWFkLiAqLworCitzdGF0aWMgdm9pZAorYmZyZWVkKCAga21wX2luZm9fdCAqdGggKQoreworICAgIGludCBiaW4gPSAwLCBjb3VudCA9IDA7CisgICAgaW50IGd0aWQgPSBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aCApOworICAgIHRocl9kYXRhX3QgKnRociA9IGdldF90aHJfZGF0YSggdGggKTsKKworI2lmIEJ1ZlN0YXRzCisgICAgX19rbXBfcHJpbnRmX25vX2xvY2soIl9fa21wX3ByaW50cG9vbDogVCMlZCB0b3RhbD0lIiBLTVBfVUlOVDY0X1NQRUMgIiBnZXQ9JSIgS01QX0lOVDY0X1NQRUMgIiByZWw9JSIgXAorICAgICAgICAgICBLTVBfSU5UNjRfU1BFQyAiIHBibGs9JSIgS01QX0lOVDY0X1NQRUMgIiBwZ2V0PSUiIEtNUF9JTlQ2NF9TUEVDICIgcHJlbD0lIiBLTVBfSU5UNjRfU1BFQyBcCisgICAgICAgICAgICIgZGdldD0lIiBLTVBfSU5UNjRfU1BFQyAiIGRyZWw9JSIgS01QX0lOVDY0X1NQRUMgIlxuIiwKKyAgICAgICAgICAgZ3RpZCwgKGttcF91aW50NjQpIHRoci0+dG90YWxsb2MsCisgICAgICAgICAgIChrbXBfaW50NjQpIHRoci0+bnVtZ2V0LCAgKGttcF9pbnQ2NCkgdGhyLT5udW1yZWwsCisgICAgICAgICAgIChrbXBfaW50NjQpIHRoci0+bnVtcGJsaywKKyAgICAgICAgICAgKGttcF9pbnQ2NCkgdGhyLT5udW1wZ2V0LCAoa21wX2ludDY0KSB0aHItPm51bXByZWwsCisgICAgICAgICAgIChrbXBfaW50NjQpIHRoci0+bnVtZGdldCwgKGttcF9pbnQ2NCkgdGhyLT5udW1kcmVsICk7CisjZW5kaWYKKworICAgIGZvciAoYmluID0gMDsgYmluIDwgTUFYX0JHRVRfQklOUzsgKytiaW4pIHsKKyAgICAgICAgYmZoZWFkX3QgKmI7CisKKyAgICAgICAgZm9yIChiID0gdGhyLT5mcmVlbGlzdFsgYmluIF0ucWwuZmxpbms7IGIgIT0gJnRoci0+ZnJlZWxpc3RbIGJpbiBdOyBiID0gYi0+cWwuZmxpbmspIHsKKyAgICAgICAgICAgIGJ1ZnNpemUgYnMgPSBiLT5iaC5iYi5ic2l6ZTsKKworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggYi0+cWwuYmxpbmstPnFsLmZsaW5rID09IGIgKTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGItPnFsLmZsaW5rLT5xbC5ibGluayA9PSBiICk7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBicyA+IDAgKTsKKworICAgICAgICAgICAgY291bnQgKz0gMTsKKworICAgICAgICAgICAgX19rbXBfcHJpbnRmX25vX2xvY2soIl9fa21wX3ByaW50cG9vbDogVCMlZCBGcmVlIGJsb2NrOiAweCVwIHNpemUgJTZsZCBieXRlcy5cbiIsIGd0aWQsIGIsIChsb25nKSBicyApOworI2lmZGVmIEZyZWVXaXBlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hhciAqbGVyciA9ICgoY2hhciAqKSBiKSArIHNpemVvZihiZmhlYWRfdCk7CisgICAgICAgICAgICAgICAgaWYgKChicyA+IHNpemVvZihiZmhlYWRfdCkpICYmICgoKmxlcnIgIT0gMHg1NSkgfHwgKG1lbWNtcChsZXJyLCBsZXJyICsgMSwgKHNpemVfdCkgKGJzIC0gKHNpemVvZihiZmhlYWRfdCkgKyAxKSkpICE9IDApKSkgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9wcmludGZfbm9fbG9jayggIl9fa21wX3ByaW50cG9vbDogVCMlZCAgICAgKENvbnRlbnRzIG9mIGFib3ZlIGZyZWUgYmxvY2sgaGF2ZSBiZWVuIG92ZXJzdG9yZWQuKVxuIiwgZ3RpZCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGNvdW50ID09IDApCisgICAgICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCJfX2ttcF9wcmludHBvb2w6IFQjJWQgTm8gZnJlZSBibG9ja3NcbiIsIGd0aWQgKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZmRlZiBLTVBfREVCVUcKKworI2lmIEJ1ZlN0YXRzCisKKy8qICBCU1RBVFMgIC0tICBSZXR1cm4gYnVmZmVyIGFsbG9jYXRpb24gZnJlZSBzcGFjZSBzdGF0aXN0aWNzLiAgKi8KKworc3RhdGljIHZvaWQKK2JzdGF0cyggIGttcF9pbmZvX3QgKnRoLCBidWZzaXplICpjdXJhbGxvYywgIGJ1ZnNpemUgKnRvdGZyZWUsICBidWZzaXplICptYXhmcmVlLCBsb25nICpuZ2V0LCBsb25nICpucmVsKQoreworICAgIGludCBiaW4gPSAwOworICAgIHRocl9kYXRhX3QgKnRociA9IGdldF90aHJfZGF0YSggdGggKTsKKworICAgICpuZ2V0ID0gdGhyLT5udW1nZXQ7CisgICAgKm5yZWwgPSB0aHItPm51bXJlbDsKKyAgICAqY3VyYWxsb2MgPSAoYnVmc2l6ZSkgdGhyLT50b3RhbGxvYzsKKyAgICAqdG90ZnJlZSA9IDA7CisgICAgKm1heGZyZWUgPSAtMTsKKworICAgIGZvciAoYmluID0gMDsgYmluIDwgTUFYX0JHRVRfQklOUzsgKytiaW4pIHsKKyAgICAgICAgYmZoZWFkX3QgKmIgPSB0aHItPmZyZWVsaXN0WyBiaW4gXS5xbC5mbGluazsKKworICAgICAgICB3aGlsZSAoYiAhPSAmdGhyLT5mcmVlbGlzdFsgYmluIF0pIHsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoYi0+YmguYmIuYnNpemUgPiAwKTsKKyAgICAgICAgICAgICp0b3RmcmVlICs9IGItPmJoLmJiLmJzaXplOworICAgICAgICAgICAgaWYgKGItPmJoLmJiLmJzaXplID4gKm1heGZyZWUpIHsKKyAgICAgICAgICAgICAgICAqbWF4ZnJlZSA9IGItPmJoLmJiLmJzaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYiA9IGItPnFsLmZsaW5rOyAgICAgICAgICAgICAgLyogTGluayB0byBuZXh0IGJ1ZmZlciAqLworICAgICAgICB9CisgICAgfQorfQorCisvKiAgQlNUQVRTRSAgLS0gIFJldHVybiBleHRlbmRlZCBzdGF0aXN0aWNzICAqLworCitzdGF0aWMgdm9pZAorYnN0YXRzZSggIGttcF9pbmZvX3QgKnRoLCBidWZzaXplICpwb29sX2luY3IsIGxvbmcgKm5wb29sLCBsb25nICpucGdldCwgbG9uZyAqbnByZWwsIGxvbmcgKm5kZ2V0LCBsb25nICpuZHJlbCkKK3sKKyAgICB0aHJfZGF0YV90ICp0aHIgPSBnZXRfdGhyX2RhdGEoIHRoICk7CisKKyAgICAqcG9vbF9pbmNyID0gKHRoci0+cG9vbF9sZW4gPCAwKSA/IC10aHItPmV4cF9pbmNyIDogdGhyLT5leHBfaW5jcjsKKyAgICAqbnBvb2wgPSB0aHItPm51bXBibGs7CisgICAgKm5wZ2V0ID0gdGhyLT5udW1wZ2V0OworICAgICpucHJlbCA9IHRoci0+bnVtcHJlbDsKKyAgICAqbmRnZXQgPSB0aHItPm51bWRnZXQ7CisgICAgKm5kcmVsID0gdGhyLT5udW1kcmVsOworfQorCisjZW5kaWYgLyogQnVmU3RhdHMgKi8KKworLyogIEJVRkRVTVAgIC0tICBEdW1wIHRoZSBkYXRhIGluIGEgYnVmZmVyLiAgVGhpcyBpcyBjYWxsZWQgd2l0aCB0aGUgIHVzZXIKKyAgICAgICAgICAgICAgICAgZGF0YSBwb2ludGVyLCBhbmQgYmFja3MgdXAgdG8gdGhlIGJ1ZmZlciBoZWFkZXIuICBJdCB3aWxsCisgICAgICAgICAgICAgICAgIGR1bXAgZWl0aGVyIGEgZnJlZSBibG9jayBvciBhbiBhbGxvY2F0ZWQgb25lLiAgKi8KKworc3RhdGljIHZvaWQKK2J1ZmR1bXAoICBrbXBfaW5mb190ICp0aCwgdm9pZCAqYnVmICkKK3sKKyAgICBiZmhlYWRfdCAqYjsKKyAgICB1bnNpZ25lZCBjaGFyICpiZHVtcDsKKyAgICBidWZzaXplIGJkbGVuOworCisgICAgYiA9IEJGSCgoKGNoYXIgKikgYnVmKSAtIHNpemVvZihiaGVhZF90KSk7CisgICAgS01QX0RFQlVHX0FTU0VSVChiLT5iaC5iYi5ic2l6ZSAhPSAwKTsKKyAgICBpZiAoYi0+YmguYmIuYnNpemUgPCAwKSB7CisgICAgICAgIGJkdW1wID0gKHVuc2lnbmVkIGNoYXIgKikgYnVmOworICAgICAgICBiZGxlbiA9ICgtYi0+YmguYmIuYnNpemUpIC0gKGJ1ZnNpemUpIHNpemVvZihiaGVhZF90KTsKKyAgICB9IGVsc2UgeworICAgICAgICBiZHVtcCA9ICh1bnNpZ25lZCBjaGFyICopICgoKGNoYXIgKikgYikgKyBzaXplb2YoYmZoZWFkX3QpKTsKKyAgICAgICAgYmRsZW4gPSBiLT5iaC5iYi5ic2l6ZSAtIChidWZzaXplKSBzaXplb2YoYmZoZWFkX3QpOworICAgIH0KKworICAgIHdoaWxlIChiZGxlbiA+IDApIHsKKyAgICAgICAgaW50IGksIGR1cGVzID0gMDsKKyAgICAgICAgYnVmc2l6ZSBsID0gYmRsZW47CisgICAgICAgIGNoYXIgYmhleFs1MF0sIGJhc2NpaVsyMF07CisKKyAgICAgICAgaWYgKGwgPiAxNikgeworICAgICAgICAgICAgbCA9IDE2OworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykgeworICAgICAgICAgICAgKHZvaWQpIHNwcmludGYoYmhleCArIGkgKiAzLCAiJTAyWCAiLCBiZHVtcFtpXSk7CisgICAgICAgICAgICBpZiAoYmR1bXBbaV0gPiAweDIwICYmIGJkdW1wW2ldIDwgMHg3RikKKyAgICAgICAgICAgICAgICBiYXNjaWlbIGkgXSA9IGJkdW1wWyBpIF07CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYmFzY2lpWyBpIF0gPSAnICc7CisgICAgICAgIH0KKyAgICAgICAgYmFzY2lpW2ldID0gMDsKKyAgICAgICAgKHZvaWQpIF9fa21wX3ByaW50Zl9ub19sb2NrKCIlLTQ4cyAgICVzXG4iLCBiaGV4LCBiYXNjaWkpOworICAgICAgICBiZHVtcCArPSBsOworICAgICAgICBiZGxlbiAtPSBsOworICAgICAgICB3aGlsZSAoKGJkbGVuID4gMTYpICYmIChtZW1jbXAoKGNoYXIgKikgKGJkdW1wIC0gMTYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgYmR1bXAsIDE2KSA9PSAwKSkgeworICAgICAgICAgICAgZHVwZXMrKzsKKyAgICAgICAgICAgIGJkdW1wICs9IDE2OworICAgICAgICAgICAgYmRsZW4gLT0gMTY7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGR1cGVzID4gMSkgeworICAgICAgICAgICAgKHZvaWQpIF9fa21wX3ByaW50Zl9ub19sb2NrKAorICAgICAgICAgICAgICAgICIgICAgICglZCBsaW5lcyBbJWQgYnl0ZXNdIGlkZW50aWNhbCB0byBhYm92ZSBsaW5lIHNraXBwZWQpXG4iLAorICAgICAgICAgICAgICAgIGR1cGVzLCBkdXBlcyAqIDE2KTsKKyAgICAgICAgfSBlbHNlIGlmIChkdXBlcyA9PSAxKSB7CisgICAgICAgICAgICBiZHVtcCAtPSAxNjsKKyAgICAgICAgICAgIGJkbGVuICs9IDE2OworICAgICAgICB9CisgICAgfQorfQorCisvKiAgQlBPT0xEICAtLSAgRHVtcCBhIGJ1ZmZlciBwb29sLiAgVGhlIGJ1ZmZlciBoZWFkZXJzIGFyZSBhbHdheXMgbGlzdGVkLgorICAgICAgICAgICAgICAgIElmIERVTVBBTExPQyBpcyBub256ZXJvLCB0aGUgY29udGVudHMgb2YgYWxsb2NhdGVkIGJ1ZmZlcnMKKyAgICAgICAgICAgICAgICBhcmUgIGR1bXBlZC4gICBJZiAgRFVNUEZSRUUgIGlzICBub256ZXJvLCAgZnJlZSBibG9ja3MgYXJlCisgICAgICAgICAgICAgICAgZHVtcGVkIGFzIHdlbGwuICBJZiBGcmVlV2lwZSAgY2hlY2tpbmcgIGlzICBlbmFibGVkLCAgZnJlZQorICAgICAgICAgICAgICAgIGJsb2NrcyAgd2hpY2ggIGhhdmUgIGJlZW4gY2xvYmJlcmVkIHdpbGwgYWx3YXlzIGJlIGR1bXBlZC4gKi8KKworc3RhdGljIHZvaWQKK2Jwb29sZCggIGttcF9pbmZvX3QgKnRoLCB2b2lkICpidWYsIGludCBkdW1wYWxsb2MsIGludCBkdW1wZnJlZSkKK3sKKyAgICBiZmhlYWRfdCAqYiA9IEJGSCggKGNoYXIqKWJ1ZiAtIHNpemVvZihiaGVhZF90KSk7CisKKyAgICB3aGlsZSAoYi0+YmguYmIuYnNpemUgIT0gRVNlbnQpIHsKKyAgICAgICAgYnVmc2l6ZSBicyA9IGItPmJoLmJiLmJzaXplOworCisgICAgICAgIGlmIChicyA8IDApIHsKKyAgICAgICAgICAgIGJzID0gLWJzOworICAgICAgICAgICAgKHZvaWQpIF9fa21wX3ByaW50Zl9ub19sb2NrKCJBbGxvY2F0ZWQgYnVmZmVyOiBzaXplICU2bGQgYnl0ZXMuXG4iLCAobG9uZykgYnMpOworICAgICAgICAgICAgaWYgKGR1bXBhbGxvYykgeworICAgICAgICAgICAgICAgIGJ1ZmR1bXAoIHRoLCAodm9pZCAqKSAoKChjaGFyICopIGIpICsgc2l6ZW9mKGJoZWFkX3QpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjaGFyICpsZXJyID0gIiI7CisKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoYnMgPiAwKTsKKyAgICAgICAgICAgIGlmICgoYi0+cWwuYmxpbmstPnFsLmZsaW5rICE9IGIpIHx8IChiLT5xbC5mbGluay0+cWwuYmxpbmsgIT0gYikpIHsKKyAgICAgICAgICAgICAgICBsZXJyID0gIiAgKEJhZCBmcmVlIGxpc3QgbGlua3MpIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICh2b2lkKSBfX2ttcF9wcmludGZfbm9fbG9jaygiRnJlZSBibG9jazogICAgICAgc2l6ZSAlNmxkIGJ5dGVzLiVzXG4iLAorICAgICAgICAgICAgICAgIChsb25nKSBicywgbGVycik7CisjaWZkZWYgRnJlZVdpcGUKKyAgICAgICAgICAgIGxlcnIgPSAoKGNoYXIgKikgYikgKyBzaXplb2YoYmZoZWFkX3QpOworICAgICAgICAgICAgaWYgKChicyA+IHNpemVvZihiZmhlYWRfdCkpICYmICgoKmxlcnIgIT0gMHg1NSkgfHwKKyAgICAgICAgICAgICAgICAobWVtY21wKGxlcnIsIGxlcnIgKyAxLAorICAgICAgICAgICAgICAgICAgKHNpemVfdCkgKGJzIC0gKHNpemVvZihiZmhlYWRfdCkgKyAxKSkpICE9IDApKSkgeworICAgICAgICAgICAgICAgICh2b2lkKSBfX2ttcF9wcmludGZfbm9fbG9jaygKKyAgICAgICAgICAgICAgICAgICAgIihDb250ZW50cyBvZiBhYm92ZSBmcmVlIGJsb2NrIGhhdmUgYmVlbiBvdmVyc3RvcmVkLilcbiIpOworICAgICAgICAgICAgICAgIGJ1ZmR1bXAoIHRoLCAodm9pZCAqKSAoKChjaGFyICopIGIpICsgc2l6ZW9mKGJoZWFkX3QpKSk7CisgICAgICAgICAgICB9IGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgaWYgKGR1bXBmcmVlKSB7CisgICAgICAgICAgICAgICAgYnVmZHVtcCggdGgsICh2b2lkICopICgoKGNoYXIgKikgYikgKyBzaXplb2YoYmhlYWRfdCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBiID0gQkZIKCgoY2hhciAqKSBiKSArIGJzKTsKKyAgICB9Cit9CisKKy8qICBCUE9PTFYgIC0tICBWYWxpZGF0ZSBhIGJ1ZmZlciBwb29sLiAqLworCitzdGF0aWMgaW50CiticG9vbHYoICBrbXBfaW5mb190ICp0aCwgdm9pZCAqYnVmICkKK3sKKyAgICBiZmhlYWRfdCAqYiA9IEJGSChidWYpOworCisgICAgd2hpbGUgKGItPmJoLmJiLmJzaXplICE9IEVTZW50KSB7CisgICAgICAgIGJ1ZnNpemUgYnMgPSBiLT5iaC5iYi5ic2l6ZTsKKworICAgICAgICBpZiAoYnMgPCAwKSB7CisgICAgICAgICAgICBicyA9IC1iczsKKyAgICAgICAgfSBlbHNlIHsKKyNpZmRlZiBGcmVlV2lwZQorICAgICAgICAgICAgY2hhciAqbGVyciA9ICIiOworI2VuZGlmCisKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoYnMgPiAwKTsKKyAgICAgICAgICAgIGlmIChicyA8PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGItPnFsLmJsaW5rLT5xbC5mbGluayAhPSBiKSB8fCAoYi0+cWwuZmxpbmstPnFsLmJsaW5rICE9IGIpKSB7CisgICAgICAgICAgICAgICAgKHZvaWQpIF9fa21wX3ByaW50Zl9ub19sb2NrKCJGcmVlIGJsb2NrOiBzaXplICU2bGQgYnl0ZXMuICAoQmFkIGZyZWUgbGlzdCBsaW5rcylcbiIsCisgICAgICAgICAgICAgICAgICAgICAobG9uZykgYnMpOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoMCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisjaWZkZWYgRnJlZVdpcGUKKyAgICAgICAgICAgIGxlcnIgPSAoKGNoYXIgKikgYikgKyBzaXplb2YoYmZoZWFkX3QpOworICAgICAgICAgICAgaWYgKChicyA+IHNpemVvZihiZmhlYWRfdCkpICYmICgoKmxlcnIgIT0gMHg1NSkgfHwKKyAgICAgICAgICAgICAgICAobWVtY21wKGxlcnIsIGxlcnIgKyAxLAorICAgICAgICAgICAgICAgICAgKHNpemVfdCkgKGJzIC0gKHNpemVvZihiZmhlYWRfdCkgKyAxKSkpICE9IDApKSkgeworICAgICAgICAgICAgICAgICh2b2lkKSBfX2ttcF9wcmludGZfbm9fbG9jaygKKyAgICAgICAgICAgICAgICAgICAgIihDb250ZW50cyBvZiBhYm92ZSBmcmVlIGJsb2NrIGhhdmUgYmVlbiBvdmVyc3RvcmVkLilcbiIpOworICAgICAgICAgICAgICAgIGJ1ZmR1bXAoIHRoLCAodm9pZCAqKSAoKChjaGFyICopIGIpICsgc2l6ZW9mKGJoZWFkX3QpKSk7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCgwKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBGcmVlV2lwZSAqLworICAgICAgICB9CisgICAgICAgIGIgPSBCRkgoKChjaGFyICopIGIpICsgYnMpOworICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAorX19rbXBfaW5pdGlhbGl6ZV9iZ2V0KCBrbXBfaW5mb190ICp0aCApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggU2l6ZVF1YW50ID49IHNpemVvZiggdm9pZCAqICkgJiYgKHRoICE9IDApICk7CisKKyAgICBzZXRfdGhyX2RhdGEoIHRoICk7CisKKyAgICBiZWN0bCggdGgsIChiZ2V0X2NvbXBhY3RfdCkgMCwgKGJnZXRfYWNxdWlyZV90KSBtYWxsb2MsIChiZ2V0X3JlbGVhc2VfdCkgZnJlZSwKKyAgICAgICAgICAgKGJ1ZnNpemUpIF9fa21wX21hbGxvY19wb29sX2luY3IgKTsKK30KKwordm9pZAorX19rbXBfZmluYWxpemVfYmdldCgga21wX2luZm9fdCAqdGggKQoreworICAgIHRocl9kYXRhX3QgKnRocjsKKyAgICBiZmhlYWRfdCAqYjsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoICE9IDAgKTsKKworI2lmIEJ1ZlN0YXRzCisgICAgdGhyID0gKHRocl9kYXRhX3QgKikgdGgtPnRoLnRoX2xvY2FsLmJnZXRfZGF0YTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aHIgIT0gTlVMTCApOworICAgIGIgPSB0aHItPmxhc3RfcG9vbDsKKworICAgIC8qICBJZiAgYSAgYmxvY2stcmVsZWFzZSBmdW5jdGlvbiBpcyBkZWZpbmVkLCBhbmQgdGhpcyBmcmVlIGJ1ZmZlcgorICAgICAgICBjb25zdGl0dXRlcyB0aGUgZW50aXJlIGJsb2NrLCByZWxlYXNlIGl0LiAgTm90ZSB0aGF0ICBwb29sX2xlbgorICAgICAgICBpcyAgZGVmaW5lZCAgaW4gIHN1Y2ggYSB3YXkgdGhhdCB0aGUgdGVzdCB3aWxsIGZhaWwgdW5sZXNzIGFsbAorICAgICAgICBwb29sIGJsb2NrcyBhcmUgdGhlIHNhbWUgc2l6ZS4gICovCisKKyAgICAvKiBEZWFsbG9jYXRlIHRoZSBsYXN0IHBvb2wgaWYgb25lIGV4aXN0cyBiZWNhdXNlIHdlIG5vIGxvbmdlciBkbyBpdCBpbiBicmVsKCkgKi8KKyAgICBpZiAodGhyLT5yZWxmY24gIT0gMCAmJiBiICE9IDAgJiYgdGhyLT5udW1wYmxrICE9IDAgJiYKKyAgICAgICAgYi0+YmguYmIuYnNpemUgPT0gKGJ1ZnNpemUpKHRoci0+cG9vbF9sZW4gLSBzaXplb2YoYmhlYWRfdCkpKQorICAgIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChiLT5iaC5iYi5wcmV2ZnJlZSA9PSAwKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChCSCgoY2hhciAqKSBiICsgYi0+YmguYmIuYnNpemUpLT5iYi5ic2l6ZSA9PSBFU2VudCk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoQkgoKGNoYXIgKikgYiArIGItPmJoLmJiLmJzaXplKS0+YmIucHJldmZyZWUgPT0gYi0+YmguYmIuYnNpemUpOworCisgICAgICAgIC8qICBVbmxpbmsgdGhlIGJ1ZmZlciBmcm9tIHRoZSBmcmVlIGxpc3QgICovCisgICAgICAgIF9fa21wX2JnZXRfcmVtb3ZlX2Zyb21fZnJlZWxpc3QoIGIgKTsKKworICAgICAgICBLRV9UUkFDRSggMTAsICgiJSUlJSUlIEZSRUUoICVwIClcbiIsICh2b2lkICopIGIgKSApOworCisgICAgICAgICgqdGhyLT5yZWxmY24pKGIpOworICAgICAgICB0aHItPm51bXByZWwrKzsgICAgICAgICAgICAgICAvKiBOciBvZiBleHBhbnNpb24gYmxvY2sgcmVsZWFzZXMgKi8KKyAgICAgICAgdGhyLT5udW1wYmxrLS07ICAgICAgICAgICAgICAgLyogVG90YWwgbnVtYmVyIG9mIGJsb2NrcyAqLworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHRoci0+bnVtcGJsayA9PSB0aHItPm51bXBnZXQgLSB0aHItPm51bXByZWwpOworICAgIH0KKyNlbmRpZiAvKiBCdWZTdGF0cyAqLworCisgICAgLyogRGVhbGxvY2F0ZSBiZ2V0X2RhdGEgKi8KKyAgICBpZiAoIHRoLT50aC50aF9sb2NhbC5iZ2V0X2RhdGEgIT0gTlVMTCApIHsKKyAgICAgICAgX19rbXBfZnJlZSggdGgtPnRoLnRoX2xvY2FsLmJnZXRfZGF0YSApOworICAgICAgICB0aC0+dGgudGhfbG9jYWwuYmdldF9kYXRhID0gTlVMTDsKKyAgICB9OyAvLyBpZgorfQorCit2b2lkCitrbXBjX3NldF9wb29sc2l6ZSggc2l6ZV90IHNpemUgKQoreworICAgIGJlY3RsKCBfX2ttcF9nZXRfdGhyZWFkKCksIChiZ2V0X2NvbXBhY3RfdCkgMCwgKGJnZXRfYWNxdWlyZV90KSBtYWxsb2MsCisgICAgICAgICAgIChiZ2V0X3JlbGVhc2VfdCkgZnJlZSwgKGJ1ZnNpemUpIHNpemUgKTsKK30KKworc2l6ZV90CitrbXBjX2dldF9wb29sc2l6ZSggdm9pZCApCit7CisgICAgdGhyX2RhdGFfdCAqcDsKKworICAgIHAgPSBnZXRfdGhyX2RhdGEoIF9fa21wX2dldF90aHJlYWQoKSApOworCisgICAgcmV0dXJuIHAtPmV4cF9pbmNyOworfQorCit2b2lkCitrbXBjX3NldF9wb29sbW9kZSggaW50IG1vZGUgKQoreworICAgIHRocl9kYXRhX3QgKnA7CisKKyAgICBpZiAobW9kZSA9PSBiZ2V0X21vZGVfZmlmbyB8fCBtb2RlID09IGJnZXRfbW9kZV9saWZvIHx8IG1vZGUgPT0gYmdldF9tb2RlX2Jlc3QpIHsKKyAgICAgICAgcCA9IGdldF90aHJfZGF0YSggX19rbXBfZ2V0X3RocmVhZCgpICk7CisgICAgICAgIHAtPm1vZGUgPSAoYmdldF9tb2RlX3QpIG1vZGU7CisgICAgfQorfQorCitpbnQKK2ttcGNfZ2V0X3Bvb2xtb2RlKCB2b2lkICkKK3sKKyAgICB0aHJfZGF0YV90ICpwOworCisgICAgcCA9IGdldF90aHJfZGF0YSggX19rbXBfZ2V0X3RocmVhZCgpICk7CisKKyAgICByZXR1cm4gcC0+bW9kZTsKK30KKwordm9pZAora21wY19nZXRfcG9vbHN0YXQoIHNpemVfdCAqbWF4bWVtLCBzaXplX3QgKmFsbG1lbSApCit7CisgICAga21wX2luZm9fdCAqdGggPSBfX2ttcF9nZXRfdGhyZWFkKCk7CisgICAgYnVmc2l6ZSBhLCBiOworCisgICAgX19rbXBfYmdldF9kZXF1ZXVlKCB0aCApOyAgICAgICAgIC8qIFJlbGVhc2UgYW55IHF1ZXVlZCBidWZmZXJzICovCisKKyAgICBiY2hlY2soIHRoLCAmYSwgJmIgKTsKKworICAgICptYXhtZW0gPSBhOworICAgICphbGxtZW0gPSBiOworfQorCit2b2lkCitrbXBjX3Bvb2xwcmludCggdm9pZCApCit7CisgICAga21wX2luZm9fdCAqdGggPSBfX2ttcF9nZXRfdGhyZWFkKCk7CisKKyAgICBfX2ttcF9iZ2V0X2RlcXVldWUoIHRoICk7ICAgICAgICAgLyogUmVsZWFzZSBhbnkgcXVldWVkIGJ1ZmZlcnMgKi8KKworICAgIGJmcmVlZCggdGggKTsKK30KKworI2VuZGlmIC8vICNpZiBLTVBfVVNFX0JHRVQKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgKgora21wY19tYWxsb2MoIHNpemVfdCBzaXplICkKK3sKKyAgICB2b2lkICogcHRyOworICAgICAgICBwdHIgPSBiZ2V0KCBfX2ttcF9lbnRyeV90aHJlYWQoKSwgKGJ1ZnNpemUpIHNpemUgKTsKKworICAgIHJldHVybiBwdHI7Cit9CisKK3ZvaWQgKgora21wY19jYWxsb2MoIHNpemVfdCBuZWxlbSwgc2l6ZV90IGVsc2l6ZSApCit7CisgICAgdm9pZCAqIHB0cjsKKyAgICAgICAgcHRyID0gYmdldHooIF9fa21wX2VudHJ5X3RocmVhZCgpLCAoYnVmc2l6ZSkgKG5lbGVtICogZWxzaXplKSApOworCisgICAgcmV0dXJuIHB0cjsKK30KKwordm9pZCAqCitrbXBjX3JlYWxsb2MoIHZvaWQgKiBwdHIsIHNpemVfdCBzaXplICkKK3sKKyAgICB2b2lkICogcmVzdWx0ID0gTlVMTDsKKworICAgICAgICBpZiAoIHB0ciA9PSBOVUxMICkgeworICAgICAgICAgICAgLy8gSWYgcG9pbnRlciBpcyBOVUxMLCByZWFsbG9jIGJlaGF2ZXMgbGlrZSBtYWxsb2MuCisgICAgICAgICAgICByZXN1bHQgPSBiZ2V0KCBfX2ttcF9lbnRyeV90aHJlYWQoKSwgKGJ1ZnNpemUpIHNpemUgKTsKKyAgICAgICAgfSBlbHNlIGlmICggc2l6ZSA9PSAwICkgeworICAgICAgICAgICAgLy8gSWYgc2l6ZSBpcyAwLCByZWFsbG9jIGJlaGF2ZXMgbGlrZSBmcmVlLgorICAgICAgICAgICAgLy8gVGhlIHRocmVhZCBtdXN0IGJlIHJlZ2lzdGVyZWQgYnkgdGhlIGNhbGwgdG8ga21wY19tYWxsb2MoKSBvciBrbXBjX2NhbGxvYygpIGJlZm9yZS4KKyAgICAgICAgICAgIC8vIFNvIGl0IHNob3VsZCBiZSBzYWZlIHRvIGNhbGwgX19rbXBfZ2V0X3RocmVhZCgpLCBub3QgX19rbXBfZW50cnlfdGhyZWFkKCkuCisgICAgICAgICAgICBicmVsKCBfX2ttcF9nZXRfdGhyZWFkKCksIHB0ciApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzdWx0ID0gYmdldHIoIF9fa21wX2VudHJ5X3RocmVhZCgpLCBwdHIsIChidWZzaXplKSBzaXplICk7CisgICAgICAgIH07IC8vIGlmCisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKiBOT1RFOiB0aGUgbGlicmFyeSBtdXN0IGhhdmUgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIGJ5IGEgcHJldmlvdXMgYWxsb2NhdGUgKi8KKwordm9pZAora21wY19mcmVlKCB2b2lkICogcHRyICkKK3sKKyAgICBpZiAoICEgX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9OyAvLyBpZgorICAgIGlmICggcHRyICE9IE5VTEwgKSB7CisgICAgICAgICAgICBrbXBfaW5mb190ICp0aCA9IF9fa21wX2dldF90aHJlYWQoKTsKKyAgICAgICAgICAgIF9fa21wX2JnZXRfZGVxdWV1ZSggdGggKTsgICAgICAgICAvKiBSZWxlYXNlIGFueSBxdWV1ZWQgYnVmZmVycyAqLworICAgICAgICAgICAgYnJlbCggdGgsIHB0ciApOworICAgIH07Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgKgorX19fa21wX3RocmVhZF9tYWxsb2MoIGttcF9pbmZvX3QgKnRoLCBzaXplX3Qgc2l6ZSBLTVBfU1JDX0xPQ19ERUNMICkKK3sKKyAgICB2b2lkICogcHRyOworICAgIEtFX1RSQUNFKCAzMCwgKAorICAgICAgICAiLT4gX19rbXBfdGhyZWFkX21hbGxvYyggJXAsICVkICkgY2FsbGVkIGZyb20gJXM6JWRcbiIsCisgICAgICAgIHRoLAorICAgICAgICAoaW50KSBzaXplCisgICAgICAgIEtNUF9TUkNfTE9DX1BBUk0KKyAgICApICk7CisgICAgICAgIHB0ciA9IGJnZXQoIHRoLCAoYnVmc2l6ZSkgc2l6ZSApOworICAgIEtFX1RSQUNFKCAzMCwgKCAiPC0gX19rbXBfdGhyZWFkX21hbGxvYygpIHJldHVybnMgJXBcbiIsIHB0ciApICk7CisgICAgcmV0dXJuIHB0cjsKK30KKwordm9pZCAqCitfX19rbXBfdGhyZWFkX2NhbGxvYygga21wX2luZm9fdCAqdGgsIHNpemVfdCBuZWxlbSwgc2l6ZV90IGVsc2l6ZSBLTVBfU1JDX0xPQ19ERUNMICkKK3sKKyAgICB2b2lkICogcHRyOworICAgIEtFX1RSQUNFKCAzMCwgKAorICAgICAgICAiLT4gX19rbXBfdGhyZWFkX2NhbGxvYyggJXAsICVkLCAlZCApIGNhbGxlZCBmcm9tICVzOiVkXG4iLAorICAgICAgICB0aCwKKyAgICAgICAgKGludCkgbmVsZW0sCisgICAgICAgIChpbnQpIGVsc2l6ZQorICAgICAgICBLTVBfU1JDX0xPQ19QQVJNCisgICAgKSApOworICAgICAgICBwdHIgPSBiZ2V0eiggdGgsIChidWZzaXplKSAobmVsZW0gKiBlbHNpemUpICk7CisgICAgS0VfVFJBQ0UoIDMwLCAoICI8LSBfX2ttcF90aHJlYWRfY2FsbG9jKCkgcmV0dXJucyAlcFxuIiwgcHRyICkgKTsKKyAgICByZXR1cm4gcHRyOworfQorCit2b2lkICoKK19fX2ttcF90aHJlYWRfcmVhbGxvYygga21wX2luZm9fdCAqdGgsIHZvaWQgKnB0ciwgc2l6ZV90IHNpemUgS01QX1NSQ19MT0NfREVDTCApCit7CisgICAgS0VfVFJBQ0UoIDMwLCAoCisgICAgICAgICItPiBfX2ttcF90aHJlYWRfcmVhbGxvYyggJXAsICVwLCAlZCApIGNhbGxlZCBmcm9tICVzOiVkXG4iLAorICAgICAgICB0aCwKKyAgICAgICAgcHRyLAorICAgICAgICAoaW50KSBzaXplCisgICAgICAgIEtNUF9TUkNfTE9DX1BBUk0KKyAgICApICk7CisgICAgICAgIHB0ciA9IGJnZXRyKCB0aCwgcHRyLCAoYnVmc2l6ZSkgc2l6ZSApOworICAgIEtFX1RSQUNFKCAzMCwgKCAiPC0gX19rbXBfdGhyZWFkX3JlYWxsb2MoKSByZXR1cm5zICVwXG4iLCBwdHIgKSApOworICAgIHJldHVybiBwdHI7Cit9CisKK3ZvaWQKK19fX2ttcF90aHJlYWRfZnJlZSgga21wX2luZm9fdCAqdGgsIHZvaWQgKnB0ciBLTVBfU1JDX0xPQ19ERUNMICkKK3sKKyAgICBLRV9UUkFDRSggMzAsICgKKyAgICAgICAgIi0+IF9fa21wX3RocmVhZF9mcmVlKCAlcCwgJXAgKSBjYWxsZWQgZnJvbSAlczolZFxuIiwKKyAgICAgICAgdGgsCisgICAgICAgIHB0cgorICAgICAgICBLTVBfU1JDX0xPQ19QQVJNCisgICAgKSApOworICAgIGlmICggcHRyICE9IE5VTEwgKSB7CisgICAgICAgICAgICBfX2ttcF9iZ2V0X2RlcXVldWUoIHRoICk7ICAgICAgICAgLyogUmVsZWFzZSBhbnkgcXVldWVkIGJ1ZmZlcnMgKi8KKyAgICAgICAgICAgIGJyZWwoIHRoLCBwdHIgKTsKKyAgICB9CisgICAgS0VfVFJBQ0UoIDMwLCAoICI8LSBfX2ttcF90aHJlYWRfZnJlZSgpXG4iICkgKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgICAgSWYgTEVBS19NRU1PUlkgaXMgZGVmaW5lZCwgX19rbXBfZnJlZSgpIHdpbGwgKm5vdCogZnJlZSBtZW1vcnkuIEl0IGNhdXNlcyBtZW1vcnkgbGVha3MsIGJ1dCBpdAorICAgIG1heSBiZSB1c2VmdWwgZm9yIGRlYnVnZ2luZyBtZW1vcnkgY29ycnVwdGlvbnMsIHVzZWQgZnJlZWQgcG9pbnRlcnMsIGV0Yy4KKyovCisvKiAjZGVmaW5lIExFQUtfTUVNT1JZICovCisKK3N0cnVjdCBrbXBfbWVtX2Rlc2NyIHsgICAgICAvLyBNZW1vcnkgYmxvY2sgZGVzY3JpcHRvci4KKyAgICB2b2lkICogcHRyX2FsbG9jYXRlZDsgICAvLyBQb2ludGVyIHJldHVybmVkIGJ5IG1hbGxvYygpLCBzdWJqZWN0IGZvciBmcmVlKCkuCisgICAgc2l6ZV90IHNpemVfYWxsb2NhdGVkOyAgLy8gU2l6ZSBvZiBhbGxvY2F0ZWQgbWVtb3J5IGJsb2NrLgorICAgIHZvaWQgKiBwdHJfYWxpZ25lZDsgICAgIC8vIFBvaW50ZXIgdG8gYWxpZ25lZCBtZW1vcnksIHRvIGJlIHVzZWQgYnkgY2xpZW50IGNvZGUuCisgICAgc2l6ZV90IHNpemVfYWxpZ25lZDsgICAgLy8gU2l6ZSBvZiBhbGlnbmVkIG1lbW9yeSBibG9jay4KK307Cit0eXBlZGVmIHN0cnVjdCBrbXBfbWVtX2Rlc2NyIGttcF9tZW1fZGVzY3JfdDsKKworLyoKKyAgICBBbGxvY2F0ZSBtZW1vcnkgb24gcmVxdWVzdGVkIGJvdW5kYXJ5LCBmaWxsIGFsbG9jYXRlZCBtZW1vcnkgd2l0aCAweDAwLgorICAgIE5VTEwgaXMgTkVWRVIgcmV0dXJuZWQsIF9fa21wX2Fib3J0KCkgaXMgY2FsbGVkIGluIGNhc2Ugb2YgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IuCisgICAgTXVzdCB1c2UgX19rbXBfZnJlZSB3aGVuIGZyZWVpbmcgbWVtb3J5IGFsbG9jYXRlZCBieSB0aGlzIHJvdXRpbmUhCisgKi8KK3N0YXRpYwordm9pZCAqCitfX19rbXBfYWxsb2NhdGVfYWxpZ24oIHNpemVfdCBzaXplLCBzaXplX3QgYWxpZ25tZW50IEtNUF9TUkNfTE9DX0RFQ0wgKQoreworICAgIC8qCisgICAgICAgICAgICBfX2ttcF9hbGxvY2F0ZSgpIGFsbG9jYXRlcyAoYnkgY2FsbCB0byBtYWxsb2MoKSkgYmlnZ2VyIG1lbW9yeSBibG9jayB0aGFuIHJlcXVlc3RlZCB0bworICAgICAgICByZXR1cm4gcHJvcGVybHkgYWxpZ25lZCBwb2ludGVyLiBPcmlnaW5hbCBwb2ludGVyIHJldHVybmVkIGJ5IG1hbGxvYygpIGFuZCBzaXplIG9mIGFsbG9jYXRlZAorICAgICAgICBibG9jayBpcyBzYXZlZCBpbiBkZXNjcmlwdG9yIGp1c3QgYmVmb3JlIHRoZSBhbGlnbmVkIHBvaW50ZXIuIFRoaXMgaW5mb3JtYXRpb24gdXNlZCBieQorICAgICAgICBfX2ttcF9mcmVlKCkgLS0gaXQgaGFzIHRvIHBhc3MgdG8gZnJlZSgpIG9yaWdpbmFsIHBvaW50ZXIsIG5vdCBhbGlnbmVkIG9uZS4KKworICAgICAgICAgICAgKy0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKworICAgICAgICAgICAgfCBwYWRkaW5nIHwgZGVzY3JpcHRvciB8ICAgICAgICAgICBhbGlnbmVkIGJsb2NrICAgICAgICAgICB8IHBhZGRpbmcgfAorICAgICAgICAgICAgKy0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKworICAgICAgICAgICAgXiAgICAgICAgICAgICAgICAgICAgICBeCisgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgKy0gQWxpZ25lZCBwb2ludGVyIHJldHVybmVkIHRvIGNhbGxlcgorICAgICAgICAgICAgKy0gUG9pbnRlciByZXR1cm5lZCBieSBtYWxsb2MoKQorCisgICAgICAgIEFsaWduZWQgYmxvY2sgaXMgZmlsbGVkIHdpdGggemVyb3MsIHBhZGRpbmdzIGFyZSBmaWxsZWQgd2l0aCAweEVGLgorICAgICovCisKKyAgICBrbXBfbWVtX2Rlc2NyX3QgIGRlc2NyOworICAgIGttcF91aW50cHRyX3QgICAgYWRkcl9hbGxvY2F0ZWQ7ICAgICAgICAvLyBBZGRyZXNzIHJldHVybmVkIGJ5IG1hbGxvYygpLgorICAgIGttcF91aW50cHRyX3QgICAgYWRkcl9hbGlnbmVkOyAgICAgICAgICAvLyBBbGlnbmVkIGFkZHJlc3MgdG8gcmV0dXJuIHRvIGNhbGxlci4KKyAgICBrbXBfdWludHB0cl90ICAgIGFkZHJfZGVzY3I7ICAgICAgICAgICAgLy8gQWRkcmVzcyBvZiBtZW1vcnkgYmxvY2sgZGVzY3JpcHRvci4KKworICAgIEtFX1RSQUNFKCAyNSwgKAorICAgICAgICAiLT4gX19fa21wX2FsbG9jYXRlX2FsaWduKCAlZCwgJWQgKSBjYWxsZWQgZnJvbSAlczolZFxuIiwKKyAgICAgICAgKGludCkgc2l6ZSwKKyAgICAgICAgKGludCkgYWxpZ25tZW50CisgICAgICAgIEtNUF9TUkNfTE9DX1BBUk0KKyAgICApICk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBhbGlnbm1lbnQgPCAzMiAqIDEwMjQgKTsgLy8gQWxpZ25tZW50IHNob3VsZCBub3QgYmUgdG9vCisgICAgS01QX0RFQlVHX0FTU0VSVCggc2l6ZW9mKCB2b2lkICogKSA8PSBzaXplb2YoIGttcF91aW50cHRyX3QgKSApOworICAgICAgICAvLyBNYWtlIHN1cmUga21wX3VpbnRwdHJfdCBpcyBlbm91Z2ggdG8gc3RvcmUgYWRkcmVzc2VzLgorCisgICAgZGVzY3Iuc2l6ZV9hbGlnbmVkID0gc2l6ZTsKKyAgICBkZXNjci5zaXplX2FsbG9jYXRlZCA9IGRlc2NyLnNpemVfYWxpZ25lZCArIHNpemVvZigga21wX21lbV9kZXNjcl90ICkgKyBhbGlnbm1lbnQ7CisKKyAgICAjaWYgS01QX0RFQlVHCisgICAgICAgIGRlc2NyLnB0cl9hbGxvY2F0ZWQgPSBfbWFsbG9jX3NyY19sb2MoIGRlc2NyLnNpemVfYWxsb2NhdGVkLCBfZmlsZV8sIF9saW5lXyApOworICAgICNlbHNlCisgICAgZGVzY3IucHRyX2FsbG9jYXRlZCA9IG1hbGxvY19zcmNfbG9jKCBkZXNjci5zaXplX2FsbG9jYXRlZCBLTVBfU1JDX0xPQ19QQVJNICk7CisgICAgI2VuZGlmCisgICAgS0VfVFJBQ0UoIDEwLCAoCisgICAgICAgICIgICBtYWxsb2MoICVkICkgcmV0dXJuZWQgJXBcbiIsCisgICAgICAgIChpbnQpIGRlc2NyLnNpemVfYWxsb2NhdGVkLAorICAgICAgICBkZXNjci5wdHJfYWxsb2NhdGVkCisgICAgKSApOworICAgIGlmICggZGVzY3IucHRyX2FsbG9jYXRlZCA9PSBOVUxMICkgeworICAgICAgICBLTVBfRkFUQUwoIE91dE9mSGVhcE1lbW9yeSApOworICAgIH07CisKKyAgICBhZGRyX2FsbG9jYXRlZCA9IChrbXBfdWludHB0cl90KSBkZXNjci5wdHJfYWxsb2NhdGVkOworICAgIGFkZHJfYWxpZ25lZCA9CisgICAgICAgICggYWRkcl9hbGxvY2F0ZWQgKyBzaXplb2YoIGttcF9tZW1fZGVzY3JfdCApICsgYWxpZ25tZW50ICkKKyAgICAgICAgJiB+ICggYWxpZ25tZW50IC0gMSApOworICAgIGFkZHJfZGVzY3IgPSBhZGRyX2FsaWduZWQgLSBzaXplb2YoIGttcF9tZW1fZGVzY3JfdCApOworCisgICAgZGVzY3IucHRyX2FsaWduZWQgPSAodm9pZCAqKSBhZGRyX2FsaWduZWQ7CisKKyAgICBLRV9UUkFDRSggMjYsICgKKyAgICAgICAgIiAgIF9fX2ttcF9hbGxvY2F0ZV9hbGlnbjogIgorICAgICAgICAgICAgInB0cl9hbGxvY2F0ZWQ9JXAsIHNpemVfYWxsb2NhdGVkPSVkLCAiCisgICAgICAgICAgICAicHRyX2FsaWduZWQ9JXAsIHNpemVfYWxpZ25lZD0lZFxuIiwKKyAgICAgICAgZGVzY3IucHRyX2FsbG9jYXRlZCwKKyAgICAgICAgKGludCkgZGVzY3Iuc2l6ZV9hbGxvY2F0ZWQsCisgICAgICAgIGRlc2NyLnB0cl9hbGlnbmVkLAorICAgICAgICAoaW50KSBkZXNjci5zaXplX2FsaWduZWQKKyAgICApICk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBhZGRyX2FsbG9jYXRlZCA8PSBhZGRyX2Rlc2NyICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggYWRkcl9kZXNjciArIHNpemVvZigga21wX21lbV9kZXNjcl90ICkgPT0gYWRkcl9hbGlnbmVkICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggYWRkcl9hbGlnbmVkICsgZGVzY3Iuc2l6ZV9hbGlnbmVkIDw9IGFkZHJfYWxsb2NhdGVkICsgZGVzY3Iuc2l6ZV9hbGxvY2F0ZWQgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBhZGRyX2FsaWduZWQgJSBhbGlnbm1lbnQgPT0gMCApOworCisgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICBtZW1zZXQoIGRlc2NyLnB0cl9hbGxvY2F0ZWQsIDB4RUYsIGRlc2NyLnNpemVfYWxsb2NhdGVkICk7CisgICAgICAgICAgICAvLyBGaWxsIGFsbG9jYXRlZCBtZW1vcnkgYmxvY2sgd2l0aCAweEVGLgorICAgICNlbmRpZgorICAgIG1lbXNldCggZGVzY3IucHRyX2FsaWduZWQsIDB4MDAsIGRlc2NyLnNpemVfYWxpZ25lZCApOworICAgICAgICAvLyBGaWxsIHRoZSBhbGlnbmVkIG1lbW9yeSBibG9jayAod2hpY2ggaXMgaW50ZW5kZWQgZm9yIHVzaW5nIGJ5IGNhbGxlcikgd2l0aCAweDAwLiBEbyBub3QKKyAgICAgICAgLy8gcHV0IHRoaXMgZmlsbGluZyB1bmRlciBLTVBfREVCVUcgY29uZGl0aW9uISBNYW55IGNhbGxlcnMgZXhwZWN0IHplcm9lZCBtZW1vcnkuIChQYWRkaW5nCisgICAgICAgIC8vIGJ5dGVzIHJlbWFpbiBmaWxsZWQgd2l0aCAweEVGIGluIGRlYnVnZ2luZyBsaWJyYXJ5LikKKyAgICAqICggKGttcF9tZW1fZGVzY3JfdCAqKSBhZGRyX2Rlc2NyICkgPSBkZXNjcjsKKworICAgIEtNUF9NQigpOworCisgICAgS0VfVFJBQ0UoIDI1LCAoICI8LSBfX19rbXBfYWxsb2NhdGVfYWxpZ24oKSByZXR1cm5zICVwXG4iLCBkZXNjci5wdHJfYWxpZ25lZCApICk7CisgICAgcmV0dXJuIGRlc2NyLnB0cl9hbGlnbmVkOworCit9IC8vIGZ1bmMgX19fa21wX2FsbG9jYXRlX2FsaWduCisKKworLyoKKyAgICBBbGxvY2F0ZSBtZW1vcnkgb24gY2FjaGUgbGluZSBib3VuZGFyeSwgZmlsbCBhbGxvY2F0ZWQgbWVtb3J5IHdpdGggMHgwMC4KKyAgICBEbyBub3QgY2FsbCB0aGlzIGZ1bmMgZGlyZWN0bHkhIFVzZSBfX2ttcF9hbGxvY2F0ZSBtYWNybyBpbnN0ZWFkLgorICAgIE5VTEwgaXMgTkVWRVIgcmV0dXJuZWQsIF9fa21wX2Fib3J0KCkgaXMgY2FsbGVkIGluIGNhc2Ugb2YgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IuCisgICAgTXVzdCB1c2UgX19rbXBfZnJlZSB3aGVuIGZyZWVpbmcgbWVtb3J5IGFsbG9jYXRlZCBieSB0aGlzIHJvdXRpbmUhCisgKi8KK3ZvaWQgKgorX19fa21wX2FsbG9jYXRlKCBzaXplX3Qgc2l6ZSBLTVBfU1JDX0xPQ19ERUNMICkKK3sKKworICAgIHZvaWQgKiBwdHI7CisgICAgS0VfVFJBQ0UoIDI1LCAoICItPiBfX2ttcF9hbGxvY2F0ZSggJWQgKSBjYWxsZWQgZnJvbSAlczolZFxuIiwgKGludCkgc2l6ZSBLTVBfU1JDX0xPQ19QQVJNICkgKTsKKyAgICAgICAgcHRyID0gX19fa21wX2FsbG9jYXRlX2FsaWduKCBzaXplLCBfX2ttcF9hbGlnbl9hbGxvYyBLTVBfU1JDX0xPQ19QQVJNICk7CisgICAgS0VfVFJBQ0UoIDI1LCAoICI8LSBfX2ttcF9hbGxvY2F0ZSgpIHJldHVybnMgJXBcbiIsIHB0ciApICk7CisgICAgcmV0dXJuIHB0cjsKKworfSAvLyBmdW5jIF9fX2ttcF9hbGxvY2F0ZQorCisjaWYgKEJVSUxEX01FTU9SWT09RklSU1RfVE9VQ0gpCit2b2lkICoKK19fa21wX2Z0X3BhZ2VfYWxsb2NhdGUoc2l6ZV90IHNpemUpCit7CisgIHZvaWQgKmFkciwgKmFhZHI7CisjaWYgS01QX09TX0xJTlVYCisgIC8qIFRPRE86IFVzZSB0aGlzIGZ1bmN0aW9uIHRvIGdldCBwYWdlIHNpemUgZXZlcnl3aGVyZSAqLworICBpbnQgcGFnZV9zaXplID0gZ2V0cGFnZXNpemUoKTsKKyNlbHNlCisgIC8qIFRPRE86IEZpbmQgd2luZG93cyBmdW5jdGlvbiB0byBnZXQgcGFnZSBzaXplIGFuZCB1c2UgaXQgZXZlcnl3aGVyZSAqLworICBpbnQgcGFnZV9zaXplID0gUEFHRV9TSVpFOworI2VuZGlmIC8qIEtNUF9PU19MSU5VWCAqLworCisgIGFkciA9ICh2b2lkICopIF9fa21wX3RocmVhZF9tYWxsb2MoIF9fa21wX2dldF90aHJlYWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgKyBwYWdlX3NpemUgKyBLTVBfUFRSX1NLSVApOworICBpZiAoIGFkciA9PSAwICkKKyAgICBLTVBfRkFUQUwoIE91dE9mSGVhcE1lbW9yeSApOworCisgIC8qIGNoZWNrIHRvIHNlZSBpZiBhZHIgaXMgb24gYSBwYWdlIGJvdW5kYXJ5LiAqLworICBpZiAoICggKGttcF91aW50cHRyX3QpIGFkciAmIChwYWdlX3NpemUgLSAxKSkgPT0gMCkKKyAgICAvKiBub3RoaW5nIHRvIGRvIGlmIGFkciBpcyBhbHJlYWR5IG9uIGEgcGFnZSBib3VuZGFyeS4gKi8KKyAgICBhYWRyID0gYWRyOworICBlbHNlCisgICAgLyogZWxzZSBzZXQgYWFkciB0byB0aGUgZmlyc3QgcGFnZSBib3VuZGFyeSBpbiB0aGUgYWxsb2NhdGVkIG1lbW9yeS4gKi8KKyAgICBhYWRyID0gKHZvaWQgKikgKCAoIChrbXBfdWludHB0cl90KSBhZHIgKyBwYWdlX3NpemUpICYgfihwYWdlX3NpemUgLSAxKSApOworCisgIC8qIHRoZSBmaXJzdCB0b3VjaCBieSB0aGUgb3duZXIgdGhyZWFkLiAqLworICAqKCh2b2lkKiopYWFkcikgPSBhZHI7CisKKyAgLyogc2tpcCB0aGUgbWVtb3J5IHNwYWNlIHVzZWQgZm9yIHN0b3JpbmcgYWRyIGFib3ZlLiAqLworICByZXR1cm4gKHZvaWQqKSgoY2hhciopYWFkciArIEtNUF9QVFJfU0tJUCk7Cit9CisjZW5kaWYKKworLyoKKyAgICBBbGxvY2F0ZSBtZW1vcnkgb24gcGFnZSBib3VuZGFyeSwgZmlsbCBhbGxvY2F0ZWQgbWVtb3J5IHdpdGggMHgwMC4KKyAgICBEb2VzIG5vdCBjYWxsIHRoaXMgZnVuYyBkaXJlY3RseSEgVXNlIF9fa21wX3BhZ2VfYWxsb2NhdGUgbWFjcm8gaW5zdGVhZC4KKyAgICBOVUxMIGlzIE5FVkVSIHJldHVybmVkLCBfX2ttcF9hYm9ydCgpIGlzIGNhbGxlZCBpbiBjYXNlIG9mIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yLgorICAgIE11c3QgdXNlIF9fa21wX2ZyZWUgd2hlbiBmcmVlaW5nIG1lbW9yeSBhbGxvY2F0ZWQgYnkgdGhpcyByb3V0aW5lIQorICovCit2b2lkICoKK19fX2ttcF9wYWdlX2FsbG9jYXRlKCBzaXplX3Qgc2l6ZSBLTVBfU1JDX0xPQ19ERUNMICkKK3sKKyAgICBpbnQgICAgcGFnZV9zaXplID0gOCAqIDEwMjQ7CisgICAgdm9pZCAqIHB0cjsKKworICAgIEtFX1RSQUNFKCAyNSwgKAorICAgICAgICAiLT4gX19rbXBfcGFnZV9hbGxvY2F0ZSggJWQgKSBjYWxsZWQgZnJvbSAlczolZFxuIiwKKyAgICAgICAgKGludCkgc2l6ZQorICAgICAgICBLTVBfU1JDX0xPQ19QQVJNCisgICAgKSApOworICAgICAgICBwdHIgPSBfX19rbXBfYWxsb2NhdGVfYWxpZ24oIHNpemUsIHBhZ2Vfc2l6ZSBLTVBfU1JDX0xPQ19QQVJNICk7CisgICAgS0VfVFJBQ0UoIDI1LCAoICI8LSBfX2ttcF9wYWdlX2FsbG9jYXRlKCAlZCApIHJldHVybnMgJXBcbiIsIChpbnQpIHNpemUsIHB0ciApICk7CisgICAgcmV0dXJuIHB0cjsKK30gLy8gX19fa21wX3BhZ2VfYWxsb2NhdGUKKworLyoKKyAgICBGcmVlIG1lbW9yeSBhbGxvY2F0ZWQgYnkgX19rbXBfYWxsb2NhdGUoKSBhbmQgX19rbXBfcGFnZV9hbGxvY2F0ZSgpLgorICAgIEluIGRlYnVnIG1vZGUsIGZpbGwgdGhlIG1lbW9yeSBibG9jayB3aXRoIDB4RUYgYmVmb3JlIGNhbGwgdG8gZnJlZSgpLgorKi8KK3ZvaWQKK19fX2ttcF9mcmVlKCB2b2lkICogcHRyIEtNUF9TUkNfTE9DX0RFQ0wgKQoreworCisgICAgICAgIGttcF9tZW1fZGVzY3JfdCBkZXNjcjsKKyAgICAgICAga21wX3VpbnRwdHJfdCAgIGFkZHJfYWxsb2NhdGVkOyAgICAgICAgLy8gQWRkcmVzcyByZXR1cm5lZCBieSBtYWxsb2MoKS4KKyAgICAgICAga21wX3VpbnRwdHJfdCAgIGFkZHJfYWxpZ25lZDsgICAgICAgICAgLy8gQWxpZ25lZCBhZGRyZXNzIHBhc3NlZCBieSBjYWxsZXIuCisKKyAgICAgICAgS0VfVFJBQ0UoIDI1LCAoICItPiBfX2ttcF9mcmVlKCAlcCApIGNhbGxlZCBmcm9tICVzOiVkXG4iLCBwdHIgS01QX1NSQ19MT0NfUEFSTSApICk7CisgICAgICAgIEtNUF9BU1NFUlQoIHB0ciAhPSBOVUxMICk7CisKKyAgICAgICAgZGVzY3IgPSAqICgga21wX21lbV9kZXNjcl90ICopICggKGttcF91aW50cHRyX3QpIHB0ciAtIHNpemVvZigga21wX21lbV9kZXNjcl90ICkgKTsKKworICAgICAgICBLRV9UUkFDRSggMjYsICggIiAgIF9fa21wX2ZyZWU6ICAgICAiCisgICAgICAgICAgICAgICAgICAgICAgICAicHRyX2FsbG9jYXRlZD0lcCwgc2l6ZV9hbGxvY2F0ZWQ9JWQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJwdHJfYWxpZ25lZD0lcCwgc2l6ZV9hbGlnbmVkPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3IucHRyX2FsbG9jYXRlZCwgKGludCkgZGVzY3Iuc2l6ZV9hbGxvY2F0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjci5wdHJfYWxpZ25lZCwgKGludCkgZGVzY3Iuc2l6ZV9hbGlnbmVkICkpOworCisgICAgICAgIGFkZHJfYWxsb2NhdGVkID0gKGttcF91aW50cHRyX3QpIGRlc2NyLnB0cl9hbGxvY2F0ZWQ7CisgICAgICAgIGFkZHJfYWxpZ25lZCAgID0gKGttcF91aW50cHRyX3QpIGRlc2NyLnB0cl9hbGlnbmVkOworCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGFkZHJfYWxpZ25lZCAlIENBQ0hFX0xJTkUgPT0gMCApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBkZXNjci5wdHJfYWxpZ25lZCA9PSBwdHIgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggYWRkcl9hbGxvY2F0ZWQgKyBzaXplb2YoIGttcF9tZW1fZGVzY3JfdCApIDw9IGFkZHJfYWxpZ25lZCApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBkZXNjci5zaXplX2FsaWduZWQgPCBkZXNjci5zaXplX2FsbG9jYXRlZCApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBhZGRyX2FsaWduZWQgKyBkZXNjci5zaXplX2FsaWduZWQgPD0gYWRkcl9hbGxvY2F0ZWQgKyBkZXNjci5zaXplX2FsbG9jYXRlZCApOworCisgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgIG1lbXNldCggZGVzY3IucHRyX2FsbG9jYXRlZCwgMHhFRiwgZGVzY3Iuc2l6ZV9hbGxvY2F0ZWQgKTsKKyAgICAgICAgICAgICAgICAvLyBGaWxsIG1lbW9yeSBibG9jayB3aXRoIDB4RUYsIGl0IGhlbHBzIGNhdGNoIHVzaW5nIGZyZWVkIG1lbW9yeS4KKyAgICAgICAgI2VuZGlmCisKKyAgICAgICAgI2lmbmRlZiBMRUFLX01FTU9SWQorICAgICAgICAgICAgS0VfVFJBQ0UoIDEwLCAoICIgICBmcmVlKCAlcCApXG4iLCBkZXNjci5wdHJfYWxsb2NhdGVkICkgKTsKKyAgICAgICAgICAgIGZyZWVfc3JjX2xvYyggZGVzY3IucHRyX2FsbG9jYXRlZCBLTVBfU1JDX0xPQ19QQVJNICk7CisgICAgICAgICNlbmRpZgorCisgICAgS01QX01CKCk7CisKKyAgICBLRV9UUkFDRSggMjUsICggIjwtIF9fa21wX2ZyZWUoKSByZXR1cm5zXG4iICkgKTsKKworfSAvLyBmdW5jIF9fX2ttcF9mcmVlCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBVU0VfRkFTVF9NRU1PUlkgPT0gMworLy8gQWxsb2NhdGUgZmFzdCBtZW1vcnkgYnkgZmlyc3Qgc2Nhbm5pbmcgdGhlIHRocmVhZCdzIGZyZWUgbGlzdHMKKy8vIElmIGEgY2h1bmsgdGhlIHJpZ2h0IHNpemUgZXhpc3RzLCBncmFiIGl0IG9mZiB0aGUgZnJlZSBsaXN0LgorLy8gT3RoZXJ3aXNlIGFsbG9jYXRlIG5vcm1hbGx5IHVzaW5nIGttcF90aHJlYWRfbWFsbG9jLgorCisvLyBBQzogSG93IHRvIGNob29zZSB0aGUgbGltaXQ/IEp1c3QgZ2V0IDE2IGZvciBub3cuLi4KK3N0YXRpYyBpbnQgY29uc3QgX19rbXBfZnJlZV9saXN0X2xpbWl0ID0gMTY7CisKKy8vIEFsd2F5cyB1c2UgMTI4IGJ5dGVzIGZvciBkZXRlcm1pbmluZyBidWNrZXRzIGZvciBjYWNoaW5nIG1lbW9yeSBibG9ja3MKKyNkZWZpbmUgRENBQ0hFX0xJTkUgIDEyOAorCit2b2lkICoKK19fX2ttcF9mYXN0X2FsbG9jYXRlKCBrbXBfaW5mb190ICp0aGlzX3Rociwgc2l6ZV90IHNpemUgS01QX1NSQ19MT0NfREVDTCApCit7CisgICAgdm9pZCAgICAgICAgICAgICogcHRyOworICAgIGludCAgICAgICAgICAgICAgIG51bV9saW5lczsKKyAgICBpbnQgICAgICAgICAgICAgICBpZHg7CisgICAgaW50ICAgICAgICAgICAgICAgaW5kZXg7CisgICAgdm9pZCAgICAgICAgICAgICogYWxsb2NfcHRyOworICAgIHNpemVfdCAgICAgICAgICAgIGFsbG9jX3NpemU7CisgICAga21wX21lbV9kZXNjcl90ICogZGVzY3I7CisKKyAgICBLRV9UUkFDRSggMjUsICggIi0+IF9fa21wX2Zhc3RfYWxsb2NhdGUoIFQjJWQsICVkICkgY2FsbGVkIGZyb20gJXM6JWRcbiIsCisgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKHRoaXNfdGhyKSwgKGludCkgc2l6ZSBLTVBfU1JDX0xPQ19QQVJNICkgKTsKKworICAgIG51bV9saW5lcyA9ICggc2l6ZSArIERDQUNIRV9MSU5FIC0gMSApIC8gRENBQ0hFX0xJTkU7CisgICAgaWR4ID0gbnVtX2xpbmVzIC0gMTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBpZHggPj0gMCApOworICAgIGlmICggaWR4IDwgMiApIHsKKyAgICAgICAgaW5kZXggPSAwOyAgICAgICAvLyBpZHggaXMgWyAwLCAxIF0sIHVzZSBmaXJzdCBmcmVlIGxpc3QKKyAgICAgICAgbnVtX2xpbmVzID0gMjsgICAvLyAxLCAyIGNhY2hlIGxpbmVzIG9yIGxlc3MgdGhhbiBjYWNoZSBsaW5lCisgICAgfSBlbHNlIGlmICggKCBpZHggPj49IDIgKSA9PSAwICkgeworICAgICAgICBpbmRleCA9IDE7ICAgICAgIC8vIGlkeCBpcyBbIDIsIDMgXSwgdXNlIHNlY29uZCBmcmVlIGxpc3QKKyAgICAgICAgbnVtX2xpbmVzID0gNDsgICAvLyAzLCA0IGNhY2hlIGxpbmVzCisgICAgfSBlbHNlIGlmICggKCBpZHggPj49IDIgKSA9PSAwICkgeworICAgICAgICBpbmRleCA9IDI7ICAgICAgIC8vIGlkeCBpcyBbIDQsIDE1IF0sIHVzZSB0aGlyZCBmcmVlIGxpc3QKKyAgICAgICAgbnVtX2xpbmVzID0gMTY7ICAvLyA1LCA2LCAuLi4sIDE2IGNhY2hlIGxpbmVzCisgICAgfSBlbHNlIGlmICggKCBpZHggPj49IDIgKSA9PSAwICkgeworICAgICAgICBpbmRleCA9IDM7ICAgICAgIC8vIGlkeCBpcyBbIDE2LCA2MyBdLCB1c2UgZm91cnRoIGZyZWUgbGlzdAorICAgICAgICBudW1fbGluZXMgPSA2NDsgIC8vIDE3LCAxOCwgLi4uLCA2NCBjYWNoZSBsaW5lcworICAgIH0gZWxzZSB7CisgICAgICAgIGdvdG8gYWxsb2NfY2FsbDsgLy8gNjUgb3IgbW9yZSBjYWNoZSBsaW5lcyAoID4gOEtCICksIGRvbid0IHVzZSBmcmVlIGxpc3RzCisgICAgfQorCisgICAgcHRyID0gdGhpc190aHItPnRoLnRoX2ZyZWVfbGlzdHNbaW5kZXhdLnRoX2ZyZWVfbGlzdF9zZWxmOworICAgIGlmICggcHRyICE9IE5VTEwgKSB7CisgICAgICAgIC8vIHBvcCB0aGUgaGVhZCBvZiBuby1zeW5jIGZyZWUgbGlzdAorICAgICAgICB0aGlzX3Roci0+dGgudGhfZnJlZV9saXN0c1tpbmRleF0udGhfZnJlZV9saXN0X3NlbGYgPSAqKCh2b2lkICoqKXB0cik7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyID09CisgICAgICAgICAgICAoKGttcF9tZW1fZGVzY3JfdCAqKSggKGttcF91aW50cHRyX3QpcHRyIC0gc2l6ZW9mKGttcF9tZW1fZGVzY3JfdCkgKSktPnB0cl9hbGlnbmVkICk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH07CisgICAgcHRyID0gVENSX1NZTkNfUFRSKCB0aGlzX3Roci0+dGgudGhfZnJlZV9saXN0c1tpbmRleF0udGhfZnJlZV9saXN0X3N5bmMgKTsKKyAgICBpZiAoIHB0ciAhPSBOVUxMICkgeworICAgICAgICAvLyBuby1zeW5jIGZyZWUgbGlzdCBpcyBlbXB0eSwgdXNlIHN5bmMgZnJlZSBsaXN0IChmaWxsZWQgaW4gYnkgb3RoZXIgdGhyZWFkcyBvbmx5KQorICAgICAgICAvLyBwb3AgdGhlIGhlYWQgb2YgdGhlIHN5bmMgZnJlZSBsaXN0LCBwdXNoIE5VTEwgaW5zdGVhZAorICAgICAgICB3aGlsZSAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1BUUigKKyAgICAgICAgICAgICZ0aGlzX3Roci0+dGgudGhfZnJlZV9saXN0c1tpbmRleF0udGhfZnJlZV9saXN0X3N5bmMsIHB0ciwgTlVMTCApICkKKyAgICAgICAgeworICAgICAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICAgICAgcHRyID0gVENSX1NZTkNfUFRSKCB0aGlzX3Roci0+dGgudGhfZnJlZV9saXN0c1tpbmRleF0udGhfZnJlZV9saXN0X3N5bmMgKTsKKyAgICAgICAgfQorICAgICAgICAvLyBwdXNoIHRoZSByZXN0IG9mIGNoYWluIGludG8gbm8tc3luYyBmcmVlIGxpc3QgKGNhbiBiZSBOVUxMIGlmIHRoZXJlIHdhcyB0aGUgb25seSBibG9jaykKKyAgICAgICAgdGhpc190aHItPnRoLnRoX2ZyZWVfbGlzdHNbaW5kZXhdLnRoX2ZyZWVfbGlzdF9zZWxmID0gKigodm9pZCAqKilwdHIpOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3RociA9PQorICAgICAgICAgICAgKChrbXBfbWVtX2Rlc2NyX3QgKikoIChrbXBfdWludHB0cl90KXB0ciAtIHNpemVvZihrbXBfbWVtX2Rlc2NyX3QpICkpLT5wdHJfYWxpZ25lZCApOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICBhbGxvY19jYWxsOgorICAgIC8vIGhhdmVuJ3QgZm91bmQgYmxvY2sgaW4gdGhlIGZyZWUgbGlzdHMsIHRodXMgYWxsb2NhdGUgaXQKKyAgICBzaXplID0gbnVtX2xpbmVzICogRENBQ0hFX0xJTkU7CisKKyAgICBhbGxvY19zaXplID0gc2l6ZSArIHNpemVvZigga21wX21lbV9kZXNjcl90ICkgKyBEQ0FDSEVfTElORTsKKyAgICBLRV9UUkFDRSggMjUsICggIl9fa21wX2Zhc3RfYWxsb2NhdGU6IFQjJWQgQ2FsbGluZyBfX2ttcF90aHJlYWRfbWFsbG9jIHdpdGggYWxsb2Nfc2l6ZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aGlzX3RociApLCBhbGxvY19zaXplICkgKTsKKyAgICBhbGxvY19wdHIgPSBiZ2V0KCB0aGlzX3RociwgKGJ1ZnNpemUpIGFsbG9jX3NpemUgKTsKKworICAgIC8vIGFsaWduIHB0ciB0byBEQ0FDSEVfTElORQorICAgIHB0ciA9ICh2b2lkICopKCggKChrbXBfdWludHB0cl90KWFsbG9jX3B0cikgKyBzaXplb2Yoa21wX21lbV9kZXNjcl90KSArIERDQUNIRV9MSU5FICkgJiB+KCBEQ0FDSEVfTElORSAtIDEgKSk7CisgICAgZGVzY3IgPSAoa21wX21lbV9kZXNjcl90ICopKCAoKGttcF91aW50cHRyX3QpcHRyKSAtIHNpemVvZihrbXBfbWVtX2Rlc2NyX3QpICk7CisKKyAgICBkZXNjci0+cHRyX2FsbG9jYXRlZCA9IGFsbG9jX3B0cjsgICAgICAgIC8vIHJlbWVtYmVyIGFsbG9jYXRlZCBwb2ludGVyCisgICAgLy8gd2UgZG9uJ3QgbmVlZCBzaXplX2FsbG9jYXRlZAorICAgIGRlc2NyLT5wdHJfYWxpZ25lZCAgID0gKHZvaWQgKil0aGlzX3RocjsgLy8gcmVtZW1iZXIgYWxsb2NhdGluZyB0aHJlYWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChpdCBpcyBhbHJlYWR5IHNhdmVkIGluIGJnZXQgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnV0IHdlIG1heSB3YW50IHRvIHVzZSBhbm90aGVyIGFsbG9jYXRvciBpbiBmdXR1cmUpCisgICAgZGVzY3ItPnNpemVfYWxpZ25lZCAgPSBzaXplOworCisgICAgZW5kOgorICAgIEtFX1RSQUNFKCAyNSwgKCAiPC0gX19rbXBfZmFzdF9hbGxvY2F0ZSggVCMlZCApIHJldHVybnMgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRoaXNfdGhyICksIHB0ciApICk7CisgICAgcmV0dXJuIHB0cjsKK30gLy8gZnVuYyBfX2ttcF9mYXN0X2FsbG9jYXRlCisKKy8vIEZyZWUgZmFzdCBtZW1vcnkgYW5kIHBsYWNlIGl0IG9uIHRoZSB0aHJlYWQncyBmcmVlIGxpc3QgaWYgaXQgaXMgb2YKKy8vIHRoZSBjb3JyZWN0IHNpemUuCit2b2lkCitfX19rbXBfZmFzdF9mcmVlKCBrbXBfaW5mb190ICp0aGlzX3Rociwgdm9pZCAqIHB0ciBLTVBfU1JDX0xPQ19ERUNMICkKK3sKKyAgICBrbXBfbWVtX2Rlc2NyX3QgKiBkZXNjcjsKKyAgICBrbXBfaW5mb190ICAgICAgKiBhbGxvY190aHI7CisgICAgc2l6ZV90ICAgICAgICAgICAgc2l6ZTsKKyAgICBzaXplX3QgICAgICAgICAgICBpZHg7CisgICAgaW50ICAgICAgICAgICAgICAgaW5kZXg7CisKKyAgICBLRV9UUkFDRSggMjUsICggIi0+IF9fa21wX2Zhc3RfZnJlZSggVCMlZCwgJXAgKSBjYWxsZWQgZnJvbSAlczolZFxuIiwKKyAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQodGhpc190aHIpLCBwdHIgS01QX1NSQ19MT0NfUEFSTSApICk7CisgICAgS01QX0FTU0VSVCggcHRyICE9IE5VTEwgKTsKKworICAgIGRlc2NyID0gKGttcF9tZW1fZGVzY3JfdCAqKSggKChrbXBfdWludHB0cl90KXB0cikgLSBzaXplb2Yoa21wX21lbV9kZXNjcl90KSApOworCisgICAgS0VfVFJBQ0UoMjYsICgiICAgX19rbXBfZmFzdF9mcmVlOiAgICAgc2l6ZV9hbGlnbmVkPSVkXG4iLAorICAgICAgICAgICAgICAgICAgKGludCkgZGVzY3ItPnNpemVfYWxpZ25lZCApICk7CisKKyAgICBzaXplID0gZGVzY3ItPnNpemVfYWxpZ25lZDsgLy8gMiwgNCwgMTYsIDY0LCA2NSwgNjYsIC4uLiBjYWNoZSBsaW5lcworCisgICAgaWR4ID0gRENBQ0hFX0xJTkUgKiAyOyAvLyAyIGNhY2hlIGxpbmVzIGlzIG1pbmltYWwgc2l6ZSBvZiBibG9jaworICAgIGlmICggaWR4ID09IHNpemUgKSB7CisgICAgICAgIGluZGV4ID0gMDsgICAgICAgLy8gMiBjYWNoZSBsaW5lcworICAgIH0gZWxzZSBpZiAoICggaWR4IDw8PSAxICkgPT0gc2l6ZSApIHsKKyAgICAgICAgaW5kZXggPSAxOyAgICAgICAvLyA0IGNhY2hlIGxpbmVzCisgICAgfSBlbHNlIGlmICggKCBpZHggPDw9IDIgKSA9PSBzaXplICkgeworICAgICAgICBpbmRleCA9IDI7ICAgICAgIC8vIDE2IGNhY2hlIGxpbmVzCisgICAgfSBlbHNlIGlmICggKCBpZHggPDw9IDIgKSA9PSBzaXplICkgeworICAgICAgICBpbmRleCA9IDM7ICAgICAgIC8vIDY0IGNhY2hlIGxpbmVzCisgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggc2l6ZSA+IERDQUNIRV9MSU5FICogNjQgKTsKKyAgICAgICAgZ290byBmcmVlX2NhbGw7ICAvLyA2NSBvciBtb3JlIGNhY2hlIGxpbmVzICggPiA4S0IgKQorICAgIH0KKworICAgIGFsbG9jX3RociA9IChrbXBfaW5mb190ICopZGVzY3ItPnB0cl9hbGlnbmVkOyAvLyBnZXQgdGhyZWFkIG93bmluZyB0aGUgYmxvY2sKKyAgICBpZiAoIGFsbG9jX3RociA9PSB0aGlzX3RociApIHsKKyAgICAgICAgLy8gcHVzaCBibG9jayB0byBzZWxmIG5vLXN5bmMgZnJlZSBsaXN0LCBsaW5raW5nIHByZXZpb3VzIGhlYWQgKExJRk8pCisgICAgICAgICooKHZvaWQgKiopcHRyKSA9IHRoaXNfdGhyLT50aC50aF9mcmVlX2xpc3RzW2luZGV4XS50aF9mcmVlX2xpc3Rfc2VsZjsKKyAgICAgICAgdGhpc190aHItPnRoLnRoX2ZyZWVfbGlzdHNbaW5kZXhdLnRoX2ZyZWVfbGlzdF9zZWxmID0gcHRyOworICAgIH0gZWxzZSB7CisgICAgICAgIHZvaWQgKiBoZWFkID0gdGhpc190aHItPnRoLnRoX2ZyZWVfbGlzdHNbaW5kZXhdLnRoX2ZyZWVfbGlzdF9vdGhlcjsKKyAgICAgICAgaWYgKCBoZWFkID09IE5VTEwgKSB7CisgICAgICAgICAgICAvLyBDcmVhdGUgbmV3IGZyZWUgbGlzdAorICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX2ZyZWVfbGlzdHNbaW5kZXhdLnRoX2ZyZWVfbGlzdF9vdGhlciA9IHB0cjsKKyAgICAgICAgICAgICooKHZvaWQgKiopcHRyKSA9IE5VTEw7ICAgICAgICAgICAgIC8vIG1hcmsgdGhlIHRhaWwgb2YgdGhlIGxpc3QKKyAgICAgICAgICAgIGRlc2NyLT5zaXplX2FsbG9jYXRlZCA9IChzaXplX3QpMTsgIC8vIGhlYWQgb2YgdGhlIGxpc3Qga2VlcHMgaXRzIGxlbmd0aAorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gbmVlZCB0byBjaGVjayBleGlzdGVkICJvdGhlciIgbGlzdCdzIG93bmVyIHRocmVhZCBhbmQgc2l6ZSBvZiBxdWV1ZQorICAgICAgICAgICAga21wX21lbV9kZXNjcl90ICogZHNjICA9IChrbXBfbWVtX2Rlc2NyX3QgKikoIChjaGFyKiloZWFkIC0gc2l6ZW9mKGttcF9tZW1fZGVzY3JfdCkgKTsKKyAgICAgICAgICAgIGttcF9pbmZvX3QgICAgICAqIHFfdGggPSAoa21wX2luZm9fdCAqKShkc2MtPnB0cl9hbGlnbmVkKTsgLy8gYWxsb2NhdGluZyB0aHJlYWQsIHNhbWUgZm9yIGFsbCBxdWV1ZSBub2RlcworICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgcV9zeiA9IGRzYy0+c2l6ZV9hbGxvY2F0ZWQgKyAxOyAgICAgICAgICAvLyBuZXcgc2l6ZSBpbiBjYXNlIHdlIGFkZCBjdXJyZW50IHRhc2sKKyAgICAgICAgICAgIGlmICggcV90aCA9PSBhbGxvY190aHIgJiYgcV9zeiA8PSBfX2ttcF9mcmVlX2xpc3RfbGltaXQgKSB7CisgICAgICAgICAgICAgICAgLy8gd2UgY2FuIGFkZCBjdXJyZW50IHRhc2sgdG8gIm90aGVyIiBsaXN0LCBubyBzeW5jIG5lZWRlZAorICAgICAgICAgICAgICAgICooKHZvaWQgKiopcHRyKSA9IGhlYWQ7CisgICAgICAgICAgICAgICAgZGVzY3ItPnNpemVfYWxsb2NhdGVkID0gcV9zejsKKyAgICAgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfZnJlZV9saXN0c1tpbmRleF0udGhfZnJlZV9saXN0X290aGVyID0gcHRyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBlaXRoZXIgcXVldWUgYmxvY2tzIG93bmVyIGlzIGNoYW5naW5nIG9yIHNpemUgbGltaXQgZXhjZWVkZWQKKyAgICAgICAgICAgICAgICAvLyByZXR1cm4gb2xkIHF1ZXVlIHRvIGFsbG9jYXRpbmcgdGhyZWFkIChxX3RoKSBzeW5jaHJvbmVvdXNseSwKKyAgICAgICAgICAgICAgICAvLyBhbmQgc3RhcnQgbmV3IGxpc3QgZm9yIGFsbG9jX3RocidzIHRhc2tzCisgICAgICAgICAgICAgICAgdm9pZCAqIG9sZF9wdHI7CisgICAgICAgICAgICAgICAgdm9pZCAqIHRhaWwgPSBoZWFkOworICAgICAgICAgICAgICAgIHZvaWQgKiBuZXh0ID0gKigodm9pZCAqKiloZWFkKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoIG5leHQgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCgKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXVlIHNpemUgc2hvdWxkIGRlY3JlYXNlIGJ5IDEgZWFjaCBzdGVwIHRocm91Z2ggdGhlIGxpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICgoa21wX21lbV9kZXNjcl90KikoKGNoYXIqKW5leHQgLSBzaXplb2Yoa21wX21lbV9kZXNjcl90KSkpLT5zaXplX2FsbG9jYXRlZCArIDEgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICgoa21wX21lbV9kZXNjcl90KikoKGNoYXIqKXRhaWwgLSBzaXplb2Yoa21wX21lbV9kZXNjcl90KSkpLT5zaXplX2FsbG9jYXRlZCApOworICAgICAgICAgICAgICAgICAgICB0YWlsID0gbmV4dDsgICAvLyByZW1lbWJlciB0YWlsIG5vZGUKKyAgICAgICAgICAgICAgICAgICAgbmV4dCA9ICooKHZvaWQgKiopbmV4dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHFfdGggIT0gTlVMTCApOworICAgICAgICAgICAgICAgIC8vIHB1c2ggYmxvY2sgdG8gb3duZXIncyBzeW5jIGZyZWUgbGlzdAorICAgICAgICAgICAgICAgIG9sZF9wdHIgPSBUQ1JfUFRSKCBxX3RoLT50aC50aF9mcmVlX2xpc3RzW2luZGV4XS50aF9mcmVlX2xpc3Rfc3luYyApOworICAgICAgICAgICAgICAgIC8qIHRoZSBuZXh0IHBvaW50ZXIgbXVzdCBiZSBzZXQgYmVmb3JlIHNldHRpbmcgZnJlZV9saXN0IHRvIHB0ciB0byBhdm9pZAorICAgICAgICAgICAgICAgICAgIGV4cG9zaW5nIGEgYnJva2VuIGxpc3QgdG8gb3RoZXIgdGhyZWFkcywgZXZlbiBmb3IgYW4gaW5zdGFudC4gKi8KKyAgICAgICAgICAgICAgICAqKCh2b2lkICoqKXRhaWwpID0gb2xkX3B0cjsKKworICAgICAgICAgICAgICAgIHdoaWxlICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUFRSKAorICAgICAgICAgICAgICAgICAgICAmcV90aC0+dGgudGhfZnJlZV9saXN0c1tpbmRleF0udGhfZnJlZV9saXN0X3N5bmMsCisgICAgICAgICAgICAgICAgICAgIG9sZF9wdHIsCisgICAgICAgICAgICAgICAgICAgIGhlYWQgKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgICAgICAgICAgICAgIG9sZF9wdHIgPSBUQ1JfUFRSKCBxX3RoLT50aC50aF9mcmVlX2xpc3RzW2luZGV4XS50aF9mcmVlX2xpc3Rfc3luYyApOworICAgICAgICAgICAgICAgICAgICAqKCh2b2lkICoqKXRhaWwpID0gb2xkX3B0cjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBzdGFydCBuZXcgbGlzdCBvZiBub3Qtc2VsdCB0YXNrcworICAgICAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9mcmVlX2xpc3RzW2luZGV4XS50aF9mcmVlX2xpc3Rfb3RoZXIgPSBwdHI7CisgICAgICAgICAgICAgICAgKigodm9pZCAqKilwdHIpID0gTlVMTDsKKyAgICAgICAgICAgICAgICBkZXNjci0+c2l6ZV9hbGxvY2F0ZWQgPSAoc2l6ZV90KTE7ICAvLyBoZWFkIG9mIHF1ZXVlIGtlZXBzIGl0cyBsZW5ndGgKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBnb3RvIGVuZDsKKworICAgIGZyZWVfY2FsbDoKKyAgICBLRV9UUkFDRSgyNSwgKCAiX19rbXBfZmFzdF9mcmVlOiBUIyVkIENhbGxpbmcgX19rbXBfdGhyZWFkX2ZyZWUgZm9yIHNpemUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhpc190aHIpLCBzaXplICkgKTsKKyAgICBfX2ttcF9iZ2V0X2RlcXVldWUoIHRoaXNfdGhyICk7ICAgICAgICAgLyogUmVsZWFzZSBhbnkgcXVldWVkIGJ1ZmZlcnMgKi8KKyAgICBicmVsKCB0aGlzX3RociwgZGVzY3ItPnB0cl9hbGxvY2F0ZWQgKTsKKworICAgIGVuZDoKKyAgICBLRV9UUkFDRSggMjUsICggIjwtIF9fa21wX2Zhc3RfZnJlZSgpIHJldHVybnNcbiIgKSApOworCit9IC8vIGZ1bmMgX19rbXBfZmFzdF9mcmVlCisKKworLy8gSW5pdGlhbGl6ZSB0aGUgdGhyZWFkIGZyZWUgbGlzdHMgcmVsYXRlZCB0byBmYXN0IG1lbW9yeQorLy8gT25seSBkbyB0aGlzIHdoZW4gYSB0aHJlYWQgaXMgaW5pdGlhbGx5IGNyZWF0ZWQuCit2b2lkCitfX2ttcF9pbml0aWFsaXplX2Zhc3RfbWVtb3J5KCBrbXBfaW5mb190ICp0aGlzX3RociApCit7CisgICAgS0VfVFJBQ0UoMTAsICggIl9fa21wX2luaXRpYWxpemVfZmFzdF9tZW1vcnk6IENhbGxlZCBmcm9tIHRoICVwXG4iLCB0aGlzX3RociApICk7CisKKyAgICBtZW1zZXQgKCB0aGlzX3Roci0+dGgudGhfZnJlZV9saXN0cywgMCwgTlVNX0xJU1RTICogc2l6ZW9mKCBrbXBfZnJlZV9saXN0X3QgKSApOworfQorCisvLyBGcmVlIHRoZSBtZW1vcnkgaW4gdGhlIHRocmVhZCBmcmVlIGxpc3RzIHJlbGF0ZWQgdG8gZmFzdCBtZW1vcnkKKy8vIE9ubHkgZG8gdGhpcyB3aGVuIGEgdGhyZWFkIGlzIGJlaW5nIHJlYXBlZCAoZGVzdHJveWVkKS4KK3ZvaWQKK19fa21wX2ZyZWVfZmFzdF9tZW1vcnkoIGttcF9pbmZvX3QgKnRoICkKK3sKKyAgICAvLyBTdXBwb3NlIHdlIHVzZSBCR0VUIHVuZGVybHlpbmcgYWxsb2NhdG9yLCB3YWxrIHRocm91Z2ggaXRzIHN0cnVjdHVyZXMuLi4KKyAgICBpbnQgICAgICAgICAgYmluOworICAgIHRocl9kYXRhX3QgKiB0aHIgPSBnZXRfdGhyX2RhdGEoIHRoICk7CisgICAgdm9pZCAgICAgICoqIGxzdCA9IE5VTEw7CisKKyAgICBLRV9UUkFDRSg1LCAoICJfX2ttcF9mcmVlX2Zhc3RfbWVtb3J5OiBDYWxsZWQgVCMlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aCApICkgKTsKKworICAgIF9fa21wX2JnZXRfZGVxdWV1ZSggdGggKTsgICAgICAgICAvLyBSZWxlYXNlIGFueSBxdWV1ZWQgYnVmZmVycworCisgICAgLy8gRGlnIHRocm91Z2ggZnJlZSBsaXN0cyBhbmQgZXh0cmFjdCBhbGwgYWxsb2NhdGVkIGJsb2NrcworICAgIGZvciAoIGJpbiA9IDA7IGJpbiA8IE1BWF9CR0VUX0JJTlM7ICsrYmluICkgeworICAgICAgICBiZmhlYWRfdCAqIGIgPSB0aHItPmZyZWVsaXN0WyBiaW4gXS5xbC5mbGluazsKKyAgICAgICAgd2hpbGUgKCBiICE9ICZ0aHItPmZyZWVsaXN0WyBiaW4gXSApIHsKKyAgICAgICAgICAgIGlmICggKGttcF91aW50cHRyX3QpYi0+YmguYmIuYnRociAmIDEgKSB7ICAgLy8gaWYgdGhlIGJ1ZmZlciBpcyBhbiBhbGxvY2F0ZWQgYWRkcmVzcz8KKyAgICAgICAgICAgICAgICAqKCh2b2lkKiopYikgPSBsc3Q7ICAgLy8gbGluayB0aGUgbGlzdCAob3ZlcnJpZGUgYnRociwgYnV0IGtlZXAgZmxpbmsgeWV0KQorICAgICAgICAgICAgICAgIGxzdCA9ICh2b2lkKiopYjsgICAgICAvLyBwdXNoIGIgaW50byBsc3QKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGIgPSBiLT5xbC5mbGluazsgICAgICAgICAgLy8gZ2V0IG5leHQgYnVmZmVyCisgICAgICAgIH0KKyAgICB9CisgICAgd2hpbGUgKCBsc3QgIT0gTlVMTCApIHsKKyAgICAgICAgdm9pZCAqIG5leHQgPSAqbHN0OworICAgICAgICBLRV9UUkFDRSgxMCwgKCAiX19rbXBfZnJlZV9mYXN0X21lbW9yeTogZnJlZWluZyAlcCwgbmV4dD0lcCB0aCAlcCAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGxzdCwgbmV4dCwgdGgsIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRoICkgKSApOworICAgICAgICAoKnRoci0+cmVsZmNuKShsc3QpOworICAgICAgICAjaWYgQnVmU3RhdHMKKyAgICAgICAgICAgIC8vIGNvdW50IGJsb2NrcyB0byBwcmV2ZW50IHByb2JsZW1zIGluIF9fa21wX2ZpbmFsaXplX2JnZXQoKQorICAgICAgICAgICAgdGhyLT5udW1wcmVsKys7ICAgICAgIC8qIE5yIG9mIGV4cGFuc2lvbiBibG9jayByZWxlYXNlcyAqLworICAgICAgICAgICAgdGhyLT5udW1wYmxrLS07ICAgICAgIC8qIFRvdGFsIG51bWJlciBvZiBibG9ja3MgKi8KKyAgICAgICAgI2VuZGlmCisgICAgICAgIGxzdCA9ICh2b2lkKiopbmV4dDsKKyAgICB9CisKKyAgICBLRV9UUkFDRSg1LCAoICJfX2ttcF9mcmVlX2Zhc3RfbWVtb3J5OiBGcmVlZCBUIyVkXG4iLAorICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGggKSApICk7Cit9CisKKyNlbmRpZiAvLyBVU0VfRkFTVF9NRU1PUlkKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9hdG9taWMuYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9hdG9taWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTljODJmCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2F0b21pYy5jCkBAIC0wLDAgKzEsMjk2MiBAQAorLyoKKyAqIGttcF9hdG9taWMuYyAtLSBBVE9NSUMgaW1wbGVtZW50YXRpb24gcm91dGluZXMKKyAqICRSZXZpc2lvbjogNDI4MTAgJAorICogJERhdGU6IDIwMTMtMTEtMDcgMTI6MDY6MzMgLTA2MDAgKFRodSwgMDcgTm92IDIwMTMpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcF9hdG9taWMuaCIKKyNpbmNsdWRlICJrbXAuaCIgICAgICAgICAgICAgICAgICAvLyBUUlVFLCBhc20gcm91dGluZXMgcHJvdG90eXBlcworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWNoYXI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVzaG9ydDsKKworLyohCitAZGVmZ3JvdXAgQVRPTUlDX09QUyBBdG9taWMgT3BlcmF0aW9ucworVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkIGZvciBpbXBsZW1lbnRpbmcgdGhlIG1hbnkgZGlmZmVyZW50IHZhcmlldGllcyBvZiBhdG9taWMgb3BlcmF0aW9ucy4KKworVGhlIGNvbXBpbGVyIGlzIGF0IGxpYmVydHkgdG8gaW5saW5lIGF0b21pYyBvcGVyYXRpb25zIHRoYXQgYXJlIG5hdHVyYWxseSBzdXBwb3J0ZWQKK2J5IHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLiBGb3IgaW5zdGFuY2Ugb24gSUEtMzIgYXJjaGl0ZWN0dXJlIGFuIGF0b21pYyBsaWtlIHRoaXMgY2FuIGJlIGlubGluZWQKK0Bjb2RlCitzdGF0aWMgaW50IHMgPSAwOworI3ByYWdtYSBvbXAgYXRvbWljCisgICAgcysrOworQGVuZGNvZGUKK3VzaW5nIHRoZSBzaW5nbGUgaW5zdHJ1Y3Rpb246IGBsb2NrOyBpbmNsIHNgCisKK0hvd2V2ZXIgdGhlIHJ1bnRpbWUgZG9lcyBwcm92aWRlIGVudHJ5cG9pbnRzIGZvciB0aGVzZSBvcGVyYXRpb25zIHRvIHN1cHBvcnQgY29tcGlsZXJzIHRoYXQgY2hvb3NlCitub3QgdG8gaW5saW5lIHRoZW0uIChGb3IgaW5zdGFuY2UsIGBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGRgIGNvdWxkIGJlIHVzZWQgdG8gcGVyZm9ybSB0aGUKK2luY3JlbWVudCBhYm92ZS4pCisKK1RoZSBuYW1lcyBvZiB0aGUgZnVuY3Rpb25zIGFyZSBlbmNvZGVkIGJ5IHVzaW5nIHRoZSBkYXRhIHR5cGUgbmFtZSBhbmQgdGhlIG9wZXJhdGlvbiBuYW1lLCBhcyBpbiB0aGVzZSB0YWJsZXMuCisKK0RhdGEgVHlwZSAgfCBEYXRhIHR5cGUgZW5jb2RpbmcKKy0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLQoraW50OF90ICAgICB8IGBmaXhlZDFgCit1aW50OF90ICAgIHwgYGZpeGVkMXVgCitpbnQxNl90ICAgIHwgYGZpeGVkMmAKK3VpbnQxNl90ICAgfCBgZml4ZWQydWAKK2ludDMyX3QgICAgfCBgZml4ZWQ0YAordWludDMyX3QgICB8IGBmaXhlZDR1YAoraW50MzJfdCAgICB8IGBmaXhlZDhgCit1aW50MzJfdCAgIHwgYGZpeGVkOHVgCitmbG9hdCAgICAgIHwgYGZsb2F0NGAKK2RvdWJsZSAgICAgfCBgZmxvYXQ4YAorZmxvYXQgMTAgKDgwODcgZWlnaHR5IGJpdCBmbG9hdCkgIHwgYGZsb2F0MTBgCitjb21wbGV4PGZsb2F0PiAgIHwgIGBjbXBseDRgCitjb21wbGV4PGRvdWJsZT4gIHwgYGNtcGx4OGAKK2NvbXBsZXg8ZmxvYXQxMD4gfCBgY21wbHgxMGAKKzxicj4KKworT3BlcmF0aW9uIHwgT3BlcmF0aW9uIGVuY29kaW5nCistLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0KKysgfCBhZGQKKy0gfCBzdWIKK1wqIHwgbXVsCisvIHwgZGl2CismIHwgYW5kYgorPDwgfCBzaGwKK1w+XD4gfCBzaHIKK1x8IHwgb3JiCiteICB8IHhvcgorJiYgfCBhbmRsCitcfFx8IHwgb3JsCittYXhpbXVtIHwgbWF4CittaW5pbXVtIHwgbWluCisuZXF2LiAgIHwgZXF2CisubmVxdi4gIHwgbmVxdgorCis8YnI+CitGb3Igbm9uLWNvbW11dGF0aXZlIG9wZXJhdGlvbnMsIGBfcmV2YCBjYW4gYWxzbyBiZSBhZGRlZCBmb3IgdGhlIHJldmVyc2VkIG9wZXJhdGlvbi4KK0ZvciB0aGUgZnVuY3Rpb25zIHRoYXQgY2FwdHVyZSB0aGUgcmVzdWx0LCB0aGUgc3VmZml4IGBfY3B0YCBpcyBhZGRlZC4KKworVXBkYXRlIEZ1bmN0aW9ucworPT09PT09PT09PT09PT09PQorVGhlIGdlbmVyYWwgZm9ybSBvZiBhbiBhdG9taWMgZnVuY3Rpb24gdGhhdCBqdXN0IHBlcmZvcm1zIGFuIHVwZGF0ZSAod2l0aG91dCBhIGBjYXB0dXJlYCkKK0Bjb2RlCit2b2lkIF9fa21wY19hdG9taWNfPGRhdGF0eXBlPl88b3BlcmF0aW9uPiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgVFlQRSAqIGxocywgVFlQRSByaHMgKTsKK0BlbmRjb2RlCitAcGFyYW0gaWRlbnRfdCAgYSBwb2ludGVyIHRvIHNvdXJjZSBsb2NhdGlvbgorQHBhcmFtIGd0aWQgIHRoZSBnbG9iYWwgdGhyZWFkIGlkCitAcGFyYW0gbGhzICAgYSBwb2ludGVyIHRvIHRoZSBsZWZ0IG9wZXJhbmQKK0BwYXJhbSByaHMgICB0aGUgcmlnaHQgb3BlcmFuZAorCitgY2FwdHVyZWAgZnVuY3Rpb25zCis9PT09PT09PT09PT09PT09PT09CitUaGUgY2FwdHVyZSBmdW5jdGlvbnMgcGVyZm9ybSBhbiBhdG9taWMgdXBkYXRlIGFuZCByZXR1cm4gYSByZXN1bHQsIHdoaWNoIGlzIGVpdGhlciB0aGUgdmFsdWUKK2JlZm9yZSB0aGUgY2FwdHVyZSwgb3IgdGhhdCBhZnRlci4gVGhleSB0YWtlIGFuIGFkZGl0aW9uYWwgYXJndW1lbnQgdG8gZGV0ZXJtaW5lIHdoaWNoIHJlc3VsdCBpcyByZXR1cm5lZC4KK1RoZWlyIGdlbmVyYWwgZm9ybSBpcyB0aGVyZWZvcmUKK0Bjb2RlCitUWVBFIF9fa21wY19hdG9taWNfPGRhdGF0eXBlPl88b3BlcmF0aW9uPl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFRZUEUgKiBsaHMsIFRZUEUgcmhzLCBpbnQgZmxhZyApOworQGVuZGNvZGUKK0BwYXJhbSBpZGVudF90ICBhIHBvaW50ZXIgdG8gc291cmNlIGxvY2F0aW9uCitAcGFyYW0gZ3RpZCAgdGhlIGdsb2JhbCB0aHJlYWQgaWQKK0BwYXJhbSBsaHMgICBhIHBvaW50ZXIgdG8gdGhlIGxlZnQgb3BlcmFuZAorQHBhcmFtIHJocyAgIHRoZSByaWdodCBvcGVyYW5kCitAcGFyYW0gZmxhZyAgb25lIGlmIHRoZSByZXN1bHQgaXMgdG8gYmUgY2FwdHVyZWQgKmFmdGVyKiB0aGUgb3BlcmF0aW9uLCB6ZXJvIGlmIGNhcHR1cmVkICpiZWZvcmUqLgorCitUaGUgb25lIHNldCBvZiBleGNlcHRpb25zIHRvIHRoaXMgaXMgdGhlIGBjb21wbGV4PGZsb2F0PmAgdHlwZSB3aGVyZSB0aGUgdmFsdWUgaXMgbm90IHJldHVybmVkLAorcmF0aGVyIGFuIGV4dHJhIGFyZ3VtZW50IHBvaW50ZXIgaXMgcGFzc2VkLgorCitUaGV5IGxvb2sgbGlrZQorQGNvZGUKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDRfPG9wPl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4MzIgcmhzLCBrbXBfY21wbHgzMiAqIG91dCwgaW50IGZsYWcgKTsKK0BlbmRjb2RlCisKK1JlYWQgYW5kIFdyaXRlIE9wZXJhdGlvbnMKKz09PT09PT09PT09PT09PT09PT09PT09PT0KK1RoZSBPcGVuTVA8c3VwPio8L3N1cD4gc3RhbmRhcmQgbm93IHN1cHBvcnRzIGF0b21pYyBvcGVyYXRpb25zIHRoYXQgc2ltcGx5IGVuc3VyZSB0aGF0IHRoZQordmFsdWUgaXMgcmVhZCBvciB3cml0dGVuIGF0b21pY2FsbHksIHdpdGggbm8gbW9kaWZpY2F0aW9uCitwZXJmb3JtZWQuIEluIG1hbnkgY2FzZXMgb24gSUEtMzIgYXJjaGl0ZWN0dXJlIHRoZXNlIG9wZXJhdGlvbnMgY2FuIGJlIGlubGluZWQgc2luY2UKK3RoZSBhcmNoaXRlY3R1cmUgZ3VhcmFudGVlcyB0aGF0IG5vIHRlYXJpbmcgb2NjdXJzIG9uIGFsaWduZWQgb2JqZWN0cworYWNjZXNzZWQgd2l0aCBhIHNpbmdsZSBtZW1vcnkgb3BlcmF0aW9uIG9mIHVwIHRvIDY0IGJpdHMgaW4gc2l6ZS4KKworVGhlIGdlbmVyYWwgZm9ybSBvZiB0aGUgcmVhZCBvcGVyYXRpb25zIGlzCitAY29kZQorVFlQRSBfX2ttcGNfYXRvbWljXzx0eXBlPl9yZCAoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFRZUEUgKiBsb2MgKTsKK0BlbmRjb2RlCisKK0ZvciB0aGUgd3JpdGUgb3BlcmF0aW9ucyB0aGUgZm9ybSBpcworQGNvZGUKK3ZvaWQgX19rbXBjX2F0b21pY188dHlwZT5fd3IgKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBUWVBFICogbGhzLCBUWVBFIHJocyApOworQGVuZGNvZGUKKworRnVsbCBsaXN0IG9mIGZ1bmN0aW9ucworPT09PT09PT09PT09PT09PT09PT09PQorVGhpcyBsZWFkcyB0byB0aGUgZ2VuZXJhdGlvbiBvZiAzNzYgYXRvbWljIGZ1bmN0aW9ucywgYXMgZm9sbG93cy4KKworRnVuY3RvbnMgZm9yIGludGVnZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoZXJlIGFyZSB2ZXJzaW9ucyBoZXJlIGZvciBpbnRlZ2VycyBvZiBzaXplIDEsMiw0IGFuZCA4IGJ5dGVzIGJvdGggc2lnbmVkIGFuZCB1bnNpZ25lZCAod2hlcmUgdGhhdCBtYXR0ZXJzKS4KK0Bjb2RlCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfYWRkCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfYWRkX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FkZF9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hbmRiX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGwKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hbmRsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2RpdgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9mbG9hdDgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfZXF2CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfZXF2X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX21heAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX21heF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9taW4KKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9taW5fY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfbXVsCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfbXVsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX211bF9mbG9hdDgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tdWxfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9uZXF2CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfbmVxdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfb3JsCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfb3JsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3JkCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc2hsCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc2hsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3NobF9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc2hsX3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3NocgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3Nocl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaHJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3Nocl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc3ViX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc3dwCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfd3IKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV94b3IKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV94b3JfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDF1X2RpdgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDF1X2Rpdl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDF1X2Rpdl9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDF1X3NocgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9zaHJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDF1X3Nocl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDF1X3Nocl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hZGQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hZGRfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfYWRkX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfYW5kYgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2FuZGJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfYW5kbAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2FuZGxfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfZGl2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfZGl2X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfZGl2X2Zsb2F0OAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9lcXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9lcXZfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfbWF4CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfbWF4X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX21pbgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX21pbl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWwKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWxfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfbXVsX2Zsb2F0OAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX211bF9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX25lcXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9uZXF2X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX29yYgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX29yYl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9vcmwKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9vcmxfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfcmQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaGwKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaGxfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfc2hsX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaGxfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfc2hyCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfc2hyX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3Nocl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfc2hyX3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3N1YgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zd3AKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl93cgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3hvcgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3hvcl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2X2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2X2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfc2hyCisgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X3Nocl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfc2hyX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfc2hyX3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2FkZAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2FkZF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGRfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hbmRiCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfYW5kYl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hbmRsCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfYW5kbF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfZGl2X2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfZmxvYXQ4CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfZGl2X2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2VxdgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2Vxdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tYXgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tYXhfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfbWluCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfbWluX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X211bAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X211bF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWxfZmxvYXQ4CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfbXVsX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfbmVxdgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X25lcXZfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfb3JiCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfb3JiX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X29ybAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X29ybF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9yZAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3NobAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3NobF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaGxfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3NobF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc2hyX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHJfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc3ViCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc3ViX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc3ViX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc3ViX3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3N3cAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3dyCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfeG9yCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfeG9yX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXZfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXZfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc2hyX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHJfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfYWRkCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfYWRkX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FkZF9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hbmRiX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGwKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hbmRsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2RpdgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9mbG9hdDgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfZXF2CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfZXF2X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X21heAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X21heF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9taW4KKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9taW5fY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfbXVsCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfbXVsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X211bF9mbG9hdDgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWxfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9uZXF2CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfbmVxdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfb3JsCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfb3JsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3JkCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc2hsCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc2hsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3NobF9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc2hsX3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3NocgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3Nocl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3Nocl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc3ViX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc3dwCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfd3IKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF94b3IKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF94b3JfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDh1X2RpdgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDh1X3NocgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zaHJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDh1X3Nocl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDh1X3Nocl9yZXYKK0BlbmRjb2RlCisKK0Z1bmN0aW9ucyBmb3IgZmxvYXRpbmcgcG9pbnQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoZXJlIGFyZSB2ZXJzaW9ucyBoZXJlIGZvciBmbG9hdGluZyBwb2ludCBudW1iZXJzIG9mIHNpemUgNCwgOCwgMTAgYW5kIDE2IGJ5dGVzLgorKFRlbiBieXRlIGZsb2F0cyBhcmUgdXNlZCBieSBYODcsIGJ1dCBhcmUgbm93IHJhcmUpLgorQGNvZGUKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGRfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfYWRkX2Zsb2F0OAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X2FkZF9mcAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X2RpdgorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9mbG9hdDgKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfZnAKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfbWF4CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfbWF4X2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X21pbgorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X21pbl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWwKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWxfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfbXVsX2Zsb2F0OAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X211bF9mcAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3JkCisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfc3ViCisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2Zsb2F0OAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9mcAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zd3AKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF93cgorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X2FkZAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X2FkZF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGRfZnAKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfZGl2X2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfZnAKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfbWF4CisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfbWF4X2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X21pbgorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X21pbl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tdWwKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tdWxfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfbXVsX2ZwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfcmQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWIKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWJfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWJfZnAKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWJfcmV2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfc3dwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfd3IKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkCisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX2FkZF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkX2ZwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX2RpdgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX2Rpdl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX2Rpdl9mcAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX211bAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9tdWxfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX211bF9mcAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9yZAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWIKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViX2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWJfZnAKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViX3JldgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9zd3AKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfd3IKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYWRkCisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2FkZF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9tYXgKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWF4X2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9taW4KKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWluX2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9tdWwKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbXVsX2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9yZAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWIKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfcmV2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X3N3cAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl93cgorQGVuZGNvZGUKKworRnVuY3Rpb25zIGZvciBDb21wbGV4IHR5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0Z1bmN0aW9ucyBmb3IgY29tcGxleCB0eXBlcyB3aG9zZSBjb21wb25lbnQgZmxvYXRpbmcgcG9pbnQgdmFyaWFibGVzIGFyZSBvZiBzaXplIDQsOCwxMCBvciAxNiBieXRlcy4KK1RoZSBuYW1lcyBoZXJlIGFyZSBiYXNlZCBvbiB0aGUgc2l6ZSBvZiB0aGUgY29tcG9uZW50IGZsb2F0LCAqbm90KiB0aGUgc2l6ZSBvZiB0aGUgY29tcGxleCB0eXBlLiBTbworYF9fa21wY19hdG9tY19jbXBseDhfYWRkYCBpcyBhbiBvcGVyYXRpb24gb24gYSBgY29tcGxleDxkb3VibGU+YCBvciBgY29tcGxleChraW5kPTgpYCwgKm5vdCogYGNvbXBsZXg8ZmxvYXQ+YC4KKworQGNvZGUKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9hZGQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9hZGRfY21wbHg4CisgICAgX19rbXBjX2F0b21pY19jbXBseDRfYWRkX2NwdAorICAgIF9fa21wY19hdG9taWNfY21wbHg0X2RpdgorICAgIF9fa21wY19hdG9taWNfY21wbHg0X2Rpdl9jbXBseDgKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXZfY3B0CisgICAgX19rbXBjX2F0b21pY19jbXBseDRfZGl2X2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19jbXBseDRfbXVsCisgICAgX19rbXBjX2F0b21pY19jbXBseDRfbXVsX2NtcGx4OAorICAgIF9fa21wY19hdG9taWNfY21wbHg0X211bF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9yZAorICAgIF9fa21wY19hdG9taWNfY21wbHg0X3N1YgorICAgIF9fa21wY19hdG9taWNfY21wbHg0X3N1Yl9jbXBseDgKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWJfY3B0CisgICAgX19rbXBjX2F0b21pY19jbXBseDRfc3ViX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWJfcmV2CisgICAgX19rbXBjX2F0b21pY19jbXBseDRfc3dwCisgICAgX19rbXBjX2F0b21pY19jbXBseDRfd3IKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9hZGQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9hZGRfY3B0CisgICAgX19rbXBjX2F0b21pY19jbXBseDhfZGl2CisgICAgX19rbXBjX2F0b21pY19jbXBseDhfZGl2X2NwdAorICAgIF9fa21wY19hdG9taWNfY21wbHg4X2Rpdl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19jbXBseDhfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfY21wbHg4X211bAorICAgIF9fa21wY19hdG9taWNfY21wbHg4X211bF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9yZAorICAgIF9fa21wY19hdG9taWNfY21wbHg4X3N1YgorICAgIF9fa21wY19hdG9taWNfY21wbHg4X3N1Yl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9zdWJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfY21wbHg4X3N1Yl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9zd3AKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF93cgorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9hZGQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfYWRkX2NwdAorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9kaXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfZGl2X2NwdAorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9kaXZfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19jbXBseDEwX211bAorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9tdWxfY3B0CisgICAgX19rbXBjX2F0b21pY19jbXBseDEwX3JkCisgICAgX19rbXBjX2F0b21pY19jbXBseDEwX3N1YgorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9zdWJfY3B0CisgICAgX19rbXBjX2F0b21pY19jbXBseDEwX3N1Yl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19jbXBseDEwX3N1Yl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3dwCisgICAgX19rbXBjX2F0b21pY19jbXBseDEwX3dyCisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2FkZAorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9hZGRfY3B0CisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2RpdgorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfY3B0CisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsCisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X211bF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfcmQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViCisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3dwCisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3dyCitAZW5kY29kZQorKi8KKworLyohCitAaW5ncm91cCBBVE9NSUNfT1BTCitAeworKi8KKworLyoKKyAqIEdsb2JhbCB2YXJzCisgKi8KKworI2lmbmRlZiBLTVBfR09NUF9DT01QQVQKK2ludCBfX2ttcF9hdG9taWNfbW9kZSA9IDE7ICAgICAgLy8gSW50ZWwgcGVyZgorI2Vsc2UKK2ludCBfX2ttcF9hdG9taWNfbW9kZSA9IDI7ICAgICAgLy8gR09NUCBjb21wYXRpYmlsaXR5CisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisKK0tNUF9BTElHTigxMjgpCisKK2ttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrOyAgICAgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBpbiBHbnUgY29tcGF0IG1vZGUgICAqLwora21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfMWk7ICAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciAxLWJ5dGUgZml4ZWQgZGF0YSB0eXBlcyAqLwora21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfMmk7ICAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciAyLWJ5dGUgZml4ZWQgZGF0YSB0eXBlcyAqLwora21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfNGk7ICAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciA0LWJ5dGUgZml4ZWQgZGF0YSB0eXBlcyAqLwora21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfNHI7ICAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciBrbXBfcmVhbDMyIGRhdGEgdHlwZSAgICAqLwora21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfOGk7ICAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciA4LWJ5dGUgZml4ZWQgZGF0YSB0eXBlcyAqLwora21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfOHI7ICAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciBrbXBfcmVhbDY0IGRhdGEgdHlwZSAgICAqLwora21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfOGM7ICAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciBjb21wbGV4IGJ5dGUgZGF0YSB0eXBlICAqLwora21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfMTByOyAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciBsb25nIGRvdWJsZSBkYXRhIHR5cGUgICAqLwora21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfMTZyOyAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciBfUXVhZCBkYXRhIHR5cGUgICAgICAgICAqLwora21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfMTZjOyAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciBkb3VibGUgY29tcGxleCBkYXRhIHR5cGUqLwora21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfMjBjOyAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciBsb25nIGRvdWJsZSBjb21wbGV4IHR5cGUqLwora21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfMzJjOyAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciBfUXVhZCBjb21wbGV4IGRhdGEgdHlwZSAqLworCisKKy8qCisgIDIwMDctMDMtMDI6CisgIFdpdGhvdXQgInZvbGF0aWxlIiBzcGVjaWZpZXIgaW4gT1BfQ01QWENIRyBhbmQgTUlOX01BWF9DTVBYQ0hHIHdlIGhhdmUgYQorICBidWcgb24gKl8zMiBhbmQgKl8zMmUuIFRoaXMgaXMganVzdCBhIHRlbXBvcmFyeSB3b3JrYXJvdW5kIGZvciB0aGUgcHJvYmxlbS4KKyAgSXQgc2VlbXMgdGhlIHJpZ2h0IHNvbHV0aW9uIGlzIHdyaXRpbmcgT1BfQ01QWENIRyBhbmQgTUlOX01BWF9DTVBYQ0hHCisgIHJvdXRpbmVzIGluIGFzc2VtYmxlciBsYW5ndWFnZS4KKyovCisjZGVmaW5lIEtNUF9BVE9NSUNfVk9MQVRJTEUgdm9sYXRpbGUKKworI2lmICggS01QX0FSQ0hfWDg2ICkgJiYgS01QX0hBVkVfUVVBRAorCisgICAgc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yICs9KCBRdWFkX2E0X3QgJiBsaHMsIFF1YWRfYTRfdCAmIHJocyApIHsgbGhzLnEgKz0gcmhzLnE7IH07CisgICAgc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yIC09KCBRdWFkX2E0X3QgJiBsaHMsIFF1YWRfYTRfdCAmIHJocyApIHsgbGhzLnEgLT0gcmhzLnE7IH07CisgICAgc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yICo9KCBRdWFkX2E0X3QgJiBsaHMsIFF1YWRfYTRfdCAmIHJocyApIHsgbGhzLnEgKj0gcmhzLnE7IH07CisgICAgc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yIC89KCBRdWFkX2E0X3QgJiBsaHMsIFF1YWRfYTRfdCAmIHJocyApIHsgbGhzLnEgLz0gcmhzLnE7IH07CisgICAgc3RhdGljIGlubGluZSBib29sIG9wZXJhdG9yIDwgKCBRdWFkX2E0X3QgJiBsaHMsIFF1YWRfYTRfdCAmIHJocyApIHsgcmV0dXJuIGxocy5xIDwgcmhzLnE7IH0KKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgb3BlcmF0b3IgPiAoIFF1YWRfYTRfdCAmIGxocywgUXVhZF9hNF90ICYgcmhzICkgeyByZXR1cm4gbGhzLnEgPiByaHMucTsgfQorCisgICAgc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yICs9KCBRdWFkX2ExNl90ICYgbGhzLCBRdWFkX2ExNl90ICYgcmhzICkgeyBsaHMucSArPSByaHMucTsgfTsKKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgb3BlcmF0b3IgLT0oIFF1YWRfYTE2X3QgJiBsaHMsIFF1YWRfYTE2X3QgJiByaHMgKSB7IGxocy5xIC09IHJocy5xOyB9OworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvciAqPSggUXVhZF9hMTZfdCAmIGxocywgUXVhZF9hMTZfdCAmIHJocyApIHsgbGhzLnEgKj0gcmhzLnE7IH07CisgICAgc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yIC89KCBRdWFkX2ExNl90ICYgbGhzLCBRdWFkX2ExNl90ICYgcmhzICkgeyBsaHMucSAvPSByaHMucTsgfTsKKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgb3BlcmF0b3IgPCAoIFF1YWRfYTE2X3QgJiBsaHMsIFF1YWRfYTE2X3QgJiByaHMgKSB7IHJldHVybiBsaHMucSA8IHJocy5xOyB9CisgICAgc3RhdGljIGlubGluZSBib29sIG9wZXJhdG9yID4gKCBRdWFkX2ExNl90ICYgbGhzLCBRdWFkX2ExNl90ICYgcmhzICkgeyByZXR1cm4gbGhzLnEgPiByaHMucTsgfQorCisgICAgc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yICs9KCBrbXBfY21wbHgxMjhfYTRfdCAmIGxocywga21wX2NtcGx4MTI4X2E0X3QgJiByaHMgKSB7IGxocy5xICs9IHJocy5xOyB9OworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvciAtPSgga21wX2NtcGx4MTI4X2E0X3QgJiBsaHMsIGttcF9jbXBseDEyOF9hNF90ICYgcmhzICkgeyBsaHMucSAtPSByaHMucTsgfTsKKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgb3BlcmF0b3IgKj0oIGttcF9jbXBseDEyOF9hNF90ICYgbGhzLCBrbXBfY21wbHgxMjhfYTRfdCAmIHJocyApIHsgbGhzLnEgKj0gcmhzLnE7IH07CisgICAgc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yIC89KCBrbXBfY21wbHgxMjhfYTRfdCAmIGxocywga21wX2NtcGx4MTI4X2E0X3QgJiByaHMgKSB7IGxocy5xIC89IHJocy5xOyB9OworCisgICAgc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yICs9KCBrbXBfY21wbHgxMjhfYTE2X3QgJiBsaHMsIGttcF9jbXBseDEyOF9hMTZfdCAmIHJocyApIHsgbGhzLnEgKz0gcmhzLnE7IH07CisgICAgc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yIC09KCBrbXBfY21wbHgxMjhfYTE2X3QgJiBsaHMsIGttcF9jbXBseDEyOF9hMTZfdCAmIHJocyApIHsgbGhzLnEgLT0gcmhzLnE7IH07CisgICAgc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yICo9KCBrbXBfY21wbHgxMjhfYTE2X3QgJiBsaHMsIGttcF9jbXBseDEyOF9hMTZfdCAmIHJocyApIHsgbGhzLnEgKj0gcmhzLnE7IH07CisgICAgc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yIC89KCBrbXBfY21wbHgxMjhfYTE2X3QgJiBsaHMsIGttcF9jbXBseDEyOF9hMTZfdCAmIHJocyApIHsgbGhzLnEgLz0gcmhzLnE7IH07CisKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIEFUT01JQyBpbXBsZW1lbnRhdGlvbiByb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogb25lIHJvdXRpbmUgZm9yIGVhY2ggb3BlcmF0aW9uIGFuZCBvcGVyYW5kIHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLy8gQWxsIHJvdXRpbmVzIGRlY2xhcmF0aW9ucyBsb29rcyBsaWtlCisvLyB2b2lkIF9fa21wY19hdG9taWNfUlRZUEVfT1AoIGlkZW50X3QqLCBpbnQsIFRZUEUgKmxocywgVFlQRSByaHMgKTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIEtNUF9DSEVDS19HVElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIGd0aWQgPT0gS01QX0dUSURfVU5LTk9XTiApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAvLyBjaGVjayBhbmQgZ2V0IGd0aWQgd2hlbiBuZWVkZWQKKworLy8gQmVnaW5uaW5nIG9mIGEgZGVmaW5pdGlvbiAocHJvdmlkZXMgbmFtZSwgcGFyYW1ldGVycywgZ2VidWcgdHJhY2UpCisvLyAgICAgVFlQRV9JRCAtIG9wZXJhbmRzIHR5cGUgYW5kIHNpemUgKGZpeGVkKiwgZml4ZWQqdSBmb3Igc2lnbmVkLCB1bnNpZ25lZCBmaXhlZCkKKy8vICAgICBPUF9JRCAgIC0gb3BlcmF0aW9uIGlkZW50aWZpZXIgKGFkZCwgc3ViLCBtdWwsIC4uLikKKy8vICAgICBUWVBFICAgIC0gb3BlcmFuZHMnIHR5cGUKKyNkZWZpbmUgQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSwgUkVUX1RZUEUpIFwKK1JFVF9UWVBFIF9fa21wY19hdG9taWNfIyNUWVBFX0lEIyNfIyNPUF9JRCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgVFlQRSAqIGxocywgVFlQRSByaHMgKSBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS0FfVFJBQ0UoMTAwLCgiX19rbXBjX2F0b21pY18iICNUWVBFX0lEICJfIiAjT1BfSUQgIjogVCMlZFxuIiwgZ3RpZCApKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBMb2NrIHZhcmlhYmxlcyB1c2VkIGZvciBjcml0aWNhbCBzZWN0aW9ucyBmb3IgdmFyaW91cyBzaXplIG9wZXJhbmRzCisjZGVmaW5lIEFUT01JQ19MT0NLMCAgIF9fa21wX2F0b21pY19sb2NrICAgICAgIC8vIGFsbCB0eXBlcywgZm9yIEdudSBjb21wYXQKKyNkZWZpbmUgQVRPTUlDX0xPQ0sxaSAgX19rbXBfYXRvbWljX2xvY2tfMWkgICAgLy8gY2hhcgorI2RlZmluZSBBVE9NSUNfTE9DSzJpICBfX2ttcF9hdG9taWNfbG9ja18yaSAgICAvLyBzaG9ydAorI2RlZmluZSBBVE9NSUNfTE9DSzRpICBfX2ttcF9hdG9taWNfbG9ja180aSAgICAvLyBsb25nIGludAorI2RlZmluZSBBVE9NSUNfTE9DSzRyICBfX2ttcF9hdG9taWNfbG9ja180ciAgICAvLyBmbG9hdAorI2RlZmluZSBBVE9NSUNfTE9DSzhpICBfX2ttcF9hdG9taWNfbG9ja184aSAgICAvLyBsb25nIGxvbmcgaW50CisjZGVmaW5lIEFUT01JQ19MT0NLOHIgIF9fa21wX2F0b21pY19sb2NrXzhyICAgIC8vIGRvdWJsZQorI2RlZmluZSBBVE9NSUNfTE9DSzhjICBfX2ttcF9hdG9taWNfbG9ja184YyAgICAvLyBmbG9hdCBjb21wbGV4CisjZGVmaW5lIEFUT01JQ19MT0NLMTByIF9fa21wX2F0b21pY19sb2NrXzEwciAgIC8vIGxvbmcgZG91YmxlCisjZGVmaW5lIEFUT01JQ19MT0NLMTZyIF9fa21wX2F0b21pY19sb2NrXzE2ciAgIC8vIF9RdWFkCisjZGVmaW5lIEFUT01JQ19MT0NLMTZjIF9fa21wX2F0b21pY19sb2NrXzE2YyAgIC8vIGRvdWJsZSBjb21wbGV4CisjZGVmaW5lIEFUT01JQ19MT0NLMjBjIF9fa21wX2F0b21pY19sb2NrXzIwYyAgIC8vIGxvbmcgZG91YmxlIGNvbXBsZXgKKyNkZWZpbmUgQVRPTUlDX0xPQ0szMmMgX19rbXBfYXRvbWljX2xvY2tfMzJjICAgLy8gX1F1YWQgY29tcGxleAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9wZXJhdGlvbiBvbiAqbGhzLCByaHMgYm91bmQgYnkgY3JpdGljYWwgc2VjdGlvbgorLy8gICAgIE9QICAgICAtIG9wZXJhdG9yIChpdCdzIHN1cHBvc2VkIHRvIGNvbnRhaW4gYW4gYXNzaWdubWVudCkKKy8vICAgICBMQ0tfSUQgLSBsb2NrIGlkZW50aWZpZXIKKy8vIE5vdGU6IGRvbid0IGNoZWNrIGd0aWQgYXMgaXQgc2hvdWxkIGFsd2F5cyBiZSB2YWxpZAorLy8gMSwgMi1ieXRlIC0gZXhwZWN0IHZhbGlkIHBhcmFtZXRlciwgb3RoZXIgLSBjaGVjayBiZWZvcmUgdGhpcyBtYWNybworI2RlZmluZSBPUF9DUklUSUNBTChPUCxMQ0tfSUQpIFwKKyAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgqbGhzKSBPUCAocmhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGb3IgR05VIGNvbXBhdGliaWxpdHksIHdlIG1heSBuZWVkIHRvIHVzZSBhIGNyaXRpY2FsIHNlY3Rpb24sCisvLyBldmVuIHRob3VnaCBpdCBpcyBub3QgcmVxdWlyZWQgYnkgdGhlIElTQS4KKy8vCisvLyBPbiBJQS0zMiBhcmNoaXRlY3R1cmUsIGFsbCBhdG9taWMgb3BlcmF0aW9ucyBleGNlcHQgZm9yIGZpeGVkIDQgYnl0ZSBhZGQsCisvLyBzdWIsIGFuZCBiaXR3aXNlIGxvZ2ljYWwgb3BzLCBhbmQgMSAmIDIgYnl0ZSBsb2dpY2FsIG9wcyB1c2UgYSBjb21tb24KKy8vIGNyaXRpY2FsIHNlY3Rpb24uICBPbiBJbnRlbChSKSA2NCwgYWxsIGF0b21pYyBvcGVyYXRpb25zIGFyZSBkb25lIHdpdGggZmV0Y2gKKy8vIGFuZCBhZGQgb3IgY29tcGFyZSBhbmQgZXhjaGFuZ2UuICBUaGVyZWZvcmUsIHRoZSBGTEFHIHBhcmFtZXRlciB0byB0aGlzCisvLyBtYWNybyBpcyBlaXRoZXIgS01QX0FSQ0hfWDg2IG9yIDAgKG9yIDEsIGZvciBJbnRlbC1zcGVjaWZpYyBleHRlbnNpb24gd2hpY2gKKy8vIHJlcXVpcmUgYSBjcml0aWNhbCBzZWN0aW9uLCB3aGVyZSB3ZSBwcmVkaWN0IHRoYXQgdGhleSB3aWxsIGJlIGltcGxlbWVudGVkCisvLyBpbiB0aGUgR251IGNvZGVnZW4gYnkgY2FsbGluZyBHT01QX2F0b21pY19zdGFydCgpIC8gR09NUF9hdG9taWNfZW5kKCkpLgorLy8KKy8vIFdoZW4gdGhlIE9QX0dPTVBfQ1JJVElDQUwgbWFjcm8gaXMgdXNlZCBpbiBhICpDUklUSUNBTCogbWFjcm8gY29uc3RydWN0LAorLy8gdGhlIEZMQUcgcGFyYW1ldGVyIHNob3VsZCBhbHdheXMgYmUgMS4gIElmIHdlIGtub3cgdGhhdCB3ZSB3aWxsIGJlIHVzaW5nCisvLyBhIGNyaXRpY2FsIHNlY3Rpb24sIHRoZW4gd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4gdGhhdCB3ZSB1c2UgdGhlIGdlbmVyaWMKKy8vIGxvY2sgX19rbXBfYXRvbWljX2xvY2sgdG8gcHJvdGVjdCB0aGUgYXRvbWljIHVwZGF0ZSwgYW5kIG5vdCBvZiBvZiB0aGUKKy8vIGxvY2tzIHRoYXQgYXJlIHNwZWNpYWxpemVkIGJhc2VkIHVwb24gdGhlIHNpemUgb3IgdHlwZSBvZiB0aGUgZGF0YS4KKy8vCisvLyBJZiBGTEFHIGlzIDAsIHRoZW4gd2UgYXJlIHJlbHlpbmcgb24gZGVhZCBjb2RlIGVsaW1pbmF0aW9uIGJ5IHRoZSBidWlsZAorLy8gY29tcGlsZXIgdG8gZ2V0IHJpZCBvZiB0aGUgdXNlbGVzcyBibG9jayBvZiBjb2RlLCBhbmQgc2F2ZSBhIG5lZWRsZXNzCisvLyBicmFuY2ggYXQgcnVudGltZS4KKy8vCisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyMgZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUwoT1AsRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggKEZMQUcpICYmIChfX2ttcF9hdG9taWNfbW9kZSA9PSAyKSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ1JJVElDQUwoIE9QLCAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorIyBlbHNlCisjIGRlZmluZSBPUF9HT01QX0NSSVRJQ0FMKE9QLEZMQUcpCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisKKyNpZiBLTVBfTUlDCisjIGRlZmluZSBLTVBfRE9fUEFVU0UgX21tX2RlbGF5XzMyKCAzMCApCisjZWxzZQorIyBkZWZpbmUgS01QX0RPX1BBVVNFIEtNUF9DUFVfUEFVU0UoKQorI2VuZGlmIC8qIEtNUF9NSUMgKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPcGVyYXRpb24gb24gKmxocywgcmhzIHVzaW5nICJjb21wYXJlX2FuZF9zdG9yZSIgcm91dGluZQorLy8gICAgIFRZUEUgICAgLSBvcGVyYW5kcycgdHlwZQorLy8gICAgIEJJVFMgICAgLSBzaXplIGluIGJpdHMsIHVzZWQgdG8gZGlzdGluZ3Vpc2ggbG93IGxldmVsIGNhbGxzCisvLyAgICAgT1AgICAgICAtIG9wZXJhdG9yCisvLyBOb3RlOiB0ZW1wX3ZhbCBpbnRyb2R1Y2VkIGluIG9yZGVyIHRvIGZvcmNlIHRoZSBjb21waWxlciB0byByZWFkCisvLyAgICAgICAqbGhzIG9ubHkgb25jZSAody9vIGl0IHRoZSBjb21waWxlciByZWFkcyAqbGhzIHR3aWNlKQorI2RlZmluZSBPUF9DTVBYQ0hHKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFlQRSBLTVBfQVRPTUlDX1ZPTEFUSUxFIHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUWVBFIG9sZF92YWx1ZSwgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRlbXBfdmFsID0gKmxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgb2xkX3ZhbHVlID0gdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgT1AgcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHdoaWxlICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRIyNCSVRTKCAoa21wX2ludCMjQklUUyAqKSBsaHMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICZvbGRfdmFsdWUsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgJm5ld192YWx1ZSApICkgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBLTVBfRE9fUEFVU0U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0ZW1wX3ZhbCA9ICpsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG9sZF92YWx1ZSA9IHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlIE9QIHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyNpZiBVU0VfQ01QWENIR19GSVgKKy8vIDIwMDctMDYtMjU6CisvLyB3b3JrYXJvdW5kIGZvciBDNzgyODcgKGNvbXBsZXgoa2luZD00KSBkYXRhIHR5cGUpCisvLyBsaW5fMzIsIGxpbl8zMmUsIHdpbl8zMiBhbmQgd2luXzMyZSBhcmUgYWZmZWN0ZWQgKEkgdmVyaWZpZWQgdGhlIGFzbSkKKy8vIENvbXBpbGVyIGlnbm9yZXMgdGhlIHZvbGF0aWxlIHF1YWxpZmllciBvZiB0aGUgdGVtcF92YWwgaW4gdGhlIE9QX0NNUFhDSEcgbWFjcm8uCisvLyBUaGlzIGlzIGEgcHJvYmxlbSBvZiB0aGUgY29tcGlsZXIuCisvLyBSZWxhdGVkIHRyYWNrZXIgaXMgQzc2MDA1LCB0YXJnZXRlZCB0byAxMS4wLgorLy8gSSB2ZXJpZmllZCB0aGUgYXNtIG9mIHRoZSB3b3JrYXJvdW5kLgorI2RlZmluZSBPUF9DTVBYQ0hHX1dPUktBUk9VTkQoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwljaGFyIGFub255bVsgKCBzaXplb2YoIFRZUEUgKSA9PSBzaXplb2YoIGttcF9pbnQjI0JJVFMgKSApID8gKCAxICkgOiAoIDAgKSBdID0geyAxIH07IFwKKwlzdHJ1Y3QgX3NzcyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgIFRZUEUgICAgICAgICAgICBjbXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICBrbXBfaW50IyNCSVRTICAgKnZ2djsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0cnVjdCBfc3NzIG9sZF92YWx1ZSwgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgb2xkX3ZhbHVlLnZ2diA9ICgga21wX2ludCMjQklUUyAqICkmb2xkX3ZhbHVlLmNtcDsgICAgICAgICAgICAgICAgXAorICAgICAgICBuZXdfdmFsdWUudnZ2ID0gKCBrbXBfaW50IyNCSVRTICogKSZuZXdfdmFsdWUuY21wOyAgICAgICAgICAgICAgICBcCisgICAgICAgICpvbGRfdmFsdWUudnZ2ID0gKiAoIHZvbGF0aWxlIGttcF9pbnQjI0JJVFMgKiApIGxoczsgICAgICAgICAgICAgIFwKKyAgICAgICAgbmV3X3ZhbHVlLmNtcCA9IG9sZF92YWx1ZS5jbXAgT1AgcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3aGlsZSAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUSMjQklUUyggKGttcF9pbnQjI0JJVFMgKikgbGhzLCBcCisgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSBvbGRfdmFsdWUudnZ2LCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopIG5ld192YWx1ZS52dnYgKSApICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfRE9fUEFVU0U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAqb2xkX3ZhbHVlLnZ2diA9ICogKCB2b2xhdGlsZSBrbXBfaW50IyNCSVRTICogKSBsaHM7ICAgICAgICAgIFwKKwkgICAgbmV3X3ZhbHVlLmNtcCA9IG9sZF92YWx1ZS5jbXAgT1AgcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisvLyBlbmQgb2YgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIHdvcmthcm91bmQgZm9yIEM3ODI4NworI2VuZGlmIC8vIFVTRV9DTVBYQ0hHX0ZJWAorCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFg4NiBvciBYODZfNjQ6IG5vIGFsaWdubWVudCBwcm9ibGVtcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNkZWZpbmUgQVRPTUlDX0ZJWEVEX0FERChUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcpIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKE9QIyM9LEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBPUCB1c2VkIGFzIGEgc2lnbiBmb3Igc3VidHJhY3Rpb246IChsaHMtcmhzKSAtLT4gKGxocystcmhzKSAqLyAgICAgIFwKKyAgICBLTVBfVEVTVF9USEVOX0FERCMjQklUUyggbGhzLCBPUCByaHMgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX0ZMT0FUX0FERChUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcpIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKE9QIyM9LEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBPUCB1c2VkIGFzIGEgc2lnbiBmb3Igc3VidHJhY3Rpb246IChsaHMtcmhzKSAtLT4gKGxocystcmhzKSAqLyAgICAgIFwKKyAgICBLTVBfVEVTVF9USEVOX0FERF9SRUFMIyNCSVRTKCBsaHMsIE9QIHJocyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX0NNUFhDSEcoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsTENLX0lELE1BU0ssR09NUF9GTEFHKSAgIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKE9QIyM9LEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DTVBYQ0hHKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNpZiBVU0VfQ01QWENIR19GSVgKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHdvcmthcm91bmQgZm9yIEM3ODI4NyAoY29tcGxleChraW5kPTQpIGRhdGEgdHlwZSkKKyNkZWZpbmUgQVRPTUlDX0NNUFhDSEdfV09SS0FST1VORChUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcpICAgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChPUCMjPSxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DTVBYQ0hHX1dPUktBUk9VTkQoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorLy8gZW5kIG9mIHRoZSBzZWNvbmQgcGFydCBvZiB0aGUgd29ya2Fyb3VuZCBmb3IgQzc4Mjg3CisjZW5kaWYKKworI2Vsc2UKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvZGUgZm9yIG90aGVyIGFyY2hpdGVjdHVyZXMgdGhhdCBkb24ndCBoYW5kbGUgdW5hbGlnbmVkIGFjY2Vzc2VzLgorI2RlZmluZSBBVE9NSUNfRklYRURfQUREKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLExDS19JRCxNQVNLLEdPTVBfRkxBRykgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoT1AjIz0sR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggISAoIChrbXBfdWludHB0cl90KSBsaHMgJiAweCMjTUFTSykgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAvKiBPUCB1c2VkIGFzIGEgc2lnbiBmb3Igc3VidHJhY3Rpb246IChsaHMtcmhzKSAtLT4gKGxocystcmhzKSAqLyAgXAorICAgICAgICBLTVBfVEVTVF9USEVOX0FERCMjQklUUyggbGhzLCBPUCByaHMgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DUklUSUNBTChPUCMjPSxMQ0tfSUQpICAvKiB1bmFsaWduZWQgYWRkcmVzcyAtIHVzZSBjcml0aWNhbCAqLyAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfRkxPQVRfQUREKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLExDS19JRCxNQVNLLEdPTVBfRkxBRykgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoT1AjIz0sR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggISAoIChrbXBfdWludHB0cl90KSBsaHMgJiAweCMjTUFTSykgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DTVBYQ0hHKFRZUEUsQklUUyxPUCkgICAgIC8qIGFsaWduZWQgYWRkcmVzcyAqLyAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DUklUSUNBTChPUCMjPSxMQ0tfSUQpICAvKiB1bmFsaWduZWQgYWRkcmVzcyAtIHVzZSBjcml0aWNhbCAqLyAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfQ01QWENIRyhUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcpICAgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoT1AjIz0sR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggISAoIChrbXBfdWludHB0cl90KSBsaHMgJiAweCMjTUFTSykgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DTVBYQ0hHKFRZUEUsQklUUyxPUCkgICAgIC8qIGFsaWduZWQgYWRkcmVzcyAqLyAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DUklUSUNBTChPUCMjPSxMQ0tfSUQpICAvKiB1bmFsaWduZWQgYWRkcmVzcyAtIHVzZSBjcml0aWNhbCAqLyAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2lmIFVTRV9DTVBYQ0hHX0ZJWAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gd29ya2Fyb3VuZCBmb3IgQzc4Mjg3IChjb21wbGV4KGtpbmQ9NCkgZGF0YSB0eXBlKQorI2RlZmluZSBBVE9NSUNfQ01QWENIR19XT1JLQVJPVU5EKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLExDS19JRCxNQVNLLEdPTVBfRkxBRykgICBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKE9QIyM9LEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggISAoIChrbXBfdWludHB0cl90KSBsaHMgJiAweCMjTUFTSykgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NNUFhDSEcoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAvKiBhbGlnbmVkIGFkZHJlc3MgKi8gICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NSSVRJQ0FMKE9QIyM9LExDS19JRCkgIC8qIHVuYWxpZ25lZCBhZGRyZXNzIC0gdXNlIGNyaXRpY2FsICovICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorLy8gZW5kIG9mIHRoZSBzZWNvbmQgcGFydCBvZiB0aGUgd29ya2Fyb3VuZCBmb3IgQzc4Mjg3CisjZW5kaWYgLy8gVVNFX0NNUFhDSEdfRklYCisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisvLyBSb3V0aW5lcyBmb3IgQVRPTUlDIDQtYnl0ZSBvcGVyYW5kcyBhZGRpdGlvbiBhbmQgc3VidHJhY3Rpb24KK0FUT01JQ19GSVhFRF9BREQoIGZpeGVkNCwgYWRkLCBrbXBfaW50MzIsICAzMiwgKywgNGksIDMsIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGQKK0FUT01JQ19GSVhFRF9BREQoIGZpeGVkNCwgc3ViLCBrbXBfaW50MzIsICAzMiwgLSwgNGksIDMsIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWIKKworI2lmIEtNUF9NSUMKK0FUT01JQ19DTVBYQ0hHKCBmbG9hdDQsICBhZGQsIGttcF9yZWFsMzIsIDMyLCArLCAgNHIsIDMsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGQKK0FUT01JQ19DTVBYQ0hHKCBmbG9hdDQsICBzdWIsIGttcF9yZWFsMzIsIDMyLCAtLCAgNHIsIDMsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWIKKyNlbHNlCitBVE9NSUNfRkxPQVRfQUREKCBmbG9hdDQsIGFkZCwga21wX3JlYWwzMiwgMzIsICssIDRyLCAzLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfYWRkCitBVE9NSUNfRkxPQVRfQUREKCBmbG9hdDQsIHN1Yiwga21wX3JlYWwzMiwgMzIsIC0sIDRyLCAzLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfc3ViCisjZW5kaWYgLy8gS01QX01JQworCisvLyBSb3V0aW5lcyBmb3IgQVRPTUlDIDgtYnl0ZSBvcGVyYW5kcyBhZGRpdGlvbiBhbmQgc3VidHJhY3Rpb24KK0FUT01JQ19GSVhFRF9BREQoIGZpeGVkOCwgYWRkLCBrbXBfaW50NjQsICA2NCwgKywgOGksIDcsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hZGQKK0FUT01JQ19GSVhFRF9BREQoIGZpeGVkOCwgc3ViLCBrbXBfaW50NjQsICA2NCwgLSwgOGksIDcsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWIKKworI2lmIEtNUF9NSUMKK0FUT01JQ19DTVBYQ0hHKCBmbG9hdDgsICBhZGQsIGttcF9yZWFsNjQsIDY0LCArLCAgOHIsIDcsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGQKK0FUT01JQ19DTVBYQ0hHKCBmbG9hdDgsICBzdWIsIGttcF9yZWFsNjQsIDY0LCAtLCAgOHIsIDcsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWIKKyNlbHNlCitBVE9NSUNfRkxPQVRfQUREKCBmbG9hdDgsIGFkZCwga21wX3JlYWw2NCwgNjQsICssIDhyLCA3LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfYWRkCitBVE9NSUNfRkxPQVRfQUREKCBmbG9hdDgsIHN1Yiwga21wX3JlYWw2NCwgNjQsIC0sIDhyLCA3LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfc3ViCisjZW5kaWYgLy8gS01QX01JQworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJpZXMgZGVmaW5pdGlvbiBmb3IgaW50ZWdlciBvcGVyYW5kcworLy8gICAgIFRZUEVfSUQgLSBvcGVyYW5kcyB0eXBlIGFuZCBzaXplIChmaXhlZDQsIGZsb2F0NCkKKy8vICAgICBPUF9JRCAgIC0gb3BlcmF0aW9uIGlkZW50aWZpZXIgKGFkZCwgc3ViLCBtdWwsIC4uLikKKy8vICAgICBUWVBFICAgIC0gb3BlcmFuZCB0eXBlCisvLyAgICAgQklUUyAgICAtIHNpemUgaW4gYml0cywgdXNlZCB0byBkaXN0aW5ndWlzaCBsb3cgbGV2ZWwgY2FsbHMKKy8vICAgICBPUCAgICAgIC0gb3BlcmF0b3IgKHVzZWQgaW4gY3JpdGljYWwgc2VjdGlvbikKKy8vICAgICBMQ0tfSUQgIC0gbG9jayBpZGVudGlmaWVyLCB1c2VkIHRvIHBvc3NpYmx5IGRpc3Rpbmd1aXNoIGxvY2sgdmFyaWFibGUKKy8vICAgICBNQVNLICAgIC0gdXNlZCBmb3IgYWxpZ25tZW50IGNoZWNrCisKKy8vICAgICAgICAgICAgICAgVFlQRV9JRCxPUF9JRCwgIFRZUEUsICAgQklUUyxPUCxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUm91dGluZXMgZm9yIEFUT01JQyBpbnRlZ2VyIG9wZXJhbmRzLCBvdGhlciBvcGVyYXRvcnMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICAgICAgICAgICAgIFRZUEVfSUQsT1BfSUQsIFRZUEUsICAgICAgICAgIE9QLCBMQ0tfSUQsIEdPTVBfRkxBRworQVRPTUlDX0NNUFhDSEcoIGZpeGVkMSwgIGFkZCwga21wX2ludDgsICAgIDgsICssICAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX2FkZAorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMSwgYW5kYiwga21wX2ludDgsICAgIDgsICYsICAxaSwgMCwgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGIKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDEsICBkaXYsIGttcF9pbnQ4LCAgICA4LCAvLCAgMWksIDAsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXYKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDF1LCBkaXYsIGttcF91aW50OCwgICA4LCAvLCAgMWksIDAsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2CitBVE9NSUNfQ01QWENIRyggZml4ZWQxLCAgbXVsLCBrbXBfaW50OCwgICAgOCwgKiwgIDFpLCAwLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfbXVsCitBVE9NSUNfQ01QWENIRyggZml4ZWQxLCAgb3JiLCBrbXBfaW50OCwgICAgOCwgfCwgIDFpLCAwLCAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfb3JiCitBVE9NSUNfQ01QWENIRyggZml4ZWQxLCAgc2hsLCBrbXBfaW50OCwgICAgOCwgPDwsIDFpLCAwLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfc2hsCitBVE9NSUNfQ01QWENIRyggZml4ZWQxLCAgc2hyLCBrbXBfaW50OCwgICAgOCwgPj4sIDFpLCAwLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfc2hyCitBVE9NSUNfQ01QWENIRyggZml4ZWQxdSwgc2hyLCBrbXBfdWludDgsICAgOCwgPj4sIDFpLCAwLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDF1X3NocgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMSwgIHN1Yiwga21wX2ludDgsICAgIDgsIC0sICAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3N1YgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMSwgIHhvciwga21wX2ludDgsICAgIDgsIF4sICAxaSwgMCwgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3hvcgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMiwgIGFkZCwga21wX2ludDE2LCAgMTYsICssICAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX2FkZAorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMiwgYW5kYiwga21wX2ludDE2LCAgMTYsICYsICAyaSwgMSwgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX2FuZGIKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDIsICBkaXYsIGttcF9pbnQxNiwgIDE2LCAvLCAgMmksIDEsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXYKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDJ1LCBkaXYsIGttcF91aW50MTYsIDE2LCAvLCAgMmksIDEsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2CitBVE9NSUNfQ01QWENIRyggZml4ZWQyLCAgbXVsLCBrbXBfaW50MTYsICAxNiwgKiwgIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfbXVsCitBVE9NSUNfQ01QWENIRyggZml4ZWQyLCAgb3JiLCBrbXBfaW50MTYsICAxNiwgfCwgIDJpLCAxLCAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfb3JiCitBVE9NSUNfQ01QWENIRyggZml4ZWQyLCAgc2hsLCBrbXBfaW50MTYsICAxNiwgPDwsIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfc2hsCitBVE9NSUNfQ01QWENIRyggZml4ZWQyLCAgc2hyLCBrbXBfaW50MTYsICAxNiwgPj4sIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfc2hyCitBVE9NSUNfQ01QWENIRyggZml4ZWQydSwgc2hyLCBrbXBfdWludDE2LCAxNiwgPj4sIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJ1X3NocgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMiwgIHN1Yiwga21wX2ludDE2LCAgMTYsIC0sICAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3N1YgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMiwgIHhvciwga21wX2ludDE2LCAgMTYsIF4sICAyaSwgMSwgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3hvcgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkNCwgYW5kYiwga21wX2ludDMyLCAgMzIsICYsICA0aSwgMywgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X2FuZGIKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDQsICBkaXYsIGttcF9pbnQzMiwgIDMyLCAvLCAgNGksIDMsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXYKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDR1LCBkaXYsIGttcF91aW50MzIsIDMyLCAvLCAgNGksIDMsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2CitBVE9NSUNfQ01QWENIRyggZml4ZWQ0LCAgbXVsLCBrbXBfaW50MzIsICAzMiwgKiwgIDRpLCAzLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfbXVsCitBVE9NSUNfQ01QWENIRyggZml4ZWQ0LCAgb3JiLCBrbXBfaW50MzIsICAzMiwgfCwgIDRpLCAzLCAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfb3JiCitBVE9NSUNfQ01QWENIRyggZml4ZWQ0LCAgc2hsLCBrbXBfaW50MzIsICAzMiwgPDwsIDRpLCAzLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfc2hsCitBVE9NSUNfQ01QWENIRyggZml4ZWQ0LCAgc2hyLCBrbXBfaW50MzIsICAzMiwgPj4sIDRpLCAzLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfc2hyCitBVE9NSUNfQ01QWENIRyggZml4ZWQ0dSwgc2hyLCBrbXBfdWludDMyLCAzMiwgPj4sIDRpLCAzLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDR1X3NocgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkNCwgIHhvciwga21wX2ludDMyLCAgMzIsIF4sICA0aSwgMywgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3hvcgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkOCwgYW5kYiwga21wX2ludDY0LCAgNjQsICYsICA4aSwgNywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGIKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDgsICBkaXYsIGttcF9pbnQ2NCwgIDY0LCAvLCAgOGksIDcsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXYKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDh1LCBkaXYsIGttcF91aW50NjQsIDY0LCAvLCAgOGksIDcsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2CitBVE9NSUNfQ01QWENIRyggZml4ZWQ4LCAgbXVsLCBrbXBfaW50NjQsICA2NCwgKiwgIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfbXVsCitBVE9NSUNfQ01QWENIRyggZml4ZWQ4LCAgb3JiLCBrbXBfaW50NjQsICA2NCwgfCwgIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfb3JiCitBVE9NSUNfQ01QWENIRyggZml4ZWQ4LCAgc2hsLCBrbXBfaW50NjQsICA2NCwgPDwsIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfc2hsCitBVE9NSUNfQ01QWENIRyggZml4ZWQ4LCAgc2hyLCBrbXBfaW50NjQsICA2NCwgPj4sIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfc2hyCitBVE9NSUNfQ01QWENIRyggZml4ZWQ4dSwgc2hyLCBrbXBfdWludDY0LCA2NCwgPj4sIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDh1X3NocgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkOCwgIHhvciwga21wX2ludDY0LCAgNjQsIF4sICA4aSwgNywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3hvcgorQVRPTUlDX0NNUFhDSEcoIGZsb2F0NCwgIGRpdiwga21wX3JlYWwzMiwgMzIsIC8sICA0ciwgMywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X2RpdgorQVRPTUlDX0NNUFhDSEcoIGZsb2F0NCwgIG11bCwga21wX3JlYWwzMiwgMzIsICosICA0ciwgMywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X211bAorQVRPTUlDX0NNUFhDSEcoIGZsb2F0OCwgIGRpdiwga21wX3JlYWw2NCwgNjQsIC8sICA4ciwgNywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X2RpdgorQVRPTUlDX0NNUFhDSEcoIGZsb2F0OCwgIG11bCwga21wX3JlYWw2NCwgNjQsICosICA4ciwgNywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X211bAorLy8gICAgICAgICAgICAgIFRZUEVfSUQsT1BfSUQsIFRZUEUsICAgICAgICAgIE9QLCBMQ0tfSUQsIEdPTVBfRkxBRworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogUm91dGluZXMgZm9yIEMvQysrIFJlZHVjdGlvbiBvcGVyYXRvcnMgJiYgYW5kIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBOZWVkIHNlcGFyYXRlIG1hY3JvcyBmb3IgJiYsIHx8IGJlY2F1c2UgdGhlcmUgaXMgbm8gY29tYmluZWQgYXNzaWdubWVudAorLy8gICBUT0RPOiBlbGltaW5hdGUgQVRPTUlDX0NSSVRfe0wsRVFWfSBtYWNyb3MgYXMgbm90IHVzZWQKKyNkZWZpbmUgQVRPTUlDX0NSSVRfTChUWVBFX0lELE9QX0lELFRZUEUsT1AsTENLX0lELEdPTVBfRkxBRykgICAgICAgICAgICAgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTCggPSAqbGhzIE9QLCBHT01QX0ZMQUcgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DUklUSUNBTCggPSAqbGhzIE9QLCBMQ0tfSUQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFg4NiBvciBYODZfNjQ6IG5vIGFsaWdubWVudCBwcm9ibGVtcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2RlZmluZSBBVE9NSUNfQ01QWF9MKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLExDS19JRCxNQVNLLEdPTVBfRkxBRykgICBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKCA9ICpsaHMgT1AsIEdPTVBfRkxBRyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NNUFhDSEcoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNlbHNlCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvZGUgZm9yIG90aGVyIGFyY2hpdGVjdHVyZXMgdGhhdCBkb24ndCBoYW5kbGUgdW5hbGlnbmVkIGFjY2Vzc2VzLgorI2RlZmluZSBBVE9NSUNfQ01QWF9MKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLExDS19JRCxNQVNLLEdPTVBfRkxBRykgICBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKD0gKmxocyBPUCxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggISAoIChrbXBfdWludHB0cl90KSBsaHMgJiAweCMjTUFTSykgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NNUFhDSEcoVFlQRSxCSVRTLE9QKSAgICAgICAvKiBhbGlnbmVkIGFkZHJlc3MgKi8gICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NSSVRJQ0FMKD0gKmxocyBPUCxMQ0tfSUQpICAvKiB1bmFsaWduZWQgLSB1c2UgY3JpdGljYWwgKi8gICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworQVRPTUlDX0NNUFhfTCggZml4ZWQxLCBhbmRsLCBjaGFyLCAgICAgICA4LCAmJiwgMWksIDAsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hbmRsCitBVE9NSUNfQ01QWF9MKCBmaXhlZDEsICBvcmwsIGNoYXIsICAgICAgIDgsIHx8LCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX29ybAorQVRPTUlDX0NNUFhfTCggZml4ZWQyLCBhbmRsLCBzaG9ydCwgICAgIDE2LCAmJiwgMmksIDEsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRsCitBVE9NSUNfQ01QWF9MKCBmaXhlZDIsICBvcmwsIHNob3J0LCAgICAgMTYsIHx8LCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX29ybAorQVRPTUlDX0NNUFhfTCggZml4ZWQ0LCBhbmRsLCBrbXBfaW50MzIsIDMyLCAmJiwgNGksIDMsIDAgKSAgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hbmRsCitBVE9NSUNfQ01QWF9MKCBmaXhlZDQsICBvcmwsIGttcF9pbnQzMiwgMzIsIHx8LCA0aSwgMywgMCApICAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X29ybAorQVRPTUlDX0NNUFhfTCggZml4ZWQ4LCBhbmRsLCBrbXBfaW50NjQsIDY0LCAmJiwgOGksIDcsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hbmRsCitBVE9NSUNfQ01QWF9MKCBmaXhlZDgsICBvcmwsIGttcF9pbnQ2NCwgNjQsIHx8LCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X29ybAorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIFJvdXRpbmVzIGZvciBGb3J0cmFuIG9wZXJhdG9ycyB0aGF0IG1hdGNoZWQgbm8gb25lIGluIEM6ICAgICAgICAgICAgICAgICAgKi8KKy8qIE1BWCwgTUlOLCAuRVFWLiwgLk5FUVYuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZXJhdG9ycyAuQU5ELiwgLk9SLiBhcmUgY292ZXJlZCBieSBfX2ttcGNfYXRvbWljXypfe2FuZGwsb3JsfSAgICAgICAgICAgKi8KKy8qIEludHJpbnNpY3MgSUFORCwgSU9SLCBJRU9SIGFyZSBjb3ZlcmVkIGJ5IF9fa21wY19hdG9taWNfKl97YW5kYixvcmIseG9yfSAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTUlOIGFuZCBNQVggbmVlZCBzZXBhcmF0ZSBtYWNyb3MKKy8vIE9QIC0gb3BlcmF0b3IgdG8gY2hlY2sgaWYgd2UgbmVlZCBhbnkgYWN0aW9ucz8KKyNkZWZpbmUgTUlOX01BWF9DUklUU0VDVChPUCxMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAqbGhzIE9QIHJocyApIHsgICAgICAgICAgICAgICAgIC8qIHN0aWxsIG5lZWQgYWN0aW9ucz8gKi8gICAgICAgICBcCisgICAgICAgICpsaHMgPSByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyNkZWZpbmUgR09NUF9NSU5fTUFYX0NSSVRTRUNUKE9QLEZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKCBGTEFHICkgJiYgKCBfX2ttcF9hdG9taWNfbW9kZSA9PSAyICkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTUlOX01BWF9DUklUU0VDVCggT1AsIDAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZWxzZQorI2RlZmluZSBHT01QX01JTl9NQVhfQ1JJVFNFQ1QoT1AsRkxBRykKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBNSU5fTUFYX0NNUFhDSEcoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUWVBFIEtNUF9BVE9NSUNfVk9MQVRJTEUgdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUWVBFIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wX3ZhbCA9ICpsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBvbGRfdmFsdWUgPSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3aGlsZSAoIG9sZF92YWx1ZSBPUCByaHMgJiYgICAgICAgICAgLyogc3RpbGwgbmVlZCBhY3Rpb25zPyAqLyAgICAgXAorICAgICAgICAgICAgISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRIyNCSVRTKCAoa21wX2ludCMjQklUUyAqKSBsaHMsICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgJm9sZF92YWx1ZSwgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgJnJocyApICkgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX0NQVV9QQVVTRSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdGVtcF92YWwgPSAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgb2xkX3ZhbHVlID0gdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gMS1ieXRlLCAyLWJ5dGUgb3BlcmFuZHMgLSB1c2UgY3JpdGljYWwgc2VjdGlvbgorI2RlZmluZSBNSU5fTUFYX0NSSVRJQ0FMKFRZUEVfSUQsT1BfSUQsVFlQRSxPUCxMQ0tfSUQsR09NUF9GTEFHKSAgICAgICAgICAgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggKmxocyBPUCByaHMgKSB7ICAgICAvKiBuZWVkIGFjdGlvbnM/ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBHT01QX01JTl9NQVhfQ1JJVFNFQ1QoT1AsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNSU5fTUFYX0NSSVRTRUNUKE9QLExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBYODYgb3IgWDg2XzY0OiBubyBhbGlnbm1lbnQgcHJvYmxlbXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjZGVmaW5lIE1JTl9NQVhfQ09NUFhDSEcoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsTENLX0lELE1BU0ssR09NUF9GTEFHKSBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAqbGhzIE9QIHJocyApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEdPTVBfTUlOX01BWF9DUklUU0VDVChPUCxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1JTl9NQVhfQ01QWENIRyhUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNlbHNlCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb2RlIGZvciBvdGhlciBhcmNoaXRlY3R1cmVzIHRoYXQgZG9uJ3QgaGFuZGxlIHVuYWxpZ25lZCBhY2Nlc3Nlcy4KKyNkZWZpbmUgTUlOX01BWF9DT01QWENIRyhUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcpIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoICpsaHMgT1AgcmhzICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgR09NUF9NSU5fTUFYX0NSSVRTRUNUKE9QLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCAhICggKGttcF91aW50cHRyX3QpIGxocyAmIDB4IyNNQVNLKSApIHsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIE1JTl9NQVhfQ01QWENIRyhUWVBFLEJJVFMsT1ApIC8qIGFsaWduZWQgYWRkcmVzcyAqLyAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIE1JTl9NQVhfQ1JJVFNFQ1QoT1AsTENLX0lEKSAgIC8qIHVuYWxpZ25lZCBhZGRyZXNzICovICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKK01JTl9NQVhfQ09NUFhDSEcoIGZpeGVkMSwgIG1heCwgY2hhciwgICAgICAgIDgsIDwsIDFpLCAwLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tYXgKK01JTl9NQVhfQ09NUFhDSEcoIGZpeGVkMSwgIG1pbiwgY2hhciwgICAgICAgIDgsID4sIDFpLCAwLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9taW4KK01JTl9NQVhfQ09NUFhDSEcoIGZpeGVkMiwgIG1heCwgc2hvcnQsICAgICAgMTYsIDwsIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tYXgKK01JTl9NQVhfQ09NUFhDSEcoIGZpeGVkMiwgIG1pbiwgc2hvcnQsICAgICAgMTYsID4sIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9taW4KK01JTl9NQVhfQ09NUFhDSEcoIGZpeGVkNCwgIG1heCwga21wX2ludDMyLCAgMzIsIDwsIDRpLCAzLCAwICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tYXgKK01JTl9NQVhfQ09NUFhDSEcoIGZpeGVkNCwgIG1pbiwga21wX2ludDMyLCAgMzIsID4sIDRpLCAzLCAwICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9taW4KK01JTl9NQVhfQ09NUFhDSEcoIGZpeGVkOCwgIG1heCwga21wX2ludDY0LCAgNjQsIDwsIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tYXgKK01JTl9NQVhfQ09NUFhDSEcoIGZpeGVkOCwgIG1pbiwga21wX2ludDY0LCAgNjQsID4sIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9taW4KK01JTl9NQVhfQ09NUFhDSEcoIGZsb2F0NCwgIG1heCwga21wX3JlYWwzMiwgMzIsIDwsIDRyLCAzLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tYXgKK01JTl9NQVhfQ09NUFhDSEcoIGZsb2F0NCwgIG1pbiwga21wX3JlYWwzMiwgMzIsID4sIDRyLCAzLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9taW4KK01JTl9NQVhfQ09NUFhDSEcoIGZsb2F0OCwgIG1heCwga21wX3JlYWw2NCwgNjQsIDwsIDhyLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tYXgKK01JTl9NQVhfQ09NUFhDSEcoIGZsb2F0OCwgIG1pbiwga21wX3JlYWw2NCwgNjQsID4sIDhyLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9taW4KKyNpZiBLTVBfSEFWRV9RVUFECitNSU5fTUFYX0NSSVRJQ0FMKCBmbG9hdDE2LCBtYXgsICAgICBRVUFEX0xFR0FDWSwgICAgICA8LCAxNnIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X21heAorTUlOX01BWF9DUklUSUNBTCggZmxvYXQxNiwgbWluLCAgICAgUVVBRF9MRUdBQ1ksICAgICAgPiwgMTZyLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9taW4KKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgTUlOX01BWF9DUklUSUNBTCggZmxvYXQxNiwgbWF4X2ExNiwgUXVhZF9hMTZfdCwgICAgIDwsIDE2ciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWF4X2ExNgorICAgIE1JTl9NQVhfQ1JJVElDQUwoIGZsb2F0MTYsIG1pbl9hMTYsIFF1YWRfYTE2X3QsICAgICA+LCAxNnIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X21pbl9hMTYKKyNlbmRpZgorI2VuZGlmCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE5lZWQgc2VwYXJhdGUgbWFjcm9zIGZvciAuRVFWLiBiZWNhdXNlIG9mIHRoZSBuZWVkIG9mIGNvbXBsZW1lbnQgKH4pCisvLyBPUCBpZ25vcmVkIGZvciBjcml0aWNhbCBzZWN0aW9ucywgXj1+IHVzZWQgaW5zdGVhZAorI2RlZmluZSBBVE9NSUNfQ1JJVF9FUVYoVFlQRV9JRCxPUF9JRCxUWVBFLE9QLExDS19JRCxHT01QX0ZMQUcpICAgICAgICAgICBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKF49fixHT01QX0ZMQUcpICAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgICAgICAgICAgICAgXAorICAgIE9QX0NSSVRJQ0FMKF49fixMQ0tfSUQpICAgIC8qIHNlbmQgYXNzaWdubWVudCBhbmQgY29tcGxlbWVudCAqLyAgICAgICBcCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gWDg2IG9yIFg4Nl82NDogbm8gYWxpZ25tZW50IHByb2JsZW1zID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjZGVmaW5lIEFUT01JQ19DTVBYX0VRVihUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcpIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoXj1+LEdPTVBfRkxBRykgIC8qIHNlbmQgYXNzaWdubWVudCAqLyAgICAgICAgICAgICAgICBcCisgICAgT1BfQ01QWENIRyhUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2Vsc2UKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29kZSBmb3Igb3RoZXIgYXJjaGl0ZWN0dXJlcyB0aGF0IGRvbid0IGhhbmRsZSB1bmFsaWduZWQgYWNjZXNzZXMuCisjZGVmaW5lIEFUT01JQ19DTVBYX0VRVihUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcpIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoXj1+LEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAhICggKGttcF91aW50cHRyX3QpIGxocyAmIDB4IyNNQVNLKSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ01QWENIRyhUWVBFLEJJVFMsT1ApICAgLyogYWxpZ25lZCBhZGRyZXNzICovICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ1JJVElDQUwoXj1+LExDS19JRCkgICAgLyogdW5hbGlnbmVkIGFkZHJlc3MgLSB1c2UgY3JpdGljYWwgKi8gXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCitBVE9NSUNfQ01QWENIRyggIGZpeGVkMSwgbmVxdiwga21wX2ludDgsICAgOCwgICBeLCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDFfbmVxdgorQVRPTUlDX0NNUFhDSEcoICBmaXhlZDIsIG5lcXYsIGttcF9pbnQxNiwgMTYsICAgXiwgMmksIDEsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX25lcXYKK0FUT01JQ19DTVBYQ0hHKCAgZml4ZWQ0LCBuZXF2LCBrbXBfaW50MzIsIDMyLCAgIF4sIDRpLCAzLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9uZXF2CitBVE9NSUNfQ01QWENIRyggIGZpeGVkOCwgbmVxdiwga21wX2ludDY0LCA2NCwgICBeLCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDhfbmVxdgorQVRPTUlDX0NNUFhfRVFWKCBmaXhlZDEsIGVxdiwgIGttcF9pbnQ4LCAgIDgsICBefiwgMWksIDAsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX2VxdgorQVRPTUlDX0NNUFhfRVFWKCBmaXhlZDIsIGVxdiwgIGttcF9pbnQxNiwgMTYsICBefiwgMmksIDEsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX2VxdgorQVRPTUlDX0NNUFhfRVFWKCBmaXhlZDQsIGVxdiwgIGttcF9pbnQzMiwgMzIsICBefiwgNGksIDMsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X2VxdgorQVRPTUlDX0NNUFhfRVFWKCBmaXhlZDgsIGVxdiwgIGttcF9pbnQ2NCwgNjQsICBefiwgOGksIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X2VxdgorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUm91dGluZXMgZm9yIEV4dGVuZGVkIHR5cGVzOiBsb25nIGRvdWJsZSwgX1F1YWQsIGNvbXBsZXggZmxhdm91cnMgKHVzZSBjcml0aWNhbCBzZWN0aW9uKQorLy8gICAgIFRZUEVfSUQsIE9QX0lELCBUWVBFIC0gZGV0YWlsZWQgYWJvdmUKKy8vICAgICBPUCAgICAgIC0gb3BlcmF0b3IKKy8vICAgICBMQ0tfSUQgIC0gbG9jayBpZGVudGlmaWVyLCB1c2VkIHRvIHBvc3NpYmx5IGRpc3Rpbmd1aXNoIGxvY2sgdmFyaWFibGUKKyNkZWZpbmUgQVRPTUlDX0NSSVRJQ0FMKFRZUEVfSUQsT1BfSUQsVFlQRSxPUCxMQ0tfSUQsR09NUF9GTEFHKSAgICAgICAgICAgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChPUCMjPSxHT01QX0ZMQUcpICAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgICAgICAgICAgIFwKKyAgICBPUF9DUklUSUNBTChPUCMjPSxMQ0tfSUQpICAgICAgICAgIC8qIHNlbmQgYXNzaWdubWVudCAqLyAgICAgICAgICAgICAgXAorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvLyByb3V0aW5lcyBmb3IgbG9uZyBkb3VibGUgdHlwZQorQVRPTUlDX0NSSVRJQ0FMKCBmbG9hdDEwLCBhZGQsIGxvbmcgZG91YmxlLCAgICAgKywgMTByLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9hZGQKK0FUT01JQ19DUklUSUNBTCggZmxvYXQxMCwgc3ViLCBsb25nIGRvdWJsZSwgICAgIC0sIDEwciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViCitBVE9NSUNfQ1JJVElDQUwoIGZsb2F0MTAsIG11bCwgbG9uZyBkb3VibGUsICAgICAqLCAxMHIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX211bAorQVRPTUlDX0NSSVRJQ0FMKCBmbG9hdDEwLCBkaXYsIGxvbmcgZG91YmxlLCAgICAgLywgMTByLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXYKKyNpZiBLTVBfSEFWRV9RVUFECisvLyByb3V0aW5lcyBmb3IgX1F1YWQgdHlwZQorQVRPTUlDX0NSSVRJQ0FMKCBmbG9hdDE2LCBhZGQsIFFVQURfTEVHQUNZLCAgICAgKywgMTZyLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9hZGQKK0FUT01JQ19DUklUSUNBTCggZmxvYXQxNiwgc3ViLCBRVUFEX0xFR0FDWSwgICAgIC0sIDE2ciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViCitBVE9NSUNfQ1JJVElDQUwoIGZsb2F0MTYsIG11bCwgUVVBRF9MRUdBQ1ksICAgICAqLCAxNnIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X211bAorQVRPTUlDX0NSSVRJQ0FMKCBmbG9hdDE2LCBkaXYsIFFVQURfTEVHQUNZLCAgICAgLywgMTZyLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXYKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgQVRPTUlDX0NSSVRJQ0FMKCBmbG9hdDE2LCBhZGRfYTE2LCBRdWFkX2ExNl90LCArLCAxNnIsIDEgKSAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X2FkZF9hMTYKKyAgICBBVE9NSUNfQ1JJVElDQUwoIGZsb2F0MTYsIHN1Yl9hMTYsIFF1YWRfYTE2X3QsIC0sIDE2ciwgMSApICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2ExNgorICAgIEFUT01JQ19DUklUSUNBTCggZmxvYXQxNiwgbXVsX2ExNiwgUXVhZF9hMTZfdCwgKiwgMTZyLCAxICkgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9tdWxfYTE2CisgICAgQVRPTUlDX0NSSVRJQ0FMKCBmbG9hdDE2LCBkaXZfYTE2LCBRdWFkX2ExNl90LCAvLCAxNnIsIDEgKSAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9hMTYKKyNlbmRpZgorI2VuZGlmCisvLyByb3V0aW5lcyBmb3IgY29tcGxleCB0eXBlcworCisjaWYgVVNFX0NNUFhDSEdfRklYCisvLyB3b3JrYXJvdW5kIGZvciBDNzgyODcgKGNvbXBsZXgoa2luZD00KSBkYXRhIHR5cGUpCitBVE9NSUNfQ01QWENIR19XT1JLQVJPVU5EKCBjbXBseDQsIGFkZCwga21wX2NtcGx4MzIsIDY0LCArLCA4YywgNywgMSApICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfYWRkCitBVE9NSUNfQ01QWENIR19XT1JLQVJPVU5EKCBjbXBseDQsIHN1Yiwga21wX2NtcGx4MzIsIDY0LCAtLCA4YywgNywgMSApICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfc3ViCitBVE9NSUNfQ01QWENIR19XT1JLQVJPVU5EKCBjbXBseDQsIG11bCwga21wX2NtcGx4MzIsIDY0LCAqLCA4YywgNywgMSApICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfbXVsCitBVE9NSUNfQ01QWENIR19XT1JLQVJPVU5EKCBjbXBseDQsIGRpdiwga21wX2NtcGx4MzIsIDY0LCAvLCA4YywgNywgMSApICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfZGl2CisvLyBlbmQgb2YgdGhlIHdvcmthcm91bmQgZm9yIEM3ODI4NworI2Vsc2UKK0FUT01JQ19DUklUSUNBTCggY21wbHg0LCAgYWRkLCBrbXBfY21wbHgzMiwgICAgICssICA4YywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9hZGQKK0FUT01JQ19DUklUSUNBTCggY21wbHg0LCAgc3ViLCBrbXBfY21wbHgzMiwgICAgIC0sICA4YywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWIKK0FUT01JQ19DUklUSUNBTCggY21wbHg0LCAgbXVsLCBrbXBfY21wbHgzMiwgICAgICosICA4YywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9tdWwKK0FUT01JQ19DUklUSUNBTCggY21wbHg0LCAgZGl2LCBrbXBfY21wbHgzMiwgICAgIC8sICA4YywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXYKKyNlbmRpZiAvLyBVU0VfQ01QWENIR19GSVgKKworQVRPTUlDX0NSSVRJQ0FMKCBjbXBseDgsICBhZGQsIGttcF9jbXBseDY0LCAgICAgKywgMTZjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg4X2FkZAorQVRPTUlDX0NSSVRJQ0FMKCBjbXBseDgsICBzdWIsIGttcF9jbXBseDY0LCAgICAgLSwgMTZjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg4X3N1YgorQVRPTUlDX0NSSVRJQ0FMKCBjbXBseDgsICBtdWwsIGttcF9jbXBseDY0LCAgICAgKiwgMTZjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg4X211bAorQVRPTUlDX0NSSVRJQ0FMKCBjbXBseDgsICBkaXYsIGttcF9jbXBseDY0LCAgICAgLywgMTZjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg4X2RpdgorQVRPTUlDX0NSSVRJQ0FMKCBjbXBseDEwLCBhZGQsIGttcF9jbXBseDgwLCAgICAgKywgMjBjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxMF9hZGQKK0FUT01JQ19DUklUSUNBTCggY21wbHgxMCwgc3ViLCBrbXBfY21wbHg4MCwgICAgIC0sIDIwYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3ViCitBVE9NSUNfQ1JJVElDQUwoIGNtcGx4MTAsIG11bCwga21wX2NtcGx4ODAsICAgICAqLCAyMGMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDEwX211bAorQVRPTUlDX0NSSVRJQ0FMKCBjbXBseDEwLCBkaXYsIGttcF9jbXBseDgwLCAgICAgLywgMjBjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxMF9kaXYKKyNpZiBLTVBfSEFWRV9RVUFECitBVE9NSUNfQ1JJVElDQUwoIGNtcGx4MTYsIGFkZCwgQ1BMWDEyOF9MRUcsICAgICArLCAzMmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X2FkZAorQVRPTUlDX0NSSVRJQ0FMKCBjbXBseDE2LCBzdWIsIENQTFgxMjhfTEVHLCAgICAgLSwgMzJjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWIKK0FUT01JQ19DUklUSUNBTCggY21wbHgxNiwgbXVsLCBDUExYMTI4X0xFRywgICAgICosIDMyYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsCitBVE9NSUNfQ1JJVElDQUwoIGNtcGx4MTYsIGRpdiwgQ1BMWDEyOF9MRUcsICAgICAvLCAzMmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X2RpdgorI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICBBVE9NSUNfQ1JJVElDQUwoIGNtcGx4MTYsIGFkZF9hMTYsIGttcF9jbXBseDEyOF9hMTZfdCwgKywgMzJjLCAxICkgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYWRkX2ExNgorICAgIEFUT01JQ19DUklUSUNBTCggY21wbHgxNiwgc3ViX2ExNiwga21wX2NtcGx4MTI4X2ExNl90LCAtLCAzMmMsIDEgKSAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfYTE2CisgICAgQVRPTUlDX0NSSVRJQ0FMKCBjbXBseDE2LCBtdWxfYTE2LCBrbXBfY21wbHgxMjhfYTE2X3QsICosIDMyYywgMSApICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X211bF9hMTYKKyAgICBBVE9NSUNfQ1JJVElDQUwoIGNtcGx4MTYsIGRpdl9hMTYsIGttcF9jbXBseDEyOF9hMTZfdCwgLywgMzJjLCAxICkgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2X2ExNgorI2VuZGlmCisjZW5kaWYKKworI2lmIE9NUF80MF9FTkFCTEVECisKKy8vIE9wZW5NUCA0LjA6IHggPSBleHByIGJpbm9wIHggZm9yIG5vbi1jb21tdXRhdGl2ZSBvcGVyYXRpb25zLgorLy8gU3VwcG9ydGVkIG9ubHkgb24gSUEtMzIgYXJjaGl0ZWN0dXJlIGFuZCBJbnRlbChSKSA2NAorI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPcGVyYXRpb24gb24gKmxocywgcmhzIGJvdW5kIGJ5IGNyaXRpY2FsIHNlY3Rpb24KKy8vICAgICBPUCAgICAgLSBvcGVyYXRvciAoaXQncyBzdXBwb3NlZCB0byBjb250YWluIGFuIGFzc2lnbm1lbnQpCisvLyAgICAgTENLX0lEIC0gbG9jayBpZGVudGlmaWVyCisvLyBOb3RlOiBkb24ndCBjaGVjayBndGlkIGFzIGl0IHNob3VsZCBhbHdheXMgYmUgdmFsaWQKKy8vIDEsIDItYnl0ZSAtIGV4cGVjdCB2YWxpZCBwYXJhbWV0ZXIsIG90aGVyIC0gY2hlY2sgYmVmb3JlIHRoaXMgbWFjcm8KKyNkZWZpbmUgT1BfQ1JJVElDQUxfUkVWKE9QLExDS19JRCkgXAorICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKmxocykgPSAocmhzKSBPUCAoKmxocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7CisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyNkZWZpbmUgT1BfR09NUF9DUklUSUNBTF9SRVYoT1AsRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggKEZMQUcpICYmIChfX2ttcF9hdG9taWNfbW9kZSA9PSAyKSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ1JJVElDQUxfUkVWKCBPUCwgMCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2Vsc2UKKyNkZWZpbmUgT1BfR09NUF9DUklUSUNBTF9SRVYoT1AsRkxBRykKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKworCisvLyBCZWdpbm5pbmcgb2YgYSBkZWZpbml0aW9uIChwcm92aWRlcyBuYW1lLCBwYXJhbWV0ZXJzLCBnZWJ1ZyB0cmFjZSkKKy8vICAgICBUWVBFX0lEIC0gb3BlcmFuZHMgdHlwZSBhbmQgc2l6ZSAoZml4ZWQqLCBmaXhlZCp1IGZvciBzaWduZWQsIHVuc2lnbmVkIGZpeGVkKQorLy8gICAgIE9QX0lEICAgLSBvcGVyYXRpb24gaWRlbnRpZmllciAoYWRkLCBzdWIsIG11bCwgLi4uKQorLy8gICAgIFRZUEUgICAgLSBvcGVyYW5kcycgdHlwZQorI2RlZmluZSBBVE9NSUNfQkVHSU5fUkVWKFRZUEVfSUQsT1BfSUQsVFlQRSwgUkVUX1RZUEUpIFwKK1JFVF9UWVBFIF9fa21wY19hdG9taWNfIyNUWVBFX0lEIyNfIyNPUF9JRCMjX3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgVFlQRSAqIGxocywgVFlQRSByaHMgKSBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS0FfVFJBQ0UoMTAwLCgiX19rbXBjX2F0b21pY18iICNUWVBFX0lEICJfIiAjT1BfSUQgIl9yZXY6IFQjJWRcbiIsIGd0aWQgKSk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT3BlcmF0aW9uIG9uICpsaHMsIHJocyB1c2luZyAiY29tcGFyZV9hbmRfc3RvcmUiIHJvdXRpbmUKKy8vICAgICBUWVBFICAgIC0gb3BlcmFuZHMnIHR5cGUKKy8vICAgICBCSVRTICAgIC0gc2l6ZSBpbiBiaXRzLCB1c2VkIHRvIGRpc3Rpbmd1aXNoIGxvdyBsZXZlbCBjYWxscworLy8gICAgIE9QICAgICAgLSBvcGVyYXRvcgorLy8gTm90ZTogdGVtcF92YWwgaW50cm9kdWNlZCBpbiBvcmRlciB0byBmb3JjZSB0aGUgY29tcGlsZXIgdG8gcmVhZAorLy8gICAgICAgKmxocyBvbmx5IG9uY2UgKHcvbyBpdCB0aGUgY29tcGlsZXIgcmVhZHMgKmxocyB0d2ljZSkKKyNkZWZpbmUgT1BfQ01QWENIR19SRVYoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRZUEUgS01QX0FUT01JQ19WT0xBVElMRSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFlQRSBvbGRfdmFsdWUsIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wX3ZhbCA9ICpsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG9sZF92YWx1ZSA9IHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbmV3X3ZhbHVlID0gcmhzIE9QIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3aGlsZSAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUSMjQklUUyggKGttcF9pbnQjI0JJVFMgKikgbGhzLCBcCisgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmb2xkX3ZhbHVlLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICZuZXdfdmFsdWUgKSApICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfRE9fUEFVU0U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdGVtcF92YWwgPSAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBvbGRfdmFsdWUgPSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG5ld192YWx1ZSA9IHJocyBPUCBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFUT01JQ19DTVBYQ0hHX1JFVihUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxMQ0tfSUQsR09NUF9GTEFHKSAgIFwKK0FUT01JQ19CRUdJTl9SRVYoVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUxfUkVWKE9QLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ01QWENIR19SRVYoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyaWVzIGRlZmluaXRpb24gZm9yIGludGVnZXIgb3BlcmFuZHMKKy8vICAgICBUWVBFX0lEIC0gb3BlcmFuZHMgdHlwZSBhbmQgc2l6ZSAoZml4ZWQ0LCBmbG9hdDQpCisvLyAgICAgT1BfSUQgICAtIG9wZXJhdGlvbiBpZGVudGlmaWVyIChhZGQsIHN1YiwgbXVsLCAuLi4pCisvLyAgICAgVFlQRSAgICAtIG9wZXJhbmQgdHlwZQorLy8gICAgIEJJVFMgICAgLSBzaXplIGluIGJpdHMsIHVzZWQgdG8gZGlzdGluZ3Vpc2ggbG93IGxldmVsIGNhbGxzCisvLyAgICAgT1AgICAgICAtIG9wZXJhdG9yICh1c2VkIGluIGNyaXRpY2FsIHNlY3Rpb24pCisvLyAgICAgTENLX0lEICAtIGxvY2sgaWRlbnRpZmllciwgdXNlZCB0byBwb3NzaWJseSBkaXN0aW5ndWlzaCBsb2NrIHZhcmlhYmxlCisKKy8vICAgICAgICAgICAgICAgVFlQRV9JRCxPUF9JRCwgIFRZUEUsICAgQklUUyxPUCxMQ0tfSUQsR09NUF9GTEFHCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJvdXRpbmVzIGZvciBBVE9NSUMgaW50ZWdlciBvcGVyYW5kcywgb3RoZXIgb3BlcmF0b3JzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAgICAgICAgICAgICAgVFlQRV9JRCxPUF9JRCwgVFlQRSwgICAgQklUUywgT1AsIExDS19JRCwgR09NUF9GTEFHCitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkMSwgIGRpdiwga21wX2ludDgsICAgIDgsIC8sICAxaSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQxdSwgZGl2LCBrbXBfdWludDgsICAgOCwgLywgIDFpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDF1X2Rpdl9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQxLCAgc2hsLCBrbXBfaW50OCwgICAgOCwgPDwsIDFpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfc2hsX3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDEsICBzaHIsIGttcF9pbnQ4LCAgICA4LCA+PiwgMWksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaHJfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkMXUsIHNociwga21wX3VpbnQ4LCAgIDgsID4+LCAxaSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxdV9zaHJfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkMSwgIHN1Yiwga21wX2ludDgsICAgIDgsIC0sICAxaSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3N1Yl9yZXYKKworQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDIsICBkaXYsIGttcF9pbnQxNiwgIDE2LCAvLCAgMmksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkMnUsIGRpdiwga21wX3VpbnQxNiwgMTYsIC8sICAyaSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQydV9kaXZfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkMiwgIHNobCwga21wX2ludDE2LCAgMTYsIDw8LCAyaSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3NobF9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQyLCAgc2hyLCBrbXBfaW50MTYsICAxNiwgPj4sIDJpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfc2hyX3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDJ1LCBzaHIsIGttcF91aW50MTYsIDE2LCA+PiwgMmksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfc2hyX3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDIsICBzdWIsIGttcF9pbnQxNiwgIDE2LCAtLCAgMmksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWJfcmV2CisKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQ0LCAgZGl2LCBrbXBfaW50MzIsICAzMiwgLywgIDRpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfZGl2X3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDR1LCBkaXYsIGttcF91aW50MzIsIDMyLCAvLCAgNGksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDQsICBzaGwsIGttcF9pbnQzMiwgIDMyLCA8PCwgNGksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaGxfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkNCwgIHNociwga21wX2ludDMyLCAgMzIsID4+LCA0aSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3Nocl9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQ0dSwgc2hyLCBrbXBfdWludDMyLCAzMiwgPj4sIDRpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDR1X3Nocl9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQ0LCAgc3ViLCBrbXBfaW50MzIsICAzMiwgLSwgIDRpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfc3ViX3JldgorCitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkOCwgIGRpdiwga21wX2ludDY0LCAgNjQsIC8sICA4aSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQ4dSwgZGl2LCBrbXBfdWludDY0LCA2NCwgLywgIDhpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQ4LCAgc2hsLCBrbXBfaW50NjQsICA2NCwgPDwsIDhpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfc2hsX3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDgsICBzaHIsIGttcF9pbnQ2NCwgIDY0LCA+PiwgOGksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHJfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkOHUsIHNociwga21wX3VpbnQ2NCwgNjQsID4+LCA4aSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zaHJfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkOCwgIHN1Yiwga21wX2ludDY0LCAgNjQsIC0sICA4aSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1Yl9yZXYKKworQVRPTUlDX0NNUFhDSEdfUkVWKCBmbG9hdDQsICBkaXYsIGttcF9yZWFsMzIsIDMyLCAvLCAgNHIsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZsb2F0NCwgIHN1Yiwga21wX3JlYWwzMiwgMzIsIC0sICA0ciwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9yZXYKKworQVRPTUlDX0NNUFhDSEdfUkVWKCBmbG9hdDgsICBkaXYsIGttcF9yZWFsNjQsIDY0LCAvLCAgOHIsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZsb2F0OCwgIHN1Yiwga21wX3JlYWw2NCwgNjQsIC0sICA4ciwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X3N1Yl9yZXYKKy8vICAgICAgICAgICAgICAgICAgVFlQRV9JRCxPUF9JRCwgVFlQRSwgICAgIEJJVFMsT1AsTENLX0lELCBHT01QX0ZMQUcKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSb3V0aW5lcyBmb3IgRXh0ZW5kZWQgdHlwZXM6IGxvbmcgZG91YmxlLCBfUXVhZCwgY29tcGxleCBmbGF2b3VycyAodXNlIGNyaXRpY2FsIHNlY3Rpb24pCisvLyAgICAgVFlQRV9JRCwgT1BfSUQsIFRZUEUgLSBkZXRhaWxlZCBhYm92ZQorLy8gICAgIE9QICAgICAgLSBvcGVyYXRvcgorLy8gICAgIExDS19JRCAgLSBsb2NrIGlkZW50aWZpZXIsIHVzZWQgdG8gcG9zc2libHkgZGlzdGluZ3Vpc2ggbG9jayB2YXJpYWJsZQorI2RlZmluZSBBVE9NSUNfQ1JJVElDQUxfUkVWKFRZUEVfSUQsT1BfSUQsVFlQRSxPUCxMQ0tfSUQsR09NUF9GTEFHKSAgICAgICAgICAgXAorQVRPTUlDX0JFR0lOX1JFVihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUxfUkVWKE9QLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NSSVRJQ0FMX1JFVihPUCxMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvLyByb3V0aW5lcyBmb3IgbG9uZyBkb3VibGUgdHlwZQorQVRPTUlDX0NSSVRJQ0FMX1JFViggZmxvYXQxMCwgc3ViLCBsb25nIGRvdWJsZSwgICAgIC0sIDEwciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViX3JldgorQVRPTUlDX0NSSVRJQ0FMX1JFViggZmxvYXQxMCwgZGl2LCBsb25nIGRvdWJsZSwgICAgIC8sIDEwciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X3JldgorI2lmIEtNUF9IQVZFX1FVQUQKKy8vIHJvdXRpbmVzIGZvciBfUXVhZCB0eXBlCitBVE9NSUNfQ1JJVElDQUxfUkVWKCBmbG9hdDE2LCBzdWIsIFFVQURfTEVHQUNZLCAgICAgLSwgMTZyLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfcmV2CitBVE9NSUNfQ1JJVElDQUxfUkVWKCBmbG9hdDE2LCBkaXYsIFFVQURfTEVHQUNZLCAgICAgLywgMTZyLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfcmV2CisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIEFUT01JQ19DUklUSUNBTF9SRVYoIGZsb2F0MTYsIHN1Yl9hMTYsIFF1YWRfYTE2X3QsIC0sIDE2ciwgMSApICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2ExNl9yZXYKKyAgICBBVE9NSUNfQ1JJVElDQUxfUkVWKCBmbG9hdDE2LCBkaXZfYTE2LCBRdWFkX2ExNl90LCAvLCAxNnIsIDEgKSAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9hMTZfcmV2CisjZW5kaWYKKyNlbmRpZgorCisvLyByb3V0aW5lcyBmb3IgY29tcGxleCB0eXBlcworQVRPTUlDX0NSSVRJQ0FMX1JFViggY21wbHg0LCAgc3ViLCBrbXBfY21wbHgzMiwgICAgIC0sIDhjLCAgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWJfcmV2CitBVE9NSUNfQ1JJVElDQUxfUkVWKCBjbXBseDQsICBkaXYsIGttcF9jbXBseDMyLCAgICAgLywgOGMsICAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X2Rpdl9yZXYKK0FUT01JQ19DUklUSUNBTF9SRVYoIGNtcGx4OCwgIHN1Yiwga21wX2NtcGx4NjQsICAgICAtLCAxNmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDhfc3ViX3JldgorQVRPTUlDX0NSSVRJQ0FMX1JFViggY21wbHg4LCAgZGl2LCBrbXBfY21wbHg2NCwgICAgIC8sIDE2YywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4OF9kaXZfcmV2CitBVE9NSUNfQ1JJVElDQUxfUkVWKCBjbXBseDEwLCBzdWIsIGttcF9jbXBseDgwLCAgICAgLSwgMjBjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxMF9zdWJfcmV2CitBVE9NSUNfQ1JJVElDQUxfUkVWKCBjbXBseDEwLCBkaXYsIGttcF9jbXBseDgwLCAgICAgLywgMjBjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxMF9kaXZfcmV2CisjaWYgS01QX0hBVkVfUVVBRAorQVRPTUlDX0NSSVRJQ0FMX1JFViggY21wbHgxNiwgc3ViLCBDUExYMTI4X0xFRywgICAgIC0sIDMyYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX3JldgorQVRPTUlDX0NSSVRJQ0FMX1JFViggY21wbHgxNiwgZGl2LCBDUExYMTI4X0xFRywgICAgIC8sIDMyYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2X3JldgorI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICBBVE9NSUNfQ1JJVElDQUxfUkVWKCBjbXBseDE2LCBzdWJfYTE2LCBrbXBfY21wbHgxMjhfYTE2X3QsIC0sIDMyYywgMSApICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9hMTZfcmV2CisgICAgQVRPTUlDX0NSSVRJQ0FMX1JFViggY21wbHgxNiwgZGl2X2ExNiwga21wX2NtcGx4MTI4X2ExNl90LCAvLCAzMmMsIDEgKSAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfYTE2X3JldgorI2VuZGlmCisjZW5kaWYKKworCisjZW5kaWYgLy9LTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisvLyBFbmQgb2YgT3Blbk1QIDQuMDogeCA9IGV4cHIgYmlub3AgeCBmb3Igbm9uLWNvbW11dGF0aXZlIG9wZXJhdGlvbnMuCisKKyNlbmRpZiAvL09NUF80MF9FTkFCTEVECisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBSb3V0aW5lcyBmb3IgbWl4ZWQgdHlwZXMgb2YgTEhTIGFuZCBSSFMsIHdoZW4gUkhTIGlzICJsYXJnZXIiICAgICAgICAgICAgKi8KKy8qIE5vdGU6IGluIG9yZGVyIHRvIHJlZHVjZSB0aGUgdG90YWwgbnVtYmVyIG9mIHR5cGVzIGNvbWJpbmF0aW9ucyAgICAgICAgICAqLworLyogICAgICAgaXQgaXMgc3VwcG9zZWQgdGhhdCBjb21waWxlciBjb252ZXJ0cyBSSFMgdG8gbG9uZ2VzdCBmbG9hdGluZyB0eXBlLCovCisvKiAgICAgICB0aGF0IGlzIF9RdWFkLCBiZWZvcmUgY2FsbCB0byBhbnkgb2YgdGhlc2Ugcm91dGluZXMgICAgICAgICAgICAgICAgKi8KKy8qIENvbnZlcnNpb24gdG8gX1F1YWQgd2lsbCBiZSBkb25lIGJ5IHRoZSBjb21waWxlciBkdXJpbmcgY2FsY3VsYXRpb24sICAgICAqLworLyogICAgY29udmVyc2lvbiBiYWNrIHRvIFRZUEUgLSBiZWZvcmUgdGhlIGFzc2lnbm1lbnQsIGxpa2U6ICAgICAgICAgICAgICAgICovCisvKiAgICAqbGhzID0gKFRZUEUpKCAoX1F1YWQpKCpsaHMpIE9QIHJocyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBlcmZvcm1hbmNlIHBlbmFsdHkgZXhwZWN0ZWQgYmVjYXVzZSBvZiBTVyBlbXVsYXRpb24gdXNlICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgQVRPTUlDX0JFR0lOX01JWChUWVBFX0lELFRZUEUsT1BfSUQsUlRZUEVfSUQsUlRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordm9pZCBfX2ttcGNfYXRvbWljXyMjVFlQRV9JRCMjXyMjT1BfSUQjI18jI1JUWVBFX0lEKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBUWVBFICogbGhzLCBSVFlQRSByaHMgKSBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtBX1RSQUNFKDEwMCwoIl9fa21wY19hdG9taWNfIiAjVFlQRV9JRCAiXyIgI09QX0lEICJfIiAjUlRZUEVfSUQgIjogVCMlZFxuIiwgZ3RpZCApKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfQ1JJVElDQUxfRlAoVFlQRV9JRCxUWVBFLE9QX0lELE9QLFJUWVBFX0lELFJUWVBFLExDS19JRCxHT01QX0ZMQUcpICAgICAgICAgXAorQVRPTUlDX0JFR0lOX01JWChUWVBFX0lELFRZUEUsT1BfSUQsUlRZUEVfSUQsUlRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoT1AjIz0sR09NUF9GTEFHKSAgLyogc2VuZCBhc3NpZ25tZW50ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NSSVRJQ0FMKE9QIyM9LExDS19JRCkgIC8qIHNlbmQgYXNzaWdubWVudCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gWDg2IG9yIFg4Nl82NDogbm8gYWxpZ25tZW50IHByb2JsZW1zID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2RlZmluZSBBVE9NSUNfQ01QWENIR19NSVgoVFlQRV9JRCxUWVBFLE9QX0lELEJJVFMsT1AsUlRZUEVfSUQsUlRZUEUsTENLX0lELE1BU0ssR09NUF9GTEFHKSBcCitBVE9NSUNfQkVHSU5fTUlYKFRZUEVfSUQsVFlQRSxPUF9JRCxSVFlQRV9JRCxSVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKE9QIyM9LEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NNUFhDSEcoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZWxzZQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb2RlIGZvciBvdGhlciBhcmNoaXRlY3R1cmVzIHRoYXQgZG9uJ3QgaGFuZGxlIHVuYWxpZ25lZCBhY2Nlc3Nlcy4KKyNkZWZpbmUgQVRPTUlDX0NNUFhDSEdfTUlYKFRZUEVfSUQsVFlQRSxPUF9JRCxCSVRTLE9QLFJUWVBFX0lELFJUWVBFLExDS19JRCxNQVNLLEdPTVBfRkxBRykgXAorQVRPTUlDX0JFR0lOX01JWChUWVBFX0lELFRZUEUsT1BfSUQsUlRZUEVfSUQsUlRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChPUCMjPSxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoICEgKCAoa21wX3VpbnRwdHJfdCkgbGhzICYgMHgjI01BU0spICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DTVBYQ0hHKFRZUEUsQklUUyxPUCkgICAgIC8qIGFsaWduZWQgYWRkcmVzcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DUklUSUNBTChPUCMjPSxMQ0tfSUQpICAvKiB1bmFsaWduZWQgYWRkcmVzcyAtIHVzZSBjcml0aWNhbCAqLyAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKy8vIFJIUz1mbG9hdDgKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQxLCBjaGFyLCAgICAgICBtdWwsICA4LCAqLCBmbG9hdDgsIGttcF9yZWFsNjQsIDFpLCAwLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tdWxfZmxvYXQ4CitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkMSwgY2hhciwgICAgICAgZGl2LCAgOCwgLywgZmxvYXQ4LCBrbXBfcmVhbDY0LCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2Zsb2F0OAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDIsIHNob3J0LCAgICAgIG11bCwgMTYsICosIGZsb2F0OCwga21wX3JlYWw2NCwgMmksIDEsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX211bF9mbG9hdDgKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQyLCBzaG9ydCwgICAgICBkaXYsIDE2LCAvLCBmbG9hdDgsIGttcF9yZWFsNjQsIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfZmxvYXQ4CitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkNCwga21wX2ludDMyLCAgbXVsLCAzMiwgKiwgZmxvYXQ4LCBrbXBfcmVhbDY0LCA0aSwgMywgMCApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfbXVsX2Zsb2F0OAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDQsIGttcF9pbnQzMiwgIGRpdiwgMzIsIC8sIGZsb2F0OCwga21wX3JlYWw2NCwgNGksIDMsIDAgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9mbG9hdDgKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQ4LCBrbXBfaW50NjQsICBtdWwsIDY0LCAqLCBmbG9hdDgsIGttcF9yZWFsNjQsIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWxfZmxvYXQ4CitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkOCwga21wX2ludDY0LCAgZGl2LCA2NCwgLywgZmxvYXQ4LCBrbXBfcmVhbDY0LCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2Zsb2F0OAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmbG9hdDQsIGttcF9yZWFsMzIsIGFkZCwgMzIsICssIGZsb2F0OCwga21wX3JlYWw2NCwgNHIsIDMsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X2FkZF9mbG9hdDgKK0FUT01JQ19DTVBYQ0hHX01JWCggZmxvYXQ0LCBrbXBfcmVhbDMyLCBzdWIsIDMyLCAtLCBmbG9hdDgsIGttcF9yZWFsNjQsIDRyLCAzLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfZmxvYXQ4CitBVE9NSUNfQ01QWENIR19NSVgoIGZsb2F0NCwga21wX3JlYWwzMiwgbXVsLCAzMiwgKiwgZmxvYXQ4LCBrbXBfcmVhbDY0LCA0ciwgMywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfbXVsX2Zsb2F0OAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmbG9hdDQsIGttcF9yZWFsMzIsIGRpdiwgMzIsIC8sIGZsb2F0OCwga21wX3JlYWw2NCwgNHIsIDMsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9mbG9hdDgKKworLy8gUkhTPWZsb2F0MTYgKGRlcHJlY2F0ZWQsIHRvIGJlIHJlbW92ZWQgd2hlbiB3ZSBhcmUgc3VyZSB0aGUgY29tcGlsZXIgZG9lcyBub3QgdXNlIHRoZW0pCisjaWYgS01QX0hBVkVfUVVBRAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDEsICBjaGFyLCAgICAgICBhZGQsICA4LCArLCBmcCwgX1F1YWQsIDFpLCAwLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hZGRfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQxLCAgY2hhciwgICAgICAgc3ViLCAgOCwgLSwgZnAsIF9RdWFkLCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDFfc3ViX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkMSwgIGNoYXIsICAgICAgIG11bCwgIDgsICosIGZwLCBfUXVhZCwgMWksIDAsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX211bF9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDEsICBjaGFyLCAgICAgICBkaXYsICA4LCAvLCBmcCwgX1F1YWQsIDFpLCAwLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQxdSwgdWNoYXIsICAgICAgZGl2LCAgOCwgLywgZnAsIF9RdWFkLCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDF1X2Rpdl9mcAorCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkMiwgIHNob3J0LCAgICAgIGFkZCwgMTYsICssIGZwLCBfUXVhZCwgMmksIDEsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX2FkZF9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDIsICBzaG9ydCwgICAgICBzdWIsIDE2LCAtLCBmcCwgX1F1YWQsIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWJfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQyLCAgc2hvcnQsICAgICAgbXVsLCAxNiwgKiwgZnAsIF9RdWFkLCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDJfbXVsX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkMiwgIHNob3J0LCAgICAgIGRpdiwgMTYsIC8sIGZwLCBfUXVhZCwgMmksIDEsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDJ1LCB1c2hvcnQsICAgICBkaXYsIDE2LCAvLCBmcCwgX1F1YWQsIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2X2ZwCisKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQ0LCAga21wX2ludDMyLCAgYWRkLCAzMiwgKywgZnAsIF9RdWFkLCA0aSwgMywgMCApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfYWRkX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkNCwgIGttcF9pbnQzMiwgIHN1YiwgMzIsIC0sIGZwLCBfUXVhZCwgNGksIDMsIDAgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDQsICBrbXBfaW50MzIsICBtdWwsIDMyLCAqLCBmcCwgX1F1YWQsIDRpLCAzLCAwICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWxfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQ0LCAga21wX2ludDMyLCAgZGl2LCAzMiwgLywgZnAsIF9RdWFkLCA0aSwgMywgMCApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfZGl2X2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkNHUsIGttcF91aW50MzIsIGRpdiwgMzIsIC8sIGZwLCBfUXVhZCwgNGksIDMsIDAgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXZfZnAKKworQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDgsICBrbXBfaW50NjQsICBhZGQsIDY0LCArLCBmcCwgX1F1YWQsIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hZGRfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQ4LCAga21wX2ludDY0LCAgc3ViLCA2NCwgLSwgZnAsIF9RdWFkLCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDhfc3ViX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkOCwgIGttcF9pbnQ2NCwgIG11bCwgNjQsICosIGZwLCBfUXVhZCwgOGksIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X211bF9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDgsICBrbXBfaW50NjQsICBkaXYsIDY0LCAvLCBmcCwgX1F1YWQsIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQ4dSwga21wX3VpbnQ2NCwgZGl2LCA2NCwgLywgZnAsIF9RdWFkLCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9mcAorCitBVE9NSUNfQ01QWENIR19NSVgoIGZsb2F0NCwgIGttcF9yZWFsMzIsIGFkZCwgMzIsICssIGZwLCBfUXVhZCwgNHIsIDMsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X2FkZF9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmbG9hdDQsICBrbXBfcmVhbDMyLCBzdWIsIDMyLCAtLCBmcCwgX1F1YWQsIDRyLCAzLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZmxvYXQ0LCAga21wX3JlYWwzMiwgbXVsLCAzMiwgKiwgZnAsIF9RdWFkLCA0ciwgMywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfbXVsX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZsb2F0NCwgIGttcF9yZWFsMzIsIGRpdiwgMzIsIC8sIGZwLCBfUXVhZCwgNHIsIDMsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9mcAorCitBVE9NSUNfQ01QWENIR19NSVgoIGZsb2F0OCwgIGttcF9yZWFsNjQsIGFkZCwgNjQsICssIGZwLCBfUXVhZCwgOHIsIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X2FkZF9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmbG9hdDgsICBrbXBfcmVhbDY0LCBzdWIsIDY0LCAtLCBmcCwgX1F1YWQsIDhyLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWJfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZmxvYXQ4LCAga21wX3JlYWw2NCwgbXVsLCA2NCwgKiwgZnAsIF9RdWFkLCA4ciwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfbXVsX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZsb2F0OCwgIGttcF9yZWFsNjQsIGRpdiwgNjQsIC8sIGZwLCBfUXVhZCwgOHIsIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X2Rpdl9mcAorCitBVE9NSUNfQ1JJVElDQUxfRlAoIGZsb2F0MTAsIGxvbmcgZG91YmxlLCAgICBhZGQsICssIGZwLCBfUXVhZCwgMTByLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9hZGRfZnAKK0FUT01JQ19DUklUSUNBTF9GUCggZmxvYXQxMCwgbG9uZyBkb3VibGUsICAgIHN1YiwgLSwgZnAsIF9RdWFkLCAxMHIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9mcAorQVRPTUlDX0NSSVRJQ0FMX0ZQKCBmbG9hdDEwLCBsb25nIGRvdWJsZSwgICAgbXVsLCAqLCBmcCwgX1F1YWQsIDEwciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfbXVsX2ZwCitBVE9NSUNfQ1JJVElDQUxfRlAoIGZsb2F0MTAsIGxvbmcgZG91YmxlLCAgICBkaXYsIC8sIGZwLCBfUXVhZCwgMTByLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfZnAKKyNlbmRpZgorCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBYODYgb3IgWDg2XzY0OiBubyBhbGlnbm1lbnQgcHJvYmxlbXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjaWYgVVNFX0NNUFhDSEdfRklYCisvLyB3b3JrYXJvdW5kIGZvciBDNzgyODcgKGNvbXBsZXgoa2luZD00KSBkYXRhIHR5cGUpCisjZGVmaW5lIEFUT01JQ19DTVBYQ0hHX0NNUExYKFRZUEVfSUQsVFlQRSxPUF9JRCxCSVRTLE9QLFJUWVBFX0lELFJUWVBFLExDS19JRCxNQVNLLEdPTVBfRkxBRykgXAorQVRPTUlDX0JFR0lOX01JWChUWVBFX0lELFRZUEUsT1BfSUQsUlRZUEVfSUQsUlRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKE9QIyM9LEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ01QWENIR19XT1JLQVJPVU5EKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorLy8gZW5kIG9mIHRoZSBzZWNvbmQgcGFydCBvZiB0aGUgd29ya2Fyb3VuZCBmb3IgQzc4Mjg3CisjZWxzZQorI2RlZmluZSBBVE9NSUNfQ01QWENIR19DTVBMWChUWVBFX0lELFRZUEUsT1BfSUQsQklUUyxPUCxSVFlQRV9JRCxSVFlQRSxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcpIFwKK0FUT01JQ19CRUdJTl9NSVgoVFlQRV9JRCxUWVBFLE9QX0lELFJUWVBFX0lELFJUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChPUCMjPSxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NNUFhDSEcoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNlbmRpZiAvLyBVU0VfQ01QWENIR19GSVgKKyNlbHNlCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvZGUgZm9yIG90aGVyIGFyY2hpdGVjdHVyZXMgdGhhdCBkb24ndCBoYW5kbGUgdW5hbGlnbmVkIGFjY2Vzc2VzLgorI2RlZmluZSBBVE9NSUNfQ01QWENIR19DTVBMWChUWVBFX0lELFRZUEUsT1BfSUQsQklUUyxPUCxSVFlQRV9JRCxSVFlQRSxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcpIFwKK0FUT01JQ19CRUdJTl9NSVgoVFlQRV9JRCxUWVBFLE9QX0lELFJUWVBFX0lELFJUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChPUCMjPSxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggISAoIChrbXBfdWludHB0cl90KSBsaHMgJiAweCMjTUFTSykgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ01QWENIRyhUWVBFLEJJVFMsT1ApICAgICAvKiBhbGlnbmVkIGFkZHJlc3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ1JJVElDQUwoT1AjIz0sTENLX0lEKSAgLyogdW5hbGlnbmVkIGFkZHJlc3MgLSB1c2UgY3JpdGljYWwgKi8gICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworQVRPTUlDX0NNUFhDSEdfQ01QTFgoIGNtcGx4NCwga21wX2NtcGx4MzIsIGFkZCwgNjQsICssIGNtcGx4OCwgIGttcF9jbXBseDY0LCAgOGMsIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfY21wbHg0X2FkZF9jbXBseDgKK0FUT01JQ19DTVBYQ0hHX0NNUExYKCBjbXBseDQsIGttcF9jbXBseDMyLCBzdWIsIDY0LCAtLCBjbXBseDgsICBrbXBfY21wbHg2NCwgIDhjLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWJfY21wbHg4CitBVE9NSUNfQ01QWENIR19DTVBMWCggY21wbHg0LCBrbXBfY21wbHgzMiwgbXVsLCA2NCwgKiwgY21wbHg4LCAga21wX2NtcGx4NjQsICA4YywgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19jbXBseDRfbXVsX2NtcGx4OAorQVRPTUlDX0NNUFhDSEdfQ01QTFgoIGNtcGx4NCwga21wX2NtcGx4MzIsIGRpdiwgNjQsIC8sIGNtcGx4OCwgIGttcF9jbXBseDY0LCAgOGMsIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfY21wbHg0X2Rpdl9jbXBseDgKKworLy8gUkVBRCwgV1JJVEUsIENBUFRVUkUgYXJlIHN1cHBvcnRlZCBvbmx5IG9uIElBLTMyIGFyY2hpdGVjdHVyZSBhbmQgSW50ZWwoUikgNjQKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBdG9taWMgUkVBRCByb3V0aW5lcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQmVnaW5uaW5nIG9mIGEgZGVmaW5pdGlvbiAocHJvdmlkZXMgbmFtZSwgcGFyYW1ldGVycywgZ2VidWcgdHJhY2UpCisvLyAgICAgVFlQRV9JRCAtIG9wZXJhbmRzIHR5cGUgYW5kIHNpemUgKGZpeGVkKiwgZml4ZWQqdSBmb3Igc2lnbmVkLCB1bnNpZ25lZCBmaXhlZCkKKy8vICAgICBPUF9JRCAgIC0gb3BlcmF0aW9uIGlkZW50aWZpZXIgKGFkZCwgc3ViLCBtdWwsIC4uLikKKy8vICAgICBUWVBFICAgIC0gb3BlcmFuZHMnIHR5cGUKKyNkZWZpbmUgQVRPTUlDX0JFR0lOX1JFQUQoVFlQRV9JRCxPUF9JRCxUWVBFLCBSRVRfVFlQRSkgXAorUkVUX1RZUEUgX19rbXBjX2F0b21pY18jI1RZUEVfSUQjI18jI09QX0lEKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBUWVBFICogbG9jICkgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtBX1RSQUNFKDEwMCwoIl9fa21wY19hdG9taWNfIiAjVFlQRV9JRCAiXyIgI09QX0lEICI6IFQjJWRcbiIsIGd0aWQgKSk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT3BlcmF0aW9uIG9uICpsaHMsIHJocyB1c2luZyAiY29tcGFyZV9hbmRfc3RvcmVfcmV0IiByb3V0aW5lCisvLyAgICAgVFlQRSAgICAtIG9wZXJhbmRzJyB0eXBlCisvLyAgICAgQklUUyAgICAtIHNpemUgaW4gYml0cywgdXNlZCB0byBkaXN0aW5ndWlzaCBsb3cgbGV2ZWwgY2FsbHMKKy8vICAgICBPUCAgICAgIC0gb3BlcmF0b3IKKy8vIE5vdGU6IHRlbXBfdmFsIGludHJvZHVjZWQgaW4gb3JkZXIgdG8gZm9yY2UgdGhlIGNvbXBpbGVyIHRvIHJlYWQKKy8vICAgICAgICpsaHMgb25seSBvbmNlICh3L28gaXQgdGhlIGNvbXBpbGVyIHJlYWRzICpsaHMgdHdpY2UpCisvLyBUT0RPOiBjaGVjayBpZiBpdCBpcyBzdGlsbCBuZWNlc3NhcnkKKy8vIFJldHVybiBvbGQgdmFsdWUgcmVnYXJkbGVzcyBvZiB0aGUgcmVzdWx0IG9mICJjb21wYXJlICYgc3dhcCMgb3BlcmF0aW9uCisKKyNkZWZpbmUgT1BfQ01QWENIR19SRUFEKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRZUEUgS01QX0FUT01JQ19WT0xBVElMRSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdW5pb24gZl9pX3VuaW9uIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgVFlQRSBmX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBrbXBfaW50IyNCSVRTIGlfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB1bmlvbiBmX2lfdW5pb24gb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRlbXBfdmFsID0gKmxvYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgb2xkX3ZhbHVlLmZfdmFsID0gdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBvbGRfdmFsdWUuaV92YWwgPSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUIyNCSVRTKCAoa21wX2ludCMjQklUUyAqKSBsb2MsIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICZvbGRfdmFsdWUuaV92YWwsICAgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgJm9sZF92YWx1ZS5pX3ZhbCApOyBcCisgICAgICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZS5mX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT3BlcmF0aW9uIG9uICpsaHMsIHJocyBib3VuZCBieSBjcml0aWNhbCBzZWN0aW9uCisvLyAgICAgT1AgICAgIC0gb3BlcmF0b3IgKGl0J3Mgc3VwcG9zZWQgdG8gY29udGFpbiBhbiBhc3NpZ25tZW50KQorLy8gICAgIExDS19JRCAtIGxvY2sgaWRlbnRpZmllcgorLy8gTm90ZTogZG9uJ3QgY2hlY2sgZ3RpZCBhcyBpdCBzaG91bGQgYWx3YXlzIGJlIHZhbGlkCisvLyAxLCAyLWJ5dGUgLSBleHBlY3QgdmFsaWQgcGFyYW1ldGVyLCBvdGhlciAtIGNoZWNrIGJlZm9yZSB0aGlzIG1hY3JvCisjZGVmaW5lIE9QX0NSSVRJQ0FMX1JFQUQoT1AsTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG5ld192YWx1ZSA9ICgqbG9jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX1JFQUQoT1AsRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAoRkxBRykgJiYgKF9fa21wX2F0b21pY19tb2RlID09IDIpICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DUklUSUNBTF9SRUFEKCBPUCwgMCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZWxzZQorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX1JFQUQoT1AsRkxBRykKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfRklYRURfUkVBRChUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxHT01QX0ZMQUcpICAgICAgICAgICBcCitBVE9NSUNfQkVHSU5fUkVBRChUWVBFX0lELE9QX0lELFRZUEUsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUxfUkVBRChPUCMjPSxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbmV3X3ZhbHVlID0gS01QX1RFU1RfVEhFTl9BREQjI0JJVFMoIGxvYywgT1AgMCApOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfQ01QWENIR19SRUFEKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLEdPTVBfRkxBRykgICAgICAgICBcCitBVE9NSUNfQkVHSU5fUkVBRChUWVBFX0lELE9QX0lELFRZUEUsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUxfUkVBRChPUCMjPSxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ01QWENIR19SRUFEKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUm91dGluZXMgZm9yIEV4dGVuZGVkIHR5cGVzOiBsb25nIGRvdWJsZSwgX1F1YWQsIGNvbXBsZXggZmxhdm91cnMgKHVzZSBjcml0aWNhbCBzZWN0aW9uKQorLy8gICAgIFRZUEVfSUQsIE9QX0lELCBUWVBFIC0gZGV0YWlsZWQgYWJvdmUKKy8vICAgICBPUCAgICAgIC0gb3BlcmF0b3IKKy8vICAgICBMQ0tfSUQgIC0gbG9jayBpZGVudGlmaWVyLCB1c2VkIHRvIHBvc3NpYmx5IGRpc3Rpbmd1aXNoIGxvY2sgdmFyaWFibGUKKyNkZWZpbmUgQVRPTUlDX0NSSVRJQ0FMX1JFQUQoVFlQRV9JRCxPUF9JRCxUWVBFLE9QLExDS19JRCxHT01QX0ZMQUcpICAgICAgXAorQVRPTUlDX0JFR0lOX1JFQUQoVFlQRV9JRCxPUF9JRCxUWVBFLFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMX1JFQUQoT1AjIz0sR09NUF9GTEFHKSAgLyogc2VuZCBhc3NpZ25tZW50ICovICAgICAgICAgXAorICAgIE9QX0NSSVRJQ0FMX1JFQUQoT1AsTENLX0lEKSAgICAgICAgICAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgICAgICAgICBcCisgICAgcmV0dXJuIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGaXggZm9yIGNtcGx4NCByZWFkIChDUTIyMDM2MSkgb24gV2luZG93cyogT1MuIFJlZ3VsYXIgcm91dGluZSB3aXRoIHJldHVybiB2YWx1ZSBkb2Vzbid0IHdvcmsuCisvLyBMZXQncyByZXR1cm4gdGhlIHJlYWQgdmFsdWUgdGhyb3VnaCB0aGUgYWRkaXRpb25hbCBwYXJhbWV0ZXIuCisKKyNpZiAoIEtNUF9PU19XSU5ET1dTICkKKworI2RlZmluZSBPUF9DUklUSUNBTF9SRUFEX1dSSyhPUCxMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKm91dCkgPSAoKmxvYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyNkZWZpbmUgT1BfR09NUF9DUklUSUNBTF9SRUFEX1dSSyhPUCxGTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggKEZMQUcpICYmIChfX2ttcF9hdG9taWNfbW9kZSA9PSAyKSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ1JJVElDQUxfUkVBRF9XUksoIE9QLCAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyNlbHNlCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfUkVBRF9XUksoT1AsRkxBRykKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfQkVHSU5fUkVBRF9XUksoVFlQRV9JRCxPUF9JRCxUWVBFKSBcCit2b2lkIF9fa21wY19hdG9taWNfIyNUWVBFX0lEIyNfIyNPUF9JRCggVFlQRSAqIG91dCwgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgVFlQRSAqIGxvYyApIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLQV9UUkFDRSgxMDAsKCJfX2ttcGNfYXRvbWljXyIgI1RZUEVfSUQgIl8iICNPUF9JRCAiOiBUIyVkXG4iLCBndGlkICkpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX0NSSVRJQ0FMX1JFQURfV1JLKFRZUEVfSUQsT1BfSUQsVFlQRSxPUCxMQ0tfSUQsR09NUF9GTEFHKSAgICAgIFwKK0FUT01JQ19CRUdJTl9SRUFEX1dSSyhUWVBFX0lELE9QX0lELFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMX1JFQURfV1JLKE9QIyM9LEdPTVBfRkxBRykgIC8qIHNlbmQgYXNzaWdubWVudCAqLyAgICAgICAgIFwKKyAgICBPUF9DUklUSUNBTF9SRUFEX1dSSyhPUCxMQ0tfSUQpICAgICAgICAgIC8qIHNlbmQgYXNzaWdubWVudCAqLyAgICAgICAgICAgIFwKK30KKworI2VuZGlmIC8vIEtNUF9PU19XSU5ET1dTCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICAgICAgICAgICAgICAgICBUWVBFX0lELE9QX0lELCBUWVBFLCAgICAgIE9QLCBHT01QX0ZMQUcKK0FUT01JQ19GSVhFRF9SRUFEKCBmaXhlZDQsIHJkLCBrbXBfaW50MzIsICAzMiwgKywgMCAgICAgICAgICAgICkgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9yZAorQVRPTUlDX0ZJWEVEX1JFQUQoIGZpeGVkOCwgcmQsIGttcF9pbnQ2NCwgIDY0LCArLCBLTVBfQVJDSF9YODYgKSAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3JkCitBVE9NSUNfQ01QWENIR19SRUFEKCBmbG9hdDQsIHJkLCBrbXBfcmVhbDMyLCAzMiwgKywgS01QX0FSQ0hfWDg2ICkgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfcmQKK0FUT01JQ19DTVBYQ0hHX1JFQUQoIGZsb2F0OCwgcmQsIGttcF9yZWFsNjQsIDY0LCArLCBLTVBfQVJDSF9YODYgKSAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9yZAorCisvLyAhISEgVE9ETzogUmVtb3ZlIGxvY2sgb3BlcmF0aW9ucyBmb3IgImNoYXIiIHNpbmNlIGl0IGNhbid0IGJlIG5vbi1hdG9taWMKK0FUT01JQ19DTVBYQ0hHX1JFQUQoIGZpeGVkMSwgIHJkLCBrbXBfaW50OCwgICAgOCwgKywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9yZAorQVRPTUlDX0NNUFhDSEdfUkVBRCggZml4ZWQyLCAgcmQsIGttcF9pbnQxNiwgIDE2LCArLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3JkCisKK0FUT01JQ19DUklUSUNBTF9SRUFEKCBmbG9hdDEwLCByZCwgbG9uZyBkb3VibGUsICssIDEwciwgICAxICkgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfcmQKKyNpZiBLTVBfSEFWRV9RVUFECitBVE9NSUNfQ1JJVElDQUxfUkVBRCggZmxvYXQxNiwgcmQsIFFVQURfTEVHQUNZLCArLCAxNnIsICAgMSApICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X3JkCisjZW5kaWYgLy8gS01QX0hBVkVfUVVBRAorCisvLyBGaXggZm9yIENRMjIwMzYxIG9uIFdpbmRvd3MqIE9TCisjaWYgKCBLTVBfT1NfV0lORE9XUyApCisgICAgQVRPTUlDX0NSSVRJQ0FMX1JFQURfV1JLKCBjbXBseDQsICByZCwga21wX2NtcGx4MzIsICssICA4YywgMSApICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfcmQKKyNlbHNlCisgICAgQVRPTUlDX0NSSVRJQ0FMX1JFQUQoIGNtcGx4NCwgIHJkLCBrbXBfY21wbHgzMiwgKywgIDhjLCAxICkgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfcmQKKyNlbmRpZgorQVRPTUlDX0NSSVRJQ0FMX1JFQUQoIGNtcGx4OCwgIHJkLCBrbXBfY21wbHg2NCwgKywgMTZjLCAxICkgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg4X3JkCitBVE9NSUNfQ1JJVElDQUxfUkVBRCggY21wbHgxMCwgcmQsIGttcF9jbXBseDgwLCArLCAyMGMsIDEgKSAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDEwX3JkCisjaWYgS01QX0hBVkVfUVVBRAorQVRPTUlDX0NSSVRJQ0FMX1JFQUQoIGNtcGx4MTYsIHJkLCBDUExYMTI4X0xFRywgKywgMzJjLCAxICkgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9yZAorI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICBBVE9NSUNfQ1JJVElDQUxfUkVBRCggZmxvYXQxNiwgYTE2X3JkLCBRdWFkX2ExNl90LCArLCAxNnIsIDEgKSAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9hMTZfcmQKKyAgICBBVE9NSUNfQ1JJVElDQUxfUkVBRCggY21wbHgxNiwgYTE2X3JkLCBrbXBfY21wbHgxMjhfYTE2X3QsICssIDMyYywgMSApIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9hMTZfcmQKKyNlbmRpZgorI2VuZGlmCisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBdG9taWMgV1JJVEUgcm91dGluZXMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIEFUT01JQ19YQ0hHX1dSKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLEdPTVBfRkxBRykgICAgICAgICAgICAgIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoT1AsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX1hDSEdfRklYRUQjI0JJVFMoIGxocywgcmhzICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfWENIR19GTE9BVF9XUihUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxHT01QX0ZMQUcpICAgICAgICBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKE9QLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9YQ0hHX1JFQUwjI0JJVFMoIGxocywgcmhzICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPcGVyYXRpb24gb24gKmxocywgcmhzIHVzaW5nICJjb21wYXJlX2FuZF9zdG9yZSIgcm91dGluZQorLy8gICAgIFRZUEUgICAgLSBvcGVyYW5kcycgdHlwZQorLy8gICAgIEJJVFMgICAgLSBzaXplIGluIGJpdHMsIHVzZWQgdG8gZGlzdGluZ3Vpc2ggbG93IGxldmVsIGNhbGxzCisvLyAgICAgT1AgICAgICAtIG9wZXJhdG9yCisvLyBOb3RlOiB0ZW1wX3ZhbCBpbnRyb2R1Y2VkIGluIG9yZGVyIHRvIGZvcmNlIHRoZSBjb21waWxlciB0byByZWFkCisvLyAgICAgICAqbGhzIG9ubHkgb25jZSAody9vIGl0IHRoZSBjb21waWxlciByZWFkcyAqbGhzIHR3aWNlKQorI2RlZmluZSBPUF9DTVBYQ0hHX1dSKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFlQRSBLTVBfQVRPTUlDX1ZPTEFUSUxFIHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUWVBFIG9sZF92YWx1ZSwgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRlbXBfdmFsID0gKmxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgb2xkX3ZhbHVlID0gdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuZXdfdmFsdWUgPSByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHdoaWxlICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRIyNCSVRTKCAoa21wX2ludCMjQklUUyAqKSBsaHMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICZvbGRfdmFsdWUsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgJm5ld192YWx1ZSApICkgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0ZW1wX3ZhbCA9ICpsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG9sZF92YWx1ZSA9IHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbmV3X3ZhbHVlID0gcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX0NNUFhDSEdfV1IoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsR09NUF9GTEFHKSAgICAgICAgICAgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChPUCxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DTVBYQ0hHX1dSKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJvdXRpbmVzIGZvciBFeHRlbmRlZCB0eXBlczogbG9uZyBkb3VibGUsIF9RdWFkLCBjb21wbGV4IGZsYXZvdXJzICh1c2UgY3JpdGljYWwgc2VjdGlvbikKKy8vICAgICBUWVBFX0lELCBPUF9JRCwgVFlQRSAtIGRldGFpbGVkIGFib3ZlCisvLyAgICAgT1AgICAgICAtIG9wZXJhdG9yCisvLyAgICAgTENLX0lEICAtIGxvY2sgaWRlbnRpZmllciwgdXNlZCB0byBwb3NzaWJseSBkaXN0aW5ndWlzaCBsb2NrIHZhcmlhYmxlCisjZGVmaW5lIEFUT01JQ19DUklUSUNBTF9XUihUWVBFX0lELE9QX0lELFRZUEUsT1AsTENLX0lELEdPTVBfRkxBRykgICAgICAgIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoT1AsR09NUF9GTEFHKSAgICAgICAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgICAgICAgICBcCisgICAgT1BfQ1JJVElDQUwoT1AsTENLX0lEKSAgICAgICAgICAgICAgIC8qIHNlbmQgYXNzaWdubWVudCAqLyAgICAgICAgICAgIFwKK30KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQVRPTUlDX1hDSEdfV1IoIGZpeGVkMSwgIHdyLCBrbXBfaW50OCwgICAgOCwgPSwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV93cgorQVRPTUlDX1hDSEdfV1IoIGZpeGVkMiwgIHdyLCBrbXBfaW50MTYsICAxNiwgPSwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl93cgorQVRPTUlDX1hDSEdfV1IoIGZpeGVkNCwgIHdyLCBrbXBfaW50MzIsICAzMiwgPSwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF93cgorI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICBBVE9NSUNfQ01QWENIR19XUiggZml4ZWQ4LCAgd3IsIGttcF9pbnQ2NCwgIDY0LCA9LCAgS01QX0FSQ0hfWDg2ICkgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF93cgorI2Vsc2UKKyAgICBBVE9NSUNfWENIR19XUiggZml4ZWQ4LCAgd3IsIGttcF9pbnQ2NCwgIDY0LCA9LCAgS01QX0FSQ0hfWDg2ICkgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF93cgorI2VuZGlmCisKK0FUT01JQ19YQ0hHX0ZMT0FUX1dSKCBmbG9hdDQsIHdyLCBrbXBfcmVhbDMyLCAzMiwgPSwgS01QX0FSQ0hfWDg2ICkgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF93cgorI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICBBVE9NSUNfQ01QWENIR19XUiggZmxvYXQ4LCAgd3IsIGttcF9yZWFsNjQsICA2NCwgPSwgIEtNUF9BUkNIX1g4NiApICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF93cgorI2Vsc2UKKyAgICBBVE9NSUNfWENIR19GTE9BVF9XUiggZmxvYXQ4LCAgd3IsIGttcF9yZWFsNjQsICA2NCwgPSwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF93cgorI2VuZGlmCisKK0FUT01JQ19DUklUSUNBTF9XUiggZmxvYXQxMCwgd3IsIGxvbmcgZG91YmxlLCA9LCAxMHIsICAgMSApICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX3dyCisjaWYgS01QX0hBVkVfUVVBRAorQVRPTUlDX0NSSVRJQ0FMX1dSKCBmbG9hdDE2LCB3ciwgUVVBRF9MRUdBQ1ksID0sIDE2ciwgICAxICkgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfd3IKKyNlbmRpZgorQVRPTUlDX0NSSVRJQ0FMX1dSKCBjbXBseDQsICB3ciwga21wX2NtcGx4MzIsID0sICA4YywgICAxICkgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF93cgorQVRPTUlDX0NSSVRJQ0FMX1dSKCBjbXBseDgsICB3ciwga21wX2NtcGx4NjQsID0sIDE2YywgICAxICkgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4OF93cgorQVRPTUlDX0NSSVRJQ0FMX1dSKCBjbXBseDEwLCB3ciwga21wX2NtcGx4ODAsID0sIDIwYywgICAxICkgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTBfd3IKKyNpZiBLTVBfSEFWRV9RVUFECitBVE9NSUNfQ1JJVElDQUxfV1IoIGNtcGx4MTYsIHdyLCBDUExYMTI4X0xFRywgPSwgMzJjLCAgIDEgKSAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl93cgorI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICBBVE9NSUNfQ1JJVElDQUxfV1IoIGZsb2F0MTYsIGExNl93ciwgUXVhZF9hMTZfdCwgICAgICAgICA9LCAxNnIsIDEgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYTE2X3dyCisgICAgQVRPTUlDX0NSSVRJQ0FMX1dSKCBjbXBseDE2LCBhMTZfd3IsIGttcF9jbXBseDEyOF9hMTZfdCwgPSwgMzJjLCAxICkgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X2ExNl93cgorI2VuZGlmCisjZW5kaWYKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEF0b21pYyBDQVBUVVJFIHJvdXRpbmVzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gQmVnaW5uaW5nIG9mIGEgZGVmaW5pdGlvbiAocHJvdmlkZXMgbmFtZSwgcGFyYW1ldGVycywgZ2VidWcgdHJhY2UpCisvLyAgICAgVFlQRV9JRCAtIG9wZXJhbmRzIHR5cGUgYW5kIHNpemUgKGZpeGVkKiwgZml4ZWQqdSBmb3Igc2lnbmVkLCB1bnNpZ25lZCBmaXhlZCkKKy8vICAgICBPUF9JRCAgIC0gb3BlcmF0aW9uIGlkZW50aWZpZXIgKGFkZCwgc3ViLCBtdWwsIC4uLikKKy8vICAgICBUWVBFICAgIC0gb3BlcmFuZHMnIHR5cGUKKyNkZWZpbmUgQVRPTUlDX0JFR0lOX0NQVChUWVBFX0lELE9QX0lELFRZUEUsUkVUX1RZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorUkVUX1RZUEUgX19rbXBjX2F0b21pY18jI1RZUEVfSUQjI18jI09QX0lEKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBUWVBFICogbGhzLCBUWVBFIHJocywgaW50IGZsYWcgKSBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS0FfVFJBQ0UoMTAwLCgiX19rbXBjX2F0b21pY18iICNUWVBFX0lEICJfIiAjT1BfSUQgIjogVCMlZFxuIiwgZ3RpZCApKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT3BlcmF0aW9uIG9uICpsaHMsIHJocyBib3VuZCBieSBjcml0aWNhbCBzZWN0aW9uCisvLyAgICAgT1AgICAgIC0gb3BlcmF0b3IgKGl0J3Mgc3VwcG9zZWQgdG8gY29udGFpbiBhbiBhc3NpZ25tZW50KQorLy8gICAgIExDS19JRCAtIGxvY2sgaWRlbnRpZmllcgorLy8gTm90ZTogZG9uJ3QgY2hlY2sgZ3RpZCBhcyBpdCBzaG91bGQgYWx3YXlzIGJlIHZhbGlkCisvLyAxLCAyLWJ5dGUgLSBleHBlY3QgdmFsaWQgcGFyYW1ldGVyLCBvdGhlciAtIGNoZWNrIGJlZm9yZSB0aGlzIG1hY3JvCisjZGVmaW5lIE9QX0NSSVRJQ0FMX0NQVChPUCxMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYoIGZsYWcgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCpsaHMpIE9QIHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuZXdfdmFsdWUgPSAoKmxocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbmV3X3ZhbHVlID0gKCpsaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKmxocykgT1AgcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOyAgICAgICAgICAgICBcCisgICAgcmV0dXJuIG5ld192YWx1ZTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfQ1BUKE9QLEZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIChGTEFHKSAmJiAoX19rbXBfYXRvbWljX21vZGUgPT0gMikgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NSSVRJQ0FMX0NQVCggT1AjIz0sIDAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZWxzZQorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX0NQVChPUCxGTEFHKQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9wZXJhdGlvbiBvbiAqbGhzLCByaHMgdXNpbmcgImNvbXBhcmVfYW5kX3N0b3JlIiByb3V0aW5lCisvLyAgICAgVFlQRSAgICAtIG9wZXJhbmRzJyB0eXBlCisvLyAgICAgQklUUyAgICAtIHNpemUgaW4gYml0cywgdXNlZCB0byBkaXN0aW5ndWlzaCBsb3cgbGV2ZWwgY2FsbHMKKy8vICAgICBPUCAgICAgIC0gb3BlcmF0b3IKKy8vIE5vdGU6IHRlbXBfdmFsIGludHJvZHVjZWQgaW4gb3JkZXIgdG8gZm9yY2UgdGhlIGNvbXBpbGVyIHRvIHJlYWQKKy8vICAgICAgICpsaHMgb25seSBvbmNlICh3L28gaXQgdGhlIGNvbXBpbGVyIHJlYWRzICpsaHMgdHdpY2UpCisjZGVmaW5lIE9QX0NNUFhDSEdfQ1BUKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUWVBFIEtNUF9BVE9NSUNfVk9MQVRJTEUgdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRZUEUgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcF92YWwgPSAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBvbGRfdmFsdWUgPSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSBPUCByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd2hpbGUgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EjI0JJVFMoIChrbXBfaW50IyNCSVRTICopIGxocywgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgJm9sZF92YWx1ZSwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmbmV3X3ZhbHVlICkgKSAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX0NQVV9QQVVTRSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHRlbXBfdmFsID0gKmxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgb2xkX3ZhbHVlID0gdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgT1AgcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiggZmxhZyApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByZXR1cm4gbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFUT01JQ19DTVBYQ0hHX0NQVChUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxHT01QX0ZMQUcpICAgICAgICAgICBcCitBVE9NSUNfQkVHSU5fQ1BUKFRZUEVfSUQsT1BfSUQsVFlQRSxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTF9DUFQoT1AsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ01QWENIR19DUFQoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX0ZJWEVEX0FERF9DUFQoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsR09NUF9GTEFHKSAgICAgICAgIFwKK0FUT01JQ19CRUdJTl9DUFQoVFlQRV9JRCxPUF9JRCxUWVBFLFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIG9sZF92YWx1ZSwgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMX0NQVChPUCxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBPUCB1c2VkIGFzIGEgc2lnbiBmb3Igc3VidHJhY3Rpb246IChsaHMtcmhzKSAtLT4gKGxocystcmhzKSAqLyAgICAgIFwKKyAgICBvbGRfdmFsdWUgPSBLTVBfVEVTVF9USEVOX0FERCMjQklUUyggbGhzLCBPUCByaHMgKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggZmxhZyApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIG9sZF92YWx1ZSBPUCByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX0ZMT0FUX0FERF9DUFQoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsR09NUF9GTEFHKSAgICAgICAgIFwKK0FUT01JQ19CRUdJTl9DUFQoVFlQRV9JRCxPUF9JRCxUWVBFLFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIG9sZF92YWx1ZSwgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMX0NQVChPUCxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBPUCB1c2VkIGFzIGEgc2lnbiBmb3Igc3VidHJhY3Rpb246IChsaHMtcmhzKSAtLT4gKGxocystcmhzKSAqLyAgICAgIFwKKyAgICBvbGRfdmFsdWUgPSBLTVBfVEVTVF9USEVOX0FERF9SRUFMIyNCSVRTKCBsaHMsIE9QIHJocyApOyAgICAgICAgICAgICAgIFwKKyAgICBpZiggZmxhZyApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIG9sZF92YWx1ZSBPUCByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQVRPTUlDX0ZJWEVEX0FERF9DUFQoIGZpeGVkNCwgYWRkX2NwdCwga21wX2ludDMyLCAgMzIsICssIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGRfY3B0CitBVE9NSUNfRklYRURfQUREX0NQVCggZml4ZWQ0LCBzdWJfY3B0LCBrbXBfaW50MzIsICAzMiwgLSwgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9jcHQKK0FUT01JQ19GSVhFRF9BRERfQ1BUKCBmaXhlZDgsIGFkZF9jcHQsIGttcF9pbnQ2NCwgIDY0LCArLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfYWRkX2NwdAorQVRPTUlDX0ZJWEVEX0FERF9DUFQoIGZpeGVkOCwgc3ViX2NwdCwga21wX2ludDY0LCAgNjQsIC0sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfY3B0CisKKyNpZiBLTVBfTUlDCitBVE9NSUNfQ01QWENIR19DUFQoIGZsb2F0NCwgYWRkX2NwdCwga21wX3JlYWwzMiwgMzIsICssIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGRfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZsb2F0NCwgc3ViX2NwdCwga21wX3JlYWwzMiwgMzIsIC0sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZsb2F0OCwgYWRkX2NwdCwga21wX3JlYWw2NCwgNjQsICssIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGRfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZsb2F0OCwgc3ViX2NwdCwga21wX3JlYWw2NCwgNjQsIC0sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWJfY3B0CisjZWxzZQorQVRPTUlDX0ZMT0FUX0FERF9DUFQoIGZsb2F0NCwgYWRkX2NwdCwga21wX3JlYWwzMiwgMzIsICssIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGRfY3B0CitBVE9NSUNfRkxPQVRfQUREX0NQVCggZmxvYXQ0LCBzdWJfY3B0LCBrbXBfcmVhbDMyLCAzMiwgLSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9jcHQKK0FUT01JQ19GTE9BVF9BRERfQ1BUKCBmbG9hdDgsIGFkZF9jcHQsIGttcF9yZWFsNjQsIDY0LCArLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfYWRkX2NwdAorQVRPTUlDX0ZMT0FUX0FERF9DUFQoIGZsb2F0OCwgc3ViX2NwdCwga21wX3JlYWw2NCwgNjQsIC0sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWJfY3B0CisjZW5kaWYgLy8gS01QX01JQworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJpZXMgZGVmaW5pdGlvbiBmb3IgaW50ZWdlciBvcGVyYW5kcworLy8gICAgIFRZUEVfSUQgLSBvcGVyYW5kcyB0eXBlIGFuZCBzaXplIChmaXhlZDQsIGZsb2F0NCkKKy8vICAgICBPUF9JRCAgIC0gb3BlcmF0aW9uIGlkZW50aWZpZXIgKGFkZCwgc3ViLCBtdWwsIC4uLikKKy8vICAgICBUWVBFICAgIC0gb3BlcmFuZCB0eXBlCisvLyAgICAgQklUUyAgICAtIHNpemUgaW4gYml0cywgdXNlZCB0byBkaXN0aW5ndWlzaCBsb3cgbGV2ZWwgY2FsbHMKKy8vICAgICBPUCAgICAgIC0gb3BlcmF0b3IgKHVzZWQgaW4gY3JpdGljYWwgc2VjdGlvbikKKy8vICAgICAgICAgICAgICAgVFlQRV9JRCxPUF9JRCwgIFRZUEUsICAgQklUUyxPUCxHT01QX0ZMQUcKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUm91dGluZXMgZm9yIEFUT01JQyBpbnRlZ2VyIG9wZXJhbmRzLCBvdGhlciBvcGVyYXRvcnMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICAgICAgICAgICAgIFRZUEVfSUQsT1BfSUQsIFRZUEUsICAgICAgICAgIE9QLCAgR09NUF9GTEFHCitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMSwgIGFkZF9jcHQsIGttcF9pbnQ4LCAgICA4LCArLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX2FkZF9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQxLCBhbmRiX2NwdCwga21wX2ludDgsICAgIDgsICYsICAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfYW5kYl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQxLCAgZGl2X2NwdCwga21wX2ludDgsICAgIDgsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDF1LCBkaXZfY3B0LCBrbXBfdWludDgsICAgOCwgLywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDEsICBtdWxfY3B0LCBrbXBfaW50OCwgICAgOCwgKiwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tdWxfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMSwgIG9yYl9jcHQsIGttcF9pbnQ4LCAgICA4LCB8LCAgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX29yYl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQxLCAgc2hsX2NwdCwga21wX2ludDgsICAgIDgsIDw8LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfc2hsX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDEsICBzaHJfY3B0LCBrbXBfaW50OCwgICAgOCwgPj4sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaHJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMXUsIHNocl9jcHQsIGttcF91aW50OCwgICA4LCA+PiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxdV9zaHJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMSwgIHN1Yl9jcHQsIGttcF9pbnQ4LCAgICA4LCAtLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3N1Yl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQxLCAgeG9yX2NwdCwga21wX2ludDgsICAgIDgsIF4sICAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfeG9yX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDIsICBhZGRfY3B0LCBrbXBfaW50MTYsICAxNiwgKywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hZGRfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMiwgYW5kYl9jcHQsIGttcF9pbnQxNiwgIDE2LCAmLCAgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX2FuZGJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMiwgIGRpdl9jcHQsIGttcF9pbnQxNiwgIDE2LCAvLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQydSwgZGl2X2NwdCwga21wX3VpbnQxNiwgMTYsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQyLCAgbXVsX2NwdCwga21wX2ludDE2LCAgMTYsICosICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfbXVsX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDIsICBvcmJfY3B0LCBrbXBfaW50MTYsICAxNiwgfCwgIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9vcmJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMiwgIHNobF9jcHQsIGttcF9pbnQxNiwgIDE2LCA8PCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3NobF9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQyLCAgc2hyX2NwdCwga21wX2ludDE2LCAgMTYsID4+LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfc2hyX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDJ1LCBzaHJfY3B0LCBrbXBfdWludDE2LCAxNiwgPj4sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfc2hyX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDIsICBzdWJfY3B0LCBrbXBfaW50MTYsICAxNiwgLSwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMiwgIHhvcl9jcHQsIGttcF9pbnQxNiwgIDE2LCBeLCAgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3hvcl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQ0LCBhbmRiX2NwdCwga21wX2ludDMyLCAgMzIsICYsICAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfYW5kYl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQ0LCAgZGl2X2NwdCwga21wX2ludDMyLCAgMzIsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfZGl2X2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDR1LCBkaXZfY3B0LCBrbXBfdWludDMyLCAzMiwgLywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDQsICBtdWxfY3B0LCBrbXBfaW50MzIsICAzMiwgKiwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWxfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkNCwgIG9yYl9jcHQsIGttcF9pbnQzMiwgIDMyLCB8LCAgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X29yYl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQ0LCAgc2hsX2NwdCwga21wX2ludDMyLCAgMzIsIDw8LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfc2hsX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDQsICBzaHJfY3B0LCBrbXBfaW50MzIsICAzMiwgPj4sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkNHUsIHNocl9jcHQsIGttcF91aW50MzIsIDMyLCA+PiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkNCwgIHhvcl9jcHQsIGttcF9pbnQzMiwgIDMyLCBeLCAgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3hvcl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQ4LCBhbmRiX2NwdCwga21wX2ludDY0LCAgNjQsICYsICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfYW5kYl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQ4LCAgZGl2X2NwdCwga21wX2ludDY0LCAgNjQsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDh1LCBkaXZfY3B0LCBrbXBfdWludDY0LCA2NCwgLywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2X2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDgsICBtdWxfY3B0LCBrbXBfaW50NjQsICA2NCwgKiwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWxfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkOCwgIG9yYl9jcHQsIGttcF9pbnQ2NCwgIDY0LCB8LCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X29yYl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQ4LCAgc2hsX2NwdCwga21wX2ludDY0LCAgNjQsIDw8LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfc2hsX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDgsICBzaHJfY3B0LCBrbXBfaW50NjQsICA2NCwgPj4sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkOHUsIHNocl9jcHQsIGttcF91aW50NjQsIDY0LCA+PiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zaHJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkOCwgIHhvcl9jcHQsIGttcF9pbnQ2NCwgIDY0LCBeLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3hvcl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZmxvYXQ0LCAgZGl2X2NwdCwga21wX3JlYWwzMiwgMzIsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmbG9hdDQsICBtdWxfY3B0LCBrbXBfcmVhbDMyLCAzMiwgKiwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWxfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZsb2F0OCwgIGRpdl9jcHQsIGttcF9yZWFsNjQsIDY0LCAvLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X2Rpdl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZmxvYXQ4LCAgbXVsX2NwdCwga21wX3JlYWw2NCwgNjQsICosICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfbXVsX2NwdAorLy8gICAgICAgICAgICAgIFRZUEVfSUQsT1BfSUQsIFRZUEUsICAgICAgICAgIE9QLCAgR09NUF9GTEFHCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUm91dGluZXMgZm9yIEMvQysrIFJlZHVjdGlvbiBvcGVyYXRvcnMgJiYgYW5kIHx8CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT3BlcmF0aW9uIG9uICpsaHMsIHJocyBib3VuZCBieSBjcml0aWNhbCBzZWN0aW9uCisvLyAgICAgT1AgICAgIC0gb3BlcmF0b3IgKGl0J3Mgc3VwcG9zZWQgdG8gY29udGFpbiBhbiBhc3NpZ25tZW50KQorLy8gICAgIExDS19JRCAtIGxvY2sgaWRlbnRpZmllcgorLy8gTm90ZTogZG9uJ3QgY2hlY2sgZ3RpZCBhcyBpdCBzaG91bGQgYWx3YXlzIGJlIHZhbGlkCisvLyAxLCAyLWJ5dGUgLSBleHBlY3QgdmFsaWQgcGFyYW1ldGVyLCBvdGhlciAtIGNoZWNrIGJlZm9yZSB0aGlzIG1hY3JvCisjZGVmaW5lIE9QX0NSSVRJQ0FMX0xfQ1BUKE9QLExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKCBmbGFnICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5ld192YWx1ZSBPUCByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuZXdfdmFsdWUgPSAoKmxocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfTF9DUFQoT1AsRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIChGTEFHKSAmJiAoX19rbXBfYXRvbWljX21vZGUgPT0gMikgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NSSVRJQ0FMX0xfQ1BUKCBPUCwgMCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyNlbHNlCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfTF9DUFQoT1AsRkxBRykKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBOZWVkIHNlcGFyYXRlIG1hY3JvcyBmb3IgJiYsIHx8IGJlY2F1c2UgdGhlcmUgaXMgbm8gY29tYmluZWQgYXNzaWdubWVudAorI2RlZmluZSBBVE9NSUNfQ01QWF9MX0NQVChUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxHT01QX0ZMQUcpICAgICAgICAgICBcCitBVE9NSUNfQkVHSU5fQ1BUKFRZUEVfSUQsT1BfSUQsVFlQRSxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUxfTF9DUFQoID0gKmxocyBPUCwgR09NUF9GTEFHICkgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ01QWENIR19DUFQoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworQVRPTUlDX0NNUFhfTF9DUFQoIGZpeGVkMSwgYW5kbF9jcHQsIGNoYXIsICAgICAgIDgsICYmLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfYW5kbF9jcHQKK0FUT01JQ19DTVBYX0xfQ1BUKCBmaXhlZDEsICBvcmxfY3B0LCBjaGFyLCAgICAgICA4LCB8fCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX29ybF9jcHQKK0FUT01JQ19DTVBYX0xfQ1BUKCBmaXhlZDIsIGFuZGxfY3B0LCBzaG9ydCwgICAgIDE2LCAmJiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX2FuZGxfY3B0CitBVE9NSUNfQ01QWF9MX0NQVCggZml4ZWQyLCAgb3JsX2NwdCwgc2hvcnQsICAgICAxNiwgfHwsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9vcmxfY3B0CitBVE9NSUNfQ01QWF9MX0NQVCggZml4ZWQ0LCBhbmRsX2NwdCwga21wX2ludDMyLCAzMiwgJiYsIDAgKSAgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hbmRsX2NwdAorQVRPTUlDX0NNUFhfTF9DUFQoIGZpeGVkNCwgIG9ybF9jcHQsIGttcF9pbnQzMiwgMzIsIHx8LCAwICkgICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfb3JsX2NwdAorQVRPTUlDX0NNUFhfTF9DUFQoIGZpeGVkOCwgYW5kbF9jcHQsIGttcF9pbnQ2NCwgNjQsICYmLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfYW5kbF9jcHQKK0FUT01JQ19DTVBYX0xfQ1BUKCBmaXhlZDgsICBvcmxfY3B0LCBrbXBfaW50NjQsIDY0LCB8fCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X29ybF9jcHQKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSb3V0aW5lcyBmb3IgRm9ydHJhbiBvcGVyYXRvcnMgdGhhdCBtYXRjaGVkIG5vIG9uZSBpbiBDOgorLy8gTUFYLCBNSU4sIC5FUVYuLCAuTkVRVi4KKy8vIE9wZXJhdG9ycyAuQU5ELiwgLk9SLiBhcmUgY292ZXJlZCBieSBfX2ttcGNfYXRvbWljXypfe2FuZGwsb3JsfV9jcHQKKy8vIEludHJpbnNpY3MgSUFORCwgSU9SLCBJRU9SIGFyZSBjb3ZlcmVkIGJ5IF9fa21wY19hdG9taWNfKl97YW5kYixvcmIseG9yfV9jcHQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTUlOIGFuZCBNQVggbmVlZCBzZXBhcmF0ZSBtYWNyb3MKKy8vIE9QIC0gb3BlcmF0b3IgdG8gY2hlY2sgaWYgd2UgbmVlZCBhbnkgYWN0aW9ucz8KKyNkZWZpbmUgTUlOX01BWF9DUklUU0VDVF9DUFQoT1AsTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAqbGhzIE9QIHJocyApIHsgICAgICAgICAgICAgICAgIC8qIHN0aWxsIG5lZWQgYWN0aW9ucz8gKi8gICAgICAgICBcCisgICAgICAgIG9sZF92YWx1ZSA9ICpsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICpsaHMgPSByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICggZmxhZyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBuZXdfdmFsdWUgPSByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisjZGVmaW5lIEdPTVBfTUlOX01BWF9DUklUU0VDVF9DUFQoT1AsRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCggRkxBRyApICYmICggX19rbXBfYXRvbWljX21vZGUgPT0gMiApKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1JTl9NQVhfQ1JJVFNFQ1RfQ1BUKCBPUCwgMCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2Vsc2UKKyNkZWZpbmUgR09NUF9NSU5fTUFYX0NSSVRTRUNUX0NQVChPUCxGTEFHKQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIE1JTl9NQVhfQ01QWENIR19DUFQoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRZUEUgS01QX0FUT01JQ19WT0xBVElMRSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIC8qVFlQRSBvbGRfdmFsdWU7ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRlbXBfdmFsID0gKmxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG9sZF92YWx1ZSA9IHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHdoaWxlICggb2xkX3ZhbHVlIE9QIHJocyAmJiAgICAgICAgICAvKiBzdGlsbCBuZWVkIGFjdGlvbnM/ICovICAgICBcCisgICAgICAgICAgICAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EjI0JJVFMoIChrbXBfaW50IyNCSVRTICopIGxocywgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmb2xkX3ZhbHVlLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmcmhzICkgKSAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0ZW1wX3ZhbCA9ICpsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBvbGRfdmFsdWUgPSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmKCBmbGFnICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByZXR1cm4gcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByZXR1cm4gb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAxLWJ5dGUsIDItYnl0ZSBvcGVyYW5kcyAtIHVzZSBjcml0aWNhbCBzZWN0aW9uCisjZGVmaW5lIE1JTl9NQVhfQ1JJVElDQUxfQ1BUKFRZUEVfSUQsT1BfSUQsVFlQRSxPUCxMQ0tfSUQsR09NUF9GTEFHKSAgICAgICBcCitBVE9NSUNfQkVHSU5fQ1BUKFRZUEVfSUQsT1BfSUQsVFlQRSxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSBuZXdfdmFsdWUsIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAqbGhzIE9QIHJocyApIHsgICAgIC8qIG5lZWQgYWN0aW9ucz8gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEdPTVBfTUlOX01BWF9DUklUU0VDVF9DUFQoT1AsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1JTl9NQVhfQ1JJVFNFQ1RfQ1BUKE9QLExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuICpsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgTUlOX01BWF9DT01QWENIR19DUFQoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsR09NUF9GTEFHKSAgICAgICAgIFwKK0FUT01JQ19CRUdJTl9DUFQoVFlQRV9JRCxPUF9JRCxUWVBFLFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIG5ld192YWx1ZSwgb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoICpsaHMgT1AgcmhzICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgR09NUF9NSU5fTUFYX0NSSVRTRUNUX0NQVChPUCxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTUlOX01BWF9DTVBYQ0hHX0NQVChUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gKmxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCitNSU5fTUFYX0NPTVBYQ0hHX0NQVCggZml4ZWQxLCAgbWF4X2NwdCwgY2hhciwgICAgICAgIDgsIDwsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX21heF9jcHQKK01JTl9NQVhfQ09NUFhDSEdfQ1BUKCBmaXhlZDEsICBtaW5fY3B0LCBjaGFyLCAgICAgICAgOCwgPiwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDFfbWluX2NwdAorTUlOX01BWF9DT01QWENIR19DUFQoIGZpeGVkMiwgIG1heF9jcHQsIHNob3J0LCAgICAgIDE2LCA8LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tYXhfY3B0CitNSU5fTUFYX0NPTVBYQ0hHX0NQVCggZml4ZWQyLCAgbWluX2NwdCwgc2hvcnQsICAgICAgMTYsID4sIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX21pbl9jcHQKK01JTl9NQVhfQ09NUFhDSEdfQ1BUKCBmaXhlZDQsICBtYXhfY3B0LCBrbXBfaW50MzIsICAzMiwgPCwgMCApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfbWF4X2NwdAorTUlOX01BWF9DT01QWENIR19DUFQoIGZpeGVkNCwgIG1pbl9jcHQsIGttcF9pbnQzMiwgIDMyLCA+LCAwICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9taW5fY3B0CitNSU5fTUFYX0NPTVBYQ0hHX0NQVCggZml4ZWQ4LCAgbWF4X2NwdCwga21wX2ludDY0LCAgNjQsIDwsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X21heF9jcHQKK01JTl9NQVhfQ09NUFhDSEdfQ1BUKCBmaXhlZDgsICBtaW5fY3B0LCBrbXBfaW50NjQsICA2NCwgPiwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDhfbWluX2NwdAorTUlOX01BWF9DT01QWENIR19DUFQoIGZsb2F0NCwgIG1heF9jcHQsIGttcF9yZWFsMzIsIDMyLCA8LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tYXhfY3B0CitNSU5fTUFYX0NPTVBYQ0hHX0NQVCggZmxvYXQ0LCAgbWluX2NwdCwga21wX3JlYWwzMiwgMzIsID4sIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X21pbl9jcHQKK01JTl9NQVhfQ09NUFhDSEdfQ1BUKCBmbG9hdDgsICBtYXhfY3B0LCBrbXBfcmVhbDY0LCA2NCwgPCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfbWF4X2NwdAorTUlOX01BWF9DT01QWENIR19DUFQoIGZsb2F0OCwgIG1pbl9jcHQsIGttcF9yZWFsNjQsIDY0LCA+LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9taW5fY3B0CisjaWYgS01QX0hBVkVfUVVBRAorTUlOX01BWF9DUklUSUNBTF9DUFQoIGZsb2F0MTYsIG1heF9jcHQsIFFVQURfTEVHQUNZLCAgICA8LCAxNnIsICAgMSApICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWF4X2NwdAorTUlOX01BWF9DUklUSUNBTF9DUFQoIGZsb2F0MTYsIG1pbl9jcHQsIFFVQURfTEVHQUNZLCAgICA+LCAxNnIsICAgMSApICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWluX2NwdAorI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICBNSU5fTUFYX0NSSVRJQ0FMX0NQVCggZmxvYXQxNiwgbWF4X2ExNl9jcHQsIFF1YWRfYTE2X3QsIDwsIDE2ciwgIDEgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X21heF9hMTZfY3B0CisgICAgTUlOX01BWF9DUklUSUNBTF9DUFQoIGZsb2F0MTYsIG1pbl9hMTZfY3B0LCBRdWFkX2ExNl90LCA+LCAxNnIsICAxICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9taXhfYTE2X2NwdAorI2VuZGlmCisjZW5kaWYKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfRVFWX0NQVChPUCxGTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIChGTEFHKSAmJiAoX19rbXBfYXRvbWljX21vZGUgPT0gMikgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NSSVRJQ0FMX0NQVCggT1AsIDAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZWxzZQorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX0VRVl9DUFQoT1AsRkxBRykKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfQ01QWF9FUVZfQ1BUKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLEdPTVBfRkxBRykgICAgICAgICBcCitBVE9NSUNfQkVHSU5fQ1BUKFRZUEVfSUQsT1BfSUQsVFlQRSxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUxfRVFWX0NQVChePX4sR09NUF9GTEFHKSAgLyogc2VuZCBhc3NpZ25tZW50ICovICAgICAgICBcCisgICAgT1BfQ01QWENIR19DUFQoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FUT01JQ19DTVBYQ0hHX0NQVCggIGZpeGVkMSwgbmVxdl9jcHQsIGttcF9pbnQ4LCAgIDgsICAgXiwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDFfbmVxdl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggIGZpeGVkMiwgbmVxdl9jcHQsIGttcF9pbnQxNiwgMTYsICAgXiwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDJfbmVxdl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggIGZpeGVkNCwgbmVxdl9jcHQsIGttcF9pbnQzMiwgMzIsICAgXiwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDRfbmVxdl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggIGZpeGVkOCwgbmVxdl9jcHQsIGttcF9pbnQ2NCwgNjQsICAgXiwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDhfbmVxdl9jcHQKK0FUT01JQ19DTVBYX0VRVl9DUFQoIGZpeGVkMSwgZXF2X2NwdCwgIGttcF9pbnQ4LCAgIDgsICBefiwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDFfZXF2X2NwdAorQVRPTUlDX0NNUFhfRVFWX0NQVCggZml4ZWQyLCBlcXZfY3B0LCAga21wX2ludDE2LCAxNiwgIF5+LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9lcXZfY3B0CitBVE9NSUNfQ01QWF9FUVZfQ1BUKCBmaXhlZDQsIGVxdl9jcHQsICBrbXBfaW50MzIsIDMyLCAgXn4sIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X2Vxdl9jcHQKK0FUT01JQ19DTVBYX0VRVl9DUFQoIGZpeGVkOCwgZXF2X2NwdCwgIGttcF9pbnQ2NCwgNjQsICBefiwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDhfZXF2X2NwdAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJvdXRpbmVzIGZvciBFeHRlbmRlZCB0eXBlczogbG9uZyBkb3VibGUsIF9RdWFkLCBjb21wbGV4IGZsYXZvdXJzICh1c2UgY3JpdGljYWwgc2VjdGlvbikKKy8vICAgICBUWVBFX0lELCBPUF9JRCwgVFlQRSAtIGRldGFpbGVkIGFib3ZlCisvLyAgICAgT1AgICAgICAtIG9wZXJhdG9yCisvLyAgICAgTENLX0lEICAtIGxvY2sgaWRlbnRpZmllciwgdXNlZCB0byBwb3NzaWJseSBkaXN0aW5ndWlzaCBsb2NrIHZhcmlhYmxlCisjZGVmaW5lIEFUT01JQ19DUklUSUNBTF9DUFQoVFlQRV9JRCxPUF9JRCxUWVBFLE9QLExDS19JRCxHT01QX0ZMQUcpIFwKK0FUT01JQ19CRUdJTl9DUFQoVFlQRV9JRCxPUF9JRCxUWVBFLFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTF9DUFQoT1AsR09NUF9GTEFHKSAgLyogc2VuZCBhc3NpZ25tZW50ICovICAgICAgIFwKKyAgICBPUF9DUklUSUNBTF9DUFQoT1AjIz0sTENLX0lEKSAgICAgICAgICAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgXAorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gV29ya2Fyb3VuZCBmb3IgY21wbHg0LiBSZWd1bGFyIHJvdXRpbmVzIHdpdGggcmV0dXJuIHZhbHVlIGRvbid0IHdvcmsKKy8vIG9uIFdpbl8zMmUuIExldCdzIHJldHVybiBjYXB0dXJlZCB2YWx1ZXMgdGhyb3VnaCB0aGUgYWRkaXRpb25hbCBwYXJhbWV0ZXIuCisjZGVmaW5lIE9QX0NSSVRJQ0FMX0NQVF9XUksoT1AsTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYoIGZsYWcgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCpsaHMpIE9QIHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKm91dCkgPSAoKmxocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCpvdXQpID0gKCpsaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKmxocykgT1AgcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOyAgICAgICAgICAgICBcCisgICAgcmV0dXJuOworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyNkZWZpbmUgT1BfR09NUF9DUklUSUNBTF9DUFRfV1JLKE9QLEZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggKEZMQUcpICYmIChfX2ttcF9hdG9taWNfbW9kZSA9PSAyKSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ1JJVElDQUxfQ1BUX1dSSyggT1AjIz0sIDAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyNlbHNlCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfQ1BUX1dSSyhPUCxGTEFHKQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgQVRPTUlDX0JFR0lOX1dSSyhUWVBFX0lELE9QX0lELFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordm9pZCBfX2ttcGNfYXRvbWljXyMjVFlQRV9JRCMjXyMjT1BfSUQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFRZUEUgKiBsaHMsIFRZUEUgcmhzLCBUWVBFICogb3V0LCBpbnQgZmxhZyApIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS0FfVFJBQ0UoMTAwLCgiX19rbXBjX2F0b21pY18iICNUWVBFX0lEICJfIiAjT1BfSUQgIjogVCMlZFxuIiwgZ3RpZCApKTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIEFUT01JQ19DUklUSUNBTF9DUFRfV1JLKFRZUEVfSUQsT1BfSUQsVFlQRSxPUCxMQ0tfSUQsR09NUF9GTEFHKSAgIFwKK0FUT01JQ19CRUdJTl9XUksoVFlQRV9JRCxPUF9JRCxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUxfQ1BUX1dSSyhPUCxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ1JJVElDQUxfQ1BUX1dSSyhPUCMjPSxMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKy8vIFRoZSBlbmQgb2Ygd29ya2Fyb3VuZCBmb3IgY21wbHg0CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8vIHJvdXRpbmVzIGZvciBsb25nIGRvdWJsZSB0eXBlCitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBmbG9hdDEwLCBhZGRfY3B0LCBsb25nIGRvdWJsZSwgICAgICssIDEwciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVCggZmxvYXQxMCwgc3ViX2NwdCwgbG9uZyBkb3VibGUsICAgICAtLCAxMHIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFQoIGZsb2F0MTAsIG11bF9jcHQsIGxvbmcgZG91YmxlLCAgICAgKiwgMTByLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9tdWxfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBmbG9hdDEwLCBkaXZfY3B0LCBsb25nIGRvdWJsZSwgICAgIC8sIDEwciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X2NwdAorI2lmIEtNUF9IQVZFX1FVQUQKKy8vIHJvdXRpbmVzIGZvciBfUXVhZCB0eXBlCitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBmbG9hdDE2LCBhZGRfY3B0LCBRVUFEX0xFR0FDWSwgICAgICssIDE2ciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYWRkX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVCggZmxvYXQxNiwgc3ViX2NwdCwgUVVBRF9MRUdBQ1ksICAgICAtLCAxNnIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFQoIGZsb2F0MTYsIG11bF9jcHQsIFFVQURfTEVHQUNZLCAgICAgKiwgMTZyLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9tdWxfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBmbG9hdDE2LCBkaXZfY3B0LCBRVUFEX0xFR0FDWSwgICAgIC8sIDE2ciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2NwdAorI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICBBVE9NSUNfQ1JJVElDQUxfQ1BUKCBmbG9hdDE2LCBhZGRfYTE2X2NwdCwgUXVhZF9hMTZfdCwgKywgMTZyLCAgMSApICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9hZGRfYTE2X2NwdAorICAgIEFUT01JQ19DUklUSUNBTF9DUFQoIGZsb2F0MTYsIHN1Yl9hMTZfY3B0LCBRdWFkX2ExNl90LCAtLCAxNnIsICAxICkgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9hMTZfY3B0CisgICAgQVRPTUlDX0NSSVRJQ0FMX0NQVCggZmxvYXQxNiwgbXVsX2ExNl9jcHQsIFF1YWRfYTE2X3QsICosIDE2ciwgIDEgKSAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbXVsX2ExNl9jcHQKKyAgICBBVE9NSUNfQ1JJVElDQUxfQ1BUKCBmbG9hdDE2LCBkaXZfYTE2X2NwdCwgUXVhZF9hMTZfdCwgLywgMTZyLCAgMSApICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfYTE2X2NwdAorI2VuZGlmCisjZW5kaWYKKworLy8gcm91dGluZXMgZm9yIGNvbXBsZXggdHlwZXMKKworLy8gY21wbHg0IHJvdXRpbmVzIHRvIHJldHVybiB2b2lkCitBVE9NSUNfQ1JJVElDQUxfQ1BUX1dSSyggY21wbHg0LCAgYWRkX2NwdCwga21wX2NtcGx4MzIsICssIDhjLCAgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9hZGRfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUX1dSSyggY21wbHg0LCAgc3ViX2NwdCwga21wX2NtcGx4MzIsIC0sIDhjLCAgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWJfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUX1dSSyggY21wbHg0LCAgbXVsX2NwdCwga21wX2NtcGx4MzIsICosIDhjLCAgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9tdWxfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUX1dSSyggY21wbHg0LCAgZGl2X2NwdCwga21wX2NtcGx4MzIsIC8sIDhjLCAgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXZfY3B0CisKK0FUT01JQ19DUklUSUNBTF9DUFQoIGNtcGx4OCwgIGFkZF9jcHQsIGttcF9jbXBseDY0LCArLCAxNmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDhfYWRkX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVCggY21wbHg4LCAgc3ViX2NwdCwga21wX2NtcGx4NjQsIC0sIDE2YywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4OF9zdWJfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBjbXBseDgsICBtdWxfY3B0LCBrbXBfY21wbHg2NCwgKiwgMTZjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg4X211bF9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFQoIGNtcGx4OCwgIGRpdl9jcHQsIGttcF9jbXBseDY0LCAvLCAxNmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDhfZGl2X2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVCggY21wbHgxMCwgYWRkX2NwdCwga21wX2NtcGx4ODAsICssIDIwYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTBfYWRkX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVCggY21wbHgxMCwgc3ViX2NwdCwga21wX2NtcGx4ODAsIC0sIDIwYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3ViX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVCggY21wbHgxMCwgbXVsX2NwdCwga21wX2NtcGx4ODAsICosIDIwYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTBfbXVsX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVCggY21wbHgxMCwgZGl2X2NwdCwga21wX2NtcGx4ODAsIC8sIDIwYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTBfZGl2X2NwdAorI2lmIEtNUF9IQVZFX1FVQUQKK0FUT01JQ19DUklUSUNBTF9DUFQoIGNtcGx4MTYsIGFkZF9jcHQsIENQTFgxMjhfTEVHLCArLCAzMmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X2FkZF9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFQoIGNtcGx4MTYsIHN1Yl9jcHQsIENQTFgxMjhfTEVHLCAtLCAzMmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFQoIGNtcGx4MTYsIG11bF9jcHQsIENQTFgxMjhfTEVHLCAqLCAzMmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X211bF9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFQoIGNtcGx4MTYsIGRpdl9jcHQsIENQTFgxMjhfTEVHLCAvLCAzMmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9jcHQKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgQVRPTUlDX0NSSVRJQ0FMX0NQVCggY21wbHgxNiwgYWRkX2ExNl9jcHQsIGttcF9jbXBseDEyOF9hMTZfdCwgKywgMzJjLCAgIDEgKSAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9hZGRfYTE2X2NwdAorICAgIEFUT01JQ19DUklUSUNBTF9DUFQoIGNtcGx4MTYsIHN1Yl9hMTZfY3B0LCBrbXBfY21wbHgxMjhfYTE2X3QsIC0sIDMyYywgICAxICkgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2ExNl9jcHQKKyAgICBBVE9NSUNfQ1JJVElDQUxfQ1BUKCBjbXBseDE2LCBtdWxfYTE2X2NwdCwga21wX2NtcGx4MTI4X2ExNl90LCAqLCAzMmMsICAgMSApICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X211bF9hMTZfY3B0CisgICAgQVRPTUlDX0NSSVRJQ0FMX0NQVCggY21wbHgxNiwgZGl2X2ExNl9jcHQsIGttcF9jbXBseDEyOF9hMTZfdCwgLywgMzJjLCAgIDEgKSAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfYTE2X2NwdAorI2VuZGlmCisjZW5kaWYKKworI2lmIE9NUF80MF9FTkFCTEVECisKKy8vIE9wZW5NUCA0LjA6IHYgPSB4ID0gZXhwciBiaW5vcCB4OyB7IHYgPSB4OyB4ID0gZXhwciBiaW5vcCB4OyB9IHsgeCA9IGV4cHIgYmlub3AgeDsgdiA9IHg7IH0gIGZvciBub24tY29tbXV0YXRpdmUgb3BlcmF0aW9ucy4KKy8vIFN1cHBvcnRlZCBvbmx5IG9uIElBLTMyIGFyY2hpdGVjdHVyZSBhbmQgSW50ZWwoUikgNjQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT3BlcmF0aW9uIG9uICpsaHMsIHJocyBib3VuZCBieSBjcml0aWNhbCBzZWN0aW9uCisvLyAgICAgT1AgICAgIC0gb3BlcmF0b3IgKGl0J3Mgc3VwcG9zZWQgdG8gY29udGFpbiBhbiBhc3NpZ25tZW50KQorLy8gICAgIExDS19JRCAtIGxvY2sgaWRlbnRpZmllcgorLy8gTm90ZTogZG9uJ3QgY2hlY2sgZ3RpZCBhcyBpdCBzaG91bGQgYWx3YXlzIGJlIHZhbGlkCisvLyAxLCAyLWJ5dGUgLSBleHBlY3QgdmFsaWQgcGFyYW1ldGVyLCBvdGhlciAtIGNoZWNrIGJlZm9yZSB0aGlzIG1hY3JvCisjZGVmaW5lIE9QX0NSSVRJQ0FMX0NQVF9SRVYoT1AsTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYoIGZsYWcgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgLyp0ZW1wX3ZhbCA9ICgqbGhzKTsqL1wKKyAgICAgICAgKCpsaHMpID0gKHJocykgT1AgKCpsaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuZXdfdmFsdWUgPSAoKmxocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbmV3X3ZhbHVlID0gKCpsaHMpO1wKKyAgICAgICAgKCpsaHMpID0gKHJocykgT1AgKCpsaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gbmV3X3ZhbHVlOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyNkZWZpbmUgT1BfR09NUF9DUklUSUNBTF9DUFRfUkVWKE9QLEZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggKEZMQUcpICYmIChfX2ttcF9hdG9taWNfbW9kZSA9PSAyKSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ1JJVElDQUxfQ1BUX1JFViggT1AsIDAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyNlbHNlCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfQ1BUX1JFVihPUCxGTEFHKQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9wZXJhdGlvbiBvbiAqbGhzLCByaHMgdXNpbmcgImNvbXBhcmVfYW5kX3N0b3JlIiByb3V0aW5lCisvLyAgICAgVFlQRSAgICAtIG9wZXJhbmRzJyB0eXBlCisvLyAgICAgQklUUyAgICAtIHNpemUgaW4gYml0cywgdXNlZCB0byBkaXN0aW5ndWlzaCBsb3cgbGV2ZWwgY2FsbHMKKy8vICAgICBPUCAgICAgIC0gb3BlcmF0b3IKKy8vIE5vdGU6IHRlbXBfdmFsIGludHJvZHVjZWQgaW4gb3JkZXIgdG8gZm9yY2UgdGhlIGNvbXBpbGVyIHRvIHJlYWQKKy8vICAgICAgICpsaHMgb25seSBvbmNlICh3L28gaXQgdGhlIGNvbXBpbGVyIHJlYWRzICpsaHMgdHdpY2UpCisjZGVmaW5lIE9QX0NNUFhDSEdfQ1BUX1JFVihUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUWVBFIEtNUF9BVE9NSUNfVk9MQVRJTEUgdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRZUEUgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcF92YWwgPSAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBvbGRfdmFsdWUgPSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5ld192YWx1ZSA9IHJocyBPUCBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd2hpbGUgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EjI0JJVFMoIChrbXBfaW50IyNCSVRTICopIGxocywgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgJm9sZF92YWx1ZSwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmbmV3X3ZhbHVlICkgKSAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX0NQVV9QQVVTRSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHRlbXBfdmFsID0gKmxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgb2xkX3ZhbHVlID0gdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBuZXdfdmFsdWUgPSByaHMgT1Agb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiggZmxhZyApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByZXR1cm4gbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFUT01JQ19DTVBYQ0hHX0NQVF9SRVYoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsR09NUF9GTEFHKSAgICAgICBcCitBVE9NSUNfQkVHSU5fQ1BUKFRZUEVfSUQsT1BfSUQsVFlQRSxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRZUEUgS01QX0FUT01JQ19WT0xBVElMRSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMX0NQVF9SRVYoT1AsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DTVBYQ0hHX0NQVF9SRVYoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDEsICBkaXZfY3B0X3Jldiwga21wX2ludDgsICAgIDgsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkMXUsIGRpdl9jcHRfcmV2LCBrbXBfdWludDgsICAgOCwgLywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkMSwgIHNobF9jcHRfcmV2LCBrbXBfaW50OCwgICAgOCwgPDwsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaGxfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQxLCAgc2hyX2NwdF9yZXYsIGttcF9pbnQ4LCAgICA4LCA+PiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3Nocl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDF1LCBzaHJfY3B0X3Jldiwga21wX3VpbnQ4LCAgIDgsID4+LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDF1X3Nocl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDEsICBzdWJfY3B0X3Jldiwga21wX2ludDgsICAgIDgsIC0sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfc3ViX2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkMiwgIGRpdl9jcHRfcmV2LCBrbXBfaW50MTYsICAxNiwgLywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQydSwgZGl2X2NwdF9yZXYsIGttcF91aW50MTYsIDE2LCAvLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQydV9kaXZfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQyLCAgc2hsX2NwdF9yZXYsIGttcF9pbnQxNiwgIDE2LCA8PCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3NobF9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDIsICBzaHJfY3B0X3Jldiwga21wX2ludDE2LCAgMTYsID4+LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfc2hyX2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkMnUsIHNocl9jcHRfcmV2LCBrbXBfdWludDE2LCAxNiwgPj4sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfc2hyX2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkMiwgIHN1Yl9jcHRfcmV2LCBrbXBfaW50MTYsICAxNiwgLSwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWJfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQ0LCAgZGl2X2NwdF9yZXYsIGttcF9pbnQzMiwgIDMyLCAvLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDR1LCBkaXZfY3B0X3Jldiwga21wX3VpbnQzMiwgMzIsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDR1X2Rpdl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDQsICBzaGxfY3B0X3Jldiwga21wX2ludDMyLCAgMzIsIDw8LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfc2hsX2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkNCwgIHNocl9jcHRfcmV2LCBrbXBfaW50MzIsICAzMiwgPj4sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHJfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQ0dSwgc2hyX2NwdF9yZXYsIGttcF91aW50MzIsIDMyLCA+PiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHJfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQ0LCAgc3ViX2NwdF9yZXYsIGttcF9pbnQzMiwgIDMyLCAtLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDgsICBkaXZfY3B0X3Jldiwga21wX2ludDY0LCAgNjQsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkOHUsIGRpdl9jcHRfcmV2LCBrbXBfdWludDY0LCA2NCwgLywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2X2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkOCwgIHNobF9jcHRfcmV2LCBrbXBfaW50NjQsICA2NCwgPDwsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaGxfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQ4LCAgc2hyX2NwdF9yZXYsIGttcF9pbnQ2NCwgIDY0LCA+PiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3Nocl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDh1LCBzaHJfY3B0X3Jldiwga21wX3VpbnQ2NCwgNjQsID4+LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDh1X3Nocl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDgsICBzdWJfY3B0X3Jldiwga21wX2ludDY0LCAgNjQsIC0sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfc3ViX2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZsb2F0NCwgIGRpdl9jcHRfcmV2LCBrbXBfcmVhbDMyLCAzMiwgLywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZmxvYXQ0LCAgc3ViX2NwdF9yZXYsIGttcF9yZWFsMzIsIDMyLCAtLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmbG9hdDgsICBkaXZfY3B0X3Jldiwga21wX3JlYWw2NCwgNjQsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfZGl2X2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZsb2F0OCwgIHN1Yl9jcHRfcmV2LCBrbXBfcmVhbDY0LCA2NCwgLSwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWJfY3B0X3JldgorLy8gICAgICAgICAgICAgIFRZUEVfSUQsT1BfSUQsIFRZUEUsICAgICAgICAgIE9QLCAgR09NUF9GTEFHCisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSb3V0aW5lcyBmb3IgRXh0ZW5kZWQgdHlwZXM6IGxvbmcgZG91YmxlLCBfUXVhZCwgY29tcGxleCBmbGF2b3VycyAodXNlIGNyaXRpY2FsIHNlY3Rpb24pCisvLyAgICAgVFlQRV9JRCwgT1BfSUQsIFRZUEUgLSBkZXRhaWxlZCBhYm92ZQorLy8gICAgIE9QICAgICAgLSBvcGVyYXRvcgorLy8gICAgIExDS19JRCAgLSBsb2NrIGlkZW50aWZpZXIsIHVzZWQgdG8gcG9zc2libHkgZGlzdGluZ3Vpc2ggbG9jayB2YXJpYWJsZQorI2RlZmluZSBBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFVihUWVBFX0lELE9QX0lELFRZUEUsT1AsTENLX0lELEdPTVBfRkxBRykgXAorQVRPTUlDX0JFR0lOX0NQVChUWVBFX0lELE9QX0lELFRZUEUsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUWVBFIEtNUF9BVE9NSUNfVk9MQVRJTEUgdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLypwcmludGYoIl9fa21wX2F0b21pY19tb2RlID0gJWRcbiIsIF9fa21wX2F0b21pY19tb2RlKTsqL1wKKyAgICBPUF9HT01QX0NSSVRJQ0FMX0NQVF9SRVYoT1AsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DUklUSUNBTF9DUFRfUkVWKE9QLExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvLyByb3V0aW5lcyBmb3IgbG9uZyBkb3VibGUgdHlwZQorQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVYoIGZsb2F0MTAsIHN1Yl9jcHRfcmV2LCBsb25nIGRvdWJsZSwgICAgIC0sIDEwciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViX2NwdF9yZXYKK0FUT01JQ19DUklUSUNBTF9DUFRfUkVWKCBmbG9hdDEwLCBkaXZfY3B0X3JldiwgbG9uZyBkb3VibGUsICAgICAvLCAxMHIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX2Rpdl9jcHRfcmV2CisjaWYgS01QX0hBVkVfUVVBRAorLy8gcm91dGluZXMgZm9yIF9RdWFkIHR5cGUKK0FUT01JQ19DUklUSUNBTF9DUFRfUkVWKCBmbG9hdDE2LCBzdWJfY3B0X3JldiwgUVVBRF9MRUdBQ1ksICAgICAtLCAxNnIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9jcHRfcmV2CitBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFViggZmxvYXQxNiwgZGl2X2NwdF9yZXYsIFFVQURfTEVHQUNZLCAgICAgLywgMTZyLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfY3B0X3JldgorI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICBBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFViggZmxvYXQxNiwgc3ViX2ExNl9jcHRfcmV2LCBRdWFkX2ExNl90LCAtLCAxNnIsICAxICkgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9hMTZfY3B0X3JldgorICAgIEFUT01JQ19DUklUSUNBTF9DUFRfUkVWKCBmbG9hdDE2LCBkaXZfYTE2X2NwdF9yZXYsIFF1YWRfYTE2X3QsIC8sIDE2ciwgIDEgKSAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2ExNl9jcHRfcmV2CisjZW5kaWYKKyNlbmRpZgorCisvLyByb3V0aW5lcyBmb3IgY29tcGxleCB0eXBlcworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gV29ya2Fyb3VuZCBmb3IgY21wbHg0LiBSZWd1bGFyIHJvdXRpbmVzIHdpdGggcmV0dXJuIHZhbHVlIGRvbid0IHdvcmsKKy8vIG9uIFdpbl8zMmUuIExldCdzIHJldHVybiBjYXB0dXJlZCB2YWx1ZXMgdGhyb3VnaCB0aGUgYWRkaXRpb25hbCBwYXJhbWV0ZXIuCisjZGVmaW5lIE9QX0NSSVRJQ0FMX0NQVF9SRVZfV1JLKE9QLExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYoIGZsYWcgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCpsaHMpID0gKHJocykgT1AgKCpsaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKm91dCkgPSAoKmxocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCpvdXQpID0gKCpsaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKmxocykgPSAocmhzKSBPUCAoKmxocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOyAgICAgICAgICAgICBcCisgICAgcmV0dXJuOworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyNkZWZpbmUgT1BfR09NUF9DUklUSUNBTF9DUFRfUkVWX1dSSyhPUCxGTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggKEZMQUcpICYmIChfX2ttcF9hdG9taWNfbW9kZSA9PSAyKSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ1JJVElDQUxfQ1BUX1JFVl9XUksoIE9QLCAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyNlbHNlCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfQ1BUX1JFVl9XUksoT1AsRkxBRykKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIEFUT01JQ19DUklUSUNBTF9DUFRfUkVWX1dSSyhUWVBFX0lELE9QX0lELFRZUEUsT1AsTENLX0lELEdPTVBfRkxBRykgICBcCitBVE9NSUNfQkVHSU5fV1JLKFRZUEVfSUQsT1BfSUQsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTF9DUFRfUkVWX1dSSyhPUCxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ1JJVElDQUxfQ1BUX1JFVl9XUksoT1AsTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisvLyBUaGUgZW5kIG9mIHdvcmthcm91bmQgZm9yIGNtcGx4NAorCisKKy8vICEhISBUT0RPOiBjaGVjayBpZiB3ZSBuZWVkIHRvIHJldHVybiB2b2lkIGZvciBjbXBseDQgcm91dGluZXMKKy8vIGNtcGx4NCByb3V0aW5lcyB0byByZXR1cm4gdm9pZAorQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVZfV1JLKCBjbXBseDQsICBzdWJfY3B0X3Jldiwga21wX2NtcGx4MzIsIC0sIDhjLCAgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWJfY3B0X3JldgorQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVZfV1JLKCBjbXBseDQsICBkaXZfY3B0X3Jldiwga21wX2NtcGx4MzIsIC8sIDhjLCAgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXZfY3B0X3JldgorCitBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFViggY21wbHg4LCAgc3ViX2NwdF9yZXYsIGttcF9jbXBseDY0LCAtLCAxNmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDhfc3ViX2NwdF9yZXYKK0FUT01JQ19DUklUSUNBTF9DUFRfUkVWKCBjbXBseDgsICBkaXZfY3B0X3Jldiwga21wX2NtcGx4NjQsIC8sIDE2YywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4OF9kaXZfY3B0X3JldgorQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVYoIGNtcGx4MTAsIHN1Yl9jcHRfcmV2LCBrbXBfY21wbHg4MCwgLSwgMjBjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxMF9zdWJfY3B0X3JldgorQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVYoIGNtcGx4MTAsIGRpdl9jcHRfcmV2LCBrbXBfY21wbHg4MCwgLywgMjBjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxMF9kaXZfY3B0X3JldgorI2lmIEtNUF9IQVZFX1FVQUQKK0FUT01JQ19DUklUSUNBTF9DUFRfUkVWKCBjbXBseDE2LCBzdWJfY3B0X3JldiwgQ1BMWDEyOF9MRUcsIC0sIDMyYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2NwdF9yZXYKK0FUT01JQ19DUklUSUNBTF9DUFRfUkVWKCBjbXBseDE2LCBkaXZfY3B0X3JldiwgQ1BMWDEyOF9MRUcsIC8sIDMyYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2X2NwdF9yZXYKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVYoIGNtcGx4MTYsIHN1Yl9hMTZfY3B0X3Jldiwga21wX2NtcGx4MTI4X2ExNl90LCAtLCAzMmMsICAgMSApICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9hMTZfY3B0X3JldgorICAgIEFUT01JQ19DUklUSUNBTF9DUFRfUkVWKCBjbXBseDE2LCBkaXZfYTE2X2NwdF9yZXYsIGttcF9jbXBseDEyOF9hMTZfdCwgLywgMzJjLCAgIDEgKSAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfYTE2X2NwdF9yZXYKKyNlbmRpZgorI2VuZGlmCisKKy8vICAgT3Blbk1QIDQuMCBDYXB0dXJlLXdyaXRlIChzd2FwKToge3YgPSB4OyB4ID0gZXhwcjt9CisKKyNkZWZpbmUgQVRPTUlDX0JFR0lOX1NXUChUWVBFX0lELFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK1RZUEUgX19rbXBjX2F0b21pY18jI1RZUEVfSUQjI19zd3AoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFRZUEUgKiBsaHMsIFRZUEUgcmhzICkgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLQV9UUkFDRSgxMDAsKCJfX2ttcGNfYXRvbWljXyIgI1RZUEVfSUQgIl9zd3A6IFQjJWRcbiIsIGd0aWQgKSk7CisKKyNkZWZpbmUgQ1JJVElDQUxfU1dQKExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBvbGRfdmFsdWUgPSAoKmxocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgqbGhzKSA9IHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgXAorICAgIHJldHVybiBvbGRfdmFsdWU7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorI2RlZmluZSBHT01QX0NSSVRJQ0FMX1NXUChGTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAoRkxBRykgJiYgKF9fa21wX2F0b21pY19tb2RlID09IDIpICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBDUklUSUNBTF9TV1AoIDAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2Vsc2UKKyNkZWZpbmUgR09NUF9DUklUSUNBTF9TV1AoRkxBRykKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKworCisjZGVmaW5lIEFUT01JQ19YQ0hHX1NXUChUWVBFX0lELFRZUEUsQklUUyxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgIFwKK0FUT01JQ19CRUdJTl9TV1AoVFlQRV9JRCxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR09NUF9DUklUSUNBTF9TV1AoR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBvbGRfdmFsdWUgPSBLTVBfWENIR19GSVhFRCMjQklUUyggbGhzLCByaHMgKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX1hDSEdfRkxPQVRfU1dQKFRZUEVfSUQsVFlQRSxCSVRTLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgXAorQVRPTUlDX0JFR0lOX1NXUChUWVBFX0lELFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHT01QX0NSSVRJQ0FMX1NXUChHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG9sZF92YWx1ZSA9IEtNUF9YQ0hHX1JFQUwjI0JJVFMoIGxocywgcmhzICk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIENNUFhDSEdfU1dQKFRZUEUsQklUUykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUWVBFIEtNUF9BVE9NSUNfVk9MQVRJTEUgdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRZUEUgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcF92YWwgPSAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBvbGRfdmFsdWUgPSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5ld192YWx1ZSA9IHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd2hpbGUgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EjI0JJVFMoIChrbXBfaW50IyNCSVRTICopIGxocywgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgJm9sZF92YWx1ZSwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmbmV3X3ZhbHVlICkgKSAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX0NQVV9QQVVTRSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHRlbXBfdmFsID0gKmxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgb2xkX3ZhbHVlID0gdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBuZXdfdmFsdWUgPSByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFUT01JQ19DTVBYQ0hHX1NXUChUWVBFX0lELFRZUEUsQklUUyxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgIFwKK0FUT01JQ19CRUdJTl9TV1AoVFlQRV9JRCxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR09NUF9DUklUSUNBTF9TV1AoR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDTVBYQ0hHX1NXUChUWVBFLEJJVFMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitBVE9NSUNfWENIR19TV1AoIGZpeGVkMSwga21wX2ludDgsICAgIDgsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zd3AKK0FUT01JQ19YQ0hHX1NXUCggZml4ZWQyLCBrbXBfaW50MTYsICAxNiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3N3cAorQVRPTUlDX1hDSEdfU1dQKCBmaXhlZDQsIGttcF9pbnQzMiwgIDMyLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfc3dwCisKK0FUT01JQ19YQ0hHX0ZMT0FUX1NXUCggZmxvYXQ0LCBrbXBfcmVhbDMyLCAzMiwgS01QX0FSQ0hfWDg2ICkgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zd3AKKworI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICBBVE9NSUNfQ01QWENIR19TV1AoIGZpeGVkOCwga21wX2ludDY0LCA2NCwgS01QX0FSQ0hfWDg2ICkgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zd3AKKyAgICBBVE9NSUNfQ01QWENIR19TV1AoIGZsb2F0OCwga21wX3JlYWw2NCwgNjQsIEtNUF9BUkNIX1g4NiApICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zd3AKKyNlbHNlCisgICAgQVRPTUlDX1hDSEdfU1dQKCAgICAgICBmaXhlZDgsIGttcF9pbnQ2NCwgNjQsIEtNUF9BUkNIX1g4NiApICAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfc3dwCisgICAgQVRPTUlDX1hDSEdfRkxPQVRfU1dQKCBmbG9hdDgsIGttcF9yZWFsNjQsIDY0LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfc3dwCisjZW5kaWYKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSb3V0aW5lcyBmb3IgRXh0ZW5kZWQgdHlwZXM6IGxvbmcgZG91YmxlLCBfUXVhZCwgY29tcGxleCBmbGF2b3VycyAodXNlIGNyaXRpY2FsIHNlY3Rpb24pCisjZGVmaW5lIEFUT01JQ19DUklUSUNBTF9TV1AoVFlQRV9JRCxUWVBFLExDS19JRCxHT01QX0ZMQUcpICAgICAgICAgICAgICBcCitBVE9NSUNfQkVHSU5fU1dQKFRZUEVfSUQsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR09NUF9DUklUSUNBTF9TV1AoR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ1JJVElDQUxfU1dQKExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAhISEgVE9ETzogY2hlY2sgaWYgd2UgbmVlZCB0byByZXR1cm4gdm9pZCBmb3IgY21wbHg0IHJvdXRpbmVzCisvLyBXb3JrYXJvdW5kIGZvciBjbXBseDQuIFJlZ3VsYXIgcm91dGluZXMgd2l0aCByZXR1cm4gdmFsdWUgZG9uJ3Qgd29yaworLy8gb24gV2luXzMyZS4gTGV0J3MgcmV0dXJuIGNhcHR1cmVkIHZhbHVlcyB0aHJvdWdoIHRoZSBhZGRpdGlvbmFsIHBhcmFtZXRlci4KKworI2RlZmluZSBBVE9NSUNfQkVHSU5fU1dQX1dSSyhUWVBFX0lELFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordm9pZCBfX2ttcGNfYXRvbWljXyMjVFlQRV9JRCMjX3N3cCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgVFlQRSAqIGxocywgVFlQRSByaHMsIFRZUEUgKiBvdXQgKSAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtBX1RSQUNFKDEwMCwoIl9fa21wY19hdG9taWNfIiAjVFlQRV9JRCAiX3N3cDogVCMlZFxuIiwgZ3RpZCApKTsKKworCisjZGVmaW5lIENSSVRJQ0FMX1NXUF9XUksoTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdG1wID0gKCpsaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKmxocykgPSAocmhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgqb3V0KSA9IHRtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgIFwKKyAgICByZXR1cm47CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisjZGVmaW5lIEdPTVBfQ1JJVElDQUxfU1dQX1dSSyhGTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIChGTEFHKSAmJiAoX19rbXBfYXRvbWljX21vZGUgPT0gMikgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENSSVRJQ0FMX1NXUF9XUksoIDAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZWxzZQorI2RlZmluZSBHT01QX0NSSVRJQ0FMX1NXUF9XUksoRkxBRykKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIEFUT01JQ19DUklUSUNBTF9TV1BfV1JLKFRZUEVfSUQsIFRZUEUsTENLX0lELEdPTVBfRkxBRykgICAgICAgICAgIFwKK0FUT01JQ19CRUdJTl9TV1BfV1JLKFRZUEVfSUQsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgdG1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR09NUF9DUklUSUNBTF9TV1BfV1JLKEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDUklUSUNBTF9TV1BfV1JLKExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorLy8gVGhlIGVuZCBvZiB3b3JrYXJvdW5kIGZvciBjbXBseDQKKworCitBVE9NSUNfQ1JJVElDQUxfU1dQKCBmbG9hdDEwLCBsb25nIGRvdWJsZSwgMTByLCAgIDEgKSAgICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX3N3cAorI2lmIEtNUF9IQVZFX1FVQUQKK0FUT01JQ19DUklUSUNBTF9TV1AoIGZsb2F0MTYsIFFVQURfTEVHQUNZLCAxNnIsICAgMSApICAgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3dwCisjZW5kaWYKKy8vIGNtcGx4NCByb3V0aW5lIHRvIHJldHVybiB2b2lkCitBVE9NSUNfQ1JJVElDQUxfU1dQX1dSSyggY21wbHg0LCBrbXBfY21wbHgzMiwgIDhjLCAgIDEgKSAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfc3dwCisKKy8vQVRPTUlDX0NSSVRJQ0FMX1NXUCggY21wbHg0LCBrbXBfY21wbHgzMiwgIDhjLCAgIDEgKSAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfc3dwCisKKworQVRPTUlDX0NSSVRJQ0FMX1NXUCggY21wbHg4LCAga21wX2NtcGx4NjQsIDE2YywgICAxICkgICAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg4X3N3cAorQVRPTUlDX0NSSVRJQ0FMX1NXUCggY21wbHgxMCwga21wX2NtcGx4ODAsIDIwYywgICAxICkgICAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxMF9zd3AKKyNpZiBLTVBfSEFWRV9RVUFECitBVE9NSUNfQ1JJVElDQUxfU1dQKCBjbXBseDE2LCBDUExYMTI4X0xFRywgMzJjLCAgIDEgKSAgICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X3N3cAorI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICBBVE9NSUNfQ1JJVElDQUxfU1dQKCBmbG9hdDE2X2ExNiwgUXVhZF9hMTZfdCwgICAgICAgICAxNnIsIDEgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X2ExNl9zd3AKKyAgICBBVE9NSUNfQ1JJVElDQUxfU1dQKCBjbXBseDE2X2ExNiwga21wX2NtcGx4MTI4X2ExNl90LCAzMmMsIDEgKSAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X2ExNl9zd3AKKyNlbmRpZgorI2VuZGlmCisKKworLy8gRW5kIG9mIE9wZW5NUCA0LjAgQ2FwdHVyZQorCisjZW5kaWYgLy9PTVBfNDBfRU5BQkxFRAorCisjZW5kaWYgLy9LTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisKKworI3VuZGVmIE9QX0NSSVRJQ0FMCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogR2VuZXJpYyBhdG9taWMgcm91dGluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAorX19rbXBjX2F0b21pY18xKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB2b2lkKiBsaHMsIHZvaWQqIHJocywgdm9pZCAoKmYpKCB2b2lkICosIHZvaWQgKiwgdm9pZCAqICkgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisKKyAgICBpZiAoCisjaWYgS01QX0FSQ0hfWDg2ICYmIGRlZmluZWQoS01QX0dPTVBfQ09NUEFUKQorICAgICAgICBGQUxTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbXVzdCB1c2UgbG9jayAqLworI2Vsc2UKKyAgICAgICAgVFJVRQorI2VuZGlmCisJKQorICAgIHsKKwlrbXBfaW50OCBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworCW9sZF92YWx1ZSA9ICooa21wX2ludDggKikgbGhzOworCSgqZikoICZuZXdfdmFsdWUsICZvbGRfdmFsdWUsIHJocyApOworCisJLyogVE9ETzogU2hvdWxkIHRoaXMgYmUgYWNxdWlyZSBvciByZWxlYXNlPyAqLworCXdoaWxlICggISAgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTggKCAoa21wX2ludDggKikgbGhzLAorCQkgICAgCQkqKGttcF9pbnQ4ICopICZvbGRfdmFsdWUsICooa21wX2ludDggKikgJm5ld192YWx1ZSApICkKKwl7CisJICAgIEtNUF9DUFVfUEFVU0UoKTsKKworCSAgICBvbGRfdmFsdWUgPSAqKGttcF9pbnQ4ICopIGxoczsKKwkgICAgKCpmKSggJm5ld192YWx1ZSwgJm9sZF92YWx1ZSwgcmhzICk7CisJfQorCisJcmV0dXJuOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQWxsIDEtYnl0ZSBkYXRhIGlzIG9mIGludGVnZXIgZGF0YSB0eXBlLgorICAgICAgICAvLworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgICAgIGlmICggX19rbXBfYXRvbWljX21vZGUgPT0gMiApIHsKKyAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2ssIGd0aWQgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisJX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja18xaSwgZ3RpZCApOworCisJKCpmKSggbGhzLCBsaHMsIHJocyApOworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgICAgIGlmICggX19rbXBfYXRvbWljX21vZGUgPT0gMiApIHsKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2ssIGd0aWQgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisJX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja18xaSwgZ3RpZCApOworICAgIH0KK30KKwordm9pZAorX19rbXBjX2F0b21pY18yKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB2b2lkKiBsaHMsIHZvaWQqIHJocywgdm9pZCAoKmYpKCB2b2lkICosIHZvaWQgKiwgdm9pZCAqICkgKQoreworICAgIGlmICgKKyNpZiBLTVBfQVJDSF9YODYgJiYgZGVmaW5lZChLTVBfR09NUF9DT01QQVQpCisgICAgICAgIEZBTFNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtdXN0IHVzZSBsb2NrICovCisjZWxpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisJVFJVRQkJCQkJLyogbm8gYWxpZ25tZW50IHByb2JsZW1zICovCisjZWxzZQorCSEgKCAoa21wX3VpbnRwdHJfdCkgbGhzICYgMHgxKQkJLyogbWFrZSBzdXJlIGFkZHJlc3MgaXMgMi1ieXRlIGFsaWduZWQgKi8KKyNlbmRpZgorCSkKKyAgICB7CisJa21wX2ludDE2IG9sZF92YWx1ZSwgbmV3X3ZhbHVlOworCisJb2xkX3ZhbHVlID0gKihrbXBfaW50MTYgKikgbGhzOworCSgqZikoICZuZXdfdmFsdWUsICZvbGRfdmFsdWUsIHJocyApOworCisJLyogVE9ETzogU2hvdWxkIHRoaXMgYmUgYWNxdWlyZSBvciByZWxlYXNlPyAqLworCXdoaWxlICggISAgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTE2ICggKGttcF9pbnQxNiAqKSBsaHMsCisJCSAgICAJCSooa21wX2ludDE2ICopICZvbGRfdmFsdWUsICooa21wX2ludDE2ICopICZuZXdfdmFsdWUgKSApCisJeworCSAgICBLTVBfQ1BVX1BBVVNFKCk7CisKKwkgICAgb2xkX3ZhbHVlID0gKihrbXBfaW50MTYgKikgbGhzOworCSAgICAoKmYpKCAmbmV3X3ZhbHVlLCAmb2xkX3ZhbHVlLCByaHMgKTsKKwl9CisKKwlyZXR1cm47CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvLworICAgICAgICAvLyBBbGwgMi1ieXRlIGRhdGEgaXMgb2YgaW50ZWdlciBkYXRhIHR5cGUuCisgICAgICAgIC8vCisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgaWYgKCBfX2ttcF9hdG9taWNfbW9kZSA9PSAyICkgeworICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKwlfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzJpLCBndGlkICk7CisKKwkoKmYpKCBsaHMsIGxocywgcmhzICk7CisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgaWYgKCBfX2ttcF9hdG9taWNfbW9kZSA9PSAyICkgeworICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKwlfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzJpLCBndGlkICk7CisgICAgfQorfQorCit2b2lkCitfX2ttcGNfYXRvbWljXzQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHZvaWQqIGxocywgdm9pZCogcmhzLCB2b2lkICgqZikoIHZvaWQgKiwgdm9pZCAqLCB2b2lkICogKSApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKworICAgIGlmICgKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRklYTUU6IE9uIElBLTMyIGFyY2hpdGVjdHVyZSwgZ2NjIHVzZXMgY21weGNoZyBvbmx5IGZvciA0LWJ5dGUgaW50cy4KKyAgICAgICAgLy8gR29tcCBjb21wYXRpYmlsaXR5IGlzIGJyb2tlbiBpZiB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZvciBmbG9hdHMuCisgICAgICAgIC8vCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCVRSVUUJCQkJCS8qIG5vIGFsaWdubWVudCBwcm9ibGVtcyAqLworI2Vsc2UKKwkhICggKGttcF91aW50cHRyX3QpIGxocyAmIDB4MykJCS8qIG1ha2Ugc3VyZSBhZGRyZXNzIGlzIDQtYnl0ZSBhbGlnbmVkICovCisjZW5kaWYKKwkpCisgICAgeworCWttcF9pbnQzMiBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworCW9sZF92YWx1ZSA9ICooa21wX2ludDMyICopIGxoczsKKwkoKmYpKCAmbmV3X3ZhbHVlLCAmb2xkX3ZhbHVlLCByaHMgKTsKKworCS8qIFRPRE86IFNob3VsZCB0aGlzIGJlIGFjcXVpcmUgb3IgcmVsZWFzZT8gKi8KKwl3aGlsZSAoICEgIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMiAoIChrbXBfaW50MzIgKikgbGhzLAorCQkgICAgCQkqKGttcF9pbnQzMiAqKSAmb2xkX3ZhbHVlLCAqKGttcF9pbnQzMiAqKSAmbmV3X3ZhbHVlICkgKQorCXsKKwkgICAgS01QX0NQVV9QQVVTRSgpOworCisJICAgIG9sZF92YWx1ZSA9ICooa21wX2ludDMyICopIGxoczsKKwkgICAgKCpmKSggJm5ld192YWx1ZSwgJm9sZF92YWx1ZSwgcmhzICk7CisJfQorCisJcmV0dXJuOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVXNlIF9fa21wX2F0b21pY19sb2NrXzRpIGZvciBhbGwgNC1ieXRlIGRhdGEsCisgICAgICAgIC8vIGV2ZW4gaWYgaXQgaXNuJ3Qgb2YgaW50ZWdlciBkYXRhIHR5cGUuCisgICAgICAgIC8vCisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgaWYgKCBfX2ttcF9hdG9taWNfbW9kZSA9PSAyICkgeworICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKwlfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzRpLCBndGlkICk7CisKKwkoKmYpKCBsaHMsIGxocywgcmhzICk7CisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgaWYgKCBfX2ttcF9hdG9taWNfbW9kZSA9PSAyICkgeworICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKwlfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzRpLCBndGlkICk7CisgICAgfQorfQorCit2b2lkCitfX2ttcGNfYXRvbWljXzgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHZvaWQqIGxocywgdm9pZCogcmhzLCB2b2lkICgqZikoIHZvaWQgKiwgdm9pZCAqLCB2b2lkICogKSApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKyAgICBpZiAoCisKKyNpZiBLTVBfQVJDSF9YODYgJiYgZGVmaW5lZChLTVBfR09NUF9DT01QQVQpCisgICAgICAgIEZBTFNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtdXN0IHVzZSBsb2NrICovCisjZWxpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisJVFJVRQkJCQkJLyogbm8gYWxpZ25tZW50IHByb2JsZW1zICovCisjZWxzZQorCSEgKCAoa21wX3VpbnRwdHJfdCkgbGhzICYgMHg3KQkJLyogbWFrZSBzdXJlIGFkZHJlc3MgaXMgOC1ieXRlIGFsaWduZWQgKi8KKyNlbmRpZgorCSkKKyAgICB7CisJa21wX2ludDY0IG9sZF92YWx1ZSwgbmV3X3ZhbHVlOworCisJb2xkX3ZhbHVlID0gKihrbXBfaW50NjQgKikgbGhzOworCSgqZikoICZuZXdfdmFsdWUsICZvbGRfdmFsdWUsIHJocyApOworCS8qIFRPRE86IFNob3VsZCB0aGlzIGJlIGFjcXVpcmUgb3IgcmVsZWFzZT8gKi8KKwl3aGlsZSAoICEgIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1E2NCAoIChrbXBfaW50NjQgKikgbGhzLAorCQkJCQkgICAgICAgKihrbXBfaW50NjQgKikgJm9sZF92YWx1ZSwKKwkJCQkJICAgICAgICooa21wX2ludDY0ICopICZuZXdfdmFsdWUgKSApCisJeworCSAgICBLTVBfQ1BVX1BBVVNFKCk7CisKKwkgICAgb2xkX3ZhbHVlID0gKihrbXBfaW50NjQgKikgbGhzOworCSAgICAoKmYpKCAmbmV3X3ZhbHVlLCAmb2xkX3ZhbHVlLCByaHMgKTsKKwl9CisKKwlyZXR1cm47CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVXNlIF9fa21wX2F0b21pY19sb2NrXzhpIGZvciBhbGwgOC1ieXRlIGRhdGEsCisgICAgICAgIC8vIGV2ZW4gaWYgaXQgaXNuJ3Qgb2YgaW50ZWdlciBkYXRhIHR5cGUuCisgICAgICAgIC8vCisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgaWYgKCBfX2ttcF9hdG9taWNfbW9kZSA9PSAyICkgeworICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKwlfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzhpLCBndGlkICk7CisKKwkoKmYpKCBsaHMsIGxocywgcmhzICk7CisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgaWYgKCBfX2ttcF9hdG9taWNfbW9kZSA9PSAyICkgeworICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKwlfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzhpLCBndGlkICk7CisgICAgfQorfQorCit2b2lkCitfX2ttcGNfYXRvbWljXzEwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB2b2lkKiBsaHMsIHZvaWQqIHJocywgdm9pZCAoKmYpKCB2b2lkICosIHZvaWQgKiwgdm9pZCAqICkgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICBpZiAoIF9fa21wX2F0b21pY19tb2RlID09IDIgKSB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2ssIGd0aWQgKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfMTByLCBndGlkICk7CisKKyAgICAoKmYpKCBsaHMsIGxocywgcmhzICk7CisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICBpZiAoIF9fa21wX2F0b21pY19tb2RlID09IDIgKSB7CisgICAgICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2ssIGd0aWQgKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfMTByLCBndGlkICk7Cit9CisKK3ZvaWQKK19fa21wY19hdG9taWNfMTYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHZvaWQqIGxocywgdm9pZCogcmhzLCB2b2lkICgqZikoIHZvaWQgKiwgdm9pZCAqLCB2b2lkICogKSApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgIGlmICggX19rbXBfYXRvbWljX21vZGUgPT0gMiApIHsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCApOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja18xNmMsIGd0aWQgKTsKKworICAgICgqZikoIGxocywgbGhzLCByaHMgKTsKKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgIGlmICggX19rbXBfYXRvbWljX21vZGUgPT0gMiApIHsKKyAgICAgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCApOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja18xNmMsIGd0aWQgKTsKK30KKwordm9pZAorX19rbXBjX2F0b21pY18yMCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdm9pZCogbGhzLCB2b2lkKiByaHMsIHZvaWQgKCpmKSggdm9pZCAqLCB2b2lkICosIHZvaWQgKiApICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgaWYgKCBfX2ttcF9hdG9taWNfbW9kZSA9PSAyICkgeworICAgICAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrLCBndGlkICk7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKyAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzIwYywgZ3RpZCApOworCisgICAgKCpmKSggbGhzLCBsaHMsIHJocyApOworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgaWYgKCBfX2ttcF9hdG9taWNfbW9kZSA9PSAyICkgeworICAgICAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrLCBndGlkICk7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKyAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzIwYywgZ3RpZCApOworfQorCit2b2lkCitfX2ttcGNfYXRvbWljXzMyKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB2b2lkKiBsaHMsIHZvaWQqIHJocywgdm9pZCAoKmYpKCB2b2lkICosIHZvaWQgKiwgdm9pZCAqICkgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICBpZiAoIF9fa21wX2F0b21pY19tb2RlID09IDIgKSB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2ssIGd0aWQgKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfMzJjLCBndGlkICk7CisKKyAgICAoKmYpKCBsaHMsIGxocywgcmhzICk7CisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICBpZiAoIF9fa21wX2F0b21pY19tb2RlID09IDIgKSB7CisgICAgICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2ssIGd0aWQgKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfMzJjLCBndGlkICk7Cit9CisKKy8vIEFDOiBzYW1lIHR3byByb3V0aW5lcyBhcyBHT01QX2F0b21pY19zdGFydC9lbmQsIGJ1dCB3aWxsIGJlIGNhbGxlZCBieSBvdXIgY29tcGlsZXIKKy8vICAgICBkdXBsaWNhdGVkIGluIG9yZGVyIHRvIG5vdCB1c2UgMy1wYXJ0eSBuYW1lcyBpbiBwdXJlIEludGVsIGNvZGUKKy8vIFRPRE86IGNvbnNpZGVyIGFkZGluZyBHVElEIHBhcmFtZXRlciBhZnRlciBjb25zdWx0YXRpb24gd2l0aCBFcm5lc3RvL1hpbm1pbi4KK3ZvaWQKK19fa21wY19hdG9taWNfc3RhcnQodm9pZCkKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcGNfYXRvbWljX3N0YXJ0OiBUIyVkXG4iLCBndGlkKSk7CisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jaygmX19rbXBfYXRvbWljX2xvY2ssIGd0aWQpOworfQorCisKK3ZvaWQKK19fa21wY19hdG9taWNfZW5kKHZvaWQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wY19hdG9taWNfZW5kOiBUIyVkXG4iLCBndGlkKSk7CisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jaygmX19rbXBfYXRvbWljX2xvY2ssIGd0aWQpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyohCitAfQorKi8KKworLy8gZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9hdG9taWMuaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9hdG9taWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjFkY2U5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2F0b21pYy5oCkBAIC0wLDAgKzEsMTAxMyBAQAorLyoKKyAqIGttcF9hdG9taWMuaCAtIEFUT01JQyBoZWFkZXIgZmlsZQorICogJFJldmlzaW9uOiA0MjgxMCAkCisgKiAkRGF0ZTogMjAxMy0xMS0wNyAxMjowNjozMyAtMDYwMCAoVGh1LCAwNyBOb3YgMjAxMykgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIEtNUF9BVE9NSUNfSAorI2RlZmluZSBLTVBfQVRPTUlDX0gKKworI2luY2x1ZGUgImttcF9vcy5oIgorI2luY2x1ZGUgImttcF9sb2NrLmgiCisKKy8vIEMrKyBidWlsZCBwb3J0LgorLy8gSW50ZWwgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBfQ29tcGxleCBkYXRhdHlwZSBvbiB3aW4uCisvLyBJbnRlbCBjb21waWxlciBzdXBwb3J0cyBfQ29tcGxleCBkYXRhdHlwZSBvbiBsaW4gYW5kIG1hYy4KKy8vIE9uIHRoZSBvdGhlciBzaWRlLCB0aGVyZSBpcyBhIHByb2JsZW0gb2Ygc3RhY2sgYWxpZ25tZW50IG9uIGxpbl8zMiBhbmQgbWFjXzMyCisvLyBpZiB0aGUgcmhzIGlzIGNtcGx4ODAgb3IgY21wbHgxMjggdHlwZWRlZidlZCBkYXRhdHlwZS4KKy8vIFRoZSBkZWNpc2lvbiBpczogdG8gdXNlIGNvbXBpbGVyIHN1cHBvcnRlZCBfQ29tcGxleCB0eXBlIG9uIGxpbiBhbmQgbWFjLAorLy8gICAgICAgICAgICAgICAgICB0byB1c2UgdHlwZWRlZidlZCB0eXBlcyBvbiB3aW4uCisvLyBDb25kaXRpb24gZm9yIFdJTjY0IHdhcyBtb2RpZmllZCBpbiBhbnRpY2lwYXRpb24gb2YgMTAuMSBidWlsZCBjb21waWxlci4KKworI2lmIGRlZmluZWQoIF9fY3BsdXNwbHVzICkgJiYgKCBLTVBfT1NfV0lORE9XUyApCisgICAgLy8gY3JlYXRlIHNob3J0Y3V0cyBmb3IgYzk5IGNvbXBsZXggdHlwZXMKKworICAgICNpZmRlZiBfREVCVUcKKyAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgdGhlIHByb2JsZW0gb2YgX0RlYnVnSGVhcFRhZyB1bnJlc29sdmVkIGV4dGVybmFsLgorICAgICAgICAvLyBUaGlzIHByb2JsZW0gcHJldmVudGVkIHRvIHVzZSBvdXIgc3RhdGljIGRlYnVnIGxpYnJhcnkgZm9yIEMgdGVzdHMKKyAgICAgICAgLy8gY29tcGlsZWQgd2l0aCAvTURkIG9wdGlvbiAodGhlIGxpYnJhcnkgaXRzZWxmIGJ1aWx0IHdpdGggL01UZCksCisgICAgICAgICN1bmRlZiBfREVCVUcKKyAgICAgICAgI2RlZmluZSBfREVCVUdfVEVNUE9SQVJJTFlfVU5TRVRfCisgICAgI2VuZGlmCisKKyAgICAjaW5jbHVkZSA8Y29tcGxleD4KKworICAgIHRlbXBsYXRlPCB0eXBlbmFtZSB0eXBlX2xocywgdHlwZW5hbWUgdHlwZV9yaHMgPgorICAgIHN0ZDo6Y29tcGxleDwgdHlwZV9saHMgPiBfX2ttcF9saHNfZGl2X3JocygKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmNvbXBsZXg8IHR5cGVfbGhzID4mIGxocywKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmNvbXBsZXg8IHR5cGVfcmhzID4mIHJocyApIHsKKyAgICB0eXBlX2xocyBhID0gbGhzLnJlYWwoKTsKKyAgICB0eXBlX2xocyBiID0gbGhzLmltYWcoKTsKKyAgICB0eXBlX3JocyBjID0gcmhzLnJlYWwoKTsKKyAgICB0eXBlX3JocyBkID0gcmhzLmltYWcoKTsKKyAgICB0eXBlX3JocyBkZW4gPSBjKmMgKyBkKmQ7CisgICAgdHlwZV9yaHMgciA9ICggYSpjICsgYipkICk7CisgICAgdHlwZV9yaHMgaSA9ICggYipjIC0gYSpkICk7CisgICAgc3RkOjpjb21wbGV4PCB0eXBlX2xocyA+IHJldCggci9kZW4sIGkvZGVuICk7CisgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvLyBjb21wbGV4OAorICAgIHN0cnVjdCBfX2ttcF9jbXBseDY0X3QgOiBzdGQ6OmNvbXBsZXg8IGRvdWJsZSA+IHsKKworICAgIF9fa21wX2NtcGx4NjRfdCgpIDogc3RkOjpjb21wbGV4PCBkb3VibGUgPiAoKSB7fQorCisgICAgX19rbXBfY21wbHg2NF90KCBjb25zdCBzdGQ6OmNvbXBsZXg8IGRvdWJsZSA+JiBjZCApCisgICAgICAgICAgICAgICAgOiBzdGQ6OmNvbXBsZXg8IGRvdWJsZSA+ICggY2QgKSB7fQorCisgICAgdm9pZCBvcGVyYXRvciAvPSAoIGNvbnN0IF9fa21wX2NtcGx4NjRfdCYgcmhzICkgeworICAgICAgICBzdGQ6OmNvbXBsZXg8IGRvdWJsZSA+IGxocyA9ICp0aGlzOworICAgICAgICAqdGhpcyA9IF9fa21wX2xoc19kaXZfcmhzKCBsaHMsIHJocyApOworICAgIH0KKworICAgIF9fa21wX2NtcGx4NjRfdCBvcGVyYXRvciAvICggY29uc3QgX19rbXBfY21wbHg2NF90JiByaHMgKSB7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgZG91YmxlID4gbGhzID0gKnRoaXM7CisgICAgICAgIHJldHVybiBfX2ttcF9saHNfZGl2X3JocyggbGhzLCByaHMgKTsKKyAgICB9CisKKyAgICB9OworICAgIHR5cGVkZWYgc3RydWN0IF9fa21wX2NtcGx4NjRfdCBrbXBfY21wbHg2NDsKKworICAgIC8vIGNvbXBsZXg0CisgICAgc3RydWN0IF9fa21wX2NtcGx4MzJfdCA6IHN0ZDo6Y29tcGxleDwgZmxvYXQgPiB7CisKKyAgICBfX2ttcF9jbXBseDMyX3QoKSA6IHN0ZDo6Y29tcGxleDwgZmxvYXQgPiAoKSB7fQorCisgICAgX19rbXBfY21wbHgzMl90KCBjb25zdCBzdGQ6OmNvbXBsZXg8ZmxvYXQ+JiBjZiApCisgICAgICAgICAgICAgICAgOiBzdGQ6OmNvbXBsZXg8IGZsb2F0ID4gKCBjZiApIHt9CisKKyAgICBfX2ttcF9jbXBseDMyX3Qgb3BlcmF0b3IgKyAoIGNvbnN0IF9fa21wX2NtcGx4MzJfdCYgYiApIHsKKyAgICAgICAgc3RkOjpjb21wbGV4PCBmbG9hdCA+IGxocyA9ICp0aGlzOworICAgICAgICBzdGQ6OmNvbXBsZXg8IGZsb2F0ID4gcmhzID0gYjsKKyAgICAgICAgcmV0dXJuICggbGhzICsgcmhzICk7CisgICAgfQorICAgIF9fa21wX2NtcGx4MzJfdCBvcGVyYXRvciAtICggY29uc3QgX19rbXBfY21wbHgzMl90JiBiICkgeworICAgICAgICBzdGQ6OmNvbXBsZXg8IGZsb2F0ID4gbGhzID0gKnRoaXM7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgZmxvYXQgPiByaHMgPSBiOworICAgICAgICByZXR1cm4gKCBsaHMgLSByaHMgKTsKKyAgICB9CisgICAgX19rbXBfY21wbHgzMl90IG9wZXJhdG9yICogKCBjb25zdCBfX2ttcF9jbXBseDMyX3QmIGIgKSB7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgZmxvYXQgPiBsaHMgPSAqdGhpczsKKyAgICAgICAgc3RkOjpjb21wbGV4PCBmbG9hdCA+IHJocyA9IGI7CisgICAgICAgIHJldHVybiAoIGxocyAqIHJocyApOworICAgIH0KKworICAgIF9fa21wX2NtcGx4MzJfdCBvcGVyYXRvciArICggY29uc3Qga21wX2NtcGx4NjQmIGIgKSB7CisgICAgICAgIGttcF9jbXBseDY0IHQgPSBrbXBfY21wbHg2NCggKnRoaXMgKSArIGI7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgZG91YmxlID4gZCggdCApOworICAgICAgICBzdGQ6OmNvbXBsZXg8IGZsb2F0ID4gZiggZCApOworICAgICAgICBfX2ttcF9jbXBseDMyX3QgciggZiApOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisgICAgX19rbXBfY21wbHgzMl90IG9wZXJhdG9yIC0gKCBjb25zdCBrbXBfY21wbHg2NCYgYiApIHsKKyAgICAgICAga21wX2NtcGx4NjQgdCA9IGttcF9jbXBseDY0KCAqdGhpcyApIC0gYjsKKyAgICAgICAgc3RkOjpjb21wbGV4PCBkb3VibGUgPiBkKCB0ICk7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgZmxvYXQgPiBmKCBkICk7CisgICAgICAgIF9fa21wX2NtcGx4MzJfdCByKCBmICk7CisgICAgICAgIHJldHVybiByOworICAgIH0KKyAgICBfX2ttcF9jbXBseDMyX3Qgb3BlcmF0b3IgKiAoIGNvbnN0IGttcF9jbXBseDY0JiBiICkgeworICAgICAgICBrbXBfY21wbHg2NCB0ID0ga21wX2NtcGx4NjQoICp0aGlzICkgKiBiOworICAgICAgICBzdGQ6OmNvbXBsZXg8IGRvdWJsZSA+IGQoIHQgKTsKKyAgICAgICAgc3RkOjpjb21wbGV4PCBmbG9hdCA+IGYoIGQgKTsKKyAgICAgICAgX19rbXBfY21wbHgzMl90IHIoIGYgKTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgdm9pZCBvcGVyYXRvciAvPSAoIGNvbnN0IF9fa21wX2NtcGx4MzJfdCYgcmhzICkgeworICAgICAgICBzdGQ6OmNvbXBsZXg8IGZsb2F0ID4gbGhzID0gKnRoaXM7CisgICAgICAgICp0aGlzID0gX19rbXBfbGhzX2Rpdl9yaHMoIGxocywgcmhzICk7CisgICAgfQorCisgICAgX19rbXBfY21wbHgzMl90IG9wZXJhdG9yIC8gKCBjb25zdCBfX2ttcF9jbXBseDMyX3QmIHJocyApIHsKKyAgICAgICAgc3RkOjpjb21wbGV4PCBmbG9hdCA+IGxocyA9ICp0aGlzOworICAgICAgICByZXR1cm4gX19rbXBfbGhzX2Rpdl9yaHMoIGxocywgcmhzICk7CisgICAgfQorCisgICAgdm9pZCBvcGVyYXRvciAvPSAoIGNvbnN0IGttcF9jbXBseDY0JiByaHMgKSB7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgZmxvYXQgPiBsaHMgPSAqdGhpczsKKyAgICAgICAgKnRoaXMgPSBfX2ttcF9saHNfZGl2X3JocyggbGhzLCByaHMgKTsKKyAgICB9CisKKyAgICBfX2ttcF9jbXBseDMyX3Qgb3BlcmF0b3IgLyAoIGNvbnN0IGttcF9jbXBseDY0JiByaHMgKSB7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgZmxvYXQgPiBsaHMgPSAqdGhpczsKKyAgICAgICAgcmV0dXJuIF9fa21wX2xoc19kaXZfcmhzKCBsaHMsIHJocyApOworICAgIH0KKyAgICB9OworICAgIHR5cGVkZWYgc3RydWN0IF9fa21wX2NtcGx4MzJfdCBrbXBfY21wbHgzMjsKKworICAgIC8vIGNvbXBsZXgxMAorICAgIHN0cnVjdCBLTVBfRE9fQUxJR04oIDE2ICkgIF9fa21wX2NtcGx4ODBfdCA6IHN0ZDo6Y29tcGxleDwgbG9uZyBkb3VibGUgPiB7CisKKyAgICAgICAgICAgIF9fa21wX2NtcGx4ODBfdCgpIDogc3RkOjpjb21wbGV4PCBsb25nIGRvdWJsZSA+ICgpIHt9CisKKyAgICAgICAgICAgIF9fa21wX2NtcGx4ODBfdCggY29uc3Qgc3RkOjpjb21wbGV4PCBsb25nIGRvdWJsZSA+JiBjbGQgKQorICAgICAgICAgICAgICAgIDogc3RkOjpjb21wbGV4PCBsb25nIGRvdWJsZSA+ICggY2xkICkge30KKworICAgICAgICB2b2lkIG9wZXJhdG9yIC89ICggY29uc3QgX19rbXBfY21wbHg4MF90JiByaHMgKSB7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgbG9uZyBkb3VibGUgPiBsaHMgPSAqdGhpczsKKyAgICAgICAgKnRoaXMgPSBfX2ttcF9saHNfZGl2X3JocyggbGhzLCByaHMgKTsKKyAgICAgICAgfQorCisgICAgICAgIF9fa21wX2NtcGx4ODBfdCBvcGVyYXRvciAvICggY29uc3QgX19rbXBfY21wbHg4MF90JiByaHMgKSB7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgbG9uZyBkb3VibGUgPiBsaHMgPSAqdGhpczsKKyAgICAgICAgcmV0dXJuIF9fa21wX2xoc19kaXZfcmhzKCBsaHMsIHJocyApOworICAgICAgICB9CisKKyAgICB9OworICAgIHR5cGVkZWYgS01QX0RPX0FMSUdOKCAxNiApICBzdHJ1Y3QgX19rbXBfY21wbHg4MF90IGttcF9jbXBseDgwOworCisgICAgLy8gY29tcGxleDE2CisgICAgI2lmIEtNUF9IQVZFX1FVQUQKKyAgICBzdHJ1Y3QgX19rbXBfY21wbHgxMjhfdCA6IHN0ZDo6Y29tcGxleDwgX1F1YWQgPiB7CisKKyAgICAgICAgICAgIF9fa21wX2NtcGx4MTI4X3QoKSA6IHN0ZDo6Y29tcGxleDwgX1F1YWQgPiAoKSB7fQorCisgICAgICAgICAgICBfX2ttcF9jbXBseDEyOF90KCBjb25zdCBzdGQ6OmNvbXBsZXg8IF9RdWFkID4mIGNxICkKKyAgICAgICAgICAgICAgICA6IHN0ZDo6Y29tcGxleDwgX1F1YWQgPiAoIGNxICkge30KKworICAgICAgICB2b2lkIG9wZXJhdG9yIC89ICggY29uc3QgX19rbXBfY21wbHgxMjhfdCYgcmhzICkgeworICAgICAgICBzdGQ6OmNvbXBsZXg8IF9RdWFkID4gbGhzID0gKnRoaXM7CisgICAgICAgICp0aGlzID0gX19rbXBfbGhzX2Rpdl9yaHMoIGxocywgcmhzICk7CisgICAgICAgIH0KKworICAgICAgICBfX2ttcF9jbXBseDEyOF90IG9wZXJhdG9yIC8gKCBjb25zdCBfX2ttcF9jbXBseDEyOF90JiByaHMgKSB7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgX1F1YWQgPiBsaHMgPSAqdGhpczsKKyAgICAgICAgcmV0dXJuIF9fa21wX2xoc19kaXZfcmhzKCBsaHMsIHJocyApOworICAgICAgICB9CisKKyAgICB9OworICAgIHR5cGVkZWYgc3RydWN0IF9fa21wX2NtcGx4MTI4X3Qga21wX2NtcGx4MTI4OworICAgICNlbmRpZiAvKiBLTVBfSEFWRV9RVUFEICovCisKKyAgICAjaWZkZWYgX0RFQlVHX1RFTVBPUkFSSUxZX1VOU0VUXworICAgICAgICAjdW5kZWYgX0RFQlVHX1RFTVBPUkFSSUxZX1VOU0VUXworICAgICAgICAvLyBTZXQgaXQgYmFjayBub3cKKyAgICAgICAgI2RlZmluZSBfREVCVUcgMQorICAgICNlbmRpZgorCisjZWxzZQorICAgIC8vIGNyZWF0ZSBzaG9ydGN1dHMgZm9yIGM5OSBjb21wbGV4IHR5cGVzCisgICAgdHlwZWRlZiBmbG9hdCBfQ29tcGxleCAgICAgICBrbXBfY21wbHgzMjsKKyAgICB0eXBlZGVmIGRvdWJsZSBfQ29tcGxleCAgICAgIGttcF9jbXBseDY0OworICAgIHR5cGVkZWYgbG9uZyBkb3VibGUgX0NvbXBsZXgga21wX2NtcGx4ODA7CisgICAgI2lmIEtNUF9IQVZFX1FVQUQKKyAgICB0eXBlZGVmIF9RdWFkIF9Db21wbGV4ICAgICAgIGttcF9jbXBseDEyODsKKyAgICAjZW5kaWYKKyNlbmRpZgorCisvLyBDb21waWxlciAxMi4wIGNoYW5nZWQgYWxpZ25tZW50IG9mIDE2IGFuZCAzMi1ieXRlIGFyZ3VtZW50cyAobGlrZSBfUXVhZAorLy8gYW5kIGttcF9jbXBseDEyOCkgb24gSUEtMzIgYXJjaGl0ZWN0dXJlLiBUaGUgZm9sbG93aW5nIGFsaWduZWQgc3RydWN0dXJlcworLy8gYXJlIGltcGxlbWVudGVkIHRvIHN1cHBvcnQgdGhlIG9sZCBhbGlnbm1lbnQgaW4gMTAuMSwgMTEuMCwgMTEuMSBhbmQgCisvLyBpbnRyb2R1Y2UgdGhlIG5ldyBhbGlnbm1lbnQgaW4gMTIuMC4gU2VlIENRODg0MDUuCisjaWYgS01QX0FSQ0hfWDg2ICYmIEtNUF9IQVZFX1FVQUQKKworICAgIC8vIDQtYnl0ZSBhbGlnbmVkIHN0cnVjdHVyZXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisKKyAgICAjcHJhZ21hIHBhY2soIHB1c2gsIDQgKQorCisgICAgCisgICAgc3RydWN0IEtNUF9ET19BTElHTiggNCApIFF1YWRfYTRfdCB7CisgICAgICAgIF9RdWFkIHE7CisKKyAgICAgICAgUXVhZF9hNF90KCAgKSA6IHEoICApIHt9CisgICAgICAgIFF1YWRfYTRfdCggY29uc3QgX1F1YWQgJiBjcSApIDogcSAoIGNxICkge30KKworICAgICAgICBRdWFkX2E0X3Qgb3BlcmF0b3IgKyAoIGNvbnN0IFF1YWRfYTRfdCYgYiApIHsKKyAgICAgICAgX1F1YWQgbGhzID0gKCp0aGlzKS5xOworICAgICAgICBfUXVhZCByaHMgPSBiLnE7CisgICAgICAgIHJldHVybiAoUXVhZF9hNF90KSggbGhzICsgcmhzICk7CisgICAgfQorCisgICAgUXVhZF9hNF90IG9wZXJhdG9yIC0gKCBjb25zdCBRdWFkX2E0X3QmIGIgKSB7CisgICAgICAgIF9RdWFkIGxocyA9ICgqdGhpcykucTsKKyAgICAgICAgX1F1YWQgcmhzID0gYi5xOworICAgICAgICByZXR1cm4gKFF1YWRfYTRfdCkoIGxocyAtIHJocyApOworICAgIH0KKyAgICBRdWFkX2E0X3Qgb3BlcmF0b3IgKiAoIGNvbnN0IFF1YWRfYTRfdCYgYiApIHsKKyAgICAgICAgX1F1YWQgbGhzID0gKCp0aGlzKS5xOworICAgICAgICBfUXVhZCByaHMgPSBiLnE7CisgICAgICAgIHJldHVybiAoUXVhZF9hNF90KSggbGhzICogcmhzICk7CisgICAgfQorCisgICAgUXVhZF9hNF90IG9wZXJhdG9yIC8gKCBjb25zdCBRdWFkX2E0X3QmIGIgKSB7CisgICAgICAgIF9RdWFkIGxocyA9ICgqdGhpcykucTsKKyAgICAgICAgICAgIF9RdWFkIHJocyA9IGIucTsKKyAgICAgICAgcmV0dXJuIChRdWFkX2E0X3QpKCBsaHMgLyByaHMgKTsKKyAgICB9CisKKyAgICB9OworCisgICAgc3RydWN0IEtNUF9ET19BTElHTiggNCApIGttcF9jbXBseDEyOF9hNF90IHsKKyAgICAgICAga21wX2NtcGx4MTI4IHE7CisKKyAgICBrbXBfY21wbHgxMjhfYTRfdCgpIDogcSAoKSB7fQorCisgICAga21wX2NtcGx4MTI4X2E0X3QoIGNvbnN0IGttcF9jbXBseDEyOCAmIGMxMjggKSA6IHEgKCBjMTI4ICkge30KKworICAgICAgICBrbXBfY21wbHgxMjhfYTRfdCBvcGVyYXRvciArICggY29uc3Qga21wX2NtcGx4MTI4X2E0X3QmIGIgKSB7CisgICAgICAgIGttcF9jbXBseDEyOCBsaHMgPSAoKnRoaXMpLnE7CisgICAgICAgIGttcF9jbXBseDEyOCByaHMgPSBiLnE7CisgICAgICAgIHJldHVybiAoa21wX2NtcGx4MTI4X2E0X3QpKCBsaHMgKyByaHMgKTsKKyAgICB9CisgICAgICAgIGttcF9jbXBseDEyOF9hNF90IG9wZXJhdG9yIC0gKCBjb25zdCBrbXBfY21wbHgxMjhfYTRfdCYgYiApIHsKKyAgICAgICAga21wX2NtcGx4MTI4IGxocyA9ICgqdGhpcykucTsKKyAgICAgICAga21wX2NtcGx4MTI4IHJocyA9IGIucTsKKyAgICAgICAgcmV0dXJuIChrbXBfY21wbHgxMjhfYTRfdCkoIGxocyAtIHJocyApOworICAgIH0KKyAgICBrbXBfY21wbHgxMjhfYTRfdCBvcGVyYXRvciAqICggY29uc3Qga21wX2NtcGx4MTI4X2E0X3QmIGIgKSB7CisgICAgICAgIGttcF9jbXBseDEyOCBsaHMgPSAoKnRoaXMpLnE7CisgICAgICAgIGttcF9jbXBseDEyOCByaHMgPSBiLnE7CisgICAgICAgIHJldHVybiAoa21wX2NtcGx4MTI4X2E0X3QpKCBsaHMgKiByaHMgKTsKKyAgICB9CisKKyAgICBrbXBfY21wbHgxMjhfYTRfdCBvcGVyYXRvciAvICggY29uc3Qga21wX2NtcGx4MTI4X2E0X3QmIGIgKSB7CisgICAgICAgIGttcF9jbXBseDEyOCBsaHMgPSAoKnRoaXMpLnE7CisgICAgICAgIGttcF9jbXBseDEyOCByaHMgPSBiLnE7CisgICAgICAgIHJldHVybiAoa21wX2NtcGx4MTI4X2E0X3QpKCBsaHMgLyByaHMgKTsKKyAgICB9CisKKyAgICB9OworCisgICAgI3ByYWdtYSBwYWNrKCBwb3AgKQorCisgICAgLy8gTmV3IDE2LWJ5dGUgYWxpZ25lZCBzdHJ1Y3R1cmVzIGZvciAxMi4wIGNvbXBpbGVyLgorICAgIHN0cnVjdCBLTVBfRE9fQUxJR04oIDE2ICkgUXVhZF9hMTZfdCB7CisgICAgICAgIF9RdWFkIHE7CisKKyAgICAgICAgUXVhZF9hMTZfdCggICkgOiBxKCAgKSB7fQorICAgICAgICBRdWFkX2ExNl90KCBjb25zdCBfUXVhZCAmIGNxICkgOiBxICggY3EgKSB7fQorCisgICAgICAgIFF1YWRfYTE2X3Qgb3BlcmF0b3IgKyAoIGNvbnN0IFF1YWRfYTE2X3QmIGIgKSB7CisgICAgICAgIF9RdWFkIGxocyA9ICgqdGhpcykucTsKKyAgICAgICAgX1F1YWQgcmhzID0gYi5xOworICAgICAgICByZXR1cm4gKFF1YWRfYTE2X3QpKCBsaHMgKyByaHMgKTsKKyAgICB9CisKKyAgICBRdWFkX2ExNl90IG9wZXJhdG9yIC0gKCBjb25zdCBRdWFkX2ExNl90JiBiICkgeworICAgICAgICBfUXVhZCBsaHMgPSAoKnRoaXMpLnE7CisgICAgICAgIF9RdWFkIHJocyA9IGIucTsKKyAgICAgICAgcmV0dXJuIChRdWFkX2ExNl90KSggbGhzIC0gcmhzICk7CisgICAgfQorICAgIFF1YWRfYTE2X3Qgb3BlcmF0b3IgKiAoIGNvbnN0IFF1YWRfYTE2X3QmIGIgKSB7CisgICAgICAgIF9RdWFkIGxocyA9ICgqdGhpcykucTsKKyAgICAgICAgX1F1YWQgcmhzID0gYi5xOworICAgICAgICByZXR1cm4gKFF1YWRfYTE2X3QpKCBsaHMgKiByaHMgKTsKKyAgICB9CisKKyAgICBRdWFkX2ExNl90IG9wZXJhdG9yIC8gKCBjb25zdCBRdWFkX2ExNl90JiBiICkgeworICAgICAgICBfUXVhZCBsaHMgPSAoKnRoaXMpLnE7CisgICAgICAgICAgICBfUXVhZCByaHMgPSBiLnE7CisgICAgICAgIHJldHVybiAoUXVhZF9hMTZfdCkoIGxocyAvIHJocyApOworICAgIH0KKyAgICB9OworCisgICAgc3RydWN0IEtNUF9ET19BTElHTiggMTYgKSBrbXBfY21wbHgxMjhfYTE2X3QgeworICAgICAgICBrbXBfY21wbHgxMjggcTsKKworICAgIGttcF9jbXBseDEyOF9hMTZfdCgpIDogcSAoKSB7fQorCisgICAga21wX2NtcGx4MTI4X2ExNl90KCBjb25zdCBrbXBfY21wbHgxMjggJiBjMTI4ICkgOiBxICggYzEyOCApIHt9CisKKyAgICAgICBrbXBfY21wbHgxMjhfYTE2X3Qgb3BlcmF0b3IgKyAoIGNvbnN0IGttcF9jbXBseDEyOF9hMTZfdCYgYiApIHsKKyAgICAgICAga21wX2NtcGx4MTI4IGxocyA9ICgqdGhpcykucTsKKyAgICAgICAga21wX2NtcGx4MTI4IHJocyA9IGIucTsKKyAgICAgICAgcmV0dXJuIChrbXBfY21wbHgxMjhfYTE2X3QpKCBsaHMgKyByaHMgKTsKKyAgICB9CisgICAgICAga21wX2NtcGx4MTI4X2ExNl90IG9wZXJhdG9yIC0gKCBjb25zdCBrbXBfY21wbHgxMjhfYTE2X3QmIGIgKSB7CisgICAgICAgIGttcF9jbXBseDEyOCBsaHMgPSAoKnRoaXMpLnE7CisgICAgICAgIGttcF9jbXBseDEyOCByaHMgPSBiLnE7CisgICAgICAgIHJldHVybiAoa21wX2NtcGx4MTI4X2ExNl90KSggbGhzIC0gcmhzICk7CisgICAgfQorICAgIGttcF9jbXBseDEyOF9hMTZfdCBvcGVyYXRvciAqICggY29uc3Qga21wX2NtcGx4MTI4X2ExNl90JiBiICkgeworICAgICAgICBrbXBfY21wbHgxMjggbGhzID0gKCp0aGlzKS5xOworICAgICAgICBrbXBfY21wbHgxMjggcmhzID0gYi5xOworICAgICAgICByZXR1cm4gKGttcF9jbXBseDEyOF9hMTZfdCkoIGxocyAqIHJocyApOworICAgIH0KKworICAgIGttcF9jbXBseDEyOF9hMTZfdCBvcGVyYXRvciAvICggY29uc3Qga21wX2NtcGx4MTI4X2ExNl90JiBiICkgeworICAgICAgICBrbXBfY21wbHgxMjggbGhzID0gKCp0aGlzKS5xOworICAgICAgICBrbXBfY21wbHgxMjggcmhzID0gYi5xOworICAgICAgICByZXR1cm4gKGttcF9jbXBseDEyOF9hMTZfdCkoIGxocyAvIHJocyApOworICAgIH0KKyAgICB9OworCisjZW5kaWYKKworI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICAjZGVmaW5lIFFVQURfTEVHQUNZIFF1YWRfYTRfdAorICAgICNkZWZpbmUgQ1BMWDEyOF9MRUcga21wX2NtcGx4MTI4X2E0X3QKKyNlbHNlCisgICAgI2RlZmluZSBRVUFEX0xFR0FDWSBfUXVhZAorICAgICNkZWZpbmUgQ1BMWDEyOF9MRUcga21wX2NtcGx4MTI4CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworZXh0ZXJuIGludCBfX2ttcF9hdG9taWNfbW9kZTsKKworLy8KKy8vIEF0b21pYyBsb2NrcyBjYW4gZWFzaWx5IGJlY29tZSBjb250ZW5kZWQsIHNvIHdlIHVzZSBxdWV1aW5nIGxvY2tzIGZvciB0aGVtLgorLy8KKwordHlwZWRlZiBrbXBfcXVldWluZ19sb2NrX3Qga21wX2F0b21pY19sb2NrX3Q7CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jaygga21wX2F0b21pY19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIF9fa21wX2FjcXVpcmVfcXVldWluZ19sb2NrKCBsY2ssIGd0aWQgKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fa21wX3Rlc3RfYXRvbWljX2xvY2soIGttcF9hdG9taWNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICByZXR1cm4gX19rbXBfdGVzdF9xdWV1aW5nX2xvY2soIGxjaywgZ3RpZCApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soIGttcF9hdG9taWNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBfX2ttcF9yZWxlYXNlX3F1ZXVpbmdfbG9jayggbGNrLCBndGlkICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfaW5pdF9hdG9taWNfbG9jaygga21wX2F0b21pY19sb2NrX3QgKmxjayApCit7CisgICAgX19rbXBfaW5pdF9xdWV1aW5nX2xvY2soIGxjayApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX2Rlc3Ryb3lfYXRvbWljX2xvY2soIGttcF9hdG9taWNfbG9ja190ICpsY2sgKQoreworICAgIF9fa21wX2Rlc3Ryb3lfcXVldWluZ19sb2NrKCBsY2sgKTsKK30KKworLy8gR2xvYmFsIExvY2tzCisKK2V4dGVybiBrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9jazsgICAgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBpbiBHbnUgY29tcGF0IG1vZGUgICAqLworZXh0ZXJuIGttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzFpOyAgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgMS1ieXRlIGZpeGVkIGRhdGEgdHlwZXMgKi8KK2V4dGVybiBrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja18yaTsgIC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIDItYnl0ZSBmaXhlZCBkYXRhIHR5cGVzICovCitleHRlcm4ga21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfNGk7ICAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciA0LWJ5dGUgZml4ZWQgZGF0YSB0eXBlcyAqLworZXh0ZXJuIGttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzRyOyAgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3Iga21wX3JlYWwzMiBkYXRhIHR5cGUgICAgKi8KK2V4dGVybiBrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja184aTsgIC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIDgtYnl0ZSBmaXhlZCBkYXRhIHR5cGVzICovCitleHRlcm4ga21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfOHI7ICAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciBrbXBfcmVhbDY0IGRhdGEgdHlwZSAgICAqLworZXh0ZXJuIGttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzhjOyAgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgY29tcGxleCBieXRlIGRhdGEgdHlwZSAgKi8KK2V4dGVybiBrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja18xMHI7IC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIGxvbmcgZG91YmxlIGRhdGEgdHlwZSAgICovCitleHRlcm4ga21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfMTZyOyAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciBfUXVhZCBkYXRhIHR5cGUgICAgICAgICAqLworZXh0ZXJuIGttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzE2YzsgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgZG91YmxlIGNvbXBsZXggZGF0YSB0eXBlKi8KK2V4dGVybiBrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja18yMGM7IC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIGxvbmcgZG91YmxlIGNvbXBsZXggdHlwZSovCitleHRlcm4ga21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfMzJjOyAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciBfUXVhZCBjb21wbGV4IGRhdGEgdHlwZSAqLworCisvLworLy8gIEJlbG93IHJvdXRpbmVzIGZvciBhdG9taWMgVVBEQVRFIGFyZSBsaXN0ZWQKKy8vCisKKy8vIDEtYnl0ZQordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hZGQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hbmRiKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBjaGFyICogbGhzLCB1bnNpZ25lZCBjaGFyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tdWwoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmIoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaGwoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaHIoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc2hyKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBjaGFyICogbGhzLCB1bnNpZ25lZCBjaGFyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWIoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV94b3IoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocyApOworLy8gMi1ieXRlCit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX2FkZCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfYW5kYiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQydV9kaXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHVuc2lnbmVkIHNob3J0ICogbGhzLCB1bnNpZ25lZCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfbXVsKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9vcmIoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX3NobCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfc2hyKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfc2hyKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBzaG9ydCAqIGxocywgdW5zaWduZWQgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX3N1YiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfeG9yKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocyApOworLy8gNC1ieXRlIGFkZCAvIHN1YiBmaXhlZAordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfc3ViKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7CisvLyA0LWJ5dGUgYWRkIC8gc3ViIGZsb2F0Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ0X2FkZCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKiBsaHMsIGttcF9yZWFsMzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1YiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKiBsaHMsIGttcF9yZWFsMzIgcmhzICk7CisvLyA4LWJ5dGUgYWRkIC8gc3ViIGZpeGVkCit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X2FkZCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWIoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMgKTsKKy8vIDgtYnl0ZSBhZGQgLyBzdWIgZmxvYXQKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDhfYWRkKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAqIGxocywga21wX3JlYWw2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAqIGxocywga21wX3JlYWw2NCByaHMgKTsKKy8vIDQtYnl0ZSBmaXhlZAordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hbmRiKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfZGl2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50MzIgKiBsaHMsIGttcF91aW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X211bCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9vcmIoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfc2hsKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X3NociggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc2hyKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDMyICogbGhzLCBrbXBfdWludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF94b3IoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMgKTsKKy8vIDgtYnl0ZSBmaXhlZAordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hbmRiKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfZGl2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50NjQgKiBsaHMsIGttcF91aW50NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X211bCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmIoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfc2hsKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X3NociggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc2hyKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDY0ICogbGhzLCBrbXBfdWludDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF94b3IoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMgKTsKKy8vIDQtYnl0ZSBmbG9hdAordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWwoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDMyIHJocyApOworLy8gOC1ieXRlIGZsb2F0Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ4X2RpdiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsNjQgKiBsaHMsIGttcF9yZWFsNjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ4X211bCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsNjQgKiBsaHMsIGttcF9yZWFsNjQgcmhzICk7CisvLyAxLSwgMi0sIDQtLCA4LWJ5dGUgbG9naWNhbCAoJiYsIHx8KQordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hbmRsKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmwoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRsKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX29ybCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfYW5kbCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X29ybCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hbmRsKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfb3JsKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzICk7CisvLyBNSU4gLyBNQVgKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfbWF4KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfbWluKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfbWF4KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9taW4oICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X21heCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9taW4oICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfbWF4KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X21pbiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tYXgoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9taW4oICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tYXgoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICogbGhzLCBrbXBfcmVhbDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9taW4oICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICogbGhzLCBrbXBfcmVhbDY0IHJocyApOworI2lmIEtNUF9IQVZFX1FVQUQKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDE2X21heCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWluKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBRVUFEX0xFR0FDWSAqIGxocywgUVVBRF9MRUdBQ1kgcmhzICk7CisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIC8vIFJvdXRpbmVzIHdpdGggMTYtYnl0ZSBhcmd1bWVudHMgYWxpZ25lZCB0byAxNi1ieXRlIGJvdW5kYXJ5OyBJQS0zMiBhcmNoaXRlY3R1cmUgb25seQorICAgIHZvaWQgX19rbXBjX2F0b21pY19mbG9hdDE2X21heF9hMTYoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBRdWFkX2ExNl90ICogbGhzLCBRdWFkX2ExNl90IHJocyApOworICAgIHZvaWQgX19rbXBjX2F0b21pY19mbG9hdDE2X21pbl9hMTYoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBRdWFkX2ExNl90ICogbGhzLCBRdWFkX2ExNl90IHJocyApOworI2VuZGlmCisjZW5kaWYKKy8vIC5ORVFWLiAoc2FtZSBhcyB4b3IpCit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX25lcXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX25lcXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfbmVxdiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X25lcXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocyApOworLy8gLkVRVi4gKHNhbWUgYXMgfnhvcikKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfZXF2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfZXF2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9lcXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfZXF2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzICk7CisvLyBsb25nIGRvdWJsZSB0eXBlCit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxMF9hZGQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICogbGhzLCBsb25nIGRvdWJsZSByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDEwX3N1YiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgbG9uZyBkb3VibGUgKiBsaHMsIGxvbmcgZG91YmxlIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfbXVsKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgbG9uZyBkb3VibGUgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICogbGhzLCBsb25nIGRvdWJsZSByaHMgKTsKKy8vIF9RdWFkIHR5cGUKKyNpZiBLTVBfSEFWRV9RVUFECit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl9hZGQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICogbGhzLCBRVUFEX0xFR0FDWSByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1YiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbXVsKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBRVUFEX0xFR0FDWSAqIGxocywgUVVBRF9MRUdBQ1kgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICogbGhzLCBRVUFEX0xFR0FDWSByaHMgKTsKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgLy8gUm91dGluZXMgd2l0aCAxNi1ieXRlIGFyZ3VtZW50cyBhbGlnbmVkIHRvIDE2LWJ5dGUgYm91bmRhcnkKKyAgICB2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl9hZGRfYTE2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAqIGxocywgUXVhZF9hMTZfdCByaHMgKTsKKyAgICB2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfYTE2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAqIGxocywgUXVhZF9hMTZfdCByaHMgKTsKKyAgICB2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl9tdWxfYTE2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAqIGxocywgUXVhZF9hMTZfdCByaHMgKTsKKyAgICB2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfYTE2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAqIGxocywgUXVhZF9hMTZfdCByaHMgKTsKKyNlbmRpZgorI2VuZGlmCisvLyByb3V0aW5lcyBmb3IgY29tcGxleCB0eXBlcwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4NF9hZGQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0X3N1YiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHgzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDRfbXVsKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MzIgKiBsaHMsIGttcF9jbXBseDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg4X2FkZCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDY0ICogbGhzLCBrbXBfY21wbHg2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDhfc3ViKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4NjQgKiBsaHMsIGttcF9jbXBseDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4OF9tdWwoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqIGxocywga21wX2NtcGx4NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg4X2RpdiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDY0ICogbGhzLCBrbXBfY21wbHg2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDEwX2FkZCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4ODAgKiBsaHMsIGttcF9jbXBseDgwIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3ViKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg4MCAqIGxocywga21wX2NtcGx4ODAgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHgxMF9tdWwoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDgwICogbGhzLCBrbXBfY21wbHg4MCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDEwX2RpdiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4ODAgKiBsaHMsIGttcF9jbXBseDgwIHJocyApOworI2lmIEtNUF9IQVZFX1FVQUQKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDE2X2FkZCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgQ1BMWDEyOF9MRUcgKiBsaHMsIENQTFgxMjhfTEVHIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBDUExYMTI4X0xFRyAqIGxocywgQ1BMWDEyOF9MRUcgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHgxNl9tdWwoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIENQTFgxMjhfTEVHICogbGhzLCBDUExYMTI4X0xFRyByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDE2X2RpdiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgQ1BMWDEyOF9MRUcgKiBsaHMsIENQTFgxMjhfTEVHIHJocyApOworI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICAvLyBSb3V0aW5lcyB3aXRoIDE2LWJ5dGUgYXJndW1lbnRzIGFsaWduZWQgdG8gMTYtYnl0ZSBib3VuZGFyeQorICAgIHZvaWQgX19rbXBjX2F0b21pY19jbXBseDE2X2FkZF9hMTYoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgxMjhfYTE2X3QgKiBsaHMsIGttcF9jbXBseDEyOF9hMTZfdCByaHMgKTsKKyAgICB2b2lkIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfYTE2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MTI4X2ExNl90ICogbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgcmhzICk7CisgICAgdm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsX2ExNiggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDEyOF9hMTZfdCAqIGxocywga21wX2NtcGx4MTI4X2ExNl90IHJocyApOworICAgIHZvaWQgX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9hMTYoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgxMjhfYTE2X3QgKiBsaHMsIGttcF9jbXBseDEyOF9hMTZfdCByaHMgKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorCisvLyBPcGVuTVAgNC4wOiB4ID0gZXhwciBiaW5vcCB4IGZvciBub24tY29tbXV0YXRpdmUgb3BlcmF0aW9ucy4KKy8vIFN1cHBvcnRlZCBvbmx5IG9uIElBLTMyIGFyY2hpdGVjdHVyZSBhbmQgSW50ZWwoUikgNjQKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfc3ViX3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgY2hhciAqIGxocywgdW5zaWduZWQgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfc2hsX3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX3Nocl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc2hyX3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgY2hhciAqIGxocywgdW5zaWduZWQgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfc3ViX3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfZGl2X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHVuc2lnbmVkIHNob3J0ICogbGhzLCB1bnNpZ25lZCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfc2hsX3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfc2hyX3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJ1X3Nocl9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHVuc2lnbmVkIHNob3J0ICogbGhzLCB1bnNpZ25lZCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfc3ViX3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXZfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDMyICogbGhzLCBrbXBfdWludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaGxfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X3Nocl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDR1X3Nocl9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50MzIgKiBsaHMsIGttcF91aW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1Yl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfZGl2X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3VpbnQ2NCAqIGxocywga21wX3VpbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfc2hsX3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHJfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zaHJfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDY0ICogbGhzLCBrbXBfdWludDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgZmxvYXQgKiBsaHMsIGZsb2F0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgZmxvYXQgKiBsaHMsIGZsb2F0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWJfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgZG91YmxlICogbGhzLCBkb3VibGUgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ4X2Rpdl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBkb3VibGUgKiBsaHMsIGRvdWJsZSByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICogbGhzLCBsb25nIGRvdWJsZSByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDEwX2Rpdl9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICogbGhzLCBsb25nIGRvdWJsZSByaHMgKTsKKyNpZiBLTVBfSEFWRV9RVUFECit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBRVUFEX0xFR0FDWSAqIGxocywgUVVBRF9MRUdBQ1kgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBRVUFEX0xFR0FDWSAqIGxocywgUVVBRF9MRUdBQ1kgcmhzICk7CisjZW5kaWYKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDRfc3ViX3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHgzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDRfZGl2X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHgzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDhfc3ViX3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDY0ICogbGhzLCBrbXBfY21wbHg2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDhfZGl2X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDY0ICogbGhzLCBrbXBfY21wbHg2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDEwX3N1Yl9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDgwICogbGhzLCBrbXBfY21wbHg4MCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDEwX2Rpdl9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDgwICogbGhzLCBrbXBfY21wbHg4MCByaHMgKTsKKyNpZiBLTVBfSEFWRV9RVUFECit2b2lkIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBDUExYMTI4X0xFRyAqIGxocywgQ1BMWDEyOF9MRUcgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBDUExYMTI4X0xFRyAqIGxocywgQ1BMWDEyOF9MRUcgcmhzICk7CisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIC8vIFJvdXRpbmVzIHdpdGggMTYtYnl0ZSBhcmd1bWVudHMgYWxpZ25lZCB0byAxNi1ieXRlIGJvdW5kYXJ5CisgICAgdm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2ExNl9yZXYoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBRdWFkX2ExNl90ICogbGhzLCBRdWFkX2ExNl90IHJocyApOworICAgIHZvaWQgX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9hMTZfcmV2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAqIGxocywgUXVhZF9hMTZfdCByaHMgKTsKKyAgICB2b2lkIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfYTE2X3JldiggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDEyOF9hMTZfdCAqIGxocywga21wX2NtcGx4MTI4X2ExNl90IHJocyApOworICAgIHZvaWQgX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9hMTZfcmV2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MTI4X2ExNl90ICogbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgcmhzICk7CisjZW5kaWYKKyNlbmRpZiAvLyBLTVBfSEFWRV9RVUFECisKKyNlbmRpZiAvL0tNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworI2VuZGlmIC8vT01QXzQwX0VOQUJMRUQKKworLy8gcm91dGluZXMgZm9yIG1peGVkIHR5cGVzCisKKy8vIFJIUz1mbG9hdDgKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfbXVsX2Zsb2F0OCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywga21wX3JlYWw2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2Zsb2F0OCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywga21wX3JlYWw2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfbXVsX2Zsb2F0OCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIGttcF9yZWFsNjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9mbG9hdDgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBrbXBfcmVhbDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWxfZmxvYXQ4KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9yZWFsNjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9mbG9hdDgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX3JlYWw2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfbXVsX2Zsb2F0OCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfcmVhbDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfZmxvYXQ4KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9yZWFsNjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ0X2FkZF9mbG9hdDgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKiBsaHMsIGttcF9yZWFsNjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9mbG9hdDgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKiBsaHMsIGttcF9yZWFsNjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ0X211bF9mbG9hdDgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKiBsaHMsIGttcF9yZWFsNjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9mbG9hdDgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKiBsaHMsIGttcF9yZWFsNjQgcmhzICk7CisKKy8vIFJIUz1mbG9hdDE2IChkZXByZWNhdGVkLCB0byBiZSByZW1vdmVkIHdoZW4gd2UgYXJlIHN1cmUgdGhlIGNvbXBpbGVyIGRvZXMgbm90IHVzZSB0aGVtKQorI2lmIEtNUF9IQVZFX1FVQUQKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfYWRkX2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX3N1Yl9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tdWxfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfZnAoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHVuc2lnbmVkIGNoYXIgKiBsaHMsIF9RdWFkIHJocyApOworCit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX2FkZF9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfc3ViX2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWxfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9mcCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgc2hvcnQgKiBsaHMsIF9RdWFkIHJocyApOworCit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X2FkZF9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X211bF9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXZfZnAoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50MzIgKiBsaHMsIF9RdWFkIHJocyApOworCit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X2FkZF9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1Yl9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X211bF9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfZnAoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50NjQgKiBsaHMsIF9RdWFkIHJocyApOworCit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ0X2FkZF9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfbXVsX2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKiBsaHMsIF9RdWFkIHJocyApOworCit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ4X2FkZF9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsNjQgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWJfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDhfbXVsX2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ4X2Rpdl9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsNjQgKiBsaHMsIF9RdWFkIHJocyApOworCit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxMF9hZGRfZnAoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9mcCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgbG9uZyBkb3VibGUgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfbXVsX2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfZnAoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICogbGhzLCBfUXVhZCByaHMgKTsKKyNlbmRpZiAvLyBLTVBfSEFWRV9RVUFECisKKy8vIFJIUz1jbXBseDgKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDRfYWRkX2NtcGx4OCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MzIgKiBsaHMsIGttcF9jbXBseDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWJfY21wbHg4KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0X211bF9jbXBseDgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHg2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDRfZGl2X2NtcGx4OCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MzIgKiBsaHMsIGttcF9jbXBseDY0IHJocyApOworCisvLyBnZW5lcmljIGF0b21pYyByb3V0aW5lcwordm9pZCBfX2ttcGNfYXRvbWljXzEoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB2b2lkKiBsaHMsIHZvaWQqIHJocywgdm9pZCAoKmYpKCB2b2lkICosIHZvaWQgKiwgdm9pZCAqICkgKTsKK3ZvaWQgX19rbXBjX2F0b21pY18yKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdm9pZCogbGhzLCB2b2lkKiByaHMsIHZvaWQgKCpmKSggdm9pZCAqLCB2b2lkICosIHZvaWQgKiApICk7Cit2b2lkIF9fa21wY19hdG9taWNfNCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHZvaWQqIGxocywgdm9pZCogcmhzLCB2b2lkICgqZikoIHZvaWQgKiwgdm9pZCAqLCB2b2lkICogKSApOwordm9pZCBfX2ttcGNfYXRvbWljXzgoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB2b2lkKiBsaHMsIHZvaWQqIHJocywgdm9pZCAoKmYpKCB2b2lkICosIHZvaWQgKiwgdm9pZCAqICkgKTsKK3ZvaWQgX19rbXBjX2F0b21pY18xMCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdm9pZCogbGhzLCB2b2lkKiByaHMsIHZvaWQgKCpmKSggdm9pZCAqLCB2b2lkICosIHZvaWQgKiApICk7Cit2b2lkIF9fa21wY19hdG9taWNfMTYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHZvaWQqIGxocywgdm9pZCogcmhzLCB2b2lkICgqZikoIHZvaWQgKiwgdm9pZCAqLCB2b2lkICogKSApOwordm9pZCBfX2ttcGNfYXRvbWljXzIwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB2b2lkKiBsaHMsIHZvaWQqIHJocywgdm9pZCAoKmYpKCB2b2lkICosIHZvaWQgKiwgdm9pZCAqICkgKTsKK3ZvaWQgX19rbXBjX2F0b21pY18zMiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdm9pZCogbGhzLCB2b2lkKiByaHMsIHZvaWQgKCpmKSggdm9pZCAqLCB2b2lkICosIHZvaWQgKiApICk7CisKKy8vIFJFQUQsIFdSSVRFLCBDQVBUVVJFIGFyZSBzdXBwb3J0ZWQgb25seSBvbiBJQS0zMiBhcmNoaXRlY3R1cmUgYW5kIEludGVsKFIpIDY0CisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCisvLworLy8gIEJlbG93IHJvdXRpbmVzIGZvciBhdG9taWMgUkVBRCBhcmUgbGlzdGVkCisvLworCitjaGFyICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfcmQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICAgICAgICAqIGxvYyApOworc2hvcnQgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3JkKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgICAgICAgKiBsb2MgKTsKK2ttcF9pbnQzMiAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9yZCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgICogbG9jICk7CitrbXBfaW50NjQgICAgX19rbXBjX2F0b21pY19maXhlZDhfcmQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgICAqIGxvYyApOwora21wX3JlYWwzMiAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3JkKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAgKiBsb2MgKTsKK2ttcF9yZWFsNjQgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9yZCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsNjQgICogbG9jICk7Citsb25nIGRvdWJsZSAgX19rbXBjX2F0b21pY19mbG9hdDEwX3JkKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxvYyApOworI2lmIEtNUF9IQVZFX1FVQUQKK1FVQURfTEVHQUNZICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfcmQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICogbG9jICk7CisjZW5kaWYKKy8vIEZpeCBmb3IgQ1EyMjAzNjE6IGNtcGx4NCBSRUFEIHdpbGwgcmV0dXJuIHZvaWQgb24gV2luZG93cyogT1M7IHJlYWQgdmFsdWUgd2lsbCBiZQorLy8gcmV0dXJuZWQgdGhyb3VnaCBhbiBhZGRpdGlvbmFsIHBhcmFtZXRlcgorI2lmICggS01QX09TX1dJTkRPV1MgKQorICAgIHZvaWQgIF9fa21wY19hdG9taWNfY21wbHg0X3JkKCAga21wX2NtcGx4MzIgKiBvdXQsIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbG9jICk7CisjZWxzZQorICAgIGttcF9jbXBseDMyICBfX2ttcGNfYXRvbWljX2NtcGx4NF9yZCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbG9jICk7CisjZW5kaWYKK2ttcF9jbXBseDY0ICBfX2ttcGNfYXRvbWljX2NtcGx4OF9yZCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDY0ICogbG9jICk7CitrbXBfY21wbHg4MCAgX19rbXBjX2F0b21pY19jbXBseDEwX3JkKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg4MCAqIGxvYyApOworI2lmIEtNUF9IQVZFX1FVQUQKK0NQTFgxMjhfTEVHICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfcmQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIENQTFgxMjhfTEVHICogbG9jICk7CisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIC8vIFJvdXRpbmVzIHdpdGggMTYtYnl0ZSBhcmd1bWVudHMgYWxpZ25lZCB0byAxNi1ieXRlIGJvdW5kYXJ5CisgICAgUXVhZF9hMTZfdCAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9hMTZfcmQoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBRdWFkX2ExNl90ICAgICAgICAgKiBsb2MgKTsKKyAgICBrbXBfY21wbHgxMjhfYTE2X3QgX19rbXBjX2F0b21pY19jbXBseDE2X2ExNl9yZCggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDEyOF9hMTZfdCAqIGxvYyApOworI2VuZGlmCisjZW5kaWYKKworCisvLworLy8gIEJlbG93IHJvdXRpbmVzIGZvciBhdG9taWMgV1JJVEUgYXJlIGxpc3RlZAorLy8KKwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV93ciggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgICAgICAgICogbGhzLCBjaGFyICAgICAgICByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfd3IoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAgICAgICAqIGxocywgc2hvcnQgICAgICAgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X3dyKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICAgKiBsaHMsIGttcF9pbnQzMiAgIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF93ciggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAgICogbGhzLCBrbXBfaW50NjQgICByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfd3IoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICAqIGxocywga21wX3JlYWwzMiAgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ4X3dyKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAgKiBsaHMsIGttcF9yZWFsNjQgIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfd3IoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICogbGhzLCBsb25nIGRvdWJsZSByaHMgKTsKKyNpZiBLTVBfSEFWRV9RVUFECit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl93ciggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocyApOworI2VuZGlmCit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0X3dyKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MzIgKiBsaHMsIGttcF9jbXBseDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4OF93ciggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDY0ICogbGhzLCBrbXBfY21wbHg2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDEwX3dyKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg4MCAqIGxocywga21wX2NtcGx4ODAgcmhzICk7CisjaWYgS01QX0hBVkVfUVVBRAordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfd3IoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIENQTFgxMjhfTEVHICogbGhzLCBDUExYMTI4X0xFRyByaHMgKTsKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgLy8gUm91dGluZXMgd2l0aCAxNi1ieXRlIGFyZ3VtZW50cyBhbGlnbmVkIHRvIDE2LWJ5dGUgYm91bmRhcnkKKyAgICB2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl9hMTZfd3IoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBRdWFkX2ExNl90ICAgICAgICAgKiBsaHMsIFF1YWRfYTE2X3QgICAgICAgICByaHMgKTsKKyAgICB2b2lkIF9fa21wY19hdG9taWNfY21wbHgxNl9hMTZfd3IoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgxMjhfYTE2X3QgKiBsaHMsIGttcF9jbXBseDEyOF9hMTZfdCByaHMgKTsKKyNlbmRpZgorI2VuZGlmCisKKy8vCisvLyAgQmVsb3cgcm91dGluZXMgZm9yIGF0b21pYyBDQVBUVVJFIGFyZSBsaXN0ZWQKKy8vCisKKy8vIDEtYnl0ZQorY2hhciBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hZGRfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMsIGludCBmbGFnKTsKK2NoYXIgX19rbXBjX2F0b21pY19maXhlZDFfYW5kYl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzLCBpbnQgZmxhZyk7CitjaGFyIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocywgaW50IGZsYWcpOwordW5zaWduZWQgY2hhciBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgY2hhciAqIGxocywgdW5zaWduZWQgY2hhciByaHMsIGludCBmbGFnKTsKK2NoYXIgX19rbXBjX2F0b21pY19maXhlZDFfbXVsX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzLCBpbnQgZmxhZyk7CitjaGFyIF9fa21wY19hdG9taWNfZml4ZWQxX29yYl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocywgaW50IGZsYWcpOworY2hhciBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaGxfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMsIGludCBmbGFnKTsKK2NoYXIgX19rbXBjX2F0b21pY19maXhlZDFfc2hyX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzLCBpbnQgZmxhZyk7Cit1bnNpZ25lZCBjaGFyIF9fa21wY19hdG9taWNfZml4ZWQxdV9zaHJfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBjaGFyICogbGhzLCB1bnNpZ25lZCBjaGFyIHJocywgaW50IGZsYWcpOworY2hhciBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMsIGludCBmbGFnKTsKK2NoYXIgX19rbXBjX2F0b21pY19maXhlZDFfeG9yX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzLCBpbnQgZmxhZyk7CisvLyAyLWJ5dGUKK3Nob3J0IF9fa21wY19hdG9taWNfZml4ZWQyX2FkZF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzLCBpbnQgZmxhZyk7CitzaG9ydCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRiX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocywgaW50IGZsYWcpOworc2hvcnQgX19rbXBjX2F0b21pY19maXhlZDJfZGl2X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMsIGludCBmbGFnKTsKK3Vuc2lnbmVkIHNob3J0IF9fa21wY19hdG9taWNfZml4ZWQydV9kaXZfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBzaG9ydCAqIGxocywgdW5zaWduZWQgc2hvcnQgcmhzLCBpbnQgZmxhZyk7CitzaG9ydCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWxfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocywgaW50IGZsYWcpOworc2hvcnQgX19rbXBjX2F0b21pY19maXhlZDJfb3JiX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMsIGludCBmbGFnKTsKK3Nob3J0IF9fa21wY19hdG9taWNfZml4ZWQyX3NobF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzLCBpbnQgZmxhZyk7CitzaG9ydCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaHJfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocywgaW50IGZsYWcpOwordW5zaWduZWQgc2hvcnQgX19rbXBjX2F0b21pY19maXhlZDJ1X3Nocl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHVuc2lnbmVkIHNob3J0ICogbGhzLCB1bnNpZ25lZCBzaG9ydCByaHMsIGludCBmbGFnKTsKK3Nob3J0IF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzLCBpbnQgZmxhZyk7CitzaG9ydCBfX2ttcGNfYXRvbWljX2ZpeGVkMl94b3JfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocywgaW50IGZsYWcpOworLy8gNC1ieXRlIGFkZCAvIHN1YiBmaXhlZAora21wX2ludDMyICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGRfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICAqIGxocywga21wX2ludDMyIHJocywgaW50IGZsYWcpOwora21wX2ludDMyICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWJfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICAqIGxocywga21wX2ludDMyIHJocywgaW50IGZsYWcpOworLy8gNC1ieXRlIGFkZCAvIHN1YiBmbG9hdAora21wX3JlYWwzMiBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGRfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAqIGxocywga21wX3JlYWwzMiByaHMsIGludCBmbGFnKTsKK2ttcF9yZWFsMzIgX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKiBsaHMsIGttcF9yZWFsMzIgcmhzLCBpbnQgZmxhZyk7CisvLyA4LWJ5dGUgYWRkIC8gc3ViIGZpeGVkCitrbXBfaW50NjQgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FkZF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgICogbGhzLCBrbXBfaW50NjQgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50NjQgIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1Yl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgICogbGhzLCBrbXBfaW50NjQgcmhzLCBpbnQgZmxhZyk7CisvLyA4LWJ5dGUgYWRkIC8gc3ViIGZsb2F0CitrbXBfcmVhbDY0IF9fa21wY19hdG9taWNfZmxvYXQ4X2FkZF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICogbGhzLCBrbXBfcmVhbDY0IHJocywgaW50IGZsYWcpOwora21wX3JlYWw2NCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWJfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAqIGxocywga21wX3JlYWw2NCByaHMsIGludCBmbGFnKTsKKy8vIDQtYnl0ZSBmaXhlZAora21wX2ludDMyICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hbmRiX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICAqIGxocywga21wX2ludDMyICByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQzMiAgX19rbXBjX2F0b21pY19maXhlZDRfZGl2X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgKiBsaHMsIGttcF9pbnQzMiAgcmhzLCBpbnQgZmxhZyk7CitrbXBfdWludDMyIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXZfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDMyICogbGhzLCBrbXBfdWludDMyIHJocywgaW50IGZsYWcpOwora21wX2ludDMyICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWxfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICAqIGxocywga21wX2ludDMyICByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQzMiAgX19rbXBjX2F0b21pY19maXhlZDRfb3JiX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgKiBsaHMsIGttcF9pbnQzMiAgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50MzIgIF9fa21wY19hdG9taWNfZml4ZWQ0X3NobF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgICogbGhzLCBrbXBfaW50MzIgIHJocywgaW50IGZsYWcpOwora21wX2ludDMyICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHJfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICAqIGxocywga21wX2ludDMyICByaHMsIGludCBmbGFnKTsKK2ttcF91aW50MzIgX19rbXBjX2F0b21pY19maXhlZDR1X3Nocl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50MzIgKiBsaHMsIGttcF91aW50MzIgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50MzIgIF9fa21wY19hdG9taWNfZml4ZWQ0X3hvcl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgICogbGhzLCBrbXBfaW50MzIgIHJocywgaW50IGZsYWcpOworLy8gOC1ieXRlIGZpeGVkCitrbXBfaW50NjQgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGJfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgICogbGhzLCBrbXBfaW50NjQgIHJocywgaW50IGZsYWcpOwora21wX2ludDY0ICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICAqIGxocywga21wX2ludDY0ICByaHMsIGludCBmbGFnKTsKK2ttcF91aW50NjQgX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50NjQgKiBsaHMsIGttcF91aW50NjQgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50NjQgIF9fa21wY19hdG9taWNfZml4ZWQ4X211bF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgICogbGhzLCBrbXBfaW50NjQgIHJocywgaW50IGZsYWcpOwora21wX2ludDY0ICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmJfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICAqIGxocywga21wX2ludDY0ICByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQ2NCAgX19rbXBjX2F0b21pY19maXhlZDhfc2hsX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAgKiBsaHMsIGttcF9pbnQ2NCAgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50NjQgIF9fa21wY19hdG9taWNfZml4ZWQ4X3Nocl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgICogbGhzLCBrbXBfaW50NjQgIHJocywgaW50IGZsYWcpOwora21wX3VpbnQ2NCBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc2hyX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3VpbnQ2NCAqIGxocywga21wX3VpbnQ2NCByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQ2NCAgX19rbXBjX2F0b21pY19maXhlZDhfeG9yX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAgKiBsaHMsIGttcF9pbnQ2NCAgcmhzLCBpbnQgZmxhZyk7CisvLyA0LWJ5dGUgZmxvYXQKK2ttcF9yZWFsMzIgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKiBsaHMsIGttcF9yZWFsMzIgcmhzLCBpbnQgZmxhZyk7CitrbXBfcmVhbDMyIF9fa21wY19hdG9taWNfZmxvYXQ0X211bF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDMyIHJocywgaW50IGZsYWcpOworLy8gOC1ieXRlIGZsb2F0CitrbXBfcmVhbDY0IF9fa21wY19hdG9taWNfZmxvYXQ4X2Rpdl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICogbGhzLCBrbXBfcmVhbDY0IHJocywgaW50IGZsYWcpOwora21wX3JlYWw2NCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tdWxfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAqIGxocywga21wX3JlYWw2NCByaHMsIGludCBmbGFnKTsKKy8vIDEtLCAyLSwgNC0sIDgtYnl0ZSBsb2dpY2FsICgmJiwgfHwpCitjaGFyICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfYW5kbF9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgICAgICAqIGxocywgY2hhciAgICAgIHJocywgaW50IGZsYWcpOworY2hhciAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX29ybF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICAgICAgKiBsaHMsIGNoYXIgICAgICByaHMsIGludCBmbGFnKTsKK3Nob3J0ICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRsX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgICAgICogbGhzLCBzaG9ydCAgICAgcmhzLCBpbnQgZmxhZyk7CitzaG9ydCAgICAgX19rbXBjX2F0b21pY19maXhlZDJfb3JsX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICAgICAqIGxocywgc2hvcnQgICAgIHJocywgaW50IGZsYWcpOwora21wX2ludDMyIF9fa21wY19hdG9taWNfZml4ZWQ0X2FuZGxfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQzMiBfX2ttcGNfYXRvbWljX2ZpeGVkNF9vcmxfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50NjQgX19rbXBjX2F0b21pY19maXhlZDhfYW5kbF9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocywgaW50IGZsYWcpOwora21wX2ludDY0IF9fa21wY19hdG9taWNfZml4ZWQ4X29ybF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMsIGludCBmbGFnKTsKKy8vIE1JTiAvIE1BWAorY2hhciAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfbWF4X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgICAgICAqIGxocywgY2hhciAgICAgIHJocywgaW50IGZsYWcpOworY2hhciAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfbWluX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgICAgICAqIGxocywgY2hhciAgICAgIHJocywgaW50IGZsYWcpOworc2hvcnQgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfbWF4X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICAgICAqIGxocywgc2hvcnQgICAgIHJocywgaW50IGZsYWcpOworc2hvcnQgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfbWluX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICAgICAqIGxocywgc2hvcnQgICAgIHJocywgaW50IGZsYWcpOwora21wX2ludDMyICAgX19rbXBjX2F0b21pY19maXhlZDRfbWF4X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocywgaW50IGZsYWcpOwora21wX2ludDMyICAgX19rbXBjX2F0b21pY19maXhlZDRfbWluX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocywgaW50IGZsYWcpOwora21wX2ludDY0ICAgX19rbXBjX2F0b21pY19maXhlZDhfbWF4X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocywgaW50IGZsYWcpOwora21wX2ludDY0ICAgX19rbXBjX2F0b21pY19maXhlZDhfbWluX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocywgaW50IGZsYWcpOwora21wX3JlYWwzMiAgX19rbXBjX2F0b21pY19mbG9hdDRfbWF4X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKiBsaHMsIGttcF9yZWFsMzIgcmhzLCBpbnQgZmxhZyk7CitrbXBfcmVhbDMyICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9taW5fY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAqIGxocywga21wX3JlYWwzMiByaHMsIGludCBmbGFnKTsKK2ttcF9yZWFsNjQgIF9fa21wY19hdG9taWNfZmxvYXQ4X21heF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICogbGhzLCBrbXBfcmVhbDY0IHJocywgaW50IGZsYWcpOwora21wX3JlYWw2NCAgX19rbXBjX2F0b21pY19mbG9hdDhfbWluX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsNjQgKiBsaHMsIGttcF9yZWFsNjQgcmhzLCBpbnQgZmxhZyk7CisjaWYgS01QX0hBVkVfUVVBRAorUVVBRF9MRUdBQ1kgX19rbXBjX2F0b21pY19mbG9hdDE2X21heF9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICogbGhzLCBRVUFEX0xFR0FDWSByaHMsIGludCBmbGFnKTsKK1FVQURfTEVHQUNZIF9fa21wY19hdG9taWNfZmxvYXQxNl9taW5fY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBRVUFEX0xFR0FDWSAqIGxocywgUVVBRF9MRUdBQ1kgcmhzLCBpbnQgZmxhZyk7CisjZW5kaWYKKy8vIC5ORVFWLiAoc2FtZSBhcyB4b3IpCitjaGFyICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfbmVxdl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgICAgICAqIGxocywgY2hhciAgICAgIHJocywgaW50IGZsYWcpOworc2hvcnQgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX25lcXZfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAgICAgKiBsaHMsIHNob3J0ICAgICByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQzMiBfX2ttcGNfYXRvbWljX2ZpeGVkNF9uZXF2X2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50NjQgX19rbXBjX2F0b21pY19maXhlZDhfbmVxdl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocywgaW50IGZsYWcpOworLy8gLkVRVi4gKHNhbWUgYXMgfnhvcikKK2NoYXIgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9lcXZfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAgICAgICogbGhzLCBjaGFyICAgICAgcmhzLCBpbnQgZmxhZyk7CitzaG9ydCAgICAgX19rbXBjX2F0b21pY19maXhlZDJfZXF2X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICAgICAqIGxocywgc2hvcnQgICAgIHJocywgaW50IGZsYWcpOwora21wX2ludDMyIF9fa21wY19hdG9taWNfZml4ZWQ0X2Vxdl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQ2NCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9lcXZfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzLCBpbnQgZmxhZyk7CisvLyBsb25nIGRvdWJsZSB0eXBlCitsb25nIGRvdWJsZSBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgbG9uZyBkb3VibGUgKiBsaHMsIGxvbmcgZG91YmxlIHJocywgaW50IGZsYWcpOworbG9uZyBkb3VibGUgX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICogbGhzLCBsb25nIGRvdWJsZSByaHMsIGludCBmbGFnKTsKK2xvbmcgZG91YmxlIF9fa21wY19hdG9taWNfZmxvYXQxMF9tdWxfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgbG9uZyBkb3VibGUgcmhzLCBpbnQgZmxhZyk7Citsb25nIGRvdWJsZSBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgbG9uZyBkb3VibGUgKiBsaHMsIGxvbmcgZG91YmxlIHJocywgaW50IGZsYWcpOworI2lmIEtNUF9IQVZFX1FVQUQKKy8vIF9RdWFkIHR5cGUKK1FVQURfTEVHQUNZIF9fa21wY19hdG9taWNfZmxvYXQxNl9hZGRfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBRVUFEX0xFR0FDWSAqIGxocywgUVVBRF9MRUdBQ1kgcmhzLCBpbnQgZmxhZyk7CitRVUFEX0xFR0FDWSBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocywgaW50IGZsYWcpOworUVVBRF9MRUdBQ1kgX19rbXBjX2F0b21pY19mbG9hdDE2X211bF9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICogbGhzLCBRVUFEX0xFR0FDWSByaHMsIGludCBmbGFnKTsKK1FVQURfTEVHQUNZIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBRVUFEX0xFR0FDWSAqIGxocywgUVVBRF9MRUdBQ1kgcmhzLCBpbnQgZmxhZyk7CisjZW5kaWYKKy8vIHJvdXRpbmVzIGZvciBjb21wbGV4IHR5cGVzCisvLyBXb3JrYXJvdW5kIGZvciBjbXBseDQgcm91dGluZXMgLSByZXR1cm4gdm9pZDsgY2FwdHVyZWQgdmFsdWUgaXMgcmV0dXJuZWQgdmlhIHRoZSBhcmd1bWVudAordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4NF9hZGRfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MzIgKiBsaHMsIGttcF9jbXBseDMyIHJocywga21wX2NtcGx4MzIgKiBvdXQsIGludCBmbGFnKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDRfc3ViX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHgzMiByaHMsIGttcF9jbXBseDMyICogb3V0LCBpbnQgZmxhZyk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0X211bF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4MzIgcmhzLCBrbXBfY21wbHgzMiAqIG91dCwgaW50IGZsYWcpOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXZfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MzIgKiBsaHMsIGttcF9jbXBseDMyIHJocywga21wX2NtcGx4MzIgKiBvdXQsIGludCBmbGFnKTsKKwora21wX2NtcGx4NjQgX19rbXBjX2F0b21pY19jbXBseDhfYWRkX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDY0ICogbGhzLCBrbXBfY21wbHg2NCByaHMsIGludCBmbGFnKTsKK2ttcF9jbXBseDY0IF9fa21wY19hdG9taWNfY21wbHg4X3N1Yl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqIGxocywga21wX2NtcGx4NjQgcmhzLCBpbnQgZmxhZyk7CitrbXBfY21wbHg2NCBfX2ttcGNfYXRvbWljX2NtcGx4OF9tdWxfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4NjQgKiBsaHMsIGttcF9jbXBseDY0IHJocywgaW50IGZsYWcpOwora21wX2NtcGx4NjQgX19rbXBjX2F0b21pY19jbXBseDhfZGl2X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDY0ICogbGhzLCBrbXBfY21wbHg2NCByaHMsIGludCBmbGFnKTsKK2ttcF9jbXBseDgwIF9fa21wY19hdG9taWNfY21wbHgxMF9hZGRfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg4MCAqIGxocywga21wX2NtcGx4ODAgcmhzLCBpbnQgZmxhZyk7CitrbXBfY21wbHg4MCBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3ViX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4ODAgKiBsaHMsIGttcF9jbXBseDgwIHJocywgaW50IGZsYWcpOwora21wX2NtcGx4ODAgX19rbXBjX2F0b21pY19jbXBseDEwX211bF9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDgwICogbGhzLCBrbXBfY21wbHg4MCByaHMsIGludCBmbGFnKTsKK2ttcF9jbXBseDgwIF9fa21wY19hdG9taWNfY21wbHgxMF9kaXZfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg4MCAqIGxocywga21wX2NtcGx4ODAgcmhzLCBpbnQgZmxhZyk7CisjaWYgS01QX0hBVkVfUVVBRAorQ1BMWDEyOF9MRUcgX19rbXBjX2F0b21pY19jbXBseDE2X2FkZF9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIENQTFgxMjhfTEVHICogbGhzLCBDUExYMTI4X0xFRyByaHMsIGludCBmbGFnKTsKK0NQTFgxMjhfTEVHIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBDUExYMTI4X0xFRyAqIGxocywgQ1BMWDEyOF9MRUcgcmhzLCBpbnQgZmxhZyk7CitDUExYMTI4X0xFRyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgQ1BMWDEyOF9MRUcgKiBsaHMsIENQTFgxMjhfTEVHIHJocywgaW50IGZsYWcpOworQ1BMWDEyOF9MRUcgX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIENQTFgxMjhfTEVHICogbGhzLCBDUExYMTI4X0xFRyByaHMsIGludCBmbGFnKTsKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgLy8gUm91dGluZXMgd2l0aCAxNi1ieXRlIGFyZ3VtZW50cyBhbGlnbmVkIHRvIDE2LWJ5dGUgYm91bmRhcnkKKyAgICBRdWFkX2ExNl90IF9fa21wY19hdG9taWNfZmxvYXQxNl9hZGRfYTE2X2NwdCggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIFF1YWRfYTE2X3QgKiBsaHMsIFF1YWRfYTE2X3QgcmhzLCBpbnQgZmxhZyk7CisgICAgUXVhZF9hMTZfdCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2ExNl9jcHQoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBRdWFkX2ExNl90ICogbGhzLCBRdWFkX2ExNl90IHJocywgaW50IGZsYWcpOworICAgIFF1YWRfYTE2X3QgX19rbXBjX2F0b21pY19mbG9hdDE2X211bF9hMTZfY3B0KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAqIGxocywgUXVhZF9hMTZfdCByaHMsIGludCBmbGFnKTsKKyAgICBRdWFkX2ExNl90IF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfYTE2X2NwdCggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIFF1YWRfYTE2X3QgKiBsaHMsIFF1YWRfYTE2X3QgcmhzLCBpbnQgZmxhZyk7CisgICAgUXVhZF9hMTZfdCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWF4X2ExNl9jcHQoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBRdWFkX2ExNl90ICogbGhzLCBRdWFkX2ExNl90IHJocywgaW50IGZsYWcpOworICAgIFF1YWRfYTE2X3QgX19rbXBjX2F0b21pY19mbG9hdDE2X21pbl9hMTZfY3B0KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAqIGxocywgUXVhZF9hMTZfdCByaHMsIGludCBmbGFnKTsKKyAgICBrbXBfY21wbHgxMjhfYTE2X3QgX19rbXBjX2F0b21pY19jbXBseDE2X2FkZF9hMTZfY3B0KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MTI4X2ExNl90ICogbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgcmhzLCBpbnQgZmxhZyk7CisgICAga21wX2NtcGx4MTI4X2ExNl90IF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfYTE2X2NwdCggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDEyOF9hMTZfdCAqIGxocywga21wX2NtcGx4MTI4X2ExNl90IHJocywgaW50IGZsYWcpOworICAgIGttcF9jbXBseDEyOF9hMTZfdCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsX2ExNl9jcHQoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgxMjhfYTE2X3QgKiBsaHMsIGttcF9jbXBseDEyOF9hMTZfdCByaHMsIGludCBmbGFnKTsKKyAgICBrbXBfY21wbHgxMjhfYTE2X3QgX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9hMTZfY3B0KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MTI4X2ExNl90ICogbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgcmhzLCBpbnQgZmxhZyk7CisjZW5kaWYKKyNlbmRpZgorCit2b2lkIF9fa21wY19hdG9taWNfc3RhcnQodm9pZCk7Cit2b2lkIF9fa21wY19hdG9taWNfZW5kKHZvaWQpOworCisjaWYgT01QXzQwX0VOQUJMRUQKKworLy8gT3Blbk1QIDQuMDogdiA9IHggPSBleHByIGJpbm9wIHg7IHsgdiA9IHg7IHggPSBleHByIGJpbm9wIHg7IH0geyB4ID0gZXhwciBiaW5vcCB4OyB2ID0geDsgfSAgZm9yIG5vbi1jb21tdXRhdGl2ZSBvcGVyYXRpb25zLgorCitjaGFyCSAgICAgICAJX19rbXBjX2F0b21pY19maXhlZDFfc3ViX2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocywgaW50IGZsYWcgKTsKK2NoYXIJCV9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9jcHRfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMsIGludCBmbGFnICk7Cit1bnNpZ25lZCBjaGFyIAlfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X2NwdF9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHVuc2lnbmVkIGNoYXIgKiBsaHMsIHVuc2lnbmVkIGNoYXIgcmhzLCBpbnQgZmxhZyApOworY2hhciAJCV9fa21wY19hdG9taWNfZml4ZWQxX3NobF9jcHRfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgLCBpbnQgZmxhZyk7CitjaGFyCQlfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaHJfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzLCBpbnQgZmxhZyApOwordW5zaWduZWQgY2hhciAJX19rbXBjX2F0b21pY19maXhlZDF1X3Nocl9jcHRfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBjaGFyICogbGhzLCB1bnNpZ25lZCBjaGFyIHJocywgaW50IGZsYWcgKTsKK3Nob3J0IAkJX19rbXBjX2F0b21pY19maXhlZDJfc3ViX2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzLCBpbnQgZmxhZyApOworc2hvcnQgCQlfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMsIGludCBmbGFnICk7Cit1bnNpZ25lZCBzaG9ydCAJX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9jcHRfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBzaG9ydCAqIGxocywgdW5zaWduZWQgc2hvcnQgcmhzLCBpbnQgZmxhZyApOworc2hvcnQgCQlfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaGxfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMsIGludCBmbGFnICk7CitzaG9ydCAJCV9fa21wY19hdG9taWNfZml4ZWQyX3Nocl9jcHRfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocywgaW50IGZsYWcgKTsKK3Vuc2lnbmVkIHNob3J0IAlfX2ttcGNfYXRvbWljX2ZpeGVkMnVfc2hyX2NwdF9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHVuc2lnbmVkIHNob3J0ICogbGhzLCB1bnNpZ25lZCBzaG9ydCByaHMsIGludCBmbGFnICk7CitrbXBfaW50MzIgCV9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9jcHRfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICAqIGxocywga21wX2ludDMyICByaHMsIGludCBmbGFnICk7CitrbXBfaW50MzIgCV9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9jcHRfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICAqIGxocywga21wX2ludDMyICByaHMsIGludCBmbGFnICk7CitrbXBfdWludDMyIAlfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X2NwdF9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50MzIgKiBsaHMsIGttcF91aW50MzIgcmhzLCBpbnQgZmxhZyApOwora21wX2ludDMyIAlfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaGxfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgKiBsaHMsIGttcF9pbnQzMiAgcmhzLCBpbnQgZmxhZyApOwora21wX2ludDMyIAlfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHJfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgKiBsaHMsIGttcF9pbnQzMiAgcmhzLCBpbnQgZmxhZyApOwora21wX3VpbnQzMiAJX19rbXBjX2F0b21pY19maXhlZDR1X3Nocl9jcHRfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDMyICogbGhzLCBrbXBfdWludDMyIHJocywgaW50IGZsYWcgKTsKK2ttcF9pbnQ2NCAJX19rbXBjX2F0b21pY19maXhlZDhfc3ViX2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgICogbGhzLCBrbXBfaW50NjQgIHJocywgaW50IGZsYWcgKTsKK2ttcF9pbnQ2NCAJX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgICogbGhzLCBrbXBfaW50NjQgIHJocywgaW50IGZsYWcgKTsKK2ttcF91aW50NjQgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2X2NwdF9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50NjQgKiBsaHMsIGttcF91aW50NjQgcmhzLCBpbnQgZmxhZyApOwora21wX2ludDY0IAlfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaGxfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAgKiBsaHMsIGttcF9pbnQ2NCAgcmhzLCBpbnQgZmxhZyApOwora21wX2ludDY0IAlfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHJfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAgKiBsaHMsIGttcF9pbnQ2NCAgcmhzLCBpbnQgZmxhZyApOwora21wX3VpbnQ2NCAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zaHJfY3B0X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3VpbnQ2NCAqIGxocywga21wX3VpbnQ2NCByaHMsIGludCBmbGFnICk7CitmbG9hdCAJCV9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9jcHRfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgZmxvYXQgKiBsaHMsIGZsb2F0IHJocywgaW50IGZsYWcgKTsKK2Zsb2F0IAkJX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBmbG9hdCAqIGxocywgZmxvYXQgcmhzLCBpbnQgZmxhZyApOworZG91YmxlIAkJX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBkb3VibGUgKiBsaHMsIGRvdWJsZSByaHMsIGludCBmbGFnICk7Citkb3VibGUgCQlfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGRvdWJsZSAqIGxocywgZG91YmxlIHJocywgaW50IGZsYWcgKTsKK2xvbmcgZG91YmxlIAlfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViX2NwdF9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICogbGhzLCBsb25nIGRvdWJsZSByaHMsIGludCBmbGFnICk7Citsb25nIGRvdWJsZSAJX19rbXBjX2F0b21pY19mbG9hdDEwX2Rpdl9jcHRfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgbG9uZyBkb3VibGUgcmhzLCBpbnQgZmxhZyApOworI2lmIEtNUF9IQVZFX1FVQUQKK1FVQURfTEVHQUNZCV9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfY3B0X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocywgaW50IGZsYWcgKTsKK1FVQURfTEVHQUNZCV9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfY3B0X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocywgaW50IGZsYWcgKTsKKyNlbmRpZgorLy8gV29ya2Fyb3VuZCBmb3IgY21wbHg0IHJvdXRpbmVzIC0gcmV0dXJuIHZvaWQ7IGNhcHR1cmVkIHZhbHVlIGlzIHJldHVybmVkIHZpYSB0aGUgYXJndW1lbnQKK3ZvaWQgICAgIAlfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWJfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHgzMiByaHMsIGttcF9jbXBseDMyICogb3V0LCBpbnQgZmxhZyApOwordm9pZCAJICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXZfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHgzMiByaHMsIGttcF9jbXBseDMyICogb3V0LCBpbnQgZmxhZyApOwora21wX2NtcGx4NjQgCV9fa21wY19hdG9taWNfY21wbHg4X3N1Yl9jcHRfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4NjQgKiBsaHMsIGttcF9jbXBseDY0IHJocywgaW50IGZsYWcgKTsKK2ttcF9jbXBseDY0IAlfX2ttcGNfYXRvbWljX2NtcGx4OF9kaXZfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDY0ICogbGhzLCBrbXBfY21wbHg2NCByaHMsIGludCBmbGFnICk7CitrbXBfY21wbHg4MCAJX19rbXBjX2F0b21pY19jbXBseDEwX3N1Yl9jcHRfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg4MCAqIGxocywga21wX2NtcGx4ODAgcmhzLCBpbnQgZmxhZyApOwora21wX2NtcGx4ODAgCV9fa21wY19hdG9taWNfY21wbHgxMF9kaXZfY3B0X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4ODAgKiBsaHMsIGttcF9jbXBseDgwIHJocywgaW50IGZsYWcgKTsKKyNpZiBLTVBfSEFWRV9RVUFECitDUExYMTI4X0xFRyAgCV9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfY3B0X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgQ1BMWDEyOF9MRUcgKiBsaHMsIENQTFgxMjhfTEVHIHJocywgaW50IGZsYWcgKTsKK0NQTFgxMjhfTEVHICAJX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9jcHRfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBDUExYMTI4X0xFRyAqIGxocywgQ1BMWDEyOF9MRUcgcmhzLCBpbnQgZmxhZyApOworI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICBRdWFkX2ExNl90IAkJX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9hMTZfY3B0X3JldiggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIFF1YWRfYTE2X3QgKiBsaHMsIFF1YWRfYTE2X3QgcmhzLCBpbnQgZmxhZyApOworICAgIFF1YWRfYTE2X3QJCV9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfYTE2X2NwdF9yZXYoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBRdWFkX2ExNl90ICogbGhzLCBRdWFkX2ExNl90IHJocywgaW50IGZsYWcgKTsKKyAgICBrbXBfY21wbHgxMjhfYTE2X3QgCV9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfYTE2X2NwdF9yZXYoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgxMjhfYTE2X3QgKiBsaHMsIGttcF9jbXBseDEyOF9hMTZfdCByaHMsIGludCBmbGFnICk7CisgICAga21wX2NtcGx4MTI4X2ExNl90IAlfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2X2ExNl9jcHRfcmV2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MTI4X2ExNl90ICogbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgcmhzLCBpbnQgZmxhZyApOworI2VuZGlmCisjZW5kaWYKKworLy8gICBPcGVuTVAgNC4wIENhcHR1cmUtd3JpdGUgKHN3YXApOiB7diA9IHg7IHggPSBleHByO30KK2NoYXIgCQlfX2ttcGNfYXRvbWljX2ZpeGVkMV9zd3AoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICAgICAgICAqIGxocywgY2hhciAgICAgICAgcmhzICk7CitzaG9ydCAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfc3dwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgICAgICAgKiBsaHMsIHNob3J0ICAgICAgIHJocyApOwora21wX2ludDMyICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3N3cCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgICogbGhzLCBrbXBfaW50MzIgICByaHMgKTsKK2ttcF9pbnQ2NCAJX19rbXBjX2F0b21pY19maXhlZDhfc3dwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICAgKiBsaHMsIGttcF9pbnQ2NCAgIHJocyApOworZmxvYXQgCQlfX2ttcGNfYXRvbWljX2Zsb2F0NF9zd3AoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBmbG9hdCAgICAgICAqIGxocywgZmxvYXQgIHJocyApOworZG91YmxlCQlfX2ttcGNfYXRvbWljX2Zsb2F0OF9zd3AoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBkb3VibGUgICAgICAqIGxocywgZG91YmxlICByaHMgKTsKK2xvbmcgZG91YmxlCV9fa21wY19hdG9taWNfZmxvYXQxMF9zd3AoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICogbGhzLCBsb25nIGRvdWJsZSByaHMgKTsKKyNpZiBLTVBfSEFWRV9RVUFECitRVUFEX0xFR0FDWSAgICAJX19rbXBjX2F0b21pY19mbG9hdDE2X3N3cCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocyApOworI2VuZGlmCisvLyAhISEgVE9ETzogY2hlY2sgaWYgd2UgbmVlZCBhIHdvcmthcm91bmQgaGVyZQordm9pZCAgICAgICAgCV9fa21wY19hdG9taWNfY21wbHg0X3N3cCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHgzMiByaHMsIGttcF9jbXBseDMyICogb3V0ICk7CisvL2ttcF9jbXBseDMyICAgCV9fa21wY19hdG9taWNfY21wbHg0X3N3cCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHgzMiByaHMgKTsKKwora21wX2NtcGx4NjQgCV9fa21wY19hdG9taWNfY21wbHg4X3N3cCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDY0ICogbGhzLCBrbXBfY21wbHg2NCByaHMgKTsKK2ttcF9jbXBseDgwCV9fa21wY19hdG9taWNfY21wbHgxMF9zd3AoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDgwICogbGhzLCBrbXBfY21wbHg4MCByaHMgKTsKKyNpZiBLTVBfSEFWRV9RVUFECitDUExYMTI4X0xFRyAJX19rbXBjX2F0b21pY19jbXBseDE2X3N3cCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgQ1BMWDEyOF9MRUcgKiBsaHMsIENQTFgxMjhfTEVHIHJocyApOworI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICBRdWFkX2ExNl90CQlfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYTE2X3N3cCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAqIGxocywgUXVhZF9hMTZfdCByaHMgKTsKKyAgICBrbXBfY21wbHgxMjhfYTE2X3QgCV9fa21wY19hdG9taWNfY21wbHgxNl9hMTZfc3dwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgxMjhfYTE2X3QgKiBsaHMsIGttcF9jbXBseDEyOF9hMTZfdCByaHMgKTsKKyNlbmRpZgorI2VuZGlmCisKKy8vIEVuZCBvZiBPcGVuTVAgNC4wIGNhcHR1cmUKKworI2VuZGlmIC8vT01QXzQwX0VOQUJMRUQKKworI2VuZGlmIC8vS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICB9IC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgLyogS01QX0FUT01JQ19IICovCisKKy8vIGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfY2FuY2VsLmNwcCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9jYW5jZWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YTc2ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfY2FuY2VsLmNwcApAQCAtMCwwICsxLDI4MiBAQAorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorI2luY2x1ZGUgImttcF9pby5oIgorI2luY2x1ZGUgImttcF9zdHIuaCIKKworI2lmIE9NUF80MF9FTkFCTEVECisKKy8qIQorQGluZ3JvdXAgQ0FOQ0VMTEFUSU9OCitAcGFyYW0gbG9jX3JlZiBsb2NhdGlvbiBvZiB0aGUgb3JpZ2luYWwgdGFzayBkaXJlY3RpdmUKK0BwYXJhbSBndGlkIEdsb2JhbCB0aHJlYWQgSUQgb2YgZW5jb3VudGVyaW5nIHRocmVhZAorQHBhcmFtIGNuY2xfa2luZCBDYW5jZWxsYXRpb24ga2luZCAocGFyYWxsZWwsIGZvciwgc2VjdGlvbnMsIHRhc2tncm91cCkKKworQHJldHVybiByZXR1cm5zIHRydWUgaWYgdGhlIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGhhcyBiZWVuIGFjdGl2YXRlZCBhbmQgdGhlIGV4ZWN1dGlvbiB0aHJlYWQKK25lZWRzIHRvIHByb2NlZWQgdG8gdGhlIGVuZCBvZiB0aGUgY2FuY2VsZWQgcmVnaW9uLgorCitSZXF1ZXN0IGNhbmNlbGxhdGlvbiBvZiB0aGUgYmluZGluZyBPcGVuTVAgcmVnaW9uLgorKi8KK2ttcF9pbnQzMiBfX2ttcGNfY2FuY2VsKGlkZW50X3QqIGxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgY25jbF9raW5kKSB7CisgICAga21wX2luZm9fdCAqdGhpc190aHIgPSBfX2ttcF90aHJlYWRzIFsgZ3RpZCBdOworICAgIAorICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfY2FuY2VsOiBUIyVkIHJlcXVlc3QgJWQgT01QX0NBTkNFTExBVElPTj0lZFxuIiwgZ3RpZCwgY25jbF9raW5kLCBfX2ttcF9vbXBfY2FuY2VsbGF0aW9uKSApOworCisgICAgS01QX0RFQlVHX0FTU0VSVChjbmNsX2tpbmQgIT0gY2FuY2VsX25vcmVxKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKGNuY2xfa2luZCA9PSBjYW5jZWxfcGFyYWxsZWwgfHwgY25jbF9raW5kID09IGNhbmNlbF9sb29wIHx8IAorICAgICAgICAgICAgICAgICAgICAgY25jbF9raW5kID09IGNhbmNlbF9zZWN0aW9ucyB8fCBjbmNsX2tpbmQgPT0gY2FuY2VsX3Rhc2tncm91cCk7IAorICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfZ2V0X2d0aWQoKSA9PSBndGlkKTsKKworICAgIGlmIChfX2ttcF9vbXBfY2FuY2VsbGF0aW9uKSB7CisgICAgICAgIHN3aXRjaCAoY25jbF9raW5kKSB7CisgICAgICAgIGNhc2UgY2FuY2VsX3BhcmFsbGVsOgorICAgICAgICBjYXNlIGNhbmNlbF9sb29wOgorICAgICAgICBjYXNlIGNhbmNlbF9zZWN0aW9uczoKKyAgICAgICAgICAgIC8vIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyBmb3IgcGFyYWxsZWwgYW5kIHdvcmtzaGFyaW5nIGNvbnN0cnVjdHMKKyAgICAgICAgICAgIC8vIGFyZSBoYW5kbGVkIHRocm91Z2ggdGhlIHRlYW0gc3RydWN0dXJlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAga21wX3RlYW1fdCAqdGhpc190ZWFtID0gdGhpc190aHItPnRoLnRoX3RlYW07CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0aGlzX3RlYW0pOworICAgICAgICAgICAgICAgIGttcF9pbnQzMiBvbGQgPSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUMzIoJih0aGlzX3RlYW0tPnQudF9jYW5jZWxfcmVxdWVzdCksIGNhbmNlbF9ub3JlcSwgY25jbF9raW5kKTsKKyAgICAgICAgICAgICAgICBpZiAob2xkID09IGNhbmNlbF9ub3JlcSB8fCBvbGQgPT0gY25jbF9raW5kKSB7CisgICAgICAgICAgICAgICAgICAgIC8vcHJpbnRmKCJfX2ttcGNfY2FuY2VsOiB0aGlzX3RlYW0tPnQudF9jYW5jZWxfcmVxdWVzdD0lZCBAICVwXG4iLCAKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgdGhpc190ZWFtLT50LnRfY2FuY2VsX3JlcXVlc3QsICYodGhpc190ZWFtLT50LnRfY2FuY2VsX3JlcXVlc3QpKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gd2UgZG8gbm90IGhhdmUgYSBjYW5jZWxsYXRpb24gcmVxdWVzdCBpbiB0aGlzIHRlYW0gb3Igd2UgZG8gaGF2ZSBvbmUKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBtYXRjaGVzIHRoZSBjdXJyZW50IHJlcXVlc3QgLT4gY2FuY2VsCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIHRydWUgKi87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICBjYXNlIGNhbmNlbF90YXNrZ3JvdXA6CisgICAgICAgICAgICAvLyBjYW5jZWxsYXRpb24gcmVxdWVzdHMgZm9yIHBhcmFsbGVsIGFuZCB3b3Jrc2hhcmluZyBjb25zdHJ1Y3RzCisgICAgICAgICAgICAvLyBhcmUgaGFuZGxlZCB0aHJvdWdoIHRoZSB0YXNrZ3JvdXAgc3RydWN0dXJlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAga21wX3Rhc2tkYXRhX3QqICB0YXNrOyAKKyAgICAgICAgICAgICAgICBrbXBfdGFza2dyb3VwX3QqIHRhc2tncm91cDsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB0YXNrID0gdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzazsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrICk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdGFza2dyb3VwID0gdGFzay0+dGRfdGFza2dyb3VwOworICAgICAgICAgICAgICAgIGlmICh0YXNrZ3JvdXApIHsKKyAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIG9sZCA9IEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQzMigmKHRhc2tncm91cC0+Y2FuY2VsX3JlcXVlc3QpLCBjYW5jZWxfbm9yZXEsIGNuY2xfa2luZCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvbGQgPT0gY2FuY2VsX25vcmVxIHx8IG9sZCA9PSBjbmNsX2tpbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGRvIG5vdCBoYXZlIGEgY2FuY2VsbGF0aW9uIHJlcXVlc3QgaW4gdGhpcyB0YXNrZ3JvdXAgb3Igd2UgZG8gaGF2ZSBvbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgbWF0Y2hlcyB0aGUgY3VycmVudCByZXF1ZXN0IC0+IGNhbmNlbAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogdHJ1ZSAqLzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogd2hhdCBuZWVkcyB0byBoYXBwZW4gaGVyZT8KKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNwZWNpZmljYXRpb24gZGlzYWxsb3dzIGNhbmNlbGxhdGlvbiB3L28gdGFza2dyb3VwcworICAgICAgICAgICAgICAgICAgICAvLyBzbyB3ZSBtaWdodCBkbyBhbnl0aGluZyBoZXJlLCBsZXQncyBhYm9ydCBmb3Igbm93CisgICAgICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoIDAgLyogZmFsc2UgKi8pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgS01QX0FTU0VSVCAoMCAvKiBmYWxzZSAqLyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJQ1YgT01QX0NBTkNFTExBVElPTj1mYWxzZSwgc28gd2UgaWdub3JlZCB0aGlzIGNhbmNlbCByZXF1ZXN0CisgICAgS01QX0RFQlVHX0FTU0VSVCghX19rbXBfb21wX2NhbmNlbGxhdGlvbik7CisgICAgcmV0dXJuIDAgLyogZmFsc2UgKi87Cit9CisKKy8qIQorQGluZ3JvdXAgQ0FOQ0VMTEFUSU9OCitAcGFyYW0gbG9jX3JlZiBsb2NhdGlvbiBvZiB0aGUgb3JpZ2luYWwgdGFzayBkaXJlY3RpdmUKK0BwYXJhbSBndGlkIEdsb2JhbCB0aHJlYWQgSUQgb2YgZW5jb3VudGVyaW5nIHRocmVhZAorQHBhcmFtIGNuY2xfa2luZCBDYW5jZWxsYXRpb24ga2luZCAocGFyYWxsZWwsIGZvciwgc2VjdGlvbnMsIHRhc2tncm91cCkKKworQHJldHVybiByZXR1cm5zIHRydWUgaWYgYSBtYXRjaGluZyBjYW5jZWxsYXRpb24gcmVxdWVzdCBoYXMgYmVlbiBmbGFnZ2VkIGluIHRoZSBSVEwgYW5kIHRoZSAKK2VuY291bnRlcmluZyB0aHJlYWQgaGFzIHRvIGNhbmNlbC4uCisKK0NhbmNlbGxhdGlvbiBwb2ludCBmb3IgdGhlIGVuY291bnRlcmluZyB0aHJlYWQuCisqLwora21wX2ludDMyIF9fa21wY19jYW5jZWxsYXRpb25wb2ludChpZGVudF90KiBsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyIGNuY2xfa2luZCkgeworICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gX19rbXBfdGhyZWFkcyBbIGd0aWQgXTsKKworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfY2FuY2VsbGF0aW9ucG9pbnQ6IFQjJWQgcmVxdWVzdCAlZCBPTVBfQ0FOQ0VMTEFUSU9OPSVkXG4iLCBndGlkLCBjbmNsX2tpbmQsIF9fa21wX29tcF9jYW5jZWxsYXRpb24pICk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKGNuY2xfa2luZCAhPSBjYW5jZWxfbm9yZXEpOworICAgIEtNUF9ERUJVR19BU1NFUlQoY25jbF9raW5kID09IGNhbmNlbF9wYXJhbGxlbCB8fCBjbmNsX2tpbmQgPT0gY2FuY2VsX2xvb3AgfHwgCisgICAgICAgICAgICAgICAgICAgICBjbmNsX2tpbmQgPT0gY2FuY2VsX3NlY3Rpb25zIHx8IGNuY2xfa2luZCA9PSBjYW5jZWxfdGFza2dyb3VwKTsgCisgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9nZXRfZ3RpZCgpID09IGd0aWQpOworCisgICAgaWYgKF9fa21wX29tcF9jYW5jZWxsYXRpb24pIHsKKyAgICAgICAgc3dpdGNoIChjbmNsX2tpbmQpIHsKKyAgICAgICAgY2FzZSBjYW5jZWxfcGFyYWxsZWw6CisgICAgICAgIGNhc2UgY2FuY2VsX2xvb3A6CisgICAgICAgIGNhc2UgY2FuY2VsX3NlY3Rpb25zOgorICAgICAgICAgICAgLy8gY2FuY2VsbGF0aW9uIHJlcXVlc3RzIGZvciBwYXJhbGxlbCBhbmQgd29ya3NoYXJpbmcgY29uc3RydWN0cworICAgICAgICAgICAgLy8gYXJlIGhhbmRsZWQgdGhyb3VnaCB0aGUgdGVhbSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBrbXBfdGVhbV90ICp0aGlzX3RlYW0gPSB0aGlzX3Roci0+dGgudGhfdGVhbTsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHRoaXNfdGVhbSk7CisgICAgICAgICAgICAgICAgaWYgKHRoaXNfdGVhbS0+dC50X2NhbmNlbF9yZXF1ZXN0KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbmNsX2tpbmQgPT0gdGhpc190ZWFtLT50LnRfY2FuY2VsX3JlcXVlc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZXF1ZXN0IGluIHRoZSB0ZWFtIHN0cnVjdHVyZSBtYXRjaGVzIHRoZSB0eXBlIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW5jZWxsYXRpb24gcG9pbnQgc28gd2UgY2FuIGNhbmNlbAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogdHJ1ZSAqLzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKCAwIC8qIGZhbHNlICovKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHdlIGRvIG5vdCBoYXZlIGEgY2FuY2VsbGF0aW9uIHJlcXVlc3QgcGVuZGluZywgc28gd2UganVzdAorICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgdGhpcyBjYW5jZWxsYXRpb24gcG9pbnQKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICBjYXNlIGNhbmNlbF90YXNrZ3JvdXA6CisgICAgICAgICAgICAvLyBjYW5jZWxsYXRpb24gcmVxdWVzdHMgZm9yIHBhcmFsbGVsIGFuZCB3b3Jrc2hhcmluZyBjb25zdHJ1Y3RzCisgICAgICAgICAgICAvLyBhcmUgaGFuZGxlZCB0aHJvdWdoIHRoZSB0YXNrZ3JvdXAgc3RydWN0dXJlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAga21wX3Rhc2tkYXRhX3QqICB0YXNrOyAKKyAgICAgICAgICAgICAgICBrbXBfdGFza2dyb3VwX3QqIHRhc2tncm91cDsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB0YXNrID0gdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzazsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrICk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdGFza2dyb3VwID0gdGFzay0+dGRfdGFza2dyb3VwOworICAgICAgICAgICAgICAgIGlmICh0YXNrZ3JvdXApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHRoZSBjdXJyZW50IHN0YXR1cyBvZiBjYW5jZWxsYXRpb24gZm9yIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgLy8gdGFza2dyb3VwCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIXRhc2tncm91cC0+Y2FuY2VsX3JlcXVlc3Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBpZiBhIGNhbmNlbGxhdGlvbiBwb2ludCBpcyBlbmNvdW50ZXJlZCBieSBhIHRhc2sKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBkb2VzIG5vdCBiZWxvbmcgdG8gYSB0YXNrZ3JvdXAsIGl0IGlzIE9LCisgICAgICAgICAgICAgICAgICAgIC8vIHRvIGlnbm9yZSBpdAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCAvKiBmYWxzZSAqLzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBLTVBfQVNTRVJUICgwIC8qIGZhbHNlICovKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIElDViBPTVBfQ0FOQ0VMTEFUSU9OPWZhbHNlLCBzbyB3ZSBpZ25vcmUgdGhlIGNhbmNlbGxhdGlvbiBwb2ludAorICAgIEtNUF9ERUJVR19BU1NFUlQoIV9fa21wX29tcF9jYW5jZWxsYXRpb24pOworICAgIHJldHVybiAwIC8qIGZhbHNlICovOworfQorCisvKiEKK0Bpbmdyb3VwIENBTkNFTExBVElPTgorQHBhcmFtIGxvY19yZWYgbG9jYXRpb24gb2YgdGhlIG9yaWdpbmFsIHRhc2sgZGlyZWN0aXZlCitAcGFyYW0gZ3RpZCBHbG9iYWwgdGhyZWFkIElEIG9mIGVuY291bnRlcmluZyB0aHJlYWQKKworQHJldHVybiByZXR1cm5zIHRydWUgaWYgYSBtYXRjaGluZyBjYW5jZWxsYXRpb24gcmVxdWVzdCBoYXMgYmVlbiBmbGFnZ2VkIGluIHRoZSBSVEwgYW5kIHRoZSAKK2VuY291bnRlcmluZyB0aHJlYWQgaGFzIHRvIGNhbmNlbC4uCisKK0JhcnJpZXIgd2l0aCBjYW5jZWxsYXRpb24gcG9pbnQgdG8gc2VuZCB0aHJlYWRzIGZyb20gdGhlIGJhcnJpZXIgdG8gdGhlCitlbmQgb2YgdGhlIHBhcmFsbGVsIHJlZ2lvbi4gIE5lZWRzIGEgc3BlY2lhbCBjb2RlIHBhdHRlcm4gYXMgZG9jdW1lbnRlZCAKK2luIHRoZSBkZXNpZ24gZG9jdW1lbnQgZm9yIHRoZSBjYW5jZWxsYXRpb24gZmVhdHVyZS4KKyovCitrbXBfaW50MzIKK19fa21wY19jYW5jZWxfYmFycmllcihpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkKSB7CisgICAgaW50IHJldCA9IDAgLyogZmFsc2UgKi87CisgICAga21wX2luZm9fdCAqdGhpc190aHIgPSBfX2ttcF90aHJlYWRzIFsgZ3RpZCBdOworICAgIGttcF90ZWFtX3QgKnRoaXNfdGVhbSA9IHRoaXNfdGhyLT50aC50aF90ZWFtOworCisgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9nZXRfZ3RpZCgpID09IGd0aWQpOworCisgICAgLy8gY2FsbCBpbnRvIHRoZSBzdGFuZGFyZCBiYXJyaWVyCisgICAgX19rbXBjX2JhcnJpZXIobG9jLCBndGlkKTsKKworICAgIC8vIGlmIGNhbmNlbGxhdGlvbiBpcyBhY3RpdmUsIGNoZWNrIGNhbmNlbGxhdGlvbiBmbGFnCisgICAgaWYgKF9fa21wX29tcF9jYW5jZWxsYXRpb24pIHsKKyAgICAgICAgLy8gZGVwZW5kaW5nIG9uIHdoaWNoIGNvbnN0cnVjdCB0byBjYW5jZWwsIGNoZWNrIHRoZSBmbGFnIGFuZAorICAgICAgICAvLyByZXNldCB0aGUgZmxhZworICAgICAgICBzd2l0Y2ggKHRoaXNfdGVhbS0+dC50X2NhbmNlbF9yZXF1ZXN0KSB7CisgICAgICAgIGNhc2UgY2FuY2VsX3BhcmFsbGVsOgorICAgICAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IHRocmVhZHMgaGF2ZSBjaGVja2VkIHRoZSBmbGFnLCB3aGVuCisgICAgICAgICAgICAvLyBsZWF2aW5nIHRoZSBhYm92ZSBiYXJyaWVyCisgICAgICAgICAgICBfX2ttcGNfYmFycmllcihsb2MsIGd0aWQpOworICAgICAgICAgICAgdGhpc190ZWFtLT50LnRfY2FuY2VsX3JlcXVlc3QgPSBjYW5jZWxfbm9yZXE7CisgICAgICAgICAgICAvLyB0aGUgbmV4dCBiYXJyaWVyIGlzIHRoZSBmb3JrL2pvaW4gYmFycmllciwgd2hpY2gKKyAgICAgICAgICAgIC8vIHN5bmNocm9uaXplcyB0aGUgdGhyZWFkcyBsZWF2aW5nIGhlcmUgICAgICAgIAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY2FuY2VsX2xvb3A6CisgICAgICAgIGNhc2UgY2FuY2VsX3NlY3Rpb25zOgorICAgICAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IHRocmVhZHMgaGF2ZSBjaGVja2VkIHRoZSBmbGFnLCB3aGVuCisgICAgICAgICAgICAvLyBsZWF2aW5nIHRoZSBhYm92ZSBiYXJyaWVyCisgICAgICAgICAgICBfX2ttcGNfYmFycmllcihsb2MsIGd0aWQpOworICAgICAgICAgICAgdGhpc190ZWFtLT50LnRfY2FuY2VsX3JlcXVlc3QgPSBjYW5jZWxfbm9yZXE7CisgICAgICAgICAgICAvLyBzeW5jaHJvbml6ZSB0aGUgdGhyZWFkcyBhZ2FpbiB0byBtYWtlIHN1cmUgd2UKKyAgICAgICAgICAgIC8vIGRvIG5vdCBoYXZlIGFueSBydW4tYXdheSB0aHJlYWRzIHRoYXQgY2F1c2UgYSByYWNlCisgICAgICAgICAgICAvLyBvbiB0aGUgY2FuY2VsbGF0aW9uIGZsYWcKKyAgICAgICAgICAgIF9fa21wY19iYXJyaWVyKGxvYywgZ3RpZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjYW5jZWxfdGFza2dyb3VwOgorICAgICAgICAgICAgLy8gdGhpcyBjYXNlIHNob3VsZCBub3Qgb2NjdXIKKyAgICAgICAgICAgIEtNUF9BU1NFUlQgKDAgLyogZmFsc2UgKi8gKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNhbmNlbF9ub3JlcToKKyAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgS01QX0FTU0VSVCAoIDAgLyogZmFsc2UgKi8pOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHJldHVybiByZXQ7Cit9CisKKy8qIQorQGluZ3JvdXAgQ0FOQ0VMTEFUSU9OCitAcGFyYW0gbG9jX3JlZiBsb2NhdGlvbiBvZiB0aGUgb3JpZ2luYWwgdGFzayBkaXJlY3RpdmUKK0BwYXJhbSBndGlkIEdsb2JhbCB0aHJlYWQgSUQgb2YgZW5jb3VudGVyaW5nIHRocmVhZAorCitAcmV0dXJuIHJldHVybnMgdHJ1ZSBpZiBhIG1hdGNoaW5nIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGhhcyBiZWVuIGZsYWdnZWQgaW4gdGhlIFJUTCBhbmQgdGhlIAorZW5jb3VudGVyaW5nIHRocmVhZCBoYXMgdG8gY2FuY2VsLi4KKworUXVlcnkgZnVuY3Rpb24gdG8gcXVlcnkgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIGNhbmNlbGxhdGlvbiByZXF1ZXN0cy4KK0NhbiBiZSB1c2VkIHRvIGltcGxlbWVudCB0aGUgZm9sbG93aW5nIHBhdHRlcm46CisgCitpZiAoa21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzKGttcF9jYW5jZWxfcGFyYWxsZWwpKSB7CisgICAgcGVyZm9ybV9jbGVhbnVwKCk7CisgICAgI3ByYWdtYSBvbXAgY2FuY2VsbGF0aW9uIHBvaW50IHBhcmFsbGVsICAgICAgCit9CisqLworaW50IF9fa21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzKGludCBjYW5jZWxfa2luZCkgeworICAgIGlmIChfX2ttcF9vbXBfY2FuY2VsbGF0aW9uKSB7CisgICAgICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gX19rbXBfZW50cnlfdGhyZWFkKCk7CisgICAgICAgIAorICAgICAgICBzd2l0Y2ggKGNhbmNlbF9raW5kKSB7CisgICAgICAgIGNhc2UgY2FuY2VsX3BhcmFsbGVsOgorICAgICAgICBjYXNlIGNhbmNlbF9sb29wOgorICAgICAgICBjYXNlIGNhbmNlbF9zZWN0aW9uczoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBrbXBfdGVhbV90ICp0aGlzX3RlYW0gPSB0aGlzX3Roci0+dGgudGhfdGVhbTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpc190ZWFtLT50LnRfY2FuY2VsX3JlcXVlc3QgPT0gY2FuY2VsX2tpbmQ7CisgICAgICAgICAgICB9CisgICAgICAgIGNhc2UgY2FuY2VsX3Rhc2tncm91cDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBrbXBfdGFza2RhdGFfdCogIHRhc2s7IAorICAgICAgICAgICAgICAgIGttcF90YXNrZ3JvdXBfdCogdGFza2dyb3VwOworICAgICAgICAgICAgICAgIHRhc2sgPSB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrOworICAgICAgICAgICAgICAgIHRhc2tncm91cCA9IHRhc2stPnRkX3Rhc2tncm91cDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGFza2dyb3VwICYmIHRhc2tncm91cC0+Y2FuY2VsX3JlcXVlc3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMCAvKiBmYWxzZSAqLzsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfY3N1cHBvcnQuYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9jc3VwcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MGJkNDEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfY3N1cHBvcnQuYwpAQCAtMCwwICsxLDIzODEgQEAKKy8qCisgKiBrbXBfY3N1cHBvcnQuYyAtLSBrZnJvbnQgbGlua2FnZSBzdXBwb3J0IGZvciBPcGVuTVAuCisgKiAkUmV2aXNpb246IDQyODI2ICQKKyAqICREYXRlOiAyMDEzLTExLTIwIDAzOjM5OjQ1IC0wNjAwIChXZWQsIDIwIE5vdiAyMDEzKSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJvbXAuaCIgICAgICAgIC8qIGV4dGVybiAiQyIgZGVjbGFyYXRpb25zIG9mIHVzZXItdmlzaWJsZSByb3V0aW5lcyAqLworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9pMThuLmgiCisjaW5jbHVkZSAia21wX2l0dC5oIgorI2luY2x1ZGUgImttcF9lcnJvci5oIgorCisjZGVmaW5lIE1BWF9NRVNTQUdFIDUxMgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAgZmxhZ3Mgd2lsbCBiZSB1c2VkIGluIGZ1dHVyZSwgZS5nLiwgdG8gaW1wbGVtZW50ICovCisvKiAgb3Blbm1wX3N0cmljdCBsaWJyYXJ5IHJlc3RyaWN0aW9ucyAgICAgICAgICAgICAgICovCisKKy8qIQorICogQGluZ3JvdXAgU1RBUlRVUF9TSFVURE9XTgorICogQHBhcmFtIGxvYyAgIGluICAgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCisgKiBAcGFyYW0gZmxhZ3MgaW4gICBmb3IgZnV0dXJlIHVzZSAoY3VycmVudGx5IGlnbm9yZWQpCisgKgorICogSW5pdGlhbGl6ZSB0aGUgcnVudGltZSBsaWJyYXJ5LiBUaGlzIGNhbGwgaXMgb3B0aW9uYWw7IGlmIGl0IGlzIG5vdCBtYWRlIHRoZW4KKyAqIGl0IHdpbGwgYmUgaW1wbGljaWx0eSBjYWxsZWQgYnkgYXR0ZW1wdHMgdG8gdXNlIG90aGVyIGxpYnJhcnkgZnVuY3Rpb25zLgorICoKKyAqLwordm9pZAorX19rbXBjX2JlZ2luKGlkZW50X3QgKmxvYywga21wX2ludDMyIGZsYWdzKQoreworICAgIC8vIEJ5IGRlZmF1bHQgX19rbXBfaWdub3JlX21wcGJlZygpIHJldHVybnMgVFJVRS4KKyAgICBpZiAoX19rbXBfaWdub3JlX21wcGJlZygpID09IEZBTFNFKSB7CisgICAgICAgIF9fa21wX2ludGVybmFsX2JlZ2luKCk7CisKKyAgICAgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19iZWdpbjogY2FsbGVkXG4iICkgKTsKKyAgICB9Cit9CisKKy8qIQorICogQGluZ3JvdXAgU1RBUlRVUF9TSFVURE9XTgorICogQHBhcmFtIGxvYyBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KKyAqCisgKiBTaHV0ZG93biB0aGUgcnVudGltZSBsaWJyYXJ5LiBUaGlzIGlzIGFsc28gb3B0aW9uYWwsIGFuZCBldmVuIGlmIGNhbGxlZCB3aWxsIG5vdAorICogZG8gYW55dGhpbmcgdW5sZXNzIHRoZSBgS01QX0lHTk9SRV9NUFBFTkRgIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldCB0byB6ZXJvLgorICAqLwordm9pZAorX19rbXBjX2VuZChpZGVudF90ICpsb2MpCit7CisgICAgLy8gQnkgZGVmYXVsdCwgX19rbXBfaWdub3JlX21wcGVuZCgpIHJldHVybnMgVFJVRSB3aGljaCBtYWtlcyBfX2ttcGNfZW5kKCkgY2FsbCBuby1vcC4KKyAgICAvLyBIb3dldmVyLCB0aGlzIGNhbiBiZSBvdmVycmlkZGVuIHdpdGggS01QX0lHTk9SRV9NUFBFTkQgZW52aXJvbm1lbnQgdmFyaWFibGUuCisgICAgLy8gSWYgS01QX0lHTk9SRV9NUFBFTkQgaXMgMCwgX19rbXBfaWdub3JlX21wcGVuZCgpIHJldHVybnMgRkFMU0UgYW5kIF9fa21wY19lbmQoKQorICAgIC8vIHdpbGwgdW5yZWdpc3RlciB0aGlzIHJvb3QgKGl0IGNhbiBjYXVzZSBsaWJyYXJ5IHNodXQgZG93bikuCisgICAgaWYgKF9fa21wX2lnbm9yZV9tcHBlbmQoKSA9PSBGQUxTRSkgeworICAgICAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2VuZDogY2FsbGVkXG4iICkgKTsKKyAgICAgICAgS0FfVFJBQ0UoIDMwLCAoIl9fa21wY19lbmRcbiIgKSk7CisKKyAgICAgICAgX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZCggLTEgKTsKKyAgICB9Cit9CisKKy8qIQorQGluZ3JvdXAgVEhSRUFEX1NUQVRFUworQHBhcmFtIGxvYyBTb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24uCitAcmV0dXJuIFRoZSBnbG9iYWwgdGhyZWFkIGluZGV4IG9mIHRoZSBhY3RpdmUgdGhyZWFkLgorCitUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgaW4gYW55IGNvbnRleHQuCisKK0lmIHRoZSBydW50aW1lIGhhcyBvbnkgYmVlbiBlbnRlcmVkIGF0IHRoZSBvdXRlcm1vc3QgbGV2ZWwgZnJvbSBhCitzaW5nbGUgKG5lY2Vzc2FyaWx5IG5vbi1PcGVuTVA8c3VwPio8L3N1cD4pIHRocmVhZCwgdGhlbiB0aGUgdGhyZWFkIG51bWJlciBpcyB0aGF0Cit3aGljaCB3b3VsZCBiZSByZXR1cm5lZCBieSBAcmVmIG9tcF9nZXRfdGhyZWFkX251bSgpIGluIHRoZSBvdXRlcm1vc3QKK2FjdGl2ZSBwYXJhbGxlbCBjb25zdHJ1Y3QuIChPciB6ZXJvIGlmIHRoZXJlIGlzIG5vIGFjdGl2ZSBwYXJhbGxlbAorY29uc3RydWN0LCBzaW5jZSB0aGUgbWFzdGVyIHRocmVhZCBpcyBuZWNlc3NhcmlseSB0aHJlYWQgemVybykuCisKK0lmIG11bHRpcGxlIG5vbi1PcGVuTVAgdGhyZWFkcyBhbGwgZW50ZXIgYW4gT3Blbk1QIGNvbnN0cnVjdCB0aGVuIHRoaXMKK3dpbGwgYmUgYSB1bmlxdWUgdGhyZWFkIGlkZW50aWZpZXIgYW1vbmcgYWxsIHRoZSB0aHJlYWRzIGNyZWF0ZWQgYnkKK3RoZSBPcGVuTVAgcnVudGltZSAoYnV0IHRoZSB2YWx1ZSBjYW5ub3RlIGJlIGRlZmluZWQgaW4gdGVybXMgb2YKK09wZW5NUCB0aHJlYWQgaWRzIHJldHVybmVkIGJ5IG9tcF9nZXRfdGhyZWFkX251bSgpKS4KKworKi8KK2ttcF9pbnQzMgorX19rbXBjX2dsb2JhbF90aHJlYWRfbnVtKGlkZW50X3QgKmxvYykKK3sKKyAgICBrbXBfaW50MzIgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfZ2xvYmFsX3RocmVhZF9udW06IFQjJWRcbiIsIGd0aWQgKSApOworCisgICAgcmV0dXJuIGd0aWQ7Cit9CisKKy8qIQorQGluZ3JvdXAgVEhSRUFEX1NUQVRFUworQHBhcmFtIGxvYyBTb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24uCitAcmV0dXJuIFRoZSBudW1iZXIgb2YgdGhyZWFkcyB1bmRlciBjb250cm9sIG9mIHRoZSBPcGVuTVA8c3VwPio8L3N1cD4gcnVudGltZQorCitUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgaW4gYW55IGNvbnRleHQuCitJdCByZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgdGhyZWFkcyB1bmRlciB0aGUgY29udHJvbCBvZiB0aGUgT3Blbk1QIHJ1bnRpbWUuIFRoYXQgaXMKK25vdCBhIG51bWJlciB0aGF0IGNhbiBiZSBkZXRlcm1pbmVkIGJ5IGFueSBPcGVuTVAgc3RhbmRhcmQgY2FsbHMsIHNpbmNlIHRoZSBsaWJyYXJ5IG1heSBiZQorY2FsbGVkIGZyb20gbW9yZSB0aGFuIG9uZSBub24tT3Blbk1QIHRocmVhZCwgYW5kIHRoaXMgcmVmbGVjdHMgdGhlIHRvdGFsIG92ZXIgYWxsIHN1Y2ggY2FsbHMuCitTaW1pbGFybHkgdGhlIHJ1bnRpbWUgbWFpbnRhaW5zIHVuZGVybHlpbmcgdGhyZWFkcyBldmVuIHdoZW4gdGhleSBhcmUgbm90IGFjdGl2ZSAoc2luY2UgdGhlIGNvc3QKK29mIGNyZWF0aW5nIGFuZCBkZXN0cm95aW5nIE9TIHRocmVhZHMgaXMgaGlnaCksIHRoaXMgY2FsbCBjb3VudHMgYWxsIHN1Y2ggdGhyZWFkcyBldmVuIGlmIHRoZXkgYXJlIG5vdAord2FpdGluZyBmb3Igd29yay4KKyovCitrbXBfaW50MzIKK19fa21wY19nbG9iYWxfbnVtX3RocmVhZHMoaWRlbnRfdCAqbG9jKQoreworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfZ2xvYmFsX251bV90aHJlYWRzOiBudW1fdGhyZWFkcyA9ICVkXG4iLCBfX2ttcF9udGggKSApOworCisgICAgcmV0dXJuIFRDUl80KF9fa21wX250aCk7Cit9CisKKy8qIQorQGluZ3JvdXAgVEhSRUFEX1NUQVRFUworQHBhcmFtIGxvYyBTb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24uCitAcmV0dXJuIFRoZSB0aHJlYWQgbnVtYmVyIG9mIHRoZSBjYWxsaW5nIHRocmVhZCBpbiB0aGUgaW5uZXJtb3N0IGFjdGl2ZSBwYXJhbGxlbCBjb25zdHJ1Y3QuCisKKyovCitrbXBfaW50MzIKK19fa21wY19ib3VuZF90aHJlYWRfbnVtKGlkZW50X3QgKmxvYykKK3sKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2JvdW5kX3RocmVhZF9udW06IGNhbGxlZFxuIiApICk7CisgICAgcmV0dXJuIF9fa21wX3RpZF9mcm9tX2d0aWQoIF9fa21wX2VudHJ5X2d0aWQoKSApOworfQorCisvKiEKK0Bpbmdyb3VwIFRIUkVBRF9TVEFURVMKK0BwYXJhbSBsb2MgU291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorQHJldHVybiBUaGUgbnVtYmVyIG9mIHRocmVhZHMgaW4gdGhlIGlubmVybW9zdCBhY3RpdmUgcGFyYWxsZWwgY29uc3RydWN0LgorKi8KK2ttcF9pbnQzMgorX19rbXBjX2JvdW5kX251bV90aHJlYWRzKGlkZW50X3QgKmxvYykKK3sKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2JvdW5kX251bV90aHJlYWRzOiBjYWxsZWRcbiIgKSApOworCisgICAgcmV0dXJuIF9fa21wX2VudHJ5X3RocmVhZCgpIC0+IHRoLnRoX3RlYW0gLT4gdC50X25wcm9jOworfQorCisvKiEKKyAqIEBpbmdyb3VwIERFUFJFQ0FURUQKKyAqIEBwYXJhbSBsb2MgbG9jYXRpb24gZGVzY3JpcHRpb24KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG5lZWQgbm90IGJlIGNhbGxlZC4gSXQgYWx3YXlzIHJldHVybnMgVFJVRS4KKyAqLwora21wX2ludDMyCitfX2ttcGNfb2tfdG9fZm9yayhpZGVudF90ICpsb2MpCit7CisjaWZuZGVmIEtNUF9ERUJVRworCisgICAgcmV0dXJuIFRSVUU7CisKKyNlbHNlCisKKyAgICBjb25zdCBjaGFyICpzZW1pMjsKKyAgICBjb25zdCBjaGFyICpzZW1pMzsKKyAgICBpbnQgbGluZV9ubzsKKworICAgIGlmIChfX2ttcF9wYXJfcmFuZ2UgPT0gMCkgeworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgc2VtaTIgPSBsb2MtPnBzb3VyY2U7CisgICAgaWYgKHNlbWkyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIHNlbWkyID0gc3RyY2hyKHNlbWkyLCAnOycpOworICAgIGlmIChzZW1pMiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICBzZW1pMiA9IHN0cmNocihzZW1pMiArIDEsICc7Jyk7CisgICAgaWYgKHNlbWkyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIGlmIChfX2ttcF9wYXJfcmFuZ2VfZmlsZW5hbWVbMF0pIHsKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSA9IHNlbWkyIC0gMTsKKyAgICAgICAgd2hpbGUgKChuYW1lID4gbG9jLT5wc291cmNlKSAmJiAoKm5hbWUgIT0gJy8nKSAmJiAoKm5hbWUgIT0gJzsnKSkgeworICAgICAgICAgICAgbmFtZS0tOworICAgICAgICB9CisgICAgICAgIGlmICgoKm5hbWUgPT0gJy8nKSB8fCAoKm5hbWUgPT0gJzsnKSkgeworICAgICAgICAgICAgbmFtZSsrOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJuY21wKF9fa21wX3Bhcl9yYW5nZV9maWxlbmFtZSwgbmFtZSwgc2VtaTIgLSBuYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIF9fa21wX3Bhcl9yYW5nZSA8IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgc2VtaTMgPSBzdHJjaHIoc2VtaTIgKyAxLCAnOycpOworICAgIGlmIChfX2ttcF9wYXJfcmFuZ2Vfcm91dGluZVswXSkgeworICAgICAgICBpZiAoKHNlbWkzICE9IE5VTEwpICYmIChzZW1pMyA+IHNlbWkyKQorICAgICAgICAgICYmIChzdHJuY21wKF9fa21wX3Bhcl9yYW5nZV9yb3V0aW5lLCBzZW1pMiArIDEsIHNlbWkzIC0gc2VtaTIgLSAxKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBfX2ttcF9wYXJfcmFuZ2UgPCAwOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzc2NhbmYoc2VtaTMgKyAxLCAiJWQiLCAmbGluZV9ubykgPT0gMSkgeworICAgICAgICBpZiAoKGxpbmVfbm8gPj0gX19rbXBfcGFyX3JhbmdlX2xiKSAmJiAobGluZV9ubyA8PSBfX2ttcF9wYXJfcmFuZ2VfdWIpKSB7CisgICAgICAgICAgICByZXR1cm4gX19rbXBfcGFyX3JhbmdlID4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX19rbXBfcGFyX3JhbmdlIDwgMDsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7CisKKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKworfQorCisvKiEKK0Bpbmdyb3VwIFRIUkVBRF9TVEFURVMKK0BwYXJhbSBsb2MgU291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorQHJldHVybiAxIGlmIHRoaXMgdGhyZWFkIGlzIGV4ZWN1dGluZyBpbnNpZGUgYW4gYWN0aXZlIHBhcmFsbGVsIHJlZ2lvbiwgemVybyBpZiBub3QuCisqLwora21wX2ludDMyCitfX2ttcGNfaW5fcGFyYWxsZWwoIGlkZW50X3QgKmxvYyApCit7CisgICAgcmV0dXJuIF9fa21wX2VudHJ5X3RocmVhZCgpIC0+IHRoLnRoX3Jvb3QgLT4gci5yX2FjdGl2ZTsKK30KKworLyohCitAaW5ncm91cCBQQVJBTExFTAorQHBhcmFtIGxvYyBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KK0BwYXJhbSBnbG9iYWxfdGlkIGdsb2JhbCB0aHJlYWQgbnVtYmVyCitAcGFyYW0gbnVtX3RocmVhZHMgbnVtYmVyIG9mIHRocmVhZHMgcmVxdWVzdGVkIGZvciB0aGlzIHBhcmFsbGVsIGNvbnN0cnVjdAorCitTZXQgdGhlIG51bWJlciBvZiB0aHJlYWRzIHRvIGJlIHVzZWQgYnkgdGhlIG5leHQgZm9yayBzcGF3bmVkIGJ5IHRoaXMgdGhyZWFkLgorVGhpcyBjYWxsIGlzIG9ubHkgcmVxdWlyZWQgaWYgdGhlIHBhcmFsbGVsIGNvbnN0cnVjdCBoYXMgYSBgbnVtX3RocmVhZHNgIGNsYXVzZS4KKyovCit2b2lkCitfX2ttcGNfcHVzaF9udW1fdGhyZWFkcyhpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBfaW50MzIgbnVtX3RocmVhZHMgKQoreworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcGNfcHVzaF9udW1fdGhyZWFkczogZW50ZXIgVCMlZCBudW1fdGhyZWFkcz0lZFxuIiwKKyAgICAgIGdsb2JhbF90aWQsIG51bV90aHJlYWRzICkgKTsKKworICAgIF9fa21wX3B1c2hfbnVtX3RocmVhZHMoIGxvYywgZ2xvYmFsX3RpZCwgbnVtX3RocmVhZHMgKTsKK30KKwordm9pZAorX19rbXBjX3BvcF9udW1fdGhyZWFkcyhpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkICkKK3sKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBjX3BvcF9udW1fdGhyZWFkczogZW50ZXJcbiIgKSApOworCisgICAgLyogdGhlIG51bV90aHJlYWRzIGFyZSBhdXRvbWF0aWNhbGx5IHBvcHBlZCAqLworfQorCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorCit2b2lkCitfX2ttcGNfcHVzaF9wcm9jX2JpbmQoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2ludDMyIHByb2NfYmluZCApCit7CisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wY19wdXNoX3Byb2NfYmluZDogZW50ZXIgVCMlZCBwcm9jX2JpbmQ9JWRcbiIsCisgICAgICBnbG9iYWxfdGlkLCBwcm9jX2JpbmQgKSApOworCisgICAgX19rbXBfcHVzaF9wcm9jX2JpbmQoIGxvYywgZ2xvYmFsX3RpZCwgKGttcF9wcm9jX2JpbmRfdClwcm9jX2JpbmQgKTsKK30KKworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKworLyohCitAaW5ncm91cCBQQVJBTExFTAorQHBhcmFtIGxvYyAgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCitAcGFyYW0gYXJnYyAgdG90YWwgbnVtYmVyIG9mIGFyZ3VtZW50cyBpbiB0aGUgZWxsaXBzaXMKK0BwYXJhbSBtaWNyb3Rhc2sgIHBvaW50ZXIgdG8gY2FsbGJhY2sgcm91dGluZSBjb25zaXN0aW5nIG9mIG91dGxpbmVkIHBhcmFsbGVsIGNvbnN0cnVjdAorQHBhcmFtIC4uLiAgcG9pbnRlcnMgdG8gc2hhcmVkIHZhcmlhYmxlcyB0aGF0IGFyZW4ndCBnbG9iYWwKKworRG8gdGhlIGFjdHVhbCBmb3JrIGFuZCBjYWxsIHRoZSBtaWNyb3Rhc2sgaW4gdGhlIHJlbGV2YW50IG51bWJlciBvZiB0aHJlYWRzLgorKi8KK3ZvaWQKK19fa21wY19mb3JrX2NhbGwoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgYXJnYywga21wY19taWNybyBtaWNyb3Rhc2ssIC4uLikKK3sKKyAgaW50ICAgICAgICAgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgLy8gbWF5YmUgdG8gc2F2ZSB0aHJfc3RhdGUgaXMgZW5vdWdoIGhlcmUKKyAgeworICAgIHZhX2xpc3QgICAgIGFwOworICAgIHZhX3N0YXJ0KCAgIGFwLCBtaWNyb3Rhc2sgKTsKKworICAgIF9fa21wX2ZvcmtfY2FsbCggbG9jLCBndGlkLCBUUlVFLAorICAgICAgICAgICAgYXJnYywKKyAgICAgICAgICAgIFZPTEFUSUxFX0NBU1QobWljcm90YXNrX3QpIG1pY3JvdGFzaywKKyAgICAgICAgICAgIFZPTEFUSUxFX0NBU1QobGF1bmNoX3QpICAgIF9fa21wX2ludm9rZV90YXNrX2Z1bmMsCisvKiBUT0RPOiByZXZlcnQgd29ya2Fyb3VuZCBmb3IgSW50ZWwoUikgNjQgdHJhY2tlciAjOTYgKi8KKyNpZiAoS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSkgJiYgS01QX09TX0xJTlVYCisgICAgICAgICAgICAmYXAKKyNlbHNlCisgICAgICAgICAgICBhcAorI2VuZGlmCisgICAgICAgICAgICApOworICAgIF9fa21wX2pvaW5fY2FsbCggbG9jLCBndGlkICk7CisKKyAgICB2YV9lbmQoIGFwICk7CisgIH0KK30KKworI2lmIE9NUF80MF9FTkFCTEVECisvKiEKK0Bpbmdyb3VwIFBBUkFMTEVMCitAcGFyYW0gbG9jIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGdsb2JhbF90aWQgZ2xvYmFsIHRocmVhZCBudW1iZXIKK0BwYXJhbSBudW1fdGVhbXMgbnVtYmVyIG9mIHRlYW1zIHJlcXVlc3RlZCBmb3IgdGhlIHRlYW1zIGNvbnN0cnVjdAorCitTZXQgdGhlIG51bWJlciBvZiB0ZWFtcyB0byBiZSB1c2VkIGJ5IHRoZSB0ZWFtcyBjb25zdHJ1Y3QuCitUaGlzIGNhbGwgaXMgb25seSByZXF1aXJlZCBpZiB0aGUgdGVhbXMgY29uc3RydWN0IGhhcyBhIGBudW1fdGVhbXNgIGNsYXVzZQorb3IgYSBgdGhyZWFkX2xpbWl0YCBjbGF1c2UgKG9yIGJvdGgpLgorKi8KK3ZvaWQKK19fa21wY19wdXNoX251bV90ZWFtcyhpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBfaW50MzIgbnVtX3RlYW1zLCBrbXBfaW50MzIgbnVtX3RocmVhZHMgKQoreworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcGNfcHVzaF9udW1fdGVhbXM6IGVudGVyIFQjJWQgbnVtX3RlYW1zPSVkIG51bV90aHJlYWRzPSVkXG4iLAorICAgICAgZ2xvYmFsX3RpZCwgbnVtX3RlYW1zLCBudW1fdGhyZWFkcyApICk7CisKKyAgICBfX2ttcF9wdXNoX251bV90ZWFtcyggbG9jLCBnbG9iYWxfdGlkLCBudW1fdGVhbXMsIG51bV90aHJlYWRzICk7Cit9CisKKy8qIQorQGluZ3JvdXAgUEFSQUxMRUwKK0BwYXJhbSBsb2MgIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGFyZ2MgIHRvdGFsIG51bWJlciBvZiBhcmd1bWVudHMgaW4gdGhlIGVsbGlwc2lzCitAcGFyYW0gbWljcm90YXNrICBwb2ludGVyIHRvIGNhbGxiYWNrIHJvdXRpbmUgY29uc2lzdGluZyBvZiBvdXRsaW5lZCB0ZWFtcyBjb25zdHJ1Y3QKK0BwYXJhbSAuLi4gIHBvaW50ZXJzIHRvIHNoYXJlZCB2YXJpYWJsZXMgdGhhdCBhcmVuJ3QgZ2xvYmFsCisKK0RvIHRoZSBhY3R1YWwgZm9yayBhbmQgY2FsbCB0aGUgbWljcm90YXNrIGluIHRoZSByZWxldmFudCBudW1iZXIgb2YgdGhyZWFkcy4KKyovCit2b2lkCitfX2ttcGNfZm9ya190ZWFtcyhpZGVudF90ICpsb2MsIGttcF9pbnQzMiBhcmdjLCBrbXBjX21pY3JvIG1pY3JvdGFzaywgLi4uKQoreworICAgIGludCAgICAgICAgIGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAga21wX2luZm9fdCAqdGhpc190aHIgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAgdmFfbGlzdCAgICAgYXA7CisgICAgdmFfc3RhcnQoICAgYXAsIG1pY3JvdGFzayApOworCisgICAgLy8gcmVtZW1iZXIgdGVhbXMgZW50cnkgcG9pbnQgYW5kIG5lc3RpbmcgbGV2ZWwKKyAgICB0aGlzX3Roci0+dGgudGhfdGVhbV9taWNyb3Rhc2sgPSBtaWNyb3Rhc2s7CisgICAgdGhpc190aHItPnRoLnRoX3RlYW1zX2xldmVsID0gdGhpc190aHItPnRoLnRoX3RlYW0tPnQudF9sZXZlbDsgLy8gQUM6IGNhbiBiZSA+MCBvbiBob3N0CisKKyAgICAvLyBjaGVjayBpZiBfX2ttcGNfcHVzaF9udW1fdGVhbXMgY2FsbGVkLCBzZXQgZGVmYXVsdCBudW1iZXIgb2YgdGVhbXMgb3RoZXJ3aXNlCisgICAgaWYgKCB0aGlzX3Roci0+dGgudGhfc2V0X250aF90ZWFtcyA9PSAwICkgeworICAgICAgICBfX2ttcF9wdXNoX251bV90ZWFtcyggbG9jLCBndGlkLCAwLCAwICk7CisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQodGhpc190aHItPnRoLnRoX3NldF9ucHJvYyA+PSAxKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRoaXNfdGhyLT50aC50aF9zZXRfbnRoX3RlYW1zID49IDEpOworCisgICAgX19rbXBfZm9ya19jYWxsKCBsb2MsIGd0aWQsIFRSVUUsCisgICAgICAgICAgICBhcmdjLAorICAgICAgICAgICAgVk9MQVRJTEVfQ0FTVChtaWNyb3Rhc2tfdCkgX19rbXBfdGVhbXNfbWFzdGVyLAorICAgICAgICAgICAgVk9MQVRJTEVfQ0FTVChsYXVuY2hfdCkgICAgX19rbXBfaW52b2tlX3RlYW1zX21hc3RlciwKKyNpZiAoS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSkgJiYgS01QX09TX0xJTlVYCisgICAgICAgICAgICAmYXAKKyNlbHNlCisgICAgICAgICAgICBhcAorI2VuZGlmCisgICAgICAgICAgICApOworICAgIF9fa21wX2pvaW5fY2FsbCggbG9jLCBndGlkICk7CisgICAgdGhpc190aHItPnRoLnRoX3RlYW1fbWljcm90YXNrID0gTlVMTDsKKyAgICB0aGlzX3Roci0+dGgudGhfdGVhbXNfbGV2ZWwgPSAwOworCisgICAgdmFfZW5kKCBhcCApOworfQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKworLy8KKy8vIEkgZG9uJ3QgdGhpbmsgdGhpcyBmdW5jdGlvbiBzaG91bGQgZXZlciBoYXZlIGJlZW4gZXhwb3J0ZWQuCisvLyBUaGUgX19rbXBjXyBwcmVmaXggd2FzIG1pc2FwcGxpZWQuICBJJ20gZmFpcmx5IGNlcnRhaW4gdGhhdCBubyBnZW5lcmF0ZWQKKy8vIG9wZW5tcCBjb2RlIGV2ZXIgY2FsbGVkIGl0LCBidXQgaXQncyBiZWVuIGV4cG9ydGVkIGZyb20gdGhlIFJUTCBmb3Igc28KKy8vIGxvbmcgdGhhdCBJJ20gYWZyYWlkIHRvIHJlbW92ZSB0aGUgZGVmaW5pdGlvbi4KKy8vCitpbnQKK19fa21wY19pbnZva2VfdGFza19mdW5jKCBpbnQgZ3RpZCApCit7CisgICAgcmV0dXJuIF9fa21wX2ludm9rZV90YXNrX2Z1bmMoIGd0aWQgKTsKK30KKworLyohCitAaW5ncm91cCBQQVJBTExFTAorQHBhcmFtIGxvYyAgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCitAcGFyYW0gZ2xvYmFsX3RpZCAgZ2xvYmFsIHRocmVhZCBudW1iZXIKKworRW50ZXIgYSBzZXJpYWxpemVkIHBhcmFsbGVsIGNvbnN0cnVjdC4gVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCB0byBoYW5kbGUgYQorY29uZGl0aW9uYWwgcGFyYWxsZWwgcmVnaW9uLCBsaWtlIHRoaXMsCitAY29kZQorI3ByYWdtYSBvbXAgcGFyYWxsZWwgaWYgKGNvbmRpdGlvbikKK0BlbmRjb2RlCit3aGVuIHRoZSBjb25kaXRpb24gaXMgZmFsc2UuCisqLwordm9pZAorX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWwoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCkKK3sKKyAgICBrbXBfaW5mb190ICp0aGlzX3RocjsKKyAgICBrbXBfdGVhbV90ICpzZXJpYWxfdGVhbTsKKworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfc2VyaWFsaXplZF9wYXJhbGxlbDogY2FsbGVkIGJ5IFQjJWRcbiIsIGdsb2JhbF90aWQgKSApOworCisgICAgLyogU2tpcCBhbGwgdGhpcyBjb2RlIGZvciBhdXRvcGFyIHNlcmlhbGl6ZWQgbG9vcHMgc2luY2UgaXQgcmVzdWx0cyBpbgorICAgICAgIHVuYWNjZXB0YWJsZSBvdmVyaGVhZCAqLworICAgIGlmKCBsb2MgIT0gTlVMTCAmJiAobG9jLT5mbGFncyAmIEtNUF9JREVOVF9BVVRPUEFSICkgKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiggISBUQ1JfNCggX19rbXBfaW5pdF9wYXJhbGxlbCApICkKKyAgICAgICAgX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSgpOworCisgICAgdGhpc190aHIgICAgID0gX19rbXBfdGhyZWFkc1sgZ2xvYmFsX3RpZCBdOworICAgIHNlcmlhbF90ZWFtICA9IHRoaXNfdGhyIC0+IHRoLnRoX3NlcmlhbF90ZWFtOworCisgICAgLyogdXRpbGl6ZSB0aGUgc2VyaWFsaXplZCB0ZWFtIGhlbGQgYnkgdGhpcyB0aHJlYWQgKi8KKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzZXJpYWxfdGVhbSApOworICAgIEtNUF9NQigpOworCisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICBpZiAoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICkgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3RociAtPiB0aC50aF90YXNrX3RlYW0gPT0gdGhpc190aHIgLT4gdGgudGhfdGVhbSAtPiB0LnRfdGFza190ZWFtICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHNlcmlhbF90ZWFtIC0+IHQudF90YXNrX3RlYW0gPT0gTlVMTCApOworICAgICAgICBLQV9UUkFDRSggMjAsICggIl9fa21wY19zZXJpYWxpemVkX3BhcmFsbGVsOiBUIyVkIHB1c2hpbmcgdGFza190ZWFtICVwIC8gdGVhbSAlcCwgbmV3IHRhc2tfdGVhbSA9IE5VTExcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfdGlkLCB0aGlzX3RociAtPiB0aC50aF90YXNrX3RlYW0sIHRoaXNfdGhyIC0+IHRoLnRoX3RlYW0gKSApOworICAgICAgICB0aGlzX3RociAtPiB0aC50aF90YXNrX3RlYW0gPSBOVUxMOworICAgIH0KKyNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBrbXBfcHJvY19iaW5kX3QgcHJvY19iaW5kID0gdGhpc190aHItPnRoLnRoX3NldF9wcm9jX2JpbmQ7CisgICAgaWYgKCB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLnByb2NfYmluZCA9PSBwcm9jX2JpbmRfZmFsc2UgKSB7CisgICAgICAgIHByb2NfYmluZCA9IHByb2NfYmluZF9mYWxzZTsKKyAgICB9CisgICAgZWxzZSBpZiAoIHByb2NfYmluZCA9PSBwcm9jX2JpbmRfZGVmYXVsdCApIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gTm8gcHJvY19iaW5kIGNsYXVzZSB3YXMgc3BlY2lmaWVkLCBzbyB1c2UgdGhlIGN1cnJlbnQgdmFsdWUKKyAgICAgICAgLy8gb2YgcHJvYy1iaW5kLXZhciBmb3IgdGhpcyBwYXJhbGxlbCByZWdpb24uCisgICAgICAgIC8vCisgICAgICAgIHByb2NfYmluZCA9IHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMucHJvY19iaW5kOworICAgIH0KKyAgICAvLworICAgIC8vIFJlc2V0IGZvciBuZXh0IHBhcmFsbGVsIHJlZ2lvbgorICAgIC8vCisgICAgdGhpc190aHItPnRoLnRoX3NldF9wcm9jX2JpbmQgPSBwcm9jX2JpbmRfZGVmYXVsdDsKKyNlbmRpZiAvKiBPTVBfM19FTkFCTEVEICovCisKKyAgICBpZiggdGhpc190aHIgLT4gdGgudGhfdGVhbSAhPSBzZXJpYWxfdGVhbSApIHsKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgICAgICAvLyBOZXN0ZWQgbGV2ZWwgd2lsbCBiZSBhbiBpbmRleCBpbiB0aGUgbmVzdGVkIG50aHJlYWRzIGFycmF5CisgICAgICAgIGludCBsZXZlbCA9IHRoaXNfdGhyLT50aC50aF90ZWFtLT50LnRfbGV2ZWw7CisjZW5kaWYKKyAgICAgICAgaWYoIHNlcmlhbF90ZWFtIC0+IHQudF9zZXJpYWxpemVkICkgeworICAgICAgICAgICAgLyogdGhpcyBzZXJpYWwgdGVhbSB3YXMgYWxyZWFkeSB1c2VkCisgICAgICAgICAgICAgKiBUT0RPIGluY3JlYXNlIHBlcmZvcm1hbmNlIGJ5IG1ha2luZyB0aGlzIGxvY2tzIG1vcmUgc3BlY2lmaWMgKi8KKyAgICAgICAgICAgIGttcF90ZWFtX3QgKm5ld190ZWFtOworICAgICAgICAgICAgaW50IHRpZCA9IHRoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX3RpZDsKKworICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJl9fa21wX2Zvcmtqb2luX2xvY2sgKTsKKworICAgICAgICAgICAgbmV3X3RlYW0gPSBfX2ttcF9hbGxvY2F0ZV90ZWFtKHRoaXNfdGhyLT50aC50aF9yb290LCAxLCAxLAorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY19iaW5kLAorI2VuZGlmCisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMsCisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF90ZWFtLT50LnRfc2V0X25wcm9jW3RpZF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX3RlYW0tPnQudF9zZXRfZHluYW1pY1t0aWRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF90ZWFtLT50LnRfc2V0X25lc3RlZFt0aWRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF90ZWFtLT50LnRfc2V0X2Jsb2NrdGltZVt0aWRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF90ZWFtLT50LnRfc2V0X2J0X2ludGVydmFsc1t0aWRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF90ZWFtLT50LnRfc2V0X2J0X3NldFt0aWRdLAorI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfZm9ya2pvaW5fbG9jayApOworICAgICAgICAgICAgS01QX0FTU0VSVCggbmV3X3RlYW0gKTsKKworICAgICAgICAgICAgLyogc2V0dXAgbmV3IHNlcmlhbGl6ZWQgdGVhbSBhbmQgaW5zdGFsbCBpdCAqLworICAgICAgICAgICAgbmV3X3RlYW0gLT4gdC50X3RocmVhZHNbMF0gPSB0aGlzX3RocjsKKyAgICAgICAgICAgIG5ld190ZWFtIC0+IHQudF9wYXJlbnQgPSB0aGlzX3RociAtPiB0aC50aF90ZWFtOworICAgICAgICAgICAgc2VyaWFsX3RlYW0gPSBuZXdfdGVhbTsKKyAgICAgICAgICAgIHRoaXNfdGhyIC0+IHRoLnRoX3NlcmlhbF90ZWFtID0gc2VyaWFsX3RlYW07CisKKyAgICAgICAgICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWw6IFQjJWQgYWxsb2NhdGVkIG5ldyBzZXJpYWwgdGVhbSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfdGlkLCBzZXJpYWxfdGVhbSApICk7CisKKworICAgICAgICAgICAgLyogVE9ETyB0aGUgYWJvdmUgYnJlYWtzIHRoZSByZXF1aXJlbWVudCB0aGF0IGlmIHdlIHJ1biBvdXQgb2YKKyAgICAgICAgICAgICAqIHJlc291cmNlcywgdGhlbiB3ZSBjYW4gc3RpbGwgZ3VhcmFudGVlIHRoYXQgc2VyaWFsaXplZCB0ZWFtcworICAgICAgICAgICAgICogYXJlIG9rLCBzaW5jZSB3ZSBtYXkgbmVlZCB0byBhbGxvY2F0ZSBhIG5ldyBvbmUgKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWw6IFQjJWQgcmV1c2luZyBjYWNoZWQgc2VyaWFsIHRlYW0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3RpZCwgc2VyaWFsX3RlYW0gKSApOworICAgICAgICB9CisKKyAgICAgICAgLyogd2UgaGF2ZSB0byBpbml0aWFsaXplIHRoaXMgc2VyaWFsIHRlYW0gKi8KKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggc2VyaWFsX3RlYW0tPnQudF90aHJlYWRzICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHNlcmlhbF90ZWFtLT50LnRfdGhyZWFkc1swXSA9PSB0aGlzX3RociApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3Roci0+dGgudGhfdGVhbSAhPSBzZXJpYWxfdGVhbSApOworICAgICAgICBzZXJpYWxfdGVhbSAtPiB0LnRfaWRlbnQgICAgICAgICA9IGxvYzsKKyAgICAgICAgc2VyaWFsX3RlYW0gLT4gdC50X3NlcmlhbGl6ZWQgICAgPSAxOworICAgICAgICBzZXJpYWxfdGVhbSAtPiB0LnRfbnByb2MgICAgICAgICA9IDE7CisgICAgICAgIHNlcmlhbF90ZWFtIC0+IHQudF9wYXJlbnQgICAgICAgID0gdGhpc190aHItPnRoLnRoX3RlYW07CisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgICAgc2VyaWFsX3RlYW0gLT4gdC50X3NjaGVkICAgICAgICAgPSB0aGlzX3Roci0+dGgudGhfdGVhbS0+dC50X3NjaGVkOworI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisgICAgICAgIHRoaXNfdGhyIC0+IHRoLnRoX3RlYW0gICAgICAgICAgID0gc2VyaWFsX3RlYW07CisgICAgICAgIHNlcmlhbF90ZWFtIC0+IHQudF9tYXN0ZXJfdGlkICAgID0gdGhpc190aHItPnRoLnRoX2luZm8uZHMuZHNfdGlkOworCisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcGNfc2VyaWFsaXplZF9wYXJhbGxlbDogVCNkIGN1cnRhc2s9JXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfdGlkLCB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrICkgKTsKKyAgICAgICAgS01QX0FTU0VSVCggdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfZmxhZ3MuZXhlY3V0aW5nID09IDEgKTsKKyAgICAgICAgdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfZmxhZ3MuZXhlY3V0aW5nID0gMDsKKworICAgICAgICBfX2ttcF9wdXNoX2N1cnJlbnRfdGFza190b190aHJlYWQoIHRoaXNfdGhyLCBzZXJpYWxfdGVhbSwgMCApOworCisgICAgICAgIC8qIFRPRE86IEdFSDogZG8gdGhlIElDVnMgd29yayBmb3IgbmVzdGVkIHNlcmlhbGl6ZWQgdGVhbXM/ICBEb24ndCB3ZSBuZWVkIGFuIGltcGxpY2l0IHRhc2sgZm9yCisgICAgICAgICAgIGVhY2ggc2VyaWFsaXplZCB0YXNrIHJlcHJlc2VudGVkIGJ5IHRlYW0tPnQudF9zZXJpYWxpemVkPyAqLworICAgICAgICBjb3B5X2ljdnMoCisgICAgICAgICAgICAgICAgICAmIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMsCisgICAgICAgICAgICAgICAgICAmIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX3BhcmVudC0+dGRfaWN2cyApOworCisgICAgICAgIC8vIFRocmVhZCB2YWx1ZSBleGlzdHMgaW4gdGhlIG5lc3RlZCBudGhyZWFkcyBhcnJheSBmb3IgdGhlIG5leHQgbmVzdGVkIGxldmVsCisgICAgICAgIGlmICggX19rbXBfbmVzdGVkX250aC51c2VkICYmICggbGV2ZWwgKyAxIDwgX19rbXBfbmVzdGVkX250aC51c2VkICkgKSB7CisgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLm5wcm9jID0gX19rbXBfbmVzdGVkX250aC5udGhbIGxldmVsICsgMSBdOworICAgICAgICB9CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICBpZiAoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQudXNlZCAmJiAoIGxldmVsICsgMSA8IF9fa21wX25lc3RlZF9wcm9jX2JpbmQudXNlZCApICkgeworICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5wcm9jX2JpbmQKKyAgICAgICAgICAgICAgICA9IF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1sgbGV2ZWwgKyAxIF07CisgICAgICAgIH0KKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisjZWxzZSAvKiBwcmUtMy4wIGljdidzICovCisgICAgICAgIHNlcmlhbF90ZWFtIC0+IHQudF9zZXRfbnByb2NbMF0gID0gc2VyaWFsX3RlYW0tPnQudF9wYXJlbnQtPgorICAgICAgICAgICAgdC50X3NldF9ucHJvY1tzZXJpYWxfdGVhbS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgIHQudF9tYXN0ZXJfdGlkXTsKKyAgICAgICAgc2VyaWFsX3RlYW0gLT4gdC50X3NldF9keW5hbWljWzBdID0gc2VyaWFsX3RlYW0tPnQudF9wYXJlbnQtPgorICAgICAgICAgICAgdC50X3NldF9keW5hbWljW3NlcmlhbF90ZWFtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnRfbWFzdGVyX3RpZF07CisgICAgICAgIHNlcmlhbF90ZWFtIC0+IHQudF9zZXRfbmVzdGVkWzBdID0gc2VyaWFsX3RlYW0tPnQudF9wYXJlbnQtPgorICAgICAgICAgICAgdC50X3NldF9uZXN0ZWRbc2VyaWFsX3RlYW0tPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgdC50X21hc3Rlcl90aWRdOworICAgICAgICBzZXJpYWxfdGVhbSAtPiB0LnRfc2V0X2Jsb2NrdGltZVswXSAgPSBzZXJpYWxfdGVhbS0+dC50X3BhcmVudC0+CisgICAgICAgICAgICB0LnRfc2V0X2Jsb2NrdGltZVtzZXJpYWxfdGVhbS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnRfbWFzdGVyX3RpZF07CisgICAgICAgIHNlcmlhbF90ZWFtIC0+IHQudF9zZXRfYnRfaW50ZXJ2YWxzWzBdID0gc2VyaWFsX3RlYW0tPnQudF9wYXJlbnQtPgorICAgICAgICAgICAgdC50X3NldF9idF9pbnRlcnZhbHNbc2VyaWFsX3RlYW0tPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC50X21hc3Rlcl90aWRdOworICAgICAgICBzZXJpYWxfdGVhbSAtPiB0LnRfc2V0X2J0X3NldFswXSA9IHNlcmlhbF90ZWFtLT50LnRfcGFyZW50LT4KKyAgICAgICAgICAgIHQudF9zZXRfYnRfc2V0W3NlcmlhbF90ZWFtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHQudF9tYXN0ZXJfdGlkXTsKKyNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorICAgICAgICB0aGlzX3RociAtPiB0aC50aF9pbmZvLmRzLmRzX3RpZCA9IDA7CisKKyAgICAgICAgLyogc2V0IHRocmVhZCBjYWNoZSB2YWx1ZXMgKi8KKyAgICAgICAgdGhpc190aHIgLT4gdGgudGhfdGVhbV9ucHJvYyAgICAgPSAxOworICAgICAgICB0aGlzX3RociAtPiB0aC50aF90ZWFtX21hc3RlciAgICA9IHRoaXNfdGhyOworICAgICAgICB0aGlzX3RociAtPiB0aC50aF90ZWFtX3NlcmlhbGl6ZWQgPSAxOworCisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgICAgc2VyaWFsX3RlYW0gLT4gdC50X2xldmVsICAgICAgICA9IHNlcmlhbF90ZWFtIC0+IHQudF9wYXJlbnQgLT4gdC50X2xldmVsICsgMTsKKyAgICAgICAgc2VyaWFsX3RlYW0gLT4gdC50X2FjdGl2ZV9sZXZlbCA9IHNlcmlhbF90ZWFtIC0+IHQudF9wYXJlbnQgLT4gdC50X2FjdGl2ZV9sZXZlbDsKKyNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorICAgICAgICBpZiAoIF9fa21wX2luaGVyaXRfZnBfY29udHJvbCApIHsKKyAgICAgICAgICAgIF9fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkKCAmc2VyaWFsX3RlYW0tPnQudF94ODdfZnB1X2NvbnRyb2xfd29yZCApOworICAgICAgICAgICAgX19rbXBfc3RvcmVfbXhjc3IoICZzZXJpYWxfdGVhbS0+dC50X214Y3NyICk7CisgICAgICAgICAgICBzZXJpYWxfdGVhbS0+dC50X214Y3NyICY9IEtNUF9YODZfTVhDU1JfTUFTSzsKKyAgICAgICAgICAgIHNlcmlhbF90ZWFtLT50LnRfZnBfY29udHJvbF9zYXZlZCA9IFRSVUU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZXJpYWxfdGVhbS0+dC50X2ZwX2NvbnRyb2xfc2F2ZWQgPSBGQUxTRTsKKyAgICAgICAgfQorI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKyAgICAgICAgLyogY2hlY2sgaWYgd2UgbmVlZCB0byBhbGxvY2F0ZSBkaXNwYXRjaCBidWZmZXJzIHN0YWNrICovCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoc2VyaWFsX3RlYW0tPnQudF9kaXNwYXRjaCk7CisgICAgICAgIGlmICggIXNlcmlhbF90ZWFtLT50LnRfZGlzcGF0Y2gtPnRoX2Rpc3BfYnVmZmVyICkgeworICAgICAgICAgICAgc2VyaWFsX3RlYW0tPnQudF9kaXNwYXRjaC0+dGhfZGlzcF9idWZmZXIgPSAoZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3QgKikKKyAgICAgICAgICAgICAgICBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKCBkaXNwYXRjaF9wcml2YXRlX2luZm9fdCApICk7CisgICAgICAgIH0KKyAgICAgICAgdGhpc190aHIgLT4gdGgudGhfZGlzcGF0Y2ggPSBzZXJpYWxfdGVhbS0+dC50X2Rpc3BhdGNoOworCisgICAgICAgIEtNUF9NQigpOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogdGhpcyBzZXJpYWxpemVkIHRlYW0gaXMgYWxyZWFkeSBiZWluZyB1c2VkLAorICAgICAgICAgKiB0aGF0J3MgZmluZSwganVzdCBhZGQgYW5vdGhlciBuZXN0ZWQgbGV2ZWwgKi8KKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHItPnRoLnRoX3RlYW0gPT0gc2VyaWFsX3RlYW0gKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggc2VyaWFsX3RlYW0gLT4gdC50X3RocmVhZHMgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggc2VyaWFsX3RlYW0gLT4gdC50X3RocmVhZHNbMF0gPT0gdGhpc190aHIgKTsKKyAgICAgICAgKysgc2VyaWFsX3RlYW0gLT4gdC50X3NlcmlhbGl6ZWQ7CisgICAgICAgIHRoaXNfdGhyIC0+IHRoLnRoX3RlYW1fc2VyaWFsaXplZCA9IHNlcmlhbF90ZWFtIC0+IHQudF9zZXJpYWxpemVkOworCisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgICAgLy8gTmVzdGVkIGxldmVsIHdpbGwgYmUgYW4gaW5kZXggaW4gdGhlIG5lc3RlZCBudGhyZWFkcyBhcnJheQorICAgICAgICBpbnQgbGV2ZWwgPSB0aGlzX3Roci0+dGgudGhfdGVhbS0+dC50X2xldmVsOworICAgICAgICAvLyBUaHJlYWQgdmFsdWUgZXhpc3RzIGluIHRoZSBuZXN0ZWQgbnRocmVhZHMgYXJyYXkgZm9yIHRoZSBuZXh0IG5lc3RlZCBsZXZlbAorICAgICAgICBpZiAoIF9fa21wX25lc3RlZF9udGgudXNlZCAmJiAoIGxldmVsICsgMSA8IF9fa21wX25lc3RlZF9udGgudXNlZCApICkgeworICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5ucHJvYyA9IF9fa21wX25lc3RlZF9udGgubnRoWyBsZXZlbCArIDEgXTsKKyAgICAgICAgfQorICAgICAgICBzZXJpYWxfdGVhbSAtPiB0LnRfbGV2ZWwrKzsKKyAgICAgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcGNfc2VyaWFsaXplZF9wYXJhbGxlbDogVCMlZCBpbmNyZWFzaW5nIG5lc3RpbmcgbGV2ZWwgb2Ygc2VyaWFsIHRlYW0gJXAgdG8gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfdGlkLCBzZXJpYWxfdGVhbSwgc2VyaWFsX3RlYW0gLT4gdC50X2xldmVsICkgKTsKKyNlbHNlCisgICAgICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWw6IFQjJWQgcmV1c2luZyB0ZWFtICVwIGZvciBuZXN0ZWQgc2VyaWFsaXplZCBwYXJhbGxlbCByZWdpb25cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfdGlkLCBzZXJpYWxfdGVhbSApICk7CisjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKworICAgICAgICAvKiBhbGxvY2F0ZS9wdXNoIGRpc3BhdGNoIGJ1ZmZlcnMgc3RhY2sgKi8KKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChzZXJpYWxfdGVhbS0+dC50X2Rpc3BhdGNoKTsKKyAgICAgICAgeworICAgICAgICAgICAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3QgKiBkaXNwX2J1ZmZlciA9IChkaXNwYXRjaF9wcml2YXRlX2luZm9fdCAqKQorICAgICAgICAgICAgICAgIF9fa21wX2FsbG9jYXRlKCBzaXplb2YoIGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ICkgKTsKKyAgICAgICAgICAgIGRpc3BfYnVmZmVyLT5uZXh0ID0gc2VyaWFsX3RlYW0tPnQudF9kaXNwYXRjaC0+dGhfZGlzcF9idWZmZXI7CisgICAgICAgICAgICBzZXJpYWxfdGVhbS0+dC50X2Rpc3BhdGNoLT50aF9kaXNwX2J1ZmZlciA9IGRpc3BfYnVmZmVyOworICAgICAgICB9CisgICAgICAgIHRoaXNfdGhyIC0+IHRoLnRoX2Rpc3BhdGNoID0gc2VyaWFsX3RlYW0tPnQudF9kaXNwYXRjaDsKKworICAgICAgICBLTVBfTUIoKTsKKyAgICB9CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApCisgICAgICAgIF9fa21wX3B1c2hfcGFyYWxsZWwoIGdsb2JhbF90aWQsIE5VTEwgKTsKKworLy8gdF9sZXZlbCBpcyBub3QgYXZhaWxhYmxlIGluIDIuNSBidWlsZCwgc28gY2hlY2sgZm9yIE9NUF8zMF9FTkFCTEVECisjaWYgVVNFX0lUVF9CVUlMRCAmJiBPTVBfMzBfRU5BQkxFRAorICAgIC8vIE1hcmsgdGhlIHN0YXJ0IG9mIHRoZSAicGFyYWxsZWwiIHJlZ2lvbiBmb3IgVlR1bmUuIE9ubHkgdXNlIG9uZSBvZiBmcmFtZSBub3RpZmljYXRpb24gc2NoZW1lIGF0IHRoZSBtb21lbnQuCisgICAgaWYgKCAoIF9faXR0X2ZyYW1lX2JlZ2luX3YzX3B0ciAmJiBfX2ttcF9mb3Jram9pbl9mcmFtZXMgJiYgISBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSApIHx8IEtNUF9JVFRfREVCVUcgKQorICAgIHsKKyAgICAgICAgX19rbXBfaXR0X3JlZ2lvbl9mb3JraW5nKCBnbG9iYWxfdGlkLCAxICk7CisgICAgfQorICAgIGlmKCAoIF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDEgfHwgX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMyApICYmIF9faXR0X2ZyYW1lX3N1Ym1pdF92M19wdHIgJiYgX19pdHRfZ2V0X3RpbWVzdGFtcF9wdHIgKQorICAgIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgICAgICBpZiggdGhpc190aHItPnRoLnRoX3RlYW0tPnQudF9sZXZlbCA9PSAxICkgeworICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX2ZyYW1lX3RpbWVfc2VyaWFsaXplZCA9IF9faXR0X2dldF90aW1lc3RhbXAoKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworfQorCisvKiEKK0Bpbmdyb3VwIFBBUkFMTEVMCitAcGFyYW0gbG9jICBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KK0BwYXJhbSBnbG9iYWxfdGlkICBnbG9iYWwgdGhyZWFkIG51bWJlcgorCitMZWF2ZSBhIHNlcmlhbGl6ZWQgcGFyYWxsZWwgY29uc3RydWN0LgorKi8KK3ZvaWQKK19fa21wY19lbmRfc2VyaWFsaXplZF9wYXJhbGxlbChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkKQoreworICAgIGttcF9pbnRlcm5hbF9jb250cm9sX3QgKnRvcDsKKyAgICBrbXBfaW5mb190ICp0aGlzX3RocjsKKyAgICBrbXBfdGVhbV90ICpzZXJpYWxfdGVhbTsKKworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfZW5kX3NlcmlhbGl6ZWRfcGFyYWxsZWw6IGNhbGxlZCBieSBUIyVkXG4iLCBnbG9iYWxfdGlkICkgKTsKKworICAgIC8qIHNraXAgYWxsIHRoaXMgY29kZSBmb3IgYXV0b3BhciBzZXJpYWxpemVkIGxvb3BzIHNpbmNlIGl0IHJlc3VsdHMgaW4KKyAgICAgICB1bmFjY2VwdGFibGUgb3ZlcmhlYWQgKi8KKyAgICBpZiggbG9jICE9IE5VTEwgJiYgKGxvYy0+ZmxhZ3MgJiBLTVBfSURFTlRfQVVUT1BBUiApICkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gTm90IGF1dG9wYXIgY29kZQorICAgIGlmKCAhIFRDUl80KCBfX2ttcF9pbml0X3BhcmFsbGVsICkgKQorICAgICAgICBfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCk7CisKKyAgICB0aGlzX3RociAgICA9IF9fa21wX3RocmVhZHNbIGdsb2JhbF90aWQgXTsKKyAgICBzZXJpYWxfdGVhbSA9IHRoaXNfdGhyLT50aC50aF9zZXJpYWxfdGVhbTsKKworICAgIEtNUF9NQigpOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHNlcmlhbF90ZWFtICk7CisgICAgS01QX0FTU0VSVCggICAgICAgc2VyaWFsX3RlYW0gLT4gdC50X3NlcmlhbGl6ZWQgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3RociAtPiB0aC50aF90ZWFtID09IHNlcmlhbF90ZWFtICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggc2VyaWFsX3RlYW0gIT0gdGhpc190aHItPnRoLnRoX3Jvb3QtPnIucl9yb290X3RlYW0gKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzZXJpYWxfdGVhbSAtPiB0LnRfdGhyZWFkcyApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHNlcmlhbF90ZWFtIC0+IHQudF90aHJlYWRzWzBdID09IHRoaXNfdGhyICk7CisKKyAgICAvKiBJZiBuZWNlc3NhcnksIHBvcCB0aGUgaW50ZXJuYWwgY29udHJvbCBzdGFjayB2YWx1ZXMgYW5kIHJlcGxhY2UgdGhlIHRlYW0gdmFsdWVzICovCisgICAgdG9wID0gc2VyaWFsX3RlYW0gLT4gdC50X2NvbnRyb2xfc3RhY2tfdG9wOworICAgIGlmICggdG9wICYmIHRvcCAtPiBzZXJpYWxfbmVzdGluZ19sZXZlbCA9PSBzZXJpYWxfdGVhbSAtPiB0LnRfc2VyaWFsaXplZCApIHsKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgICAgICBjb3B5X2ljdnMoCisgICAgICAgICAgICAgICAgICAmc2VyaWFsX3RlYW0gLT4gdC50X3RocmVhZHNbMF0gLT4gdGgudGhfY3VycmVudF90YXNrIC0+IHRkX2ljdnMsCisgICAgICAgICAgICAgICAgICB0b3AgKTsKKyNlbHNlCisgICAgICAgIHNlcmlhbF90ZWFtIC0+IHQudF9zZXRfbnByb2NbMF0gICA9IHRvcCAtPiBucHJvYzsKKyAgICAgICAgc2VyaWFsX3RlYW0gLT4gdC50X3NldF9keW5hbWljWzBdID0gdG9wIC0+IGR5bmFtaWM7CisgICAgICAgIHNlcmlhbF90ZWFtIC0+IHQudF9zZXRfbmVzdGVkWzBdICA9IHRvcCAtPiBuZXN0ZWQ7CisgICAgICAgIHNlcmlhbF90ZWFtIC0+IHQudF9zZXRfYmxvY2t0aW1lWzBdICAgPSB0b3AgLT4gYmxvY2t0aW1lOworICAgICAgICBzZXJpYWxfdGVhbSAtPiB0LnRfc2V0X2J0X2ludGVydmFsc1swXSA9IHRvcCAtPiBidF9pbnRlcnZhbHM7CisgICAgICAgIHNlcmlhbF90ZWFtIC0+IHQudF9zZXRfYnRfc2V0WzBdICA9IHRvcCAtPiBidF9zZXQ7CisjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKyAgICAgICAgc2VyaWFsX3RlYW0gLT4gdC50X2NvbnRyb2xfc3RhY2tfdG9wID0gdG9wIC0+IG5leHQ7CisgICAgICAgIF9fa21wX2ZyZWUodG9wKTsKKyAgICB9CisKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgIC8vaWYoIHNlcmlhbF90ZWFtIC0+IHQudF9zZXJpYWxpemVkID4gMSApCisgICAgc2VyaWFsX3RlYW0gLT4gdC50X2xldmVsLS07CisjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKworICAgIC8qIHBvcCBkaXNwYXRjaCBidWZmZXJzIHN0YWNrICovCisgICAgS01QX0RFQlVHX0FTU0VSVChzZXJpYWxfdGVhbS0+dC50X2Rpc3BhdGNoLT50aF9kaXNwX2J1ZmZlcik7CisgICAgeworICAgICAgICBkaXNwYXRjaF9wcml2YXRlX2luZm9fdCAqIGRpc3BfYnVmZmVyID0gc2VyaWFsX3RlYW0tPnQudF9kaXNwYXRjaC0+dGhfZGlzcF9idWZmZXI7CisgICAgICAgIHNlcmlhbF90ZWFtLT50LnRfZGlzcGF0Y2gtPnRoX2Rpc3BfYnVmZmVyID0KKyAgICAgICAgICAgIHNlcmlhbF90ZWFtLT50LnRfZGlzcGF0Y2gtPnRoX2Rpc3BfYnVmZmVyLT5uZXh0OworICAgICAgICBfX2ttcF9mcmVlKCBkaXNwX2J1ZmZlciApOworICAgIH0KKworICAgIC0tIHNlcmlhbF90ZWFtIC0+IHQudF9zZXJpYWxpemVkOworICAgIGlmICggc2VyaWFsX3RlYW0gLT4gdC50X3NlcmlhbGl6ZWQgPT0gMCApIHsKKworICAgICAgICAvKiByZXR1cm4gdG8gdGhlIHBhcmFsbGVsIHNlY3Rpb24gKi8KKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyAgICAgICAgaWYgKCBfX2ttcF9pbmhlcml0X2ZwX2NvbnRyb2wgJiYgc2VyaWFsX3RlYW0tPnQudF9mcF9jb250cm9sX3NhdmVkICkgeworICAgICAgICAgICAgX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZCgpOworICAgICAgICAgICAgX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZCggJnNlcmlhbF90ZWFtLT50LnRfeDg3X2ZwdV9jb250cm9sX3dvcmQgKTsKKyAgICAgICAgICAgIF9fa21wX2xvYWRfbXhjc3IoICZzZXJpYWxfdGVhbS0+dC50X214Y3NyICk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKyAgICAgICAgdGhpc190aHIgLT4gdGgudGhfdGVhbSAgICAgICAgICAgPSBzZXJpYWxfdGVhbSAtPiB0LnRfcGFyZW50OworICAgICAgICB0aGlzX3RociAtPiB0aC50aF9pbmZvLmRzLmRzX3RpZCA9IHNlcmlhbF90ZWFtIC0+IHQudF9tYXN0ZXJfdGlkOworCisgICAgICAgIC8qIHJlc3RvcmUgdmFsdWVzIGNhY2hlZCBpbiB0aGUgdGhyZWFkICovCisgICAgICAgIHRoaXNfdGhyIC0+IHRoLnRoX3RlYW1fbnByb2MgICAgID0gc2VyaWFsX3RlYW0gLT4gdC50X3BhcmVudCAtPiB0LnRfbnByb2M7ICAgICAgICAgIC8qICBKUEggKi8KKyAgICAgICAgdGhpc190aHIgLT4gdGgudGhfdGVhbV9tYXN0ZXIgICAgPSBzZXJpYWxfdGVhbSAtPiB0LnRfcGFyZW50IC0+IHQudF90aHJlYWRzWzBdOyAgICAgLyogSlBIICovCisgICAgICAgIHRoaXNfdGhyIC0+IHRoLnRoX3RlYW1fc2VyaWFsaXplZCA9IHRoaXNfdGhyIC0+IHRoLnRoX3RlYW0gLT4gdC50X3NlcmlhbGl6ZWQ7CisKKyAgICAgICAgLyogVE9ETyB0aGUgYmVsb3cgc2hvdWxkbid0IG5lZWQgdG8gYmUgYWRqdXN0ZWQgZm9yIHNlcmlhbGl6ZWQgdGVhbXMgKi8KKyAgICAgICAgdGhpc190aHIgLT4gdGgudGhfZGlzcGF0Y2ggICAgICAgPSAmIHRoaXNfdGhyIC0+IHRoLnRoX3RlYW0gLT4KKyAgICAgICAgICAgIHQudF9kaXNwYXRjaFsgc2VyaWFsX3RlYW0gLT4gdC50X21hc3Rlcl90aWQgXTsKKworI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgIF9fa21wX3BvcF9jdXJyZW50X3Rhc2tfZnJvbV90aHJlYWQoIHRoaXNfdGhyICk7CisKKyAgICAgICAgS01QX0FTU0VSVCggdGhpc190aHIgLT4gdGgudGhfY3VycmVudF90YXNrIC0+IHRkX2ZsYWdzLmV4ZWN1dGluZyA9PSAwICk7CisgICAgICAgIHRoaXNfdGhyIC0+IHRoLnRoX2N1cnJlbnRfdGFzayAtPiB0ZF9mbGFncy5leGVjdXRpbmcgPSAxOworCisgICAgICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gQ29weSB0aGUgdGFzayB0ZWFtIGZyb20gdGhlIG5ldyBjaGlsZCAvIG9sZCBwYXJlbnQgdGVhbQorICAgICAgICAgICAgLy8gdG8gdGhlIHRocmVhZC4gIElmIG5vbi1OVUxMLCBjb3B5IHRoZSBzdGF0ZSBmbGFnIGFsc28uCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaWYgKCAoIHRoaXNfdGhyIC0+IHRoLnRoX3Rhc2tfdGVhbSA9IHRoaXNfdGhyIC0+IHRoLnRoX3RlYW0gLT4gdC50X3Rhc2tfdGVhbSApICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgdGhpc190aHIgLT4gdGgudGhfdGFza19zdGF0ZSA9IHRoaXNfdGhyIC0+IHRoLnRoX3Rhc2tfdGVhbSAtPiB0dC50dF9zdGF0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBjX2VuZF9zZXJpYWxpemVkX3BhcmFsbGVsOiBUIyVkIHJlc3RvcmluZyB0YXNrX3RlYW0gJXAgLyB0ZWFtICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF90aWQsIHRoaXNfdGhyIC0+IHRoLnRoX3Rhc2tfdGVhbSwgdGhpc190aHIgLT4gdGgudGhfdGVhbSApICk7CisgICAgICAgIH0KKyNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorCisgICAgfQorICAgIGVsc2UgeworCisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBjX2VuZF9zZXJpYWxpemVkX3BhcmFsbGVsOiBUIyVkIGRlY3JlYXNpbmcgbmVzdGluZyBkZXB0aCBvZiBzZXJpYWwgdGVhbSAlcCB0byAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfdGlkLCBzZXJpYWxfdGVhbSwgc2VyaWFsX3RlYW0gLT4gdC50X3NlcmlhbGl6ZWQgKSApOworICAgICAgICB9CisjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKworICAgIH0KKworLy8gdF9sZXZlbCBpcyBub3QgYXZhaWxhYmxlIGluIDIuNSBidWlsZCwgc28gY2hlY2sgZm9yIE9NUF8zMF9FTkFCTEVECisjaWYgVVNFX0lUVF9CVUlMRCAmJiBPTVBfMzBfRU5BQkxFRAorICAgIC8vIE1hcmsgdGhlIGVuZCBvZiB0aGUgInBhcmFsbGVsIiByZWdpb24gZm9yIFZUdW5lLiBPbmx5IHVzZSBvbmUgb2YgZnJhbWUgbm90aWZpY2F0aW9uIHNjaGVtZSBhdCB0aGUgbW9tZW50LgorICAgIGlmICggKCBfX2l0dF9mcmFtZV9lbmRfdjNfcHRyICYmIF9fa21wX2Zvcmtqb2luX2ZyYW1lcyAmJiAhIF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlICkgfHwgS01QX0lUVF9ERUJVRyApCisgICAgeworICAgICAgICB0aGlzX3Roci0+dGgudGhfaWRlbnQgPSBsb2M7CisgICAgICAgIF9fa21wX2l0dF9yZWdpb25fam9pbmVkKCBnbG9iYWxfdGlkLCAxICk7CisgICAgfQorICAgIGlmKCAoIF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDEgfHwgX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMyApICYmIF9faXR0X2ZyYW1lX3N1Ym1pdF92M19wdHIgKSB7CisgICAgICAgIGlmKCB0aGlzX3Roci0+dGgudGhfdGVhbS0+dC50X2xldmVsID09IDAgKSB7CisgICAgICAgICAgICBfX2ttcF9pdHRfZnJhbWVfc3VibWl0KCBnbG9iYWxfdGlkLCB0aGlzX3Roci0+dGgudGhfZnJhbWVfdGltZV9zZXJpYWxpemVkLCBfX2l0dF90aW1lc3RhbXBfbm9uZSwgMCwgbG9jICk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wb3BfcGFyYWxsZWwoIGdsb2JhbF90aWQsIE5VTEwgKTsKK30KKworLyohCitAaW5ncm91cCBTWU5DSFJPTklaQVRJT04KK0BwYXJhbSBsb2MgIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbi4KK0BwYXJhbSAuLi4gIHBvaW50ZXJzIHRvIHRoZSB2YXJpYWJsZXMgdG8gYmUgc3luY2hyb25pemVkLgorCitFeGVjdXRlIDx0dD5mbHVzaDwvdHQ+LiBUaGUgcG9pbnRlcnMgdG8gdGhlIHZhcmlhYmxlcyB0byBiZSBmbHVzaGVkCituZWVkIG5vdCBhY3R1YWxseSBiZSBwYXNzZWQsIChpbmRlZWQgdW5sZXNzIHRoaXMgaXMgYSB6ZXJvIHRlcm1pbmF0ZWQKK2xpc3QgdGhleSBjYW4ndCBiZSBzaW5jZSB0aGVyZSdzIG5vIGNvdW50IGhlcmUgc28gd2UgZG9uJ3Qga25vdyBob3cKK21hbnkgdGhlcmUgYXJlISkuICBUaGlzIGlzIGltcGxlbWVudGVkIGFzIGEgZnVsbCBtZW1vcnkgZmVuY2UuIChUaG91Z2gKK2RlcGVuZGluZyBvbiB0aGUgbWVtb3J5IG9yZGVyaW5nIGNvbnZlbnRpb24gb2JleWVkIGJ5IHRoZSBjb21waWxlcgorZXZlbiB0aGF0IG1heSBub3QgYmUgbmVjZXNzYXJ5KS4KKyovCit2b2lkCitfX2ttcGNfZmx1c2goaWRlbnRfdCAqbG9jLCAuLi4pCit7CisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19mbHVzaDogY2FsbGVkXG4iICkgKTsKKworICAgIC8qIG5lZWQgZXhwbGljaXQgX19tZigpIGhlcmUgc2luY2UgdXNlIHZvbGF0aWxlIGluc3RlYWQgaW4gbGlicmFyeSAqLworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgLy8gVGhpcyBpcyBub3QgYW4gT01QIDMuMCBmZWF0dXJlLgorICAgIC8vIFRoaXMgbWFjcm8gaXMgdXNlZCBoZXJlIGp1c3Qgbm90IHRvIGxldCB0aGUgY2hhbmdlIGdvIHRvIDEwLjEuCisgICAgLy8gVGhpcyBjaGFuZ2Ugd2lsbCBnbyB0byB0aGUgbWFpbmxpbmUgZmlyc3QuCisgICAgI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgICNpZiAoIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKQorICAgICAgICAgICAgI2lmIEtNUF9NSUMKKyAgICAgICAgICAgICAgICAvLyBmZW5jZS1zdHlsZSBpbnN0cnVjdGlvbnMgZG8gbm90IGV4aXN0LCBidXQgbG9jazsgeGFkZGwgJDAsKCVyc3ApIGNhbiBiZSB1c2VkLgorICAgICAgICAgICAgICAgIC8vIFdlIHNob3VsZG4ndCBuZWVkIGl0LCB0aG91Z2gsIHNpbmNlIHRoZSBBQkkgcnVsZXMgcmVxdWlyZSB0aGF0CisgICAgICAgICAgICAgICAgLy8gKiBJZiB0aGUgY29tcGlsZXIgZ2VuZXJhdGVzIE5HTyBzdG9yZXMgaXQgYWxzbyBnZW5lcmF0ZXMgdGhlIGZlbmNlCisgICAgICAgICAgICAgICAgLy8gKiBJZiB1c2VycyBoYW5kLWNvZGUgTkdPIHN0b3JlcyB0aGV5IHNob3VsZCBpbnNlcnQgdGhlIGZlbmNlCisgICAgICAgICAgICAgICAgLy8gdGhlcmVmb3JlIG5vIGluY29tcGxldGUgdW5vcmRlcmVkIHN0b3JlcyBzaG91bGQgYmUgdmlzaWJsZS4KKyAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICAgLy8gQzc0NDA0CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0byBhZGRyZXNzIG5vbi10ZW1wb3JhbCBzdG9yZSBpbnN0cnVjdGlvbnMgKHNmZW5jZSBuZWVkZWQpLgorICAgICAgICAgICAgICAgIC8vIFRoZSBjbGZsdXNoIGluc3RydWN0aW9uIGlzIGFkZHJlc3NlZCBlaXRoZXIgKG1mZW5jZSBuZWVkZWQpLgorICAgICAgICAgICAgICAgIC8vIFByb2JhYmx5IHRoZSBub24tdGVtcG9yYWwgbG9hZCBtb252dGRxYSBpbnN0cnVjdGlvbiBzaG91bGQgYWxzbyBiZSBhZGRyZXNzZWQuCisgICAgICAgICAgICAgICAgLy8gbWZlbmNlIGlzIGEgU1NFMiBpbnN0cnVjdGlvbi4gRG8gbm90IGV4ZWN1dGUgaXQgaWYgQ1BVIGlzIG5vdCBTU0UyLgorICAgICAgICAgICAgICAgIGlmICggISBfX2ttcF9jcHVpbmZvLmluaXRpYWxpemVkICkgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9xdWVyeV9jcHVpZCggJiBfX2ttcF9jcHVpbmZvICk7CisgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICAgICBpZiAoICEgX19rbXBfY3B1aW5mby5zc2UyICkgeworICAgICAgICAgICAgICAgICAgICAvLyBDUFUgY2Fubm90IGV4ZWN1dGUgU1NFMiBpbnN0cnVjdGlvbnMuCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgI2lmIEtNUF9DT01QSUxFUl9JQ0MgfHwgS01QX0NPTVBJTEVSX01TVkMKKyAgICAgICAgICAgICAgICAgICAgX21tX21mZW5jZSgpOworICAgICAgICAgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgICAgICBfX3N5bmNfc3luY2hyb25pemUoKTsKKyAgICAgICAgICAgICAgICAgICAgI2VuZGlmIC8vIEtNUF9DT01QSUxFUl9JQ0MKKyAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgI2VuZGlmIC8vIEtNUF9NSUMKKyAgICAgICAgI2VsaWYgS01QX0FSQ0hfQVJNCisgICAgICAgICAgICAvLyBOb3RoaW5nIHlldAorCSAgICAgI2VsaWYgS01QX0FSQ0hfUFBDNjQKKyAgICAgICAgICAgIC8vIE5vdGhpbmcgbmVlZGVkIGhlcmUgKHdlIGhhdmUgYSByZWFsIE1CIGFib3ZlKS4KKyAgICAgICAgICAgICNpZiBLTVBfT1NfQ05LCisJICAgICAJIC8vIFRoZSBmbHVzaGluZyB0aHJlYWQgbmVlZHMgdG8geWllbGQgaGVyZTsgdGhpcyBwcmV2ZW50cyBhCisJCSAgICAvLyBidXN5LXdhaXRpbmcgdGhyZWFkIGZyb20gc2F0dXJhdGluZyB0aGUgcGlwZWxpbmUuIGZsdXNoIGlzCisJCSAgICAgICAvLyBvZnRlbiB1c2VkIGluIGxvb3BzIGxpa2UgdGhpczoKKyAgICAgICAgICAgICAgICAvLyB3aGlsZSAoIWZsYWcpIHsKKyAgICAgICAgICAgICAgICAvLyAgICNwcmFnbWEgb21wIGZsdXNoKGZsYWcpCisgICAgICAgICAgICAgICAgLy8gfQorCQkgICAgLy8gYW5kIGFkZGluZyB0aGUgeWllbGQgaGVyZSBpcyBnb29kIGZvciBhdCBsZWFzdCBhIDEweCBzcGVlZHVwCisJCSAgICAgICAvLyB3aGVuIHJ1bm5pbmcgPjIgdGhyZWFkcyBwZXIgY29yZSAob24gdGhlIE5BUyBMVSBiZW5jaG1hcmspLgorICAgICAgICAgICAgICAgIF9fa21wX3lpZWxkKFRSVUUpOworICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICNlbHNlCisgICAgICAgICAgICAjZXJyb3IgVW5rbm93biBvciB1bnN1cHBvcnRlZCBhcmNoaXRlY3R1cmUKKyAgICAgICAgI2VuZGlmCisgICAgI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyohCitAaW5ncm91cCBTWU5DSFJPTklaQVRJT04KK0BwYXJhbSBsb2Mgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCitAcGFyYW0gZ2xvYmFsX3RpZCB0aHJlYWQgaWQuCisKK0V4ZWN1dGUgYSBiYXJyaWVyLgorKi8KK3ZvaWQKK19fa21wY19iYXJyaWVyKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQpCit7CisgICAgaW50IGV4cGxpY2l0X2JhcnJpZXJfZmxhZzsKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2JhcnJpZXI6IGNhbGxlZCBUIyVkXG4iLCBnbG9iYWxfdGlkICkgKTsKKworICAgIGlmICghIFRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpKQorICAgICAgICBfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCk7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgaWYgKCBsb2MgPT0gMCApIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBDb25zdHJ1Y3RJZGVudEludmFsaWQgKTsgLy8gPz8/IFdoYXQgZG9lcyBpdCBtZWFuIGZvciB0aGUgdXNlcj8KKyAgICAgICAgfTsgLy8gaWYKKworICAgICAgICBfX2ttcF9jaGVja19iYXJyaWVyKCBnbG9iYWxfdGlkLCBjdF9iYXJyaWVyLCBsb2MgKTsKKyAgICB9CisKKyAgICBfX2ttcF90aHJlYWRzWyBnbG9iYWxfdGlkIF0tPnRoLnRoX2lkZW50ID0gbG9jOworICAgIC8vIFRPRE86IGV4cGxpY2l0IGJhcnJpZXJfd2FpdF9pZDoKKyAgICAvLyAgIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gJ2JhcnJpZXInIGRpcmVjdGl2ZSBpcyBwcmVzZW50IG9yCisgICAgLy8gICBpbXBsaWNpdCBiYXJyaWVyIGF0IHRoZSBlbmQgb2YgYSB3b3Jrc2hhcmluZyBjb25zdHJ1Y3QuCisgICAgLy8gMSkgYmV0dGVyIHRvIGFkZCBhIHBlci10aHJlYWQgYmFycmllciBjb3VudGVyIHRvIGEgdGhyZWFkIGRhdGEgc3RydWN0dXJlCisgICAgLy8gMikgc2V0IHRvIDAgd2hlbiBhIG5ldyB0ZWFtIGlzIGNyZWF0ZWQKKyAgICAvLyA0KSBubyBzeW5jIGlzIHJlcXVpcmVkCisKKyAgICBfX2ttcF9iYXJyaWVyKCBic19wbGFpbl9iYXJyaWVyLCBnbG9iYWxfdGlkLCBGQUxTRSwgMCwgTlVMTCwgTlVMTCApOworfQorCisvKiBUaGUgQkFSUklFUiBmb3IgYSBNQVNURVIgc2VjdGlvbiBpcyBhbHdheXMgZXhwbGljaXQgICAqLworLyohCitAaW5ncm91cCBXT1JLX1NIQVJJTkcKK0BwYXJhbSBsb2MgIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbi4KK0BwYXJhbSBnbG9iYWxfdGlkICBnbG9iYWwgdGhyZWFkIG51bWJlciAuCitAcmV0dXJuIDEgaWYgdGhpcyB0aHJlYWQgc2hvdWxkIGV4ZWN1dGUgdGhlIDx0dD5tYXN0ZXI8L3R0PiBibG9jaywgMCBvdGhlcndpc2UuCisqLwora21wX2ludDMyCitfX2ttcGNfbWFzdGVyKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQpCit7CisgICAgaW50IHN0YXR1cyA9IDA7CisKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX21hc3RlcjogY2FsbGVkIFQjJWRcbiIsIGdsb2JhbF90aWQgKSApOworCisgICAgaWYoICEgVENSXzQoIF9fa21wX2luaXRfcGFyYWxsZWwgKSApCisgICAgICAgIF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoKTsKKworICAgIGlmKCBLTVBfTUFTVEVSX0dUSUQoIGdsb2JhbF90aWQgKSkKKyAgICAgICAgc3RhdHVzID0gMTsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBpZiAoc3RhdHVzKQorICAgICAgICAgICAgX19rbXBfcHVzaF9zeW5jKCBnbG9iYWxfdGlkLCBjdF9tYXN0ZXIsIGxvYywgTlVMTCApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfX2ttcF9jaGVja19zeW5jKCBnbG9iYWxfdGlkLCBjdF9tYXN0ZXIsIGxvYywgTlVMTCApOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qIQorQGluZ3JvdXAgV09SS19TSEFSSU5HCitAcGFyYW0gbG9jICBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24uCitAcGFyYW0gZ2xvYmFsX3RpZCAgZ2xvYmFsIHRocmVhZCBudW1iZXIgLgorCitNYXJrIHRoZSBlbmQgb2YgYSA8dHQ+bWFzdGVyPC90dD4gcmVnaW9uLiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSB0aGUgdGhyZWFkCit0aGF0IGV4ZWN1dGVzIHRoZSA8dHQ+bWFzdGVyPC90dD4gcmVnaW9uLgorKi8KK3ZvaWQKK19fa21wY19lbmRfbWFzdGVyKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQpCit7CisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19lbmRfbWFzdGVyOiBjYWxsZWQgVCMlZFxuIiwgZ2xvYmFsX3RpZCApICk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBLTVBfTUFTVEVSX0dUSUQoIGdsb2JhbF90aWQgKSk7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgaWYoIGdsb2JhbF90aWQgPCAwICkKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBUaHJlYWRJZGVudEludmFsaWQgKTsKKworICAgICAgICBpZiggS01QX01BU1RFUl9HVElEKCBnbG9iYWxfdGlkICkpCisgICAgICAgICAgICBfX2ttcF9wb3Bfc3luYyggZ2xvYmFsX3RpZCwgY3RfbWFzdGVyLCBsb2MgKTsKKyAgICB9Cit9CisKKy8qIQorQGluZ3JvdXAgV09SS19TSEFSSU5HCitAcGFyYW0gbG9jICBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24uCitAcGFyYW0gZ3RpZCAgZ2xvYmFsIHRocmVhZCBudW1iZXIuCisKK1N0YXJ0IGV4ZWN1dGlvbiBvZiBhbiA8dHQ+b3JkZXJlZDwvdHQ+IGNvbnN0cnVjdC4KKyovCit2b2lkCitfX2ttcGNfb3JkZXJlZCggaWRlbnRfdCAqIGxvYywga21wX2ludDMyIGd0aWQgKQoreworICAgIGludCBjaWQgPSAwOworICAgIGttcF9pbmZvX3QgKnRoOworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX29yZGVyZWQ6IGNhbGxlZCBUIyVkXG4iLCBndGlkICkpOworCisgICAgaWYgKCEgVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkpCisgICAgICAgIF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoKTsKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfb3JkZXJlZF9wcmVwKCBndGlkICk7CisgICAgLy8gVE9ETzogb3JkZXJlZF93YWl0X2lkCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgdGggPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisKKyAgICBpZiAoIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rlb19mY24gIT0gMCApCisgICAgICAgICgqdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kZW9fZmNuKSggJiBndGlkLCAmIGNpZCwgbG9jICk7CisgICAgZWxzZQorICAgICAgICBfX2ttcF9wYXJhbGxlbF9kZW8oICYgZ3RpZCwgJiBjaWQsIGxvYyApOworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9vcmRlcmVkX3N0YXJ0KCBndGlkICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworfQorCisvKiEKK0Bpbmdyb3VwIFdPUktfU0hBUklORworQHBhcmFtIGxvYyAgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorQHBhcmFtIGd0aWQgIGdsb2JhbCB0aHJlYWQgbnVtYmVyLgorCitFbmQgZXhlY3V0aW9uIG9mIGFuIDx0dD5vcmRlcmVkPC90dD4gY29uc3RydWN0LgorKi8KK3ZvaWQKK19fa21wY19lbmRfb3JkZXJlZCggaWRlbnRfdCAqIGxvYywga21wX2ludDMyIGd0aWQgKQoreworICAgIGludCBjaWQgPSAwOworICAgIGttcF9pbmZvX3QgKnRoOworCisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19lbmRfb3JkZXJlZDogY2FsbGVkIFQjJWRcbiIsIGd0aWQgKSApOworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9vcmRlcmVkX2VuZCggZ3RpZCApOworICAgIC8vIFRPRE86IG9yZGVyZWRfd2FpdF9pZAorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIHRoID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworCisgICAgaWYgKCB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9keG9fZmNuICE9IDAgKQorICAgICAgICAoKnRoLT50aC50aF9kaXNwYXRjaC0+dGhfZHhvX2ZjbikoICYgZ3RpZCwgJiBjaWQsIGxvYyApOworICAgIGVsc2UKKyAgICAgICAgX19rbXBfcGFyYWxsZWxfZHhvKCAmIGd0aWQsICYgY2lkLCBsb2MgKTsKK30KKworaW5saW5lIHZvaWQKK19fa21wX3N0YXRpY195aWVsZCggaW50IGFyZyApIHsgLy8gQUM6IG5lZWRlZCBpbiBtYWNybyBfX2ttcF9hY3F1aXJlX3VzZXJfbG9ja193aXRoX2NoZWNrcworICAgIF9fa21wX3lpZWxkKCBhcmcgKTsKK30KKworc3RhdGljIGttcF91c2VyX2xvY2tfcAorX19rbXBfZ2V0X2NyaXRpY2FsX3NlY3Rpb25fcHRyKCBrbXBfY3JpdGljYWxfbmFtZSAqIGNyaXQsIGlkZW50X3QgY29uc3QgKiBsb2MsIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBrbXBfdXNlcl9sb2NrX3AgKmxja19wcCA9IChrbXBfdXNlcl9sb2NrX3AgKiljcml0OworCisgICAgLy8KKyAgICAvLyBCZWNhdXNlIG9mIHRoZSBkb3VibGUtY2hlY2ssIHRoZSBmb2xsb3dpbmcgbG9hZAorICAgIC8vIGRvZXNuJ3QgbmVlZCB0byBiZSB2b2xhdGlsZS4KKyAgICAvLworICAgIGttcF91c2VyX2xvY2tfcCBsY2sgPSAoa21wX3VzZXJfbG9ja19wKVRDUl9QVFIoICpsY2tfcHAgKTsKKworICAgIGlmICggbGNrID09IE5VTEwgKSB7CisgICAgICAgIHZvaWQgKiBpZHg7CisKKyAgICAgICAgLy8gQWxsb2NhdGUgJiBpbml0aWFsaXplIHRoZSBsb2NrLgorICAgICAgICAvLyBSZW1lbWJlciBhbGxvY2F0ZWQgbG9ja3MgaW4gdGFibGUgaW4gb3JkZXIgdG8gZnJlZSB0aGVtIGluIF9fa21wX2NsZWFudXAoKQorICAgICAgICBsY2sgPSBfX2ttcF91c2VyX2xvY2tfYWxsb2NhdGUoICZpZHgsIGd0aWQsIGttcF9sZl9jcml0aWNhbF9zZWN0aW9uICk7CisgICAgICAgIF9fa21wX2luaXRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKCBsY2sgKTsKKyAgICAgICAgX19rbXBfc2V0X3VzZXJfbG9ja19sb2NhdGlvbiggbGNrLCBsb2MgKTsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIF9fa21wX2l0dF9jcml0aWNhbF9jcmVhdGluZyggbGNrICk7CisgICAgICAgICAgICAvLyBfX2ttcF9pdHRfY3JpdGljYWxfY3JlYXRpbmcoKSBzaG91bGQgYmUgY2FsbGVkICpiZWZvcmUqIHRoZSBmaXJzdCB1c2FnZSBvZiB1bmRlcmx5aW5nCisgICAgICAgICAgICAvLyBsb2NrLiBJdCBpcyB0aGUgb25seSBwbGFjZSB3aGVyZSB3ZSBjYW4gZ3VhcmFudGVlIGl0LiBUaGVyZSBhcmUgY2hhbmNlcyB0aGUgbG9jayB3aWxsCisgICAgICAgICAgICAvLyBkZXN0cm95ZWQgd2l0aCBubyB1c2FnZSwgYnV0IGl0IGlzIG5vdCBhIHByb2JsZW0sIGJlY2F1c2UgdGhpcyBpcyBub3QgcmVhbCBldmVudCBzZWVuCisgICAgICAgICAgICAvLyBieSB1c2VyIGJ1dCByYXRoZXIgc2V0dGluZyBuYW1lIGZvciBvYmplY3QgKGxvY2spLiBTZWUgbW9yZSBkZXRhaWxzIGluIGttcF9pdHQuaC4KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVXNlIGEgY21weGNoZyBpbnN0cnVjdGlvbiB0byBzbGFtIHRoZSBzdGFydCBvZiB0aGUgY3JpdGljYWwKKyAgICAgICAgLy8gc2VjdGlvbiB3aXRoIHRoZSBsb2NrIHBvaW50ZXIuICBJZiBhbm90aGVyIHRocmVhZCBiZWF0IHVzCisgICAgICAgIC8vIHRvIGl0LCBkZWFsbG9jYXRlIHRoZSBsb2NrLCBhbmQgdXNlIHRoZSBsb2NrIHRoYXQgdGhlIG90aGVyCisgICAgICAgIC8vIHRocmVhZCBhbGxvY2F0ZWQuCisgICAgICAgIC8vCisgICAgICAgIGludCBzdGF0dXMgPSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUFRSKCBsY2tfcHAsIDAsIGxjayApOworCisgICAgICAgIGlmICggc3RhdHVzID09IDAgKSB7CisgICAgICAgICAgICAvLyBEZWFsbG9jYXRlIHRoZSBsb2NrIGFuZCByZWxvYWQgdGhlIHZhbHVlLgorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgICAgIF9fa21wX2l0dF9jcml0aWNhbF9kZXN0cm95ZWQoIGxjayApOworICAgICAgICAgICAgICAgIC8vIExldCBJVFQga25vdyB0aGUgbG9jayBpcyBkZXN0cm95ZWQgYW5kIHRoZSBzYW1lIG1lbW9yeSBsb2NhdGlvbiBtYXkgYmUgcmV1c2VkIGZvcgorICAgICAgICAgICAgICAgIC8vIGFub3RoZXIgcHVycG9zZS4KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgICAgICAgICBfX2ttcF9kZXN0cm95X3VzZXJfbG9ja193aXRoX2NoZWNrcyggbGNrICk7CisgICAgICAgICAgICBfX2ttcF91c2VyX2xvY2tfZnJlZSggJmlkeCwgZ3RpZCwgbGNrICk7CisgICAgICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKVRDUl9QVFIoICpsY2tfcHAgKTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGxjayAhPSBOVUxMICk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGxjazsKK30KKworLyohCitAaW5ncm91cCBXT1JLX1NIQVJJTkcKK0BwYXJhbSBsb2MgIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbi4KK0BwYXJhbSBnbG9iYWxfdGlkICBnbG9iYWwgdGhyZWFkIG51bWJlciAuCitAcGFyYW0gY3JpdCBpZGVudGl0eSBvZiB0aGUgY3JpdGljYWwgc2VjdGlvbi4gVGhpcyBjb3VsZCBiZSBhIHBvaW50ZXIgdG8gYSBsb2NrIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3JpdGljYWwgc2VjdGlvbiwgb3IKK3NvbWUgb3RoZXIgc3VpdGFibHkgdW5pcXVlIHZhbHVlLgorCitFbnRlciBjb2RlIHByb3RlY3RlZCBieSBhIGBjcml0aWNhbGAgY29uc3RydWN0LgorVGhpcyBmdW5jdGlvbiBibG9ja3MgdW50aWwgdGhlIGV4ZWN1dGluZyB0aHJlYWQgY2FuIGVudGVyIHRoZSBjcml0aWNhbCBzZWN0aW9uLgorKi8KK3ZvaWQKK19fa21wY19jcml0aWNhbCggaWRlbnRfdCAqIGxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9jcml0aWNhbF9uYW1lICogY3JpdCApIHsKKworICAgIGttcF91c2VyX2xvY2tfcCBsY2s7CisKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2NyaXRpY2FsOiBjYWxsZWQgVCMlZFxuIiwgZ2xvYmFsX3RpZCApICk7CisKKyAgICAvL1RPRE86IGFkZCBUSFJfT1ZIRF9TVEFURQorCisgICAgS01QX0NIRUNLX1VTRVJfTE9DS19JTklUKCk7CisKKyAgICBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfdGFzICkKKyAgICAgICYmICggc2l6ZW9mKCBsY2stPnRhcy5say5wb2xsICkgPD0gT01QX0NSSVRJQ0FMX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCljcml0OworICAgIH0KKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNKQorICAgIGVsc2UgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX2Z1dGV4ICkKKyAgICAgICYmICggc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLnBvbGwgKSA8PSBPTVBfQ1JJVElDQUxfU0laRSApICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKWNyaXQ7CisgICAgfQorI2VuZGlmCisgICAgZWxzZSB7IC8vIHRpY2tldCwgcXVldWluZyBvciBkcmRwYQorICAgICAgICBsY2sgPSBfX2ttcF9nZXRfY3JpdGljYWxfc2VjdGlvbl9wdHIoIGNyaXQsIGxvYywgZ2xvYmFsX3RpZCApOworICAgIH0KKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgX19rbXBfcHVzaF9zeW5jKCBnbG9iYWxfdGlkLCBjdF9jcml0aWNhbCwgbG9jLCBsY2sgKTsKKworICAgIC8qIHNpbmNlIHRoZSBjcml0aWNhbCBkaXJlY3RpdmUgYmluZHMgdG8gYWxsIHRocmVhZHMsIG5vdCBqdXN0CisgICAgICogdGhlIGN1cnJlbnQgdGVhbSB3ZSBoYXZlIHRvIGNoZWNrIHRoaXMgZXZlbiBpZiB3ZSBhcmUgaW4gYQorICAgICAqIHNlcmlhbGl6ZWQgdGVhbSAqLworICAgIC8qIGFsc28sIGV2ZW4gaWYgd2UgYXJlIHRoZSB1YmVyIHRocmVhZCwgd2Ugc3RpbGwgaGF2ZSB0byBjb25kdWN0IHRoZSBsb2NrLAorICAgICAqIGFzIHdlIGhhdmUgdG8gY29udGVuZCB3aXRoIHNpYmxpbmcgdGhyZWFkcyAqLworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9jcml0aWNhbF9hY3F1aXJpbmcoIGxjayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICAvLyBWYWx1ZSBvZiAnY3JpdCcgc2hvdWxkIGJlIGdvb2QgZm9yIHVzaW5nIGFzIGEgY3JpdGljYWxfaWQgb2YgdGhlIGNyaXRpY2FsIHNlY3Rpb24gZGlyZWN0aXZlLgorCisgICAgX19rbXBfYWNxdWlyZV91c2VyX2xvY2tfd2l0aF9jaGVja3MoIGxjaywgZ2xvYmFsX3RpZCApOworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9jcml0aWNhbF9hY3F1aXJlZCggbGNrICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgS0FfVFJBQ0UoIDE1LCAoIl9fa21wY19jcml0aWNhbDogZG9uZSBUIyVkXG4iLCBnbG9iYWxfdGlkICkpOworfSAvLyBfX2ttcGNfY3JpdGljYWwKKworLyohCitAaW5ncm91cCBXT1JLX1NIQVJJTkcKK0BwYXJhbSBsb2MgIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbi4KK0BwYXJhbSBnbG9iYWxfdGlkICBnbG9iYWwgdGhyZWFkIG51bWJlciAuCitAcGFyYW0gY3JpdCBpZGVudGl0eSBvZiB0aGUgY3JpdGljYWwgc2VjdGlvbi4gVGhpcyBjb3VsZCBiZSBhIHBvaW50ZXIgdG8gYSBsb2NrIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3JpdGljYWwgc2VjdGlvbiwgb3IKK3NvbWUgb3RoZXIgc3VpdGFibHkgdW5pcXVlIHZhbHVlLgorCitMZWF2ZSBhIGNyaXRpY2FsIHNlY3Rpb24sIHJlbGVhc2luZyBhbnkgbG9jayB0aGF0IHdhcyBoZWxkIGR1cmluZyBpdHMgZXhlY3V0aW9uLgorKi8KK3ZvaWQKK19fa21wY19lbmRfY3JpdGljYWwoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2NyaXRpY2FsX25hbWUgKmNyaXQpCit7CisgICAga21wX3VzZXJfbG9ja19wIGxjazsKKworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfZW5kX2NyaXRpY2FsOiBjYWxsZWQgVCMlZFxuIiwgZ2xvYmFsX3RpZCApKTsKKworICAgIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKQorICAgICAgJiYgKCBzaXplb2YoIGxjay0+dGFzLmxrLnBvbGwgKSA8PSBPTVBfQ1JJVElDQUxfU0laRSApICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKWNyaXQ7CisgICAgfQorI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0pCisgICAgZWxzZSBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfZnV0ZXggKQorICAgICAgJiYgKCBzaXplb2YoIGxjay0+ZnV0ZXgubGsucG9sbCApIDw9IE9NUF9DUklUSUNBTF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApY3JpdDsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlIHsgLy8gdGlja2V0LCBxdWV1aW5nIG9yIGRyZHBhCisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApIFRDUl9QVFIoKigoa21wX3VzZXJfbG9ja19wICopY3JpdCkpOworICAgIH0KKworICAgIEtNUF9BU1NFUlQobGNrICE9IE5VTEwpOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wb3Bfc3luYyggZ2xvYmFsX3RpZCwgY3RfY3JpdGljYWwsIGxvYyApOworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9jcml0aWNhbF9yZWxlYXNpbmcoIGxjayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICAvLyBWYWx1ZSBvZiAnY3JpdCcgc2hvdWxkIGJlIGdvb2QgZm9yIHVzaW5nIGFzIGEgY3JpdGljYWxfaWQgb2YgdGhlIGNyaXRpY2FsIHNlY3Rpb24gZGlyZWN0aXZlLgorCisgICAgX19rbXBfcmVsZWFzZV91c2VyX2xvY2tfd2l0aF9jaGVja3MoIGxjaywgZ2xvYmFsX3RpZCApOworCisgICAgS0FfVFJBQ0UoIDE1LCAoIl9fa21wY19lbmRfY3JpdGljYWw6IGRvbmUgVCMlZFxuIiwgZ2xvYmFsX3RpZCApKTsKK30KKworLyohCitAaW5ncm91cCBTWU5DSFJPTklaQVRJT04KK0BwYXJhbSBsb2Mgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCitAcGFyYW0gZ2xvYmFsX3RpZCB0aHJlYWQgaWQuCitAcmV0dXJuIG9uZSBpZiB0aGUgdGhyZWFkIHNob3VsZCBleGVjdXRlIHRoZSBtYXN0ZXIgYmxvY2ssIHplcm8gb3RoZXJ3aXNlCisKK1N0YXJ0IGV4ZWN1dGlvbiBvZiBhIGNvbWJpbmVkIGJhcnJpZXIgYW5kIG1hc3Rlci4gVGhlIGJhcnJpZXIgaXMgZXhlY3V0ZWQgaW5zaWRlIHRoaXMgZnVuY3Rpb24uCisqLwora21wX2ludDMyCitfX2ttcGNfYmFycmllcl9tYXN0ZXIoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCkKK3sKKyAgICBpbnQgc3RhdHVzOworCisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19iYXJyaWVyX21hc3RlcjogY2FsbGVkIFQjJWRcbiIsIGdsb2JhbF90aWQgKSApOworCisgICAgaWYgKCEgVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkpCisgICAgICAgIF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoKTsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgX19rbXBfY2hlY2tfYmFycmllciggZ2xvYmFsX3RpZCwgY3RfYmFycmllciwgbG9jICk7CisKKyAgICBzdGF0dXMgPSBfX2ttcF9iYXJyaWVyKCBic19wbGFpbl9iYXJyaWVyLCBnbG9iYWxfdGlkLCBUUlVFLCAwLCBOVUxMLCBOVUxMICk7CisKKyAgICByZXR1cm4gKHN0YXR1cyAhPSAwKSA/IDAgOiAxOworfQorCisvKiEKK0Bpbmdyb3VwIFNZTkNIUk9OSVpBVElPTgorQHBhcmFtIGxvYyBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KK0BwYXJhbSBnbG9iYWxfdGlkIHRocmVhZCBpZC4KKworQ29tcGxldGUgdGhlIGV4ZWN1dGlvbiBvZiBhIGNvbWJpbmVkIGJhcnJpZXIgYW5kIG1hc3Rlci4gVGhpcyBmdW5jdGlvbiBzaG91bGQKK29ubHkgYmUgY2FsbGVkIGF0IHRoZSBjb21wbGV0aW9uIG9mIHRoZSA8dHQ+bWFzdGVyPC90dD4gY29kZS4gT3RoZXIgdGhyZWFkcyB3aWxsCitzdGlsbCBiZSB3YWl0aW5nIGF0IHRoZSBiYXJyaWVyIGFuZCB0aGlzIGNhbGwgcmVsZWFzZXMgdGhlbS4KKyovCit2b2lkCitfX2ttcGNfZW5kX2JhcnJpZXJfbWFzdGVyKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQpCit7CisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19lbmRfYmFycmllcl9tYXN0ZXI6IGNhbGxlZCBUIyVkXG4iLCBnbG9iYWxfdGlkICkpOworCisgICAgX19rbXBfZW5kX3NwbGl0X2JhcnJpZXIgKCBic19wbGFpbl9iYXJyaWVyLCBnbG9iYWxfdGlkICk7Cit9CisKKy8qIQorQGluZ3JvdXAgU1lOQ0hST05JWkFUSU9OCitAcGFyYW0gbG9jIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGdsb2JhbF90aWQgdGhyZWFkIGlkLgorQHJldHVybiBvbmUgaWYgdGhlIHRocmVhZCBzaG91bGQgZXhlY3V0ZSB0aGUgbWFzdGVyIGJsb2NrLCB6ZXJvIG90aGVyd2lzZQorCitTdGFydCBleGVjdXRpb24gb2YgYSBjb21iaW5lZCBiYXJyaWVyIGFuZCBtYXN0ZXIobm93YWl0KSBjb25zdHJ1Y3QuCitUaGUgYmFycmllciBpcyBleGVjdXRlZCBpbnNpZGUgdGhpcyBmdW5jdGlvbi4KK1RoZXJlIGlzIG5vIGVxdWl2YWxlbnQgImVuZCIgZnVuY3Rpb24sIHNpbmNlIHRoZQorKi8KK2ttcF9pbnQzMgorX19rbXBjX2JhcnJpZXJfbWFzdGVyX25vd2FpdCggaWRlbnRfdCAqIGxvYywga21wX2ludDMyIGdsb2JhbF90aWQgKQoreworICAgIGttcF9pbnQzMiByZXQ7CisKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2JhcnJpZXJfbWFzdGVyX25vd2FpdDogY2FsbGVkIFQjJWRcbiIsIGdsb2JhbF90aWQgKSk7CisKKyAgICBpZiAoISBUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSkKKyAgICAgICAgX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSgpOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGlmICggbG9jID09IDAgKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggQ29uc3RydWN0SWRlbnRJbnZhbGlkICk7IC8vID8/PyBXaGF0IGRvZXMgaXQgbWVhbiBmb3IgdGhlIHVzZXI/CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfY2hlY2tfYmFycmllciggZ2xvYmFsX3RpZCwgY3RfYmFycmllciwgbG9jICk7CisgICAgfQorCisgICAgX19rbXBfYmFycmllciggYnNfcGxhaW5fYmFycmllciwgZ2xvYmFsX3RpZCwgRkFMU0UsIDAsIE5VTEwsIE5VTEwgKTsKKworICAgIHJldCA9IF9fa21wY19tYXN0ZXIgKGxvYywgZ2xvYmFsX3RpZCk7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgLyogIHRoZXJlJ3Mgbm8gX19rbXBjX2VuZF9tYXN0ZXIgY2FsbGVkOyBzbyB0aGUgKHN0YXRzKSAqLworICAgICAgICAvKiAgYWN0aW9ucyBvZiBfX2ttcGNfZW5kX21hc3RlciBhcmUgZG9uZSBoZXJlICAgICAgICAgICovCisKKyAgICAgICAgaWYgKCBnbG9iYWxfdGlkIDwgMCApIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBUaHJlYWRJZGVudEludmFsaWQgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICAvKiBvbmx5IG9uZSB0aHJlYWQgc2hvdWxkIGRvIHRoZSBwb3Agc2luY2Ugb25seSAqLworICAgICAgICAgICAgLyogb25lIGRpZCB0aGUgcHVzaCAoc2VlIF9fa21wY19tYXN0ZXIoKSkgICAgICAgKi8KKworICAgICAgICAgICAgX19rbXBfcG9wX3N5bmMoIGdsb2JhbF90aWQsIGN0X21hc3RlciwgbG9jICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKHJldCk7Cit9CisKKy8qIFRoZSBCQVJSSUVSIGZvciBhIFNJTkdMRSBwcm9jZXNzIHNlY3Rpb24gaXMgYWx3YXlzIGV4cGxpY2l0ICAgKi8KKy8qIQorQGluZ3JvdXAgV09SS19TSEFSSU5HCitAcGFyYW0gbG9jICBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KK0BwYXJhbSBnbG9iYWxfdGlkICBnbG9iYWwgdGhyZWFkIG51bWJlcgorQHJldHVybiBPbmUgaWYgdGhpcyB0aHJlYWQgc2hvdWxkIGV4ZWN1dGUgdGhlIHNpbmdsZSBjb25zdHJ1Y3QsIHplcm8gb3RoZXJ3aXNlLgorCitUZXN0IHdoZXRoZXIgdG8gZXhlY3V0ZSBhIDx0dD5zaW5nbGU8L3R0PiBjb25zdHJ1Y3QuCitUaGVyZSBhcmUgbm8gaW1wbGljaXQgYmFycmllcnMgaW4gdGhlIHR3byAic2luZ2xlIiBjYWxscywgcmF0aGVyIHRoZSBjb21waWxlciBzaG91bGQKK2ludHJvZHVjZSBhbiBleHBsaWNpdCBiYXJyaWVyIGlmIGl0IGlzIHJlcXVpcmVkLgorKi8KKwora21wX2ludDMyCitfX2ttcGNfc2luZ2xlKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQpCit7CisgICAga21wX2ludDMyIHJjID0gX19rbXBfZW50ZXJfc2luZ2xlKCBnbG9iYWxfdGlkLCBsb2MsIFRSVUUgKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qIQorQGluZ3JvdXAgV09SS19TSEFSSU5HCitAcGFyYW0gbG9jICBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KK0BwYXJhbSBnbG9iYWxfdGlkICBnbG9iYWwgdGhyZWFkIG51bWJlcgorCitNYXJrIHRoZSBlbmQgb2YgYSA8dHQ+c2luZ2xlPC90dD4gY29uc3RydWN0LiAgVGhpcyBmdW5jdGlvbiBzaG91bGQKK29ubHkgYmUgY2FsbGVkIGJ5IHRoZSB0aHJlYWQgdGhhdCBleGVjdXRlZCB0aGUgYmxvY2sgb2YgY29kZSBwcm90ZWN0ZWQKK2J5IHRoZSBgc2luZ2xlYCBjb25zdHJ1Y3QuCisqLwordm9pZAorX19rbXBjX2VuZF9zaW5nbGUoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCkKK3sKKyAgICBfX2ttcF9leGl0X3NpbmdsZSggZ2xvYmFsX3RpZCApOworfQorCisvKiEKK0Bpbmdyb3VwIFdPUktfU0hBUklORworQHBhcmFtIGxvYyBTb3VyY2UgbG9jYXRpb24KK0BwYXJhbSBnbG9iYWxfdGlkIEdsb2JhbCB0aHJlYWQgaWQKKworTWFyayB0aGUgZW5kIG9mIGEgc3RhdGljYWxseSBzY2hlZHVsZWQgbG9vcC4KKyovCit2b2lkCitfX2ttcGNfZm9yX3N0YXRpY19maW5pKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkICkKK3sKKyAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX2Zvcl9zdGF0aWNfZmluaSBjYWxsZWQgVCMlZFxuIiwgZ2xvYmFsX3RpZCkpOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICBfX2ttcF9wb3Bfd29ya3NoYXJlKCBnbG9iYWxfdGlkLCBjdF9wZG8sIGxvYyApOworfQorCisvKgorICogVXNlciByb3V0aW5lcyB3aGljaCB0YWtlIEMtc3R5bGUgYXJndW1lbnRzIChjYWxsIGJ5IHZhbHVlKQorICogZGlmZmVyZW50IGZyb20gdGhlIEZvcnRyYW4gZXF1aXZhbGVudCByb3V0aW5lcworICovCisKK3ZvaWQKK29tcGNfc2V0X251bV90aHJlYWRzKCBpbnQgYXJnICkKK3sKKy8vICEhISEhIFRPRE86IGNoZWNrIHRoZSBwZXItdGFzayBiaW5kaW5nCisgICAgX19rbXBfc2V0X251bV90aHJlYWRzKCBhcmcsIF9fa21wX2VudHJ5X2d0aWQoKSApOworfQorCit2b2lkCitvbXBjX3NldF9keW5hbWljKCBpbnQgZmxhZyApCit7CisgICAga21wX2luZm9fdCAqdGhyZWFkOworCisgICAgLyogRm9yIHRoZSB0aHJlYWQtcHJpdmF0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJvbHMgKi8KKyAgICB0aHJlYWQgPSBfX2ttcF9lbnRyeV90aHJlYWQoKTsKKworICAgIF9fa21wX3NhdmVfaW50ZXJuYWxfY29udHJvbHMoIHRocmVhZCApOworCisgICAgc2V0X19keW5hbWljKCB0aHJlYWQsIGZsYWcgPyBUUlVFIDogRkFMU0UgKTsKK30KKwordm9pZAorb21wY19zZXRfbmVzdGVkKCBpbnQgZmxhZyApCit7CisgICAga21wX2luZm9fdCAqdGhyZWFkOworCisgICAgLyogRm9yIHRoZSB0aHJlYWQtcHJpdmF0ZSBpbnRlcm5hbCBjb250cm9scyBpbXBsZW1lbnRhdGlvbiAqLworICAgIHRocmVhZCA9IF9fa21wX2VudHJ5X3RocmVhZCgpOworCisgICAgX19rbXBfc2F2ZV9pbnRlcm5hbF9jb250cm9scyggdGhyZWFkICk7CisKKyAgICBzZXRfX25lc3RlZCggdGhyZWFkLCBmbGFnID8gVFJVRSA6IEZBTFNFICk7Cit9CisKKyNpZiBPTVBfMzBfRU5BQkxFRAorCit2b2lkCitvbXBjX3NldF9tYXhfYWN0aXZlX2xldmVscyggaW50IG1heF9hY3RpdmVfbGV2ZWxzICkKK3sKKyAgICAvKiBUTyBETyAqLworICAgIC8qIHdlIHdhbnQgcGVyLXRhc2sgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBpbnRlcm5hbCBjb250cm9sICovCisKKyAgICAvKiBGb3IgdGhlIHBlci10aHJlYWQgaW50ZXJuYWwgY29udHJvbHMgaW1wbGVtZW50YXRpb24gKi8KKyAgICBfX2ttcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMoIF9fa21wX2VudHJ5X2d0aWQoKSwgbWF4X2FjdGl2ZV9sZXZlbHMgKTsKK30KKwordm9pZAorb21wY19zZXRfc2NoZWR1bGUoIG9tcF9zY2hlZF90IGtpbmQsIGludCBtb2RpZmllciApCit7CisvLyAhISEhISBUT0RPOiBjaGVjayB0aGUgcGVyLXRhc2sgYmluZGluZworICAgIF9fa21wX3NldF9zY2hlZHVsZSggX19rbXBfZW50cnlfZ3RpZCgpLCAoIGttcF9zY2hlZF90ICkga2luZCwgbW9kaWZpZXIgKTsKK30KKworaW50CitvbXBjX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtKCBpbnQgbGV2ZWwgKQoreworICAgIHJldHVybiBfX2ttcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bSggX19rbXBfZW50cnlfZ3RpZCgpLCBsZXZlbCApOworfQorCitpbnQKK29tcGNfZ2V0X3RlYW1fc2l6ZSggaW50IGxldmVsICkKK3sKKyAgICByZXR1cm4gX19rbXBfZ2V0X3RlYW1fc2l6ZSggX19rbXBfZW50cnlfZ3RpZCgpLCBsZXZlbCApOworfQorCisjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKwordm9pZAora21wY19zZXRfc3RhY2tzaXplKCBpbnQgYXJnICkKK3sKKyAgICAvLyBfX2ttcF9hdXhfc2V0X3N0YWNrc2l6ZSBpbml0aWFsaXplcyB0aGUgbGlicmFyeSBpZiBuZWVkZWQKKyAgICBfX2ttcF9hdXhfc2V0X3N0YWNrc2l6ZSggYXJnICk7Cit9CisKK3ZvaWQKK2ttcGNfc2V0X3N0YWNrc2l6ZV9zKCBzaXplX3QgYXJnICkKK3sKKyAgICAvLyBfX2ttcF9hdXhfc2V0X3N0YWNrc2l6ZSBpbml0aWFsaXplcyB0aGUgbGlicmFyeSBpZiBuZWVkZWQKKyAgICBfX2ttcF9hdXhfc2V0X3N0YWNrc2l6ZSggYXJnICk7Cit9CisKK3ZvaWQKK2ttcGNfc2V0X2Jsb2NrdGltZSggaW50IGFyZyApCit7CisgICAgaW50IGd0aWQsIHRpZDsKKyAgICBrbXBfaW5mb190ICp0aHJlYWQ7CisKKyAgICBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgIHRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCk7CisgICAgdGhyZWFkID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZChndGlkKTsKKworICAgIF9fa21wX2F1eF9zZXRfYmxvY2t0aW1lKCBhcmcsIHRocmVhZCwgdGlkICk7Cit9CisKK3ZvaWQKK2ttcGNfc2V0X2xpYnJhcnkoIGludCBhcmcgKQoreworICAgIC8vIF9fa21wX3VzZXJfc2V0X2xpYnJhcnkgaW5pdGlhbGl6ZXMgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgICAgX19rbXBfdXNlcl9zZXRfbGlicmFyeSggKGVudW0gbGlicmFyeV90eXBlKWFyZyApOworfQorCit2b2lkCitrbXBjX3NldF9kZWZhdWx0cyggY2hhciBjb25zdCAqIHN0ciApCit7CisgICAgLy8gX19rbXBfYXV4X3NldF9kZWZhdWx0cyBpbml0aWFsaXplcyB0aGUgbGlicmFyeSBpZiBuZWVkZWQKKyAgICBfX2ttcF9hdXhfc2V0X2RlZmF1bHRzKCBzdHIsIHN0cmxlbiggc3RyICkgKTsKK30KKworI2lmZGVmIE9NUF8zMF9FTkFCTEVECisKK2ludAora21wY19zZXRfYWZmaW5pdHlfbWFza19wcm9jKCBpbnQgcHJvYywgdm9pZCAqKm1hc2sgKQoreworI2lmIGRlZmluZWQoS01QX1NUVUIpIHx8ICFLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgcmV0dXJuIC0xOworI2Vsc2UKKyAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICBfX2ttcF9taWRkbGVfaW5pdGlhbGl6ZSgpOworICAgIH0KKyAgICByZXR1cm4gX19rbXBfYXV4X3NldF9hZmZpbml0eV9tYXNrX3Byb2MoIHByb2MsIG1hc2sgKTsKKyNlbmRpZgorfQorCitpbnQKK2ttcGNfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jKCBpbnQgcHJvYywgdm9pZCAqKm1hc2sgKQoreworI2lmIGRlZmluZWQoS01QX1NUVUIpIHx8ICFLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgcmV0dXJuIC0xOworI2Vsc2UKKyAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICBfX2ttcF9taWRkbGVfaW5pdGlhbGl6ZSgpOworICAgIH0KKyAgICByZXR1cm4gX19rbXBfYXV4X3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyggcHJvYywgbWFzayApOworI2VuZGlmCit9CisKK2ludAora21wY19nZXRfYWZmaW5pdHlfbWFza19wcm9jKCBpbnQgcHJvYywgdm9pZCAqKm1hc2sgKQoreworI2lmIGRlZmluZWQoS01QX1NUVUIpIHx8ICFLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgcmV0dXJuIC0xOworI2Vsc2UKKyAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICBfX2ttcF9taWRkbGVfaW5pdGlhbGl6ZSgpOworICAgIH0KKyAgICByZXR1cm4gX19rbXBfYXV4X2dldF9hZmZpbml0eV9tYXNrX3Byb2MoIHByb2MsIG1hc2sgKTsKKyNlbmRpZgorfQorCisjZW5kaWYgLyogT01QXzMwX0VOQUJMRUQgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIQorQGluZ3JvdXAgVEhSRUFEUFJJVkFURQorQHBhcmFtIGxvYyAgICAgICBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KK0BwYXJhbSBndGlkICAgICAgZ2xvYmFsIHRocmVhZCBudW1iZXIKK0BwYXJhbSBjcHlfc2l6ZSAgc2l6ZSBvZiB0aGUgY3B5X2RhdGEgYnVmZmVyCitAcGFyYW0gY3B5X2RhdGEgIHBvaW50ZXIgdG8gZGF0YSB0byBiZSBjb3BpZWQKK0BwYXJhbSBjcHlfZnVuYyAgaGVscGVyIGZ1bmN0aW9uIHRvIGNhbGwgZm9yIGNvcHlpbmcgZGF0YQorQHBhcmFtIGRpZGl0ICAgICBmbGFnIHZhcmlhYmxlOiAxPXNpbmdsZSB0aHJlYWQ7IDA9bm90IHNpbmdsZSB0aHJlYWQKKworX19rbXBjX2NvcHlwcml2YXRlIGltcGxlbWVudHMgdGhlIGludGVyZmFjZSBmb3IgdGhlIHByaXZhdGUgZGF0YSBicm9hZGNhc3QgbmVlZGVkIGZvcgordGhlIGNvcHlwcml2YXRlIGNsYXVzZSBhc3NvY2lhdGVkIHdpdGggYSBzaW5nbGUgcmVnaW9uIGluIGFuIE9wZW5NUDxzdXA+Kjwvc3VwPiBwcm9ncmFtIChib3RoIEMgYW5kIEZvcnRyYW4pLgorQWxsIHRocmVhZHMgcGFydGljaXBhdGluZyBpbiB0aGUgcGFyYWxsZWwgcmVnaW9uIGNhbGwgdGhpcyByb3V0aW5lLgorT25lIG9mIHRoZSB0aHJlYWRzIChjYWxsZWQgdGhlIHNpbmdsZSB0aHJlYWQpIHNob3VsZCBoYXZlIHRoZSA8dHQ+ZGlkaXQ8L3R0PiB2YXJpYWJsZSBzZXQgdG8gMQorYW5kIGFsbCBvdGhlciB0aHJlYWRzIHNob3VsZCBoYXZlIHRoYXQgdmFyaWFibGUgc2V0IHRvIDAuCitBbGwgdGhyZWFkcyBwYXNzIGEgcG9pbnRlciB0byBhIGRhdGEgYnVmZmVyIChjcHlfZGF0YSkgdGhhdCB0aGV5IGhhdmUgYnVpbHQuCisKK1RoZSBPcGVuTVAgc3BlY2lmaWNhdGlvbiBmb3JiaWRzIHRoZSB1c2Ugb2Ygbm93YWl0IG9uIHRoZSBzaW5nbGUgcmVnaW9uIHdoZW4gYSBjb3B5cHJpdmF0ZQorY2xhdXNlIGlzIHByZXNlbnQuIEhvd2V2ZXIsIEByZWYgX19rbXBjX2NvcHlwcml2YXRlIGltcGxlbWVudHMgYSBiYXJyaWVyIGludGVybmFsbHkgdG8gYXZvaWQKK3JhY2UgY29uZGl0aW9ucywgc28gdGhlIGNvZGUgZ2VuZXJhdGlvbiBmb3IgdGhlIHNpbmdsZSByZWdpb24gc2hvdWxkIGF2b2lkIGdlbmVyYXRpbmcgYSBiYXJyaWVyCithZnRlciB0aGUgY2FsbCB0byBAcmVmIF9fa21wY19jb3B5cHJpdmF0ZS4KKworVGhlIDx0dD5ndGlkPC90dD4gcGFyYW1ldGVyIGlzIHRoZSBnbG9iYWwgdGhyZWFkIGlkIGZvciB0aGUgY3VycmVudCB0aHJlYWQuCitUaGUgPHR0PmxvYzwvdHQ+IHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorCitJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbjogVGhlIHNpbmdsZSB0aHJlYWQgd2lsbCBmaXJzdCBjb3B5IGl0cyBkZXNjcmlwdG9yIGFkZHJlc3MgKGNweV9kYXRhKQordG8gYSB0ZWFtLXByaXZhdGUgbG9jYXRpb24sIHRoZW4gdGhlIG90aGVyIHRocmVhZHMgd2lsbCBlYWNoIGNhbGwgdGhlIGZ1bmN0aW9uIHBvaW50ZWQgdG8gYnkKK3RoZSBwYXJhbWV0ZXIgY3B5X2Z1bmMsIHdoaWNoIGNhcnJpZXMgb3V0IHRoZSBjb3B5IGJ5IGNvcHlpbmcgdGhlIGRhdGEgdXNpbmcgdGhlIGNweV9kYXRhIGJ1ZmZlci4KKworVGhlIGNweV9mdW5jIHJvdXRpbmUgdXNlZCBmb3IgdGhlIGNvcHkgYW5kIHRoZSBjb250ZW50cyBvZiB0aGUgZGF0YSBhcmVhIGRlZmluZWQgYnkgY3B5X2RhdGEKK2FuZCBjcHlfc2l6ZSBtYXkgYmUgYnVpbHQgaW4gYW55IGZhc2hpb24gdGhhdCB3aWxsIGFsbG93IHRoZSBjb3B5IHRvIGJlIGRvbmUuIEZvciBpbnN0YW5jZSwKK3RoZSBjcHlfZGF0YSBidWZmZXIgY2FuIGhvbGQgdGhlIGFjdHVhbCBkYXRhIHRvIGJlIGNvcGllZCBvciBpdCBtYXkgaG9sZCBhIGxpc3Qgb2YgcG9pbnRlcnMKK3RvIHRoZSBkYXRhLiBUaGUgY3B5X2Z1bmMgcm91dGluZSBtdXN0IGludGVycHJldCB0aGUgY3B5X2RhdGEgYnVmZmVyIGFwcHJvcHJpYXRlbHkuCisKK1RoZSBpbnRlcmZhY2UgdG8gY3B5X2Z1bmMgaXMgYXMgZm9sbG93czoKK0Bjb2RlCit2b2lkIGNweV9mdW5jKCB2b2lkICpkZXN0aW5hdGlvbiwgdm9pZCAqc291cmNlICkKK0BlbmRjb2RlCit3aGVyZSB2b2lkICpkZXN0aW5hdGlvbiBpcyB0aGUgY3B5X2RhdGEgcG9pbnRlciBmb3IgdGhlIHRocmVhZCBiZWluZyBjb3BpZWQgdG8KK2FuZCB2b2lkICpzb3VyY2UgaXMgdGhlIGNweV9kYXRhIHBvaW50ZXIgZm9yIHRoZSB0aHJlYWQgYmVpbmcgY29waWVkIGZyb20uCisqLwordm9pZAorX19rbXBjX2NvcHlwcml2YXRlKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBzaXplX3QgY3B5X3NpemUsIHZvaWQgKmNweV9kYXRhLCB2b2lkKCpjcHlfZnVuYykodm9pZCosdm9pZCopLCBrbXBfaW50MzIgZGlkaXQgKQoreworICAgIHZvaWQgKipkYXRhX3B0cjsKKworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfY29weXByaXZhdGU6IGNhbGxlZCBUIyVkXG4iLCBndGlkICkpOworCisgICAgS01QX01CKCk7CisKKyAgICBkYXRhX3B0ciA9ICYgX19rbXBfdGVhbV9mcm9tX2d0aWQoIGd0aWQgKS0+dC50X2NvcHlwcml2X2RhdGE7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgaWYgKCBsb2MgPT0gMCApIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBDb25zdHJ1Y3RJZGVudEludmFsaWQgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFRvRG86IE9wdGltaXplIHRoZSBmb2xsb3dpbmcgdHdvIGJhcnJpZXJzIGludG8gc29tZSBraW5kIG9mIHNwbGl0IGJhcnJpZXIgKi8KKworICAgIGlmIChkaWRpdCkgKmRhdGFfcHRyID0gY3B5X2RhdGE7CisKKyAgICAvKiBUaGlzIGJhcnJpZXIgaXMgbm90IGEgYmFycmllciByZWdpb24gYm91bmRhcnkgKi8KKyAgICBfX2ttcF9iYXJyaWVyKCBic19wbGFpbl9iYXJyaWVyLCBndGlkLCBGQUxTRSAsIDAsIE5VTEwsIE5VTEwgKTsKKworICAgIGlmICghIGRpZGl0KSAoKmNweV9mdW5jKSggY3B5X2RhdGEsICpkYXRhX3B0ciApOworCisgICAgLyogQ29uc2lkZXIgbmV4dCBiYXJyaWVyIHRoZSB1c2VyLXZpc2libGUgYmFycmllciBmb3IgYmFycmllciByZWdpb24gYm91bmRhcmllcyAqLworICAgIC8qIE5lc3RpbmcgY2hlY2tzIGFyZSBhbHJlYWR5IGhhbmRsZWQgYnkgdGhlIHNpbmdsZSBjb25zdHJ1Y3QgY2hlY2tzICovCisKKyAgICBfX2ttcF9iYXJyaWVyKCBic19wbGFpbl9iYXJyaWVyLCBndGlkLCBGQUxTRSAsIDAsIE5VTEwsIE5VTEwgKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBJTklUX0xPQ0sgICAgICAgICAgICAgICAgIF9fa21wX2luaXRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzCisjZGVmaW5lIElOSVRfTkVTVEVEX0xPQ0sgICAgICAgICAgX19rbXBfaW5pdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzCisjZGVmaW5lIEFDUVVJUkVfTE9DSyAgICAgICAgICAgICAgX19rbXBfYWNxdWlyZV91c2VyX2xvY2tfd2l0aF9jaGVja3MKKyNkZWZpbmUgQUNRVUlSRV9MT0NLX1RJTUVEICAgICAgICBfX2ttcF9hY3F1aXJlX3VzZXJfbG9ja193aXRoX2NoZWNrc190aW1lZAorI2RlZmluZSBBQ1FVSVJFX05FU1RFRF9MT0NLICAgICAgIF9fa21wX2FjcXVpcmVfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrcworI2RlZmluZSBBQ1FVSVJFX05FU1RFRF9MT0NLX1RJTUVEIF9fa21wX2FjcXVpcmVfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc190aW1lZAorI2RlZmluZSBSRUxFQVNFX0xPQ0sgICAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfdXNlcl9sb2NrX3dpdGhfY2hlY2tzCisjZGVmaW5lIFJFTEVBU0VfTkVTVEVEX0xPQ0sgICAgICAgX19rbXBfcmVsZWFzZV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzCisjZGVmaW5lIFRFU1RfTE9DSyAgICAgICAgICAgICAgICAgX19rbXBfdGVzdF91c2VyX2xvY2tfd2l0aF9jaGVja3MKKyNkZWZpbmUgVEVTVF9ORVNURURfTE9DSyAgICAgICAgICBfX2ttcF90ZXN0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3MKKyNkZWZpbmUgREVTVFJPWV9MT0NLICAgICAgICAgICAgICBfX2ttcF9kZXN0cm95X3VzZXJfbG9ja193aXRoX2NoZWNrcworI2RlZmluZSBERVNUUk9ZX05FU1RFRF9MT0NLICAgICAgIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrcworCisKKy8qCisgKiBUT0RPOiBNYWtlIGNoZWNrIGFib3J0IG1lc3NhZ2VzIHVzZSBsb2NhdGlvbiBpbmZvICYgcGFzcyBpdAorICogaW50byB3aXRoX2NoZWNrcyByb3V0aW5lcworICovCisKKy8qIGluaXRpYWxpemUgdGhlIGxvY2sgKi8KK3ZvaWQKK19fa21wY19pbml0X2xvY2soIGlkZW50X3QgKiBsb2MsIGttcF9pbnQzMiBndGlkLCAgdm9pZCAqKiB1c2VyX2xvY2sgKSB7CisgICAgc3RhdGljIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9pbml0X2xvY2siOworICAgIGttcF91c2VyX2xvY2tfcCBsY2s7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBpZiAoIHVzZXJfbG9jayA9PSBOVUxMICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBLTVBfQ0hFQ0tfVVNFUl9MT0NLX0lOSVQoKTsKKworICAgIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKQorICAgICAgJiYgKCBzaXplb2YoIGxjay0+dGFzLmxrLnBvbGwgKSA8PSBPTVBfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0pCisgICAgZWxzZSBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfZnV0ZXggKQorICAgICAgJiYgKCBzaXplb2YoIGxjay0+ZnV0ZXgubGsucG9sbCApIDw9IE9NUF9MT0NLX1RfU0laRSApICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlIHsKKyAgICAgICAgbGNrID0gX19rbXBfdXNlcl9sb2NrX2FsbG9jYXRlKCB1c2VyX2xvY2ssIGd0aWQsIDAgKTsKKyAgICB9CisgICAgSU5JVF9MT0NLKCBsY2sgKTsKKyAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2xvY2F0aW9uKCBsY2ssIGxvYyApOworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9sb2NrX2NyZWF0aW5nKCBsY2sgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCit9IC8vIF9fa21wY19pbml0X2xvY2sKKworLyogaW5pdGlhbGl6ZSB0aGUgbG9jayAqLwordm9pZAorX19rbXBjX2luaXRfbmVzdF9sb2NrKCBpZGVudF90ICogbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKiB1c2VyX2xvY2sgKSB7CisgICAgc3RhdGljIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9pbml0X25lc3RfbG9jayI7CisgICAga21wX3VzZXJfbG9ja19wIGxjazsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGlmICggdXNlcl9sb2NrID09IE5VTEwgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEtNUF9DSEVDS19VU0VSX0xPQ0tfSU5JVCgpOworCisgICAgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX3RhcyApICYmICggc2l6ZW9mKCBsY2stPnRhcy5say5wb2xsICkKKyAgICAgICsgc2l6ZW9mKCBsY2stPnRhcy5say5kZXB0aF9sb2NrZWQgKSA8PSBPTVBfTkVTVF9MT0NLX1RfU0laRSApICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyAgICB9CisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSkKKyAgICBlbHNlIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa19mdXRleCApCisgICAgICYmICggc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLnBvbGwgKSArIHNpemVvZiggbGNrLT5mdXRleC5say5kZXB0aF9sb2NrZWQgKQorICAgICA8PSBPTVBfTkVTVF9MT0NLX1RfU0laRSApICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlIHsKKyAgICAgICAgbGNrID0gX19rbXBfdXNlcl9sb2NrX2FsbG9jYXRlKCB1c2VyX2xvY2ssIGd0aWQsIDAgKTsKKyAgICB9CisKKyAgICBJTklUX05FU1RFRF9MT0NLKCBsY2sgKTsKKyAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2xvY2F0aW9uKCBsY2ssIGxvYyApOworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9sb2NrX2NyZWF0aW5nKCBsY2sgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCit9IC8vIF9fa21wY19pbml0X25lc3RfbG9jaworCit2b2lkCitfX2ttcGNfZGVzdHJveV9sb2NrKCBpZGVudF90ICogbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKiB1c2VyX2xvY2sgKSB7CisKKyAgICBrbXBfdXNlcl9sb2NrX3AgbGNrOworCisgICAgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX3RhcyApCisgICAgICAmJiAoIHNpemVvZiggbGNrLT50YXMubGsucG9sbCApIDw9IE9NUF9MT0NLX1RfU0laRSApICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyAgICB9CisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSkKKyAgICBlbHNlIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa19mdXRleCApCisgICAgICAmJiAoIHNpemVvZiggbGNrLT5mdXRleC5say5wb2xsICkgPD0gT01QX0xPQ0tfVF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICAgIH0KKyNlbmRpZgorICAgIGVsc2UgeworICAgICAgICBsY2sgPSBfX2ttcF9sb29rdXBfdXNlcl9sb2NrKCB1c2VyX2xvY2ssICJvbXBfZGVzdHJveV9sb2NrIiApOworICAgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfbG9ja19kZXN0cm95ZWQoIGxjayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICBERVNUUk9ZX0xPQ0soIGxjayApOworCisgICAgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX3RhcyApCisgICAgICAmJiAoIHNpemVvZiggbGNrLT50YXMubGsucG9sbCApIDw9IE9NUF9MT0NLX1RfU0laRSApICkgeworICAgICAgICA7CisgICAgfQorI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0pCisgICAgZWxzZSBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfZnV0ZXggKQorICAgICAgJiYgKCBzaXplb2YoIGxjay0+ZnV0ZXgubGsucG9sbCApIDw9IE9NUF9MT0NLX1RfU0laRSApICkgeworICAgICAgICA7CisgICAgfQorI2VuZGlmCisgICAgZWxzZSB7CisgICAgICAgIF9fa21wX3VzZXJfbG9ja19mcmVlKCB1c2VyX2xvY2ssIGd0aWQsIGxjayApOworICAgIH0KK30gLy8gX19rbXBjX2Rlc3Ryb3lfbG9jaworCisvKiBkZXN0cm95IHRoZSBsb2NrICovCit2b2lkCitfX2ttcGNfZGVzdHJveV9uZXN0X2xvY2soIGlkZW50X3QgKiBsb2MsIGttcF9pbnQzMiBndGlkLCB2b2lkICoqIHVzZXJfbG9jayApIHsKKworICAgIGttcF91c2VyX2xvY2tfcCBsY2s7CisKKyAgICBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfdGFzICkgJiYgKCBzaXplb2YoIGxjay0+dGFzLmxrLnBvbGwgKQorICAgICAgKyBzaXplb2YoIGxjay0+dGFzLmxrLmRlcHRoX2xvY2tlZCApIDw9IE9NUF9ORVNUX0xPQ0tfVF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICAgIH0KKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNKQorICAgIGVsc2UgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX2Z1dGV4ICkKKyAgICAgJiYgKCBzaXplb2YoIGxjay0+ZnV0ZXgubGsucG9sbCApICsgc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLmRlcHRoX2xvY2tlZCApCisgICAgIDw9IE9NUF9ORVNUX0xPQ0tfVF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICAgIH0KKyNlbmRpZgorICAgIGVsc2UgeworICAgICAgICBsY2sgPSBfX2ttcF9sb29rdXBfdXNlcl9sb2NrKCB1c2VyX2xvY2ssICJvbXBfZGVzdHJveV9uZXN0X2xvY2siICk7CisgICAgfQorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9sb2NrX2Rlc3Ryb3llZCggbGNrICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgREVTVFJPWV9ORVNURURfTE9DSyggbGNrICk7CisKKyAgICBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfdGFzICkgJiYgKCBzaXplb2YoIGxjay0+dGFzLmxrLnBvbGwgKQorICAgICArIHNpemVvZiggbGNrLT50YXMubGsuZGVwdGhfbG9ja2VkICkgPD0gT01QX05FU1RfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgOworICAgIH0KKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNKQorICAgIGVsc2UgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX2Z1dGV4ICkKKyAgICAgJiYgKCBzaXplb2YoIGxjay0+ZnV0ZXgubGsucG9sbCApICsgc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLmRlcHRoX2xvY2tlZCApCisgICAgIDw9IE9NUF9ORVNUX0xPQ0tfVF9TSVpFICkgKSB7CisgICAgICAgIDsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfdXNlcl9sb2NrX2ZyZWUoIHVzZXJfbG9jaywgZ3RpZCwgbGNrICk7CisgICAgfQorfSAvLyBfX2ttcGNfZGVzdHJveV9uZXN0X2xvY2sKKwordm9pZAorX19rbXBjX3NldF9sb2NrKCBpZGVudF90ICogbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKiB1c2VyX2xvY2sgKSB7CisgICAga21wX3VzZXJfbG9ja19wIGxjazsKKworICAgIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKQorICAgICAgJiYgKCBzaXplb2YoIGxjay0+dGFzLmxrLnBvbGwgKSA8PSBPTVBfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0pCisgICAgZWxzZSBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfZnV0ZXggKQorICAgICAgJiYgKCBzaXplb2YoIGxjay0+ZnV0ZXgubGsucG9sbCApIDw9IE9NUF9MT0NLX1RfU0laRSApICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlIHsKKyAgICAgICAgbGNrID0gX19rbXBfbG9va3VwX3VzZXJfbG9jayggdXNlcl9sb2NrLCAib21wX3NldF9sb2NrIiApOworICAgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfbG9ja19hY3F1aXJpbmcoIGxjayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIEFDUVVJUkVfTE9DSyggbGNrLCBndGlkICk7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2xvY2tfYWNxdWlyZWQoIGxjayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KK30KKworCit2b2lkCitfX2ttcGNfc2V0X25lc3RfbG9jayggaWRlbnRfdCAqIGxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKiogdXNlcl9sb2NrICkgeworICAgIGttcF91c2VyX2xvY2tfcCBsY2s7CisKKyAgICBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfdGFzICkgJiYgKCBzaXplb2YoIGxjay0+dGFzLmxrLnBvbGwgKQorICAgICAgKyBzaXplb2YoIGxjay0+dGFzLmxrLmRlcHRoX2xvY2tlZCApIDw9IE9NUF9ORVNUX0xPQ0tfVF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICAgIH0KKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNKQorICAgIGVsc2UgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX2Z1dGV4ICkKKyAgICAgJiYgKCBzaXplb2YoIGxjay0+ZnV0ZXgubGsucG9sbCApICsgc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLmRlcHRoX2xvY2tlZCApCisgICAgIDw9IE9NUF9ORVNUX0xPQ0tfVF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICAgIH0KKyNlbmRpZgorICAgIGVsc2UgeworICAgICAgICBsY2sgPSBfX2ttcF9sb29rdXBfdXNlcl9sb2NrKCB1c2VyX2xvY2ssICJvbXBfc2V0X25lc3RfbG9jayIgKTsKKyAgICB9CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2xvY2tfYWNxdWlyaW5nKCBsY2sgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICBBQ1FVSVJFX05FU1RFRF9MT0NLKCBsY2ssIGd0aWQgKTsKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfbG9ja19hY3F1aXJlZCggbGNrICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworfQorCit2b2lkCitfX2ttcGNfdW5zZXRfbG9jayggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKnVzZXJfbG9jayApCit7CisgICAga21wX3VzZXJfbG9ja19wIGxjazsKKworICAgIC8qIENhbid0IHVzZSBzZXJpYWwgaW50ZXJ2YWwgc2luY2Ugbm90IGJsb2NrIHN0cnVjdHVyZWQgKi8KKyAgICAvKiByZWxlYXNlIHRoZSBsb2NrICovCisKKyAgICBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfdGFzICkKKyAgICAgICYmICggc2l6ZW9mKCBsY2stPnRhcy5say5wb2xsICkgPD0gT01QX0xPQ0tfVF9TSVpFICkgKSB7CisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSkKKyAgICAgICAgLy8gImZhc3QiIHBhdGggaW1wbGVtZW50ZWQgdG8gZml4IGN1c3RvbWVyIHBlcmZvcm1hbmNlIGlzc3VlCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICBfX2ttcF9pdHRfbG9ja19yZWxlYXNpbmcoIChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgICAgICBUQ1dfNCgoKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2spLT50YXMubGsucG9sbCwgMCk7CisgICAgICAgIEtNUF9NQigpOworICAgICAgICByZXR1cm47CisjZWxzZQorICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyNlbmRpZgorICAgIH0KKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNKQorICAgIGVsc2UgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX2Z1dGV4ICkKKyAgICAgICYmICggc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLnBvbGwgKSA8PSBPTVBfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2VuZGlmCisgICAgZWxzZSB7CisgICAgICAgIGxjayA9IF9fa21wX2xvb2t1cF91c2VyX2xvY2soIHVzZXJfbG9jaywgIm9tcF91bnNldF9sb2NrIiApOworICAgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfbG9ja19yZWxlYXNpbmcoIGxjayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIFJFTEVBU0VfTE9DSyggbGNrLCBndGlkICk7Cit9CisKKy8qIHJlbGVhc2UgdGhlIGxvY2sgKi8KK3ZvaWQKK19fa21wY191bnNldF9uZXN0X2xvY2soIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKip1c2VyX2xvY2sgKQoreworICAgIGttcF91c2VyX2xvY2tfcCBsY2s7CisKKyAgICAvKiBDYW4ndCB1c2Ugc2VyaWFsIGludGVydmFsIHNpbmNlIG5vdCBibG9jayBzdHJ1Y3R1cmVkICovCisKKyAgICBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfdGFzICkgJiYgKCBzaXplb2YoIGxjay0+dGFzLmxrLnBvbGwgKQorICAgICAgKyBzaXplb2YoIGxjay0+dGFzLmxrLmRlcHRoX2xvY2tlZCApIDw9IE9NUF9ORVNUX0xPQ0tfVF9TSVpFICkgKSB7CisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSkKKyAgICAgICAgLy8gImZhc3QiIHBhdGggaW1wbGVtZW50ZWQgdG8gZml4IGN1c3RvbWVyIHBlcmZvcm1hbmNlIGlzc3VlCisgICAgICAgIGttcF90YXNfbG9ja190ICp0bCA9IChrbXBfdGFzX2xvY2tfdCopdXNlcl9sb2NrOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgX19rbXBfaXR0X2xvY2tfcmVsZWFzaW5nKCAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICAgICAgaWYgKCAtLSh0bC0+bGsuZGVwdGhfbG9ja2VkKSA9PSAwICkgeworICAgICAgICAgICAgVENXXzQodGwtPmxrLnBvbGwsIDApOworICAgICAgICB9CisgICAgICAgIEtNUF9NQigpOworICAgICAgICByZXR1cm47CisjZWxzZQorICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyNlbmRpZgorICAgIH0KKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNKQorICAgIGVsc2UgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX2Z1dGV4ICkKKyAgICAgJiYgKCBzaXplb2YoIGxjay0+ZnV0ZXgubGsucG9sbCApICsgc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLmRlcHRoX2xvY2tlZCApCisgICAgIDw9IE9NUF9ORVNUX0xPQ0tfVF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICAgIH0KKyNlbmRpZgorICAgIGVsc2UgeworICAgICAgICBsY2sgPSBfX2ttcF9sb29rdXBfdXNlcl9sb2NrKCB1c2VyX2xvY2ssICJvbXBfdW5zZXRfbmVzdF9sb2NrIiApOworICAgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfbG9ja19yZWxlYXNpbmcoIGxjayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIFJFTEVBU0VfTkVTVEVEX0xPQ0soIGxjaywgZ3RpZCApOworfQorCisvKiB0cnkgdG8gYWNxdWlyZSB0aGUgbG9jayAqLworaW50CitfX2ttcGNfdGVzdF9sb2NrKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCB2b2lkICoqdXNlcl9sb2NrICkKK3sKKyAgICBrbXBfdXNlcl9sb2NrX3AgbGNrOworICAgIGludCAgICAgICAgICByYzsKKworICAgIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKQorICAgICAgJiYgKCBzaXplb2YoIGxjay0+dGFzLmxrLnBvbGwgKSA8PSBPTVBfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0pCisgICAgZWxzZSBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfZnV0ZXggKQorICAgICAgJiYgKCBzaXplb2YoIGxjay0+ZnV0ZXgubGsucG9sbCApIDw9IE9NUF9MT0NLX1RfU0laRSApICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlIHsKKyAgICAgICAgbGNrID0gX19rbXBfbG9va3VwX3VzZXJfbG9jayggdXNlcl9sb2NrLCAib21wX3Rlc3RfbG9jayIgKTsKKyAgICB9CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2xvY2tfYWNxdWlyaW5nKCBsY2sgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICByYyA9IFRFU1RfTE9DSyggbGNrLCBndGlkICk7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgIGlmICggcmMgKSB7CisgICAgICAgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmVkKCBsY2sgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9pdHRfbG9ja19jYW5jZWxsZWQoIGxjayApOworICAgIH0KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgcmV0dXJuICggcmMgPyBGVE5fVFJVRSA6IEZUTl9GQUxTRSApOworCisgICAgLyogQ2FuJ3QgdXNlIHNlcmlhbCBpbnRlcnZhbCBzaW5jZSBub3QgYmxvY2sgc3RydWN0dXJlZCAqLworfQorCisvKiB0cnkgdG8gYWNxdWlyZSB0aGUgbG9jayAqLworaW50CitfX2ttcGNfdGVzdF9uZXN0X2xvY2soIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKip1c2VyX2xvY2sgKQoreworICAgIGttcF91c2VyX2xvY2tfcCBsY2s7CisgICAgaW50ICAgICAgICAgIHJjOworCisgICAgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX3RhcyApICYmICggc2l6ZW9mKCBsY2stPnRhcy5say5wb2xsICkKKyAgICAgICsgc2l6ZW9mKCBsY2stPnRhcy5say5kZXB0aF9sb2NrZWQgKSA8PSBPTVBfTkVTVF9MT0NLX1RfU0laRSApICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyAgICB9CisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSkKKyAgICBlbHNlIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa19mdXRleCApCisgICAgICYmICggc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLnBvbGwgKSArIHNpemVvZiggbGNrLT5mdXRleC5say5kZXB0aF9sb2NrZWQgKQorICAgICA8PSBPTVBfTkVTVF9MT0NLX1RfU0laRSApICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlIHsKKyAgICAgICAgbGNrID0gX19rbXBfbG9va3VwX3VzZXJfbG9jayggdXNlcl9sb2NrLCAib21wX3Rlc3RfbmVzdF9sb2NrIiApOworICAgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfbG9ja19hY3F1aXJpbmcoIGxjayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIHJjID0gVEVTVF9ORVNURURfTE9DSyggbGNrLCBndGlkICk7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgIGlmICggcmMgKSB7CisgICAgICAgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmVkKCBsY2sgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9pdHRfbG9ja19jYW5jZWxsZWQoIGxjayApOworICAgIH0KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgcmV0dXJuIHJjOworCisgICAgLyogQ2FuJ3QgdXNlIHNlcmlhbCBpbnRlcnZhbCBzaW5jZSBub3QgYmxvY2sgc3RydWN0dXJlZCAqLworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogSW50ZXJmYWNlIHRvIGZhc3Qgc2NhbGFibGUgcmVkdWNlIG1ldGhvZHMgcm91dGluZXMKKyAqLworCisvLyBrZWVwIHRoZSBzZWxlY3RlZCBtZXRob2QgaW4gYSB0aHJlYWQgbG9jYWwgc3RydWN0dXJlIGZvciBjcm9zcy1mdW5jdGlvbiB1c2FnZTogd2lsbCBiZSB1c2VkIGluIF9fa21wY19lbmRfcmVkdWNlKiBmdW5jdGlvbnM7CisvLyBhbm90aGVyIHNvbHV0aW9uOiB0byByZS1kZXRlcm1pbmUgdGhlIG1ldGhvZCBvbmUgbW9yZSB0aW1lIGluIF9fa21wY19lbmRfcmVkdWNlKiBmdW5jdGlvbnMgKG5ldyBwcm90b3R5cGUgcmVxdWlyZWQgdGhlbikKKy8vIEFUOiB3aGljaCBzb2x1dGlvbiBpcyBiZXR0ZXI/CisjZGVmaW5lIF9fS01QX1NFVF9SRURVQ1RJT05fTUVUSE9EKGd0aWQscm1ldGhvZCkgXAorICAgICAgICAgICAgICAgICAgICggKCBfX2ttcF90aHJlYWRzWyAoIGd0aWQgKSBdIC0+IHRoLnRoX2xvY2FsLnBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kICkgPSAoIHJtZXRob2QgKSApCisKKyNkZWZpbmUgX19LTVBfR0VUX1JFRFVDVElPTl9NRVRIT0QoZ3RpZCkgXAorICAgICAgICAgICAgICAgICAgICggX19rbXBfdGhyZWFkc1sgKCBndGlkICkgXSAtPiB0aC50aF9sb2NhbC5wYWNrZWRfcmVkdWN0aW9uX21ldGhvZCApCisKKy8vIGRlc2NyaXB0aW9uIG9mIHRoZSBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCB2YXJpYWJsZTogbG9vayBhdCB0aGUgbWFjcm9zIGluIGttcC5oCisKKworLy8gdXNlZCBpbiBhIGNyaXRpY2FsIHNlY3Rpb24gcmVkdWNlIGJsb2NrCitzdGF0aWMgX19mb3JjZWlubGluZSB2b2lkCitfX2ttcF9lbnRlcl9jcml0aWNhbF9zZWN0aW9uX3JlZHVjZV9ibG9jayggaWRlbnRfdCAqIGxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9jcml0aWNhbF9uYW1lICogY3JpdCApIHsKKworICAgIC8vIHRoaXMgbG9jayB3YXMgdmlzaWJsZSB0byBhIGN1c3RvbWVyIGFuZCB0byB0aGUgdGhyZWFkIHByb2ZpbGVyIGFzIGEgc2VyaWFsIG92ZXJoZWFkIHNwYW4KKyAgICAvLyAgICAgICAgICAgIChhbHRob3VnaCBpdCdzIHVzZWQgZm9yIGFuIGludGVybmFsIHB1cnBvc2Ugb25seSkKKyAgICAvLyAgICAgICAgICAgIHdoeSB3YXMgaXQgdmlzaWJsZSBpbiBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbj8KKyAgICAvLyAgICAgICAgICAgIHNob3VsZCB3ZSBrZWVwIGl0IHZpc2libGUgaW4gbmV3IHJlZHVjZSBibG9jaz8KKyAgICBrbXBfdXNlcl9sb2NrX3AgbGNrOworCisgICAgLy8gV2Uga25vdyB0aGF0IHRoZSBmYXN0IHJlZHVjdGlvbiBjb2RlIGlzIG9ubHkgZW1pdHRlZCBieSBJbnRlbCBjb21waWxlcnMKKyAgICAvLyB3aXRoIDMyIGJ5dGUgY3JpdGljYWwgc2VjdGlvbnMuIElmIHRoZXJlIGlzbid0IGVub3VnaCBzcGFjZSwgdGhlbiB3ZQorICAgIC8vIGhhdmUgdG8gdXNlIGEgcG9pbnRlci4KKyAgICBpZiAoIF9fa21wX2Jhc2VfdXNlcl9sb2NrX3NpemUgPD0gSU5URUxfQ1JJVElDQUxfU0laRSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCljcml0OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbGNrID0gX19rbXBfZ2V0X2NyaXRpY2FsX3NlY3Rpb25fcHRyKCBjcml0LCBsb2MsIGdsb2JhbF90aWQgKTsKKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVCggbGNrICE9IE5VTEwgKTsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgX19rbXBfcHVzaF9zeW5jKCBnbG9iYWxfdGlkLCBjdF9jcml0aWNhbCwgbG9jLCBsY2sgKTsKKworICAgIF9fa21wX2FjcXVpcmVfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKCBsY2ssIGdsb2JhbF90aWQgKTsKK30KKworLy8gdXNlZCBpbiBhIGNyaXRpY2FsIHNlY3Rpb24gcmVkdWNlIGJsb2NrCitzdGF0aWMgX19mb3JjZWlubGluZSB2b2lkCitfX2ttcF9lbmRfY3JpdGljYWxfc2VjdGlvbl9yZWR1Y2VfYmxvY2soIGlkZW50X3QgKiBsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBfY3JpdGljYWxfbmFtZSAqIGNyaXQgKSB7CisKKyAgICBrbXBfdXNlcl9sb2NrX3AgbGNrOworCisgICAgLy8gV2Uga25vdyB0aGF0IHRoZSBmYXN0IHJlZHVjdGlvbiBjb2RlIGlzIG9ubHkgZW1pdHRlZCBieSBJbnRlbCBjb21waWxlcnMgd2l0aCAzMiBieXRlIGNyaXRpY2FsCisgICAgLy8gc2VjdGlvbnMuIElmIHRoZXJlIGlzbid0IGVub3VnaCBzcGFjZSwgdGhlbiB3ZSBoYXZlIHRvIHVzZSBhIHBvaW50ZXIuCisgICAgaWYgKCBfX2ttcF9iYXNlX3VzZXJfbG9ja19zaXplID4gMzIgKSB7CisgICAgICAgIGxjayA9ICooIChrbXBfdXNlcl9sb2NrX3AgKikgY3JpdCApOworICAgICAgICBLTVBfQVNTRVJUKCBsY2sgIT0gTlVMTCApOworICAgIH0gZWxzZSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApIGNyaXQ7CisgICAgfQorCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wb3Bfc3luYyggZ2xvYmFsX3RpZCwgY3RfY3JpdGljYWwsIGxvYyApOworCisgICAgX19rbXBfcmVsZWFzZV91c2VyX2xvY2tfd2l0aF9jaGVja3MoIGxjaywgZ2xvYmFsX3RpZCApOworCit9IC8vIF9fa21wX2VuZF9jcml0aWNhbF9zZWN0aW9uX3JlZHVjZV9ibG9jaworCisKKy8qIDIuYS5pLiBSZWR1Y2UgQmxvY2sgd2l0aG91dCBhIHRlcm1pbmF0aW5nIGJhcnJpZXIgKi8KKy8qIQorQGluZ3JvdXAgU1lOQ0hST05JWkFUSU9OCitAcGFyYW0gbG9jIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGdsb2JhbF90aWQgZ2xvYmFsIHRocmVhZCBudW1iZXIKK0BwYXJhbSBudW1fdmFycyBudW1iZXIgb2YgaXRlbXMgKHZhcmlhYmxlcykgdG8gYmUgcmVkdWNlZAorQHBhcmFtIHJlZHVjZV9zaXplIHNpemUgb2YgZGF0YSBpbiBieXRlcyB0byBiZSByZWR1Y2VkCitAcGFyYW0gcmVkdWNlX2RhdGEgcG9pbnRlciB0byBkYXRhIHRvIGJlIHJlZHVjZWQKK0BwYXJhbSByZWR1Y2VfZnVuYyBjYWxsYmFjayBmdW5jdGlvbiBwcm92aWRpbmcgcmVkdWN0aW9uIG9wZXJhdGlvbiBvbiB0d28gb3BlcmFuZHMgYW5kIHJldHVybmluZyByZXN1bHQgb2YgcmVkdWN0aW9uIGluIGxoc19kYXRhCitAcGFyYW0gbGNrIHBvaW50ZXIgdG8gdGhlIHVuaXF1ZSBsb2NrIGRhdGEgc3RydWN0dXJlCitAcmVzdWx0IDEgZm9yIHRoZSBtYXN0ZXIgdGhyZWFkLCAwIGZvciBhbGwgb3RoZXIgdGVhbSB0aHJlYWRzLCAyIGZvciBhbGwgdGVhbSB0aHJlYWRzIGlmIGF0b21pYyByZWR1Y3Rpb24gbmVlZGVkCisKK1RoZSBub3dhaXQgdmVyc2lvbiBpcyB1c2VkIGZvciBhIHJlZHVjZSBjbGF1c2Ugd2l0aCB0aGUgbm93YWl0IGFyZ3VtZW50LgorKi8KK2ttcF9pbnQzMgorX19rbXBjX3JlZHVjZV9ub3dhaXQoCisgICAgaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwKKyAgICBrbXBfaW50MzIgbnVtX3ZhcnMsIHNpemVfdCByZWR1Y2Vfc2l6ZSwgdm9pZCAqcmVkdWNlX2RhdGEsIHZvaWQgKCpyZWR1Y2VfZnVuYykodm9pZCAqbGhzX2RhdGEsIHZvaWQgKnJoc19kYXRhKSwKKyAgICBrbXBfY3JpdGljYWxfbmFtZSAqbGNrICkgeworCisgICAgaW50IHJldHZhbDsKKyAgICBQQUNLRURfUkVEVUNUSU9OX01FVEhPRF9UIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kOworCisgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcGNfcmVkdWNlX25vd2FpdCgpIGVudGVyOiBjYWxsZWQgVCMlZFxuIiwgZ2xvYmFsX3RpZCApICk7CisKKyAgICAvLyB3aHkgZG8gd2UgbmVlZCB0aGlzIGluaXRpYWxpemF0aW9uIGhlcmUgYXQgYWxsPworICAgIC8vIFJlZHVjdGlvbiBjbGF1c2UgY2FuIG5vdCBiZSB1c2VkIGFzIGEgc3RhbmQtYWxvbmUgZGlyZWN0aXZlLgorCisgICAgLy8gZG8gbm90IGNhbGwgX19rbXBfc2VyaWFsX2luaXRpYWxpemUoKSwgaXQgd2lsbCBiZSBjYWxsZWQgYnkgX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSgpIGlmIG5lZWRlZAorICAgIC8vIHBvc3NpYmxlIGRldGVjdGlvbiBvZiBmYWxzZS1wb3NpdGl2ZSByYWNlIGJ5IHRoZSB0aHJlYWRjaGVja2VyID8/PworICAgIGlmKCAhIFRDUl80KCBfX2ttcF9pbml0X3BhcmFsbGVsICkgKQorICAgICAgICBfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCk7CisKKyAgICAvLyBjaGVjayBjb3JyZWN0bmVzcyBvZiByZWR1Y2UgYmxvY2sgbmVzdGluZworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgX19rbXBfcHVzaF9zeW5jKCBnbG9iYWxfdGlkLCBjdF9yZWR1Y2UsIGxvYywgTlVMTCApOworCisgICAgLy8gaXQncyBiZXR0ZXIgdG8gY2hlY2sgYW4gYXNzZXJ0aW9uIEFTU0VSVCggdGhyX3N0YXRlID09IFRIUl9XT1JLX1NUQVRFICkKKworICAgIC8vIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kIHZhbHVlIHdpbGwgYmUgcmV1c2VkIGJ5IF9fa21wX2VuZF9yZWR1Y2UqIGZ1bmN0aW9uLCB0aGUgdmFsdWUgc2hvdWxkIGJlIGtlcHQgaW4gYSB2YXJpYWJsZQorICAgIC8vIHRoZSB2YXJpYWJsZSBzaG91bGQgYmUgZWl0aGVyIGEgY29uc3RydWN0LXNwZWNpZmljIG9yIHRocmVhZC1zcGVjaWZpYyBwcm9wZXJ0eSwgbm90IGEgdGVhbSBzcGVjaWZpYyBwcm9wZXJ0eQorICAgIC8vICAgICAoYSB0aHJlYWQgY2FuIHJlYWNoIHRoZSBuZXh0IHJlZHVjZSBibG9jayBvbiB0aGUgbmV4dCBjb25zdHJ1Y3QsIHJlZHVjZSBtZXRob2QgbWF5IGRpZmZlciBvbiB0aGUgbmV4dCBjb25zdHJ1Y3QpCisgICAgLy8gYW4gaWRlbnRfdCAibG9jIiBwYXJhbWV0ZXIgY291bGQgYmUgdXNlZCBhcyBhIGNvbnN0cnVjdC1zcGVjaWZpYyBwcm9wZXJ0eSAod2hhdCBpZiBsb2MgPT0gMD8pCisgICAgLy8gICAgIChpZiBib3RoIGNvbnN0cnVjdC1zcGVjaWZpYyBhbmQgdGVhbS1zcGVjaWZpYyB2YXJpYWJsZXMgd2VyZSBzaGFyZWQsIHRoZW4gdW5uZXNzIGV4dHJhIHN5bmNzIHNob3VsZCBiZSBuZWVkZWQpCisgICAgLy8gYSB0aHJlYWQtc3BlY2lmaWMgdmFyaWFibGUgaXMgYmV0dGVyIHJlZ2FyZGluZyB0d28gaXNzdWVzIGFib3ZlIChuZXh0IGNvbnN0cnVjdCBhbmQgZXh0cmEgc3luY3MpCisgICAgLy8gYSB0aHJlYWQtc3BlY2lmaWMgInRoX2xvY2FsLnJlZHVjdGlvbl9tZXRob2QiIHZhcmlhYmxlIGlzIHVzZWQgY3VycmVudGx5CisgICAgLy8gZWFjaCB0aHJlYWQgZXhlY3V0ZXMgJ2RldGVybWluZScgYW5kICdzZXQnIGxpbmVzIChubyBuZWVkIHRvIGV4ZWN1dGUgYnkgb25lIHRocmVhZCwgdG8gYXZvaWQgdW5uZXNzIGV4dHJhIHN5bmNzKQorCisgICAgcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgPSBfX2ttcF9kZXRlcm1pbmVfcmVkdWN0aW9uX21ldGhvZCggbG9jLCBnbG9iYWxfdGlkLCBudW1fdmFycywgcmVkdWNlX3NpemUsIHJlZHVjZV9kYXRhLCByZWR1Y2VfZnVuYywgbGNrICk7CisgICAgX19LTVBfU0VUX1JFRFVDVElPTl9NRVRIT0QoIGdsb2JhbF90aWQsIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kICk7CisKKyAgICBpZiggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgPT0gY3JpdGljYWxfcmVkdWNlX2Jsb2NrICkgeworCisgICAgICAgIF9fa21wX2VudGVyX2NyaXRpY2FsX3NlY3Rpb25fcmVkdWNlX2Jsb2NrKCBsb2MsIGdsb2JhbF90aWQsIGxjayApOworICAgICAgICByZXR2YWwgPSAxOworCisgICAgfSBlbHNlIGlmKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCA9PSBlbXB0eV9yZWR1Y2VfYmxvY2sgKSB7CisKKyAgICAgICAgLy8gdXNhZ2U6IGlmIHRlYW0gc2l6ZSA9PSAxLCBubyBzeW5jaHJvbml6YXRpb24gaXMgcmVxdWlyZWQgKCBJbnRlbCBwbGF0Zm9ybXMgb25seSApCisgICAgICAgIHJldHZhbCA9IDE7CisKKyAgICB9IGVsc2UgaWYoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID09IGF0b21pY19yZWR1Y2VfYmxvY2sgKSB7CisKKyAgICAgICAgcmV0dmFsID0gMjsKKworICAgICAgICAvLyBhbGwgdGhyZWFkcyBzaG91bGQgZG8gdGhpcyBwb3AgaGVyZSAoYmVjYXVzZSBfX2ttcGNfZW5kX3JlZHVjZV9ub3dhaXQoKSB3b24ndCBiZSBjYWxsZWQgYnkgdGhlIGNvZGUgZ2VuKQorICAgICAgICAvLyAgICAgKGl0J3Mgbm90IHF1aXRlIGdvb2QsIGJlY2F1c2UgdGhlIGNoZWNraW5nIGJsb2NrIGhhcyBiZWVuIGNsb3NlZCBieSB0aGlzICdwb3AnLAorICAgICAgICAvLyAgICAgIGJ1dCBhdG9taWMgb3BlcmF0aW9uIGhhcyBub3QgYmVlbiBleGVjdXRlZCB5ZXQsIHdpbGwgYmUgZXhlY3V0ZWQgc2xpZ2h0bHkgbGF0ZXIsIGxpdGVyYWxseSBvbiBuZXh0IGluc3RydWN0aW9uKQorICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApCisgICAgICAgICAgICBfX2ttcF9wb3Bfc3luYyggZ2xvYmFsX3RpZCwgY3RfcmVkdWNlLCBsb2MgKTsKKworICAgIH0gZWxzZSBpZiggVEVTVF9SRURVQ1RJT05fTUVUSE9EKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCwgdHJlZV9yZWR1Y2VfYmxvY2sgKSApIHsKKworICAgICAgICAvL0FUOiBwZXJmb3JtYW5jZSBpc3N1ZTogYSByZWFsIGJhcnJpZXIgaGVyZQorICAgICAgICAvL0FUOiAgICAgKGlmIG1hc3RlciBnb2VzIHNsb3csIG90aGVyIHRocmVhZHMgYXJlIGJsb2NrZWQgaGVyZSB3YWl0aW5nIGZvciB0aGUgbWFzdGVyIHRvIGNvbWUgYW5kIHJlbGVhc2UgdGhlbSkKKyAgICAgICAgLy9BVDogICAgIChpdCdzIG5vdCB3aGF0IGEgY3VzdG9tZXIgbWlnaHQgZXhwZWN0IHNwZWNpZnlpbmcgTk9XQUlUIGNsYXVzZSkKKyAgICAgICAgLy9BVDogICAgIChzcGVjaWZ5aW5nIE5PV0FJVCB3b24ndCByZXN1bHQgaW4gaW1wcm92ZW1lbnQgb2YgcGVyZm9ybWFuY2UsIGl0J2xsIGJlIGNvbmZ1c2luZyB0byBhIGN1c3RvbWVyKQorICAgICAgICAvL0FUOiBhbm90aGVyIGltcGxlbWVudGF0aW9uIG9mICpiYXJyaWVyX2dhdGhlcipub3dhaXQoKSAob3Igc29tZSBvdGhlciBkZXNpZ24pIG1pZ2h0IGdvIGZhc3RlcgorICAgICAgICAvLyAgICAgICAgYW5kIGJlIG1vcmUgaW4gbGluZSB3aXRoIHNlbnNlIG9mIE5PV0FJVAorICAgICAgICAvL0FUOiBUTyBETzogZG8gZXBjYyB0ZXN0IGFuZCBjb21wYXJlIHRpbWVzCisKKyAgICAgICAgLy8gdGhpcyBiYXJyaWVyIHNob3VsZCBiZSBpbnZpc2libGUgdG8gYSBjdXN0b21lciBhbmQgdG8gdGhlIHRocmVhZCBwcm9maWxlcgorICAgICAgICAvLyAgICAgICAgICAgICAgKGl0J3MgbmVpdGhlciBhIHRlcm1pbmF0aW5nIGJhcnJpZXIgbm9yIGN1c3RvbWVyJ3MgY29kZSwgaXQncyB1c2VkIGZvciBhbiBpbnRlcm5hbCBwdXJwb3NlKQorICAgICAgICByZXR2YWwgPSBfX2ttcF9iYXJyaWVyKCBVTlBBQ0tfUkVEVUNUSU9OX0JBUlJJRVIoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kICksIGdsb2JhbF90aWQsIEZBTFNFLCByZWR1Y2Vfc2l6ZSwgcmVkdWNlX2RhdGEsIHJlZHVjZV9mdW5jICk7CisgICAgICAgIHJldHZhbCA9ICggcmV0dmFsICE9IDAgKSA/ICggMCApIDogKCAxICk7CisKKyAgICAgICAgLy8gYWxsIG90aGVyIHdvcmtlcnMgZXhjZXB0IG1hc3RlciBzaG91bGQgZG8gdGhpcyBwb3AgaGVyZQorICAgICAgICAvLyAgICAgKCBub25lIG9mIG90aGVyIHdvcmtlcnMgd2lsbCBnZXQgdG8gX19rbXBjX2VuZF9yZWR1Y2Vfbm93YWl0KCkgKQorICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgIGlmKCByZXR2YWwgPT0gMCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9wb3Bfc3luYyggZ2xvYmFsX3RpZCwgY3RfcmVkdWNlLCBsb2MgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfSBlbHNlIHsKKworICAgICAgICAvLyBzaG91bGQgbmV2ZXIgcmVhY2ggdGhpcyBibG9jaworICAgICAgICBLTVBfQVNTRVJUKCAwICk7IC8vICJ1bmV4cGVjdGVkIG1ldGhvZCIKKworICAgIH0KKworICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBjX3JlZHVjZV9ub3dhaXQoKSBleGl0OiBjYWxsZWQgVCMlZDogbWV0aG9kICUwOHgsIHJldHVybnMgJTA4eFxuIiwgZ2xvYmFsX3RpZCwgcGFja2VkX3JlZHVjdGlvbl9tZXRob2QsIHJldHZhbCApICk7CisKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisvKiEKK0Bpbmdyb3VwIFNZTkNIUk9OSVpBVElPTgorQHBhcmFtIGxvYyBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KK0BwYXJhbSBnbG9iYWxfdGlkIGdsb2JhbCB0aHJlYWQgaWQuCitAcGFyYW0gbGNrIHBvaW50ZXIgdG8gdGhlIHVuaXF1ZSBsb2NrIGRhdGEgc3RydWN0dXJlCisKK0ZpbmlzaCB0aGUgZXhlY3V0aW9uIG9mIGEgcmVkdWNlIG5vd2FpdC4KKyovCit2b2lkCitfX2ttcGNfZW5kX3JlZHVjZV9ub3dhaXQoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9jcml0aWNhbF9uYW1lICpsY2sgKSB7CisKKyAgICBQQUNLRURfUkVEVUNUSU9OX01FVEhPRF9UIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kOworCisgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcGNfZW5kX3JlZHVjZV9ub3dhaXQoKSBlbnRlcjogY2FsbGVkIFQjJWRcbiIsIGdsb2JhbF90aWQgKSApOworCisgICAgcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgPSBfX0tNUF9HRVRfUkVEVUNUSU9OX01FVEhPRCggZ2xvYmFsX3RpZCApOworCisgICAgaWYoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID09IGNyaXRpY2FsX3JlZHVjZV9ibG9jayApIHsKKworICAgICAgICBfX2ttcF9lbmRfY3JpdGljYWxfc2VjdGlvbl9yZWR1Y2VfYmxvY2soIGxvYywgZ2xvYmFsX3RpZCwgbGNrICk7CisKKyAgICB9IGVsc2UgaWYoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID09IGVtcHR5X3JlZHVjZV9ibG9jayApIHsKKworICAgICAgICAvLyB1c2FnZTogaWYgdGVhbSBzaXplID09IDEsIG5vIHN5bmNocm9uaXphdGlvbiBpcyByZXF1aXJlZCAoIG9uIEludGVsIHBsYXRmb3JtcyBvbmx5ICkKKworICAgIH0gZWxzZSBpZiggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgPT0gYXRvbWljX3JlZHVjZV9ibG9jayApIHsKKworICAgICAgICAvLyBuZWl0aGVyIG1hc3RlciBub3Igb3RoZXIgd29ya2VycyBzaG91bGQgZ2V0IGhlcmUKKyAgICAgICAgLy8gICAgIChjb2RlIGdlbiBkb2VzIG5vdCBnZW5lcmF0ZSB0aGlzIGNhbGwgaW4gY2FzZSAyOiBhdG9taWMgcmVkdWNlIGJsb2NrKQorICAgICAgICAvLyBhY3R1YWxseSBpdCdzIGJldHRlciB0byByZW1vdmUgdGhpcyBlbHNlaWYgYXQgYWxsOworICAgICAgICAvLyBhZnRlciByZW1vdmFsIHRoaXMgdmFsdWUgd2lsbCBjaGVja2VkIGJ5IHRoZSAnZWxzZScgYW5kIHdpbGwgYXNzZXJ0CisKKyAgICB9IGVsc2UgaWYoIFRFU1RfUkVEVUNUSU9OX01FVEhPRCggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QsIHRyZWVfcmVkdWNlX2Jsb2NrICkgKSB7CisKKyAgICAgICAgLy8gb25seSBtYXN0ZXIgZ2V0cyBoZXJlCisKKyAgICB9IGVsc2UgeworCisgICAgICAgIC8vIHNob3VsZCBuZXZlciByZWFjaCB0aGlzIGJsb2NrCisgICAgICAgIEtNUF9BU1NFUlQoIDAgKTsgLy8gInVuZXhwZWN0ZWQgbWV0aG9kIgorCisgICAgfQorCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wb3Bfc3luYyggZ2xvYmFsX3RpZCwgY3RfcmVkdWNlLCBsb2MgKTsKKworICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBjX2VuZF9yZWR1Y2Vfbm93YWl0KCkgZXhpdDogY2FsbGVkIFQjJWQ6IG1ldGhvZCAlMDh4XG4iLCBnbG9iYWxfdGlkLCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCApICk7CisKKyAgICByZXR1cm47Cit9CisKKy8qIDIuYS5paS4gUmVkdWNlIEJsb2NrIHdpdGggYSB0ZXJtaW5hdGluZyBiYXJyaWVyICovCisKKy8qIQorQGluZ3JvdXAgU1lOQ0hST05JWkFUSU9OCitAcGFyYW0gbG9jIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGdsb2JhbF90aWQgZ2xvYmFsIHRocmVhZCBudW1iZXIKK0BwYXJhbSBudW1fdmFycyBudW1iZXIgb2YgaXRlbXMgKHZhcmlhYmxlcykgdG8gYmUgcmVkdWNlZAorQHBhcmFtIHJlZHVjZV9zaXplIHNpemUgb2YgZGF0YSBpbiBieXRlcyB0byBiZSByZWR1Y2VkCitAcGFyYW0gcmVkdWNlX2RhdGEgcG9pbnRlciB0byBkYXRhIHRvIGJlIHJlZHVjZWQKK0BwYXJhbSByZWR1Y2VfZnVuYyBjYWxsYmFjayBmdW5jdGlvbiBwcm92aWRpbmcgcmVkdWN0aW9uIG9wZXJhdGlvbiBvbiB0d28gb3BlcmFuZHMgYW5kIHJldHVybmluZyByZXN1bHQgb2YgcmVkdWN0aW9uIGluIGxoc19kYXRhCitAcGFyYW0gbGNrIHBvaW50ZXIgdG8gdGhlIHVuaXF1ZSBsb2NrIGRhdGEgc3RydWN0dXJlCitAcmVzdWx0IDEgZm9yIHRoZSBtYXN0ZXIgdGhyZWFkLCAwIGZvciBhbGwgb3RoZXIgdGVhbSB0aHJlYWRzLCAyIGZvciBhbGwgdGVhbSB0aHJlYWRzIGlmIGF0b21pYyByZWR1Y3Rpb24gbmVlZGVkCisKK0EgYmxvY2tpbmcgcmVkdWNlIHRoYXQgaW5jbHVkZXMgYW4gaW1wbGljaXQgYmFycmllci4KKyovCitrbXBfaW50MzIKK19fa21wY19yZWR1Y2UoCisgICAgaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwKKyAgICBrbXBfaW50MzIgbnVtX3ZhcnMsIHNpemVfdCByZWR1Y2Vfc2l6ZSwgdm9pZCAqcmVkdWNlX2RhdGEsCisgICAgdm9pZCAoKnJlZHVjZV9mdW5jKSh2b2lkICpsaHNfZGF0YSwgdm9pZCAqcmhzX2RhdGEpLAorICAgIGttcF9jcml0aWNhbF9uYW1lICpsY2sgKQoreworICAgIGludCByZXR2YWw7CisgICAgUEFDS0VEX1JFRFVDVElPTl9NRVRIT0RfVCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZDsKKworICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBjX3JlZHVjZSgpIGVudGVyOiBjYWxsZWQgVCMlZFxuIiwgZ2xvYmFsX3RpZCApICk7CisKKyAgICAvLyB3aHkgZG8gd2UgbmVlZCB0aGlzIGluaXRpYWxpemF0aW9uIGhlcmUgYXQgYWxsPworICAgIC8vIFJlZHVjdGlvbiBjbGF1c2UgY2FuIG5vdCBiZSBhIHN0YW5kLWFsb25lIGRpcmVjdGl2ZS4KKworICAgIC8vIGRvIG5vdCBjYWxsIF9fa21wX3NlcmlhbF9pbml0aWFsaXplKCksIGl0IHdpbGwgYmUgY2FsbGVkIGJ5IF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoKSBpZiBuZWVkZWQKKyAgICAvLyBwb3NzaWJsZSBkZXRlY3Rpb24gb2YgZmFsc2UtcG9zaXRpdmUgcmFjZSBieSB0aGUgdGhyZWFkY2hlY2tlciA/Pz8KKyAgICBpZiggISBUQ1JfNCggX19rbXBfaW5pdF9wYXJhbGxlbCApICkKKyAgICAgICAgX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSgpOworCisgICAgLy8gY2hlY2sgY29ycmVjdG5lc3Mgb2YgcmVkdWNlIGJsb2NrIG5lc3RpbmcKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApCisgICAgICAgIF9fa21wX3B1c2hfc3luYyggZ2xvYmFsX3RpZCwgY3RfcmVkdWNlLCBsb2MsIE5VTEwgKTsKKworICAgIC8vIGl0J3MgYmV0dGVyIHRvIGNoZWNrIGFuIGFzc2VydGlvbiBBU1NFUlQoIHRocl9zdGF0ZSA9PSBUSFJfV09SS19TVEFURSApCisKKyAgICBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCA9IF9fa21wX2RldGVybWluZV9yZWR1Y3Rpb25fbWV0aG9kKCBsb2MsIGdsb2JhbF90aWQsIG51bV92YXJzLCByZWR1Y2Vfc2l6ZSwgcmVkdWNlX2RhdGEsIHJlZHVjZV9mdW5jLCBsY2sgKTsKKyAgICBfX0tNUF9TRVRfUkVEVUNUSU9OX01FVEhPRCggZ2xvYmFsX3RpZCwgcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgKTsKKworICAgIGlmKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCA9PSBjcml0aWNhbF9yZWR1Y2VfYmxvY2sgKSB7CisKKyAgICAgICAgX19rbXBfZW50ZXJfY3JpdGljYWxfc2VjdGlvbl9yZWR1Y2VfYmxvY2soIGxvYywgZ2xvYmFsX3RpZCwgbGNrICk7CisgICAgICAgIHJldHZhbCA9IDE7CisKKyAgICB9IGVsc2UgaWYoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID09IGVtcHR5X3JlZHVjZV9ibG9jayApIHsKKworICAgICAgICAvLyB1c2FnZTogaWYgdGVhbSBzaXplID09IDEsIG5vIHN5bmNocm9uaXphdGlvbiBpcyByZXF1aXJlZCAoIEludGVsIHBsYXRmb3JtcyBvbmx5ICkKKyAgICAgICAgcmV0dmFsID0gMTsKKworICAgIH0gZWxzZSBpZiggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgPT0gYXRvbWljX3JlZHVjZV9ibG9jayApIHsKKworICAgICAgICByZXR2YWwgPSAyOworCisgICAgfSBlbHNlIGlmKCBURVNUX1JFRFVDVElPTl9NRVRIT0QoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kLCB0cmVlX3JlZHVjZV9ibG9jayApICkgeworCisgICAgICAgIC8vY2FzZSB0cmVlX3JlZHVjZV9ibG9jazoKKyAgICAgICAgLy8gdGhpcyBiYXJyaWVyIHNob3VsZCBiZSB2aXNpYmxlIHRvIGEgY3VzdG9tZXIgYW5kIHRvIHRoZSB0aHJlYWQgcHJvZmlsZXIKKyAgICAgICAgLy8gICAgICAgICAgICAgIChpdCdzIGEgdGVybWluYXRpbmcgYmFycmllciBvbiBjb25zdHJ1Y3RzIGlmIE5PV0FJVCBub3Qgc3BlY2lmaWVkKQorICAgICAgICByZXR2YWwgPSBfX2ttcF9iYXJyaWVyKCBVTlBBQ0tfUkVEVUNUSU9OX0JBUlJJRVIoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kICksIGdsb2JhbF90aWQsIFRSVUUsIHJlZHVjZV9zaXplLCByZWR1Y2VfZGF0YSwgcmVkdWNlX2Z1bmMgKTsKKyAgICAgICAgcmV0dmFsID0gKCByZXR2YWwgIT0gMCApID8gKCAwICkgOiAoIDEgKTsKKworICAgICAgICAvLyBhbGwgb3RoZXIgd29ya2VycyBleGNlcHQgbWFzdGVyIHNob3VsZCBkbyB0aGlzIHBvcCBoZXJlCisgICAgICAgIC8vICAgICAoIG5vbmUgb2Ygb3RoZXIgd29ya2VycyBleGNlcHQgbWFzdGVyIHdpbGwgZW50ZXIgX19rbXBjX2VuZF9yZWR1Y2UoKSApCisgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgaWYoIHJldHZhbCA9PSAwICkgeyAvLyAwOiBhbGwgb3RoZXIgd29ya2VyczsgMTogbWFzdGVyCisgICAgICAgICAgICAgICAgX19rbXBfcG9wX3N5bmMoIGdsb2JhbF90aWQsIGN0X3JlZHVjZSwgbG9jICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0gZWxzZSB7CisKKyAgICAgICAgLy8gc2hvdWxkIG5ldmVyIHJlYWNoIHRoaXMgYmxvY2sKKyAgICAgICAgS01QX0FTU0VSVCggMCApOyAvLyAidW5leHBlY3RlZCBtZXRob2QiCisKKyAgICB9CisKKyAgICBLQV9UUkFDRSggMTAsICggIl9fa21wY19yZWR1Y2UoKSBleGl0OiBjYWxsZWQgVCMlZDogbWV0aG9kICUwOHgsIHJldHVybnMgJTA4eFxuIiwgZ2xvYmFsX3RpZCwgcGFja2VkX3JlZHVjdGlvbl9tZXRob2QsIHJldHZhbCApICk7CisKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisvKiEKK0Bpbmdyb3VwIFNZTkNIUk9OSVpBVElPTgorQHBhcmFtIGxvYyBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KK0BwYXJhbSBnbG9iYWxfdGlkIGdsb2JhbCB0aHJlYWQgaWQuCitAcGFyYW0gbGNrIHBvaW50ZXIgdG8gdGhlIHVuaXF1ZSBsb2NrIGRhdGEgc3RydWN0dXJlCisKK0ZpbmlzaCB0aGUgZXhlY3V0aW9uIG9mIGEgYmxvY2tpbmcgcmVkdWNlLgorVGhlIDx0dD5sY2s8L3R0PiBwb2ludGVyIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhhdCB1c2VkIGluIHRoZSBjb3JyZXNwb25kaW5nIHN0YXJ0IGZ1bmN0aW9uLgorKi8KK3ZvaWQKK19fa21wY19lbmRfcmVkdWNlKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBfY3JpdGljYWxfbmFtZSAqbGNrICkgeworCisgICAgUEFDS0VEX1JFRFVDVElPTl9NRVRIT0RfVCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZDsKKworICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBjX2VuZF9yZWR1Y2UoKSBlbnRlcjogY2FsbGVkIFQjJWRcbiIsIGdsb2JhbF90aWQgKSApOworCisgICAgcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgPSBfX0tNUF9HRVRfUkVEVUNUSU9OX01FVEhPRCggZ2xvYmFsX3RpZCApOworCisgICAgLy8gdGhpcyBiYXJyaWVyIHNob3VsZCBiZSB2aXNpYmxlIHRvIGEgY3VzdG9tZXIgYW5kIHRvIHRoZSB0aHJlYWQgcHJvZmlsZXIKKyAgICAvLyAgICAgICAgICAgICAgKGl0J3MgYSB0ZXJtaW5hdGluZyBiYXJyaWVyIG9uIGNvbnN0cnVjdHMgaWYgTk9XQUlUIG5vdCBzcGVjaWZpZWQpCisKKyAgICBpZiggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgPT0gY3JpdGljYWxfcmVkdWNlX2Jsb2NrICkgeworCisgICAgICAgIF9fa21wX2VuZF9jcml0aWNhbF9zZWN0aW9uX3JlZHVjZV9ibG9jayggbG9jLCBnbG9iYWxfdGlkLCBsY2sgKTsKKworICAgICAgICAvLyBUT0RPOiBpbXBsaWNpdCBiYXJyaWVyOiBzaG91bGQgYmUgZXhwb3NlZAorICAgICAgICBfX2ttcF9iYXJyaWVyKCBic19wbGFpbl9iYXJyaWVyLCBnbG9iYWxfdGlkLCBGQUxTRSwgMCwgTlVMTCwgTlVMTCApOworCisgICAgfSBlbHNlIGlmKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCA9PSBlbXB0eV9yZWR1Y2VfYmxvY2sgKSB7CisKKyAgICAgICAgLy8gdXNhZ2U6IGlmIHRlYW0gc2l6ZSA9PSAxLCBubyBzeW5jaHJvbml6YXRpb24gaXMgcmVxdWlyZWQgKCBJbnRlbCBwbGF0Zm9ybXMgb25seSApCisKKyAgICAgICAgLy8gVE9ETzogaW1wbGljaXQgYmFycmllcjogc2hvdWxkIGJlIGV4cG9zZWQKKyAgICAgICAgX19rbXBfYmFycmllciggYnNfcGxhaW5fYmFycmllciwgZ2xvYmFsX3RpZCwgRkFMU0UsIDAsIE5VTEwsIE5VTEwgKTsKKworICAgIH0gZWxzZSBpZiggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgPT0gYXRvbWljX3JlZHVjZV9ibG9jayApIHsKKworICAgICAgICAvLyBUT0RPOiBpbXBsaWNpdCBiYXJyaWVyOiBzaG91bGQgYmUgZXhwb3NlZAorICAgICAgICBfX2ttcF9iYXJyaWVyKCBic19wbGFpbl9iYXJyaWVyLCBnbG9iYWxfdGlkLCBGQUxTRSwgMCwgTlVMTCwgTlVMTCApOworCisgICAgfSBlbHNlIGlmKCBURVNUX1JFRFVDVElPTl9NRVRIT0QoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kLCB0cmVlX3JlZHVjZV9ibG9jayApICkgeworCisgICAgICAgIC8vIG9ubHkgbWFzdGVyIGV4ZWN1dGVzIGhlcmUgKG1hc3RlciByZWxlYXNlcyBhbGwgb3RoZXIgd29ya2VycykKKyAgICAgICAgX19rbXBfZW5kX3NwbGl0X2JhcnJpZXIoIFVOUEFDS19SRURVQ1RJT05fQkFSUklFUiggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgKSwgZ2xvYmFsX3RpZCApOworCisgICAgfSBlbHNlIHsKKworICAgICAgICAvLyBzaG91bGQgbmV2ZXIgcmVhY2ggdGhpcyBibG9jaworICAgICAgICBLTVBfQVNTRVJUKCAwICk7IC8vICJ1bmV4cGVjdGVkIG1ldGhvZCIKKworICAgIH0KKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgX19rbXBfcG9wX3N5bmMoIGdsb2JhbF90aWQsIGN0X3JlZHVjZSwgbG9jICk7CisKKyAgICBLQV9UUkFDRSggMTAsICggIl9fa21wY19lbmRfcmVkdWNlKCkgZXhpdDogY2FsbGVkIFQjJWQ6IG1ldGhvZCAlMDh4XG4iLCBnbG9iYWxfdGlkLCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCApICk7CisKKyAgICByZXR1cm47Cit9CisKKyN1bmRlZiBfX0tNUF9HRVRfUkVEVUNUSU9OX01FVEhPRAorI3VuZGVmIF9fS01QX1NFVF9SRURVQ1RJT05fTUVUSE9ECisKKy8qLS0gZW5kIG9mIGludGVyZmFjZSB0byBmYXN0IHNjYWxhYmxlIHJlZHVjZSByb3V0aW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitrbXBfdWludDY0CitfX2ttcGNfZ2V0X3Rhc2tpZCgpIHsKKworICAgICNpZiBPTVBfMzBfRU5BQkxFRAorCisgICAgICAgIGttcF9pbnQzMiAgICBndGlkOworICAgICAgICBrbXBfaW5mb190ICogdGhyZWFkOworCisgICAgICAgIGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICAgICAgICBpZiAoIGd0aWQgPCAwICkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIHRocmVhZCA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICAgICAgcmV0dXJuIHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrLT50ZF90YXNrX2lkOworCisgICAgI2Vsc2UKKworICAgICAgICByZXR1cm4gMDsKKworICAgICNlbmRpZgorCit9IC8vIF9fa21wY19nZXRfdGFza2lkCisKKwora21wX3VpbnQ2NAorX19rbXBjX2dldF9wYXJlbnRfdGFza2lkKCkgeworCisgICAgI2lmIE9NUF8zMF9FTkFCTEVECisKKyAgICAgICAga21wX2ludDMyICAgICAgICBndGlkOworICAgICAgICBrbXBfaW5mb190ICogICAgIHRocmVhZDsKKyAgICAgICAga21wX3Rhc2tkYXRhX3QgKiBwYXJlbnRfdGFzazsKKworICAgICAgICBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgICAgICAgaWYgKCBndGlkIDwgMCApIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9OyAvLyBpZgorICAgICAgICB0aHJlYWQgICAgICA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICAgICAgcGFyZW50X3Rhc2sgPSB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfcGFyZW50OworICAgICAgICByZXR1cm4gKCBwYXJlbnRfdGFzayA9PSBOVUxMID8gMCA6IHBhcmVudF90YXNrLT50ZF90YXNrX2lkICk7CisKKyAgICAjZWxzZQorCisgICAgICAgIHJldHVybiAwOworCisgICAgI2VuZGlmCisKK30gLy8gX19rbXBjX2dldF9wYXJlbnRfdGFza2lkCisKK3ZvaWQgX19rbXBjX3BsYWNlX3RocmVhZHMoaW50IG5DLCBpbnQgblQsIGludCBuTykKK3sKKyNpZiBLTVBfTUlDCisgICAgaWYgKCAhIF9fa21wX2luaXRfc2VyaWFsICkgeworICAgICAgICBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSgpOworICAgIH0KKyAgICBfX2ttcF9wbGFjZV9udW1fY29yZXMgPSBuQzsKKyAgICBfX2ttcF9wbGFjZV9udW1fdGhyZWFkc19wZXJfY29yZSA9IG5UOworICAgIF9fa21wX3BsYWNlX2NvcmVfb2Zmc2V0ID0gbk87CisjZW5kaWYKK30KKworLy8gZW5kIG9mIGZpbGUgLy8KKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2RlYnVnLmMgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZGVidWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGU0MzAyCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2RlYnVnLmMKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKiBrbXBfZGVidWcuYyAtLSBkZWJ1ZyB1dGlsaXRpZXMgZm9yIHRoZSBHdWlkZSBsaWJyYXJ5CisgKiAkUmV2aXNpb246IDQyMTUwICQKKyAqICREYXRlOiAyMDEzLTAzLTE1IDE1OjQwOjM4IC0wNTAwIChGcmksIDE1IE1hciAyMDEzKSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfZGVidWcuaCIgLyogcmVhbGx5IG5lY2Vzc2FyeT8gKi8KKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorI2luY2x1ZGUgImttcF9pby5oIgorCisjaWZkZWYgS01QX0RFQlVHCit2b2lkCitfX2ttcF9kZWJ1Z19wcmludGZfc3Rkb3V0KCBjaGFyIGNvbnN0ICogZm9ybWF0LCAuLi4gKQoreworICAgIHZhX2xpc3QgYXA7CisgICAgdmFfc3RhcnQoIGFwLCBmb3JtYXQgKTsKKworICAgIF9fa21wX3ZwcmludGYoIGttcF9vdXQsIGZvcm1hdCwgYXAgKTsKKworICAgIHZhX2VuZChhcCk7Cit9CisjZW5kaWYKKwordm9pZAorX19rbXBfZGVidWdfcHJpbnRmKCBjaGFyIGNvbnN0ICogZm9ybWF0LCAuLi4gKQoreworICAgIHZhX2xpc3QgYXA7CisgICAgdmFfc3RhcnQoIGFwLCBmb3JtYXQgKTsKKworICAgIF9fa21wX3ZwcmludGYoIGttcF9lcnIsIGZvcm1hdCwgYXAgKTsKKworICAgIHZhX2VuZCggYXAgKTsKK30KKworI2lmZGVmIEtNUF9VU0VfQVNTRVJUCisgICAgaW50CisgICAgX19rbXBfZGVidWdfYXNzZXJ0KAorICAgICAgICBjaGFyIGNvbnN0ICogIG1zZywKKyAgICAgICAgY2hhciBjb25zdCAqICBmaWxlLAorICAgICAgICBpbnQgICAgICAgICAgIGxpbmUKKyAgICApIHsKKworICAgICAgICBpZiAoIGZpbGUgPT0gTlVMTCApIHsKKyAgICAgICAgICAgIGZpbGUgPSBLTVBfSTE4Tl9TVFIoIFVua25vd25GaWxlICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBSZW1vdmUgZGlyZWN0b3JpZXMgZnJvbSBwYXRoLCBsZWF2ZSBvbmx5IGZpbGUgbmFtZS4gRmlsZSBuYW1lIGlzIGVub3VnaCwgdGhlcmUgaXMgbm8gbmVlZAorICAgICAgICAgICAgLy8gaW4gYm90aGVyaW5nIGRldmVsb3BlcnMgYW5kIGN1c3RvbWVycyB3aXRoIGZ1bGwgcGF0aHMuCisgICAgICAgICAgICBjaGFyIGNvbnN0ICogc2xhc2ggPSBzdHJyY2hyKCBmaWxlLCAnLycgKTsKKyAgICAgICAgICAgIGlmICggc2xhc2ggIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBmaWxlID0gc2xhc2ggKyAxOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gaWYKKworICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX3N0ZGlvX2xvY2sgKTsKKyAgICAgICAgICAgIF9fa21wX2RlYnVnX3ByaW50ZiggIkFzc2VydGlvbiBmYWlsdXJlIGF0ICVzKCVkKTogJXMuXG4iLCBmaWxlLCBsaW5lLCBtc2cgKTsKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfc3RkaW9fbG9jayApOworICAgICAgICAgICAgI2lmZGVmIFVTRV9BU1NFUlRfQlJFQUsKKyAgICAgICAgICAgICAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgICAgICAgICAgICAgRGVidWdCcmVhaygpOworICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgI2VuZGlmIC8vIFVTRV9BU1NFUlRfQlJFQUsKKyAgICAgICAgICAgICNpZmRlZiBVU0VfQVNTRVJUX1NUQUxMCisgICAgICAgICAgICAgICAgLyogICAgX19rbXBfaW5maW5pdGVfbG9vcCgpOyAqLworICAgICAgICAgICAgICAgIGZvcig7Oyk7CisgICAgICAgICAgICAjZW5kaWYgLy8gVVNFX0FTU0VSVF9TVEFMTAorICAgICAgICAgICAgI2lmZGVmIFVTRV9BU1NFUlRfU0VHCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgdm9sYXRpbGUgKiBaRVJPID0gKGludCopIDA7CisgICAgICAgICAgICAgICAgICAgICsrICgqWkVSTyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgI2VuZGlmIC8vIFVTRV9BU1NFUlRfU0VHCisgICAgICAgICNlbmRpZgorCisgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgIEtNUF9NU0coIEFzc2VydGlvbkZhaWx1cmUsIGZpbGUsIGxpbmUgKSwKKyAgICAgICAgICAgIEtNUF9ITlQoIFN1Ym1pdEJ1Z1JlcG9ydCApLAorICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgKTsKKworICAgICAgICByZXR1cm4gMDsKKworICAgIH0gLy8gX19rbXBfZGVidWdfYXNzZXJ0CisKKyNlbmRpZiAvLyBLTVBfVVNFX0FTU0VSVAorCisvKiBEdW1wIGRlYnVnZ2luZyBidWZmZXIgdG8gc3RkZXJyICovCit2b2lkCitfX2ttcF9kdW1wX2RlYnVnX2J1ZmZlciggdm9pZCApCit7CisgICAgaWYgKCBfX2ttcF9kZWJ1Z19idWZmZXIgIT0gTlVMTCApIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGludCBkYyA9IF9fa21wX2RlYnVnX2NvdW50OworICAgICAgICBjaGFyICpkYiA9ICYgX19rbXBfZGVidWdfYnVmZmVyWyAoZGMgJSBfX2ttcF9kZWJ1Z19idWZfbGluZXMpICogX19rbXBfZGVidWdfYnVmX2NoYXJzIF07CisgICAgICAgIGNoYXIgKmRiX2VuZCA9ICYgX19rbXBfZGVidWdfYnVmZmVyWyBfX2ttcF9kZWJ1Z19idWZfbGluZXMgKiBfX2ttcF9kZWJ1Z19idWZfY2hhcnMgXTsKKyAgICAgICAgY2hhciAqZGIyOworCisgICAgICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfc3RkaW9fbG9jayApOworICAgICAgICBfX2ttcF9wcmludGZfbm9fbG9jayggIlxuU3RhcnQgZHVtcCBvZiBkZWJ1Z2dpbmcgYnVmZmVyIChlbnRyeT0lZCk6XG4iLAorICAgICAgICAgICAgICAgICBkYyAlIF9fa21wX2RlYnVnX2J1Zl9saW5lcyApOworCisgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgX19rbXBfZGVidWdfYnVmX2xpbmVzOyBpKysgKSB7CisKKyAgICAgICAgICAgIGlmICggKmRiICE9ICdcMCcgKSB7CisgICAgICAgICAgICAgICAgLyogRml4IHVwIHdoZXJlIG5vIGNhcnJpYWdlIHJldHVybiBiZWZvcmUgc3RyaW5nIHRlcm1pbmF0aW9uIGNoYXIgKi8KKyAgICAgICAgICAgICAgICBmb3IgKCBkYjIgPSBkYiArIDE7IGRiMiA8IGRiICsgX19rbXBfZGVidWdfYnVmX2NoYXJzIC0gMTsgZGIyICsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggKmRiMiA9PSAnXDAnICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAqKGRiMi0xKSAhPSAnXG4nICkgeyAqZGIyID0gJ1xuJzsgKihkYjIrMSkgPSAnXDAnOyB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBIYW5kbGUgY2FzZSBhdCBlbmQgYnkgc2hvcnRlbmluZyB0aGUgcHJpbnRlZCBtZXNzYWdlIGJ5IG9uZSBjaGFyIGlmIG5lY2Vzc2FyeSAqLworICAgICAgICAgICAgICAgIGlmICggZGIyID09IGRiICsgX19rbXBfZGVidWdfYnVmX2NoYXJzIC0gMSAmJgorICAgICAgICAgICAgICAgICAgICAgKmRiMiA9PSAnXDAnICYmICooZGIyLTEpICE9ICdcbicgKSB7CisgICAgICAgICAgICAgICAgICAgICooZGIyLTEpID0gJ1xuJzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGZfbm9fbG9jayggIiU0ZDogJS4qcyIsIGksIF9fa21wX2RlYnVnX2J1Zl9jaGFycywgZGIgKTsKKyAgICAgICAgICAgICAgICAqZGIgPSAnXDAnOyAvKiBvbmx5IGxldCBpdCBwcmludCBvbmNlISAqLworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkYiArPSBfX2ttcF9kZWJ1Z19idWZfY2hhcnM7CisgICAgICAgICAgICBpZiAoIGRiID49IGRiX2VuZCApCisgICAgICAgICAgICAgICAgZGIgPSBfX2ttcF9kZWJ1Z19idWZmZXI7CisgICAgICAgIH0KKworICAgICAgICBfX2ttcF9wcmludGZfbm9fbG9jayggIkVuZCBkdW1wIG9mIGRlYnVnZ2luZyBidWZmZXIgKGVudHJ5PSVkKS5cblxuIiwKKyAgICAgICAgICAgICAgICAgKCBkYytpLTEgKSAlIF9fa21wX2RlYnVnX2J1Zl9saW5lcyApOworICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX3N0ZGlvX2xvY2sgKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfZGVidWcuaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9kZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNzA2ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZGVidWcuaApAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIGttcF9kZWJ1Zy5oIC0tIGRlYnVnIC8gYXNzZXJ0aW9uIGNvZGUgZm9yIEFzc3VyZSBsaWJyYXJ5CisgKiAkUmV2aXNpb246IDQyMDYxICQKKyAqICREYXRlOiAyMDEzLTAyLTI4IDE2OjM2OjI0IC0wNjAwIChUaHUsIDI4IEZlYiAyMDEzKSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX0RFQlVHX0gKKyNkZWZpbmUgS01QX0RFQlVHX0gKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICBleHRlcm4gIkMiIHsKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBCdWlsZC10aW1lIGFzc2VydGlvbi4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoKKyAgICBCdWlsZC10aW1lIGFzc2VydGlvbiBjYW4gZG8gY29tcGlsZS10aW1lIGNoZWNraW5nIG9mIGRhdGEgc3RydWN0dXJlIHNpemVzLCBldGMuIFRoaXMgd29ya3MgYnkKKyAgICBkZWNsYXJpbmcgYSBuZWdhdGl2ZS1sZW5ndGggYXJyYXkgaWYgdGhlIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGZhbHNlLiAgSW4gdGhhdAorICAgIGNhc2UsIHRoZSBjb21waWxlciBpc3N1ZXMgYSBzeW50YXggZXJyb3IgYW5kIHN0b3BzIHRoZSBjb21waWxhdGlvbi4gSWYgdGhlIGV4cHJlc3Npb24gaXMKKyAgICB0cnVlLCB3ZSBnZXQgYW4gZXh0cmFuZW91cyBzdGF0aWMgc2luZ2xlIGNoYXJhY3RlciBhcnJheSBpbiB0aGUgc2NvcGUgb2YgdGhlIG1hY3JvLgorCisgICAgVXNhZ2U6CisKKyAgICAgICAgS01QX0JVSUxEX0FTU0VSVCggc2l6ZW9mKCBzb21lX3QgKSA8PSAzMiApOworICAgICAgICBLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggc29tZV90LCBmaWVsZCApICUgOCA9PSAwICk7CisKKyAgICBEbyBub3QgdXNlIF9LTVBfQlVJTERfQVNTRVJUIGFuZCBfX0tNUF9CVUlMRF9BU1NFUlQgZGlyZWN0bHksIGl0IGlzIHdvcmtpbmcgZ3V0cy4KKyovCisKKyNkZWZpbmUgX19LTVBfQlVJTERfQVNTRVJUKCBleHByLCBzdWZmaXggKSAgc3RhdGljIGNoYXIgX19rbXBfYnVpbGRfY2hlY2tfIyNzdWZmaXhbIChleHByKSA/IDEgOiAtMSBdCisjZGVmaW5lIF9LTVBfQlVJTERfQVNTRVJUKCBleHByLCBzdWZmaXggKSAgIF9fS01QX0JVSUxEX0FTU0VSVCggKGV4cHIpLCBzdWZmaXggKQorI2RlZmluZSBLTVBfQlVJTERfQVNTRVJUKCBleHByICkgICAgICAgICAgICBfS01QX0JVSUxEX0FTU0VSVCggKGV4cHIpLCBfX0xJTkVfXyApCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJ1bi10aW1lIGFzc2VydGlvbnMuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2V4dGVybiB2b2lkIF9fa21wX2R1bXBfZGVidWdfYnVmZmVyKCB2b2lkICk7CisKKyNpZmRlZiBLTVBfVVNFX0FTU0VSVAorICAgIGV4dGVybiBpbnQgX19rbXBfZGVidWdfYXNzZXJ0KCBjaGFyIGNvbnN0ICogZXhwciwgY2hhciBjb25zdCAqIGZpbGUsIGludCBsaW5lICk7CisgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAjZGVmaW5lIEtNUF9BU1NFUlQoIGNvbmQgKSAgICAgICAgICAgICAoIChjb25kKSA/IDAgOiBfX2ttcF9kZWJ1Z19hc3NlcnQoICNjb25kLCBfX0ZJTEVfXywgX19MSU5FX18gKSApCisgICAgICAgICNkZWZpbmUgS01QX0FTU0VSVDIoIGNvbmQsIG1zZyApICAgICAgICggKGNvbmQpID8gMCA6IF9fa21wX2RlYnVnX2Fzc2VydCggKG1zZyksIF9fRklMRV9fLCBfX0xJTkVfXyApICkKKyAgICAgICAgI2RlZmluZSBLTVBfREVCVUdfQVNTRVJUKCBjb25kICkgICAgICAgS01QX0FTU0VSVCggY29uZCApCisgICAgICAgICNkZWZpbmUgS01QX0RFQlVHX0FTU0VSVDIoIGNvbmQsIG1zZyApIEtNUF9BU1NFUlQyKCBjb25kLCBtc2cgKQorICAgICNlbHNlCisgICAgICAgIC8vIERvIG5vdCBleHBvc2UgY29uZGl0aW9uIGluIHJlbGVhc2UgYnVpbGQuIFVzZSAiYXNzZXJ0aW9uIGZhaWx1cmUiLgorICAgICAgICAjZGVmaW5lIEtNUF9BU1NFUlQoIGNvbmQgKSAgICAgICAgICAgICAoIChjb25kKSA/IDAgOiBfX2ttcF9kZWJ1Z19hc3NlcnQoICJhc3NlcnRpb24gZmFpbHVyZSIsIF9fRklMRV9fLCBfX0xJTkVfXyApICkKKyAgICAgICAgI2RlZmluZSBLTVBfQVNTRVJUMiggY29uZCwgbXNnICkgICAgICAgS01QX0FTU0VSVCggY29uZCApCisgICAgICAgICNkZWZpbmUgS01QX0RFQlVHX0FTU0VSVCggY29uZCApICAgICAgIDAKKyAgICAgICAgI2RlZmluZSBLTVBfREVCVUdfQVNTRVJUMiggY29uZCwgbXNnICkgMAorICAgICNlbmRpZiAvLyBLTVBfREVCVUcKKyNlbHNlCisgICAgI2RlZmluZSBLTVBfQVNTRVJUKCBjb25kICkgICAgICAgICAgICAgMAorICAgICNkZWZpbmUgS01QX0FTU0VSVDIoIGNvbmQsIG1zZyApICAgICAgIDAKKyAgICAjZGVmaW5lIEtNUF9ERUJVR19BU1NFUlQoIGNvbmQgKSAgICAgICAwCisgICAgI2RlZmluZSBLTVBfREVCVUdfQVNTRVJUMiggY29uZCwgbXNnICkgMAorI2VuZGlmIC8vIEtNUF9VU0VfQVNTRVJUCisKKyNpZmRlZiBLTVBfREVCVUcKKyAgICBleHRlcm4gdm9pZCBfX2ttcF9kZWJ1Z19wcmludGZfc3Rkb3V0KCBjaGFyIGNvbnN0ICogZm9ybWF0LCAuLi4gKTsKKyNlbmRpZgorZXh0ZXJuIHZvaWQgX19rbXBfZGVidWdfcHJpbnRmKCBjaGFyIGNvbnN0ICogZm9ybWF0LCAuLi4gKTsKKworI2lmZGVmIEtNUF9ERUJVRworCisgICAgZXh0ZXJuIGludCBrbXBfYV9kZWJ1ZzsKKyAgICBleHRlcm4gaW50IGttcF9iX2RlYnVnOworICAgIGV4dGVybiBpbnQga21wX2NfZGVidWc7CisgICAgZXh0ZXJuIGludCBrbXBfZF9kZWJ1ZzsKKyAgICBleHRlcm4gaW50IGttcF9lX2RlYnVnOworICAgIGV4dGVybiBpbnQga21wX2ZfZGVidWc7CisgICAgZXh0ZXJuIGludCBrbXBfZGlhZzsKKworICAgICNkZWZpbmUgS0FfVFJBQ0UoZCx4KSAgICAgaWYgKGttcF9hX2RlYnVnID49IGQpIHsgX19rbXBfZGVidWdfcHJpbnRmIHggOyB9CisgICAgI2RlZmluZSBLQl9UUkFDRShkLHgpICAgICBpZiAoa21wX2JfZGVidWcgPj0gZCkgeyBfX2ttcF9kZWJ1Z19wcmludGYgeCA7IH0KKyAgICAjZGVmaW5lIEtDX1RSQUNFKGQseCkgICAgIGlmIChrbXBfY19kZWJ1ZyA+PSBkKSB7IF9fa21wX2RlYnVnX3ByaW50ZiB4IDsgfQorICAgICNkZWZpbmUgS0RfVFJBQ0UoZCx4KSAgICAgaWYgKGttcF9kX2RlYnVnID49IGQpIHsgX19rbXBfZGVidWdfcHJpbnRmIHggOyB9CisgICAgI2RlZmluZSBLRV9UUkFDRShkLHgpICAgICBpZiAoa21wX2VfZGVidWcgPj0gZCkgeyBfX2ttcF9kZWJ1Z19wcmludGYgeCA7IH0KKyAgICAjZGVmaW5lIEtGX1RSQUNFKGQseCkgICAgIGlmIChrbXBfZl9kZWJ1ZyA+PSBkKSB7IF9fa21wX2RlYnVnX3ByaW50ZiB4IDsgfQorICAgICNkZWZpbmUgS19ESUFHKGQseCkgICAgICAge2lmIChrbXBfZGlhZyA9PSBkKSB7IF9fa21wX2RlYnVnX3ByaW50Zl9zdGRvdXQgeCA7IH0gfQorCisgICAgI2RlZmluZSBLQV9EVU1QKGQseCkgICAgIGlmIChrbXBfYV9kZWJ1ZyA+PSBkKSB7IGludCBrczsgX19rbXBfZGlzYWJsZSgma3MpOyAoeCkgOyBfX2ttcF9lbmFibGUoa3MpOyB9CisgICAgI2RlZmluZSBLQl9EVU1QKGQseCkgICAgIGlmIChrbXBfYl9kZWJ1ZyA+PSBkKSB7IGludCBrczsgX19rbXBfZGlzYWJsZSgma3MpOyAoeCkgOyBfX2ttcF9lbmFibGUoa3MpOyB9CisgICAgI2RlZmluZSBLQ19EVU1QKGQseCkgICAgIGlmIChrbXBfY19kZWJ1ZyA+PSBkKSB7IGludCBrczsgX19rbXBfZGlzYWJsZSgma3MpOyAoeCkgOyBfX2ttcF9lbmFibGUoa3MpOyB9CisgICAgI2RlZmluZSBLRF9EVU1QKGQseCkgICAgIGlmIChrbXBfZF9kZWJ1ZyA+PSBkKSB7IGludCBrczsgX19rbXBfZGlzYWJsZSgma3MpOyAoeCkgOyBfX2ttcF9lbmFibGUoa3MpOyB9CisgICAgI2RlZmluZSBLRV9EVU1QKGQseCkgICAgIGlmIChrbXBfZV9kZWJ1ZyA+PSBkKSB7IGludCBrczsgX19rbXBfZGlzYWJsZSgma3MpOyAoeCkgOyBfX2ttcF9lbmFibGUoa3MpOyB9CisgICAgI2RlZmluZSBLRl9EVU1QKGQseCkgICAgIGlmIChrbXBfZl9kZWJ1ZyA+PSBkKSB7IGludCBrczsgX19rbXBfZGlzYWJsZSgma3MpOyAoeCkgOyBfX2ttcF9lbmFibGUoa3MpOyB9CisKKyNlbHNlCisKKyAgICAjZGVmaW5lIEtBX1RSQUNFKGQseCkgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICAjZGVmaW5lIEtCX1RSQUNFKGQseCkgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICAjZGVmaW5lIEtDX1RSQUNFKGQseCkgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICAjZGVmaW5lIEtEX1RSQUNFKGQseCkgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICAjZGVmaW5lIEtFX1RSQUNFKGQseCkgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICAjZGVmaW5lIEtGX1RSQUNFKGQseCkgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICAjZGVmaW5lIEtfRElBRyhkLHgpICAgICAgIHt9Lyogbm90aGluZyB0byBkbyAqLworCisgICAgI2RlZmluZSBLQV9EVU1QKGQseCkgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICAjZGVmaW5lIEtCX0RVTVAoZCx4KSAgICAgLyogbm90aGluZyB0byBkbyAqLworICAgICNkZWZpbmUgS0NfRFVNUChkLHgpICAgICAvKiBub3RoaW5nIHRvIGRvICovCisgICAgI2RlZmluZSBLRF9EVU1QKGQseCkgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICAjZGVmaW5lIEtFX0RVTVAoZCx4KSAgICAgLyogbm90aGluZyB0byBkbyAqLworICAgICNkZWZpbmUgS0ZfRFVNUChkLHgpICAgICAvKiBub3RoaW5nIHRvIGRvICovCisKKyNlbmRpZiAvLyBLTVBfREVCVUcKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgfSAvLyBleHRlcm4gIkMiCisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworI2VuZGlmIC8qIEtNUF9ERUJVR19IICovCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfZGlzcGF0Y2guY3BwIGIvZmluYWwvcnVudGltZS9zcmMva21wX2Rpc3BhdGNoLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjI1MzA1Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2Rpc3BhdGNoLmNwcApAQCAtMCwwICsxLDI0MDMgQEAKKy8qCisgKiBrbXBfZGlzcGF0Y2guY3BwOiBkeW5hbWljIHNjaGVkdWxpbmcgLSBpdGVyYXRpb24gaW5pdGlhbGl6YXRpb24gYW5kIGRpc3BhdGNoLgorICogJFJldmlzaW9uOiA0MjY3NCAkCisgKiAkRGF0ZTogMjAxMy0wOS0xOCAxMToxMjo0OSAtMDUwMCAoV2VkLCAxOCBTZXAgMjAxMykgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvKgorICogRHluYW1pYyBzY2hlZHVsaW5nIGluaXRpYWxpemF0aW9uIGFuZCBkaXNwYXRjaC4KKyAqCisgKiBOT1RFOiBfX2ttcF9udGggaXMgYSBjb25zdGFudCBpbnNpZGUgb2YgYW55IGRpc3BhdGNoIGxvb3AsIGhvd2V2ZXIKKyAqICAgICAgIGl0IG1heSBjaGFuZ2UgdmFsdWVzIGJldHdlZW4gcGFyYWxsZWwgcmVnaW9ucy4gIF9fa21wX21heF9udGgKKyAqICAgICAgIGlzIHRoZSBsYXJnZXN0IHZhbHVlIF9fa21wX250aCBtYXkgdGFrZSwgMSBpcyB0aGUgc21hbGxlc3QuCisgKgorICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorI2luY2x1ZGUgImttcF9pdHQuaCIKKyNpbmNsdWRlICJrbXBfc3RyLmgiCisjaW5jbHVkZSAia21wX2Vycm9yLmgiCisjaWYgS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2CisgICAgI2luY2x1ZGUgPGZsb2F0Lmg+CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIEtNUF9TVEFUSUNfU1RFQUxfRU5BQkxFRAorCisgICAgLy8gcmVwbGFjZXMgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvezMyLDY0fSBzdHJ1Y3R1cmVzIGFuZCBkaXNwYXRjaF9wcml2YXRlX2luZm97MzIsNjR9X3QgdHlwZXMKKyAgICB0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CisgICAgc3RydWN0IGRpc3BhdGNoX3ByaXZhdGVfaW5mb1hYX3RlbXBsYXRlIHsKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+Ojp1bnNpZ25lZF90ICBVVDsKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpzaWduZWRfdCAgICBTVDsKKyAgICAgICAgVVQgY291bnQ7ICAgICAgICAgICAgICAgIC8vIHVuc2lnbmVkCisgICAgICAgIFQgIHViOworICAgICAgICAvKiBBZGRpbmcgS01QX0FMSUdOX0NBQ0hFIGhlcmUgZG9lc24ndCBoZWxwIC8gY2FuIGh1cnQgcGVyZm9ybWFuY2UgKi8KKyAgICAgICAgVCAgbGI7CisgICAgICAgIFNUIHN0OyAgICAgICAgICAgICAgICAgICAvLyBzaWduZWQKKyAgICAgICAgVVQgdGM7ICAgICAgICAgICAgICAgICAgIC8vIHVuc2lnbmVkCisgICAgICAgIFQgIHN0YXRpY19zdGVhbF9jb3VudGVyOyAvLyBmb3Igc3RhdGljX3N0ZWFsIG9ubHk7IG1heWJlIGJldHRlciB0byBwdXQgYWZ0ZXIgdWIKKworICAgICAgICAvKiBwYXJtWzEtNF0gYXJlIHVzZWQgaW4gZGlmZmVyZW50IHdheXMgYnkgZGlmZmVyZW50IHNjaGVkdWxpbmcgYWxnb3JpdGhtcyAqLworCisgICAgICAgIC8vIEtNUF9BTElHTiggMzIgKSBlbnN1cmVzICggaWYgdGhlIEtNUF9BTElHTiBtYWNybyBpcyB0dXJuZWQgb24gKQorICAgICAgICAvLyAgICBhKSBwYXJtMyBpcyBwcm9wZXJseSBhbGlnbmVkIGFuZAorICAgICAgICAvLyAgICBiKSBhbGwgcGFybTEtNCBhcmUgaW4gdGhlIHNhbWUgY2FjaGUgbGluZS4KKyAgICAgICAgLy8gQmVjYXVzZSBvZiBwYXJtMS00IGFyZSB1c2VkIHRvZ2V0aGVyLCBwZXJmb3JtYW5jZSBzZWVtcyB0byBiZSBiZXR0ZXIKKyAgICAgICAgLy8gaWYgdGhleSBhcmUgaW4gdGhlIHNhbWUgbGluZSAobm90IG1lYXN1cmVkIHRob3VnaCkuCisKKyAgICAgICAgc3RydWN0IEtNUF9BTElHTiggMzIgKSB7IC8vIGNvbXBpbGVyIGRvZXMgbm90IGFjY2VwdCBzaXplb2YoVCkqNAorICAgICAgICAgICAgVCAgcGFybTE7CisgICAgICAgICAgICBUICBwYXJtMjsKKyAgICAgICAgICAgIFQgIHBhcm0zOworICAgICAgICAgICAgVCAgcGFybTQ7CisgICAgICAgIH07CisKKyAgICAgICAgVVQgb3JkZXJlZF9sb3dlcjsgLy8gdW5zaWduZWQKKyAgICAgICAgVVQgb3JkZXJlZF91cHBlcjsgLy8gdW5zaWduZWQKKyAgICAgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIFQgIGxhc3RfdXBwZXI7CisgICAgICAgICNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworICAgIH07CisKKyNlbHNlIC8qIEtNUF9TVEFUSUNfU1RFQUxfRU5BQkxFRCAqLworCisgICAgLy8gcmVwbGFjZXMgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvezMyLDY0fSBzdHJ1Y3R1cmVzIGFuZCBkaXNwYXRjaF9wcml2YXRlX2luZm97MzIsNjR9X3QgdHlwZXMKKyAgICB0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CisgICAgc3RydWN0IGRpc3BhdGNoX3ByaXZhdGVfaW5mb1hYX3RlbXBsYXRlIHsKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+Ojp1bnNpZ25lZF90ICBVVDsKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpzaWduZWRfdCAgICBTVDsKKyAgICAgICAgVCAgbGI7CisgICAgICAgIFQgIHViOworICAgICAgICBTVCBzdDsgICAgICAgICAgICAvLyBzaWduZWQKKyAgICAgICAgVVQgdGM7ICAgICAgICAgICAgLy8gdW5zaWduZWQKKworICAgICAgICBUICBwYXJtMTsKKyAgICAgICAgVCAgcGFybTI7CisgICAgICAgIFQgIHBhcm0zOworICAgICAgICBUICBwYXJtNDsKKworICAgICAgICBVVCBjb3VudDsgICAgICAgICAvLyB1bnNpZ25lZAorCisgICAgICAgIFVUIG9yZGVyZWRfbG93ZXI7IC8vIHVuc2lnbmVkCisgICAgICAgIFVUIG9yZGVyZWRfdXBwZXI7IC8vIHVuc2lnbmVkCisgICAgICAgICNpZiBLTVBfT1NfV0lORE9XUworCVQgIGxhc3RfdXBwZXI7CisgICAgICAgICNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworICAgIH07CisKKyNlbmRpZiAvKiBLTVBfU1RBVElDX1NURUFMX0VOQUJMRUQgKi8KKworLy8gcmVwbGFjZXMgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvIHN0cnVjdHVyZSBhbmQgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3QgdHlwZQordGVtcGxhdGU8IHR5cGVuYW1lIFQgPgorc3RydWN0IEtNUF9BTElHTl9DQUNIRSBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGUgeworICAgIC8vIGR1cGxpY2F0ZSBhbGlnbm1lbnQgaGVyZSwgb3RoZXJ3aXNlIHNpemUgb2Ygc3RydWN0dXJlIGlzIG5vdCBjb3JyZWN0IGluIG91ciBjb21waWxlcgorICAgIHVuaW9uIEtNUF9BTElHTl9DQUNIRSBwcml2YXRlX2luZm9fdG1wbCB7CisgICAgICAgIGRpc3BhdGNoX3ByaXZhdGVfaW5mb1hYX3RlbXBsYXRlPCBUID4gcDsKKyAgICAgICAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvNjRfdCAgICAgICAgICAgICBwNjQ7CisgICAgfSB1OworICAgIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZTsgIC8qIHNjaGVkdWxpbmcgYWxnb3JpdGhtICovCisgICAga21wX3VpbnQzMiAgICAgIG9yZGVyZWQ7ICAgLyogb3JkZXJlZCBjbGF1c2Ugc3BlY2lmaWVkICovCisgICAga21wX3VpbnQzMiAgICAgIG9yZGVyZWRfYnVtcGVkOworICAgIGttcF9pbnQzMiAgIG9yZGVyZWRfZHVtbXlbS01QX01BWF9PUkRFUkVELTNdOyAvLyB0byByZXRhaW4gdGhlIHN0cnVjdHVyZSBzaXplIGFmdGVyIG1ha2luZyBvcmRlcgorICAgIGRpc3BhdGNoX3ByaXZhdGVfaW5mbyAqIG5leHQ7IC8qIHN0YWNrIG9mIGJ1ZmZlcnMgZm9yIG5lc3Qgb2Ygc2VyaWFsIHJlZ2lvbnMgKi8KKyAgICBrbXBfdWludDMyICAgICAgbm9tZXJnZTsgICAvKiBkb24ndCBtZXJnZSBpdGVycyBpZiBzZXJpYWxpemVkICovCisgICAga21wX3VpbnQzMiAgICAgIHR5cGVfc2l6ZTsKKyAgICBlbnVtIGNvbnNfdHlwZSAgcHVzaGVkX3dzOworfTsKKworCisvLyByZXBsYWNlcyBkaXNwYXRjaF9zaGFyZWRfaW5mb3szMiw2NH0gc3RydWN0dXJlcyBhbmQgZGlzcGF0Y2hfc2hhcmVkX2luZm97MzIsNjR9X3QgdHlwZXMKK3RlbXBsYXRlPCB0eXBlbmFtZSBVVCA+CitzdHJ1Y3QgZGlzcGF0Y2hfc2hhcmVkX2luZm9YWF90ZW1wbGF0ZSB7CisgICAgLyogY2h1bmsgaW5kZXggdW5kZXIgZHluYW1pYywgbnVtYmVyIG9mIGlkbGUgdGhyZWFkcyB1bmRlciBzdGF0aWMtc3RlYWw7CisgICAgICAgaXRlcmF0aW9uIGluZGV4IG90aGVyd2lzZSAqLworICAgIHZvbGF0aWxlIFVUICAgICBpdGVyYXRpb247CisgICAgdm9sYXRpbGUgVVQgICAgIG51bV9kb25lOworICAgIHZvbGF0aWxlIFVUICAgICBvcmRlcmVkX2l0ZXJhdGlvbjsKKyAgICBVVCAgIG9yZGVyZWRfZHVtbXlbS01QX01BWF9PUkRFUkVELTFdOyAvLyB0byByZXRhaW4gdGhlIHN0cnVjdHVyZSBzaXplIG1ha2luZyBvcmRlcmVkX2l0ZXJhdGlvbiBzY2FsYXIKK307CisKKy8vIHJlcGxhY2VzIGRpc3BhdGNoX3NoYXJlZF9pbmZvIHN0cnVjdHVyZSBhbmQgZGlzcGF0Y2hfc2hhcmVkX2luZm9fdCB0eXBlCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVVQgPgorc3RydWN0IGRpc3BhdGNoX3NoYXJlZF9pbmZvX3RlbXBsYXRlIHsKKyAgICAvLyB3ZSBuZWVkIHVuaW9uIGhlcmUgdG8ga2VlcCB0aGUgc3RydWN0dXJlIHNpemUKKyAgICB1bmlvbiBzaGFyZWRfaW5mb190bXBsIHsKKyAgICAgICAgZGlzcGF0Y2hfc2hhcmVkX2luZm9YWF90ZW1wbGF0ZTwgVVQgPiAgczsKKyAgICAgICAgZGlzcGF0Y2hfc2hhcmVkX2luZm82NF90ICAgICAgICAgICAgICAgczY0OworICAgIH0gdTsKKyAgICB2b2xhdGlsZSBrbXBfdWludDMyICAgICBidWZmZXJfaW5kZXg7Cit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZAorX19rbXBfc3RhdGljX2RlbGF5KCBpbnQgYXJnICkKK3sKKyAgICAvKiBXb3JrIGFyb3VuZCB3ZWlyZCBjb2RlLWdlbiBidWcgdGhhdCBjYXVzZXMgYXNzZXJ0IHRvIHRyaXAgKi8KKyAgICAjaWYgS01QX0FSQ0hfWDg2XzY0ICYmIEtNUF9PU19MSU5VWAorICAgICNlbHNlCisgICAgICAgIEtNUF9BU1NFUlQoIGFyZyA+PSAwICk7CisgICAgI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGF0aWNfeWllbGQoIGludCBhcmcgKQoreworICAgIF9fa21wX3lpZWxkKCBhcmcgKTsKK30KKworI3VuZGVmIFVTRV9URVNUX0xPQ0tTCisKKy8vIHRlc3RfdGhlbl9hZGQgdGVtcGxhdGUgKGdlbmVyYWwgdGVtcGxhdGUgc2hvdWxkIE5PVCBiZSB1c2VkKQordGVtcGxhdGU8IHR5cGVuYW1lIFQgPgorc3RhdGljIF9fZm9yY2VpbmxpbmUgVAordGVzdF90aGVuX2FkZCggdm9sYXRpbGUgVCAqcCwgVCBkICkgeyBLTVBfQVNTRVJUKDApOyB9OworCit0ZW1wbGF0ZTw+CitfX2ZvcmNlaW5saW5lIGttcF9pbnQzMgordGVzdF90aGVuX2FkZDwga21wX2ludDMyID4oIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGQgKQoreworICAgIGttcF9pbnQzMiByOworICAgIHIgPSBLTVBfVEVTVF9USEVOX0FERDMyKCBwLCBkICk7CisgICAgcmV0dXJuIHI7Cit9CisKK3RlbXBsYXRlPD4KK19fZm9yY2VpbmxpbmUga21wX2ludDY0Cit0ZXN0X3RoZW5fYWRkPCBrbXBfaW50NjQgPiggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgZCApCit7CisgICAga21wX2ludDY0IHI7CisgICAgciA9IEtNUF9URVNUX1RIRU5fQURENjQoIHAsIGQgKTsKKyAgICByZXR1cm4gcjsKK30KKworLy8gdGVzdF90aGVuX2luY19hY3EgdGVtcGxhdGUgKGdlbmVyYWwgdGVtcGxhdGUgc2hvdWxkIE5PVCBiZSB1c2VkKQordGVtcGxhdGU8IHR5cGVuYW1lIFQgPgorc3RhdGljIF9fZm9yY2VpbmxpbmUgVAordGVzdF90aGVuX2luY19hY3EoIHZvbGF0aWxlIFQgKnAgKSB7IEtNUF9BU1NFUlQoMCk7IH07CisKK3RlbXBsYXRlPD4KK19fZm9yY2VpbmxpbmUga21wX2ludDMyCit0ZXN0X3RoZW5faW5jX2FjcTwga21wX2ludDMyID4oIHZvbGF0aWxlIGttcF9pbnQzMiAqcCApCit7CisgICAga21wX2ludDMyIHI7CisgICAgciA9IEtNUF9URVNUX1RIRU5fSU5DX0FDUTMyKCBwICk7CisgICAgcmV0dXJuIHI7Cit9CisKK3RlbXBsYXRlPD4KK19fZm9yY2VpbmxpbmUga21wX2ludDY0Cit0ZXN0X3RoZW5faW5jX2FjcTwga21wX2ludDY0ID4oIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCApCit7CisgICAga21wX2ludDY0IHI7CisgICAgciA9IEtNUF9URVNUX1RIRU5fSU5DX0FDUTY0KCBwICk7CisgICAgcmV0dXJuIHI7Cit9CisKKy8vIHRlc3RfdGhlbl9pbmMgdGVtcGxhdGUgKGdlbmVyYWwgdGVtcGxhdGUgc2hvdWxkIE5PVCBiZSB1c2VkKQordGVtcGxhdGU8IHR5cGVuYW1lIFQgPgorc3RhdGljIF9fZm9yY2VpbmxpbmUgVAordGVzdF90aGVuX2luYyggdm9sYXRpbGUgVCAqcCApIHsgS01QX0FTU0VSVCgwKTsgfTsKKwordGVtcGxhdGU8PgorX19mb3JjZWlubGluZSBrbXBfaW50MzIKK3Rlc3RfdGhlbl9pbmM8IGttcF9pbnQzMiA+KCB2b2xhdGlsZSBrbXBfaW50MzIgKnAgKQoreworICAgIGttcF9pbnQzMiByOworICAgIHIgPSBLTVBfVEVTVF9USEVOX0lOQzMyKCBwICk7CisgICAgcmV0dXJuIHI7Cit9CisKK3RlbXBsYXRlPD4KK19fZm9yY2VpbmxpbmUga21wX2ludDY0Cit0ZXN0X3RoZW5faW5jPCBrbXBfaW50NjQgPiggdm9sYXRpbGUga21wX2ludDY0ICpwICkKK3sKKyAgICBrbXBfaW50NjQgcjsKKyAgICByID0gS01QX1RFU1RfVEhFTl9JTkM2NCggcCApOworICAgIHJldHVybiByOworfQorCisvLyBjb21wYXJlX2FuZF9zd2FwIHRlbXBsYXRlIChnZW5lcmFsIHRlbXBsYXRlIHNob3VsZCBOT1QgYmUgdXNlZCkKK3RlbXBsYXRlPCB0eXBlbmFtZSBUID4KK3N0YXRpYyBfX2ZvcmNlaW5saW5lIGttcF9pbnQzMgorY29tcGFyZV9hbmRfc3dhcCggdm9sYXRpbGUgVCAqcCwgVCBjLCBUIHMgKSB7IEtNUF9BU1NFUlQoMCk7IH07CisKK3RlbXBsYXRlPD4KK19fZm9yY2VpbmxpbmUga21wX2ludDMyCitjb21wYXJlX2FuZF9zd2FwPCBrbXBfaW50MzIgPiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgYywga21wX2ludDMyIHMgKQoreworICAgIHJldHVybiBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMMzIoIHAsIGMsIHMgKTsKK30KKwordGVtcGxhdGU8PgorX19mb3JjZWlubGluZSBrbXBfaW50MzIKK2NvbXBhcmVfYW5kX3N3YXA8IGttcF9pbnQ2NCA+KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBjLCBrbXBfaW50NjQgcyApCit7CisgICAgcmV0dXJuIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUw2NCggcCwgYywgcyApOworfQorCisvKgorICAgIFNwaW4gd2FpdCBsb29wIHRoYXQgZmlyc3QgZG9lcyBwYXVzZSwgdGhlbiB5aWVsZC4KKyAgICBXYWl0cyB1bnRpbCBmdW5jdGlvbiByZXR1cm5zIG5vbi16ZXJvIHdoZW4gY2FsbGVkIHdpdGggKnNwaW5uZXIgYW5kIGNoZWNrLgorICAgIERvZXMgTk9UIHB1dCB0aHJlYWRzIHRvIHNsZWVwLgorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBBcmd1bWVudHM6CisgICAgICAgIG9iaiAtLSBpcyBoaWdoZXItbGV2ZWwgc3luY2hyb25pemF0aW9uIG9iamVjdCB0byByZXBvcnQgdG8gaXR0bm90aWZ5LiBJdCBpcyB1c2VkIHRvIHJlcG9ydAorICAgICAgICAgICAgbG9ja3MgY29uc2lzdGVudGx5LiBGb3IgZXhhbXBsZSwgaWYgbG9jayBpcyBhY3F1aXJlZCBpbW1lZGlhdGVseSwgaXRzIGFkZHJlc3MgaXMKKyAgICAgICAgICAgIHJlcG9ydGVkIHRvIGl0dG5vdGlmeSB2aWEgS01QX0ZTWU5DX0FDUVVJUkVEKCkuIEhvd2V2ZXIsIGl0IGxvY2sgY2Fubm90IGJlIGFjcXVpcmVkCisgICAgICAgICAgICBpbW1lZGlhdGVseSBhbmQgbG9jayByb3V0aW5lIGNhbGxzIHRvIEtNUF9XQUlUX1lJRUxEKCksIHRoZSBsYXRlciBzaG91bGQgcmVwb3J0IHRoZSBzYW1lCisgICAgICAgICAgICBhZGRyZXNzLCBub3QgYW4gYWRkcmVzcyBvZiBsb3ctbGV2ZWwgc3Bpbm5lci4KKyNlbmRpZiAvLyBVU0VfSVRUX0JVSUxECisqLwordGVtcGxhdGU8IHR5cGVuYW1lIFVUID4KKy8vIFRvRG86IG1ha2UgaW5saW5lIGZ1bmN0aW9uIChtb3ZlIHRvIGhlYWRlciBmaWxlIGZvciBpY2wpCitzdGF0aWMgVVQgIC8vIHVuc2lnbmVkIDQtIG9yIDgtYnl0ZSB0eXBlCitfX2ttcF93YWl0X3lpZWxkKCB2b2xhdGlsZSBVVCAqIHNwaW5uZXIsCisgICAgICAgICAgICAgICAgICBVVCAgICAgICAgICAgIGNoZWNrZXIsCisgICAgICAgICAgICAgICAgICBrbXBfdWludDMyICgqIHByZWQpKCBVVCwgVVQgKQorICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAgICAgICAgKiBvYmopICAgIC8vIEhpZ2hlci1sZXZlbCBzeW5jaHJvbml6YXRpb24gb2JqZWN0LCBvciBOVUxMLgorICAgICAgICAgICAgICAgICAgKQoreworICAgIC8vIG5vdGU6IHdlIG1heSBub3QgYmVsb25nIHRvIGEgdGVhbSBhdCB0aGlzIHBvaW50CisgICAgcmVnaXN0ZXIgdm9sYXRpbGUgVVQgICAgICAgICAqIHNwaW4gICAgICAgICAgPSBzcGlubmVyOworICAgIHJlZ2lzdGVyICAgICAgICAgIFVUICAgICAgICAgICBjaGVjayAgICAgICAgID0gY2hlY2tlcjsKKyAgICByZWdpc3RlciAgICAgICAgICBrbXBfdWludDMyICAgc3BpbnM7CisgICAgcmVnaXN0ZXIgICAgICAgICAga21wX3VpbnQzMiAoKmYpICggVVQsIFVUICkgPSBwcmVkOworICAgIHJlZ2lzdGVyICAgICAgICAgIFVUICAgICAgICAgICByOworCisgICAgS01QX0ZTWU5DX1NQSU5fSU5JVCggb2JqLCAodm9pZCopIHNwaW4gKTsKKyAgICBLTVBfSU5JVF9ZSUVMRCggc3BpbnMgKTsKKyAgICAvLyBtYWluIHdhaXQgc3BpbiBsb29wCisgICAgd2hpbGUoIWYociA9ICpzcGluLCBjaGVjaykpCisgICAgeworICAgICAgICBLTVBfRlNZTkNfU1BJTl9QUkVQQVJFKCBvYmogKTsKKyAgICAgICAgLyogR0VIIC0gcmVtb3ZlIHRoaXMgc2luY2UgaXQgd2FzIGFjY2lkZW50YWxseSBpbnRyb2R1Y2VkIHdoZW4ga21wX3dhaXQgd2FzIHNwbGl0LgorICAgICAgICAgICBJdCBjYXVzZXMgcHJvYmxlbXMgd2l0aCBpbmZpbml0ZSByZWN1cnNpb24gYmVjYXVzZSBvZiBleGl0IGxvY2sgKi8KKyAgICAgICAgLyogaWYgKCBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpICYmIF9fa21wX2dsb2JhbC5nLmdfYWJvcnQpCisgICAgICAgICAgICBfX2ttcF9hYm9ydF90aHJlYWQoKTsgKi8KKworICAgICAgICBfX2ttcF9zdGF0aWNfZGVsYXkoVFJVRSk7CisKKyAgICAgICAgLy8gaWYgd2UgYXJlIG92ZXJzdWJzY3JpYmVkLAorICAgICAgICAvLyBvciBoYXZlIHdhaXRlZCBhIGJpdCAoYW5kIEtNUF9MSUJSQVJZPXRocm91Z2hwdXQsIHRoZW4geWllbGQKKyAgICAgICAgLy8gcGF1c2UgaXMgaW4gdGhlIGZvbGxvd2luZyBjb2RlCisgICAgICAgIEtNUF9ZSUVMRCggVENSXzQoX19rbXBfbnRoKSA+IF9fa21wX2F2YWlsX3Byb2MgKTsKKyAgICAgICAgS01QX1lJRUxEX1NQSU4oIHNwaW5zICk7CisgICAgfQorICAgIEtNUF9GU1lOQ19TUElOX0FDUVVJUkVEKCBvYmogKTsKKyAgICByZXR1cm4gcjsKK30KKwordGVtcGxhdGU8IHR5cGVuYW1lIFVUID4KK3N0YXRpYyBrbXBfdWludDMyIF9fa21wX2VxKCBVVCB2YWx1ZSwgVVQgY2hlY2tlcikgeworICAgIHJldHVybiB2YWx1ZSA9PSBjaGVja2VyOworfQorCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVVQgPgorc3RhdGljIGttcF91aW50MzIgX19rbXBfbmVxKCBVVCB2YWx1ZSwgVVQgY2hlY2tlcikgeworICAgIHJldHVybiB2YWx1ZSAhPSBjaGVja2VyOworfQorCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVVQgPgorc3RhdGljIGttcF91aW50MzIgX19rbXBfbHQoIFVUIHZhbHVlLCBVVCBjaGVja2VyKSB7CisgICAgcmV0dXJuIHZhbHVlIDwgY2hlY2tlcjsKK30KKwordGVtcGxhdGU8IHR5cGVuYW1lIFVUID4KK3N0YXRpYyBrbXBfdWludDMyIF9fa21wX2dlKCBVVCB2YWx1ZSwgVVQgY2hlY2tlcikgeworICAgIHJldHVybiB2YWx1ZSA+PSBjaGVja2VyOworfQorCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVVQgPgorc3RhdGljIGttcF91aW50MzIgX19rbXBfbGUoIFVUIHZhbHVlLCBVVCBjaGVja2VyKSB7CisgICAgcmV0dXJuIHZhbHVlIDw9IGNoZWNrZXI7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQKK19fa21wX2Rpc3BhdGNoX2Rlb19lcnJvciggaW50ICpndGlkX3JlZiwgaW50ICpjaWRfcmVmLCBpZGVudF90ICpsb2NfcmVmICkKK3sKKyAgICBrbXBfaW5mb190ICp0aDsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIGd0aWRfcmVmICk7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgdGggPSBfX2ttcF90aHJlYWRzWypndGlkX3JlZl07CisgICAgICAgIGlmICggdGggLT4gdGgudGhfcm9vdCAtPiByLnJfYWN0aXZlCisgICAgICAgICAgJiYgKCB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9kaXNwYXRjaF9wcl9jdXJyZW50IC0+IHB1c2hlZF93cyAhPSBjdF9ub25lICkgKSB7CisgICAgICAgICAgICBfX2ttcF9wdXNoX3N5bmMoICpndGlkX3JlZiwgY3Rfb3JkZXJlZF9pbl9wZG8sIGxvY19yZWYsIE5VTEwgKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordGVtcGxhdGU8IHR5cGVuYW1lIFVUID4KK3N0YXRpYyB2b2lkCitfX2ttcF9kaXNwYXRjaF9kZW8oIGludCAqZ3RpZF9yZWYsIGludCAqY2lkX3JlZiwgaWRlbnRfdCAqbG9jX3JlZiApCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVVQgPjo6c2lnbmVkX3QgICAgU1Q7CisgICAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPCBVVCA+ICogcHI7CisKKyAgICBpbnQgZ3RpZCA9ICpndGlkX3JlZjsKKy8vICAgIGludCAgY2lkID0gKmNpZF9yZWY7CisgICAga21wX2luZm9fdCAqdGggPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGggLT4gdGgudGhfZGlzcGF0Y2ggKTsKKworICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9kZW86IFQjJWQgY2FsbGVkXG4iLCBndGlkICkgKTsKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgcHIgPSByZWludGVycHJldF9jYXN0PCBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFVUID4qID4KKyAgICAgICAgICAgICggdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZGlzcGF0Y2hfcHJfY3VycmVudCApOworICAgICAgICBpZiAoIHByIC0+IHB1c2hlZF93cyAhPSBjdF9ub25lICkgeworICAgICAgICAgICAgX19rbXBfcHVzaF9zeW5jKCBndGlkLCBjdF9vcmRlcmVkX2luX3BkbywgbG9jX3JlZiwgTlVMTCApOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCAhIHRoIC0+IHRoLnRoX3RlYW0gLT4gdC50X3NlcmlhbGl6ZWQgKSB7CisgICAgICAgIGRpc3BhdGNoX3NoYXJlZF9pbmZvX3RlbXBsYXRlPCBVVCA+ICAqIHNoID0gcmVpbnRlcnByZXRfY2FzdDwgZGlzcGF0Y2hfc2hhcmVkX2luZm9fdGVtcGxhdGU8IFVUID4qID4KKyAgICAgICAgICAgICggdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZGlzcGF0Y2hfc2hfY3VycmVudCApOworICAgICAgICBVVCAgbG93ZXI7CisKKyAgICAgICAgaWYgKCAhIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgICAgICBwciA9IHJlaW50ZXJwcmV0X2Nhc3Q8IGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTwgVVQgPiogPgorICAgICAgICAgICAgICAgICAgICAoIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rpc3BhdGNoX3ByX2N1cnJlbnQgKTsKKyAgICAgICAgfQorICAgICAgICBsb3dlciA9IHByLT51LnAub3JkZXJlZF9sb3dlcjsKKworICAgICAgICAjaWYgISBkZWZpbmVkKCBLTVBfR09NUF9DT01QQVQgKQorICAgICAgICAgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBwci0+b3JkZXJlZF9idW1wZWQgKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjb25zX2hlYWRlciAqcCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXS0+dGgudGhfY29uczsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0MigKKyAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pMThuX21zZ19DbnNNdWx0aXBsZU5lc3RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBjdF9vcmRlcmVkX2luX3BkbywgbG9jX3JlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICYgcC0+c3RhY2tfZGF0YVsgcC0+d190b3AgXQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgI2VuZGlmIC8qICFkZWZpbmVkKEtNUF9HT01QX0NPTVBBVCkgKi8KKworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX2RlbzogVCMlJWQgYmVmb3JlIHdhaXQ6IG9yZGVyZWRfaXRlcjolJSVzIGxvd2VyOiUlJXNcbiIsCisgICAgICAgICAgICAgICAgdHJhaXRzX3Q8IFVUID46OnNwZWMsIHRyYWl0c190PCBVVCA+OjpzcGVjICk7CisgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIGJ1ZmYsIGd0aWQsIHNoLT51LnMub3JkZXJlZF9pdGVyYXRpb24sIGxvd2VyICkgKTsKKyAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICB9CisgICAgICAgICNlbmRpZgorCisgICAgICAgIF9fa21wX3dhaXRfeWllbGQ8IFVUID4oICZzaC0+dS5zLm9yZGVyZWRfaXRlcmF0aW9uLCBsb3dlciwgX19rbXBfZ2U8IFVUID4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoIE5VTEwgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICBLTVBfTUIoKTsgIC8qIGlzIHRoaXMgbmVjZXNzYXJ5PyAqLworICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfZGVvOiBUIyUlZCBhZnRlciB3YWl0OiBvcmRlcmVkX2l0ZXI6JSUlcyBsb3dlcjolJSVzXG4iLAorICAgICAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYyApOworICAgICAgICAgICAgS0RfVFJBQ0UoMTAwMCwgKCBidWZmLCBndGlkLCBzaC0+dS5zLm9yZGVyZWRfaXRlcmF0aW9uLCBsb3dlciApICk7CisgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgfQorICAgICAgICAjZW5kaWYKKyAgICB9CisgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX2RlbzogVCMlZCByZXR1cm5lZFxuIiwgZ3RpZCApICk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9kaXNwYXRjaF9keG9fZXJyb3IoIGludCAqZ3RpZF9yZWYsIGludCAqY2lkX3JlZiwgaWRlbnRfdCAqbG9jX3JlZiApCit7CisgICAga21wX2luZm9fdCAqdGg7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgdGggPSBfX2ttcF90aHJlYWRzWypndGlkX3JlZl07CisgICAgICAgIGlmICggdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZGlzcGF0Y2hfcHJfY3VycmVudCAtPiBwdXNoZWRfd3MgIT0gY3Rfbm9uZSApIHsKKyAgICAgICAgICAgIF9fa21wX3BvcF9zeW5jKCAqZ3RpZF9yZWYsIGN0X29yZGVyZWRfaW5fcGRvLCBsb2NfcmVmICk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3RlbXBsYXRlPCB0eXBlbmFtZSBVVCA+CitzdGF0aWMgdm9pZAorX19rbXBfZGlzcGF0Y2hfZHhvKCBpbnQgKmd0aWRfcmVmLCBpbnQgKmNpZF9yZWYsIGlkZW50X3QgKmxvY19yZWYgKQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8IFVUID46OnNpZ25lZF90ICAgIFNUOworICAgIGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTwgVVQgPiAqIHByOworCisgICAgaW50IGd0aWQgPSAqZ3RpZF9yZWY7CisvLyAgICBpbnQgIGNpZCA9ICpjaWRfcmVmOworICAgIGttcF9pbmZvX3QgKnRoID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoIC0+IHRoLnRoX2Rpc3BhdGNoICk7CisKKyAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfZHhvOiBUIyVkIGNhbGxlZFxuIiwgZ3RpZCApICk7CisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIHByID0gcmVpbnRlcnByZXRfY2FzdDwgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPCBVVCA+KiA+CisgICAgICAgICAgICAoIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rpc3BhdGNoX3ByX2N1cnJlbnQgKTsKKyAgICAgICAgaWYgKCBwciAtPiBwdXNoZWRfd3MgIT0gY3Rfbm9uZSApIHsKKyAgICAgICAgICAgIF9fa21wX3BvcF9zeW5jKCBndGlkLCBjdF9vcmRlcmVkX2luX3BkbywgbG9jX3JlZiApOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCAhIHRoIC0+IHRoLnRoX3RlYW0gLT4gdC50X3NlcmlhbGl6ZWQgKSB7CisgICAgICAgIGRpc3BhdGNoX3NoYXJlZF9pbmZvX3RlbXBsYXRlPCBVVCA+ICAqIHNoID0gcmVpbnRlcnByZXRfY2FzdDwgZGlzcGF0Y2hfc2hhcmVkX2luZm9fdGVtcGxhdGU8IFVUID4qID4KKyAgICAgICAgICAgICggdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZGlzcGF0Y2hfc2hfY3VycmVudCApOworCisgICAgICAgIGlmICggISBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgICAgICBwciA9IHJlaW50ZXJwcmV0X2Nhc3Q8IGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTwgVVQgPiogPgorICAgICAgICAgICAgICAgICggdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZGlzcGF0Y2hfcHJfY3VycmVudCApOworICAgICAgICB9CisKKyAgICAgICAgS01QX0ZTWU5DX1JFTEVBU0lORyggJiBzaC0+dS5zLm9yZGVyZWRfaXRlcmF0aW9uICk7CisgICAgICAgICNpZiAhIGRlZmluZWQoIEtNUF9HT01QX0NPTVBBVCApCisgICAgICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHByLT5vcmRlcmVkX2J1bXBlZCAhPSAwICkgeworICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29uc19oZWFkZXIgKnAgPSBfX2ttcF90aHJlYWRzWyBndGlkIF0tPnRoLnRoX2NvbnM7CisgICAgICAgICAgICAgICAgICAgIC8qIEhvdyB0byB0ZXN0IGl0PyAtIE9NICovCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdDIoCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaTE4bl9tc2dfQ25zTXVsdGlwbGVOZXN0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgY3Rfb3JkZXJlZF9pbl9wZG8sIGxvY19yZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAmIHAtPnN0YWNrX2RhdGFbIHAtPndfdG9wIF0KKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICNlbmRpZiAvKiAhZGVmaW5lZChLTVBfR09NUF9DT01QQVQpICovCisKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICAgICAgcHItPm9yZGVyZWRfYnVtcGVkICs9IDE7CisKKyAgICAgICAgS0RfVFJBQ0UoMTAwMCwgKCJfX2ttcF9kaXNwYXRjaF9keG86IFQjJWQgYnVtcGluZyBvcmRlcmVkIG9yZGVyZWRfYnVtcGVkPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgcHItPm9yZGVyZWRfYnVtcGVkICkgKTsKKworICAgICAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgICAgICAvKiBUT0RPIHVzZSBnZW5lcmFsIHJlbGVhc2UgcHJvY2VkdXJlPyAqLworICAgICAgICB0ZXN0X3RoZW5faW5jPCBTVCA+KCAodm9sYXRpbGUgU1QgKikgJiBzaC0+dS5zLm9yZGVyZWRfaXRlcmF0aW9uICk7CisKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisgICAgfQorICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9keG86IFQjJWQgcmV0dXJuZWRcbiIsIGd0aWQgKSApOworfQorCisvKiBDb21wdXRlcyBhbmQgcmV0dXJucyB4IHRvIHRoZSBwb3dlciBvZiB5LCB3aGVyZSB5IG11c3QgYSBub24tbmVnYXRpdmUgaW50ZWdlciAqLwordGVtcGxhdGU8IHR5cGVuYW1lIFVUID4KK3N0YXRpYyBfX2ZvcmNlaW5saW5lIGxvbmcgZG91YmxlCitfX2ttcF9wb3cobG9uZyBkb3VibGUgeCwgVVQgeSkgeworICAgIGxvbmcgZG91YmxlIHM9MS4wTDsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoeCA+IDAuMCAmJiB4IDwgMS4wKTsKKyAgICAvL0tNUF9ERUJVR19BU1NFUlQoeSA+PSAwKTsgLy8geSBpcyB1bnNpZ25lZAorICAgIHdoaWxlKHkpIHsKKyAgICAgICAgaWYgKCB5ICYgMSApCisgICAgICAgICAgICBzICo9IHg7CisgICAgICAgIHggKj0geDsKKyAgICAgICAgeSA+Pj0gMTsKKyAgICB9CisgICAgcmV0dXJuIHM7Cit9CisKKy8qIENvbXB1dGVzIGFuZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgdW5hc3NpZ25lZCBpdGVyYXRpb25zIGFmdGVyIGlkeCBjaHVua3MgaGF2ZSBiZWVuIGFzc2lnbmVkCisgICAodGhlIHRvdGFsIG51bWJlciBvZiB1bmFzc2lnbmVkIGl0ZXJhdGlvbnMgaW4gY2h1bmtzIHdpdGggaW5kZXggZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGlkeCkuCisgICBfX2ZvcmNlaW5saW5lIHNlZW1zIHRvIGJlIGJyb2tlbiBzbyB0aGF0IGlmIHdlIF9fZm9yY2VpbmxpbmUgdGhpcyBmdW5jdGlvbiwgdGhlIGJlaGF2aW9yIGlzIHdyb25nCisgICAob25lIG9mIHRoZSB1bml0IHRlc3RzLCBzY2hfZ3VpZGVkX2FuYWx5dGljYWxfYmFzaWMuY3BwLCBmYWlscykKKyovCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CitzdGF0aWMgX19pbmxpbmUgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6dW5zaWduZWRfdAorX19rbXBfZGlzcGF0Y2hfZ3VpZGVkX3JlbWFpbmluZygKKyAgICBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjLAorICAgIHR5cGVuYW1lIHRyYWl0c190PCBUID46OmZsb2F0aW5nX3QgYmFzZSwKKyAgICB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+Ojp1bnNpZ25lZF90IGlkeAorKSB7CisgICAgLyogTm90ZTogT24gV2luZG93cyogT1Mgb24gSUEtMzIgYXJjaGl0ZWN0dXJlIGFuZCBJbnRlbChSKSA2NCwgYXQKKyAgICAgICBsZWFzdCBmb3IgSUNMIDguMSwgbG9uZyBkb3VibGUgYXJpdGhtZXRpYyBtYXkgbm90IHJlYWxseSBoYXZlCisgICAgICAgbG9uZyBkb3VibGUgcHJlY2lzaW9uLCBldmVuIHdpdGggL1Fsb25nX2RvdWJsZS4gIEN1cnJlbnRseSwgd2UKKyAgICAgICB3b3JrYXJvdW5kIHRoYXQgaW4gdGhlIGNhbGxlciBjb2RlLCBieSBtYW5pcHVsYXRpbmcgdGhlIEZQQ1cgZm9yCisgICAgICAgV2luZG93cyogT1Mgb24gSUEtMzIgYXJjaGl0ZWN0dXJlLiAgVGhlIGxhY2sgb2YgcHJlY2lzaW9uIGlzIG5vdAorICAgICAgIGV4cGVjdGVkIHRvIGJlIGEgY29ycmVjdG5lc3MgaXNzdWUsIHRob3VnaC4KKyAgICAqLworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6dW5zaWduZWRfdCAgVVQ7CisKKyAgICBsb25nIGRvdWJsZSB4ID0gdGMgKiBfX2ttcF9wb3c8IFVUID4oYmFzZSwgaWR4KTsKKyAgICBVVCByID0gKFVUKSB4OworICAgIGlmICggeCA9PSByICkKKyAgICAgICAgcmV0dXJuIHI7CisgICAgcmV0dXJuIHIgKyAxOworfQorCisvLyBQYXJhbWV0ZXJzIG9mIHRoZSBndWlkZWQtaXRlcmF0aXZlIGFsZ29yaXRobToKKy8vICAgcDIgPSBuICogbnByb2MgKiAoIGNodW5rICsgMSApICAvLyBwb2ludCBvZiBzd2l0Y2hpbmcgdG8gZHluYW1pYworLy8gICBwMyA9IDEgLyAoIG4gKiBucHJvYyApICAgICAgICAgIC8vIHJlbWFpbmluZyBpdGVyYXRpb25zIG11bHRpcGxpZXIKKy8vIGJ5IGRlZmF1bHQgbiA9IDIuIEZvciBleGFtcGxlIHdpdGggbiA9IDMgdGhlIGNodW5rcyBkaXN0cmlidXRpb24gd2lsbCBiZSBtb3JlIGZsYXQuCisvLyBXaXRoIG4gPSAxIGZpcnN0IGNodW5rIGlzIHRoZSBzYW1lIGFzIGZvciBzdGF0aWMgc2NoZWR1bGUsIGUuZy4gdHJpcCAvIG5wcm9jLgorc3RhdGljIGludCBndWlkZWRfaW50X3BhcmFtID0gMjsKK3N0YXRpYyBkb3VibGUgZ3VpZGVkX2ZsdF9wYXJhbSA9IDAuNTsvLyA9IDEuMCAvIGd1aWRlZF9pbnRfcGFyYW07CisKKy8vIFVUIC0gdW5zaWduZWQgZmxhdm9yIG9mIFQsIFNUIC0gc2lnbmVkIGZsYXZvciBvZiBULAorLy8gREJMIC0gZG91YmxlIGlmIHNpemVvZihUKT09NCwgb3IgbG9uZyBkb3VibGUgaWYgc2l6ZW9mKFQpPT04Cit0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CitzdGF0aWMgdm9pZAorX19rbXBfZGlzcGF0Y2hfaW5pdCgKKyAgICBpZGVudF90ICAgICAgICAgICAgICAgICAgICAgICAgKiBsb2MsCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwKKyAgICBlbnVtIHNjaGVkX3R5cGUgICAgICAgICAgICAgICAgICBzY2hlZHVsZSwKKyAgICBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYiwKKyAgICBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1YiwKKyAgICB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpzaWduZWRfdCBzdCwKKyAgICB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpzaWduZWRfdCBjaHVuaywKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoX3dzCispIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnVuc2lnbmVkX3QgIFVUOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6c2lnbmVkX3QgICAgU1Q7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpmbG9hdGluZ190ICBEQkw7CisgICAgc3RhdGljIGNvbnN0IGludCBfX19rbXBfc2l6ZV90eXBlID0gc2l6ZW9mKCBVVCApOworCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmU7CisgICAgVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YzsKKyAgICBrbXBfaW5mb190ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoOworICAgIGttcF90ZWFtX3QgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbTsKKyAgICBrbXBfdWludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15X2J1ZmZlcl9pbmRleDsKKyAgICBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFQgPiAgICAgICAgICAqIHByOworICAgIGRpc3BhdGNoX3NoYXJlZF9pbmZvX3RlbXBsYXRlPCBVVCA+IHZvbGF0aWxlICogc2g7CisKKyAgICBLTVBfQlVJTERfQVNTRVJUKCBzaXplb2YoIGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTwgVCA+ICkgPT0gc2l6ZW9mKCBkaXNwYXRjaF9wcml2YXRlX2luZm8gKSApOworICAgIEtNUF9CVUlMRF9BU1NFUlQoIHNpemVvZiggZGlzcGF0Y2hfc2hhcmVkX2luZm9fdGVtcGxhdGU8IFVUID4gKSA9PSBzaXplb2YoIGRpc3BhdGNoX3NoYXJlZF9pbmZvICkgKTsKKworICAgIGlmICggISBUQ1JfNCggX19rbXBfaW5pdF9wYXJhbGxlbCApICkKKyAgICAgICAgX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSgpOworCisgICAgI2lmZGVmIEtNUF9ERUJVRworICAgIHsKKyAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyUlZCBjYWxsZWQ6IHNjaGVkdWxlOiUlZCBjaHVuazolJSVzIGxiOiUlJXMgdWI6JSUlcyBzdDolJSVzXG4iLAorICAgICAgICAgICAgdHJhaXRzX3Q8IFNUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBTVCA+OjpzcGVjICk7CisgICAgICAgIEtEX1RSQUNFKDEwLCAoIGJ1ZmYsIGd0aWQsIHNjaGVkdWxlLCBjaHVuaywgbGIsIHViLCBzdCApICk7CisgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgIH0KKyAgICAjZW5kaWYKKyAgICAvKiBzZXR1cCBkYXRhICovCisgICAgdGggICAgID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIHRlYW0gICA9IHRoIC0+IHRoLnRoX3RlYW07CisgICAgYWN0aXZlID0gISB0ZWFtIC0+IHQudF9zZXJpYWxpemVkOworICAgIHRoLT50aC50aF9pZGVudCA9IGxvYzsKKworICAgIGlmICggISBhY3RpdmUgKSB7CisgICAgICAgIHByID0gcmVpbnRlcnByZXRfY2FzdDwgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPCBUID4qID4KKyAgICAgICAgICAgICggdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZGlzcF9idWZmZXIgKTsgLyogdG9wIG9mIHRoZSBzdGFjayAqLworICAgIH0gZWxzZSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoLT50aC50aF9kaXNwYXRjaCA9PQorICAgICAgICAgICAgICAgICZ0aC0+dGgudGhfdGVhbS0+dC50X2Rpc3BhdGNoW3RoLT50aC50aF9pbmZvLmRzLmRzX3RpZF0gKTsKKworICAgICAgICBteV9idWZmZXJfaW5kZXggPSB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rpc3BfaW5kZXggKys7CisKKyAgICAgICAgLyogV2hhdCBoYXBwZW5zIHdoZW4gbnVtYmVyIG9mIHRocmVhZHMgY2hhbmdlcywgbmVlZCB0byByZXNpemUgYnVmZmVyPyAqLworICAgICAgICBwciA9IHJlaW50ZXJwcmV0X2Nhc3Q8IGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTwgVCA+ICAqID4KKyAgICAgICAgICAgICggJnRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rpc3BfYnVmZmVyWyBteV9idWZmZXJfaW5kZXggJSBLTVBfTUFYX0RJU1BfQlVGIF0gKTsKKyAgICAgICAgc2ggPSByZWludGVycHJldF9jYXN0PCBkaXNwYXRjaF9zaGFyZWRfaW5mb190ZW1wbGF0ZTwgVVQgPiB2b2xhdGlsZSAqID4KKyAgICAgICAgICAgICggJnRlYW0gLT4gdC50X2Rpc3BfYnVmZmVyWyBteV9idWZmZXJfaW5kZXggJSBLTVBfTUFYX0RJU1BfQlVGIF0gKTsKKyAgICB9CisKKyAgICAvKiBQaWNrIHVwIHRoZSBub21lcmdlL29yZGVyZWQgYml0cyBmcm9tIHRoZSBzY2hlZHVsaW5nIHR5cGUgKi8KKyAgICBpZiAoIChzY2hlZHVsZSA+PSBrbXBfbm1fbG93ZXIpICYmIChzY2hlZHVsZSA8IGttcF9ubV91cHBlcikgKSB7CisgICAgICAgIHByLT5ub21lcmdlID0gVFJVRTsKKyAgICAgICAgc2NoZWR1bGUgPSAoZW51bSBzY2hlZF90eXBlKSgoKGludClzY2hlZHVsZSkgLSAoa21wX25tX2xvd2VyIC0ga21wX3NjaF9sb3dlcikpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByLT5ub21lcmdlID0gRkFMU0U7CisgICAgfQorICAgIHByLT50eXBlX3NpemUgPSBfX19rbXBfc2l6ZV90eXBlOyAvLyByZW1lbWJlciB0aGUgc2l6ZSBvZiB2YXJpYWJsZXMKKyAgICBpZiAoIGttcF9vcmRfbG93ZXIgJiBzY2hlZHVsZSApIHsKKyAgICAgICAgcHItPm9yZGVyZWQgPSBUUlVFOworICAgICAgICBzY2hlZHVsZSA9IChlbnVtIHNjaGVkX3R5cGUpKCgoaW50KXNjaGVkdWxlKSAtIChrbXBfb3JkX2xvd2VyIC0ga21wX3NjaF9sb3dlcikpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByLT5vcmRlcmVkID0gRkFMU0U7CisgICAgfQorICAgIGlmICggc2NoZWR1bGUgPT0ga21wX3NjaF9zdGF0aWMgKSB7CisgICAgICAgIHNjaGVkdWxlID0gX19rbXBfc3RhdGljOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICggc2NoZWR1bGUgPT0ga21wX3NjaF9ydW50aW1lICkgeworICAgICAgICAgICAgI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBzY2hlZHVsaW5nIHNwZWNpZmllZCBieSBPTVBfU0NIRURVTEUgKG9yIF9fa21wX3NjaF9kZWZhdWx0IGlmIG5vdCBzcGVjaWZpZWQpCisgICAgICAgICAgICAgICAgc2NoZWR1bGUgPSB0ZWFtIC0+IHQudF9zY2hlZC5yX3NjaGVkX3R5cGU7CisgICAgICAgICAgICAgICAgLy8gRGV0YWlsIHRoZSBzY2hlZHVsZSBpZiBuZWVkZWQgKGdsb2JhbCBjb250cm9scyBhcmUgZGlmZmVyZW50aWF0ZWQgYXBwcm9wcmlhdGVseSkKKyAgICAgICAgICAgICAgICBpZiAoIHNjaGVkdWxlID09IGttcF9zY2hfZ3VpZGVkX2NodW5rZWQgKSB7CisgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlID0gX19rbXBfZ3VpZGVkOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIHNjaGVkdWxlID09IGttcF9zY2hfc3RhdGljICkgeworICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZSA9IF9fa21wX3N0YXRpYzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBjaHVuayBzaXplIHNwZWNpZmllZCBieSBPTVBfU0NIRURVTEUgKG9yIGRlZmF1bHQgaWYgbm90IHNwZWNpZmllZCkKKyAgICAgICAgICAgICAgICBjaHVuayA9IHRlYW0gLT4gdC50X3NjaGVkLmNodW5rOworICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgICBrbXBfcl9zY2hlZF90IHJfc2NoZWQgPSBfX2ttcF9nZXRfc2NoZWR1bGVfZ2xvYmFsKCk7CisgICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBzY2hlZHVsaW5nIHNwZWNpZmllZCBieSBPTVBfU0NIRURVTEUgYW5kL29yIEtNUF9TQ0hFRFVMRSBvciBkZWZhdWx0CisgICAgICAgICAgICAgICAgc2NoZWR1bGUgPSByX3NjaGVkLnJfc2NoZWRfdHlwZTsKKyAgICAgICAgICAgICAgICBjaHVuayAgICA9IHJfc2NoZWQuY2h1bms7CisgICAgICAgICAgICAjZW5kaWYKKworICAgICAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfaW5pdDogVCMlJWQgbmV3OiBzY2hlZHVsZTolJWQgY2h1bms6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3Q8IFNUID46OnNwZWMgKTsKKyAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMCwgKCBidWZmLCBndGlkLCBzY2hlZHVsZSwgY2h1bmsgKSApOworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgI2VuZGlmCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIHNjaGVkdWxlID09IGttcF9zY2hfZ3VpZGVkX2NodW5rZWQgKSB7CisgICAgICAgICAgICAgICAgc2NoZWR1bGUgPSBfX2ttcF9ndWlkZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGNodW5rIDw9IDAgKSB7CisgICAgICAgICAgICAgICAgY2h1bmsgPSBLTVBfREVGQVVMVF9DSFVOSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICNpZiBPTVBfMzBfRU5BQkxFRAorICAgICAgICBpZiAoIHNjaGVkdWxlID09IGttcF9zY2hfYXV0byApIHsKKyAgICAgICAgICAgIC8vIG1hcHBpbmcgYW5kIGRpZmZlcmVudGlhdGlvbjogaW4gdGhlIF9fa21wX2RvX3NlcmlhbF9pbml0aWFsaXplKCkKKyAgICAgICAgICAgIHNjaGVkdWxlID0gX19rbXBfYXV0bzsKKyAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX2luaXQ6IGttcF9zY2hfYXV0bzogVCMlJWQgbmV3OiBzY2hlZHVsZTolJWQgY2h1bms6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3Q8IFNUID46OnNwZWMgKTsKKyAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMCwgKCBidWZmLCBndGlkLCBzY2hlZHVsZSwgY2h1bmsgKSApOworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgI2VuZGlmCisgICAgICAgIH0KKyAgICAgICAgI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisKKyAgICAgICAgLyogZ3VpZGVkIGFuYWx5dGljYWwgbm90IHNhZmUgZm9yIHRvbyBtYW55IHRocmVhZHMgKi8KKyAgICAgICAgaWYgKCB0ZWFtLT50LnRfbnByb2MgPiAxPDwyMCAmJiBzY2hlZHVsZSA9PSBrbXBfc2NoX2d1aWRlZF9hbmFseXRpY2FsX2NodW5rZWQgKSB7CisgICAgICAgICAgICBzY2hlZHVsZSA9IGttcF9zY2hfZ3VpZGVkX2l0ZXJhdGl2ZV9jaHVua2VkOworICAgICAgICAgICAgS01QX1dBUk5JTkcoIERpc3BhdGNoTWFueVRocmVhZHMgKTsKKyAgICAgICAgfQorICAgICAgICBwci0+dS5wLnBhcm0xID0gY2h1bms7CisgICAgfQorICAgIEtNUF9BU1NFUlQyKCAoa21wX3NjaF9sb3dlciA8IHNjaGVkdWxlICYmIHNjaGVkdWxlIDwga21wX3NjaF91cHBlciksCisgICAgICAgICAgICAgICAgInVua25vd24gc2NoZWR1bGluZyB0eXBlIiApOworCisgICAgcHItPnUucC5jb3VudCA9IDA7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgaWYgKCBzdCA9PSAwICkgeworICAgICAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0KAorICAgICAgICAgICAgICAgIGttcF9pMThuX21zZ19DbnNMb29wSW5jclplcm9Qcm9oaWJpdGVkLAorICAgICAgICAgICAgICAgICggcHItPm9yZGVyZWQgPyBjdF9wZG9fb3JkZXJlZCA6IGN0X3BkbyApLCBsb2MKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB0YyA9ICggdWIgLSBsYiArIHN0ICk7CisgICAgaWYgKCBzdCAhPSAxICkgeworICAgICAgICBpZiAoIHN0IDwgMCApIHsKKyAgICAgICAgICAgIGlmICggbGIgPCB1YiApIHsKKyAgICAgICAgICAgICAgICB0YyA9IDA7ICAgICAgICAgICAgLy8gemVyby10cmlwCisgICAgICAgICAgICB9IGVsc2UgeyAgIC8vIGxiID49IHViCisgICAgICAgICAgICAgICAgdGMgPSAoU1QpdGMgLyBzdDsgIC8vIGNvbnZlcnQgdG8gc2lnbmVkIGRpdmlzaW9uCisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7ICAgICAgIC8vIHN0ID4gMAorICAgICAgICAgICAgaWYgKCB1YiA8IGxiICkgeworICAgICAgICAgICAgICAgIHRjID0gMDsgICAgICAgICAgICAvLyB6ZXJvLXRyaXAKKyAgICAgICAgICAgIH0gZWxzZSB7ICAgLy8gbGIgPj0gdWIKKyAgICAgICAgICAgICAgICB0YyAvPSBzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoIHViIDwgbGIgKSB7ICAgICAgICAvLyBzdCA9PSAxCisgICAgICAgIHRjID0gMDsgICAgICAgICAgICAgICAgICAgIC8vIHplcm8tdHJpcAorICAgIH0KKworICAgIHByLT51LnAubGIgPSBsYjsKKyAgICBwci0+dS5wLnViID0gdWI7CisgICAgcHItPnUucC5zdCA9IHN0OworICAgIHByLT51LnAudGMgPSB0YzsKKworICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgIHByLT51LnAubGFzdF91cHBlciA9IHViICsgc3Q7CisgICAgI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCisKKyAgICAvKiBOT1RFOiBvbmx5IHRoZSBhY3RpdmUgcGFyYWxsZWwgcmVnaW9uKHMpIGhhcyBhY3RpdmUgb3JkZXJlZCBzZWN0aW9ucyAqLworCisgICAgaWYgKCBhY3RpdmUgKSB7CisgICAgICAgIGlmICggcHItPm9yZGVyZWQgPT0gMCApIHsKKyAgICAgICAgICAgIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rlb19mY24gPSBfX2ttcF9kaXNwYXRjaF9kZW9fZXJyb3I7CisgICAgICAgICAgICB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9keG9fZmNuID0gX19rbXBfZGlzcGF0Y2hfZHhvX2Vycm9yOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHItPm9yZGVyZWRfYnVtcGVkID0gMDsKKworICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX2xvd2VyID0gMTsKKyAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF91cHBlciA9IDA7CisKKyAgICAgICAgICAgIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rlb19mY24gPSBfX2ttcF9kaXNwYXRjaF9kZW88IFVUID47CisgICAgICAgICAgICB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9keG9fZmNuID0gX19rbXBfZGlzcGF0Y2hfZHhvPCBVVCA+OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGVudW0gY29uc190eXBlIHdzID0gcHItPm9yZGVyZWQgPyBjdF9wZG9fb3JkZXJlZCA6IGN0X3BkbzsKKyAgICAgICAgaWYgKCBwdXNoX3dzICkgeworICAgICAgICAgICAgX19rbXBfcHVzaF93b3Jrc2hhcmUoIGd0aWQsIHdzLCBsb2MgKTsKKyAgICAgICAgICAgIHByLT5wdXNoZWRfd3MgPSB3czsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX2NoZWNrX3dvcmtzaGFyZSggZ3RpZCwgd3MsIGxvYyApOworICAgICAgICAgICAgcHItPnB1c2hlZF93cyA9IGN0X25vbmU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzd2l0Y2ggKCBzY2hlZHVsZSApIHsKKyAgICAjaWYgICggS01QX1NUQVRJQ19TVEVBTF9FTkFCTEVEICYmIEtNUF9BUkNIX1g4Nl82NCApCisgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19zdGVhbDoKKyAgICAgICAgeworICAgICAgICAgICAgVCBucHJvYyA9IHRlYW0tPnQudF9ucHJvYzsKKyAgICAgICAgICAgIFQgbnRjLCBpbml0OworCisgICAgICAgICAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfaW5pdDogVCMlZCBrbXBfc2NoX3N0YXRpY19zdGVhbCBjYXNlXG4iLCBndGlkICkgKTsKKworICAgICAgICAgICAgbnRjID0gKHRjICUgY2h1bmsgPyAxIDogMCkgKyB0YyAvIGNodW5rOworICAgICAgICAgICAgaWYgKCBucHJvYyA+IDEgJiYgbnRjID49IG5wcm9jICkgeworICAgICAgICAgICAgICAgIFQgaWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworICAgICAgICAgICAgICAgIFQgc21hbGxfY2h1bmssIGV4dHJhczsKKworICAgICAgICAgICAgICAgIHNtYWxsX2NodW5rID0gbnRjIC8gbnByb2M7CisgICAgICAgICAgICAgICAgZXh0cmFzID0gbnRjICUgbnByb2M7CisKKyAgICAgICAgICAgICAgICBpbml0ID0gaWQgKiBzbWFsbF9jaHVuayArICggaWQgPCBleHRyYXMgPyBpZCA6IGV4dHJhcyApOworICAgICAgICAgICAgICAgIHByLT51LnAuY291bnQgPSBpbml0OworICAgICAgICAgICAgICAgIHByLT51LnAudWIgPSBpbml0ICsgc21hbGxfY2h1bmsgKyAoIGlkIDwgZXh0cmFzID8gMSA6IDAgKTsKKworICAgICAgICAgICAgICAgIHByLT51LnAucGFybTIgPSBsYjsKKyAgICAgICAgICAgICAgICAvL3ByLT5wZmllbGRzLnBhcm0zID0gMDsgLy8gaXQncyBub3QgdXNlZCBpbiBzdGF0aWNfc3RlYWwKKyAgICAgICAgICAgICAgICBwci0+dS5wLnBhcm00ID0gaWQ7CisgICAgICAgICAgICAgICAgcHItPnUucC5zdCA9IHN0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfaW5pdDogVCMlZCBmYWxsaW5nLXRocm91Z2ggdG8ga21wX3NjaF9zdGF0aWNfYmFsYW5jZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCApICk7CisgICAgICAgICAgICAgICAgc2NoZWR1bGUgPSBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZDsKKyAgICAgICAgICAgICAgICAvKiB0b28gZmV3IGl0ZXJhdGlvbnM6IGZhbGwtdGhyb3VnaCB0byBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZCAqLworICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgLyogRkFMTC1USFJPVUdIIHRvIHN0YXRpYyBiYWxhbmNlZCAqLworICAgICAgICB9IC8vIGNhc2UKKyAgICAjZW5kaWYKKyAgICBjYXNlIGttcF9zY2hfc3RhdGljX2JhbGFuY2VkOgorICAgICAgICB7CisgICAgICAgICAgICBUIG5wcm9jID0gdGVhbS0+dC50X25wcm9jOworICAgICAgICAgICAgVCBpbml0LCBsaW1pdDsKKworICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX2luaXQ6IFQjJWQga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQgY2FzZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkICkgKTsKKworICAgICAgICAgICAgaWYgKCBucHJvYyA+IDEgKSB7CisgICAgICAgICAgICAgICAgVCBpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCk7CisKKyAgICAgICAgICAgICAgICBpZiAoIHRjIDwgbnByb2MgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggaWQgPCB0YyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluaXQgPSBpZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLnBhcm0xID0gKGlkID09IHRjIC0gMSk7ICAvKiBwYXJtMSBzdG9yZXMgKnBsYXN0aXRlciAqLworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcHItPnUucC5jb3VudCA9IDE7ICAvKiBtZWFucyBubyBtb3JlIGNodW5rcyB0byBleGVjdXRlICovCisgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLnBhcm0xID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFQgc21hbGxfY2h1bmsgPSB0YyAvIG5wcm9jOworICAgICAgICAgICAgICAgICAgICBUIGV4dHJhcyA9IHRjICUgbnByb2M7CisgICAgICAgICAgICAgICAgICAgIGluaXQgPSBpZCAqIHNtYWxsX2NodW5rICsgKGlkIDwgZXh0cmFzID8gaWQgOiBleHRyYXMpOworICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IGluaXQgKyBzbWFsbF9jaHVuayAtIChpZCA8IGV4dHJhcyA/IDAgOiAxKTsKKyAgICAgICAgICAgICAgICAgICAgcHItPnUucC5wYXJtMSA9IChpZCA9PSBucHJvYyAtIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCB0YyA+IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIGluaXQgPSAwOworICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IHRjIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgcHItPnUucC5wYXJtMSA9IFRSVUU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gemVybyB0cmlwIGNvdW50CisgICAgICAgICAgICAgICAgICAgIHByLT51LnAuY291bnQgPSAxOyAgLyogbWVhbnMgbm8gbW9yZSBjaHVua3MgdG8gZXhlY3V0ZSAqLworICAgICAgICAgICAgICAgICAgICBwci0+dS5wLnBhcm0xID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggc3QgPT0gMSApIHsKKyAgICAgICAgICAgICAgICBwci0+dS5wLmxiID0gbGIgKyBpbml0OworICAgICAgICAgICAgICAgIHByLT51LnAudWIgPSBsYiArIGxpbWl0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBUIHViX3RtcCA9IGxiICsgbGltaXQgKiBzdDsgICAvLyBjYWxjdWxhdGVkIHVwcGVyIGJvdW5kLCAidWIiIGlzIHVzZXItZGVmaW5lZCB1cHBlciBib3VuZAorICAgICAgICAgICAgICAgIHByLT51LnAubGIgPSBsYiArIGluaXQgKiBzdDsKKyAgICAgICAgICAgICAgICAvLyBhZGp1c3QgdXBwZXIgYm91bmQgdG8gInViIiBpZiBuZWVkZWQsIHNvIHRoYXQgTVMgbGFzdHByaXZhdGUgd2lsbCBtYXRjaCBpdCBleGFjdGx5CisgICAgICAgICAgICAgICAgaWYgKCBzdCA+IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIHByLT51LnAudWIgPSAoIHViX3RtcCArIHN0ID4gdWIgPyB1YiA6IHViX3RtcCApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHByLT51LnAudWIgPSAoIHViX3RtcCArIHN0IDwgdWIgPyB1YiA6IHViX3RtcCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggcHItPm9yZGVyZWQgKSB7CisgICAgICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX2xvd2VyID0gaW5pdDsKKyAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfdXBwZXIgPSBsaW1pdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IC8vIGNhc2UKKyAgICBjYXNlIGttcF9zY2hfZ3VpZGVkX2l0ZXJhdGl2ZV9jaHVua2VkIDoKKyAgICAgICAgeworICAgICAgICAgICAgVCBucHJvYyA9IHRlYW0tPnQudF9ucHJvYzsKKyAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwoIl9fa21wX2Rpc3BhdGNoX2luaXQ6IFQjJWQga21wX3NjaF9ndWlkZWRfaXRlcmF0aXZlX2NodW5rZWQgY2FzZVxuIixndGlkKSk7CisKKyAgICAgICAgICAgIGlmICggbnByb2MgPiAxICkgeworICAgICAgICAgICAgICAgIGlmICggKDJMICogY2h1bmsgKyAxICkgKiBucHJvYyA+PSB0YyApIHsKKyAgICAgICAgICAgICAgICAgICAgLyogY2h1bmsgc2l6ZSB0b28gbGFyZ2UsIHN3aXRjaCB0byBkeW5hbWljICovCisgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlID0ga21wX3NjaF9keW5hbWljX2NodW5rZWQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiByZW1haW5pbmcgaXRlcnMgYmVjb21lIGxlc3MgdGhhbiBwYXJtMiAtIHN3aXRjaCB0byBkeW5hbWljCisgICAgICAgICAgICAgICAgICAgIHByLT51LnAucGFybTIgPSBndWlkZWRfaW50X3BhcmFtICogbnByb2MgKiAoIGNodW5rICsgMSApOworICAgICAgICAgICAgICAgICAgICAqKGRvdWJsZSopJnByLT51LnAucGFybTMgPSBndWlkZWRfZmx0X3BhcmFtIC8gbnByb2M7ICAgLy8gbWF5IG9jY3VweSBwYXJtMyBhbmQgcGFybTQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwoIl9fa21wX2Rpc3BhdGNoX2luaXQ6IFQjJWQgZmFsbGluZy10aHJvdWdoIHRvIGttcF9zY2hfc3RhdGljX2dyZWVkeVxuIixndGlkKSk7CisgICAgICAgICAgICAgICAgc2NoZWR1bGUgPSBrbXBfc2NoX3N0YXRpY19ncmVlZHk7CisgICAgICAgICAgICAgICAgLyogdGVhbS0+dC50X25wcm9jID09IDE6IGZhbGwtdGhyb3VnaCB0byBrbXBfc2NoX3N0YXRpY19ncmVlZHkgKi8KKyAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAsKCJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyVkIGttcF9zY2hfc3RhdGljX2dyZWVkeSBjYXNlXG4iLGd0aWQpKTsKKyAgICAgICAgICAgICAgICBwci0+dS5wLnBhcm0xID0gdGM7CisgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgIH0gLy8gY2FzZQorICAgICAgICBicmVhazsKKyAgICBjYXNlIGttcF9zY2hfZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZDoKKyAgICAgICAgeworICAgICAgICAgICAgVCBucHJvYyA9IHRlYW0tPnQudF9ucHJvYzsKKyAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyVkIGttcF9zY2hfZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZCBjYXNlXG4iLCBndGlkKSk7CisKKyAgICAgICAgICAgIGlmICggbnByb2MgPiAxICkgeworICAgICAgICAgICAgICAgIGlmICggKDJMICogY2h1bmsgKyAxICkgKiBucHJvYyA+PSB0YyApIHsKKyAgICAgICAgICAgICAgICAgICAgLyogY2h1bmsgc2l6ZSB0b28gbGFyZ2UsIHN3aXRjaCB0byBkeW5hbWljICovCisgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlID0ga21wX3NjaF9keW5hbWljX2NodW5rZWQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogY29tbW9ubHkgdXNlZCB0ZXJtOiAoMiBucHJvYyAtIDEpLygyIG5wcm9jKSAqLworICAgICAgICAgICAgICAgICAgICBEQkwgeDsKKworICAgICAgICAgICAgICAgICAgICAjaWYgS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2CisgICAgICAgICAgICAgICAgICAgIC8qIExpbnV4KiBPUyBhbHJlYWR5IGhhcyA2NC1iaXQgY29tcHV0YXRpb24gYnkgZGVmYXVsdCBmb3IKKwkJICAgICAgIGxvbmcgZG91YmxlLCBhbmQgb24gV2luZG93cyogT1Mgb24gSW50ZWwoUikgNjQsCisJCSAgICAgICAvUWxvbmdfZG91YmxlIGRvZXNuJ3Qgd29yay4gIE9uIFdpbmRvd3MqIE9TCisJCSAgICAgICBvbiBJQS0zMiBhcmNoaXRlY3R1cmUsIHdlIG5lZWQgdG8gc2V0IHByZWNpc2lvbiB0bworCQkgICAgICAgNjQtYml0IGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgNTMtYml0LiBFdmVuIHRob3VnaCBsb25nCisJCSAgICAgICBkb3VibGUgZG9lc24ndCB3b3JrIG9uIFdpbmRvd3MqIE9TIG9uIEludGVsKFIpIDY0LCB0aGUKKwkJICAgICAgIHJlc3VsdGluZyBsYWNrIG9mIHByZWNpc2lvbiBpcyBub3QgZXhwZWN0ZWQgdG8gaW1wYWN0CisJCSAgICAgICB0aGUgY29ycmVjdG5lc3Mgb2YgdGhlIGFsZ29yaXRobSwgYnV0IHRoaXMgaGFzIG5vdCBiZWVuCisJCSAgICAgICBtYXRoZW1hdGljYWxseSBwcm92ZW4uCisgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIC8vIHNhdmUgb3JpZ2luYWwgRlBDVyBhbmQgc2V0IHByZWNpc2lvbiB0byA2NC1iaXQsIGFzCisgICAgICAgICAgICAgICAgICAgIC8vIFdpbmRvd3MqIE9TIG9uIElBLTMyIGFyY2hpdGVjdHVyZSBkZWZhdWx0cyB0byA1My1iaXQKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG9sZEZwY3cgPSBfY29udHJvbDg3KDAsMCk7CisgICAgICAgICAgICAgICAgICAgIF9jb250cm9sODcoX1BDXzY0LF9NQ1dfUEMpOyAvLyAwLDB4MzAwMDAKKyAgICAgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIC8qIHZhbHVlIHVzZWQgZm9yIGNvbXBhcmlzb24gaW4gc29sdmVyIGZvciBjcm9zcy1vdmVyIHBvaW50ICovCisgICAgICAgICAgICAgICAgICAgIGxvbmcgZG91YmxlIHRhcmdldCA9ICgobG9uZyBkb3VibGUpY2h1bmsgKiAyICsgMSkgKiBucHJvYyAvIHRjOworCisgICAgICAgICAgICAgICAgICAgIC8qIGNyb3Nzb3ZlciBwb2ludC0tY2h1bmsgaW5kZXhlcyBlcXVhbCB0byBvciBncmVhdGVyIHRoYW4KKwkJICAgICAgIHRoaXMgcG9pbnQgc3dpdGNoIHRvIGR5bmFtaWMtc3R5bGUgc2NoZWR1bGluZyAqLworICAgICAgICAgICAgICAgICAgICBVVCAgIGNyb3NzOworCisgICAgICAgICAgICAgICAgICAgIC8qIGNvbW1vbmx5IHVzZWQgdGVybTogKDIgbnByb2MgLSAxKS8oMiBucHJvYykgKi8KKyAgICAgICAgICAgICAgICAgICAgeCA9IChsb25nIGRvdWJsZSkxLjAgLSAobG9uZyBkb3VibGUpMC41IC8gbnByb2M7CisKKyAgICAgICAgICAgICAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgICAgICAgICB7IC8vIHRlc3QgbmF0dXJhbCBhbGlnbm1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfdGVzdF9hIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCTCAgZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICAgICAgfSB0OworICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IG5hdHVyYWxfYWxpZ25tZW50ID0gKHB0cmRpZmZfdCkmdC5iIC0gKHB0cmRpZmZfdCkmdCAtIChwdHJkaWZmX3QpMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vX19rbXBfd2FybiggIiAlbGx4ICVsbHggJWxsZCIsIChsb25nIGxvbmcpJnQuZCwgKGxvbmcgbG9uZykmdCwgKGxvbmcgbG9uZyluYXR1cmFsX2FsaWdubWVudCApOworICAgICAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKCAoIChwdHJkaWZmX3QpJnByLT51LnAucGFybTMgKSAmICggbmF0dXJhbF9hbGlnbm1lbnQgKSApID09IDAgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAjZW5kaWYgLy8gS01QX0RFQlVHCisKKyAgICAgICAgICAgICAgICAgICAgLyogc2F2ZSB0aGUgdGVybSBpbiB0aHJlYWQgcHJpdmF0ZSBkaXNwYXRjaCBzdHJ1Y3R1cmUgKi8KKyAgICAgICAgICAgICAgICAgICAgKihEQkwqKSZwci0+dS5wLnBhcm0zID0geDsKKworICAgICAgICAgICAgICAgICAgICAvKiBzb2x2ZSBmb3IgdGhlIGNyb3Nzb3ZlciBwb2ludCB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyIGkgZm9yIHdoaWNoIENfaSA8PSBjaHVuayAqLworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBVVCAgICAgICAgICBsZWZ0LCByaWdodCwgbWlkOworICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBkb3VibGUgcDsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogZXN0aW1hdGUgaW5pdGlhbCB1cHBlciBhbmQgbG93ZXIgYm91bmQgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9lc24ndCBtYXR0ZXIgd2hhdCB2YWx1ZSByaWdodCBpcyBhcyBsb25nIGFzIGl0IGlzIHBvc2l0aXZlLCBidXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IGFmZmVjdHMgcGVyZm9ybWFuY2Ugb2YgdGhlIHNvbHZlcgorICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gMjI5OworICAgICAgICAgICAgICAgICAgICAgICAgcCA9IF9fa21wX3BvdzwgVVQgPih4LHJpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcCA+IHRhcmdldCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCAqPSBwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCA8PD0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKHA+dGFyZ2V0ICYmIHJpZ2h0IDwgKDE8PDI3KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9IHJpZ2h0ID4+IDE7IC8qIGxvd2VyIGJvdW5kIGlzIHByZXZpb3VzIChmYWlsZWQpIGVzdGltYXRlIG9mIHVwcGVyIGJvdW5kICovCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBiaXNlY3Rpb24gcm9vdC1maW5kaW5nIG1ldGhvZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCBsZWZ0ICsgMSA8IHJpZ2h0ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pZCA9IChsZWZ0ICsgcmlnaHQpIC8gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIF9fa21wX3BvdzwgVVQgPih4LG1pZCkgPiB0YXJnZXQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSBtaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSBtaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyB3aGlsZQorICAgICAgICAgICAgICAgICAgICAgICAgY3Jvc3MgPSByaWdodDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvKiBhc3NlcnQgc2FuaXR5IG9mIGNvbXB1dGVkIGNyb3Nzb3ZlciBwb2ludCAqLworICAgICAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKGNyb3NzICYmIF9fa21wX3BvdzwgVVQgPih4LCBjcm9zcyAtIDEpID4gdGFyZ2V0ICYmIF9fa21wX3BvdzwgVVQgPih4LCBjcm9zcykgPD0gdGFyZ2V0KTsKKworICAgICAgICAgICAgICAgICAgICAvKiBzYXZlIHRoZSBjcm9zc292ZXIgcG9pbnQgaW4gdGhyZWFkIHByaXZhdGUgZGlzcGF0Y2ggc3RydWN0dXJlICovCisgICAgICAgICAgICAgICAgICAgIHByLT51LnAucGFybTIgPSBjcm9zczsKKworICAgICAgICAgICAgICAgICAgICAvLyBDNzU4MDMKKyAgICAgICAgICAgICAgICAgICAgI2lmICggKCBLTVBfT1NfTElOVVggfHwgS01QX09TX1dJTkRPV1MgKSAmJiBLTVBfQVJDSF9YODYgKSAmJiAoICEgZGVmaW5lZCggS01QX0k4ICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgI2RlZmluZSBHVUlERURfQU5BTFlUSUNBTF9XT1JLQVJPVU5EICgqKCBEQkwgKiApJnByLT51LnAucGFybTMpCisgICAgICAgICAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAjZGVmaW5lIEdVSURFRF9BTkFMWVRJQ0FMX1dPUktBUk9VTkQgKHgpCisgICAgICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgICAvKiBkeW5hbWljLXN0eWxlIHNjaGVkdWxpbmcgb2Zmc2V0ICovCisgICAgICAgICAgICAgICAgICAgIHByLT51LnAuY291bnQgPSB0YyAtIF9fa21wX2Rpc3BhdGNoX2d1aWRlZF9yZW1haW5pbmcodGMsIEdVSURFRF9BTkFMWVRJQ0FMX1dPUktBUk9VTkQsIGNyb3NzKSAtIGNyb3NzICogY2h1bms7CisgICAgICAgICAgICAgICAgICAgICNpZiBLTVBfT1NfV0lORE9XUyAmJiBLTVBfQVJDSF9YODYKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3RvcmUgRlBDVworICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRyb2w4NyhvbGRGcGN3LF9NQ1dfUEMpOworICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyVkIGZhbGxpbmctdGhyb3VnaCB0byBrbXBfc2NoX3N0YXRpY19ncmVlZHlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCApICk7CisgICAgICAgICAgICAgICAgc2NoZWR1bGUgPSBrbXBfc2NoX3N0YXRpY19ncmVlZHk7CisgICAgICAgICAgICAgICAgLyogdGVhbS0+dC50X25wcm9jID09IDE6IGZhbGwtdGhyb3VnaCB0byBrbXBfc2NoX3N0YXRpY19ncmVlZHkgKi8KKyAgICAgICAgICAgICAgICBwci0+dS5wLnBhcm0xID0gdGM7CisgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgIH0gLy8gY2FzZQorICAgICAgICBicmVhazsKKyAgICBjYXNlIGttcF9zY2hfc3RhdGljX2dyZWVkeToKKyAgICAgICAgS0RfVFJBQ0UoMTAwLCgiX19rbXBfZGlzcGF0Y2hfaW5pdDogVCMlZCBrbXBfc2NoX3N0YXRpY19ncmVlZHkgY2FzZVxuIixndGlkKSk7CisgICAgICAgICAgICBwci0+dS5wLnBhcm0xID0gKCB0ZWFtIC0+IHQudF9ucHJvYyA+IDEgKSA/CisgICAgICAgICAgICAgICAgKCB0YyArIHRlYW0tPnQudF9ucHJvYyAtIDEgKSAvIHRlYW0tPnQudF9ucHJvYyA6CisgICAgICAgICAgICAgICAgdGM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfY2h1bmtlZCA6CisgICAgY2FzZSBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZCA6CisgICAgICAgIEtEX1RSQUNFKDEwMCwoIl9fa21wX2Rpc3BhdGNoX2luaXQ6IFQjJWQga21wX3NjaF9zdGF0aWNfY2h1bmtlZC9rbXBfc2NoX2R5bmFtaWNfY2h1bmtlZCBjYXNlc1xuIiwgZ3RpZCkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGttcF9zY2hfdHJhcGV6b2lkYWwgOgorICAgICAgICB7CisgICAgICAgICAgICAvKiBUU1M6IHRyYXBlem9pZCBzZWxmLXNjaGVkdWxpbmcsIG1pbmltdW0gY2h1bmtfc2l6ZSA9IHBhcm0xICovCisKKyAgICAgICAgICAgIFQgcGFybTEsIHBhcm0yLCBwYXJtMywgcGFybTQ7CisgICAgICAgICAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfaW5pdDogVCMlZCBrbXBfc2NoX3RyYXBlem9pZGFsIGNhc2VcbiIsIGd0aWQgKSApOworCisgICAgICAgICAgICBwYXJtMSA9IGNodW5rOworCisgICAgICAgICAgICAvKiBGIDogc2l6ZSBvZiB0aGUgZmlyc3QgY3ljbGUgKi8KKyAgICAgICAgICAgIHBhcm0yID0gKCB0YyAvICgyICogdGVhbS0+dC50X25wcm9jKSApOworCisgICAgICAgICAgICBpZiAoIHBhcm0yIDwgMSApIHsKKyAgICAgICAgICAgICAgICBwYXJtMiA9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIEwgOiBzaXplIG9mIHRoZSBsYXN0IGN5Y2xlLiAgTWFrZSBzdXJlIHRoZSBsYXN0IGN5Y2xlCisgICAgICAgICAgICAgKiAgICAgaXMgbm90IGxhcmdlciB0aGFuIHRoZSBmaXJzdCBjeWNsZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKCBwYXJtMSA8IDEgKSB7CisgICAgICAgICAgICAgICAgcGFybTEgPSAxOworICAgICAgICAgICAgfSBlbHNlIGlmICggcGFybTEgPiBwYXJtMiApIHsKKyAgICAgICAgICAgICAgICBwYXJtMSA9IHBhcm0yOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBOIDogbnVtYmVyIG9mIGN5Y2xlcyAqLworICAgICAgICAgICAgcGFybTMgPSAoIHBhcm0yICsgcGFybTEgKTsKKyAgICAgICAgICAgIHBhcm0zID0gKCAyICogdGMgKyBwYXJtMyAtIDEpIC8gcGFybTM7CisKKyAgICAgICAgICAgIGlmICggcGFybTMgPCAyICkgeworICAgICAgICAgICAgICAgIHBhcm0zID0gMjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogc2lnbWEgOiBkZWNyZWFzaW5nIGluY3Igb2YgdGhlIHRyYXBlem9pZCAqLworICAgICAgICAgICAgcGFybTQgPSAoIHBhcm0zIC0gMSApOworICAgICAgICAgICAgcGFybTQgPSAoIHBhcm0yIC0gcGFybTEgKSAvIHBhcm00OworCisgICAgICAgICAgICAvLyBwb2ludGxlc3MgY2hlY2ssIGJlY2F1c2UgcGFybTQgPj0gMCBhbHdheXMKKyAgICAgICAgICAgIC8vaWYgKCBwYXJtNCA8IDAgKSB7CisgICAgICAgICAgICAvLyAgICBwYXJtNCA9IDA7CisgICAgICAgICAgICAvL30KKworICAgICAgICAgICAgcHItPnUucC5wYXJtMSA9IHBhcm0xOworICAgICAgICAgICAgcHItPnUucC5wYXJtMiA9IHBhcm0yOworICAgICAgICAgICAgcHItPnUucC5wYXJtMyA9IHBhcm0zOworICAgICAgICAgICAgcHItPnUucC5wYXJtNCA9IHBhcm00OworICAgICAgICB9IC8vIGNhc2UKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldmVyaXR5CisgICAgICAgICAgICAgICAgS01QX01TRyggVW5rbm93blNjaGVkVHlwZURldGVjdGVkICksIC8vIFByaW1hcnkgbWVzc2FnZQorICAgICAgICAgICAgICAgIEtNUF9ITlQoIEdldE5ld2VyTGlicmFyeSApLCAgICAgICAgICAvLyBIaW50CisgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwgICAgICAgICAgICAgICAgICAgICAgIC8vIFZhcmlhZGljIGFyZ3VtZW50IGxpc3QgdGVybWluYXRvcgorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9IC8vIHN3aXRjaAorICAgIHByLT5zY2hlZHVsZSA9IHNjaGVkdWxlOworICAgIGlmICggYWN0aXZlICkgeworICAgICAgICAvKiBUaGUgbmFtZSBvZiB0aGlzIGJ1ZmZlciBzaG91bGQgYmUgbXlfYnVmZmVyX2luZGV4IHdoZW4gaXQncyBmcmVlIHRvIHVzZSBpdCAqLworCisgICAgICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyVkIGJlZm9yZSB3YWl0OiBteV9idWZmZXJfaW5kZXg6JWQgc2gtPmJ1ZmZlcl9pbmRleDolZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIG15X2J1ZmZlcl9pbmRleCwgc2gtPmJ1ZmZlcl9pbmRleCkgKTsKKyAgICAgICAgX19rbXBfd2FpdF95aWVsZDwga21wX3VpbnQzMiA+KCAmIHNoLT5idWZmZXJfaW5kZXgsIG15X2J1ZmZlcl9pbmRleCwgX19rbXBfZXE8IGttcF91aW50MzIgPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKCBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgLy8gTm90ZTogS01QX1dBSVRfWUlFTEQoKSBjYW5ub3QgYmUgdXNlZCB0aGVyZTogYnVmZmVyIGluZGV4IGFuZCBteV9idWZmZXJfaW5kZXggYXJlCisgICAgICAgICAgICAvLyAqYWx3YXlzKiAzMi1iaXQgaW50ZWdlcnMuCisgICAgICAgIEtNUF9NQigpOyAgLyogaXMgdGhpcyBuZWNlc3Nhcnk/ICovCisgICAgICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyVkIGFmdGVyIHdhaXQ6IG15X2J1ZmZlcl9pbmRleDolZCBzaC0+YnVmZmVyX2luZGV4OiVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgbXlfYnVmZmVyX2luZGV4LCBzaC0+YnVmZmVyX2luZGV4KSApOworCisgICAgICAgIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rpc3BhdGNoX3ByX2N1cnJlbnQgPSAoZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3QqKSBwcjsKKyAgICAgICAgdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZGlzcGF0Y2hfc2hfY3VycmVudCA9IChkaXNwYXRjaF9zaGFyZWRfaW5mb190KikgIHNoOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgaWYgKCBwci0+b3JkZXJlZCApIHsKKyAgICAgICAgICAgIF9fa21wX2l0dF9vcmRlcmVkX2luaXQoIGd0aWQgKTsKKyAgICAgICAgfTsgLy8gaWYKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgfTsgLy8gaWYKKyAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgeworICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX2luaXQ6IFQjJSVkIHJldHVybmluZzogc2NoZWR1bGU6JSVkIG9yZGVyZWQ6JSUlcyBsYjolJSVzIHViOiUlJXMiIFwKKyAgICAgICAgICAgICIgc3Q6JSUlcyB0YzolJSVzIGNvdW50OiUlJXNcblx0b3JkZXJlZF9sb3dlcjolJSVzIG9yZGVyZWRfdXBwZXI6JSUlcyIgXAorICAgICAgICAgICAgIiBwYXJtMTolJSVzIHBhcm0yOiUlJXMgcGFybTM6JSUlcyBwYXJtNDolJSVzXG4iLAorICAgICAgICAgICAgdHJhaXRzX3Q8IFVUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsCisgICAgICAgICAgICB0cmFpdHNfdDwgU1QgPjo6c3BlYywgdHJhaXRzX3Q8IFVUID46OnNwZWMsIHRyYWl0c190PCBVVCA+OjpzcGVjLAorICAgICAgICAgICAgdHJhaXRzX3Q8IFVUID46OnNwZWMsIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjLAorICAgICAgICAgICAgdHJhaXRzX3Q8IFQgPjo6c3BlYywgdHJhaXRzX3Q8IFQgPjo6c3BlYywgdHJhaXRzX3Q8IFQgPjo6c3BlYyApOworICAgICAgICBLRF9UUkFDRSgxMCwgKCBidWZmLAorICAgICAgICAgICAgZ3RpZCwgcHItPnNjaGVkdWxlLCBwci0+b3JkZXJlZCwgcHItPnUucC5sYiwgcHItPnUucC51YiwKKyAgICAgICAgICAgIHByLT51LnAuc3QsIHByLT51LnAudGMsIHByLT51LnAuY291bnQsCisgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfbG93ZXIsIHByLT51LnAub3JkZXJlZF91cHBlciwgcHItPnUucC5wYXJtMSwKKyAgICAgICAgICAgIHByLT51LnAucGFybTIsIHByLT51LnAucGFybTMsIHByLT51LnAucGFybTQgKSApOworICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICB9CisgICAgI2VuZGlmCisgICAgI2lmICggS01QX1NUQVRJQ19TVEVBTF9FTkFCTEVEICkKKyAgICBpZiAoIF9fX2ttcF9zaXplX3R5cGUgPCA4ICkgeworICAgICAgLy8gSXQgY2Fubm90IGJlIGd1YXJhbnRlZWQgdGhhdCBhZnRlciBleGVjdXRpb24gb2YgYSBsb29wIHdpdGggc29tZSBvdGhlciBzY2hlZHVsZSBraW5kCisgICAgICAvLyBhbGwgdGhlIHBhcm0zIHZhcmlhYmxlcyB3aWxsIGNvbnRhaW4gdGhlIHNhbWUgdmFsdWUuCisgICAgICAvLyBFdmVuIGlmIGFsbCBwYXJtMyB3aWxsIGJlIHRoZSBzYW1lLCBpdCBzdGlsbCBleGlzdHMgYSBiYWQgY2FzZSBsaWtlIHVzaW5nIDAgYW5kIDEKKyAgICAgIC8vIHJhdGhlciB0aGFuIHByb2dyYW0gbGlmZS10aW1lIGluY3JlbWVudC4KKyAgICAgIC8vIFNvIHRoZSBkZWRpY2F0ZWQgdmFyaWFibGUgaXMgcmVxdWlyZWQuIFRoZSAnc3RhdGljX3N0ZWFsX2NvdW50ZXInIGlzIHVzZWQuCisgICAgICBpZiggc2NoZWR1bGUgPT0ga21wX3NjaF9zdGF0aWNfc3RlYWwgKSB7CisgICAgICAgIC8vIE90aGVyIHRocmVhZHMgd2lsbCBpbnNwZWN0IHRoaXMgdmFyaWFibGUgd2hlbiBzZWFyY2hpbmcgZm9yIGEgdmljdGltLgorICAgICAgICAvLyBUaGlzIGlzIGEgZmxhZyBzaG93aW5nIHRoYXQgb3RoZXIgdGhyZWFkcyBtYXkgc3RlYWwgZnJvbSB0aGlzIHRocmVhZCBzaW5jZSB0aGVuLgorICAgICAgICB2b2xhdGlsZSBUICogcCA9ICZwci0+dS5wLnN0YXRpY19zdGVhbF9jb3VudGVyOworICAgICAgICAqcCA9ICpwICsgMTsKKyAgICAgIH0KKyAgICB9CisgICAgI2VuZGlmIC8vICggS01QX1NUQVRJQ19TVEVBTF9FTkFCTEVEICYmIFVTRV9TVEVBTElORyApCit9CisKKy8qCisgKiBGb3Igb3JkZXJlZCBsb29wcywgZWl0aGVyIF9fa21wX2Rpc3BhdGNoX2ZpbmlzaCgpIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIKKyAqIGV2ZXJ5IGl0ZXJhdGlvbiwgb3IgX19rbXBfZGlzcGF0Y2hfZmluaXNoX2NodW5rKCkgc2hvdWxkIGJlIGNhbGxlZCBhZnRlcgorICogZXZlcnkgY2h1bmsgb2YgaXRlcmF0aW9ucy4gIElmIHRoZSBvcmRlcmVkIHNlY3Rpb24ocykgd2VyZSBub3QgZXhlY3V0ZWQKKyAqIGZvciB0aGlzIGl0ZXJhdGlvbiAob3IgZXZlcnkgaXRlcmF0aW9uIGluIHRoaXMgY2h1bmspLCB3ZSBuZWVkIHRvIHNldCB0aGUKKyAqIG9yZGVyZWQgaXRlcmF0aW9uIGNvdW50ZXJzIHNvIHRoYXQgdGhlIG5leHQgdGhyZWFkIGNhbiBwcm9jZWVkLgorICovCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVVQgPgorc3RhdGljIHZvaWQKK19fa21wX2Rpc3BhdGNoX2ZpbmlzaCggaW50IGd0aWQsIGlkZW50X3QgKmxvYyApCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVVQgPjo6c2lnbmVkX3QgU1Q7CisgICAga21wX2luZm9fdCAqdGggPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisKKyAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfZmluaXNoOiBUIyVkIGNhbGxlZFxuIiwgZ3RpZCApICk7CisgICAgaWYgKCAhIHRoIC0+IHRoLnRoX3RlYW0gLT4gdC50X3NlcmlhbGl6ZWQgKSB7CisKKyAgICAgICAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPCBVVCA+ICogcHIgPQorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDwgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPCBVVCA+KiA+CisgICAgICAgICAgICAoIHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZGlzcGF0Y2hfcHJfY3VycmVudCApOworICAgICAgICBkaXNwYXRjaF9zaGFyZWRfaW5mb190ZW1wbGF0ZTwgVVQgPiB2b2xhdGlsZSAqIHNoID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8IGRpc3BhdGNoX3NoYXJlZF9pbmZvX3RlbXBsYXRlPCBVVCA+dm9sYXRpbGUqID4KKyAgICAgICAgICAgICggdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kaXNwYXRjaF9zaF9jdXJyZW50ICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHByICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHNoICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoLT50aC50aF9kaXNwYXRjaCA9PQorICAgICAgICAgICAgICAgICAmdGgtPnRoLnRoX3RlYW0tPnQudF9kaXNwYXRjaFt0aC0+dGgudGhfaW5mby5kcy5kc190aWRdICk7CisKKyAgICAgICAgaWYgKCBwci0+b3JkZXJlZF9idW1wZWQgKSB7CisgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIl9fa21wX2Rpc3BhdGNoX2ZpbmlzaDogVCMlZCByZXNldHRpbmcgb3JkZXJlZF9idW1wZWQgdG8gemVyb1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkICkgKTsKKyAgICAgICAgICAgIHByLT5vcmRlcmVkX2J1bXBlZCA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBVVCBsb3dlciA9IHByLT51LnAub3JkZXJlZF9sb3dlcjsKKworICAgICAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfZmluaXNoOiBUIyUlZCBiZWZvcmUgd2FpdDogb3JkZXJlZF9pdGVyYXRpb246JSUlcyBsb3dlcjolJSVzXG4iLAorICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFVUID46OnNwZWMgKTsKKyAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIGJ1ZmYsIGd0aWQsIHNoLT51LnMub3JkZXJlZF9pdGVyYXRpb24sIGxvd2VyICkgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICNlbmRpZgorCisgICAgICAgICAgICBfX2ttcF93YWl0X3lpZWxkPCBVVCA+KCZzaC0+dS5zLm9yZGVyZWRfaXRlcmF0aW9uLCBsb3dlciwgX19rbXBfZ2U8IFVUID4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIEtNUF9NQigpOyAgLyogaXMgdGhpcyBuZWNlc3Nhcnk/ICovCisgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9maW5pc2g6IFQjJSVkIGFmdGVyIHdhaXQ6IG9yZGVyZWRfaXRlcmF0aW9uOiUlJXMgbG93ZXI6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3Q8IFVUID46OnNwZWMsIHRyYWl0c190PCBVVCA+OjpzcGVjICk7CisgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwMCwgKCBidWZmLCBndGlkLCBzaC0+dS5zLm9yZGVyZWRfaXRlcmF0aW9uLCBsb3dlciApICk7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAjZW5kaWYKKworICAgICAgICAgICAgdGVzdF90aGVuX2luYzwgU1QgPiggKHZvbGF0aWxlIFNUICopICYgc2gtPnUucy5vcmRlcmVkX2l0ZXJhdGlvbiApOworICAgICAgICB9IC8vIGlmCisgICAgfSAvLyBpZgorICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9maW5pc2g6IFQjJWQgcmV0dXJuZWRcbiIsIGd0aWQgKSApOworfQorCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisKK3RlbXBsYXRlPCB0eXBlbmFtZSBVVCA+CitzdGF0aWMgdm9pZAorX19rbXBfZGlzcGF0Y2hfZmluaXNoX2NodW5rKCBpbnQgZ3RpZCwgaWRlbnRfdCAqbG9jICkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBVVCA+OjpzaWduZWRfdCBTVDsKKyAgICBrbXBfaW5mb190ICp0aCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKworICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9maW5pc2hfY2h1bms6IFQjJWQgY2FsbGVkXG4iLCBndGlkICkgKTsKKyAgICBpZiAoICEgdGggLT4gdGgudGhfdGVhbSAtPiB0LnRfc2VyaWFsaXplZCApIHsKKy8vICAgICAgICBpbnQgY2lkOworICAgICAgICBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFVUID4gKiBwciA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PCBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFVUID4qID4KKyAgICAgICAgICAgICggdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kaXNwYXRjaF9wcl9jdXJyZW50ICk7CisgICAgICAgIGRpc3BhdGNoX3NoYXJlZF9pbmZvX3RlbXBsYXRlPCBVVCA+IHZvbGF0aWxlICogc2ggPQorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDwgZGlzcGF0Y2hfc2hhcmVkX2luZm9fdGVtcGxhdGU8IFVUID52b2xhdGlsZSogPgorICAgICAgICAgICAgKCB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rpc3BhdGNoX3NoX2N1cnJlbnQgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggcHIgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggc2ggKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGgtPnRoLnRoX2Rpc3BhdGNoID09CisgICAgICAgICAgICAgICAgICZ0aC0+dGgudGhfdGVhbS0+dC50X2Rpc3BhdGNoW3RoLT50aC50aF9pbmZvLmRzLmRzX3RpZF0gKTsKKworLy8gICAgICAgIGZvciAoY2lkID0gMDsgY2lkIDwgS01QX01BWF9PUkRFUkVEOyArK2NpZCkgeworICAgICAgICAgICAgVVQgbG93ZXIgPSBwci0+dS5wLm9yZGVyZWRfbG93ZXI7CisgICAgICAgICAgICBVVCB1cHBlciA9IHByLT51LnAub3JkZXJlZF91cHBlcjsKKyAgICAgICAgICAgIFVUIGluYyA9IHVwcGVyIC0gbG93ZXIgKyAxOworCisgICAgICAgICAgICBpZiAoIHByLT5vcmRlcmVkX2J1bXBlZCA9PSBpbmMgKSB7CisgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwMCwgKCJfX2ttcF9kaXNwYXRjaF9maW5pc2g6IFQjJWQgcmVzZXR0aW5nIG9yZGVyZWRfYnVtcGVkIHRvIHplcm9cbiIsCisgICAgICAgICAgICAgICAgICBndGlkICkgKTsKKyAgICAgICAgICAgICAgICBwci0+b3JkZXJlZF9idW1wZWQgPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbmMgLT0gcHItPm9yZGVyZWRfYnVtcGVkOworCisgICAgICAgICAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9maW5pc2hfY2h1bms6IFQjJSVkIGJlZm9yZSB3YWl0OiAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmRlcmVkX2l0ZXJhdGlvbjolJSVzIGxvd2VyOiUlJXMgdXBwZXI6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFVUID46OnNwZWMgKTsKKyAgICAgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwMCwgKCBidWZmLCBndGlkLCBzaC0+dS5zLm9yZGVyZWRfaXRlcmF0aW9uLCBsb3dlciwgdXBwZXIgKSApOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgICAgICBfX2ttcF93YWl0X3lpZWxkPCBVVCA+KCZzaC0+dS5zLm9yZGVyZWRfaXRlcmF0aW9uLCBsb3dlciwgX19rbXBfZ2U8IFVUID4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICAgICAgS01QX01CKCk7ICAvKiBpcyB0aGlzIG5lY2Vzc2FyeT8gKi8KKyAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIl9fa21wX2Rpc3BhdGNoX2ZpbmlzaF9jaHVuazogVCMlZCByZXNldHRpbmcgb3JkZXJlZF9idW1wZWQgdG8gemVyb1xuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQgKSApOworICAgICAgICAgICAgICAgIHByLT5vcmRlcmVkX2J1bXBlZCA9IDA7CisvLyEhISEhIFRPRE8gY2hlY2sgaWYgdGhlIGluYyBzaG91bGQgYmUgdW5zaWduZWQsIG9yIHNpZ25lZD8/PworICAgICAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfZmluaXNoX2NodW5rOiBUIyUlZCBhZnRlciB3YWl0OiAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmRlcmVkX2l0ZXJhdGlvbjolJSVzIGluYzolJSVzIGxvd2VyOiUlJXMgdXBwZXI6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFVUID46OnNwZWMsIHRyYWl0c190PCBVVCA+OjpzcGVjICk7CisgICAgICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMDAsICggYnVmZiwgZ3RpZCwgc2gtPnUucy5vcmRlcmVkX2l0ZXJhdGlvbiwgaW5jLCBsb3dlciwgdXBwZXIgKSApOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgICAgICB0ZXN0X3RoZW5fYWRkPCBTVCA+KCAodm9sYXRpbGUgU1QgKikgJiBzaC0+dS5zLm9yZGVyZWRfaXRlcmF0aW9uLCBpbmMpOworICAgICAgICAgICAgfQorLy8gICAgICAgIH0KKyAgICB9CisgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX2ZpbmlzaF9jaHVuazogVCMlZCByZXR1cm5lZFxuIiwgZ3RpZCApICk7Cit9CisKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKwordGVtcGxhdGU8IHR5cGVuYW1lIFQgPgorc3RhdGljIGludAorX19rbXBfZGlzcGF0Y2hfbmV4dCgKKyAgICBpZGVudF90ICpsb2MsIGludCBndGlkLCBrbXBfaW50MzIgKnBfbGFzdCwgVCAqcF9sYiwgVCAqcF91YiwgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6c2lnbmVkX3QgKnBfc3QKKykgeworCisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+Ojp1bnNpZ25lZF90ICBVVDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnNpZ25lZF90ICAgIFNUOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6ZmxvYXRpbmdfdCAgREJMOworICAgIHN0YXRpYyBjb25zdCBpbnQgX19fa21wX3NpemVfdHlwZSA9IHNpemVvZiggVVQgKTsKKworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworICAgIGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTwgVCA+ICogcHI7CisgICAga21wX2luZm9fdCAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aCAgID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIGttcF90ZWFtX3QgICAgICAgICAgICAgICAgICAgICAgICAgICogdGVhbSA9IHRoIC0+IHRoLnRoX3RlYW07CisKKyAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgeworICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJSVkIGNhbGxlZCBwX2xiOiUlJXMgcF91YjolJSVzIHBfc3Q6JSUlcyBwX2xhc3Q6ICUlcFxuIiwKKyAgICAgICAgICAgIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBTVCA+OjpzcGVjICk7CisgICAgICAgIEtEX1RSQUNFKDEwMDAsICggYnVmZiwgZ3RpZCwgKnBfbGIsICpwX3ViLCBwX3N0ID8gKnBfc3QgOiAwLCBwX2xhc3QgKSApOworICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICB9CisgICAgI2VuZGlmCisKKyAgICBpZiAoIHRlYW0gLT4gdC50X3NlcmlhbGl6ZWQgKSB7CisgICAgICAgIC8qIE5PVEU6IHNlcmlhbGl6ZSB0aGlzIGRpc3BhdGNoIGJlY2FzZSB3ZSBhcmUgbm90IGF0IHRoZSBhY3RpdmUgbGV2ZWwgKi8KKyAgICAgICAgcHIgPSByZWludGVycHJldF9jYXN0PCBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFQgPiogPgorICAgICAgICAgICAgKCB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9kaXNwX2J1ZmZlciApOyAvKiB0b3Agb2YgdGhlIHN0YWNrICovCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHByICk7CisKKyAgICAgICAgaWYgKCAoc3RhdHVzID0gKHByLT51LnAudGMgIT0gMCkpID09IDAgKSB7CisgICAgICAgICAgICAqcF9sYiA9IDA7CisgICAgICAgICAgICAqcF91YiA9IDA7CisgICAgICAgICAgICBpZiAoIHBfc3QgIT0gMCApIHsKKyAgICAgICAgICAgICAgICAqcF9zdCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHByLT5wdXNoZWRfd3MgIT0gY3Rfbm9uZSApIHsKKyAgICAgICAgICAgICAgICAgICAgcHItPnB1c2hlZF93cyA9IF9fa21wX3BvcF93b3Jrc2hhcmUoIGd0aWQsIHByLT5wdXNoZWRfd3MsIGxvYyApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICggcHItPm5vbWVyZ2UgKSB7CisgICAgICAgICAgICBrbXBfaW50MzIgbGFzdDsKKyAgICAgICAgICAgIFQgICAgICAgICBzdGFydDsKKyAgICAgICAgICAgIFVUICAgICAgICBsaW1pdCwgdHJpcCwgaW5pdDsKKyAgICAgICAgICAgIFNUICAgICAgICBpbmNyOworICAgICAgICAgICAgVCAgICAgICAgIGNodW5rID0gcHItPnUucC5wYXJtMTsKKworICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJWQga21wX3NjaF9keW5hbWljX2NodW5rZWQgY2FzZVxuIiwgZ3RpZCApICk7CisKKyAgICAgICAgICAgIGluaXQgPSBjaHVuayAqIHByLT51LnAuY291bnQrKzsKKyAgICAgICAgICAgIHRyaXAgPSBwci0+dS5wLnRjIC0gMTsKKworICAgICAgICAgICAgaWYgKCAoc3RhdHVzID0gKGluaXQgPD0gdHJpcCkpID09IDAgKSB7CisgICAgICAgICAgICAgICAgKnBfbGIgPSAwOworICAgICAgICAgICAgICAgICpwX3ViID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoIHBfc3QgIT0gMCApICpwX3N0ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBwci0+cHVzaGVkX3dzICE9IGN0X25vbmUgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwci0+cHVzaGVkX3dzID0gX19rbXBfcG9wX3dvcmtzaGFyZSggZ3RpZCwgcHItPnB1c2hlZF93cywgbG9jICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0YXJ0ID0gcHItPnUucC5sYjsKKyAgICAgICAgICAgICAgICBsaW1pdCA9IGNodW5rICsgaW5pdCAtIDE7CisgICAgICAgICAgICAgICAgaW5jciAgPSBwci0+dS5wLnN0OworCisgICAgICAgICAgICAgICAgaWYgKCAobGFzdCA9IChsaW1pdCA+PSB0cmlwKSkgIT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgbGltaXQgPSB0cmlwOworICAgICAgICAgICAgICAgICAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgICAgICAgICAgICAgcHItPnUucC5sYXN0X3VwcGVyID0gcHItPnUucC51YjsKKyAgICAgICAgICAgICAgICAgICAgI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICggcF9sYXN0ICkgeworICAgICAgICAgICAgICAgICAgICAqcF9sYXN0ID0gbGFzdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCBwX3N0ICE9IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICpwX3N0ID0gaW5jcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCBpbmNyID09IDEgKSB7CisgICAgICAgICAgICAgICAgICAgICpwX2xiID0gc3RhcnQgKyBpbml0OworICAgICAgICAgICAgICAgICAgICAqcF91YiA9IHN0YXJ0ICsgbGltaXQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSBzdGFydCArIGluaXQgKiBpbmNyOworICAgICAgICAgICAgICAgICAgICAqcF91YiA9IHN0YXJ0ICsgbGltaXQgKiBpbmNyOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICggcHItPm9yZGVyZWQgKSB7CisgICAgICAgICAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF9sb3dlciA9IGluaXQ7CisgICAgICAgICAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF91cHBlciA9IGxpbWl0OworICAgICAgICAgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlJWQgb3JkZXJlZF9sb3dlcjolJSVzIG9yZGVyZWRfdXBwZXI6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFVUID46OnNwZWMgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMDAsICggYnVmZiwgZ3RpZCwgcHItPnUucC5vcmRlcmVkX2xvd2VyLCBwci0+dS5wLm9yZGVyZWRfdXBwZXIgKSApOworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHItPnUucC50YyA9IDA7CisKKyAgICAgICAgICAgICpwX2xiID0gcHItPnUucC5sYjsKKyAgICAgICAgICAgICpwX3ViID0gcHItPnUucC51YjsKKyAgICAgICAgICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICAgICAgcHItPnUucC5sYXN0X3VwcGVyID0gKnBfdWI7CisgICAgICAgICAgICAjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KKworICAgICAgICAgICAgaWYgKCBwX3N0ICE9IDAgKSB7CisgICAgICAgICAgICAgICAgKnBfc3QgPSBwci0+dS5wLnN0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBwX2xhc3QgKSB7CisgICAgICAgICAgICAgICAgKnBfbGFzdCA9IFRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gLy8gaWYKKyAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJSVkIHNlcmlhbGl6ZWQgY2FzZTogcF9sYjolJSVzICIgXAorICAgICAgICAgICAgICAgICJwX3ViOiUlJXMgcF9zdDolJSVzIHBfbGFzdDolJXAgIHJldHVybmluZzolJWRcbiIsCisgICAgICAgICAgICAgICAgdHJhaXRzX3Q8IFQgPjo6c3BlYywgdHJhaXRzX3Q8IFQgPjo6c3BlYywgdHJhaXRzX3Q8IFNUID46OnNwZWMgKTsKKyAgICAgICAgICAgIEtEX1RSQUNFKDEwLCAoIGJ1ZmYsIGd0aWQsICpwX2xiLCAqcF91YiwgKnBfc3QsIHBfbGFzdCwgc3RhdHVzKSApOworICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgIH0KKyAgICAgICAgI2VuZGlmCisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAga21wX2ludDMyIGxhc3QgPSAwOworICAgICAgICBkaXNwYXRjaF9zaGFyZWRfaW5mb190ZW1wbGF0ZTwgVVQgPiAqc2g7CisgICAgICAgIFQgICAgICAgICBzdGFydDsKKyAgICAgICAgU1QgICAgICAgIGluY3I7CisgICAgICAgIFVUICAgICAgICBsaW1pdCwgdHJpcCwgaW5pdDsKKworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aC0+dGgudGhfZGlzcGF0Y2ggPT0KKyAgICAgICAgICAgICAgICAmdGgtPnRoLnRoX3RlYW0tPnQudF9kaXNwYXRjaFt0aC0+dGgudGhfaW5mby5kcy5kc190aWRdICk7CisKKyAgICAgICAgcHIgPSByZWludGVycHJldF9jYXN0PCBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFQgPiogPgorICAgICAgICAgICAgKCB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rpc3BhdGNoX3ByX2N1cnJlbnQgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggcHIgKTsKKyAgICAgICAgc2ggPSByZWludGVycHJldF9jYXN0PCBkaXNwYXRjaF9zaGFyZWRfaW5mb190ZW1wbGF0ZTwgVVQgPiogPgorICAgICAgICAgICAgKCB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rpc3BhdGNoX3NoX2N1cnJlbnQgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggc2ggKTsKKworICAgICAgICBpZiAoIHByLT51LnAudGMgPT0gMCApIHsKKyAgICAgICAgICAgIC8vIHplcm8gdHJpcCBjb3VudAorICAgICAgICAgICAgc3RhdHVzID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN3aXRjaCAocHItPnNjaGVkdWxlKSB7CisgICAgICAgICAgICAjaWYgKCBLTVBfU1RBVElDX1NURUFMX0VOQUJMRUQgJiYgS01QX0FSQ0hfWDg2XzY0ICkKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfc3RlYWw6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUIGNodW5rID0gcHItPnUucC5wYXJtMTsKKworICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlZCBrbXBfc2NoX3N0YXRpY19zdGVhbCBjYXNlXG4iLCBndGlkKSApOworCisgICAgICAgICAgICAgICAgICAgIHRyaXAgPSBwci0+dS5wLnRjIC0gMTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIF9fX2ttcF9zaXplX3R5cGUgPiA0ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXIgdGhyZWFkcyBkbyBub3QgbG9vayBpbnRvIHRoZSBkYXRhIG9mIHRoaXMgdGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHNvIGl0J3Mgbm90IG5lY2Vzc2FyeSB0byBtYWtlIHZvbGF0aWxlIGNhc3RpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICBpbml0ICAgPSAoIHByLT51LnAuY291bnQgKSsrOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gKCBpbml0IDwgKFVUKXByLT51LnAudWIgKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgdW5pb24geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVUIGNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUICB1YjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0IGI7CisgICAgICAgICAgICAgICAgICAgICAgICB9IHVuaW9uX2k0OworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxsIG9wZXJhdGlvbnMgb24gJ2NvdW50JyBvciAndWInIG11c3QgYmUgY29tYmluZWQgYXRvbWljYWxseSB0b2dldGhlci4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZWFsaW5nIGltcGxlbWVudGVkIG9ubHkgZm9yIDQtYnl0ZSBpbmRleGVzCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb25faTQgdm9sZCwgdm5ldzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2xkLmIgPSAqKCB2b2xhdGlsZSBrbXBfaW50NjQgKiApKCZwci0+dS5wLmNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bmV3ID0gdm9sZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bmV3LnAuY291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRNjQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCB2b2xhdGlsZSBrbXBfaW50NjQqICkmcHItPnUucC5jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50NjQgKikmdm9sZC5iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQ2NCAqKSZ2bmV3LmIgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2xkLmIgPSAqKCB2b2xhdGlsZSBrbXBfaW50NjQgKiApKCZwci0+dS5wLmNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm5ldyA9IHZvbGQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZuZXcucC5jb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bmV3ID0gdm9sZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0ICAgPSB2bmV3LnAuY291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gKCBpbml0IDwgKFVUKXZuZXcucC51YiApIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICFzdGF0dXMgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2luZm9fdCAgICoqb3RoZXJfdGhyZWFkcyA9IHRlYW0tPnQudF90aHJlYWRzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICB3aGlsZV9saW1pdCA9IDEwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICB3aGlsZV9pbmRleCA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBhbGdvcml0aG0gb2Ygc2VhcmNoaW5nIGZvciBhIHZpY3RpbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCBiZSBjbGVhbmVkIHVwIGFuZCBtZWFzdXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICggKCAhc3RhdHVzICkgJiYgKCB3aGlsZV9saW1pdCAhPSArK3doaWxlX2luZGV4ICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uX2k0ICB2b2xkLCB2bmV3OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgcmVtYWluaW5nOyAvLyBrbXBfaW50MzIgYmVjYXVzZSBLTVBfSTQgb25seQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUICAgICAgICAgdmljdGltSWR4ICAgID0gcHItPnUucC5wYXJtNDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCAgICAgICAgIG9sZFZpY3RpbUlkeCA9IHZpY3RpbUlkeDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPCBUID4gKiB2aWN0aW07CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoICF2aWN0aW1JZHggKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmljdGltSWR4ID0gdGVhbS0+dC50X25wcm9jIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS12aWN0aW1JZHg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWN0aW0gPSByZWludGVycHJldF9jYXN0PCBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFQgPiogPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggb3RoZXJfdGhyZWFkc1t2aWN0aW1JZHhdLT50aC50aF9kaXNwYXRjaC0+dGhfZGlzcGF0Y2hfcHJfY3VycmVudCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICggKHZpY3RpbSA9PSBOVUxMIHx8IHZpY3RpbSA9PSBwcikgJiYgb2xkVmljdGltSWR4ICE9IHZpY3RpbUlkeCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiB0aGluayBhYm91dCBhIHByb3BlciBwbGFjZSBvZiB0aGlzIHRlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoICF2aWN0aW0gKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICgqKCB2b2xhdGlsZSBUICogKSZ2aWN0aW0tPnUucC5zdGF0aWNfc3RlYWxfY291bnRlcikgIT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiggdm9sYXRpbGUgVCAqICkmcHItPnUucC5zdGF0aWNfc3RlYWxfY291bnRlcikgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGRlbGF5IHdvdWxkIGJlIG5pY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHZpY3RpbSBpcyBub3QgcmVhZHkgeWV0IHRvIHBhcnRpY2lwYXRlIGluIHN0ZWFsaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIHRoZSB2aWN0aW0gaXMgc3RpbGwgaW4ga21wX2luaXRfZGlzcGF0Y2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIG9sZFZpY3RpbUlkeCA9PSB2aWN0aW1JZHggKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLnBhcm00ID0gdmljdGltSWR4OworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKCAxICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sZC5iID0gKiggdm9sYXRpbGUga21wX2ludDY0ICogKSggJnZpY3RpbS0+dS5wLmNvdW50ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bmV3ID0gdm9sZDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKHZuZXcucC51YiAtIDEpICogKFVUKWNodW5rIDw9IHRyaXAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggdm5ldy5wLmNvdW50ID49IChVVCl2bmV3LnAudWIgfHwgKHJlbWFpbmluZyA9IHZuZXcucC51YiAtIHZuZXcucC5jb3VudCkgPCA0ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm5ldy5wLnViIC09IChyZW1haW5pbmcgPj4gMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCh2bmV3LnAudWIgLSAxKSAqIChVVCljaHVuayA8PSB0cmlwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNwcmFnbWEgd2FybmluZyggcHVzaCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXNhYmxlIHdhcm5pbmcgb24gcG9pbnRsZXNzIGNvbXBhcmlzb24gb2YgdW5zaWduZWQgd2l0aCAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjcHJhZ21hIHdhcm5pbmcoIGRpc2FibGU6IDE4NiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh2bmV3LnAudWIgPj0gMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjcHJhZ21hIHdhcm5pbmcoIHBvcCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBTaG91bGQgdGhpcyBiZSBhY3F1aXJlIG9yIHJlbGVhc2U/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1E2NCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCB2b2xhdGlsZSBrbXBfaW50NjQgKiApJnZpY3RpbS0+dS5wLmNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50NjQgKikmdm9sZC5iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50NjQgKikmdm5ldy5iICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZV9pbmRleCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm93IHVwZGF0ZSBvd24gY291bnQgYW5kIHViCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2lmIEtNUF9BUkNIX1g4NgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZWFsaW5nIGV4ZWN1dGVkIG9uIG5vbi1LTVBfQVJDSF9YODYgb25seQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdG9taWMgNjQtYml0IHdyaXRlIG9uIGlhMzIgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5hdmFpbGFibGUsIHNvIHdlIGRvIHRoaXMgaW4gc3RlcHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBUaGlzIGNvZGUgaXMgbm90IHRlc3RlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCA9IHZvbGQucC5jb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHItPnUucC51YiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAuY291bnQgPSBpbml0ICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHItPnUucC51YiA9IHZuZXcucC5jb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0ID0gdm5ldy5wLnViOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2xkLnAuY291bnQgPSBpbml0ICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogaXMgaXQgc2FmZSBhbmQgZW5vdWdoPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKCB2b2xhdGlsZSBrbXBfaW50NjQgKiApKCZwci0+dS5wLmNvdW50KSA9IHZvbGQuYjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZW5kaWYgLy8gS01QX0FSQ0hfWDg2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyB3aGlsZSAoMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIHdoaWxlCisgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAhc3RhdHVzICkgeworICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwX3N0ICE9IDAgKSAqcF9zdCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHByLT51LnAucGFybTI7CisgICAgICAgICAgICAgICAgICAgICAgICBpbml0ICo9IGNodW5rOworICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgPSBjaHVuayArIGluaXQgLSAxOworICAgICAgICAgICAgICAgICAgICAgICAgaW5jciAgPSBwci0+dS5wLnN0OworCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGluaXQgPD0gdHJpcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChsYXN0ID0gKGxpbWl0ID49IHRyaXApKSAhPSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IHRyaXA7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBfbGFzdCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYXN0ID0gbGFzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcF9zdCAhPSAwICkgKnBfc3QgPSBpbmNyOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGluY3IgPT0gMSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYiA9IHN0YXJ0ICsgaW5pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF91YiA9IHN0YXJ0ICsgbGltaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX2xiID0gc3RhcnQgKyBpbml0ICogaW5jcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF91YiA9IHN0YXJ0ICsgbGltaXQgKiBpbmNyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHByLT5vcmRlcmVkICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF9sb3dlciA9IGluaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX3VwcGVyID0gbGltaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyUlZCBvcmRlcmVkX2xvd2VyOiUlJXMgb3JkZXJlZF91cHBlcjolJSVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3Q8IFVUID46OnNwZWMsIHRyYWl0c190PCBVVCA+OjpzcGVjICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMDAsICggYnVmZiwgZ3RpZCwgcHItPnUucC5vcmRlcmVkX2xvd2VyLCBwci0+dS5wLm9yZGVyZWRfdXBwZXIgKSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfSAvLyBjYXNlCisgICAgICAgICAgICAjZW5kaWYgLy8gKCBLTVBfU1RBVElDX1NURUFMX0VOQUJMRUQgJiYgS01QX0FSQ0hfWDg2XzY0ICkKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlZCBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZCBjYXNlXG4iLCBndGlkKSApOworICAgICAgICAgICAgICAgICAgICBpZiAoIChzdGF0dXMgPSAhcHItPnUucC5jb3VudCkgIT0gMCApIHsgIC8qIGNoZWNrIGlmIHRocmVhZCBoYXMgYW55IGl0ZXJhdGlvbiB0byBkbyAqLworICAgICAgICAgICAgICAgICAgICAgICAgcHItPnUucC5jb3VudCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYiA9IHByLT51LnAubGI7CisgICAgICAgICAgICAgICAgICAgICAgICAqcF91YiA9IHByLT51LnAudWI7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0ID0gcHItPnUucC5wYXJtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcF9sYXN0ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX2xhc3QgPSBsYXN0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwX3N0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9zdCA9IHByLT51LnAuc3Q7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAvKiBubyBpdGVyYXRpb25zIHRvIGRvICovCisgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLmxiID0gcHItPnUucC51YiArIHByLT51LnAuc3Q7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCBwci0+b3JkZXJlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJSVkIG9yZGVyZWRfbG93ZXI6JSUlcyBvcmRlcmVkX3VwcGVyOiUlJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMDAsICggYnVmZiwgZ3RpZCwgcHItPnUucC5vcmRlcmVkX2xvd2VyLCBwci0+dS5wLm9yZGVyZWRfdXBwZXIgKSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgICAgICB9IC8vIGNhc2UKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfZ3JlZWR5OiAgLyogb3JpZ2luYWwgY29kZSBmb3Iga21wX3NjaF9zdGF0aWNfZ3JlZWR5IHdhcyBtZXJnZWQgaGVyZSAqLworICAgICAgICAgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19jaHVua2VkOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVCBwYXJtMTsKKworICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlZCBrbXBfc2NoX3N0YXRpY19bYWZmaW5pdHl8Y2h1bmtlZF0gY2FzZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCApICk7CisgICAgICAgICAgICAgICAgICAgIHBhcm0xID0gcHItPnUucC5wYXJtMTsKKworICAgICAgICAgICAgICAgICAgICB0cmlwICA9IHByLT51LnAudGMgLSAxOworICAgICAgICAgICAgICAgICAgICBpbml0ICA9IHBhcm0xICogKHByLT51LnAuY291bnQgKyBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChzdGF0dXMgPSAoaW5pdCA8PSB0cmlwKSkgIT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gcHItPnUucC5sYjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluY3IgID0gcHItPnUucC5zdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gcGFybTEgKyBpbml0IC0gMTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAobGFzdCA9IChsaW1pdCA+PSB0cmlwKSkgIT0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgPSB0cmlwOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBfbGFzdCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYXN0ID0gbGFzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcF9zdCAhPSAwICkgKnBfc3QgPSBpbmNyOworCisgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLmNvdW50ICs9IHRlYW0tPnQudF9ucHJvYzsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbmNyID09IDEgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSBzdGFydCArIGluaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSBzdGFydCArIGxpbWl0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSBzdGFydCArIGluaXQgKiBpbmNyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX3ViID0gc3RhcnQgKyBsaW1pdCAqIGluY3I7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcHItPm9yZGVyZWQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX2xvd2VyID0gaW5pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfdXBwZXIgPSBsaW1pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJSVkIG9yZGVyZWRfbG93ZXI6JSUlcyBvcmRlcmVkX3VwcGVyOiUlJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFVUID46OnNwZWMgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwMCwgKCBidWZmLCBndGlkLCBwci0+dS5wLm9yZGVyZWRfbG93ZXIsIHByLT51LnAub3JkZXJlZF91cHBlciApICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgIH0gLy8gY2FzZQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGttcF9zY2hfZHluYW1pY19jaHVua2VkOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVCBjaHVuayA9IHByLT51LnAucGFybTE7CisKKyAgICAgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJWQga21wX3NjaF9keW5hbWljX2NodW5rZWQgY2FzZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCApICk7CisKKyAgICAgICAgICAgICAgICAgICAgaW5pdCA9IGNodW5rICogdGVzdF90aGVuX2luY19hY3E8IFNUID4oKHZvbGF0aWxlIFNUICopICYgc2gtPnUucy5pdGVyYXRpb24gKTsKKyAgICAgICAgICAgICAgICAgICAgdHJpcCA9IHByLT51LnAudGMgLSAxOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKHN0YXR1cyA9IChpbml0IDw9IHRyaXApKSA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwX3N0ICE9IDAgKSAqcF9zdCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHByLT51LnAubGI7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IGNodW5rICsgaW5pdCAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmNyICA9IHByLT51LnAuc3Q7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKGxhc3QgPSAobGltaXQgPj0gdHJpcCkpICE9IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gdHJpcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcF9sYXN0ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX2xhc3QgPSBsYXN0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwX3N0ICE9IDAgKSAqcF9zdCA9IGluY3I7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaW5jciA9PSAxICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX2xiID0gc3RhcnQgKyBpbml0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX3ViID0gc3RhcnQgKyBsaW1pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSBzdGFydCArIGluaXQgKiBpbmNyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX3ViID0gc3RhcnQgKyBsaW1pdCAqIGluY3I7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcHItPm9yZGVyZWQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX2xvd2VyID0gaW5pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfdXBwZXIgPSBsaW1pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJSVkIG9yZGVyZWRfbG93ZXI6JSUlcyBvcmRlcmVkX3VwcGVyOiUlJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFVUID46OnNwZWMgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwMCwgKCBidWZmLCBndGlkLCBwci0+dS5wLm9yZGVyZWRfbG93ZXIsIHByLT51LnAub3JkZXJlZF91cHBlciApICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgIH0gLy8gY2FzZQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGttcF9zY2hfZ3VpZGVkX2l0ZXJhdGl2ZV9jaHVua2VkOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVCAgY2h1bmtzcGVjID0gcHItPnUucC5wYXJtMTsKKyAgICAgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyVkIGttcF9zY2hfZ3VpZGVkX2NodW5rZWQgaXRlcmF0aXZlIGNhc2VcbiIsZ3RpZCkpOworICAgICAgICAgICAgICAgICAgICB0cmlwICA9IHByLT51LnAudGM7CisgICAgICAgICAgICAgICAgICAgIC8vIFN0YXJ0IGF0b21pYyBwYXJ0IG9mIGNhbGN1bGF0aW9ucworICAgICAgICAgICAgICAgICAgICB3aGlsZSgxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTVCAgcmVtYWluaW5nOyAgICAgICAgICAgICAvLyBzaWduZWQsIGJlY2F1c2UgY2FuIGJlIDwgMAorICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCA9IHNoLT51LnMuaXRlcmF0aW9uOyAgLy8gc2hhcmVkIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgPSB0cmlwIC0gaW5pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcmVtYWluaW5nIDw9IDAgKSB7ICAgIC8vIEFDOiBuZWVkIHRvIGNvbXBhcmUgd2l0aCAwIGZpcnN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbywgZG9uJ3QgdHJ5IGF0b21pYyBvcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChUKXJlbWFpbmluZyA8IHByLT51LnAucGFybTIgKSB7IC8vIGNvbXBhcmUgd2l0aCBLKm5wcm9jKihjaHVuaysxKSwgSz0yIGJ5IGRlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgZHluYW1pYy1zdHlsZSBzaGNlZHVsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0b21pY2FsbHkgaW5yZW1lbnQgaXRlcmF0aW9ucywgZ2V0IG9sZCB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQgPSB0ZXN0X3RoZW5fYWRkPFNUPiggKFNUKikmc2gtPnUucy5pdGVyYXRpb24sIChTVCljaHVua3NwZWMgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgPSB0cmlwIC0gaW5pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMDsgICAgLy8gYWxsIGl0ZXJhdGlvbnMgZ290IGJ5IG90aGVyIHRocmVhZHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnb3Qgc29tZSBpdGVyYXRpb25zIHRvIHdvcmsgb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoVClyZW1haW5pbmcgPiBjaHVua3NwZWMgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IGluaXQgKyBjaHVua3NwZWMgLSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCA9IDE7ICAgLy8gdGhlIGxhc3QgY2h1bmsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gaW5pdCArIHJlbWFpbmluZyAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IGluaXQgKyAoVVQpKCByZW1haW5pbmcgKiAqKGRvdWJsZSopJnByLT51LnAucGFybTMgKTsgLy8gZGl2aWRlIGJ5IEsqbnByb2MKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggY29tcGFyZV9hbmRfc3dhcDxTVD4oIChTVCopJnNoLT51LnMuaXRlcmF0aW9uLCAoU1QpaW5pdCwgKFNUKWxpbWl0ICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ0FTIHdhcyBzdWNjZXNzZnVsLCBjaHVuayBvYnRhaW5lZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1saW1pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgfSAvLyB3aGlsZQorICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXR1cyAhPSAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBwci0+dS5wLmxiOworICAgICAgICAgICAgICAgICAgICAgICAgaW5jciA9IHByLT51LnAuc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBfc3QgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfc3QgPSBpbmNyOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwX2xhc3QgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGFzdCA9IGxhc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYiA9IHN0YXJ0ICsgaW5pdCAqIGluY3I7CisgICAgICAgICAgICAgICAgICAgICAgICAqcF91YiA9IHN0YXJ0ICsgbGltaXQgKiBpbmNyOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwci0+b3JkZXJlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfbG93ZXIgPSBpbml0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF91cHBlciA9IGxpbWl0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlJWQgb3JkZXJlZF9sb3dlcjolJSVzIG9yZGVyZWRfdXBwZXI6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIGJ1ZmYsIGd0aWQsIHByLT51LnAub3JkZXJlZF9sb3dlciwgcHItPnUucC5vcmRlcmVkX3VwcGVyICkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwX3N0ICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX3N0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgIH0gLy8gY2FzZQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGttcF9zY2hfZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFQgICBjaHVua3NwZWMgPSBwci0+dS5wLnBhcm0xOworICAgICAgICAgICAgICAgICAgICBVVCBjaHVua0lkeDsKKyAgICAjaWYgS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2CisgICAgICAgICAgICAgICAgICAgIC8qIGZvciBzdG9yaW5nIG9yaWdpbmFsIEZQQ1cgdmFsdWUgZm9yIFdpbmRvd3MqIE9TIG9uCisJCSAgICAgICBJQS0zMiBhcmNoaXRlY3R1cmUgOC1ieXRlIHZlcnNpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG9sZEZwY3c7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmcGN3U2V0ID0gMDsKKyAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJWQga21wX3NjaF9ndWlkZWRfY2h1bmtlZCBhbmFseXRpY2FsIGNhc2VcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQgKSApOworCisgICAgICAgICAgICAgICAgICAgIHRyaXAgID0gcHItPnUucC50YzsKKworICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHRlYW0tPnQudF9ucHJvYyA+IDEpOworICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCgyVUwgKiBjaHVua3NwZWMgKyAxKSAqIChVVCl0ZWFtLT50LnRfbnByb2MgPCB0cmlwKTsKKworICAgICAgICAgICAgICAgICAgICB3aGlsZSgxKSB7IC8qIHRoaXMgd2hpbGUgbG9vcCBpcyBhIHNhZmVndWFyZCBhZ2FpbnN0IHVuZXhwZWN0ZWQgemVybyBjaHVuayBzaXplcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtJZHggPSB0ZXN0X3RoZW5faW5jX2FjcTwgU1QgPigodm9sYXRpbGUgU1QgKikgJiBzaC0+dS5zLml0ZXJhdGlvbiApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBjaHVua0lkeCA+PSAoVVQpcHItPnUucC5wYXJtMiApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLXRyaXA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXNlIGR5bmFtaWMtc3R5bGUgc2NoZWR1bGluZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQgPSBjaHVua0lkeCAqIGNodW5rc3BlYyArIHByLT51LnAuY291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmVlZCB0byB2ZXJpZnkgaW5pdCA+IDAgaW4gY2FzZSBvZiBvdmVyZmxvdyBpbiB0aGUgYWJvdmUgY2FsY3VsYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzdGF0dXMgPSAoaW5pdCA+IDAgJiYgaW5pdCA8PSB0cmlwKSkgIT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgPSBpbml0ICsgY2h1bmtzcGVjIC0xOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKGxhc3QgPSAobGltaXQgPj0gdHJpcCkpICE9IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgPSB0cmlwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXNlIGV4cG9uZW50aWFsLXN0eWxlIHNjaGVkdWxpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgZm9sbG93aW5nIGNoZWNrIGlzIHRvIHdvcmthcm91bmQgdGhlIGxhY2sgb2YgbG9uZyBkb3VibGUgcHJlY2lzaW9uIG9uIFdpbmRvd3MqIE9TLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgY2hlY2sgd29ya3MgYXJvdW5kIHRoZSBwb3NzaWJsZSBlZmZlY3QgdGhhdCBpbml0ICE9IDAgZm9yIGNodW5rSWR4ID09IDAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgI2lmIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4NgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHdlIGhhdmVuJ3QgYWxyZWFkeSBkb25lIHNvLCBzYXZlIG9yaWdpbmFsCisJCQkgICAgICAgRlBDVyBhbmQgc2V0IHByZWNpc2lvbiB0byA2NC1iaXQsIGFzIFdpbmRvd3MqIE9TCisJCQkgICAgICAgb24gSUEtMzIgYXJjaGl0ZWN0dXJlIGRlZmF1bHRzIHRvIDUzLWJpdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggIWZwY3dTZXQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZEZwY3cgPSBfY29udHJvbDg3KDAsMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250cm9sODcoX1BDXzY0LF9NQ1dfUEMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcGN3U2V0ID0gMHgzMDAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBjaHVua0lkeCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCA9IF9fa21wX2Rpc3BhdGNoX2d1aWRlZF9yZW1haW5pbmc8IFQgPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlwLCAqKCBEQkwgKiApJnByLT51LnAucGFybTMsIGNodW5rSWR4ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoaW5pdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQgPSB0cmlwIC0gaW5pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgPSB0cmlwIC0gX19rbXBfZGlzcGF0Y2hfZ3VpZGVkX3JlbWFpbmluZzwgVCA+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlwLCAqKCBEQkwgKiApJnByLT51LnAucGFybTMsIGNodW5rSWR4ICsgMSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoaW5pdCA8PSBsaW1pdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbml0IDwgbGltaXQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQobGltaXQgPD0gdHJpcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tbGltaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgfSAvLyB3aGlsZSAoMSkKKyAgICAjaWYgS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2CisgICAgICAgICAgICAgICAgICAgIC8qIHJlc3RvcmUgRlBDVyBpZiBuZWNlc3NhcnkKKyAgICAgICAgICAgICAgICAgICAgICAgQUM6IGNoZWNrIGZwY3dTZXQgZmxhZyBmaXJzdCBiZWNhdXNlIG9sZEZwY3cgY2FuIGJlIHVuaW5pdGlhbGl6ZWQgaGVyZQorICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBpZiAoIGZwY3dTZXQgJiYgKCBvbGRGcGN3ICYgZnBjd1NldCApICkKKyAgICAgICAgICAgICAgICAgICAgICAgIF9jb250cm9sODcob2xkRnBjdyxfTUNXX1BDKTsKKyAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0dXMgIT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gcHItPnUucC5sYjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluY3IgPSBwci0+dS5wLnN0OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwX3N0ICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX3N0ID0gaW5jcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcF9sYXN0ICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX2xhc3QgPSBsYXN0OworICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSBzdGFydCArIGluaXQgKiBpbmNyOworICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSBzdGFydCArIGxpbWl0ICogaW5jcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcHItPm9yZGVyZWQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX2xvd2VyID0gaW5pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfdXBwZXIgPSBsaW1pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJSVkIG9yZGVyZWRfbG93ZXI6JSUlcyBvcmRlcmVkX3VwcGVyOiUlJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFVUID46OnNwZWMgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwMCwgKCBidWZmLCBndGlkLCBwci0+dS5wLm9yZGVyZWRfbG93ZXIsIHByLT51LnAub3JkZXJlZF91cHBlciApICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwX2xiID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwX3ViID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcF9zdCAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9zdCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IC8vIGNhc2UKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBrbXBfc2NoX3RyYXBlem9pZGFsOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVVQgICBpbmRleDsKKyAgICAgICAgICAgICAgICAgICAgVCAgICBwYXJtMiA9IHByLT51LnAucGFybTI7CisgICAgICAgICAgICAgICAgICAgIFQgICAgcGFybTMgPSBwci0+dS5wLnBhcm0zOworICAgICAgICAgICAgICAgICAgICBUICAgIHBhcm00ID0gcHItPnUucC5wYXJtNDsKKyAgICAgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJWQga21wX3NjaF90cmFwZXpvaWRhbCBjYXNlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkICkgKTsKKworICAgICAgICAgICAgICAgICAgICBpbmRleCA9IHRlc3RfdGhlbl9pbmM8IFNUID4oICh2b2xhdGlsZSBTVCAqKSAmIHNoLT51LnMuaXRlcmF0aW9uICk7CisKKyAgICAgICAgICAgICAgICAgICAgaW5pdCA9ICggaW5kZXggKiAoICgyKnBhcm0yKSAtIChpbmRleC0xKSpwYXJtNCApICkgLyAyOworICAgICAgICAgICAgICAgICAgICB0cmlwID0gcHItPnUucC50YyAtIDE7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3RhdHVzID0gKChUKWluZGV4IDwgcGFybTMgJiYgaW5pdCA8PSB0cmlwKSkgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwX2xiID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwX3ViID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcF9zdCAhPSAwICkgKnBfc3QgPSAwOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBwci0+dS5wLmxiOworICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgPSAoIChpbmRleCsxKSAqICggMipwYXJtMiAtIGluZGV4KnBhcm00ICkgKSAvIDIgLSAxOworICAgICAgICAgICAgICAgICAgICAgICAgaW5jciAgPSBwci0+dS5wLnN0OworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChsYXN0ID0gKGxpbWl0ID49IHRyaXApKSAhPSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IHRyaXA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcF9sYXN0ICE9IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGFzdCA9IGxhc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBfc3QgIT0gMCApICpwX3N0ID0gaW5jcjsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbmNyID09IDEgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSBzdGFydCArIGluaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSBzdGFydCArIGxpbWl0OworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYiA9IHN0YXJ0ICsgaW5pdCAqIGluY3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSBzdGFydCArIGxpbWl0ICogaW5jcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwci0+b3JkZXJlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfbG93ZXIgPSBpbml0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF91cHBlciA9IGxpbWl0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlJWQgb3JkZXJlZF9sb3dlcjolJSVzIG9yZGVyZWRfdXBwZXI6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIGJ1ZmYsIGd0aWQsIHByLT51LnAub3JkZXJlZF9sb3dlciwgcHItPnUucC5vcmRlcmVkX3VwcGVyICkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICAgICAgfSAvLyBjYXNlCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IC8vIHN3aXRjaAorICAgICAgICB9IC8vIGlmIHRjID09IDA7CisKKyAgICAgICAgaWYgKCBzdGF0dXMgPT0gMCApIHsKKyAgICAgICAgICAgIFVUICAgbnVtX2RvbmU7CisKKyAgICAgICAgICAgIG51bV9kb25lID0gdGVzdF90aGVuX2luYzwgU1QgPiggKHZvbGF0aWxlIFNUICopICYgc2gtPnUucy5udW1fZG9uZSApOworICAgICAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlJWQgaW5jcmVtZW50IG51bV9kb25lOiUlJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjICk7CisgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIGJ1ZmYsIGd0aWQsIHNoLT51LnMubnVtX2RvbmUgKSApOworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgIGlmICggbnVtX2RvbmUgPT0gdGVhbS0+dC50X25wcm9jLTEgKSB7CisgICAgICAgICAgICAgICAgLyogTk9URTogcmVsZWFzZSB0aGlzIGJ1ZmZlciB0byBiZSByZXVzZWQgKi8KKworICAgICAgICAgICAgICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgICAgICAgICAgICAgc2gtPnUucy5udW1fZG9uZSA9IDA7CisgICAgICAgICAgICAgICAgc2gtPnUucy5pdGVyYXRpb24gPSAwOworCisgICAgICAgICAgICAgICAgLyogVE9ETyByZXBsYWNlIHdpdGggZ2VuZXJhbCByZWxlYXNlIHByb2NlZHVyZT8gKi8KKyAgICAgICAgICAgICAgICBpZiAoIHByLT5vcmRlcmVkICkgeworICAgICAgICAgICAgICAgICAgICBzaC0+dS5zLm9yZGVyZWRfaXRlcmF0aW9uID0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgICAgICAgICAgICAgIHNoIC0+IGJ1ZmZlcl9pbmRleCArPSBLTVBfTUFYX0RJU1BfQlVGOworICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyVkIGNoYW5nZSBidWZmZXJfaW5kZXg6JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHNoLT5idWZmZXJfaW5kZXgpICk7CisKKyAgICAgICAgICAgICAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBwci0+cHVzaGVkX3dzICE9IGN0X25vbmUgKSB7CisgICAgICAgICAgICAgICAgICAgIHByLT5wdXNoZWRfd3MgPSBfX2ttcF9wb3Bfd29ya3NoYXJlKCBndGlkLCBwci0+cHVzaGVkX3dzLCBsb2MgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rlb19mY24gPSBOVUxMOworICAgICAgICAgICAgdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZHhvX2ZjbiA9IE5VTEw7CisgICAgICAgICAgICB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9kaXNwYXRjaF9zaF9jdXJyZW50ID0gTlVMTDsKKyAgICAgICAgICAgIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rpc3BhdGNoX3ByX2N1cnJlbnQgPSBOVUxMOworICAgICAgICB9IC8vIGlmIChzdGF0dXMgPT0gMCkKKyNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICBlbHNlIGlmICggbGFzdCApIHsKKyAgICAgICAgICAgIHByLT51LnAubGFzdF91cHBlciA9IHByLT51LnAudWI7CisgICAgICAgIH0KKyNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworICAgIH0gLy8gaWYKKworICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlJWQgbm9ybWFsIGNhc2U6ICIgXAorICAgICAgICAgICAgInBfbGI6JSUlcyBwX3ViOiUlJXMgcF9zdDolJSVzIHBfbGFzdDolJXAgIHJldHVybmluZzolJWRcbiIsCisgICAgICAgICAgICB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgU1QgPjo6c3BlYyApOworICAgICAgICBLRF9UUkFDRSgxMCwgKCBidWZmLCBndGlkLCAqcF9sYiwgKnBfdWIsIHBfc3QgPyAqcF9zdCA6IDAsIHBfbGFzdCwgc3RhdHVzICkgKTsKKyAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgfQorICAgICNlbmRpZgorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERpc3BhdGNoIHJvdXRpbmVzCisvLyAgICBUcmFuc2ZlciBjYWxsIHRvIHRlbXBsYXRlPCB0eXBlIFQgPgorLy8gICAgX19rbXBfZGlzcGF0Y2hfaW5pdCggaWRlbnRfdCAqbG9jLCBpbnQgZ3RpZCwgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgVCBsYiwgVCB1YiwgU1Qgc3QsIFNUIGNodW5rICkKK2V4dGVybiAiQyIgeworCisvKiEKK0Bpbmdyb3VwIFdPUktfU0hBUklORworQHsKK0BwYXJhbSBsb2MgU291cmNlIGxvY2F0aW9uCitAcGFyYW0gZ3RpZCBHbG9iYWwgdGhyZWFkIGlkCitAcGFyYW0gc2NoZWR1bGUgU2NoZWR1bGUgdHlwZQorQHBhcmFtIGxiICBMb3dlciBib3VuZAorQHBhcmFtIHViICBVcHBlciBib3VuZAorQHBhcmFtIHN0ICBTdGVwIChvciBpbmNyZW1lbnQgaWYgeW91IHByZWZlcikKK0BwYXJhbSBjaHVuayBUaGUgY2h1bmsgc2l6ZSB0byBibG9jayB3aXRoCisKK1RoaXMgZnVuY3Rpb24gcHJlcGFyZXMgdGhlIHJ1bnRpbWUgdG8gc3RhcnQgYSBkeW5hbWljYWxseSBzY2hlZHVsZWQgZm9yIGxvb3AsIHNhdmluZyB0aGUgbG9vcCBhcmd1bWVudHMuCitUaGVzZSBmdW5jdGlvbnMgYXJlIGFsbCBpZGVudGljYWwgYXBhcnQgZnJvbSB0aGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cy4KKyovCisKK3ZvaWQKK19fa21wY19kaXNwYXRjaF9pbml0XzQoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBsYiwga21wX2ludDMyIHViLCBrbXBfaW50MzIgc3QsIGttcF9pbnQzMiBjaHVuayApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKyAgICBfX2ttcF9kaXNwYXRjaF9pbml0PCBrbXBfaW50MzIgPiggbG9jLCBndGlkLCBzY2hlZHVsZSwgbGIsIHViLCBzdCwgY2h1bmssIHRydWUgKTsKK30KKy8qIQorU2VlIEByZWYgX19rbXBjX2Rpc3BhdGNoX2luaXRfNAorKi8KK3ZvaWQKK19fa21wY19kaXNwYXRjaF9pbml0XzR1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDMyIGxiLCBrbXBfdWludDMyIHViLCBrbXBfaW50MzIgc3QsIGttcF9pbnQzMiBjaHVuayApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKyAgICBfX2ttcF9kaXNwYXRjaF9pbml0PCBrbXBfdWludDMyID4oIGxvYywgZ3RpZCwgc2NoZWR1bGUsIGxiLCB1Yiwgc3QsIGNodW5rLCB0cnVlICk7Cit9CisKKy8qIQorU2VlIEByZWYgX19rbXBjX2Rpc3BhdGNoX2luaXRfNAorKi8KK3ZvaWQKK19fa21wY19kaXNwYXRjaF9pbml0XzgoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCBsYiwga21wX2ludDY0IHViLAorICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0IHN0LCBrbXBfaW50NjQgY2h1bmsgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisgICAgX19rbXBfZGlzcGF0Y2hfaW5pdDwga21wX2ludDY0ID4oIGxvYywgZ3RpZCwgc2NoZWR1bGUsIGxiLCB1Yiwgc3QsIGNodW5rLCB0cnVlICk7Cit9CisKKy8qIQorU2VlIEByZWYgX19rbXBjX2Rpc3BhdGNoX2luaXRfNAorKi8KK3ZvaWQKK19fa21wY19kaXNwYXRjaF9pbml0Xzh1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAga21wX3VpbnQ2NCBsYiwga21wX3VpbnQ2NCB1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgc3QsIGttcF9pbnQ2NCBjaHVuayApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKyAgICBfX2ttcF9kaXNwYXRjaF9pbml0PCBrbXBfdWludDY0ID4oIGxvYywgZ3RpZCwgc2NoZWR1bGUsIGxiLCB1Yiwgc3QsIGNodW5rLCB0cnVlICk7Cit9CisKKy8qIQorQHBhcmFtIGxvYyBTb3VyY2UgY29kZSBsb2NhdGlvbgorQHBhcmFtIGd0aWQgR2xvYmFsIHRocmVhZCBpZAorQHBhcmFtIHBfbGFzdCBQb2ludGVyIHRvIGEgZmxhZyBzZXQgdG8gb25lIGlmIHRoaXMgaXMgdGhlIGxhc3QgY2h1bmsgb3IgemVybyBvdGhlcndpc2UKK0BwYXJhbSBwX2xiICAgUG9pbnRlciB0byB0aGUgbG93ZXIgYm91bmQgZm9yIHRoZSBuZXh0IGNodW5rIG9mIHdvcmsKK0BwYXJhbSBwX3ViICAgUG9pbnRlciB0byB0aGUgdXBwZXIgYm91bmQgZm9yIHRoZSBuZXh0IGNodW5rIG9mIHdvcmsKK0BwYXJhbSBwX3N0ICAgUG9pbnRlciB0byB0aGUgc3RyaWRlIGZvciB0aGUgbmV4dCBjaHVuayBvZiB3b3JrCitAcmV0dXJuIG9uZSBpZiB0aGVyZSBpcyB3b3JrIHRvIGJlIGRvbmUsIHplcm8gb3RoZXJ3aXNlCisKK0dldCB0aGUgbmV4dCBkeW5hbWljYWxseSBhbGxvY2F0ZWQgY2h1bmsgb2Ygd29yayBmb3IgdGhpcyB0aHJlYWQuCitJZiB0aGVyZSBpcyBubyBtb3JlIHdvcmssIHRoZW4gdGhlIGxiLHViIGFuZCBzdHJpZGUgbmVlZCBub3QgYmUgbW9kaWZpZWQuCisqLworaW50CitfX2ttcGNfZGlzcGF0Y2hfbmV4dF80KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgKnBfbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiAqcF9sYiwga21wX2ludDMyICpwX3ViLCBrbXBfaW50MzIgKnBfc3QgKQoreworICAgIHJldHVybiBfX2ttcF9kaXNwYXRjaF9uZXh0PCBrbXBfaW50MzIgPiggbG9jLCBndGlkLCBwX2xhc3QsIHBfbGIsIHBfdWIsIHBfc3QgKTsKK30KKworLyohCitTZWUgQHJlZiBfX2ttcGNfZGlzcGF0Y2hfbmV4dF80CisqLworaW50CitfX2ttcGNfZGlzcGF0Y2hfbmV4dF80dSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyICpwX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDMyICpwX2xiLCBrbXBfdWludDMyICpwX3ViLCBrbXBfaW50MzIgKnBfc3QgKQoreworICAgIHJldHVybiBfX2ttcF9kaXNwYXRjaF9uZXh0PCBrbXBfdWludDMyID4oIGxvYywgZ3RpZCwgcF9sYXN0LCBwX2xiLCBwX3ViLCBwX3N0ICk7Cit9CisKKy8qIQorU2VlIEByZWYgX19rbXBjX2Rpc3BhdGNoX25leHRfNAorKi8KK2ludAorX19rbXBjX2Rpc3BhdGNoX25leHRfOCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyICpwX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgKnBfbGIsIGttcF9pbnQ2NCAqcF91Yiwga21wX2ludDY0ICpwX3N0ICkKK3sKKyAgICByZXR1cm4gX19rbXBfZGlzcGF0Y2hfbmV4dDwga21wX2ludDY0ID4oIGxvYywgZ3RpZCwgcF9sYXN0LCBwX2xiLCBwX3ViLCBwX3N0ICk7Cit9CisKKy8qIQorU2VlIEByZWYgX19rbXBjX2Rpc3BhdGNoX25leHRfNAorKi8KK2ludAorX19rbXBjX2Rpc3BhdGNoX25leHRfOHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiAqcF9sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAga21wX3VpbnQ2NCAqcF9sYiwga21wX3VpbnQ2NCAqcF91Yiwga21wX2ludDY0ICpwX3N0ICkKK3sKKyAgICByZXR1cm4gX19rbXBfZGlzcGF0Y2hfbmV4dDwga21wX3VpbnQ2NCA+KCBsb2MsIGd0aWQsIHBfbGFzdCwgcF9sYiwgcF91YiwgcF9zdCApOworfQorCisvKiEKK0BwYXJhbSBsb2MgU291cmNlIGNvZGUgbG9jYXRpb24KK0BwYXJhbSBndGlkIEdsb2JhbCB0aHJlYWQgaWQKKworTWFyayB0aGUgZW5kIG9mIGEgZHluYW1pYyBsb29wLgorKi8KK3ZvaWQKK19fa21wY19kaXNwYXRjaF9maW5pXzQoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQgKQoreworICAgIF9fa21wX2Rpc3BhdGNoX2ZpbmlzaDwga21wX3VpbnQzMiA+KCBndGlkLCBsb2MgKTsKK30KKworLyohCitTZWUgQHJlZiBfX2ttcGNfZGlzcGF0Y2hfZmluaV80CisqLwordm9pZAorX19rbXBjX2Rpc3BhdGNoX2ZpbmlfOCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgX19rbXBfZGlzcGF0Y2hfZmluaXNoPCBrbXBfdWludDY0ID4oIGd0aWQsIGxvYyApOworfQorCisvKiEKK1NlZSBAcmVmIF9fa21wY19kaXNwYXRjaF9maW5pXzQKKyovCit2b2lkCitfX2ttcGNfZGlzcGF0Y2hfZmluaV80dSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgX19rbXBfZGlzcGF0Y2hfZmluaXNoPCBrbXBfdWludDMyID4oIGd0aWQsIGxvYyApOworfQorCisvKiEKK1NlZSBAcmVmIF9fa21wY19kaXNwYXRjaF9maW5pXzQKKyovCit2b2lkCitfX2ttcGNfZGlzcGF0Y2hfZmluaV84dSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgX19rbXBfZGlzcGF0Y2hfZmluaXNoPCBrbXBfdWludDY0ID4oIGd0aWQsIGxvYyApOworfQorLyohIEB9ICovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vTm9uLXRlbXBsYXRlIHJvdXRpbmVzIGZyb20ga21wX2Rpc3BhdGNoLmMgdXNlZCBpbiBvdGhlciBzb3VyY2VzCisKK2ttcF91aW50MzIgX19rbXBfZXFfNCgga21wX3VpbnQzMiB2YWx1ZSwga21wX3VpbnQzMiBjaGVja2VyKSB7CisgICAgcmV0dXJuIHZhbHVlID09IGNoZWNrZXI7Cit9CisKK2ttcF91aW50MzIgX19rbXBfbmVxXzQoIGttcF91aW50MzIgdmFsdWUsIGttcF91aW50MzIgY2hlY2tlcikgeworICAgIHJldHVybiB2YWx1ZSAhPSBjaGVja2VyOworfQorCitrbXBfdWludDMyIF9fa21wX2x0XzQoIGttcF91aW50MzIgdmFsdWUsIGttcF91aW50MzIgY2hlY2tlcikgeworICAgIHJldHVybiB2YWx1ZSA8IGNoZWNrZXI7Cit9CisKK2ttcF91aW50MzIgX19rbXBfZ2VfNCgga21wX3VpbnQzMiB2YWx1ZSwga21wX3VpbnQzMiBjaGVja2VyKSB7CisgICAgcmV0dXJuIHZhbHVlID49IGNoZWNrZXI7Cit9CisKK2ttcF91aW50MzIgX19rbXBfbGVfNCgga21wX3VpbnQzMiB2YWx1ZSwga21wX3VpbnQzMiBjaGVja2VyKSB7CisgICAgcmV0dXJuIHZhbHVlIDw9IGNoZWNrZXI7Cit9CitrbXBfdWludDMyIF9fa21wX2VxXzgoIGttcF91aW50NjQgdmFsdWUsIGttcF91aW50NjQgY2hlY2tlcikgeworICAgIHJldHVybiB2YWx1ZSA9PSBjaGVja2VyOworfQorCitrbXBfdWludDMyIF9fa21wX25lcV84KCBrbXBfdWludDY0IHZhbHVlLCBrbXBfdWludDY0IGNoZWNrZXIpIHsKKyAgICByZXR1cm4gdmFsdWUgIT0gY2hlY2tlcjsKK30KKwora21wX3VpbnQzMiBfX2ttcF9sdF84KCBrbXBfdWludDY0IHZhbHVlLCBrbXBfdWludDY0IGNoZWNrZXIpIHsKKyAgICByZXR1cm4gdmFsdWUgPCBjaGVja2VyOworfQorCitrbXBfdWludDMyIF9fa21wX2dlXzgoIGttcF91aW50NjQgdmFsdWUsIGttcF91aW50NjQgY2hlY2tlcikgeworICAgIHJldHVybiB2YWx1ZSA+PSBjaGVja2VyOworfQorCitrbXBfdWludDMyIF9fa21wX2xlXzgoIGttcF91aW50NjQgdmFsdWUsIGttcF91aW50NjQgY2hlY2tlcikgeworICAgIHJldHVybiB2YWx1ZSA8PSBjaGVja2VyOworfQorCitrbXBfdWludDMyCitfX2ttcF93YWl0X3lpZWxkXzQodm9sYXRpbGUga21wX3VpbnQzMiAqIHNwaW5uZXIsCisgICAgICAgICAgICAgICAgICAga21wX3VpbnQzMiAgICAgICAgICAgIGNoZWNrZXIsCisgICAgICAgICAgICAgICAgICAga21wX3VpbnQzMiAoKiBwcmVkKSgga21wX3VpbnQzMiwga21wX3VpbnQzMiApCisgICAgICAgICAgICAgICAgICAgLCB2b2lkICAgICAgICAqIG9iaiAgICAvLyBIaWdoZXItbGV2ZWwgc3luY2hyb25pemF0aW9uIG9iamVjdCwgb3IgTlVMTC4KKyAgICAgICAgICAgICAgICAgICApCit7CisgICAgLy8gbm90ZTogd2UgbWF5IG5vdCBiZWxvbmcgdG8gYSB0ZWFtIGF0IHRoaXMgcG9pbnQKKyAgICByZWdpc3RlciB2b2xhdGlsZSBrbXBfdWludDMyICAgICAgICAgKiBzcGluICAgICAgICAgID0gc3Bpbm5lcjsKKyAgICByZWdpc3RlciAgICAgICAgICBrbXBfdWludDMyICAgICAgICAgICBjaGVjayAgICAgICAgID0gY2hlY2tlcjsKKyAgICByZWdpc3RlciAgICAgICAgICBrbXBfdWludDMyICAgc3BpbnM7CisgICAgcmVnaXN0ZXIgICAgICAgICAga21wX3VpbnQzMiAoKmYpICgga21wX3VpbnQzMiwga21wX3VpbnQzMiApID0gcHJlZDsKKyAgICByZWdpc3RlciAgICAgICAgICBrbXBfdWludDMyICAgICAgICAgICByOworCisgICAgS01QX0ZTWU5DX1NQSU5fSU5JVCggb2JqLCAodm9pZCopIHNwaW4gKTsKKyAgICBLTVBfSU5JVF9ZSUVMRCggc3BpbnMgKTsKKyAgICAvLyBtYWluIHdhaXQgc3BpbiBsb29wCisgICAgd2hpbGUoIWYociA9IFRDUl80KCpzcGluKSwgY2hlY2spKSB7CisgICAgICAgIEtNUF9GU1lOQ19TUElOX1BSRVBBUkUoIG9iaiApOworICAgICAgICAvKiBHRUggLSByZW1vdmUgdGhpcyBzaW5jZSBpdCB3YXMgYWNjaWRlbnRhbGx5IGludHJvZHVjZWQgd2hlbiBrbXBfd2FpdCB3YXMgc3BsaXQuCisgICAgICAgICAgIEl0IGNhdXNlcyBwcm9ibGVtcyB3aXRoIGluZmluaXRlIHJlY3Vyc2lvbiBiZWNhdXNlIG9mIGV4aXQgbG9jayAqLworICAgICAgICAvKiBpZiAoIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkgJiYgX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCkKKyAgICAgICAgICAgIF9fa21wX2Fib3J0X3RocmVhZCgpOyAqLworCisgICAgICAgIF9fa21wX3N0YXRpY19kZWxheShUUlVFKTsKKworICAgICAgICAvKiBpZiB3ZSBoYXZlIHdhaXRlZCBhIGJpdCwgb3IgYXJlIG92ZXJzdWJzY3JpYmVkLCB5aWVsZCAqLworICAgICAgICAvKiBwYXVzZSBpcyBpbiB0aGUgZm9sbG93aW5nIGNvZGUgKi8KKyAgICAgICAgS01QX1lJRUxEKCBUQ1JfNChfX2ttcF9udGgpID4gX19rbXBfYXZhaWxfcHJvYyApOworICAgICAgICBLTVBfWUlFTERfU1BJTiggc3BpbnMgKTsKKyAgICB9CisgICAgS01QX0ZTWU5DX1NQSU5fQUNRVUlSRUQoIG9iaiApOworICAgIHJldHVybiByOworfQorCitrbXBfdWludDY0CitfX2ttcF93YWl0X3lpZWxkXzgoIHZvbGF0aWxlIGttcF91aW50NjQgKiBzcGlubmVyLAorICAgICAgICAgICAgICAgICAgICBrbXBfdWludDY0ICAgICAgICAgICAgY2hlY2tlciwKKyAgICAgICAgICAgICAgICAgICAga21wX3VpbnQzMiAoKiBwcmVkKSgga21wX3VpbnQ2NCwga21wX3VpbnQ2NCApCisgICAgICAgICAgICAgICAgICAgICwgdm9pZCAgICAgICAgKiBvYmogICAgLy8gSGlnaGVyLWxldmVsIHN5bmNocm9uaXphdGlvbiBvYmplY3QsIG9yIE5VTEwuCisgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgICAvLyBub3RlOiB3ZSBtYXkgbm90IGJlbG9uZyB0byBhIHRlYW0gYXQgdGhpcyBwb2ludAorICAgIHJlZ2lzdGVyIHZvbGF0aWxlIGttcF91aW50NjQgICAgICAgICAqIHNwaW4gICAgICAgICAgPSBzcGlubmVyOworICAgIHJlZ2lzdGVyICAgICAgICAgIGttcF91aW50NjQgICAgICAgICAgIGNoZWNrICAgICAgICAgPSBjaGVja2VyOworICAgIHJlZ2lzdGVyICAgICAgICAgIGttcF91aW50MzIgICBzcGluczsKKyAgICByZWdpc3RlciAgICAgICAgICBrbXBfdWludDMyICgqZikgKCBrbXBfdWludDY0LCBrbXBfdWludDY0ICkgPSBwcmVkOworICAgIHJlZ2lzdGVyICAgICAgICAgIGttcF91aW50NjQgICAgICAgICAgIHI7CisKKyAgICBLTVBfRlNZTkNfU1BJTl9JTklUKCBvYmosICh2b2lkKikgc3BpbiApOworICAgIEtNUF9JTklUX1lJRUxEKCBzcGlucyApOworICAgIC8vIG1haW4gd2FpdCBzcGluIGxvb3AKKyAgICB3aGlsZSghZihyID0gKnNwaW4sIGNoZWNrKSkKKyAgICB7CisgICAgICAgIEtNUF9GU1lOQ19TUElOX1BSRVBBUkUoIG9iaiApOworICAgICAgICAvKiBHRUggLSByZW1vdmUgdGhpcyBzaW5jZSBpdCB3YXMgYWNjaWRlbnRhbGx5IGludHJvZHVjZWQgd2hlbiBrbXBfd2FpdCB3YXMgc3BsaXQuCisgICAgICAgICAgIEl0IGNhdXNlcyBwcm9ibGVtcyB3aXRoIGluZmluaXRlIHJlY3Vyc2lvbiBiZWNhdXNlIG9mIGV4aXQgbG9jayAqLworICAgICAgICAvKiBpZiAoIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkgJiYgX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCkKKyAgICAgICAgICAgIF9fa21wX2Fib3J0X3RocmVhZCgpOyAqLworCisgICAgICAgIF9fa21wX3N0YXRpY19kZWxheShUUlVFKTsKKworICAgICAgICAvLyBpZiB3ZSBhcmUgb3ZlcnN1YnNjcmliZWQsCisgICAgICAgIC8vIG9yIGhhdmUgd2FpdGVkIGEgYml0IChhbmQgS01QX0xJQkFSUlk9dGhyb3VnaHB1dCwgdGhlbiB5aWVsZAorICAgICAgICAvLyBwYXVzZSBpcyBpbiB0aGUgZm9sbG93aW5nIGNvZGUKKyAgICAgICAgS01QX1lJRUxEKCBUQ1JfNChfX2ttcF9udGgpID4gX19rbXBfYXZhaWxfcHJvYyApOworICAgICAgICBLTVBfWUlFTERfU1BJTiggc3BpbnMgKTsKKyAgICB9CisgICAgS01QX0ZTWU5DX1NQSU5fQUNRVUlSRUQoIG9iaiApOworICAgIHJldHVybiByOworfQorCit9IC8vIGV4dGVybiAiQyIKKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorCit2b2lkCitfX2ttcF9hdXhfZGlzcGF0Y2hfaW5pdF80KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgbGIsIGttcF9pbnQzMiB1Yiwga21wX2ludDMyIHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGNodW5rLCBpbnQgcHVzaF93cyApCit7CisgICAgX19rbXBfZGlzcGF0Y2hfaW5pdDwga21wX2ludDMyID4oIGxvYywgZ3RpZCwgc2NoZWR1bGUsIGxiLCB1Yiwgc3QsIGNodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoX3dzICk7Cit9CisKK3ZvaWQKK19fa21wX2F1eF9kaXNwYXRjaF9pbml0XzR1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3VpbnQzMiBsYiwga21wX3VpbnQzMiB1Yiwga21wX2ludDMyIHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBjaHVuaywgaW50IHB1c2hfd3MgKQoreworICAgIF9fa21wX2Rpc3BhdGNoX2luaXQ8IGttcF91aW50MzIgPiggbG9jLCBndGlkLCBzY2hlZHVsZSwgbGIsIHViLCBzdCwgY2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoX3dzICk7Cit9CisKK3ZvaWQKK19fa21wX2F1eF9kaXNwYXRjaF9pbml0XzgoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCBsYiwga21wX2ludDY0IHViLCBrbXBfaW50NjQgc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgY2h1bmssIGludCBwdXNoX3dzICkKK3sKKyAgICBfX2ttcF9kaXNwYXRjaF9pbml0PCBrbXBfaW50NjQgPiggbG9jLCBndGlkLCBzY2hlZHVsZSwgbGIsIHViLCBzdCwgY2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hfd3MgKTsKK30KKwordm9pZAorX19rbXBfYXV4X2Rpc3BhdGNoX2luaXRfOHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDY0IGxiLCBrbXBfdWludDY0IHViLCBrbXBfaW50NjQgc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0IGNodW5rLCBpbnQgcHVzaF93cyApCit7CisgICAgX19rbXBfZGlzcGF0Y2hfaW5pdDwga21wX3VpbnQ2NCA+KCBsb2MsIGd0aWQsIHNjaGVkdWxlLCBsYiwgdWIsIHN0LCBjaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hfd3MgKTsKK30KKwordm9pZAorX19rbXBfYXV4X2Rpc3BhdGNoX2ZpbmlfY2h1bmtfNCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgX19rbXBfZGlzcGF0Y2hfZmluaXNoX2NodW5rPCBrbXBfdWludDMyID4oIGd0aWQsIGxvYyApOworfQorCit2b2lkCitfX2ttcF9hdXhfZGlzcGF0Y2hfZmluaV9jaHVua184KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBfX2ttcF9kaXNwYXRjaF9maW5pc2hfY2h1bms8IGttcF91aW50NjQgPiggZ3RpZCwgbG9jICk7Cit9CisKK3ZvaWQKK19fa21wX2F1eF9kaXNwYXRjaF9maW5pX2NodW5rXzR1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBfX2ttcF9kaXNwYXRjaF9maW5pc2hfY2h1bms8IGttcF91aW50MzIgPiggZ3RpZCwgbG9jICk7Cit9CisKK3ZvaWQKK19fa21wX2F1eF9kaXNwYXRjaF9maW5pX2NodW5rXzh1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBfX2ttcF9kaXNwYXRjaF9maW5pc2hfY2h1bms8IGttcF91aW50NjQgPiggZ3RpZCwgbG9jICk7Cit9CisKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2Vudmlyb25tZW50LmMgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZW52aXJvbm1lbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmU5ZGM5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2Vudmlyb25tZW50LmMKQEAgLTAsMCArMSw1OTkgQEAKKy8qCisgKiBrbXBfZW52aXJvbm1lbnQuYyAtLSBIYW5kbGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIE9TLWluZGVwZW5kZW50bHkuCisgKiAkUmV2aXNpb246IDQyMjYzICQKKyAqICREYXRlOiAyMDEzLTA0LTA0IDExOjAzOjE5IC0wNTAwIChUaHUsIDA0IEFwciAyMDEzKSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKy8qCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgV2UgdXNlIEdldEVudmlyb25tZW50VmFyaWFibGUgZm9yIFdpbmRvd3MqIE9TIGluc3RlYWQgb2YgZ2V0ZW52IGJlY2F1c2UgdGhlIGFjdCBvZgorICAgIGxvYWRpbmcgYSBETEwgb24gV2luZG93cyogT1MgbWFrZXMgYW55IHVzZXItc2V0IGVudmlyb25tZW50IHZhcmlhYmxlcyAoaS5lLiB3aXRoIHB1dGVudigpKQorICAgIHVuYXZhaWxhYmxlLiAgZ2V0ZW52KCkgYXBwYXJlbnRseSBnZXRzIGEgY2xlYW4gY29weSBvZiB0aGUgZW52IHZhcmlhYmxlcyBhcyB0aGV5IGV4aXN0ZWQKKyAgICBhdCB0aGUgc3RhcnQgb2YgdGhlIHJ1bi4KKyAgICBKSCAxMi8yMy8yMDAyCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgT24gV2luZG93cyogT1MsIHRoZXJlIGFyZSB0d28gZW52aXJvbm1lbnRzIChhdCBsZWFzdCwgc2VlIGJlbG93KToKKworICAgICAgICAxLiBFbnZpcm9ubWVudCBtYWludGFpbmVkIGJ5IFdpbmRvd3MqIE9TIG9uIElBLTMyIGFyY2hpdGVjdHVyZS4gCisJICAgQWNjZXNzaWJsZSB0aHJvdWdoIEdldEVudmlyb25tZW50VmFyaWFibGUoKSwKKyAgICAgICAgICAgU2V0RW52aXJvbm1lbnRWYXJpYWJsZSgpLCBhbmQgR2V0RW52aXJvbm1lbnRTdHJpbmdzKCkuCisKKyAgICAgICAgMi4gRW52aXJvbm1lbnQgbWFpbnRhaW5lZCBieSBDIFJUTC4gQWNjZXNzaWJsZSB0aHJvdWdoIGdldGVudigpLCBwdXRlbnYoKS4KKworICAgIHB1dGVudigpIGZ1bmN0aW9uIHVwZGF0ZXMgYm90aCBDIGFuZCBXaW5kb3dzKiBPUyBvbiBJQS0zMiBhcmNoaXRlY3R1cmUuIGdldGVudigpIGZ1bmN0aW9uIAorICAgIHNlYXJjaCBmb3IgdmFyaWFibGVzIGluIEMgUlRMIGVudmlyb25tZW50IG9ubHkuIFdpbmRvd3MqIE9TIG9uIElBLTMyIGFyY2hpdGVjdHVyZSBmdW5jdGlvbnMgd29yayAqb25seSogCisgICAgd2l0aCBXaW5kb3dzKiBPUyBvbiBJQS0zMiBhcmNoaXRlY3R1cmUuCisKKyAgICBXaW5kb3dzKiBPUyBvbiBJQS0zMiBhcmNoaXRlY3R1cmUgbWFpbnRhaW5lZCBieSBPUywgc28gdGhlcmUgaXMgYWx3YXlzIG9ubHkgb25lIFdpbmRvd3MqIE9TIG9uIAorICAgIElBLTMyIGFyY2hpdGVjdHVyZSBwZXIgcHJvY2Vzcy4gQ2hhbmdlcyBpbiBXaW5kb3dzKiBPUyBvbiBJQS0zMiBhcmNoaXRlY3R1cmUgYXJlIHByb2Nlc3MtdmlzaWJsZS4KKworICAgIEMgZW52aXJvbm1lbnQgbWFpbnRhaW5lZCBieSBDIFJUTC4gTXVsdGlwbGUgY29waWVzIG9mIEMgUlRMIG1heSBiZSBwcmVzZW50IGluIHRoZSBwcm9jZXNzLCBhbmQKKyAgICBlYWNoIEMgUlRMIG1haW50YWlucyBpdHMgb3duIGVudmlyb25tZW50LiA6LSgKKworICAgIFRodXMsIHByb3BlciB3YXkgdG8gd29yayB3aXRoIGVudmlyb25tZW50IG9uIFdpbmRvd3MqIE9TIGlzOgorCisgICAgICAgIDEuIFNldCB2YXJpYWJsZXMgd2l0aCBwdXRlbnYoKSBmdW5jdGlvbiAtLSBib3RoIEMgYW5kIFdpbmRvd3MqIE9TIG9uCisJICAgSUEtMzIgYXJjaGl0ZWN0dXJlIGFyZSBiZWluZyB1cGRhdGVkLiBXaW5kb3dzKiBPUyBvbiAKKwkgICBJQS0zMiBhcmNoaXRlY3R1cmUgbWF5IGJlIGNvbnNpZGVyZWQgYXMgcHJpbWFyeSB0YXJnZXQsCisJICAgd2hpbGUgdXBkYXRpbmcgQyBSVEwgZW52aXJvbm1lbnQgaXMgYSBmcmVlIGJvbnVzLgorCisgICAgICAgIDIuIEdldCB2YXJpYWJsZXMgd2l0aCBHZXRFbnZpcm9ubWVudFZhcmlhYmxlKCkgLS0gZ2V0ZW52KCkgZG9lcyBub3QgCisJICAgc2VhcmNoIFdpbmRvd3MqIE9TIG9uIElBLTMyIGFyY2hpdGVjdHVyZSwgYW5kIGNhbiBub3Qgc2VlIHZhcmlhYmxlcworCSAgIHNldCB3aXRoIFNldEVudmlyb25tZW50VmFyaWFibGUoKS4KKworICAgIDIwMDctMDQtMDUgLS0gbGV2CisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaW5jbHVkZSAia21wX2Vudmlyb25tZW50LmgiCisKKyNpbmNsdWRlICJrbXBfb3MuaCIgICAgLy8gS01QX09TXyouCisjaW5jbHVkZSAia21wLmgiICAgICAgIC8vCisjaW5jbHVkZSAia21wX3N0ci5oIiAgIC8vIF9fa21wX3N0cl8qKCkuCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKworI2lmIEtNUF9PU19VTklYCisgICAgI2luY2x1ZGUgPHN0ZGxpYi5oPiAgICAvLyBnZXRlbnYsIHNldGVudiwgdW5zZXRlbnYuCisgICAgI2luY2x1ZGUgPHN0cmluZy5oPiAgICAvLyBzdHJsZW4sIHN0cmNweS4KKyAgICAjaWYgS01QX09TX0xJTlVYIHx8IEtNUF9PU19GUkVFQlNECisgICAgICAgIGV4dGVybiBjaGFyICogKiBlbnZpcm9uOworICAgICNlbGlmIEtNUF9PU19EQVJXSU4KKyAgICAgICAgI2luY2x1ZGUgPGNydF9leHRlcm5zLmg+CisgICAgICAgICNkZWZpbmUgZW52aXJvbiAoKl9OU0dldEVudmlyb24oKSkKKyAgICAjZWxzZQorICAgICAgICAjZXJyb3IgVW5rbm93biBvciB1bnN1cHBvcnRlZCBPUy4KKyAgICAjZW5kaWYKKyNlbGlmIEtNUF9PU19XSU5ET1dTCisgICAgI2luY2x1ZGUgPHdpbmRvd3MuaD4gICAvLyBHZXRFbnZpcm9ubWVudFZhcmlhYmxlLCBTZXRFbnZpcm9ubWVudFZhcmlhYmxlLCBHZXRMYXN0RXJyb3IuCisjZWxzZQorICAgICNlcnJvciBVbmtub3duIG9yIHVuc3VwcG9ydGVkIE9TLgorI2VuZGlmCisKKworLy8gVE9ETzogRWxpbWluYXRlIGRpcmVjdCBtZW1vcnkgYWxsb2NhdGlvbnMsIHVzZSBzdHJpbmcgb3BlcmF0aW9ucyBpbnN0ZWFkLgorCitzdGF0aWMgaW5saW5lCit2b2lkICoKK2FsbG9jYXRlKAorICAgIHNpemVfdCBzaXplCispIHsKKyAgICB2b2lkICogcHRyID0gS01QX0lOVEVSTkFMX01BTExPQyggc2l6ZSApOworICAgIGlmICggcHRyID09IE5VTEwgKSB7CisJS01QX0ZBVEFMKCBNZW1vcnlBbGxvY0ZhaWxlZCApOworICAgIH07IC8vIGlmCisgICAgcmV0dXJuIHB0cjsKK30gLy8gYWxsb2NhdGUKKworCitjaGFyICoKK19fa21wX2Vudl9nZXQoIGNoYXIgY29uc3QgKiBuYW1lICkgeworCisgICAgY2hhciAqIHJlc3VsdCA9IE5VTEw7CisKKyAgICAjaWYgS01QX09TX1VOSVgKKyAgICAgICAgY2hhciBjb25zdCAqIHZhbHVlID0gZ2V0ZW52KCBuYW1lICk7CisgICAgICAgIGlmICggdmFsdWUgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4oIHZhbHVlICkgKyAxOworICAgICAgICAgICAgcmVzdWx0ID0gKGNoYXIgKikgS01QX0lOVEVSTkFMX01BTExPQyggbGVuICk7CisgICAgICAgICAgICBpZiAoIHJlc3VsdCA9PSBOVUxMICkgeworCQlLTVBfRkFUQUwoIE1lbW9yeUFsbG9jRmFpbGVkICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgc3RybmNweSggcmVzdWx0LCB2YWx1ZSwgbGVuICk7CisgICAgICAgIH07IC8vIGlmCisgICAgI2VsaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgLyoKKyAgICAgICAgICAgIFdlIHVzZSBHZXRFbnZpcm9ubWVudFZhcmlhYmxlIGZvciBXaW5kb3dzKiBPUyBpbnN0ZWFkIG9mIGdldGVudiBiZWNhdXNlIHRoZSBhY3Qgb2YKKyAgICAgICAgICAgIGxvYWRpbmcgYSBETEwgb24gV2luZG93cyogT1MgbWFrZXMgYW55IHVzZXItc2V0IGVudmlyb25tZW50IHZhcmlhYmxlcyAoaS5lLiB3aXRoIHB1dGVudigpKQorICAgICAgICAgICAgdW5hdmFpbGFibGUuICBnZXRlbnYoKSBhcHBhcmVudGx5IGdldHMgYSBjbGVhbiBjb3B5IG9mIHRoZSBlbnYgdmFyaWFibGVzIGFzIHRoZXkgZXhpc3RlZAorICAgICAgICAgICAgYXQgdGhlIHN0YXJ0IG9mIHRoZSBydW4uCisgICAgICAgICAgICBKSCAxMi8yMy8yMDAyCisgICAgICAgICovCisgICAgICAgIERXT1JEIHJjOworICAgICAgICByYyA9IEdldEVudmlyb25tZW50VmFyaWFibGUoIG5hbWUsIE5VTEwsIDAgKTsKKyAgICAgICAgaWYgKCAhIHJjICkgeworICAgICAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIGlmICggZXJyb3IgIT0gRVJST1JfRU5WVkFSX05PVF9GT1VORCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudEdldEVudlZhciwgbmFtZSApLAorICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgLy8gVmFyaWFibGUgaXMgbm90IGZvdW5kLCBpdCdzIG9rLCBqdXN0IGNvbnRpbnVlLgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRFdPUkQgbGVuID0gcmM7CisgICAgICAgICAgICByZXN1bHQgPSAoY2hhciAqKSBLTVBfSU5URVJOQUxfTUFMTE9DKCBsZW4gKTsKKyAgICAgICAgICAgIGlmICggcmVzdWx0ID09IE5VTEwgKSB7CisJCUtNUF9GQVRBTCggTWVtb3J5QWxsb2NGYWlsZWQgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICByYyA9IEdldEVudmlyb25tZW50VmFyaWFibGUoIG5hbWUsIHJlc3VsdCwgbGVuICk7CisgICAgICAgICAgICBpZiAoICEgcmMgKSB7CisgICAgICAgICAgICAgICAgLy8gR2V0RW52aXJvbm1lbnRWYXJpYWJsZSgpIG1heSByZXR1cm4gMCBpZiB2YXJpYWJsZSBpcyBlbXB0eS4KKyAgICAgICAgICAgICAgICAvLyBJbiBzdWNoIGEgY2FzZSBHZXRMYXN0RXJyb3IoKSByZXR1cm5zIEVSUk9SX1NVQ0NFU1MuCisgICAgICAgICAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgICAgICBpZiAoIGVycm9yICE9IEVSUk9SX1NVQ0NFU1MgKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFVuZXhwZWN0ZWQgZXJyb3IuIFRoZSB2YXJpYWJsZSBzaG91bGQgYmUgaW4gdGhlIGVudmlyb25tZW50LAorICAgICAgICAgICAgICAgICAgICAvLyBhbmQgYnVmZmVyIHNob3VsZCBiZSBsYXJnZSBlbm91Z2guCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRHZXRFbnZWYXIsIG5hbWUgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSggKHZvaWQgKikgcmVzdWx0ICk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IE5VTEw7CisgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH07IC8vIGlmCisgICAgI2Vsc2UKKyAgICAgICAgI2Vycm9yIFVua25vd24gb3IgdW5zdXBwb3J0ZWQgT1MuCisgICAgI2VuZGlmCisKKyAgICByZXR1cm4gcmVzdWx0OworCit9IC8vIGZ1bmMgX19rbXBfZW52X2dldAorCisKKy8vIFRPRE86IEZpbmQgYW5kIHJlcGxhY2UgYWxsIHJlZ3VsYXIgZnJlZSgpIHdpdGggX19rbXBfZW52X2ZyZWUoKS4KKwordm9pZAorX19rbXBfZW52X2ZyZWUoIGNoYXIgY29uc3QgKiAqIHZhbHVlICkgeworCisgICAgS01QX0RFQlVHX0FTU0VSVCggdmFsdWUgIT0gTlVMTCApOworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSAqIHZhbHVlICk7CisgICAgKiB2YWx1ZSA9IE5VTEw7CisKK30gLy8gZnVuYyBfX2ttcF9lbnZfZnJlZQorCisKKworaW50CitfX2ttcF9lbnZfZXhpc3RzKCBjaGFyIGNvbnN0ICogbmFtZSApIHsKKworICAgICNpZiBLTVBfT1NfVU5JWAorICAgICAgICBjaGFyIGNvbnN0ICogdmFsdWUgPSBnZXRlbnYoIG5hbWUgKTsKKyAgICAgICAgcmV0dXJuICggKCB2YWx1ZSA9PSBOVUxMICkgPyAoIDAgKSA6ICggMSApICk7CisgICAgI2VsaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgRFdPUkQgcmM7CisgICAgICAgIHJjID0gR2V0RW52aXJvbm1lbnRWYXJpYWJsZSggbmFtZSwgTlVMTCwgMCApOworICAgICAgICBpZiAoIHJjID09IDAgKSB7CisgICAgICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgaWYgKCBlcnJvciAhPSBFUlJPUl9FTlZWQVJfTk9UX0ZPVU5EICkgeworICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50R2V0RW52VmFyLCBuYW1lICksCisgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgcmV0dXJuIDE7CisgICAgI2Vsc2UKKyAgICAgICAgI2Vycm9yIFVua25vd24gb3IgdW5zdXBwb3J0ZWQgT1MuCisgICAgI2VuZGlmCisKK30gLy8gZnVuYyBfX2ttcF9lbnZfZXhpc3RzCisKKworCit2b2lkCitfX2ttcF9lbnZfc2V0KCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCBpbnQgb3ZlcndyaXRlICkgeworCisgICAgI2lmIEtNUF9PU19VTklYCisgICAgICAgIGludCByYyA9IHNldGVudiggbmFtZSwgdmFsdWUsIG92ZXJ3cml0ZSApOworICAgICAgICBpZiAoIHJjICE9IDAgKSB7CisgICAgICAgICAgICAvLyBEZWFkIGNvZGUuIEkgdHJpZWQgdG8gcHV0IHRvbyBtYW55IHZhcmlhYmxlcyBpbnRvIExpbnV4KiBPUworICAgICAgICAgICAgLy8gZW52aXJvbm1lbnQgb24gSUEtMzIgYXJjaGl0ZWN0dXJlLiBXaGVuIGFwcGxpY2F0aW9uIGNvbnN1bWVzCisgICAgICAgICAgICAvLyBtb3JlIHRoYW4gfjIuNSBHQiBvZiBtZW1vcnksIGVudGlyZSBzeXN0ZW0gZmVlbHMgYmFkLiBTb21ldGltZXMKKyAgICAgICAgICAgIC8vIGFwcGxpY2F0aW9uIGlzIGtpbGxlZCAoYnkgT1M/KSwgc29tZXRpbWVzIHN5c3RlbSBzdG9wcyAKKyAgICAgICAgICAgIC8vIHJlc3BvbmRpbmcuLi4gQnV0IHRoaXMgZXJyb3IgbWVzc2FnZSBuZXZlciBhcHBlYXJzLiAtLWxuCisgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRTZXRFbnZWYXIsIG5hbWUgKSwKKyAgICAgICAgICAgICAgICBLTVBfSE5UKCBOb3RFbm91Z2hNZW1vcnkgKSwKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAjZWxpZiBLTVBfT1NfV0lORE9XUworICAgICAgICBCT09MIHJjOworICAgICAgICBpZiAoICEgb3ZlcndyaXRlICkgeworICAgICAgICAgICAgcmMgPSBHZXRFbnZpcm9ubWVudFZhcmlhYmxlKCBuYW1lLCBOVUxMLCAwICk7CisgICAgICAgICAgICBpZiAoIHJjICkgeworICAgICAgICAgICAgICAgIC8vIFZhcmlhYmxlIGV4aXN0cywgZG8gbm90IG92ZXJ3cml0ZS4KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIGlmICggZXJyb3IgIT0gRVJST1JfRU5WVkFSX05PVF9GT1VORCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudEdldEVudlZhciwgbmFtZSApLAorICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9OyAvLyBpZgorICAgICAgICByYyA9IFNldEVudmlyb25tZW50VmFyaWFibGUoIG5hbWUsIHZhbHVlICk7CisgICAgICAgIGlmICggISByYyApIHsKKyAgICAgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRTZXRFbnZWYXIsIG5hbWUgKSwKKyAgICAgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICApOworICAgICAgICB9OyAvLyBpZgorICAgICNlbHNlCisgICAgICAgICNlcnJvciBVbmtub3duIG9yIHVuc3VwcG9ydGVkIE9TLgorICAgICNlbmRpZgorCit9IC8vIGZ1bmMgX19rbXBfZW52X3NldAorCisKKwordm9pZAorX19rbXBfZW52X3Vuc2V0KCBjaGFyIGNvbnN0ICogbmFtZSApIHsKKworICAgICNpZiBLTVBfT1NfVU5JWAorICAgICAgICB1bnNldGVudiggbmFtZSApOworICAgICNlbGlmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIEJPT0wgcmMgPSBTZXRFbnZpcm9ubWVudFZhcmlhYmxlKCBuYW1lLCBOVUxMICk7CisgICAgICAgIGlmICggISByYyApIHsKKyAgICAgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRTZXRFbnZWYXIsIG5hbWUgKSwKKyAgICAgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICApOworICAgICAgICB9OyAvLyBpZgorICAgICNlbHNlCisgICAgICAgICNlcnJvciBVbmtub3duIG9yIHVuc3VwcG9ydGVkIE9TLgorICAgICNlbmRpZgorCit9IC8vIGZ1bmMgX19rbXBfZW52X3Vuc2V0CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoKKyAgICBJbnRlbCBPcGVuTVAgUlRMIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBlbnZpcm9ubWVudDoganVzdCBhIHN0cmluZyBvZiBjaGFyYWN0ZXJzLCB2YXJpYWJsZXMKKyAgICBhcmUgc2VwYXJhdGVkIHdpdGggdmVydGljYWwgYmFycywgZS4gZy46CisKKyAgICAgICAgIktNUF9XQVJOSU5HUz0wfEtNUF9BRkZJTklUWT1jb21wYWN0fCIKKworICAgIEVtcHR5IHZhcmlhYmxlcyBhcmUgYWxsb3dlZCBhbmQgaWdub3JlZDoKKworICAgICAgICAifHxLTVBfV0FSTklOR1M9MXx8IgorCisqLworCitzdGF0aWMKK3ZvaWQKK19fX2ttcF9lbnZfYmxrX3BhcnNlX3N0cmluZygKKyAgICBrbXBfZW52X2Jsa190ICogYmxvY2ssICAgLy8gTTogRW52IGJsb2NrIHRvIGZpbGwuCisgICAgY2hhciBjb25zdCAqICAgIGVudiAgICAgIC8vIEk6IFN0cmluZyB0byBwYXJzZS4KKykgeworCisgICAgY2hhciBjb25zdCBjaHJfZGVsaW1pdGVyICAgPSAnfCc7CisgICAgY2hhciBjb25zdCBzdHJfZGVsaW1pdGVyW10gPSB7IGNocl9kZWxpbWl0ZXIsIDAgfTsKKworICAgIGNoYXIgKiAgICAgICAgICBidWxrICAgICAgID0gTlVMTDsKKyAgICBrbXBfZW52X3Zhcl90ICogdmFycyAgICAgICA9IE5VTEw7CisgICAgaW50ICAgICAgICAgICAgIGNvdW50ICAgICAgPSAwOyAgLy8gTnVtYmVyIG9mIHVzZWQgZWxlbWVudHMgaW4gdmFycyBhcnJheS4KKyAgICBpbnQgICAgICAgICAgICAgZGVsaW1pdGVycyA9IDA7ICAvLyBOdW1iZXIgb2YgZGVsaW1pdGVycyBpbiBpbnB1dCBzdHJpbmcuCisKKyAgICAvLyBDb3B5IG9yaWdpbmFsIHN0cmluZywgd2Ugd2lsbCBtb2RpZnkgdGhlIGNvcHkuCisgICAgYnVsayA9IF9fa21wX3N0cl9mb3JtYXQoICIlcyIsIGVudiApOworCisgICAgLy8gTG9vcCB0aHJ1IGFsbCB0aGUgdmFycyBpbiBlbnZpcm9ubWVudCBibG9jay4gQ291bnQgZGVsaW1pdGVycyAobWF4aW11bSBudW1iZXIgb2YgdmFyaWFibGVzCisgICAgLy8gaXMgbnVtYmVyIG9mIGRlbGltaXRlcnMgcGx1cyBvbmUpLgorICAgIHsKKyAgICAgICAgY2hhciBjb25zdCAqIHB0ciA9IGJ1bGs7CisgICAgICAgIGZvciAoIDsgOyApIHsKKyAgICAgICAgICAgIHB0ciA9IHN0cmNociggcHRyLCBjaHJfZGVsaW1pdGVyICk7CisgICAgICAgICAgICBpZiAoIHB0ciA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICsrIGRlbGltaXRlcnM7CisgICAgICAgICAgICBwdHIgKz0gMTsKKyAgICAgICAgfTsgLy8gZm9yZXZlcgorICAgIH0KKworICAgIC8vIEFsbG9jYXRlIHZhcnMgYXJyYXkuCisgICAgdmFycyA9IChrbXBfZW52X3Zhcl90ICopIGFsbG9jYXRlKCAoIGRlbGltaXRlcnMgKyAxICkgKiBzaXplb2YoIGttcF9lbnZfdmFyX3QgKSApOworCisgICAgLy8gTG9vcCB0aHJ1IGFsbCB0aGUgdmFyaWFibGVzLgorICAgIHsKKyAgICAgICAgY2hhciAqIHZhcjsgICAgIC8vIFBvaW50ZXIgdG8gdmFyaWFibGUgKGJvdGggbmFtZSBhbmQgdmFsdWUpLgorICAgICAgICBjaGFyICogbmFtZTsgICAgLy8gUG9pbnRlciB0byBuYW1lIG9mIHZhcmlhYmxlLgorICAgICAgICBjaGFyICogdmFsdWU7ICAgLy8gUG9pbnRlciB0byB2YWx1ZS4KKyAgICAgICAgY2hhciAqIGJ1ZjsgICAgIC8vIEJ1ZmZlciBmb3IgX19rbXBfc3RyX3Rva2VuKCkgZnVuY3Rpb24uCisgICAgICAgIHZhciA9IF9fa21wX3N0cl90b2tlbiggYnVsaywgc3RyX2RlbGltaXRlciwgJiBidWYgKTsgICAgICAvLyBHZXQgdGhlIGZpcnN0IHZhci4KKyAgICAgICAgd2hpbGUgKCB2YXIgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIC8vIFNhdmUgZm91bmQgdmFyaWFibGUgaW4gdmFycyBhcnJheS4KKyAgICAgICAgICAgIF9fa21wX3N0cl9zcGxpdCggdmFyLCAnPScsICYgbmFtZSwgJiB2YWx1ZSApOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggY291bnQgPCBkZWxpbWl0ZXJzICsgMSApOworICAgICAgICAgICAgdmFyc1sgY291bnQgXS5uYW1lICA9IG5hbWU7CisgICAgICAgICAgICB2YXJzWyBjb3VudCBdLnZhbHVlID0gdmFsdWU7CisgICAgICAgICAgICArKyBjb3VudDsKKyAgICAgICAgICAgIC8vIEdldCB0aGUgbmV4dCB2YXIuCisgICAgICAgICAgICB2YXIgPSBfX2ttcF9zdHJfdG9rZW4oIE5VTEwsIHN0cl9kZWxpbWl0ZXIsICYgYnVmICk7CisgICAgICAgIH07IC8vIHdoaWxlCisgICAgfQorCisgICAgLy8gRmlsbCBvdXQgcmVzdWx0LgorICAgIGJsb2NrLT5idWxrICA9IGJ1bGs7CisgICAgYmxvY2stPnZhcnMgID0gdmFyczsKKyAgICBibG9jay0+Y291bnQgPSBjb3VudDsKKworfTsgLy8gX19fa21wX2Vudl9ibGtfcGFyc2Vfc3RyaW5nCisKKworCisvKgorICAgIFdpbmRvd3MqIE9TIChhY3R1YWxseSwgRE9TKSBlbnZpcm9ubWVudCBibG9jayBpcyBhIHBpZWNlIG9mIG1lbW9yeSB3aXRoIGVudmlyb25tZW50IHZhcmlhYmxlcy4gRWFjaAorICAgIHZhcmlhYmxlIGlzIHRlcm1pbmF0ZWQgd2l0aCB6ZXJvIGJ5dGUsIGVudGlyZSBibG9jayBpcyB0ZXJtaW5hdGVkIHdpdGggb25lIGV4dHJhIHplcm8gYnl0ZSwgc28KKyAgICB3ZSBoYXZlIHR3byB6ZXJvIGJ5dGVzIGF0IHRoZSBlbmQgb2YgZW52aXJvbm1lbnQgYmxvY2ssIGUuIGcuOgorCisgICAgICAgICJIT01FPUM6XFx1c2Vyc1xcbGV2XHgwME9TPVdpbmRvd3NfTlRceDAwXHgwMCIKKworICAgIEl0IGlzIG5vdCBjbGVhciBob3cgZW1wdHkgZW52aXJvbm1lbnQgaXMgcmVwcmVzZW50ZWQuICJceDAwXHgwMCI/CisqLworCitzdGF0aWMKK3ZvaWQKK19fX2ttcF9lbnZfYmxrX3BhcnNlX3dpbmRvd3MoCisgICAga21wX2Vudl9ibGtfdCAqIGJsb2NrLCAgIC8vIE06IEVudiBibG9jayB0byBmaWxsLgorICAgIGNoYXIgY29uc3QgKiAgICBlbnYgICAgICAvLyBJOiBQb2ludGVyIHRvIFdpbmRvd3MqIE9TIChET1MpIGVudmlyb25tZW50IGJsb2NrLgorKSB7CisKKyAgICBjaGFyICogICAgICAgICAgYnVsayAgPSBOVUxMOworICAgIGttcF9lbnZfdmFyX3QgKiB2YXJzICA9IE5VTEw7CisgICAgaW50ICAgICAgICAgICAgIGNvdW50ID0gMDsgICAgIC8vIE51bWJlciBvZiB1c2VkIGVsZW1lbnRzIGluIHZhcnMgYXJyYXkuCisgICAgaW50ICAgICAgICAgICAgIHNpemUgID0gMDsgICAgIC8vIFNpemUgb2YgYnVsay4KKworICAgIGNoYXIgKiBuYW1lOyAgICAvLyBQb2ludGVyIHRvIG5hbWUgb2YgdmFyaWFibGUuCisgICAgY2hhciAqIHZhbHVlOyAgIC8vIFBvaW50ZXIgdG8gdmFsdWUuCisKKyAgICBpZiAoIGVudiAhPSBOVUxMICkgeworCisgICAgICAgIC8vIExvb3AgdGhydSBhbGwgdGhlIHZhcnMgaW4gZW52aXJvbm1lbnQgYmxvY2suIENvdW50IHZhcmlhYmxlcywgZmluZCBzaXplIG9mIGJsb2NrLgorICAgICAgICB7CisgICAgICAgICAgICBjaGFyIGNvbnN0ICogdmFyOyAgICAgLy8gUG9pbnRlciB0byBiZWdpbm5pbmcgb2YgdmFyLgorICAgICAgICAgICAgaW50ICAgICAgICAgIGxlbjsgICAgIC8vIExlbmd0aCBvZiB2YXJpYWJsZS4KKyAgICAgICAgICAgIGNvdW50ID0gMDsKKyAgICAgICAgICAgIHZhciA9IGVudjsgICAgICAgICAgICAvLyBUaGUgZmlyc3QgdmFyaWFibGUgc3RhcnRzIGFuZCBiZWdpbm5pbmcgb2YgZW52aXJvbm1lbnQgYmxvY2suCisgICAgICAgICAgICBsZW4gPSBzdHJsZW4oIHZhciApOworICAgICAgICAgICAgd2hpbGUgKCBsZW4gIT0gMCApIHsKKyAgICAgICAgICAgICAgICArKyBjb3VudDsKKyAgICAgICAgICAgICAgICBzaXplID0gc2l6ZSArIGxlbiArIDE7CisgICAgICAgICAgICAgICAgdmFyID0gdmFyICsgbGVuICsgMTsgLy8gTW92ZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgdmFyaWFibGUuCisgICAgICAgICAgICAgICAgbGVuID0gc3RybGVuKCB2YXIgKTsKKyAgICAgICAgICAgIH07IC8vIHdoaWxlCisgICAgICAgICAgICBzaXplID0gc2l6ZSArIDE7ICAgICAgICAgLy8gVG90YWwgc2l6ZSBvZiBlbnYgYmxvY2ssIGluY2x1ZGluZyB0ZXJtaW5hdGluZyB6ZXJvIGJ5dGUuCisgICAgICAgIH0KKworICAgICAgICAvLyBDb3B5IG9yaWdpbmFsIGJsb2NrIHRvIGJ1bGssIHdlIHdpbGwgbW9kaWZ5IGJ1bGssIG5vdCBvcmlnaW5hbCBibG9jay4KKyAgICAgICAgYnVsayA9IChjaGFyICopIGFsbG9jYXRlKCBzaXplICk7CisgICAgICAgIG1lbWNweSggYnVsaywgZW52LCBzaXplICk7CisgICAgICAgIC8vIEFsbG9jYXRlIHZhcnMgYXJyYXkuCisgICAgICAgIHZhcnMgPSAoa21wX2Vudl92YXJfdCAqKSBhbGxvY2F0ZSggY291bnQgKiBzaXplb2YoIGttcF9lbnZfdmFyX3QgKSApOworCisgICAgICAgIC8vIExvb3AgdGhydSBhbGwgdGhlIHZhcnMsIG5vdyBpbiBidWxrLgorICAgICAgICB7CisgICAgICAgICAgICBjaGFyICogdmFyOyAgICAgLy8gUG9pbnRlciB0byBiZWdpbm5pbmcgb2YgdmFyLgorICAgICAgICAgICAgaW50ICAgIGxlbjsgICAgIC8vIExlbmd0aCBvZiB2YXJpYWJsZS4KKyAgICAgICAgICAgIGNvdW50ID0gMDsKKyAgICAgICAgICAgIHZhciA9IGJ1bGs7CisgICAgICAgICAgICBsZW4gPSBzdHJsZW4oIHZhciApOworICAgICAgICAgICAgd2hpbGUgKCBsZW4gIT0gMCApIHsKKyAgICAgICAgICAgICAgICAvLyBTYXZlIHZhcmlhYmxlIGluIHZhcnMgYXJyYXkuCisgICAgICAgICAgICAgICAgX19rbXBfc3RyX3NwbGl0KCB2YXIsICc9JywgJiBuYW1lLCAmIHZhbHVlICk7CisgICAgICAgICAgICAgICAgdmFyc1sgY291bnQgXS5uYW1lICA9IG5hbWU7CisgICAgICAgICAgICAgICAgdmFyc1sgY291bnQgXS52YWx1ZSA9IHZhbHVlOworICAgICAgICAgICAgICAgICsrIGNvdW50OworICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbmV4dCB2YXIuCisgICAgICAgICAgICAgICAgdmFyID0gdmFyICsgbGVuICsgMTsKKyAgICAgICAgICAgICAgICBsZW4gPSBzdHJsZW4oIHZhciApOworICAgICAgICAgICAgfTsgLy8gd2hpbGUKKyAgICAgICAgfQorCisgICAgfTsgLy8gaWYKKworICAgIC8vIEZpbGwgb3V0IHJlc3VsdC4KKyAgICBibG9jay0+YnVsayAgPSBidWxrOworICAgIGJsb2NrLT52YXJzICA9IHZhcnM7CisgICAgYmxvY2stPmNvdW50ID0gY291bnQ7CisKK307IC8vIF9fX2ttcF9lbnZfYmxrX3BhcnNlX3dpbmRvd3MKKworCisKKy8qCisgICAgVW5peCBlbnZpcm9ubWVudCBibG9jayBpcyBhIGFycmF5IG9mIHBvaW50ZXJzIHRvIHZhcmlhYmxlcywgbGFzdCBwb2ludGVyIGluIGFycmF5IGlzIE5VTEw6CisKKyAgICAgICAgeyAiSE9NRT0vaG9tZS9sZXYiLCAiVEVSTT14dGVybSIsIE5VTEwgfQorKi8KKworc3RhdGljCit2b2lkCitfX19rbXBfZW52X2Jsa19wYXJzZV91bml4KAorICAgIGttcF9lbnZfYmxrX3QgKiBibG9jaywgICAvLyBNOiBFbnYgYmxvY2sgdG8gZmlsbC4KKyAgICBjaGFyICogKiAgICAgICAgZW52ICAgICAgLy8gSTogVW5peCBlbnZpcm9ubWVudCB0byBwYXJzZS4KKykgeworCisgICAgY2hhciAqICAgICAgICAgIGJ1bGsgID0gTlVMTDsKKyAgICBrbXBfZW52X3Zhcl90ICogdmFycyAgPSBOVUxMOworICAgIGludCAgICAgICAgICAgICBjb3VudCA9IDA7CisgICAgaW50ICAgICAgICAgICAgIHNpemUgID0gMDsgICAgLy8gU2l6ZSBvZiBidWxrLgorCisgICAgLy8gQ291bnQgbnVtYmVyIG9mIHZhcmlhYmxlcyBhbmQgbGVuZ3RoIG9mIHJlcXVpcmVkIGJ1bGsuCisgICAgeworICAgICAgICBjb3VudCA9IDA7CisgICAgICAgIHNpemUgID0gMDsKKyAgICAgICAgd2hpbGUgKCBlbnZbIGNvdW50IF0gIT0gTlVMTCApIHsKKyAgICAgICAgICAgIHNpemUgKz0gc3RybGVuKCBlbnZbIGNvdW50IF0gKSArIDE7CisgICAgICAgICAgICArKyBjb3VudDsKKyAgICAgICAgfTsgLy8gd2hpbGUKKyAgICB9CisKKyAgICAvLyBBbGxvY2F0ZSBtZW1vcnkuCisgICAgYnVsayA9IChjaGFyICopIGFsbG9jYXRlKCBzaXplICk7CisgICAgdmFycyA9IChrbXBfZW52X3Zhcl90ICopIGFsbG9jYXRlKCBjb3VudCAqIHNpemVvZigga21wX2Vudl92YXJfdCApICk7CisKKyAgICAvLyBMb29wIHRocnUgYWxsIHRoZSB2YXJzLgorICAgIHsKKyAgICAgICAgY2hhciAqIHZhcjsgICAgIC8vIFBvaW50ZXIgdG8gYmVnaW5uaW5nIG9mIHZhci4KKyAgICAgICAgY2hhciAqIG5hbWU7ICAgIC8vIFBvaW50ZXIgdG8gbmFtZSBvZiB2YXJpYWJsZS4KKyAgICAgICAgY2hhciAqIHZhbHVlOyAgIC8vIFBvaW50ZXIgdG8gdmFsdWUuCisgICAgICAgIGludCAgICBsZW47ICAgICAvLyBMZW5ndGggb2YgdmFyaWFibGUuCisgICAgICAgIGludCAgICBpOworICAgICAgICB2YXIgPSBidWxrOworICAgICAgICBmb3IgKCBpID0gMDsgaSA8IGNvdW50OyArKyBpICkgeworICAgICAgICAgICAgLy8gQ29weSB2YXJpYWJsZSB0byBidWxrLgorICAgICAgICAgICAgbGVuID0gc3RybGVuKCBlbnZbIGkgXSApOworICAgICAgICAgICAgbWVtY3B5KCB2YXIsIGVudlsgaSBdLCBsZW4gKyAxICk7CisgICAgICAgICAgICAvLyBTYXZlIGZvdW5kIHZhcmlhYmxlIGluIHZhcnMgYXJyYXkuCisgICAgICAgICAgICBfX2ttcF9zdHJfc3BsaXQoIHZhciwgJz0nLCAmIG5hbWUsICYgdmFsdWUgKTsKKyAgICAgICAgICAgIHZhcnNbIGkgXS5uYW1lICA9IG5hbWU7CisgICAgICAgICAgICB2YXJzWyBpIF0udmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgICAgIC8vIE1vdmUgcG9pbnRlci4KKyAgICAgICAgICAgIHZhciArPSBsZW4gKyAxOworICAgICAgICB9OyAvLyBmb3IKKyAgICB9CisKKyAgICAvLyBGaWxsIG91dCByZXN1bHQuCisgICAgYmxvY2stPmJ1bGsgID0gYnVsazsKKyAgICBibG9jay0+dmFycyAgPSB2YXJzOworICAgIGJsb2NrLT5jb3VudCA9IGNvdW50OworCit9OyAvLyBfX19rbXBfZW52X2Jsa19wYXJzZV91bml4CisKKworCit2b2lkCitfX2ttcF9lbnZfYmxrX2luaXQoCisgICAga21wX2Vudl9ibGtfdCAqIGJsb2NrLCAgLy8gTTogQmxvY2sgdG8gaW5pdGlhbGl6ZS4KKyAgICBjaGFyIGNvbnN0ICogICAgYnVsayAgICAvLyBJOiBJbml0aWFsaXphdGlvbiBzdHJpbmcsIG9yIE5VTEwuCispIHsKKworICAgIGlmICggYnVsayAhPSBOVUxMICkgeworICAgICAgICBfX19rbXBfZW52X2Jsa19wYXJzZV9zdHJpbmcoIGJsb2NrLCBidWxrICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgI2lmIEtNUF9PU19VTklYCisgICAgICAgICAgICBfX19rbXBfZW52X2Jsa19wYXJzZV91bml4KCBibG9jaywgZW52aXJvbiApOworICAgICAgICAjZWxpZiBLTVBfT1NfV0lORE9XUworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoYXIgKiBtZW0gPSBHZXRFbnZpcm9ubWVudFN0cmluZ3MoKTsKKyAgICAgICAgICAgICAgICBpZiAoIG1lbSA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50R2V0RW52aXJvbm1lbnQgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgX19fa21wX2Vudl9ibGtfcGFyc2Vfd2luZG93cyggYmxvY2ssIG1lbSApOworICAgICAgICAgICAgICAgIEZyZWVFbnZpcm9ubWVudFN0cmluZ3MoIG1lbSApOworICAgICAgICAgICAgfQorICAgICAgICAjZWxzZQorICAgICAgICAgICAgI2Vycm9yIFVua25vd24gb3IgdW5zdXBwb3J0ZWQgT1MuCisgICAgICAgICNlbmRpZgorICAgIH07IC8vIGlmCisKK30gLy8gX19rbXBfZW52X2Jsa19pbml0CisKKworCitzdGF0aWMKK2ludAorX19fa21wX2Vudl92YXJfY21wKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbXBhcmlzb24gZnVuY3Rpb24gZm9yIHFzb3J0KCkuCisgICAga21wX2Vudl92YXJfdCBjb25zdCAqIGxocywKKyAgICBrbXBfZW52X3Zhcl90IGNvbnN0ICogcmhzCispIHsKKyAgICByZXR1cm4gc3RyY21wKCBsaHMtPm5hbWUsIHJocy0+bmFtZSApOworfQorCit2b2lkCitfX2ttcF9lbnZfYmxrX3NvcnQoCisgICAga21wX2Vudl9ibGtfdCAqIGJsb2NrICAvLyBNOiBCbG9jayBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gc29ydC4KKykgeworCisgICAgcXNvcnQoCisgICAgICAgICh2b2lkICopIGJsb2NrLT52YXJzLAorICAgICAgICBibG9jay0+Y291bnQsCisgICAgICAgIHNpemVvZigga21wX2Vudl92YXJfdCApLAorICAgICAgICAoIGludCAoICogKSggdm9pZCBjb25zdCAqLCB2b2lkIGNvbnN0ICogKSApICYgX19fa21wX2Vudl92YXJfY21wCisgICAgKTsKKworfSAvLyBfX2ttcF9lbnZfYmxvY2tfc29ydAorCisKKwordm9pZAorX19rbXBfZW52X2Jsa19mcmVlKAorICAgIGttcF9lbnZfYmxrX3QgKiBibG9jayAgLy8gTTogQmxvY2sgb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIGZyZWUuCispIHsKKworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSBibG9jay0+dmFycyApOworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSBibG9jay0+YnVsayApOworCisgICAgYmxvY2stPmNvdW50ID0gMDsKKyAgICBibG9jay0+dmFycyAgPSBOVUxMOworICAgIGJsb2NrLT5idWxrICA9IE5VTEw7CisKK30gLy8gX19rbXBfZW52X2Jsa19mcmVlCisKKworCitjaGFyIGNvbnN0ICogICAgICAgICAgICAgICAvLyBSOiBWYWx1ZSBvZiB2YXJpYWJsZSBvciBOVUxMIGlmIHZhcmlhYmxlIGRvZXMgbm90IGV4aXN0LgorX19rbXBfZW52X2Jsa192YXIoCisgICAga21wX2Vudl9ibGtfdCAqIGJsb2NrLCAvLyBJOiBCbG9jayBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCisgICAgY2hhciBjb25zdCAqICAgIG5hbWUgICAvLyBJOiBOYW1lIG9mIHZhcmlhYmxlIHRvIGZpbmQuCispIHsKKworICAgIGludCBpOworICAgIGZvciAoIGkgPSAwOyBpIDwgYmxvY2stPmNvdW50OyArKyBpICkgeworICAgICAgICBpZiAoIHN0cmNtcCggYmxvY2stPnZhcnNbIGkgXS5uYW1lLCBuYW1lICkgPT0gMCApIHsKKyAgICAgICAgICAgIHJldHVybiBibG9jay0+dmFyc1sgaSBdLnZhbHVlOworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGZvcgorICAgIHJldHVybiBOVUxMOworCit9IC8vIF9fa21wX2Vudl9ibG9ja192YXIKKworCisvLyBlbmQgb2YgZmlsZSAvLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2Vudmlyb25tZW50LmggYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZW52aXJvbm1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmMyZWM0Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2Vudmlyb25tZW50LmgKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIGttcF9lbnZpcm9ubWVudC5oIC0tIEhhbmRsZSBlbnZpcm9ubWVudCB2YXJvaWFibGVzIE9TLWluZGVwZW5kZW50bHkuCisgKiAkUmV2aXNpb246IDQyMDYxICQKKyAqICREYXRlOiAyMDEzLTAyLTI4IDE2OjM2OjI0IC0wNjAwIChUaHUsIDI4IEZlYiAyMDEzKSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX0VOVklST05NRU5UX0gKKyNkZWZpbmUgS01QX0VOVklST05NRU5UX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLyBSZXR1cm4gYSBjb3B5IG9mIHRoZSB2YWx1ZSBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciBOVUxMIGlmIHRoZSB2YXJpYWJsZSBkb2VzIG5vdCBleGlzdC4KKy8vICpOb3RlKjogUmV0dXJuZWQgcG9pbnRlZCAqbXVzdCogYmUgZnJlZWQgYWZ0ZXIgdXNlIHdpdGggX19rbXBfZW52X2ZyZWUoKS4KK2NoYXIgKiBfX2ttcF9lbnZfZ2V0KCBjaGFyIGNvbnN0ICogbmFtZSApOwordm9pZCAgIF9fa21wX2Vudl9mcmVlKCBjaGFyIGNvbnN0ICogKiB2YWx1ZSApOworCisvLyBSZXR1cm4gMSBpZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgZXhpc3RzIG9yIDAgaWYgZG9lcyBub3QgZXhpc3QuCitpbnQgX19rbXBfZW52X2V4aXN0cyggY2hhciBjb25zdCAqIG5hbWUgKTsKKworLy8gU2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS4KK3ZvaWQgX19rbXBfZW52X3NldCggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgaW50IG92ZXJ3cml0ZSApOworCisvLyBVbnNldCAocmVtb3ZlKSBlbnZpcm9ubWVudCB2YXJpYWJsZS4KK3ZvaWQgX19rbXBfZW52X3Vuc2V0KCBjaGFyIGNvbnN0ICogbmFtZSApOworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBXb3JraW5nIHdpdGggZW52aXJvbm1lbnQgYmxvY2tzLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKgorICAgIGttcF9lbnZfYmxrX3QgaXMgcmVhZC1vbmx5IGNvbGxlY3Rpb24gb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzIChvciBlbnZpcm9ubWVudC1saWtlKS4gVXNhZ2U6CisKKyAgICAgICAga21wX2Vudl9ibGtfdCBibG9jazsKKyAgICAgICAgX19rbXBfZW52X2Jsa19pbml0KCAmIGJsb2NrLCBOVUxMICk7IC8vIEluaXRpYWxpemUgYmxvY2sgZnJvbSBwcm9jZXNzIGVudmlyb25tZW50LgorICAgICAgICAvLyBvcgorICAgICAgICBfX2ttcF9lbnZfYmxrX2luaXQoICYgYmxvY2ssICJLTVBfV0FSTklORz0xfEtNUF9BRkZJTklUWT1ub25lIiApOyAvLyBmcm9tIHN0cmluZy4KKyAgICAgICAgX19rbXBfZW52X2Jsa19zb3J0KCAmIGJsb2NrICk7IC8vIE9wdGlvbmFsbHksIHNvcnQgbGlzdC4KKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCBibG9jay5jb3VudDsgKysgaSApIHsKKyAgICAgICAgICAgIC8vIFByb2Nlc3MgYmxvY2sudmFyc1sgaSBdLm5hbWUgYW5kIGJsb2NrLnZhcnNbIGkgXS52YWx1ZS4uLgorICAgICAgICB9OyAvLyBmb3IgaQorICAgICAgICBfX2ttcF9lbnZfYmxvY2tfZnJlZSggJiBibG9jayApOworKi8KKworc3RydWN0IF9fa21wX2Vudl92YXIgeworICAgIGNoYXIgY29uc3QgKiBuYW1lOworICAgIGNoYXIgY29uc3QgKiB2YWx1ZTsKK307Cit0eXBlZGVmIHN0cnVjdCBfX2ttcF9lbnZfdmFyIGttcF9lbnZfdmFyX3Q7CisKK3N0cnVjdCBfX2ttcF9lbnZfYmxrIHsKKyAgICBjaGFyIGNvbnN0ICogICAgICAgICAgYnVsazsKKyAgICBrbXBfZW52X3Zhcl90IGNvbnN0ICogdmFyczsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgY291bnQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgX19rbXBfZW52X2JsayBrbXBfZW52X2Jsa190OworCit2b2lkICAgICAgICAgX19rbXBfZW52X2Jsa19pbml0KCBrbXBfZW52X2Jsa190ICogYmxvY2ssIGNoYXIgY29uc3QgKiBidWxrICk7Cit2b2lkICAgICAgICAgX19rbXBfZW52X2Jsa19mcmVlKCBrbXBfZW52X2Jsa190ICogYmxvY2sgKTsKK3ZvaWQgICAgICAgICBfX2ttcF9lbnZfYmxrX3NvcnQoIGttcF9lbnZfYmxrX3QgKiBibG9jayApOworY2hhciBjb25zdCAqIF9fa21wX2Vudl9ibGtfdmFyKCAga21wX2Vudl9ibGtfdCAqIGJsb2NrLCBjaGFyIGNvbnN0ICogbmFtZSApOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX0VOVklST05NRU5UX0gKKworLy8gZW5kIG9mIGZpbGUgLy8KKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2Vycm9yLmMgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZXJyb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWExNzI4Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2Vycm9yLmMKQEAgLTAsMCArMSw1MjYgQEAKKy8qIAorICoga21wX2Vycm9yLmMgLS0gS1BUUyBmdW5jdGlvbnMgZm9yIGVycm9yIGNoZWNraW5nIGF0IHJ1bnRpbWUKKyAqICRSZXZpc2lvbjogNDIwNjEgJAorICogJERhdGU6IDIwMTMtMDItMjggMTY6MzY6MjQgLTA2MDAgKFRodSwgMjggRmViIDIwMTMpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9pMThuLmgiCisjaW5jbHVkZSAia21wX3N0ci5oIgorI2luY2x1ZGUgImttcF9lcnJvci5oIgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIE1JTl9TVEFDSyAgICAgICAxMDAKKworc3RhdGljIGNoYXIgY29uc3QgKiBjb25zX3RleHRfZm9ydFtdID0geworICAgICIobm9uZSkiLAorICAgICJQQVJBTExFTCIsCisgICAgIndvcmstc2hhcmluZyIsICAgICAgICAgICAgIC8qIHRoaXMgaXMgbm90IGNhbGxlZCBETyBiZWNhdXNlIG9mIGxvd2VyaW5nIG9mIFNFQ1RJT05TIGFuZCBXT1JLU0hBUkUgZGlyZWN0aXZlcyAqLworICAgICJPUkRFUkVEIHdvcmstc2hhcmluZyIsICAgICAvKiB0aGlzIGlzIG5vdCBjYWxsZWQgRE8gT1JERVJFRCBiZWNhdXNlIG9mIGxvd2VyaW5nIG9mIFNFQ1RJT05TIGRpcmVjdGl2ZXMgKi8KKyAgICAiU0VDVElPTlMiLAorICAgICJ3b3JrLXNoYXJpbmciLCAgICAgICAgICAgICAvKiB0aGlzIGlzIG5vdCBjYWxsZWQgU0lOR0xFIGJlY2F1c2Ugb2YgbG93ZXJpbmcgb2YgU0VDVElPTlMgYW5kIFdPUktTSEFSRSBkaXJlY3RpdmVzICovCisgICAgIlRBU0tRIiwKKyAgICAiVEFTS1EiLAorICAgICJUQVNLUSBPUkRFUkVEIiwKKyAgICAiQ1JJVElDQUwiLAorICAgICJPUkRFUkVEIiwgICAgICAgICAgICAgICAgICAvKiBpbiBQQVJBTExFTCAqLworICAgICJPUkRFUkVEIiwgICAgICAgICAgICAgICAgICAvKiBpbiBQRE8gKi8KKyAgICAiT1JERVJFRCIsICAgICAgICAgICAgICAgICAgLyogaW4gVEFTS1EgKi8KKyAgICAiTUFTVEVSIiwKKyAgICAiUkVEVUNFIiwKKyAgICAiQkFSUklFUiIKK307CisKK3N0YXRpYyBjaGFyIGNvbnN0ICogY29uc190ZXh0X2NbXSA9IHsKKyAgICAiKG5vbmUpIiwKKyAgICAiXCJwYXJhbGxlbFwiIiwKKyAgICAid29yay1zaGFyaW5nIiwgICAgICAgICAgICAgLyogdGhpcyBpcyBub3QgY2FsbGVkICJmb3IiIGJlY2F1c2Ugb2YgbG93ZXJpbmcgb2YgInNlY3Rpb25zIiBwcmFnbWFzICovCisgICAgIlwib3JkZXJlZFwiIHdvcmstc2hhcmluZyIsIC8qIHRoaXMgaXMgbm90IGNhbGxlZCAiZm9yIG9yZGVyZWQiIGJlY2F1c2Ugb2YgbG93ZXJpbmcgb2YgInNlY3Rpb25zIiBwcmFnbWFzICovCisgICAgIlwic2VjdGlvbnNcIiIsCisgICAgIndvcmstc2hhcmluZyIsICAgICAgICAgICAgIC8qIHRoaXMgaXMgbm90IGNhbGxlZCAic2luZ2xlIiBiZWNhdXNlIG9mIGxvd2VyaW5nIG9mICJzZWN0aW9ucyIgcHJhZ21hcyAqLworICAgICJcInRhc2txXCIiLAorICAgICJcInRhc2txXCIiLAorICAgICJcInRhc2txIG9yZGVyZWRcIiIsCisgICAgIlwiY3JpdGljYWxcIiIsCisgICAgIlwib3JkZXJlZFwiIiwgICAgICAgICAgICAgIC8qIGluIFBBUkFMTEVMICovCisgICAgIlwib3JkZXJlZFwiIiwgICAgICAgICAgICAgIC8qIGluIFBETyAqLworICAgICJcIm9yZGVyZWRcIiIsICAgICAgICAgICAgICAvKiBpbiBUQVNLUSAqLworICAgICJcIm1hc3RlclwiIiwKKyAgICAiXCJyZWR1Y2VcIiIsCisgICAgIlwiYmFycmllclwiIgorfTsKKworI2RlZmluZSBnZXRfc3JjKCBpZGVudCApICAgKCAoaWRlbnQpID09IE5VTEwgPyBOVUxMIDogKGlkZW50KS0+cHNvdXJjZSApCisKKyNkZWZpbmUgUFVTSF9NU0coIGN0LCBpZGVudCApIFwKKyAgICAiXHRwdXNoaW5nIG9uIHN0YWNrOiAlcyAoJXMpXG4iLCBjb25zX3RleHRfY1sgKGN0KSBdLCBnZXRfc3JjKCAoaWRlbnQpICkKKyNkZWZpbmUgUE9QX01TRyggcCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiXHRwb3BwaW5nIG9mZiBzdGFjazogJXMgKCVzKVxuIiwgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zX3RleHRfY1sgKHApLT5zdGFja19kYXRhWyB0b3MgXS50eXBlIF0sICAgICAgIFwKKyAgICBnZXRfc3JjKCAocCktPnN0YWNrX2RhdGFbIHRvcyBdLmlkZW50ICkKKworc3RhdGljIGludCBjb25zdCBjb25zX3RleHRfZm9ydF9udW0gPSBzaXplb2YoIGNvbnNfdGV4dF9mb3J0ICkgLyBzaXplb2YoIGNoYXIgY29uc3QgKiApOworc3RhdGljIGludCBjb25zdCBjb25zX3RleHRfY19udW0gICAgPSBzaXplb2YoIGNvbnNfdGV4dF9jICAgICkgLyBzaXplb2YoIGNoYXIgY29uc3QgKiApOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLSBTVEFSVCBPRiBTVEFUSUMgTE9DQUwgUk9VVElORVMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkCitfX2ttcF9jaGVja19udWxsX2Z1bmMoIHZvaWQgKQoreworICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KK30KKworc3RhdGljIHZvaWQKK19fa21wX2V4cGFuZF9jb25zX3N0YWNrKCBpbnQgZ3RpZCwgc3RydWN0IGNvbnNfaGVhZGVyICpwICkKK3sKKyAgICBpbnQgICAgaTsKKyAgICBzdHJ1Y3QgY29uc19kYXRhICpkOworCisgICAgLyogVE9ETyBmb3IgbW9uaXRvciBwZXJoYXBzPyAqLworICAgIGlmIChndGlkIDwgMCkKKyAgICAgICAgX19rbXBfY2hlY2tfbnVsbF9mdW5jKCk7CisKKyAgICBLRV9UUkFDRSggMTAsICgiZXhwYW5kIGNvbnNfc3RhY2sgKCVkICVkKVxuIiwgZ3RpZCwgX19rbXBfZ2V0X2d0aWQoKSApICk7CisKKyAgICBkID0gcC0+c3RhY2tfZGF0YTsKKworICAgIHAtPnN0YWNrX3NpemUgPSAocC0+c3RhY2tfc2l6ZSAqIDIpICsgMTAwOworCisgICAgLyogVE9ETyBmcmVlIHRoZSBvbGQgZGF0YSAqLworICAgIHAtPnN0YWNrX2RhdGEgPSAoc3RydWN0IGNvbnNfZGF0YSAqKSBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKCBzdHJ1Y3QgY29uc19kYXRhICkgKiAocC0+c3RhY2tfc2l6ZSsxKSApOworCisgICAgZm9yIChpID0gcC0+c3RhY2tfdG9wOyBpID49IDA7IC0taSkKKyAgICAgICAgcC0+c3RhY2tfZGF0YVtpXSA9IGRbaV07CisKKyAgICAvKiBOT1RFOiB3ZSBkbyBub3QgZnJlZSB0aGUgb2xkIHN0YWNrX2RhdGEgKi8KK30KKworLy8gTk9URTogRnVuY3Rpb24gcmV0dXJucyBhbGxvY2F0ZWQgbWVtb3J5LCBjYWxsZXIgbXVzdCBmcmVlIGl0IQorc3RhdGljIGNoYXIgY29uc3QgKgorX19rbXBfcHJhZ21hKAorICAgIGVudW0gY29uc190eXBlICAgY3QsCisgICAgaWRlbnRfdCBjb25zdCAqICBpZGVudAorKSB7CisgICAgY2hhciBjb25zdCAqIGNvbnMgPSBOVUxMOyAgLy8gQ29uc3RydWN0IG5hbWUuCisgICAgY2hhciAqIGZpbGUgPSBOVUxMOyAgLy8gRmlsZSBuYW1lLgorICAgIGNoYXIgKiBmdW5jID0gTlVMTDsgIC8vIEZ1bmN0aW9uIChyb3V0aW5lKSBuYW1lLgorICAgIGNoYXIgKiBsaW5lID0gTlVMTDsgIC8vIExpbmUgbnVtYmVyLgorICAgIGttcF9zdHJfYnVmX3QgYnVmZmVyOworICAgIGttcF9tc2dfdCAgICAgcHJnbTsKKyAgICBfX2ttcF9zdHJfYnVmX2luaXQoICYgYnVmZmVyICk7CisgICAgaWYgKCAwIDwgY3QgJiYgY3QgPD0gY29uc190ZXh0X2NfbnVtICkgezsKKyAgICAgICAgY29ucyA9IGNvbnNfdGV4dF9jWyBjdCBdOworICAgIH0gZWxzZSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIDAgKTsKKyAgICB9OworICAgIGlmICggaWRlbnQgIT0gTlVMTCAmJiBpZGVudC0+cHNvdXJjZSAhPSBOVUxMICkgeworICAgICAgICBjaGFyICogdGFpbCA9IE5VTEw7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiJXMiLCBpZGVudC0+cHNvdXJjZSApOyAvLyBDb3B5IHNvdXJjZSB0byBidWZmZXIuCisgICAgICAgIC8vIFNwbGl0IHN0cmluZyBpbiBidWZmZXIgdG8gZmlsZSwgZnVuYywgYW5kIGxpbmUuCisgICAgICAgIHRhaWwgPSBidWZmZXIuc3RyOworICAgICAgICBfX2ttcF9zdHJfc3BsaXQoIHRhaWwsICc7JywgTlVMTCwgICAmIHRhaWwgKTsKKyAgICAgICAgX19rbXBfc3RyX3NwbGl0KCB0YWlsLCAnOycsICYgZmlsZSwgJiB0YWlsICk7CisgICAgICAgIF9fa21wX3N0cl9zcGxpdCggdGFpbCwgJzsnLCAmIGZ1bmMsICYgdGFpbCApOworICAgICAgICBfX2ttcF9zdHJfc3BsaXQoIHRhaWwsICc7JywgJiBsaW5lLCAmIHRhaWwgKTsKKyAgICB9OyAvLyBpZgorICAgIHByZ20gPSBfX2ttcF9tc2dfZm9ybWF0KCBrbXBfaTE4bl9mbXRfUHJhZ21hLCBjb25zLCBmaWxlLCBmdW5jLCBsaW5lICk7CisgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIGJ1ZmZlciApOworICAgIHJldHVybiBwcmdtLnN0cjsKK30gLy8gX19rbXBfcHJhZ21hCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0gRU5EIE9GIFNUQVRJQyBMT0NBTCBST1VUSU5FUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCit2b2lkCitfX2ttcF9lcnJvcl9jb25zdHJ1Y3QoCisgICAga21wX2kxOG5faWRfdCAgICBpZCwgICAgIC8vIE1lc3NhZ2UgaWRlbnRpZmllci4KKyAgICBlbnVtIGNvbnNfdHlwZSAgIGN0LCAgICAgLy8gQ29uc3RydWN0IHR5cGUuCisgICAgaWRlbnRfdCBjb25zdCAqICBpZGVudCAgIC8vIENvbnN0cnVjdCBpZGVudC4KKykgeworICAgIGNoYXIgY29uc3QgKiBjb25zdHJ1Y3QgPSBfX2ttcF9wcmFnbWEoIGN0LCBpZGVudCApOworICAgIF9fa21wX21zZygga21wX21zX2ZhdGFsLCBfX2ttcF9tc2dfZm9ybWF0KCBpZCwgY29uc3RydWN0ICksIF9fa21wX21zZ19udWxsICk7CisgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopIGNvbnN0cnVjdCApOworfQorCit2b2lkCitfX2ttcF9lcnJvcl9jb25zdHJ1Y3QyKAorICAgIGttcF9pMThuX2lkX3QgICAgICAgICAgICBpZCwgICAgIC8vIE1lc3NhZ2UgaWRlbnRpZmllci4KKyAgICBlbnVtIGNvbnNfdHlwZSAgICAgICAgICAgY3QsICAgICAvLyBGaXJzdCBjb25zdHJ1Y3QgdHlwZS4KKyAgICBpZGVudF90IGNvbnN0ICogICAgICAgICAgaWRlbnQsICAvLyBGaXJzdCBjb25zdHJ1Y3QgaWRlbnQuCisgICAgc3RydWN0IGNvbnNfZGF0YSBjb25zdCAqIGNvbnMgICAgLy8gU2Vjb25kIGNvbnN0cnVjdC4KKykgeworICAgIGNoYXIgY29uc3QgKiBjb25zdHJ1Y3QxID0gX19rbXBfcHJhZ21hKCBjdCwgaWRlbnQgKTsKKyAgICBjaGFyIGNvbnN0ICogY29uc3RydWN0MiA9IF9fa21wX3ByYWdtYSggY29ucy0+dHlwZSwgY29ucy0+aWRlbnQgKTsKKyAgICBfX2ttcF9tc2coIGttcF9tc19mYXRhbCwgX19rbXBfbXNnX2Zvcm1hdCggaWQsIGNvbnN0cnVjdDEsIGNvbnN0cnVjdDIgKSwgX19rbXBfbXNnX251bGwgKTsKKyAgICBLTVBfSU5URVJOQUxfRlJFRSggKHZvaWQgKikgY29uc3RydWN0MSApOworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSBjb25zdHJ1Y3QyICk7Cit9CisKKworc3RydWN0IGNvbnNfaGVhZGVyICoKK19fa21wX2FsbG9jYXRlX2NvbnNfc3RhY2soIGludCBndGlkICkKK3sKKyAgICBzdHJ1Y3QgY29uc19oZWFkZXIgKnA7CisKKyAgICAvKiBUT0RPIGZvciBtb25pdG9yIHBlcmhhcHM/ICovCisgICAgaWYgKCBndGlkIDwgMCApIHsKKyAgICAgICAgX19rbXBfY2hlY2tfbnVsbF9mdW5jKCk7CisgICAgfTsgLy8gaWYKKyAgICBLRV9UUkFDRSggMTAsICgiYWxsb2NhdGUgY29uc19zdGFjayAoJWQpXG4iLCBndGlkICkgKTsKKyAgICBwID0gKHN0cnVjdCBjb25zX2hlYWRlciAqKSBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKCBzdHJ1Y3QgY29uc19oZWFkZXIgKSApOworICAgIHAtPnBfdG9wID0gcC0+d190b3AgPSBwLT5zX3RvcCA9IDA7CisgICAgcC0+c3RhY2tfZGF0YSA9IChzdHJ1Y3QgY29uc19kYXRhICopIF9fa21wX2FsbG9jYXRlKCBzaXplb2YoIHN0cnVjdCBjb25zX2RhdGEgKSAqIChNSU5fU1RBQ0srMSkgKTsKKyAgICBwLT5zdGFja19zaXplID0gTUlOX1NUQUNLOworICAgIHAtPnN0YWNrX3RvcCAgPSAwOworICAgIHAtPnN0YWNrX2RhdGFbIDAgXS50eXBlID0gY3Rfbm9uZTsKKyAgICBwLT5zdGFja19kYXRhWyAwIF0ucHJldiA9IDA7CisgICAgcC0+c3RhY2tfZGF0YVsgMCBdLmlkZW50ID0gTlVMTDsKKyAgICByZXR1cm4gcDsKK30KKwordm9pZAorX19rbXBfZnJlZV9jb25zX3N0YWNrKCB2b2lkICogcHRyICkgeworICAgIHN0cnVjdCBjb25zX2hlYWRlciAqIHAgPSAoc3RydWN0IGNvbnNfaGVhZGVyICopIHB0cjsKKyAgICBpZiAoIHAgIT0gTlVMTCApIHsKKyAgICAgICAgaWYgKCBwLT5zdGFja19kYXRhICE9IE5VTEwgKSB7CisgICAgICAgICAgICBfX2ttcF9mcmVlKCBwLT5zdGFja19kYXRhICk7CisgICAgICAgICAgICBwLT5zdGFja19kYXRhID0gTlVMTDsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgX19rbXBfZnJlZSggcCApOworICAgIH07IC8vIGlmCit9CisKKworc3RhdGljIHZvaWQKK2R1bXBfY29uc19zdGFjayggaW50IGd0aWQsIHN0cnVjdCBjb25zX2hlYWRlciAqIHAgKSB7CisgICAgaW50IGk7CisgICAgaW50IHRvcyA9IHAtPnN0YWNrX3RvcDsKKyAgICBrbXBfc3RyX2J1Zl90IGJ1ZmZlcjsKKyAgICBfX2ttcF9zdHJfYnVmX2luaXQoICYgYnVmZmVyICk7CisgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIrLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstXG4iICk7CisgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICJCZWdpbiBjb25zdHJ1Y3Qgc3RhY2sgd2l0aCAlZCBpdGVtcyBmb3IgdGhyZWFkICVkXG4iLCB0b3MsIGd0aWQgKTsKKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIiAgICAgc3RhY2tfdG9wPSVkIHsgUD0lZCwgVz0lZCwgUz0lZCB9XG4iLCB0b3MsIHAtPnBfdG9wLCBwLT53X3RvcCwgcC0+c190b3AgKTsKKyAgICBmb3IgKCBpID0gdG9zOyBpID4gMDsgaS0tICkgeworICAgICAgICBzdHJ1Y3QgY29uc19kYXRhICogYyA9ICYgKCBwLT5zdGFja19kYXRhWyBpIF0gKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIgICAgICAgIHN0YWNrX2RhdGFbJTJkXSA9IHsgJXMgKCVzKSAlZCAlcCB9XG4iLCBpLCBjb25zX3RleHRfY1sgYy0+dHlwZSBdLCBnZXRfc3JjKCBjLT5pZGVudCApLCBjLT5wcmV2LCBjLT5uYW1lICk7CisgICAgfTsgLy8gZm9yIGkKKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIkVuZCBjb25zdHJ1Y3Qgc3RhY2sgZm9yIHRocmVhZCAlZFxuIiwgZ3RpZCApOworICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLVxuIiApOworICAgIF9fa21wX2RlYnVnX3ByaW50ZiggIiVzIiwgYnVmZmVyLnN0ciApOworICAgIF9fa21wX3N0cl9idWZfZnJlZSggJiBidWZmZXIgKTsKK30KKwordm9pZAorX19rbXBfcHVzaF9wYXJhbGxlbCggaW50IGd0aWQsIGlkZW50X3QgY29uc3QgKiBpZGVudCApCit7CisgICAgaW50IHRvczsKKyAgICBzdHJ1Y3QgY29uc19oZWFkZXIgKnAgPSBfX2ttcF90aHJlYWRzWyBndGlkIF0tPnRoLnRoX2NvbnM7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90aHJlYWRzWyBndGlkIF0tPiB0aC50aF9jb25zICk7CisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wX3B1c2hfcGFyYWxsZWwgKCVkICVkKVxuIiwgZ3RpZCwgX19rbXBfZ2V0X2d0aWQoKSApICk7CisgICAgS0VfVFJBQ0UoIDEwMCwgKCBQVVNIX01TRyggY3RfcGFyYWxsZWwsIGlkZW50ICkgKSApOworICAgIGlmICggcC0+c3RhY2tfdG9wID49IHAtPnN0YWNrX3NpemUgKSB7CisgICAgICAgIF9fa21wX2V4cGFuZF9jb25zX3N0YWNrKCBndGlkLCBwICk7CisgICAgfTsgLy8gaWYKKyAgICB0b3MgPSArK3AtPnN0YWNrX3RvcDsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS50eXBlID0gY3RfcGFyYWxsZWw7CisgICAgcC0+c3RhY2tfZGF0YVsgdG9zIF0ucHJldiA9IHAtPnBfdG9wOworICAgIHAtPnN0YWNrX2RhdGFbIHRvcyBdLmlkZW50ID0gaWRlbnQ7CisgICAgcC0+c3RhY2tfZGF0YVsgdG9zIF0ubmFtZSA9IE5VTEw7CisgICAgcC0+cF90b3AgPSB0b3M7CisgICAgS0VfRFVNUCggMTAwMCwgZHVtcF9jb25zX3N0YWNrKCBndGlkLCBwICkgKTsKK30KKwordm9pZAorX19rbXBfY2hlY2tfd29ya3NoYXJlKCBpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCApCit7CisgICAgc3RydWN0IGNvbnNfaGVhZGVyICpwID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9jb25zOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT4gdGgudGhfY29ucyApOworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcF9jaGVja193b3Jrc2hhcmUgKCVkICVkKVxuIiwgZ3RpZCwgX19rbXBfZ2V0X2d0aWQoKSApICk7CisKKworICAgIGlmICggcC0+c3RhY2tfdG9wID49IHAtPnN0YWNrX3NpemUgKSB7CisgICAgICAgIF9fa21wX2V4cGFuZF9jb25zX3N0YWNrKCBndGlkLCBwICk7CisgICAgfTsgLy8gaWYKKyAgICBpZiAoIHAtPndfdG9wID4gcC0+cF90b3AgJiYKKyAgICAgICAgIShJU19DT05TX1RZUEVfVEFTS1EocC0+c3RhY2tfZGF0YVsgcC0+d190b3AgXS50eXBlKSAmJiBJU19DT05TX1RZUEVfVEFTS1EoY3QpKSkgeworICAgICAgICAvLyBXZSBhcmUgYWxyZWFkeSBpbiBhIFdPUktTSEFSRSBjb25zdHJ1Y3QgZm9yIHRoaXMgUEFSQUxMRUwgcmVnaW9uLgorICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QyKCBrbXBfaTE4bl9tc2dfQ25zSW52YWxpZE5lc3RpbmcsIGN0LCBpZGVudCwgJiBwLT5zdGFja19kYXRhWyBwLT53X3RvcCBdICk7CisgICAgfTsgLy8gaWYKKyAgICBpZiAoIHAtPnNfdG9wID4gcC0+cF90b3AgKSB7CisgICAgICAgIC8vIFdlIGFyZSBhbHJlYWR5IGluIGEgU1lOQyBjb25zdHJ1Y3QgZm9yIHRoaXMgUEFSQUxMRUwgcmVnaW9uLgorICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QyKCBrbXBfaTE4bl9tc2dfQ25zSW52YWxpZE5lc3RpbmcsIGN0LCBpZGVudCwgJiBwLT5zdGFja19kYXRhWyBwLT5zX3RvcCBdICk7CisgICAgfTsgLy8gaWYKK30KKwordm9pZAorX19rbXBfcHVzaF93b3Jrc2hhcmUoIGludCBndGlkLCBlbnVtIGNvbnNfdHlwZSBjdCwgaWRlbnRfdCBjb25zdCAqIGlkZW50ICkKK3sKKyAgICBpbnQgICAgICAgICB0b3M7CisgICAgc3RydWN0IGNvbnNfaGVhZGVyICpwID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9jb25zOworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcF9wdXNoX3dvcmtzaGFyZSAoJWQgJWQpXG4iLCBndGlkLCBfX2ttcF9nZXRfZ3RpZCgpICkgKTsKKyAgICBfX2ttcF9jaGVja193b3Jrc2hhcmUoIGd0aWQsIGN0LCBpZGVudCApOworICAgIEtFX1RSQUNFKCAxMDAsICggUFVTSF9NU0coIGN0LCBpZGVudCApICkgKTsKKyAgICB0b3MgPSArK3AtPnN0YWNrX3RvcDsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS50eXBlID0gY3Q7CisgICAgcC0+c3RhY2tfZGF0YVsgdG9zIF0ucHJldiA9IHAtPndfdG9wOworICAgIHAtPnN0YWNrX2RhdGFbIHRvcyBdLmlkZW50ID0gaWRlbnQ7CisgICAgcC0+c3RhY2tfZGF0YVsgdG9zIF0ubmFtZSA9IE5VTEw7CisgICAgcC0+d190b3AgPSB0b3M7CisgICAgS0VfRFVNUCggMTAwMCwgZHVtcF9jb25zX3N0YWNrKCBndGlkLCBwICkgKTsKK30KKwordm9pZAorX19rbXBfY2hlY2tfc3luYyggaW50IGd0aWQsIGVudW0gY29uc190eXBlIGN0LCBpZGVudF90IGNvbnN0ICogaWRlbnQsIGttcF91c2VyX2xvY2tfcCBsY2sgKQoreworICAgIHN0cnVjdCBjb25zX2hlYWRlciAqcCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXS0+dGgudGhfY29uczsKKworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcF9jaGVja19zeW5jIChndGlkPSVkKVxuIiwgX19rbXBfZ2V0X2d0aWQoKSApICk7CisKKyAgICBpZiAocC0+c3RhY2tfdG9wID49IHAtPnN0YWNrX3NpemUpCisgICAgICAgX19rbXBfZXhwYW5kX2NvbnNfc3RhY2soIGd0aWQsIHAgKTsKKworICAgIGlmIChjdCA9PSBjdF9vcmRlcmVkX2luX3BhcmFsbGVsIHx8IGN0ID09IGN0X29yZGVyZWRfaW5fcGRvIHx8IGN0ID09IGN0X29yZGVyZWRfaW5fdGFza3EgKSB7CisgICAgICAgIGlmIChwLT53X3RvcCA8PSBwLT5wX3RvcCkgeworICAgICAgICAgICAgLyogd2UgYXJlIG5vdCBpbiBhIHdvcmtzaGFyaW5nIGNvbnN0cnVjdCAqLworICAgICAgICAgICAgI2lmZGVmIEJVSUxEX1BBUkFMTEVMX09SREVSRUQKKyAgICAgICAgICAgICAgICAvKiBkbyBub3QgcmVwb3J0IGVycm9yIG1lc3NhZ2VzIGZvciBQQVJBTExFTCBPUkRFUkVEICovCisgICAgICAgICAgICAgICAgS01QX0FTU0VSVCggY3QgPT0gY3Rfb3JkZXJlZF9pbl9wYXJhbGxlbCApOworICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QoIGttcF9pMThuX21zZ19DbnNCb3VuZFRvV29ya3NoYXJpbmcsIGN0LCBpZGVudCApOworICAgICAgICAgICAgI2VuZGlmIC8qIEJVSUxEX1BBUkFMTEVMX09SREVSRUQgKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIGluc2lkZSBhIFdPUktTSEFSSU5HIGNvbnN0cnVjdCBmb3IgdGhpcyBQQVJBTExFTCByZWdpb24gKi8KKyAgICAgICAgICAgIGlmICghSVNfQ09OU19UWVBFX09SREVSRUQocC0+c3RhY2tfZGF0YVsgcC0+d190b3AgXS50eXBlKSkgeworICAgICAgICAgICAgICAgIGlmIChwLT5zdGFja19kYXRhWyBwLT53X3RvcCBdLnR5cGUgPT0gY3RfdGFza3EpIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0MigKKyAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pMThuX21zZ19DbnNOb3RJblRhc2tDb25zdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICBjdCwgaWRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAmIHAtPnN0YWNrX2RhdGFbIHAtPndfdG9wIF0KKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QyKAorICAgICAgICAgICAgICAgICAgICAgICAga21wX2kxOG5fbXNnX0Nuc05vT3JkZXJlZENsYXVzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGN0LCBpZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICYgcC0+c3RhY2tfZGF0YVsgcC0+d190b3AgXQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChwLT5zX3RvcCA+IHAtPnBfdG9wICYmIHAtPnNfdG9wID4gcC0+d190b3ApIHsKKyAgICAgICAgICAgIC8qIGluc2lkZSBhIHN5bmMgY29uc3RydWN0IHdoaWNoIGlzIGluc2lkZSBhIHdvcmtzaGFyaW5nIGNvbnN0cnVjdCAqLworICAgICAgICAgICAgaW50IGluZGV4ID0gcC0+c190b3A7CisgICAgICAgICAgICBlbnVtIGNvbnNfdHlwZSBzdGFja190eXBlOworCisgICAgICAgICAgICBzdGFja190eXBlID0gcC0+c3RhY2tfZGF0YVsgaW5kZXggXS50eXBlOworCisgICAgICAgICAgICBpZiAoc3RhY2tfdHlwZSA9PSBjdF9jcml0aWNhbCB8fAorICAgICAgICAgICAgICAgICggKCBzdGFja190eXBlID09IGN0X29yZGVyZWRfaW5fcGFyYWxsZWwgfHwKKyAgICAgICAgICAgICAgICAgICAgc3RhY2tfdHlwZSA9PSBjdF9vcmRlcmVkX2luX3BkbyAgICAgIHx8CisgICAgICAgICAgICAgICAgICAgIHN0YWNrX3R5cGUgPT0gY3Rfb3JkZXJlZF9pbl90YXNrcSAgKSAmJiAgICAgLyogQyBkb2Vzbid0IGFsbG93IG5hbWVkIG9yZGVyZWQ7IG9yZGVyZWQgaW4gb3JkZXJlZCBnZXRzIGVycm9yICovCisgICAgICAgICAgICAgICAgIHAtPnN0YWNrX2RhdGFbIGluZGV4IF0uaWRlbnQgIT0gTlVMTCAmJgorICAgICAgICAgICAgICAgICAocC0+c3RhY2tfZGF0YVsgaW5kZXggXS5pZGVudC0+ZmxhZ3MgJiBLTVBfSURFTlRfS01QQyApKSkgeworICAgICAgICAgICAgICAgIC8qIHdlIGFyZSBpbiBPUkRFUkVEIHdoaWNoIGlzIGluc2lkZSBhbiBPUkRFUkVEIG9yIENSSVRJQ0FMIGNvbnN0cnVjdCAqLworICAgICAgICAgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdDIoCisgICAgICAgICAgICAgICAgICAgIGttcF9pMThuX21zZ19DbnNJbnZhbGlkTmVzdGluZywKKyAgICAgICAgICAgICAgICAgICAgY3QsIGlkZW50LAorICAgICAgICAgICAgICAgICAgICAmIHAtPnN0YWNrX2RhdGFbIGluZGV4IF0KKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIGlmICggY3QgPT0gY3RfY3JpdGljYWwgKSB7CisgICAgICAgIGlmICggbGNrICE9IE5VTEwgJiYgX19rbXBfZ2V0X3VzZXJfbG9ja19vd25lciggbGNrICkgPT0gZ3RpZCApIHsgICAgLyogdGhpcyBzYW1lIHRocmVhZCBhbHJlYWR5IGhhcyBsb2NrIGZvciB0aGlzIGNyaXRpY2FsIHNlY3Rpb24gKi8KKyAgICAgICAgICAgIGludCBpbmRleCA9IHAtPnNfdG9wOworICAgICAgICAgICAgc3RydWN0IGNvbnNfZGF0YSBjb25zID0geyBOVUxMLCBjdF9jcml0aWNhbCwgMCwgTlVMTCB9OworICAgICAgICAgICAgLyogd2FsayB1cCBjb25zdHJ1Y3Qgc3RhY2sgYW5kIHRyeSB0byBmaW5kIGNyaXRpY2FsIHdpdGggbWF0Y2hpbmcgbmFtZSAqLworICAgICAgICAgICAgd2hpbGUgKCBpbmRleCAhPSAwICYmIHAtPnN0YWNrX2RhdGFbIGluZGV4IF0ubmFtZSAhPSBsY2sgKSB7CisgICAgICAgICAgICAgICAgaW5kZXggPSBwLT5zdGFja19kYXRhWyBpbmRleCBdLnByZXY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGluZGV4ICE9IDAgKSB7CisgICAgICAgICAgICAgICAgLyogZm91bmQgbWF0Y2ggb24gdGhlIHN0YWNrIChtYXkgbm90IGFsd2F5cyBiZWNhdXNlIG9mIGludGVybGVhdmVkIGNyaXRpY2FsIGZvciBGb3J0cmFuKSAqLworICAgICAgICAgICAgICAgIGNvbnMgPSBwLT5zdGFja19kYXRhWyBpbmRleCBdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogd2UgYXJlIGluIENSSVRJQ0FMIHdoaWNoIGlzIGluc2lkZSBhIENSSVRJQ0FMIGNvbnN0cnVjdCBvZiB0aGUgc2FtZSBuYW1lICovCisgICAgICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QyKCBrbXBfaTE4bl9tc2dfQ25zTmVzdGluZ1NhbWVOYW1lLCBjdCwgaWRlbnQsICYgY29ucyApOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICggY3QgPT0gY3RfbWFzdGVyIHx8IGN0ID09IGN0X3JlZHVjZSApIHsKKyAgICAgICAgaWYgKHAtPndfdG9wID4gcC0+cF90b3ApIHsKKyAgICAgICAgICAgIC8qIGluc2lkZSBhIFdPUktTSEFSSU5HIGNvbnN0cnVjdCBmb3IgdGhpcyBQQVJBTExFTCByZWdpb24gKi8KKyAgICAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0MigKKyAgICAgICAgICAgICAgIGttcF9pMThuX21zZ19DbnNJbnZhbGlkTmVzdGluZywKKyAgICAgICAgICAgICAgIGN0LCBpZGVudCwKKyAgICAgICAgICAgICAgICYgcC0+c3RhY2tfZGF0YVsgcC0+d190b3AgXQorICAgICAgICAgICApOworICAgICAgICB9CisgICAgICAgIGlmIChjdCA9PSBjdF9yZWR1Y2UgJiYgcC0+c190b3AgPiBwLT5wX3RvcCkgeworICAgICAgICAgICAgLyogaW5zaWRlIGEgYW5vdGhlciBTWU5DIGNvbnN0cnVjdCBmb3IgdGhpcyBQQVJBTExFTCByZWdpb24gKi8KKyAgICAgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdDIoCisgICAgICAgICAgICAgICAga21wX2kxOG5fbXNnX0Nuc0ludmFsaWROZXN0aW5nLAorICAgICAgICAgICAgICAgIGN0LCBpZGVudCwKKyAgICAgICAgICAgICAgICAmIHAtPnN0YWNrX2RhdGFbIHAtPnNfdG9wIF0KKyAgICAgICAgICAgICk7CisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gaWYKK30KKwordm9pZAorX19rbXBfcHVzaF9zeW5jKCBpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCwga21wX3VzZXJfbG9ja19wIGxjayApCit7CisgICAgaW50ICAgICAgICAgdG9zOworICAgIHN0cnVjdCBjb25zX2hlYWRlciAqcCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXS0+dGgudGhfY29uczsKKworICAgIEtNUF9BU1NFUlQoIGd0aWQgPT0gX19rbXBfZ2V0X2d0aWQoKSApOworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcF9wdXNoX3N5bmMgKGd0aWQ9JWQpXG4iLCBndGlkICkgKTsKKyAgICBfX2ttcF9jaGVja19zeW5jKCBndGlkLCBjdCwgaWRlbnQsIGxjayApOworICAgIEtFX1RSQUNFKCAxMDAsICggUFVTSF9NU0coIGN0LCBpZGVudCApICkgKTsKKyAgICB0b3MgPSArKyBwLT5zdGFja190b3A7CisgICAgcC0+c3RhY2tfZGF0YVsgdG9zIF0udHlwZSAgPSBjdDsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS5wcmV2ICA9IHAtPnNfdG9wOworICAgIHAtPnN0YWNrX2RhdGFbIHRvcyBdLmlkZW50ID0gaWRlbnQ7CisgICAgcC0+c3RhY2tfZGF0YVsgdG9zIF0ubmFtZSAgPSBsY2s7CisgICAgcC0+c190b3AgPSB0b3M7CisgICAgS0VfRFVNUCggMTAwMCwgZHVtcF9jb25zX3N0YWNrKCBndGlkLCBwICkgKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQKK19fa21wX3BvcF9wYXJhbGxlbCggaW50IGd0aWQsIGlkZW50X3QgY29uc3QgKiBpZGVudCApCit7CisgICAgaW50IHRvczsKKyAgICBzdHJ1Y3QgY29uc19oZWFkZXIgKnAgPSBfX2ttcF90aHJlYWRzWyBndGlkIF0tPnRoLnRoX2NvbnM7CisgICAgdG9zID0gcC0+c3RhY2tfdG9wOworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcF9wb3BfcGFyYWxsZWwgKCVkICVkKVxuIiwgZ3RpZCwgX19rbXBfZ2V0X2d0aWQoKSApICk7CisgICAgaWYgKCB0b3MgPT0gMCB8fCBwLT5wX3RvcCA9PSAwICkgeworICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QoIGttcF9pMThuX21zZ19DbnNEZXRlY3RlZEVuZCwgY3RfcGFyYWxsZWwsIGlkZW50ICk7CisgICAgfQorICAgIGlmICggdG9zICE9IHAtPnBfdG9wIHx8IHAtPnN0YWNrX2RhdGFbIHRvcyBdLnR5cGUgIT0gY3RfcGFyYWxsZWwgKSB7CisgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdDIoCisgICAgICAgICAgICBrbXBfaTE4bl9tc2dfQ25zRXhwZWN0ZWRFbmQsCisgICAgICAgICAgICBjdF9wYXJhbGxlbCwgaWRlbnQsCisgICAgICAgICAgICAmIHAtPnN0YWNrX2RhdGFbIHRvcyBdCisgICAgICAgICk7CisgICAgfQorICAgIEtFX1RSQUNFKCAxMDAsICggUE9QX01TRyggcCApICkgKTsKKyAgICBwLT5wX3RvcCA9IHAtPnN0YWNrX2RhdGFbIHRvcyBdLnByZXY7CisgICAgcC0+c3RhY2tfZGF0YVsgdG9zIF0udHlwZSA9IGN0X25vbmU7CisgICAgcC0+c3RhY2tfZGF0YVsgdG9zIF0uaWRlbnQgPSBOVUxMOworICAgIHAtPnN0YWNrX3RvcCA9IHRvcyAtIDE7CisgICAgS0VfRFVNUCggMTAwMCwgZHVtcF9jb25zX3N0YWNrKCBndGlkLCBwICkgKTsKK30KKworZW51bSBjb25zX3R5cGUKK19fa21wX3BvcF93b3Jrc2hhcmUoIGludCBndGlkLCBlbnVtIGNvbnNfdHlwZSBjdCwgaWRlbnRfdCBjb25zdCAqIGlkZW50ICkKK3sKKyAgICBpbnQgdG9zOworICAgIHN0cnVjdCBjb25zX2hlYWRlciAqcCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXS0+dGgudGhfY29uczsKKworICAgIHRvcyA9IHAtPnN0YWNrX3RvcDsKKyAgICBLRV9UUkFDRSggMTAsICgiX19rbXBfcG9wX3dvcmtzaGFyZSAoJWQgJWQpXG4iLCBndGlkLCBfX2ttcF9nZXRfZ3RpZCgpICkgKTsKKyAgICBpZiAoIHRvcyA9PSAwIHx8IHAtPndfdG9wID09IDAgKSB7CisgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdCgga21wX2kxOG5fbXNnX0Nuc0RldGVjdGVkRW5kLCBjdCwgaWRlbnQgKTsKKyAgICB9CisKKyAgICBpZiAoIHRvcyAhPSBwLT53X3RvcCB8fAorICAgICAgICAgKCBwLT5zdGFja19kYXRhWyB0b3MgXS50eXBlICE9IGN0ICYmCisgICAgICAgICAgLyogYmVsb3cgYXJlIHR3byBleGNlcHRpb25zIHRvIHRoZSBydWxlIHRoYXQgY29uc3RydWN0IHR5cGVzIG11c3QgbWF0Y2ggKi8KKyAgICAgICAgICAhICggcC0+c3RhY2tfZGF0YVsgdG9zIF0udHlwZSA9PSBjdF9wZG9fb3JkZXJlZCAmJiBjdCA9PSBjdF9wZG8gKSAmJgorICAgICAgICAgICEgKCBwLT5zdGFja19kYXRhWyB0b3MgXS50eXBlID09IGN0X3Rhc2tfb3JkZXJlZCAmJiBjdCA9PSBjdF90YXNrICkKKyAgICAgICAgICkKKyAgICAgICApIHsKKyAgICAgICAgX19rbXBfY2hlY2tfbnVsbF9mdW5jKCk7CisgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdDIoCisgICAgICAgICAgICBrbXBfaTE4bl9tc2dfQ25zRXhwZWN0ZWRFbmQsCisgICAgICAgICAgICBjdCwgaWRlbnQsCisgICAgICAgICAgICAmIHAtPnN0YWNrX2RhdGFbIHRvcyBdCisgICAgICAgICk7CisgICAgfQorICAgIEtFX1RSQUNFKCAxMDAsICggUE9QX01TRyggcCApICkgKTsKKyAgICBwLT53X3RvcCA9IHAtPnN0YWNrX2RhdGFbIHRvcyBdLnByZXY7CisgICAgcC0+c3RhY2tfZGF0YVsgdG9zIF0udHlwZSA9IGN0X25vbmU7CisgICAgcC0+c3RhY2tfZGF0YVsgdG9zIF0uaWRlbnQgPSBOVUxMOworICAgIHAtPnN0YWNrX3RvcCA9IHRvcyAtIDE7CisgICAgS0VfRFVNUCggMTAwMCwgZHVtcF9jb25zX3N0YWNrKCBndGlkLCBwICkgKTsKKyAgICByZXR1cm4gcC0+c3RhY2tfZGF0YVsgcC0+d190b3AgXS50eXBlOworfQorCit2b2lkCitfX2ttcF9wb3Bfc3luYyggaW50IGd0aWQsIGVudW0gY29uc190eXBlIGN0LCBpZGVudF90IGNvbnN0ICogaWRlbnQgKQoreworICAgIGludCB0b3M7CisgICAgc3RydWN0IGNvbnNfaGVhZGVyICpwID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9jb25zOworICAgIHRvcyA9IHAtPnN0YWNrX3RvcDsKKyAgICBLRV9UUkFDRSggMTAsICgiX19rbXBfcG9wX3N5bmMgKCVkICVkKVxuIiwgZ3RpZCwgX19rbXBfZ2V0X2d0aWQoKSApICk7CisgICAgaWYgKCB0b3MgPT0gMCB8fCBwLT5zX3RvcCA9PSAwICkgeworICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QoIGttcF9pMThuX21zZ19DbnNEZXRlY3RlZEVuZCwgY3QsIGlkZW50ICk7CisgICAgfTsKKyAgICBpZiAoIHRvcyAhPSBwLT5zX3RvcCB8fCBwLT5zdGFja19kYXRhWyB0b3MgXS50eXBlICE9IGN0ICkgeworICAgICAgICBfX2ttcF9jaGVja19udWxsX2Z1bmMoKTsKKyAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0MigKKyAgICAgICAgICAgIGttcF9pMThuX21zZ19DbnNFeHBlY3RlZEVuZCwKKyAgICAgICAgICAgIGN0LCBpZGVudCwKKyAgICAgICAgICAgICYgcC0+c3RhY2tfZGF0YVsgdG9zIF0KKyAgICAgICAgKTsKKyAgICB9OworICAgIGlmICggZ3RpZCA8IDAgKSB7CisgICAgICAgIF9fa21wX2NoZWNrX251bGxfZnVuYygpOworICAgIH07CisgICAgS0VfVFJBQ0UoIDEwMCwgKCBQT1BfTVNHKCBwICkgKSApOworICAgIHAtPnNfdG9wID0gcC0+c3RhY2tfZGF0YVsgdG9zIF0ucHJldjsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS50eXBlID0gY3Rfbm9uZTsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS5pZGVudCA9IE5VTEw7CisgICAgcC0+c3RhY2tfdG9wID0gdG9zIC0gMTsKKyAgICBLRV9EVU1QKCAxMDAwLCBkdW1wX2NvbnNfc3RhY2soIGd0aWQsIHAgKSApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAorX19rbXBfY2hlY2tfYmFycmllciggaW50IGd0aWQsIGVudW0gY29uc190eXBlIGN0LCBpZGVudF90IGNvbnN0ICogaWRlbnQgKQoreworICAgIHN0cnVjdCBjb25zX2hlYWRlciAqcCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXS0+dGgudGhfY29uczsKKyAgICBLRV9UUkFDRSggMTAsICgiX19rbXBfY2hlY2tfYmFycmllciAobG9jOiAlcCwgZ3RpZDogJWQgJWQpXG4iLCBpZGVudCwgZ3RpZCwgX19rbXBfZ2V0X2d0aWQoKSApICk7CisgICAgaWYgKCBpZGVudCAhPSAwICkgeworICAgICAgICBfX2ttcF9jaGVja19udWxsX2Z1bmMoKTsKKyAgICB9CisgICAgaWYgKCBwLT53X3RvcCA+IHAtPnBfdG9wICkgeworICAgICAgICAvKiB3ZSBhcmUgYWxyZWFkeSBpbiBhIFdPUktTSEFSSU5HIGNvbnN0cnVjdCBmb3IgdGhpcyBQQVJBTExFTCByZWdpb24gKi8KKyAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0MigKKyAgICAgICAgICAgIGttcF9pMThuX21zZ19DbnNJbnZhbGlkTmVzdGluZywKKyAgICAgICAgICAgIGN0LCBpZGVudCwKKyAgICAgICAgICAgICYgcC0+c3RhY2tfZGF0YVsgcC0+d190b3AgXQorICAgICAgICApOworICAgIH0KKyAgICBpZiAocC0+c190b3AgPiBwLT5wX3RvcCkgeworICAgICAgICAvKiB3ZSBhcmUgYWxyZWFkeSBpbiBhIFNZTkMgY29uc3RydWN0IGZvciB0aGlzIFBBUkFMTEVMIHJlZ2lvbiAqLworICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QyKAorICAgICAgICAgICAga21wX2kxOG5fbXNnX0Nuc0ludmFsaWROZXN0aW5nLAorICAgICAgICAgICAgY3QsIGlkZW50LAorICAgICAgICAgICAgJiBwLT5zdGFja19kYXRhWyBwLT5zX3RvcCBdCisgICAgICAgICk7CisgICAgfQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2Vycm9yLmggYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZXJyb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDAwYjJhCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2Vycm9yLmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIGttcF9lcnJvci5oIC0tIFBUUyBmdW5jdGlvbnMgZm9yIGVycm9yIGNoZWNraW5nIGF0IHJ1bnRpbWUuCisgKiAkUmV2aXNpb246IDQyMDYxICQKKyAqICREYXRlOiAyMDEzLTAyLTI4IDE2OjM2OjI0IC0wNjAwIChUaHUsIDI4IEZlYiAyMDEzKSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX0VSUk9SX0gKKyNkZWZpbmUgS01QX0VSUk9SX0gKKworI2luY2x1ZGUgImttcF9pMThuLmgiCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordm9pZCBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QoICBrbXBfaTE4bl9pZF90IGlkLCBlbnVtIGNvbnNfdHlwZSBjdCwgaWRlbnRfdCBjb25zdCAqIGlkZW50ICk7Cit2b2lkIF9fa21wX2Vycm9yX2NvbnN0cnVjdDIoIGttcF9pMThuX2lkX3QgaWQsIGVudW0gY29uc190eXBlIGN0LCBpZGVudF90IGNvbnN0ICogaWRlbnQsIHN0cnVjdCBjb25zX2RhdGEgY29uc3QgKiBjb25zICk7CisKK3N0cnVjdCBjb25zX2hlYWRlciAqIF9fa21wX2FsbG9jYXRlX2NvbnNfc3RhY2soIGludCBndGlkICk7Cit2b2lkICAgICAgICAgICAgICAgICBfX2ttcF9mcmVlX2NvbnNfc3RhY2soIHZvaWQgKiBwdHIgKTsKKwordm9pZCBfX2ttcF9wdXNoX3BhcmFsbGVsKCBpbnQgZ3RpZCwgaWRlbnRfdCBjb25zdCAqIGlkZW50ICk7Cit2b2lkIF9fa21wX3B1c2hfd29ya3NoYXJlKCBpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCApOwordm9pZCBfX2ttcF9wdXNoX3N5bmMoIGludCBndGlkLCBlbnVtIGNvbnNfdHlwZSBjdCwgaWRlbnRfdCBjb25zdCAqIGlkZW50LCBrbXBfdXNlcl9sb2NrX3AgbmFtZSApOworCit2b2lkIF9fa21wX2NoZWNrX3dvcmtzaGFyZSggaW50IGd0aWQsIGVudW0gY29uc190eXBlIGN0LCBpZGVudF90IGNvbnN0ICogaWRlbnQgKTsKK3ZvaWQgX19rbXBfY2hlY2tfc3luYyggaW50IGd0aWQsIGVudW0gY29uc190eXBlIGN0LCBpZGVudF90IGNvbnN0ICogaWRlbnQsIGttcF91c2VyX2xvY2tfcCBuYW1lICk7CisKK3ZvaWQgX19rbXBfcG9wX3BhcmFsbGVsKCBpbnQgZ3RpZCwgaWRlbnRfdCBjb25zdCAqIGlkZW50ICk7CitlbnVtIGNvbnNfdHlwZSBfX2ttcF9wb3Bfd29ya3NoYXJlKCBpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCApOwordm9pZCBfX2ttcF9wb3Bfc3luYyggaW50IGd0aWQsIGVudW0gY29uc190eXBlIGN0LCBpZGVudF90IGNvbnN0ICogaWRlbnQgKTsKK3ZvaWQgX19rbXBfY2hlY2tfYmFycmllciggaW50IGd0aWQsIGVudW0gY29uc190eXBlIGN0LCBpZGVudF90IGNvbnN0ICogaWRlbnQgKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgfSAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmIC8vIEtNUF9FUlJPUl9ICisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9mdG5fY2RlY2wuYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9mdG5fY2RlY2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzVhN2NiCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2Z0bl9jZGVjbC5jCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBrbXBfZnRuX2NkZWNsLmMgLS0gRm9ydHJhbiBfX2NkZWNsIGxpbmthZ2Ugc3VwcG9ydCBmb3IgT3Blbk1QLgorICogJFJldmlzaW9uOiA0Mjc1NyAkCisgKiAkRGF0ZTogMjAxMy0xMC0xOCAwODoyMDo1NyAtMDUwMCAoRnJpLCAxOCBPY3QgMjAxMykgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisKKyNpZiBLTVBfT1NfV0lORE9XUworIyAgIGlmIGRlZmluZWQgIEtNUF9XSU5fQ0RFQ0wgfHwgICFkZWZpbmVkIEdVSURFRExMX0VYUE9SVFMKKyMgICAgICAgZGVmaW5lIEtNUF9GVE5fRU5UUklFUyAgICAgIEtNUF9GVE5fVVBQRVIKKyMgICBlbmRpZgorI2VsaWYgS01QX09TX1VOSVgKKyMgICBkZWZpbmUgS01QX0ZUTl9FTlRSSUVTICBLTVBfRlROX1BMQUlOCisjZW5kaWYKKworLy8gTm90ZTogVGhpcyBzdHJpbmcgaXMgbm90IHByaW50ZWQgd2hlbiBLTVBfVkVSU0lPTj0xLgorY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2Z0bmNkZWNsW10gPSBLTVBfVkVSU0lPTl9QUkVGSVggIkZvcnRyYW4gX19jZGVjbCBPTVAgc3VwcG9ydDogIgorI2lmZGVmIEtNUF9GVE5fRU5UUklFUworICAgICJ5ZXMiOworIyAgIGRlZmluZSBGVE5fU1REQ0FMTCAJLyogbm8gc3RkY2FsbCAqLworIyAgIGluY2x1ZGUgImttcF9mdG5fb3MuaCIKKyMgICBpbmNsdWRlICJrbXBfZnRuX2VudHJ5LmgiCisjZWxzZQorICAgICJubyI7CisjZW5kaWYgLyogS01QX0ZUTl9FTlRSSUVTICovCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfZnRuX2VudHJ5LmggYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZnRuX2VudHJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgwZDc2ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9mdG5fZW50cnkuaApAQCAtMCwwICsxLDEyMTMgQEAKKy8qCisgKiBrbXBfZnRuX2VudHJ5LmggLS0gRm9ydHJhbiBlbnRyeSBsaW5rYWdlIHN1cHBvcnQgZm9yIE9wZW5NUC4KKyAqICRSZXZpc2lvbjogNDI3OTggJAorICogJERhdGU6IDIwMTMtMTAtMzAgMTY6Mzk6NTQgLTA1MDAgKFdlZCwgMzAgT2N0IDIwMTMpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBGVE5fU1REQ0FMTAorIyBlcnJvciBUaGUgc3VwcG9ydCBmaWxlIGttcF9mdG5fZW50cnkuaCBzaG91bGQgbm90IGJlIGNvbXBpbGVkIGJ5IGl0c2VsZi4KKyNlbmRpZgorCisjaWZkZWYgS01QX1NUVUIKKyAgICAjaW5jbHVkZSAia21wX3N0dWIuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgZXh0ZXJuICJDIiB7CisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworLyoKKyAqIEZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIEdudS9NUyBPcGVuIE1QIGNvZGVnZW4sIG9tcF9zZXRfbnVtX3RocmVhZHMoKSwKKyAqIG9tcF9zZXRfbmVzdGVkKCksIGFuZCBvbXBfc2V0X2R5bmFtaWMoKSBbaW4gbG93ZXJjYXNlIG9uIE1TLCBhbmQgdy9vCisgKiBhIHRyYWlsaW5nIHVuZGVyc2NvcmUgb24gTGludXgqIE9TXSB0YWtlIGNhbGwgYnkgdmFsdWUgaW50ZWdlciBhcmd1bWVudHMuCisgKiArIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMoKQorICogKyBvbXBfc2V0X3NjaGVkdWxlKCkKKyAqCisgKiBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIDkuMSBhbmQgcHJldmlvdXMgSW50ZWwgY29tcGlsZXIsIHRoZXNlCisgKiBlbnRyeSBwb2ludHMgdGFrZSBjYWxsIGJ5IHJlZmVyZW5jZSBpbnRlZ2VyIGFyZ3VtZW50cy4KKyAqLworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorIyBpZiAoS01QX0ZUTl9FTlRSSUVTID09IEtNUF9GVE5fUExBSU4pIHx8IChLTVBfRlROX0VOVFJJRVMgPT0gS01QX0ZUTl9VUFBFUikKKyMgIGRlZmluZSBQQVNTX0FSR1NfQllfVkFMVUUgMQorIyBlbmRpZgorI2VuZGlmCisjaWYgS01QX09TX1dJTkRPV1MKKyMgaWYgKEtNUF9GVE5fRU5UUklFUyA9PSBLTVBfRlROX1BMQUlOKSB8fCAoS01QX0ZUTl9FTlRSSUVTID09IEtNUF9GVE5fQVBQRU5EKQorIyAgZGVmaW5lIFBBU1NfQVJHU19CWV9WQUxVRSAxCisjIGVuZGlmCisjZW5kaWYKKworLy8gVGhpcyBtYWNybyBoZWxwcyB0byByZWR1Y2UgY29kZSBkdXBsaWNhdGlvbi4KKyNpZmRlZiBQQVNTX0FSR1NfQllfVkFMVUUKKyAgICAjZGVmaW5lIEtNUF9ERVJFRgorI2Vsc2UKKyAgICAjZGVmaW5lIEtNUF9ERVJFRiAqCisjZW5kaWYKKwordm9pZCAgRlROX1NURENBTEwKK0ZUTl9TRVRfU1RBQ0tTSVpFKCBpbnQgS01QX0RFUkVGIGFyZyApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIF9fa21wc19zZXRfc3RhY2tzaXplKCBLTVBfREVSRUYgYXJnICk7CisgICAgI2Vsc2UKKyAgICAgICAgLy8gX19rbXBfYXV4X3NldF9zdGFja3NpemUgaW5pdGlhbGl6ZXMgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgICAgICAgIF9fa21wX2F1eF9zZXRfc3RhY2tzaXplKCAoc2l6ZV90KSBLTVBfREVSRUYgYXJnICk7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgIEZUTl9TVERDQUxMCitGVE5fU0VUX1NUQUNLU0laRV9TKCBzaXplX3QgS01QX0RFUkVGIGFyZyApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIF9fa21wc19zZXRfc3RhY2tzaXplKCBLTVBfREVSRUYgYXJnICk7CisgICAgI2Vsc2UKKyAgICAgICAgLy8gX19rbXBfYXV4X3NldF9zdGFja3NpemUgaW5pdGlhbGl6ZXMgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgICAgICAgIF9fa21wX2F1eF9zZXRfc3RhY2tzaXplKCBLTVBfREVSRUYgYXJnICk7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAorRlROX0dFVF9TVEFDS1NJWkUoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICByZXR1cm4gX19rbXBzX2dldF9zdGFja3NpemUoKTsKKyAgICAjZWxzZQorICAgICAgICBpZiAoICEgX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgICAgICBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSgpOworICAgICAgICB9OworICAgICAgICByZXR1cm4gKGludClfX2ttcF9zdGtzaXplOworICAgICNlbmRpZgorfQorCitzaXplX3QgRlROX1NURENBTEwKK0ZUTl9HRVRfU1RBQ0tTSVpFX1MoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICByZXR1cm4gX19rbXBzX2dldF9zdGFja3NpemUoKTsKKyAgICAjZWxzZQorICAgICAgICBpZiAoICEgX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgICAgICBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSgpOworICAgICAgICB9OworICAgICAgICByZXR1cm4gX19rbXBfc3Rrc2l6ZTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAorRlROX1NFVF9CTE9DS1RJTUUoIGludCBLTVBfREVSRUYgYXJnICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgX19rbXBzX3NldF9ibG9ja3RpbWUoIEtNUF9ERVJFRiBhcmcgKTsKKyAgICAjZWxzZQorCWludCBndGlkLCB0aWQ7CisJa21wX2luZm9fdCAqdGhyZWFkOworCisJZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKwl0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworCXRocmVhZCA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoZ3RpZCk7CisKKyAgICAgICAgX19rbXBfYXV4X3NldF9ibG9ja3RpbWUoIEtNUF9ERVJFRiBhcmcsIHRocmVhZCwgdGlkICk7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAorRlROX0dFVF9CTE9DS1RJTUUoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICByZXR1cm4gX19rbXBzX2dldF9ibG9ja3RpbWUoKTsKKyAgICAjZWxzZQorCWludCBndGlkLCB0aWQ7CisJa21wX2luZm9fdCAqdGhyZWFkOworICAgICAgICBrbXBfdGVhbV9wICp0ZWFtOworCisJZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKwl0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworCXRocmVhZCA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoZ3RpZCk7CisgICAgICAgIHRlYW0gPSBfX2ttcF90aHJlYWRzWyBndGlkIF0gLT4gdGgudGhfdGVhbTsKKworICAgICAgICAvKiBUaGVzZSBtdXN0IG1hdGNoIHRoZSBzZXR0aW5ncyB1c2VkIGluIF9fa21wX3dhaXRfc2xlZXAoKSAqLworICAgICAgICBpZiAoIF9fa21wX2RmbHRfYmxvY2t0aW1lID09IEtNUF9NQVhfQkxPQ0tUSU1FICkgeworCSAgICBLRl9UUkFDRSgxMCwgKCAia21wX2dldF9ibG9ja3RpbWU6IFQjJWQoJWQ6JWQpLCBibG9ja3RpbWU9JWRcbiIsCisJCQkgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBLTVBfTUFYX0JMT0NLVElNRSkgKTsKKyAgICAgICAgICAgIHJldHVybiBLTVBfTUFYX0JMT0NLVElNRTsKKyAgICAgICAgfQorI2lmZGVmIEtNUF9BREpVU1RfQkxPQ0tUSU1FCisgICAgICAgIGVsc2UgaWYgKCBfX2ttcF96ZXJvX2J0ICYmICFnZXRfX2J0X3NldCggdGVhbSwgdGlkICkgKSB7CisJICAgIEtGX1RSQUNFKDEwLCAoICJrbXBfZ2V0X2Jsb2NrdGltZTogVCMlZCglZDolZCksIGJsb2NrdGltZT0lZFxuIiwKKwkJCSAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIDApICk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorI2VuZGlmIC8qIEtNUF9BREpVU1RfQkxPQ0tUSU1FICovCisgICAgICAgIGVsc2UgeworCSAgICBLRl9UUkFDRSgxMCwgKCAia21wX2dldF9ibG9ja3RpbWU6IFQjJWQoJWQ6JWQpLCBibG9ja3RpbWU9JWRcbiIsCisgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBnZXRfX2Jsb2NrdGltZSggdGVhbSwgdGlkICkgKSApOworICAgICAgICAgICAgcmV0dXJuIGdldF9fYmxvY2t0aW1lKCB0ZWFtLCB0aWQgKTsKKyAgICAgICAgfTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAorRlROX1NFVF9MSUJSQVJZX1NFUklBTCggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIF9fa21wc19zZXRfbGlicmFyeSggbGlicmFyeV9zZXJpYWwgKTsKKyAgICAjZWxzZQorICAgICAgICAvLyBfX2ttcF91c2VyX3NldF9saWJyYXJ5IGluaXRpYWxpemVzIHRoZSBsaWJyYXJ5IGlmIG5lZWRlZAorICAgICAgICBfX2ttcF91c2VyX3NldF9saWJyYXJ5KCBsaWJyYXJ5X3NlcmlhbCApOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCitGVE5fU0VUX0xJQlJBUllfVFVSTkFST1VORCggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIF9fa21wc19zZXRfbGlicmFyeSggbGlicmFyeV90dXJuYXJvdW5kICk7CisgICAgI2Vsc2UKKyAgICAgICAgLy8gX19rbXBfdXNlcl9zZXRfbGlicmFyeSBpbml0aWFsaXplcyB0aGUgbGlicmFyeSBpZiBuZWVkZWQKKyAgICAgICAgX19rbXBfdXNlcl9zZXRfbGlicmFyeSggbGlicmFyeV90dXJuYXJvdW5kICk7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwKK0ZUTl9TRVRfTElCUkFSWV9USFJPVUdIUFVUKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgX19rbXBzX3NldF9saWJyYXJ5KCBsaWJyYXJ5X3Rocm91Z2hwdXQgKTsKKyAgICAjZWxzZQorICAgICAgICAvLyBfX2ttcF91c2VyX3NldF9saWJyYXJ5IGluaXRpYWxpemVzIHRoZSBsaWJyYXJ5IGlmIG5lZWRlZAorICAgICAgICBfX2ttcF91c2VyX3NldF9saWJyYXJ5KCBsaWJyYXJ5X3Rocm91Z2hwdXQgKTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAorRlROX1NFVF9MSUJSQVJZKCBpbnQgS01QX0RFUkVGIGFyZyApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIF9fa21wc19zZXRfbGlicmFyeSggS01QX0RFUkVGIGFyZyApOworICAgICNlbHNlCisgICAgICAgIGVudW0gbGlicmFyeV90eXBlIGxpYjsKKyAgICAgICAgbGliID0gKGVudW0gbGlicmFyeV90eXBlKSBLTVBfREVSRUYgYXJnOworICAgICAgICAvLyBfX2ttcF91c2VyX3NldF9saWJyYXJ5IGluaXRpYWxpemVzIHRoZSBsaWJyYXJ5IGlmIG5lZWRlZAorICAgICAgICBfX2ttcF91c2VyX3NldF9saWJyYXJ5KCBsaWIgKTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCitGVE5fR0VUX0xJQlJBUlkgKHZvaWQpCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIHJldHVybiBfX2ttcHNfZ2V0X2xpYnJhcnkoKTsKKyAgICAjZWxzZQorICAgICAgICBpZiAoICEgX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgICAgICBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoKGludCkgX19rbXBfbGlicmFyeSk7CisgICAgI2VuZGlmCit9CisKKyNpZiBPTVBfMzBfRU5BQkxFRAorCitpbnQgRlROX1NURENBTEwKK0ZUTl9TRVRfQUZGSU5JVFkoIHZvaWQgKiptYXNrICkKK3sKKyAgICAjaWYgZGVmaW5lZChLTVBfU1RVQikgfHwgIUtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgcmV0dXJuIC0xOworICAgICNlbHNlCisgICAgICAgIGlmICggISBUQ1JfNChfX2ttcF9pbml0X21pZGRsZSkgKSB7CisgICAgICAgICAgICBfX2ttcF9taWRkbGVfaW5pdGlhbGl6ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfX2ttcF9hdXhfc2V0X2FmZmluaXR5KCBtYXNrICk7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAorRlROX0dFVF9BRkZJTklUWSggdm9pZCAqKm1hc2sgKQoreworICAgICNpZiBkZWZpbmVkKEtNUF9TVFVCKSB8fCAhS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICByZXR1cm4gLTE7CisgICAgI2Vsc2UKKyAgICAgICAgaWYgKCAhIFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApIHsKKyAgICAgICAgICAgIF9fa21wX21pZGRsZV9pbml0aWFsaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9fa21wX2F1eF9nZXRfYWZmaW5pdHkoIG1hc2sgKTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCitGVE5fR0VUX0FGRklOSVRZX01BWF9QUk9DKCB2b2lkICkKK3sKKyAgICAjaWYgZGVmaW5lZChLTVBfU1RVQikgfHwgIUtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgcmV0dXJuIDA7CisgICAgI2Vsc2UKKyAgICAgICAgLy8KKyAgICAgICAgLy8gV2UgcmVhbGx5IG9ubHkgTkVFRCBzZXJpYWwgaW5pdGlhbGl6YXRpb24gaGVyZS4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCAhIFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApIHsKKyAgICAgICAgICAgIF9fa21wX21pZGRsZV9pbml0aWFsaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAhICggS01QX0FGRklOSVRZX0NBUEFCTEUoKSApICkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICNpZiBLTVBfT1NfV0lORE9XUyAmJiBLTVBfQVJDSF9YODZfNjQKKyAgICAgICAgaWYgKCBfX2ttcF9udW1fcHJvY19ncm91cHMgPD0gMSApIHsKKyAgICAgICAgICAgIHJldHVybiAoaW50KUtNUF9DUFVfU0VUU0laRTsKKyAgICAgICAgfQorICAgICNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAmJiBLTVBfQVJDSF9YODZfNjQgKi8KKyAgICAgICAgcmV0dXJuIF9fa21wX3hwcm9jOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCitGVE5fQ1JFQVRFX0FGRklOSVRZX01BU0soIHZvaWQgKiptYXNrICkKK3sKKyAgICAjaWYgZGVmaW5lZChLTVBfU1RVQikgfHwgIUtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgKm1hc2sgPSBOVUxMOworICAgICNlbHNlCisgICAgICAgIC8vCisgICAgICAgIC8vIFdlIHJlYWxseSBvbmx5IE5FRUQgc2VyaWFsIGluaXRpYWxpemF0aW9uIGhlcmUuCisgICAgICAgIC8vCisgICAgICAgIGlmICggISBUQ1JfNChfX2ttcF9pbml0X21pZGRsZSkgKSB7CisgICAgICAgICAgICBfX2ttcF9taWRkbGVfaW5pdGlhbGl6ZSgpOworICAgICAgICB9CisgICAgICAgICptYXNrID0ga21wY19tYWxsb2MoIF9fa21wX2FmZmluX21hc2tfc2l6ZSApOworICAgICAgICBLTVBfQ1BVX1pFUk8oIChrbXBfYWZmaW5fbWFza190ICopKCptYXNrKSApOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCitGVE5fREVTVFJPWV9BRkZJTklUWV9NQVNLKCB2b2lkICoqbWFzayApCit7CisgICAgI2lmIGRlZmluZWQoS01QX1NUVUIpIHx8ICFLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIC8vIE5vdGhpbmcKKyAgICAjZWxzZQorICAgICAgICAvLworICAgICAgICAvLyBXZSByZWFsbHkgb25seSBORUVEIHNlcmlhbCBpbml0aWFsaXphdGlvbiBoZXJlLgorICAgICAgICAvLworICAgICAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgIGlmICggKm1hc2sgPT0gTlVMTCApIHsKKwkgICAgICAgIEtNUF9GQVRBTCggQWZmaW5pdHlJbnZhbGlkTWFzaywgImttcF9kZXN0cm95X2FmZmluaXR5X21hc2siICk7CisJICAgIH0KKyAgICAgICAgfQorICAgICAgICBrbXBjX2ZyZWUoICptYXNrICk7CisgICAgICAgICptYXNrID0gTlVMTDsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCitGVE5fU0VUX0FGRklOSVRZX01BU0tfUFJPQyggaW50IEtNUF9ERVJFRiBwcm9jLCB2b2lkICoqbWFzayApCit7CisgICAgI2lmIGRlZmluZWQoS01QX1NUVUIpIHx8ICFLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIHJldHVybiAtMTsKKyAgICAjZWxzZQorICAgICAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX19rbXBfYXV4X3NldF9hZmZpbml0eV9tYXNrX3Byb2MoIEtNUF9ERVJFRiBwcm9jLCBtYXNrICk7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAorRlROX1VOU0VUX0FGRklOSVRZX01BU0tfUFJPQyggaW50IEtNUF9ERVJFRiBwcm9jLCB2b2lkICoqbWFzayApCit7CisgICAgI2lmIGRlZmluZWQoS01QX1NUVUIpIHx8ICFLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIHJldHVybiAtMTsKKyAgICAjZWxzZQorICAgICAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX19rbXBfYXV4X3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyggS01QX0RFUkVGIHByb2MsIG1hc2sgKTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCitGVE5fR0VUX0FGRklOSVRZX01BU0tfUFJPQyggaW50IEtNUF9ERVJFRiBwcm9jLCB2b2lkICoqbWFzayApCit7CisgICAgI2lmIGRlZmluZWQoS01QX1NUVUIpIHx8ICFLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIHJldHVybiAtMTsKKyAgICAjZWxzZQorICAgICAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX19rbXBfYXV4X2dldF9hZmZpbml0eV9tYXNrX3Byb2MoIEtNUF9ERVJFRiBwcm9jLCBtYXNrICk7CisgICAgI2VuZGlmCit9CisKKyNlbmRpZiAvKiBPTVBfMzBfRU5BQkxFRCAqLworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBzZXRzIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIHRocmVhZHMgZm9yIHRoZSBuZXh0IHBhcmFsbGVsIHJlZ2lvbiAqLworCit2b2lkIEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9TRVRfTlVNX1RIUkVBRFMpKCBpbnQgS01QX0RFUkVGIGFyZyApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIC8vIE5vdGhpbmcuCisgICAgI2Vsc2UKKyAgICAgICAgX19rbXBfc2V0X251bV90aHJlYWRzKCBLTVBfREVSRUYgYXJnLCBfX2ttcF9lbnRyeV9ndGlkKCkgKTsKKyAgICAjZW5kaWYKK30KKworCisvKiByZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBpbiBjdXJyZW50IHRlYW0gKi8KK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX05VTV9USFJFQURTKSggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIHJldHVybiAxOworICAgICNlbHNlCisgICAgICAgIC8vIF9fa21wY19ib3VuZF9udW1fdGhyZWFkcyBpbml0aWFsaXplcyB0aGUgbGlicmFyeSBpZiBuZWVkZWQKKyAgICAgICAgcmV0dXJuIF9fa21wY19ib3VuZF9udW1fdGhyZWFkcyhOVUxMKTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9HRVRfTUFYX1RIUkVBRFMpKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgcmV0dXJuIDE7CisgICAgI2Vsc2UKKyAgICAgICAgaW50ICAgICAgICAgZ3RpZDsKKyAgICAgICAga21wX2luZm9fdCAqdGhyZWFkOworICAgICAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICAgICAgfQorICAgICAgICBndGlkICAgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgICAgIHRocmVhZCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICAgICAgI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgIC8vcmV0dXJuIHRocmVhZCAtPiB0aC50aF90ZWFtIC0+IHQudF9jdXJyZW50X3Rhc2tbIHRocmVhZC0+dGgudGhfaW5mby5kcy5kc190aWQgXSAtPiBpY3ZzLm5wcm9jOworCXJldHVybiB0aHJlYWQgLT4gdGgudGhfY3VycmVudF90YXNrIC0+IHRkX2ljdnMubnByb2M7CisgICAgICAgICNlbHNlCisgICAgICAgIHJldHVybiB0aHJlYWQgLT4gdGgudGhfdGVhbSAtPiB0LnRfc2V0X25wcm9jWyB0aHJlYWQtPnRoLnRoX2luZm8uZHMuZHNfdGlkIF07CisgICAgICAgICNlbmRpZgorICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0dFVF9USFJFQURfTlVNKSggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIHJldHVybiAwOworICAgICNlbHNlCisgICAgICAgIGludCBndGlkOworCisgICAgICAgICNpZiBLTVBfT1NfREFSV0lOIHx8IEtNUF9PU19GUkVFQlNECisgICAgICAgICAgICBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgICAgICAjZWxpZiBLTVBfT1NfV0lORE9XUworICAgICAgICAgICAgaWYgKCFfX2ttcF9pbml0X3BhcmFsbGVsIHx8CisgICAgICAgICAgICAgICAgKGd0aWQgPSAoaW50KSgoa21wX2ludHB0cl90KVRsc0dldFZhbHVlKCBfX2ttcF9ndGlkX3RocmVhZHByaXZhdGVfa2V5ICkpKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gRWl0aGVyIGxpYnJhcnkgaXNuJ3QgaW5pdGlhbGl6ZWQgb3IgdGhyZWFkIGlzIG5vdCByZWdpc3RlcmVkCisgICAgICAgICAgICAgICAgLy8gMCBpcyB0aGUgY29ycmVjdCBUSUQgaW4gdGhpcyBjYXNlCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAtLWd0aWQ7IC8vIFdlIGtlZXAgKGd0aWQrMSkgaW4gVExTCisgICAgICAgICNlbGlmIEtNUF9PU19MSU5VWAorICAgICAgICAgICAgI2lmZGVmIEtNUF9UREFUQV9HVElECisgICAgICAgICAgICBpZiAoIF9fa21wX2d0aWRfbW9kZSA+PSAzICkgeworICAgICAgICAgICAgICAgIGlmICgoZ3RpZCA9IF9fa21wX2d0aWQpID09IEtNUF9HVElEX0RORSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgaWYgKCFfX2ttcF9pbml0X3BhcmFsbGVsIHx8CisgICAgICAgICAgICAgICAgICAgIChndGlkID0gKGttcF9pbnRwdHJfdCkocHRocmVhZF9nZXRzcGVjaWZpYyggX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSApKSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLS1ndGlkOworICAgICAgICAgICAgI2lmZGVmIEtNUF9UREFUQV9HVElECisgICAgICAgICAgICB9CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICNlcnJvciBVbmtub3duIG9yIHVuc3VwcG9ydGVkIE9TCisgICAgICAgICNlbmRpZgorCisgICAgICAgIHJldHVybiBfX2ttcF90aWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAorRlROX0dFVF9OVU1fS05PV05fVEhSRUFEUyggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIHJldHVybiAxOworICAgICNlbHNlCisgICAgICAgIGlmICggISBfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgICAgIF9fa21wX3NlcmlhbF9pbml0aWFsaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgLyogTk9URTogdGhpcyBpcyBub3Qgc3luY3Jvbml6ZWQsIHNvIGl0IGNhbiBjaGFuZ2UgYXQgYW55IG1vbWVudCAqLworICAgICAgICAvKiBOT1RFOiB0aGlzIG51bWJlciBhbHNvIGluY2x1ZGVzIHRocmVhZHMgcHJlYWxsb2NhdGVkIGluIGhvdC10ZWFtcyAqLworICAgICAgICByZXR1cm4gVENSXzQoX19rbXBfbnRoKTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9HRVRfTlVNX1BST0NTKSggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIHJldHVybiAxOworICAgICNlbHNlCisgICAgICAgIGlmICggISBUQ1JfNChfX2ttcF9pbml0X21pZGRsZSkgKSB7CisgICAgICAgICAgICBfX2ttcF9taWRkbGVfaW5pdGlhbGl6ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfX2ttcF9hdmFpbF9wcm9jOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9TRVRfTkVTVEVEKSggaW50IEtNUF9ERVJFRiBmbGFnICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgX19rbXBzX3NldF9uZXN0ZWQoIEtNUF9ERVJFRiBmbGFnICk7CisgICAgI2Vsc2UKKyAgICAgICAga21wX2luZm9fdCAqdGhyZWFkOworICAgICAgICAvKiBGb3IgdGhlIHRocmVhZC1wcml2YXRlIGludGVybmFsIGNvbnRyb2xzIGltcGxlbWVudGF0aW9uICovCisgICAgICAgIHRocmVhZCA9IF9fa21wX2VudHJ5X3RocmVhZCgpOworICAgICAgICBfX2ttcF9zYXZlX2ludGVybmFsX2NvbnRyb2xzKCB0aHJlYWQgKTsKKyAgICAgICAgc2V0X19uZXN0ZWQoIHRocmVhZCwgKCAoS01QX0RFUkVGIGZsYWcpID8gVFJVRSA6IEZBTFNFICkgKTsKKyAgICAjZW5kaWYKK30KKworCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0dFVF9ORVNURUQpKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgcmV0dXJuIF9fa21wc19nZXRfbmVzdGVkKCk7CisgICAgI2Vsc2UKKyAgICAgICAga21wX2luZm9fdCAqdGhyZWFkOworICAgICAgICB0aHJlYWQgPSBfX2ttcF9lbnRyeV90aHJlYWQoKTsKKyAgICAgICAgcmV0dXJuIGdldF9fbmVzdGVkKCB0aHJlYWQgKTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fU0VUX0RZTkFNSUMpKCBpbnQgS01QX0RFUkVGIGZsYWcgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICBfX2ttcHNfc2V0X2R5bmFtaWMoIEtNUF9ERVJFRiBmbGFnID8gVFJVRSA6IEZBTFNFICk7CisgICAgI2Vsc2UKKyAgICAgICAga21wX2luZm9fdCAqdGhyZWFkOworICAgICAgICAvKiBGb3IgdGhlIHRocmVhZC1wcml2YXRlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cm9scyAqLworICAgICAgICB0aHJlYWQgPSBfX2ttcF9lbnRyeV90aHJlYWQoKTsKKyAgICAgICAgLy8gISEhIFdoYXQgaWYgZm9yZWlnbiB0aHJlYWQgY2FsbHMgaXQ/CisgICAgICAgIF9fa21wX3NhdmVfaW50ZXJuYWxfY29udHJvbHMoIHRocmVhZCApOworICAgICAgICBzZXRfX2R5bmFtaWMoIHRocmVhZCwgS01QX0RFUkVGIGZsYWcgPyBUUlVFIDogRkFMU0UgKTsKKyAgICAjZW5kaWYKK30KKworCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0dFVF9EWU5BTUlDKSggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIHJldHVybiBfX2ttcHNfZ2V0X2R5bmFtaWMoKTsKKyAgICAjZWxzZQorICAgICAgICBrbXBfaW5mb190ICp0aHJlYWQ7CisgICAgICAgIHRocmVhZCA9IF9fa21wX2VudHJ5X3RocmVhZCgpOworICAgICAgICByZXR1cm4gZ2V0X19keW5hbWljKCB0aHJlYWQgKTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9JTl9QQVJBTExFTCkoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICByZXR1cm4gMDsKKyAgICAjZWxzZQorICAgICAgICBrbXBfaW5mb190ICp0aCA9IF9fa21wX2VudHJ5X3RocmVhZCgpOworI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgIGlmICggdGgtPnRoLnRoX3RlYW1fbWljcm90YXNrICkgeworICAgICAgICAgICAgLy8gQUM6IHJfaW5fcGFyYWxsZWwgZG9lcyBub3Qgd29yayBpbnNpZGUgdGVhbXMgY29uc3RydWN0CisgICAgICAgICAgICAvLyAgICAgd2hlcmUgcmVhbCBwYXJhbGxlbCBpcyBpbmFjdGl2ZSwgYnV0IGFsbCB0aHJlYWRzIGhhdmUgc2FtZSByb290LAorICAgICAgICAgICAgLy8gICAgIHNvIHNldHRpbmcgaXQgaW4gb25lIHRlYW0gYWZmZWN0cyBvdGhlciB0ZWFtcy4KKyAgICAgICAgICAgIC8vICAgICBUaGUgc29sdXRpb24gaXMgdG8gdXNlIHBlci10ZWFtIG5lc3RpbmcgbGV2ZWwKKyAgICAgICAgICAgIHJldHVybiAoIHRoLT50aC50aF90ZWFtLT50LnRfYWN0aXZlX2xldmVsID8gMSA6IDAgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICAgICAgICAgIHJldHVybiAoIHRoLT50aC50aF9yb290LT5yLnJfaW5fcGFyYWxsZWwgPyBGVE5fVFJVRSA6IEZUTl9GQUxTRSApOworICAgICNlbmRpZgorfQorCisjaWYgT01QXzMwX0VOQUJMRUQKKwordm9pZCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fU0VUX1NDSEVEVUxFKSgga21wX3NjaGVkX3QgS01QX0RFUkVGIGtpbmQsIGludCBLTVBfREVSRUYgbW9kaWZpZXIgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICBfX2ttcHNfc2V0X3NjaGVkdWxlKCBLTVBfREVSRUYga2luZCwgS01QX0RFUkVGIG1vZGlmaWVyICk7CisgICAgI2Vsc2UKKwkvKiAgVE8gRE8gICovCisgICAgICAgIC8qIEZvciB0aGUgcGVyLXRhc2sgaW1wbGVtZW50YXRpb24gb2YgdGhlIGludGVybmFsIGNvbnRyb2xzICovCisgICAgICAgIF9fa21wX3NldF9zY2hlZHVsZSggX19rbXBfZW50cnlfZ3RpZCgpLCBLTVBfREVSRUYga2luZCwgS01QX0RFUkVGIG1vZGlmaWVyICk7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0dFVF9TQ0hFRFVMRSkoIGttcF9zY2hlZF90ICoga2luZCwgaW50ICogbW9kaWZpZXIgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICBfX2ttcHNfZ2V0X3NjaGVkdWxlKCBraW5kLCBtb2RpZmllciApOworICAgICNlbHNlCisJLyogIFRPIERPICAqLworCS8qIEZvciB0aGUgcGVyLXRhc2sgaW1wbGVtZW50YXRpb24gb2YgdGhlIGludGVybmFsIGNvbnRyb2xzICovCisgICAgICAgIF9fa21wX2dldF9zY2hlZHVsZSggX19rbXBfZW50cnlfZ3RpZCgpLCBraW5kLCBtb2RpZmllciApOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9TRVRfTUFYX0FDVElWRV9MRVZFTFMpKCBpbnQgS01QX0RFUkVGIGFyZyApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisJLy8gTm90aGluZy4KKyAgICAjZWxzZQorCS8qICBUTyBETyAgKi8KKyAgICAgICAgLyogV2Ugd2FudCBwZXItdGFzayBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVybmFsIGNvbnRyb2wgKi8KKyAgICAgICAgX19rbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzKCBfX2ttcF9lbnRyeV9ndGlkKCksIEtNUF9ERVJFRiBhcmcgKTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9HRVRfTUFYX0FDVElWRV9MRVZFTFMpKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKwlyZXR1cm4gMDsKKyAgICAjZWxzZQorCS8qICBUTyBETyAgKi8KKwkvKiBXZSB3YW50IHBlci10YXNrIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgaW50ZXJuYWwgY29udHJvbCAqLworCXJldHVybiBfX2ttcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMoIF9fa21wX2VudHJ5X2d0aWQoKSApOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0dFVF9BQ1RJVkVfTEVWRUwpKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKwlyZXR1cm4gMDsgLy8gcmV0dXJucyAwIGlmIGl0IGlzIGNhbGxlZCBmcm9tIHRoZSBzZXF1ZW50aWFsIHBhcnQgb2YgdGhlIHByb2dyYW0KKyAgICAjZWxzZQorCS8qICBUTyBETyAgKi8KKwkvKiBGb3IgdGhlIHBlci10YXNrIGltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cm9scyAqLworICAgICAgICByZXR1cm4gX19rbXBfZW50cnlfdGhyZWFkKCkgLT4gdGgudGhfdGVhbSAtPiB0LnRfYWN0aXZlX2xldmVsOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0dFVF9MRVZFTCkoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorCXJldHVybiAwOyAvLyByZXR1cm5zIDAgaWYgaXQgaXMgY2FsbGVkIGZyb20gdGhlIHNlcXVlbnRpYWwgcGFydCBvZiB0aGUgcHJvZ3JhbQorICAgICNlbHNlCisJLyogIFRPIERPICAqLworCS8qIEZvciB0aGUgcGVyLXRhc2sgaW1wbGVtZW50YXRpb24gb2YgdGhlIGludGVybmFsIGNvbnRyb2xzICovCisgICAgICAgIHJldHVybiBfX2ttcF9lbnRyeV90aHJlYWQoKSAtPiB0aC50aF90ZWFtIC0+IHQudF9sZXZlbDsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9HRVRfQU5DRVNUT1JfVEhSRUFEX05VTSkoIGludCBLTVBfREVSRUYgbGV2ZWwgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorCXJldHVybiAoIEtNUF9ERVJFRiBsZXZlbCApID8gKCAtMSApIDogKCAwICk7CisgICAgI2Vsc2UKKwlyZXR1cm4gX19rbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0oIF9fa21wX2VudHJ5X2d0aWQoKSwgS01QX0RFUkVGIGxldmVsICk7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX1RFQU1fU0laRSkoIGludCBLTVBfREVSRUYgbGV2ZWwgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICByZXR1cm4gKCBLTVBfREVSRUYgbGV2ZWwgKSA/ICggLTEgKSA6ICggMSApOworICAgICNlbHNlCisgICAgICAgIHJldHVybiBfX2ttcF9nZXRfdGVhbV9zaXplKCBfX2ttcF9lbnRyeV9ndGlkKCksIEtNUF9ERVJFRiBsZXZlbCApOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0dFVF9USFJFQURfTElNSVQpKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKwlyZXR1cm4gMTsgICAvLyBUTyBETzogY2xhcmlmeSB3aGV0aGVyIGl0IHJldHVybnMgMSBvciAwPworICAgICNlbHNlCisgICAgICAgIGlmICggISBfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgICAgIF9fa21wX3NlcmlhbF9pbml0aWFsaXplKCk7CisgICAgICAgIH07CisgICAgICAgIC8qIGdsb2JhbCBJQ1YgKi8KKwlyZXR1cm4gX19rbXBfbWF4X250aDsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9JTl9GSU5BTCkoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorCXJldHVybiAwOyAgIC8vIFRPIERPOiBjbGFyaWZ5IHdoZXRoZXIgaXQgcmV0dXJucyAxIG9yIDA/CisgICAgI2Vsc2UKKyAgICAgICAgaWYgKCAhIFRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpICkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKwlyZXR1cm4gX19rbXBfZW50cnlfdGhyZWFkKCkgLT4gdGgudGhfY3VycmVudF90YXNrIC0+IHRkX2ZsYWdzLmZpbmFsOworICAgICNlbmRpZgorfQorCisjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKworI2lmIE9NUF80MF9FTkFCTEVECisKKwora21wX3Byb2NfYmluZF90IEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9HRVRfUFJPQ19CSU5EKSggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIHJldHVybiBfX2ttcHNfZ2V0X3Byb2NfYmluZCgpOworICAgICNlbHNlCisgICAgICAgIHJldHVybiBnZXRfX3Byb2NfYmluZCggX19rbXBfZW50cnlfdGhyZWFkKCkgKTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9HRVRfTlVNX1RFQU1TKSggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIHJldHVybiAxOworICAgICNlbHNlCisgICAgICAgIGttcF9pbmZvX3QgKnRociA9IF9fa21wX2VudHJ5X3RocmVhZCgpOworICAgICAgICBpZiAoIHRoci0+dGgudGhfdGVhbV9taWNyb3Rhc2sgKSB7CisgICAgICAgICAgICBrbXBfdGVhbV90ICp0ZWFtID0gdGhyLT50aC50aF90ZWFtOworICAgICAgICAgICAgaW50IHRsZXZlbCA9IHRoci0+dGgudGhfdGVhbXNfbGV2ZWw7CisgICAgICAgICAgICBpbnQgaWkgPSB0ZWFtLT50LnRfbGV2ZWw7ICAgICAgICAgICAgLy8gdGhlIGxldmVsIG9mIHRoZSB0ZWFtcyBjb25zdHJ1Y3QKKyAgICAgICAgICAgIGludCBkZCA9IHRlYW0gLT4gdC50X3NlcmlhbGl6ZWQ7CisgICAgICAgICAgICBpbnQgbGV2ZWwgPSB0bGV2ZWwgKyAxOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggaWkgPj0gdGxldmVsICk7CisgICAgICAgICAgICB3aGlsZSggaWkgPiBsZXZlbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yKCBkZCA9IHRlYW0gLT4gdC50X3NlcmlhbGl6ZWQ7ICggZGQgPiAwICkgJiYgKCBpaSA+IGxldmVsICk7IGRkLS0sIGlpLS0gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoIHRlYW0gLT4gdC50X3NlcmlhbGl6ZWQgJiYgKCAhZGQgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgdGVhbSA9IHRlYW0tPnQudF9wYXJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggaWkgPiBsZXZlbCApIHsKKyAgICAgICAgICAgICAgICAgICAgdGVhbSA9IHRlYW0tPnQudF9wYXJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlpLS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBkZCA+IDEgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7ICAvLyB0ZWFtcyByZWdpb24gaXMgc2VyaWFsaXplZCAoIDEgdGVhbSBvZiAxIHRocmVhZCApLgorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGVhbS0+dC50X3BhcmVudC0+dC50X25wcm9jOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9HRVRfVEVBTV9OVU0pKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgcmV0dXJuIDA7CisgICAgI2Vsc2UKKyAgICAgICAga21wX2luZm9fdCAqdGhyID0gX19rbXBfZW50cnlfdGhyZWFkKCk7CisgICAgICAgIGlmICggdGhyLT50aC50aF90ZWFtX21pY3JvdGFzayApIHsKKyAgICAgICAgICAgIGttcF90ZWFtX3QgKnRlYW0gPSB0aHItPnRoLnRoX3RlYW07CisgICAgICAgICAgICBpbnQgdGxldmVsID0gdGhyLT50aC50aF90ZWFtc19sZXZlbDsgLy8gdGhlIGxldmVsIG9mIHRoZSB0ZWFtcyBjb25zdHJ1Y3QKKyAgICAgICAgICAgIGludCBpaSA9IHRlYW0tPnQudF9sZXZlbDsKKyAgICAgICAgICAgIGludCBkZCA9IHRlYW0gLT4gdC50X3NlcmlhbGl6ZWQ7CisgICAgICAgICAgICBpbnQgbGV2ZWwgPSB0bGV2ZWwgKyAxOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggaWkgPj0gdGxldmVsICk7CisgICAgICAgICAgICB3aGlsZSggaWkgPiBsZXZlbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yKCBkZCA9IHRlYW0gLT4gdC50X3NlcmlhbGl6ZWQ7ICggZGQgPiAwICkgJiYgKCBpaSA+IGxldmVsICk7IGRkLS0sIGlpLS0gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoIHRlYW0gLT4gdC50X3NlcmlhbGl6ZWQgJiYgKCAhZGQgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgdGVhbSA9IHRlYW0tPnQudF9wYXJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggaWkgPiBsZXZlbCApIHsKKyAgICAgICAgICAgICAgICAgICAgdGVhbSA9IHRlYW0tPnQudF9wYXJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlpLS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBkZCA+IDEgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7ICAvLyB0ZWFtcyByZWdpb24gaXMgc2VyaWFsaXplZCAoIDEgdGVhbSBvZiAxIHRocmVhZCApLgorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGVhbS0+dC50X21hc3Rlcl90aWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICNlbmRpZgorfQorCisjaWYgS01QX01JQyB8fCBLTVBfT1NfREFSV0lOCisKK3N0YXRpYyBpbnQgX19rbXBfZGVmYXVsdF9kZXZpY2UgPSAwOworCitpbnQgRlROX1NURENBTEwKK0ZUTl9HRVRfREVGQVVMVF9ERVZJQ0UoIHZvaWQgKQoreworICAgIHJldHVybiBfX2ttcF9kZWZhdWx0X2RldmljZTsKK30KKwordm9pZCBGVE5fU1REQ0FMTAorRlROX1NFVF9ERUZBVUxUX0RFVklDRSggaW50IEtNUF9ERVJFRiBhcmcgKQoreworICAgIF9fa21wX2RlZmF1bHRfZGV2aWNlID0gS01QX0RFUkVGIGFyZzsKK30KKworaW50IEZUTl9TVERDQUxMCitGVE5fR0VUX05VTV9ERVZJQ0VTKCB2b2lkICkKK3sKKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmIC8vIEtNUF9NSUMgfHwgS01QX09TX0RBUldJTgorCisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKworI2lmZGVmIEtNUF9TVFVCCit0eXBlZGVmIGVudW0geyBVTklOSVQgPSAtMSwgVU5MT0NLRUQsIExPQ0tFRCB9IGttcF9zdHViX2xvY2tfdDsKKyNlbmRpZiAvKiBLTVBfU1RVQiAqLworCisvKiBpbml0aWFsaXplIHRoZSBsb2NrICovCit2b2lkIEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9JTklUX0xPQ0spKCB2b2lkICoqdXNlcl9sb2NrICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgKigoa21wX3N0dWJfbG9ja190ICopdXNlcl9sb2NrKSA9IFVOTE9DS0VEOworICAgICNlbHNlCisgICAgICAgIF9fa21wY19pbml0X2xvY2soIE5VTEwsIF9fa21wX2VudHJ5X2d0aWQoKSwgdXNlcl9sb2NrICk7CisgICAgI2VuZGlmCit9CisKKy8qIGluaXRpYWxpemUgdGhlIGxvY2sgKi8KK3ZvaWQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0lOSVRfTkVTVF9MT0NLKSggdm9pZCAqKnVzZXJfbG9jayApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgICooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgPSBVTkxPQ0tFRDsKKyAgICAjZWxzZQorICAgICAgICBfX2ttcGNfaW5pdF9uZXN0X2xvY2soIE5VTEwsIF9fa21wX2VudHJ5X2d0aWQoKSwgdXNlcl9sb2NrICk7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0RFU1RST1lfTE9DSykoIHZvaWQgKip1c2VyX2xvY2sgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID0gVU5JTklUOworICAgICNlbHNlCisgICAgICAgIF9fa21wY19kZXN0cm95X2xvY2soIE5VTEwsIF9fa21wX2VudHJ5X2d0aWQoKSwgdXNlcl9sb2NrICk7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0RFU1RST1lfTkVTVF9MT0NLKSggdm9pZCAqKnVzZXJfbG9jayApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgICooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgPSBVTklOSVQ7CisgICAgI2Vsc2UKKyAgICAgICAgX19rbXBjX2Rlc3Ryb3lfbmVzdF9sb2NrKCBOVUxMLCBfX2ttcF9lbnRyeV9ndGlkKCksIHVzZXJfbG9jayApOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9TRVRfTE9DSykoIHZvaWQgKip1c2VyX2xvY2sgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICBpZiAoICooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgPT0gVU5JTklUICkgeworICAgICAgICAgICAgLy8gVE9ETzogSXNzdWUgYW4gZXJyb3IuCisgICAgICAgIH07IC8vIGlmCisgICAgICAgIGlmICggKigoa21wX3N0dWJfbG9ja190ICopdXNlcl9sb2NrKSAhPSBVTkxPQ0tFRCApIHsKKyAgICAgICAgICAgIC8vIFRPRE86IElzc3VlIGFuIGVycm9yLgorICAgICAgICB9OyAvLyBpZgorICAgICAgICAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID0gTE9DS0VEOworICAgICNlbHNlCisgICAgICAgIF9fa21wY19zZXRfbG9jayggTlVMTCwgX19rbXBfZW50cnlfZ3RpZCgpLCB1c2VyX2xvY2sgKTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fU0VUX05FU1RfTE9DSykoIHZvaWQgKip1c2VyX2xvY2sgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICBpZiAoICooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgPT0gVU5JTklUICkgeworICAgICAgICAgICAgLy8gVE9ETzogSXNzdWUgYW4gZXJyb3IuCisgICAgICAgIH07IC8vIGlmCisgICAgICAgICgqKChpbnQgKil1c2VyX2xvY2spKSsrOworICAgICNlbHNlCisgICAgICAgIF9fa21wY19zZXRfbmVzdF9sb2NrKCBOVUxMLCBfX2ttcF9lbnRyeV9ndGlkKCksIHVzZXJfbG9jayApOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9VTlNFVF9MT0NLKSggdm9pZCAqKnVzZXJfbG9jayApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIGlmICggKigoa21wX3N0dWJfbG9ja190ICopdXNlcl9sb2NrKSA9PSBVTklOSVQgKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBJc3N1ZSBhbiBlcnJvci4KKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgaWYgKCAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID09IFVOTE9DS0VEICkgeworICAgICAgICAgICAgLy8gVE9ETzogSXNzdWUgYW4gZXJyb3IuCisgICAgICAgIH07IC8vIGlmCisgICAgICAgICooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgPSBVTkxPQ0tFRDsKKyAgICAjZWxzZQorICAgICAgICBfX2ttcGNfdW5zZXRfbG9jayggTlVMTCwgX19rbXBfZW50cnlfZ3RpZCgpLCB1c2VyX2xvY2sgKTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fVU5TRVRfTkVTVF9MT0NLKSggdm9pZCAqKnVzZXJfbG9jayApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIGlmICggKigoa21wX3N0dWJfbG9ja190ICopdXNlcl9sb2NrKSA9PSBVTklOSVQgKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBJc3N1ZSBhbiBlcnJvci4KKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgaWYgKCAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID09IFVOTE9DS0VEICkgeworICAgICAgICAgICAgLy8gVE9ETzogSXNzdWUgYW4gZXJyb3IuCisgICAgICAgIH07IC8vIGlmCisgICAgICAgICgqKChpbnQgKil1c2VyX2xvY2spKS0tOworICAgICNlbHNlCisgICAgICAgIF9fa21wY191bnNldF9uZXN0X2xvY2soIE5VTEwsIF9fa21wX2VudHJ5X2d0aWQoKSwgdXNlcl9sb2NrICk7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fVEVTVF9MT0NLKSggdm9pZCAqKnVzZXJfbG9jayApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIGlmICggKigoa21wX3N0dWJfbG9ja190ICopdXNlcl9sb2NrKSA9PSBVTklOSVQgKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBJc3N1ZSBhbiBlcnJvci4KKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgaWYgKCAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID09IExPQ0tFRCApIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9OyAvLyBpZgorICAgICAgICAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID0gTE9DS0VEOworICAgICAgICByZXR1cm4gMTsKKyAgICAjZWxzZQorICAgICAgICByZXR1cm4gX19rbXBjX3Rlc3RfbG9jayggTlVMTCwgX19rbXBfZW50cnlfZ3RpZCgpLCB1c2VyX2xvY2sgKTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9URVNUX05FU1RfTE9DSykoIHZvaWQgKip1c2VyX2xvY2sgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICBpZiAoICooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgPT0gVU5JTklUICkgeworICAgICAgICAgICAgLy8gVE9ETzogSXNzdWUgYW4gZXJyb3IuCisgICAgICAgIH07IC8vIGlmCisgICAgICAgIHJldHVybiArKygqKChpbnQgKil1c2VyX2xvY2spKTsKKyAgICAjZWxzZQorICAgICAgICByZXR1cm4gX19rbXBjX3Rlc3RfbmVzdF9sb2NrKCBOVUxMLCBfX2ttcF9lbnRyeV9ndGlkKCksIHVzZXJfbG9jayApOworICAgICNlbmRpZgorfQorCitkb3VibGUgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0dFVF9XVElNRSkoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICByZXR1cm4gX19rbXBzX2dldF93dGltZSgpOworICAgICNlbHNlCisgICAgICAgIGRvdWJsZSBkYXRhOworICAgICAgICAjaWYgISBLTVBfT1NfTElOVVgKKyAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIHRvIGdldCB0aGUgdGltZSBvbiBMaW51eCogT1MuCisgICAgICAgIC8vIFRoZSByb3V0aW5lIGNhbiBiZSB1c2VkIHRvIG1lYXN1cmUgbGlicmFyeSBpbml0aWFsaXphdGlvbiB0aW1lIG9uIExpbnV4KiBPUyBub3cuCisgICAgICAgIGlmICggISBfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgICAgIF9fa21wX3NlcmlhbF9pbml0aWFsaXplKCk7CisgICAgICAgIH07CisgICAgICAgICNlbmRpZgorICAgICAgICBfX2ttcF9lbGFwc2VkKCAmIGRhdGEgKTsKKyAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgI2VuZGlmCit9CisKK2RvdWJsZSBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX1dUSUNLKSggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIHJldHVybiBfX2ttcHNfZ2V0X3d0aWNrKCk7CisgICAgI2Vsc2UKKyAgICAgICAgZG91YmxlIGRhdGE7CisgICAgICAgIGlmICggISBfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgICAgIF9fa21wX3NlcmlhbF9pbml0aWFsaXplKCk7CisgICAgICAgIH07CisgICAgICAgIF9fa21wX2VsYXBzZWRfdGljayggJiBkYXRhICk7CisgICAgICAgIHJldHVybiBkYXRhOworICAgICNlbmRpZgorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCAqIEZUTl9TVERDQUxMCitGVE5fTUFMTE9DKCBzaXplX3QgS01QX0RFUkVGIHNpemUgKQoreworICAgIC8vIGttcGNfbWFsbG9jIGluaXRpYWxpemVzIHRoZSBsaWJyYXJ5IGlmIG5lZWRlZAorICAgIHJldHVybiBrbXBjX21hbGxvYyggS01QX0RFUkVGIHNpemUgKTsKK30KKwordm9pZCAqIEZUTl9TVERDQUxMCitGVE5fQ0FMTE9DKCBzaXplX3QgS01QX0RFUkVGIG5lbGVtLCBzaXplX3QgS01QX0RFUkVGIGVsc2l6ZSApCit7CisgICAgLy8ga21wY19jYWxsb2MgaW5pdGlhbGl6ZXMgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgICAgcmV0dXJuIGttcGNfY2FsbG9jKCBLTVBfREVSRUYgbmVsZW0sIEtNUF9ERVJFRiBlbHNpemUgKTsKK30KKwordm9pZCAqIEZUTl9TVERDQUxMCitGVE5fUkVBTExPQyggdm9pZCAqIEtNUF9ERVJFRiBwdHIsIHNpemVfdCBLTVBfREVSRUYgc2l6ZSApCit7CisgICAgLy8ga21wY19yZWFsbG9jIGluaXRpYWxpemVzIHRoZSBsaWJyYXJ5IGlmIG5lZWRlZAorICAgIHJldHVybiBrbXBjX3JlYWxsb2MoIEtNUF9ERVJFRiBwdHIsIEtNUF9ERVJFRiBzaXplICk7Cit9CisKK3ZvaWQgRlROX1NURENBTEwKK0ZUTl9GUkVFKCB2b2lkICogS01QX0RFUkVGIHB0ciApCit7CisgICAgLy8gZG9lcyBub3RoaW5nIGlmIHRoZSBsaWJyYXJ5IGlzIG5vdCBpbml0aWFsaXplZAorICAgIGttcGNfZnJlZSggS01QX0RFUkVGIHB0ciApOworfQorCit2b2lkIEZUTl9TVERDQUxMCitGVE5fU0VUX1dBUk5JTkdTX09OKCB2b2lkICkKK3sKKyAgICAjaWZuZGVmIEtNUF9TVFVCCisgICAgICAgIF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzID0ga21wX3dhcm5pbmdzX2V4cGxpY2l0OworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCitGVE5fU0VUX1dBUk5JTkdTX09GRiggdm9pZCApCit7CisgICAgI2lmbmRlZiBLTVBfU1RVQgorICAgICAgICBfX2ttcF9nZW5lcmF0ZV93YXJuaW5ncyA9IEZBTFNFOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCitGVE5fU0VUX0RFRkFVTFRTKCBjaGFyIGNvbnN0ICogc3RyCisgICAgI2lmbmRlZiBQQVNTX0FSR1NfQllfVkFMVUUKKyAgICAgICAgLCBpbnQgbGVuCisgICAgI2VuZGlmCispCit7CisgICAgI2lmbmRlZiBLTVBfU1RVQgorICAgICAgICAjaWZkZWYgUEFTU19BUkdTX0JZX1ZBTFVFCisgICAgICAgICAgICBpbnQgbGVuID0gKGludClzdHJsZW4oIHN0ciApOworICAgICAgICAjZW5kaWYKKyAgICAgICAgX19rbXBfYXV4X3NldF9kZWZhdWx0cyggc3RyLCBsZW4gKTsKKyAgICAjZW5kaWYKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworI2lmIE9NUF80MF9FTkFCTEVECisvKiByZXR1cm5zIHRoZSBzdGF0dXMgb2YgY2FuY2VsbGF0aW9uICovCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0dFVF9DQU5DRUxMQVRJT04pKHZvaWQpIHsKKyNpZmRlZiBLTVBfU1RVQgorICAgIHJldHVybiAwIC8qIGZhbHNlICovOworI2Vsc2UKKyAgICAvLyBpbml0aWFsaXplIHRoZSBsaWJyYXJ5IGlmIG5lZWRlZAorICAgIGlmICggISBfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgX19rbXBfc2VyaWFsX2luaXRpYWxpemUoKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX29tcF9jYW5jZWxsYXRpb247CisjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCitGVE5fR0VUX0NBTkNFTExBVElPTl9TVEFUVVMoaW50IGNhbmNlbF9raW5kKSB7CisjaWZkZWYgS01QX1NUVUIKKyAgICByZXR1cm4gMCAvKiBmYWxzZSAqLzsKKyNlbHNlCisgICAgcmV0dXJuIF9fa21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzKGNhbmNlbF9raW5kKTsKKyNlbmRpZgorfQorCisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKworLy8gR0NDIGNvbXBhdGliaWxpdHkgKHZlcnNpb25lZCBzeW1ib2xzKQorI2lmIEtNUF9PU19MSU5VWAorCisvKgorICAgIFRoZXNlIGZvbGxvd2luZyBzZWN0aW9ucyBjcmVhdGUgZnVuY3Rpb24gYWxpYXNlcyAoZHVtbXkgc3ltYm9scykgZm9yIHRoZSBvbXBfKiByb3V0aW5lcy4KKyAgICBUaGVzZSBhbGlhc2VzIHdpbGwgdGhlbiBiZSB2ZXJzaW9uZWQgYWNjb3JkaW5nIHRvIGhvdyBsaWJnb21wIGBgdmVyc2lvbnMnJyBpdHMgCisgICAgc3ltYm9scyAoT01QXzEuMCwgT01QXzIuMCwgT01QXzMuMCwgLi4uKSB3aGlsZSBhbHNvIHJldGFpbmluZyB0aGUgCisgICAgZGVmYXVsdCB2ZXJzaW9uIHdoaWNoIGxpYmlvbXA1IHVzZXM6IFZFUlNJT04gKGRlZmluZWQgaW4gZXhwb3J0c19zby50eHQpCisgICAgSWYgeW91IHdhbnQgdG8gc2VlIHRoZSB2ZXJzaW9uZWQgc3ltYm9scyBmb3IgbGliZ29tcC5zby4xIHRoZW4ganVzdCB0eXBlOiAKKworICAgIG9iamR1bXAgLVQgL3BhdGgvdG8vbGliZ29tcC5zby4xIHwgZ3JlcCBvbXBfCisKKyAgICBFeGFtcGxlOgorICAgIFN0ZXAgMSkgIENyZWF0ZSBfX2ttcF9hcGlfb21wX3NldF9udW1fdGhyZWFkc18xMF9hbGlhcyAKKyAgICAgICAgICAgICB3aGljaCBpcyBhbGlhcyBvZiBfX2ttcF9hcGlfb21wX3NldF9udW1fdGhyZWFkcworICAgIFN0ZXAgMikgIFNldCBfX2ttcF9hcGlfb21wX3NldF9udW1fdGhyZWFkc18xMF9hbGlhcyB0byB2ZXJzaW9uOiBvbXBfc2V0X251bV90aHJlYWRzQE9NUF8xLjAKKyAgICBTdGVwIDJCKSBTZXQgX19rbXBfYXBpX29tcF9zZXRfbnVtX3RocmVhZHMgdG8gZGVmYXVsdCB2ZXJzaW9uIDogb21wX3NldF9udW1fdGhyZWFkc0BAVkVSU0lPTgorKi8KKworLy8gT01QXzEuMCBhbGlhc2VzCit4YWxpYXNpZnkoRlROX1NFVF9OVU1fVEhSRUFEUywgICAxMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9OVU1fVEhSRUFEUywgICAxMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9NQVhfVEhSRUFEUywgICAxMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9USFJFQURfTlVNLCAgICAxMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9OVU1fUFJPQ1MsICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX0lOX1BBUkFMTEVMLCAgICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX1NFVF9EWU5BTUlDLCAgICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9EWU5BTUlDLCAgICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX1NFVF9ORVNURUQsICAgICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9ORVNURUQsICAgICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX0lOSVRfTE9DSywgICAgICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX0lOSVRfTkVTVF9MT0NLLCAgICAxMCk7Cit4YWxpYXNpZnkoRlROX0RFU1RST1lfTE9DSywgICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX0RFU1RST1lfTkVTVF9MT0NLLCAxMCk7Cit4YWxpYXNpZnkoRlROX1NFVF9MT0NLLCAgICAgICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX1NFVF9ORVNUX0xPQ0ssICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX1VOU0VUX0xPQ0ssICAgICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX1VOU0VUX05FU1RfTE9DSywgICAxMCk7Cit4YWxpYXNpZnkoRlROX1RFU1RfTE9DSywgICAgICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX1RFU1RfTkVTVF9MT0NLLCAgICAxMCk7CisKKy8vIE9NUF8yLjAgYWxpYXNlcworeGFsaWFzaWZ5KEZUTl9HRVRfV1RJQ0ssIDIwKTsKK3hhbGlhc2lmeShGVE5fR0VUX1dUSU1FLCAyMCk7CisKKyNpZiBPTVBfMzBfRU5BQkxFRAorLy8gT01QXzMuMCBhbGlhc2VzCit4YWxpYXNpZnkoRlROX1NFVF9TQ0hFRFVMRSwgICAgICAgICAgICAzMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9TQ0hFRFVMRSwgICAgICAgICAgICAzMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9USFJFQURfTElNSVQsICAgICAgICAzMCk7Cit4YWxpYXNpZnkoRlROX1NFVF9NQVhfQUNUSVZFX0xFVkVMUywgICAzMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9NQVhfQUNUSVZFX0xFVkVMUywgICAzMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9MRVZFTCwgICAgICAgICAgICAgICAzMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9BTkNFU1RPUl9USFJFQURfTlVNLCAzMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9URUFNX1NJWkUsICAgICAgICAgICAzMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9BQ1RJVkVfTEVWRUwsICAgICAgICAzMCk7Cit4YWxpYXNpZnkoRlROX0lOSVRfTE9DSywgICAgICAgICAgICAgICAzMCk7Cit4YWxpYXNpZnkoRlROX0lOSVRfTkVTVF9MT0NLLCAgICAgICAgICAzMCk7Cit4YWxpYXNpZnkoRlROX0RFU1RST1lfTE9DSywgICAgICAgICAgICAzMCk7Cit4YWxpYXNpZnkoRlROX0RFU1RST1lfTkVTVF9MT0NLLCAgICAgICAzMCk7Cit4YWxpYXNpZnkoRlROX1NFVF9MT0NLLCAgICAgICAgICAgICAgICAzMCk7Cit4YWxpYXNpZnkoRlROX1NFVF9ORVNUX0xPQ0ssICAgICAgICAgICAzMCk7Cit4YWxpYXNpZnkoRlROX1VOU0VUX0xPQ0ssICAgICAgICAgICAgICAzMCk7Cit4YWxpYXNpZnkoRlROX1VOU0VUX05FU1RfTE9DSywgICAgICAgICAzMCk7Cit4YWxpYXNpZnkoRlROX1RFU1RfTE9DSywgICAgICAgICAgICAgICAzMCk7Cit4YWxpYXNpZnkoRlROX1RFU1RfTkVTVF9MT0NLLCAgICAgICAgICAzMCk7CisKKy8vIE9NUF8zLjEgYWxpYXNlcworeGFsaWFzaWZ5KEZUTl9JTl9GSU5BTCwgMzEpOworI2VuZGlmIC8qIE9NUF8zMF9FTkFCTEVEICovCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorLy8gT01QXzQuMCBhbGlhc2VzCit4YWxpYXNpZnkoRlROX0dFVF9QUk9DX0JJTkQsIDQwKTsKK3hhbGlhc2lmeShGVE5fR0VUX05VTV9URUFNUywgNDApOworeGFsaWFzaWZ5KEZUTl9HRVRfVEVBTV9OVU0sIDQwKTsKK3hhbGlhc2lmeShGVE5fR0VUX0NBTkNFTExBVElPTiwgNDApOworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKyNpZiBPTVBfNDFfRU5BQkxFRAorLy8gT01QXzQuMSBhbGlhc2VzCisjZW5kaWYKKworI2lmIE9NUF81MF9FTkFCTEVECisvLyBPTVBfNS4wIGFsaWFzZXMKKyNlbmRpZgorCisvLyBPTVBfMS4wIHZlcnNpb25lZCBzeW1ib2xzCit4dmVyc2lvbmlmeShGVE5fU0VUX05VTV9USFJFQURTLCAgIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX0dFVF9OVU1fVEhSRUFEUywgICAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfTUFYX1RIUkVBRFMsICAgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX1RIUkVBRF9OVU0sICAgIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX0dFVF9OVU1fUFJPQ1MsICAgICAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9JTl9QQVJBTExFTCwgICAgICAgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fU0VUX0RZTkFNSUMsICAgICAgIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX0dFVF9EWU5BTUlDLCAgICAgICAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9TRVRfTkVTVEVELCAgICAgICAgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX05FU1RFRCwgICAgICAgIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX0lOSVRfTE9DSywgICAgICAgICAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9JTklUX05FU1RfTE9DSywgICAgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fREVTVFJPWV9MT0NLLCAgICAgIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX0RFU1RST1lfTkVTVF9MT0NLLCAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9TRVRfTE9DSywgICAgICAgICAgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fU0VUX05FU1RfTE9DSywgICAgIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX1VOU0VUX0xPQ0ssICAgICAgICAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9VTlNFVF9ORVNUX0xPQ0ssICAgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fVEVTVF9MT0NLLCAgICAgICAgIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX1RFU1RfTkVTVF9MT0NLLCAgICAxMCwgIk9NUF8xLjAiKTsKKworLy8gT01QXzIuMCB2ZXJzaW9uZWQgc3ltYm9scworeHZlcnNpb25pZnkoRlROX0dFVF9XVElDSywgICAgICAgICAyMCwgIk9NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfV1RJTUUsICAgICAgICAgMjAsICJPTVBfMi4wIik7CisKKyNpZiBPTVBfMzBfRU5BQkxFRAorLy8gT01QXzMuMCB2ZXJzaW9uZWQgc3ltYm9scworeHZlcnNpb25pZnkoRlROX1NFVF9TQ0hFRFVMRSwgICAgICAzMCwgIk9NUF8zLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfU0NIRURVTEUsICAgICAgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX1RIUkVBRF9MSU1JVCwgICAgICAgIDMwLCAiT01QXzMuMCIpOworeHZlcnNpb25pZnkoRlROX1NFVF9NQVhfQUNUSVZFX0xFVkVMUywgICAzMCwgIk9NUF8zLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfTUFYX0FDVElWRV9MRVZFTFMsICAgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU0sIDMwLCAiT01QXzMuMCIpOworeHZlcnNpb25pZnkoRlROX0dFVF9MRVZFTCwgICAgICAgICAgICAgICAzMCwgIk9NUF8zLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfVEVBTV9TSVpFLCAgICAgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX0FDVElWRV9MRVZFTCwgIDMwLCAiT01QXzMuMCIpOworCisvLyB0aGUgbG9jayByb3V0aW5lcyBoYXZlIGEgMS4wIGFuZCAzLjAgdmVyc2lvbgoreHZlcnNpb25pZnkoRlROX0lOSVRfTE9DSywgICAgICAgICAzMCwgIk9NUF8zLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9JTklUX05FU1RfTE9DSywgICAgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fREVTVFJPWV9MT0NLLCAgICAgIDMwLCAiT01QXzMuMCIpOworeHZlcnNpb25pZnkoRlROX0RFU1RST1lfTkVTVF9MT0NLLCAzMCwgIk9NUF8zLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9TRVRfTE9DSywgICAgICAgICAgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fU0VUX05FU1RfTE9DSywgICAgIDMwLCAiT01QXzMuMCIpOworeHZlcnNpb25pZnkoRlROX1VOU0VUX0xPQ0ssICAgICAgICAzMCwgIk9NUF8zLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9VTlNFVF9ORVNUX0xPQ0ssICAgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fVEVTVF9MT0NLLCAgICAgICAgIDMwLCAiT01QXzMuMCIpOworeHZlcnNpb25pZnkoRlROX1RFU1RfTkVTVF9MT0NLLCAgICAzMCwgIk9NUF8zLjAiKTsKKworLy8gT01QXzMuMSB2ZXJzaW9uZWQgc3ltYm9sCit4dmVyc2lvbmlmeShGVE5fSU5fRklOQUwsICAgICAgICAgIDMxLCAiT01QXzMuMSIpOworI2VuZGlmIC8qIE9NUF8zMF9FTkFCTEVEICovCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorLy8gT01QXzQuMCB2ZXJzaW9uZWQgc3ltYm9scworeHZlcnNpb25pZnkoRlROX0dFVF9QUk9DX0JJTkQsICAgICA0MCwgIk9NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfTlVNX1RFQU1TLCAgICAgNDAsICJPTVBfNC4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX1RFQU1fTlVNLCAgICAgIDQwLCAiT01QXzQuMCIpOworeHZlcnNpb25pZnkoRlROX0dFVF9DQU5DRUxMQVRJT04sICA0MCwgIk9NUF80LjAiKTsKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisjaWYgT01QXzQxX0VOQUJMRUQKKy8vIE9NUF80LjEgdmVyc2lvbmVkIHN5bWJvbHMKKyNlbmRpZgorCisjaWYgT01QXzUwX0VOQUJMRUQKKy8vIE9NUF81LjAgdmVyc2lvbmVkIHN5bWJvbHMKKyNlbmRpZgorCisjZW5kaWYgLyogS01QX09TX0xJTlVYICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIH0gLy9leHRlcm4gIkMiCisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworLy8gZW5kIG9mIGZpbGUgLy8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9mdG5fZXh0cmEuYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9mdG5fZXh0cmEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Nzc3ZTAxCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2Z0bl9leHRyYS5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBrbXBfZnRuX2V4dHJhLmMgLS0gRm9ydHJhbiAnZXh0cmEnIGxpbmthZ2Ugc3VwcG9ydCBmb3IgT3Blbk1QLgorICogJFJldmlzaW9uOiA0Mjc1NyAkCisgKiAkRGF0ZTogMjAxMy0xMC0xOCAwODoyMDo1NyAtMDUwMCAoRnJpLCAxOCBPY3QgMjAxMykgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisKKyNpZiBLTVBfT1NfV0lORE9XUworIyAgIGRlZmluZSBLTVBfRlROX0VOVFJJRVMgS01QX0ZUTl9QTEFJTgorI2VsaWYgS01QX09TX1VOSVgKKyMgICBkZWZpbmUgS01QX0ZUTl9FTlRSSUVTIEtNUF9GVE5fQVBQRU5ECisjZW5kaWYKKworLy8gTm90ZTogVGhpcyBzdHJpbmcgaXMgbm90IHByaW50ZWQgd2hlbiBLTVBfVkVSU0lPTj0xLgorY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2Z0bmV4dHJhW10gPSBLTVBfVkVSU0lPTl9QUkVGSVggIkZvcnRyYW4gXCJleHRyYVwiIE9NUCBzdXBwb3J0OiAiCisjaWZkZWYgS01QX0ZUTl9FTlRSSUVTCisgICAgInllcyI7CisjICAgZGVmaW5lIEZUTl9TVERDQUxMIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyMgICBpbmNsdWRlICJrbXBfZnRuX29zLmgiCisjICAgaW5jbHVkZSAia21wX2Z0bl9lbnRyeS5oIgorI2Vsc2UKKyAgICAibm8iOworI2VuZGlmIC8qIEtNUF9GVE5fRU5UUklFUyAqLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2Z0bl9vcy5oIGIvZmluYWwvcnVudGltZS9zcmMva21wX2Z0bl9vcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3OGQ4NDYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZnRuX29zLmgKQEAgLTAsMCArMSw1MTQgQEAKKy8qCisgKiBrbXBfZnRuX29zLmggLS0gS1BUUyBGb3J0cmFuIGRlZmluZXMgaGVhZGVyIGZpbGUuCisgKiAkUmV2aXNpb246IDQyNzQ1ICQKKyAqICREYXRlOiAyMDEzLTEwLTE0IDE3OjAyOjA0IC0wNTAwIChNb24sIDE0IE9jdCAyMDEzKSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX0ZUTl9PU19ICisjZGVmaW5lIEtNUF9GVE5fT1NfSAorCisvLyBLTVBfRk5UX0VOVFJJRVMgbWF5IGJlIG9uZSBvZjogS01QX0ZUTl9QTEFJTiwgS01QX0ZUTl9VUFBFUiwgS01QX0ZUTl9BUFBFTkQsIEtNUF9GVE5fVUFQUEVORC4KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFeHRlcm5hbCBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIEtNUF9GVE5fRU5UUklFUyA9PSBLTVBfRlROX1BMQUlOCisKKyAgICAjZGVmaW5lIEZUTl9TRVRfU1RBQ0tTSVpFICAgICAgICAgICAgICAgICAgICBrbXBfc2V0X3N0YWNrc2l6ZQorICAgICNkZWZpbmUgRlROX1NFVF9TVEFDS1NJWkVfUyAgICAgICAgICAgICAgICAgIGttcF9zZXRfc3RhY2tzaXplX3MKKyAgICAjZGVmaW5lIEZUTl9HRVRfU1RBQ0tTSVpFICAgICAgICAgICAgICAgICAgICBrbXBfZ2V0X3N0YWNrc2l6ZQorICAgICNkZWZpbmUgRlROX0dFVF9TVEFDS1NJWkVfUyAgICAgICAgICAgICAgICAgIGttcF9nZXRfc3RhY2tzaXplX3MKKyAgICAjZGVmaW5lIEZUTl9TRVRfQkxPQ0tUSU1FICAgICAgICAgICAgICAgICAgICBrbXBfc2V0X2Jsb2NrdGltZQorICAgICNkZWZpbmUgRlROX0dFVF9CTE9DS1RJTUUgICAgICAgICAgICAgICAgICAgIGttcF9nZXRfYmxvY2t0aW1lCisgICAgI2RlZmluZSBGVE5fU0VUX0xJQlJBUllfU0VSSUFMICAgICAgICAgICAgICAga21wX3NldF9saWJyYXJ5X3NlcmlhbAorICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQgICAgICAgICAgIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCisgICAgI2RlZmluZSBGVE5fU0VUX0xJQlJBUllfVEhST1VHSFBVVCAgICAgICAgICAga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyAgICAjZGVmaW5lIEZUTl9TRVRfTElCUkFSWSAgICAgICAgICAgICAgICAgICAgICBrbXBfc2V0X2xpYnJhcnkKKyAgICAjZGVmaW5lIEZUTl9HRVRfTElCUkFSWSAgICAgICAgICAgICAgICAgICAgICBrbXBfZ2V0X2xpYnJhcnkKKyAgICAjZGVmaW5lIEZUTl9TRVRfREVGQVVMVFMgICAgICAgICAgICAgICAgICAgICBrbXBfc2V0X2RlZmF1bHRzCisgICAgI2RlZmluZSBGVE5fU0VUX0FGRklOSVRZICAgICAgICAgICAgICAgICAgICAga21wX3NldF9hZmZpbml0eQorICAgICNkZWZpbmUgRlROX0dFVF9BRkZJTklUWSAgICAgICAgICAgICAgICAgICAgIGttcF9nZXRfYWZmaW5pdHkKKyAgICAjZGVmaW5lIEZUTl9HRVRfQUZGSU5JVFlfTUFYX1BST0MgICAgICAgICAgICBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisgICAgI2RlZmluZSBGVE5fQ1JFQVRFX0FGRklOSVRZX01BU0sgICAgICAgICAgICAga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCisgICAgI2RlZmluZSBGVE5fREVTVFJPWV9BRkZJTklUWV9NQVNLICAgICAgICAgICAga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworICAgICNkZWZpbmUgRlROX1NFVF9BRkZJTklUWV9NQVNLX1BST0MgICAgICAgICAgIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgI2RlZmluZSBGVE5fVU5TRVRfQUZGSU5JVFlfTUFTS19QUk9DICAgICAgICAga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICNkZWZpbmUgRlROX0dFVF9BRkZJTklUWV9NQVNLX1BST0MgICAgICAgICAgIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAjZGVmaW5lIEZUTl9NQUxMT0MgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbWFsbG9jCisgICAgI2RlZmluZSBGVE5fQ0FMTE9DICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2NhbGxvYworICAgICNkZWZpbmUgRlROX1JFQUxMT0MgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9yZWFsbG9jCisgICAgI2RlZmluZSBGVE5fRlJFRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ZyZWUKKworICAgICNkZWZpbmUgRlROX0dFVF9OVU1fS05PV05fVEhSRUFEUyAgICAgICAgICAgIGttcF9nZXRfbnVtX2tub3duX3RocmVhZHMKKworICAgICNkZWZpbmUgRlROX1NFVF9OVU1fVEhSRUFEUyAgICAgICAgICAgICAgICAgIG9tcF9zZXRfbnVtX3RocmVhZHMKKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX1RIUkVBRFMgICAgICAgICAgICAgICAgICBvbXBfZ2V0X251bV90aHJlYWRzCisgICAgI2RlZmluZSBGVE5fR0VUX01BWF9USFJFQURTICAgICAgICAgICAgICAgICAgb21wX2dldF9tYXhfdGhyZWFkcworICAgICNkZWZpbmUgRlROX0dFVF9USFJFQURfTlVNICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfdGhyZWFkX251bQorICAgICNkZWZpbmUgRlROX0dFVF9OVU1fUFJPQ1MgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfbnVtX3Byb2NzCisgICAgI2RlZmluZSBGVE5fU0VUX0RZTkFNSUMgICAgICAgICAgICAgICAgICAgICAgb21wX3NldF9keW5hbWljCisgICAgI2RlZmluZSBGVE5fR0VUX0RZTkFNSUMgICAgICAgICAgICAgICAgICAgICAgb21wX2dldF9keW5hbWljCisgICAgI2RlZmluZSBGVE5fU0VUX05FU1RFRCAgICAgICAgICAgICAgICAgICAgICAgb21wX3NldF9uZXN0ZWQKKyAgICAjZGVmaW5lIEZUTl9HRVRfTkVTVEVEICAgICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X25lc3RlZAorICAgICNkZWZpbmUgRlROX0lOX1BBUkFMTEVMICAgICAgICAgICAgICAgICAgICAgIG9tcF9pbl9wYXJhbGxlbAorICAgICNkZWZpbmUgRlROX0dFVF9USFJFQURfTElNSVQgICAgICAgICAgICAgICAgIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisgICAgI2RlZmluZSBGVE5fU0VUX1NDSEVEVUxFICAgICAgICAgICAgICAgICAgICAgb21wX3NldF9zY2hlZHVsZQorICAgICNkZWZpbmUgRlROX0dFVF9TQ0hFRFVMRSAgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfc2NoZWR1bGUKKyAgICAjZGVmaW5lIEZUTl9TRVRfTUFYX0FDVElWRV9MRVZFTFMgICAgICAgICAgICBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCisgICAgI2RlZmluZSBGVE5fR0VUX01BWF9BQ1RJVkVfTEVWRUxTICAgICAgICAgICAgb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworICAgICNkZWZpbmUgRlROX0dFVF9BQ1RJVkVfTEVWRUwgICAgICAgICAgICAgICAgIG9tcF9nZXRfYWN0aXZlX2xldmVsCisgICAgI2RlZmluZSBGVE5fR0VUX0xFVkVMICAgICAgICAgICAgICAgICAgICAgICAgb21wX2dldF9sZXZlbAorICAgICNkZWZpbmUgRlROX0dFVF9BTkNFU1RPUl9USFJFQURfTlVNICAgICAgICAgIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorICAgICNkZWZpbmUgRlROX0dFVF9URUFNX1NJWkUgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfdGVhbV9zaXplCisgICAgI2RlZmluZSBGVE5fSU5fRklOQUwgICAgICAgICAgICAgICAgICAgICAgICAgb21wX2luX2ZpbmFsCisvLyAgI2RlZmluZSBGVE5fU0VUX1BST0NfQklORCAgICAgICAgICAgICAgICAgICAgb21wX3NldF9wcm9jX2JpbmQKKyAgICAjZGVmaW5lIEZUTl9HRVRfUFJPQ19CSU5EICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X3Byb2NfYmluZAorLy8gICNkZWZpbmUgRlROX0NVUlJfUFJPQ19CSU5EICAgICAgICAgICAgICAgICAgIG9tcF9jdXJyX3Byb2NfYmluZAorI2lmIE9NUF80MF9FTkFCTEVECisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9URUFNUyAgICAgICAgICAgICAgICAgICAgb21wX2dldF9udW1fdGVhbXMKKyAgICAjZGVmaW5lIEZUTl9HRVRfVEVBTV9OVU0gICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X3RlYW1fbnVtCisjZW5kaWYKKyAgICAjZGVmaW5lIEZUTl9JTklUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICBvbXBfaW5pdF9sb2NrCisgICAgI2RlZmluZSBGVE5fREVTVFJPWV9MT0NLICAgICAgICAgICAgICAgICAgICAgb21wX2Rlc3Ryb3lfbG9jaworICAgICNkZWZpbmUgRlROX1NFVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgIG9tcF9zZXRfbG9jaworICAgICNkZWZpbmUgRlROX1VOU0VUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgIG9tcF91bnNldF9sb2NrCisgICAgI2RlZmluZSBGVE5fVEVTVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgb21wX3Rlc3RfbG9jaworICAgICNkZWZpbmUgRlROX0lOSVRfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgIG9tcF9pbml0X25lc3RfbG9jaworICAgICNkZWZpbmUgRlROX0RFU1RST1lfTkVTVF9MT0NLICAgICAgICAgICAgICAgIG9tcF9kZXN0cm95X25lc3RfbG9jaworICAgICNkZWZpbmUgRlROX1NFVF9ORVNUX0xPQ0sgICAgICAgICAgICAgICAgICAgIG9tcF9zZXRfbmVzdF9sb2NrCisgICAgI2RlZmluZSBGVE5fVU5TRVRfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgb21wX3Vuc2V0X25lc3RfbG9jaworICAgICNkZWZpbmUgRlROX1RFU1RfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgIG9tcF90ZXN0X25lc3RfbG9jaworCisgICAgI2RlZmluZSBGVE5fU0VUX1dBUk5JTkdTX09OICAgICAgICAgICAgICAgICAga21wX3NldF93YXJuaW5nc19vbgorICAgICNkZWZpbmUgRlROX1NFVF9XQVJOSU5HU19PRkYgICAgICAgICAgICAgICAgIGttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyAgICAjZGVmaW5lIEZUTl9HRVRfV1RJTUUgICAgICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X3d0aW1lCisgICAgI2RlZmluZSBGVE5fR0VUX1dUSUNLICAgICAgICAgICAgICAgICAgICAgICAgb21wX2dldF93dGljaworCisjaWYgT01QXzQwX0VOQUJMRUQKKyNpZiBLTVBfTUlDIHx8IEtNUF9PU19EQVJXSU4KKyAgICAjZGVmaW5lIEZUTl9HRVRfREVGQVVMVF9ERVZJQ0UgICAgICAgICAgICAgICBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCisgICAgI2RlZmluZSBGVE5fU0VUX0RFRkFVTFRfREVWSUNFICAgICAgICAgICAgICAgb21wX3NldF9kZWZhdWx0X2RldmljZQorICAgICNkZWZpbmUgRlROX0dFVF9OVU1fREVWSUNFUyAgICAgICAgICAgICAgICAgIG9tcF9nZXRfbnVtX2RldmljZXMKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICNkZWZpbmUgRlROX0dFVF9DQU5DRUxMQVRJT04gICAgICAgICAgICAgICAgIG9tcF9nZXRfY2FuY2VsbGF0aW9uCisgICAgI2RlZmluZSBGVE5fR0VUX0NBTkNFTExBVElPTl9TVEFUVVMgICAgICAgICAga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzCisjZW5kaWYKKworI2VuZGlmIC8qIEtNUF9GVE5fUExBSU4gKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBLTVBfRlROX0VOVFJJRVMgPT0gS01QX0ZUTl9BUFBFTkQKKworICAgICNkZWZpbmUgRlROX1NFVF9TVEFDS1NJWkUgICAgICAgICAgICAgICAgICAgIGttcF9zZXRfc3RhY2tzaXplXworICAgICNkZWZpbmUgRlROX1NFVF9TVEFDS1NJWkVfUyAgICAgICAgICAgICAgICAgIGttcF9zZXRfc3RhY2tzaXplX3NfCisgICAgI2RlZmluZSBGVE5fR0VUX1NUQUNLU0laRSAgICAgICAgICAgICAgICAgICAga21wX2dldF9zdGFja3NpemVfCisgICAgI2RlZmluZSBGVE5fR0VUX1NUQUNLU0laRV9TICAgICAgICAgICAgICAgICAga21wX2dldF9zdGFja3NpemVfc18KKyAgICAjZGVmaW5lIEZUTl9TRVRfQkxPQ0tUSU1FICAgICAgICAgICAgICAgICAgICBrbXBfc2V0X2Jsb2NrdGltZV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfQkxPQ0tUSU1FICAgICAgICAgICAgICAgICAgICBrbXBfZ2V0X2Jsb2NrdGltZV8KKyAgICAjZGVmaW5lIEZUTl9TRVRfTElCUkFSWV9TRVJJQUwgICAgICAgICAgICAgICBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsXworICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQgICAgICAgICAgIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kXworICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQgICAgICAgICAgIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0XworICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZICAgICAgICAgICAgICAgICAgICAgIGttcF9zZXRfbGlicmFyeV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfTElCUkFSWSAgICAgICAgICAgICAgICAgICAgICBrbXBfZ2V0X2xpYnJhcnlfCisgICAgI2RlZmluZSBGVE5fU0VUX0RFRkFVTFRTICAgICAgICAgICAgICAgICAgICAga21wX3NldF9kZWZhdWx0c18KKyAgICAjZGVmaW5lIEZUTl9TRVRfQUZGSU5JVFkgICAgICAgICAgICAgICAgICAgICBrbXBfc2V0X2FmZmluaXR5XworICAgICNkZWZpbmUgRlROX0dFVF9BRkZJTklUWSAgICAgICAgICAgICAgICAgICAgIGttcF9nZXRfYWZmaW5pdHlfCisgICAgI2RlZmluZSBGVE5fR0VUX0FGRklOSVRZX01BWF9QUk9DICAgICAgICAgICAga21wX2dldF9hZmZpbml0eV9tYXhfcHJvY18KKyAgICAjZGVmaW5lIEZUTl9DUkVBVEVfQUZGSU5JVFlfTUFTSyAgICAgICAgICAgICBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfCisgICAgI2RlZmluZSBGVE5fREVTVFJPWV9BRkZJTklUWV9NQVNLICAgICAgICAgICAga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza18KKyAgICAjZGVmaW5lIEZUTl9TRVRfQUZGSU5JVFlfTUFTS19QUk9DICAgICAgICAgICBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY18KKyAgICAjZGVmaW5lIEZUTl9VTlNFVF9BRkZJTklUWV9NQVNLX1BST0MgICAgICAgICBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jXworICAgICNkZWZpbmUgRlROX0dFVF9BRkZJTklUWV9NQVNLX1BST0MgICAgICAgICAgIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jXworCisgICAgI2RlZmluZSBGVE5fTUFMTE9DICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX21hbGxvY18KKyAgICAjZGVmaW5lIEZUTl9DQUxMT0MgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfY2FsbG9jXworICAgICNkZWZpbmUgRlROX1JFQUxMT0MgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9yZWFsbG9jXworICAgICNkZWZpbmUgRlROX0ZSRUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9mcmVlXworCisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9LTk9XTl9USFJFQURTICAgICAgICAgICAga21wX2dldF9udW1fa25vd25fdGhyZWFkc18KKworICAgICNkZWZpbmUgRlROX1NFVF9OVU1fVEhSRUFEUyAgICAgICAgICAgICAgICAgIG9tcF9zZXRfbnVtX3RocmVhZHNfCisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9USFJFQURTICAgICAgICAgICAgICAgICAgb21wX2dldF9udW1fdGhyZWFkc18KKyAgICAjZGVmaW5lIEZUTl9HRVRfTUFYX1RIUkVBRFMgICAgICAgICAgICAgICAgICBvbXBfZ2V0X21heF90aHJlYWRzXworICAgICNkZWZpbmUgRlROX0dFVF9USFJFQURfTlVNICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfdGhyZWFkX251bV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX1BST0NTICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X251bV9wcm9jc18KKyAgICAjZGVmaW5lIEZUTl9TRVRfRFlOQU1JQyAgICAgICAgICAgICAgICAgICAgICBvbXBfc2V0X2R5bmFtaWNfCisgICAgI2RlZmluZSBGVE5fR0VUX0RZTkFNSUMgICAgICAgICAgICAgICAgICAgICAgb21wX2dldF9keW5hbWljXworICAgICNkZWZpbmUgRlROX1NFVF9ORVNURUQgICAgICAgICAgICAgICAgICAgICAgIG9tcF9zZXRfbmVzdGVkXworICAgICNkZWZpbmUgRlROX0dFVF9ORVNURUQgICAgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfbmVzdGVkXworICAgICNkZWZpbmUgRlROX0lOX1BBUkFMTEVMICAgICAgICAgICAgICAgICAgICAgIG9tcF9pbl9wYXJhbGxlbF8KKyAgICAjZGVmaW5lIEZUTl9HRVRfVEhSRUFEX0xJTUlUICAgICAgICAgICAgICAgICBvbXBfZ2V0X3RocmVhZF9saW1pdF8KKyAgICAjZGVmaW5lIEZUTl9TRVRfU0NIRURVTEUgICAgICAgICAgICAgICAgICAgICBvbXBfc2V0X3NjaGVkdWxlXworICAgICNkZWZpbmUgRlROX0dFVF9TQ0hFRFVMRSAgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfc2NoZWR1bGVfCisgICAgI2RlZmluZSBGVE5fU0VUX01BWF9BQ1RJVkVfTEVWRUxTICAgICAgICAgICAgb21wX3NldF9tYXhfYWN0aXZlX2xldmVsc18KKyAgICAjZGVmaW5lIEZUTl9HRVRfTUFYX0FDVElWRV9MRVZFTFMgICAgICAgICAgICBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzXworICAgICNkZWZpbmUgRlROX0dFVF9BQ1RJVkVfTEVWRUwgICAgICAgICAgICAgICAgIG9tcF9nZXRfYWN0aXZlX2xldmVsXworICAgICNkZWZpbmUgRlROX0dFVF9MRVZFTCAgICAgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfbGV2ZWxfCisgICAgI2RlZmluZSBGVE5fR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU0gICAgICAgICAgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtXworICAgICNkZWZpbmUgRlROX0dFVF9URUFNX1NJWkUgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfdGVhbV9zaXplXworICAgICNkZWZpbmUgRlROX0lOX0ZJTkFMICAgICAgICAgICAgICAgICAgICAgICAgIG9tcF9pbl9maW5hbF8KKy8vICAjZGVmaW5lIEZUTl9TRVRfUFJPQ19CSU5EICAgICAgICAgICAgICAgICAgICBvbXBfc2V0X3Byb2NfYmluZF8KKyAgICAjZGVmaW5lIEZUTl9HRVRfUFJPQ19CSU5EICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X3Byb2NfYmluZF8KKy8vICAjZGVmaW5lIEZUTl9DVVJSX1BST0NfQklORCAgICAgICAgICAgICAgICAgICBvbXBfY3Vycl9wcm9jX2JpbmRfCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX1RFQU1TICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X251bV90ZWFtc18KKyAgICAjZGVmaW5lIEZUTl9HRVRfVEVBTV9OVU0gICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X3RlYW1fbnVtXworI2VuZGlmCisgICAgI2RlZmluZSBGVE5fSU5JVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgb21wX2luaXRfbG9ja18KKyAgICAjZGVmaW5lIEZUTl9ERVNUUk9ZX0xPQ0sgICAgICAgICAgICAgICAgICAgICBvbXBfZGVzdHJveV9sb2NrXworICAgICNkZWZpbmUgRlROX1NFVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgIG9tcF9zZXRfbG9ja18KKyAgICAjZGVmaW5lIEZUTl9VTlNFVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICBvbXBfdW5zZXRfbG9ja18KKyAgICAjZGVmaW5lIEZUTl9URVNUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICBvbXBfdGVzdF9sb2NrXworICAgICNkZWZpbmUgRlROX0lOSVRfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgIG9tcF9pbml0X25lc3RfbG9ja18KKyAgICAjZGVmaW5lIEZUTl9ERVNUUk9ZX05FU1RfTE9DSyAgICAgICAgICAgICAgICBvbXBfZGVzdHJveV9uZXN0X2xvY2tfCisgICAgI2RlZmluZSBGVE5fU0VUX05FU1RfTE9DSyAgICAgICAgICAgICAgICAgICAgb21wX3NldF9uZXN0X2xvY2tfCisgICAgI2RlZmluZSBGVE5fVU5TRVRfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgb21wX3Vuc2V0X25lc3RfbG9ja18KKyAgICAjZGVmaW5lIEZUTl9URVNUX05FU1RfTE9DSyAgICAgICAgICAgICAgICAgICBvbXBfdGVzdF9uZXN0X2xvY2tfCisKKyAgICAjZGVmaW5lIEZUTl9TRVRfV0FSTklOR1NfT04gICAgICAgICAgICAgICAgICBrbXBfc2V0X3dhcm5pbmdzX29uXworICAgICNkZWZpbmUgRlROX1NFVF9XQVJOSU5HU19PRkYgICAgICAgICAgICAgICAgIGttcF9zZXRfd2FybmluZ3Nfb2ZmXworCisgICAgI2RlZmluZSBGVE5fR0VUX1dUSU1FICAgICAgICAgICAgICAgICAgICAgICAgb21wX2dldF93dGltZV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfV1RJQ0sgICAgICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X3d0aWNrXworCisjaWYgT01QXzQwX0VOQUJMRUQKKyNpZiBLTVBfTUlDIHx8IEtNUF9PU19EQVJXSU4KKyAgICAjZGVmaW5lIEZUTl9HRVRfREVGQVVMVF9ERVZJQ0UgICAgICAgICAgICAgICBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlXworICAgICNkZWZpbmUgRlROX1NFVF9ERUZBVUxUX0RFVklDRSAgICAgICAgICAgICAgIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2VfCisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9ERVZJQ0VTICAgICAgICAgICAgICAgICAgb21wX2dldF9udW1fZGV2aWNlc18KKyNlbmRpZgorI2VuZGlmCisKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgI2RlZmluZSBGVE5fR0VUX0NBTkNFTExBVElPTiAgICAgICAgICAgICAgICAgb21wX2dldF9jYW5jZWxsYXRpb25fCisgICAgI2RlZmluZSBGVE5fR0VUX0NBTkNFTExBVElPTl9TVEFUVVMgICAgICAgICAga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzXworI2VuZGlmCisKKyNlbmRpZiAvKiBLTVBfRlROX0FQUEVORCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIEtNUF9GVE5fRU5UUklFUyA9PSBLTVBfRlROX1VQUEVSCisKKyAgICAjZGVmaW5lIEZUTl9TRVRfU1RBQ0tTSVpFICAgICAgICAgICAgICAgICAgICBLTVBfU0VUX1NUQUNLU0laRQorICAgICNkZWZpbmUgRlROX1NFVF9TVEFDS1NJWkVfUyAgICAgICAgICAgICAgICAgIEtNUF9TRVRfU1RBQ0tTSVpFX1MKKyAgICAjZGVmaW5lIEZUTl9HRVRfU1RBQ0tTSVpFICAgICAgICAgICAgICAgICAgICBLTVBfR0VUX1NUQUNLU0laRQorICAgICNkZWZpbmUgRlROX0dFVF9TVEFDS1NJWkVfUyAgICAgICAgICAgICAgICAgIEtNUF9HRVRfU1RBQ0tTSVpFX1MKKyAgICAjZGVmaW5lIEZUTl9TRVRfQkxPQ0tUSU1FICAgICAgICAgICAgICAgICAgICBLTVBfU0VUX0JMT0NLVElNRQorICAgICNkZWZpbmUgRlROX0dFVF9CTE9DS1RJTUUgICAgICAgICAgICAgICAgICAgIEtNUF9HRVRfQkxPQ0tUSU1FCisgICAgI2RlZmluZSBGVE5fU0VUX0xJQlJBUllfU0VSSUFMICAgICAgICAgICAgICAgS01QX1NFVF9MSUJSQVJZX1NFUklBTAorICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQgICAgICAgICAgIEtNUF9TRVRfTElCUkFSWV9UVVJOQVJPVU5ECisgICAgI2RlZmluZSBGVE5fU0VUX0xJQlJBUllfVEhST1VHSFBVVCAgICAgICAgICAgS01QX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQKKyAgICAjZGVmaW5lIEZUTl9TRVRfTElCUkFSWSAgICAgICAgICAgICAgICAgICAgICBLTVBfU0VUX0xJQlJBUlkKKyAgICAjZGVmaW5lIEZUTl9HRVRfTElCUkFSWSAgICAgICAgICAgICAgICAgICAgICBLTVBfR0VUX0xJQlJBUlkKKyAgICAjZGVmaW5lIEZUTl9TRVRfREVGQVVMVFMgICAgICAgICAgICAgICAgICAgICBLTVBfU0VUX0RFRkFVTFRTCisgICAgI2RlZmluZSBGVE5fU0VUX0FGRklOSVRZICAgICAgICAgICAgICAgICAgICAgS01QX1NFVF9BRkZJTklUWQorICAgICNkZWZpbmUgRlROX0dFVF9BRkZJTklUWSAgICAgICAgICAgICAgICAgICAgIEtNUF9HRVRfQUZGSU5JVFkKKyAgICAjZGVmaW5lIEZUTl9HRVRfQUZGSU5JVFlfTUFYX1BST0MgICAgICAgICAgICBLTVBfR0VUX0FGRklOSVRZX01BWF9QUk9DCisgICAgI2RlZmluZSBGVE5fQ1JFQVRFX0FGRklOSVRZX01BU0sgICAgICAgICAgICAgS01QX0NSRUFURV9BRkZJTklUWV9NQVNLCisgICAgI2RlZmluZSBGVE5fREVTVFJPWV9BRkZJTklUWV9NQVNLICAgICAgICAgICAgS01QX0RFU1RST1lfQUZGSU5JVFlfTUFTSworICAgICNkZWZpbmUgRlROX1NFVF9BRkZJTklUWV9NQVNLX1BST0MgICAgICAgICAgIEtNUF9TRVRfQUZGSU5JVFlfTUFTS19QUk9DCisgICAgI2RlZmluZSBGVE5fVU5TRVRfQUZGSU5JVFlfTUFTS19QUk9DICAgICAgICAgS01QX1VOU0VUX0FGRklOSVRZX01BU0tfUFJPQworICAgICNkZWZpbmUgRlROX0dFVF9BRkZJTklUWV9NQVNLX1BST0MgICAgICAgICAgIEtNUF9HRVRfQUZGSU5JVFlfTUFTS19QUk9DCisKKyAgICAjZGVmaW5lIEZUTl9NQUxMT0MgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTUFMTE9DCisgICAgI2RlZmluZSBGVE5fQ0FMTE9DICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0NBTExPQworICAgICNkZWZpbmUgRlROX1JFQUxMT0MgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9SRUFMTE9DCisgICAgI2RlZmluZSBGVE5fRlJFRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0ZSRUUKKworICAgICNkZWZpbmUgRlROX0dFVF9OVU1fS05PV05fVEhSRUFEUyAgICAgICAgICAgIEtNUF9HRVRfTlVNX0tOT1dOX1RIUkVBRFMKKworICAgICNkZWZpbmUgRlROX1NFVF9OVU1fVEhSRUFEUyAgICAgICAgICAgICAgICAgIE9NUF9TRVRfTlVNX1RIUkVBRFMKKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX1RIUkVBRFMgICAgICAgICAgICAgICAgICBPTVBfR0VUX05VTV9USFJFQURTCisgICAgI2RlZmluZSBGVE5fR0VUX01BWF9USFJFQURTICAgICAgICAgICAgICAgICAgT01QX0dFVF9NQVhfVEhSRUFEUworICAgICNkZWZpbmUgRlROX0dFVF9USFJFQURfTlVNICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfVEhSRUFEX05VTQorICAgICNkZWZpbmUgRlROX0dFVF9OVU1fUFJPQ1MgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfTlVNX1BST0NTCisgICAgI2RlZmluZSBGVE5fU0VUX0RZTkFNSUMgICAgICAgICAgICAgICAgICAgICAgT01QX1NFVF9EWU5BTUlDCisgICAgI2RlZmluZSBGVE5fR0VUX0RZTkFNSUMgICAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9EWU5BTUlDCisgICAgI2RlZmluZSBGVE5fU0VUX05FU1RFRCAgICAgICAgICAgICAgICAgICAgICAgT01QX1NFVF9ORVNURUQKKyAgICAjZGVmaW5lIEZUTl9HRVRfTkVTVEVEICAgICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX05FU1RFRAorICAgICNkZWZpbmUgRlROX0lOX1BBUkFMTEVMICAgICAgICAgICAgICAgICAgICAgIE9NUF9JTl9QQVJBTExFTAorICAgICNkZWZpbmUgRlROX0dFVF9USFJFQURfTElNSVQgICAgICAgICAgICAgICAgIE9NUF9HRVRfVEhSRUFEX0xJTUlUCisgICAgI2RlZmluZSBGVE5fU0VUX1NDSEVEVUxFICAgICAgICAgICAgICAgICAgICAgT01QX1NFVF9TQ0hFRFVMRQorICAgICNkZWZpbmUgRlROX0dFVF9TQ0hFRFVMRSAgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfU0NIRURVTEUKKyAgICAjZGVmaW5lIEZUTl9TRVRfTUFYX0FDVElWRV9MRVZFTFMgICAgICAgICAgICBPTVBfU0VUX01BWF9BQ1RJVkVfTEVWRUxTCisgICAgI2RlZmluZSBGVE5fR0VUX01BWF9BQ1RJVkVfTEVWRUxTICAgICAgICAgICAgT01QX0dFVF9NQVhfQUNUSVZFX0xFVkVMUworICAgICNkZWZpbmUgRlROX0dFVF9BQ1RJVkVfTEVWRUwgICAgICAgICAgICAgICAgIE9NUF9HRVRfQUNUSVZFX0xFVkVMCisgICAgI2RlZmluZSBGVE5fR0VUX0xFVkVMICAgICAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9MRVZFTAorICAgICNkZWZpbmUgRlROX0dFVF9BTkNFU1RPUl9USFJFQURfTlVNICAgICAgICAgIE9NUF9HRVRfQU5DRVNUT1JfVEhSRUFEX05VTQorICAgICNkZWZpbmUgRlROX0dFVF9URUFNX1NJWkUgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfVEVBTV9TSVpFCisgICAgI2RlZmluZSBGVE5fSU5fRklOQUwgICAgICAgICAgICAgICAgICAgICAgICAgT01QX0lOX0ZJTkFMCisvLyAgI2RlZmluZSBGVE5fU0VUX1BST0NfQklORCAgICAgICAgICAgICAgICAgICAgT01QX1NFVF9QUk9DX0JJTkQKKyAgICAjZGVmaW5lIEZUTl9HRVRfUFJPQ19CSU5EICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX1BST0NfQklORAorLy8gICNkZWZpbmUgRlROX0NVUlJfUFJPQ19CSU5EICAgICAgICAgICAgICAgICAgIE9NUF9DVVJSX1BST0NfQklORAorI2lmIE9NUF80MF9FTkFCTEVECisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9URUFNUyAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9OVU1fVEVBTVMKKyAgICAjZGVmaW5lIEZUTl9HRVRfVEVBTV9OVU0gICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX1RFQU1fTlVNCisjZW5kaWYKKyAgICAjZGVmaW5lIEZUTl9JTklUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICBPTVBfSU5JVF9MT0NLCisgICAgI2RlZmluZSBGVE5fREVTVFJPWV9MT0NLICAgICAgICAgICAgICAgICAgICAgT01QX0RFU1RST1lfTE9DSworICAgICNkZWZpbmUgRlROX1NFVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgIE9NUF9TRVRfTE9DSworICAgICNkZWZpbmUgRlROX1VOU0VUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgIE9NUF9VTlNFVF9MT0NLCisgICAgI2RlZmluZSBGVE5fVEVTVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgT01QX1RFU1RfTE9DSworICAgICNkZWZpbmUgRlROX0lOSVRfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgIE9NUF9JTklUX05FU1RfTE9DSworICAgICNkZWZpbmUgRlROX0RFU1RST1lfTkVTVF9MT0NLICAgICAgICAgICAgICAgIE9NUF9ERVNUUk9ZX05FU1RfTE9DSworICAgICNkZWZpbmUgRlROX1NFVF9ORVNUX0xPQ0sgICAgICAgICAgICAgICAgICAgIE9NUF9TRVRfTkVTVF9MT0NLCisgICAgI2RlZmluZSBGVE5fVU5TRVRfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgT01QX1VOU0VUX05FU1RfTE9DSworICAgICNkZWZpbmUgRlROX1RFU1RfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgIE9NUF9URVNUX05FU1RfTE9DSworCisgICAgI2RlZmluZSBGVE5fU0VUX1dBUk5JTkdTX09OICAgICAgICAgICAgICAgICAgS01QX1NFVF9XQVJOSU5HU19PTgorICAgICNkZWZpbmUgRlROX1NFVF9XQVJOSU5HU19PRkYgICAgICAgICAgICAgICAgIEtNUF9TRVRfV0FSTklOR1NfT0ZGCisKKyAgICAjZGVmaW5lIEZUTl9HRVRfV1RJTUUgICAgICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX1dUSU1FCisgICAgI2RlZmluZSBGVE5fR0VUX1dUSUNLICAgICAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9XVElDSworCisjaWYgT01QXzQwX0VOQUJMRUQKKyNpZiBLTVBfTUlDIHx8IEtNUF9PU19EQVJXSU4KKyAgICAjZGVmaW5lIEZUTl9HRVRfREVGQVVMVF9ERVZJQ0UgICAgICAgICAgICAgICBPTVBfR0VUX0RFRkFVTFRfREVWSUNFCisgICAgI2RlZmluZSBGVE5fU0VUX0RFRkFVTFRfREVWSUNFICAgICAgICAgICAgICAgT01QX1NFVF9ERUZBVUxUX0RFVklDRQorICAgICNkZWZpbmUgRlROX0dFVF9OVU1fREVWSUNFUyAgICAgICAgICAgICAgICAgIE9NUF9HRVRfTlVNX0RFVklDRVMKKyNlbmRpZgorI2VuZGlmCisKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgI2RlZmluZSBGVE5fR0VUX0NBTkNFTExBVElPTiAgICAgICAgICAgICAgICAgT01QX0dFVF9DQU5DRUxMQVRJT04KKyAgICAjZGVmaW5lIEZUTl9HRVRfQ0FOQ0VMTEFUSU9OX1NUQVRVUyAgICAgICAgICBLTVBfR0VUX0NBTkNFTExBVElPTl9TVEFUVVMKKyNlbmRpZgorCisjZW5kaWYgLyogS01QX0ZUTl9VUFBFUiAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIEtNUF9GVE5fRU5UUklFUyA9PSBLTVBfRlROX1VBUFBFTkQKKworICAgICNkZWZpbmUgRlROX1NFVF9TVEFDS1NJWkUgICAgICAgICAgICAgICAgICAgIEtNUF9TRVRfU1RBQ0tTSVpFXworICAgICNkZWZpbmUgRlROX1NFVF9TVEFDS1NJWkVfUyAgICAgICAgICAgICAgICAgIEtNUF9TRVRfU1RBQ0tTSVpFX1NfCisgICAgI2RlZmluZSBGVE5fR0VUX1NUQUNLU0laRSAgICAgICAgICAgICAgICAgICAgS01QX0dFVF9TVEFDS1NJWkVfCisgICAgI2RlZmluZSBGVE5fR0VUX1NUQUNLU0laRV9TICAgICAgICAgICAgICAgICAgS01QX0dFVF9TVEFDS1NJWkVfU18KKyAgICAjZGVmaW5lIEZUTl9TRVRfQkxPQ0tUSU1FICAgICAgICAgICAgICAgICAgICBLTVBfU0VUX0JMT0NLVElNRV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfQkxPQ0tUSU1FICAgICAgICAgICAgICAgICAgICBLTVBfR0VUX0JMT0NLVElNRV8KKyAgICAjZGVmaW5lIEZUTl9TRVRfTElCUkFSWV9TRVJJQUwgICAgICAgICAgICAgICBLTVBfU0VUX0xJQlJBUllfU0VSSUFMXworICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQgICAgICAgICAgIEtNUF9TRVRfTElCUkFSWV9UVVJOQVJPVU5EXworICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQgICAgICAgICAgIEtNUF9TRVRfTElCUkFSWV9USFJPVUdIUFVUXworICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZICAgICAgICAgICAgICAgICAgICAgIEtNUF9TRVRfTElCUkFSWV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfTElCUkFSWSAgICAgICAgICAgICAgICAgICAgICBLTVBfR0VUX0xJQlJBUllfCisgICAgI2RlZmluZSBGVE5fU0VUX0RFRkFVTFRTICAgICAgICAgICAgICAgICAgICAgS01QX1NFVF9ERUZBVUxUU18KKyAgICAjZGVmaW5lIEZUTl9TRVRfQUZGSU5JVFkgICAgICAgICAgICAgICAgICAgICBLTVBfU0VUX0FGRklOSVRZXworICAgICNkZWZpbmUgRlROX0dFVF9BRkZJTklUWSAgICAgICAgICAgICAgICAgICAgIEtNUF9HRVRfQUZGSU5JVFlfCisgICAgI2RlZmluZSBGVE5fR0VUX0FGRklOSVRZX01BWF9QUk9DICAgICAgICAgICAgS01QX0dFVF9BRkZJTklUWV9NQVhfUFJPQ18KKyAgICAjZGVmaW5lIEZUTl9DUkVBVEVfQUZGSU5JVFlfTUFTSyAgICAgICAgICAgICBLTVBfQ1JFQVRFX0FGRklOSVRZX01BU0tfCisgICAgI2RlZmluZSBGVE5fREVTVFJPWV9BRkZJTklUWV9NQVNLICAgICAgICAgICAgS01QX0RFU1RST1lfQUZGSU5JVFlfTUFTS18KKyAgICAjZGVmaW5lIEZUTl9TRVRfQUZGSU5JVFlfTUFTS19QUk9DICAgICAgICAgICBLTVBfU0VUX0FGRklOSVRZX01BU0tfUFJPQ18KKyAgICAjZGVmaW5lIEZUTl9VTlNFVF9BRkZJTklUWV9NQVNLX1BST0MgICAgICAgICBLTVBfVU5TRVRfQUZGSU5JVFlfTUFTS19QUk9DXworICAgICNkZWZpbmUgRlROX0dFVF9BRkZJTklUWV9NQVNLX1BST0MgICAgICAgICAgIEtNUF9HRVRfQUZGSU5JVFlfTUFTS19QUk9DXworCisgICAgI2RlZmluZSBGVE5fTUFMTE9DICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX01BTExPQ18KKyAgICAjZGVmaW5lIEZUTl9DQUxMT0MgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfQ0FMTE9DXworICAgICNkZWZpbmUgRlROX1JFQUxMT0MgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9SRUFMTE9DXworICAgICNkZWZpbmUgRlROX0ZSRUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9GUkVFXworCisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9LTk9XTl9USFJFQURTICAgICAgICAgICAgS01QX0dFVF9OVU1fS05PV05fVEhSRUFEU18KKworICAgICNkZWZpbmUgRlROX1NFVF9OVU1fVEhSRUFEUyAgICAgICAgICAgICAgICAgIE9NUF9TRVRfTlVNX1RIUkVBRFNfCisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9USFJFQURTICAgICAgICAgICAgICAgICAgT01QX0dFVF9OVU1fVEhSRUFEU18KKyAgICAjZGVmaW5lIEZUTl9HRVRfTUFYX1RIUkVBRFMgICAgICAgICAgICAgICAgICBPTVBfR0VUX01BWF9USFJFQURTXworICAgICNkZWZpbmUgRlROX0dFVF9USFJFQURfTlVNICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfVEhSRUFEX05VTV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX1BST0NTICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX05VTV9QUk9DU18KKyAgICAjZGVmaW5lIEZUTl9TRVRfRFlOQU1JQyAgICAgICAgICAgICAgICAgICAgICBPTVBfU0VUX0RZTkFNSUNfCisgICAgI2RlZmluZSBGVE5fR0VUX0RZTkFNSUMgICAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9EWU5BTUlDXworICAgICNkZWZpbmUgRlROX1NFVF9ORVNURUQgICAgICAgICAgICAgICAgICAgICAgIE9NUF9TRVRfTkVTVEVEXworICAgICNkZWZpbmUgRlROX0dFVF9ORVNURUQgICAgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfTkVTVEVEXworICAgICNkZWZpbmUgRlROX0lOX1BBUkFMTEVMICAgICAgICAgICAgICAgICAgICAgIE9NUF9JTl9QQVJBTExFTF8KKyAgICAjZGVmaW5lIEZUTl9HRVRfVEhSRUFEX0xJTUlUICAgICAgICAgICAgICAgICBPTVBfR0VUX1RIUkVBRF9MSU1JVF8KKyAgICAjZGVmaW5lIEZUTl9TRVRfU0NIRURVTEUgICAgICAgICAgICAgICAgICAgICBPTVBfU0VUX1NDSEVEVUxFXworICAgICNkZWZpbmUgRlROX0dFVF9TQ0hFRFVMRSAgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfU0NIRURVTEVfCisgICAgI2RlZmluZSBGVE5fU0VUX01BWF9BQ1RJVkVfTEVWRUxTICAgICAgICAgICAgT01QX1NFVF9NQVhfQUNUSVZFX0xFVkVMU18KKyAgICAjZGVmaW5lIEZUTl9HRVRfTUFYX0FDVElWRV9MRVZFTFMgICAgICAgICAgICBPTVBfR0VUX01BWF9BQ1RJVkVfTEVWRUxTXworICAgICNkZWZpbmUgRlROX0dFVF9BQ1RJVkVfTEVWRUwgICAgICAgICAgICAgICAgIE9NUF9HRVRfQUNUSVZFX0xFVkVMXworICAgICNkZWZpbmUgRlROX0dFVF9MRVZFTCAgICAgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfTEVWRUxfCisgICAgI2RlZmluZSBGVE5fR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU0gICAgICAgICAgT01QX0dFVF9BTkNFU1RPUl9USFJFQURfTlVNXworICAgICNkZWZpbmUgRlROX0dFVF9URUFNX1NJWkUgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfVEVBTV9TSVpFXworICAgICNkZWZpbmUgRlROX0lOX0ZJTkFMICAgICAgICAgICAgICAgICAgICAgICAgIE9NUF9JTl9GSU5BTF8KKy8vICAjZGVmaW5lIEZUTl9TRVRfUFJPQ19CSU5EICAgICAgICAgICAgICAgICAgICBPTVBfU0VUX1BST0NfQklORF8KKyAgICAjZGVmaW5lIEZUTl9HRVRfUFJPQ19CSU5EICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX1BST0NfQklORF8KKy8vICAjZGVmaW5lIEZUTl9DVVJSX1BST0NfQklORCAgICAgICAgICAgICAgICAgICBPTVBfQ1VSUl9QUk9DX0JJTkRfCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX1RFQU1TICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX05VTV9URUFNU18KKyAgICAjZGVmaW5lIEZUTl9HRVRfVEVBTV9OVU0gICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX1RFQU1fTlVNXworI2VuZGlmCisgICAgI2RlZmluZSBGVE5fSU5JVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgT01QX0lOSVRfTE9DS18KKyAgICAjZGVmaW5lIEZUTl9ERVNUUk9ZX0xPQ0sgICAgICAgICAgICAgICAgICAgICBPTVBfREVTVFJPWV9MT0NLXworICAgICNkZWZpbmUgRlROX1NFVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgIE9NUF9TRVRfTE9DS18KKyAgICAjZGVmaW5lIEZUTl9VTlNFVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICBPTVBfVU5TRVRfTE9DS18KKyAgICAjZGVmaW5lIEZUTl9URVNUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICBPTVBfVEVTVF9MT0NLXworICAgICNkZWZpbmUgRlROX0lOSVRfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgIE9NUF9JTklUX05FU1RfTE9DS18KKyAgICAjZGVmaW5lIEZUTl9ERVNUUk9ZX05FU1RfTE9DSyAgICAgICAgICAgICAgICBPTVBfREVTVFJPWV9ORVNUX0xPQ0tfCisgICAgI2RlZmluZSBGVE5fU0VUX05FU1RfTE9DSyAgICAgICAgICAgICAgICAgICAgT01QX1NFVF9ORVNUX0xPQ0tfCisgICAgI2RlZmluZSBGVE5fVU5TRVRfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgT01QX1VOU0VUX05FU1RfTE9DS18KKyAgICAjZGVmaW5lIEZUTl9URVNUX05FU1RfTE9DSyAgICAgICAgICAgICAgICAgICBPTVBfVEVTVF9ORVNUX0xPQ0tfCisKKyAgICAjZGVmaW5lIEZUTl9TRVRfV0FSTklOR1NfT04gICAgICAgICAgICAgICAgICBLTVBfU0VUX1dBUk5JTkdTX09OXworICAgICNkZWZpbmUgRlROX1NFVF9XQVJOSU5HU19PRkYgICAgICAgICAgICAgICAgIEtNUF9TRVRfV0FSTklOR1NfT0ZGXworCisgICAgI2RlZmluZSBGVE5fR0VUX1dUSU1FICAgICAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9XVElNRV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfV1RJQ0sgICAgICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX1dUSUNLXworCisjaWYgT01QXzQwX0VOQUJMRUQKKyNpZiBLTVBfTUlDIHx8IEtNUF9PU19EQVJXSU4KKyAgICAjZGVmaW5lIEZUTl9HRVRfREVGQVVMVF9ERVZJQ0UgICAgICAgICAgICAgICBPTVBfR0VUX0RFRkFVTFRfREVWSUNFXworICAgICNkZWZpbmUgRlROX1NFVF9ERUZBVUxUX0RFVklDRSAgICAgICAgICAgICAgIE9NUF9TRVRfREVGQVVMVF9ERVZJQ0VfCisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9ERVZJQ0VTICAgICAgICAgICAgICAgICAgT01QX0dFVF9OVU1fREVWSUNFU18KKyNlbmRpZgorI2VuZGlmCisKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgI2RlZmluZSBGVE5fR0VUX0NBTkNFTExBVElPTiAgICAgICAgICAgICAgICAgT01QX0dFVF9DQU5DRUxMQVRJT05fCisgICAgI2RlZmluZSBGVE5fR0VUX0NBTkNFTExBVElPTl9TVEFUVVMgICAgICAgICAgS01QX0dFVF9DQU5DRUxMQVRJT05fU1RBVFVTXworI2VuZGlmCisKKyNlbmRpZiAvKiBLTVBfRlROX1VBUFBFTkQgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHT01QIEFQSSBOQU1FUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8vIEFsbCBHT01QXzEuMCBzeW1ib2xzCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0FUT01JQ19FTkQgICAgICAgICAgICAgICAgICAgR09NUF9hdG9taWNfZW5kCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0FUT01JQ19TVEFSVCAgICAgICAgICAgICAgICAgR09NUF9hdG9taWNfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfQkFSUklFUiAgICAgICAgICAgICAgICAgICAgICBHT01QX2JhcnJpZXIKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfRU5EICAgICAgICAgICAgICAgICBHT01QX2NyaXRpY2FsX2VuZAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9DUklUSUNBTF9OQU1FX0VORCAgICAgICAgICAgIEdPTVBfY3JpdGljYWxfbmFtZV9lbmQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfTkFNRV9TVEFSVCAgICAgICAgICBHT01QX2NyaXRpY2FsX25hbWVfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfU1RBUlQgICAgICAgICAgICAgICBHT01QX2NyaXRpY2FsX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRFlOQU1JQ19ORVhUICAgICAgICAgICAgR09NUF9sb29wX2R5bmFtaWNfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX0RZTkFNSUNfU1RBUlQgICAgICAgICAgIEdPTVBfbG9vcF9keW5hbWljX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRU5EICAgICAgICAgICAgICAgICAgICAgR09NUF9sb29wX2VuZAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX0VORF9OT1dBSVQgICAgICAgICAgICAgIEdPTVBfbG9vcF9lbmRfbm93YWl0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfR1VJREVEX05FWFQgICAgICAgICAgICAgR09NUF9sb29wX2d1aWRlZF9uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfR1VJREVEX1NUQVJUICAgICAgICAgICAgR09NUF9sb29wX2d1aWRlZF9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfRFlOQU1JQ19ORVhUICAgIEdPTVBfbG9vcF9vcmRlcmVkX2R5bmFtaWNfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfRFlOQU1JQ19TVEFSVCAgIEdPTVBfbG9vcF9vcmRlcmVkX2R5bmFtaWNfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX0dVSURFRF9ORVhUICAgICBHT01QX2xvb3Bfb3JkZXJlZF9ndWlkZWRfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfR1VJREVEX1NUQVJUICAgIEdPTVBfbG9vcF9vcmRlcmVkX2d1aWRlZF9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfUlVOVElNRV9ORVhUICAgIEdPTVBfbG9vcF9vcmRlcmVkX3J1bnRpbWVfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfUlVOVElNRV9TVEFSVCAgIEdPTVBfbG9vcF9vcmRlcmVkX3J1bnRpbWVfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX1NUQVRJQ19ORVhUICAgICBHT01QX2xvb3Bfb3JkZXJlZF9zdGF0aWNfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfU1RBVElDX1NUQVJUICAgIEdPTVBfbG9vcF9vcmRlcmVkX3N0YXRpY19zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1JVTlRJTUVfTkVYVCAgICAgICAgICAgIEdPTVBfbG9vcF9ydW50aW1lX25leHQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9SVU5USU1FX1NUQVJUICAgICAgICAgICBHT01QX2xvb3BfcnVudGltZV9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1NUQVRJQ19ORVhUICAgICAgICAgICAgIEdPTVBfbG9vcF9zdGF0aWNfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1NUQVRJQ19TVEFSVCAgICAgICAgICAgIEdPTVBfbG9vcF9zdGF0aWNfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfT1JERVJFRF9FTkQgICAgICAgICAgICAgICAgICBHT01QX29yZGVyZWRfZW5kCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX09SREVSRURfU1RBUlQgICAgICAgICAgICAgICAgR09NUF9vcmRlcmVkX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0VORCAgICAgICAgICAgICAgICAgR09NUF9wYXJhbGxlbF9lbmQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9EWU5BTUlDX1NUQVJUICBHT01QX3BhcmFsbGVsX2xvb3BfZHluYW1pY19zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0dVSURFRF9TVEFSVCAgIEdPTVBfcGFyYWxsZWxfbG9vcF9ndWlkZWRfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9SVU5USU1FX1NUQVJUICBHT01QX3BhcmFsbGVsX2xvb3BfcnVudGltZV9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX1NUQVRJQ19TVEFSVCAgIEdPTVBfcGFyYWxsZWxfbG9vcF9zdGF0aWNfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfU0VDVElPTlNfU1RBUlQgICAgICBHT01QX3BhcmFsbGVsX3NlY3Rpb25zX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX1NUQVJUICAgICAgICAgICAgICAgR09NUF9wYXJhbGxlbF9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19FTkQgICAgICAgICAgICAgICAgIEdPTVBfc2VjdGlvbnNfZW5kCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX0VORF9OT1dBSVQgICAgICAgICAgR09NUF9zZWN0aW9uc19lbmRfbm93YWl0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX05FWFQgICAgICAgICAgICAgICAgR09NUF9zZWN0aW9uc19uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX1NUQVJUICAgICAgICAgICAgICAgR09NUF9zZWN0aW9uc19zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9TSU5HTEVfQ09QWV9FTkQgICAgICAgICAgICAgIEdPTVBfc2luZ2xlX2NvcHlfZW5kCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1NJTkdMRV9DT1BZX1NUQVJUICAgICAgICAgICAgR09NUF9zaW5nbGVfY29weV9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9TSU5HTEVfU1RBUlQgICAgICAgICAgICAgICAgIEdPTVBfc2luZ2xlX3N0YXJ0CisKKy8vIEFsbCBHT01QXzIuMCBzeW1ib2xzCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1RBU0sgICAgICAgICAgICAgICAgICAgICAgICAgICBHT01QX3Rhc2sKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfVEFTS1dBSVQgICAgICAgICAgICAgICAgICAgICAgIEdPTVBfdGFza3dhaXQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfRFlOQU1JQ19ORVhUICAgICAgICAgIEdPTVBfbG9vcF91bGxfZHluYW1pY19uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX0RZTkFNSUNfU1RBUlQgICAgICAgICBHT01QX2xvb3BfdWxsX2R5bmFtaWNfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfR1VJREVEX05FWFQgICAgICAgICAgIEdPTVBfbG9vcF91bGxfZ3VpZGVkX25leHQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfR1VJREVEX1NUQVJUICAgICAgICAgIEdPTVBfbG9vcF91bGxfZ3VpZGVkX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfRFlOQU1JQ19ORVhUICBHT01QX2xvb3BfdWxsX29yZGVyZWRfZHluYW1pY19uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfRFlOQU1JQ19TVEFSVCBHT01QX2xvb3BfdWxsX29yZGVyZWRfZHluYW1pY19zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX0dVSURFRF9ORVhUICAgR09NUF9sb29wX3VsbF9vcmRlcmVkX2d1aWRlZF9uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfR1VJREVEX1NUQVJUICBHT01QX2xvb3BfdWxsX29yZGVyZWRfZ3VpZGVkX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfUlVOVElNRV9ORVhUICBHT01QX2xvb3BfdWxsX29yZGVyZWRfcnVudGltZV9uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfUlVOVElNRV9TVEFSVCBHT01QX2xvb3BfdWxsX29yZGVyZWRfcnVudGltZV9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1NUQVRJQ19ORVhUICAgR09NUF9sb29wX3VsbF9vcmRlcmVkX3N0YXRpY19uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfU1RBVElDX1NUQVJUICBHT01QX2xvb3BfdWxsX29yZGVyZWRfc3RhdGljX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1JVTlRJTUVfTkVYVCAgICAgICAgICBHT01QX2xvb3BfdWxsX3J1bnRpbWVfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9SVU5USU1FX1NUQVJUICAgICAgICAgR09NUF9sb29wX3VsbF9ydW50aW1lX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1NUQVRJQ19ORVhUICAgICAgICAgICBHT01QX2xvb3BfdWxsX3N0YXRpY19uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1NUQVRJQ19TVEFSVCAgICAgICAgICBHT01QX2xvb3BfdWxsX3N0YXRpY19zdGFydAorCisvLyBBbGwgR09NUF8zLjAgc3ltYm9scworI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9UQVNLWUlFTEQgICAgICAgICAgICAgICAgICAgICAgR09NUF90YXNreWllbGQKKworLy8gQWxsIEdPTVBfNC4wIHN5bWJvbHMgCisvLyBUT0RPOiBBcyBvZiAyMDEzLTEwLTE0LCBub25lIG9mIHRoZSBHT01QXzQuMCBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIGluIGxpYmlvbXA1CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0JBUlJJRVJfQ0FOQ0VMICAgICAgICAgICAgICAgICBHT01QX2JhcnJpZXJfY2FuY2VsCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0NBTkNFTCAgICAgICAgICAgICAgICAgICAgICAgICBHT01QX2NhbmNlbAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9DQU5DRUxMQVRJT05fUE9JTlQgICAgICAgICAgICAgR09NUF9jYW5jZWxsYXRpb25fcG9pbnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9FTkRfQ0FOQ0VMICAgICAgICAgICAgICAgIEdPTVBfbG9vcF9lbmRfY2FuY2VsCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfRFlOQU1JQyAgICAgICAgICBHT01QX3BhcmFsbGVsX2xvb3BfZHluYW1pYworI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0dVSURFRCAgICAgICAgICAgR09NUF9wYXJhbGxlbF9sb29wX2d1aWRlZAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX1JVTlRJTUUgICAgICAgICAgR09NUF9wYXJhbGxlbF9sb29wX3J1bnRpbWUKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9TVEFUSUMgICAgICAgICAgIEdPTVBfcGFyYWxsZWxfbG9vcF9zdGF0aWMKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfU0VDVElPTlMgICAgICAgICAgICAgIEdPTVBfcGFyYWxsZWxfc2VjdGlvbnMKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUwgICAgICAgICAgICAgICAgICAgICAgIEdPTVBfcGFyYWxsZWwKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfU0VDVElPTlNfRU5EX0NBTkNFTCAgICAgICAgICAgIEdPTVBfc2VjdGlvbnNfZW5kX2NhbmNlbAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9UQVNLR1JPVVBfU1RBUlQgICAgICAgICAgICAgICAgR09NUF90YXNrZ3JvdXBfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfVEFTS0dST1VQX0VORCAgICAgICAgICAgICAgICAgIEdPTVBfdGFza2dyb3VwX2VuZAorLyogVGFyZ2V0IGZ1bmN0aW9ucyBzaG91bGQgYmUgdGFrZW4gY2FyZSBvZiBieSBsaWJvZmZsb2FkICovCisvLyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfVEFSR0VUICAgICAgICAgICAgICAgICAgICAgICBHT01QX3RhcmdldAorLy8jZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1RBUkdFVF9EQVRBICAgICAgICAgICAgICAgICAgR09NUF90YXJnZXRfZGF0YQorLy8jZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1RBUkdFVF9FTkRfREFUQSAgICAgICAgICAgICAgR09NUF90YXJnZXRfZW5kX2RhdGEKKy8vI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9UQVJHRVRfVVBEQVRFICAgICAgICAgICAgICAgIEdPTVBfdGFyZ2V0X3VwZGF0ZQorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9URUFNUyAgICAgICAgICAgICAgICAgICAgICAgICAgR09NUF90ZWFtcworCisjaWYgS01QX09TX0xJTlVYICYmICFLTVBfT1NfQ05LICYmICFLTVBfQVJDSF9QUEM2NAorICAgICNkZWZpbmUgeHN0cih4KSBzdHIoeCkgCisgICAgI2RlZmluZSBzdHIoeCkgI3gKKworICAgIC8vIElmIExpbnV4LCB4ZXhwYW5kIHByZXBlbmRzIF9fa21wX2FwaV8gdG8gdGhlIHJlYWwgQVBJIG5hbWUKKyAgICAjZGVmaW5lIHhleHBhbmQoYXBpX25hbWUpIGV4cGFuZChhcGlfbmFtZSkKKyAgICAjZGVmaW5lIGV4cGFuZChhcGlfbmFtZSkgX19rbXBfYXBpXyMjYXBpX25hbWUKKworICAgICNkZWZpbmUgeGFsaWFzaWZ5KGFwaV9uYW1lLHZlcikgYWxpYXNpZnkoYXBpX25hbWUsdmVyKQorICAgICNkZWZpbmUgYWxpYXNpZnkoYXBpX25hbWUsdmVyKSBfX3R5cGVvZl9fKF9fa21wX2FwaV8jI2FwaV9uYW1lKSBfX2ttcF9hcGlfIyNhcGlfbmFtZSMjXyMjdmVyIyNfYWxpYXMgX19hdHRyaWJ1dGVfXygoYWxpYXMoeHN0cihfX2ttcF9hcGlfIyNhcGlfbmFtZSkpKSkKKworICAgICNkZWZpbmUgeHZlcnNpb25pZnkoYXBpX25hbWUsIHZlcnNpb25fbnVtLCB2ZXJzaW9uX3N0cikgdmVyc2lvbmlmeShhcGlfbmFtZSwgdmVyc2lvbl9udW0sIHZlcnNpb25fc3RyLCAiVkVSU0lPTiIpCisgICAgI2RlZmluZSB2ZXJzaW9uaWZ5KGFwaV9uYW1lLCB2ZXJzaW9uX251bSwgdmVyc2lvbl9zdHIsIGRlZmF1bHRfdmVyKSBcCisgICAgX19hc21fXygiLnN5bXZlciAiIHhzdHIoX19rbXBfYXBpXyMjYXBpX25hbWUjI18jI3ZlcnNpb25fbnVtIyNfYWxpYXMpICIsIiB4c3RyKGFwaV9uYW1lKSAiQCIgdmVyc2lvbl9zdHIgIlxuXHQiKTsgXAorICAgIF9fYXNtX18oIi5zeW12ZXIgIiB4c3RyKF9fa21wX2FwaV8jI2FwaV9uYW1lKSAiLCIgeHN0cihhcGlfbmFtZSkgIkBAIiBkZWZhdWx0X3ZlciAiXG5cdCIpCisKKyNlbHNlIC8qIEtNUF9PU19MSU5VWCAqLworICAgICNkZWZpbmUgeHN0cih4KSAvKiBOb3RoaW5nICovCisgICAgI2RlZmluZSBzdHIoeCkgIC8qIE5vdGhpbmcgKi8KKworICAgIC8vIGlmIFdpbmRvd3Mgb3IgTWFjLCB4ZXhwYW5kIGRvZXMgbm8gbmFtZSB0cmFuc2Zvcm1hdGlvbgorICAgICNkZWZpbmUgeGV4cGFuZChhcGlfbmFtZSkgZXhwYW5kKGFwaV9uYW1lKQorICAgICNkZWZpbmUgZXhwYW5kKGFwaV9uYW1lKSBhcGlfbmFtZQorCisgICAgI2RlZmluZSB4YWxpYXNpZnkoYXBpX25hbWUsdmVyKSAvKiBOb3RoaW5nICovCisgICAgI2RlZmluZSBhbGlhc2lmeShhcGlfbmFtZSx2ZXIpICAvKiBOb3RoaW5nICovCisKKyAgICAjZGVmaW5lIHh2ZXJzaW9uaWZ5KGFwaV9uYW1lLCB2ZXJzaW9uX251bSwgdmVyc2lvbl9zdHIpIC8qIE5vdGhpbmcgKi8KKyAgICAjZGVmaW5lIHZlcnNpb25pZnkoYXBpX25hbWUsIHZlcnNpb25fbnVtLCB2ZXJzaW9uX3N0ciwgZGVmYXVsdF92ZXIpIC8qIE5vdGhpbmcgKi8KKworI2VuZGlmIC8qIEtNUF9PU19MSU5VWCAqLworCisjZW5kaWYgLyogS01QX0ZUTl9PU19IICovCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9mdG5fc3RkY2FsbC5jIGIvZmluYWwvcnVudGltZS9zcmMva21wX2Z0bl9zdGRjYWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcxYmMwNgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9mdG5fc3RkY2FsbC5jCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBrbXBfZnRuX3N0ZGNhbGwuYyAtLSBGb3J0cmFuIF9fc3RkY2FsbCBsaW5rYWdlIHN1cHBvcnQgZm9yIE9wZW5NUC4KKyAqICRSZXZpc2lvbjogNDIwNjEgJAorICogJERhdGU6IDIwMTMtMDItMjggMTY6MzY6MjQgLTA2MDAgKFRodSwgMjggRmViIDIwMTMpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorCisvLyBOb3RlOiBUaGlzIHN0cmluZyBpcyBub3QgcHJpbnRlZCB3aGVuIEtNUF9WRVJTSU9OPTEuCitjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fZnRuc3RkY2FsbFtdID0gS01QX1ZFUlNJT05fUFJFRklYICJGb3J0cmFuIF9fc3RkY2FsbCBPTVAgc3VwcG9ydDogIgorI2lmZGVmIFVTRV9GVE5fU1REQ0FMTAorICAgICJ5ZXMiOworI2Vsc2UKKyAgICAibm8iOworI2VuZGlmCisKKyNpZmRlZiBVU0VfRlROX1NURENBTEwKKworI2RlZmluZSBGVE5fU1REQ0FMTCAJS01QX1NURENBTEwKKyNkZWZpbmUgS01QX0ZUTl9FTlRSSUVTCVVTRV9GVE5fU1REQ0FMTAorCisjaW5jbHVkZSAia21wX2Z0bl9vcy5oIgorI2luY2x1ZGUgImttcF9mdG5fZW50cnkuaCIKKworI2VuZGlmIC8qIFVTRV9GVE5fU1REQ0FMTCAqLworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfZ2xvYmFsLmMgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZ2xvYmFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNjMzE5NQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9nbG9iYWwuYwpAQCAtMCwwICsxLDQzNSBAQAorLyoKKyAqIGttcF9nbG9iYWwuYyAtLSBLUFRTIGdsb2JhbCB2YXJpYWJsZXMgZm9yIHJ1bnRpbWUgc3VwcG9ydCBsaWJyYXJ5CisgKiAkUmV2aXNpb246IDQyODE2ICQKKyAqICREYXRlOiAyMDEzLTExLTExIDE1OjMzOjM3IC0wNjAwIChNb24sIDExIE5vdiAyMDEzKSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKworI2lmZGVmIEtNUF9TRVRWRVJTSU9OCitjaGFyIF9fa21wX3NldHZlcnNpb25fc3RyaW5nW10gPSBWRVJTSU9OX1NUUklORzsKKyNlbmRpZgorCitrbXBfa2V5X3QgX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleTsKKwora21wX2NwdWluZm9fdCAgIF9fa21wX2NwdWluZm8gPSB7IDAgfTsgLy8gTm90IGluaXRpYWxpemVkCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIElOSVRJQUxJWkFUSU9OIFZBUklBQkxFUyAqLworLyogdGhleSBhcmUgc3luY3Jvbml6ZWQgdG8gd3JpdGUgZHVyaW5nIGluaXQsIGJ1dCByZWFkIGFueXRpbWUgKi8KK3ZvbGF0aWxlIGludCAgICAgICAgX19rbXBfaW5pdF9zZXJpYWwgICAgID0gRkFMU0U7Cit2b2xhdGlsZSBpbnQgICAgICAgIF9fa21wX2luaXRfZ3RpZCAgICAgICA9IEZBTFNFOwordm9sYXRpbGUgaW50ICAgICAgICBfX2ttcF9pbml0X2NvbW1vbiAgICAgPSBGQUxTRTsKK3ZvbGF0aWxlIGludCAgICAgICAgX19rbXBfaW5pdF9taWRkbGUgICAgID0gRkFMU0U7Cit2b2xhdGlsZSBpbnQgICAgICAgIF9fa21wX2luaXRfcGFyYWxsZWwgICA9IEZBTFNFOwordm9sYXRpbGUgaW50ICAgICAgICBfX2ttcF9pbml0X21vbml0b3IgICAgPSAwOyAgLyogMSAtIGxhdW5jaGVkLCAyIC0gYWN0dWFsbHkgc3RhcnRlZCAoV2luZG93cyogT1Mgb25seSkgKi8KK3ZvbGF0aWxlIGludCAgICAgICAgX19rbXBfaW5pdF91c2VyX2xvY2tzID0gRkFMU0U7CisKKy8qIGxpc3Qgb2YgYWRkcmVzcyBvZiBhbGxvY2F0ZWQgY2FjaGVzIGZvciBjb21tb25zICovCitrbXBfY2FjaGVkX2FkZHJfdCAgKl9fa21wX3RocmVhZHByaXZfY2FjaGVfbGlzdCA9IE5VTEw7CisKK2ludCAgICAgICAgICAgICAgICAgX19rbXBfaW5pdF9jb3VudGVyICA9IDA7CitpbnQgICAgICAgICAgICAgICAgIF9fa21wX3Jvb3RfY291bnRlciAgPSAwOworaW50ICAgICAgICAgICAgICAgICBfX2ttcF92ZXJzaW9uICAgICAgID0gMDsKKwordm9sYXRpbGUga21wX3VpbnQzMiBfX2ttcF90ZWFtX2NvdW50ZXIgID0gMDsKK3ZvbGF0aWxlIGttcF91aW50MzIgX19rbXBfdGFza19jb3VudGVyICA9IDA7CisKK3Vuc2lnbmVkIGludCBfX2ttcF9pbml0X3dhaXQgPSBLTVBfREVGQVVMVF9JTklUX1dBSVQ7ICAgLyogaW5pdGlhbCBudW1iZXIgb2Ygc3Bpbi10ZXN0cyAgICovCit1bnNpZ25lZCBpbnQgX19rbXBfbmV4dF93YWl0ID0gS01QX0RFRkFVTFRfTkVYVF9XQUlUOyAgIC8qIHN1c2VxdWVudCBudW1iZXIgb2Ygc3Bpbi10ZXN0cyAqLworCitzaXplX3QgICAgICBfX2ttcF9zdGtzaXplICAgICAgICAgPSBLTVBfREVGQVVMVF9TVEtTSVpFOworc2l6ZV90ICAgICAgX19rbXBfbW9uaXRvcl9zdGtzaXplID0gMDsgIC8vIGF1dG8gYWRqdXN0CitzaXplX3QgICAgICBfX2ttcF9zdGtvZmZzZXQgICAgICAgPSBLTVBfREVGQVVMVF9TVEtPRkZTRVQ7CisKK3NpemVfdCAgICBfX2ttcF9tYWxsb2NfcG9vbF9pbmNyICA9IEtNUF9ERUZBVUxUX01BTExPQ19QT09MX0lOQ1I7CisKKy8qIEJhcnJpZXIgbWV0aG9kIGRlZmF1bHRzLCBzZXR0aW5ncywgYW5kIHN0cmluZ3MgKi8KKy8qIGJyYW5jaCBmYWN0b3IgPSAyXmJyYW5jaF9iaXRzIChvbmx5IHJlbGV2YW50IGZvciB0cmVlIGFuZCBoeXBlciBiYXJyaWVyIHR5cGVzKSAqLworI2lmIEtNUF9BUkNIX1g4Nl82NAora21wX3VpbnQzMiBfX2ttcF9iYXJyaWVyX2dhdGhlcl9iYl9kZmx0ICAgICAgPSAyOyAgLyogYnJhbmNoX2ZhY3RvciA9IDQgKi8gLyogaHlwZXIyOiBDNzg5ODAgKi8KK2ttcF91aW50MzIgX19rbXBfYmFycmllcl9yZWxlYXNlX2JiX2RmbHQgICAgID0gMjsgIC8qIGJyYW5jaF9mYWN0b3IgPSA0ICovIC8qIGh5cGVyMjogQzc4OTgwICovCisjZWxzZQora21wX3VpbnQzMiBfX2ttcF9iYXJyaWVyX2dhdGhlcl9iYl9kZmx0ICAgICAgPSAyOyAgLyogYnJhbmNoX2ZhY3RvciA9IDQgKi8gLyogY29tbXVuaWNhdGlvbiBpbiBjb3JlIGZvciBNSUMgKi8KK2ttcF91aW50MzIgX19rbXBfYmFycmllcl9yZWxlYXNlX2JiX2RmbHQgICAgID0gMjsgIC8qIGJyYW5jaF9mYWN0b3IgPSA0ICovIC8qIGNvbW11bmljYXRpb24gaW4gY29yZSBmb3IgTUlDICovCisjZW5kaWYgLy8gS01QX0FSQ0hfWDg2XzY0CisjaWYgS01QX0FSQ0hfWDg2XzY0CitrbXBfYmFyX3BhdF9lIF9fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdF9kZmx0ICA9IGJwX2h5cGVyX2JhcjsgIC8qIGh5cGVyMjogQzc4OTgwICovCitrbXBfYmFyX3BhdF9lIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXRfZGZsdCA9IGJwX2h5cGVyX2JhcjsgIC8qIGh5cGVyMjogQzc4OTgwICovCisjZWxzZQora21wX2Jhcl9wYXRfZSBfX2ttcF9iYXJyaWVyX2dhdGhlcl9wYXRfZGZsdCAgPSBicF9saW5lYXJfYmFyOwora21wX2Jhcl9wYXRfZSBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfcGF0X2RmbHQgPSBicF9saW5lYXJfYmFyOworI2VuZGlmCitrbXBfdWludDMyIF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JyYW5jaF9iaXRzICBbIGJzX2xhc3RfYmFycmllciBdID0geyAwIH07CitrbXBfdWludDMyIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0cyBbIGJzX2xhc3RfYmFycmllciBdID0geyAwIH07CitrbXBfYmFyX3BhdF9lIF9fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdHRlcm4gICBbIGJzX2xhc3RfYmFycmllciBdID0geyBicF9saW5lYXJfYmFyIH07CitrbXBfYmFyX3BhdF9lIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXR0ZXJuICBbIGJzX2xhc3RfYmFycmllciBdID0geyBicF9saW5lYXJfYmFyIH07CitjaGFyIGNvbnN0ICpfX2ttcF9iYXJyaWVyX2JyYW5jaF9iaXRfZW52X25hbWUgWyBic19sYXN0X2JhcnJpZXIgXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAiS01QX1BMQUlOX0JBUlJJRVIiLCAiS01QX0ZPUktKT0lOX0JBUlJJRVIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNpZiBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAiS01QX1JFRFVDVElPTl9CQVJSSUVSIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZW5kaWYgLy8gS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworY2hhciBjb25zdCAqX19rbXBfYmFycmllcl9wYXR0ZXJuX2Vudl9uYW1lICAgIFsgYnNfbGFzdF9iYXJyaWVyIF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgIktNUF9QTEFJTl9CQVJSSUVSX1BBVFRFUk4iLCAiS01QX0ZPUktKT0lOX0JBUlJJRVJfUEFUVEVSTiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2lmIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICJLTVBfUkVEVUNUSU9OX0JBUlJJRVJfUEFUVEVSTiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2VuZGlmIC8vIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKK2NoYXIgY29uc3QgKl9fa21wX2JhcnJpZXJfdHlwZV9uYW1lICAgICAgICAgICBbIGJzX2xhc3RfYmFycmllciBdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICJwbGFpbiIsICJmb3Jram9pbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2lmIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICJyZWR1Y3Rpb24iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNlbmRpZiAvLyBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CitjaGFyIGNvbnN0ICpfX2ttcF9iYXJyaWVyX3BhdHRlcm5fbmFtZSBbIGJwX2xhc3RfYmFyIF0gPSB7ICJsaW5lYXIiLCAidHJlZSIsICJoeXBlciIgfTsKKworCitpbnQgICAgICAgX19rbXBfYWxsVGhyZWFkc1NwZWNpZmllZCA9IDA7CitzaXplX3QgICAgX19rbXBfYWxpZ25fYWxsb2MgPSBDQUNIRV9MSU5FOworCisKK2ludCAgICAgX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MgPSBrbXBfd2FybmluZ3NfbG93OworaW50ICAgICAgICAgIF9fa21wX3Jlc2VydmVfd2FybiA9IDA7CitpbnQgICAgICAgICAgICAgICAgIF9fa21wX3hwcm9jID0gMDsKK2ludCAgICAgICAgICAgIF9fa21wX2F2YWlsX3Byb2MgPSAwOworc2l6ZV90ICAgIF9fa21wX3N5c19taW5fc3Rrc2l6ZSA9IEtNUF9NSU5fU1RLU0laRTsKK2ludCAgICAgICAgICAgX19rbXBfc3lzX21heF9udGggPSBLTVBfTUFYX05USDsKK2ludCAgICAgICAgICAgICAgIF9fa21wX21heF9udGggPSAwOworaW50ICAgICAgX19rbXBfdGhyZWFkc19jYXBhY2l0eSA9IDA7CitpbnQgICAgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoID0gMDsKK2ludCAgICAgIF9fa21wX2RmbHRfdGVhbV9udGhfdWIgPSAwOworaW50ICAgICAgICAgICBfX2ttcF90cF9jYXBhY2l0eSA9IDA7CitpbnQgICAgICAgICAgICAgX19rbXBfdHBfY2FjaGVkID0gMDsKK2ludCAgICAgICAgICAgX19rbXBfZGZsdF9uZXN0ZWQgPSBGQUxTRTsKKyNpZiBPTVBfMzBfRU5BQkxFRAoraW50IF9fa21wX2RmbHRfbWF4X2FjdGl2ZV9sZXZlbHMgPSBLTVBfTUFYX0FDVElWRV9MRVZFTFNfTElNSVQ7IC8qIG1heF9hY3RpdmVfbGV2ZWxzIGxpbWl0ICovCisjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKK2VudW0gbGlicmFyeV90eXBlIF9fa21wX2xpYnJhcnkgPSBsaWJyYXJ5X25vbmU7CitlbnVtIHNjaGVkX3R5cGUgICAgIF9fa21wX3NjaGVkID0ga21wX3NjaF9kZWZhdWx0OyAgLyogc2NoZWR1bGluZyBtZXRob2QgZm9yIHJ1bnRpbWUgc2NoZWR1bGluZyAqLworZW51bSBzY2hlZF90eXBlICAgIF9fa21wX3N0YXRpYyA9IGttcF9zY2hfc3RhdGljX2dyZWVkeTsgLyogZGVmYXVsdCBzdGF0aWMgc2NoZWR1bGluZyBtZXRob2QgKi8KK2VudW0gc2NoZWRfdHlwZSAgICBfX2ttcF9ndWlkZWQgPSBrbXBfc2NoX2d1aWRlZF9pdGVyYXRpdmVfY2h1bmtlZDsgLyogZGVmYXVsdCBndWlkZWQgc2NoZWR1bGluZyBtZXRob2QgKi8KKyNpZiBPTVBfMzBfRU5BQkxFRAorZW51bSBzY2hlZF90eXBlICAgICAgX19rbXBfYXV0byA9IGttcF9zY2hfZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZDsgLyogZGVmYXVsdCBhdXRvIHNjaGVkdWxpbmcgbWV0aG9kICovCisjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKK2ludCAgICAgICAgX19rbXBfZGZsdF9ibG9ja3RpbWUgPSBLTVBfREVGQVVMVF9CTE9DS1RJTUU7CitpbnQgICAgICAgX19rbXBfbW9uaXRvcl93YWtldXBzID0gS01QX01JTl9NT05JVE9SX1dBS0VVUFM7CitpbnQgICAgICAgICAgX19rbXBfYnRfaW50ZXJ2YWxzID0gS01QX0lOVEVSVkFMU19GUk9NX0JMT0NLVElNRSggS01QX0RFRkFVTFRfQkxPQ0tUSU1FLCBLTVBfTUlOX01PTklUT1JfV0FLRVVQUyApOworI2lmZGVmIEtNUF9BREpVU1RfQkxPQ0tUSU1FCitpbnQgICAgICAgICAgICAgICBfX2ttcF96ZXJvX2J0ID0gRkFMU0U7CisjZW5kaWYgLyogS01QX0FESlVTVF9CTE9DS1RJTUUgKi8KK2ludCAgICAgICAgICAgIF9fa21wX2h0X2NhcGFibGUgPSBGQUxTRTsKK2ludCAgICAgICAgICAgIF9fa21wX2h0X2VuYWJsZWQgPSBGQUxTRTsKK2ludCAgICAgICAgX19rbXBfaHRfbG9nX3Blcl9waHkgPSAxOworaW50ICAgICAgICAgICAgICAgIF9fa21wX25jb3JlcyA9IDA7CitpbnQgICAgICAgICAgICAgICAgIF9fa21wX2NodW5rID0gMDsKK2ludCAgICAgICAgICAgX19rbXBfYWJvcnRfZGVsYXkgPSAwOworI2lmIEtNUF9PU19MSU5VWCAmJiBkZWZpbmVkKEtNUF9UREFUQV9HVElEKQoraW50ICAgICAgICAgICAgIF9fa21wX2d0aWRfbW9kZSA9IDM7IC8qIHVzZSBfX2RlY2xzcGVjKHRocmVhZCkgVExTIHRvIHN0b3JlIGd0aWQgKi8KK2ludCAgICAgIF9fa21wX2FkanVzdF9ndGlkX21vZGUgPSBGQUxTRTsKKyNlbGlmIEtNUF9PU19XSU5ET1dTCitpbnQgICAgICAgICAgICAgX19rbXBfZ3RpZF9tb2RlID0gMjsgLyogdXNlIFRMUyBmdW5jdGlvbnMgdG8gc3RvcmUgZ3RpZCAqLworaW50ICAgICAgX19rbXBfYWRqdXN0X2d0aWRfbW9kZSA9IEZBTFNFOworI2Vsc2UKK2ludCAgICAgICAgICAgICBfX2ttcF9ndGlkX21vZGUgPSAwOyAvKiBzZWxlY3QgbWV0aG9kIHRvIGdldCBndGlkIGJhc2VkIG9uICN0aHJlYWRzICovCitpbnQgICAgICBfX2ttcF9hZGp1c3RfZ3RpZF9tb2RlID0gVFJVRTsKKyNlbmRpZiAvKiBLTVBfT1NfTElOVVggJiYgZGVmaW5lZChLTVBfVERBVEFfR1RJRCkgKi8KKyNpZmRlZiBLTVBfVERBVEFfR1RJRAorI2lmIEtNUF9PU19XSU5ET1dTCitfX2RlY2xzcGVjKHRocmVhZCkgaW50IF9fa21wX2d0aWQgPSBLTVBfR1RJRF9ETkU7CisjZWxzZQorX190aHJlYWQgaW50IF9fa21wX2d0aWQgPSBLTVBfR1RJRF9ETkU7CisjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgLSB3b3JrYXJvdW5kIGJlY2F1c2UgSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgY29tcGlsZXIgMjAxMTAzMTYgZG9lc24ndCBhY2NlcHQgX19kZWNsc3BlYyAqLworI2VuZGlmIC8qIEtNUF9UREFUQV9HVElEICovCitpbnQgICAgICAgICAgX19rbXBfdGxzX2d0aWRfbWluID0gSU5UX01BWDsKK2ludCAgICAgICAgICAgIF9fa21wX2ZvcmVpZ25fdHAgPSBUUlVFOworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKK2ludCAgICBfX2ttcF9pbmhlcml0X2ZwX2NvbnRyb2wgPSBUUlVFOwora21wX2ludDE2ICBfX2ttcF9pbml0X3g4N19mcHVfY29udHJvbF93b3JkID0gMDsKK2ttcF91aW50MzIgICAgIF9fa21wX2luaXRfbXhjc3IgPSAwOworI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworI2lmZGVmIFVTRV9MT0FEX0JBTEFOQ0UKK2RvdWJsZSAgX19rbXBfbG9hZF9iYWxhbmNlX2ludGVydmFsICAgPSAxLjA7CisjZW5kaWYgLyogVVNFX0xPQURfQkFMQU5DRSAqLworCitrbXBfbmVzdGVkX250aHJlYWRzX3QgX19rbXBfbmVzdGVkX250aCAgPSB7IE5VTEwsIDAsIDAgfTsKKworI2lmIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKwora21wX2FkYXB0aXZlX2JhY2tvZmZfcGFyYW1zX3QgX19rbXBfYWRhcHRpdmVfYmFja29mZl9wYXJhbXMgPSB7IDEsIDEwMjQgfTsgLy8gVE9ETzogdHVuZSBpdCEKKworI2lmIEtNUF9ERUJVR19BREFQVElWRV9MT0NLUworY2hhciAqIF9fa21wX3NwZWN1bGF0aXZlX3N0YXRzZmlsZSA9ICItIjsKKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX1VTRV9BREFQVElWRV9MT0NLUworCisjaWYgT01QXzQwX0VOQUJMRUQKK2ludCBfX2ttcF9kaXNwbGF5X2VudiAgICAgICAgICAgPSBGQUxTRTsKK2ludCBfX2ttcF9kaXNwbGF5X2Vudl92ZXJib3NlICAgPSBGQUxTRTsKK2ludCBfX2ttcF9vbXBfY2FuY2VsbGF0aW9uICAgICAgPSBGQUxTRTsKKyNlbmRpZgorCisvKiBtYXAgT01QIDMuMCBzY2hlZHVsZSB0eXBlcyB3aXRoIG91ciBpbnRlcm5hbCBzY2hlZHVsZSB0eXBlcyAqLworZW51bSBzY2hlZF90eXBlIF9fa21wX3NjaF9tYXBbIGttcF9zY2hlZF91cHBlciAtIGttcF9zY2hlZF9sb3dlcl9leHQgKyBrbXBfc2NoZWRfdXBwZXJfc3RkIC0ga21wX3NjaGVkX2xvd2VyIC0gMiBdID0geworICAgIGttcF9zY2hfc3RhdGljX2NodW5rZWQsICAgICAvLyA9PT4ga21wX3NjaGVkX3N0YXRpYyAgICAgICAgICAgID0gMQorICAgIGttcF9zY2hfZHluYW1pY19jaHVua2VkLCAgICAvLyA9PT4ga21wX3NjaGVkX2R5bmFtaWMgICAgICAgICAgID0gMgorICAgIGttcF9zY2hfZ3VpZGVkX2NodW5rZWQsICAgICAvLyA9PT4ga21wX3NjaGVkX2d1aWRlZCAgICAgICAgICAgID0gMworICAgIGttcF9zY2hfYXV0bywgICAgICAgICAgICAgICAvLyA9PT4ga21wX3NjaGVkX2F1dG8gICAgICAgICAgICAgID0gNAorICAgIGttcF9zY2hfdHJhcGV6b2lkYWwgICAgICAgICAvLyA9PT4ga21wX3NjaGVkX3RyYXBlem9pZGFsICAgICAgID0gMTAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgbGlrZWx5IG5vdCB1c2VkLCBpbnRyb2R1Y2VkIGhlcmUganVzdCB0byBkZWJ1ZyB0aGUgY29kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiBwdWJsaWMgaW50ZWwgZXh0ZW5zaW9uIHNjaGVkdWxlcworfTsKKworI2lmIEtNUF9PU19MSU5VWAorZW51bSBjbG9ja19mdW5jdGlvbl90eXBlIF9fa21wX2Nsb2NrX2Z1bmN0aW9uOworaW50IF9fa21wX2Nsb2NrX2Z1bmN0aW9uX3BhcmFtOworI2VuZGlmIC8qIEtNUF9PU19MSU5VWCAqLworCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorCisjIGlmIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4Nl82NAorCitpbnQgX19rbXBfbnVtX3Byb2NfZ3JvdXBzID0gMTsKKwora21wX0dldEFjdGl2ZVByb2Nlc3NvckNvdW50X3QgX19rbXBfR2V0QWN0aXZlUHJvY2Vzc29yQ291bnQgPSBOVUxMOwora21wX0dldEFjdGl2ZVByb2Nlc3Nvckdyb3VwQ291bnRfdCBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JHcm91cENvdW50ID0gTlVMTDsKK2ttcF9HZXRUaHJlYWRHcm91cEFmZmluaXR5X3QgX19rbXBfR2V0VGhyZWFkR3JvdXBBZmZpbml0eSA9IE5VTEw7CitrbXBfU2V0VGhyZWFkR3JvdXBBZmZpbml0eV90IF9fa21wX1NldFRocmVhZEdyb3VwQWZmaW5pdHkgPSBOVUxMOworCisjIGVuZGlmIC8qIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4Nl82NCAqLworCitzaXplX3QgICBfX2ttcF9hZmZpbl9tYXNrX3NpemUgPSAwOworZW51bSBhZmZpbml0eV90eXBlIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9kZWZhdWx0OworZW51bSBhZmZpbml0eV9ncmFuIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2RlZmF1bHQ7CitpbnQgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgID0gLTE7CitpbnQgX19rbXBfYWZmaW5pdHlfZHVwcyA9IFRSVUU7CitlbnVtIGFmZmluaXR5X3RvcF9tZXRob2QgX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9IGFmZmluaXR5X3RvcF9tZXRob2RfZGVmYXVsdDsKK2ludCAgICAgIF9fa21wX2FmZmluaXR5X2NvbXBhY3QgICAgICA9IDA7CitpbnQgICAgICBfX2ttcF9hZmZpbml0eV9vZmZzZXQgICAgICAgPSAwOworaW50ICAgICAgX19rbXBfYWZmaW5pdHlfdmVyYm9zZSAgICAgID0gRkFMU0U7CitpbnQgICAgICBfX2ttcF9hZmZpbml0eV93YXJuaW5ncyAgICAgPSBUUlVFOworaW50ICAgICAgX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrID0gYWZmaW5pdHlfcmVzcGVjdF9tYXNrX2RlZmF1bHQ7CitjaGFyICogICBfX2ttcF9hZmZpbml0eV9wcm9jbGlzdCAgICAgPSBOVUxMOwora21wX2FmZmluX21hc2tfdCAqX19rbXBfYWZmaW5pdHlfbWFza3MgPSBOVUxMOwordW5zaWduZWQgX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzICAgID0gMDsKKworY2hhciBjb25zdCAqICBfX2ttcF9jcHVpbmZvX2ZpbGUgICAgID0gTlVMTDsKKworI2VuZGlmIC8qIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgKi8KKworI2lmIE9NUF80MF9FTkFCTEVECitrbXBfbmVzdGVkX3Byb2NfYmluZF90IF9fa21wX25lc3RlZF9wcm9jX2JpbmQgPSB7IE5VTEwsIDAsIDAgfTsKK2ludCBfX2ttcF9hZmZpbml0eV9udW1fcGxhY2VzID0gMDsKKyNlbmRpZgorCisjaWYgS01QX01JQwordW5zaWduZWQgaW50IF9fa21wX3BsYWNlX251bV9jb3JlcyA9IDA7Cit1bnNpZ25lZCBpbnQgX19rbXBfcGxhY2VfbnVtX3RocmVhZHNfcGVyX2NvcmUgPSAwOwordW5zaWduZWQgaW50IF9fa21wX3BsYWNlX2NvcmVfb2Zmc2V0ID0gMDsKKyNlbmRpZgorCisjaWYgT01QXzMwX0VOQUJMRUQKK2ttcF90YXNraW5nX21vZGVfdCBfX2ttcF90YXNraW5nX21vZGUgPSB0c2ttX3Rhc2tfdGVhbXM7CisKKy8qIFRoaXMgY2hlY2sgZW5zdXJlcyB0aGF0IHRoZSBjb21waWxlciBpcyBwYXNzaW5nIHRoZSBjb3JyZWN0IGRhdGEgdHlwZQorICogZm9yIHRoZSBmbGFncyBmb3JtYWwgcGFyYW1ldGVyIG9mIHRoZSBmdW5jdGlvbiBrbXBjX29tcF90YXNrX2FsbG9jKCkuCisgKiBJZiB0aGUgdHlwZSBpcyBub3QgYSA0LWJ5dGUgdHlwZSwgdGhlbiBnaXZlIGFuIGVycm9yIG1lc3NhZ2UgYWJvdXQKKyAqIGEgbm9uLXBvc2l0aXZlIGxlbmd0aCBhcnJheSBwb2ludGluZyBoZXJlLiAgSWYgdGhhdCBoYXBwZW5zLCB0aGUKKyAqIGttcF90YXNraW5nX2ZsYWdzX3Qgc3RydWN0dXJlIG11c3QgYmUgcmVkZWZpbmVkIHRvIGhhdmUgZXhhY3RseSAzMiBiaXRzLgorICovCitLTVBfQlVJTERfQVNTRVJUKCBzaXplb2Yoa21wX3Rhc2tpbmdfZmxhZ3NfdCkgPT0gNCApOworCitrbXBfaW50MzIgX19rbXBfdGFza19zdGVhbGluZ19jb25zdHJhaW50ID0gMTsgICAvKiBDb25zdHJhaW4gdGFzayBzdGVhbGluZyBieSBkZWZhdWx0ICovCisKKyNlbmRpZiAvKiBPTVBfMzBfRU5BQkxFRCAqLworCisjaWZkZWYgREVCVUdfU1VTUEVORAoraW50ICAgICAgICAgX19rbXBfc3VzcGVuZF9jb3VudCA9IDA7CisjZW5kaWYKKworaW50ICAgICBfX2ttcF9zZXR0aW5ncyA9IEZBTFNFOworaW50ICAgICBfX2ttcF9kdXBsaWNhdGVfbGlicmFyeV9vayA9IDA7CisjaWYgVVNFX0lUVF9CVUlMRAoraW50ICAgICBfX2ttcF9mb3Jram9pbl9mcmFtZXMgPSAxOworaW50ICAgICBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9IDA7CisjZW5kaWYKK1BBQ0tFRF9SRURVQ1RJT05fTUVUSE9EX1QgX19rbXBfZm9yY2VfcmVkdWN0aW9uX21ldGhvZCA9IHJlZHVjdGlvbl9tZXRob2Rfbm90X2RlZmluZWQ7CitpbnQgICAgIF9fa21wX2RldGVybV9yZWQgPSBGQUxTRTsKKworI2lmZGVmIEtNUF9ERUJVRworaW50ICAgICBrbXBfYV9kZWJ1ZyA9IDA7CitpbnQgICAgIGttcF9iX2RlYnVnID0gMDsKK2ludCAgICAga21wX2NfZGVidWcgPSAwOworaW50ICAgICBrbXBfZF9kZWJ1ZyA9IDA7CitpbnQgICAgIGttcF9lX2RlYnVnID0gMDsKK2ludCAgICAga21wX2ZfZGVidWcgPSAwOworaW50ICAgICBrbXBfZGlhZyAgICA9IDA7CisjZW5kaWYKKworLyogRm9yIGRlYnVnIGluZm9ybWF0aW9uIGxvZ2dpbmcgdXNpbmcgcm90YXRpbmcgYnVmZmVyICovCitpbnQgICAgIF9fa21wX2RlYnVnX2J1ZiA9IEZBTFNFOyAgICAgICAgLyogVFJVRSBtZWFucyB1c2UgYnVmZmVyLCBGQUxTRSBtZWFucyBwcmludCB0byBzdGRlcnIgKi8KK2ludCAgICAgX19rbXBfZGVidWdfYnVmX2xpbmVzID0gS01QX0RFQlVHX0JVRl9MSU5FU19JTklUOyAvKiBMaW5lcyBvZiBkZWJ1ZyBzdG9yZWQgaW4gYnVmZmVyICovCitpbnQgICAgIF9fa21wX2RlYnVnX2J1Zl9jaGFycyA9IEtNUF9ERUJVR19CVUZfQ0hBUlNfSU5JVDsgLyogQ2hhcmFjdGVycyBhbGxvd2VkIHBlciBsaW5lIGluIGJ1ZmZlciAqLworaW50ICAgICBfX2ttcF9kZWJ1Z19idWZfYXRvbWljID0gRkFMU0U7IC8qIFRSVUUgbWVhbnMgdXNlIGF0b21pYyB1cGRhdGUgb2YgYnVmZmVyIGVudHJ5IHBvaW50ZXIgKi8KKworY2hhciAgICpfX2ttcF9kZWJ1Z19idWZmZXIgPSBOVUxMOyAgICAgIC8qIERlYnVnIGJ1ZmZlciBpdHNlbGYgKi8KK2ludCAgICAgX19rbXBfZGVidWdfY291bnQgPSAwOyAgICAgICAgICAvKiBDb3VudGVyIGZvciBudW1iZXIgb2YgbGluZXMgcHJpbnRlZCBpbiBidWZmZXIgc28gZmFyICovCitpbnQgICAgIF9fa21wX2RlYnVnX2J1Zl93YXJuX2NoYXJzID0gMDsgLyogS2VlcCB0cmFjayBvZiBjaGFyIGluY3JlYXNlIHJlY29tbWVuZGVkIGluIHdhcm5pbmdzICovCisvKiBlbmQgcm90YXRpbmcgZGVidWcgYnVmZmVyICovCisKKyNpZmRlZiBLTVBfREVCVUcKK2ludCAgICAgX19rbXBfcGFyX3JhbmdlOyAgICAgICAgICAgLyogKzEgPT4gb25seSBnbyBwYXIgZm9yIGNvbnN0cnVjdHMgaW4gcmFuZ2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAtMSA9PiBvbmx5IGdvIHBhciBmb3IgY29uc3RydWN0cyBvdXRzaWRlIHJhbmdlICovCitjaGFyICAgIF9fa21wX3Bhcl9yYW5nZV9yb3V0aW5lW0tNUF9QQVJfUkFOR0VfUk9VVElORV9MRU5dID0geyAnXDAnIH07CitjaGFyICAgIF9fa21wX3Bhcl9yYW5nZV9maWxlbmFtZVtLTVBfUEFSX1JBTkdFX0ZJTEVOQU1FX0xFTl0gPSB7ICdcMCcgfTsKK2ludCAgICAgX19rbXBfcGFyX3JhbmdlX2xiID0gMDsKK2ludCAgICAgX19rbXBfcGFyX3JhbmdlX3ViID0gSU5UX01BWDsKKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKworLyogRm9yIHByaW50aW5nIG91dCBkeW5hbWljIHN0b3JhZ2UgbWFwIGZvciB0aHJlYWRzIGFuZCB0ZWFtcyAqLworaW50ICAgICBfX2ttcF9zdG9yYWdlX21hcCA9IEZBTFNFOyAgICAgICAgIC8qIFRydWUgbWVhbnMgcHJpbnQgc3RvcmFnZSBtYXAgZm9yIHRocmVhZHMgYW5kIHRlYW1zICovCitpbnQgICAgIF9fa21wX3N0b3JhZ2VfbWFwX3ZlcmJvc2UgPSBGQUxTRTsgLyogVHJ1ZSBtZWFucyBzdG9yYWdlIG1hcCBpbmNsdWRlcyBwbGFjZW1lbnQgaW5mbyAqLworaW50ICAgICBfX2ttcF9zdG9yYWdlX21hcF92ZXJib3NlX3NwZWNpZmllZCA9IEZBTFNFOworLyogSW5pdGlhbGl6ZSB0aGUgbGlicmFyeSBkYXRhIHN0cnVjdHVyZXMgd2hlbiB3ZSBmb3JrIGEgY2hpbGQgcHJvY2VzcywgZGVmYXVsdHMgdG8gVFJVRSAqLworaW50ICAgICBfX2ttcF9uZWVkX3JlZ2lzdGVyX2F0Zm9yayA9IFRSVUU7IC8qIEF0IGluaXRpYWxpemF0aW9uLCBjYWxsIHB0aHJlYWRfYXRmb3JrIHRvIGluc3RhbGwgZm9yayBoYW5kbGVyICovCitpbnQgICAgIF9fa21wX25lZWRfcmVnaXN0ZXJfYXRmb3JrX3NwZWNpZmllZCA9IFRSVUU7CisKKworaW50ICAgICAgICBfX2ttcF9lbnZfY2h1bmsgICAgICAgPSBGQUxTRTsgIC8qIEtNUF9DSFVOSyBzcGVjaWZpZWQ/ICAgICAqLworaW50ICAgICAgICBfX2ttcF9lbnZfc3Rrc2l6ZSAgICAgPSBGQUxTRTsgIC8qIEtNUF9TVEFDS1NJWkUgc3BlY2lmaWVkPyAqLworaW50ICAgICAgICBfX2ttcF9lbnZfb21wX3N0a3NpemUgPSBGQUxTRTsgIC8qIE9NUF9TVEFDS1NJWkUgc3BlY2lmaWVkPyAqLworaW50ICAgICAgICBfX2ttcF9lbnZfYWxsX3RocmVhZHMgICAgID0gRkFMU0U7LyogS01QX0FMTF9USFJFQURTIG9yIEtNUF9NQVhfVEhSRUFEUyBzcGVjaWZpZWQ/ICovCitpbnQgICAgICAgIF9fa21wX2Vudl9vbXBfYWxsX3RocmVhZHMgPSBGQUxTRTsvKiBPTVBfVEhSRUFEX0xJTUlUIHNwZWNpZmllZD8gKi8KK2ludCAgICAgICAgX19rbXBfZW52X2Jsb2NrdGltZSAgID0gRkFMU0U7ICAvKiBLTVBfQkxPQ0tUSU1FIHNwZWNpZmllZD8gKi8KK2ludCAgICAgICAgX19rbXBfZW52X2NoZWNrcyAgICAgID0gRkFMU0U7ICAvKiBLTVBfQ0hFQ0tTIHNwZWNpZmllZD8gICAgKi8KK2ludCAgICAgICAgX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICA9IEZBTFNFOyAgLyogS01QX0NPTlNJU1RFTkNZX0NIRUNLIHNwZWNpZmllZD8gKi8KKwora21wX3VpbnQzMiBfX2ttcF95aWVsZF9pbml0ID0gS01QX0lOSVRfV0FJVDsKK2ttcF91aW50MzIgX19rbXBfeWllbGRfbmV4dCA9IEtNUF9ORVhUX1dBSVQ7CitrbXBfdWludDMyIF9fa21wX3lpZWxkaW5nX29uID0gMTsKKyNpZiBLTVBfT1NfQ05LCitrbXBfdWludDMyIF9fa21wX3lpZWxkX2N5Y2xlID0gMDsKKyNlbHNlCitrbXBfdWludDMyIF9fa21wX3lpZWxkX2N5Y2xlID0gMTsgICAgIC8qIFlpZWxkLWN5Y2xlIGlzIG9uIGJ5IGRlZmF1bHQgKi8KKyNlbmRpZgora21wX2ludDMyICBfX2ttcF95aWVsZF9vbl9jb3VudCA9IDEwOyAvKiBCeSBkZWZhdWx0LCB5aWVsZGluZyBpcyBvbiBmb3IgMTAgbW9uaXRvciBwZXJpb2RzLiAqLwora21wX2ludDMyICBfX2ttcF95aWVsZF9vZmZfY291bnQgPSAxOyAvKiBCeSBkZWZhdWx0LCB5aWVsZGluZyBpcyBvZmYgZm9yIDEgbW9uaXRvciBwZXJpb2RzLiAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIFNUQVRFIG1vc3RseSBzeW5jcm9uaXplZCB3aXRoIGdsb2JhbCBsb2NrICovCisvKiBkYXRhIHdyaXR0ZW4gdG8gcmFyZWx5IGJ5IG1hc3RlcnMsIHJlYWQgb2Z0ZW4gYnkgd29ya2VycyAqLworLyoKKyAqIFNIQUxMIFdFIEVESVQgVEhFIENPTU1FTlQgQkVMT1cgSU4gU09NRSBXQVk/CisgKiBUT0RPOiAgTm9uZSBvZiB0aGlzIGdsb2JhbCBwYWRkaW5nIHN0dWZmIHdvcmtzIGNvbnNpc3RlbnRseSBiZWNhdXNlCisgKiB0aGUgb3JkZXIgb2YgZGVjbGFyYXRpb24gaXMgbm90IG5lY2Vzc2FyaWx5IGNvcnJlbGF0ZWQgdG8gc3RvcmFnZSBvcmRlci4KKyAqIFRvIGZpeCB0aGlzLCBhbGwgdGhlIGltcG9ydGFudCBnbG9iYWxzIG11c3QgYmUgcHV0IGluIGEgYmlnIHN0cnVjdHVyZQorICogaW5zdGVhZC4KKyAqLworS01QX0FMSUdOX0NBQ0hFCisgICAgICAgICBrbXBfaW5mb190ICoqX19rbXBfdGhyZWFkcyAgICAgPSBOVUxMOworICAgICAgICAga21wX3Jvb3RfdCAqKl9fa21wX3Jvb3QgICAgICAgID0gTlVMTDsKKworLyogZGF0YSByZWFkL3dyaXR0ZW4gdG8gb2Z0ZW4gYnkgbWFzdGVycyAqLworS01QX0FMSUdOX0NBQ0hFCit2b2xhdGlsZSBpbnQgICAgICAgICAgX19rbXBfbnRoICAgICAgICAgICAgICAgICAgICA9IDA7Cit2b2xhdGlsZSBpbnQgICAgICAgICAgX19rbXBfYWxsX250aCAgICAgICAgICAgICAgICA9IDA7CitpbnQgICAgICAgICAgICAgICAgICAgX19rbXBfdGhyZWFkX3Bvb2xfbnRoICAgICAgICA9IDA7Cit2b2xhdGlsZSBrbXBfaW5mb190ICAqX19rbXBfdGhyZWFkX3Bvb2wgICAgICAgICAgICA9IE5VTEw7Cit2b2xhdGlsZSBrbXBfdGVhbV90ICAqX19rbXBfdGVhbV9wb29sICAgICAgICAgICAgICA9IE5VTEw7CisKK0tNUF9BTElHTl9DQUNIRQordm9sYXRpbGUgaW50ICAgICAgICAgIF9fa21wX3RocmVhZF9wb29sX2FjdGl2ZV9udGggPSAwOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBHTE9CQUwvUk9PVCBTVEFURSAqLworS01QX0FMSUdOX0NBQ0hFCitrbXBfZ2xvYmFsX3QgX19rbXBfZ2xvYmFsID0ge3sgMCB9fTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIEdMT0JBTCBTWU5DSFJPTklaQVRJT04gTE9DS1MgKi8KKy8qIFRPRE8gdmVyaWZ5IHRoZSBuZWVkIGZvciB0aGVzZSBsb2NrcyBhbmQgaWYgdGhleSBuZWVkIHRvIGJlIGdsb2JhbCAqLworS01QX0FMSUdOX0NBQ0hFCisKK2ttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2luaXR6X2xvY2sgICA9IEtNUF9CT09UU1RSQVBfTE9DS19JTklUSUFMSVpFUiggX19rbXBfaW5pdHpfbG9jayAgICk7IC8qIENvbnRyb2wgaW5pdGlhbGl6YXRpb25zICovCitrbXBfYm9vdHN0cmFwX2xvY2tfdCBfX2ttcF9mb3Jram9pbl9sb2NrOyAvKiBjb250cm9sIGZvcmsvam9pbiBhY2Nlc3MgKi8KK2ttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2V4aXRfbG9jazsgICAvKiBleGl0KCkgaXMgbm90IGFsd2F5cyB0aHJlYWQtc2FmZSAqLwora21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfbW9uaXRvcl9sb2NrOyAvKiBjb250cm9sIG1vbml0b3IgdGhyZWFkIGNyZWF0aW9uICovCitrbXBfYm9vdHN0cmFwX2xvY2tfdCBfX2ttcF90cF9jYWNoZWRfbG9jazsgLyogdXNlZCBmb3IgdGhlIGhhY2sgdG8gYWxsb3cgdGhyZWFkcHJpdmF0ZSBjYWNoZSBhbmQgX19rbXBfdGhyZWFkcyBleHBhbnNpb24gdG8gY28tZXhpc3QgKi8KKworS01QX0FMSUdOKDEyOCkKK2ttcF9sb2NrX3QgX19rbXBfZ2xvYmFsX2xvY2s7ICAgICAgICAgICAvKiBDb250cm9sIE9TL2dsb2JhbCBhY2Nlc3MgKi8KK0tNUF9BTElHTigxMjgpCitrbXBfcXVldWluZ19sb2NrX3QgX19rbXBfZGlzcGF0Y2hfbG9jazsgICAgICAgICAvKiBDb250cm9sIGRpc3BhdGNoIGFjY2VzcyAgKi8KK0tNUF9BTElHTigxMjgpCitrbXBfbG9ja190IF9fa21wX2RlYnVnX2xvY2s7ICAgICAgICAgICAgLyogQ29udHJvbCBJL08gYWNjZXNzIGZvciBLTVBfREVCVUcgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIEtNUF9IQU5ETEVfU0lHTkFMUworICAgIC8qCisgICAgICAgIFNpZ25hbCBoYW5kbGluZyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LCBiZWNhdXNlIGl0IGNvbmZ1c2VzIHVzZXJzOiBJbiBjYXNlIG9mIHNpZ3NlZ3YKKyAgICAgICAgKG9yIG90aGVyIHRyb3VibGUpIGluIHVzZXIgY29kZSBzaWduYWwgaGFuZGxlciBjYXRjaGVzIHRoZSBzaWduYWwsIHdoaWNoIHRoZW4gImFwcGVhcnMiIGluCisgICAgICAgIHRoZSBtb25pdG9yIHRocmVhZCAod2hlbiB0aGUgbW9uaXRvciBleGVjdXRlcyByYWlzZSgpIGZ1bmN0aW9uKS4gVXNlcnMgc2VlIHNpZ25hbCBpbiB0aGUKKyAgICAgICAgbW9uaXRvciB0aHJlYWQgYW5kIGJsYW1lIE9wZW5NUCBSVEwuCisKKyAgICAgICAgR3JhbnQgc2FpZCBzaWduYWwgaGFuZGxpbmcgcmVxdWlyZWQgb24gc29tZSBvbGRlciBPU2VzIChJcml4Pykgc3VwcG9ydGVkIGJ5IEtBSSwgYmVjYXVzZQorICAgICAgICBiYWQgYXBwbGljYXRpb25zIGh1bmcgYnV0IG5vdCBhYm9ydGVkLiBDdXJyZW50bHkgaXQgaXMgbm90IGEgcHJvYmxlbSBmb3IgTGludXgqIE9TLCBPUyBYKiBhbmQKKyAgICAgICAgV2luZG93cyogT1MuCisKKyAgICAgICAgR3JhbnQ6IEZvdW5kIG5ldyBoYW5ncyBmb3IgRUw0LCBFTDUsIGFuZCBhIEZlZG9yYSBDb3JlIG1hY2hpbmUuICBTbyBJJ20gcHV0dGluZworICAgICAgICB0aGUgZGVmYXVsdCBiYWNrIGZvciBub3cgdG8gc2VlIGlmIHRoYXQgZml4ZXMgaGFuZ3Mgb24gdGhvc2UgbWFjaGluZXMuCisKKyAgICAgICAgMjAxMC0wNDAxMyBMZXY6IEl0IHdhcyBhIGJ1ZyBpbiBGb3J0cmFuIFJUTC4gRm9ydHJhbiBSVEwgcHJpbnRzIGEga2luZCBvZiBzdGFjayBiYWNrdHJhY2UKKyAgICAgICAgd2hlbiBwcm9ncmFtIGlzIGFib3J0aW5nLCBidXQgdGhlIGNvZGUgaXMgbm90IHNpZ25hbC1zYWZlLiBXaGVuIG11bHRpcGxlIHNpZ25hbHMgcmFpc2VkIGF0CisgICAgICAgIHRoZSBzYW1lIHRpbWUgKHdoaWNoIG9jY3VycyBpbiBkeW5hbWljIG5lZ2F0aXZlIHRlc3RzIGJlY2F1c2UgYWxsIHRoZSB3b3JrZXIgdGhyZWFkcyBkZXRlY3RzCisgICAgICAgIHRoZSBzYW1lIGVycm9yKSwgRm9ydHJhbiBSVEwgbWF5IGhhbmcuIFRoZSBidWcgZmluYWxseSBmaXhlZCBpbiBGb3J0cmFuIFJUTCBsaWJyYXJ5IHByb3ZpZGVkCisgICAgICAgIGJ5IFN0ZXZlIFIuLCBhbmQgd2lsbCBiZSBhdmFpbGFibGUgc29vbi4KKyAgICAqLworICAgIGludCBfX2ttcF9oYW5kbGVfc2lnbmFscyA9IEZBTFNFOworI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjaWZkZWYgQlVJTERfVFYKK2ttcF9rZXlfdCBfX2ttcF90dl9rZXkgPSAwOworI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZmRlZiBERUJVR19TVVNQRU5ECitpbnQKK2dldF9zdXNwZW5kX2NvdW50Xyggdm9pZCApIHsKKyAgICBpbnQgY291bnQgPSBfX2ttcF9zdXNwZW5kX2NvdW50OworICAgIF9fa21wX3N1c3BlbmRfY291bnQgPSAwOworICAgIHJldHVybiBjb3VudDsKK30KK3ZvaWQKK3NldF9zdXNwZW5kX2NvdW50XyggaW50ICogdmFsdWUgKSB7CisgICAgX19rbXBfc3VzcGVuZF9jb3VudCA9ICp2YWx1ZTsKK30KKyNlbmRpZgorCisvLyBTeW1ib2xzIGZvciBNUyBtdXR1YWwgZGV0ZWN0aW9uLgoraW50IF9Zb3VfbXVzdF9saW5rX3dpdGhfZXhhY3RseV9vbmVfT3Blbk1QX2xpYnJhcnkgPSAxOworaW50IF9Zb3VfbXVzdF9saW5rX3dpdGhfSW50ZWxfT3Blbk1QX2xpYnJhcnkgICAgICAgPSAxOworI2lmIEtNUF9PU19XSU5ET1dTICYmICggS01QX1ZFUlNJT05fTUFKT1IgPiA0ICkKKyAgICBpbnQgX1lvdV9tdXN0X2xpbmtfd2l0aF9NaWNyb3NvZnRfT3Blbk1QX2xpYnJhcnkgPSAxOworI2VuZGlmCisKKy8vIGVuZCBvZiBmaWxlIC8vCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfZ3N1cHBvcnQuYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9nc3VwcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNTIwMjQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZ3N1cHBvcnQuYwpAQCAtMCwwICsxLDEwMjggQEAKKy8qCisgKiBrbXBfZ3N1cHBvcnQuYworICogJFJldmlzaW9uOiA0MjgxMCAkCisgKiAkRGF0ZTogMjAxMy0xMS0wNyAxMjowNjozMyAtMDYwMCAoVGh1LCAwNyBOb3YgMjAxMykgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWYgZGVmaW5lZChfX3g4Nl82NCkgfHwgZGVmaW5lZCAoX19wb3dlcnBjNjRfXykKKyMgZGVmaW5lIEtNUF9JOAorI2VuZGlmCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2F0b21pYy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICBleHRlcm4gIkMiIHsKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisjZGVmaW5lIE1LTE9DKGxvYyxyb3V0aW5lKSBcCisgICAgc3RhdGljIGlkZW50X3QgKGxvYykgPSB7MCwgS01QX0lERU5UX0tNUEMsIDAsIDAsICI7dW5rbm93bjt1bmtub3duOzA7MDs7IiB9OworCisjaW5jbHVkZSAia21wX2Z0bl9vcy5oIgorCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0JBUlJJRVIpKHZvaWQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9iYXJyaWVyIik7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9iYXJyaWVyOiBUIyVkXG4iLCBndGlkKSk7CisgICAgX19rbXBjX2JhcnJpZXIoJmxvYywgZ3RpZCk7Cit9CisKKworLyoMKi8KKy8vCisvLyBNdXR1YWwgZXhjbHVzaW9uCisvLworCisvLworLy8gVGhlIHN5bWJvbCB0aGF0IGljYy9pZm9ydCBnZW5lcmF0ZXMgZm9yIHVubmFtZWQgZm9yIHVubmFtZWQgY3JpdGljYWwKKy8vIHNlY3Rpb25zIC0gLmdvbXBfY3JpdGljYWxfdXNlcl8gLSBpcyBkZWZpbmVkIHVzaW5nIC5jb21tIGluIGFueSBvYmplY3RzCisvLyByZWZlcmVuY2UgaXQuICBXZSBjYW4ndCByZWZlcmVuY2UgaXQgZGlyZWN0bHkgaGVyZSBpbiBDIGNvZGUsIGFzIHRoZQorLy8gc3ltYm9sIGNvbnRhaW5zIGEgIi4iLgorLy8KKy8vIFRoZSBSVEwgY29udGFpbnMgYW4gYXNzZW1ibHkgbGFuZ3VhZ2UgZGVmaW5pdGlvbiBvZiAuZ29tcF9jcml0aWNhbF91c2VyXworLy8gd2l0aCBhbm90aGVyIHN5bWJvbCBfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIgaW5pdGlhbGl6ZWQgd2l0aCBpdCdzCisvLyBhZGRyZXNzLgorLy8KK2V4dGVybiBrbXBfY3JpdGljYWxfbmFtZSAqX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyOworCisKK3ZvaWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfU1RBUlQpKHZvaWQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9jcml0aWNhbF9zdGFydCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfY3JpdGljYWxfc3RhcnQ6IFQjJWRcbiIsIGd0aWQpKTsKKyAgICBfX2ttcGNfY3JpdGljYWwoJmxvYywgZ3RpZCwgX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyKTsKK30KKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0NSSVRJQ0FMX0VORCkodm9pZCkKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9jcml0aWNhbF9lbmQiKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX2NyaXRpY2FsX2VuZDogVCMlZFxuIiwgZ3RpZCkpOworICAgIF9fa21wY19lbmRfY3JpdGljYWwoJmxvYywgZ3RpZCwgX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyKTsKK30KKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0NSSVRJQ0FMX05BTUVfU1RBUlQpKHZvaWQgKipwcHRyKQoreworICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgIE1LTE9DKGxvYywgIkdPTVBfY3JpdGljYWxfbmFtZV9zdGFydCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfY3JpdGljYWxfbmFtZV9zdGFydDogVCMlZFxuIiwgZ3RpZCkpOworICAgIF9fa21wY19jcml0aWNhbCgmbG9jLCBndGlkLCAoa21wX2NyaXRpY2FsX25hbWUgKilwcHRyKTsKK30KKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0NSSVRJQ0FMX05BTUVfRU5EKSh2b2lkICoqcHB0cikKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9jcml0aWNhbF9uYW1lX2VuZCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfY3JpdGljYWxfbmFtZV9lbmQ6IFQjJWRcbiIsIGd0aWQpKTsKKyAgICBfX2ttcGNfZW5kX2NyaXRpY2FsKCZsb2MsIGd0aWQsIChrbXBfY3JpdGljYWxfbmFtZSAqKXBwdHIpOworfQorCisKKy8vCisvLyBUaGUgR251IGNvZGVnZW4gdHJpZXMgdG8gdXNlIGxvY2tlZCBvcGVyYXRpb25zIHRvIHBlcmZvcm0gYXRvbWljIHVwZGF0ZXMKKy8vIGlubGluZS4gIElmIGl0IGNhbid0LCB0aGVuIGl0IGNhbGxzIEdPTVBfYXRvbWljX3N0YXJ0KCkgYmVmb3JlIHBlcmZvcm1pbmcKKy8vIHRoZSB1cGRhdGUgYW5kIEdPTVBfYXRvbWljX2VuZCgpIGFmdGVyd2FyZCwgcmVnYXJkbGVzcyBvZiB0aGUgZGF0YSB0eXBlLgorLy8KKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9BVE9NSUNfU1RBUlQpKHZvaWQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9hdG9taWNfc3RhcnQ6IFQjJWRcbiIsIGd0aWQpKTsKKyAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCZfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCk7Cit9CisKKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9BVE9NSUNfRU5EKSh2b2lkKQoreworICAgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX2F0b21pY19zdGFydDogVCMlZFxuIiwgZ3RpZCkpOworICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soJl9fa21wX2F0b21pY19sb2NrLCBndGlkKTsKK30KKworCitpbnQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfU0lOR0xFX1NUQVJUKSh2b2lkKQoreworICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgIE1LTE9DKGxvYywgIkdPTVBfc2luZ2xlX3N0YXJ0Iik7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9zaW5nbGVfc3RhcnQ6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIGlmICghIFRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpKQorICAgICAgICBfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCk7CisKKyAgICAvLworICAgIC8vIDNyZCBwYXJhbWV0ZXIgPT0gRkFMU0UgcHJldmVudHMga21wX2VudGVyX3NpbmdsZSBmcm9tIHB1c2hpbmcgYQorICAgIC8vIHdvcmtzaGFyZSB3aGVuIFVTRV9DSEVDS1MgaXMgZGVmaW5lZC4gIFdlIG5lZWQgdG8gYXZvaWQgdGhlIHB1c2gsCisgICAgLy8gYXMgdGhlcmUgaXMgbm8gY29ycmVzcG9uZGluZyBHT01QX3NpbmdsZV9lbmQoKSBjYWxsLgorICAgIC8vCisgICAgcmV0dXJuIF9fa21wX2VudGVyX3NpbmdsZShndGlkLCAmbG9jLCBGQUxTRSk7Cit9CisKKwordm9pZCAqCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1NJTkdMRV9DT1BZX1NUQVJUKSh2b2lkKQoreworICAgIHZvaWQgKnJldHZhbDsKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICBNS0xPQyhsb2MsICJHT01QX3NpbmdsZV9jb3B5X3N0YXJ0Iik7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9zaW5nbGVfY29weV9zdGFydDogVCMlZFxuIiwgZ3RpZCkpOworCisgICAgaWYgKCEgVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkpCisgICAgICAgIF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoKTsKKworICAgIC8vCisgICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGhyZWFkIHRvIGVudGVyLCByZXR1cm4gTlVMTC4gIFRoZSBnZW5lcmF0ZWQKKyAgICAvLyBjb2RlIHdpbGwgdGhlbiBjYWxsIEdPTVBfc2luZ2xlX2NvcHlfZW5kKCkgZm9yIHRoaXMgdGhyZWFkIG9ubHksCisgICAgLy8gd2l0aCB0aGUgY29weXByaXZhdGUgZGF0YSBwb2ludGVyIGFzIGFuIGFyZ3VtZW50LgorICAgIC8vCisgICAgaWYgKF9fa21wX2VudGVyX3NpbmdsZShndGlkLCAmbG9jLCBGQUxTRSkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgLy8KKyAgICAvLyBXYWl0IGZvciB0aGUgZmlyc3QgdGhyZWFkIHRvIHNldCB0aGUgY29weXByaXZhdGUgZGF0YSBwb2ludGVyLAorICAgIC8vIGFuZCBmb3IgYWxsIG90aGVyIHRocmVhZHMgdG8gcmVhY2ggdGhpcyBwb2ludC4KKyAgICAvLworICAgIF9fa21wX2JhcnJpZXIoYnNfcGxhaW5fYmFycmllciwgZ3RpZCwgRkFMU0UsIDAsIE5VTEwsIE5VTEwpOworCisgICAgLy8KKyAgICAvLyBSZXRyaWV2ZSB0aGUgdmFsdWUgb2YgdGhlIGNvcHlwcml2YXRlIGRhdGEgcG9pbnQsIGFuZCB3YWl0IGZvciBhbGwKKyAgICAvLyB0aHJlYWRzIHRvIGRvIGxpa2V3aXNlLCB0aGVuIHJldHVybi4KKyAgICAvLworICAgIHJldHZhbCA9IF9fa21wX3RlYW1fZnJvbV9ndGlkKGd0aWQpLT50LnRfY29weXByaXZfZGF0YTsKKyAgICBfX2ttcF9iYXJyaWVyKGJzX3BsYWluX2JhcnJpZXIsIGd0aWQsIEZBTFNFLCAwLCBOVUxMLCBOVUxMKTsKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisKK3ZvaWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfU0lOR0xFX0NPUFlfRU5EKSh2b2lkICpkYXRhKQoreworICAgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgICBNS0xPQyhsb2MsICJHT01QX3NpbmdsZV9jb3B5X2VuZCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfc2luZ2xlX2NvcHlfZW5kOiBUIyVkXG4iLCBndGlkKSk7CisKKyAgICAvLworICAgIC8vIFNldCB0aGUgY29weXByaXZhdGUgZGF0YSBwb2ludGVyIGZvIHRoZSB0ZWFtLCB0aGVuIGhpdCB0aGUgYmFycmllcgorICAgIC8vIHNvIHRoYXQgdGhlIG90aGVyIHRocmVhZHMgd2lsbCBjb250aW51ZSBvbiBhbmQgcmVhZCBpdC4gIEhpdCBhbm90aGVyCisgICAgLy8gYmFycmllciBiZWZvcmUgY29udGludWluZywgc28gdGhhdCB0aGUga25vdyB0aGF0IHRoZSBjb3B5cHJpdmF0ZQorICAgIC8vIGRhdGEgcG9pbnRlciBoYXMgYmVlbiBwcm9wYWdhdGVkIHRvIGFsbCB0aHJlYWRzIGJlZm9yZSB0cnlpbmcgdG8KKyAgICAvLyByZXVzZSB0aGUgdF9jb3B5cHJpdl9kYXRhIGZpZWxkLgorICAgIC8vCisgICAgX19rbXBfdGVhbV9mcm9tX2d0aWQoZ3RpZCktPnQudF9jb3B5cHJpdl9kYXRhID0gZGF0YTsKKyAgICBfX2ttcF9iYXJyaWVyKGJzX3BsYWluX2JhcnJpZXIsIGd0aWQsIEZBTFNFLCAwLCBOVUxMLCBOVUxMKTsKKyAgICBfX2ttcF9iYXJyaWVyKGJzX3BsYWluX2JhcnJpZXIsIGd0aWQsIEZBTFNFLCAwLCBOVUxMLCBOVUxMKTsKK30KKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX09SREVSRURfU1RBUlQpKHZvaWQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9vcmRlcmVkX3N0YXJ0Iik7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9vcmRlcmVkX3N0YXJ0OiBUIyVkXG4iLCBndGlkKSk7CisgICAgX19rbXBjX29yZGVyZWQoJmxvYywgZ3RpZCk7Cit9CisKKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9PUkRFUkVEX0VORCkodm9pZCkKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9vcmRlcmVkX2VuZCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfb3JkZXJlZF9zdGFydDogVCMlZFxuIiwgZ3RpZCkpOworICAgIF9fa21wY19lbmRfb3JkZXJlZCgmbG9jLCBndGlkKTsKK30KKworCisvKgwqLworLy8KKy8vIERpc3BhdGNoIG1hY3JvIGRlZnMKKy8vCisvLyBUaGV5IGNvbWUgaW4gdHdvIGZsYXZvcnM6IDY0LWJpdCB1bnNpZ25lZCwgYW5kIGVpdGhlciAzMi1iaXQgc2lnbmVkCisvLyAoSUEtMzIgYXJjaGl0ZWN0dXJlKSBvciA2NC1iaXQgc2lnbmVkIChJbnRlbChSKSA2NCkuCisvLworCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX0FSTQorIyBkZWZpbmUgS01QX0RJU1BBVENIX0lOSVQgICAgICAgICAgICAgIF9fa21wX2F1eF9kaXNwYXRjaF9pbml0XzQKKyMgZGVmaW5lIEtNUF9ESVNQQVRDSF9GSU5JX0NIVU5LICAgICAgICBfX2ttcF9hdXhfZGlzcGF0Y2hfZmluaV9jaHVua180CisjIGRlZmluZSBLTVBfRElTUEFUQ0hfTkVYVCAgICAgICAgICAgICAgX19rbXBjX2Rpc3BhdGNoX25leHRfNAorI2Vsc2UKKyMgZGVmaW5lIEtNUF9ESVNQQVRDSF9JTklUICAgICAgICAgICAgICBfX2ttcF9hdXhfZGlzcGF0Y2hfaW5pdF84CisjIGRlZmluZSBLTVBfRElTUEFUQ0hfRklOSV9DSFVOSyAgICAgICAgX19rbXBfYXV4X2Rpc3BhdGNoX2ZpbmlfY2h1bmtfOAorIyBkZWZpbmUgS01QX0RJU1BBVENIX05FWFQgICAgICAgICAgICAgIF9fa21wY19kaXNwYXRjaF9uZXh0XzgKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgKi8KKworIyBkZWZpbmUgS01QX0RJU1BBVENIX0lOSVRfVUxMICAgICAgICAgIF9fa21wX2F1eF9kaXNwYXRjaF9pbml0Xzh1CisjIGRlZmluZSBLTVBfRElTUEFUQ0hfRklOSV9DSFVOS19VTEwgICAgX19rbXBfYXV4X2Rpc3BhdGNoX2ZpbmlfY2h1bmtfOHUKKyMgZGVmaW5lIEtNUF9ESVNQQVRDSF9ORVhUX1VMTCAgICAgICAgICBfX2ttcGNfZGlzcGF0Y2hfbmV4dF84dQorCisKKy8qDCovCisvLworLy8gVGhlIHBhcmFsbGVsIGNvbnRydWN0CisvLworCisjaWZkZWYgS01QX0RFQlVHCitzdGF0aWMKKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KK3ZvaWQKK19fa21wX0dPTVBfbWljcm90YXNrX3dyYXBwZXIoaW50ICpndGlkLCBpbnQgKm5wciwgdm9pZCAoKnRhc2spKHZvaWQgKiksCisgIHZvaWQgKmRhdGEpCit7CisgICAgdGFzayhkYXRhKTsKK30KKworCisjaWZkZWYgS01QX0RFQlVHCitzdGF0aWMKKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KK3ZvaWQKK19fa21wX0dPTVBfcGFyYWxsZWxfbWljcm90YXNrX3dyYXBwZXIoaW50ICpndGlkLCBpbnQgKm5wciwKKyAgdm9pZCAoKnRhc2spKHZvaWQgKiksIHZvaWQgKmRhdGEsIHVuc2lnbmVkIG51bV90aHJlYWRzLCBpZGVudF90ICpsb2MsCisgIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwgbG9uZyBzdGFydCwgbG9uZyBlbmQsIGxvbmcgaW5jciwgbG9uZyBjaHVua19zaXplKQoreworICAgIC8vCisgICAgLy8gSW50aWFsaXplIHRoZSBsb29wIHdvcmtzaGFyaW5nIGNvbnN0cnVjdC4KKyAgICAvLworICAgIEtNUF9ESVNQQVRDSF9JTklUKGxvYywgKmd0aWQsIHNjaGVkdWxlLCBzdGFydCwgZW5kLCBpbmNyLCBjaHVua19zaXplLAorICAgICAgc2NoZWR1bGUgIT0ga21wX3NjaF9zdGF0aWMpOworCisgICAgLy8KKyAgICAvLyBOb3cgaW52b2tlIHRoZSBtaWNyb3Rhc2suCisgICAgLy8KKyAgICB0YXNrKGRhdGEpOworfQorCisKKyNpZmRlZiBLTVBfREVCVUcKK3N0YXRpYworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLwordm9pZAorX19rbXBfR09NUF9mb3JrX2NhbGwoaWRlbnRfdCAqbG9jLCBpbnQgZ3RpZCwgbWljcm90YXNrX3Qgd3JhcHBlciwgaW50IGFyZ2MsLi4uKQoreworICAgIGludCByYzsKKworICAgIHZhX2xpc3QgYXA7CisgICAgdmFfc3RhcnQoYXAsIGFyZ2MpOworCisgICAgcmMgPSBfX2ttcF9mb3JrX2NhbGwobG9jLCBndGlkLCBGQUxTRSwgYXJnYywgd3JhcHBlciwgX19rbXBfaW52b2tlX3Rhc2tfZnVuYywKKyNpZiAoS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSkgJiYgS01QX09TX0xJTlVYCisgICAgICAmYXAKKyNlbHNlCisgICAgICBhcAorI2VuZGlmCisgICAgICApOworCisgICAgdmFfZW5kKGFwKTsKKworICAgIGlmIChyYykgeworICAgICAgICBrbXBfaW5mb190ICp0aHIgPSBfX2ttcF90aHJlYWRzW2d0aWRdOworICAgICAgICBfX2ttcF9ydW5fYmVmb3JlX2ludm9rZWRfdGFzayhndGlkLCBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpLCB0aHIsCisgICAgICAgICAgdGhyLT50aC50aF90ZWFtKTsKKyAgICB9Cit9CisKKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9TVEFSVCkodm9pZCAoKnRhc2spKHZvaWQgKiksIHZvaWQgKmRhdGEsIHVuc2lnbmVkIG51bV90aHJlYWRzKQoreworICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgIE1LTE9DKGxvYywgIkdPTVBfcGFyYWxsZWxfc3RhcnQiKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX3BhcmFsbGVsX3N0YXJ0OiBUIyVkXG4iLCBndGlkKSk7CisKKyAgICBpZiAoX19rbXBjX29rX3RvX2ZvcmsoJmxvYykgJiYgKG51bV90aHJlYWRzICE9IDEpKSB7CisgICAgICAgIGlmIChudW1fdGhyZWFkcyAhPSAwKSB7CisgICAgICAgICAgICBfX2ttcF9wdXNoX251bV90aHJlYWRzKCZsb2MsIGd0aWQsIG51bV90aHJlYWRzKTsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9HT01QX2ZvcmtfY2FsbCgmbG9jLCBndGlkLAorICAgICAgICAgIChtaWNyb3Rhc2tfdClfX2ttcF9HT01QX21pY3JvdGFza193cmFwcGVyLCAyLCB0YXNrLCBkYXRhKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIF9fa21wY19zZXJpYWxpemVkX3BhcmFsbGVsKCZsb2MsIGd0aWQpOworICAgIH0KK30KKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0VORCkodm9pZCkKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9wYXJhbGxlbF9lbmQiKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX3BhcmFsbGVsX2VuZDogVCMlZFxuIiwgZ3RpZCkpOworCisgICAgaWYgKCEgX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfdGVhbS0+dC50X3NlcmlhbGl6ZWQpIHsKKyAgICAgICAga21wX2luZm9fdCAqdGhyID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAgICAgICAgX19rbXBfcnVuX2FmdGVyX2ludm9rZWRfdGFzayhndGlkLCBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpLCB0aHIsCisgICAgICAgICAgdGhyLT50aC50aF90ZWFtKTsKKyAgICAgICAgX19rbXBfam9pbl9jYWxsKCZsb2MsIGd0aWQpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBjX2VuZF9zZXJpYWxpemVkX3BhcmFsbGVsKCZsb2MsIGd0aWQpOworICAgIH0KK30KKworCisvKgwqLworLy8KKy8vIExvb3Agd29ya3NoYXJpbmcgY29uc3RydWN0cworLy8KKworLy8KKy8vIFRoZSBHbnUgY29kZWdlbiBwYXNzZXMgaW4gYW4gZXhjbHVzaXZlIHVwcGVyIGJvdW5kIGZvciB0aGUgb3ZlcmFsbCByYW5nZSwKKy8vIGJ1dCB0aGUgbGliZ3VpZGUgZGlzcGF0Y2ggY29kZSBleHBlY3RzIGFuIGluY2x1c2l2ZSB1cHBlciBib3VuZCwgaGVuY2UgdGhlCisvLyAiZW5kIC0gaW5jciIgNXRoIGFyZ3VtZW50IHRvIEtNUF9ESVNQQVRDSF9JTklUIChhbmQgdGhlICIgdWIgLSBzdHIiIDExdGgKKy8vIGFyZ3VtZW50IHRvIF9fa21wX0dPTVBfZm9ya19jYWxsKS4KKy8vCisvLyBDb252ZXJzZWx5LCBLTVBfRElTUEFUQ0hfTkVYVCByZXR1cm5zIGFuZCBpbmNsdXNpdmUgdXBwZXIgYm91bmQgaW4gKnBfdWIsCisvLyBidXQgdGhlIEdudSBjb2RlZ2VuIGV4cGVjdHMgYW4gZXhjbHVzaWRlIHVwcGVyIGJvdW5kLCBzbyB0aGUgYWRqdXN0bWVudAorLy8gIipwX3ViICs9IHN0cmlkZSIgY29tcGVuc3RhdGVzIGZvciB0aGUgZGlzY3JlcGFuY3kuCisvLworLy8gQ29ycmVjdGlvbjogdGhlIGdudSBjb2RlZ2VuIGFsd2F5cyBhZGp1c3RzIHRoZSB1cHBlciBib3VuZCBieSArLTEsIG5vdCB0aGUKKy8vIHN0cmlkZSB2YWx1ZS4gIFdlIGFkanVzdCB0aGUgZGlzcGF0Y2ggcGFyYW1ldGVycyBhY2NvcmRpbmdseSAoYnkgKy0xKSwgYnV0CisvLyB3ZSBzdGlsbCBhZGp1c3QgcF91YiBieSB0aGUgYWN0dWFsIHN0cmlkZSB2YWx1ZS4KKy8vCisvLyBUaGUgInJ1bnRpbWUiIHZlcnNpb25zIGRvIG5vdCB0YWtlIGEgY2h1bmtfc3ogcGFyYW1ldGVyLgorLy8KKy8vIFRoZSBwcm9maWxlIGxpYiBjYW5ub3Qgc3VwcG9ydCBjb25zdHJ1Y3QgY2hlY2tpbmcgb2YgdW5vcmRlcmVkIGxvb3BzIHRoYXQKKy8vIGFyZSBwcmVkZXRlcm1pbmVkIGJ5IHRoZSBjb21waWxlciB0byBiZSBzdGF0aWNhbGx5IHNjaGVkdWxlZCwgYXMgdGhlIGdjYworLy8gY29kZWdlbiB3aWxsIG5vdCBhbHdheXMgZW1pdCBjYWxscyB0byBHT01QX2xvb3Bfc3RhdGljX25leHQoKSB0byBnZXQgdGhlCisvLyBuZXh0IGl0ZXJhdGlvbi4gIEluc3RlYWQsIGl0IGVtaXRzIGlubGluZSBjb2RlIHRvIGNhbGwgb21wX2dldF90aHJlYWRfbnVtKCkKKy8vIG51bSBhbmQgY2FsY3VsYXRlIHRoZSBpdGVyYXRpb24gc3BhY2UgdXNpbmcgdGhlIHJlc3VsdC4gIEl0IGRvZXNuJ3QgZG8gdGhpcworLy8gd2l0aCBvcmRlcmVkIHN0YXRpYyBsb29wLCBzbyB0aGV5IGNhbiBiZSBjaGVja2VkLgorLy8KKworI2RlZmluZSBMT09QX1NUQVJUKGZ1bmMsc2NoZWR1bGUpIFwKKyAgICBpbnQgZnVuYyAobG9uZyBsYiwgbG9uZyB1YiwgbG9uZyBzdHIsIGxvbmcgY2h1bmtfc3osIGxvbmcgKnBfbGIsICAgICAgICAgXAorICAgICAgbG9uZyAqcF91YikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBsb25nIHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTUtMT0MobG9jLCAjZnVuYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLQV9UUkFDRSgyMCwgKCAjZnVuYyAiOiBUIyVkLCBsYiAweCVseCwgdWIgMHglbHgsIHN0ciAweCVseCwgY2h1bmtfc3ogMHglbHhcbiIsICBcCisgICAgICAgICAgZ3RpZCwgbGIsIHViLCBzdHIsIGNodW5rX3N6ICkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKHN0ciA+IDApID8gKGxiIDwgdWIpIDogKGxiID4gdWIpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfRElTUEFUQ0hfSU5JVCgmbG9jLCBndGlkLCAoc2NoZWR1bGUpLCBsYiwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKHN0ciA+IDApID8gKHViIC0gMSkgOiAodWIgKyAxKSwgc3RyLCBjaHVua19zeiwgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoc2NoZWR1bGUpICE9IGttcF9zY2hfc3RhdGljKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzdGF0dXMgPSBLTVBfRElTUEFUQ0hfTkVYVCgmbG9jLCBndGlkLCBOVUxMLCAoa21wX2ludCAqKXBfbGIsICAgIFwKKyAgICAgICAgICAgICAgKGttcF9pbnQgKilwX3ViLCAoa21wX2ludCAqKSZzdHJpZGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKHN0YXR1cykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChzdHJpZGUgPT0gc3RyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAqcF91YiArPSAoc3RyID4gMCkgPyAxIDogLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc3RhdHVzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLQV9UUkFDRSgyMCwgKCAjZnVuYyAiIGV4aXQ6IFQjJWQsICpwX2xiIDB4JWx4LCAqcF91YiAweCVseCwgcmV0dXJuaW5nICVkXG4iLCBcCisgICAgICAgICAgZ3RpZCwgKnBfbGIsICpwX3ViLCBzdGF0dXMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworCisjZGVmaW5lIExPT1BfUlVOVElNRV9TVEFSVChmdW5jLHNjaGVkdWxlKSBcCisgICAgaW50IGZ1bmMgKGxvbmcgbGIsIGxvbmcgdWIsIGxvbmcgc3RyLCBsb25nICpwX2xiLCBsb25nICpwX3ViKSAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGxvbmcgc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbG9uZyBjaHVua19zeiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1LTE9DKGxvYywgI2Z1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS0FfVFJBQ0UoMjAsICggI2Z1bmMgIjogVCMlZCwgbGIgMHglbHgsIHViIDB4JWx4LCBzdHIgMHglbHgsIGNodW5rX3N6ICVkXG4iLCAgXAorICAgICAgICAgIGd0aWQsIGxiLCB1Yiwgc3RyLCBjaHVua19zeiApKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKChzdHIgPiAwKSA/IChsYiA8IHViKSA6IChsYiA+IHViKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX0RJU1BBVENIX0lOSVQoJmxvYywgZ3RpZCwgKHNjaGVkdWxlKSwgbGIsICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIChzdHIgPiAwKSA/ICh1YiAtIDEpIDogKHViICsgMSksIHN0ciwgY2h1bmtfc3osIFRSVUUpOyAgICAgICAgIFwKKyAgICAgICAgICAgIHN0YXR1cyA9IEtNUF9ESVNQQVRDSF9ORVhUKCZsb2MsIGd0aWQsIE5VTEwsIChrbXBfaW50ICopcF9sYiwgICAgXAorICAgICAgICAgICAgICAoa21wX2ludCAqKXBfdWIsIChrbXBfaW50ICopJnN0cmlkZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoc3RhdHVzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHN0cmlkZSA9PSBzdHIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICpwX3ViICs9IChzdHIgPiAwKSA/IDEgOiAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzdGF0dXMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtBX1RSQUNFKDIwLCAoICNmdW5jICIgZXhpdDogVCMlZCwgKnBfbGIgMHglbHgsICpwX3ViIDB4JWx4LCByZXR1cm5pbmcgJWRcbiIsIFwKKyAgICAgICAgICBndGlkLCAqcF9sYiwgKnBfdWIsIHN0YXR1cykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisKKyNkZWZpbmUgTE9PUF9ORVhUKGZ1bmMsZmluaV9jb2RlKSBcCisgICAgaW50IGZ1bmMobG9uZyAqcF9sYiwgbG9uZyAqcF91YikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGxvbmcgc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNS0xPQyhsb2MsICNmdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtBX1RSQUNFKDIwLCAoICNmdW5jICI6IFQjJWRcbiIsIGd0aWQpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmaW5pX2NvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0YXR1cyA9IEtNUF9ESVNQQVRDSF9ORVhUKCZsb2MsIGd0aWQsIE5VTEwsIChrbXBfaW50ICopcF9sYiwgICAgICAgIFwKKyAgICAgICAgICAoa21wX2ludCAqKXBfdWIsIChrbXBfaW50ICopJnN0cmlkZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoc3RhdHVzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAqcF91YiArPSAoc3RyaWRlID4gMCkgPyAxIDogLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtBX1RSQUNFKDIwLCAoICNmdW5jICIgZXhpdDogVCMlZCwgKnBfbGIgMHglbHgsICpwX3ViIDB4JWx4LCBzdHJpZGUgMHglbHgsICIgIFwKKyAgICAgICAgICAicmV0dXJuaW5nICVkXG4iLCBndGlkLCAqcF9sYiwgKnBfdWIsIHN0cmlkZSwgc3RhdHVzKSk7ICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisKK0xPT1BfU1RBUlQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1NUQVRJQ19TVEFSVCksIGttcF9zY2hfc3RhdGljKQorTE9PUF9ORVhUKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9TVEFUSUNfTkVYVCksIHt9KQorTE9PUF9TVEFSVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRFlOQU1JQ19TVEFSVCksIGttcF9zY2hfZHluYW1pY19jaHVua2VkKQorTE9PUF9ORVhUKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9EWU5BTUlDX05FWFQpLCB7fSkKK0xPT1BfU1RBUlQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX0dVSURFRF9TVEFSVCksIGttcF9zY2hfZ3VpZGVkX2NodW5rZWQpCitMT09QX05FWFQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX0dVSURFRF9ORVhUKSwge30pCitMT09QX1JVTlRJTUVfU1RBUlQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1JVTlRJTUVfU1RBUlQpLCBrbXBfc2NoX3J1bnRpbWUpCitMT09QX05FWFQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1JVTlRJTUVfTkVYVCksIHt9KQorCitMT09QX1NUQVJUKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX1NUQVRJQ19TVEFSVCksIGttcF9vcmRfc3RhdGljKQorTE9PUF9ORVhUKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX1NUQVRJQ19ORVhUKSwgXAorICAgIHsgS01QX0RJU1BBVENIX0ZJTklfQ0hVTksoJmxvYywgZ3RpZCk7IH0pCitMT09QX1NUQVJUKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX0RZTkFNSUNfU1RBUlQpLCBrbXBfb3JkX2R5bmFtaWNfY2h1bmtlZCkKK0xPT1BfTkVYVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9EWU5BTUlDX05FWFQpLCBcCisgICAgeyBLTVBfRElTUEFUQ0hfRklOSV9DSFVOSygmbG9jLCBndGlkKTsgfSkKK0xPT1BfU1RBUlQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfR1VJREVEX1NUQVJUKSwga21wX29yZF9ndWlkZWRfY2h1bmtlZCkKK0xPT1BfTkVYVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9HVUlERURfTkVYVCksIFwKKyAgICB7IEtNUF9ESVNQQVRDSF9GSU5JX0NIVU5LKCZsb2MsIGd0aWQpOyB9KQorTE9PUF9SVU5USU1FX1NUQVJUKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX1JVTlRJTUVfU1RBUlQpLCBrbXBfb3JkX3J1bnRpbWUpCitMT09QX05FWFQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfUlVOVElNRV9ORVhUKSwgXAorICAgIHsgS01QX0RJU1BBVENIX0ZJTklfQ0hVTksoJmxvYywgZ3RpZCk7IH0pCisKKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX0VORCkodm9pZCkKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9sb29wX2VuZDogVCMlZFxuIiwgZ3RpZCkpCisKKyAgICBfX2ttcF9iYXJyaWVyKGJzX3BsYWluX2JhcnJpZXIsIGd0aWQsIEZBTFNFLCAwLCBOVUxMLCBOVUxMKTsKKworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfbG9vcF9lbmQgZXhpdDogVCMlZFxuIiwgZ3RpZCkpCit9CisKKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX0VORF9OT1dBSVQpKHZvaWQpCit7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9sb29wX2VuZF9ub3dhaXQ6IFQjJWRcbiIsIF9fa21wX2dldF9ndGlkKCkpKQorfQorCisKKy8qDCovCisvLworLy8gVW5zaWduZWQgbG9uZyBsb25nIGxvb3Agd29ya3NoYXJpbmcgY29uc3RydWN0cworLy8KKy8vIFRoZXNlIGFyZSBuZXcgd2l0aCBnY2MgNC40CisvLworCisjZGVmaW5lIExPT1BfU1RBUlRfVUxMKGZ1bmMsc2NoZWR1bGUpIFwKKyAgICBpbnQgZnVuYyAoaW50IHVwLCB1bnNpZ25lZCBsb25nIGxvbmcgbGIsIHVuc2lnbmVkIGxvbmcgbG9uZyB1YiwgICAgICAgICAgXAorICAgICAgdW5zaWduZWQgbG9uZyBsb25nIHN0ciwgdW5zaWduZWQgbG9uZyBsb25nIGNodW5rX3N6LCAgICAgICAgICAgICAgICAgICBcCisgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgKnBfbGIsIHVuc2lnbmVkIGxvbmcgbG9uZyAqcF91YikgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGxvbmcgbG9uZyBzdHIyID0gdXAgPyAoKGxvbmcgbG9uZylzdHIpIDogLSgobG9uZyBsb25nKXN0cik7ICAgICAgICAgIFwKKyAgICAgICAgbG9uZyBsb25nIHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1LTE9DKGxvYywgI2Z1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLQV9UUkFDRSgyMCwgKCAjZnVuYyAiOiBUIyVkLCB1cCAlZCwgbGIgMHglbGx4LCB1YiAweCVsbHgsIHN0ciAweCVsbHgsIGNodW5rX3N6IDB4JWxseFxuIiwgXAorICAgICAgICAgIGd0aWQsIHVwLCBsYiwgdWIsIHN0ciwgY2h1bmtfc3ogKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKChzdHIgPiAwKSA/IChsYiA8IHViKSA6IChsYiA+IHViKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX0RJU1BBVENIX0lOSVRfVUxMKCZsb2MsIGd0aWQsIChzY2hlZHVsZSksIGxiLCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIChzdHIyID4gMCkgPyAodWIgLSAxKSA6ICh1YiArIDEpLCBzdHIyLCBjaHVua19zeiwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKHNjaGVkdWxlKSAhPSBrbXBfc2NoX3N0YXRpYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc3RhdHVzID0gS01QX0RJU1BBVENIX05FWFRfVUxMKCZsb2MsIGd0aWQsIE5VTEwsICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIChrbXBfdWludDY0ICopcF9sYiwgKGttcF91aW50NjQgKilwX3ViLCAoa21wX2ludDY0ICopJnN0cmlkZSk7IFwKKyAgICAgICAgICAgIGlmIChzdGF0dXMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoc3RyaWRlID09IHN0cjIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKnBfdWIgKz0gKHN0ciA+IDApID8gMSA6IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHN0YXR1cyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS0FfVFJBQ0UoMjAsICggI2Z1bmMgIiBleGl0OiBUIyVkLCAqcF9sYiAweCVsbHgsICpwX3ViIDB4JWxseCwgcmV0dXJuaW5nICVkXG4iLCBcCisgICAgICAgICAgZ3RpZCwgKnBfbGIsICpwX3ViLCBzdGF0dXMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworCisjZGVmaW5lIExPT1BfUlVOVElNRV9TVEFSVF9VTEwoZnVuYyxzY2hlZHVsZSkgXAorICAgIGludCBmdW5jIChpbnQgdXAsIHVuc2lnbmVkIGxvbmcgbG9uZyBsYiwgdW5zaWduZWQgbG9uZyBsb25nIHViLCAgICAgICAgICBcCisgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgc3RyLCB1bnNpZ25lZCBsb25nIGxvbmcgKnBfbGIsICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAqcF91YikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbG9uZyBsb25nIHN0cjIgPSB1cCA/ICgobG9uZyBsb25nKXN0cikgOiAtKChsb25nIGxvbmcpc3RyKTsgICAgICAgICAgXAorICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBjaHVua19zeiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNS0xPQyhsb2MsICNmdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS0FfVFJBQ0UoMjAsICggI2Z1bmMgIjogVCMlZCwgdXAgJWQsIGxiIDB4JWxseCwgdWIgMHglbGx4LCBzdHIgMHglbGx4LCBjaHVua19zeiAweCVsbHhcbiIsIFwKKyAgICAgICAgICBndGlkLCB1cCwgbGIsIHViLCBzdHIsIGNodW5rX3N6ICkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoc3RyID4gMCkgPyAobGIgPCB1YikgOiAobGIgPiB1YikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9ESVNQQVRDSF9JTklUX1VMTCgmbG9jLCBndGlkLCAoc2NoZWR1bGUpLCBsYiwgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoc3RyMiA+IDApID8gKHViIC0gMSkgOiAodWIgKyAxKSwgc3RyMiwgY2h1bmtfc3osIFRSVUUpOyAgICAgICBcCisgICAgICAgICAgICBzdGF0dXMgPSBLTVBfRElTUEFUQ0hfTkVYVF9VTEwoJmxvYywgZ3RpZCwgTlVMTCwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKGttcF91aW50NjQgKilwX2xiLCAoa21wX3VpbnQ2NCAqKXBfdWIsIChrbXBfaW50NjQgKikmc3RyaWRlKTsgXAorICAgICAgICAgICAgaWYgKHN0YXR1cykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChzdHJpZGUgPT0gc3RyMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAqcF91YiArPSAoc3RyID4gMCkgPyAxIDogLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc3RhdHVzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLQV9UUkFDRSgyMCwgKCAjZnVuYyAiIGV4aXQ6IFQjJWQsICpwX2xiIDB4JWxseCwgKnBfdWIgMHglbGx4LCByZXR1cm5pbmcgJWRcbiIsIFwKKyAgICAgICAgICBndGlkLCAqcF9sYiwgKnBfdWIsIHN0YXR1cykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisKKyNkZWZpbmUgTE9PUF9ORVhUX1VMTChmdW5jLGZpbmlfY29kZSkgXAorICAgIGludCBmdW5jKHVuc2lnbmVkIGxvbmcgbG9uZyAqcF9sYiwgdW5zaWduZWQgbG9uZyBsb25nICpwX3ViKSAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBsb25nIGxvbmcgc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTUtMT0MobG9jLCAjZnVuYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLQV9UUkFDRSgyMCwgKCAjZnVuYyAiOiBUIyVkXG4iLCBndGlkKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZmluaV9jb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdGF0dXMgPSBLTVBfRElTUEFUQ0hfTkVYVF9VTEwoJmxvYywgZ3RpZCwgTlVMTCwgKGttcF91aW50NjQgKilwX2xiLCBcCisgICAgICAgICAgKGttcF91aW50NjQgKilwX3ViLCAoa21wX2ludDY0ICopJnN0cmlkZSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKHN0YXR1cykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKnBfdWIgKz0gKHN0cmlkZSA+IDApID8gMSA6IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLQV9UUkFDRSgyMCwgKCAjZnVuYyAiIGV4aXQ6IFQjJWQsICpwX2xiIDB4JWxseCwgKnBfdWIgMHglbGx4LCBzdHJpZGUgMHglbGx4LCAiIFwKKyAgICAgICAgICAicmV0dXJuaW5nICVkXG4iLCBndGlkLCAqcF9sYiwgKnBfdWIsIHN0cmlkZSwgc3RhdHVzKSk7ICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisKK0xPT1BfU1RBUlRfVUxMKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfU1RBVElDX1NUQVJUKSwga21wX3NjaF9zdGF0aWMpCitMT09QX05FWFRfVUxMKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfU1RBVElDX05FWFQpLCB7fSkKK0xPT1BfU1RBUlRfVUxMKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfRFlOQU1JQ19TVEFSVCksIGttcF9zY2hfZHluYW1pY19jaHVua2VkKQorTE9PUF9ORVhUX1VMTCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX0RZTkFNSUNfTkVYVCksIHt9KQorTE9PUF9TVEFSVF9VTEwoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9HVUlERURfU1RBUlQpLCBrbXBfc2NoX2d1aWRlZF9jaHVua2VkKQorTE9PUF9ORVhUX1VMTCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX0dVSURFRF9ORVhUKSwge30pCitMT09QX1JVTlRJTUVfU1RBUlRfVUxMKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfUlVOVElNRV9TVEFSVCksIGttcF9zY2hfcnVudGltZSkKK0xPT1BfTkVYVF9VTEwoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9SVU5USU1FX05FWFQpLCB7fSkKKworTE9PUF9TVEFSVF9VTEwoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1NUQVRJQ19TVEFSVCksIGttcF9vcmRfc3RhdGljKQorTE9PUF9ORVhUX1VMTCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfU1RBVElDX05FWFQpLCBcCisgICAgeyBLTVBfRElTUEFUQ0hfRklOSV9DSFVOS19VTEwoJmxvYywgZ3RpZCk7IH0pCitMT09QX1NUQVJUX1VMTCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfRFlOQU1JQ19TVEFSVCksIGttcF9vcmRfZHluYW1pY19jaHVua2VkKQorTE9PUF9ORVhUX1VMTCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfRFlOQU1JQ19ORVhUKSwgXAorICAgIHsgS01QX0RJU1BBVENIX0ZJTklfQ0hVTktfVUxMKCZsb2MsIGd0aWQpOyB9KQorTE9PUF9TVEFSVF9VTEwoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX0dVSURFRF9TVEFSVCksIGttcF9vcmRfZ3VpZGVkX2NodW5rZWQpCitMT09QX05FWFRfVUxMKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9HVUlERURfTkVYVCksIFwKKyAgICB7IEtNUF9ESVNQQVRDSF9GSU5JX0NIVU5LX1VMTCgmbG9jLCBndGlkKTsgfSkKK0xPT1BfUlVOVElNRV9TVEFSVF9VTEwoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1JVTlRJTUVfU1RBUlQpLCBrbXBfb3JkX3J1bnRpbWUpCitMT09QX05FWFRfVUxMKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9SVU5USU1FX05FWFQpLCBcCisgICAgeyBLTVBfRElTUEFUQ0hfRklOSV9DSFVOS19VTEwoJmxvYywgZ3RpZCk7IH0pCisKKworLyoMKi8KKy8vCisvLyBDb21iaW5lZCBwYXJhbGxlbCAvIGxvb3Agd29ya3NoYXJpbmcgY29uc3RydWN0cworLy8KKy8vIFRoZXJlIGFyZSBubyB1bGwgdmVyc2lvbnMgKHlldCkuCisvLworCisjZGVmaW5lIFBBUkFMTEVMX0xPT1BfU1RBUlQoZnVuYywgc2NoZWR1bGUpIFwKKyAgICB2b2lkIGZ1bmMgKHZvaWQgKCp0YXNrKSAodm9pZCAqKSwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbnVtX3RocmVhZHMsICAgICAgXAorICAgICAgbG9uZyBsYiwgbG9uZyB1YiwgbG9uZyBzdHIsIGxvbmcgY2h1bmtfc3opICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgbGFzdCA9IEZBTFNFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1LTE9DKGxvYywgI2Z1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS0FfVFJBQ0UoMjAsICggI2Z1bmMgIjogVCMlZCwgbGIgMHglbHgsIHViIDB4JWx4LCBzdHIgMHglbHgsIGNodW5rX3N6IDB4JWx4XG4iLCAgICAgICAgXAorICAgICAgICAgIGd0aWQsIGxiLCB1Yiwgc3RyLCBjaHVua19zeiApKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKF9fa21wY19va190b19mb3JrKCZsb2MpICYmIChudW1fdGhyZWFkcyAhPSAxKSkgeyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKG51bV90aHJlYWRzICE9IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX19rbXBfcHVzaF9udW1fdGhyZWFkcygmbG9jLCBndGlkLCBudW1fdGhyZWFkcyk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX19rbXBfR09NUF9mb3JrX2NhbGwoJmxvYywgZ3RpZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIChtaWNyb3Rhc2tfdClfX2ttcF9HT01QX3BhcmFsbGVsX21pY3JvdGFza193cmFwcGVyLCA5LCAgICAgICAgIFwKKyAgICAgICAgICAgICAgdGFzaywgZGF0YSwgbnVtX3RocmVhZHMsICZsb2MsIChzY2hlZHVsZSksIGxiLCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoc3RyID4gMCkgPyAodWIgLSAxKSA6ICh1YiArIDEpLCBzdHIsIGNodW5rX3N6KTsgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWwoJmxvYywgZ3RpZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfRElTUEFUQ0hfSU5JVCgmbG9jLCBndGlkLCAoc2NoZWR1bGUpLCBsYiwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKHN0ciA+IDApID8gKHViIC0gMSkgOiAodWIgKyAxKSwgc3RyLCBjaHVua19zeiwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoc2NoZWR1bGUpICE9IGttcF9zY2hfc3RhdGljKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtBX1RSQUNFKDIwLCAoICNmdW5jICIgZXhpdDogVCMlZFxuIiwgZ3RpZCkpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKworUEFSQUxMRUxfTE9PUF9TVEFSVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfU1RBVElDX1NUQVJUKSwga21wX3NjaF9zdGF0aWMpCitQQVJBTExFTF9MT09QX1NUQVJUKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9EWU5BTUlDX1NUQVJUKSwga21wX3NjaF9keW5hbWljX2NodW5rZWQpCitQQVJBTExFTF9MT09QX1NUQVJUKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9HVUlERURfU1RBUlQpLCBrbXBfc2NoX2d1aWRlZF9jaHVua2VkKQorUEFSQUxMRUxfTE9PUF9TVEFSVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfUlVOVElNRV9TVEFSVCksIGttcF9zY2hfcnVudGltZSkKKworCisjaWYgT01QXzMwX0VOQUJMRUQKKworCisvKgwqLworLy8KKy8vIFRhc2tpbmcgY29uc3RydWN0cworLy8KKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9UQVNLKSh2b2lkICgqZnVuYykodm9pZCAqKSwgdm9pZCAqZGF0YSwgdm9pZCAoKmNvcHlfZnVuYykodm9pZCAqLCB2b2lkICopLAorICBsb25nIGFyZ19zaXplLCBsb25nIGFyZ19hbGlnbiwgaW50IGlmX2NvbmQsIHVuc2lnbmVkIGdvbXBfZmxhZ3MpCit7CisgICAgTUtMT0MobG9jLCAiR09NUF90YXNrIik7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAga21wX2ludDMyIGZsYWdzID0gMDsKKyAgICBrbXBfdGFza2luZ19mbGFnc190ICppbnB1dF9mbGFncyA9IChrbXBfdGFza2luZ19mbGFnc190ICopICYgZmxhZ3M7CisKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX3Rhc2s6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIC8vIFRoZSBsb3ctb3JkZXIgYml0IGlzIHRoZSAidGllZCIgZmxhZworICAgIGlmIChnb21wX2ZsYWdzICYgMSkgeworICAgICAgICBpbnB1dF9mbGFncy0+dGllZG5lc3MgPSAxOworICAgIH0KKyAgICBpbnB1dF9mbGFncy0+bmF0aXZlID0gMTsKKyAgICAvLyBfX2ttcF90YXNrX2FsbG9jKCkgc2V0cyB1cCBhbGwgb3RoZXIgZmxhZ3MKKworICAgIGlmICghIGlmX2NvbmQpIHsKKyAgICAgICAgYXJnX3NpemUgPSAwOworICAgIH0KKworICAgIGttcF90YXNrX3QgKnRhc2sgPSBfX2ttcF90YXNrX2FsbG9jKCZsb2MsIGd0aWQsIGlucHV0X2ZsYWdzLAorICAgICAgc2l6ZW9mKGttcF90YXNrX3QpLCBhcmdfc2l6ZSA/IGFyZ19zaXplICsgYXJnX2FsaWduIC0gMSA6IDAsCisgICAgICAoa21wX3JvdXRpbmVfZW50cnlfdClmdW5jKTsKKworICAgIGlmIChhcmdfc2l6ZSA+IDApIHsKKyAgICAgICAgaWYgKGFyZ19hbGlnbiA+IDApIHsKKyAgICAgICAgICAgIHRhc2stPnNoYXJlZHMgPSAodm9pZCAqKSgoKChzaXplX3QpdGFzay0+c2hhcmVkcykKKyAgICAgICAgICAgICAgKyBhcmdfYWxpZ24gLSAxKSAvIGFyZ19hbGlnbiAqIGFyZ19hbGlnbik7CisgICAgICAgIH0KKyAgICAgICAgLy9lbHNlIGVycm9yPz8KKworICAgICAgICBpZiAoY29weV9mdW5jKSB7CisgICAgICAgICAgICAoKmNvcHlfZnVuYykodGFzay0+c2hhcmVkcywgZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBtZW1jcHkodGFzay0+c2hhcmVkcywgZGF0YSwgYXJnX3NpemUpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGlmX2NvbmQpIHsKKyAgICAgICAgX19rbXBjX29tcF90YXNrKCZsb2MsIGd0aWQsIHRhc2spOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBjX29tcF90YXNrX2JlZ2luX2lmMCgmbG9jLCBndGlkLCB0YXNrKTsKKyAgICAgICAgZnVuYyhkYXRhKTsKKyAgICAgICAgX19rbXBjX29tcF90YXNrX2NvbXBsZXRlX2lmMCgmbG9jLCBndGlkLCB0YXNrKTsKKyAgICB9CisKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX3Rhc2sgZXhpdDogVCMlZFxuIiwgZ3RpZCkpOworfQorCisKK3ZvaWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfVEFTS1dBSVQpKHZvaWQpCit7CisgICAgTUtMT0MobG9jLCAiR09NUF90YXNrd2FpdCIpOworICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworCisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF90YXNrd2FpdDogVCMlZFxuIiwgZ3RpZCkpOworCisgICAgX19rbXBjX29tcF90YXNrd2FpdCgmbG9jLCBndGlkKTsKKworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfdGFza3dhaXQgZXhpdDogVCMlZFxuIiwgZ3RpZCkpOworfQorCisKKyNlbmRpZiAvKiBPTVBfMzBfRU5BQkxFRCAqLworCisKKy8qDCovCisvLworLy8gU2VjdGlvbnMgd29ya3NoYXJpbmcgY29uc3RydWN0cworLy8KKworLy8KKy8vIEZvciB0aGUgc2VjdGlvbnMgY29uc3RydWN0LCB3ZSBpbml0aWFsaXplIGEgZHluYW1pY2FsbHkgc2NoZWR1bGVkIGxvb3AKKy8vIHdvcmtzaGFyaW5nIGNvbnN0cnVjdCB3aXRoIGxiIDEgYW5kIHN0cmlkZSAxLCBhbmQgdXNlIHRoZSBpdGVyYXRpb24gIydzCisvLyB0aGF0IGl0cyByZXR1cm5zIGFzIHNlY3Rpb25zIGlkcy4KKy8vCisvLyBUaGVyZSBhcmUgbm8gc3BlY2lhbCBlbnRyeSBwb2ludHMgZm9yIG9yZGVyZWQgc2VjdGlvbnMsIHNvIHdlIGFsd2F5cyB1c2UKKy8vIHRoZSBkeW5hbWljYWxseSBzY2hlZHVsZWQgd29ya3NoYXJlLCBldmVuIGlmIHRoZSBzZWN0aW9ucyBhcmVuJ3Qgb3JkZXJlZC4KKy8vCisKK3Vuc2lnbmVkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX1NUQVJUKSh1bnNpZ25lZCBjb3VudCkKK3sKKyAgICBpbnQgc3RhdHVzOworICAgIGttcF9pbnQgbGIsIHViLCBzdHJpZGU7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9zZWN0aW9uc19zdGFydCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfc2VjdGlvbnNfc3RhcnQ6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIEtNUF9ESVNQQVRDSF9JTklUKCZsb2MsIGd0aWQsIGttcF9ubV9keW5hbWljX2NodW5rZWQsIDEsIGNvdW50LCAxLCAxLCBUUlVFKTsKKworICAgIHN0YXR1cyA9IEtNUF9ESVNQQVRDSF9ORVhUKCZsb2MsIGd0aWQsIE5VTEwsICZsYiwgJnViLCAmc3RyaWRlKTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoc3RyaWRlID09IDEpOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGxiID4gMCk7CisgICAgICAgIEtNUF9BU1NFUlQobGIgPT0gdWIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbGIgPSAwOworICAgIH0KKworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfc2VjdGlvbnNfc3RhcnQgZXhpdDogVCMlZCByZXR1cm5pbmcgJXVcbiIsIGd0aWQsCisgICAgICAodW5zaWduZWQpbGIpKTsKKyAgICByZXR1cm4gKHVuc2lnbmVkKWxiOworfQorCisKK3Vuc2lnbmVkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX05FWFQpKHZvaWQpCit7CisgICAgaW50IHN0YXR1czsKKyAgICBrbXBfaW50IGxiLCB1Yiwgc3RyaWRlOworICAgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgICBNS0xPQyhsb2MsICJHT01QX3NlY3Rpb25zX25leHQiKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX3NlY3Rpb25zX25leHQ6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIHN0YXR1cyA9IEtNUF9ESVNQQVRDSF9ORVhUKCZsb2MsIGd0aWQsIE5VTEwsICZsYiwgJnViLCAmc3RyaWRlKTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoc3RyaWRlID09IDEpOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGxiID4gMCk7CisgICAgICAgIEtNUF9BU1NFUlQobGIgPT0gdWIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbGIgPSAwOworICAgIH0KKworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfc2VjdGlvbnNfbmV4dCBleGl0OiBUIyVkIHJldHVybmluZyAldVxuIiwgZ3RpZCwKKyAgICAgICh1bnNpZ25lZClsYikpOworICAgIHJldHVybiAodW5zaWduZWQpbGI7Cit9CisKKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9TRUNUSU9OU19TVEFSVCkodm9pZCAoKnRhc2spICh2b2lkICopLCB2b2lkICpkYXRhLAorICB1bnNpZ25lZCBudW1fdGhyZWFkcywgdW5zaWduZWQgY291bnQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgaW50IGxhc3QgPSBGQUxTRTsKKyAgICBNS0xPQyhsb2MsICJHT01QX3BhcmFsbGVsX3NlY3Rpb25zX3N0YXJ0Iik7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9wYXJhbGxlbF9zZWN0aW9uc19zdGFydDogVCMlZFxuIiwgZ3RpZCkpOworCisgICAgaWYgKF9fa21wY19va190b19mb3JrKCZsb2MpICYmIChudW1fdGhyZWFkcyAhPSAxKSkgeworICAgICAgICBpZiAobnVtX3RocmVhZHMgIT0gMCkgeworICAgICAgICAgICAgX19rbXBfcHVzaF9udW1fdGhyZWFkcygmbG9jLCBndGlkLCBudW1fdGhyZWFkcyk7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfR09NUF9mb3JrX2NhbGwoJmxvYywgZ3RpZCwKKyAgICAgICAgICAobWljcm90YXNrX3QpX19rbXBfR09NUF9wYXJhbGxlbF9taWNyb3Rhc2tfd3JhcHBlciwgOSwgdGFzaywgZGF0YSwKKyAgICAgICAgICBudW1fdGhyZWFkcywgJmxvYywga21wX25tX2R5bmFtaWNfY2h1bmtlZCwgKGttcF9pbnQpMSwKKyAgICAgICAgICAoa21wX2ludCljb3VudCwgKGttcF9pbnQpMSwgKGttcF9pbnQpMSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBfX2ttcGNfc2VyaWFsaXplZF9wYXJhbGxlbCgmbG9jLCBndGlkKTsKKyAgICB9CisKKyAgICBLTVBfRElTUEFUQ0hfSU5JVCgmbG9jLCBndGlkLCBrbXBfbm1fZHluYW1pY19jaHVua2VkLCAxLCBjb3VudCwgMSwgMSwgVFJVRSk7CisKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX3BhcmFsbGVsX3NlY3Rpb25zX3N0YXJ0IGV4aXQ6IFQjJWRcbiIsIGd0aWQpKTsKK30KKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX0VORCkodm9pZCkKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9zZWN0aW9uc19lbmQ6IFQjJWRcbiIsIGd0aWQpKQorCisgICAgX19rbXBfYmFycmllcihic19wbGFpbl9iYXJyaWVyLCBndGlkLCBGQUxTRSwgMCwgTlVMTCwgTlVMTCk7CisKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX3NlY3Rpb25zX2VuZCBleGl0OiBUIyVkXG4iLCBndGlkKSkKK30KKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX0VORF9OT1dBSVQpKHZvaWQpCit7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9zZWN0aW9uc19lbmRfbm93YWl0OiBUIyVkXG4iLCBfX2ttcF9nZXRfZ3RpZCgpKSkKK30KKworLy8gbGliZ29tcCBoYXMgYW4gZW1wdHkgZnVuY3Rpb24gZm9yIEdPTVBfdGFza3lpZWxkIGFzIG9mIDIwMTMtMTAtMTAKK3ZvaWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfVEFTS1lJRUxEKSh2b2lkKQoreworCit9CisKKy8qCisgICAgVGhlIGZvbGxvd2luZyBzZWN0aW9ucyBvZiBjb2RlIGNyZWF0ZSBhbGlhc2VzIGZvciB0aGUgR09NUF8qIGZ1bmN0aW9ucywKKyAgICB0aGVuIGNyZWF0ZSB2ZXJzaW9uZWQgc3ltYm9scyB1c2luZyB0aGUgYXNzZW1ibGVyIGRpcmVjdGl2ZSAuc3ltdmVyLgorICAgIFRoaXMgaXMgb25seSBwZXJ0aW5lbnQgZm9yIEVMRiAuc28gbGlicmFyeQorICAgIHhhbGlhc2lmeSBhbmQgeHZlcnNpb25pZnkgYXJlIGRlZmluZWQgaW4ga21wX2Z0bl9vcy5oCisqLworCisjaWYgS01QX09TX0xJTlVYCisKKy8vIEdPTVBfMS4wIGFsaWFzZXMKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9BVE9NSUNfRU5ELCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfQVRPTUlDX1NUQVJULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfQkFSUklFUiwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0NSSVRJQ0FMX0VORCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0NSSVRJQ0FMX05BTUVfRU5ELCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfTkFNRV9TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0NSSVRJQ0FMX1NUQVJULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9EWU5BTUlDX05FWFQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX0RZTkFNSUNfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX0VORCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRU5EX05PV0FJVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfR1VJREVEX05FWFQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX0dVSURFRF9TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9EWU5BTUlDX05FWFQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfRFlOQU1JQ19TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9HVUlERURfTkVYVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9HVUlERURfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfUlVOVElNRV9ORVhULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX1JVTlRJTUVfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfU1RBVElDX05FWFQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfU1RBVElDX1NUQVJULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9SVU5USU1FX05FWFQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1JVTlRJTUVfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1NUQVRJQ19ORVhULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9TVEFUSUNfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9PUkRFUkVEX0VORCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX09SREVSRURfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9FTkQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0RZTkFNSUNfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0dVSURFRF9TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfUlVOVElNRV9TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfU1RBVElDX1NUQVJULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfU0VDVElPTlNfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX0VORCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX0VORF9OT1dBSVQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19ORVhULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfU0VDVElPTlNfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9TSU5HTEVfQ09QWV9FTkQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9TSU5HTEVfQ09QWV9TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1NJTkdMRV9TVEFSVCwgMTApOworCisvLyBHT01QXzIuMCBhbGlhc2VzCisjaWYgT01QXzMwX0VOQUJMRUQKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9UQVNLLCAyMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfVEFTS1dBSVQsIDIwKTsKKyNlbmRpZgoreGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX0RZTkFNSUNfTkVYVCwgMjApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX0RZTkFNSUNfU1RBUlQsIDIwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9HVUlERURfTkVYVCwgMjApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX0dVSURFRF9TVEFSVCwgMjApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfRFlOQU1JQ19ORVhULCAyMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9EWU5BTUlDX1NUQVJULCAyMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9HVUlERURfTkVYVCwgMjApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfR1VJREVEX1NUQVJULCAyMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9SVU5USU1FX05FWFQsIDIwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1JVTlRJTUVfU1RBUlQsIDIwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1NUQVRJQ19ORVhULCAyMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9TVEFUSUNfU1RBUlQsIDIwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9SVU5USU1FX05FWFQsIDIwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9SVU5USU1FX1NUQVJULCAyMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfU1RBVElDX05FWFQsIDIwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9TVEFUSUNfU1RBUlQsIDIwKTsKKworLy8gR09NUF8zLjAgYWxpYXNlcworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RBU0tZSUVMRCwgMzApOworCisvLyBHT01QXzQuMCBhbGlhc2VzCisvKiBUT0RPOiBhZGQgR09NUF80LjAgYWxpYXNlcyB3aGVuIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgIEdPTVBfKiBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkCisqLworCisvLyBHT01QXzEuMCB2ZXJzaW9uZWQgc3ltYm9scworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfQVRPTUlDX0VORCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfQVRPTUlDX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9CQVJSSUVSLCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9DUklUSUNBTF9FTkQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0NSSVRJQ0FMX05BTUVfRU5ELCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9DUklUSUNBTF9OQU1FX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9DUklUSUNBTF9TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9EWU5BTUlDX05FWFQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRFlOQU1JQ19TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9FTkQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRU5EX05PV0FJVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9HVUlERURfTkVYVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9HVUlERURfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9EWU5BTUlDX05FWFQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9EWU5BTUlDX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfR1VJREVEX05FWFQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9HVUlERURfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9SVU5USU1FX05FWFQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9SVU5USU1FX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfU1RBVElDX05FWFQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9TVEFUSUNfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfUlVOVElNRV9ORVhULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1JVTlRJTUVfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfU1RBVElDX05FWFQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfU1RBVElDX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9PUkRFUkVEX0VORCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfT1JERVJFRF9TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfRU5ELCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0RZTkFNSUNfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfR1VJREVEX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX1JVTlRJTUVfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfU1RBVElDX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9TRUNUSU9OU19TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX0VORCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfU0VDVElPTlNfRU5EX05PV0FJVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfU0VDVElPTlNfTkVYVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfU0VDVElPTlNfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1NJTkdMRV9DT1BZX0VORCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfU0lOR0xFX0NPUFlfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1NJTkdMRV9TVEFSVCwgMTAsICJHT01QXzEuMCIpOworCisvLyBHT01QXzIuMCB2ZXJzaW9uZWQgc3ltYm9scworI2lmIE9NUF8zMF9FTkFCTEVECit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9UQVNLLCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9UQVNLV0FJVCwgMjAsICJHT01QXzIuMCIpOworI2VuZGlmCit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9EWU5BTUlDX05FWFQsIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX0RZTkFNSUNfU1RBUlQsIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX0dVSURFRF9ORVhULCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9HVUlERURfU1RBUlQsIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfRFlOQU1JQ19ORVhULCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX0RZTkFNSUNfU1RBUlQsIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfR1VJREVEX05FWFQsIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfR1VJREVEX1NUQVJULCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1JVTlRJTUVfTkVYVCwgMjAsICJHT01QXzIuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9SVU5USU1FX1NUQVJULCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1NUQVRJQ19ORVhULCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1NUQVRJQ19TVEFSVCwgMjAsICJHT01QXzIuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfUlVOVElNRV9ORVhULCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9SVU5USU1FX1NUQVJULCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9TVEFUSUNfTkVYVCwgMjAsICJHT01QXzIuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfU1RBVElDX1NUQVJULCAyMCwgIkdPTVBfMi4wIik7CisKKy8vIEdPTVBfMy4wIHZlcnNpb25lZCBzeW1ib2xzCit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9UQVNLWUlFTEQsIDMwLCAiR09NUF8zLjAiKTsKKworLy8gR09NUF80LjAgdmVyc2lvbmVkIHN5bWJvbHMKKy8qIFRPRE86IGFkZCBHT01QXzQuMCB2ZXJzaW9uZWQgc3ltYm9scyB3aGVuIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgIEdPTVBfKiBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkCisqLworCisjZW5kaWYgLyogS01QX09TX0xJTlVYICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIH0gLy9leHRlcm4gIkMiCisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfaTE4bi5jIGIvZmluYWwvcnVudGltZS9zcmMva21wX2kxOG4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTAxMDJhCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2kxOG4uYwpAQCAtMCwwICsxLDk3NiBAQAorLyoKKyAqIGttcF9pMThuLmMKKyAqICRSZXZpc2lvbjogNDI4MTAgJAorICogJERhdGU6IDIwMTMtMTEtMDcgMTI6MDY6MzMgLTA2MDAgKFRodSwgMDcgTm92IDIwMTMpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKworI2luY2x1ZGUgImttcF9vcy5oIgorI2luY2x1ZGUgImttcF9kZWJ1Zy5oIgorI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9sb2NrLmgiCisjaW5jbHVkZSAia21wX2lvLmgiICAgICAgICAgIC8vIF9fa21wX3ByaW50Zi4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxsb2NhbGUuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2luY2x1ZGUgImttcF9pMThuX2RlZmF1bHQuaW5jIgorI2luY2x1ZGUgImttcF9zdHIuaCIKKyNpbmNsdWRlICJrbXBfZW52aXJvbm1lbnQuaCIKKworI3VuZGVmIEtNUF9JMThOX09LCisKKyNkZWZpbmUgZ2V0X3NlY3Rpb24oIGlkICkgICggKGlkKSA+PiAxNiApCisjZGVmaW5lIGdldF9udW1iZXIoIGlkICkgICAoIChpZCkgJiAweEZGRkYgKQorCitrbXBfbXNnX3QgICAgICAgICAgIF9fa21wX21zZ19lbXB0eSA9IHsga21wX210X2R1bW15LCAwLCAiIiwgMCAgfTsKK2ttcF9tc2dfdCAgICAgICAgICAgX19rbXBfbXNnX251bGwgID0geyBrbXBfbXRfZHVtbXksIDAsIE5VTEwsIDAgfTsKK3N0YXRpYyBjaGFyIGNvbnN0ICogbm9fbWVzc2FnZV9hdmFpbGFibGUgPSAiKE5vIG1lc3NhZ2UgYXZhaWxhYmxlKSI7CisKK2VudW0ga21wX2kxOG5fY2F0X3N0YXR1cyB7CisgICAgS01QX0kxOE5fQ0xPU0VELCAgICAvLyBOb3QgeWV0IG9wZW5lZCBvciBjbG9zZWQuCisgICAgS01QX0kxOE5fT1BFTkVELCAgICAvLyBPcGVuZWQgc3VjY2Vzc2Z1bGx5LCByZWFkeSB0byB1c2UuCisgICAgS01QX0kxOE5fQUJTRU5UICAgICAvLyBPcGVuaW5nIGZhaWxlZCwgbWVzc2FnZSBjYXRhbG9nIHNob3VsZCBub3QgYmUgdXNlZC4KK307IC8vIGVudW0ga21wX2kxOG5fY2F0X3N0YXR1cwordHlwZWRlZiBlbnVtIGttcF9pMThuX2NhdF9zdGF0dXMgIGttcF9pMThuX2NhdF9zdGF0dXNfdDsKK3N0YXRpYyB2b2xhdGlsZSBrbXBfaTE4bl9jYXRfc3RhdHVzX3QgIHN0YXR1cyA9IEtNUF9JMThOX0NMT1NFRDsKKworLyoKKyAgICBNZXNzYWdlIGNhdGFsb2cgaXMgb3BlbmVkIGF0IGZpcnN0IHVzYWdlLCBzbyB3ZSBoYXZlIHRvIHN5bmNocm9uaXplIG9wZW5pbmcgdG8gYXZvaWQgcmFjZSBhbmQKKyAgICBtdWx0aXBsZSBvcGVuaW5ncy4KKworICAgIENsb3NpbmcgZG9lcyBub3QgcmVxdWlyZSBzeW5jaHJvbml6YXRpb24sIGJlY2F1c2UgY2F0YWxvZyBpcyBjbG9zZWQgdmVyeSBsYXRlIGF0IGxpYnJhcnkKKyAgICBzaHV0dGluZyBkb3duLCB3aGVuIG5vIG90aGVyIHRocmVhZHMgYXJlIGFsaXZlLgorKi8KKworc3RhdGljIHZvaWQgX19rbXBfaTE4bl9kb19jYXRvcGVuKCk7CitzdGF0aWMga21wX2Jvb3RzdHJhcF9sb2NrX3QgIGxvY2sgPSBLTVBfQk9PVFNUUkFQX0xPQ0tfSU5JVElBTElaRVIoIGxvY2sgKTsKKyAgICAvLyBgbG9jaycgdmFyaWFibGUgbWF5IGJlIHBsYWNlZCBpbnRvIF9fa21wX2kxOG5fY2F0b3BlbiBmdW5jdGlvbiBiZWNhdXNlIGl0IGlzIHVzZWQgb25seSBieQorICAgIC8vIHRoYXQgZnVuY3Rpb24uIEJ1dCB3ZSBhZnJhaWQgYSAoYnVnZ3kpIGNvbXBpbGVyIG1heSB0cmVhdCBpdCB3cm9uZ2x5LiBTbyB3ZSBwdXQgaXQgb3V0c2lkZSBvZgorICAgIC8vIGZ1bmN0aW9uIGp1c3QgaW4gY2FzZS4KKwordm9pZAorX19rbXBfaTE4bl9jYXRvcGVuKAorKSB7CisgICAgaWYgKCBzdGF0dXMgPT0gS01QX0kxOE5fQ0xPU0VEICkgeworICAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIGxvY2sgKTsKKyAgICAgICAgaWYgKCBzdGF0dXMgPT0gS01QX0kxOE5fQ0xPU0VEICkgeworICAgICAgICAgICAgX19rbXBfaTE4bl9kb19jYXRvcGVuKCk7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgbG9jayApOworICAgIH07IC8vIGlmCit9IC8vIGZ1bmMgX19rbXBfaTE4bl9jYXRvcGVuCisKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBMaW51eCogT1MgYW5kIE9TIFgqIHBhcnQuCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisjaWYgS01QX09TX1VOSVgKKyNkZWZpbmUgS01QX0kxOE5fT0sKKworI2luY2x1ZGUgPG5sX3R5cGVzLmg+CisKKyNkZWZpbmUgS01QX0kxOE5fTlVMTENBVCAoKG5sX2NhdGQpKCAtMSApKQorc3RhdGljIG5sX2NhdGQgICAgICAgY2F0ICA9IEtNUF9JMThOX05VTExDQVQ7ICAgIC8vICEhISBTaGFsbCBpdCBiZSB2b2xhdGlsZT8KK3N0YXRpYyBjaGFyIGNvbnN0ICogIG5hbWUgPSAoIEtNUF9WRVJTSU9OX01BSk9SID09IDQgPyAibGliZ3VpZGUuY2F0IiA6ICJsaWJpb21wNS5jYXQiICk7CisKKy8qCisgICAgVXNlZnVsIGxpbmtzOgorICAgICAgICBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDAwOTUzOTkvYmFzZWRlZnMveGJkX2NoYXAwOC5odG1sI3RhZ18wOF8wMgorICAgICAgICBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDAwOTUzOTkvZnVuY3Rpb25zL2NhdG9wZW4uaHRtbAorICAgICAgICBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDAwOTUzOTkvZnVuY3Rpb25zL3NldGxvY2FsZS5odG1sCisqLworCit2b2lkCitfX2ttcF9pMThuX2RvX2NhdG9wZW4oCispIHsKKyAgICBpbnQgICAgZW5nbGlzaCA9IDA7CisgICAgY2hhciAqIGxhbmcgICAgPSBfX2ttcF9lbnZfZ2V0KCAiTEFORyIgKTsKKyAgICAvLyBUT0RPOiBXaGF0IGFib3V0IExDX0FMTCBvciBMQ19NRVNTQUdFUz8KKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHN0YXR1cyA9PSBLTVBfSTE4Tl9DTE9TRUQgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBjYXQgICAgPT0gS01QX0kxOE5fTlVMTENBVCApOworCisgICAgZW5nbGlzaCA9CisJbGFuZyA9PSBOVUxMICAgICAgICAgICAgICAgICAgICAgICB8fCAgLy8gSW4gYWxsIHRoZXNlIGNhc2VzIEVuZ2xpc2ggbGFuZ3VhZ2UgaXMgdXNlZC4KKwlzdHJjbXAoIGxhbmcsICIiICkgICAgICAgICAgICA9PSAwIHx8CisgICAgICAgIHN0cmNtcCggbGFuZywgIiAiICkgICAgICAgICAgID09IDAgfHwKKyAgICAgICAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgRm9ydHJhbiBSVEwgYnVnIERQRDIwMDEzNzg3MyAiRm9ydHJhbiBydW50aW1lIHJlc2V0cyBMQU5HIGVudiB2YXIKKyAgICAgICAgICAgICAgLy8gdG8gc3BhY2UgaWYgaXQgaXMgbm90IHNldCIuCisJc3RyY21wKCBsYW5nLCAiQyIgKSAgICAgICAgICAgPT0gMCB8fAorCXN0cmNtcCggbGFuZywgIlBPU0lYIiApICAgICAgID09IDA7CisKKyAgICBpZiAoICEgZW5nbGlzaCApIHsgIC8vIEVuZ2xpc2ggbGFuZ3VhZ2UgaXMgbm90IHlldCBkZXRlY3RlZCwgbGV0IHVzIGNvbnRpbnVlLgorICAgICAgICAvLyBGb3JtYXQgb2YgTEFORyBpczogW2xhbmd1YWdlW190ZXJyaXRvcnldWy5jb2Rlc2V0XVtAbW9kaWZpZXJdXQorICAgICAgICAvLyBTdHJpcCBhbGwgcGFydHMgZXhjZXB0IGxhbmd1YWdlLgorICAgICAgICBjaGFyICogdGFpbCA9IE5VTEw7CisgICAgICAgIF9fa21wX3N0cl9zcGxpdCggbGFuZywgJ0AnLCAmIGxhbmcsICYgdGFpbCApOworICAgICAgICBfX2ttcF9zdHJfc3BsaXQoIGxhbmcsICcuJywgJiBsYW5nLCAmIHRhaWwgKTsKKyAgICAgICAgX19rbXBfc3RyX3NwbGl0KCBsYW5nLCAnXycsICYgbGFuZywgJiB0YWlsICk7CisgICAgICAgIGVuZ2xpc2ggPSAoIHN0cmNtcCggbGFuZywgImVuIiApID09IDAgKTsKKyAgICB9OyAvLyBpZgorCisgICAgS01QX0lOVEVSTkFMX0ZSRUUoIGxhbmcgKTsKKworICAgIC8vIERvIG5vdCB0cnkgdG8gb3BlbiBFbmdsaXNoIGNhdGFsb2cgYmVjYXVzZSBpbnRlcm5hbCBtZXNzYWdlcyBhcmUKKyAgICAvLyBleGFjdCBjb3B5IG9mIG1lc3NhZ2VzIGluIEVuZ2xpc2ggY2F0YWxvZy4KKyAgICBpZiAoIGVuZ2xpc2ggKSB7CisJc3RhdHVzID0gS01QX0kxOE5fQUJTRU5UOyAgLy8gbWFyayBjYXRhbG9nIGFzIGFic2VudCBzbyBpdCB3aWxsIG5vdCBiZSByZS1vcGVuZWQuCisJcmV0dXJuOworICAgIH0KKworICAgIGNhdCA9IGNhdG9wZW4oIG5hbWUsIDAgKTsKKyAgICAvLyBUT0RPOiBXaHkgZG8gd2UgcGFzcyAwIGluIGZsYWdzPworICAgIHN0YXR1cyA9ICggY2F0ID09IEtNUF9JMThOX05VTExDQVQgPyBLTVBfSTE4Tl9BQlNFTlQgOiBLTVBfSTE4Tl9PUEVORUQgKTsKKworICAgIGlmICggc3RhdHVzID09IEtNUF9JMThOX0FCU0VOVCApIHsKKyAgICAgIGlmIChfX2ttcF9nZW5lcmF0ZV93YXJuaW5ncyA+IGttcF93YXJuaW5nc19sb3cpIHsgLy8gQUM6IG9ubHkgaXNzdWUgd2FybmluZyBpbiBjYXNlIGV4cGxpY2l0bHkgYXNrZWQgdG8KKyAgICAgICAgaW50ICAgIGVycm9yICAgPSBlcnJubzsgLy8gU2F2ZSBlcnJubyBpbW1lZGlhdGVsbHkuCisJY2hhciAqIG5sc3BhdGggPSBfX2ttcF9lbnZfZ2V0KCAiTkxTUEFUSCIgKTsKKyAgICAgICAgY2hhciAqIGxhbmcgICAgPSBfX2ttcF9lbnZfZ2V0KCAiTEFORyIgKTsKKworCS8vIEluZmluaXRlIHJlY3Vyc2lvbiB3aWxsIG5vdCBvY2N1ciAtLSBzdGF0dXMgaXMgS01QX0kxOE5fQUJTRU5UIG5vdywgc28KKwkvLyBfX2ttcF9pMThuX2NhdGdldHMoKSB3aWxsIG5vdCB0cnkgdG8gb3BlbiBjYXRhbG9nLCBidXQgd2lsbCByZXR1cm4gZGVmYXVsdCBtZXNzYWdlLgorCV9fa21wX21zZygKKwkgICAga21wX21zX3dhcm5pbmcsCisJICAgIEtNUF9NU0coIENhbnRPcGVuTWVzc2FnZUNhdGFsb2csIG5hbWUgKSwKKwkgICAgS01QX0VSUiggZXJyb3IgKSwKKwkgICAgS01QX0hOVCggQ2hlY2tFbnZWYXIsICJOTFNQQVRIIiwgbmxzcGF0aCApLAorICAgICAgICAgICAgS01QX0hOVCggQ2hlY2tFbnZWYXIsICJMQU5HIiwgbGFuZyApLAorCSAgICBfX2ttcF9tc2dfbnVsbAorCSk7CisJS01QX0lORk9STSggV2lsbFVzZURlZmF1bHRNZXNzYWdlcyApOworICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSggbmxzcGF0aCApOworICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSggbGFuZyApOworICAgICAgfQorICAgIH0gZWxzZSB7IC8vIHN0YXR1cyA9PSBLTVBfSTE4Tl9PUEVORUQKKworICAgICAgICBpbnQgc2VjdGlvbiA9IGdldF9zZWN0aW9uKCBrbXBfaTE4bl9wcnBfVmVyc2lvbiApOworICAgICAgICBpbnQgbnVtYmVyICA9IGdldF9udW1iZXIoIGttcF9pMThuX3BycF9WZXJzaW9uICk7CisgICAgICAgIGNoYXIgY29uc3QgKiBleHBlY3RlZCA9IF9fa21wX2kxOG5fZGVmYXVsdF90YWJsZS5zZWN0WyBzZWN0aW9uIF0uc3RyWyBudW1iZXIgXTsKKyAgICAgICAgICAgIC8vIEV4cGVjdGVkIHZlcnNpb24gb2YgdGhlIGNhdGFsb2cuCisgICAgICAgIGttcF9zdHJfYnVmX3QgdmVyc2lvbjsgICAvLyBBY3R1YWwgdmVyc2lvbiBvZiB0aGUgY2F0YWxvZy4KKyAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIHZlcnNpb24gKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiB2ZXJzaW9uLCAiJXMiLCBjYXRnZXRzKCBjYXQsIHNlY3Rpb24sIG51bWJlciwgTlVMTCApICk7CisKKyAgICAgICAgICAgIC8vIFN0cmluZyByZXR1cm5lZCBieSBjYXRnZXRzIGlzIGludmFsaWQgYWZ0ZXIgY2xvc2luZyB0aGUgY2F0YWxvZywgc28gY29weSBpdC4KKyAgICAgICAgaWYgKCBzdHJjbXAoIHZlcnNpb24uc3RyLCBleHBlY3RlZCApICE9IDAgKSB7CisgICAgICAgICAgICBfX2ttcF9pMThuX2NhdGNsb3NlKCk7ICAgICAvLyBDbG9zZSBiYWQgY2F0YWxvZy4KKyAgICAgICAgICAgIHN0YXR1cyA9IEtNUF9JMThOX0FCU0VOVDsgIC8vIEFuZCBtYXJrIGl0IGFzIGFic2VudC4KKyAgICAgICAgICAgIGlmIChfX2ttcF9nZW5lcmF0ZV93YXJuaW5ncyA+IGttcF93YXJuaW5nc19sb3cpIHsgLy8gQUM6IG9ubHkgaXNzdWUgd2FybmluZyBpbiBjYXNlIGV4cGxpY2l0bHkgYXNrZWQgdG8KKyAgICAgICAgICAgICAgICAvLyBBbmQgbm93IHByaW50IGEgd2FybmluZyB1c2luZyBkZWZhdWx0IG1lc3NhZ2VzLgorICAgICAgICAgICAgICAgIGNoYXIgY29uc3QgKiBuYW1lICAgID0gIk5MU1BBVEgiOworICAgICAgICAgICAgICAgIGNoYXIgY29uc3QgKiBubHNwYXRoID0gX19rbXBfZW52X2dldCggbmFtZSApOworICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAga21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIFdyb25nTWVzc2FnZUNhdGFsb2csIG5hbWUsIHZlcnNpb24uc3RyLCBleHBlY3RlZCApLAorICAgICAgICAgICAgICAgICAgICBLTVBfSE5UKCBDaGVja0VudlZhciwgbmFtZSwgbmxzcGF0aCApLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgS01QX0lORk9STSggV2lsbFVzZURlZmF1bHRNZXNzYWdlcyApOworICAgICAgICAgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSBubHNwYXRoICk7CisgICAgICAgICAgICB9IC8vIF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzCisgICAgICAgIH07IC8vIGlmCisgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSggJiB2ZXJzaW9uICk7CisKKyAgICB9OyAvLyBpZgorCit9IC8vIGZ1bmMgX19rbXBfaTE4bl9kb19jYXRvcGVuCisKKwordm9pZAorX19rbXBfaTE4bl9jYXRjbG9zZSgKKykgeworICAgIGlmICggc3RhdHVzID09IEtNUF9JMThOX09QRU5FRCApIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggY2F0ICE9IEtNUF9JMThOX05VTExDQVQgKTsKKyAgICAgICAgY2F0Y2xvc2UoIGNhdCApOworICAgICAgICBjYXQgPSBLTVBfSTE4Tl9OVUxMQ0FUOworICAgIH07IC8vIGlmCisgICAgc3RhdHVzID0gS01QX0kxOE5fQ0xPU0VEOworfSAvLyBmdW5jIF9fa21wX2kxOG5fY2F0Y2xvc2UKKworCitjaGFyIGNvbnN0ICoKK19fa21wX2kxOG5fY2F0Z2V0cygKKyAgICBrbXBfaTE4bl9pZF90ICBpZAorKSB7CisKKyAgICBpbnQgc2VjdGlvbiA9IGdldF9zZWN0aW9uKCBpZCApOworICAgIGludCBudW1iZXIgID0gZ2V0X251bWJlciggaWQgKTsKKyAgICBjaGFyIGNvbnN0ICogbWVzc2FnZSA9IE5VTEw7CisKKyAgICBpZiAoIDEgPD0gc2VjdGlvbiAmJiBzZWN0aW9uIDw9IF9fa21wX2kxOG5fZGVmYXVsdF90YWJsZS5zaXplICkgeworICAgICAgICBpZiAoIDEgPD0gbnVtYmVyICYmIG51bWJlciA8PSBfX2ttcF9pMThuX2RlZmF1bHRfdGFibGUuc2VjdFsgc2VjdGlvbiBdLnNpemUgKSB7CisgICAgICAgICAgICBpZiAoIHN0YXR1cyA9PSBLTVBfSTE4Tl9DTE9TRUQgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfaTE4bl9jYXRvcGVuKCk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgaWYgKCBzdGF0dXMgPT0gS01QX0kxOE5fT1BFTkVEICkgeworICAgICAgICAgICAgICAgIG1lc3NhZ2UgPQorICAgICAgICAgICAgICAgICAgICBjYXRnZXRzKAorICAgICAgICAgICAgICAgICAgICAgICAgY2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiwgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfaTE4bl9kZWZhdWx0X3RhYmxlLnNlY3RbIHNlY3Rpb24gXS5zdHJbIG51bWJlciBdCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgaWYgKCBtZXNzYWdlID09IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgbWVzc2FnZSA9IF9fa21wX2kxOG5fZGVmYXVsdF90YWJsZS5zZWN0WyBzZWN0aW9uIF0uc3RyWyBudW1iZXIgXTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gaWYKKyAgICBpZiAoIG1lc3NhZ2UgPT0gTlVMTCApIHsKKyAgICAgICAgbWVzc2FnZSA9IG5vX21lc3NhZ2VfYXZhaWxhYmxlOworICAgIH07IC8vIGlmCisgICAgcmV0dXJuIG1lc3NhZ2U7CisKK30gLy8gZnVuYyBfX2ttcF9pMThuX2NhdGdldHMKKworCisjZW5kaWYgLy8gS01QX09TX1VOSVgKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBXaW5kb3dzKiBPUyBwYXJ0LgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworI2lmIEtNUF9PU19XSU5ET1dTCisjZGVmaW5lIEtNUF9JMThOX09LCisKKyNpbmNsdWRlICJrbXBfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKyNkZWZpbmUgS01QX0kxOE5fTlVMTENBVCAgTlVMTAorc3RhdGljIEhNT0RVTEUgICAgICAgY2F0ICA9IEtNUF9JMThOX05VTExDQVQ7ICAgIC8vICEhISBTaGFsbCBpdCBiZSB2b2xhdGlsZT8KK3N0YXRpYyBjaGFyIGNvbnN0ICogIG5hbWUgPSAoIEtNUF9WRVJTSU9OX01BSk9SID09IDQgPyAibGliZ3VpZGU0MHVpLmRsbCIgOiAibGliaW9tcDV1aS5kbGwiICk7CisKK3N0YXRpYyBrbXBfaTE4bl90YWJsZV90ICB0YWJsZSAgICAgICAgICAgICA9IHsgMCwgTlVMTCB9OworICAgIC8vIE1lc3NhZ2VzIGZvcm1hdHRlZCBieSBGb3JtYXRNZXNzYWdlKCkgc2hvdWxkIGJlIGZyZWVkLCBidXQgY2F0Z2V0cygpIGludGVyZmFjZSBhc3N1bWVzCisgICAgLy8gdXNlciB3aWxsIG5vdCBmcmVlIG1lc3NhZ2VzLiBTbyB3ZSBjYWNoZSBhbGwgdGhlIHJldHJpZXZlZCBtZXNzYWdlcyBpbiB0aGUgdGFibGUsIHdoaWNoCisgICAgLy8gYXJlIGZyZWVkIGF0IGNhdGNsb3NlKCkuCitzdGF0aWMgVUlOVCBjb25zdCAgICAgICAgZGVmYXVsdF9jb2RlX3BhZ2UgPSBDUF9PRU1DUDsKK3N0YXRpYyBVSU5UICAgICAgICAgICAgICBjb2RlX3BhZ2UgICAgICAgICA9IGRlZmF1bHRfY29kZV9wYWdlOworCitzdGF0aWMgY2hhciBjb25zdCAqIF9fX2NhdGdldHMoIGttcF9pMThuX2lkX3QgIGlkICk7CitzdGF0aWMgVUlOVCAgICAgICAgIGdldF9jb2RlX3BhZ2UoKTsKK3N0YXRpYyB2b2lkICAgICAgICAga21wX2kxOG5fdGFibGVfZnJlZSgga21wX2kxOG5fdGFibGVfdCAqIHRhYmxlICk7CisKKworc3RhdGljIFVJTlQKK2dldF9jb2RlX3BhZ2UoCispIHsKKworICAgIFVJTlQgY3AgPSBkZWZhdWx0X2NvZGVfcGFnZTsKKyAgICBjaGFyIGNvbnN0ICogdmFsdWUgPSBfX2ttcF9lbnZfZ2V0KCAiS01QX0NPREVQQUdFIiApOworICAgIGlmICggdmFsdWUgIT0gTlVMTCApIHsKKyAgICAgICAgaWYgKCBfc3RyaWNtcCggdmFsdWUsICJBTlNJIiApID09IDAgKSB7CisgICAgICAgICAgICBjcCA9IENQX0FDUDsKKyAgICAgICAgfSBlbHNlIGlmICggX3N0cmljbXAoIHZhbHVlLCAiT0VNIiApID09IDAgKSB7CisgICAgICAgICAgICBjcCA9IENQX09FTUNQOworICAgICAgICB9IGVsc2UgaWYgKCBfc3RyaWNtcCggdmFsdWUsICJVVEYtOCIgKSA9PSAwIHx8IF9zdHJpY21wKCB2YWx1ZSwgIlVURjgiICkgPT0gMCApIHsKKyAgICAgICAgICAgIGNwID0gQ1BfVVRGODsKKyAgICAgICAgfSBlbHNlIGlmICggX3N0cmljbXAoIHZhbHVlLCAiVVRGLTciICkgPT0gMCB8fCBfc3RyaWNtcCggdmFsdWUsICJVVEY3IiApID09IDAgKSB7CisgICAgICAgICAgICBjcCA9IENQX1VURjc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyAhISEgVE9ETzogSXNzdWUgYSB3YXJuaW5nPworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGlmCisgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopIHZhbHVlICk7CisgICAgcmV0dXJuIGNwOworCit9IC8vIGZ1bmMgZ2V0X2NvZGVfcGFnZQorCisKK3N0YXRpYyB2b2lkCitrbXBfaTE4bl90YWJsZV9mcmVlKAorICAgIGttcF9pMThuX3RhYmxlX3QgKiB0YWJsZQorKSB7CisgICAgaW50IHM7CisgICAgaW50IG07CisgICAgZm9yICggcyA9IDA7IHMgPCB0YWJsZS0+c2l6ZTsgKysgcyApIHsKKyAgICAgICAgZm9yICggbSA9IDA7IG0gPCB0YWJsZS0+c2VjdFsgcyBdLnNpemU7ICsrIG0gKSB7CisgICAgICAgICAgICAvLyBGcmVlIG1lc3NhZ2UuCisgICAgICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSggKHZvaWQgKikgdGFibGUtPnNlY3RbIHMgXS5zdHJbIG0gXSApOworICAgICAgICAgICAgdGFibGUtPnNlY3RbIHMgXS5zdHJbIG0gXSA9IE5VTEw7CisgICAgICAgIH07IC8vIGZvciBtCisgICAgICAgIHRhYmxlLT5zZWN0WyBzIF0uc2l6ZSA9IDA7CisgICAgICAgIC8vIEZyZWUgc2VjdGlvbiBpdHNlbGYuCisgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFICggKHZvaWQgKikgdGFibGUtPnNlY3RbIHMgXS5zdHIgKTsKKyAgICAgICAgdGFibGUtPnNlY3RbIHMgXS5zdHIgPSBOVUxMOworICAgIH07IC8vIGZvciBzCisgICAgdGFibGUtPnNpemUgPSAwOworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSB0YWJsZS0+c2VjdCApOworICAgIHRhYmxlLT5zZWN0ID0gTlVMTDsKK30gLy8ga21wX2k4bl90YWJsZV9mcmVlCisKKwordm9pZAorX19rbXBfaTE4bl9kb19jYXRvcGVuKAorKSB7CisKKyAgICBMQ0lEICAgICAgICAgIGxvY2FsZV9pZCA9IEdldFRocmVhZExvY2FsZSgpOworICAgIFdPUkQgCSAgbGFuZ19pZCA9IExBTkdJREZST01MQ0lEKCBsb2NhbGVfaWQgKTsKKyAgICBXT1JEICAgICAgICAgIHByaW1hcnlfbGFuZ19pZCA9IFBSSU1BUllMQU5HSUQoIGxhbmdfaWQgKTsKKyAgICBrbXBfc3RyX2J1Zl90IHBhdGg7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzdGF0dXMgPT0gS01QX0kxOE5fQ0xPU0VEICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggY2F0ICAgID09IEtNUF9JMThOX05VTExDQVQgKTsKKworICAgIF9fa21wX3N0cl9idWZfaW5pdCggJiBwYXRoICk7CisKKyAgICAvLyBEbyBub3QgdHJ5IHRvIG9wZW4gRW5nbGlzaCBjYXRhbG9nIGJlY2F1c2UgaW50ZXJuYWwgbWVzc2FnZXMgYXJlCisgICAgLy8gZXhhY3QgY29weSBvZiBtZXNzYWdlcyBpbiBFbmdsaXNoIGNhdGFsb2cuCisgICAgaWYgKCBwcmltYXJ5X2xhbmdfaWQgPT0gTEFOR19FTkdMSVNIICkgeworCXN0YXR1cyA9IEtNUF9JMThOX0FCU0VOVDsgIC8vIG1hcmsgY2F0YWxvZyBhcyBhYnNlbnQgc28gaXQgd2lsbCBub3QgYmUgcmUtb3BlbmVkLgorCWdvdG8gZW5kOworICAgIH07IC8vIGlmCisKKyAgICAvLyBDb25zdHJ1Y3QgcmVzb3VyY2UgRExMIG5hbWUuCisgICAgLyoKKyAgICAgICAgU2ltcGxlCisgICAgICAgICAgICBMb2FkTGlicmFyeSggbmFtZSApCisgICAgICAgIGlzIG5vdCBzdWl0YWJsZSBkdWUgdG8gc2VjdXJpdHkgaXNzdWUgKHNlZQorICAgICAgICBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vdGVjaG5ldC9zZWN1cml0eS9hZHZpc29yeS8yMjY5NjM3Lm1zcHgpLiBXZSBoYXZlIHRvIHNwZWNpZnkgZnVsbAorICAgICAgICBwYXRoIHRvIHRoZSBtZXNzYWdlIGNhdGFsb2cuCisgICAgKi8KKyAgICB7CisKKyAgICAgICAgLy8gR2V0IGhhbmRsZSBvZiBvdXIgRExMIGZpcnN0LgorICAgICAgICBITU9EVUxFIGhhbmRsZTsKKyAgICAgICAgQk9PTCBicmMgPQorICAgICAgICAgICAgR2V0TW9kdWxlSGFuZGxlRXgoCisgICAgICAgICAgICAgICAgR0VUX01PRFVMRV9IQU5ETEVfRVhfRkxBR19GUk9NX0FERFJFU1MgfCBHRVRfTU9EVUxFX0hBTkRMRV9FWF9GTEFHX1VOQ0hBTkdFRF9SRUZDT1VOVCwKKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PCBMUENTVFIgPiggJiBfX2ttcF9pMThuX2RvX2NhdG9wZW4gKSwKKyAgICAgICAgICAgICAgICAmIGhhbmRsZQorICAgICAgICAgICAgKTsKKyAgICAgICAgaWYgKCAhIGJyYyApIHsgICAgLy8gRXJyb3Igb2NjdXJyZWQuCisgICAgICAgICAgICBzdGF0dXMgPSBLTVBfSTE4Tl9BQlNFTlQ7ICAvLyBtYXJrIGNhdGFsb2cgYXMgYWJzZW50IHNvIGl0IHdpbGwgbm90IGJlIHJlLW9wZW5lZC4KKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgLy8gVE9ETzogRW5hYmxlIG11bHRpcGxlIG1lc3NhZ2VzIChLTVBfTVNHKSB0byBiZSBwYXNzZWQgdG8gX19rbXBfbXNnOyBhbmQgcHJpbnQKKyAgICAgICAgICAgIC8vIGEgcHJvcGVyIHdhcm5pbmcuCisgICAgICAgIH07IC8vIGlmCisKKyAgICAgICAgLy8gTm93IGdldCBwYXRoIHRvIHRoZSBvdXIgRExMLgorICAgICAgICBmb3IgKCA7IDsgKSB7CisgICAgICAgICAgICBEV09SRCBkcmMgPSBHZXRNb2R1bGVGaWxlTmFtZSggaGFuZGxlLCBwYXRoLnN0ciwgcGF0aC5zaXplICk7CisgICAgICAgICAgICBpZiAoIGRyYyA9PSAwICkgeyAgICAvLyBFcnJvciBvY2N1cnJlZC4KKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBLTVBfSTE4Tl9BQlNFTlQ7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgaWYgKCBkcmMgPCBwYXRoLnNpemUgKSB7CisgICAgICAgICAgICAgICAgcGF0aC51c2VkID0gZHJjOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcmVzZXJ2ZSggJiBwYXRoLCBwYXRoLnNpemUgKiAyICk7CisgICAgICAgIH07IC8vIGZvcmV2ZXIKKworICAgICAgICAvLyBOb3cgY29uc3RydWN0IHRoZSBuYW1lIG9mIG1lc3NhZ2UgY2F0YWxvZy4KKyAgICAgICAga21wX3N0cl9mbmFtZSBmbmFtZTsKKyAgICAgICAgX19rbXBfc3RyX2ZuYW1lX2luaXQoICYgZm5hbWUsIHBhdGguc3RyICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfY2xlYXIoICYgcGF0aCApOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIHBhdGgsICIlcyVsdS8lcyIsIGZuYW1lLmRpciwgKHVuc2lnbmVkIGxvbmcpKCBsb2NhbGVfaWQgKSwgbmFtZSApOworICAgICAgICBfX2ttcF9zdHJfZm5hbWVfZnJlZSggJiBmbmFtZSApOworCisgICAgfQorCisgICAgLy8gRm9yIHNlY3VyaXR5IHJlYXNvbnMsIHVzZSBMb2FkTGlicmFyeUV4KCkgYW5kIGxvYWQgbWVzc2FnZSBjYXRhbG9nIGFzIGEgZGF0YSBmaWxlLgorICAgIGNhdCA9IExvYWRMaWJyYXJ5RXgoIHBhdGguc3RyLCBOVUxMLCBMT0FEX0xJQlJBUllfQVNfREFUQUZJTEUgKTsKKyAgICBzdGF0dXMgPSAoIGNhdCA9PSBLTVBfSTE4Tl9OVUxMQ0FUID8gS01QX0kxOE5fQUJTRU5UIDogS01QX0kxOE5fT1BFTkVEICk7CisKKyAgICBpZiAoIHN0YXR1cyA9PSBLTVBfSTE4Tl9BQlNFTlQgKSB7CisgICAgICBpZiAoX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MgPiBrbXBfd2FybmluZ3NfbG93KSB7IC8vIEFDOiBvbmx5IGlzc3VlIHdhcm5pbmcgaW4gY2FzZSBleHBsaWNpdGx5IGFza2VkIHRvCisJRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKwkvLyBJbmZpbml0ZSByZWN1cnNpb24gd2lsbCBub3Qgb2NjdXIgLS0gc3RhdHVzIGlzIEtNUF9JMThOX0FCU0VOVCBub3csIHNvCisJLy8gX19rbXBfaTE4bl9jYXRnZXRzKCkgd2lsbCBub3QgdHJ5IHRvIG9wZW4gY2F0YWxvZyBidXQgd2lsbCByZXR1cm4gZGVmYXVsdCBtZXNzYWdlLgorICAgICAgICAvKgorICAgICAgICAgSWYgbWVzc2FnZSBjYXRhbG9nIGZvciBhbm90aGVyIGFyY2hpdGVjdHVyZSBmb3VuZCAoZS5nLiBPcGVuTVAgUlRMCisJIGZvciBJQS0zMiBhcmNoaXRlY3R1cmUgb3BlbnMgbGliaW9tcDV1aS5kbGwgZm9yIEludGVsKFIpIDY0KQorCSBXaW5kb3dzKiBPUyByZXR1cm5zIGVycm9yIDE5MyAoRVJST1JfQkFEX0VYRV9GT1JNQVQpLiBIb3dldmVyLAorICAgICAgICAgRm9ybWF0TWVzc2FnZSBmYWlscyB0byByZXR1cm4gYSBtZXNzYWdlIGZvciB0aGlzIGVycm9yLCBzbyB1c2VyCisJIHdpbGwgc2VlOgorCisgICAgICAgICBPTVA6IFdhcm5pbmcgIzI6IENhbm5vdCBvcGVuIG1lc3NhZ2UgY2F0YWxvZyAiMTA0MVxsaWJpb21wNXVpLmRsbCI6CisgICAgICAgICBPTVA6IFN5c3RlbSBlcnJvciAjMTkzOiAoTm8gc3lzdGVtIGVycm9yIG1lc3NhZ2UgYXZhaWxhYmxlKQorICAgICAgICAgT01QOiBJbmZvICMzOiBEZWZhdWx0IG1lc3NhZ2VzIHdpbGwgYmUgdXNlZC4KKworICAgICAgICAgSXNzdWUgYSBoaW50IGluIHRoaXMgY2FzZSB0byBsZXQgY2F1c2Ugb2YgdHJvdWJsZSBtb3JlIHVuZGVyc3RhbmRhYmxlLgorICAgICAgICAqLworCV9fa21wX21zZygKKwkgICAga21wX21zX3dhcm5pbmcsCisJICAgIEtNUF9NU0coIENhbnRPcGVuTWVzc2FnZUNhdGFsb2csIHBhdGguc3RyICksCisJICAgIEtNUF9TWVNFUlJDT0RFKCBlcnJvciApLAorICAgICAgICAgICAgKCBlcnJvciA9PSBFUlJPUl9CQURfRVhFX0ZPUk1BVCA/IEtNUF9ITlQoIEJhZEV4ZUZvcm1hdCwgcGF0aC5zdHIsIEtNUF9BUkNIX1NUUiApIDogX19rbXBfbXNnX251bGwgKSwKKwkgICAgX19rbXBfbXNnX251bGwKKwkpOworCUtNUF9JTkZPUk0oIFdpbGxVc2VEZWZhdWx0TWVzc2FnZXMgKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeyAvLyBzdGF0dXMgPT0gS01QX0kxOE5fT1BFTkVECisKKyAgICAgICAgaW50IHNlY3Rpb24gPSBnZXRfc2VjdGlvbigga21wX2kxOG5fcHJwX1ZlcnNpb24gKTsKKyAgICAgICAgaW50IG51bWJlciAgPSBnZXRfbnVtYmVyKCBrbXBfaTE4bl9wcnBfVmVyc2lvbiApOworICAgICAgICBjaGFyIGNvbnN0ICogZXhwZWN0ZWQgPSBfX2ttcF9pMThuX2RlZmF1bHRfdGFibGUuc2VjdFsgc2VjdGlvbiBdLnN0clsgbnVtYmVyIF07CisgICAgICAgIGttcF9zdHJfYnVmX3QgdmVyc2lvbjsgICAvLyBBY3R1YWwgdmVyc2lvbiBvZiB0aGUgY2F0YWxvZy4KKyAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIHZlcnNpb24gKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiB2ZXJzaW9uLCAiJXMiLCBfX19jYXRnZXRzKCBrbXBfaTE4bl9wcnBfVmVyc2lvbiApICk7CisgICAgICAgICAgICAvLyBTdHJpbmcgcmV0dXJuZWQgYnkgY2F0Z2V0cyBpcyBpbnZhbGlkIGFmdGVyIGNsb3NpbmcgdGhlIGNhdGFsb2csIHNvIGNvcHkgaXQuCisgICAgICAgIGlmICggc3RyY21wKCB2ZXJzaW9uLnN0ciwgZXhwZWN0ZWQgKSAhPSAwICkgeworICAgICAgICAgICAgLy8gQ2xvc2UgYmFkIGNhdGFsb2cuCisgICAgICAgICAgICBfX2ttcF9pMThuX2NhdGNsb3NlKCk7CisgICAgICAgICAgICBzdGF0dXMgPSBLTVBfSTE4Tl9BQlNFTlQ7ICAvLyBBbmQgbWFyayBpdCBhcyBhYnNlbnQuCisgICAgICAgICAgICBpZiAoX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MgPiBrbXBfd2FybmluZ3NfbG93KSB7CisgICAgICAgICAgICAgICAgLy8gQW5kIG5vdyBwcmludCBhIHdhcm5pbmcgdXNpbmcgZGVmYXVsdCBtZXNzYWdlcy4KKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgIGttcF9tc193YXJuaW5nLAorICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBXcm9uZ01lc3NhZ2VDYXRhbG9nLCBwYXRoLnN0ciwgdmVyc2lvbi5zdHIsIGV4cGVjdGVkICksCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKCBXaWxsVXNlRGVmYXVsdE1lc3NhZ2VzICk7CisgICAgICAgICAgICB9IC8vIF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzCisgICAgICAgIH07IC8vIGlmCisgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSggJiB2ZXJzaW9uICk7CisKKyAgICB9OyAvLyBpZgorICAgIGNvZGVfcGFnZSA9IGdldF9jb2RlX3BhZ2UoKTsKKworICAgIGVuZDoKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIHBhdGggKTsKKyAgICAgICAgcmV0dXJuOworCit9IC8vIGZ1bmMgX19rbXBfaTE4bl9kb19jYXRvcGVuCisKKwordm9pZAorX19rbXBfaTE4bl9jYXRjbG9zZSgKKykgeworICAgIGlmICggc3RhdHVzID09IEtNUF9JMThOX09QRU5FRCApIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggY2F0ICE9IEtNUF9JMThOX05VTExDQVQgKTsKKyAgICAgICAga21wX2kxOG5fdGFibGVfZnJlZSggJiB0YWJsZSApOworICAgICAgICBGcmVlTGlicmFyeSggY2F0ICk7CisgICAgICAgIGNhdCA9IEtNUF9JMThOX05VTExDQVQ7CisgICAgfTsgLy8gaWYKKyAgICBjb2RlX3BhZ2UgPSBkZWZhdWx0X2NvZGVfcGFnZTsKKyAgICBzdGF0dXMgPSBLTVBfSTE4Tl9DTE9TRUQ7Cit9IC8vIGZ1bmMgX19rbXBfaTE4bl9jYXRjbG9zZQorCisvKgorICAgIFdlIHVzZSBGb3JtYXRNZXNzYWdlKCkgdG8gZ2V0IHN0cmluZ3MgZnJvbSBjYXRhbG9nLCBnZXQgc3lzdGVtIGVycm9yIG1lc3NhZ2VzLCBldGMuCisgICAgRm9ybWF0TWVzc2FnZSgpIHRlbmRzIHRvIHJldHVybiBXaW5kb3dzKiBPUy1zdHlsZSBlbmQtb2YtbGluZXMsICJcclxuIi4gV2hlbiBzdHJpbmcgaXMgcHJpbnRlZCwKKyAgICBwcmludGYoKSBhbHNvIHJlcGxhY2VzIGFsbCB0aGUgb2NjdXJyZW5jZXMgb2YgIlxuIiB3aXRoICJcclxuIiAoYWdhaW4hKSwgc28gc2VxdWVuY2VzIGxpa2UKKyAgICAiXHJcclxyXG4iIGFwcGVhciBpbiBvdXRwdXQuIEl0IGlzIG5vdCB0b28gZ29vZC4KKworICAgIEFkZGl0aW9uYWwgbWVzcyBjb21lcyBmcm9tIG1lc3NhZ2UgY2F0YWxvZzogT3VyIGNhdGFsb2cgc291cmNlIGVuX1VTLm1jIGZpbGUgKGdlbmVyYXRlZCBieQorICAgIG1lc3NhZ2UtY29udmVydGVyLnBsKSBjb250YWlucyBvbmx5ICJcbiIgY2hhcmFjdGVycywgYnV0IGVuX1VTX21zZ18xMDMzLmJpbiBmaWxlIChwcm9kdWNlZCBieQorICAgIG1jLmV4ZSkgbWF5IGNvbnRhaW4gIlxyXG4iIG9yIGp1c3QgIlxuIi4gVGhpcyBtZXNzIGdvZXMgZnJvbSBlbl9VU19tc2dfMTAzMy5iaW4gZmlsZSB0bworICAgIG1lc3NhZ2UgY2F0YWxvZywgbGliaW9tcDV1aS5kbGwuIEZvciBleGFtcGxlLCBtZXNzYWdlCisKKyAgICAgICAgRXJyb3IKKworICAgICh0aGVyZSBpcyAiXG4iIGF0IHRoZSBlbmQpIGlzIGNvbXBpbGVkIGJ5IG1jLmV4ZSB0byAiRXJyb3JcclxuIiwgd2hpbGUKKworICAgICAgICBPTVA6IEVycm9yICUxIWQhOiAlMiFzIVxuCisKKyAgICAodGhlcmUgaXMgIlxuIiBhdCB0aGUgZW5kIGFzIHdlbGwpIGlzIGNvbXBpbGVkIHRvICJPTVA6IEVycm9yICUxIWQhOiAlMiFzIVxyXG5cbiIuCisKKyAgICBUaHVzLCBzdHJpcHBpbmcgYWxsICJcciIgbm9ybWFsaXplcyBzdHJpbmcgYW5kIHJldHVybnMgaXQgdG8gY2Fub25pY2FsIGZvcm0sIHNvIHByaW50ZigpIHdpbGwKKyAgICBwcm9kdWNlIGNvcnJlY3QgZW5kLW9mLWxpbmUgc2VxdWVuY2VzLgorCisgICAgX19fc3RyaXBfY3JzKCkgc2VydmVzIGZvciB0aGlzIHB1cnBvc2U6IGl0IHJlbW92ZXMgYWxsIHRoZSBvY2N1cnJlbmNlcyBvZiAiXHIiIGluLXBsYWNlIGFuZAorICAgIHJldHVybnMgbmV3IGxlbmd0aCBvZiBzdHJpbmcuCisqLworc3RhdGljCitpbnQKK19fX3N0cmlwX2NycygKKyAgICBjaGFyICogc3RyCispIHsKKyAgICBpbnQgaW4gID0gMDsgIC8vIElucHV0IGNoYXJhY3RlciBpbmRleC4KKyAgICBpbnQgb3V0ID0gMDsgIC8vIE91dHB1dCBjaGFyYWN0ZXIgaW5kZXguCisgICAgZm9yICggOyA7ICkgeworICAgICAgICBpZiAoIHN0clsgaW4gXSAhPSAnXHInICkgeworICAgICAgICAgICAgc3RyWyBvdXQgXSA9IHN0clsgaW4gXTsKKyAgICAgICAgICAgICsrIG91dDsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgaWYgKCBzdHJbIGluIF0gPT0gMCApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9OyAvLyBpZgorICAgICAgICArKyBpbjsKKyAgICB9OyAvLyBmb3JldmVyCisgICAgcmV0dXJuIG91dCAtIDE7Cit9IC8vIGZ1bmMgX19zdHJpcF9jcnMKKworCitzdGF0aWMKK2NoYXIgY29uc3QgKgorX19fY2F0Z2V0cygKKyAgICBrbXBfaTE4bl9pZF90ICBpZAorKSB7CisKKyAgICBjaGFyICogICAgcmVzdWx0ID0gTlVMTDsKKyAgICBQVk9JRCAgICAgYWRkciAgID0gTlVMTDsKKyAgICB3Y2hhcl90ICogd21zZyAgID0gTlVMTDsKKyAgICBEV09SRCAgICAgd2xlbiAgID0gMDsKKyAgICBjaGFyICogICAgbXNnICAgID0gTlVMTDsKKyAgICBpbnQgICAgICAgbGVuICAgID0gMDsKKyAgICBpbnQgICAgICAgcmM7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBjYXQgIT0gS01QX0kxOE5fTlVMTENBVCApOworICAgIHdsZW4gPSAgICAvLyB3bGVuIGRvZXMgKm5vdCogaW5jbHVkZSB0ZXJtaW5hdGluZyBudWxsLgorICAgICAgICBGb3JtYXRNZXNzYWdlVygKKyAgICAgICAgICAgIEZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUiB8IEZPUk1BVF9NRVNTQUdFX0ZST01fSE1PRFVMRSB8CisgICAgICAgICAgICAgICAgRk9STUFUX01FU1NBR0VfSUdOT1JFX0lOU0VSVFMsCisgICAgICAgICAgICBjYXQsCisgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgIDAsICAgICAgICAgICAgIC8vIExhbmdJZAorICAgICAgICAgICAgKExQV1NUUikgJiBhZGRyLAorICAgICAgICAgICAgMCwgICAgICAgICAgICAgLy8gU2l6ZSBpbiBlbGVtZW50cywgbm90IGluIGJ5dGVzLgorICAgICAgICAgICAgTlVMTAorICAgICAgICApOworICAgIGlmICggd2xlbiA8PSAwICkgeworICAgICAgICBnb3RvIGVuZDsKKyAgICB9OyAvLyBpZgorICAgIHdtc2cgPSAod2NoYXJfdCAqKSBhZGRyOyAgLy8gV2FybmluZzogd21zZyBtYXkgYmUgbm90IG51bC10ZXJtaW5hdGVkIQorCisgICAgLy8gQ2FsY3VsYXRlIGxlbmd0aCBvZiBtdWx0aWJ5dGUgbWVzc2FnZS4KKyAgICBsZW4gPSAgICAgLy8gU2luY2Ugd2xlbiBkb2VzIG5vdCBpbmNsdWRlIHRlcm1pbmF0aW5nIG51bGwsIGxlbiBkb2VzIG5vdCBpbmNsdWRlIGl0IGFsc28uCisgICAgICAgIFdpZGVDaGFyVG9NdWx0aUJ5dGUoCisgICAgICAgICAgICBjb2RlX3BhZ2UsCisgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAvLyBGbGFncy4KKyAgICAgICAgICAgIHdtc2csIHdsZW4sICAgICAgIC8vIFdpZGUgYnVmZmVyIGFuZCBzaXplLgorICAgICAgICAgICAgTlVMTCwgMCwgICAgICAgICAgLy8gQnVmZmVyIGFuZCBzaXplLgorICAgICAgICAgICAgTlVMTCwgTlVMTCAgICAgICAgLy8gRGVmYXVsdCBjaGFyIGFuZCB1c2VkIGRlZmF1bHQgY2hhci4KKyAgICAgICAgKTsKKyAgICBpZiAoIGxlbiA8PSAwICkgeworICAgICAgICBnb3RvIGVuZDsKKyAgICB9OyAvLyBpZgorCisgICAgLy8gQWxsb2NhdGUgbWVtb3J5LgorICAgIG1zZyA9IChjaGFyICopIEtNUF9JTlRFUk5BTF9NQUxMT0MoIGxlbiArIDEgKTsKKworICAgIC8vIENvbnZlcnQgd2lkZSBtZXNzYWdlIHRvIG11bHRpYnl0ZSBvbmUuCisgICAgcmMgPQorICAgICAgICBXaWRlQ2hhclRvTXVsdGlCeXRlKAorICAgICAgICAgICAgY29kZV9wYWdlLAorICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgLy8gRmxhZ3MuCisgICAgICAgICAgICB3bXNnLCB3bGVuLCAgICAgICAvLyBXaWRlIGJ1ZmZlciBhbmQgc2l6ZS4KKyAgICAgICAgICAgIG1zZywgbGVuLCAgICAgICAgIC8vIEJ1ZmZlciBhbmQgc2l6ZS4KKyAgICAgICAgICAgIE5VTEwsIE5VTEwgICAgICAgIC8vIERlZmF1bHQgY2hhciBhbmQgdXNlZCBkZWZhdWx0IGNoYXIuCisgICAgICAgICk7CisgICAgaWYgKCByYyA8PSAwIHx8IHJjID4gbGVuICkgeworICAgICAgICBnb3RvIGVuZDsKKyAgICB9OyAvLyBpZgorICAgIEtNUF9ERUJVR19BU1NFUlQoIHJjID09IGxlbiApOworICAgIGxlbiA9IHJjOworICAgIG1zZ1sgbGVuIF0gPSAwOyAgICAgICAgICAgLy8gUHV0IHRlcm1pbmF0aW5nIG51bGwgdG8gdGhlIGVuZC4KKworICAgIC8vIFN0cmlwcGluZyBhbGwgIlxyIiBiZWZvcmUgc3RyaXBwaW5nIGxhc3QgZW5kLW9mLWxpbmUgc2ltcGxpZmllcyB0aGUgdGFzay4KKyAgICBsZW4gPSBfX19zdHJpcF9jcnMoIG1zZyApOworCisgICAgLy8gRXZlcnkgbWVzc2FnZSBpbiBjYXRhbG9nIGlzIHRlcm1pbmF0ZWQgd2l0aCAiXG4iLiBTdHJpcCBpdC4KKyAgICBpZiAoIGxlbiA+PSAxICYmIG1zZ1sgbGVuIC0gMSBdID09ICdcbicgKSB7CisgICAgICAgIC0tIGxlbjsKKyAgICAgICAgbXNnWyBsZW4gXSA9IDA7CisgICAgfTsgLy8gaWYKKworICAgIC8vIEV2ZXJ5dGhpbmcgbG9va3Mgb2suCisgICAgcmVzdWx0ID0gbXNnOworICAgIG1zZyAgICA9IE5VTEw7CisKKyAgICBlbmQ6CisKKyAgICBpZiAoIG1zZyAhPSBOVUxMICkgeworICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSggbXNnICk7CisgICAgfTsgLy8gaWYKKyAgICBpZiAoIHdtc2cgIT0gTlVMTCApIHsKKyAgICAgICAgTG9jYWxGcmVlKCB3bXNnICk7CisgICAgfTsgLy8gaWYKKworICAgIHJldHVybiByZXN1bHQ7CisKK30gLy8gX19fY2F0Z2V0cworCisKK2NoYXIgY29uc3QgKgorX19rbXBfaTE4bl9jYXRnZXRzKAorICAgIGttcF9pMThuX2lkX3QgIGlkCispIHsKKworICAgIGludCBzZWN0aW9uID0gZ2V0X3NlY3Rpb24oIGlkICk7CisgICAgaW50IG51bWJlciAgPSBnZXRfbnVtYmVyKCBpZCApOworICAgIGNoYXIgY29uc3QgKiBtZXNzYWdlID0gTlVMTDsKKworICAgIGlmICggMSA8PSBzZWN0aW9uICYmIHNlY3Rpb24gPD0gX19rbXBfaTE4bl9kZWZhdWx0X3RhYmxlLnNpemUgKSB7CisgICAgICAgIGlmICggMSA8PSBudW1iZXIgJiYgbnVtYmVyIDw9IF9fa21wX2kxOG5fZGVmYXVsdF90YWJsZS5zZWN0WyBzZWN0aW9uIF0uc2l6ZSApIHsKKyAgICAgICAgICAgIGlmICggc3RhdHVzID09IEtNUF9JMThOX0NMT1NFRCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9pMThuX2NhdG9wZW4oKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICBpZiAoIGNhdCAhPSBLTVBfSTE4Tl9OVUxMQ0FUICkgeworICAgICAgICAgICAgICAgIGlmICggdGFibGUuc2l6ZSA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICB0YWJsZS5zZWN0ID0gKGttcF9pMThuX3NlY3Rpb25fdCAqKQorICAgICAgICAgICAgICAgICAgICAgICAgS01QX0lOVEVSTkFMX0NBTExPQygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIF9fa21wX2kxOG5fZGVmYXVsdF90YWJsZS5zaXplICsgMiApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigga21wX2kxOG5fc2VjdGlvbl90ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgIHRhYmxlLnNpemUgPSBfX2ttcF9pMThuX2RlZmF1bHRfdGFibGUuc2l6ZTsKKyAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgIGlmICggdGFibGUuc2VjdFsgc2VjdGlvbiBdLnNpemUgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgdGFibGUuc2VjdFsgc2VjdGlvbiBdLnN0ciA9IChjb25zdCBjaGFyICoqKQorICAgICAgICAgICAgICAgICAgICAgICAgS01QX0lOVEVSTkFMX0NBTExPQygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9pMThuX2RlZmF1bHRfdGFibGUuc2VjdFsgc2VjdGlvbiBdLnNpemUgKyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiggY2hhciBjb25zdCAqICkKKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgIHRhYmxlLnNlY3RbIHNlY3Rpb24gXS5zaXplID0gX19rbXBfaTE4bl9kZWZhdWx0X3RhYmxlLnNlY3RbIHNlY3Rpb24gXS5zaXplOworICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgaWYgKCB0YWJsZS5zZWN0WyBzZWN0aW9uIF0uc3RyWyBudW1iZXIgXSA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgICAgICB0YWJsZS5zZWN0WyBzZWN0aW9uIF0uc3RyWyBudW1iZXIgXSA9IF9fX2NhdGdldHMoIGlkICk7CisgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICAgICBtZXNzYWdlID0gdGFibGUuc2VjdFsgc2VjdGlvbiBdLnN0clsgbnVtYmVyIF07CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgaWYgKCBtZXNzYWdlID09IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgLy8gQ2F0YWxvZyBpcyBub3Qgb3BlbmVkIG9yIG1lc3NhZ2UgaXMgbm90IGZvdW5kLCByZXR1cm4gZGVmYXVsdCBtZXNzYWdlLgorICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBfX2ttcF9pMThuX2RlZmF1bHRfdGFibGUuc2VjdFsgc2VjdGlvbiBdLnN0clsgbnVtYmVyIF07CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGlmCisgICAgaWYgKCBtZXNzYWdlID09IE5VTEwgKSB7CisgICAgICAgIG1lc3NhZ2UgPSBub19tZXNzYWdlX2F2YWlsYWJsZTsKKyAgICB9OyAvLyBpZgorICAgIHJldHVybiBtZXNzYWdlOworCit9IC8vIGZ1bmMgX19rbXBfaTE4bl9jYXRnZXRzCisKKworI2VuZGlmIC8vIEtNUF9PU19XSU5ET1dTCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmbmRlZiBLTVBfSTE4Tl9PSworICAgICNlcnJvciBJMThuIHN1cHBvcnQgaXMgbm90IGltcGxlbWVudGVkIGZvciB0aGlzIE9TLgorI2VuZGlmIC8vIEtNUF9JMThOX09LCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZAorX19rbXBfaTE4bl9kdW1wX2NhdGFsb2coCisgICAga21wX3N0cl9idWZfdCAqIGJ1ZmZlcgorKSB7CisKKyAgICBzdHJ1Y3Qga21wX2kxOG5faWRfcmFuZ2VfdCB7CisgICAgICAgIGttcF9pMThuX2lkX3QgIGZpcnN0OworICAgICAgICBrbXBfaTE4bl9pZF90ICBsYXN0OworICAgIH07IC8vIHN0cnVjdCBrbXBfaTE4bl9pZF9yYW5nZV90CisKKyAgICBzdGF0aWMgc3RydWN0IGttcF9pMThuX2lkX3JhbmdlX3QgcmFuZ2VzW10gPSB7CisgICAgICAgIHsga21wX2kxOG5fcHJwX2ZpcnN0LCBrbXBfaTE4bl9wcnBfbGFzdCB9LAorICAgICAgICB7IGttcF9pMThuX3N0cl9maXJzdCwga21wX2kxOG5fc3RyX2xhc3QgfSwKKyAgICAgICAgeyBrbXBfaTE4bl9mbXRfZmlyc3QsIGttcF9pMThuX2ZtdF9sYXN0IH0sCisgICAgICAgIHsga21wX2kxOG5fbXNnX2ZpcnN0LCBrbXBfaTE4bl9tc2dfbGFzdCB9LAorICAgICAgICB7IGttcF9pMThuX2hudF9maXJzdCwga21wX2kxOG5faG50X2xhc3QgfQorICAgIH07IC8vIHJhbmdlcworCisgICAgaW50ICAgICAgICAgICBudW1fb2ZfcmFuZ2VzID0gc2l6ZW9mKCByYW5nZXMgKSAvIHNpemVvZiggc3RydWN0IGttcF9pMThuX2lkX3JhbmdlX3QgKTsKKyAgICBpbnQgICAgICAgICAgIHJhbmdlOworICAgIGttcF9pMThuX2lkX3QgaWQ7CisKKyAgICBmb3IgKCByYW5nZSA9IDA7IHJhbmdlIDwgbnVtX29mX3JhbmdlczsgKysgcmFuZ2UgKSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIioqKiBTZXQgIyVkICoqKlxuIiwgcmFuZ2UgKyAxICk7CisgICAgICAgIGZvciAoIGlkID0gKGttcF9pMThuX2lkX3QpKCByYW5nZXNbIHJhbmdlIF0uZmlyc3QgKyAxICk7CisgICAgICAgICAgICAgIGlkIDwgcmFuZ2VzWyByYW5nZSBdLmxhc3Q7CisgICAgICAgICAgICAgIGlkID0gKGttcF9pMThuX2lkX3QpKCBpZCArIDEgKSApIHsKKyAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlZDogPDwlcz4+XG4iLCBpZCwgX19rbXBfaTE4bl9jYXRnZXRzKCBpZCApICk7CisgICAgICAgIH07IC8vIGZvciBpZAorICAgIH07IC8vIGZvciByYW5nZQorCisgICAgX19rbXBfcHJpbnRmKCAiJXMiLCBidWZmZXItPnN0ciApOworCit9IC8vIF9fa21wX2kxOG5fZHVtcF9jYXRhbG9nCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwora21wX21zZ190CitfX2ttcF9tc2dfZm9ybWF0KAorICAgIGttcF9pMThuX2lkX3QgaWQsCisgICAgLi4uCispIHsKKworICAgIGttcF9tc2dfdCAgICAgIG1zZzsKKyAgICB2YV9saXN0ICAgICAgICBhcmdzOworICAgIGttcF9zdHJfYnVmX3QgIGJ1ZmZlcjsKKyAgICBfX2ttcF9zdHJfYnVmX2luaXQoICYgYnVmZmVyICk7CisKKyAgICB2YV9zdGFydCggYXJncywgaWQgKTsKKyAgICAjaWYgS01QX09TX1VOSVgKKyAgICAgICAgLy8gT24gTGludXgqIE9TIGFuZCBPUyBYKiwgcHJpbnRmKCkgZmFtaWx5IGZ1bmN0aW9ucyBwcm9jZXNzIHBhcmFtZXRlciBudW1iZXJzLCBmb3IgZXhhbXBsZToKKyAgICAgICAgLy8gIiUyJHMgJTEkcyIuCisgICAgICAgIF9fa21wX3N0cl9idWZfdnByaW50KCAmIGJ1ZmZlciwgX19rbXBfaTE4bl9jYXRnZXRzKCBpZCApLCBhcmdzICk7CisgICAgI2VsaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgLy8gT24gV2lub2R3cywgcHJpbnRmKCkgZmFtaWx5IGZ1bmN0aW9ucyBkb2VzIG5vdCByZWNvZ25pemUgR05VIHN0eWxlIHBhcmFtZXRlciBudW1iZXJzLAorICAgICAgICAvLyBzbyB3ZSBoYXZlIHRvIHVzZSBGb3JtYXRNZXNzYWdlKCkgaW5zdGVhZC4gSXQgcmVjb2duaXplcyBwYXJhbWV0ZXIgbnVtYmVycywgZS4gZy46CisgICAgICAgIC8vICIlMiFzISAiJTEhcyEiLgorICAgICAgICB7CisgICAgICAgICAgICBMUFRTVFIgc3RyID0gTlVMTDsKKyAgICAgICAgICAgIGludCAgICBsZW47CisgICAgICAgICAgICBGb3JtYXRNZXNzYWdlKAorICAgICAgICAgICAgICAgIEZPUk1BVF9NRVNTQUdFX0ZST01fU1RSSU5HIHwgRk9STUFUX01FU1NBR0VfQUxMT0NBVEVfQlVGRkVSLAorICAgICAgICAgICAgICAgIF9fa21wX2kxOG5fY2F0Z2V0cyggaWQgKSwKKyAgICAgICAgICAgICAgICAwLCAwLAorICAgICAgICAgICAgICAgIChMUFRTVFIpKCAmIHN0ciApLAorICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgJiBhcmdzCisgICAgICAgICAgICApOworICAgICAgICAgICAgbGVuID0gX19fc3RyaXBfY3JzKCBzdHIgKTsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfY2F0KCAmIGJ1ZmZlciwgc3RyLCBsZW4gKTsKKyAgICAgICAgICAgIExvY2FsRnJlZSggc3RyICk7CisgICAgICAgIH0KKyAgICAjZWxzZQorICAgICAgICAjZXJyb3IKKyAgICAjZW5kaWYKKyAgICB2YV9lbmQoIGFyZ3MgKTsKKyAgICBfX2ttcF9zdHJfYnVmX2RldGFjaCggJiBidWZmZXIgKTsKKworICAgIG1zZy50eXBlID0gKGttcF9tc2dfdHlwZV90KSggaWQgPj4gMTYgKTsKKyAgICBtc2cubnVtICA9IGlkICYgMHhGRkZGOworICAgIG1zZy5zdHIgID0gYnVmZmVyLnN0cjsKKyAgICBtc2cubGVuICA9IGJ1ZmZlci51c2VkOworCisgICAgcmV0dXJuIG1zZzsKKworfSAvLyBfX2ttcF9tc2dfZm9ybWF0CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljCitjaGFyICoKK3N5c19lcnJvcigKKyAgICBpbnQgZXJyCispIHsKKworICAgIGNoYXIgKiBtZXNzYWdlID0gTlVMTDsKKworICAgICNpZiBLTVBfT1NfV0lORE9XUworCisgICAgICAgIExQVk9JRCAgYnVmZmVyID0gTlVMTDsKKyAgICAgICAgaW50ICAgICBsZW47CisgICAgICAgIERXT1JEICAgcmM7CisgICAgICAgIHJjID0KKyAgICAgICAgICAgIEZvcm1hdE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgRk9STUFUX01FU1NBR0VfQUxMT0NBVEVfQlVGRkVSIHwgRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU0sCisgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICBlcnIsCisgICAgICAgICAgICAgICAgTUFLRUxBTkdJRCggTEFOR19ORVVUUkFMLCBTVUJMQU5HX0RFRkFVTFQgKSwgLy8gRGVmYXVsdCBsYW5ndWFnZS4KKyAgICAgICAgICAgICAgICAoTFBUU1RSKSAmIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgIE5VTEwKKyAgICAgICAgICAgICk7CisgICAgICAgIGlmICggcmMgPiAwICkgeworICAgICAgICAgICAgLy8gTWVzc2FnZSBmb3JtYXR0ZWQuIENvcHkgaXQgKHNvIHdlIGNhbiBmcmVlIGl0IGxhdGVyIHdpdGggbm9ybWFsIGZyZWUoKS4KKyAgICAgICAgICAgIG1lc3NhZ2UgPSBfX2ttcF9zdHJfZm9ybWF0KCAiJXMiLCAoY2hhciAqKSBidWZmZXIgKTsKKyAgICAgICAgICAgIGxlbiA9IF9fX3N0cmlwX2NycyggbWVzc2FnZSApOyAvLyBEZWxldGUgY2FycmlhZ2UgcmV0dXJucyBpZiBhbnkuCisgICAgICAgICAgICAvLyBTdHJpcCB0cmFpbGluZyBuZXdsaW5lcy4KKyAgICAgICAgICAgIHdoaWxlICggbGVuID4gMCAmJiBtZXNzYWdlWyBsZW4gLSAxIF0gPT0gJ1xuJyApIHsKKyAgICAgICAgICAgICAgICAtLSBsZW47CisgICAgICAgICAgICB9OyAvLyB3aGlsZQorICAgICAgICAgICAgbWVzc2FnZVsgbGVuIF0gPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gRm9ybWF0TWVzc2FnZSgpIGZhaWxlZCB0byBmb3JtYXQgc3lzdGVtIGVycm9yIG1lc3NhZ2UuIEdldExhc3RFcnJvcigpIHdvdWxkIGdpdmUgdXMKKyAgICAgICAgICAgIC8vIGVycm9yIGNvZGUsIHdoaWNoIHdlIHdvdWxkIGNvbnZlcnQgdG8gbWVzc2FnZS4uLiB0aGlzIGl0IGRhbmdlcm91cyByZWN1cnNpb24sIHdoaWNoCisgICAgICAgICAgICAvLyBjYW5ub3QgY2xhcmlmeSBvcmlnaW5hbCBlcnJvciwgc28gd2Ugd2lsbCBub3QgZXZlbiBzdGFydCBpdC4KKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgaWYgKCBidWZmZXIgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIExvY2FsRnJlZSggYnVmZmVyICk7CisgICAgICAgIH07IC8vIGlmCisKKyAgICAjZWxzZSAvLyBOb24tV2luZG93cyogT1M6IExpbnV4KiBPUyBvciBPUyBYKgorCisgICAgICAgIC8qCisgICAgICAgICAgICBUaGVyZSBhcmUgMiBpbmNvbXBhdGlibGUgdmVyc2lvbnMgb2Ygc3RyZXJyb3JfcjoKKworICAgICAgICAgICAgICAgIGNoYXIgKiBzdHJlcnJvcl9yKCBpbnQsIGNoYXIgKiwgc2l6ZV90ICk7ICAvLyBHTlUgdmVyc2lvbgorICAgICAgICAgICAgICAgIGludCAgICBzdHJlcnJvcl9yKCBpbnQsIGNoYXIgKiwgc2l6ZV90ICk7ICAvLyBYU0kgdmVyc2lvbgorICAgICAgICAqLworCisgICAgICAgICNpZiBLTVBfT1NfTElOVVgKKworICAgICAgICAgICAgLy8gR05VIHZlcnNpb24gb2Ygc3RyZXJyb3Jfci4KKworICAgICAgICAgICAgY2hhciAgIGJ1ZmZlclsgMjA0OCBdOworICAgICAgICAgICAgY2hhciAqIGNvbnN0IGVycl9tc2cgPSBzdHJlcnJvcl9yKCBlcnIsIGJ1ZmZlciwgc2l6ZW9mKCBidWZmZXIgKSApOworICAgICAgICAgICAgICAgIC8vIERvIG5vdCBlbGltaW5hdGUgdGhpcyBhc3NpZ25tZW50IHRvIHRlbXBvcmFyeSB2YXJpYWJsZSwgb3RoZXJ3aXNlIGNvbXBpbGVyIHdvdWxkCisgICAgICAgICAgICAgICAgLy8gbm90IGlzc3VlIHdhcm5pbmcgaWYgc3RyZXJyb3JfcigpIHJldHVybnMgYGludCcgaW5zdGVhZCBvZiBleHBlY3RlZCBgY2hhciAqJy4KKyAgICAgICAgICAgIG1lc3NhZ2UgPSBfX2ttcF9zdHJfZm9ybWF0KCAiJXMiLCBlcnJfbXNnICk7CisKKyAgICAgICAgI2Vsc2UgLy8gT1MgWCosIEZyZWVCU0QgZXRjLgorCisgICAgICAgICAgICAvLyBYU0kgdmVyc2lvbiBvZiBzdHJlcnJvcl9yLgorCisgICAgICAgICAgICBpbnQgICAgc2l6ZSAgID0gMjA0ODsKKyAgICAgICAgICAgIC8vIFRPRE86IEFkZCBjaGVja2luZyByZXN1bHQgb2YgbWFsbG9jKCkuCisgICAgICAgICAgICBjaGFyICogYnVmZmVyID0gKGNoYXIgKikgS01QX0lOVEVSTkFMX01BTExPQyggc2l6ZSApOworICAgICAgICAgICAgaW50ICAgIHJjOworICAgICAgICAgICAgcmMgPSBzdHJlcnJvcl9yKCBlcnIsIGJ1ZmZlciwgc2l6ZSApOworICAgICAgICAgICAgaWYgKCByYyA9PSAtMSApIHsKKyAgICAgICAgICAgICAgICByYyA9IGVycm5vOyAgICAgICAgICAgIC8vIFhTSSB2ZXJzaW9uIHNldHMgZXJybm8uCisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgd2hpbGUgKCByYyA9PSBFUkFOR0UgKSB7ICAgLy8gRVJBTkdFIG1lYW5zIHRoZSBidWZmZXIgaXMgdG9vIHNtYWxsLgorICAgICAgICAgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKCBidWZmZXIgKTsKKyAgICAgICAgICAgICAgICBzaXplICo9IDI7CisgICAgICAgICAgICAgICAgYnVmZmVyID0gKGNoYXIgKikgS01QX0lOVEVSTkFMX01BTExPQyggc2l6ZSApOworICAgICAgICAgICAgICAgIHJjID0gc3RyZXJyb3JfciggZXJyLCBidWZmZXIsIHNpemUgKTsKKyAgICAgICAgICAgICAgICBpZiAoIHJjID09IC0xICkgeworICAgICAgICAgICAgICAgICAgICByYyA9IGVycm5vOyAgICAgICAgLy8gWFNJIHZlcnNpb24gc2V0cyBlcnJuby4KKyAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgfTsgLy8gd2hpbGUKKyAgICAgICAgICAgIGlmICggcmMgPT0gMCApIHsKKyAgICAgICAgICAgICAgICBtZXNzYWdlID0gYnVmZmVyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBCdWZmZXIgaXMgdW51c2VkLiBGcmVlIGl0LgorICAgICAgICAgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKCBidWZmZXIgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisKKyAgICAgICAgI2VuZGlmCisKKyAgICAjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KKworICAgIGlmICggbWVzc2FnZSA9PSBOVUxMICkgeworICAgICAgICAvLyBUT0RPOiBJMThuIHRoaXMgbWVzc2FnZS4KKyAgICAgICAgbWVzc2FnZSA9IF9fa21wX3N0cl9mb3JtYXQoICIlcyIsICIoTm8gc3lzdGVtIGVycm9yIG1lc3NhZ2UgYXZhaWxhYmxlKSIgKTsKKyAgICB9OyAvLyBpZgorICAgIHJldHVybiBtZXNzYWdlOworCit9IC8vIHN5c19lcnJvcgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ttcF9tc2dfdAorX19rbXBfbXNnX2Vycm9yX2NvZGUoCisgICAgaW50ICBjb2RlCispIHsKKworICAgIGttcF9tc2dfdCAgICAgIG1zZzsKKyAgICBtc2cudHlwZSA9IGttcF9tdF9zeXNlcnI7CisgICAgbXNnLm51bSAgPSBjb2RlOworICAgIG1zZy5zdHIgID0gc3lzX2Vycm9yKCBjb2RlICk7CisgICAgbXNnLmxlbiAgPSBzdHJsZW4oIG1zZy5zdHIgKTsKKyAgICByZXR1cm4gbXNnOworCit9IC8vIF9fa21wX21zZ19lcnJvcl9jb2RlCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwora21wX21zZ190CitfX2ttcF9tc2dfZXJyb3JfbWVzZygKKyAgICBjaGFyIGNvbnN0ICogbWVzZworKSB7CisKKyAgICBrbXBfbXNnX3QgICAgICBtc2c7CisgICAgbXNnLnR5cGUgPSBrbXBfbXRfc3lzZXJyOworICAgIG1zZy5udW0gID0gMDsKKyAgICBtc2cuc3RyICA9IF9fa21wX3N0cl9mb3JtYXQoICIlcyIsIG1lc2cgKTsKKyAgICBtc2cubGVuICA9IHN0cmxlbiggbXNnLnN0ciApOworICAgIHJldHVybiBtc2c7CisKK30gLy8gX19rbXBfbXNnX2Vycm9yX21lc2cKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkCitfX2ttcF9tc2coCisgICAga21wX21zZ19zZXZlcml0eV90ICBzZXZlcml0eSwKKyAgICBrbXBfbXNnX3QgICAgICAgICAgIG1lc3NhZ2UsCisgICAgLi4uCispIHsKKworICAgIHZhX2xpc3QgICAgICAgIGFyZ3M7CisgICAga21wX2kxOG5faWRfdCAgZm9ybWF0OyAgICAgIC8vIGZvcm1hdCBpZGVudGlmaWVyCisgICAga21wX21zZ190ICAgICAgZm1zZzsgICAgICAgIC8vIGZvcm1hdHRlZCBtZXNzYWdlCisgICAga21wX3N0cl9idWZfdCAgYnVmZmVyOworCisgICAgaWYgKCBzZXZlcml0eSAhPSBrbXBfbXNfZmF0YWwgJiYgX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MgPT0ga21wX3dhcm5pbmdzX29mZiApCisgICAgICAgIHJldHVybjsgLy8gbm8gcmVhc29uIHRvIGZvcm0gYSBzdHJpbmcgaW4gb3JkZXIgdG8gbm90IHByaW50IGl0CisKKyAgICBfX2ttcF9zdHJfYnVmX2luaXQoICYgYnVmZmVyICk7CisKKyAgICAvLyBGb3JtYXQgdGhlIHByaW1hcnkgbWVzc2FnZS4KKyAgICBzd2l0Y2ggKCBzZXZlcml0eSApIHsKKyAgICAgICAgY2FzZSBrbXBfbXNfaW5mb3JtIDogeworICAgICAgICAgICAgZm9ybWF0ID0ga21wX2kxOG5fZm10X0luZm87CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2Uga21wX21zX3dhcm5pbmcgOiB7CisgICAgICAgICAgICBmb3JtYXQgPSBrbXBfaTE4bl9mbXRfV2FybmluZzsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBrbXBfbXNfZmF0YWwgOiB7CisgICAgICAgICAgICBmb3JtYXQgPSBrbXBfaTE4bl9mbXRfRmF0YWw7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGRlZmF1bHQgOiB7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAwICk7CisgICAgICAgIH07CisgICAgfTsgLy8gc3dpdGNoCisgICAgZm1zZyA9IF9fa21wX21zZ19mb3JtYXQoIGZvcm1hdCwgbWVzc2FnZS5udW0sIG1lc3NhZ2Uuc3RyICk7CisgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopIG1lc3NhZ2Uuc3RyICk7CisgICAgX19rbXBfc3RyX2J1Zl9jYXQoICYgYnVmZmVyLCBmbXNnLnN0ciwgZm1zZy5sZW4gKTsKKyAgICBLTVBfSU5URVJOQUxfRlJFRSggKHZvaWQgKikgZm1zZy5zdHIgKTsKKworICAgIC8vIEZvcm1hdCBvdGhlciBtZXNzYWdlcy4KKyAgICB2YV9zdGFydCggYXJncywgbWVzc2FnZSApOworICAgIGZvciAoIDsgOyApIHsKKyAgICAgICAgbWVzc2FnZSA9IHZhX2FyZyggYXJncywga21wX21zZ190ICk7CisgICAgICAgIGlmICggbWVzc2FnZS50eXBlID09IGttcF9tdF9kdW1teSAmJiBtZXNzYWdlLnN0ciA9PSBOVUxMICkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIGlmICggbWVzc2FnZS50eXBlID09IGttcF9tdF9kdW1teSAmJiBtZXNzYWdlLnN0ciA9PSBfX2ttcF9tc2dfZW1wdHkuc3RyICkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIHN3aXRjaCAoIG1lc3NhZ2UudHlwZSApIHsKKyAgICAgICAgICAgIGNhc2Uga21wX210X2hpbnQgOiB7CisgICAgICAgICAgICAgICAgZm9ybWF0ID0ga21wX2kxOG5fZm10X0hpbnQ7CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgY2FzZSBrbXBfbXRfc3lzZXJyIDogeworICAgICAgICAgICAgICAgIGZvcm1hdCA9IGttcF9pMThuX2ZtdF9TeXNFcnI7CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdCA6IHsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAwICk7CisgICAgICAgICAgICB9OworICAgICAgICB9OyAvLyBzd2l0Y2gKKyAgICAgICAgZm1zZyA9IF9fa21wX21zZ19mb3JtYXQoIGZvcm1hdCwgbWVzc2FnZS5udW0sIG1lc3NhZ2Uuc3RyICk7CisgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSBtZXNzYWdlLnN0ciApOworICAgICAgICBfX2ttcF9zdHJfYnVmX2NhdCggJiBidWZmZXIsIGZtc2cuc3RyLCBmbXNnLmxlbiApOworICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSggKHZvaWQgKikgZm1zZy5zdHIgKTsKKyAgICB9OyAvLyBmb3JldmVyCisgICAgdmFfZW5kKCBhcmdzICk7CisKKyAgICAvLyBQcmludCBmb3JtYXR0ZWQgbWVzc2FnZXMuCisgICAgLy8gVGhpcyBsb2NrIHByZXZlbnRzIG11bHRpcGxlIGZhdGFsIGVycm9ycyBvbiB0aGUgc2FtZSBwcm9ibGVtLgorICAgIC8vIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgbG9jayApOyAgICAvLyBHRUggLSBUaGlzIGxvY2sgY2F1c2luZyB0ZXN0cyB0byBoYW5nIG9uIE9TIFgqLgorICAgIF9fa21wX3ByaW50ZiggIiVzIiwgYnVmZmVyLnN0ciApOworICAgIF9fa21wX3N0cl9idWZfZnJlZSggJiBidWZmZXIgKTsKKworICAgIGlmICggc2V2ZXJpdHkgPT0ga21wX21zX2ZhdGFsICkgeworICAgICAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgX19rbXBfdGhyZWFkX3NsZWVwKCA1MDAgKTsgICAvKiBEZWxheSB0byBnaXZlIG1lc3NhZ2UgYSBjaGFuY2UgdG8gYXBwZWFyIGJlZm9yZSByZWFwaW5nICovCisgICAgICAgICNlbmRpZgorICAgICAgICBfX2ttcF9hYm9ydF9wcm9jZXNzKCk7CisgICAgfTsgLy8gaWYKKworICAgIC8vIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgbG9jayApOyAgLy8gR0VIIC0gdGhpcyBsb2NrIGNhdXNpbmcgdGVzdHMgdG8gaGFuZyBvbiBPUyBYKi4KKworfSAvLyBfX2ttcF9tc2cKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBlbmQgb2YgZmlsZSAvLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2kxOG4uaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9pMThuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVhOGRlNAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9pMThuLmgKQEAgLTAsMCArMSwxOTUgQEAKKy8qCisgKiBrbXBfaTE4bi5oCisgKiAkUmV2aXNpb246IDQyODEwICQKKyAqICREYXRlOiAyMDEzLTExLTA3IDEyOjA2OjMzIC0wNjAwIChUaHUsIDA3IE5vdiAyMDEzKSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX0kxOE5fSAorI2RlZmluZSBLTVBfSTE4Tl9ICisKKyNpbmNsdWRlICJrbXBfc3RyLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIGV4dGVybiAiQyIgeworI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKy8qCisgICAga21wX2kxOG5faWQuaW5jIGRlZmluZXMga21wX2kxOG5faWRfdCB0eXBlLiBJdCBpcyBhbiBlbnVtZXJhdGlvbiB3aXRoIGlkZW50aWZpZXJzIG9mIGFsbCB0aGUKKyAgICBtZXNzYWdlcyBpbiB0aGUgY2F0YWxvZy4gVGhlcmUgaXMgb25lIHNwZWNpYWwgaWRlbnRpZmllcjoga21wX2kxOG5fbnVsbCwgd2hpY2ggZGVub3RlcyBhYnNlbmNlCisgICAgb2YgbWVzc2FnZS4KKyovCisjaW5jbHVkZSAia21wX2kxOG5faWQuaW5jIiAvLyBHZW5lcmF0ZWQgZmlsZS4gRG8gbm90IGVkaXQgaXQgbWFudWFsbHkuCisKKy8qCisgICAgTG93LWxldmVsIGZ1bmN0aW9ucyBoYW5kbGluZyBtZXNzYWdlIGNhdGFsb2cuIF9fa21wX2kxOG5fb3BlbigpIG9wZW5zIG1lc3NhZ2UgY2F0YWxvZywKKyAgICBfX2ttcF9pMThuX2Nsb3NlcygpIGl0LiBFeHBsaWNpdCBvcGVuaW5nIGlzIG5vdCByZXF1aXJlZDogaWYgbWVzc2FnZSBjYXRhbG9nIGlzIG5vdCB5ZXQgb3BlbiwKKyAgICBfX2ttcF9pMThuX2NhdGdldHMoKSB3aWxsIG9wZW4gaXQgaW1wbGljaXRseS4gSG93ZXZlciwgY2F0YWxvZyBzaG91bGQgYmUgZXhwbGljaXRseSBjbG9zZWQsCisgICAgb3RoZXJ3aXNlIHJlc291cmNlcyAobWFtb3J5LCBoYW5kbGVzKSBtYXkgbGVhay4KKworICAgIF9fa21wX2kxOG5fY2F0Z2V0cygpIHJldHVybnMgcmVhZC1vbmx5IHN0cmluZy4gSXQgc2hvdWxkIG5vdCBiZSBmcmVlZC4KKworICAgIEtNUF9JMThOX1NUUiBtYWNybyBzaW1wbGlmaWVzIGFjY2VzIHRvIHN0cmluZ3MgaW4gbWVzc2FnZSBjYXRhbG9nIGEgYml0LiBGb2xsb3dpbmcgdHdvIGxpbmVzIGFyZQorICAgIGVxdWl2YWxlbnQ6CisKKyAgICAgICAgX19rbXBfaTE4bl9jYXRnZXRzKCBrbXBfaTE4bl9zdHJfV2FybmluZyApCisgICAgICAgIEtNUF9JMThOX1NUUiggV2FybmluZyApCisqLworCit2b2lkICAgICAgICAgICAgX19rbXBfaTE4bl9jYXRvcGVuKCk7Cit2b2lkICAgICAgICAgICAgX19rbXBfaTE4bl9jYXRjbG9zZSgpOworY2hhciBjb25zdCAqICAgIF9fa21wX2kxOG5fY2F0Z2V0cygga21wX2kxOG5faWRfdCBpZCApOworCisjZGVmaW5lIEtNUF9JMThOX1NUUiggaWQgKSAgICBfX2ttcF9pMThuX2NhdGdldHMoIGttcF9pMThuX3N0cl8gIyMgaWQgKQorCisKKy8qCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBIaWdoLWxldmVsIGludGVyZmFjZSBmb3IgcHJpbnRpbmcgc3RyaW5ncyB0YXJnZXRlZCB0byB0aGUgdXNlci4KKworICAgIEFsbCB0aGUgc3RyaW5ncyBhcmUgZGl2aWRlZCBpbnRvIDMgdHlwZXM6CisKKyAgICAgICAgKiBtZXNzYWdlcywKKyAgICAgICAgKiBoaW50cywKKyAgICAgICAgKiBzeXN0ZW0gZXJyb3JzLgorCisgICAgVGhlcmUgYXJlIDMga2luZCBvZiBtZXNzYWdlIHNldmVyaXRpZXM6CisKKyAgICAgICAgKiBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLAorICAgICAgICAqIHdhcm5pbmdzIChub24tZmF0YWwgZXJyb3JzKSwKKyAgICAgICAgKiBmYXRhbCBlcnJvcnMuCisKKyAgICBGb3IgZXhhbXBsZToKKworICAgICAgICBPTVA6IFdhcm5pbmcgIzI6IENhbm5vdCBvcGVuIG1lc3NhZ2UgY2F0YWxvZyAibGliZ3VpZGUuY2F0IjogICAoMSkKKyAgICAgICAgT01QOiBTeXN0ZW0gZXJyb3IgIzI6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkgICAgICAgICAgICAgICAgKDIpCisgICAgICAgIE9NUDogSGludDogUGxlYXNlIGNoZWNrIE5MU1BBVEggZW52aXJvbm1lbnQgdmFyaWFibGUuICAgICAgICAgICgzKQorICAgICAgICBPTVA6IEluZm8gIzM6IERlZmF1bHQgbWVzc2FnZXMgd2lsbCBiZSB1c2VkLiAgICAgICAgICAgICAgICAgICAoNCkKKworICAgIHdoZXJlCisKKyAgICAgICAgKDEpIGlzIGEgbWVzc2FnZSBvZiB3YXJuaW5nIHNldmVyaXR5LAorICAgICAgICAoMikgaXMgYSBzeXN0ZW0gZXJyb3IgY2F1c2VkIHRoZSBwcmV2aW9zIHdhcm5pbmcsCisgICAgICAgICgzKSBpcyBhIGhpbnQgZm9yIHRoZSB1c2VyIGhvdyB0byBmaXggdGhlIHByb2JsZW0sCisgICAgICAgICg0KSBpcyBhIG1lc3NhZ2Ugb2YgaW5mb3JtYXRpb25hbCBzZXZlcml0eS4KKworICAgVXNhZ2UgaW4gY29tcGxleCBjYXNlcyAobWVzc2FnZSBpcyBhY2NvbXBhbmllZCB3aXRoIGhpbnRzIGFuZCBzeXN0ZW0gZXJyb3JzKToKKworICAgICAgIGludCBlcnJvciA9IGVycm5vOyAgIC8vIFdlIG5lZWQgc2F2ZSBlcnJubyBpbW1lZGlhdGVseSwgYmVjYXVzZSBpdCBtYXkgYmUgY2hhbmdlZC4KKyAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgIGttcF9tc193YXJuaW5nLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXZlcml0eQorICAgICAgICAgICBLTVBfTVNHKCBDYW50T3Blbk1lc3NhZ2VDYXRhbG9nLCBuYW1lICksICAgLy8gUHJpbWFyeSBtZXNzYWdlCisgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTeXN0ZW0gZXJyb3IKKyAgICAgICAgICAgS01QX0hOVCggQ2hlY2tOTFNQQVRIICksICAgICAgICAgICAgICAgICAgIC8vIEhpbnQKKyAgICAgICAgICAgX19rbXBfbXNnX251bGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFZhcmlhZGljIGFyZ3VtZW50IGxpc3QgZmluaXNoZXIKKyAgICAgICApOworCisgICAgVXNhZ2UgaW4gc2ltcGxlIGNhc2VzIChqdXN0IGEgbWVzc2FnZSwgbm8gc3lzdGVtIGVycm9ycyBvciBoaW50cyk6CisKKyAgICAgICAgS01QX0lORk9STSggV2lsbFVzZURlZmF1bHRNZXNzYWdlcyApOworICAgICAgICBLTVBfV0FSTklORyggQ2FudE9wZW5NZXNzYWdlQ2F0YWxvZywgbmFtZSApOworICAgICAgICBLTVBfRkFUQUwoIFN0YWNrT3ZlcmxhcCApOworICAgICAgICBLTVBfU1lTRkFJTCggInB0aHJlYWRfY3JlYXRlIiwgc3RhdHVzICk7CisgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9jcmVhdGUiLCBzdGF0dXMgKTsKKyAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUxfRVJSTk8oICJnZXR0aW1lb2ZkYXkiLCBzdGF0dXMgKTsKKworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworZW51bSBrbXBfbXNnX3R5cGUgeworICAgIGttcF9tdF9kdW1teSAgPSAgMCwgLy8gU3BlY2lhbCB0eXBlIGZvciBpbnRlcm5hbCBwdXJwb3Nlcy4KKyAgICBrbXBfbXRfbWVzZyAgID0gIDQsIC8vIFByaW1hcnkgT3Blbk1QIG1lc3NhZ2UsIGNvdWxkIGJlIGluZm9ybWF0aW9uLCB3YXJuaW5nLCBvciBmYXRhbC4KKyAgICBrbXBfbXRfaGludCAgID0gIDUsIC8vIEhpbnQgdG8gdGhlIHVzZXIuCisgICAga21wX210X3N5c2VyciA9IC0xICAvLyBTeXN0ZW0gZXJyb3IgbWVzc2FnZS4KK307IC8vIGVudW0ga21wX21zZ190eXBlCit0eXBlZGVmIGVudW0ga21wX21zZ190eXBlICBrbXBfbXNnX3R5cGVfdDsKKworc3RydWN0IGttcF9tc2cgeworICAgIGttcF9tc2dfdHlwZV90ICB0eXBlOworICAgIGludCAgICAgICAgICAgICBudW07CisgICAgY2hhciBjb25zdCAqICAgIHN0cjsKKyAgICBpbnQgICAgICAgICAgICAgbGVuOworfTsgLy8gc3RydWN0IGttcF9tZXNzYWdlCit0eXBlZGVmIHN0cnVjdCBrbXBfbXNnICBrbXBfbXNnX3Q7CisKKy8vIFR3byBzcGVjaWFsIG1lc3NhZ2VzLgorZXh0ZXJuIGttcF9tc2dfdCBfX2ttcF9tc2dfZW1wdHk7ICAvLyBDYW4gYmUgdXNlZCBpbiBwbGFjZSB3aGVyZSBtZXNzYWdlIGlzIHJlcXVpcmVkIHN5bnRhY3RpY2FsbHkuCitleHRlcm4ga21wX21zZ190IF9fa21wX21zZ19udWxsOyAgIC8vIERlbm90ZXMgdGhlIGVuZCBvZiB2YXJpYWRpYyBsaXN0IG9mIGFyZ3VtZW50cy4KKworLy8gSGVscGVyIGZ1bmN0aW9ucy4gQ3JlYXRlcyBtZXNzYWdlcyBlaXRoZXIgZnJvbSBtZXNzYWdlIGNhdGFsb2cgb3IgZnJvbSBzeXN0ZW0uIE5vdGU6IHRoZXNlCisvLyBmdW5jdGlvbnMgYWxsb2NhdGUgbWVtb3J5LiBZb3Ugc2hvdWxkIHBhc3MgY3JlYXRlZCBtZXNzYWdlcyB0byBfX2ttcF9tc2coKSBmdW5jdGlvbiwgaXQgd2lsbAorLy8gcHJpbnQgbWVzc2FnZXMgYW5kIGRlc3Ryb3kgdGhlbS4KK2ttcF9tc2dfdCAgX19rbXBfbXNnX2Zvcm1hdCgga21wX2kxOG5faWRfdCBpZCwgLi4uICk7CitrbXBfbXNnX3QgIF9fa21wX21zZ19lcnJvcl9jb2RlKCBpbnQgY29kZSApOwora21wX21zZ190ICBfX2ttcF9tc2dfZXJyb3JfbWVzZyggY2hhciBjb25zdCAqIG1lc2cgKTsKKworLy8gSGVscGVyIG1hY3JvcyB0byBtYWtlIGNhbGxzIHNob3J0ZXIuCisjZGVmaW5lIEtNUF9NU0coIC4uLiAgKSAgIF9fa21wX21zZ19mb3JtYXQoIGttcF9pMThuX21zZ18gIyMgX19WQV9BUkdTX18gKQorI2RlZmluZSBLTVBfSE5UKCAuLi4gICkgICBfX2ttcF9tc2dfZm9ybWF0KCBrbXBfaTE4bl9obnRfICMjIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgS01QX1NZU0VSUkNPREUoIGNvZGUgKSAgX19rbXBfbXNnX2Vycm9yX2NvZGUoIGNvZGUgKQorI2RlZmluZSBLTVBfU1lTRVJSTUVTRyggbWVzZyApICBfX2ttcF9tc2dfZXJyb3JfbWVzZyggbWVzZyApCisjZGVmaW5lIEtNUF9FUlIgS01QX1NZU0VSUkNPREUKKworLy8gTWVzc2FnZSBzZXZlcml0eS4KK2VudW0ga21wX21zZ19zZXZlcml0eSB7CisgICAga21wX21zX2luZm9ybSwgICAgICAvLyBKdXN0IGluZm9ybWF0aW9uIGZvciB0aGUgdXNlci4KKyAgICBrbXBfbXNfd2FybmluZywgICAgIC8vIE5vbi1mYXRhbCBlcnJvciwgZXhlY3V0aW9uIGNvbnRpbnVlcy4KKyAgICBrbXBfbXNfZmF0YWwgICAgICAgIC8vIEZhdGFsIGVycm9yLCBwcm9ncmFtIGFib3J0cy4KK307IC8vIGVudW0ga21wX21zZ19zZXZlcml0eQordHlwZWRlZiBlbnVtIGttcF9tc2dfc2V2ZXJpdHkgIGttcF9tc2dfc2V2ZXJpdHlfdDsKKworLy8gUHJpbWFyeSBmdW5jdGlvbiBmb3IgcHJpbnRpbmcgbWVzc2FnZXMgZm9yIHRoZSB1c2VyLiBUaGUgZmlyc3QgbWVzc2FnZSBpcyBtYW5kYXRvcnkuIEFueSBudW1iZXIKKy8vIG9mIHN5c3RlbSBlcnJvcnMgYW5kIGhpbnRzIG1heSBiZSBzcGVjaWZpZWQuIEFyZ3VtZW50IGxpc3QgbXVzdCBiZSBmaW5pc2hlZCB3aXRoIF9fa21wX21zZ19udWxsLgordm9pZCAgICBfX2ttcF9tc2coIGttcF9tc2dfc2V2ZXJpdHlfdCBzZXZlcml0eSwga21wX21zZ190IG1lc3NhZ2UsIC4uLiApOworCisvLyBIZWxwZXIgbWFjcm9zIHRvIG1ha2UgY2FsbHMgc2hvcnRlciBpbiBzaW1wbGUgY2FzZXMuCisjZGVmaW5lIEtNUF9JTkZPUk0oIC4uLiAgKSBfX2ttcF9tc2coIGttcF9tc19pbmZvcm0sICBLTVBfTVNHKCBfX1ZBX0FSR1NfXyApLCBfX2ttcF9tc2dfbnVsbCApCisjZGVmaW5lIEtNUF9XQVJOSU5HKCAuLi4gKSBfX2ttcF9tc2coIGttcF9tc193YXJuaW5nLCBLTVBfTVNHKCBfX1ZBX0FSR1NfXyApLCBfX2ttcF9tc2dfbnVsbCApCisjZGVmaW5lIEtNUF9GQVRBTCggICAuLi4gKSBfX2ttcF9tc2coIGttcF9tc19mYXRhbCwgICBLTVBfTVNHKCBfX1ZBX0FSR1NfXyApLCBfX2ttcF9tc2dfbnVsbCApCisjZGVmaW5lIEtNUF9TWVNGQUlMKCBmdW5jLCBlcnJvciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfbXNnKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGttcF9tc19mYXRhbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9NU0coIEZ1bmN0aW9uRXJyb3IsIGZ1bmMgKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9TWVNFUlJDT0RFKCBlcnJvciApLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9fa21wX21zZ19udWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKQorCisvLyBDaGVjayBlcnJvciwgaWYgbm90IHplcm8sIGdlbmVyYXRlIGZhdGFsIGVycm9yIG1lc3NhZ2UuCisjZGVmaW5lIEtNUF9DSEVDS19TWVNGQUlMKCBmdW5jLCBlcnJvciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICggZXJyb3IgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfU1lTRkFJTCggZnVuYywgZXJyb3IgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisvLyBDaGVjayBzdGF0dXMsIGlmIG5vdCB6ZXJvLCBnZW5lcmF0ZSBmYXRhbCBlcnJvciBtZXNzYWdlIHVzaW5nIGVycm5vLgorI2RlZmluZSBLTVBfQ0hFQ0tfU1lTRkFJTF9FUlJOTyggZnVuYywgc3RhdHVzICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIHN0YXR1cyAhPSAwICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW50IGVycm9yID0gZXJybm87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX1NZU0ZBSUwoIGZ1bmMsIGVycm9yICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworI2lmZGVmIEtNUF9ERUJVRworICAgIHZvaWQgX19rbXBfaTE4bl9kdW1wX2NhdGFsb2coIGttcF9zdHJfYnVmX3QgKiBidWZmZXIgKTsKKyNlbmRpZiAvLyBLTVBfREVCVUcKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgfTsgLy8gZXh0ZXJuICJDIgorI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKyNlbmRpZiAvLyBLTVBfSTE4Tl9ICisKKy8vIGVuZCBvZiBmaWxlIC8vCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfaW1wb3J0LmMgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfaW1wb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU0OWEyZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9pbXBvcnQuYwpAQCAtMCwwICsxLDQ0IEBACisvKgorICoga21wX2ltcG9ydC5jCisgKiAkUmV2aXNpb246IDQyMjg2ICQKKyAqICREYXRlOiAyMDEzLTA0LTE4IDEwOjUzOjI2IC0wNTAwIChUaHUsIDE4IEFwciAyMDEzKSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKy8qCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgT2JqZWN0IGdlbmVyYXRlZCBmcm9tIHRoaXMgc291cmNlIGZpbGUgaXMgbGlua2VkIHRvIFdpbmRvd3MqIE9TIERMTCBpbXBvcnQgbGlicmFyeSAobGliaW9tcDVtZC5saWIpCisgICAgb25seSEgSXQgaXMgbm90IGEgcGFydCBvZiByZWd1bGFyIHN0YXRpYyBvciBkeW5hbWljIE9wZW5NUCBSVEwuIEFueSBjb2RlIHRoYXQganVzdCBuZWVkcyB0byBnbworICAgIGluIHRoZSBsaWJpb21wNW1kLmxpYiAoYnV0IG5vdCBpbiBsaWJpb21wNW10LmxpYiBhbmQgbGliaW9tcDVtZC5kbGwpIHNob3VsZCBiZSBwbGFjZWQgaW4gdGhpcworICAgIGZpbGUuCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisgICAgVGhlc2Ugc3ltYm9scyBhcmUgcmVxdWlyZWQgZm9yIG11dHVhbCBleGNsdXNpb24gd2l0aCBNaWNyb3NvZnQgT3Blbk1QIFJUTCAoYW5kIGNvbXBhdGliaWxpdHkKKyAgICB3aXRoIE1TIENvbXBpbGVyKS4KKyovCisKK2ludCBfWW91X211c3RfbGlua193aXRoX2V4YWN0bHlfb25lX09wZW5NUF9saWJyYXJ5ID0gMTsKK2ludCBfWW91X211c3RfbGlua193aXRoX0ludGVsX09wZW5NUF9saWJyYXJ5ICAgICAgID0gMTsKK2ludCBfWW91X211c3RfbGlua193aXRoX01pY3Jvc29mdF9PcGVuTVBfbGlicmFyeSA9IDE7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKy8vIGVuZCBvZiBmaWxlIC8vCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfaW8uYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9pby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzYjYwODEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfaW8uYwpAQCAtMCwwICsxLDI0OSBAQAorLyoKKyAqIGttcF9pby5jIC0tIFJUTCBJTworICogJFJldmlzaW9uOiA0MjE1MCAkCisgKiAkRGF0ZTogMjAxMy0wMy0xNSAxNTo0MDozOCAtMDUwMCAoRnJpLCAxNSBNYXIgMjAxMykgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZm5kZWYgX19BQlNPRlRfV0lOCisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJrbXBfb3MuaCIKKyNpbmNsdWRlICJrbXBfbG9jay5oIgorI2luY2x1ZGUgImttcF9zdHIuaCIKKyNpbmNsdWRlICJrbXBfaW8uaCIKKyNpbmNsdWRlICJrbXAuaCIgLy8gS01QX0dUSURfRE5FLCBfX2ttcF9kZWJ1Z19idWYsIGV0YworCisjaWYgS01QX09TX1dJTkRPV1MKKyMgcHJhZ21hIHdhcm5pbmcoIHB1c2ggKQorIyBwcmFnbWEgd2FybmluZyggZGlzYWJsZTogMjcxIDMxMCApCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyMgcHJhZ21hIHdhcm5pbmcoIHBvcCApCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwora21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfc3RkaW9fbG9jayAgID0gS01QX0JPT1RTVFJBUF9MT0NLX0lOSVRJQUxJWkVSKCBfX2ttcF9zdGRpb19sb2NrICAgKTsgLyogQ29udHJvbCBzdGRpbyBmdW5jdGlvbnMgKi8KK2ttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2NvbnNvbGVfbG9jayA9IEtNUF9CT09UU1RSQVBfTE9DS19JTklUSUFMSVpFUiggX19rbXBfY29uc29sZV9sb2NrICk7IC8qIENvbnRyb2wgY29uc29sZSBpbml0aWFsaXphdGlvbiAqLworCisjaWYgS01QX09TX1dJTkRPV1MKKworICAgICMgaWZkZWYgS01QX0RFQlVHIAorICAgIC8qIF9fa21wX3N0ZG91dCBpcyB1c2VkIG9ubHkgZm9yIGRldiBidWlsZCAqLworICAgIHN0YXRpYyBIQU5ETEUgICAgX19rbXBfc3Rkb3V0ID0gTlVMTDsKKyAgICAjIGVuZGlmCisgICAgc3RhdGljIEhBTkRMRSAgICAgICAgX19rbXBfc3RkZXJyID0gTlVMTDsKKyAgICBzdGF0aWMgaW50ICAgICAgICAgICBfX2ttcF9jb25zb2xlX2V4aXN0cyA9IEZBTFNFOworICAgIHN0YXRpYyBrbXBfc3RyX2J1Zl90IF9fa21wX2NvbnNvbGVfYnVmOworCisgICAgc3RhdGljIGludAorICAgIGlzX2NvbnNvbGUoIHZvaWQgKQorICAgIHsKKyAgICAgICAgY2hhciBidWZmZXJbIDEyOCBdOworICAgICAgICBEV09SRCByYyAgPSAwOworICAgICAgICBEV09SRCBlcnIgPSAwOworICAgICAgICAvLyBUcnkgdG8gZ2V0IGNvbnNvbGUgdGl0bGUuCisgICAgICAgIFNldExhc3RFcnJvciggMCApOworICAgICAgICAgICAgLy8gR2V0Q29uc29sZVRpdGxlIGRvZXMgbm90IHJlc2V0IGxhc3QgZXJyb3IgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIHNob3J0IGJ1ZmZlciwKKyAgICAgICAgICAgIC8vIHNvIHdlIG5lZWQgdG8gY2xlYXIgaXQgZXhwbGljaXRseS4KKyAgICAgICAgcmMgPSBHZXRDb25zb2xlVGl0bGUoIGJ1ZmZlciwgc2l6ZW9mKCBidWZmZXIgKSApOworICAgICAgICBpZiAoIHJjID09IDAgKSB7CisgICAgICAgICAgICAvLyByYyA9PSAwIG1lYW5zIGdldHRpbmcgY29uc29sZSB0aXRsZSBmYWlsZWQuIExldCB1cyBmaW5kIG91dCB3aHkuCisgICAgICAgICAgICBlcnIgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIC8vIGVyciA9PSAwIG1lYW5zIGJ1ZmZlciB0b28gc2hvcnQgKHdlIHN1cHBvc2UgY29uc29sZSBleGlzdHMpLgorICAgICAgICAgICAgLy8gSW4gV2luZG93IGFwcGxpY2F0aW9ucyB3ZSB1c3VhbGx5IGhhdmUgZXJyID09IDYgKGludmFsaWQgaGFuZGxlKS4KKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgcmV0dXJuIHJjID4gMCB8fCBlcnIgPT0gMDsKKyAgICB9CisKKyAgICB2b2lkCisgICAgX19rbXBfY2xvc2VfY29uc29sZSggdm9pZCApCisgICAgeworICAgICAgICAvKiB3YWl0IHVudGlsIHVzZXIgcHJlc3NlcyByZXR1cm4gYmVmb3JlIGNsb3Npbmcgd2luZG93ICovCisgICAgICAgIC8qIFRPRE8gb25seSBjbG9zZSBpZiBhIHdpbmRvdyB3YXMgb3BlbmVkICovCisgICAgICAgIGlmKCBfX2ttcF9jb25zb2xlX2V4aXN0cyApIHsKKyAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcgCisgICAgICAgICAgICAvKiBzdGFuZGFyZCBvdXQgaXMgdXNlZCBvbmx5IGluIGRldiBidWlsZCAqLworICAgICAgICAgICAgX19rbXBfc3Rkb3V0ID0gTlVMTDsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgX19rbXBfc3RkZXJyID0gTlVMTDsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSggJl9fa21wX2NvbnNvbGVfYnVmICk7CisgICAgICAgICAgICBfX2ttcF9jb25zb2xlX2V4aXN0cyA9IEZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgLyogRm9yIHdpbmRvd3MsIGNhbGwgdGhpcyBiZWZvcmUgc3Rkb3V0LCBzdGRlcnIsIG9yIHN0ZGluIGFyZSB1c2VkLgorICAgICAqIEl0IG9wZW5zIGEgY29uc29sZSB3aW5kb3cgYW5kIHN0YXJ0cyBwcm9jZXNzaW5nICovCisgICAgc3RhdGljIHZvaWQKKyAgICBfX2ttcF9yZWRpcmVjdF9vdXRwdXQoIHZvaWQgKQorICAgIHsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJl9fa21wX2NvbnNvbGVfbG9jayApOworCisgICAgICAgIGlmKCAhIF9fa21wX2NvbnNvbGVfZXhpc3RzICkgeworICAgICAgICAgICAgI2lmZGVmIEtNUF9ERUJVRyAKKyAgICAgICAgICAgIC8qIHN0YW5kYXJkIG91dCBpcyB1c2VkIG9ubHkgaW4gZGV2IGJ1aWxkICovCisgICAgICAgICAgICBIQU5ETEUgaG87CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIEhBTkRMRSBoZTsKKworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmX19rbXBfY29uc29sZV9idWYgKTsKKworICAgICAgICAgICAgQWxsb2NDb25zb2xlKCk7CisgICAgICAgICAgICAvLyBXZSBkbyBub3QgY2hlY2sgdGhlIHJlc3VsdCBvZiBBbGxvY0NvbnNvbGUgYmVjYXVzZQorICAgICAgICAgICAgLy8gIDEuIHRoZSBjYWxsIGlzIGhhcm1sZXNzCisgICAgICAgICAgICAvLyAgMi4gaXQgaXMgbm90IGNsZWFyIGhvdyB0byBjb21tdW5pY2F0ZSBmYWlsdWUKKyAgICAgICAgICAgIC8vICAzLiB3ZSB3aWxsIGRldGVjdCBmYWlsdXJlIGxhdGVyIHdoZW4gd2UgZ2V0IGhhbmRsZShzKQorCisgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICAgICAgaG8gPSBHZXRTdGRIYW5kbGUoIFNURF9PVVRQVVRfSEFORExFICk7CisgICAgICAgICAgICAgICAgaWYgKCBobyA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSB8fCBobyA9PSBOVUxMICkgeworCisgICAgICAgICAgICAgICAgICAgIERXT1JEICBlcnIgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogb3V0cHV0IGVycm9yIHNvbWVob3cgKG1heWJlIG1lc3NhZ2UgYm94KQorICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGRvdXQgPSBOVUxMOworCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGRvdXQgPSBobzsgLy8gdGVtcG9yYXJ5IGNvZGUsIG5lZWQgbmV3IGdsb2JhbCBmb3IgaG8KKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgaGUgPSBHZXRTdGRIYW5kbGUoIFNURF9FUlJPUl9IQU5ETEUgKTsKKyAgICAgICAgICAgIGlmICggaGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUgfHwgaGUgPT0gTlVMTCApIHsKKworICAgICAgICAgICAgICAgIERXT1JEICBlcnIgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBvdXRwdXQgZXJyb3Igc29tZWhvdyAobWF5YmUgbWVzc2FnZSBib3gpCisgICAgICAgICAgICAgICAgX19rbXBfc3RkZXJyID0gTlVMTDsKKworICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgIF9fa21wX3N0ZGVyciA9IGhlOyAvLyB0ZW1wb3JhcnkgY29kZSwgbmVlZCBuZXcgZ2xvYmFsCisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX2ttcF9jb25zb2xlX2V4aXN0cyA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2NvbnNvbGVfbG9jayApOworICAgIH0KKworI2Vsc2UKKyAgICAjZGVmaW5lICAgICAgIF9fa21wX3N0ZGVyciAgICAgKHN0ZGVycikKKyNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworCit2b2lkCitfX2ttcF92cHJpbnRmKCBlbnVtIGttcF9pbyBfX2ttcF9pbywgY2hhciBjb25zdCAqIGZvcm1hdCwgdmFfbGlzdCBhcCApCit7CisgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIGlmKCAhX19rbXBfY29uc29sZV9leGlzdHMgKSB7CisgICAgICAgICAgICBfX2ttcF9yZWRpcmVjdF9vdXRwdXQoKTsKKyAgICAgICAgfQorICAgICAgICAgICAgaWYoICEgX19rbXBfc3RkZXJyICYmIF9fa21wX2lvID09IGttcF9lcnIgKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgaWYoICEgX19rbXBfc3Rkb3V0ICYmIF9fa21wX2lvID09IGttcF9vdXQgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAjZW5kaWYKKyAgICAjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KKworICAgIGlmICggX19rbXBfZGVidWdfYnVmICYmIF9fa21wX2RlYnVnX2J1ZmZlciAhPSBOVUxMICkgeworCisgICAgICAgIGludCBkYyA9ICggX19rbXBfZGVidWdfYnVmX2F0b21pYyA/CisgICAgICAgICAgICAgICAgICAgS01QX1RFU1RfVEhFTl9JTkMzMiggJiBfX2ttcF9kZWJ1Z19jb3VudCkgOiBfX2ttcF9kZWJ1Z19jb3VudCsrICkKKyAgICAgICAgICAgICAgICAgICAlIF9fa21wX2RlYnVnX2J1Zl9saW5lczsKKyAgICAgICAgY2hhciAqZGIgPSAmIF9fa21wX2RlYnVnX2J1ZmZlclsgZGMgKiBfX2ttcF9kZWJ1Z19idWZfY2hhcnMgXTsKKyAgICAgICAgaW50IGNoYXJzID0gMDsKKworICAgICAgICAjaWZkZWYgS01QX0RFQlVHX1BJRFMKKyAgICAgICAgICAgIGNoYXJzID0gc3ByaW50ZiggZGIsICJwaWQ9JWQ6ICIsIGdldHBpZCgpICk7CisgICAgICAgICNlbmRpZgorICAgICAgICBjaGFycyArPSB2c3ByaW50ZiggZGIsIGZvcm1hdCwgYXAgKTsKKworICAgICAgICBpZiAoIGNoYXJzICsgMSA+IF9fa21wX2RlYnVnX2J1Zl9jaGFycyApIHsKKyAgICAgICAgICAgIGlmICggY2hhcnMgKyAxID4gX19rbXBfZGVidWdfYnVmX3dhcm5fY2hhcnMgKSB7CisgICAgICAgICAgICAgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgICAgICAgICAgICAgIERXT1JEIGNvdW50OworICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmX19rbXBfY29uc29sZV9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAiT01QIHdhcm5pbmc6IERlYnVnZ2luZyBidWZmZXIgb3ZlcmZsb3c7IGluY3JlYXNlIEtNUF9ERUJVR19CVUZfQ0hBUlMgdG8gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFycyArIDEgKTsKKyAgICAgICAgICAgICAgICAgICAgV3JpdGVGaWxlKCBfX2ttcF9zdGRlcnIsIF9fa21wX2NvbnNvbGVfYnVmLnN0ciwgX19rbXBfY29uc29sZV9idWYudXNlZCwgJmNvdW50LCBOVUxMICk7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfY2xlYXIoICZfX2ttcF9jb25zb2xlX2J1ZiApOworICAgICAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoIF9fa21wX3N0ZGVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiT01QIHdhcm5pbmc6IERlYnVnZ2luZyBidWZmZXIgb3ZlcmZsb3c7IGluY3JlYXNlIEtNUF9ERUJVR19CVUZfQ0hBUlMgdG8gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnMgKyAxICk7CisgICAgICAgICAgICAgICAgICAgIGZmbHVzaCggX19rbXBfc3RkZXJyICk7CisgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgX19rbXBfZGVidWdfYnVmX3dhcm5fY2hhcnMgPSBjaGFycyArIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiB0ZXJtaW5hdGUgc3RyaW5nIGlmIG92ZXJmbG93IG9jY3VycmVkICovCisgICAgICAgICAgICBkYlsgX19rbXBfZGVidWdfYnVmX2NoYXJzIC0gMiBdID0gJ1xuJzsKKyAgICAgICAgICAgIGRiWyBfX2ttcF9kZWJ1Z19idWZfY2hhcnMgLSAxIF0gPSAnXDAnOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgICAgICBEV09SRCBjb3VudDsKKyAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUdfUElEUworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICZfX2ttcF9jb25zb2xlX2J1ZiwgInBpZD0lZDogIiwgZ2V0cGlkKCkgKTsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl92cHJpbnQoICZfX2ttcF9jb25zb2xlX2J1ZiwgZm9ybWF0LCBhcCApOworICAgICAgICAgICAgV3JpdGVGaWxlKAorICAgICAgICAgICAgICAgIF9fa21wX3N0ZGVyciwKKyAgICAgICAgICAgICAgICBfX2ttcF9jb25zb2xlX2J1Zi5zdHIsCisgICAgICAgICAgICAgICAgX19rbXBfY29uc29sZV9idWYudXNlZCwKKyAgICAgICAgICAgICAgICAmY291bnQsCisgICAgICAgICAgICAgICAgTlVMTAorICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfY2xlYXIoICZfX2ttcF9jb25zb2xlX2J1ZiApOworICAgICAgICAjZWxzZQorICAgICAgICAgICAgI2lmZGVmIEtNUF9ERUJVR19QSURTCisgICAgICAgICAgICAgICAgZnByaW50ZiggX19rbXBfc3RkZXJyLCAicGlkPSVkOiAiLCBnZXRwaWQoKSApOworICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICB2ZnByaW50ZiggX19rbXBfc3RkZXJyLCBmb3JtYXQsIGFwICk7CisgICAgICAgICAgICBmZmx1c2goIF9fa21wX3N0ZGVyciApOworICAgICAgICAjZW5kaWYKKyAgICB9Cit9CisKK3ZvaWQKK19fa21wX3ByaW50ZiggY2hhciBjb25zdCAqIGZvcm1hdCwgLi4uICkKK3sKKyAgICB2YV9saXN0IGFwOworICAgIHZhX3N0YXJ0KCBhcCwgZm9ybWF0ICk7CisKKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX3N0ZGlvX2xvY2sgKTsKKyAgICBfX2ttcF92cHJpbnRmKCBrbXBfZXJyLCBmb3JtYXQsIGFwICk7CisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiBfX2ttcF9zdGRpb19sb2NrICk7CisKKyAgICB2YV9lbmQoIGFwICk7Cit9CisKK3ZvaWQKK19fa21wX3ByaW50Zl9ub19sb2NrKCBjaGFyIGNvbnN0ICogZm9ybWF0LCAuLi4gKQoreworICAgIHZhX2xpc3QgYXA7CisgICAgdmFfc3RhcnQoIGFwLCBmb3JtYXQgKTsKKworICAgIF9fa21wX3ZwcmludGYoIGttcF9lcnIsIGZvcm1hdCwgYXAgKTsKKworICAgIHZhX2VuZCggYXAgKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9pby5oIGIvZmluYWwvcnVudGltZS9zcmMva21wX2lvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgxZjQ1OQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9pby5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBrbXBfaW8uaCAtLSBSVEwgSU8gaGVhZGVyIGZpbGUuCisgKiAkUmV2aXNpb246IDQyMDYxICQKKyAqICREYXRlOiAyMDEzLTAyLTI4IDE2OjM2OjI0IC0wNjAwIChUaHUsIDI4IEZlYiAyMDEzKSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX0lPX0gKKyNkZWZpbmUgS01QX0lPX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitlbnVtIGttcF9pbyB7CisgICAga21wX291dCA9IDAsCisgICAga21wX2VycgorfTsKKworZXh0ZXJuIGttcF9ib290c3RyYXBfbG9ja190IF9fa21wX3N0ZGlvX2xvY2s7ICAgICAvKiBDb250cm9sIHN0ZGlvIGZ1bmN0aW9ucyAqLworZXh0ZXJuIGttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2NvbnNvbGVfbG9jazsgICAvKiBDb250cm9sIGNvbnNvbGUgaW5pdGlhbGl6YXRpb24gKi8KKworZXh0ZXJuIHZvaWQgX19rbXBfdnByaW50ZiggZW51bSBrbXBfaW8gX19rbXBfaW8sIGNoYXIgY29uc3QgKiBmb3JtYXQsIHZhX2xpc3QgYXAgKTsKK2V4dGVybiB2b2lkIF9fa21wX3ByaW50ZiggY2hhciBjb25zdCAqIGZvcm1hdCwgLi4uICk7CitleHRlcm4gdm9pZCBfX2ttcF9wcmludGZfbm9fbG9jayggY2hhciBjb25zdCAqIGZvcm1hdCwgLi4uICk7CitleHRlcm4gdm9pZCBfX2ttcF9jbG9zZV9jb25zb2xlKCB2b2lkICk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBLTVBfSU9fSCAqLworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfaXR0LmMgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfaXR0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJlYmIwNAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9pdHQuYwpAQCAtMCwwICsxLDEzOSBAQAorI2lmIFVTRV9JVFRfQlVJTEQKKy8qCisgKiBrbXBfaXR0LmMgLS0gSVRUIE5vdGlmeSBpbnRlcmZhY2UuCisgKiAkUmV2aXNpb246IDQyNDg5ICQKKyAqICREYXRlOiAyMDEzLTA3LTA4IDExOjAwOjA5IC0wNTAwIChNb24sIDA4IEp1bCAyMDEzKSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXBfaXR0LmgiCisKKyNpZiBLTVBfREVCVUcKKyAgICAjaW5jbHVkZSAia21wX2l0dC5pbmwiCisjZW5kaWYKKworCisjaWYgVVNFX0lUVF9OT1RJRlkKKworICAgIGttcF9pbnQzMiBfX2ttcF9mcmFtZV9kb21haW5fY291bnQgPSAwOworICAgIF9faXR0X2RvbWFpbiogX19rbXBfaXR0X2RvbWFpbnNbS01QX01BWF9GUkFNRV9ET01BSU5TXTsKKworICAgICNpbmNsdWRlICJrbXBfdmVyc2lvbi5oIgorICAgICNpbmNsdWRlICJrbXBfaTE4bi5oIgorICAgICNpbmNsdWRlICJrbXBfc3RyLmgiCisKKyAgICBLTVBfQlVJTERfQVNTRVJUKCBzaXplb2YoIGttcF9pdHRfbWFya190ICkgPT0gc2l6ZW9mKCBfX2l0dF9tYXJrX3R5cGUgKSApOworCisgICAgLyoKKyAgICAgICAgUHJldmlvdXNseSB1c2VkIHdhcm5pbmdzOgorCisgICAgICAgIEtNUF9XQVJOSU5HKCBJdHRBbGxOb3RpZkRpc2FibGVkICk7CisgICAgICAgIEtNUF9XQVJOSU5HKCBJdHRPYmpOb3RpZkRpc2FibGVkICk7CisgICAgICAgIEtNUF9XQVJOSU5HKCBJdHRNYXJrTm90aWZEaXNhYmxlZCApOworICAgICAgICBLTVBfV0FSTklORyggSXR0VW5sb2FkTGliRmFpbGVkLCBsaWJpdHRub3RpZnkgKTsKKyAgICAqLworCisKKyAgICBrbXBfaW50MzIgX19rbXBfaXR0X3ByZXBhcmVfZGVsYXkgPSAwOworICAgIGttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2l0dF9kZWJ1Z19sb2NrID0gS01QX0JPT1RTVFJBUF9MT0NLX0lOSVRJQUxJWkVSKCBfX2ttcF9pdHRfZGVidWdfbG9jayApOworCisjZW5kaWYgLy8gVVNFX0lUVF9OT1RJRlkKKwordm9pZCBfX2ttcF9pdHRfaW5pdGlhbGl6ZSgpIHsKKworICAgIC8vIElUVE5vdGlmeSBsaWJyYXJ5IGlzIGxvYWRlZCBhbmQgaW5pdGlhbGl6ZWQgYXQgZmlyc3QgY2FsbCB0byBhbnkgaXR0bm90aWZ5IGZ1bmN0aW9uLAorICAgIC8vIHNvIHdlIGRvIG5vdCBuZWVkIHRvIGV4cGxpY2l0bHkgbG9hZCBpdCBhbnkgbW9yZS4KKyAgICAvLyBKdXNyIHJlcG9ydCBPTVAgUlRMIHZlcnNpb24gdG8gSVRUTm90aWZ5LgorCisgICAgI2lmIFVTRV9JVFRfTk9USUZZCisgICAgICAgIC8vIFJlcG9ydCBPcGVuTVAgUlRMIHZlcnNpb24uCisgICAgICAgIGttcF9zdHJfYnVmX3QgICAgICAgYnVmOworICAgICAgICBfX2l0dF9tYXJrX3R5cGUgICAgIHZlcnNpb247CisgICAgICAgIF9fa21wX3N0cl9idWZfaW5pdCggJiBidWYgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgKKyAgICAgICAgICAgICYgYnVmLAorICAgICAgICAgICAgIk9NUCBSVEwgVmVyc2lvbiAlZC4lZC4lZCIsCisgICAgICAgICAgICBfX2ttcF92ZXJzaW9uX21ham9yLAorICAgICAgICAgICAgX19rbXBfdmVyc2lvbl9taW5vciwKKyAgICAgICAgICAgIF9fa21wX3ZlcnNpb25fYnVpbGQKKyAgICAgICAgKTsKKyAgICAgICAgaWYgKCBfX2l0dF9hcGlfdmVyc2lvbl9wdHIgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmLCAiOiVzIiwgX19pdHRfYXBpX3ZlcnNpb24oKSApOworICAgICAgICB9OyAvLyBpZgorICAgICAgICB2ZXJzaW9uID0gX19pdHRfbWFya19jcmVhdGUoIGJ1Zi5zdHIgKTsKKyAgICAgICAgX19pdHRfbWFyayggdmVyc2lvbiwgTlVMTCApOworICAgICAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoICYgYnVmICk7CisgICAgI2VuZGlmCisKK30gLy8gX19rbXBfaXR0X2luaXRpYWxpemUKKworCit2b2lkIF9fa21wX2l0dF9kZXN0cm95KCkgeworICAgICNpZiBVU0VfSVRUX05PVElGWQorICAgICAgICBfX2ttcF9pdHRfZmluaV9pdHRsaWIoKTsKKyAgICAjZW5kaWYKK30gLy8gX19rbXBfaXR0X2Rlc3Ryb3kKKworCitleHRlcm4gIkMiCit2b2lkCitfX2l0dF9lcnJvcl9oYW5kbGVyKAorICAgIF9faXR0X2Vycm9yX2NvZGUgZXJyLAorICAgIHZhX2xpc3QgYXJncworKSB7CisKKyAgICBzd2l0Y2ggKCBlcnIgKSB7CisgICAgICAgIGNhc2UgX19pdHRfZXJyb3Jfbm9fbW9kdWxlIDogeworICAgICAgICAgICAgY2hhciBjb25zdCAqIGxpYnJhcnkgPSB2YV9hcmcoIGFyZ3MsIGNoYXIgY29uc3QgKiApOworICAgICAgICAgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgICAgICAgICAgaW50IHN5c19lcnIgPSB2YV9hcmcoIGFyZ3MsIGludCApOworICAgICAgICAgICAgICAgIF9fa21wX21zZygga21wX21zX3dhcm5pbmcsIEtNUF9NU0coIEl0dExvYWRMaWJGYWlsZWQsIGxpYnJhcnkgKSwgS01QX1NZU0VSUkNPREUoIHN5c19lcnIgKSwgX19rbXBfbXNnX251bGwgKTsKKyAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICAgY2hhciBjb25zdCAqIHN5c19lcnIgPSB2YV9hcmcoIGFyZ3MsIGNoYXIgY29uc3QgKiApOworICAgICAgICAgICAgICAgIF9fa21wX21zZygga21wX21zX3dhcm5pbmcsIEtNUF9NU0coIEl0dExvYWRMaWJGYWlsZWQsIGxpYnJhcnkgKSwgS01QX1NZU0VSUk1FU0coIHN5c19lcnIgKSwgX19rbXBfbXNnX251bGwgKTsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIF9faXR0X2Vycm9yX25vX3N5bWJvbCA6IHsKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiBsaWJyYXJ5ID0gdmFfYXJnKCBhcmdzLCBjaGFyIGNvbnN0ICogKTsKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiBzeW1ib2wgID0gdmFfYXJnKCBhcmdzLCBjaGFyIGNvbnN0ICogKTsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBJdHRMb29rdXBGYWlsZWQsIHN5bWJvbCwgbGlicmFyeSApOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIF9faXR0X2Vycm9yX3Vua25vd25fZ3JvdXAgOiB7CisgICAgICAgICAgICBjaGFyIGNvbnN0ICogdmFyICAgPSB2YV9hcmcoIGFyZ3MsIGNoYXIgY29uc3QgKiApOworICAgICAgICAgICAgY2hhciBjb25zdCAqIGdyb3VwID0gdmFfYXJnKCBhcmdzLCBjaGFyIGNvbnN0ICogKTsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBJdHRVbmtub3duR3JvdXAsIHZhciwgZ3JvdXAgKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBfX2l0dF9lcnJvcl9lbnZfdG9vX2xvbmcgOiB7CisgICAgICAgICAgICBjaGFyIGNvbnN0ICogdmFyICAgICA9IHZhX2FyZyggYXJncywgY2hhciBjb25zdCAqICk7CisgICAgICAgICAgICBzaXplX3QgICAgICAgYWN0X2xlbiA9IHZhX2FyZyggYXJncywgc2l6ZV90ICk7CisgICAgICAgICAgICBzaXplX3QgICAgICAgbWF4X2xlbiA9IHZhX2FyZyggYXJncywgc2l6ZV90ICk7CisgICAgICAgICAgICBLTVBfV0FSTklORyggSXR0RW52VmFyVG9vTG9uZywgdmFyLCAodW5zaWduZWQgbG9uZykgYWN0X2xlbiwgKHVuc2lnbmVkIGxvbmcpIG1heF9sZW4gKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBfX2l0dF9lcnJvcl9jYW50X3JlYWRfZW52IDogeworICAgICAgICAgICAgY2hhciBjb25zdCAqIHZhciAgICAgPSB2YV9hcmcoIGFyZ3MsIGNoYXIgY29uc3QgKiApOworICAgICAgICAgICAgaW50ICAgICAgICAgIHN5c19lcnIgPSB2YV9hcmcoIGFyZ3MsIGludCApOworICAgICAgICAgICAgX19rbXBfbXNnKCBrbXBfbXNfd2FybmluZywgS01QX01TRyggQ2FudEdldEVudlZhciwgdmFyICksIEtNUF9FUlIoIHN5c19lcnIgKSwgX19rbXBfbXNnX251bGwgKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBfX2l0dF9lcnJvcl9zeXN0ZW0gOiB7CisgICAgICAgICAgICBjaGFyIGNvbnN0ICogZnVuYyAgICA9IHZhX2FyZyggYXJncywgY2hhciBjb25zdCAqICk7CisgICAgICAgICAgICBpbnQgICAgICAgICAgc3lzX2VyciA9IHZhX2FyZyggYXJncywgaW50ICk7CisgICAgICAgICAgICBfX2ttcF9tc2coIGttcF9tc193YXJuaW5nLCBLTVBfTVNHKCBJdHRGdW5jdGlvbkVycm9yLCBmdW5jICksIEtNUF9TWVNFUlJDT0RFKCBzeXNfZXJyICksIF9fa21wX21zZ19udWxsICk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGRlZmF1bHQgOiB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggSXR0VW5rbm93bkVycm9yLCBlcnIgKTsKKyAgICAgICAgfTsKKyAgICB9OyAvLyBzd2l0Y2gKKworfSAvLyBfX2l0dF9lcnJvcl9oYW5kbGVyCisKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfaXR0LmggYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfaXR0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVlNzliNgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9pdHQuaApAQCAtMCwwICsxLDI3MyBAQAorI2lmIFVTRV9JVFRfQlVJTEQKKy8qCisgKiBrbXBfaXR0LmggLS0gSVRUIE5vdGlmeSBpbnRlcmZhY2UuCisgKiAkUmV2aXNpb246IDQyODI5ICQKKyAqICREYXRlOiAyMDEzLTExLTIxIDA1OjQ0OjAxIC0wNjAwIChUaHUsIDIxIE5vdiAyMDEzKSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX0lUVF9ICisjZGVmaW5lIEtNUF9JVFRfSAorCisjaW5jbHVkZSAia21wX2xvY2suaCIKKworI2RlZmluZSBJTlRFTF9JVFROT1RJRllfQVBJX1BSSVZBVEUKKyNpbmNsdWRlICJpdHRub3RpZnkuaCIKKyNpbmNsdWRlICJsZWdhY3kvaXR0bm90aWZ5LmgiCisKKyNpZiBLTVBfREVCVUcKKyAgICAjZGVmaW5lIF9fa21wX2lubGluZSAgICAgICAgICAgLy8gVHVybiBvZmYgaW5saW5pbmcgaW4gZGVidWcgbW9kZS4KKyNlbHNlCisgICAgI2RlZmluZSBfX2ttcF9pbmxpbmUgc3RhdGljIGlubGluZQorI2VuZGlmCisKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGV4dGVybiBrbXBfaW50MzIgIF9fa21wX2l0dF9wcmVwYXJlX2RlbGF5OworIyBpZmRlZiBfX2NwbHVzcGx1cworICAgIGV4dGVybiAiQyIgdm9pZCBfX2ttcF9pdHRfZmluaV9pdHRsaWIodm9pZCk7CisjIGVsc2UKKyAgICBleHRlcm4gdm9pZCBfX2ttcF9pdHRfZmluaV9pdHRsaWIodm9pZCk7CisjIGVuZGlmCisjZW5kaWYKKworLy8gU2ltcGxpZnkgdGhlIGhhbmRsaW5nIG9mIGFuIGFyZ3VtZW50IHRoYXQgaXMgb25seSByZXF1aXJlZCB3aGVuIFVTRV9JVFRfQlVJTEQgaXMgZW5hYmxlZC4KKyNkZWZpbmUgVVNFX0lUVF9CVUlMRF9BUkcoeCkgLHgKKwordm9pZCBfX2ttcF9pdHRfaW5pdGlhbGl6ZSgpOwordm9pZCBfX2ttcF9pdHRfZGVzdHJveSgpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBOZXcgc3R1ZmYgZm9yIHJlcG9ydGluZyBoaWdoLWxldmVsIGNvbnN0cnVjdHMuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIE5vdGUgdGhlIG5hbWluZyBjb252ZW50aW9uOgorLy8gICAgIF9fa21wX2l0dF94eHhpbmcoKSBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBhY3Rpb24sIHdoaWxlCisvLyAgICAgX19rbXBfaXR0X3h4eGVkKCkgIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgYWN0aW9uLgorCisvLyAtLS0gUGFyYWxsZWwgcmVnaW9uIHJlcG9ydGluZyAtLS0KK19fa21wX2lubGluZSB2b2lkIF9fa21wX2l0dF9yZWdpb25fZm9ya2luZyggIGludCBndGlkLCBpbnQgc2VyaWFsaXplZCA9IDAgKTsgLy8gTWFzdGVyIG9ubHksIGJlZm9yZSBmb3JraW5nIHRocmVhZHMuCitfX2ttcF9pbmxpbmUgdm9pZCBfX2ttcF9pdHRfcmVnaW9uX2pvaW5lZCggICBpbnQgZ3RpZCwgaW50IHNlcmlhbGl6ZWQgPSAwICk7IC8vIE1hc3RlciBvbmx5LCBhZnRlciBqb2luaW5nIHRocmVhZHMuCisgICAgLy8gKCopIE5vdGU6IEEgdGhyZWFkIG1heSBleGVjdXRlIHRhc2tzIGFmdGVyIHRoaXMgcG9pbnQsIHRob3VnaC4KKworLy8gLS0tIEZyYW1lIHJlcG9ydGluZyAtLS0KK19fa21wX2lubGluZSB2b2lkIF9fa21wX2l0dF9mcmFtZV9zdWJtaXQoIGludCBndGlkLCBfX2l0dF90aW1lc3RhbXAgYmVnaW4sIF9faXR0X3RpbWVzdGFtcCBlbmQsIGludCBpbWJhbGFuY2UsIGlkZW50X3QgKmxvYyApOworCisvLyAtLS0gQmFycmllciByZXBvcnRpbmcgLS0tCitfX2ttcF9pbmxpbmUgdm9pZCAqIF9fa21wX2l0dF9iYXJyaWVyX29iamVjdCggaW50IGd0aWQsIGludCBidCwgaW50IHNldF9uYW1lID0gMCwgaW50IGRlbHRhID0gMCApOworX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfYmFycmllcl9zdGFydGluZyggaW50IGd0aWQsIHZvaWQgKiBvYmplY3QgKTsKK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X2JhcnJpZXJfbWlkZGxlKCAgIGludCBndGlkLCB2b2lkICogb2JqZWN0ICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9iYXJyaWVyX2ZpbmlzaGVkKCBpbnQgZ3RpZCwgdm9pZCAqIG9iamVjdCApOworCisvLyAtLS0gVGFza3dhaXQgcmVwb3J0aW5nIC0tLQorX19rbXBfaW5saW5lIHZvaWQgKiBfX2ttcF9pdHRfdGFza3dhaXRfb2JqZWN0KCBpbnQgZ3RpZCApOworX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfdGFza3dhaXRfc3RhcnRpbmcoIGludCBndGlkLCB2b2lkICogb2JqZWN0ICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF90YXNrd2FpdF9maW5pc2hlZCggICBpbnQgZ3RpZCwgdm9pZCAqIG9iamVjdCApOworCisvLyAtLS0gVGFzayByZXBvcnRpbmcgLS0tCitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF90YXNrX3N0YXJ0aW5nKCB2b2lkICogb2JqZWN0ICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF90YXNrX2ZpbmlzaGVkKCB2b2lkICogb2JqZWN0ICk7CisKKy8vIC0tLSBMb2NrIHJlcG9ydGluZyAtLS0KK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X2xvY2tfY3JlYXRpbmcoICBrbXBfdXNlcl9sb2NrX3AgbG9jayApOworX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfbG9ja19hY3F1aXJpbmcoIGttcF91c2VyX2xvY2tfcCBsb2NrICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmVkKCAga21wX3VzZXJfbG9ja19wIGxvY2sgKTsKK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X2xvY2tfcmVsZWFzaW5nKCBrbXBfdXNlcl9sb2NrX3AgbG9jayApOworX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfbG9ja19jYW5jZWxsZWQoIGttcF91c2VyX2xvY2tfcCBsb2NrICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9sb2NrX2Rlc3Ryb3llZCgga21wX3VzZXJfbG9ja19wIGxvY2sgKTsKKworLy8gLS0tIENyaXRpY2FsIHJlcG9ydGluZyAtLS0KK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X2NyaXRpY2FsX2NyZWF0aW5nKCAga21wX3VzZXJfbG9ja19wIGxvY2sgKTsKK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X2NyaXRpY2FsX2FjcXVpcmluZygga21wX3VzZXJfbG9ja19wIGxvY2sgKTsKK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X2NyaXRpY2FsX2FjcXVpcmVkKCAga21wX3VzZXJfbG9ja19wIGxvY2sgKTsKK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X2NyaXRpY2FsX3JlbGVhc2luZygga21wX3VzZXJfbG9ja19wIGxvY2sgKTsKK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X2NyaXRpY2FsX2Rlc3Ryb3llZCgga21wX3VzZXJfbG9ja19wIGxvY2sgKTsKKworLy8gLS0tIFNpbmdsZSByZXBvcnRpbmcgLS0tCitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9zaW5nbGVfc3RhcnQoIGludCBndGlkICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9zaW5nbGVfZW5kKCAgIGludCBndGlkICk7CisKKy8vIC0tLSBPcmRlcmVkIHJlcG9ydGluZyAtLS0KK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X29yZGVyZWRfaW5pdCggIGludCBndGlkICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9vcmRlcmVkX3ByZXAoICBpbnQgZ3RpZCApOworX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfb3JkZXJlZF9zdGFydCggaW50IGd0aWQgKTsKK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X29yZGVyZWRfZW5kKCAgIGludCBndGlkICk7CisKKy8vIC0tLSBUaHJlYWRzIHJlcG9ydGluZyAtLS0KK19fa21wX2lubGluZSB2b2lkICBfX2ttcF9pdHRfdGhyZWFkX2lnbm9yZSgpOworX19rbXBfaW5saW5lIHZvaWQgIF9fa21wX2l0dF90aHJlYWRfbmFtZSggaW50IGd0aWQgKTsKKworLy8gLS0tIFN5c3RlbSBvYmplY3RzIC0tLQorX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfc3lzdGVtX29iamVjdF9jcmVhdGVkKCB2b2lkICogb2JqZWN0LCBjaGFyIGNvbnN0ICogbmFtZSApOworCisvLyAtLS0gU3RhY2sgc3RpdGNoaW5nIC0tLQorX19rbXBfaW5saW5lIF9faXR0X2NhbGxlciBfX2ttcF9pdHRfc3RhY2tfY2FsbGVyX2NyZWF0ZSh2b2lkKTsKK19fa21wX2lubGluZSB2b2lkIF9fa21wX2l0dF9zdGFja19jYWxsZXJfZGVzdHJveShfX2l0dF9jYWxsZXIpOworX19rbXBfaW5saW5lIHZvaWQgX19rbXBfaXR0X3N0YWNrX2NhbGxlZV9lbnRlcihfX2l0dF9jYWxsZXIpOworX19rbXBfaW5saW5lIHZvaWQgX19rbXBfaXR0X3N0YWNrX2NhbGxlZV9sZWF2ZShfX2l0dF9jYWxsZXIpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPbGQgc3R1ZmYgZm9yIHJlcG9ydGluZyBsb3ctbGV2ZWwgaW50ZXJuYWwgc3luY2hyb25pemF0aW9uLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgVVNFX0lUVF9OT1RJRlkKKworICAgIC8qCisgICAgICogU3VwcG9ydCBmb3IgU1NDIG1hcmtzLCB3aGljaCBhcmUgdXNlZCBieSBTREUKKyAgICAgKiBodHRwOi8vc29mdHdhcmUuaW50ZWwuY29tL2VuLXVzL2FydGljbGVzL2ludGVsLXNvZnR3YXJlLWRldmVsb3BtZW50LWVtdWxhdG9yCisgICAgICogdG8gbWFyayBwb2ludHMgaW4gaW5zdHJ1Y3Rpb24gdHJhY2VzIHRoYXQgcmVwcmVzZW50IHNwaW4tbG9vcHMgYW5kIGFyZQorICAgICAqIHRoZXJlZm9yZSB1bmludGVyZXN0aW5nIHdoZW4gY29sbGVjdGluZyB0cmFjZXMgZm9yIGFyY2hpdGVjdHVyZSBzaW11bGF0aW9uLgorICAgICAqLworICAgICNpZm5kZWYgSU5DTFVERV9TU0NfTUFSS1MKKyAgICAjIGRlZmluZSBJTkNMVURFX1NTQ19NQVJLUyAoS01QX09TX0xJTlVYICYmIEtNUF9BUkNIX1g4Nl82NCkKKyAgICAjZW5kaWYKKworICAgIC8qIExpbnV4IDY0IG9ubHkgZm9yIG5vdyAqLworICAgICNpZiAoSU5DTFVERV9TU0NfTUFSS1MgJiYgS01QX09TX0xJTlVYICYmIEtNUF9BUkNIX1g4Nl82NCkKKyAgICAvLyBQb3J0YWJsZSAoYXQgbGVhc3QgZm9yIGdjYyBhbmQgaWNjKSBjb2RlIHRvIGluc2VydCB0aGUgbmVjZXNzYXJ5IGluc3RydWN0aW9ucworICAgIC8vIHRvIHNldCAlZWJ4IGFuZCBleGVjdXRlIHRoZSB1bmxpa2VseSBuby1vcC4KKyAgICAjIGRlZmluZSBJTlNFUlRfU1NDX01BUksodGFnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgibW92bCAlMCwgJSVlYng7IC5ieXRlIDB4NjQsIDB4NjcsIDB4OTAgIiA6OiJpIih0YWcpOiIlZWJ4IikKKyAgICAjZWxzZQorICAgICMgZGVmaW5lIElOU0VSVF9TU0NfTUFSSyh0YWcpICgodm9pZCkwKQorICAgICNlbmRpZgorCisgICAgLyogTWFya2VycyBmb3IgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgcmVnaW9ucyB0aGF0IHJlcHJlc2VudCBwb2xsaW5nIGFuZAorICAgICAqIGFyZSB0aGVyZWZvcmUgdW5pbnRlcmVzdGluZyB0byBhcmNoaXRlY3R1cmFsIHNpbXVsYXRpb25zIDB4NDM3NiBhbmQKKyAgICAgKiAweDQzNzcgYXJlIGFyYml0cmFyeSBudW1iZXJzIHRoYXQgc2hvdWxkIGJlIHVuaXF1ZSBpbiB0aGUgc3BhY2Ugb2YKKyAgICAgKiBTU0MgdGFncywgYnV0IHRoZXJlIGlzIG5vIGNlbnRyYWwgaXNzdWluZyBhdXRob3JpdHkgcmF0aGVyCisgICAgICogcmFuZG9tbmVzcyBpcyBleHBlY3RlZCB0byB3b3JrLgorICAgICAqLworICAgICNkZWZpbmUgU1NDX01BUktfU1BJTl9TVEFSVCgpIElOU0VSVF9TU0NfTUFSSygweDQzNzYpCisgICAgI2RlZmluZSBTU0NfTUFSS19TUElOX0VORCgpICAgSU5TRVJUX1NTQ19NQVJLKDB4NDM3NykKKworICAgIC8vIFRoZSBvYmplY3QgaXMgYW4gYWRkcmVzcyB0aGF0IGFzc29jaWF0ZXMgYSBzcGVjaWZpYyBzZXQgb2YgdGhlIHByZXBhcmUsIGFjcXVpcmUsIHJlbGVhc2UsCisgICAgLy8gYW5kIGNhbmNlbCBvcGVyYXRpb25zLgorCisgICAgLyogU3luYyBwcmVwYXJlIGluZGljYXRlcyBhIHRocmVhZCBpcyBnb2luZyB0byBzdGFydCB3YWl0aW5nIGZvciBhbm90aGVyIHRocmVhZAorICAgICAgIHRvIHNlbmQgYSByZWxlYXNlIGV2ZW50LiAgVGhpcyBvcGVyYXRpb24gc2hvdWxkIGJlIGRvbmUganVzdCBiZWZvcmUgdGhlIHRocmVhZAorICAgICAgIGJlZ2lucyBjaGVja2luZyBmb3IgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgcmVsZWFzZSBldmVudCAqLworCisgICAgLyogU3luYyBjYW5jZWwgaW5kaWNhdGVzIGEgdGhyZWFkIGlzIGNhbmNlbGxpbmcgYSB3YWl0IG9uIGFub3RoZXIgdGhyZWFkIGFuYworICAgICAgIGNvbnRpbnVpbmcgZXhlY3V0aW9uIHdpdGhvdXQgd2FpdGluZyBmb3IgdGhlIG90aGVyIHRocmVhZCB0byByZWxlYXNlIGl0ICovCisKKyAgICAvKiBTeW5jIGFjcXVpcmVkIGluZGljYXRlcyBhIHRocmVhZCBoYXMgcmVjZWl2ZWQgYSByZWxlYXNlIGV2ZW50IGZyb20gYW5vdGhlcgorICAgICAgIHRocmVhZCBhbmQgaGFzIHN0b3BwZWQgd2FpdGluZy4gIFRoaXMgb3BlcmF0aW9uIG11c3Qgb2NjdXIgb25seSBhZnRlciB0aGUgcmVsZWFzZQorICAgICAgIGV2ZW50IGlzIHJlY2VpdmVkLiAqLworCisgICAgLyogU3luYyByZWxlYXNlIGluZGljYXRlcyBhIHRocmVhZCBpcyBnb2luZyB0byBzZW5kIGEgcmVsZWFzZSBldmVudCB0byBhbm90aGVyIHRocmVhZAorICAgICAgIHNvIGl0IHdpbGwgc3RvcCB3YWl0aW5nIGFuZCBjb250aW51ZSBleGVjdXRpb24uIFRoaXMgb3BlcmF0aW9uIG11c3QganVzdCBoYXBwZW4gYmVmb3JlCisgICAgICAgdGhlIHJlbGVhc2UgZXZlbnQuICovCisKKyAgICAjZGVmaW5lIEtNUF9GU1lOQ19QUkVQQVJFKCAgIG9iaiApICBfX2l0dF9mc3luY19wcmVwYXJlKCAgICh2b2lkICopKCBvYmogKSApCisgICAgI2RlZmluZSBLTVBfRlNZTkNfQ0FOQ0VMKCAgICBvYmogKSAgX19pdHRfZnN5bmNfY2FuY2VsKCAgICAodm9pZCAqKSggb2JqICkgKQorICAgICNkZWZpbmUgS01QX0ZTWU5DX0FDUVVJUkVEKCAgb2JqICkgIF9faXR0X2ZzeW5jX2FjcXVpcmVkKCAgKHZvaWQgKikoIG9iaiApICkKKyAgICAjZGVmaW5lIEtNUF9GU1lOQ19SRUxFQVNJTkcoIG9iaiApICBfX2l0dF9mc3luY19yZWxlYXNpbmcoICh2b2lkICopKCBvYmogKSApCisKKyAgICAvKgorICAgICAgICBJbiBjYXNlIG9mIHdhaXRpbmcgaW4gYSBzcGluIGxvb3AsIElUVCB3YW50cyBLTVBfRlNZTkNfUFJFUEFSRSgpIHRvIGJlIGNhbGxlZCB3aXRoIGEgZGVsYXkKKyAgICAgICAgKGFuZCBub3QgY2FsbGVkIGF0IGFsbCBpZiB3YWl0aW5nIHRpbWUgaXMgc21hbGwpLiBTbywgaW4gc3BpbiBsb29wcywgZG8gbm90IHVzZQorICAgICAgICBLTVBfRlNZTkNfUFJFUEFSRSgpLCBidXQgdXNlIEtNUF9GU1lOQ19TUElOX0lOSVQoKSAoYmVmb3JlIHNwaW4gbG9vcCksCisgICAgICAgIEtNUF9GU1lOQ19TUElOX1BSRVBBUkUoKSAod2hpdGhpbiB0aGUgc3BpbiBsb29wKSwgYW5kIEtNUF9GU1lOQ19TUElOX0FDUVVJUkVEKCkuCisgICAgICAgIFNlZSBLTVBfV0FJVF9ZSUVMRCgpIGZvciBleGFtcGxlLgorICAgICovCisKKyAgICAjdW5kZWYgIEtNUF9GU1lOQ19TUElOX0lOSVQKKyAgICAjZGVmaW5lIEtNUF9GU1lOQ19TUElOX0lOSVQoIG9iaiwgc3BpbiApICAgIFwKKyAgICAgICAgaW50IHN5bmNfaXRlcnMgPSAwOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCBfX2l0dF9mc3luY19wcmVwYXJlX3B0ciApIHsgICAgICAgIFwKKyAgICAgICAgICAgIGlmICggb2JqID09IE5VTEwgKSB7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBvYmogPSBzcGluOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gLyogaWYgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAvKiBpZiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgU1NDX01BUktfU1BJTl9TVEFSVCgpCisKKyAgICAjdW5kZWYgIEtNUF9GU1lOQ19TUElOX1BSRVBBUkUKKyAgICAjZGVmaW5lIEtNUF9GU1lOQ19TUElOX1BSRVBBUkUoIG9iaiApIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCBfX2l0dF9mc3luY19wcmVwYXJlX3B0ciAmJiBzeW5jX2l0ZXJzIDwgX19rbXBfaXR0X3ByZXBhcmVfZGVsYXkgKSB7IFwKKyAgICAgICAgICAgICsrIHN5bmNfaXRlcnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICggc3luY19pdGVycyA+PSBfX2ttcF9pdHRfcHJlcGFyZV9kZWxheSApIHsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBLTVBfRlNZTkNfUFJFUEFSRSggKHZvaWQqKSBvYmogKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gLyogaWYgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAvKiBpZiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgfSB3aGlsZSAoMCkKKyAgICAjdW5kZWYgIEtNUF9GU1lOQ19TUElOX0FDUVVJUkVECisgICAgI2RlZmluZSBLTVBfRlNZTkNfU1BJTl9BQ1FVSVJFRCggb2JqICkgZG8geyAgICAgICAgIFwKKyAgICAgICAgU1NDX01BUktfU1BJTl9FTkQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIHN5bmNfaXRlcnMgPj0gX19rbXBfaXR0X3ByZXBhcmVfZGVsYXkgKSB7ICBcCisgICAgICAgICAgICBLTVBfRlNZTkNfQUNRVUlSRUQoICh2b2lkKikgb2JqICk7ICAgICAgICAgIFwKKyAgICAgICAgfSAvKiBpZiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB9IHdoaWxlICgwKQorCisgICAgLyogSVRUIHdpbGwgbm90IHJlcG9ydCBvYmplY3RzIGNyZWF0ZWQgd2l0aGluIEtNUF9JVFRfSUdOT1JFKCksIGUuIGcuOgorICAgICAgICAgICBLTVBfSVRUX0lHTk9SRSgKKyAgICAgICAgICAgICAgIHB0ciA9IG1hbGxvYyggc2l6ZSApOworICAgICAgICAgICApOworICAgICovCisgICAgI2RlZmluZSBLTVBfSVRUX0lHTk9SRSggc3RhdGVtZW50ICkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfX2l0dF9zdGF0ZV90IF9faXR0X3N0YXRlXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoIF9faXR0X3N0YXRlX2dldF9wdHIgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX19pdHRfc3RhdGVfID0gX19pdHRfc3RhdGVfZ2V0KCk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX19pdHRfb2JqX21vZGVfc2V0KCBfX2l0dF9vYmpfcHJvcF9pZ25vcmUsIF9faXR0X29ial9zdGF0ZV9zZXQgKTsgXAorICAgICAgICAgICAgfSAgLyogaWYgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyBzdGF0ZW1lbnQgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKCBfX2l0dF9zdGF0ZV9nZXRfcHRyICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIF9faXR0X3N0YXRlX3NldCggX19pdHRfc3RhdGVfICk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgLyogaWYgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisKKyAgICBjb25zdCBpbnQgS01QX01BWF9GUkFNRV9ET01BSU5TID0gNTEyOyAvLyBNYXhpbXVtIG51bWJlciBvZiBmcmFtZSBkb21haW5zIHRvIHVzZSAobWFwcyB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpZmZlcmVudCBPcGVuTVAgcmVnaW9ucyBpbiB0aGUgdXNlciBzb3VyY2UgY29kZSkuCisgICAgZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF9mcmFtZV9kb21haW5fY291bnQ7CisgICAgZXh0ZXJuIF9faXR0X2RvbWFpbiogX19rbXBfaXR0X2RvbWFpbnNbS01QX01BWF9GUkFNRV9ET01BSU5TXTsKKyNlbHNlCisKKy8vIE51bGwgZGVmaW5pdGlvbnMgb2YgdGhlIHN5bmNocm9uaXphdGlvbiB0cmFjaW5nIGZ1bmN0aW9ucy4KKyMgZGVmaW5lIEtNUF9GU1lOQ19QUkVQQVJFKCAgIG9iaiApICAgICAgICAoKHZvaWQpMCkKKyMgZGVmaW5lIEtNUF9GU1lOQ19DQU5DRUwoICAgIG9iaiApICAgICAgICAoKHZvaWQpMCkKKyMgZGVmaW5lIEtNUF9GU1lOQ19BQ1FVSVJFRCggIG9iaiApICAgICAgICAoKHZvaWQpMCkKKyMgZGVmaW5lIEtNUF9GU1lOQ19SRUxFQVNJTkcoIG9iaiApICAgICAgICAoKHZvaWQpMCkKKworIyBkZWZpbmUgS01QX0ZTWU5DX1NQSU5fSU5JVCggb2JqLCBzcGluICkgICgodm9pZCkwKQorIyBkZWZpbmUgS01QX0ZTWU5DX1NQSU5fUFJFUEFSRSggIG9iaiApICAgICgodm9pZCkwKQorIyBkZWZpbmUgS01QX0ZTWU5DX1NQSU5fQUNRVUlSRUQoIG9iaiApICAgICgodm9pZCkwKQorCisjIGRlZmluZSBLTVBfSVRUX0lHTk9SRShzdG10ICkgZG8geyBzdG10IH0gd2hpbGUgKDApCisKKyNlbmRpZiAvLyBVU0VfSVRUX05PVElGWQorCisjaWYgISBLTVBfREVCVUcKKyAgICAvLyBJbiByZWxlYXNlIG1vZGUgaW5jbHVkZSBkZWZpbml0aW9ucyBvZiBpbmxpbmUgZnVuY3Rpb25zLgorICAgICNpbmNsdWRlICJrbXBfaXR0LmlubCIKKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX0lUVF9ICisKKyNlbHNlICAvKiBVU0VfSVRUX0JVSUxEICovCisKKy8vIE51bGwgZGVmaW5pdGlvbnMgb2YgdGhlIHN5bmNocm9uaXphdGlvbiB0cmFjaW5nIGZ1bmN0aW9ucy4KKy8vIElmIFVTRV9JVFRfQlVMSUQgaXMgbm90IGVuYWJsZWQsIFVTRV9JVFRfTk9USUZZIGNhbm5vdCBiZSBlaXRoZXIuCisvLyBCeSBkZWZpbmluZyB0aGVzZSB3ZSBhdm9pZCB1bnBsZWFzYW50IGlmZGVmIHRlc3RzIGluIG1hbnkgcGxhY2VzLgorIyBkZWZpbmUgS01QX0ZTWU5DX1BSRVBBUkUoICAgb2JqICkgICAgICAgICgodm9pZCkwKQorIyBkZWZpbmUgS01QX0ZTWU5DX0NBTkNFTCggICAgb2JqICkgICAgICAgICgodm9pZCkwKQorIyBkZWZpbmUgS01QX0ZTWU5DX0FDUVVJUkVEKCAgb2JqICkgICAgICAgICgodm9pZCkwKQorIyBkZWZpbmUgS01QX0ZTWU5DX1JFTEVBU0lORyggb2JqICkgICAgICAgICgodm9pZCkwKQorCisjIGRlZmluZSBLTVBfRlNZTkNfU1BJTl9JTklUKCBvYmosIHNwaW4gKSAgKCh2b2lkKTApCisjIGRlZmluZSBLTVBfRlNZTkNfU1BJTl9QUkVQQVJFKCAgb2JqICkgICAgKCh2b2lkKTApCisjIGRlZmluZSBLTVBfRlNZTkNfU1BJTl9BQ1FVSVJFRCggb2JqICkgICAgKCh2b2lkKTApCisKKyMgZGVmaW5lIEtNUF9JVFRfSUdOT1JFKHN0bXQgKSBkbyB7IHN0bXQgfSB3aGlsZSAoMCkKKworIyBkZWZpbmUgVVNFX0lUVF9CVUlMRF9BUkcoeCkKKworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9pdHQuaW5sIGIvZmluYWwvcnVudGltZS9zcmMva21wX2l0dC5pbmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY5NTNkMAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9pdHQuaW5sCkBAIC0wLDAgKzEsODUxIEBACisjaWYgVVNFX0lUVF9CVUlMRAorLyoKKyAqIGttcF9pdHQuaW5sIC0tIElubGluZSBmdW5jdGlvbnMgb2YgSVRUIE5vdGlmeS4KKyAqICRSZXZpc2lvbjogNDI4NjYgJAorICogJERhdGU6IDIwMTMtMTItMTAgMTU6MTU6NTggLTA2MDAgKFR1ZSwgMTAgRGVjIDIwMTMpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLy8gSW5saW5lIGZ1bmN0aW9uIGRlZmluaXRpb25zLiBUaGlzIGZpbGUgc2hvdWxkIGJlIGluY2x1ZGVkIGludG8ga21wX2l0dC5oIGZpbGUgZm9yIHByb2RpY3Rpb24KKy8vIGJ1aWxkICh0byBsZXQgY29tcGxpbGVyIGlubGluZSBmdW5jdGlvbnMpIG9yIGludG8ga21wX2l0dC5jIGZpbGUgZm9yIGRlYnVnIGJ1aWxkICh0byByZWR1Y2UKKy8vIHRoZSBudW1iZXIgb2YgZmlsZXMgdG8gcmVjb21waWxlIGFuZCBzYXZlIGJ1aWxkIHRpbWUpLgorCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfc3RyLmgiCisKKyNpZiBLTVBfSVRUX0RFQlVHCisgICAgZXh0ZXJuIGttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2l0dF9kZWJ1Z19sb2NrOworICAgICNkZWZpbmUgS01QX0lUVF9ERUJVR19MT0NLKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX2l0dF9kZWJ1Z19sb2NrICk7ICAgICAgXAorICAgIH0KKyAgICAjZGVmaW5lIEtNUF9JVFRfREVCVUdfUFJJTlQoIC4uLiApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiIyUwMmQ6ICIsIF9fa21wX2dldF9ndGlkKCkgKTsgICAgICAgICAgICAgIFwKKyAgICAgICAgZnByaW50Ziggc3RkZXJyLCBfX1ZBX0FSR1NfXyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZmZsdXNoKCBzdGRlcnIgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiBfX2ttcF9pdHRfZGVidWdfbG9jayApOyAgICAgIFwKKyAgICB9CisjZWxzZQorICAgICNkZWZpbmUgS01QX0lUVF9ERUJVR19MT0NLKCkKKyAgICAjZGVmaW5lIEtNUF9JVFRfREVCVUdfUFJJTlQoIC4uLiApCisjZW5kaWYgLy8gS01QX0lUVF9ERUJVRworCisvLyBFbnN1cmUgdGhhdCB0aGUgZnVuY3Rpb25zIGFyZSBzdGF0aWMgaWYgdGhleSdyZSBzdXBwb3NlZCB0byBiZQorLy8gYmVpbmcgaW5saW5lZC4gT3RoZXJ3aXNlIHRoZXkgY2Fubm90IGJlIHVzZWQgaW4gbW9yZSB0aGFuIG9uZSBmaWxlLAorLy8gc2luY2UgdGhlcmUgd2lsbCBiZSBtdWx0aXBsZSBkZWZpbml0aW9ucy4KKyNpZiBLTVBfREVCVUcKKyMgZGVmaW5lIExJTktBR0UKKyNlbHNlCisjIGRlZmluZSBMSU5LQUdFIHN0YXRpYyBpbmxpbmUKKyNlbmRpZgorCisvLyBaQ0EgaW50ZXJmYWNlIHVzZWQgYnkgSW50ZWwoUikgSW5zcGVjdG9yLiBJbnRlbChSKSBQYXJhbGxlbCBBbXBsaWZpZXIgdXNlcyB0aGlzCisvLyBBUEkgdG8gc3VwcG9ydCB1c2VyLWRlZmluZWQgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXMsIGJ1dCBkb2VzIG5vdCB1c2UgWkNBOworLy8gaXQgd291bGQgYmUgc2FmZSB0byB0dXJuIHRoaXMgb2ZmIHVudGlsIHdpZGVyIHN1cHBvcnQgYmVjb21lcyBhdmFpbGFibGUuCisjaWYgVVNFX0lUVF9aQ0EKKyNpZmRlZiBfX0lOVEVMX0NPTVBJTEVSCisjICAgaWYgX19JTlRFTF9DT01QSUxFUiA+PSAxMjAwCisjICAgICAgIHVuZGVmIF9faXR0X3N5bmNfYWNxdWlyZWQKKyMgICAgICAgdW5kZWYgX19pdHRfc3luY19yZWxlYXNpbmcKKyMgICAgICAgZGVmaW5lIF9faXR0X3N5bmNfYWNxdWlyZWQoYWRkcikgICAgX19ub3RpZnlfemNfaW50cmluc2ljKChjaGFyICopInN5bmNfYWNxdWlyZWQiLCBhZGRyKQorIyAgICAgICBkZWZpbmUgX19pdHRfc3luY19yZWxlYXNpbmcoYWRkcikgICBfX25vdGlmeV9pbnRyaW5zaWMoKGNoYXIgKikic3luY19yZWxlYXNpbmciLCBhZGRyKQorIyAgIGVuZGlmCisjZW5kaWYKKyNlbmRpZgorCisvKgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFBhcmFsbGVsIHJlZ2lvbiByZXBvcnRpbmcuCisKKyAgICAgICAgKiBfX2ttcF9pdHRfcmVnaW9uX2Zvcmtpbmcgc2hvdWxkIGJlIGNhbGxlZCBieSBtYXN0ZXIgdGhyZWFkIG9mIGEgdGVhbS4gRXhhY3QgbW9tZW50IG9mCisgICAgICAgICAgY2FsbCBkb2VzIG5vdCBtYXR0ZXIsIGJ1dCBpdCBzaG91bGQgYmUgY29tcGxldGVkIGJlZm9yZSBhbnkgdGhyZWFkIG9mIHRoaXMgdGVhbSBjYWxscworICAgICAgICAgIF9fa21wX2l0dF9yZWdpb25fc3RhcnRpbmcuCisgICAgICAgICogX19rbXBfaXR0X3JlZ2lvbl9zdGFydGluZyBzaG91bGQgYmUgY2FsbGVkIGJ5IGVhY2ggdGhyZWFkIG9mIGEgdGVhbSBqdXN0IGJlZm9yZSBlbnRlcmluZworICAgICAgICAgIHBhcmFsbGVsIHJlZ2lvbiBib2R5LgorICAgICAgICAqIF9fa21wX2l0dF9yZWdpb25fZmluaXNoZWQgc2hvdWxkIGJlIGNhbGxlZCBieSBlYWNoIHRocmVhZCBvZiBhIHRlYW0gcmlnaHQgYWZ0ZXIgcmV0dXJuaW5nCisgICAgICAgICAgZnJvbSBwYXJhbGxlbCByZWdpb24gYm9keS4KKyAgICAgICAgKiBfX2ttcF9pdHRfcmVnaW9uX2pvaW5lZCBzaG91bGQgYmUgY2FsbGVkIGJ5IG1hc3RlciB0aHJlYWQgb2YgYSB0ZWFtLCBhZnRlciBhbGwgdGhyZWFkcworICAgICAgICAgIGNhbGxlZCBfX2ttcF9pdHRfcmVnaW9uX2ZpbmlzaGVkLgorCisgICAgTm90ZTogVGhyZWFkIHdhaXRpbmcgYXQgam9pbiBiYXJyaWVyIChhZnRlciBfX2ttcF9pdHRfcmVnaW9uX2ZpbmlzaGVkKSBjYW4gZXhlY3V0ZSBzb21lIG1vcmUKKyAgICB1c2VyIGNvZGUgLS0gc3VjaCBhIHRocmVhZCBjYW4gZXhlY3V0ZSB0YXNrcy4KKworICAgIE5vdGU6IFRoZSBvdmVyaGVhZCBvZiBsb2dnaW5nIHJlZ2lvbl9zdGFydGluZyBhbmQgcmVnaW9uX2ZpbmlzaGVkIGluIGVhY2ggdGhyZWFkIGlzIHRvbyBsYXJnZSwKKyAgICBzbyB0aGVzZSBjYWxscyBhcmUgbm90IHVzZWQuCisKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTElOS0FHRSB2b2lkCitfX2ttcF9pdHRfcmVnaW9uX2ZvcmtpbmcoIGludCBndGlkLCBpbnQgc2VyaWFsaXplZCApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGttcF90ZWFtX3QgKiAgICAgIHRlYW0gPSBfX2ttcF90ZWFtX2Zyb21fZ3RpZCggZ3RpZCApOworI2lmIE9NUF8zMF9FTkFCTEVECisgICAgaWYgKHRlYW0tPnQudF9hY3RpdmVfbGV2ZWwgKyBzZXJpYWxpemVkID4gMSkKKyNlbmRpZgorICAgIHsKKyAgICAgICAgLy8gVGhlIGZyYW1lIG5vdGlmaWNhdGlvbnMgYXJlIG9ubHkgc3VwcG9ydGVkIGZvciB0aGUgb3V0ZXJtb3N0IHRlYW1zLgorICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlkZW50X3QgKiAgICAgICAgIGxvYyAgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCBndGlkICktPnRoLnRoX2lkZW50OworICAgIGlmIChsb2MpIHsKKyAgICAgICAgLy8gVXNlIHRoZSByZXNlcnZlZF8yIGZpZWxkIHRvIHN0b3JlIHRoZSBpbmRleCB0byB0aGUgcmVnaW9uIGRvbWFpbi4KKyAgICAgICAgLy8gQXNzdW1lIHRoYXQgcmVzZXJ2ZWRfMiBjb250YWlucyB6ZXJvIGluaXRpYWxseS4gIFNpbmNlIHplcm8gaXMgc3BlY2lhbAorICAgICAgICAvLyB2YWx1ZSBoZXJlLCBzdG9yZSB0aGUgaW5kZXggaW50byBkb21haW4gYXJyYXkgaW5jcmVhc2VkIGJ5IDEuCisgICAgICAgIGlmIChsb2MtPnJlc2VydmVkXzIgPT0gMCkgeworICAgICAgICAgICAgaWYgKF9fa21wX2ZyYW1lX2RvbWFpbl9jb3VudCA8IEtNUF9NQVhfRlJBTUVfRE9NQUlOUykgeworICAgICAgICAgICAgICAgIGludCBmcm0gPSBLTVBfVEVTVF9USEVOX0lOQzMyKCAmIF9fa21wX2ZyYW1lX2RvbWFpbl9jb3VudCApOyAvLyBnZXQgIm9sZCIgdmFsdWUKKyAgICAgICAgICAgICAgICBpZiAoZnJtID49IEtNUF9NQVhfRlJBTUVfRE9NQUlOUykgeworICAgICAgICAgICAgICAgICAgICBLTVBfVEVTVF9USEVOX0RFQzMyKCAmIF9fa21wX2ZyYW1lX2RvbWFpbl9jb3VudCApOyAgICAgICAvLyByZXZlcnQgdGhlIGNvdW50CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgLy8gbG9jLT5yZXNlcnZlZF8yIGlzIHN0aWxsIDAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy9pZiAoIUtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMiggJmxvYy0+cmVzZXJ2ZWRfMiwgMCwgZnJtICsgMSApKSB7CisgICAgICAgICAgICAgICAgLy8gICAgZnJtID0gbG9jLT5yZXNlcnZlZF8yIC0gMTsgICAvLyBnZXQgdmFsdWUgc2F2ZWQgYnkgb3RoZXIgdGhyZWFkIGZvciBzYW1lIGxvYworICAgICAgICAgICAgICAgIC8vfSAvLyBBQzogdGhpcyBibG9jayBpcyB0byByZXBsYWNlIG5leHQgdW5zeW5jaHJvbml6ZWQgbGluZQorICAgICAgICAgICAgICAgIGxvYy0+cmVzZXJ2ZWRfMiA9IGZybSArIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzYXZlICJuZXciIHZhbHVlCisKKyAgICAgICAgICAgICAgICAvLyBUcmFuc2Zvcm0gY29tcGlsZXItZ2VuZXJhdGVkIHJlZ2lvbiBsb2NhdGlvbiBpbnRvIHRoZSBmb3JtYXQKKyAgICAgICAgICAgICAgICAvLyB0aGF0IHRoZSB0b29scyBtb3JlIG9yIGxlc3Mgc3RhbmRhcmRpemVkIG9uOgorICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8ZnVuYz4kb21wJHBhcmFsbGVsQFtmaWxlOl08bGluZT5bOjxjb2w+XSIKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZiA9IE5VTEw7CisgICAgICAgICAgICAgICAga21wX3N0cl9sb2NfdCBzdHJfbG9jID0gX19rbXBfc3RyX2xvY19pbml0KCBsb2MtPnBzb3VyY2UsIDEgKTsKKyAgICAgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgiJXMkb21wJHBhcmFsbGVsQCVzOiVkOiVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfbG9jLmZ1bmMsIHN0cl9sb2MuZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfbG9jLmxpbmUsIHN0cl9sb2MuY29sKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfbG9jX2ZyZWUoICZzdHJfbG9jICk7CisKKyAgICAgICAgICAgICAgICBfX2l0dF9zdXBwcmVzc19wdXNoKF9faXR0X3N1cHByZXNzX21lbW9yeV9lcnJvcnMpOworICAgICAgICAgICAgICAgIF9fa21wX2l0dF9kb21haW5zWyBmcm0gXSA9IF9faXR0X2RvbWFpbl9jcmVhdGUoIGJ1ZmYgKTsKKyAgICAgICAgICAgICAgICBfX2l0dF9zdXBwcmVzc19wb3AoKTsKKworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgICAgIF9faXR0X2ZyYW1lX2JlZ2luX3YzKF9fa21wX2l0dF9kb21haW5zWyBmcm0gXSwgTlVMTCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7IC8vIGlmIGl0IGlzIG5vdCAwIHRoZW4gaXQgc2hvdWxkIGJlIDw9IEtNUF9NQVhfRlJBTUVfRE9NQUlOUworICAgICAgICAgICAgX19pdHRfZnJhbWVfYmVnaW5fdjMoX19rbXBfaXR0X2RvbWFpbnNbbG9jLT5yZXNlcnZlZF8yIC0gMV0sIE5VTEwpOworICAgICAgICB9CisgICAgICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgICAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW2ZybSBiZWddIGd0aWQ9JWQsIGlkeD0lZCwgc2VyaWFsaXplZDolZCwgbG9jOiVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIGxvYy0+cmVzZXJ2ZWRfMiAtIDEsIHNlcmlhbGl6ZWQsIGxvYyApOworICAgIH0KKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfcmVnaW9uX2ZvcmtpbmcKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMSU5LQUdFIHZvaWQKK19fa21wX2l0dF9mcmFtZV9zdWJtaXQoIGludCBndGlkLCBfX2l0dF90aW1lc3RhbXAgYmVnaW4sIF9faXR0X3RpbWVzdGFtcCBlbmQsIGludCBpbWJhbGFuY2UsIGlkZW50X3QgKiBsb2MgKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgaWYgKGxvYykgeworICAgICAgICAgICAgaWYgKGxvYy0+cmVzZXJ2ZWRfMiA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKF9fa21wX2ZyYW1lX2RvbWFpbl9jb3VudCA8IEtNUF9NQVhfRlJBTUVfRE9NQUlOUykgeworICAgICAgICAgICAgICAgICAgICBpbnQgZnJtID0gS01QX1RFU1RfVEhFTl9JTkMzMiggJiBfX2ttcF9mcmFtZV9kb21haW5fY291bnQgKTsgLy8gZ2V0ICJvbGQiIHZhbHVlCisgICAgICAgICAgICAgICAgICAgIGlmIChmcm0gPj0gS01QX01BWF9GUkFNRV9ET01BSU5TKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfVEVTVF9USEVOX0RFQzMyKCAmIF9fa21wX2ZyYW1lX2RvbWFpbl9jb3VudCApOyAgICAgICAvLyByZXZlcnQgdGhlIGNvdW50CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYy0+cmVzZXJ2ZWRfMiBpcyBzdGlsbCAwCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gU2hvdWxkIGl0IGJlIHN5bmNocm9uaXplZD8gU2VlIHRoZSBjb21tZW50IGluIF9fa21wX2l0dF9yZWdpb25fZm9ya2luZworICAgICAgICAgICAgICAgICAgICBsb2MtPnJlc2VydmVkXzIgPSBmcm0gKyAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSAibmV3IiB2YWx1ZQorCisgICAgICAgICAgICAgICAgICAgIC8vIFRyYW5zZm9ybSBjb21waWxlci1nZW5lcmF0ZWQgcmVnaW9uIGxvY2F0aW9uIGludG8gdGhlIGZvcm1hdAorICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IHRoZSB0b29scyBtb3JlIG9yIGxlc3Mgc3RhbmRhcmRpemVkIG9uOgorICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGZ1bmM+JG9tcCRmcmFtZUBbZmlsZTpdPGxpbmU+Wzo8Y29sPl0iCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAga21wX3N0cl9sb2NfdCBzdHJfbG9jID0gX19rbXBfc3RyX2xvY19pbml0KCBsb2MtPnBzb3VyY2UsIDEgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGltYmFsYW5jZSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KCIlcyRvbXAkYmFycmllci1pbWJhbGFuY2VAJXM6JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2xvYy5mdW5jLCBzdHJfbG9jLmZpbGUsIHN0cl9sb2MuY29sKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KCIlcyRvbXAkYmFycmllckAlczolZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfbG9jLmZ1bmMsIHN0cl9sb2MuZmlsZSwgc3RyX2xvYy5jb2wpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9sb2NfZnJlZSggJnN0cl9sb2MgKTsKKworICAgICAgICAgICAgICAgICAgICBfX2l0dF9zdXBwcmVzc19wdXNoKF9faXR0X3N1cHByZXNzX21lbW9yeV9lcnJvcnMpOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9pdHRfZG9tYWluc1sgZnJtIF0gPSBfX2l0dF9kb21haW5fY3JlYXRlKCBidWZmICk7CisgICAgICAgICAgICAgICAgICAgIF9faXR0X3N1cHByZXNzX3BvcCgpOworCisgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgICAgICAgICBfX2l0dF9mcmFtZV9zdWJtaXRfdjMoX19rbXBfaXR0X2RvbWFpbnNbIGZybSBdLCBOVUxMLCBiZWdpbiwgZW5kICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsgLy8gaWYgaXQgaXMgbm90IDAgdGhlbiBpdCBzaG91bGQgYmUgPD0gS01QX01BWF9GUkFNRV9ET01BSU5TCisgICAgICAgICAgICAgICAgX19pdHRfZnJhbWVfc3VibWl0X3YzKF9fa21wX2l0dF9kb21haW5zW2xvYy0+cmVzZXJ2ZWRfMiAtIDFdLCBOVUxMLCBiZWdpbiwgZW5kICk7CisgICAgICAgICAgICB9CisgICAgfQorCisjZW5kaWYKK30gLy8gX19rbXBfaXR0X2ZyYW1lX3N1Ym1pdAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0xJTktBR0Ugdm9pZAorX19rbXBfaXR0X3JlZ2lvbl9zdGFydGluZyggaW50IGd0aWQgKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfcmVnaW9uX3N0YXJ0aW5nCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTElOS0FHRSB2b2lkCitfX2ttcF9pdHRfcmVnaW9uX2ZpbmlzaGVkKCBpbnQgZ3RpZCApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorI2VuZGlmCit9IC8vIF9fa21wX2l0dF9yZWdpb25fZmluaXNoZWQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMSU5LQUdFIHZvaWQKK19fa21wX2l0dF9yZWdpb25fam9pbmVkKCBpbnQgZ3RpZCwgaW50IHNlcmlhbGl6ZWQgKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBrbXBfdGVhbV90ICogICAgICB0ZWFtID0gX19rbXBfdGVhbV9mcm9tX2d0aWQoIGd0aWQgKTsKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgIGlmICh0ZWFtLT50LnRfYWN0aXZlX2xldmVsICsgc2VyaWFsaXplZCA+IDEpCisjZW5kaWYKKyAgICB7CisgICAgICAgIC8vIFRoZSBmcmFtZSBub3RpZmljYXRpb25zIGFyZSBvbmx5IHN1cHBvcnRlZCBmb3IgdGhlIG91dGVybW9zdCB0ZWFtcy4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZGVudF90ICogICAgICAgICBsb2MgID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZCggZ3RpZCApLT50aC50aF9pZGVudDsKKyAgICBpZiAobG9jICYmIGxvYy0+cmVzZXJ2ZWRfMiAmJiBsb2MtPnJlc2VydmVkXzIgPD0gS01QX01BWF9GUkFNRV9ET01BSU5TKSB7CisgICAgICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgICAgICBfX2l0dF9mcmFtZV9lbmRfdjMoX19rbXBfaXR0X2RvbWFpbnNbbG9jLT5yZXNlcnZlZF8yIC0gMV0sIE5VTEwpOworICAgICAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW2ZybSBlbmRdIGd0aWQ9JWQsIGlkeD0lZCwgc2VyaWFsaXplZDolZCwgbG9jOiVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIGxvYy0+cmVzZXJ2ZWRfMiAtIDEsIHNlcmlhbGl6ZWQsIGxvYyApOworICAgIH0KKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfcmVnaW9uX2pvaW5lZAorCisvKgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEJhcnJpZXJzIHJlcG9ydGluZy4KKworICAgIEEgYmFycmllciBjb25zaXN0cyBvZiB0d28gcGhhc2VzOgorCisgICAgICAgIDEuIEdhdGhlciAtLSBtYXN0ZXIgd2FpdHMgZm9yIGFycml2aW5nIG9mIGFsbCB0aGUgd29ya2VyIHRocmVhZHM7IGVhY2ggd29ya2VyIHRocmVhZAorICAgICAgICAgICByZWdpc3RlcnMgYXJyaXZhbCBhbmQgZ29lcyBmdXJ0aGVyLgorICAgICAgICAyLiBSZWxlYXNlIC0tIGVhY2ggd29ya2VyIHRocmVhZHMgd2FpdHMgdW50aWwgbWFzdGVyIGxldHMgaXQgZ287IG1hc3RlciBsZXRzIHdvcmtlciB0aHJlYWRzCisgICAgICAgICAgIGdvLgorCisgICAgRnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBieSBlYWNoIHRocmVhZDoKKworICAgICAgICAqIF9fa21wX2l0dF9iYXJyaWVyX3N0YXJ0aW5nKCkgLS0gYmVmb3JlIGFycml2aW5nIHRvIHRoZSBnYXRoZXIgcGhhc2UuCisgICAgICAgICogX19rbXBfaXR0X2JhcnJpZXJfbWlkZGxlKCkgICAtLSBiZXR3ZWVuIGdhdGhlciBhbmQgcmVsZWFzZSBwaGFzZXMuCisgICAgICAgICogX19rbXBfaXR0X2JhcnJpZXJfZmluaXNoZWQoKSAtLSBhZnRlciByZWxlYXNlIHBoYXNlLgorCisgICAgTm90ZTogQ2FsbCBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoKSBiZWZvcmUgY2FsbCB0byBfX2ttcF9pdHRfYmFycmllcl9zdGFydGluZygpIGFuZCBzYXZlCisgICAgcmVzdWx0IGluIGxvY2FsIHZhcmlhYmxlLiBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoKSwgYmVpbmcgY2FsbGVkIHRvbyBsYXRlIChlLiBnLiBhZnRlciBnYXRoZXIKKyAgICBwaGFzZSkgd291bGQgcmV0dXJuIGl0dCBzeW5jIG9iamVjdCBmb3IgdGhlIG5leHQgYmFycmllciEKKworICAgIElUVCBuZWVkIGFuIGFkZHJlc3MgKHZvaWQgKikgdG8gYmUgc3BlY2lmaWVkIGFzIGEgc3luYyBvYmplY3QuIE9wZW5NUCBSVEwgZG9lcyBub3QgaGF2ZQorICAgIGJhcnJpZXIgb2JqZWN0IG9yIGJhcnJpZXIgZGF0YSBzdHJ1Y3R1cmUuIEJhcnJpZXIgaXMganVzdCBhIGNvdW50ZXIgaW4gdGVhbSBhbmQgdGhyZWFkCisgICAgc3RydWN0dXJlcy4gV2UgY291bGQgdXNlIGFuIGFkZHJlc3Mgb2YgdGVhbSBzdHJ1Y3R1cmUgYXMgYW4gYmFycmllciBzeW5jIG9iamVjdCwgYnV0IElUVCB3YW50cworICAgIGRpZmZlcmVudCBvYmplY3RzIGZvciBkaWZmZXJlbnQgYmFycmllcnMgKGV2ZW4gd2hpdGhpbiB0aGUgc2FtZSB0ZWFtKS4gU28gbGV0IHVzIHVzZQorICAgIHRlYW0gYWRkcmVzcyBhcyBiYXJyaWVyIHN5bmMgb2JqZWN0IGZvciB0aGUgZmlyc3QgYmFycmllciwgdGhlbiBpbmNyZWFzZSBpdCBieSBvbmUgZm9yIHRoZSBuZXh0CisgICAgYmFycmllciwgYW5kIHNvIG9uIChidXQgd3JhcCBpdCBub3QgdG8gdXNlIGFkZHJlc3NlcyBvdXRzaWRlIG9mIHRlYW0gc3RydWN0dXJlKS4KKworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKwordm9pZCAqCitfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoCisgICAgaW50ICBndGlkLAorICAgIGludCAgYnQsCisgICAgaW50ICBzZXRfbmFtZSwKKyAgICBpbnQgIGRlbHRhICAgIC8vIDAgKGN1cnJlbnQgYmFycmllcikgaXMgZGVmYXVsdCB2YWx1ZTsgc3BlY2lmeSAtMSB0byBnZXQgcHJldmlvdXMgYmFycmllci4KKykgeworICAgIHZvaWQgKiBvYmplY3QgPSBOVUxMOworI2lmIFVTRV9JVFRfTk9USUZZCisgICAga21wX2luZm9fdCAqICAgIHRociAgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAga21wX3RlYW1fdCAqICAgIHRlYW0gPSB0aHItPnRoLnRoX3RlYW07CisKKyAgICAvLyBOT1RFOgorICAgIC8vIElmIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBfX2ttcF9mb3JrX2JhcnJpZXIsIHRlYW0gcG9pbnRlciBjYW4gYmUgTlVMTC4gVGhpcyAiaWYiCisgICAgLy8gaGVscHMgdG8gYXZvaWQgY3Jhc2guIEhvd2V2ZXIsIHRoaXMgaXMgbm90IGNvbXBsZXRlIHNvbHV0aW9uLCBhbmQgcmVwb3J0aW5nIGZvcmsvam9pbgorICAgIC8vIGJhcnJpZXJzIHRvIElUVCBzaG91bGQgYmUgcmV2aXNpdGVkLgorCisgICAgaWYgKCB0ZWFtICE9IE5VTEwgKSB7CisKKyAgICAgICAgLy8gTWFzdGVyIHRocmVhZCBpbmNyZWFzZXMgYl9hcnJpdmVkIGJ5IEtNUF9CQVJSSUVSX1NUQVRFX0JVTVAgZWFjaCB0aW1lLiBEaXZpZGUgYl9hcnJpdmVkCisgICAgICAgIC8vIGJ5IEtNUF9CQVJSSUVSX1NUQVRFX0JVTVAgdG8gZ2V0IHBsYWluIGJhcnJpZXIgY291bnRlci4KKyAgICAgICAga21wX3VpbnQgY291bnRlciA9IHRlYW0tPnQudF9iYXJbIGJ0IF0uYl9hcnJpdmVkIC8gS01QX0JBUlJJRVJfU1RBVEVfQlVNUCArIGRlbHRhOworICAgICAgICAvLyBOb3cgZm9ybSB0aGUgYmFycmllciBpZC4gRW5jb2RlIGJhcnJpZXIgdHlwZSAoYnQpIGluIGJhcnJpZXIgaWQgdG9vLCBzbyBiYXJyaWVycyBvZgorICAgICAgICAvLyBkaWZmZXJlbnQgdHlwZXMgZG8gbm90IGhhdmUgdGhlIHNhbWUgaWRzLgorICAgICAgICBLTVBfQlVJTERfQVNTRVJUKCBzaXplb2YoIGttcF90ZWFtX3QgKSA+PSBic19sYXN0X2JhcnJpZXIgKTsKKyAgICAgICAgICAgIC8vIFRoaXMgY29uZGl0b24gaXMgYSBtdXN0ICh3ZSB3b3VsZCBoYXZlIHplcm8gZGl2aWRlIG90aGVyd2lzZSkuCisgICAgICAgIEtNUF9CVUlMRF9BU1NFUlQoIHNpemVvZigga21wX3RlYW1fdCApID49IDIgKiBic19sYXN0X2JhcnJpZXIgKTsKKyAgICAgICAgICAgIC8vIE1vcmUgc3Ryb25nIGNvbmRpdGlvbjogbWFrZSBzdXJlIHdlIGhhdmUgcm9vbSBhdCBsZWFzdCBmb3IgZm9yIHR3byBkaWZmZXJ0ZW50IGlkcworICAgICAgICAgICAgLy8gKGZvciBlYWNoIGJhcnJpZXIgdHlwZSkuCisgICAgICAgIG9iamVjdCA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PCB2b2lkICogPigKKyAgICAgICAgICAgICAgICBrbXBfdWludHB0cl90KCB0ZWFtICkKKyAgICAgICAgICAgICAgICAgICAgKyBjb3VudGVyICUgKCBzaXplb2YoIGttcF90ZWFtX3QgKSAvIGJzX2xhc3RfYmFycmllciApICogYnNfbGFzdF9iYXJyaWVyCisgICAgICAgICAgICAgICAgICAgICsgYnQKKyAgICAgICAgICAgICk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgICAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW2JhciBvYmpdIHR5cGU9JWQsIGNvdW50ZXI9JWQsIG9iamVjdD0lcFxuIiwgYnQsIGNvdW50ZXIsIG9iamVjdCApOworCisgICAgICAgIGlmICggc2V0X25hbWUgKSB7CisgICAgICAgICAgICBpZGVudF90IGNvbnN0ICogbG9jICA9IE5VTEw7CisgICAgICAgICAgICBjaGFyIGNvbnN0ICogICAgc3JjICA9IE5VTEw7CisgICAgICAgICAgICBjaGFyIGNvbnN0ICogICAgdHlwZSA9ICJPTVAgQmFycmllciI7CisgICAgICAgICAgICBzd2l0Y2ggKCBidCApIHsKKyAgICAgICAgICAgICAgICBjYXNlIGJzX3BsYWluX2JhcnJpZXIgOiB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZvciBwbGFpbiBiYXJyaWVyIGNvbXBpbGVyIGNhbGxzIF9fa21wY19iYXJyaWVyKCkgZnVuY3Rpb24sIHdoaWNoIHNhdmVzCisgICAgICAgICAgICAgICAgICAgIC8vIGxvY2F0aW9uIGluIHRoci0+dGgudGhfaWRlbnQuCisgICAgICAgICAgICAgICAgICAgIGxvYyA9IHRoci0+dGgudGhfaWRlbnQ7CisgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgYmFycmllciB0eXBlIGZyb20gZmxhZ3MgcHJvdmlkZWQgYnkgY29tcGlsZXIuCisgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiAgIGV4cGwgPSAwOworICAgICAgICAgICAgICAgICAgICBrbXBfdWludDMyICBpbXBsID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBsb2MgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYyAgPSBsb2MtPnBzb3VyY2U7CisgICAgICAgICAgICAgICAgICAgICAgICBleHBsID0gKCBsb2MtPmZsYWdzICYgS01QX0lERU5UX0JBUlJJRVJfRVhQTCApICE9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBpbXBsID0gKCBsb2MtPmZsYWdzICYgS01QX0lERU5UX0JBUlJJRVJfSU1QTCApICE9IDA7CisgICAgICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgICAgIGlmICggaW1wbCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoIGxvYy0+ZmxhZ3MgJiBLTVBfSURFTlRfQkFSUklFUl9JTVBMX01BU0sgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLTVBfSURFTlRfQkFSUklFUl9JTVBMX0ZPUiA6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJPTVAgRm9yIEJhcnJpZXIiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLTVBfSURFTlRfQkFSUklFUl9JTVBMX1NFQ1RJT05TIDogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gIk9NUCBTZWN0aW9ucyBCYXJyaWVyIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS01QX0lERU5UX0JBUlJJRVJfSU1QTF9TSU5HTEUgOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAiT01QIFNpbmdsZSBCYXJyaWVyIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS01QX0lERU5UX0JBUlJJRVJfSU1QTF9XT1JLU0hBUkUgOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAiT01QIFdvcmtzaGFyZSBCYXJyaWVyIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAiT01QIEltcGxpY2l0IEJhcnJpZXIiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAwICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH07IC8qIHN3aXRjaCAqLworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBleHBsICkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJPTVAgRXhwbGljaXQgQmFycmllciI7CisgICAgICAgICAgICAgICAgICAgIH07IC8qIGlmICovCisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGJzX2Zvcmtqb2luX2JhcnJpZXIgOiB7CisgICAgICAgICAgICAgICAgICAgIC8vIEluIGNhc2Ugb2YgZm9yay9qb2luIGJhcnJpZXIgd2UgY2FuIHJlYWQgdGhyLT50aC50aF9pZGVudCwgYmVjYXVzZSBpdAorICAgICAgICAgICAgICAgICAgICAvLyBjb250YWlucyBsb2NhdGlvbiBvZiBsYXN0IHBhc3NlZCBjb25zdHJ1Y3QgKHdoaWxlIGpvaW4gYmFycmllciBpcyBub3QKKyAgICAgICAgICAgICAgICAgICAgLy8gc3VjaCBvbmUpLiBVc2UgdGhfaWRlbnQgb2YgbWFzdGVyIHRocmVhZCBpbnN0ZWFkIC0tIF9fa21wX2pvaW5fY2FsbCgpCisgICAgICAgICAgICAgICAgICAgIC8vIGNhbGxlZCBieSB0aGUgbWFzdGVyIHRocmVhZCBzYXZlcyBsb2NhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgLy8gQUM6IGNhbm5vdCByZWFkIGZyb20gbWFzdGVyIGJlY2F1c2UgX19rbXBfam9pbl9jYWxsIG1heSBiZSBub3QgY2FsbGVkCisgICAgICAgICAgICAgICAgICAgIC8vICAgIHlldCwgc28gd2UgcmVhZCB0aGUgbG9jYXRpb24gZnJvbSB0ZWFtLiBUaGlzIGlzIHRoZSBzYW1lIGxvY2F0aW9uLgorICAgICAgICAgICAgICAgICAgICAvLyAgICBBbmQgdGVhbSBpcyB2YWxpZCBhdCB0aGUgZW50ZXIgdG8gam9pbiBiYXJyaWVyIHdoZXJlIHRoaXMgaGFwcGVucy4KKyAgICAgICAgICAgICAgICAgICAgbG9jICA9IHRlYW0tPnQudF9pZGVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBsb2MgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYyAgPSBsb2MtPnBzb3VyY2U7CisgICAgICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAiT01QIEpvaW4gQmFycmllciI7CisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIH07IC8vIHN3aXRjaAorICAgICAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgICAgICBfX2l0dF9zeW5jX2NyZWF0ZSggb2JqZWN0LCB0eXBlLCBzcmMsIF9faXR0X2F0dHJfYmFycmllciApOworICAgICAgICAgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltiYXIgc3RhXSBzY3JlKCAlcCwgXCIlc1wiLCBcIiVzXCIsIF9faXR0X2F0dHJfYmFycmllciApXG4iLCBvYmplY3QsIHR5cGUsIHNyYyApOworICAgICAgICB9OyAvLyBpZgorCisgICAgfTsgLy8gaWYKKyNlbmRpZgorICAgIHJldHVybiBvYmplY3Q7Cit9IC8vIF9fa21wX2l0dF9iYXJyaWVyX29iamVjdAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQKK19fa21wX2l0dF9iYXJyaWVyX3N0YXJ0aW5nKCBpbnQgZ3RpZCwgdm9pZCAqIG9iamVjdCApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggIUtNUF9NQVNURVJfR1RJRCggZ3RpZCApICkgeworICAgICAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICAgICAgX19pdHRfc3luY19yZWxlYXNpbmcoIG9iamVjdCApOworICAgICAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW2JhciBzdGFdIHNyZWwoICVwIClcbiIsIG9iamVjdCApOworICAgIH07IC8vIGlmCisgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgX19pdHRfc3luY19wcmVwYXJlKCBvYmplY3QgKTsKKyAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW2JhciBzdGFdIHNwcmUoICVwIClcbiIsIG9iamVjdCApOworI2VuZGlmCit9IC8vIF9fa21wX2l0dF9iYXJyaWVyX3N0YXJ0aW5nCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZAorX19rbXBfaXR0X2JhcnJpZXJfbWlkZGxlKCBpbnQgZ3RpZCwgdm9pZCAqIG9iamVjdCApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggS01QX01BU1RFUl9HVElEKCBndGlkICkgKSB7CisgICAgICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgICAgICBfX2l0dF9zeW5jX2FjcXVpcmVkKCBvYmplY3QgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltiYXIgbWlkXSBzYWNxKCAlcCApXG4iLCBvYmplY3QgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgIF9faXR0X3N5bmNfcmVsZWFzaW5nKCBvYmplY3QgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltiYXIgbWlkXSBzcmVsKCAlcCApXG4iLCBvYmplY3QgKTsKKyAgICB9IGVsc2UgeworICAgIH07IC8vIGlmCisjZW5kaWYKK30gLy8gX19rbXBfaXR0X2JhcnJpZXJfbWlkZGxlCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZAorX19rbXBfaXR0X2JhcnJpZXJfZmluaXNoZWQoIGludCBndGlkLCB2b2lkICogb2JqZWN0ICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgaWYgKCBLTVBfTUFTVEVSX0dUSUQoIGd0aWQgKSApIHsKKyAgICB9IGVsc2UgeworICAgICAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICAgICAgX19pdHRfc3luY19hY3F1aXJlZCggb2JqZWN0ICk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbYmFyIGVuZF0gc2FjcSggJXAgKVxuIiwgb2JqZWN0ICk7CisgICAgfTsgLy8gaWYKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfYmFycmllcl9maW5pc2hlZAorCisjaWYgT01QXzMwX0VOQUJMRUQKKworLyoKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBUYXNrd2FpdCByZXBvcnRpbmcuCisKKyAgICBJVFQgbmVlZCBhbiBhZGRyZXNzICh2b2lkICopIHRvIGJlIHNwZWNpZmllZCBhcyBhIHN5bmMgb2JqZWN0LiBPcGVuTVAgUlRMIGRvZXMgbm90IGhhdmUgdGFza3dhaXQKKyAgICBzdHJ1Y3R1cmUsIHNvIHdlIG5lZWQgdG8gY29uc3RydWN0IHNvbWV0aGluZy4KKworKi8KKwordm9pZCAqCitfX2ttcF9pdHRfdGFza3dhaXRfb2JqZWN0KCBpbnQgZ3RpZCApIHsKKyAgICB2b2lkICogb2JqZWN0ID0gTlVMTDsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggX19pdHRfc3luY19jcmVhdGVfcHRyICkgeworICAgICAgICBrbXBfaW5mb190ICogICAgIHRocmVhZCAgID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZCggZ3RpZCApOworICAgICAgICBrbXBfdGFza2RhdGFfdCAqIHRhc2tkYXRhID0gdGhyZWFkIC0+IHRoLnRoX2N1cnJlbnRfdGFzazsKKyAgICAgICAgb2JqZWN0ID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8IHZvaWQgKiA+KAorICAgICAgICAgICAgICAgIGttcF91aW50cHRyX3QoIHRhc2tkYXRhICkgKyB0YXNrZGF0YS0+dGRfdGFza3dhaXRfY291bnRlciAlIHNpemVvZigga21wX3Rhc2tkYXRhX3QgKQorICAgICAgICAgICAgKTsKKyAgICB9OyAvLyBpZgorI2VuZGlmCisgICAgcmV0dXJuIG9iamVjdDsKK30gLy8gX19rbXBfaXR0X3Rhc2t3YWl0X29iamVjdAorCit2b2lkCitfX2ttcF9pdHRfdGFza3dhaXRfc3RhcnRpbmcoCisgICAgaW50ICAgICBndGlkLAorICAgIHZvaWQgKiAgb2JqZWN0CispIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGttcF9pbmZvX3QgKiAgICAgdGhyZWFkICAgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAga21wX3Rhc2tkYXRhX3QgKiB0YXNrZGF0YSA9IHRocmVhZCAtPiB0aC50aF9jdXJyZW50X3Rhc2s7CisgICAgaWRlbnRfdCBjb25zdCAqICBsb2MgICAgICA9IHRhc2tkYXRhLT50ZF90YXNrd2FpdF9pZGVudDsKKyAgICBjaGFyIGNvbnN0ICogICAgIHNyYyAgICAgID0gKCBsb2MgPT0gTlVMTD8gTlVMTCA6IGxvYy0+cHNvdXJjZSApOworICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgIF9faXR0X3N5bmNfY3JlYXRlKCBvYmplY3QsICJPTVAgVGFza3dhaXQiLCBzcmMsIDAgKTsKKyAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW3R3YSBzdGFdIHNjcmUoICVwLCBcIk9NUCBUYXNrd2FpdFwiLCBcIiVzXCIsIDAgKVxuIiwgb2JqZWN0LCBzcmMgKTsKKyAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICBfX2l0dF9zeW5jX3ByZXBhcmUoIG9iamVjdCApOworICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbdHdhIHN0YV0gc3ByZSggJXAgKVxuIiwgb2JqZWN0ICk7CisjZW5kaWYKK30gLy8gX19rbXBfaXR0X3Rhc2t3YWl0X3N0YXJ0aW5nCisKK3ZvaWQKK19fa21wX2l0dF90YXNrd2FpdF9maW5pc2hlZCgKKyAgICBpbnQgICAgIGd0aWQsCisgICAgdm9pZCAqICBvYmplY3QKKykgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgX19pdHRfc3luY19hY3F1aXJlZCggb2JqZWN0ICk7CisgICAgS01QX0lUVF9ERUJVR19QUklOVCggIlt0d2EgZW5kXSBzYWNxKCAlcCApXG4iLCBvYmplY3QgKTsKKyAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICBfX2l0dF9zeW5jX2Rlc3Ryb3koIG9iamVjdCApOworICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbdHdhIGVuZF0gc2RlcyggJXAgKVxuIiwgb2JqZWN0ICk7CisjZW5kaWYKK30gLy8gX19rbXBfaXR0X3Rhc2t3YWl0X2ZpbmlzaGVkCisKKy8qCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgVGFzayByZXBvcnRpbmcuCisKKyAgICBPbmx5IHRob3NlIHRhc2tzIGFyZSByZXBvcnRlZCB3aGljaCBhcmUgZXhlY3V0ZWQgYnkgYSB0aHJlYWQgc3Bpbm5pbmcgYXQgYmFycmllciAob3IgdGFza3dhaXQpLgorICAgIFN5bmNoIG9iamVjdCBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uIG11c3QgYmUgYmFycmllciBvZiB0YXNrd2FpdCB0aGUgdGhyZWFkcyB3YWl0aW5nIGF0LgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKwordm9pZAorX19rbXBfaXR0X3Rhc2tfc3RhcnRpbmcoCisgICAgdm9pZCAqIG9iamVjdCAgICAgLy8gSVRUIHN5bmMgb2JqZWN0OiBiYXJyaWVyIG9yIHRhc2t3YWl0LgorKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoIG9iamVjdCAhPSBOVUxMICkgeworICAgICAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICAgICAgX19pdHRfc3luY19jYW5jZWwoIG9iamVjdCApOworICAgICAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW3RzayBzdGFdIHNjYW4oICVwIClcbiIsIG9iamVjdCApOworICAgIH07IC8vIGlmCisjZW5kaWYKK30gLy8gX19rbXBfaXR0X3Rhc2tfc3RhcnRpbmcKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkCitfX2ttcF9pdHRfdGFza19maW5pc2hlZCgKKyAgICB2b2lkICogb2JqZWN0ICAgICAvLyBJVFQgc3luYyBvYmplY3Q6IGJhcnJpZXIgb3IgdGFza3dhaXQuCispIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgIF9faXR0X3N5bmNfcHJlcGFyZSggb2JqZWN0ICk7CisgICAgS01QX0lUVF9ERUJVR19QUklOVCggIlt0c2sgZW5kXSBzcHJlKCAlcCApXG4iLCBvYmplY3QgKTsKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfdGFza19maW5pc2hlZAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNlbmRpZiAvKiBPTVBfMzBfRU5BQkxFRCAqLworCisvKgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIExvY2sgcmVwb3J0aW5nLgorCisgICAgICAgICogX19rbXBfaXR0X2xvY2tfY3JlYXRpbmcoIGxvY2sgKSBzaG91bGQgYmUgY2FsbGVkICpiZWZvcmUqIHRoZSBmaXJzdCBsb2NrIG9wZXJhdGlvbgorICAgICAgICAgIChzZXQvdW5zZXQpLiBJdCBpcyBub3QgYSByZWFsIGV2ZW50IHNob3duIHRvIHRoZSB1c2VyIGJ1dCBqdXN0IHNldHRpbmcgYSBuYW1lIGZvcgorICAgICAgICAgIHN5bmNocm9uaXphdGlvbiBvYmplY3QuIGBsb2NrJyBpcyBhbiBhZGRyZXNzIG9mIHN5bmMgb2JqZWN0LCB0aGUgc2FtZSBhZGRyZXNzIHNob3VsZCBiZQorICAgICAgICAgIHVzZWQgaW4gYWxsIHN1YnNlcXVlbnQgY2FsbHMuCisKKyAgICAgICAgKiBfX2ttcF9pdHRfbG9ja19hY3F1aXJpbmcoKSBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBzZXR0aW5nIHRoZSBsb2NrLgorCisgICAgICAgICogX19rbXBfaXR0X2xvY2tfYWNxdWlyZWQoKSBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHNldHRpbmcgdGhlIGxvY2suCisKKyAgICAgICAgKiBfX2ttcF9pdHRfbG9ja19yZWFsZWFzaW5nKCkgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgdW5zZXR0aW5nIHRoZSBsb2NrLgorCisgICAgICAgICogX19rbXBfaXR0X2xvY2tfY2FuY2VsbGVkKCkgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciB0aHJlYWQgY2FuY2VsbGVkIHdhaXRpbmcgZm9yIHRoZSBsb2NrLgorCisgICAgICAgICogX19rbXBfaXR0X2xvY2tfZGVzdHJveWVkKCBsb2NrICkgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciB0aGUgbGFzdCBsb2NrIG9wZXJhdGlvbi4gQWZ0ZXIKKyAgICAgICAgICBfX2ttcF9pdHRfbG9ja19kZXN0cm95ZWQoKSBhbGwgdGhlIHJlZmVyZW5jZXMgdG8gdGhlIHNhbWUgYWRkcmVzcyB3aWxsIGJlIGNvbnNpZGVyZWQKKyAgICAgICAgICBhcyBhbm90aGVyIHN5bmMgb2JqZWN0LCBub3QgcmVsYXRlZCB3aXRoIHRoZSBvcmlnaW5hbCBvbmUuCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEludGVybmFsIGd1dHMgLS0gY29tbW9uIGNvZGUgZm9yIGxvY2tzIGFuZCBjcml0aWNhbCBzZWN0aW9ucywgZG8gbm90IGNhbGwgZGlyZWN0bHkuCitfX2ttcF9pbmxpbmUKK3ZvaWQKK19fX2ttcF9pdHRfbG9ja19pbml0KCBrbXBfdXNlcl9sb2NrX3AgbG9jaywgY2hhciBjb25zdCAqIHR5cGUgKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoIF9faXR0X3N5bmNfY3JlYXRlX3B0ciApIHsKKyAgICAgICAgaWRlbnRfdCBjb25zdCAqIGxvYyA9IE5VTEw7CisgICAgICAgIGlmICggX19rbXBfZ2V0X3VzZXJfbG9ja19sb2NhdGlvbl8gIT0gTlVMTCApCisgICAgICAgICAgICBsb2MgPSBfX2ttcF9nZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyggKGxvY2spICk7CisgICAgICAgIGNoYXIgY29uc3QgKiAgICBzcmMgPSAoIGxvYyA9PSBOVUxMID8gTlVMTCA6IGxvYy0+cHNvdXJjZSApOworICAgICAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICAgICAgX19pdHRfc3luY19jcmVhdGUoIGxvY2ssIHR5cGUsIHNyYywgMCApOworICAgICAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW2xjayBpbmldIHNjcmUoICVwLCBcIiVzXCIsIFwiJXNcIiwgMCApXG4iLCBsb2NrLCB0eXBlLCBzcmMgKTsKKyAgICB9OyAvLyBpZgorI2VuZGlmCit9IC8vIF9fX2ttcF9pdHRfbG9ja19pbml0CisKKy8vIEludGVybmFsIGd1dHMgLS0gY29tbW9uIGNvZGUgZm9yIGxvY2tzIGFuZCBjcml0aWNhbCBzZWN0aW9ucywgZG8gbm90IGNhbGwgZGlyZWN0bHkuCitfX2ttcF9pbmxpbmUKK3ZvaWQKK19fX2ttcF9pdHRfbG9ja19maW5pKCBrbXBfdXNlcl9sb2NrX3AgbG9jaywgY2hhciBjb25zdCAqIHR5cGUgKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICBfX2l0dF9zeW5jX2Rlc3Ryb3koIGxvY2sgKTsKKyAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW2xjayBkc3RdIHNkZXMoICVwIClcbiIsIGxvY2sgKTsKKyNlbmRpZgorfSAvLyBfX19rbXBfaXR0X2xvY2tfZmluaQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZAorX19rbXBfaXR0X2xvY2tfY3JlYXRpbmcoIGttcF91c2VyX2xvY2tfcCBsb2NrICkgeworICAgIF9fX2ttcF9pdHRfbG9ja19pbml0KCBsb2NrLCAiT01QIExvY2siICk7Cit9IC8vIF9fa21wX2l0dF9sb2NrX2NyZWF0aW5nCisKK3ZvaWQKK19fa21wX2l0dF9sb2NrX2FjcXVpcmluZygga21wX3VzZXJfbG9ja19wIGxvY2sgKSB7CisgICAgX19pdHRfc3luY19wcmVwYXJlKCBsb2NrICk7Cit9IC8vIF9fa21wX2l0dF9sb2NrX2FjcXVpcmluZworCit2b2lkCitfX2ttcF9pdHRfbG9ja19hY3F1aXJlZCgga21wX3VzZXJfbG9ja19wIGxvY2sgKSB7CisgICAgX19pdHRfc3luY19hY3F1aXJlZCggbG9jayApOworfSAvLyBfX2ttcF9pdHRfbG9ja19hY3F1aXJlZAorCit2b2lkCitfX2ttcF9pdHRfbG9ja19yZWxlYXNpbmcoIGttcF91c2VyX2xvY2tfcCBsb2NrICkgeworICAgIF9faXR0X3N5bmNfcmVsZWFzaW5nKCBsb2NrICk7Cit9IC8vIF9fa21wX2l0dF9sb2NrX3JlbGVhc2luZworCit2b2lkCitfX2ttcF9pdHRfbG9ja19jYW5jZWxsZWQoIGttcF91c2VyX2xvY2tfcCBsb2NrICkgeworICAgIF9faXR0X3N5bmNfY2FuY2VsKCBsb2NrICk7Cit9IC8vIF9fa21wX2l0dF9sb2NrX2NhbmNlbGxlZAorCit2b2lkCitfX2ttcF9pdHRfbG9ja19kZXN0cm95ZWQoIGttcF91c2VyX2xvY2tfcCBsb2NrICkgeworICAgIF9fX2ttcF9pdHRfbG9ja19maW5pKCBsb2NrLCAiT01QIExvY2siICk7Cit9IC8vIF9fa21wX2l0dF9sb2NrX2Rlc3Ryb3llZAorCisvKgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIENyaXRpY2FsIHJlcG9ydGluZy4KKworICAgIENyaXRpY2FsIHNlY3Rpb25zIGFyZSB0cmVhdGVkIGV4YWN0bHkgYXMgbG9ja3MgKGJ1dCBoYXZlIGRpZmZlcmVudCBvYmplY3QgdHlwZSkuCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCit2b2lkCitfX2ttcF9pdHRfY3JpdGljYWxfY3JlYXRpbmcoIGttcF91c2VyX2xvY2tfcCBsb2NrICkgeworICAgIF9fX2ttcF9pdHRfbG9ja19pbml0KCBsb2NrLCAiT01QIENyaXRpY2FsIiApOworfSAvLyBfX2ttcF9pdHRfY3JpdGljYWxfY3JlYXRpbmcKKwordm9pZAorX19rbXBfaXR0X2NyaXRpY2FsX2FjcXVpcmluZygga21wX3VzZXJfbG9ja19wIGxvY2sgKSB7CisgICAgX19pdHRfc3luY19wcmVwYXJlKCBsb2NrICk7Cit9IC8vIF9fa21wX2l0dF9jcml0aWNhbF9hY3F1aXJpbmcKKwordm9pZAorX19rbXBfaXR0X2NyaXRpY2FsX2FjcXVpcmVkKCBrbXBfdXNlcl9sb2NrX3AgbG9jayApIHsKKyAgICBfX2l0dF9zeW5jX2FjcXVpcmVkKCBsb2NrICk7Cit9IC8vIF9fa21wX2l0dF9jcml0aWNhbF9hY3F1aXJlZAorCit2b2lkCitfX2ttcF9pdHRfY3JpdGljYWxfcmVsZWFzaW5nKCBrbXBfdXNlcl9sb2NrX3AgbG9jayApIHsKKyAgICBfX2l0dF9zeW5jX3JlbGVhc2luZyggbG9jayApOworfSAvLyBfX2ttcF9pdHRfY3JpdGljYWxfcmVsZWFzaW5nCisKK3ZvaWQKK19fa21wX2l0dF9jcml0aWNhbF9kZXN0cm95ZWQoIGttcF91c2VyX2xvY2tfcCBsb2NrICkgeworICAgIF9fX2ttcF9pdHRfbG9ja19maW5pKCBsb2NrLCAiT01QIENyaXRpY2FsIiApOworfSAvLyBfX2ttcF9pdHRfY3JpdGljYWxfZGVzdHJveWVkCisKKy8qCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2luZ2xlIHJlcG9ydGluZy4KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKK3ZvaWQKK19fa21wX2l0dF9zaW5nbGVfc3RhcnQoIGludCBndGlkICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgaWYgKCBfX2l0dF9tYXJrX2NyZWF0ZV9wdHIgfHwgS01QX0lUVF9ERUJVRyApIHsKKyAgICAgICAga21wX2luZm9fdCAqICAgdGhyID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZCggKGd0aWQpICk7CisgICAgICAgIGlkZW50X3QgKiAgICAgIGxvYyA9IHRoci0+dGgudGhfaWRlbnQ7CisgICAgICAgIGNoYXIgY29uc3QgKiAgIHNyYyA9ICggbG9jID09IE5VTEwgPyBOVUxMIDogbG9jLT5wc291cmNlICk7CisgICAgICAgIGttcF9zdHJfYnVmX3QgIG5hbWU7CisgICAgICAgIF9fa21wX3N0cl9idWZfaW5pdCggJiBuYW1lICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgbmFtZSwgIk9NUCBTaW5nbGUtJXMiLCBzcmMgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgIHRoci0+dGgudGhfaXR0X21hcmtfc2luZ2xlID0gX19pdHRfbWFya19jcmVhdGUoIG5hbWUuc3RyICk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbc2luIHN0YV0gbWNyZSggXCIlc1wiKSAtPiAlZFxuIiwgbmFtZS5zdHIsIHRoci0+dGgudGhfaXR0X21hcmtfc2luZ2xlICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSggJiBuYW1lICk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgICAgICBfX2l0dF9tYXJrKCB0aHItPnRoLnRoX2l0dF9tYXJrX3NpbmdsZSwgTlVMTCApOworICAgICAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW3NpbiBzdGFdIG1hcmsoICVkLCBOVUxMIClcbiIsIHRoci0+dGgudGhfaXR0X21hcmtfc2luZ2xlICk7CisgICAgfTsgLy8gaWYKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfc2luZ2xlX3N0YXJ0CisKK3ZvaWQKK19fa21wX2l0dF9zaW5nbGVfZW5kKCBpbnQgZ3RpZCApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIF9faXR0X21hcmtfdHlwZSAgbWFyayA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGd0aWQgKS0+dGgudGhfaXR0X21hcmtfc2luZ2xlOworICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgIF9faXR0X21hcmtfb2ZmKCBtYXJrICk7CisgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltzaW4gZW5kXSBtb2ZmKCAlZCApXG4iLCBtYXJrICk7CisjZW5kaWYKK30gLy8gX19rbXBfaXR0X3NpbmdsZV9lbmQKKworLyoKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBPcmRlcmVkIHJlcG9ydGluZy4KKworICAgIF9fa21wX2l0dF9vcmRlcmVkX2luaXQgaXMgY2FsbGVkIGJ5IGVhY2ggdGhyZWFkICpiZWZvcmUqIGZpcnN0IHVzaW5nIHN5bmMKKyAgICBvYmplY3QuIElUVCB0ZWFtIHdvdWxkIGxpa2UgaXQgdG8gYmUgY2FsbGVkIG9uY2UsIGJ1dCBpdCByZXF1aXJlcyBleHRyYSBzeW5jaHJvbml6YXRpb24uCisKKyAgICBfX2ttcF9pdHRfb3JkZXJlZF9wcmVwIGlzIGNhbGxlZCB3aGVuIHRocmVhZCBpcyBnb2luZyB0byBlbnRlciBvcmRlcmVkIHNlY3Rpb24KKyAgICAoYmVmb3JlIHN5bmNocm9uaXphdGlvbikuCisKKyAgICBfX2ttcF9pdHRfb3JkZXJlZF9zdGFydCBpcyBjYWxsZWQganVzdCBiZWZvcmUgZW50ZXJpbmcgdXNlciBjb2RlIChhZnRlcgorICAgIHN5bmNocm9uaXphdGlvbikuCisKKyAgICBfX2ttcF9pdHRfb3JkZXJlZF9lbmQgaXMgY2FsbGVkIGFmdGVyIHJldHVybmluZyBmcm9tIHVzZXIgY29kZS4KKworICAgIFN5bmMgb2JqZWN0IGlzIHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZGlzcGF0Y2hfc2hfY3VycmVudC4KKworICAgIEV2ZW50cyBhcmUgbm90IGdlbmVyYXRlZCBpbiBjYXNlIG9mIHNlcmlhbGl6ZWQgdGVhbS4KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKK3ZvaWQKK19fa21wX2l0dF9vcmRlcmVkX2luaXQoIGludCBndGlkICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgaWYgKCBfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgKSB7CisgICAgICAgIGttcF9pbmZvX3QgKiAgIHRociAgID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZCggZ3RpZCApOworICAgICAgICBpZGVudF90IGNvbnN0ICogbG9jICA9IHRoci0+dGgudGhfaWRlbnQ7CisgICAgICAgIGNoYXIgY29uc3QgKiAgICBzcmMgID0gKCBsb2MgPT0gTlVMTCA/IE5VTEwgOiBsb2MtPnBzb3VyY2UgKTsKKyAgICAgICAgX19pdHRfc3luY19jcmVhdGUoCisgICAgICAgICAgICB0aHItPnRoLnRoX2Rpc3BhdGNoLT50aF9kaXNwYXRjaF9zaF9jdXJyZW50LCAiT01QIE9yZGVyZWQiLCBzcmMsIDAKKyAgICAgICAgKTsKKyAgICB9OyAvLyBpZgorI2VuZGlmCit9IC8vIF9fa21wX2l0dF9vcmRlcmVkX2luaXQKKwordm9pZAorX19rbXBfaXR0X29yZGVyZWRfcHJlcCggaW50IGd0aWQgKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoIF9faXR0X3N5bmNfY3JlYXRlX3B0ciApIHsKKyAgICAgICAga21wX3RlYW1fdCAqIHQgPSBfX2ttcF90ZWFtX2Zyb21fZ3RpZCggZ3RpZCApOworICAgICAgICBpZiAoICEgdC0+dC50X3NlcmlhbGl6ZWQgKSB7CisgICAgICAgICAgICBrbXBfaW5mb190ICogdGggPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAgICAgICAgICBfX2l0dF9zeW5jX3ByZXBhcmUoIHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZGlzcGF0Y2hfc2hfY3VycmVudCApOworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGlmCisjZW5kaWYKK30gLy8gX19rbXBfaXR0X29yZGVyZWRfcHJlcAorCit2b2lkCitfX2ttcF9pdHRfb3JkZXJlZF9zdGFydCggaW50IGd0aWQgKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoIF9faXR0X3N5bmNfY3JlYXRlX3B0ciApIHsKKyAgICAgICAga21wX3RlYW1fdCAqIHQgPSBfX2ttcF90ZWFtX2Zyb21fZ3RpZCggZ3RpZCApOworICAgICAgICBpZiAoICEgdC0+dC50X3NlcmlhbGl6ZWQgKSB7CisgICAgICAgICAgICBrbXBfaW5mb190ICogdGggPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAgICAgICAgICBfX2l0dF9zeW5jX2FjcXVpcmVkKCB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rpc3BhdGNoX3NoX2N1cnJlbnQgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBpZgorI2VuZGlmCit9IC8vIF9fa21wX2l0dF9vcmRlcmVkX3N0YXJ0CisKK3ZvaWQKK19fa21wX2l0dF9vcmRlcmVkX2VuZCggaW50IGd0aWQgKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoIF9faXR0X3N5bmNfY3JlYXRlX3B0ciApIHsKKyAgICAgICAga21wX3RlYW1fdCAqIHQgPSBfX2ttcF90ZWFtX2Zyb21fZ3RpZCggZ3RpZCApOworICAgICAgICBpZiAoICEgdC0+dC50X3NlcmlhbGl6ZWQgKSB7CisgICAgICAgICAgICBrbXBfaW5mb190ICogdGggPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAgICAgICAgICBfX2l0dF9zeW5jX3JlbGVhc2luZyggdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kaXNwYXRjaF9zaF9jdXJyZW50ICk7CisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gaWYKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfb3JkZXJlZF9lbmQKKworCisvKgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFRocmVhZHMgcmVwb3J0aW5nLgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKwordm9pZAorX19rbXBfaXR0X3RocmVhZF9pZ25vcmUoKSB7CisgICAgX19pdHRfdGhyX2lnbm9yZSgpOworfSAvLyBfX2ttcF9pdHRfdGhyZWFkX2lnbm9yZQorCit2b2lkCitfX2ttcF9pdHRfdGhyZWFkX25hbWUoIGludCBndGlkICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgaWYgKCBfX2l0dF90aHJfbmFtZV9zZXRfcHRyICkgeworICAgICAgICBrbXBfc3RyX2J1Zl90IG5hbWU7CisgICAgICAgIF9fa21wX3N0cl9idWZfaW5pdCggJiBuYW1lICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgbmFtZSwgIk9NUCBXb3JrZXIgVGhyZWFkICMlZCIsIGd0aWQgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgIF9faXR0X3Rocl9uYW1lX3NldCggbmFtZS5zdHIsIG5hbWUudXNlZCApOworICAgICAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW3RociBuYW1dIG5hbWUoIFwiJXNcIilcbiIsIG5hbWUuc3RyICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSggJiBuYW1lICk7CisgICAgfTsgLy8gaWYKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfdGhyZWFkX25hbWUKKworCisvKgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU3lzdGVtIG9iamVjdCByZXBvcnRpbmcuCisKKyAgICBJVFQgY2F0Y2hlcyBvcGVyYXRpb25zIHdpdGggc3lzdGVtIHN5bmMgb2JqZWN0cyAobGlrZSBXaW5kb3dzKiBPUyBvbiBJQS0zMgorICAgIGFyY2hpdGVjdHVyZSBBUEkgY3JpdGljYWwgc2VjdGlvbnMgYW5kIGV2ZW50cykuIFdlIG9ubHkgbmVlZCB0byBzcGVjaWZ5CisgICAgbmFtZSAoIk9NUCBTY2hlZHVsZXIiKSBmb3IgdGhlIG9iamVjdCB0byBsZXQgSVRUIGtub3cgaXQgaXMgYW4gb2JqZWN0IHVzZWQKKyAgICBieSBPcGVuTVAgUlRMIGZvciBpbnRlcm5hbCBwdXJwb3Nlcy4KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKwordm9pZAorX19rbXBfaXR0X3N5c3RlbV9vYmplY3RfY3JlYXRlZCggdm9pZCAqIG9iamVjdCwgY2hhciBjb25zdCAqIG5hbWUgKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICBfX2l0dF9zeW5jX2NyZWF0ZSggb2JqZWN0LCAiT01QIFNjaGVkdWxlciIsIG5hbWUsIDAgKTsKKyAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbc3lzIG9ial0gc2NyZSggJXAsIFwiT01QIFNjaGVkdWxlclwiLCBcIiVzXCIsIDAgKVxuIiwgb2JqZWN0LCBuYW1lICk7CisjZW5kaWYKK30gLy8gX19rbXBfaXR0X3N5c3RlbV9vYmplY3RfY3JlYXRlZAorCisKKy8qCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU3RhY2sgc3RpdGNoaW5nIGFwaS4KKworICAgIE1hc3RlciBjYWxscyAiY3JlYXRlIiBhbmQgcHV0IHRoZSBzdGl0Y2hpbmcgaWQgaW50byB0ZWFtIHN0cnVjdHVyZS4KKyAgICBXb3JrZXJzIHJlYWQgdGhlIHN0aXRjaGluZyBpZCBhbmQgY2FsbCAiZW50ZXIiIC8gImxlYXZlIiBhcGkuCisgICAgTWFzdGVyIGNhbGxzICJkZXN0cm95IiBhdCB0aGUgZW5kIG9mIHRoZSBwYXJhbGxlbCByZWdpb24uCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCitfX2l0dF9jYWxsZXIKK19fa21wX2l0dF9zdGFja19jYWxsZXJfY3JlYXRlKCkKK3sKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggIV9faXR0X3N0YWNrX2NhbGxlcl9jcmVhdGVfcHRyICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgX19pdHRfY2FsbGVyIGlkID0gX19pdHRfc3RhY2tfY2FsbGVyX2NyZWF0ZSgpOworICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbc3RrIGNyZV0gJXBcbiIsIGlkICk7CisgICAgcmV0dXJuIGlkOworI2VuZGlmCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQKK19fa21wX2l0dF9zdGFja19jYWxsZXJfZGVzdHJveSggX19pdHRfY2FsbGVyIGlkICkKK3sKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggX19pdHRfc3RhY2tfY2FsbGVyX2Rlc3Ryb3lfcHRyICkgeworICAgICAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICAgICAgX19pdHRfc3RhY2tfY2FsbGVyX2Rlc3Ryb3koIGlkICk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbc3RrIGRlc10gJXBcbiIsIGlkICk7CisgICAgfQorI2VuZGlmCit9CisKK3ZvaWQKK19fa21wX2l0dF9zdGFja19jYWxsZWVfZW50ZXIoIF9faXR0X2NhbGxlciBpZCApCit7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoIF9faXR0X3N0YWNrX2NhbGxlZV9lbnRlcl9wdHIgKSB7CisgICAgICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgICAgICBfX2l0dF9zdGFja19jYWxsZWVfZW50ZXIoIGlkICk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbc3RrIGVudF0gJXBcbiIsIGlkICk7CisgICAgfQorI2VuZGlmCit9CisKK3ZvaWQKK19fa21wX2l0dF9zdGFja19jYWxsZWVfbGVhdmUoIF9faXR0X2NhbGxlciBpZCApCit7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoIF9faXR0X3N0YWNrX2NhbGxlZV9sZWF2ZV9wdHIgKSB7CisgICAgICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgICAgICBfX2l0dF9zdGFja19jYWxsZWVfbGVhdmUoIGlkICk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbc3RrIGxlYV0gJXBcbiIsIGlkICk7CisgICAgfQorI2VuZGlmCit9CisKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfbG9jay5jcHAgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfbG9jay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM5MjQ2MwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9sb2NrLmNwcApAQCAtMCwwICsxLDM4MzQgQEAKKy8qCisgKiBrbXBfbG9jay5jcHAgLS0gbG9jay1yZWxhdGVkIGZ1bmN0aW9ucworICogJFJldmlzaW9uOiA0MjgxMCAkCisgKiAkRGF0ZTogMjAxMy0xMS0wNyAxMjowNjozMyAtMDYwMCAoVGh1LCAwNyBOb3YgMjAxMykgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfaXR0LmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKyNpbmNsdWRlICJrbXBfbG9jay5oIgorI2luY2x1ZGUgImttcF9pby5oIgorCisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSkKKyMgaW5jbHVkZSA8dW5pc3RkLmg+CisjIGluY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisvLyBXZSBzaG91bGQgcmVhbGx5IGluY2x1ZGUgPGZ1dGV4Lmg+LCBidXQgdGhhdCBjYXVzZXMgY29tcGF0aWJpbGl0eSBwcm9ibGVtcyBvbiBkaWZmZXJlbnQKKy8vIExpbnV4KiBPUyBkaXN0cmlidXRpb25zIHRoYXQgZWl0aGVyIHJlcXVpcmUgdGhhdCB5b3UgaW5jbHVkZSAob3IgYnJlYWsgd2hlbiB5b3UgdHJ5IHRvIGluY2x1ZGUpCisvLyA8cGNpL3R5cGVzLmg+LgorLy8gU2luY2UgYWxsIHdlIG5lZWQgaXMgdGhlIHR3byBtYWNyb3MgYmVsb3cgKHdoaWNoIGFyZSBwYXJ0IG9mIHRoZSBrZXJuZWwgQUJJLCBzbyBjYW4ndCBjaGFuZ2UpCisvLyB3ZSBqdXN0IGRlZmluZSB0aGUgY29uc3RhbnRzIGhlcmUgYW5kIGRvbid0IGluY2x1ZGUgPGZ1dGV4Lmg+CisjIGlmbmRlZiBGVVRFWF9XQUlUCisjICBkZWZpbmUgRlVURVhfV0FJVCAgICAwCisjIGVuZGlmCisjIGlmbmRlZiBGVVRFWF9XQUtFCisjICBkZWZpbmUgRlVURVhfV0FLRSAgICAxCisjIGVuZGlmCisjZW5kaWYKKworCisjaWZuZGVmIEtNUF9ERUJVRworIyBkZWZpbmUgX19rbXBfc3RhdGljX2RlbGF5KCBhcmcgKSAgICAgLyogbm90aGluZyB0byBkbyAqLworI2Vsc2UKKworc3RhdGljIHZvaWQKK19fa21wX3N0YXRpY19kZWxheSggaW50IGFyZyApCit7CisvKiBXb3JrIGFyb3VuZCB3ZWlyZCBjb2RlLWdlbiBidWcgdGhhdCBjYXVzZXMgYXNzZXJ0IHRvIHRyaXAgKi8KKyMgaWYgS01QX0FSQ0hfWDg2XzY0ICYmIEtNUF9PU19MSU5VWAorICAgIEtNUF9BU1NFUlQoIGFyZyAhPSAwICk7CisjIGVsc2UKKyAgICBLTVBfQVNTRVJUKCBhcmcgPj0gMCApOworIyBlbmRpZgorfQorI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCitzdGF0aWMgdm9pZAorX19rbXBfc3RhdGljX3lpZWxkKCBpbnQgYXJnICkKK3sKKyAgICBfX2ttcF95aWVsZCggYXJnICk7Cit9CisKKy8qIEltcGxlbWVudCBzcGluIGxvY2tzIGZvciBpbnRlcm5hbCBsaWJyYXJ5IHVzZS4gICAgICAgICAgICAgKi8KKy8qIFRoZSBhbGdvcml0aG0gaW1wbGVtZW50ZWQgaXMgTGFtcG9ydCdzIGJha2VyeSBsb2NrIFsxOTc0XS4gKi8KKwordm9pZAorX19rbXBfdmFsaWRhdGVfbG9ja3MoIHZvaWQgKQoreworICAgIGludCBpOworICAgIGttcF91aW50MzIgIHgsIHk7CisKKyAgICAvKiBDaGVjayB0byBtYWtlIHN1cmUgdW5zaWduZWQgYXJpdGhtZXRpYyBkb2VzIHdyYXBzIHByb3Blcmx5ICovCisgICAgeCA9IH4oKGttcF91aW50MzIpIDApIC0gMjsKKyAgICB5ID0geCAtIDI7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgKytpLCArK3gsICsreSkgeworICAgICAgICBrbXBfdWludDMyIHogPSAoeCAtIHkpOworICAgICAgICBLTVBfQVNTRVJUKCB6ID09IDIgKTsKKyAgICB9CisKKyAgICBLTVBfQVNTRVJUKCBvZmZzZXRvZigga21wX2Jhc2VfcXVldWluZ19sb2NrLCB0YWlsX2lkICkgJSA4ID09IDAgKTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIHRlc3QgYW5kIHNldCBsb2NrcyAqLworCisvLworLy8gRm9yIHRoZSBub24tbmVzdGVkIGxvY2tzLCB3ZSBjYW4gb25seSBhc3N1bWUgdGhhdCB0aGUgZmlyc3QgNCBieXRlcyB3ZXJlCisvLyBhbGxvY2F0ZWQsIHNpbmNlIGdjYyBvbmx5IGFsbG9jYXRlcyA0IGJ5dGVzIGZvciBvbXBfbG9ja190LCBhbmQgdGhlIEludGVsCisvLyBjb21waWxlciBvbmx5IGFsbG9jYXRlcyBhIDQgYnl0ZSBwb2ludGVyIG9uIElBLTMyIGFyY2hpdGVjdHVyZS4gIE9uCisvLyBXaW5kb3dzKiBPUyBvbiBJbnRlbChSKSA2NCwgd2UgY2FuIGFzc3VtZSB0aGF0IGFsbCA4IGJ5dGVzIHdlcmUgYWxsb2NhdGVkLgorLy8KKy8vIGdjYyByZXNlcnZlcyA+PSA4IGJ5dGVzIGZvciBuZXN0ZWQgbG9ja3MsIHNvIHdlIGNhbiBhc3N1bWUgdGhhdCB0aGUKKy8vIGVudGlyZSA4IGJ5dGVzIHdlcmUgYWxsb2NhdGVkIGZvciBuZXN0ZWQgbG9ja3Mgb24gYWxsIDY0LWJpdCBwbGF0Zm9ybXMuCisvLworCitzdGF0aWMga21wX2ludDMyCitfX2ttcF9nZXRfdGFzX2xvY2tfb3duZXIoIGttcF90YXNfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBUQ1JfNCggbGNrLT5say5wb2xsICkgLSAxOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wKK19fa21wX2lzX3Rhc19sb2NrX25lc3RhYmxlKCBrbXBfdGFzX2xvY2tfdCAqbGNrICkKK3sKKyAgICByZXR1cm4gbGNrLT5say5kZXB0aF9sb2NrZWQgIT0gLTE7Cit9CisKK19fZm9yY2VpbmxpbmUgc3RhdGljIHZvaWQKK19fa21wX2FjcXVpcmVfdGFzX2xvY2tfdGltZWRfdGVtcGxhdGUoIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfTUIoKTsKKworI2lmZGVmIFVTRV9MT0NLX1BST0ZJTEUKKyAgICBrbXBfdWludDMyIGN1cnIgPSBUQ1JfNCggbGNrLT5say5wb2xsICk7CisgICAgaWYgKCAoIGN1cnIgIT0gMCApICYmICggY3VyciAhPSBndGlkICsgMSApICkKKyAgICAgICAgX19rbXBfcHJpbnRmKCAiTE9DSyBDT05URU5USU9OOiAlcFxuIiwgbGNrICk7CisgICAgLyogZWxzZSBfX2ttcF9wcmludGYoICIuIiApOyovCisjZW5kaWYgLyogVVNFX0xPQ0tfUFJPRklMRSAqLworCisgICAgaWYgKCAoIGxjay0+bGsucG9sbCA9PSAwICkKKyAgICAgICYmIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMiggJiAoIGxjay0+bGsucG9sbCApLCAwLCBndGlkICsgMSApICkgeworICAgICAgICBLTVBfRlNZTkNfQUNRVUlSRUQobGNrKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGttcF91aW50MzIgc3BpbnM7CisgICAgS01QX0ZTWU5DX1BSRVBBUkUoIGxjayApOworICAgIEtNUF9JTklUX1lJRUxEKCBzcGlucyApOworICAgIGlmICggVENSXzQoIF9fa21wX250aCApID4gKCBfX2ttcF9hdmFpbF9wcm9jID8gX19rbXBfYXZhaWxfcHJvYyA6CisgICAgICBfX2ttcF94cHJvYyApICkgeworICAgICAgICBLTVBfWUlFTEQoIFRSVUUgKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEtNUF9ZSUVMRF9TUElOKCBzcGlucyApOworICAgIH0KKworICAgIHdoaWxlICggKCBsY2stPmxrLnBvbGwgIT0gMCApIHx8CisgICAgICAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCAmICggbGNrLT5say5wb2xsICksIDAsIGd0aWQgKyAxICkgKSApIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRklYTUUgLSB1c2UgZXhwb25lbnRpYWwgYmFja29mZiBoZXJlCisgICAgICAgIC8vCisgICAgICAgIGlmICggVENSXzQoIF9fa21wX250aCApID4gKCBfX2ttcF9hdmFpbF9wcm9jID8gX19rbXBfYXZhaWxfcHJvYyA6CisgICAgICAgICAgX19rbXBfeHByb2MgKSApIHsKKyAgICAgICAgICAgIEtNUF9ZSUVMRCggVFJVRSApOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgS01QX1lJRUxEX1NQSU4oIHNwaW5zICk7CisgICAgICAgIH0KKyAgICB9CisgICAgS01QX0ZTWU5DX0FDUVVJUkVEKCBsY2sgKTsKK30KKwordm9pZAorX19rbXBfYWNxdWlyZV90YXNfbG9jaygga21wX3Rhc19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIF9fa21wX2FjcXVpcmVfdGFzX2xvY2tfdGltZWRfdGVtcGxhdGUoIGxjaywgZ3RpZCApOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfYWNxdWlyZV90YXNfbG9ja193aXRoX2NoZWNrcygga21wX3Rhc19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfc2V0X2xvY2siOworICAgICAgICBpZiAoICggc2l6ZW9mICgga21wX3Rhc19sb2NrX3QgKSA8PSBPTVBfTE9DS19UX1NJWkUgKQorICAgICAgICAgICYmIF9fa21wX2lzX3Rhc19sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAoIGd0aWQgPj0gMCApICYmICggX19rbXBfZ2V0X3Rhc19sb2NrX293bmVyKCBsY2sgKSA9PSBndGlkICkgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tJc0FscmVhZHlPd25lZCwgZnVuYyApOworICAgICAgICB9CisgICAgfQorICAgIF9fa21wX2FjcXVpcmVfdGFzX2xvY2soIGxjaywgZ3RpZCApOworfQorCitpbnQKK19fa21wX3Rlc3RfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpZiAoICggbGNrLT5say5wb2xsID09IDAgKQorICAgICAgJiYgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCAmICggbGNrLT5say5wb2xsICksIDAsIGd0aWQgKyAxICkgKSB7CisgICAgICAgIEtNUF9GU1lOQ19BQ1FVSVJFRCggbGNrICk7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3Rlc3RfdGFzX2xvY2tfd2l0aF9jaGVja3MoIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Rlc3RfbG9jayI7CisgICAgICAgIGlmICggKCBzaXplb2YgKCBrbXBfdGFzX2xvY2tfdCApIDw9IE9NUF9MT0NLX1RfU0laRSApCisgICAgICAgICAgJiYgX19rbXBfaXNfdGFzX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gX19rbXBfdGVzdF90YXNfbG9jayggbGNrLCBndGlkICk7Cit9CisKK3ZvaWQKK19fa21wX3JlbGVhc2VfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIEtNUF9GU1lOQ19SRUxFQVNJTkcobGNrKTsKKyAgICBLTVBfU1RfUkVMMzIoICYobGNrLT5say5wb2xsKSwgMCApOworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBLTVBfWUlFTEQoIFRDUl80KCBfX2ttcF9udGggKSA+ICggX19rbXBfYXZhaWxfcHJvYyA/IF9fa21wX2F2YWlsX3Byb2MgOgorICAgICAgX19rbXBfeHByb2MgKSApOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfcmVsZWFzZV90YXNfbG9ja193aXRoX2NoZWNrcygga21wX3Rhc19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdW5zZXRfbG9jayI7CisgICAgICAgIEtNUF9NQigpOyAgLyogaW4gY2FzZSBhbm90aGVyIHByb2Nlc3NvciBpbml0aWFsaXplZCBsb2NrICovCisgICAgICAgIGlmICggKCBzaXplb2YgKCBrbXBfdGFzX2xvY2tfdCApIDw9IE9NUF9MT0NLX1RfU0laRSApCisgICAgICAgICAgJiYgX19rbXBfaXNfdGFzX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2dldF90YXNfbG9ja19vd25lciggbGNrICkgPT0gLTEgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tVbnNldHRpbmdGcmVlLCBmdW5jICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAoIGd0aWQgPj0gMCApICYmICggX19rbXBfZ2V0X3Rhc19sb2NrX293bmVyKCBsY2sgKSA+PSAwICkKKyAgICAgICAgICAmJiAoIF9fa21wX2dldF90YXNfbG9ja19vd25lciggbGNrICkgIT0gZ3RpZCApICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nU2V0QnlBbm90aGVyLCBmdW5jICk7CisgICAgICAgIH0KKyAgICB9CisgICAgX19rbXBfcmVsZWFzZV90YXNfbG9jayggbGNrLCBndGlkICk7Cit9CisKK3ZvaWQKK19fa21wX2luaXRfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICogbGNrICkKK3sKKyAgICBUQ1dfNCggbGNrLT5say5wb2xsLCAwICk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9pbml0X3Rhc19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdGFzX2xvY2tfdCAqIGxjayApCit7CisgICAgX19rbXBfaW5pdF90YXNfbG9jayggbGNrICk7Cit9CisKK3ZvaWQKK19fa21wX2Rlc3Ryb3lfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICpsY2sgKQoreworICAgIGxjay0+bGsucG9sbCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9kZXN0cm95X3Rhc19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdGFzX2xvY2tfdCAqbGNrICkKK3sKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX2Rlc3Ryb3lfbG9jayI7CisgICAgICAgIGlmICggKCBzaXplb2YgKCBrbXBfdGFzX2xvY2tfdCApIDw9IE9NUF9MT0NLX1RfU0laRSApCisgICAgICAgICAgJiYgX19rbXBfaXNfdGFzX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2dldF90YXNfbG9ja19vd25lciggbGNrICkgIT0gLTEgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tTdGlsbE93bmVkLCBmdW5jICk7CisgICAgICAgIH0KKyAgICB9CisgICAgX19rbXBfZGVzdHJveV90YXNfbG9jayggbGNrICk7Cit9CisKKworLy8KKy8vIG5lc3RlZCB0ZXN0IGFuZCBzZXQgbG9ja3MKKy8vCisKK3ZvaWQKK19fa21wX2FjcXVpcmVfbmVzdGVkX3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisKKyAgICBpZiAoIF9fa21wX2dldF90YXNfbG9ja19vd25lciggbGNrICkgPT0gZ3RpZCApIHsKKyAgICAgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgKz0gMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfdGFzX2xvY2tfdGltZWRfdGVtcGxhdGUoIGxjaywgZ3RpZCApOworICAgICAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IDE7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorX19rbXBfYWNxdWlyZV9uZXN0ZWRfdGFzX2xvY2tfd2l0aF9jaGVja3MoIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3NldF9uZXN0X2xvY2siOworICAgICAgICBpZiAoICEgX19rbXBfaXNfdGFzX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBfX2ttcF9hY3F1aXJlX25lc3RlZF90YXNfbG9jayggbGNrLCBndGlkICk7Cit9CisKK2ludAorX19rbXBfdGVzdF9uZXN0ZWRfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpbnQgcmV0dmFsOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisKKyAgICBpZiAoIF9fa21wX2dldF90YXNfbG9ja19vd25lciggbGNrICkgPT0gZ3RpZCApIHsKKyAgICAgICAgcmV0dmFsID0gKytsY2stPmxrLmRlcHRoX2xvY2tlZDsKKyAgICB9CisgICAgZWxzZSBpZiAoICFfX2ttcF90ZXN0X3Rhc19sb2NrKCBsY2ssIGd0aWQgKSApIHsKKyAgICAgICAgcmV0dmFsID0gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEtNUF9NQigpOworICAgICAgICByZXR2YWwgPSBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IDE7CisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3Rlc3RfbmVzdGVkX3Rhc19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF90ZXN0X25lc3RfbG9jayI7CisgICAgICAgIGlmICggISBfX2ttcF9pc190YXNfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBfX2ttcF90ZXN0X25lc3RlZF90YXNfbG9jayggbGNrLCBndGlkICk7Cit9CisKK3ZvaWQKK19fa21wX3JlbGVhc2VfbmVzdGVkX3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisKKyAgICBLTVBfTUIoKTsKKyAgICBpZiAoIC0tKGxjay0+bGsuZGVwdGhfbG9ja2VkKSA9PSAwICkgeworICAgICAgICBfX2ttcF9yZWxlYXNlX3Rhc19sb2NrKCBsY2ssIGd0aWQgKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9yZWxlYXNlX25lc3RlZF90YXNfbG9ja193aXRoX2NoZWNrcygga21wX3Rhc19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdW5zZXRfbmVzdF9sb2NrIjsKKyAgICAgICAgS01QX01CKCk7ICAvKiBpbiBjYXNlIGFub3RoZXIgcHJvY2Vzc29yIGluaXRpYWxpemVkIGxvY2sgKi8KKyAgICAgICAgaWYgKCAhIF9fa21wX2lzX3Rhc19sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBfX2ttcF9nZXRfdGFzX2xvY2tfb3duZXIoIGxjayApID09IC0xICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nRnJlZSwgZnVuYyApOworICAgICAgICB9CisgICAgICAgIGlmICggX19rbXBfZ2V0X3Rhc19sb2NrX293bmVyKCBsY2sgKSAhPSBndGlkICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nU2V0QnlBbm90aGVyLCBmdW5jICk7CisgICAgICAgIH0KKyAgICB9CisgICAgX19rbXBfcmVsZWFzZV9uZXN0ZWRfdGFzX2xvY2soIGxjaywgZ3RpZCApOworfQorCit2b2lkCitfX2ttcF9pbml0X25lc3RlZF90YXNfbG9jaygga21wX3Rhc19sb2NrX3QgKiBsY2sgKQoreworICAgIF9fa21wX2luaXRfdGFzX2xvY2soIGxjayApOworICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMDsgLy8gPj0gMCBmb3IgbmVzdGFibGUgbG9ja3MsIC0xIGZvciBzaW1wbGUgbG9ja3MKK30KKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfbmVzdGVkX3Rhc19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdGFzX2xvY2tfdCAqIGxjayApCit7CisgICAgX19rbXBfaW5pdF9uZXN0ZWRfdGFzX2xvY2soIGxjayApOworfQorCit2b2lkCitfX2ttcF9kZXN0cm95X25lc3RlZF90YXNfbG9jaygga21wX3Rhc19sb2NrX3QgKmxjayApCit7CisgICAgX19rbXBfZGVzdHJveV90YXNfbG9jayggbGNrICk7CisgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAwOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVzdHJveV9uZXN0ZWRfdGFzX2xvY2tfd2l0aF9jaGVja3MoIGttcF90YXNfbG9ja190ICpsY2sgKQoreworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfZGVzdHJveV9uZXN0X2xvY2siOworICAgICAgICBpZiAoICEgX19rbXBfaXNfdGFzX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2dldF90YXNfbG9ja19vd25lciggbGNrICkgIT0gLTEgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tTdGlsbE93bmVkLCBmdW5jICk7CisgICAgICAgIH0KKyAgICB9CisgICAgX19rbXBfZGVzdHJveV9uZXN0ZWRfdGFzX2xvY2soIGxjayApOworfQorCisKKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIGZ1dGV4IGxvY2tzICovCisKKy8vIGZ1dGV4IGxvY2tzIGFyZSByZWFsbHkganVzdCB0ZXN0IGFuZCBzZXQgbG9ja3MsIHdpdGggYSBkaWZmZXJlbnQgbWV0aG9kCisvLyBvZiBoYW5kbGluZyBjb250ZW50aW9uLiAgVGhleSB0YWtlIHRoZSBzYW1lIGFtb3VudCBvZiBzcGFjZSBhcyB0ZXN0IGFuZAorLy8gc2V0IGxvY2tzLCBhbmQgYXJlIGFsbG9jYXRlZCB0aGUgc2FtZSB3YXkgKGkuZS4gdXNlIHRoZSBhcmVhIGFsbG9jYXRlZCBieQorLy8gdGhlIGNvbXBpbGVyIGZvciBub24tbmVzdGVkIGxvY2tzIC8gYWxsb2NhdGUgbmVzdGVkIGxvY2tzIG9uIHRoZSBoZWFwKS4KKworc3RhdGljIGttcF9pbnQzMgorX19rbXBfZ2V0X2Z1dGV4X2xvY2tfb3duZXIoIGttcF9mdXRleF9sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuICggVENSXzQoIGxjay0+bGsucG9sbCApID4+IDEgKSAtIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbAorX19rbXBfaXNfZnV0ZXhfbG9ja19uZXN0YWJsZSgga21wX2Z1dGV4X2xvY2tfdCAqbGNrICkKK3sKKyAgICByZXR1cm4gbGNrLT5say5kZXB0aF9sb2NrZWQgIT0gLTE7Cit9CisKK19fZm9yY2VpbmxpbmUgc3RhdGljIHZvaWQKK19fa21wX2FjcXVpcmVfZnV0ZXhfbG9ja190aW1lZF90ZW1wbGF0ZSgga21wX2Z1dGV4X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAga21wX2ludDMyIGd0aWRfY29kZSA9ICggZ3RpZCArIDEgKSA8PCAxOworCisgICAgS01QX01CKCk7CisKKyNpZmRlZiBVU0VfTE9DS19QUk9GSUxFCisgICAga21wX3VpbnQzMiBjdXJyID0gVENSXzQoIGxjay0+bGsucG9sbCApOworICAgIGlmICggKCBjdXJyICE9IDAgKSAmJiAoIGN1cnIgIT0gZ3RpZF9jb2RlICkgKQorICAgICAgICBfX2ttcF9wcmludGYoICJMT0NLIENPTlRFTlRJT046ICVwXG4iLCBsY2sgKTsKKyAgICAvKiBlbHNlIF9fa21wX3ByaW50ZiggIi4iICk7Ki8KKyNlbmRpZiAvKiBVU0VfTE9DS19QUk9GSUxFICovCisKKyAgICBLTVBfRlNZTkNfUFJFUEFSRSggbGNrICk7CisgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfYWNxdWlyZV9mdXRleF9sb2NrOiBsY2s6JXAoMHgleCksIFQjJWQgZW50ZXJpbmdcbiIsCisgICAgICBsY2ssIGxjay0+bGsucG9sbCwgZ3RpZCApICk7CisKKyAgICBrbXBfaW50MzIgcG9sbF92YWw7CisgICAgd2hpbGUgKCAoIHBvbGxfdmFsID0gS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFVDMyKCAmICggbGNrLT5say5wb2xsICksIDAsCisgICAgICBndGlkX2NvZGUgKSApICE9IDAgKSB7CisgICAgICAgIGttcF9pbnQzMiBjb25kID0gcG9sbF92YWwgJiAxOworICAgICAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF9hY3F1aXJlX2Z1dGV4X2xvY2s6IGxjazolcCwgVCMlZCBwb2xsX3ZhbCA9IDB4JXggY29uZCA9IDB4JXhcbiIsCisgICAgICAgICAgIGxjaywgZ3RpZCwgcG9sbF92YWwsIGNvbmQgKSApOworCisgICAgICAgIC8vCisgICAgICAgIC8vIE5PVEU6IGlmIHlvdSB0cnkgdG8gdXNlIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uIGZvciB0aGlzIGJyYW5jaAorICAgICAgICAvLworICAgICAgICAvLyBpZiAoIHBvbGxfdmFsICYgMSA9PSAwICkKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlbiB0aGUgMTIuMCBjb21waWxlciBoYXMgYSBidWcgd2hlcmUgdGhlIGZvbGxvd2luZyBibG9jayB3aWxsCisgICAgICAgIC8vIGFsd2F5cyBiZSBza2lwcGVkLCByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZSBvZiB0aGUgTFNCIG9mIHBvbGxfdmFsLgorICAgICAgICAvLworICAgICAgICBpZiAoICEgY29uZCApIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBUcnkgdG8gc2V0IHRoZSBsc2IgaW4gdGhlIHBvbGwgdG8gaW5kaWNhdGUgdG8gdGhlIG93bmVyCisgICAgICAgICAgICAvLyB0aHJlYWQgdGhhdCB0aGV5IG5lZWQgdG8gd2FrZSB0aGlzIHRocmVhZCB1cC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBpZiAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDMyKCAmICggbGNrLT5say5wb2xsICksCisgICAgICAgICAgICAgIHBvbGxfdmFsLCBwb2xsX3ZhbCB8IDEgKSApIHsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF9hY3F1aXJlX2Z1dGV4X2xvY2s6IGxjazolcCgweCV4KSwgVCMlZCBjYW4ndCBzZXQgYml0IDBcbiIsCisgICAgICAgICAgICAgICAgICBsY2ssIGxjay0+bGsucG9sbCwgZ3RpZCApICk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwb2xsX3ZhbCB8PSAxOworCisgICAgICAgICAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF9hY3F1aXJlX2Z1dGV4X2xvY2s6IGxjazolcCgweCV4KSwgVCMlZCBiaXQgMCBzZXRcbiIsCisgICAgICAgICAgICAgIGxjaywgbGNrLT5say5wb2xsLCBndGlkICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX2FjcXVpcmVfZnV0ZXhfbG9jazogbGNrOiVwLCBUIyVkIGJlZm9yZSBmdXRleF93YWl0KDB4JXgpXG4iLAorICAgICAgICAgICBsY2ssIGd0aWQsIHBvbGxfdmFsICkgKTsKKworICAgICAgICBrbXBfaW50MzIgcmM7CisgICAgICAgIGlmICggKCByYyA9IHN5c2NhbGwoIF9fTlJfZnV0ZXgsICYgKCBsY2stPmxrLnBvbGwgKSwgRlVURVhfV0FJVCwKKyAgICAgICAgICBwb2xsX3ZhbCwgTlVMTCwgTlVMTCwgMCApICkgIT0gMCApIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX2FjcXVpcmVfZnV0ZXhfbG9jazogbGNrOiVwLCBUIyVkIGZ1dGV4X3dhaXQoMHgleCkgZmFpbGVkIChyYz0lZCBlcnJubz0lZClcbiIsCisgICAgICAgICAgICAgICBsY2ssIGd0aWQsIHBvbGxfdmFsLCByYywgZXJybm8gKSApOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF9hY3F1aXJlX2Z1dGV4X2xvY2s6IGxjazolcCwgVCMlZCBhZnRlciBmdXRleF93YWl0KDB4JXgpXG4iLAorICAgICAgICAgICBsY2ssIGd0aWQsIHBvbGxfdmFsICkgKTsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhpcyB0aHJlYWQgaGFzIG5vdyBkb25lIGEgc3VjY2Vzc2Z1bCBmdXRleCB3YWl0IGNhbGwgYW5kIHdhcworICAgICAgICAvLyBlbnRlcmVkIG9uIHRoZSBPUyBmdXRleCBxdWV1ZS4gIFdlIG11c3Qgbm93IHBlcmZvcm0gYSBmdXRleAorICAgICAgICAvLyB3YWtlIGNhbGwgd2hlbiByZWxlYXNpbmcgdGhlIGxvY2ssIGFzIHdlIGhhdmUgbm8gaWRlYSBob3cgbWFueQorICAgICAgICAvLyBvdGhlciB0aHJlYWRzIGFyZSBpbiB0aGUgcXVldWUuCisgICAgICAgIC8vCisgICAgICAgIGd0aWRfY29kZSB8PSAxOworICAgIH0KKworICAgIEtNUF9GU1lOQ19BQ1FVSVJFRCggbGNrICk7CisgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfYWNxdWlyZV9mdXRleF9sb2NrOiBsY2s6JXAoMHgleCksIFQjJWQgZXhpdGluZ1xuIiwKKyAgICAgIGxjaywgbGNrLT5say5wb2xsLCBndGlkICkgKTsKK30KKwordm9pZAorX19rbXBfYWNxdWlyZV9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBfX2ttcF9hY3F1aXJlX2Z1dGV4X2xvY2tfdGltZWRfdGVtcGxhdGUoIGxjaywgZ3RpZCApOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfYWNxdWlyZV9mdXRleF9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3NldF9sb2NrIjsKKyAgICAgICAgaWYgKCAoIHNpemVvZiAoIGttcF9mdXRleF9sb2NrX3QgKSA8PSBPTVBfTE9DS19UX1NJWkUgKQorICAgICAgICAgICYmIF9fa21wX2lzX2Z1dGV4X2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoICggZ3RpZCA+PSAwICkgJiYgKCBfX2ttcF9nZXRfZnV0ZXhfbG9ja19vd25lciggbGNrICkgPT0gZ3RpZCApICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNBbHJlYWR5T3duZWQsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBfX2ttcF9hY3F1aXJlX2Z1dGV4X2xvY2soIGxjaywgZ3RpZCApOworfQorCitpbnQKK19fa21wX3Rlc3RfZnV0ZXhfbG9jaygga21wX2Z1dGV4X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaWYgKCBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoICYgKCBsY2stPmxrLnBvbGwgKSwgMCwgKCBndGlkICsgMSApIDw8IDEgKSApIHsKKyAgICAgICAgS01QX0ZTWU5DX0FDUVVJUkVEKCBsY2sgKTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGludAorX19rbXBfdGVzdF9mdXRleF9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Rlc3RfbG9jayI7CisgICAgICAgIGlmICggKCBzaXplb2YgKCBrbXBfZnV0ZXhfbG9ja190ICkgPD0gT01QX0xPQ0tfVF9TSVpFICkKKyAgICAgICAgICAmJiBfX2ttcF9pc19mdXRleF9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIF9fa21wX3Rlc3RfZnV0ZXhfbG9jayggbGNrLCBndGlkICk7Cit9CisKK3ZvaWQKK19fa21wX3JlbGVhc2VfZnV0ZXhfbG9jaygga21wX2Z1dGV4X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF9yZWxlYXNlX2Z1dGV4X2xvY2s6IGxjazolcCgweCV4KSwgVCMlZCBlbnRlcmluZ1xuIiwKKyAgICAgIGxjaywgbGNrLT5say5wb2xsLCBndGlkICkgKTsKKworICAgIEtNUF9GU1lOQ19SRUxFQVNJTkcobGNrKTsKKworICAgIGttcF9pbnQzMiBwb2xsX3ZhbCA9IEtNUF9YQ0hHX0ZJWEVEMzIoICYgKCBsY2stPmxrLnBvbGwgKSwgMCApOworCisgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfcmVsZWFzZV9mdXRleF9sb2NrOiBsY2s6JXAsIFQjJWQgcmVsZWFzZWQgcG9sbF92YWwgPSAweCV4XG4iLAorICAgICAgIGxjaywgZ3RpZCwgcG9sbF92YWwgKSApOworCisgICAgaWYgKCBwb2xsX3ZhbCAmIDEgKSB7CisgICAgICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX3JlbGVhc2VfZnV0ZXhfbG9jazogbGNrOiVwLCBUIyVkIGZ1dGV4X3dha2UgMSB0aHJlYWRcbiIsCisgICAgICAgICAgIGxjaywgZ3RpZCApICk7CisgICAgICAgIHN5c2NhbGwoIF9fTlJfZnV0ZXgsICYgKCBsY2stPmxrLnBvbGwgKSwgRlVURVhfV0FLRSwgMSwgTlVMTCwgTlVMTCwgMCApOworICAgIH0KKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfcmVsZWFzZV9mdXRleF9sb2NrOiBsY2s6JXAoMHgleCksIFQjJWQgZXhpdGluZ1xuIiwKKyAgICAgIGxjaywgbGNrLT5say5wb2xsLCBndGlkICkgKTsKKworICAgIEtNUF9ZSUVMRCggVENSXzQoIF9fa21wX250aCApID4gKCBfX2ttcF9hdmFpbF9wcm9jID8gX19rbXBfYXZhaWxfcHJvYyA6CisgICAgICBfX2ttcF94cHJvYyApICk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9yZWxlYXNlX2Z1dGV4X2xvY2tfd2l0aF9jaGVja3MoIGttcF9mdXRleF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdW5zZXRfbG9jayI7CisgICAgICAgIEtNUF9NQigpOyAgLyogaW4gY2FzZSBhbm90aGVyIHByb2Nlc3NvciBpbml0aWFsaXplZCBsb2NrICovCisgICAgICAgIGlmICggKCBzaXplb2YgKCBrbXBfZnV0ZXhfbG9ja190ICkgPD0gT01QX0xPQ0tfVF9TSVpFICkKKyAgICAgICAgICAmJiBfX2ttcF9pc19mdXRleF9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBfX2ttcF9nZXRfZnV0ZXhfbG9ja19vd25lciggbGNrICkgPT0gLTEgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tVbnNldHRpbmdGcmVlLCBmdW5jICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAoIGd0aWQgPj0gMCApICYmICggX19rbXBfZ2V0X2Z1dGV4X2xvY2tfb3duZXIoIGxjayApID49IDAgKQorICAgICAgICAgICYmICggX19rbXBfZ2V0X2Z1dGV4X2xvY2tfb3duZXIoIGxjayApICE9IGd0aWQgKSApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ1NldEJ5QW5vdGhlciwgZnVuYyApOworICAgICAgICB9CisgICAgfQorICAgIF9fa21wX3JlbGVhc2VfZnV0ZXhfbG9jayggbGNrLCBndGlkICk7Cit9CisKK3ZvaWQKK19fa21wX2luaXRfZnV0ZXhfbG9jaygga21wX2Z1dGV4X2xvY2tfdCAqIGxjayApCit7CisgICAgVENXXzQoIGxjay0+bGsucG9sbCwgMCApOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfaW5pdF9mdXRleF9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfZnV0ZXhfbG9ja190ICogbGNrICkKK3sKKyAgICBfX2ttcF9pbml0X2Z1dGV4X2xvY2soIGxjayApOworfQorCit2b2lkCitfX2ttcF9kZXN0cm95X2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKmxjayApCit7CisgICAgbGNrLT5say5wb2xsID0gMDsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2Rlc3Ryb3lfZnV0ZXhfbG9ja193aXRoX2NoZWNrcygga21wX2Z1dGV4X2xvY2tfdCAqbGNrICkKK3sKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX2Rlc3Ryb3lfbG9jayI7CisgICAgICAgIGlmICggKCBzaXplb2YgKCBrbXBfZnV0ZXhfbG9ja190ICkgPD0gT01QX0xPQ0tfVF9TSVpFICkKKyAgICAgICAgICAmJiBfX2ttcF9pc19mdXRleF9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBfX2ttcF9nZXRfZnV0ZXhfbG9ja19vd25lciggbGNrICkgIT0gLTEgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tTdGlsbE93bmVkLCBmdW5jICk7CisgICAgICAgIH0KKyAgICB9CisgICAgX19rbXBfZGVzdHJveV9mdXRleF9sb2NrKCBsY2sgKTsKK30KKworCisvLworLy8gbmVzdGVkIGZ1dGV4IGxvY2tzCisvLworCit2b2lkCitfX2ttcF9hY3F1aXJlX25lc3RlZF9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKworICAgIGlmICggX19rbXBfZ2V0X2Z1dGV4X2xvY2tfb3duZXIoIGxjayApID09IGd0aWQgKSB7CisgICAgICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkICs9IDE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBfX2ttcF9hY3F1aXJlX2Z1dGV4X2xvY2tfdGltZWRfdGVtcGxhdGUoIGxjaywgZ3RpZCApOworICAgICAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IDE7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorX19rbXBfYWNxdWlyZV9uZXN0ZWRfZnV0ZXhfbG9ja193aXRoX2NoZWNrcygga21wX2Z1dGV4X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9zZXRfbmVzdF9sb2NrIjsKKyAgICAgICAgaWYgKCAhIF9fa21wX2lzX2Z1dGV4X2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBfX2ttcF9hY3F1aXJlX25lc3RlZF9mdXRleF9sb2NrKCBsY2ssIGd0aWQgKTsKK30KKworaW50CitfX2ttcF90ZXN0X25lc3RlZF9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpbnQgcmV0dmFsOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisKKyAgICBpZiAoIF9fa21wX2dldF9mdXRleF9sb2NrX293bmVyKCBsY2sgKSA9PSBndGlkICkgeworICAgICAgICByZXR2YWwgPSArK2xjay0+bGsuZGVwdGhfbG9ja2VkOworICAgIH0KKyAgICBlbHNlIGlmICggIV9fa21wX3Rlc3RfZnV0ZXhfbG9jayggbGNrLCBndGlkICkgKSB7CisgICAgICAgIHJldHZhbCA9IDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgcmV0dmFsID0gbGNrLT5say5kZXB0aF9sb2NrZWQgPSAxOworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50CitfX2ttcF90ZXN0X25lc3RlZF9mdXRleF9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Rlc3RfbmVzdF9sb2NrIjsKKyAgICAgICAgaWYgKCAhIF9fa21wX2lzX2Z1dGV4X2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gX19rbXBfdGVzdF9uZXN0ZWRfZnV0ZXhfbG9jayggbGNrLCBndGlkICk7Cit9CisKK3ZvaWQKK19fa21wX3JlbGVhc2VfbmVzdGVkX2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIGd0aWQgPj0gMCApOworCisgICAgS01QX01CKCk7CisgICAgaWYgKCAtLShsY2stPmxrLmRlcHRoX2xvY2tlZCkgPT0gMCApIHsKKyAgICAgICAgX19rbXBfcmVsZWFzZV9mdXRleF9sb2NrKCBsY2ssIGd0aWQgKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9yZWxlYXNlX25lc3RlZF9mdXRleF9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Vuc2V0X25lc3RfbG9jayI7CisgICAgICAgIEtNUF9NQigpOyAgLyogaW4gY2FzZSBhbm90aGVyIHByb2Nlc3NvciBpbml0aWFsaXplZCBsb2NrICovCisgICAgICAgIGlmICggISBfX2ttcF9pc19mdXRleF9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBfX2ttcF9nZXRfZnV0ZXhfbG9ja19vd25lciggbGNrICkgPT0gLTEgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tVbnNldHRpbmdGcmVlLCBmdW5jICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBfX2ttcF9nZXRfZnV0ZXhfbG9ja19vd25lciggbGNrICkgIT0gZ3RpZCApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ1NldEJ5QW5vdGhlciwgZnVuYyApOworICAgICAgICB9CisgICAgfQorICAgIF9fa21wX3JlbGVhc2VfbmVzdGVkX2Z1dGV4X2xvY2soIGxjaywgZ3RpZCApOworfQorCit2b2lkCitfX2ttcF9pbml0X25lc3RlZF9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICogbGNrICkKK3sKKyAgICBfX2ttcF9pbml0X2Z1dGV4X2xvY2soIGxjayApOworICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMDsgLy8gPj0gMCBmb3IgbmVzdGFibGUgbG9ja3MsIC0xIGZvciBzaW1wbGUgbG9ja3MKK30KKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfbmVzdGVkX2Z1dGV4X2xvY2tfd2l0aF9jaGVja3MoIGttcF9mdXRleF9sb2NrX3QgKiBsY2sgKQoreworICAgIF9fa21wX2luaXRfbmVzdGVkX2Z1dGV4X2xvY2soIGxjayApOworfQorCit2b2lkCitfX2ttcF9kZXN0cm95X25lc3RlZF9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2sgKQoreworICAgIF9fa21wX2Rlc3Ryb3lfZnV0ZXhfbG9jayggbGNrICk7CisgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAwOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVzdHJveV9uZXN0ZWRfZnV0ZXhfbG9ja193aXRoX2NoZWNrcygga21wX2Z1dGV4X2xvY2tfdCAqbGNrICkKK3sKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX2Rlc3Ryb3lfbmVzdF9sb2NrIjsKKyAgICAgICAgaWYgKCAhIF9fa21wX2lzX2Z1dGV4X2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2dldF9mdXRleF9sb2NrX293bmVyKCBsY2sgKSAhPSAtMSApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja1N0aWxsT3duZWQsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBfX2ttcF9kZXN0cm95X25lc3RlZF9mdXRleF9sb2NrKCBsY2sgKTsKK30KKworI2VuZGlmIC8vIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0pCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiB0aWNrZXQgKGJha2VyeSkgbG9ja3MgKi8KKworc3RhdGljIGttcF9pbnQzMgorX19rbXBfZ2V0X3RpY2tldF9sb2NrX293bmVyKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrICkKK3sKKyAgICByZXR1cm4gVENSXzQoIGxjay0+bGsub3duZXJfaWQgKSAtIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbAorX19rbXBfaXNfdGlja2V0X2xvY2tfbmVzdGFibGUoIGttcF90aWNrZXRfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBsY2stPmxrLmRlcHRoX2xvY2tlZCAhPSAtMTsKK30KKworc3RhdGljIGttcF91aW50MzIKK19fa21wX2Jha2VyeV9jaGVjayhrbXBfdWludCB2YWx1ZSwga21wX3VpbnQgY2hlY2tlcikKK3sKKyAgICByZWdpc3RlciBrbXBfdWludDMyIHBhdXNlOworCisgICAgaWYgKHZhbHVlID09IGNoZWNrZXIpIHsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIGZvciAocGF1c2UgPSBjaGVja2VyIC0gdmFsdWU7IHBhdXNlICE9IDA7IC0tcGF1c2UpIHsKKyAgICAgICAgX19rbXBfc3RhdGljX2RlbGF5KFRSVUUpOworICAgIH0KKyAgICByZXR1cm4gRkFMU0U7Cit9CisKK19fZm9yY2VpbmxpbmUgc3RhdGljIHZvaWQKK19fa21wX2FjcXVpcmVfdGlja2V0X2xvY2tfdGltZWRfdGVtcGxhdGUoIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBrbXBfdWludDMyIG15X3RpY2tldDsKKyAgICBLTVBfTUIoKTsKKworICAgIG15X3RpY2tldCA9IEtNUF9URVNUX1RIRU5fSU5DMzIoIChrbXBfaW50MzIgKikgJmxjay0+bGsubmV4dF90aWNrZXQgKTsKKworI2lmZGVmIFVTRV9MT0NLX1BST0ZJTEUKKyAgICBpZiAoIFRDUl80KCBsY2stPmxrLm5vd19zZXJ2aW5nICkgIT0gbXlfdGlja2V0ICkKKyAgICAgICAgX19rbXBfcHJpbnRmKCAiTE9DSyBDT05URU5USU9OOiAlcFxuIiwgbGNrICk7CisgICAgLyogZWxzZSBfX2ttcF9wcmludGYoICIuIiApOyovCisjZW5kaWYgLyogVVNFX0xPQ0tfUFJPRklMRSAqLworCisgICAgaWYgKCBUQ1JfNCggbGNrLT5say5ub3dfc2VydmluZyApID09IG15X3RpY2tldCApIHsKKyAgICAgICAgS01QX0ZTWU5DX0FDUVVJUkVEKGxjayk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgS01QX1dBSVRfWUlFTEQoICZsY2stPmxrLm5vd19zZXJ2aW5nLCBteV90aWNrZXQsIF9fa21wX2Jha2VyeV9jaGVjaywgbGNrICk7CisgICAgS01QX0ZTWU5DX0FDUVVJUkVEKGxjayk7Cit9CisKK3ZvaWQKK19fa21wX2FjcXVpcmVfdGlja2V0X2xvY2soIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBfX2ttcF9hY3F1aXJlX3RpY2tldF9sb2NrX3RpbWVkX3RlbXBsYXRlKCBsY2ssIGd0aWQgKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2FjcXVpcmVfdGlja2V0X2xvY2tfd2l0aF9jaGVja3MoIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3NldF9sb2NrIjsKKyAgICAgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgICAgICB9CisgICAgICAgIGlmICggX19rbXBfaXNfdGlja2V0X2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoICggZ3RpZCA+PSAwICkgJiYgKCBfX2ttcF9nZXRfdGlja2V0X2xvY2tfb3duZXIoIGxjayApID09IGd0aWQgKSApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzQWxyZWFkeU93bmVkLCBmdW5jICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX2ttcF9hY3F1aXJlX3RpY2tldF9sb2NrKCBsY2ssIGd0aWQgKTsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBsY2stPmxrLm93bmVyX2lkID0gZ3RpZCArIDE7CisgICAgfQorfQorCitpbnQKK19fa21wX3Rlc3RfdGlja2V0X2xvY2soIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBrbXBfdWludDMyIG15X3RpY2tldCA9IFRDUl80KCBsY2stPmxrLm5leHRfdGlja2V0ICk7CisgICAgaWYgKCBUQ1JfNCggbGNrLT5say5ub3dfc2VydmluZyApID09IG15X3RpY2tldCApIHsKKyAgICAgICAga21wX3VpbnQzMiBuZXh0X3RpY2tldCA9IG15X3RpY2tldCArIDE7CisgICAgICAgIGlmICggS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCAoa21wX2ludDMyICopICZsY2stPmxrLm5leHRfdGlja2V0LAorICAgICAgICAgIG15X3RpY2tldCwgbmV4dF90aWNrZXQgKSApIHsKKyAgICAgICAgICAgIEtNUF9GU1lOQ19BQ1FVSVJFRCggbGNrICk7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3Rlc3RfdGlja2V0X2xvY2tfd2l0aF9jaGVja3MoIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Rlc3RfbG9jayI7CisgICAgICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2lzX3RpY2tldF9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQgcmV0dmFsID0gX19rbXBfdGVzdF90aWNrZXRfbG9jayggbGNrLCBndGlkICk7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayAmJiByZXR2YWwgKSB7CisgICAgICAgIGxjay0+bGsub3duZXJfaWQgPSBndGlkICsgMTsKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKwordm9pZAorX19rbXBfcmVsZWFzZV90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGttcF91aW50MzIgIGRpc3RhbmNlOworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBLTVBfRlNZTkNfUkVMRUFTSU5HKGxjayk7CisgICAgZGlzdGFuY2UgPSAoIFRDUl80KCBsY2stPmxrLm5leHRfdGlja2V0ICkgLSBUQ1JfNCggbGNrLT5say5ub3dfc2VydmluZyApICk7CisKKyAgICBLTVBfU1RfUkVMMzIoICYobGNrLT5say5ub3dfc2VydmluZyksIGxjay0+bGsubm93X3NlcnZpbmcgKyAxICk7CisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIEtNUF9ZSUVMRCggZGlzdGFuY2UKKyAgICAgID4gKGttcF91aW50MzIpIChfX2ttcF9hdmFpbF9wcm9jID8gX19rbXBfYXZhaWxfcHJvYyA6IF9fa21wX3hwcm9jKSApOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfcmVsZWFzZV90aWNrZXRfbG9ja193aXRoX2NoZWNrcygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdW5zZXRfbG9jayI7CisgICAgICAgIEtNUF9NQigpOyAgLyogaW4gY2FzZSBhbm90aGVyIHByb2Nlc3NvciBpbml0aWFsaXplZCBsb2NrICovCisgICAgICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2lzX3RpY2tldF9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBfX2ttcF9nZXRfdGlja2V0X2xvY2tfb3duZXIoIGxjayApID09IC0xICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nRnJlZSwgZnVuYyApOworICAgICAgICB9CisgICAgICAgIGlmICggKCBndGlkID49IDAgKSAmJiAoIF9fa21wX2dldF90aWNrZXRfbG9ja19vd25lciggbGNrICkgPj0gMCApCisgICAgICAgICAgJiYgKCBfX2ttcF9nZXRfdGlja2V0X2xvY2tfb3duZXIoIGxjayApICE9IGd0aWQgKSApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ1NldEJ5QW5vdGhlciwgZnVuYyApOworICAgICAgICB9CisgICAgICAgIGxjay0+bGsub3duZXJfaWQgPSAwOworICAgIH0KKyAgICBfX2ttcF9yZWxlYXNlX3RpY2tldF9sb2NrKCBsY2ssIGd0aWQgKTsKK30KKwordm9pZAorX19rbXBfaW5pdF90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKiBsY2sgKQoreworICAgIGxjay0+bGsubG9jYXRpb24gPSBOVUxMOworICAgIFRDV180KCBsY2stPmxrLm5leHRfdGlja2V0LCAwICk7CisgICAgVENXXzQoIGxjay0+bGsubm93X3NlcnZpbmcsIDAgKTsKKyAgICBsY2stPmxrLm93bmVyX2lkID0gMDsgICAgICAvLyBubyB0aHJlYWQgb3ducyB0aGUgbG9jay4KKyAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IC0xOyAvLyAtMSA9PiBub3QgYSBuZXN0ZWQgbG9jay4KKyAgICBsY2stPmxrLmluaXRpYWxpemVkID0gKGttcF90aWNrZXRfbG9jayAqKWxjazsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfdGlja2V0X2xvY2tfd2l0aF9jaGVja3MoIGttcF90aWNrZXRfbG9ja190ICogbGNrICkKK3sKKyAgICBfX2ttcF9pbml0X3RpY2tldF9sb2NrKCBsY2sgKTsKK30KKwordm9pZAorX19rbXBfZGVzdHJveV90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjayApCit7CisgICAgbGNrLT5say5pbml0aWFsaXplZCA9IE5VTEw7CisgICAgbGNrLT5say5sb2NhdGlvbiAgICA9IE5VTEw7CisgICAgbGNrLT5say5uZXh0X3RpY2tldCA9IDA7CisgICAgbGNrLT5say5ub3dfc2VydmluZyA9IDA7CisgICAgbGNrLT5say5vd25lcl9pZCA9IDA7CisgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAtMTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2Rlc3Ryb3lfdGlja2V0X2xvY2tfd2l0aF9jaGVja3MoIGttcF90aWNrZXRfbG9ja190ICpsY2sgKQoreworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfZGVzdHJveV9sb2NrIjsKKyAgICAgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgICAgICB9CisgICAgICAgIGlmICggX19rbXBfaXNfdGlja2V0X2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2dldF90aWNrZXRfbG9ja19vd25lciggbGNrICkgIT0gLTEgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tTdGlsbE93bmVkLCBmdW5jICk7CisgICAgICAgIH0KKyAgICB9CisgICAgX19rbXBfZGVzdHJveV90aWNrZXRfbG9jayggbGNrICk7Cit9CisKKworLy8KKy8vIG5lc3RlZCB0aWNrZXQgbG9ja3MKKy8vCisKK3ZvaWQKK19fa21wX2FjcXVpcmVfbmVzdGVkX3RpY2tldF9sb2NrKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisKKyAgICBpZiAoIF9fa21wX2dldF90aWNrZXRfbG9ja19vd25lciggbGNrICkgPT0gZ3RpZCApIHsKKyAgICAgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgKz0gMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfdGlja2V0X2xvY2tfdGltZWRfdGVtcGxhdGUoIGxjaywgZ3RpZCApOworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAxOworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgbGNrLT5say5vd25lcl9pZCA9IGd0aWQgKyAxOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK19fa21wX2FjcXVpcmVfbmVzdGVkX3RpY2tldF9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9zZXRfbmVzdF9sb2NrIjsKKyAgICAgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgICAgICB9CisgICAgICAgIGlmICggISBfX2ttcF9pc190aWNrZXRfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgICAgICB9CisgICAgfQorICAgIF9fa21wX2FjcXVpcmVfbmVzdGVkX3RpY2tldF9sb2NrKCBsY2ssIGd0aWQgKTsKK30KKworaW50CitfX2ttcF90ZXN0X25lc3RlZF90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGludCByZXR2YWw7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKworICAgIGlmICggX19rbXBfZ2V0X3RpY2tldF9sb2NrX293bmVyKCBsY2sgKSA9PSBndGlkICkgeworICAgICAgICByZXR2YWwgPSArK2xjay0+bGsuZGVwdGhfbG9ja2VkOworICAgIH0KKyAgICBlbHNlIGlmICggIV9fa21wX3Rlc3RfdGlja2V0X2xvY2soIGxjaywgZ3RpZCApICkgeworICAgICAgICByZXR2YWwgPSAwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIHJldHZhbCA9IGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMTsKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIGxjay0+bGsub3duZXJfaWQgPSBndGlkICsgMTsKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludAorX19rbXBfdGVzdF9uZXN0ZWRfdGlja2V0X2xvY2tfd2l0aF9jaGVja3MoIGttcF90aWNrZXRfbG9ja190ICpsY2ssCisgIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Rlc3RfbmVzdF9sb2NrIjsKKyAgICAgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgICAgICB9CisgICAgICAgIGlmICggISBfX2ttcF9pc190aWNrZXRfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBfX2ttcF90ZXN0X25lc3RlZF90aWNrZXRfbG9jayggbGNrLCBndGlkICk7Cit9CisKK3ZvaWQKK19fa21wX3JlbGVhc2VfbmVzdGVkX3RpY2tldF9sb2NrKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisKKyAgICBLTVBfTUIoKTsKKyAgICBpZiAoIC0tKGxjay0+bGsuZGVwdGhfbG9ja2VkKSA9PSAwICkgeworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgbGNrLT5say5vd25lcl9pZCA9IDA7CisgICAgICAgIF9fa21wX3JlbGVhc2VfdGlja2V0X2xvY2soIGxjaywgZ3RpZCApOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK19fa21wX3JlbGVhc2VfbmVzdGVkX3RpY2tldF9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF91bnNldF9uZXN0X2xvY2siOworICAgICAgICBLTVBfTUIoKTsgIC8qIGluIGNhc2UgYW5vdGhlciBwcm9jZXNzb3IgaW5pdGlhbGl6ZWQgbG9jayAqLworICAgICAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAhIF9fa21wX2lzX3RpY2tldF9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBfX2ttcF9nZXRfdGlja2V0X2xvY2tfb3duZXIoIGxjayApID09IC0xICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nRnJlZSwgZnVuYyApOworICAgICAgICB9CisgICAgICAgIGlmICggX19rbXBfZ2V0X3RpY2tldF9sb2NrX293bmVyKCBsY2sgKSAhPSBndGlkICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nU2V0QnlBbm90aGVyLCBmdW5jICk7CisgICAgICAgIH0KKyAgICB9CisgICAgX19rbXBfcmVsZWFzZV9uZXN0ZWRfdGlja2V0X2xvY2soIGxjaywgZ3RpZCApOworfQorCit2b2lkCitfX2ttcF9pbml0X25lc3RlZF90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKiBsY2sgKQoreworICAgIF9fa21wX2luaXRfdGlja2V0X2xvY2soIGxjayApOworICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMDsgLy8gPj0gMCBmb3IgbmVzdGFibGUgbG9ja3MsIC0xIGZvciBzaW1wbGUgbG9ja3MKK30KKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfbmVzdGVkX3RpY2tldF9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdGlja2V0X2xvY2tfdCAqIGxjayApCit7CisgICAgX19rbXBfaW5pdF9uZXN0ZWRfdGlja2V0X2xvY2soIGxjayApOworfQorCit2b2lkCitfX2ttcF9kZXN0cm95X25lc3RlZF90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjayApCit7CisgICAgX19rbXBfZGVzdHJveV90aWNrZXRfbG9jayggbGNrICk7CisgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAwOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVzdHJveV9uZXN0ZWRfdGlja2V0X2xvY2tfd2l0aF9jaGVja3MoIGttcF90aWNrZXRfbG9ja190ICpsY2sgKQoreworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfZGVzdHJveV9uZXN0X2xvY2siOworICAgICAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAhIF9fa21wX2lzX3RpY2tldF9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBfX2ttcF9nZXRfdGlja2V0X2xvY2tfb3duZXIoIGxjayApICE9IC0xICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrU3RpbGxPd25lZCwgZnVuYyApOworICAgICAgICB9CisgICAgfQorICAgIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX3RpY2tldF9sb2NrKCBsY2sgKTsKK30KKworCisvLworLy8gYWNjZXNzIGZ1bmN0aW9ucyB0byBmaWVsZHMgd2hpY2ggZG9uJ3QgZXhpc3QgZm9yIGFsbCBsb2NrIGtpbmRzLgorLy8KKworc3RhdGljIGludAorX19rbXBfaXNfdGlja2V0X2xvY2tfaW5pdGlhbGl6ZWQoIGttcF90aWNrZXRfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBsY2sgPT0gbGNrLT5say5pbml0aWFsaXplZDsKK30KKworc3RhdGljIGNvbnN0IGlkZW50X3QgKgorX19rbXBfZ2V0X3RpY2tldF9sb2NrX2xvY2F0aW9uKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrICkKK3sKKyAgICByZXR1cm4gbGNrLT5say5sb2NhdGlvbjsKK30KKworc3RhdGljIHZvaWQKK19fa21wX3NldF90aWNrZXRfbG9ja19sb2NhdGlvbigga21wX3RpY2tldF9sb2NrX3QgKmxjaywgY29uc3QgaWRlbnRfdCAqbG9jICkKK3sKKyAgICBsY2stPmxrLmxvY2F0aW9uID0gbG9jOworfQorCitzdGF0aWMga21wX2xvY2tfZmxhZ3NfdAorX19rbXBfZ2V0X3RpY2tldF9sb2NrX2ZsYWdzKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrICkKK3sKKyAgICByZXR1cm4gbGNrLT5say5mbGFnczsKK30KKworc3RhdGljIHZvaWQKK19fa21wX3NldF90aWNrZXRfbG9ja19mbGFncygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2xvY2tfZmxhZ3NfdCBmbGFncyApCit7CisgICAgbGNrLT5say5mbGFncyA9IGZsYWdzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIHF1ZXVpbmcgbG9ja3MgKi8KKworLyoKKyAqIEZpcnN0IHRoZSBzdGF0ZXMKKyAqIChoZWFkLHRhaWwpID0gIDAsIDAgIG1lYW5zIGxvY2sgaXMgdW5oZWxkLCBub2JvZHkgb24gcXVldWUKKyAqICAgVUlOVF9NQVggb3IgLTEsIDAgIG1lYW5zIGxvY2sgaXMgaGVsZCwgbm9ib2R5IG9uIHF1ZXVlCisgKiAgICAgICAgICAgICAgICBoLCBoICBtZWFucyBsb2NrIGlzIGhlbGQgb3IgYWJvdXQgdG8gdHJhbnNpdGlvbiwgMSBlbGVtZW50IG9uIHF1ZXVlCisgKiAgICAgICAgICAgICAgICBoLCB0ICBoIDw+IHQsIG1lYW5zIGxvY2sgaXMgaGVsZCBvciBhYm91dCB0byB0cmFuc2l0aW9uLCA+MSBlbGVtZW50cyBvbiBxdWV1ZQorICoKKyAqIE5vdyB0aGUgdHJhbnNpdGlvbnMKKyAqICAgIEFjcXVpcmUoMCwwKSAgPSAtMSAsMAorICogICAgUmVsZWFzZSgwLDApICA9IEVycm9yCisgKiAgICBBY3F1aXJlKC0xLDApID0gIGggLGggICAgaCA+IDAKKyAqICAgIFJlbGVhc2UoLTEsMCkgPSAgMCAsMAorICogICAgQWNxdWlyZShoLGgpICA9ICBoICx0ICAgIGggPiAwLCB0ID4gMCwgaCA8PiB0CisgKiAgICBSZWxlYXNlKGgsaCkgID0gLTEgLDAgICAgaCA+IDAKKyAqICAgIEFjcXVpcmUoaCx0KSAgPSAgaCAsdCcgICBoID4gMCwgdCA+IDAsIHQnID4gMCwgaCA8PiB0LCBoIDw+IHQnLCB0IDw+IHQnCisgKiAgICBSZWxlYXNlKGgsdCkgID0gIGgnLHQgICAgaCA+IDAsIHQgPiAwLCBoIDw+IHQsIGggPD4gaCcsIGgnIG1heWJlID0gdAorICoKKyAqIEFuZCBwaWN0b3JpYWxseQorICoKKyAqCisgKiAgICAgICAgICArLS0tLS0rCisgKiAgICAgICAgICB8IDAsIDB8LS0tLS0tLSByZWxlYXNlIC0tLS0tLS0+IEVycm9yCisgKiAgICAgICAgICArLS0tLS0rCisgKiAgICAgICAgICAgIHwgIF4KKyAqICAgICBhY3F1aXJlfCAgfHJlbGVhc2UKKyAqICAgICAgICAgICAgfCAgfAorICogICAgICAgICAgICB8ICB8CisgKiAgICAgICAgICAgIHYgIHwKKyAqICAgICAgICAgICstLS0tLSsKKyAqICAgICAgICAgIHwtMSwgMHwKKyAqICAgICAgICAgICstLS0tLSsKKyAqICAgICAgICAgICAgfCAgXgorICogICAgIGFjcXVpcmV8ICB8cmVsZWFzZQorICogICAgICAgICAgICB8ICB8CisgKiAgICAgICAgICAgIHwgIHwKKyAqICAgICAgICAgICAgdiAgfAorICogICAgICAgICAgKy0tLS0tKworICogICAgICAgICAgfCBoLCBofAorICogICAgICAgICAgKy0tLS0tKworICogICAgICAgICAgICB8ICBeCisgKiAgICAgYWNxdWlyZXwgIHxyZWxlYXNlCisgKiAgICAgICAgICAgIHwgIHwKKyAqICAgICAgICAgICAgfCAgfAorICogICAgICAgICAgICB2ICB8CisgKiAgICAgICAgICArLS0tLS0rCisgKiAgICAgICAgICB8IGgsIHR8LS0tLS0gYWNxdWlyZSwgcmVsZWFzZSBsb29wYmFjayAtLS0rCisgKiAgICAgICAgICArLS0tLS0rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgIF4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKgorICovCisKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisKKy8qIFN0dWZmIGZvciBjaXJjdWxhciB0cmFjZSBidWZmZXIgKi8KKyNkZWZpbmUgVFJBQ0VfQlVGX0VMRQkxMDI0CitzdGF0aWMgY2hhciB0cmFjZXNbVFJBQ0VfQlVGX0VMRV1bMTI4XSA9IHsgMCB9CitzdGF0aWMgaW50IHRjID0gMDsKKyNkZWZpbmUgVFJBQ0VfTE9DSyhYLFkpICAgICAgICAgIHNwcmludGYoIHRyYWNlc1t0YysrICUgVFJBQ0VfQlVGX0VMRV0sICJ0JWQgYXQgJXNcbiIsIFgsIFkgKTsKKyNkZWZpbmUgVFJBQ0VfTE9DS19UKFgsWSxaKSAgICAgIHNwcmludGYoIHRyYWNlc1t0YysrICUgVFJBQ0VfQlVGX0VMRV0sICJ0JWQgYXQgJXMlZFxuIiwgWCxZLFogKTsKKyNkZWZpbmUgVFJBQ0VfTE9DS19IVChYLFksWixRKSAgIHNwcmludGYoIHRyYWNlc1t0YysrICUgVFJBQ0VfQlVGX0VMRV0sICJ0JWQgYXQgJXMgJWQsJWRcbiIsIFgsIFksIFosIFEgKTsKKworc3RhdGljIHZvaWQKK19fa21wX2R1bXBfcXVldWluZ19sb2NrKCBrbXBfaW5mb190ICp0aGlzX3Rociwga21wX2ludDMyIGd0aWQsCisgIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgaGVhZF9pZCwga21wX2ludDMyIHRhaWxfaWQgKQoreworICAgIGttcF9pbnQzMiB0LCBpOworCisgICAgX19rbXBfcHJpbnRmX25vX2xvY2soICJcbl9fa21wX2R1bXBfcXVldWluZ19sb2NrOiBUUkFDRSBCRUdJTlMgSEVSRSEgXG4iICk7CisKKyAgICBpID0gdGMgJSBUUkFDRV9CVUZfRUxFOworICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCAiJXNcbiIsIHRyYWNlc1tpXSApOworICAgIGkgPSAoaSsxKSAlIFRSQUNFX0JVRl9FTEU7CisgICAgd2hpbGUgKCBpICE9ICh0YyAlIFRSQUNFX0JVRl9FTEUpICkgeworICAgICAgICBfX2ttcF9wcmludGZfbm9fbG9jayggIiVzIiwgdHJhY2VzW2ldICk7CisgICAgICAgIGkgPSAoaSsxKSAlIFRSQUNFX0JVRl9FTEU7CisgICAgfQorICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCAiXG4iICk7CisKKyAgICBfX2ttcF9wcmludGZfbm9fbG9jaygKKyAgICAgICAgICAgICAiXG5fX2ttcF9kdW1wX3F1ZXVpbmdfbG9jazogZ3RpZCsxOiVkLCBzcGluX2hlcmU6JWQsIG5leHRfd2FpdDolZCwgaGVhZF9pZDolZCwgdGFpbF9pZDolZFxuIiwKKyAgICAgICAgICAgICBndGlkKzEsIHRoaXNfdGhyLT50aC50aF9zcGluX2hlcmUsIHRoaXNfdGhyLT50aC50aF9uZXh0X3dhaXRpbmcsCisgICAgICAgICAgICAgaGVhZF9pZCwgdGFpbF9pZCApOworCisgICAgX19rbXBfcHJpbnRmX25vX2xvY2soICJcdFx0aGVhZDogJWQgIiwgbGNrLT5say5oZWFkX2lkICk7CisKKyAgICBpZiAoIGxjay0+bGsuaGVhZF9pZCA+PSAxICkgeworICAgICAgICB0ID0gX19rbXBfdGhyZWFkc1tsY2stPmxrLmhlYWRfaWQtMV0tPnRoLnRoX25leHRfd2FpdGluZzsKKyAgICAgICAgd2hpbGUgKHQgPiAwKSB7CisgICAgICAgICAgICBfX2ttcF9wcmludGZfbm9fbG9jayggIi0+ICVkICIsIHQgKTsKKyAgICAgICAgICAgIHQgPSBfX2ttcF90aHJlYWRzW3QtMV0tPnRoLnRoX25leHRfd2FpdGluZzsKKyAgICAgICAgfQorICAgIH0KKyAgICBfX2ttcF9wcmludGZfbm9fbG9jayggIjsgIHRhaWw6ICVkICIsIGxjay0+bGsudGFpbF9pZCApOworICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCAiXG5cbiIgKTsKK30KKworI2VuZGlmIC8qIERFQlVHX1FVRVVJTkdfTE9DS1MgKi8KKworc3RhdGljIGttcF9pbnQzMgorX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lcigga21wX3F1ZXVpbmdfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBUQ1JfNCggbGNrLT5say5vd25lcl9pZCApIC0gMTsKK30KKworc3RhdGljIGlubGluZSBib29sCitfX2ttcF9pc19xdWV1aW5nX2xvY2tfbmVzdGFibGUoIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrICkKK3sKKyAgICByZXR1cm4gbGNrLT5say5kZXB0aF9sb2NrZWQgIT0gLTE7Cit9CisKKy8qIEFjcXVpcmUgYSBsb2NrIHVzaW5nIGEgdGhlIHF1ZXVpbmcgbG9jayBpbXBsZW1lbnRhdGlvbiAqLwordGVtcGxhdGUgPGJvb2wgdGFrZVRpbWU+CisvKiBbVExXXSBUaGUgdW51c2VkIHRlbXBsYXRlIGFib3ZlIGlzIGxlZnQgYmVoaW5kIGJlY2F1c2Ugb2Ygd2hhdCBCRUIgYmVsaWV2ZXMgaXMgYQorICAgcG90ZW50aWFsIGNvbXBpbGVyIHByb2JsZW0gd2l0aCBfX2ZvcmNlaW5saW5lLiAqLworX19mb3JjZWlubGluZSBzdGF0aWMgdm9pZAorX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2tfdGltZWRfdGVtcGxhdGUoIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLAorICBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgcmVnaXN0ZXIga21wX2luZm9fdCAqdGhpc190aHIgICAgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAgdm9sYXRpbGUga21wX2ludDMyICAqaGVhZF9pZF9wICAgPSAmIGxjay0+bGsuaGVhZF9pZDsKKyAgICB2b2xhdGlsZSBrbXBfaW50MzIgICp0YWlsX2lkX3AgICA9ICYgbGNrLT5say50YWlsX2lkOworICAgIHZvbGF0aWxlIGttcF91aW50MzIgKnNwaW5faGVyZV9wOworICAgIGttcF9pbnQzMiBuZWVkX21mID0gMTsKKworICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX2FjcXVpcmVfcXVldWluZ19sb2NrOiBsY2s6JXAsIFQjJWQgZW50ZXJpbmdcbiIsIGxjaywgZ3RpZCApKTsKKworICAgIEtNUF9GU1lOQ19QUkVQQVJFKCBsY2sgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3RociAhPSBOVUxMICk7CisgICAgc3Bpbl9oZXJlX3AgPSAmIHRoaXNfdGhyLT50aC50aF9zcGluX2hlcmU7CisKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgVFJBQ0VfTE9DSyggZ3RpZCsxLCAiYWNxIGVudCIgKTsKKyAgICBpZiAoICpzcGluX2hlcmVfcCApCisgICAgICAgIF9fa21wX2R1bXBfcXVldWluZ19sb2NrKCB0aGlzX3RociwgZ3RpZCwgbGNrLCAqaGVhZF9pZF9wLCAqdGFpbF9pZF9wICk7CisgICAgaWYgKCB0aGlzX3Roci0+dGgudGhfbmV4dF93YWl0aW5nICE9IDAgKQorICAgICAgICBfX2ttcF9kdW1wX3F1ZXVpbmdfbG9jayggdGhpc190aHIsIGd0aWQsIGxjaywgKmhlYWRfaWRfcCwgKnRhaWxfaWRfcCApOworI2VuZGlmCisgICAgS01QX0RFQlVHX0FTU0VSVCggISpzcGluX2hlcmVfcCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyLT50aC50aF9uZXh0X3dhaXRpbmcgPT0gMCApOworCisKKyAgICAvKiBUaGUgZm9sbG93aW5nIHN0LnJlbCB0byBzcGluX2hlcmVfcCBuZWVkcyB0byBwcmVjZWRlIHRoZSBjbXB4Y2hnLmFjcSB0byBoZWFkX2lkX3AKKyAgICAgICB0aGF0IG1heSBmb2xsb3csIG5vdCBqdXN0IGluIGV4ZWN1dGlvbiBvcmRlciwgYnV0IGFsc28gaW4gdmlzaWJpbGl0eSBvcmRlci4gIFRoaXMgd2F5LAorICAgICAgIHdoZW4gYSByZWxlYXNpbmcgdGhyZWFkIG9ic2VydmVzIHRoZSBjaGFuZ2VzIHRvIHRoZSBxdWV1ZSBieSB0aGlzIHRocmVhZCwgaXQgY2FuCisgICAgICAgcmlnaHRseSBhc3N1bWUgdGhhdCBzcGluX2hlcmVfcCBoYXMgYWxyZWFkeSBiZWVuIHNldCB0byBUUlVFLCBzbyB0aGF0IHdoZW4gaXQgc2V0cworICAgICAgIHNwaW5faGVyZV9wIHRvIEZBTFNFLCBpdCBpcyBub3QgcHJlbWF0dXJlLiAgSWYgdGhlIHJlbGVhc2luZyB0aHJlYWQgc2V0cyBzcGluX2hlcmVfcAorICAgICAgIHRvIEZBTFNFIGJlZm9yZSB0aGlzIHRocmVhZCBzZXRzIGl0IHRvIFRSVUUsIHRoaXMgdGhyZWFkIHdpbGwgaGFuZy4KKyAgICAqLworICAgICpzcGluX2hlcmVfcCA9IFRSVUU7ICAvKiBiZWZvcmUgZW5xdWV1aW5nIHRvIHByZXZlbnQgcmFjZSAqLworCisgICAgd2hpbGUoIDEgKSB7CisgICAgICAgIGttcF9pbnQzMiBlbnF1ZXVlZDsKKyAgICAgICAga21wX2ludDMyIGhlYWQ7CisgICAgICAgIGttcF9pbnQzMiB0YWlsOworCisgICAgICAgIGhlYWQgPSAqaGVhZF9pZF9wOworCisgICAgICAgIHN3aXRjaCAoIGhlYWQgKSB7CisKKyAgICAgICAgICAgIGNhc2UgLTE6CisgICAgICAgICAgICB7CisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgICAgICAgICAgICAgIHRhaWwgPSAqdGFpbF9pZF9wOworICAgICAgICAgICAgICAgIFRSQUNFX0xPQ0tfSFQoIGd0aWQrMSwgImFjcSByZWFkOiAiLCBoZWFkLCB0YWlsICk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICB0YWlsID0gMDsgIC8qIHRvIG1ha2Ugc3VyZSBuZXh0IGxpbmsgYXN5bmNocm9ub3VzbHkgcmVhZCBpcyBub3Qgc2V0IGFjY2lkZW50YWxseTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgYXNzaWdubWVudCBwcmV2ZW50cyB1cyBmcm9tIGVudGVyaW5nIHRoZSBpZiAoIHQgPiAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbiBpbiB0aGUgZW5xdWV1ZWQgY2FzZSBiZWxvdywgd2hpY2ggaXMgbm90IG5lY2Vzc2FyeSBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgc3RhdGUgdHJhbnNpdGlvbiAqLworCisgICAgICAgICAgICAgICAgbmVlZF9tZiA9IDA7CisgICAgICAgICAgICAgICAgLyogdHJ5ICgtMSwwKS0+KHRpZCx0aWQpICovCisgICAgICAgICAgICAgICAgZW5xdWV1ZWQgPSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRNjQoICh2b2xhdGlsZSBrbXBfaW50NjQgKikgdGFpbF9pZF9wLAorICAgICAgICAgICAgICAgICAgS01QX1BBQ0tfNjQoIC0xLCAwICksCisgICAgICAgICAgICAgICAgICBLTVBfUEFDS182NCggZ3RpZCsxLCBndGlkKzEgKSApOworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgICAgICAgICAgICAgIGlmICggZW5xdWV1ZWQgKSBUUkFDRV9MT0NLKCBndGlkKzEsICJhY3EgZW5xOiAoLTEsMCktPih0aWQsdGlkKSIgKTsKKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGFpbCA9ICp0YWlsX2lkX3A7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGFpbCAhPSBndGlkICsgMSApOworCisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgICAgICAgICAgICAgIFRSQUNFX0xPQ0tfSFQoIGd0aWQrMSwgImFjcSByZWFkOiAiLCBoZWFkLCB0YWlsICk7CisjZW5kaWYKKworICAgICAgICAgICAgICAgIGlmICggdGFpbCA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICBlbnF1ZXVlZCA9IEZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbmVlZF9tZiA9IDA7CisgICAgICAgICAgICAgICAgICAgIC8qIHRyeSAoaCx0KSBvciAoaCxoKS0+KGgsdGlkKSAqLworICAgICAgICAgICAgICAgICAgICBlbnF1ZXVlZCA9IEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMiggdGFpbF9pZF9wLCB0YWlsLCBndGlkKzEgKTsKKworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggZW5xdWV1ZWQgKSBUUkFDRV9MT0NLKCBndGlkKzEsICJhY3EgZW5xOiAoaCx0KS0+KGgsdGlkKSIgKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDA6IC8qIGVtcHR5IHF1ZXVlICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAga21wX2ludDMyIGdyYWJiZWRfbG9jazsKKworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgICAgICAgICAgICB0YWlsID0gKnRhaWxfaWRfcDsKKyAgICAgICAgICAgICAgICBUUkFDRV9MT0NLX0hUKCBndGlkKzEsICJhY3EgcmVhZDogIiwgaGVhZCwgdGFpbCApOworI2VuZGlmCisgICAgICAgICAgICAgICAgLyogdHJ5ICgwLDApLT4oLTEsMCkgKi8KKworICAgICAgICAgICAgICAgIC8qIG9ubHkgbGVnYWwgdHJhbnNpdGlvbiBvdXQgb2YgaGVhZCA9IDAgaXMgaGVhZCA9IC0xIHdpdGggbm8gY2hhbmdlIHRvIHRhaWwgKi8KKyAgICAgICAgICAgICAgICBncmFiYmVkX2xvY2sgPSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoIGhlYWRfaWRfcCwgMCwgLTEgKTsKKworICAgICAgICAgICAgICAgIGlmICggZ3JhYmJlZF9sb2NrICkgeworCisgICAgICAgICAgICAgICAgICAgICpzcGluX2hlcmVfcCA9IEZBTFNFOworCisgICAgICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX2FjcXVpcmVfcXVldWluZ19sb2NrOiBsY2s6JXAsIFQjJWQgZXhpdGluZzogbm8gcXVldWluZ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxjaywgZ3RpZCApKTsKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgICAgICAgICAgICAgIFRSQUNFX0xPQ0tfSFQoIGd0aWQrMSwgImFjcSBleGl0OiAiLCBoZWFkLCAwICk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgS01QX0ZTWU5DX0FDUVVJUkVEKCBsY2sgKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAvKiBsb2NrIGhvbGRlciBjYW5ub3QgYmUgb24gcXVldWUgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZW5xdWV1ZWQgPSBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBlbnF1ZXVlZCApIHsKKyAgICAgICAgICAgIGlmICggdGFpbCA+IDAgKSB7CisgICAgICAgICAgICAgICAga21wX2luZm9fdCAqdGFpbF90aHIgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCB0YWlsIC0gMSApOworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoIHRhaWxfdGhyICE9IE5VTEwgKTsKKyAgICAgICAgICAgICAgICB0YWlsX3Roci0+dGgudGhfbmV4dF93YWl0aW5nID0gZ3RpZCsxOworICAgICAgICAgICAgICAgIC8qIGNvcnJlc3BvbmRpbmcgd2FpdCBmb3IgdGhpcyB3cml0ZSBpbiByZWxlYXNlIGNvZGUgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX2FjcXVpcmVfcXVldWluZ19sb2NrOiBsY2s6JXAsIFQjJWQgd2FpdGluZyBmb3IgbG9ja1xuIiwgbGNrLCBndGlkICkpOworCisKKyAgICAgICAgICAgIC8qIFRvRG86IE1heSB3YW50IHRvIGNvbnNpZGVyIHVzaW5nIF9fa21wX3dhaXRfc2xlZXAgIG9yIHNvbWV0aGluZyB0aGF0IHNsZWVwcyBmb3IKKyAgICAgICAgICAgICAqICAgICAgIHRocm91Z2hwdXQgb25seSBoZXJlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgICAgIEtNUF9XQUlUX1lJRUxEKHNwaW5faGVyZV9wLCBGQUxTRSwgS01QX0VRLCBsY2spOworCisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgICAgICAgICAgVFJBQ0VfTE9DSyggZ3RpZCsxLCAiYWNxIHNwaW4iICk7CisKKyAgICAgICAgICAgIGlmICggdGhpc190aHItPnRoLnRoX25leHRfd2FpdGluZyAhPSAwICkKKyAgICAgICAgICAgICAgICBfX2ttcF9kdW1wX3F1ZXVpbmdfbG9jayggdGhpc190aHIsIGd0aWQsIGxjaywgKmhlYWRfaWRfcCwgKnRhaWxfaWRfcCApOworI2VuZGlmCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3Roci0+dGgudGhfbmV4dF93YWl0aW5nID09IDAgKTsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX2FjcXVpcmVfcXVldWluZ19sb2NrOiBsY2s6JXAsIFQjJWQgZXhpdGluZzogYWZ0ZXIgd2FpdGluZyBvbiBxdWV1ZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBsY2ssIGd0aWQgKSk7CisKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgICAgICBUUkFDRV9MT0NLKCBndGlkKzEsICJhY3EgZXhpdCAyIiApOworI2VuZGlmCisgICAgICAgICAgICAvKiBnb3QgbG9jaywgd2Ugd2VyZSBkZXF1ZXVlZCBieSB0aGUgdGhyZWFkIHRoYXQgcmVsZWFzZWQgbG9jayAqLworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLyogWWllbGQgaWYgbnVtYmVyIG9mIHRocmVhZHMgPiBudW1iZXIgb2YgbG9naWNhbCBwcm9jZXNzb3JzICovCisgICAgICAgIC8qIFRvRG86IE5vdCBzdXJlIHdoeSB0aGlzIHNob3VsZCBvbmx5IGJlIGluIG92ZXJzdWJzY3JpcHRpb24gY2FzZSwKKyAgICAgICAgICAgbWF5YmUgc2hvdWxkIGJlIHRyYWRpdGlvbmFsIFlJRUxEX0lOSVQvWUlFTERfV0hFTiBsb29wICovCisgICAgICAgIEtNUF9ZSUVMRCggVENSXzQoIF9fa21wX250aCApID4gKF9fa21wX2F2YWlsX3Byb2MgPyBfX2ttcF9hdmFpbF9wcm9jIDoKKyAgICAgICAgICBfX2ttcF94cHJvYyApICk7CisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgICAgICBUUkFDRV9MT0NLKCBndGlkKzEsICJhY3EgcmV0cnkiICk7CisjZW5kaWYKKworICAgIH0KKyAgICBLTVBfQVNTRVJUMiggMCwgInNob3VsZCBub3QgZ2V0IGhlcmUiICk7Cit9CisKK3ZvaWQKK19fa21wX2FjcXVpcmVfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIGd0aWQgPj0gMCApOworCisgICAgX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2tfdGltZWRfdGVtcGxhdGU8ZmFsc2U+KCBsY2ssIGd0aWQgKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2FjcXVpcmVfcXVldWluZ19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywKKyAga21wX2ludDMyIGd0aWQgKQoreworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfc2V0X2xvY2siOworICAgICAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBfX2ttcF9pc19xdWV1aW5nX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2dldF9xdWV1aW5nX2xvY2tfb3duZXIoIGxjayApID09IGd0aWQgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tJc0FscmVhZHlPd25lZCwgZnVuYyApOworICAgICAgICB9CisgICAgfQorCisgICAgX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2soIGxjaywgZ3RpZCApOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGxjay0+bGsub3duZXJfaWQgPSBndGlkICsgMTsKKyAgICB9Cit9CisKK2ludAorX19rbXBfdGVzdF9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgdm9sYXRpbGUga21wX2ludDMyICpoZWFkX2lkX3AgID0gJiBsY2stPmxrLmhlYWRfaWQ7CisgICAga21wX2ludDMyIGhlYWQ7CisjaWZkZWYgS01QX0RFQlVHCisgICAga21wX2luZm9fdCAqdGhpc190aHI7CisjZW5kaWYKKworICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX3Rlc3RfcXVldWluZ19sb2NrOiBUIyVkIGVudGVyaW5nXG4iLCBndGlkICkpOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGd0aWQgPj0gMCApOworI2lmZGVmIEtNUF9ERUJVRworICAgIHRoaXNfdGhyID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZCggZ3RpZCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyICE9IE5VTEwgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCAhdGhpc190aHItPnRoLnRoX3NwaW5faGVyZSApOworI2VuZGlmCisKKyAgICBoZWFkID0gKmhlYWRfaWRfcDsKKworICAgIGlmICggaGVhZCA9PSAwICkgeyAvKiBub2JvZHkgb24gcXVldWUsIG5vYm9keSBob2xkaW5nICovCisKKyAgICAgICAgLyogdHJ5ICgwLDApLT4oLTEsMCkgKi8KKworICAgICAgICBpZiAoIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMiggaGVhZF9pZF9wLCAwLCAtMSApICkgeworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfdGVzdF9xdWV1aW5nX2xvY2s6IFQjJWQgZXhpdGluZzogaG9sZGluZyBsb2NrXG4iLCBndGlkICkpOworICAgICAgICAgICAgS01QX0ZTWU5DX0FDUVVJUkVEKGxjayk7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX3Rlc3RfcXVldWluZ19sb2NrOiBUIyVkIGV4aXRpbmc6IHdpdGhvdXQgbG9ja1xuIiwgZ3RpZCApKTsKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3Rlc3RfcXVldWluZ19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdGVzdF9sb2NrIjsKKyAgICAgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgICAgICB9CisgICAgICAgIGlmICggX19rbXBfaXNfcXVldWluZ19sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQgcmV0dmFsID0gX19rbXBfdGVzdF9xdWV1aW5nX2xvY2soIGxjaywgZ3RpZCApOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgJiYgcmV0dmFsICkgeworICAgICAgICBsY2stPmxrLm93bmVyX2lkID0gZ3RpZCArIDE7CisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisKK3ZvaWQKK19fa21wX3JlbGVhc2VfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIHJlZ2lzdGVyIGttcF9pbmZvX3QgKnRoaXNfdGhyOworICAgIHZvbGF0aWxlIGttcF9pbnQzMiAqaGVhZF9pZF9wID0gJiBsY2stPmxrLmhlYWRfaWQ7CisgICAgdm9sYXRpbGUga21wX2ludDMyICp0YWlsX2lkX3AgPSAmIGxjay0+bGsudGFpbF9pZDsKKworICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX3JlbGVhc2VfcXVldWluZ19sb2NrOiBsY2s6JXAsIFQjJWQgZW50ZXJpbmdcbiIsIGxjaywgZ3RpZCApKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKyAgICB0aGlzX3RociAgICA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3RociAhPSBOVUxMICk7CisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgIFRSQUNFX0xPQ0soIGd0aWQrMSwgInJlbCBlbnQiICk7CisKKyAgICBpZiAoIHRoaXNfdGhyLT50aC50aF9zcGluX2hlcmUgKQorICAgICAgICBfX2ttcF9kdW1wX3F1ZXVpbmdfbG9jayggdGhpc190aHIsIGd0aWQsIGxjaywgKmhlYWRfaWRfcCwgKnRhaWxfaWRfcCApOworICAgIGlmICggdGhpc190aHItPnRoLnRoX25leHRfd2FpdGluZyAhPSAwICkKKyAgICAgICAgX19rbXBfZHVtcF9xdWV1aW5nX2xvY2soIHRoaXNfdGhyLCBndGlkLCBsY2ssICpoZWFkX2lkX3AsICp0YWlsX2lkX3AgKTsKKyNlbmRpZgorICAgIEtNUF9ERUJVR19BU1NFUlQoICF0aGlzX3Roci0+dGgudGhfc3Bpbl9oZXJlICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHItPnRoLnRoX25leHRfd2FpdGluZyA9PSAwICk7CisKKyAgICBLTVBfRlNZTkNfUkVMRUFTSU5HKGxjayk7CisKKyAgICB3aGlsZSggMSApIHsKKyAgICAgICAga21wX2ludDMyIGRlcXVldWVkOworICAgICAgICBrbXBfaW50MzIgaGVhZDsKKyAgICAgICAga21wX2ludDMyIHRhaWw7CisKKyAgICAgICAgaGVhZCA9ICpoZWFkX2lkX3A7CisKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgIHRhaWwgPSAqdGFpbF9pZF9wOworICAgICAgICBUUkFDRV9MT0NLX0hUKCBndGlkKzEsICJyZWwgcmVhZDogIiwgaGVhZCwgdGFpbCApOworICAgICAgICBpZiAoIGhlYWQgPT0gMCApIF9fa21wX2R1bXBfcXVldWluZ19sb2NrKCB0aGlzX3RociwgZ3RpZCwgbGNrLCBoZWFkLCB0YWlsICk7CisjZW5kaWYKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggaGVhZCAhPSAwICk7IC8qIGhvbGRpbmcgdGhlIGxvY2ssIGhlYWQgbXVzdCBiZSAtMSBvciBxdWV1ZSBoZWFkICovCisKKyAgICAgICAgaWYgKCBoZWFkID09IC0xICkgeyAvKiBub2JvZHkgb24gcXVldWUgKi8KKworICAgICAgICAgICAgLyogdHJ5ICgtMSwwKS0+KDAsMCkgKi8KKyAgICAgICAgICAgIGlmICggS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDMyKCBoZWFkX2lkX3AsIC0xLCAwICkgKSB7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfcmVsZWFzZV9xdWV1aW5nX2xvY2s6IGxjazolcCwgVCMlZCBleGl0aW5nOiBxdWV1ZSBlbXB0eVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGNrLCBndGlkICkpOworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgICAgICAgICAgICBUUkFDRV9MT0NLX0hUKCBndGlkKzEsICJyZWwgZXhpdDogIiwgMCwgMCApOworI2VuZGlmCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVxdWV1ZWQgPSBGQUxTRTsKKworICAgICAgICB9CisgICAgICAgIGVsc2UgeworCisgICAgICAgICAgICB0YWlsID0gKnRhaWxfaWRfcDsKKyAgICAgICAgICAgIGlmICggaGVhZCA9PSB0YWlsICkgeyAgLyogb25seSBvbmUgdGhyZWFkIG9uIHRoZSBxdWV1ZSAqLworCisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgICAgICAgICAgICAgIGlmICggaGVhZCA8PSAwICkgX19rbXBfZHVtcF9xdWV1aW5nX2xvY2soIHRoaXNfdGhyLCBndGlkLCBsY2ssIGhlYWQsIHRhaWwgKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGhlYWQgPiAwICk7CisKKyAgICAgICAgICAgICAgICAvKiB0cnkgKGgsaCktPigtMSwwKSAqLworICAgICAgICAgICAgICAgIGRlcXVldWVkID0gS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDY0KCAoa21wX2ludDY0ICopIHRhaWxfaWRfcCwKKyAgICAgICAgICAgICAgICAgIEtNUF9QQUNLXzY0KCBoZWFkLCBoZWFkICksIEtNUF9QQUNLXzY0KCAtMSwgMCApICk7CisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgICAgICAgICAgICAgIFRSQUNFX0xPQ0soIGd0aWQrMSwgInJlbCBkZXE6IChoLGgpLT4oLTEsMCkiICk7CisjZW5kaWYKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgdm9sYXRpbGUga21wX2ludDMyICp3YWl0aW5nX2lkX3A7CisgICAgICAgICAgICAgICAga21wX2luZm9fdCAgICAgICAgICpoZWFkX3RociA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGhlYWQgLSAxICk7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggaGVhZF90aHIgIT0gTlVMTCApOworICAgICAgICAgICAgICAgIHdhaXRpbmdfaWRfcCA9ICYgaGVhZF90aHItPnRoLnRoX25leHRfd2FpdGluZzsKKworICAgICAgICAgICAgICAgIC8qIERvZXMgdGhpcyByZXF1aXJlIHN5bmNocm9ub3VzIHJlYWRzPyAqLworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgICAgICAgICAgICBpZiAoIGhlYWQgPD0gMCB8fCB0YWlsIDw9IDAgKSBfX2ttcF9kdW1wX3F1ZXVpbmdfbG9jayggdGhpc190aHIsIGd0aWQsIGxjaywgaGVhZCwgdGFpbCApOworI2VuZGlmCisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggaGVhZCA+IDAgJiYgdGFpbCA+IDAgKTsKKworICAgICAgICAgICAgICAgIC8qIHRyeSAoaCx0KS0+KGgnLHQpIG9yICh0LHQpICovCisKKyAgICAgICAgICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgICAgICAgICAvKiBtYWtlIHN1cmUgZW5xdWV1aW5nIHRocmVhZCBoYXMgdGltZSB0byB1cGRhdGUgbmV4dCB3YWl0aW5nIHRocmVhZCBmaWVsZCAqLworICAgICAgICAgICAgICAgICpoZWFkX2lkX3AgPSAoa21wX2ludDMyKSBLTVBfV0FJVF9ZSUVMRCgodm9sYXRpbGUga21wX3VpbnQqKSB3YWl0aW5nX2lkX3AsIDAsIEtNUF9ORVEsIE5VTEwpOworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgICAgICAgICAgICBUUkFDRV9MT0NLKCBndGlkKzEsICJyZWwgZGVxOiAoaCx0KS0+KGgnLHQpIiApOworI2VuZGlmCisgICAgICAgICAgICAgICAgZGVxdWV1ZWQgPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCBkZXF1ZXVlZCApIHsKKyAgICAgICAgICAgIGttcF9pbmZvX3QgKmhlYWRfdGhyID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZCggaGVhZCAtIDEgKTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGhlYWRfdGhyICE9IE5VTEwgKTsKKworICAgICAgICAgICAgLyogRG9lcyB0aGlzIHJlcXVpcmUgc3luY2hyb25vdXMgcmVhZHM/ICovCisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgICAgICAgICAgaWYgKCBoZWFkIDw9IDAgfHwgdGFpbCA8PSAwICkgX19rbXBfZHVtcF9xdWV1aW5nX2xvY2soIHRoaXNfdGhyLCBndGlkLCBsY2ssIGhlYWQsIHRhaWwgKTsKKyNlbmRpZgorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggaGVhZCA+IDAgJiYgdGFpbCA+IDAgKTsKKworICAgICAgICAgICAgLyogRm9yIGNsZWFuIGNvZGUgb25seS4KKyAgICAgICAgICAgICAqIFRocmVhZCBub3QgcmVsZWFzZWQgdW50aWwgbmV4dCBzdGF0ZW1lbnQgcHJldmVudHMgcmFjZSB3aXRoIGFjcXVpcmUgY29kZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaGVhZF90aHItPnRoLnRoX25leHRfd2FpdGluZyA9IDA7CisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgICAgICAgICAgVFJBQ0VfTE9DS19UKCBndGlkKzEsICJyZWwgbnc9MCBmb3IgdD0iLCBoZWFkICk7CisjZW5kaWYKKworICAgICAgICAgICAgS01QX01CKCk7CisgICAgICAgICAgICAvKiByZXNldCBzcGluIHZhbHVlICovCisgICAgICAgICAgICBoZWFkX3Roci0+dGgudGhfc3Bpbl9oZXJlID0gRkFMU0U7CisKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX3JlbGVhc2VfcXVldWluZ19sb2NrOiBsY2s6JXAsIFQjJWQgZXhpdGluZzogYWZ0ZXIgZGVxdWV1aW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGxjaywgZ3RpZCApKTsKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgICAgICBUUkFDRV9MT0NLKCBndGlkKzEsICJyZWwgZXhpdCAyIiApOworI2VuZGlmCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLyogS01QX0NQVV9QQVVTRSggKTsgIGRvbid0IHdhbnQgdG8gbWFrZSByZWxlYXNpbmcgdGhyZWFkIGhvbGQgdXAgYWNxdWlyaW5nIHRocmVhZHMgKi8KKworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgICAgVFJBQ0VfTE9DSyggZ3RpZCsxLCAicmVsIHJldHJ5IiApOworI2VuZGlmCisKKyAgICB9IC8qIHdoaWxlICovCisgICAgS01QX0FTU0VSVDIoIDAsICJzaG91bGQgbm90IGdldCBoZXJlIiApOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfcmVsZWFzZV9xdWV1aW5nX2xvY2tfd2l0aF9jaGVja3MoIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLAorICBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF91bnNldF9sb2NrIjsKKyAgICAgICAgS01QX01CKCk7ICAvKiBpbiBjYXNlIGFub3RoZXIgcHJvY2Vzc29yIGluaXRpYWxpemVkIGxvY2sgKi8KKyAgICAgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgICAgICB9CisgICAgICAgIGlmICggX19rbXBfaXNfcXVldWluZ19sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBfX2ttcF9nZXRfcXVldWluZ19sb2NrX293bmVyKCBsY2sgKSA9PSAtMSApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ0ZyZWUsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2dldF9xdWV1aW5nX2xvY2tfb3duZXIoIGxjayApICE9IGd0aWQgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tVbnNldHRpbmdTZXRCeUFub3RoZXIsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBsY2stPmxrLm93bmVyX2lkID0gMDsKKyAgICB9CisgICAgX19rbXBfcmVsZWFzZV9xdWV1aW5nX2xvY2soIGxjaywgZ3RpZCApOworfQorCit2b2lkCitfX2ttcF9pbml0X3F1ZXVpbmdfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICpsY2sgKQoreworICAgIGxjay0+bGsubG9jYXRpb24gPSBOVUxMOworICAgIGxjay0+bGsuaGVhZF9pZCA9IDA7CisgICAgbGNrLT5say50YWlsX2lkID0gMDsKKyAgICBsY2stPmxrLm5leHRfdGlja2V0ID0gMDsKKyAgICBsY2stPmxrLm5vd19zZXJ2aW5nID0gMDsKKyAgICBsY2stPmxrLm93bmVyX2lkID0gMDsgICAgICAvLyBubyB0aHJlYWQgb3ducyB0aGUgbG9jay4KKyAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IC0xOyAvLyA+PSAwIGZvciBuZXN0YWJsZSBsb2NrcywgLTEgZm9yIHNpbXBsZSBsb2Nrcy4KKyAgICBsY2stPmxrLmluaXRpYWxpemVkID0gbGNrOworCisgICAgS0FfVFJBQ0UoMTAwMCwgKCJfX2ttcF9pbml0X3F1ZXVpbmdfbG9jazogbG9jayAlcCBpbml0aWFsaXplZFxuIiwgbGNrKSk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9pbml0X3F1ZXVpbmdfbG9ja193aXRoX2NoZWNrcygga21wX3F1ZXVpbmdfbG9ja190ICogbGNrICkKK3sKKyAgICBfX2ttcF9pbml0X3F1ZXVpbmdfbG9jayggbGNrICk7Cit9CisKK3ZvaWQKK19fa21wX2Rlc3Ryb3lfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjayApCit7CisgICAgbGNrLT5say5pbml0aWFsaXplZCA9IE5VTEw7CisgICAgbGNrLT5say5sb2NhdGlvbiA9IE5VTEw7CisgICAgbGNrLT5say5oZWFkX2lkID0gMDsKKyAgICBsY2stPmxrLnRhaWxfaWQgPSAwOworICAgIGxjay0+bGsubmV4dF90aWNrZXQgPSAwOworICAgIGxjay0+bGsubm93X3NlcnZpbmcgPSAwOworICAgIGxjay0+bGsub3duZXJfaWQgPSAwOworICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gLTE7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9kZXN0cm95X3F1ZXVpbmdfbG9ja193aXRoX2NoZWNrcygga21wX3F1ZXVpbmdfbG9ja190ICpsY2sgKQoreworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfZGVzdHJveV9sb2NrIjsKKyAgICAgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgICAgICB9CisgICAgICAgIGlmICggX19rbXBfaXNfcXVldWluZ19sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBfX2ttcF9nZXRfcXVldWluZ19sb2NrX293bmVyKCBsY2sgKSAhPSAtMSApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja1N0aWxsT3duZWQsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBfX2ttcF9kZXN0cm95X3F1ZXVpbmdfbG9jayggbGNrICk7Cit9CisKKworLy8KKy8vIG5lc3RlZCBxdWV1aW5nIGxvY2tzCisvLworCit2b2lkCitfX2ttcF9hY3F1aXJlX25lc3RlZF9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisKKyAgICBpZiAoIF9fa21wX2dldF9xdWV1aW5nX2xvY2tfb3duZXIoIGxjayApID09IGd0aWQgKSB7CisgICAgICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkICs9IDE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBfX2ttcF9hY3F1aXJlX3F1ZXVpbmdfbG9ja190aW1lZF90ZW1wbGF0ZTxmYWxzZT4oIGxjaywgZ3RpZCApOworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAxOworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgbGNrLT5say5vd25lcl9pZCA9IGd0aWQgKyAxOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK19fa21wX2FjcXVpcmVfbmVzdGVkX3F1ZXVpbmdfbG9ja193aXRoX2NoZWNrcygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3NldF9uZXN0X2xvY2siOworICAgICAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAhIF9fa21wX2lzX3F1ZXVpbmdfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgICAgICB9CisgICAgfQorICAgIF9fa21wX2FjcXVpcmVfbmVzdGVkX3F1ZXVpbmdfbG9jayggbGNrLCBndGlkICk7Cit9CisKK2ludAorX19rbXBfdGVzdF9uZXN0ZWRfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGludCByZXR2YWw7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKworICAgIGlmICggX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lciggbGNrICkgPT0gZ3RpZCApIHsKKyAgICAgICAgcmV0dmFsID0gKytsY2stPmxrLmRlcHRoX2xvY2tlZDsKKyAgICB9CisgICAgZWxzZSBpZiAoICFfX2ttcF90ZXN0X3F1ZXVpbmdfbG9jayggbGNrLCBndGlkICkgKSB7CisgICAgICAgIHJldHZhbCA9IDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgcmV0dmFsID0gbGNrLT5say5kZXB0aF9sb2NrZWQgPSAxOworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgbGNrLT5say5vd25lcl9pZCA9IGd0aWQgKyAxOworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50CitfX2ttcF90ZXN0X25lc3RlZF9xdWV1aW5nX2xvY2tfd2l0aF9jaGVja3MoIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLAorICBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF90ZXN0X25lc3RfbG9jayI7CisgICAgICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoICEgX19rbXBfaXNfcXVldWluZ19sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIF9fa21wX3Rlc3RfbmVzdGVkX3F1ZXVpbmdfbG9jayggbGNrLCBndGlkICk7Cit9CisKK3ZvaWQKK19fa21wX3JlbGVhc2VfbmVzdGVkX3F1ZXVpbmdfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKworICAgIEtNUF9NQigpOworICAgIGlmICggLS0obGNrLT5say5kZXB0aF9sb2NrZWQpID09IDAgKSB7CisgICAgICAgIEtNUF9NQigpOworICAgICAgICBsY2stPmxrLm93bmVyX2lkID0gMDsKKyAgICAgICAgX19rbXBfcmVsZWFzZV9xdWV1aW5nX2xvY2soIGxjaywgZ3RpZCApOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK19fa21wX3JlbGVhc2VfbmVzdGVkX3F1ZXVpbmdfbG9ja193aXRoX2NoZWNrcygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Vuc2V0X25lc3RfbG9jayI7CisgICAgICAgIEtNUF9NQigpOyAgLyogaW4gY2FzZSBhbm90aGVyIHByb2Nlc3NvciBpbml0aWFsaXplZCBsb2NrICovCisgICAgICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoICEgX19rbXBfaXNfcXVldWluZ19sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBfX2ttcF9nZXRfcXVldWluZ19sb2NrX293bmVyKCBsY2sgKSA9PSAtMSApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ0ZyZWUsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2dldF9xdWV1aW5nX2xvY2tfb3duZXIoIGxjayApICE9IGd0aWQgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tVbnNldHRpbmdTZXRCeUFub3RoZXIsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBfX2ttcF9yZWxlYXNlX25lc3RlZF9xdWV1aW5nX2xvY2soIGxjaywgZ3RpZCApOworfQorCit2b2lkCitfX2ttcF9pbml0X25lc3RlZF9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqIGxjayApCit7CisgICAgX19rbXBfaW5pdF9xdWV1aW5nX2xvY2soIGxjayApOworICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMDsgLy8gPj0gMCBmb3IgbmVzdGFibGUgbG9ja3MsIC0xIGZvciBzaW1wbGUgbG9ja3MKK30KKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfbmVzdGVkX3F1ZXVpbmdfbG9ja193aXRoX2NoZWNrcygga21wX3F1ZXVpbmdfbG9ja190ICogbGNrICkKK3sKKyAgICBfX2ttcF9pbml0X25lc3RlZF9xdWV1aW5nX2xvY2soIGxjayApOworfQorCit2b2lkCitfX2ttcF9kZXN0cm95X25lc3RlZF9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrICkKK3sKKyAgICBfX2ttcF9kZXN0cm95X3F1ZXVpbmdfbG9jayggbGNrICk7CisgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAwOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVzdHJveV9uZXN0ZWRfcXVldWluZ19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjayApCit7CisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9kZXN0cm95X25lc3RfbG9jayI7CisgICAgICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoICEgX19rbXBfaXNfcXVldWluZ19sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBfX2ttcF9nZXRfcXVldWluZ19sb2NrX293bmVyKCBsY2sgKSAhPSAtMSApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja1N0aWxsT3duZWQsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBfX2ttcF9kZXN0cm95X25lc3RlZF9xdWV1aW5nX2xvY2soIGxjayApOworfQorCisKKy8vCisvLyBhY2Nlc3MgZnVuY3Rpb25zIHRvIGZpZWxkcyB3aGljaCBkb24ndCBleGlzdCBmb3IgYWxsIGxvY2sga2luZHMuCisvLworCitzdGF0aWMgaW50CitfX2ttcF9pc19xdWV1aW5nX2xvY2tfaW5pdGlhbGl6ZWQoIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrICkKK3sKKyAgICByZXR1cm4gbGNrID09IGxjay0+bGsuaW5pdGlhbGl6ZWQ7Cit9CisKK3N0YXRpYyBjb25zdCBpZGVudF90ICoKK19fa21wX2dldF9xdWV1aW5nX2xvY2tfbG9jYXRpb24oIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrICkKK3sKKyAgICByZXR1cm4gbGNrLT5say5sb2NhdGlvbjsKK30KKworc3RhdGljIHZvaWQKK19fa21wX3NldF9xdWV1aW5nX2xvY2tfbG9jYXRpb24oIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBjb25zdCBpZGVudF90ICpsb2MgKQoreworICAgIGxjay0+bGsubG9jYXRpb24gPSBsb2M7Cit9CisKK3N0YXRpYyBrbXBfbG9ja19mbGFnc190CitfX2ttcF9nZXRfcXVldWluZ19sb2NrX2ZsYWdzKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIGxjay0+bGsuZmxhZ3M7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zZXRfcXVldWluZ19sb2NrX2ZsYWdzKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2xvY2tfZmxhZ3NfdCBmbGFncyApCit7CisgICAgbGNrLT5say5mbGFncyA9IGZsYWdzOworfQorCisjaWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworCisvKgorICAgIFJUTSBBZGFwdGl2ZSBsb2NrcworKi8KKworLy8gVE9ETzogVXNlIHRoZSBoZWFkZXIgZm9yIGludHJpbnNpY3MgYmVsb3cgd2l0aCB0aGUgY29tcGlsZXIgMTMuMAorLy8jaW5jbHVkZSA8aW1taW50cmluLmg+CisKKy8vIFZhbHVlcyBmcm9tIHRoZSBzdGF0dXMgcmVnaXN0ZXIgYWZ0ZXIgZmFpbGVkIHNwZWN1bGF0aW9uLgorI2RlZmluZSBfWEJFR0lOX1NUQVJURUQgICAgICAgICAgKH4wdSkKKyNkZWZpbmUgX1hBQk9SVF9FWFBMSUNJVCAgICAgICAgICgxIDw8IDApCisjZGVmaW5lIF9YQUJPUlRfUkVUUlkgICAgICAgICAgICAoMSA8PCAxKQorI2RlZmluZSBfWEFCT1JUX0NPTkZMSUNUICAgICAgICAgKDEgPDwgMikKKyNkZWZpbmUgX1hBQk9SVF9DQVBBQ0lUWSAgICAgICAgICgxIDw8IDMpCisjZGVmaW5lIF9YQUJPUlRfREVCVUcgICAgICAgICAgICAoMSA8PCA0KQorI2RlZmluZSBfWEFCT1JUX05FU1RFRCAgICAgICAgICAgKDEgPDwgNSkKKyNkZWZpbmUgX1hBQk9SVF9DT0RFKHgpICAgICAgICAgICgodW5zaWduZWQgY2hhcikoKCh4KSA+PiAyNCkgJiAweEZGKSkKKworLy8gQWJvcnRzIGZvciB3aGljaCBpdCdzIHdvcnRoIHRyeWluZyBhZ2FpbiBpbW1lZGlhdGVseQorI2RlZmluZSBTT0ZUX0FCT1JUX01BU0sgIChfWEFCT1JUX1JFVFJZIHwgX1hBQk9SVF9DT05GTElDVCB8IF9YQUJPUlRfRVhQTElDSVQpCisKKyNkZWZpbmUgU1RSSU5HSVpFX0lOVEVSTkFMKGFyZykgI2FyZworI2RlZmluZSBTVFJJTkdJWkUoYXJnKSBTVFJJTkdJWkVfSU5URVJOQUwoYXJnKQorCisvLyBBY2Nlc3MgdG8gUlRNIGluc3RydWN0aW9ucworCisvKgorICBBIHZlcnNpb24gb2YgWEJlZ2luIHdoaWNoIHJldHVybnMgLTEgb24gc3BlY3VsYXRpb24sIGFuZCB0aGUgdmFsdWUgb2YgRUFYIG9uIGFuIGFib3J0LgorICBUaGlzIGlzIHRoZSBzYW1lIGRlZmluaXRpb24gYXMgdGhlIGNvbXBpbGVyIGludHJpbnNpYyB0aGF0IHdpbGwgYmUgc3VwcG9ydGVkIGF0IHNvbWUgcG9pbnQuCisqLworc3RhdGljIF9faW5saW5lIGludCBfeGJlZ2luKCkKK3sKKyAgICBpbnQgcmVzID0gLTE7CisKKyNpZiBLTVBfT1NfV0lORE9XUworI2lmIEtNUF9BUkNIX1g4Nl82NAorICAgIF9hc20geworICAgICAgICBfZW1pdCAweEM3CisgICAgICAgIF9lbWl0IDB4RjgKKyAgICAgICAgX2VtaXQgMgorICAgICAgICBfZW1pdCAwCisgICAgICAgIF9lbWl0IDAKKyAgICAgICAgX2VtaXQgMAorICAgICAgICBqbXAgICBMMgorICAgICAgICBtb3YgICByZXMsIGVheAorICAgIEwyOgorICAgIH0KKyNlbHNlIC8qIElBMzIgKi8KKyAgICBfYXNtIHsKKyAgICAgICAgX2VtaXQgMHhDNworICAgICAgICBfZW1pdCAweEY4CisgICAgICAgIF9lbWl0IDIKKyAgICAgICAgX2VtaXQgMAorICAgICAgICBfZW1pdCAwCisgICAgICAgIF9lbWl0IDAKKyAgICAgICAgam1wICAgTDIKKyAgICAgICAgbW92ICAgcmVzLCBlYXgKKyAgICBMMjoKKyAgICB9CisjZW5kaWYgLy8gS01QX0FSQ0hfWDg2XzY0CisjZWxzZQorICAgIC8qIE5vdGUgdGhhdCAlZWF4IG11c3QgYmUgbm90ZWQgYXMga2lsbGVkIChjbG9iYmVyZWQpLCBiZWNhdXNlCisgICAgICogdGhlIFhTUiBpcyByZXR1cm5lZCBpbiAlZWF4KCVyYXgpIG9uIGFib3J0LiAgT3RoZXIgcmVnaXN0ZXIKKyAgICAgKiB2YWx1ZXMgYXJlIHJlc3RvcmVkLCBzbyBkb24ndCBuZWVkIHRvIGJlIGtpbGxlZC4KKyAgICAgKgorICAgICAqIFdlIG11c3QgYWxzbyBtYXJrICdyZXMnIGFzIGFuIGlucHV0IGFuZCBhbiBvdXRwdXQsIHNpbmNlIG90aGVyd2lzZQorICAgICAqICdyZXM9LTEnIG1heSBiZSBkcm9wcGVkIGFzIGJlaW5nIGRlYWQsIHdoZXJlYXMgd2UgZG8gbmVlZCB0aGUKKyAgICAgKiBhc3NpZ25tZW50IG9uIHRoZSBzdWNjZXNzZnVsIChpLmUuLCBub24tYWJvcnQpIHBhdGguCisgICAgICovCisgICAgX19hc21fXyB2b2xhdGlsZSAoIjE6IC5ieXRlICAweEM3OyAuYnl0ZSAweEY4O1xuIgorICAgICAgICAgICAgICAgICAgICAgICIgICAubG9uZyAgMWYtMWItNlxuIgorICAgICAgICAgICAgICAgICAgICAgICIgICAgam1wICAgMmZcbiIKKyAgICAgICAgICAgICAgICAgICAgICAiMTogIG1vdmwgICUlZWF4LCUwXG4iCisgICAgICAgICAgICAgICAgICAgICAgIjI6IgorICAgICAgICAgICAgICAgICAgICAgIDoiK3IiKHJlcyk6OiJtZW1vcnkiLCIlZWF4Iik7CisjZW5kaWYgLy8gS01QX09TX1dJTkRPV1MKKyAgICByZXR1cm4gcmVzOworfQorCisvKgorICBUcmFuc2FjdGlvbiBlbmQKKyovCitzdGF0aWMgX19pbmxpbmUgdm9pZCBfeGVuZCgpCit7CisjaWYgS01QX09TX1dJTkRPV1MKKyAgICBfX2FzbSAgeworICAgICAgICBfZW1pdCAweDBmCisgICAgICAgIF9lbWl0IDB4MDEKKyAgICAgICAgX2VtaXQgMHhkNQorICAgIH0KKyNlbHNlCisgICAgX19hc21fXyB2b2xhdGlsZSAoIi5ieXRlIDB4MGY7IC5ieXRlIDB4MDE7IC5ieXRlIDB4ZDUiIDo6OiJtZW1vcnkiKTsKKyNlbmRpZgorfQorCisvKgorICBUaGlzIGlzIGEgbWFjcm8sIHRoZSBhcmd1bWVudCBtdXN0IGJlIGEgc2luZ2xlIGJ5dGUgY29uc3RhbnQgd2hpY2gKKyAgY2FuIGJlIGV2YWx1YXRlZCBieSB0aGUgaW5saW5lIGFzc2VtYmxlciwgc2luY2UgaXQgaXMgZW1pdHRlZCBhcyBhCisgIGJ5dGUgaW50byB0aGUgYXNzZW1ibHkgY29kZS4KKyovCisjaWYgS01QX09TX1dJTkRPV1MKKyNkZWZpbmUgX3hhYm9ydChBUkcpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfYXNtIF9lbWl0IDB4YzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfYXNtIF9lbWl0IDB4ZjggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfYXNtIF9lbWl0IEFSRworI2Vsc2UKKyNkZWZpbmUgX3hhYm9ydChBUkcpIFwKKyAgICBfX2FzbV9fIHZvbGF0aWxlICgiLmJ5dGUgMHhDNjsgLmJ5dGUgMHhGODsgLmJ5dGUgIiBTVFJJTkdJWkUoQVJHKSA6OjoibWVtb3J5Iik7CisjZW5kaWYKKworLy8KKy8vICAgIFN0YXRpc3RpY3MgaXMgY29sbGVjdGVkIGZvciB0ZXN0aW5nIHB1cnBvc2UKKy8vCisjaWYgS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTCisKKy8vIFdlIGFjY3VtdWxhdGUgc3BlY3VsYXRpdmUgbG9jayBzdGF0aXN0aWNzIHdoZW4gdGhlIGxvY2sgaXMgZGVzdHJveWVkLgorLy8gV2Uga2VlcCBsb2NrcyB0aGF0IGhhdmVuJ3QgYmVlbiBkZXN0cm95ZWQgaW4gdGhlIGxpdmVMb2NrcyBsaXN0CisvLyBzbyB0aGF0IHdlIGNhbiBncmFiIHRoZWlyIHN0YXRpc3RpY3MgdG9vLgorc3RhdGljIGttcF9hZGFwdGl2ZV9sb2NrX3N0YXRpc3RpY3NfdCBkZXN0cm95ZWRTdGF0czsKKworLy8gVG8gaG9sZCB0aGUgbGlzdCBvZiBsaXZlIGxvY2tzLgorc3RhdGljIGttcF9hZGFwdGl2ZV9sb2NrX3QgbGl2ZUxvY2tzOworCisvLyBBIGxvY2sgc28gd2UgY2FuIHNhZmVseSB1cGRhdGUgdGhlIGxpc3Qgb2YgbG9ja3MuCitzdGF0aWMga21wX2Jvb3RzdHJhcF9sb2NrX3QgY2hhaW5fbG9jazsKKworLy8gSW5pdGlhbGl6ZSB0aGUgbGlzdCBvZiBzdGF0cy4KK3ZvaWQKK19fa21wX2luaXRfc3BlY3VsYXRpdmVfc3RhdHMoKQoreworICAgIGttcF9hZGFwdGl2ZV9sb2NrICpsY2sgPSAmbGl2ZUxvY2tzOworCisgICAgbWVtc2V0KCAoIHZvaWQgKiApICYgKCBsY2stPnN0YXRzICksIDAsIHNpemVvZiggbGNrLT5zdGF0cyApICk7CisgICAgbGNrLT5zdGF0cy5uZXh0ID0gbGNrOworICAgIGxjay0+c3RhdHMucHJldiA9IGxjazsKKworICAgIEtNUF9BU1NFUlQoIGxjay0+c3RhdHMubmV4dC0+c3RhdHMucHJldiA9PSBsY2sgKTsKKyAgICBLTVBfQVNTRVJUKCBsY2stPnN0YXRzLnByZXYtPnN0YXRzLm5leHQgPT0gbGNrICk7CisKKyAgICBfX2ttcF9pbml0X2Jvb3RzdHJhcF9sb2NrKCAmY2hhaW5fbG9jayApOworCit9CisKKy8vIEluc2VydCB0aGUgbG9jayBpbnRvIHRoZSBjaXJjdWxhciBsaXN0CitzdGF0aWMgdm9pZAorX19rbXBfcmVtZW1iZXJfbG9jaygga21wX2FkYXB0aXZlX2xvY2sgKiBsY2sgKQoreworICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZjaGFpbl9sb2NrICk7CisKKyAgICBsY2stPnN0YXRzLm5leHQgPSBsaXZlTG9ja3Muc3RhdHMubmV4dDsKKyAgICBsY2stPnN0YXRzLnByZXYgPSAmbGl2ZUxvY2tzOworCisgICAgbGl2ZUxvY2tzLnN0YXRzLm5leHQgPSBsY2s7CisgICAgbGNrLT5zdGF0cy5uZXh0LT5zdGF0cy5wcmV2ICA9IGxjazsKKworICAgIEtNUF9BU1NFUlQoIGxjay0+c3RhdHMubmV4dC0+c3RhdHMucHJldiA9PSBsY2sgKTsKKyAgICBLTVBfQVNTRVJUKCBsY2stPnN0YXRzLnByZXYtPnN0YXRzLm5leHQgPT0gbGNrICk7CisKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmY2hhaW5fbG9jayApOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZm9yZ2V0X2xvY2soIGttcF9hZGFwdGl2ZV9sb2NrICogbGNrICkKK3sKKyAgICBLTVBfQVNTRVJUKCBsY2stPnN0YXRzLm5leHQtPnN0YXRzLnByZXYgPT0gbGNrICk7CisgICAgS01QX0FTU0VSVCggbGNrLT5zdGF0cy5wcmV2LT5zdGF0cy5uZXh0ID09IGxjayApOworCisgICAga21wX2FkYXB0aXZlX2xvY2sgKiBuID0gbGNrLT5zdGF0cy5uZXh0OworICAgIGttcF9hZGFwdGl2ZV9sb2NrICogcCA9IGxjay0+c3RhdHMucHJldjsKKworICAgIG4tPnN0YXRzLnByZXYgPSBwOworICAgIHAtPnN0YXRzLm5leHQgPSBuOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfemVyb19zcGVjdWxhdGl2ZV9zdGF0cygga21wX2FkYXB0aXZlX2xvY2sgKiBsY2sgKQoreworICAgIG1lbXNldCggKCB2b2lkICogKSZsY2stPnN0YXRzLCAwLCBzaXplb2YoIGxjay0+c3RhdHMgKSApOworICAgIF9fa21wX3JlbWVtYmVyX2xvY2soIGxjayApOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfYWRkX3N0YXRzKCBrbXBfYWRhcHRpdmVfbG9ja19zdGF0aXN0aWNzX3QgKiB0LCBrbXBfYWRhcHRpdmVfbG9ja190ICogbGNrICkKK3sKKyAgICBrbXBfYWRhcHRpdmVfbG9ja19zdGF0aXN0aWNzX3Qgdm9sYXRpbGUgKnMgPSAmbGNrLT5zdGF0czsKKworICAgIHQtPm5vblNwZWN1bGF0aXZlQWNxdWlyZUF0dGVtcHRzICs9IGxjay0+YWNxdWlyZV9hdHRlbXB0czsKKyAgICB0LT5zdWNjZXNzZnVsU3BlY3VsYXRpb25zICs9IHMtPnN1Y2Nlc3NmdWxTcGVjdWxhdGlvbnM7CisgICAgdC0+aGFyZEZhaWxlZFNwZWN1bGF0aW9ucyArPSBzLT5oYXJkRmFpbGVkU3BlY3VsYXRpb25zOworICAgIHQtPnNvZnRGYWlsZWRTcGVjdWxhdGlvbnMgKz0gcy0+c29mdEZhaWxlZFNwZWN1bGF0aW9uczsKKyAgICB0LT5ub25TcGVjdWxhdGl2ZUFjcXVpcmVzICs9IHMtPm5vblNwZWN1bGF0aXZlQWNxdWlyZXM7CisgICAgdC0+bGVtbWluZ1lpZWxkcyAgICAgICAgICArPSBzLT5sZW1taW5nWWllbGRzOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfYWNjdW11bGF0ZV9zcGVjdWxhdGl2ZV9zdGF0cygga21wX2FkYXB0aXZlX2xvY2sgKiBsY2spCit7CisgICAga21wX2FkYXB0aXZlX2xvY2tfc3RhdGlzdGljc190ICp0ID0gJmRlc3Ryb3llZFN0YXRzOworCisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJmNoYWluX2xvY2sgKTsKKworICAgIF9fa21wX2FkZF9zdGF0cyggJmRlc3Ryb3llZFN0YXRzLCBsY2sgKTsKKyAgICBfX2ttcF9mb3JnZXRfbG9jayggbGNrICk7CisKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmY2hhaW5fbG9jayApOworfQorCitzdGF0aWMgZmxvYXQKK3BlcmNlbnQgKGttcF91aW50MzIgY291bnQsIGttcF91aW50MzIgdG90YWwpCit7CisgICAgcmV0dXJuICh0b3RhbCA9PSAwKSA/IDAuMDogKDEwMC4wICogY291bnQpL3RvdGFsOworfQorCitzdGF0aWMKK0ZJTEUgKiBfX2ttcF9vcGVuX3N0YXRzX2ZpbGUoKQoreworICAgIGlmIChzdHJjbXAgKF9fa21wX3NwZWN1bGF0aXZlX3N0YXRzZmlsZSwgIi0iKSA9PSAwKQorICAgICAgICByZXR1cm4gc3Rkb3V0OworCisgICAgc2l6ZV90IGJ1ZmZMZW4gPSBzdHJsZW4oIF9fa21wX3NwZWN1bGF0aXZlX3N0YXRzZmlsZSApICsgMjA7CisgICAgY2hhciBidWZmZXJbYnVmZkxlbl07CisgICAgc25wcmludGYgKCZidWZmZXJbMF0sIGJ1ZmZMZW4sIF9fa21wX3NwZWN1bGF0aXZlX3N0YXRzZmlsZSwgZ2V0cGlkKCkpOworICAgIEZJTEUgKiByZXN1bHQgPSBmb3BlbigmYnVmZmVyWzBdLCAidyIpOworCisgICAgLy8gTWF5YmUgd2Ugc2hvdWxkIGlzc3VlIGEgd2FybmluZyBoZXJlLi4uCisgICAgcmV0dXJuIHJlc3VsdCA/IHJlc3VsdCA6IHN0ZG91dDsKK30KKwordm9pZAorX19rbXBfcHJpbnRfc3BlY3VsYXRpdmVfc3RhdHMoKQoreworICAgIGlmIChfX2ttcF91c2VyX2xvY2tfa2luZCAhPSBsa19hZGFwdGl2ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgRklMRSAqIHN0YXRzRmlsZSA9IF9fa21wX29wZW5fc3RhdHNfZmlsZSgpOworCisgICAga21wX2FkYXB0aXZlX2xvY2tfc3RhdGlzdGljc190IHRvdGFsID0gZGVzdHJveWVkU3RhdHM7CisgICAga21wX2FkYXB0aXZlX2xvY2sgKmxjazsKKworICAgIGZvciAobGNrID0gbGl2ZUxvY2tzLnN0YXRzLm5leHQ7IGxjayAhPSAmbGl2ZUxvY2tzOyBsY2sgPSBsY2stPnN0YXRzLm5leHQpIHsKKyAgICAgICAgX19rbXBfYWRkX3N0YXRzKCAmdG90YWwsIGxjayApOworICAgIH0KKyAgICBrbXBfYWRhcHRpdmVfbG9ja19zdGF0aXN0aWNzX3QgKnQgPSAmdG90YWw7CisgICAga21wX3VpbnQzMiB0b3RhbFNlY3Rpb25zICAgICA9IHQtPm5vblNwZWN1bGF0aXZlQWNxdWlyZXMgKyB0LT5zdWNjZXNzZnVsU3BlY3VsYXRpb25zOworICAgIGttcF91aW50MzIgdG90YWxTcGVjdWxhdGlvbnMgPSB0LT5zdWNjZXNzZnVsU3BlY3VsYXRpb25zICsgdC0+aGFyZEZhaWxlZFNwZWN1bGF0aW9ucyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQtPnNvZnRGYWlsZWRTcGVjdWxhdGlvbnM7CisKKyAgICBmcHJpbnRmICggc3RhdHNGaWxlLCAiU3BlY3VsYXRpdmUgbG9jayBzdGF0aXN0aWNzIChhbGwgYXBwcm94aW1hdGUhKVxuIik7CisgICAgZnByaW50ZiAoIHN0YXRzRmlsZSwgIiBMb2NrIHBhcmFtZXRlcnM6IFxuIgorICAgICAgICAgICAgICIgICBtYXhfc29mdF9yZXRyaWVzICAgICAgICAgICAgICAgOiAlMTBkXG4iCisgICAgICAgICAgICAgIiAgIG1heF9iYWRuZXNzICAgICAgICAgICAgICAgICAgICA6ICUxMGRcbiIsCisgICAgICAgICAgICAgX19rbXBfYWRhcHRpdmVfYmFja29mZl9wYXJhbXMubWF4X3NvZnRfcmV0cmllcywKKyAgICAgICAgICAgICBfX2ttcF9hZGFwdGl2ZV9iYWNrb2ZmX3BhcmFtcy5tYXhfYmFkbmVzcyk7CisgICAgZnByaW50Ziggc3RhdHNGaWxlLCAiIE5vbi1zcGVjdWxhdGl2ZSBhY3F1aXJlIGF0dGVtcHRzIDogJTEwZFxuIiwgdC0+bm9uU3BlY3VsYXRpdmVBY3F1aXJlQXR0ZW1wdHMgKTsKKyAgICBmcHJpbnRmKCBzdGF0c0ZpbGUsICIgVG90YWwgY3JpdGljYWwgc2VjdGlvbnMgICAgICAgICAgOiAlMTBkXG4iLCB0b3RhbFNlY3Rpb25zICk7CisgICAgZnByaW50Ziggc3RhdHNGaWxlLCAiIFN1Y2Nlc3NmdWwgc3BlY3VsYXRpb25zICAgICAgICAgIDogJTEwZCAoJTUuMWYlJSlcbiIsCisgICAgICAgICAgICAgdC0+c3VjY2Vzc2Z1bFNwZWN1bGF0aW9ucywgcGVyY2VudCggdC0+c3VjY2Vzc2Z1bFNwZWN1bGF0aW9ucywgdG90YWxTZWN0aW9ucyApICk7CisgICAgZnByaW50Ziggc3RhdHNGaWxlLCAiIE5vbi1zcGVjdWxhdGl2ZSBhY3F1aXJlcyAgICAgICAgIDogJTEwZCAoJTUuMWYlJSlcbiIsCisgICAgICAgICAgICAgdC0+bm9uU3BlY3VsYXRpdmVBY3F1aXJlcywgcGVyY2VudCggdC0+bm9uU3BlY3VsYXRpdmVBY3F1aXJlcywgdG90YWxTZWN0aW9ucyApICk7CisgICAgZnByaW50Ziggc3RhdHNGaWxlLCAiIExlbW1pbmcgeWllbGRzICAgICAgICAgICAgICAgICAgIDogJTEwZFxuXG4iLCB0LT5sZW1taW5nWWllbGRzICk7CisKKyAgICBmcHJpbnRmKCBzdGF0c0ZpbGUsICIgU3BlY3VsYXRpdmUgYWNxdWlyZSBhdHRlbXB0cyAgICAgOiAlMTBkXG4iLCB0b3RhbFNwZWN1bGF0aW9ucyApOworICAgIGZwcmludGYoIHN0YXRzRmlsZSwgIiBTdWNjZXNzZXMgICAgICAgICAgICAgICAgICAgICAgICA6ICUxMGQgKCU1LjFmJSUpXG4iLAorICAgICAgICAgICAgIHQtPnN1Y2Nlc3NmdWxTcGVjdWxhdGlvbnMsIHBlcmNlbnQoIHQtPnN1Y2Nlc3NmdWxTcGVjdWxhdGlvbnMsIHRvdGFsU3BlY3VsYXRpb25zICkgKTsKKyAgICBmcHJpbnRmKCBzdGF0c0ZpbGUsICIgU29mdCBmYWlsdXJlcyAgICAgICAgICAgICAgICAgICAgOiAlMTBkICglNS4xZiUlKVxuIiwKKyAgICAgICAgICAgICB0LT5zb2Z0RmFpbGVkU3BlY3VsYXRpb25zLCBwZXJjZW50KCB0LT5zb2Z0RmFpbGVkU3BlY3VsYXRpb25zLCB0b3RhbFNwZWN1bGF0aW9ucyApICk7CisgICAgZnByaW50Ziggc3RhdHNGaWxlLCAiIEhhcmQgZmFpbHVyZXMgICAgICAgICAgICAgICAgICAgIDogJTEwZCAoJTUuMWYlJSlcbiIsCisgICAgICAgICAgICAgdC0+aGFyZEZhaWxlZFNwZWN1bGF0aW9ucywgcGVyY2VudCggdC0+aGFyZEZhaWxlZFNwZWN1bGF0aW9ucywgdG90YWxTcGVjdWxhdGlvbnMgKSApOworCisgICAgaWYgKHN0YXRzRmlsZSAhPSBzdGRvdXQpCisgICAgICAgIGZjbG9zZSggc3RhdHNGaWxlICk7Cit9CisKKyMgZGVmaW5lIEtNUF9JTkNfU1RBVChsY2ssc3RhdCkgKCBsY2stPmxrLmFkYXB0aXZlLnN0YXRzLnN0YXQrKyApCisjZWxzZQorIyBkZWZpbmUgS01QX0lOQ19TVEFUKGxjayxzdGF0KQorCisjZW5kaWYgLy8gS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTCisKK3N0YXRpYyBpbmxpbmUgYm9vbAorX19rbXBfaXNfdW5sb2NrZWRfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjayApCit7CisgICAgLy8gSXQgaXMgZW5vdWdoIHRvIGNoZWNrIHRoYXQgdGhlIGhlYWRfaWQgaXMgemVyby4KKyAgICAvLyBXZSBkb24ndCBhbHNvIG5lZWQgdG8gY2hlY2sgdGhlIHRhaWwuCisgICAgYm9vbCByZXMgPSBsY2stPmxrLmhlYWRfaWQgPT0gMDsKKworICAgIC8vIFdlIG5lZWQgYSBmZW5jZSBoZXJlLCBzaW5jZSB3ZSBtdXN0IGVuc3VyZSB0aGF0IG5vIG1lbW9yeSBvcGVyYXRpb25zCisgICAgLy8gZnJvbSBsYXRlciBpbiB0aGlzIHRocmVhZCBmbG9hdCBhYm92ZSB0aGF0IHJlYWQuCisjaWYgS01QX0NPTVBJTEVSX0lDQworICAgIF9tbV9tZmVuY2UoKTsKKyNlbHNlCisgICAgX19zeW5jX3N5bmNocm9uaXplKCk7CisjZW5kaWYKKworICAgIHJldHVybiByZXM7Cit9CisKKy8vIEZ1bmN0aW9ucyBmb3IgbWFuaXB1bGF0aW5nIHRoZSBiYWRuZXNzCitzdGF0aWMgX19pbmxpbmUgdm9pZAorX19rbXBfdXBkYXRlX2JhZG5lc3NfYWZ0ZXJfc3VjY2Vzcygga21wX3F1ZXVpbmdfbG9ja190ICpsY2sgKQoreworICAgIC8vIFJlc2V0IHRoZSBiYWRuZXNzIHRvIHplcm8gc28gd2UgZWFnZXJseSB0cnkgdG8gc3BlY3VsYXRlIGFnYWluCisgICAgbGNrLT5say5hZGFwdGl2ZS5iYWRuZXNzID0gMDsKKyAgICBLTVBfSU5DX1NUQVQobGNrLHN1Y2Nlc3NmdWxTcGVjdWxhdGlvbnMpOworfQorCisvLyBDcmVhdGUgYSBiaXQgbWFzayB3aXRoIG9uZSBtb3JlIHNldCBiaXQuCitzdGF0aWMgX19pbmxpbmUgdm9pZAorX19rbXBfc3RlcF9iYWRuZXNzKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjayApCit7CisgICAga21wX3VpbnQzMiBuZXdCYWRuZXNzID0gKCBsY2stPmxrLmFkYXB0aXZlLmJhZG5lc3MgPDwgMSApIHwgMTsKKyAgICBpZiAoIG5ld0JhZG5lc3MgPiBsY2stPmxrLmFkYXB0aXZlLm1heF9iYWRuZXNzKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgeworICAgICAgICBsY2stPmxrLmFkYXB0aXZlLmJhZG5lc3MgPSBuZXdCYWRuZXNzOworICAgIH0KK30KKworLy8gQ2hlY2sgd2hldGhlciBzcGVjdWxhdGlvbiBzaG91bGQgYmUgYXR0ZW1wdGVkLgorc3RhdGljIF9faW5saW5lIGludAorX19rbXBfc2hvdWxkX3NwZWN1bGF0ZSgga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBrbXBfdWludDMyIGJhZG5lc3MgPSBsY2stPmxrLmFkYXB0aXZlLmJhZG5lc3M7CisgICAga21wX3VpbnQzMiBhdHRlbXB0cz0gbGNrLT5say5hZGFwdGl2ZS5hY3F1aXJlX2F0dGVtcHRzOworICAgIGludCByZXMgPSAoYXR0ZW1wdHMgJiBiYWRuZXNzKSA9PSAwOworICAgIHJldHVybiByZXM7Cit9CisKKy8vIEF0dGVtcHQgdG8gYWNxdWlyZSBvbmx5IHRoZSBzcGVjdWxhdGl2ZSBsb2NrLgorLy8gRG9lcyBub3QgYmFjayBvZmYgdG8gdGhlIG5vbi1zcGVjdWxhdGl2ZSBsb2NrLgorLy8KK3N0YXRpYyBpbnQKK19fa21wX3Rlc3RfYWRhcHRpdmVfbG9ja19vbmx5KCBrbXBfcXVldWluZ19sb2NrX3QgKiBsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpbnQgcmV0cmllcyA9IGxjay0+bGsuYWRhcHRpdmUubWF4X3NvZnRfcmV0cmllczsKKworICAgIC8vIFdlIGRvbid0IGV4cGxpY2l0bHkgY291bnQgdGhlIHN0YXJ0IG9mIHNwZWN1bGF0aW9uLCByYXRoZXIgd2UgcmVjb3JkCisgICAgLy8gdGhlIHJlc3VsdHMgKHN1Y2Nlc3MsIGhhcmQgZmFpbCwgc29mdCBmYWlsKS4gVGhlIHN1bSBvZiBhbGwgb2YgdGhvc2UKKyAgICAvLyBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIHRpbWVzIHdlIHN0YXJ0ZWQgc3BlY3VsYXRpb24gc2luY2UgYWxsCisgICAgLy8gc3BlY3VsYXRpb25zIG11c3QgZW5kIG9uZSBvZiB0aG9zZSB3YXlzLgorICAgIGRvCisgICAgeworICAgICAgICBrbXBfdWludDMyIHN0YXR1cyA9IF94YmVnaW4oKTsKKyAgICAgICAgLy8gU3dpdGNoIHRoaXMgaW4gdG8gZGlzYWJsZSBhY3R1YWwgc3BlY3VsYXRpb24gYnV0IGV4ZXJjaXNlCisgICAgICAgIC8vIGF0IGxlYXN0IHNvbWUgb2YgdGhlIHJlc3Qgb2YgdGhlIGNvZGUuIFVzZWZ1bCBmb3IgZGVidWdnaW5nLi4uCisgICAgICAgIC8vIGttcF91aW50MzIgc3RhdHVzID0gX1hBQk9SVF9ORVNURUQ7CisKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBfWEJFR0lOX1NUQVJURUQgKQorICAgICAgICB7IC8qIFdlIGhhdmUgc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQgc3BlY3VsYXRpb24KKyAgICAgICAgICAgKiBDaGVjayB0aGF0IG5vLW9uZSBhY3F1aXJlZCB0aGUgbG9jayBmb3IgcmVhbCBiZXR3ZWVuIHdoZW4gd2UgbGFzdCBsb29rZWQKKyAgICAgICAgICAgKiBhbmQgbm93LiBUaGlzIGFsc28gZ2V0cyB0aGUgbG9jayBjYWNoZSBsaW5lIGludG8gb3VyIHJlYWQtc2V0LAorICAgICAgICAgICAqIHdoaWNoIHdlIG5lZWQgc28gdGhhdCB3ZSdsbCBhYm9ydCBpZiBhbnlvbmUgbGF0ZXIgY2xhaW1zIGl0IGZvciByZWFsLgorICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKCEgX19rbXBfaXNfdW5sb2NrZWRfcXVldWluZ19sb2NrKCBsY2sgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gTG9jayBpcyBub3cgdmlzaWJseSBhY3F1aXJlZCwgc28gc29tZW9uZSBiZWF0IHVzIHRvIGl0LgorICAgICAgICAgICAgICAgIC8vIEFib3J0IHRoZSB0cmFuc2FjdGlvbiBzbyB3ZSdsbCByZXN0YXJ0IGZyb20gX3hiZWdpbiB3aXRoIHRoZQorICAgICAgICAgICAgICAgIC8vIGZhaWx1cmUgc3RhdHVzLgorICAgICAgICAgICAgICAgIF94YWJvcnQoMHgwMSkKKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUMiggMCwgInNob3VsZCBub3QgZ2V0IGhlcmUiICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMTsgICAvLyBMb2NrIGhhcyBiZWVuIGFjcXVpcmVkIChzcGVjdWxhdGl2ZWx5KQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gV2UgaGF2ZSBhYm9ydGVkLCB1cGRhdGUgdGhlIHN0YXRpc3RpY3MKKyAgICAgICAgICAgIGlmICggc3RhdHVzICYgU09GVF9BQk9SVF9NQVNLKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEtNUF9JTkNfU1RBVChsY2ssc29mdEZhaWxlZFNwZWN1bGF0aW9ucyk7CisgICAgICAgICAgICAgICAgLy8gYW5kIGxvb3Agcm91bmQgdG8gcmV0cnkuCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgS01QX0lOQ19TVEFUKGxjayxoYXJkRmFpbGVkU3BlY3VsYXRpb25zKTsKKyAgICAgICAgICAgICAgICAvLyBHaXZlIHVwIGlmIHdlIGhhZCBhIGhhcmQgZmFpbHVyZS4KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gIHdoaWxlKCByZXRyaWVzLS0gKTsgLy8gTG9vcCB3aGlsZSB3ZSBoYXZlIHJldHJpZXMsIGFuZCBkaWRuJ3QgZmFpbCBoYXJkLgorCisgICAgLy8gRWl0aGVyIHdlIGhhZCBhIGhhcmQgZmFpbHVyZSBvciB3ZSBkaWRuJ3Qgc3VjY2VlZCBzb2Z0bHkgYWZ0ZXIKKyAgICAvLyB0aGUgZnVsbCBzZXQgb2YgYXR0ZW1wdHMsIHNvIGJhY2sgb2ZmIHRoZSBiYWRuZXNzLgorICAgIF9fa21wX3N0ZXBfYmFkbmVzcyggbGNrICk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8vIEF0dGVtcHQgdG8gYWNxdWlyZSB0aGUgc3BlY3VsYXRpdmUgbG9jaywgb3IgYmFjayBvZmYgdG8gdGhlIG5vbi1zcGVjdWxhdGl2ZSBvbmUKKy8vIGlmIHRoZSBzcGVjdWxhdGl2ZSBsb2NrIGNhbm5vdCBiZSBhY3F1aXJlZC4KKy8vIFdlIGNhbiBzdWNjZWVkIHNwZWN1bGF0aXZlbHksIG5vbi1zcGVjdWxhdGl2ZWx5LCBvciBmYWlsLgorc3RhdGljIGludAorX19rbXBfdGVzdF9hZGFwdGl2ZV9sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIC8vIEZpcnN0IHRyeSB0byBhY3F1aXJlIHRoZSBsb2NrIHNwZWN1bGF0aXZlbHkKKyAgICBpZiAoIF9fa21wX3Nob3VsZF9zcGVjdWxhdGUoIGxjaywgZ3RpZCApICYmIF9fa21wX3Rlc3RfYWRhcHRpdmVfbG9ja19vbmx5KCBsY2ssIGd0aWQgKSApCisgICAgICAgIHJldHVybiAxOworCisgICAgLy8gU3BlY3VsYXRpdmUgYWNxdWlzaXRpb24gZmFpbGVkLCBzbyB0cnkgdG8gYWNxdWlyZSBpdCBub24tc3BlY3VsYXRpdmVseS4KKyAgICAvLyBDb3VudCB0aGUgbm9uLXNwZWN1bGF0aXZlIGFjcXVpcmUgYXR0ZW1wdAorICAgIGxjay0+bGsuYWRhcHRpdmUuYWNxdWlyZV9hdHRlbXB0cysrOworCisgICAgLy8gVXNlIGJhc2UsIG5vbi1zcGVjdWxhdGl2ZSBsb2NrLgorICAgIGlmICggX19rbXBfdGVzdF9xdWV1aW5nX2xvY2soIGxjaywgZ3RpZCApICkKKyAgICB7CisgICAgICAgIEtNUF9JTkNfU1RBVChsY2ssbm9uU3BlY3VsYXRpdmVBY3F1aXJlcyk7CisgICAgICAgIHJldHVybiAxOyAgICAgICAvLyBMb2NrIGlzIGFjcXVpcmVkIChub24tc3BlY3VsYXRpdmVseSkKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7ICAgICAgIC8vIEZhaWxlZCB0byBhY3F1aXJlIHRoZSBsb2NrLCBpdCdzIGFscmVhZHkgdmlzaWJseSBsb2NrZWQuCisgICAgfQorfQorCitzdGF0aWMgaW50CitfX2ttcF90ZXN0X2FkYXB0aXZlX2xvY2tfd2l0aF9jaGVja3MoIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF90ZXN0X2xvY2siOworICAgICAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQgcmV0dmFsID0gX19rbXBfdGVzdF9hZGFwdGl2ZV9sb2NrKCBsY2ssIGd0aWQgKTsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICYmIHJldHZhbCApIHsKKyAgICAgICAgbGNrLT5say5vd25lcl9pZCA9IGd0aWQgKyAxOworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorCisvLyBCbG9jayB1bnRpbCB3ZSBjYW4gYWNxdWlyZSBhIHNwZWN1bGF0aXZlLCBhZGFwdGl2ZSBsb2NrLgorLy8gV2UgY2hlY2sgd2hldGhlciB3ZSBzaG91bGQgYmUgdHJ5aW5nIHRvIHNwZWN1bGF0ZS4KKy8vIElmIHdlIHNob3VsZCBiZSwgd2UgY2hlY2sgdGhlIHJlYWwgbG9jayB0byBzZWUgaWYgaXQgaXMgZnJlZSwKKy8vIGFuZCwgaWYgbm90LCBwYXVzZSB3aXRob3V0IGF0dGVtcHRpbmcgdG8gYWNxdWlyZSBpdCB1bnRpbCBpdCBpcy4KKy8vIFRoZW4gd2UgdHJ5IHRoZSBzcGVjdWxhdGl2ZSBhY3F1aXJlLgorLy8gVGhpcyBtZWFucyB0aGF0IGFsdGhvdWdoIHdlIHN1ZmZlciBmcm9tIGxlbW1pbmdzIGEgbGl0dGxlICgKKy8vIGJlY2F1c2UgYWxsIHdlIGNhbid0IGFjcXVpcmUgdGhlIGxvY2sgc3BlY3VsYXRpdmVseSB1bnRpbAorLy8gdGhlIHF1ZXVlIG9mIHRocmVhZHMgd2FpdGluZyBoYXMgY2xlYXJlZCksIHdlIGRvbid0IGdldCBpbnRvIGEKKy8vIHN0YXRlIHdoZXJlIHdlIGNhbiBuZXZlciBhY3F1aXJlIHRoZSBsb2NrIHNwZWN1bGF0aXZlbHkgKGJlY2F1c2Ugd2UKKy8vIGZvcmNlIHRoZSBxdWV1ZSB0byBjbGVhciBieSBwcmV2ZW50aW5nIG5ldyBhcnJpdmFscyBmcm9tIGVudGVyaW5nIHRoZQorLy8gcXVldWUpLgorLy8gVGhpcyBkb2VzIG1lYW4gdGhhdCB3aGVuIHdlJ3JlIHRyeWluZyB0byBicmVhayBsZW1taW5ncywgdGhlIGxvY2sKKy8vIGlzIG5vIGxvbmdlciBmYWlyLiBIb3dldmVyIE9wZW5NUCBtYWtlcyBubyBndWFyYW50ZWUgdGhhdCBpdHMKKy8vIGxvY2tzIGFyZSBmYWlyLCBzbyB0aGlzIGlzbid0IGEgcmVhbCBwcm9ibGVtLgorc3RhdGljIHZvaWQKK19fa21wX2FjcXVpcmVfYWRhcHRpdmVfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICogbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaWYgKCBfX2ttcF9zaG91bGRfc3BlY3VsYXRlKCBsY2ssIGd0aWQgKSApCisgICAgeworICAgICAgICBpZiAoIF9fa21wX2lzX3VubG9ja2VkX3F1ZXVpbmdfbG9jayggbGNrICkgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIF9fa21wX3Rlc3RfYWRhcHRpdmVfbG9ja19vbmx5KCBsY2sgLCBndGlkICkgKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIC8vIFdlIHRyaWVkIHNwZWN1bGF0aW9uIGFuZCBmYWlsZWQsIHNvIGdpdmUgdXAuCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBXZSBjYW4ndCB0cnkgc3BlY3VsYXRpb24gdW50aWwgdGhlIGxvY2sgaXMgZnJlZSwgc28gd2UKKyAgICAgICAgICAgIC8vIHBhdXNlIGhlcmUgKHdpdGhvdXQgc3VzcGVuZGluZyBvbiB0aGUgcXVldWVpbmcgbG9jaywKKyAgICAgICAgICAgIC8vIHRvIGFsbG93IGl0IHRvIGRyYWluLCB0aGVuIHRyeSBhZ2Fpbi4KKyAgICAgICAgICAgIC8vIEFsbCBvdGhlciB0aHJlYWRzIHdpbGwgYWxzbyBzZWUgdGhlIHNhbWUgcmVzdWx0IGZvcgorICAgICAgICAgICAgLy8gc2hvdWxkU3BlY3VsYXRlLCBzbyB3aWxsIGJlIGRvaW5nIHRoZSBzYW1lIGlmIHRoZXkKKyAgICAgICAgICAgIC8vIHRyeSB0byBjbGFpbSB0aGUgbG9jayBmcm9tIG5vdyBvbi4KKyAgICAgICAgICAgIHdoaWxlICggISBfX2ttcF9pc191bmxvY2tlZF9xdWV1aW5nX2xvY2soIGxjayApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBLTVBfSU5DX1NUQVQobGNrLGxlbW1pbmdZaWVsZHMpOworICAgICAgICAgICAgICAgIF9fa21wX3lpZWxkIChUUlVFKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBfX2ttcF90ZXN0X2FkYXB0aXZlX2xvY2tfb25seSggbGNrLCBndGlkICkgKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFNwZWN1bGF0aXZlIGFjcXVpc2l0aW9uIGZhaWxlZCwgc28gYWNxdWlyZSBpdCBub24tc3BlY3VsYXRpdmVseS4KKyAgICAvLyBDb3VudCB0aGUgbm9uLXNwZWN1bGF0aXZlIGFjcXVpcmUgYXR0ZW1wdAorICAgIGxjay0+bGsuYWRhcHRpdmUuYWNxdWlyZV9hdHRlbXB0cysrOworCisgICAgX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2tfdGltZWRfdGVtcGxhdGU8RkFMU0U+KCBsY2ssIGd0aWQgKTsKKyAgICAvLyBXZSBoYXZlIGFjcXVpcmVkIHRoZSBiYXNlIGxvY2ssIHNvIGNvdW50IHRoYXQuCisgICAgS01QX0lOQ19TVEFUKGxjayxub25TcGVjdWxhdGl2ZUFjcXVpcmVzICk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9hY3F1aXJlX2FkYXB0aXZlX2xvY2tfd2l0aF9jaGVja3MoIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9zZXRfbG9jayI7CisgICAgICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2dldF9xdWV1aW5nX2xvY2tfb3duZXIoIGxjayApID09IGd0aWQgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tJc0FscmVhZHlPd25lZCwgZnVuYyApOworICAgICAgICB9CisgICAgfQorCisgICAgX19rbXBfYWNxdWlyZV9hZGFwdGl2ZV9sb2NrKCBsY2ssIGd0aWQgKTsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBsY2stPmxrLm93bmVyX2lkID0gZ3RpZCArIDE7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorX19rbXBfcmVsZWFzZV9hZGFwdGl2ZV9sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGlmICggX19rbXBfaXNfdW5sb2NrZWRfcXVldWluZ19sb2NrKCBsY2sgKSApCisgICAgeyAgIC8vIElmIHRoZSBsb2NrIGRvZXNuJ3QgbG9vayBjbGFpbWVkIHdlIG11c3QgYmUgc3BlY3VsYXRpbmcuCisgICAgICAgIC8vIChPciB0aGUgdXNlcidzIGNvZGUgaXMgYnVnZ3kgYW5kIHRoZXkncmUgcmVsZWFzaW5nIHdpdGhvdXQgbG9ja2luZzsKKyAgICAgICAgLy8gaWYgd2UgaGFkIFhURVNUIHdlJ2QgYmUgYWJsZSB0byBjaGVjayB0aGF0IGNhc2UuLi4pCisgICAgICAgIF94ZW5kKCk7ICAgICAgICAvLyBFeGl0IHNwZWN1bGF0aW9uCisgICAgICAgIF9fa21wX3VwZGF0ZV9iYWRuZXNzX2FmdGVyX3N1Y2Nlc3MoIGxjayApOworICAgIH0KKyAgICBlbHNlCisgICAgeyAgIC8vIFNpbmNlIHRoZSBsb2NrICppcyogdmlzaWJseSBsb2NrZWQgd2UncmUgbm90IHNwZWN1bGF0aW5nLAorICAgICAgICAvLyBzbyBzaG91bGQgdXNlIHRoZSB1bmRlcmx5aW5nIGxvY2sncyByZWxlYXNlIHNjaGVtZS4KKyAgICAgICAgX19rbXBfcmVsZWFzZV9xdWV1aW5nX2xvY2soIGxjaywgZ3RpZCApOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK19fa21wX3JlbGVhc2VfYWRhcHRpdmVfbG9ja193aXRoX2NoZWNrcygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Vuc2V0X2xvY2siOworICAgICAgICBLTVBfTUIoKTsgIC8qIGluIGNhc2UgYW5vdGhlciBwcm9jZXNzb3IgaW5pdGlhbGl6ZWQgbG9jayAqLworICAgICAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBfX2ttcF9nZXRfcXVldWluZ19sb2NrX293bmVyKCBsY2sgKSA9PSAtMSApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ0ZyZWUsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2dldF9xdWV1aW5nX2xvY2tfb3duZXIoIGxjayApICE9IGd0aWQgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tVbnNldHRpbmdTZXRCeUFub3RoZXIsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBsY2stPmxrLm93bmVyX2lkID0gMDsKKyAgICB9CisgICAgX19rbXBfcmVsZWFzZV9hZGFwdGl2ZV9sb2NrKCBsY2ssIGd0aWQgKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfYWRhcHRpdmVfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICpsY2sgKQoreworICAgIF9fa21wX2luaXRfcXVldWluZ19sb2NrKCBsY2sgKTsKKyAgICBsY2stPmxrLmFkYXB0aXZlLmJhZG5lc3MgPSAwOworICAgIGxjay0+bGsuYWRhcHRpdmUuYWNxdWlyZV9hdHRlbXB0cyA9IDA7IC8vbm9uU3BlY3VsYXRpdmVBY3F1aXJlQXR0ZW1wdHMgPSAwOworICAgIGxjay0+bGsuYWRhcHRpdmUubWF4X3NvZnRfcmV0cmllcyA9IF9fa21wX2FkYXB0aXZlX2JhY2tvZmZfcGFyYW1zLm1heF9zb2Z0X3JldHJpZXM7CisgICAgbGNrLT5say5hZGFwdGl2ZS5tYXhfYmFkbmVzcyAgICAgID0gX19rbXBfYWRhcHRpdmVfYmFja29mZl9wYXJhbXMubWF4X2JhZG5lc3M7CisjaWYgS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTCisgICAgX19rbXBfemVyb19zcGVjdWxhdGl2ZV9zdGF0cyggJmxjay0+bGsuYWRhcHRpdmUgKTsKKyNlbmRpZgorICAgIEtBX1RSQUNFKDEwMDAsICgiX19rbXBfaW5pdF9hZGFwdGl2ZV9sb2NrOiBsb2NrICVwIGluaXRpYWxpemVkXG4iLCBsY2spKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfYWRhcHRpdmVfbG9ja193aXRoX2NoZWNrcygga21wX3F1ZXVpbmdfbG9ja190ICogbGNrICkKK3sKKyAgICBfX2ttcF9pbml0X2FkYXB0aXZlX2xvY2soIGxjayApOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVzdHJveV9hZGFwdGl2ZV9sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjayApCit7CisjaWYgS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTCisgICAgX19rbXBfYWNjdW11bGF0ZV9zcGVjdWxhdGl2ZV9zdGF0cyggJmxjay0+bGsuYWRhcHRpdmUgKTsKKyNlbmRpZgorICAgIF9fa21wX2Rlc3Ryb3lfcXVldWluZ19sb2NrIChsY2spOworICAgIC8vIE5vdGhpbmcgbmVlZGVkIGZvciB0aGUgc3BlY3VsYXRpdmUgcGFydC4KK30KKworc3RhdGljIHZvaWQKK19fa21wX2Rlc3Ryb3lfYWRhcHRpdmVfbG9ja193aXRoX2NoZWNrcygga21wX3F1ZXVpbmdfbG9ja190ICpsY2sgKQoreworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfZGVzdHJveV9sb2NrIjsKKyAgICAgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgICAgICB9CisgICAgICAgIGlmICggX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lciggbGNrICkgIT0gLTEgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tTdGlsbE93bmVkLCBmdW5jICk7CisgICAgICAgIH0KKyAgICB9CisgICAgX19rbXBfZGVzdHJveV9hZGFwdGl2ZV9sb2NrKCBsY2sgKTsKK30KKworCisjZW5kaWYgLy8gS01QX1VTRV9BREFQVElWRV9MT0NLUworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogRFJEUEEgdGlja2V0IGxvY2tzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICJEUkRQQSIgbWVhbnMgRHluYW1pY2FsbHkgUmVjb25maWd1cmFibGUgRGlzdHJpYnV0ZWQgUG9sbGluZyBBcmVhICovCisKK3N0YXRpYyBrbXBfaW50MzIKK19fa21wX2dldF9kcmRwYV9sb2NrX293bmVyKCBrbXBfZHJkcGFfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBUQ1JfNCggbGNrLT5say5vd25lcl9pZCApIC0gMTsKK30KKworc3RhdGljIGlubGluZSBib29sCitfX2ttcF9pc19kcmRwYV9sb2NrX25lc3RhYmxlKCBrbXBfZHJkcGFfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBsY2stPmxrLmRlcHRoX2xvY2tlZCAhPSAtMTsKK30KKworX19mb3JjZWlubGluZSBzdGF0aWMgdm9pZAorX19rbXBfYWNxdWlyZV9kcmRwYV9sb2NrX3RpbWVkX3RlbXBsYXRlKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBrbXBfdWludDY0IHRpY2tldCA9IEtNUF9URVNUX1RIRU5fSU5DNjQoKGttcF9pbnQ2NCAqKSZsY2stPmxrLm5leHRfdGlja2V0KTsKKyAgICBrbXBfdWludDY0IG1hc2sgPSBUQ1JfOChsY2stPmxrLm1hc2spOyAgICAgICAgICAgICAgLy8gdm9sYXRpbGUgbG9hZAorICAgIHZvbGF0aWxlIHN0cnVjdCBrbXBfYmFzZV9kcmRwYV9sb2NrOjprbXBfbG9ja19wb2xsICpwb2xscworICAgICAgPSAodm9sYXRpbGUgc3RydWN0IGttcF9iYXNlX2RyZHBhX2xvY2s6OmttcF9sb2NrX3BvbGwgKikKKyAgICAgIFRDUl9QVFIobGNrLT5say5wb2xscyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdm9sYXRpbGUgbG9hZAorCisjaWZkZWYgVVNFX0xPQ0tfUFJPRklMRQorICAgIGlmIChUQ1JfOChwb2xsc1t0aWNrZXQgJiBtYXNrXS5wb2xsKSAhPSB0aWNrZXQpCisgICAgICAgIF9fa21wX3ByaW50ZigiTE9DSyBDT05URU5USU9OOiAlcFxuIiwgbGNrKTsKKyAgICAvKiBlbHNlIF9fa21wX3ByaW50ZiggIi4iICk7Ki8KKyNlbmRpZiAvKiBVU0VfTE9DS19QUk9GSUxFICovCisKKyAgICAvLworICAgIC8vIE5vdyBzcGluLXdhaXQsIGJ1dCByZWxvYWQgdGhlIHBvbGxzIHBvaW50ZXIgYW5kIG1hc2ssIGluIGNhc2UgdGhlCisgICAgLy8gcG9sbGluZyBhcmVhIGhhcyBiZWVuIHJlY29uZmlndXJlZC4gIFVubGVzcyBpdCBpcyByZWNvbmZpZ3VyZWQsIHRoZQorICAgIC8vIHJlbG9hZHMgc3RheSBpbiBMMSBjYWNoZSBhbmQgYXJlIGNoZWFwLgorICAgIC8vCisgICAgLy8gS2VlcCB0aGlzIGNvZGUgaW4gc3luYyB3aXRoIEtNUF9XQUlUX1lJRUxELCBpbiBrbXBfZGlzcGF0Y2guYyAhISEKKyAgICAvLworICAgIC8vIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIEtNUF9XQUlUX1lJRUxEIGRvZXNuJ3QgYWxsb3cgZm9yIG1hc2sKKyAgICAvLyBhbmQgcG9sbCB0byBiZSByZS1yZWFkIGV2ZXJ5IHNwaW4gaXRlcmF0aW9uLgorICAgIC8vCisgICAga21wX3VpbnQzMiBzcGluczsKKworICAgIEtNUF9GU1lOQ19QUkVQQVJFKGxjayk7CisgICAgS01QX0lOSVRfWUlFTEQoc3BpbnMpOworICAgIHdoaWxlIChUQ1JfOChwb2xsc1t0aWNrZXQgJiBtYXNrXSkucG9sbCA8IHRpY2tldCkgeyAvLyB2b2xhdGlsZSBsb2FkCisgICAgICAgIF9fa21wX3N0YXRpY19kZWxheShUUlVFKTsKKworICAgICAgICAvLworICAgICAgICAvLyBJZiB3ZSBhcmUgb3ZlcnN1YnNjcmliZWQsCisgICAgICAgIC8vIG9yIGhhdmUgd2FpdGVkIGEgYml0IChhbmQgS01QX0xJQlJBUlk9dHVybmFyb3VuZCksIHRoZW4geWllbGQuCisgICAgICAgIC8vIENQVSBQYXVzZSBpcyBpbiB0aGUgbWFjcm9zIGZvciB5aWVsZC4KKyAgICAgICAgLy8KKyAgICAgICAgS01QX1lJRUxEKFRDUl80KF9fa21wX250aCkKKyAgICAgICAgICA+IChfX2ttcF9hdmFpbF9wcm9jID8gX19rbXBfYXZhaWxfcHJvYyA6IF9fa21wX3hwcm9jKSk7CisgICAgICAgIEtNUF9ZSUVMRF9TUElOKHNwaW5zKTsKKworICAgICAgICAvLyBSZS1yZWFkIHRoZSBtYXNrIGFuZCB0aGUgcG9sbCBwb2ludGVyIGZyb20gdGhlIGxvY2sgc3RydWN0dXJlLgorICAgICAgICAvLworICAgICAgICAvLyBNYWtlIGNlcnRhaW4gdGhhdCAibWFzayIgaXMgcmVhZCBiZWZvcmUgInBvbGxzIiAhISEKKyAgICAgICAgLy8KKyAgICAgICAgLy8gSWYgYW5vdGhlciB0aHJlYWQgcGlja3MgcmVjb25maWd1cmVzIHRoZSBwb2xsaW5nIGFyZWEgYW5kIHVwZGF0ZXMKKyAgICAgICAgLy8gdGhlaXIgdmFsdWVzLCBhbmQgd2UgZ2V0IHRoZSBuZXcgdmFsdWUgb2YgbWFzayBhbmQgdGhlIG9sZCBwb2xscworICAgICAgICAvLyBwb2ludGVyLCB3ZSBjb3VsZCBhY2Nlc3MgbWVtb3J5IGJleW9uZCB0aGUgZW5kIG9mIHRoZSBvbGQgcG9sbGluZworICAgICAgICAvLyBhcmVhLgorICAgICAgICAvLworICAgICAgICBtYXNrID0gVENSXzgobGNrLT5say5tYXNrKTsgICAgICAgICAgICAgICAgICAgICAvLyB2b2xhdGlsZSBsb2FkCisgICAgICAgIHBvbGxzID0gKHZvbGF0aWxlIHN0cnVjdCBrbXBfYmFzZV9kcmRwYV9sb2NrOjprbXBfbG9ja19wb2xsICopCisgICAgICAgICAgVENSX1BUUihsY2stPmxrLnBvbGxzKTsgICAgICAgICAgICAgICAgICAgICAgIC8vIHZvbGF0aWxlIGxvYWQKKyAgICB9CisKKyAgICAvLworICAgIC8vIENyaXRpY2FsIHNlY3Rpb24gc3RhcnRzIGhlcmUKKyAgICAvLworICAgIEtNUF9GU1lOQ19BQ1FVSVJFRChsY2spOworICAgIEtBX1RSQUNFKDEwMDAsICgiX19rbXBfYWNxdWlyZV9kcmRwYV9sb2NrOiB0aWNrZXQgIyVsbGQgYWNxdWlyZWQgbG9jayAlcFxuIiwKKyAgICAgIHRpY2tldCwgbGNrKSk7CisgICAgbGNrLT5say5ub3dfc2VydmluZyA9IHRpY2tldDsgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vbi12b2xhdGlsZSBzdG9yZQorCisgICAgLy8KKyAgICAvLyBEZWFsbG9jYXRlIGEgZ2FyYmFnZSBwb2xsaW5nIGFyZWEgaWYgd2Uga25vdyB0aGF0IHdlIGFyZSB0aGUgbGFzdAorICAgIC8vIHRocmVhZCB0aGF0IGNvdWxkIHBvc3NpYmx5IGFjY2VzcyBpdC4KKyAgICAvLworICAgIC8vIFRoZSA+PSBjaGVjayBpcyBpbiBjYXNlIF9fa21wX3Rlc3RfZHJkcGFfbG9jaygpIGFsbG9jYXRlZCB0aGUgY2xlYW51cAorICAgIC8vIHRpY2tldC4KKyAgICAvLworICAgIGlmICgobGNrLT5say5vbGRfcG9sbHMgIT0gTlVMTCkgJiYgKHRpY2tldCA+PSBsY2stPmxrLmNsZWFudXBfdGlja2V0KSkgeworICAgICAgICBfX2ttcF9mcmVlKCh2b2lkICopbGNrLT5say5vbGRfcG9sbHMpOworICAgICAgICBsY2stPmxrLm9sZF9wb2xscyA9IE5VTEw7CisgICAgICAgIGxjay0+bGsuY2xlYW51cF90aWNrZXQgPSAwOworICAgIH0KKworICAgIC8vCisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIHNob3VsZCByZWNvbmZpZ3VyZSB0aGUgcG9sbGluZyBhcmVhLgorICAgIC8vIElmIHRoZXJlIGlzIHN0aWxsIGEgZ2FyYmFnZSBwb2xsaW5nIGFyZWEgdG8gYmUgZGVhbGxvY2F0ZWQgZnJvbSBhCisgICAgLy8gcHJldmlvdXMgcmVjb25maWd1cmF0aW9uLCBsZXQgYSBsYXRlciB0aHJlYWQgcmVjb25maWd1cmUgaXQuCisgICAgLy8KKyAgICBpZiAobGNrLT5say5vbGRfcG9sbHMgPT0gTlVMTCkgeworICAgICAgICBib29sIHJlY29uZmlndXJlID0gZmFsc2U7CisgICAgICAgIHZvbGF0aWxlIHN0cnVjdCBrbXBfYmFzZV9kcmRwYV9sb2NrOjprbXBfbG9ja19wb2xsICpvbGRfcG9sbHMgPSBwb2xsczsKKyAgICAgICAga21wX3VpbnQzMiBudW1fcG9sbHMgPSBUQ1JfNChsY2stPmxrLm51bV9wb2xscyk7CisKKyAgICAgICAgaWYgKFRDUl80KF9fa21wX250aCkKKyAgICAgICAgICA+IChfX2ttcF9hdmFpbF9wcm9jID8gX19rbXBfYXZhaWxfcHJvYyA6IF9fa21wX3hwcm9jKSkgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFdlIGFyZSBpbiBvdmVyc3Vic2NyaXB0aW9uIG1vZGUuICBDb250cmFjdCB0aGUgcG9sbGluZyBhcmVhCisgICAgICAgICAgICAvLyBkb3duIHRvIGEgc2luZ2xlIGxvY2F0aW9uLCBpZiB0aGF0IGhhc24ndCBiZWVuIGRvbmUgYWxyZWFkeS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBpZiAobnVtX3BvbGxzID4gMSkgeworICAgICAgICAgICAgICAgIHJlY29uZmlndXJlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBudW1fcG9sbHMgPSBUQ1JfNChsY2stPmxrLm51bV9wb2xscyk7CisgICAgICAgICAgICAgICAgbWFzayA9IDA7CisgICAgICAgICAgICAgICAgbnVtX3BvbGxzID0gMTsKKyAgICAgICAgICAgICAgICBwb2xscyA9ICh2b2xhdGlsZSBzdHJ1Y3Qga21wX2Jhc2VfZHJkcGFfbG9jazo6a21wX2xvY2tfcG9sbCAqKQorICAgICAgICAgICAgICAgICAgX19rbXBfYWxsb2NhdGUobnVtX3BvbGxzICogc2l6ZW9mKCpwb2xscykpOworICAgICAgICAgICAgICAgIHBvbGxzWzBdLnBvbGwgPSB0aWNrZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gV2UgYXJlIGluIHVuZGVyL2Z1bGx5IHN1YnNjcmliZWQgbW9kZS4gIENoZWNrIHRoZSBudW1iZXIgb2YKKyAgICAgICAgICAgIC8vIHRocmVhZHMgd2FpdGluZyBvbiB0aGUgbG9jay4gIFRoZSBzaXplIG9mIHRoZSBwb2xsaW5nIGFyZWEKKyAgICAgICAgICAgIC8vIHNob3VsZCBiZSBhdCBsZWFzdCB0aGUgbnVtYmVyIG9mIHRocmVhZHMgd2FpdGluZy4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBrbXBfdWludDY0IG51bV93YWl0aW5nID0gVENSXzgobGNrLT5say5uZXh0X3RpY2tldCkgLSB0aWNrZXQgLSAxOworICAgICAgICAgICAgaWYgKG51bV93YWl0aW5nID4gbnVtX3BvbGxzKSB7CisgICAgICAgICAgICAgICAga21wX3VpbnQzMiBvbGRfbnVtX3BvbGxzID0gbnVtX3BvbGxzOworICAgICAgICAgICAgICAgIHJlY29uZmlndXJlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIG1hc2sgPSAobWFzayA8PCAxKSB8IDE7CisgICAgICAgICAgICAgICAgICAgIG51bV9wb2xscyAqPSAyOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKG51bV9wb2xscyA8PSBudW1fd2FpdGluZyk7CisKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIEFsbG9jYXRlIHRoZSBuZXcgcG9sbGluZyBhcmVhLCBhbmQgY29weSB0aGUgcmVsZXZhbnQgcG9ydGlvbgorICAgICAgICAgICAgICAgIC8vIG9mIHRoZSBvbGQgcG9sbGluZyBhcmVhIHRvIHRoZSBuZXcgYXJlYS4gIF9fa21wX2FsbG9jYXRlKCkKKyAgICAgICAgICAgICAgICAvLyB6ZXJvZXMgdGhlIG1lbW9yeSBpdCBhbGxvY2F0ZXMsIGFuZCBtb3N0IG9mIHRoZSBvbGQgYXJlYSBpcworICAgICAgICAgICAgICAgIC8vIGp1c3QgemVybyBwYWRkaW5nLCBzbyB3ZSBvbmx5IGNvcHkgdGhlIHJlbGVhc2UgY291bnRlcnMuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBwb2xscyA9ICh2b2xhdGlsZSBzdHJ1Y3Qga21wX2Jhc2VfZHJkcGFfbG9jazo6a21wX2xvY2tfcG9sbCAqKQorICAgICAgICAgICAgICAgICAgX19rbXBfYWxsb2NhdGUobnVtX3BvbGxzICogc2l6ZW9mKCpwb2xscykpOworICAgICAgICAgICAgICAgIGttcF91aW50MzIgaTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb2xkX251bV9wb2xsczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHBvbGxzW2ldLnBvbGwgPSBvbGRfcG9sbHNbaV0ucG9sbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVjb25maWd1cmUpIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBOb3cgd3JpdGUgdGhlIHVwZGF0ZWQgZmllbGRzIGJhY2sgdG8gdGhlIGxvY2sgc3RydWN0dXJlLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIE1ha2UgY2VydGFpbiB0aGF0ICJwb2xscyIgaXMgd3JpdHRlbiBiZWZvcmUgIm1hc2siICEhIQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIElmIGFub3RoZXIgdGhyZWFkIHBpY2tzIHVwIHRoZSBuZXcgdmFsdWUgb2YgbWFzayBhbmQgdGhlIG9sZAorICAgICAgICAgICAgLy8gcG9sbHMgcG9pbnRlciAsIGl0IGNvdWxkIGFjY2VzcyBtZW1vcnkgYmV5b25kIHRoZSBlbmQgb2YgdGhlCisgICAgICAgICAgICAvLyBvbGQgcG9sbGluZyBhcmVhLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIE9uIHg4Niwgd2UgbmVlZCBtZW1vcnkgZmVuY2VzLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIEtBX1RSQUNFKDEwMDAsICgiX19rbXBfYWNxdWlyZV9kcmRwYV9sb2NrOiB0aWNrZXQgIyVsbGQgcmVjb25maWd1cmluZyBsb2NrICVwIHRvICVkIHBvbGxzXG4iLAorICAgICAgICAgICAgICB0aWNrZXQsIGxjaywgbnVtX3BvbGxzKSk7CisKKyAgICAgICAgICAgIGxjay0+bGsub2xkX3BvbGxzID0gb2xkX3BvbGxzOyAgICAgICAgICAgICAgLy8gbm9uLXZvbGF0aWxlIHN0b3JlCisgICAgICAgICAgICBsY2stPmxrLnBvbGxzID0gcG9sbHM7ICAgICAgICAgICAgICAgICAgICAgIC8vIHZvbGF0aWxlIHN0b3JlCisKKyAgICAgICAgICAgIEtNUF9NQigpOworCisgICAgICAgICAgICBsY2stPmxrLm51bV9wb2xscyA9IG51bV9wb2xsczsgICAgICAgICAgICAgIC8vIG5vbi12b2xhdGlsZSBzdG9yZQorICAgICAgICAgICAgbGNrLT5say5tYXNrID0gbWFzazsgICAgICAgICAgICAgICAgICAgICAgICAvLyB2b2xhdGlsZSBzdG9yZQorCisgICAgICAgICAgICBLTVBfTUIoKTsKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIE9ubHkgYWZ0ZXIgdGhlIG5ldyBwb2xsaW5nIGFyZWEgYW5kIG1hc2sgaGF2ZSBiZWVuIGZsdXNoZWQKKyAgICAgICAgICAgIC8vIHRvIG1haW4gbWVtb3J5IGNhbiB3ZSB1cGRhdGUgdGhlIGNsZWFudXAgdGlja2V0IGZpZWxkLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIHZvbGF0aWxlIGxvYWQgLyBub24tdm9sYXRpbGUgc3RvcmUKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBsY2stPmxrLmNsZWFudXBfdGlja2V0ID0gVENSXzgobGNrLT5say5uZXh0X3RpY2tldCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQKK19fa21wX2FjcXVpcmVfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgX19rbXBfYWNxdWlyZV9kcmRwYV9sb2NrX3RpbWVkX3RlbXBsYXRlKCBsY2ssIGd0aWQgKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2FjcXVpcmVfZHJkcGFfbG9ja193aXRoX2NoZWNrcygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9zZXRfbG9jayI7CisgICAgICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2lzX2RyZHBhX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoICggZ3RpZCA+PSAwICkgJiYgKCBfX2ttcF9nZXRfZHJkcGFfbG9ja19vd25lciggbGNrICkgPT0gZ3RpZCApICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNBbHJlYWR5T3duZWQsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIF9fa21wX2FjcXVpcmVfZHJkcGFfbG9jayggbGNrLCBndGlkICk7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgbGNrLT5say5vd25lcl9pZCA9IGd0aWQgKyAxOworICAgIH0KK30KKworaW50CitfX2ttcF90ZXN0X2RyZHBhX2xvY2soIGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIC8vCisgICAgLy8gRmlyc3QgZ2V0IGEgdGlja2V0LCB0aGVuIHJlYWQgdGhlIHBvbGxzIHBvaW50ZXIgYW5kIHRoZSBtYXNrLgorICAgIC8vIFRoZSBwb2xscyBwb2ludGVyIG11c3QgYmUgcmVhZCBiZWZvcmUgdGhlIG1hc2shISEgKFNlZSBhYm92ZSkKKyAgICAvLworICAgIGttcF91aW50NjQgdGlja2V0ID0gVENSXzgobGNrLT5say5uZXh0X3RpY2tldCk7ICAgICAvLyB2b2xhdGlsZSBsb2FkCisgICAgdm9sYXRpbGUgc3RydWN0IGttcF9iYXNlX2RyZHBhX2xvY2s6OmttcF9sb2NrX3BvbGwgKnBvbGxzCisgICAgICA9ICh2b2xhdGlsZSBzdHJ1Y3Qga21wX2Jhc2VfZHJkcGFfbG9jazo6a21wX2xvY2tfcG9sbCAqKQorICAgICAgVENSX1BUUihsY2stPmxrLnBvbGxzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2b2xhdGlsZSBsb2FkCisgICAga21wX3VpbnQ2NCBtYXNrID0gVENSXzgobGNrLT5say5tYXNrKTsgICAgICAgICAgICAgIC8vIHZvbGF0aWxlIGxvYWQKKyAgICBpZiAoVENSXzgocG9sbHNbdGlja2V0ICYgbWFza10ucG9sbCkgPT0gdGlja2V0KSB7CisgICAgICAgIGttcF91aW50NjQgbmV4dF90aWNrZXQgPSB0aWNrZXQgKyAxOworICAgICAgICBpZiAoS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTY0KChrbXBfaW50NjQgKikmbGNrLT5say5uZXh0X3RpY2tldCwKKyAgICAgICAgICB0aWNrZXQsIG5leHRfdGlja2V0KSkgeworICAgICAgICAgICAgS01QX0ZTWU5DX0FDUVVJUkVEKGxjayk7CisgICAgICAgICAgICBLQV9UUkFDRSgxMDAwLCAoIl9fa21wX3Rlc3RfZHJkcGFfbG9jazogdGlja2V0ICMlbGxkIGFjcXVpcmVkIGxvY2sgJXBcbiIsCisgICAgICAgICAgICAgICB0aWNrZXQsIGxjaykpOworICAgICAgICAgICAgbGNrLT5say5ub3dfc2VydmluZyA9IHRpY2tldDsgICAgICAgICAgICAgICAvLyBub24tdm9sYXRpbGUgc3RvcmUKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFNpbmNlIG5vIHRocmVhZHMgYXJlIHdhaXRpbmcsIHRoZXJlIGlzIG5vIHBvc3NpYmlsaXR5IHRoYXQKKyAgICAgICAgICAgIC8vIHdlIHdvdWxkIHdhbnQgdG8gcmVjb25maWd1cmUgdGhlIHBvbGxpbmcgYXJlYS4gIFdlIG1pZ2h0CisgICAgICAgICAgICAvLyBoYXZlIHRoZSBjbGVhbnVwIHRpY2tldCB2YWx1ZSAod2hpY2ggc2F5cyB0aGF0IGl0IGlzIG5vdworICAgICAgICAgICAgLy8gc2FmZSB0byBkZWFsbG9jYXRlIG9sZF9wb2xscyksIGJ1dCB3ZSdsbCBsZXQgYSBsYXRlciB0aHJlYWQKKyAgICAgICAgICAgIC8vIHdoaWNoIGNhbGxzIF9fa21wX2FjcXVpcmVfbG9jayBkbyB0aGF0IC0gdGhpcyByb3V0aW5lCisgICAgICAgICAgICAvLyBpc24ndCBzdXBwb3NlZCB0byBibG9jaywgYW5kIHdlIHdvdWxkIHJpc2sgYmxvY2tzIGlmIHdlCisgICAgICAgICAgICAvLyBjYWxsZWQgX19rbXBfZnJlZSgpIHRvIGRvIHRoZSBkZWFsbG9jYXRpb24uCisgICAgICAgICAgICAvLworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgaW50CitfX2ttcF90ZXN0X2RyZHBhX2xvY2tfd2l0aF9jaGVja3MoIGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdGVzdF9sb2NrIjsKKyAgICAgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgICAgICB9CisgICAgICAgIGlmICggX19rbXBfaXNfZHJkcGFfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyApOworICAgICAgICB9CisgICAgfQorCisgICAgaW50IHJldHZhbCA9IF9fa21wX3Rlc3RfZHJkcGFfbG9jayggbGNrLCBndGlkICk7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayAmJiByZXR2YWwgKSB7CisgICAgICAgIGxjay0+bGsub3duZXJfaWQgPSBndGlkICsgMTsKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKwordm9pZAorX19rbXBfcmVsZWFzZV9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICAvLworICAgIC8vIFJlYWQgdGhlIHRpY2tldCB2YWx1ZSBmcm9tIHRoZSBsb2NrIGRhdGEgc3RydWN0LCB0aGVuIHRoZSBwb2xscworICAgIC8vIHBvaW50ZXIgYW5kIHRoZSBtYXNrLiAgVGhlIHBvbGxzIHBvaW50ZXIgbXVzdCBiZSByZWFkIGJlZm9yZSB0aGUKKyAgICAvLyBtYXNrISEhIChTZWUgYWJvdmUpCisgICAgLy8KKyAgICBrbXBfdWludDY0IHRpY2tldCA9IGxjay0+bGsubm93X3NlcnZpbmcgKyAxOyAgICAgICAgLy8gbm9uLXZvbGF0aWxlIGxvYWQKKyAgICB2b2xhdGlsZSBzdHJ1Y3Qga21wX2Jhc2VfZHJkcGFfbG9jazo6a21wX2xvY2tfcG9sbCAqcG9sbHMKKyAgICAgID0gKHZvbGF0aWxlIHN0cnVjdCBrbXBfYmFzZV9kcmRwYV9sb2NrOjprbXBfbG9ja19wb2xsICopCisgICAgICBUQ1JfUFRSKGxjay0+bGsucG9sbHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZvbGF0aWxlIGxvYWQKKyAgICBrbXBfdWludDY0IG1hc2sgPSBUQ1JfOChsY2stPmxrLm1hc2spOyAgICAgICAgICAgICAgLy8gdm9sYXRpbGUgbG9hZAorICAgIEtBX1RSQUNFKDEwMDAsICgiX19rbXBfcmVsZWFzZV9kcmRwYV9sb2NrOiB0aWNrZXQgIyVsbGQgcmVsZWFzZWQgbG9jayAlcFxuIiwKKyAgICAgICB0aWNrZXQgLSAxLCBsY2spKTsKKyAgICBLTVBfRlNZTkNfUkVMRUFTSU5HKGxjayk7CisgICAgS01QX1NUX1JFTDY0KCYocG9sbHNbdGlja2V0ICYgbWFza10ucG9sbCksIHRpY2tldCk7IC8vIHZvbGF0aWxlIHN0b3JlCit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9yZWxlYXNlX2RyZHBhX2xvY2tfd2l0aF9jaGVja3MoIGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdW5zZXRfbG9jayI7CisgICAgICAgIEtNUF9NQigpOyAgLyogaW4gY2FzZSBhbm90aGVyIHByb2Nlc3NvciBpbml0aWFsaXplZCBsb2NrICovCisgICAgICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2lzX2RyZHBhX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2dldF9kcmRwYV9sb2NrX293bmVyKCBsY2sgKSA9PSAtMSApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ0ZyZWUsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoICggZ3RpZCA+PSAwICkgJiYgKCBfX2ttcF9nZXRfZHJkcGFfbG9ja19vd25lciggbGNrICkgPj0gMCApCisgICAgICAgICAgJiYgKCBfX2ttcF9nZXRfZHJkcGFfbG9ja19vd25lciggbGNrICkgIT0gZ3RpZCApICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nU2V0QnlBbm90aGVyLCBmdW5jICk7CisgICAgICAgIH0KKyAgICAgICAgbGNrLT5say5vd25lcl9pZCA9IDA7CisgICAgfQorICAgIF9fa21wX3JlbGVhc2VfZHJkcGFfbG9jayggbGNrLCBndGlkICk7Cit9CisKK3ZvaWQKK19fa21wX2luaXRfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqbGNrICkKK3sKKyAgICBsY2stPmxrLmxvY2F0aW9uID0gTlVMTDsKKyAgICBsY2stPmxrLm1hc2sgPSAwOworICAgIGxjay0+bGsubnVtX3BvbGxzID0gMTsKKyAgICBsY2stPmxrLnBvbGxzID0gKHZvbGF0aWxlIHN0cnVjdCBrbXBfYmFzZV9kcmRwYV9sb2NrOjprbXBfbG9ja19wb2xsICopCisgICAgICBfX2ttcF9hbGxvY2F0ZShsY2stPmxrLm51bV9wb2xscyAqIHNpemVvZigqKGxjay0+bGsucG9sbHMpKSk7CisgICAgbGNrLT5say5jbGVhbnVwX3RpY2tldCA9IDA7CisgICAgbGNrLT5say5vbGRfcG9sbHMgPSBOVUxMOworICAgIGxjay0+bGsubmV4dF90aWNrZXQgPSAwOworICAgIGxjay0+bGsubm93X3NlcnZpbmcgPSAwOworICAgIGxjay0+bGsub3duZXJfaWQgPSAwOyAgICAgIC8vIG5vIHRocmVhZCBvd25zIHRoZSBsb2NrLgorICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gLTE7IC8vID49IDAgZm9yIG5lc3RhYmxlIGxvY2tzLCAtMSBmb3Igc2ltcGxlIGxvY2tzLgorICAgIGxjay0+bGsuaW5pdGlhbGl6ZWQgPSBsY2s7CisKKyAgICBLQV9UUkFDRSgxMDAwLCAoIl9fa21wX2luaXRfZHJkcGFfbG9jazogbG9jayAlcCBpbml0aWFsaXplZFxuIiwgbGNrKSk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9pbml0X2RyZHBhX2xvY2tfd2l0aF9jaGVja3MoIGttcF9kcmRwYV9sb2NrX3QgKiBsY2sgKQoreworICAgIF9fa21wX2luaXRfZHJkcGFfbG9jayggbGNrICk7Cit9CisKK3ZvaWQKK19fa21wX2Rlc3Ryb3lfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqbGNrICkKK3sKKyAgICBsY2stPmxrLmluaXRpYWxpemVkID0gTlVMTDsKKyAgICBsY2stPmxrLmxvY2F0aW9uICAgID0gTlVMTDsKKyAgICBpZiAobGNrLT5say5wb2xscyAhPSBOVUxMKSB7CisgICAgICAgIF9fa21wX2ZyZWUoKHZvaWQgKilsY2stPmxrLnBvbGxzKTsKKyAgICAgICAgbGNrLT5say5wb2xscyA9IE5VTEw7CisgICAgfQorICAgIGlmIChsY2stPmxrLm9sZF9wb2xscyAhPSBOVUxMKSB7CisgICAgICAgIF9fa21wX2ZyZWUoKHZvaWQgKilsY2stPmxrLm9sZF9wb2xscyk7CisgICAgICAgIGxjay0+bGsub2xkX3BvbGxzID0gTlVMTDsKKyAgICB9CisgICAgbGNrLT5say5tYXNrID0gMDsKKyAgICBsY2stPmxrLm51bV9wb2xscyA9IDA7CisgICAgbGNrLT5say5jbGVhbnVwX3RpY2tldCA9IDA7CisgICAgbGNrLT5say5uZXh0X3RpY2tldCA9IDA7CisgICAgbGNrLT5say5ub3dfc2VydmluZyA9IDA7CisgICAgbGNrLT5say5vd25lcl9pZCA9IDA7CisgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAtMTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2Rlc3Ryb3lfZHJkcGFfbG9ja193aXRoX2NoZWNrcygga21wX2RyZHBhX2xvY2tfdCAqbGNrICkKK3sKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX2Rlc3Ryb3lfbG9jayI7CisgICAgICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2lzX2RyZHBhX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2dldF9kcmRwYV9sb2NrX293bmVyKCBsY2sgKSAhPSAtMSApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja1N0aWxsT3duZWQsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBfX2ttcF9kZXN0cm95X2RyZHBhX2xvY2soIGxjayApOworfQorCisKKy8vCisvLyBuZXN0ZWQgZHJkcGEgdGlja2V0IGxvY2tzCisvLworCit2b2lkCitfX2ttcF9hY3F1aXJlX25lc3RlZF9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKworICAgIGlmICggX19rbXBfZ2V0X2RyZHBhX2xvY2tfb3duZXIoIGxjayApID09IGd0aWQgKSB7CisgICAgICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkICs9IDE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBfX2ttcF9hY3F1aXJlX2RyZHBhX2xvY2tfdGltZWRfdGVtcGxhdGUoIGxjaywgZ3RpZCApOworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAxOworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgbGNrLT5say5vd25lcl9pZCA9IGd0aWQgKyAxOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK19fa21wX2FjcXVpcmVfbmVzdGVkX2RyZHBhX2xvY2tfd2l0aF9jaGVja3MoIGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfc2V0X25lc3RfbG9jayI7CisgICAgICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoICEgX19rbXBfaXNfZHJkcGFfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgICAgICB9CisgICAgfQorICAgIF9fa21wX2FjcXVpcmVfbmVzdGVkX2RyZHBhX2xvY2soIGxjaywgZ3RpZCApOworfQorCitpbnQKK19fa21wX3Rlc3RfbmVzdGVkX2RyZHBhX2xvY2soIGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGludCByZXR2YWw7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKworICAgIGlmICggX19rbXBfZ2V0X2RyZHBhX2xvY2tfb3duZXIoIGxjayApID09IGd0aWQgKSB7CisgICAgICAgIHJldHZhbCA9ICsrbGNrLT5say5kZXB0aF9sb2NrZWQ7CisgICAgfQorICAgIGVsc2UgaWYgKCAhX19rbXBfdGVzdF9kcmRwYV9sb2NrKCBsY2ssIGd0aWQgKSApIHsKKyAgICAgICAgcmV0dmFsID0gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEtNUF9NQigpOworICAgICAgICByZXR2YWwgPSBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IDE7CisgICAgICAgIEtNUF9NQigpOworICAgICAgICBsY2stPmxrLm93bmVyX2lkID0gZ3RpZCArIDE7CisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3Rlc3RfbmVzdGVkX2RyZHBhX2xvY2tfd2l0aF9jaGVja3MoIGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdGVzdF9uZXN0X2xvY2siOworICAgICAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAhIF9fa21wX2lzX2RyZHBhX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gX19rbXBfdGVzdF9uZXN0ZWRfZHJkcGFfbG9jayggbGNrLCBndGlkICk7Cit9CisKK3ZvaWQKK19fa21wX3JlbGVhc2VfbmVzdGVkX2RyZHBhX2xvY2soIGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIGd0aWQgPj0gMCApOworCisgICAgS01QX01CKCk7CisgICAgaWYgKCAtLShsY2stPmxrLmRlcHRoX2xvY2tlZCkgPT0gMCApIHsKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIGxjay0+bGsub3duZXJfaWQgPSAwOworICAgICAgICBfX2ttcF9yZWxlYXNlX2RyZHBhX2xvY2soIGxjaywgZ3RpZCApOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK19fa21wX3JlbGVhc2VfbmVzdGVkX2RyZHBhX2xvY2tfd2l0aF9jaGVja3MoIGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdW5zZXRfbmVzdF9sb2NrIjsKKyAgICAgICAgS01QX01CKCk7ICAvKiBpbiBjYXNlIGFub3RoZXIgcHJvY2Vzc29yIGluaXRpYWxpemVkIGxvY2sgKi8KKyAgICAgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgICAgICB9CisgICAgICAgIGlmICggISBfX2ttcF9pc19kcmRwYV9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBfX2ttcF9nZXRfZHJkcGFfbG9ja19vd25lciggbGNrICkgPT0gLTEgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tVbnNldHRpbmdGcmVlLCBmdW5jICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBfX2ttcF9nZXRfZHJkcGFfbG9ja19vd25lciggbGNrICkgIT0gZ3RpZCApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ1NldEJ5QW5vdGhlciwgZnVuYyApOworICAgICAgICB9CisgICAgfQorICAgIF9fa21wX3JlbGVhc2VfbmVzdGVkX2RyZHBhX2xvY2soIGxjaywgZ3RpZCApOworfQorCit2b2lkCitfX2ttcF9pbml0X25lc3RlZF9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICogbGNrICkKK3sKKyAgICBfX2ttcF9pbml0X2RyZHBhX2xvY2soIGxjayApOworICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMDsgLy8gPj0gMCBmb3IgbmVzdGFibGUgbG9ja3MsIC0xIGZvciBzaW1wbGUgbG9ja3MKK30KKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfbmVzdGVkX2RyZHBhX2xvY2tfd2l0aF9jaGVja3MoIGttcF9kcmRwYV9sb2NrX3QgKiBsY2sgKQoreworICAgIF9fa21wX2luaXRfbmVzdGVkX2RyZHBhX2xvY2soIGxjayApOworfQorCit2b2lkCitfX2ttcF9kZXN0cm95X25lc3RlZF9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2sgKQoreworICAgIF9fa21wX2Rlc3Ryb3lfZHJkcGFfbG9jayggbGNrICk7CisgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAwOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVzdHJveV9uZXN0ZWRfZHJkcGFfbG9ja193aXRoX2NoZWNrcygga21wX2RyZHBhX2xvY2tfdCAqbGNrICkKK3sKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX2Rlc3Ryb3lfbmVzdF9sb2NrIjsKKyAgICAgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgICAgICB9CisgICAgICAgIGlmICggISBfX2ttcF9pc19kcmRwYV9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBfX2ttcF9nZXRfZHJkcGFfbG9ja19vd25lciggbGNrICkgIT0gLTEgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tTdGlsbE93bmVkLCBmdW5jICk7CisgICAgICAgIH0KKyAgICB9CisgICAgX19rbXBfZGVzdHJveV9uZXN0ZWRfZHJkcGFfbG9jayggbGNrICk7Cit9CisKKworLy8KKy8vIGFjY2VzcyBmdW5jdGlvbnMgdG8gZmllbGRzIHdoaWNoIGRvbid0IGV4aXN0IGZvciBhbGwgbG9jayBraW5kcy4KKy8vCisKK3N0YXRpYyBpbnQKK19fa21wX2lzX2RyZHBhX2xvY2tfaW5pdGlhbGl6ZWQoIGttcF9kcmRwYV9sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIGxjayA9PSBsY2stPmxrLmluaXRpYWxpemVkOworfQorCitzdGF0aWMgY29uc3QgaWRlbnRfdCAqCitfX2ttcF9nZXRfZHJkcGFfbG9ja19sb2NhdGlvbigga21wX2RyZHBhX2xvY2tfdCAqbGNrICkKK3sKKyAgICByZXR1cm4gbGNrLT5say5sb2NhdGlvbjsKK30KKworc3RhdGljIHZvaWQKK19fa21wX3NldF9kcmRwYV9sb2NrX2xvY2F0aW9uKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGNvbnN0IGlkZW50X3QgKmxvYyApCit7CisgICAgbGNrLT5say5sb2NhdGlvbiA9IGxvYzsKK30KKworc3RhdGljIGttcF9sb2NrX2ZsYWdzX3QKK19fa21wX2dldF9kcmRwYV9sb2NrX2ZsYWdzKCBrbXBfZHJkcGFfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBsY2stPmxrLmZsYWdzOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfc2V0X2RyZHBhX2xvY2tfZmxhZ3MoIGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2xvY2tfZmxhZ3NfdCBmbGFncyApCit7CisgICAgbGNrLT5say5mbGFncyA9IGZsYWdzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIHVzZXIgbG9ja3MKKyAqCisgKiBUaGV5IGFyZSBpbXBsZW1lbnRlZCBhcyBhIHRhYmxlIG9mIGZ1bmN0aW9uIHBvaW50ZXJzIHdoaWNoIGFyZSBzZXQgdG8gdGhlCisgKiBsb2NrIGZ1bmN0aW9ucyBvZiB0aGUgYXBwcm9wcmlhdGUga2luZCwgb25jZSB0aGF0IGhhcyBiZWVuIGRldGVybWluZWQuCisgKi8KKworZW51bSBrbXBfbG9ja19raW5kIF9fa21wX3VzZXJfbG9ja19raW5kID0gbGtfZGVmYXVsdDsKKworc2l6ZV90IF9fa21wX2Jhc2VfdXNlcl9sb2NrX3NpemUgPSAwOworc2l6ZV90IF9fa21wX3VzZXJfbG9ja19zaXplID0gMDsKKwora21wX2ludDMyICggKl9fa21wX2dldF91c2VyX2xvY2tfb3duZXJfICkoIGttcF91c2VyX2xvY2tfcCBsY2sgKSA9IE5VTEw7Cit2b2lkICggKl9fa21wX2FjcXVpcmVfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfaW50MzIgZ3RpZCApID0gTlVMTDsKKworaW50ICggKl9fa21wX3Rlc3RfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfaW50MzIgZ3RpZCApID0gTlVMTDsKK3ZvaWQgKCAqX19rbXBfcmVsZWFzZV91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICkgPSBOVUxMOwordm9pZCAoICpfX2ttcF9pbml0X3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjayApID0gTlVMTDsKK3ZvaWQgKCAqX19rbXBfZGVzdHJveV91c2VyX2xvY2tfICkoIGttcF91c2VyX2xvY2tfcCBsY2sgKSA9IE5VTEw7Cit2b2lkICggKl9fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrICkgPSBOVUxMOwordm9pZCAoICpfX2ttcF9hY3F1aXJlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICkgPSBOVUxMOworCitpbnQgKCAqX19rbXBfdGVzdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfaW50MzIgZ3RpZCApID0gTlVMTDsKK3ZvaWQgKCAqX19rbXBfcmVsZWFzZV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfaW50MzIgZ3RpZCApID0gTlVMTDsKK3ZvaWQgKCAqX19rbXBfaW5pdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrICkgPSBOVUxMOwordm9pZCAoICpfX2ttcF9kZXN0cm95X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2sgKSA9IE5VTEw7CisKK2ludCAoICpfX2ttcF9pc191c2VyX2xvY2tfaW5pdGlhbGl6ZWRfICkoIGttcF91c2VyX2xvY2tfcCBsY2sgKSA9IE5VTEw7Citjb25zdCBpZGVudF90ICogKCAqX19rbXBfZ2V0X3VzZXJfbG9ja19sb2NhdGlvbl8gKSgga21wX3VzZXJfbG9ja19wIGxjayApID0gTlVMTDsKK3ZvaWQgKCAqX19rbXBfc2V0X3VzZXJfbG9ja19sb2NhdGlvbl8gKSgga21wX3VzZXJfbG9ja19wIGxjaywgY29uc3QgaWRlbnRfdCAqbG9jICkgPSBOVUxMOwora21wX2xvY2tfZmxhZ3NfdCAoICpfX2ttcF9nZXRfdXNlcl9sb2NrX2ZsYWdzXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrICkgPSBOVUxMOwordm9pZCAoICpfX2ttcF9zZXRfdXNlcl9sb2NrX2ZsYWdzXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfbG9ja19mbGFnc190IGZsYWdzICkgPSBOVUxMOworCit2b2lkIF9fa21wX3NldF91c2VyX2xvY2tfdnB0cnMoIGttcF9sb2NrX2tpbmRfdCB1c2VyX2xvY2tfa2luZCApCit7CisgICAgc3dpdGNoICggdXNlcl9sb2NrX2tpbmQgKSB7CisgICAgICAgIGNhc2UgbGtfZGVmYXVsdDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgS01QX0FTU0VSVCggMCApOworCisgICAgICAgIGNhc2UgbGtfdGFzOiB7CisgICAgICAgICAgICBfX2ttcF9iYXNlX3VzZXJfbG9ja19zaXplID0gc2l6ZW9mKCBrbXBfYmFzZV90YXNfbG9ja190ICk7CisgICAgICAgICAgICBfX2ttcF91c2VyX2xvY2tfc2l6ZSA9IHNpemVvZigga21wX3Rhc19sb2NrX3QgKTsKKworICAgICAgICAgICAgX19rbXBfZ2V0X3VzZXJfbG9ja19vd25lcl8gPQorICAgICAgICAgICAgICAoIGttcF9pbnQzMiAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9nZXRfdGFzX2xvY2tfb3duZXIgKTsKKworICAgICAgICAgICAgX19rbXBfYWNxdWlyZV91c2VyX2xvY2tfd2l0aF9jaGVja3NfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMiApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfYWNxdWlyZV90YXNfbG9ja193aXRoX2NoZWNrcyApOworCisgICAgICAgICAgICBfX2ttcF90ZXN0X3VzZXJfbG9ja193aXRoX2NoZWNrc18gPQorICAgICAgICAgICAgICAoIGludCAgKCAqICkoIGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF90ZXN0X3Rhc19sb2NrX3dpdGhfY2hlY2tzICk7CisKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyA9CisgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wLCBrbXBfaW50MzIgKSApCisgICAgICAgICAgICAgICggJl9fa21wX3JlbGVhc2VfdGFzX2xvY2tfd2l0aF9jaGVja3MgKTsKKworICAgICAgICAgICAgX19rbXBfaW5pdF91c2VyX2xvY2tfd2l0aF9jaGVja3NfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2luaXRfdGFzX2xvY2tfd2l0aF9jaGVja3MgKTsKKworICAgICAgICAgICAgX19rbXBfZGVzdHJveV91c2VyX2xvY2tfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2Rlc3Ryb3lfdGFzX2xvY2sgKTsKKworICAgICAgICAgICAgX19rbXBfZGVzdHJveV91c2VyX2xvY2tfd2l0aF9jaGVja3NfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2Rlc3Ryb3lfdGFzX2xvY2tfd2l0aF9jaGVja3MgKTsKKworICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyA9CisgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wLCBrbXBfaW50MzIgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2FjcXVpcmVfbmVzdGVkX3Rhc19sb2NrX3dpdGhfY2hlY2tzICk7CisKKyAgICAgICAgICAgIF9fa21wX3Rlc3RfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gPQorICAgICAgICAgICAgICAoIGludCAgKCAqICkoIGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF90ZXN0X25lc3RlZF90YXNfbG9ja193aXRoX2NoZWNrcyApOworCisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMiApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfcmVsZWFzZV9uZXN0ZWRfdGFzX2xvY2tfd2l0aF9jaGVja3MgKTsKKworICAgICAgICAgICAgX19rbXBfaW5pdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyA9CisgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9pbml0X25lc3RlZF90YXNfbG9ja193aXRoX2NoZWNrcyApOworCisgICAgICAgICAgICBfX2ttcF9kZXN0cm95X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2Rlc3Ryb3lfbmVzdGVkX3Rhc19sb2NrX3dpdGhfY2hlY2tzICk7CisKKyAgICAgICAgICAgICBfX2ttcF9pc191c2VyX2xvY2tfaW5pdGlhbGl6ZWRfID0KKyAgICAgICAgICAgICAgICggaW50ICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApIE5VTEw7CisKKyAgICAgICAgICAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyA9CisgICAgICAgICAgICAgICAoIGNvbnN0IGlkZW50X3QgKiAoICogKSgga21wX3VzZXJfbG9ja19wICkgKSBOVUxMOworCisgICAgICAgICAgICAgX19rbXBfc2V0X3VzZXJfbG9ja19sb2NhdGlvbl8gPQorICAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGNvbnN0IGlkZW50X3QgKiApICkgTlVMTDsKKworICAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfZmxhZ3NfID0KKyAgICAgICAgICAgICAgICgga21wX2xvY2tfZmxhZ3NfdCAoICogKSgga21wX3VzZXJfbG9ja19wICkgKSBOVUxMOworCisgICAgICAgICAgICAgX19rbXBfc2V0X3VzZXJfbG9ja19mbGFnc18gPQorICAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9sb2NrX2ZsYWdzX3QgKSApIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNKQorCisgICAgICAgIGNhc2UgbGtfZnV0ZXg6IHsKKyAgICAgICAgICAgIF9fa21wX2Jhc2VfdXNlcl9sb2NrX3NpemUgPSBzaXplb2YoIGttcF9iYXNlX2Z1dGV4X2xvY2tfdCApOworICAgICAgICAgICAgX19rbXBfdXNlcl9sb2NrX3NpemUgPSBzaXplb2YoIGttcF9mdXRleF9sb2NrX3QgKTsKKworICAgICAgICAgICAgX19rbXBfZ2V0X3VzZXJfbG9ja19vd25lcl8gPQorICAgICAgICAgICAgICAoIGttcF9pbnQzMiAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9nZXRfZnV0ZXhfbG9ja19vd25lciApOworCisgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX3VzZXJfbG9ja193aXRoX2NoZWNrc18gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9hY3F1aXJlX2Z1dGV4X2xvY2tfd2l0aF9jaGVja3MgKTsKKworICAgICAgICAgICAgX19rbXBfdGVzdF91c2VyX2xvY2tfd2l0aF9jaGVja3NfID0KKyAgICAgICAgICAgICAgKCBpbnQgICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMiApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfdGVzdF9mdXRleF9sb2NrX3dpdGhfY2hlY2tzICk7CisKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyA9CisgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wLCBrbXBfaW50MzIgKSApCisgICAgICAgICAgICAgICggJl9fa21wX3JlbGVhc2VfZnV0ZXhfbG9ja193aXRoX2NoZWNrcyApOworCisgICAgICAgICAgICBfX2ttcF9pbml0X3VzZXJfbG9ja193aXRoX2NoZWNrc18gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfaW5pdF9mdXRleF9sb2NrX3dpdGhfY2hlY2tzICk7CisKKyAgICAgICAgICAgIF9fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrXyA9CisgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9kZXN0cm95X2Z1dGV4X2xvY2sgKTsKKworICAgICAgICAgICAgX19rbXBfZGVzdHJveV91c2VyX2xvY2tfd2l0aF9jaGVja3NfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2Rlc3Ryb3lfZnV0ZXhfbG9ja193aXRoX2NoZWNrcyApOworCisgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMiApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfYWNxdWlyZV9uZXN0ZWRfZnV0ZXhfbG9ja193aXRoX2NoZWNrcyApOworCisgICAgICAgICAgICBfX2ttcF90ZXN0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfID0KKyAgICAgICAgICAgICAgKCBpbnQgICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMiApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfdGVzdF9uZXN0ZWRfZnV0ZXhfbG9ja193aXRoX2NoZWNrcyApOworCisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMiApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfcmVsZWFzZV9uZXN0ZWRfZnV0ZXhfbG9ja193aXRoX2NoZWNrcyApOworCisgICAgICAgICAgICBfX2ttcF9pbml0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2luaXRfbmVzdGVkX2Z1dGV4X2xvY2tfd2l0aF9jaGVja3MgKTsKKworICAgICAgICAgICAgX19rbXBfZGVzdHJveV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyA9CisgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9kZXN0cm95X25lc3RlZF9mdXRleF9sb2NrX3dpdGhfY2hlY2tzICk7CisKKyAgICAgICAgICAgICBfX2ttcF9pc191c2VyX2xvY2tfaW5pdGlhbGl6ZWRfID0KKyAgICAgICAgICAgICAgICggaW50ICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApIE5VTEw7CisKKyAgICAgICAgICAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyA9CisgICAgICAgICAgICAgICAoIGNvbnN0IGlkZW50X3QgKiAoICogKSgga21wX3VzZXJfbG9ja19wICkgKSBOVUxMOworCisgICAgICAgICAgICAgX19rbXBfc2V0X3VzZXJfbG9ja19sb2NhdGlvbl8gPQorICAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGNvbnN0IGlkZW50X3QgKiApICkgTlVMTDsKKworICAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfZmxhZ3NfID0KKyAgICAgICAgICAgICAgICgga21wX2xvY2tfZmxhZ3NfdCAoICogKSgga21wX3VzZXJfbG9ja19wICkgKSBOVUxMOworCisgICAgICAgICAgICAgX19rbXBfc2V0X3VzZXJfbG9ja19mbGFnc18gPQorICAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9sb2NrX2ZsYWdzX3QgKSApIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyNlbmRpZiAvLyBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNKQorCisgICAgICAgIGNhc2UgbGtfdGlja2V0OiB7CisgICAgICAgICAgICBfX2ttcF9iYXNlX3VzZXJfbG9ja19zaXplID0gc2l6ZW9mKCBrbXBfYmFzZV90aWNrZXRfbG9ja190ICk7CisgICAgICAgICAgICBfX2ttcF91c2VyX2xvY2tfc2l6ZSA9IHNpemVvZigga21wX3RpY2tldF9sb2NrX3QgKTsKKworICAgICAgICAgICAgX19rbXBfZ2V0X3VzZXJfbG9ja19vd25lcl8gPQorICAgICAgICAgICAgICAoIGttcF9pbnQzMiAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9nZXRfdGlja2V0X2xvY2tfb3duZXIgKTsKKworICAgICAgICAgICAgX19rbXBfYWNxdWlyZV91c2VyX2xvY2tfd2l0aF9jaGVja3NfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMiApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfYWNxdWlyZV90aWNrZXRfbG9ja193aXRoX2NoZWNrcyApOworCisgICAgICAgICAgICBfX2ttcF90ZXN0X3VzZXJfbG9ja193aXRoX2NoZWNrc18gPQorICAgICAgICAgICAgICAoIGludCAgKCAqICkoIGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF90ZXN0X3RpY2tldF9sb2NrX3dpdGhfY2hlY2tzICk7CisKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyA9CisgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wLCBrbXBfaW50MzIgKSApCisgICAgICAgICAgICAgICggJl9fa21wX3JlbGVhc2VfdGlja2V0X2xvY2tfd2l0aF9jaGVja3MgKTsKKworICAgICAgICAgICAgX19rbXBfaW5pdF91c2VyX2xvY2tfd2l0aF9jaGVja3NfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2luaXRfdGlja2V0X2xvY2tfd2l0aF9jaGVja3MgKTsKKworICAgICAgICAgICAgX19rbXBfZGVzdHJveV91c2VyX2xvY2tfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2Rlc3Ryb3lfdGlja2V0X2xvY2sgKTsKKworICAgICAgICAgICAgX19rbXBfZGVzdHJveV91c2VyX2xvY2tfd2l0aF9jaGVja3NfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2Rlc3Ryb3lfdGlja2V0X2xvY2tfd2l0aF9jaGVja3MgKTsKKworICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyA9CisgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wLCBrbXBfaW50MzIgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2FjcXVpcmVfbmVzdGVkX3RpY2tldF9sb2NrX3dpdGhfY2hlY2tzICk7CisKKyAgICAgICAgICAgIF9fa21wX3Rlc3RfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gPQorICAgICAgICAgICAgICAoIGludCAgKCAqICkoIGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF90ZXN0X25lc3RlZF90aWNrZXRfbG9ja193aXRoX2NoZWNrcyApOworCisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMiApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfcmVsZWFzZV9uZXN0ZWRfdGlja2V0X2xvY2tfd2l0aF9jaGVja3MgKTsKKworICAgICAgICAgICAgX19rbXBfaW5pdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyA9CisgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9pbml0X25lc3RlZF90aWNrZXRfbG9ja193aXRoX2NoZWNrcyApOworCisgICAgICAgICAgICBfX2ttcF9kZXN0cm95X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2Rlc3Ryb3lfbmVzdGVkX3RpY2tldF9sb2NrX3dpdGhfY2hlY2tzICk7CisKKyAgICAgICAgICAgICBfX2ttcF9pc191c2VyX2xvY2tfaW5pdGlhbGl6ZWRfID0KKyAgICAgICAgICAgICAgICggaW50ICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICAoICZfX2ttcF9pc190aWNrZXRfbG9ja19pbml0aWFsaXplZCApOworCisgICAgICAgICAgICAgX19rbXBfZ2V0X3VzZXJfbG9ja19sb2NhdGlvbl8gPQorICAgICAgICAgICAgICAgKCBjb25zdCBpZGVudF90ICogKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgICggJl9fa21wX2dldF90aWNrZXRfbG9ja19sb2NhdGlvbiApOworCisgICAgICAgICAgICAgX19rbXBfc2V0X3VzZXJfbG9ja19sb2NhdGlvbl8gPQorICAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGNvbnN0IGlkZW50X3QgKiApICkKKyAgICAgICAgICAgICAgICggJl9fa21wX3NldF90aWNrZXRfbG9ja19sb2NhdGlvbiApOworCisgICAgICAgICAgICAgX19rbXBfZ2V0X3VzZXJfbG9ja19mbGFnc18gPQorICAgICAgICAgICAgICAgKCBrbXBfbG9ja19mbGFnc190ICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICAoICZfX2ttcF9nZXRfdGlja2V0X2xvY2tfZmxhZ3MgKTsKKworICAgICAgICAgICAgIF9fa21wX3NldF91c2VyX2xvY2tfZmxhZ3NfID0KKyAgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wLCBrbXBfbG9ja19mbGFnc190ICkgKQorICAgICAgICAgICAgICAgKCAmX19rbXBfc2V0X3RpY2tldF9sb2NrX2ZsYWdzICk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBsa19xdWV1aW5nOiB7CisgICAgICAgICAgICBfX2ttcF9iYXNlX3VzZXJfbG9ja19zaXplID0gc2l6ZW9mKCBrbXBfYmFzZV9xdWV1aW5nX2xvY2tfdCApOworICAgICAgICAgICAgX19rbXBfdXNlcl9sb2NrX3NpemUgPSBzaXplb2YoIGttcF9xdWV1aW5nX2xvY2tfdCApOworCisgICAgICAgICAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX293bmVyXyA9CisgICAgICAgICAgICAgICgga21wX2ludDMyICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2dldF9xdWV1aW5nX2xvY2tfb3duZXIgKTsKKworICAgICAgICAgICAgX19rbXBfYWNxdWlyZV91c2VyX2xvY2tfd2l0aF9jaGVja3NfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMiApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2tfd2l0aF9jaGVja3MgKTsKKworICAgICAgICAgICAgX19rbXBfdGVzdF91c2VyX2xvY2tfd2l0aF9jaGVja3NfID0KKyAgICAgICAgICAgICAgKCBpbnQgICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMiApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfdGVzdF9xdWV1aW5nX2xvY2tfd2l0aF9jaGVja3MgKTsKKworICAgICAgICAgICAgX19rbXBfcmVsZWFzZV91c2VyX2xvY2tfd2l0aF9jaGVja3NfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMiApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfcmVsZWFzZV9xdWV1aW5nX2xvY2tfd2l0aF9jaGVja3MgKTsKKworICAgICAgICAgICAgX19rbXBfaW5pdF91c2VyX2xvY2tfd2l0aF9jaGVja3NfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2luaXRfcXVldWluZ19sb2NrX3dpdGhfY2hlY2tzICk7CisKKyAgICAgICAgICAgIF9fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrXyA9CisgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9kZXN0cm95X3F1ZXVpbmdfbG9jayApOworCisgICAgICAgICAgICBfX2ttcF9kZXN0cm95X3VzZXJfbG9ja193aXRoX2NoZWNrc18gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZGVzdHJveV9xdWV1aW5nX2xvY2tfd2l0aF9jaGVja3MgKTsKKworICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyA9CisgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wLCBrbXBfaW50MzIgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2FjcXVpcmVfbmVzdGVkX3F1ZXVpbmdfbG9ja193aXRoX2NoZWNrcyApOworCisgICAgICAgICAgICBfX2ttcF90ZXN0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfID0KKyAgICAgICAgICAgICAgKCBpbnQgICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMiApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfdGVzdF9uZXN0ZWRfcXVldWluZ19sb2NrX3dpdGhfY2hlY2tzICk7CisKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9yZWxlYXNlX25lc3RlZF9xdWV1aW5nX2xvY2tfd2l0aF9jaGVja3MgKTsKKworICAgICAgICAgICAgX19rbXBfaW5pdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyA9CisgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9pbml0X25lc3RlZF9xdWV1aW5nX2xvY2tfd2l0aF9jaGVja3MgKTsKKworICAgICAgICAgICAgX19rbXBfZGVzdHJveV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyA9CisgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9kZXN0cm95X25lc3RlZF9xdWV1aW5nX2xvY2tfd2l0aF9jaGVja3MgKTsKKworICAgICAgICAgICAgIF9fa21wX2lzX3VzZXJfbG9ja19pbml0aWFsaXplZF8gPQorICAgICAgICAgICAgICAgKCBpbnQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgICggJl9fa21wX2lzX3F1ZXVpbmdfbG9ja19pbml0aWFsaXplZCApOworCisgICAgICAgICAgICAgX19rbXBfZ2V0X3VzZXJfbG9ja19sb2NhdGlvbl8gPQorICAgICAgICAgICAgICAgKCBjb25zdCBpZGVudF90ICogKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgICggJl9fa21wX2dldF9xdWV1aW5nX2xvY2tfbG9jYXRpb24gKTsKKworICAgICAgICAgICAgIF9fa21wX3NldF91c2VyX2xvY2tfbG9jYXRpb25fID0KKyAgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wLCBjb25zdCBpZGVudF90ICogKSApCisgICAgICAgICAgICAgICAoICZfX2ttcF9zZXRfcXVldWluZ19sb2NrX2xvY2F0aW9uICk7CisKKyAgICAgICAgICAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX2ZsYWdzXyA9CisgICAgICAgICAgICAgICAoIGttcF9sb2NrX2ZsYWdzX3QgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgICggJl9fa21wX2dldF9xdWV1aW5nX2xvY2tfZmxhZ3MgKTsKKworICAgICAgICAgICAgIF9fa21wX3NldF91c2VyX2xvY2tfZmxhZ3NfID0KKyAgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wLCBrbXBfbG9ja19mbGFnc190ICkgKQorICAgICAgICAgICAgICAgKCAmX19rbXBfc2V0X3F1ZXVpbmdfbG9ja19mbGFncyApOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisjaWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworICAgICAgICBjYXNlIGxrX2FkYXB0aXZlOiB7CisgICAgICAgICAgICBfX2ttcF9iYXNlX3VzZXJfbG9ja19zaXplID0gc2l6ZW9mKCBrbXBfYmFzZV9xdWV1aW5nX2xvY2tfdCApOworICAgICAgICAgICAgX19rbXBfdXNlcl9sb2NrX3NpemUgPSBzaXplb2YoIGttcF9xdWV1aW5nX2xvY2tfdCApOworCisgICAgICAgICAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX293bmVyXyA9CisgICAgICAgICAgICAgICgga21wX2ludDMyICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2dldF9xdWV1aW5nX2xvY2tfb3duZXIgKTsKKworICAgICAgICAgICAgX19rbXBfYWNxdWlyZV91c2VyX2xvY2tfd2l0aF9jaGVja3NfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMiApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfYWNxdWlyZV9hZGFwdGl2ZV9sb2NrX3dpdGhfY2hlY2tzICk7CisKKyAgICAgICAgICAgIF9fa21wX3Rlc3RfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyA9CisgICAgICAgICAgICAgICggaW50ICAoICogKSgga21wX3VzZXJfbG9ja19wLCBrbXBfaW50MzIgKSApCisgICAgICAgICAgICAgICggJl9fa21wX3Rlc3RfYWRhcHRpdmVfbG9ja193aXRoX2NoZWNrcyApOworCisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX3VzZXJfbG9ja193aXRoX2NoZWNrc18gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9yZWxlYXNlX2FkYXB0aXZlX2xvY2tfd2l0aF9jaGVja3MgKTsKKworICAgICAgICAgICAgX19rbXBfaW5pdF91c2VyX2xvY2tfd2l0aF9jaGVja3NfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2luaXRfYWRhcHRpdmVfbG9ja193aXRoX2NoZWNrcyApOworCisgICAgICAgICAgICBfX2ttcF9kZXN0cm95X3VzZXJfbG9ja193aXRoX2NoZWNrc18gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZGVzdHJveV9hZGFwdGl2ZV9sb2NrX3dpdGhfY2hlY2tzICk7CisKKyAgICAgICAgICAgIF9fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrXyA9CisgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9kZXN0cm95X2FkYXB0aXZlX2xvY2sgKTsKKworICAgICAgICAgICAgX19rbXBfaXNfdXNlcl9sb2NrX2luaXRpYWxpemVkXyA9CisgICAgICAgICAgICAgICggaW50ICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2lzX3F1ZXVpbmdfbG9ja19pbml0aWFsaXplZCApOworCisgICAgICAgICAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyA9CisgICAgICAgICAgICAgICggY29uc3QgaWRlbnRfdCAqICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2dldF9xdWV1aW5nX2xvY2tfbG9jYXRpb24gKTsKKworICAgICAgICAgICAgX19rbXBfc2V0X3VzZXJfbG9ja19sb2NhdGlvbl8gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCwgY29uc3QgaWRlbnRfdCAqICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9zZXRfcXVldWluZ19sb2NrX2xvY2F0aW9uICk7CisKKyAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfZmxhZ3NfID0KKyAgICAgICAgICAgICAgKCBrbXBfbG9ja19mbGFnc190ICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2dldF9xdWV1aW5nX2xvY2tfZmxhZ3MgKTsKKworICAgICAgICAgICAgX19rbXBfc2V0X3VzZXJfbG9ja19mbGFnc18gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCwga21wX2xvY2tfZmxhZ3NfdCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfc2V0X3F1ZXVpbmdfbG9ja19mbGFncyApOworCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLy8gS01QX1VTRV9BREFQVElWRV9MT0NLUworCisgICAgICAgIGNhc2UgbGtfZHJkcGE6IHsKKyAgICAgICAgICAgIF9fa21wX2Jhc2VfdXNlcl9sb2NrX3NpemUgPSBzaXplb2YoIGttcF9iYXNlX2RyZHBhX2xvY2tfdCApOworICAgICAgICAgICAgX19rbXBfdXNlcl9sb2NrX3NpemUgPSBzaXplb2YoIGttcF9kcmRwYV9sb2NrX3QgKTsKKworICAgICAgICAgICAgX19rbXBfZ2V0X3VzZXJfbG9ja19vd25lcl8gPQorICAgICAgICAgICAgICAoIGttcF9pbnQzMiAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9nZXRfZHJkcGFfbG9ja19vd25lciApOworCisgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX3VzZXJfbG9ja193aXRoX2NoZWNrc18gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9hY3F1aXJlX2RyZHBhX2xvY2tfd2l0aF9jaGVja3MgKTsKKworICAgICAgICAgICAgX19rbXBfdGVzdF91c2VyX2xvY2tfd2l0aF9jaGVja3NfID0KKyAgICAgICAgICAgICAgKCBpbnQgICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMiApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfdGVzdF9kcmRwYV9sb2NrX3dpdGhfY2hlY2tzICk7CisKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyA9CisgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wLCBrbXBfaW50MzIgKSApCisgICAgICAgICAgICAgICggJl9fa21wX3JlbGVhc2VfZHJkcGFfbG9ja193aXRoX2NoZWNrcyApOworCisgICAgICAgICAgICBfX2ttcF9pbml0X3VzZXJfbG9ja193aXRoX2NoZWNrc18gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfaW5pdF9kcmRwYV9sb2NrX3dpdGhfY2hlY2tzICk7CisKKyAgICAgICAgICAgIF9fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrXyA9CisgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9kZXN0cm95X2RyZHBhX2xvY2sgKTsKKworICAgICAgICAgICAgX19rbXBfZGVzdHJveV91c2VyX2xvY2tfd2l0aF9jaGVja3NfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2Rlc3Ryb3lfZHJkcGFfbG9ja193aXRoX2NoZWNrcyApOworCisgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMiApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfYWNxdWlyZV9uZXN0ZWRfZHJkcGFfbG9ja193aXRoX2NoZWNrcyApOworCisgICAgICAgICAgICBfX2ttcF90ZXN0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfID0KKyAgICAgICAgICAgICAgKCBpbnQgICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMiApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfdGVzdF9uZXN0ZWRfZHJkcGFfbG9ja193aXRoX2NoZWNrcyApOworCisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMiApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfcmVsZWFzZV9uZXN0ZWRfZHJkcGFfbG9ja193aXRoX2NoZWNrcyApOworCisgICAgICAgICAgICBfX2ttcF9pbml0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2luaXRfbmVzdGVkX2RyZHBhX2xvY2tfd2l0aF9jaGVja3MgKTsKKworICAgICAgICAgICAgX19rbXBfZGVzdHJveV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyA9CisgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9kZXN0cm95X25lc3RlZF9kcmRwYV9sb2NrX3dpdGhfY2hlY2tzICk7CisKKyAgICAgICAgICAgICBfX2ttcF9pc191c2VyX2xvY2tfaW5pdGlhbGl6ZWRfID0KKyAgICAgICAgICAgICAgICggaW50ICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICAoICZfX2ttcF9pc19kcmRwYV9sb2NrX2luaXRpYWxpemVkICk7CisKKyAgICAgICAgICAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyA9CisgICAgICAgICAgICAgICAoIGNvbnN0IGlkZW50X3QgKiAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAgKCAmX19rbXBfZ2V0X2RyZHBhX2xvY2tfbG9jYXRpb24gKTsKKworICAgICAgICAgICAgIF9fa21wX3NldF91c2VyX2xvY2tfbG9jYXRpb25fID0KKyAgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wLCBjb25zdCBpZGVudF90ICogKSApCisgICAgICAgICAgICAgICAoICZfX2ttcF9zZXRfZHJkcGFfbG9ja19sb2NhdGlvbiApOworCisgICAgICAgICAgICAgX19rbXBfZ2V0X3VzZXJfbG9ja19mbGFnc18gPQorICAgICAgICAgICAgICAgKCBrbXBfbG9ja19mbGFnc190ICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICAoICZfX2ttcF9nZXRfZHJkcGFfbG9ja19mbGFncyApOworCisgICAgICAgICAgICAgX19rbXBfc2V0X3VzZXJfbG9ja19mbGFnc18gPQorICAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9sb2NrX2ZsYWdzX3QgKSApCisgICAgICAgICAgICAgICAoICZfX2ttcF9zZXRfZHJkcGFfbG9ja19mbGFncyApOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBVc2VyIGxvY2sgdGFibGUgJiBsb2NrIGFsbG9jYXRpb24KKwora21wX2xvY2tfdGFibGVfdCBfX2ttcF91c2VyX2xvY2tfdGFibGUgPSB7IDEsIDAsIE5VTEwgfTsKK2ttcF91c2VyX2xvY2tfcCBfX2ttcF9sb2NrX3Bvb2wgPSBOVUxMOworCisvLyBMb2NrIGJsb2NrLWFsbG9jYXRpb24gc3VwcG9ydC4KK2ttcF9ibG9ja19vZl9sb2NrcyogX19rbXBfbG9ja19ibG9ja3MgPSBOVUxMOworaW50IF9fa21wX251bV9sb2Nrc19pbl9ibG9jayA9IDE7ICAgICAgICAgICAgIC8vIEZJWE1FIC0gdHVuZSB0aGlzIHZhbHVlCisKK3N0YXRpYyBrbXBfbG9ja19pbmRleF90CitfX2ttcF9sb2NrX3RhYmxlX2luc2VydCgga21wX3VzZXJfbG9ja19wIGxjayApCit7CisgICAgLy8gQXNzdW1lIHRoYXQga21wX2dsb2JhbF9sb2NrIGlzIGhlbGQgdXBvbiBlbnRyeS9leGl0LgorICAgIGttcF9sb2NrX2luZGV4X3QgaW5kZXg7CisgICAgaWYgKCBfX2ttcF91c2VyX2xvY2tfdGFibGUudXNlZCA+PSBfX2ttcF91c2VyX2xvY2tfdGFibGUuYWxsb2NhdGVkICkgeworICAgICAgICBrbXBfbG9ja19pbmRleF90IHNpemU7CisgICAgICAgIGttcF91c2VyX2xvY2tfcCAqdGFibGU7CisgICAgICAgIGttcF9sb2NrX2luZGV4X3QgaTsKKyAgICAgICAgLy8gUmVhbGxvY2F0ZSBsb2NrIHRhYmxlLgorICAgICAgICBpZiAoIF9fa21wX3VzZXJfbG9ja190YWJsZS5hbGxvY2F0ZWQgPT0gMCApIHsKKyAgICAgICAgICAgIHNpemUgPSAxMDI0OworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc2l6ZSA9IF9fa21wX3VzZXJfbG9ja190YWJsZS5hbGxvY2F0ZWQgKiAyOworICAgICAgICB9CisgICAgICAgIHRhYmxlID0gKGttcF91c2VyX2xvY2tfcCAqKV9fa21wX2FsbG9jYXRlKCBzaXplb2YoIGttcF91c2VyX2xvY2tfcCApICogc2l6ZSApOworICAgICAgICBtZW1jcHkoIHRhYmxlICsgMSwgX19rbXBfdXNlcl9sb2NrX3RhYmxlLnRhYmxlICsgMSwgc2l6ZW9mKCBrbXBfdXNlcl9sb2NrX3AgKSAqICggX19rbXBfdXNlcl9sb2NrX3RhYmxlLnVzZWQgLSAxICkgKTsKKyAgICAgICAgdGFibGVbIDAgXSA9IChrbXBfdXNlcl9sb2NrX3ApX19rbXBfdXNlcl9sb2NrX3RhYmxlLnRhYmxlOworICAgICAgICAgICAgLy8gV2UgY2Fubm90IGZyZWUgdGhlIHByZXZpb3MgdGFibGUgbm93LCBzaW5zZSBpdCBtYXkgYmUgaW4gdXNlIGJ5IG90aGVyCisgICAgICAgICAgICAvLyB0aHJlYWRzLiBTbyBzYXZlIHRoZSBwb2ludGVyIHRvIHRoZSBwcmV2aW91cyB0YWJsZSBpbiBpbiB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUKKyAgICAgICAgICAgIC8vIG5ldyB0YWJsZS4gQWxsIHRoZSB0YWJsZXMgd2lsbCBiZSBvcmdhbml6ZWQgaW50byBhIGxpc3QsIGFuZCBjb3VsZCBiZSBmcmVlZCB3aGVuCisgICAgICAgICAgICAvLyBsaWJyYXJ5IHNodXR0aW5nIGRvd24uCisgICAgICAgIF9fa21wX3VzZXJfbG9ja190YWJsZS50YWJsZSA9IHRhYmxlOworICAgICAgICBfX2ttcF91c2VyX2xvY2tfdGFibGUuYWxsb2NhdGVkID0gc2l6ZTsKKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdXNlcl9sb2NrX3RhYmxlLnVzZWQgPCBfX2ttcF91c2VyX2xvY2tfdGFibGUuYWxsb2NhdGVkICk7CisgICAgaW5kZXggPSBfX2ttcF91c2VyX2xvY2tfdGFibGUudXNlZDsKKyAgICBfX2ttcF91c2VyX2xvY2tfdGFibGUudGFibGVbIGluZGV4IF0gPSBsY2s7CisgICAgKysgX19rbXBfdXNlcl9sb2NrX3RhYmxlLnVzZWQ7CisgICAgcmV0dXJuIGluZGV4OworfQorCitzdGF0aWMga21wX3VzZXJfbG9ja19wCitfX2ttcF9sb2NrX2Jsb2NrX2FsbG9jYXRlKCkKK3sKKyAgICAvLyBBc3N1bWUgdGhhdCBrbXBfZ2xvYmFsX2xvY2sgaXMgaGVsZCB1cG9uIGVudHJ5L2V4aXQuCisgICAgc3RhdGljIGludCBsYXN0X2luZGV4ID0gMDsKKyAgICBpZiAoICggbGFzdF9pbmRleCA+PSBfX2ttcF9udW1fbG9ja3NfaW5fYmxvY2sgKQorICAgICAgfHwgKCBfX2ttcF9sb2NrX2Jsb2NrcyA9PSBOVUxMICkgKSB7CisgICAgICAgIC8vIFJlc3RhcnQgdGhlIGluZGV4LgorICAgICAgICBsYXN0X2luZGV4ID0gMDsKKyAgICAgICAgLy8gTmVlZCB0byBhbGxvY2F0ZSBhIG5ldyBibG9jay4KKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdXNlcl9sb2NrX3NpemUgPiAwICk7CisgICAgICAgIHNpemVfdCBzcGFjZV9mb3JfbG9ja3MgPSBfX2ttcF91c2VyX2xvY2tfc2l6ZSAqIF9fa21wX251bV9sb2Nrc19pbl9ibG9jazsKKyAgICAgICAgY2hhciogYnVmZmVyID0gKGNoYXIqKV9fa21wX2FsbG9jYXRlKCBzcGFjZV9mb3JfbG9ja3MgKyBzaXplb2YoIGttcF9ibG9ja19vZl9sb2NrcyApICk7CisgICAgICAgIC8vIFNldCB1cCB0aGUgbmV3IGJsb2NrLgorICAgICAgICBrbXBfYmxvY2tfb2ZfbG9ja3MgKm5ld19ibG9jayA9IChrbXBfYmxvY2tfb2ZfbG9ja3MgKikoJiBidWZmZXJbc3BhY2VfZm9yX2xvY2tzXSk7CisgICAgICAgIG5ld19ibG9jay0+bmV4dF9ibG9jayA9IF9fa21wX2xvY2tfYmxvY2tzOworICAgICAgICBuZXdfYmxvY2stPmxvY2tzID0gKHZvaWQgKilidWZmZXI7CisgICAgICAgIC8vIFB1Ymxpc2ggdGhlIG5ldyBibG9jay4KKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIF9fa21wX2xvY2tfYmxvY2tzID0gbmV3X2Jsb2NrOworICAgIH0KKyAgICBrbXBfdXNlcl9sb2NrX3AgcmV0ID0gKGttcF91c2VyX2xvY2tfcCkoJiAoICggKGNoYXIgKikoIF9fa21wX2xvY2tfYmxvY2tzLT5sb2NrcyApICkKKyAgICAgIFsgbGFzdF9pbmRleCAqIF9fa21wX3VzZXJfbG9ja19zaXplIF0gKSApOworICAgIGxhc3RfaW5kZXgrKzsKKyAgICByZXR1cm4gcmV0OworfQorCisvLworLy8gR2V0IG1lbW9yeSBmb3IgYSBsb2NrLiBJdCBtYXkgYmUgZnJlc2hseSBhbGxvY2F0ZWQgbWVtb3J5IG9yIHJldXNlZCBtZW1vcnkKKy8vIGZyb20gbG9jayBwb29sLgorLy8KK2ttcF91c2VyX2xvY2tfcAorX19rbXBfdXNlcl9sb2NrX2FsbG9jYXRlKCB2b2lkICoqdXNlcl9sb2NrLCBrbXBfaW50MzIgZ3RpZCwKKyAga21wX2xvY2tfZmxhZ3NfdCBmbGFncyApCit7CisgICAga21wX3VzZXJfbG9ja19wIGxjazsKKyAgICBrbXBfbG9ja19pbmRleF90IGluZGV4OworICAgIEtNUF9ERUJVR19BU1NFUlQoIHVzZXJfbG9jayApOworCisgICAgX19rbXBfYWNxdWlyZV9sb2NrKCAmX19rbXBfZ2xvYmFsX2xvY2ssIGd0aWQgKTsKKworICAgIGlmICggX19rbXBfbG9ja19wb29sID09IE5VTEwgKSB7CisgICAgICAgIC8vIExvY2sgcG9vbCBpcyBlbXB0eS4gQWxsb2NhdGUgbmV3IG1lbW9yeS4KKyAgICAgICAgaWYgKCBfX2ttcF9udW1fbG9ja3NfaW5fYmxvY2sgPD0gMSApIHsgLy8gVHVuZSB0aGlzIGN1dG9mZiBwb2ludC4KKyAgICAgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApIF9fa21wX2FsbG9jYXRlKCBfX2ttcF91c2VyX2xvY2tfc2l6ZSApOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbGNrID0gX19rbXBfbG9ja19ibG9ja19hbGxvY2F0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSW5zZXJ0IGxvY2sgaW4gdGhlIHRhYmxlIHNvIHRoYXQgaXQgY2FuIGJlIGZyZWVkIGluIF9fa21wX2NsZWFudXAsCisgICAgICAgIC8vIGFuZCBkZWJ1Z2dlciBoYXMgaW5mbyBvbiBhbGwgYWxsb2NhdGVkIGxvY2tzLgorICAgICAgICBpbmRleCA9IF9fa21wX2xvY2tfdGFibGVfaW5zZXJ0KCBsY2sgKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8vIFBpY2sgdXAgbG9jayBmcm9tIHBvb2wuCisgICAgICAgIGxjayA9IF9fa21wX2xvY2tfcG9vbDsKKyAgICAgICAgaW5kZXggPSBfX2ttcF9sb2NrX3Bvb2wtPnBvb2wuaW5kZXg7CisgICAgICAgIF9fa21wX2xvY2tfcG9vbCA9IF9fa21wX2xvY2tfcG9vbC0+cG9vbC5uZXh0OworICAgIH0KKworICAgIC8vCisgICAgLy8gV2UgY291bGQgcG90ZW50aWFsbHkgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIG5lc3RlZCBhbmQgcmVndWxhciBsb2NrcworICAgIC8vIGhlcmUsIGFuZCBkbyB0aGUgbG9jayB0YWJsZSBsb29rdXAgZm9yIHJlZ3VsYXIgbG9ja3Mgb25seS4KKyAgICAvLworICAgIGlmICggT01QX0xPQ0tfVF9TSVpFIDwgc2l6ZW9mKHZvaWQgKikgKSB7CisgICAgICAgICogKCAoa21wX2xvY2tfaW5kZXhfdCAqKSB1c2VyX2xvY2sgKSA9IGluZGV4OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgKiAoIChrbXBfdXNlcl9sb2NrX3AgKikgdXNlcl9sb2NrICkgPSBsY2s7CisgICAgfQorCisgICAgLy8gbWFyayB0aGUgbG9jayBpZiBpdCBpcyBjcml0aWNhbCBzZWN0aW9uIGxvY2suCisgICAgX19rbXBfc2V0X3VzZXJfbG9ja19mbGFncyggbGNrLCBmbGFncyApOworCisgICAgX19rbXBfcmVsZWFzZV9sb2NrKCAmIF9fa21wX2dsb2JhbF9sb2NrLCBndGlkICk7IC8vIEFDOiBUT0RPOiBtb3ZlIHRoaXMgbGluZSB1cHBlcgorCisgICAgcmV0dXJuIGxjazsKK30KKworLy8gUHV0IGxvY2sncyBtZW1vcnkgdG8gcG9vbCBmb3IgcmV1c2luZy4KK3ZvaWQKK19fa21wX3VzZXJfbG9ja19mcmVlKCB2b2lkICoqdXNlcl9sb2NrLCBrbXBfaW50MzIgZ3RpZCwga21wX3VzZXJfbG9ja19wIGxjayApCit7CisgICAga21wX2xvY2tfcG9vbF90ICogbG9ja19wb29sOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggdXNlcl9sb2NrICE9IE5VTEwgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBsY2sgIT0gTlVMTCApOworCisgICAgX19rbXBfYWNxdWlyZV9sb2NrKCAmIF9fa21wX2dsb2JhbF9sb2NrLCBndGlkICk7CisKKyAgICBsY2stPnBvb2wubmV4dCA9IF9fa21wX2xvY2tfcG9vbDsKKyAgICBfX2ttcF9sb2NrX3Bvb2wgPSBsY2s7CisgICAgaWYgKCBPTVBfTE9DS19UX1NJWkUgPCBzaXplb2Yodm9pZCAqKSApIHsKKyAgICAgICAga21wX2xvY2tfaW5kZXhfdCBpbmRleCA9ICogKCAoa21wX2xvY2tfaW5kZXhfdCAqKSB1c2VyX2xvY2sgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggMCA8IGluZGV4ICYmIGluZGV4IDw9IF9fa21wX3VzZXJfbG9ja190YWJsZS51c2VkICk7CisgICAgICAgIGxjay0+cG9vbC5pbmRleCA9IGluZGV4OworICAgIH0KKworICAgIF9fa21wX3JlbGVhc2VfbG9jayggJiBfX2ttcF9nbG9iYWxfbG9jaywgZ3RpZCApOworfQorCitrbXBfdXNlcl9sb2NrX3AKK19fa21wX2xvb2t1cF91c2VyX2xvY2soIHZvaWQgKip1c2VyX2xvY2ssIGNoYXIgY29uc3QgKmZ1bmMgKQoreworICAgIGttcF91c2VyX2xvY2tfcCBsY2sgPSBOVUxMOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGlmICggdXNlcl9sb2NrID09IE5VTEwgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICggT01QX0xPQ0tfVF9TSVpFIDwgc2l6ZW9mKHZvaWQgKikgKSB7CisgICAgICAgIGttcF9sb2NrX2luZGV4X3QgaW5kZXggPSAqKCAoa21wX2xvY2tfaW5kZXhfdCAqKXVzZXJfbG9jayApOworICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgIGlmICggISAoIDAgPCBpbmRleCAmJiBpbmRleCA8IF9fa21wX3VzZXJfbG9ja190YWJsZS51c2VkICkgKSB7CisgICAgICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggMCA8IGluZGV4ICYmIGluZGV4IDwgX19rbXBfdXNlcl9sb2NrX3RhYmxlLnVzZWQgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdXNlcl9sb2NrX3NpemUgPiAwICk7CisgICAgICAgIGxjayA9IF9fa21wX3VzZXJfbG9ja190YWJsZS50YWJsZVtpbmRleF07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBsY2sgPSAqKCAoa21wX3VzZXJfbG9ja19wICopdXNlcl9sb2NrICk7CisgICAgfQorCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGlmICggbGNrID09IE5VTEwgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBsY2s7Cit9CisKK3ZvaWQKK19fa21wX2NsZWFudXBfdXNlcl9sb2Nrcyggdm9pZCApCit7CisgICAgLy8KKyAgICAvLyBSZXNldCBsb2NrIHBvb2wuIERvIG5vdCB3b3JyeSBhYm91dCBsb2NrIGluIHRoZSBwb29sIC0tIHdlIHdpbGwgZnJlZQorICAgIC8vIHRoZW0gd2hlbiBpdGVyYXRpbmcgdGhyb3VnaCBsb2NrIHRhYmxlIChpdCBpbmNsdWRlcyBhbGwgdGhlIGxvY2tzLAorICAgIC8vIGRlYWQgb3IgYWxpdmUpLgorICAgIC8vCisgICAgX19rbXBfbG9ja19wb29sID0gTlVMTDsKKworI2RlZmluZSBJU19DUklUSUNBTChsY2spIFwKKyAgICAgICAgKCAoIF9fa21wX2dldF91c2VyX2xvY2tfZmxhZ3NfICE9IE5VTEwgKSAmJiBcCisgICAgICAgICggKCAqX19rbXBfZ2V0X3VzZXJfbG9ja19mbGFnc18gKSggbGNrICkgJiBrbXBfbGZfY3JpdGljYWxfc2VjdGlvbiApICkKKworICAgIC8vCisgICAgLy8gTG9vcCB0aHJvdWdoIGxvY2sgdGFibGUsIGZyZWUgYWxsIGxvY2tzLgorICAgIC8vCisgICAgLy8gRG8gbm90IGZyZWUgaXRlbSBbMF0sIGl0IGlzIHJlc2VydmVkIGZvciBsb2NrIHRhYmxlcyBsaXN0LgorICAgIC8vCisgICAgLy8gRklYTUUgLSB3ZSBhcmUgaXRlcmF0aW5nIHRocm91Z2ggYSBsaXN0IG9mIChwb2ludGVycyB0bykgb2JqZWN0cyBvZgorICAgIC8vIHR5cGUgdW5pb24ga21wX3VzZXJfbG9jaywgYnV0IHdlIGhhdmUgbm8gd2F5IG9mIGtub3dpbmcgd2hldGhlciB0aGUKKyAgICAvLyBiYXNlIHR5cGUgaXMgY3VycmVudGx5ICJwb29sIiBvciB3aGF0ZXZlciB0aGUgZ2xvYmFsIHVzZXIgbG9jayB0eXBlCisgICAgLy8gaXMuCisgICAgLy8KKyAgICAvLyBXZSBhcmUgcmVseWluZyBvbiB0aGUgZmFjdCB0aGF0IGZvciBhbGwgb2YgdGhlIHVzZXIgbG9jayB0eXBlcworICAgIC8vIChleGNlcHQgInRhcyIpLCB0aGUgZmlyc3QgZmllbGQgaW4gdGhlIGxvY2sgc3RydWN0IGlzIHRoZSAiaW5pdGlhbGl6ZWQiCisgICAgLy8gZmllbGQsIHdoaWNoIGlzIHNldCB0byB0aGUgYWRkcmVzcyBvZiB0aGUgbG9jayBvYmplY3QgaXRzZWxmIHdoZW4KKyAgICAvLyB0aGUgbG9jayBpcyBpbml0aWFsaXplZC4gIFdoZW4gdGhlIHVuaW9uIGlzIG9mIHR5cGUgInBvb2wiLCB0aGUKKyAgICAvLyBmaXJzdCBmaWVsZCBpcyBhIHBvaW50ZXIgdG8gdGhlIG5leHQgb2JqZWN0IGluIHRoZSBmcmVlIGxpc3QsIHdoaWNoCisgICAgLy8gd2lsbCBub3QgYmUgdGhlIHNhbWUgYWRkcmVzcyBhcyB0aGUgb2JqZWN0IGl0c2VsZi4KKyAgICAvLworICAgIC8vIFRoaXMgbWVhbnMgdGhhdCB0aGUgY2hlY2sgKCAqX19rbXBfaXNfdXNlcl9sb2NrX2luaXRpYWxpemVkXyApKCBsY2sgKQorICAgIC8vIHdpbGwgZmFpbCBmb3IgInBvb2wiIG9iamVjdHMgb24gdGhlIGZyZWUgbGlzdC4gIFRoaXMgbXVzdCBoYXBwZW4gYXMKKyAgICAvLyB0aGUgImxvY2F0aW9uIiBmaWVsZCBvZiByZWFsIHVzZXIgbG9ja3Mgb3ZlcmxhcHMgdGhlICJpbmRleCIgZmllbGQKKyAgICAvLyBvZiAicG9vbCIgb2JqZWN0cy4KKyAgICAvLworICAgIC8vIEl0IHdvdWxkIGJlIGJldHRlciB0byBydW4gdGhyb3VnaCB0aGUgZnJlZSBsaXN0LCBhbmQgcmVtb3ZlIGFsbCAicG9vbCIKKyAgICAvLyBvYmplY3RzIGZyb20gdGhlIGxvY2sgdGFibGUgYmVmb3JlIGV4ZWN1dGluZyB0aGlzIGxvb3AuICBIb3dldmVyLAorICAgIC8vICJwb29sIiBvYmplY3RzIGRvIG5vdCBhbHdheXMgaGF2ZSB0aGVpciBpbmRleCBmaWVsZCBzZXQgKG9ubHkgb24KKyAgICAvLyBsaW5fMzJlKSwgYW5kIEkgZG9uJ3Qgd2FudCB0byBzZWFyY2ggdGhlIGxvY2sgdGFibGUgZm9yIHRoZSBhZGRyZXNzCisgICAgLy8gb2YgZXZlcnkgInBvb2wiIG9iamVjdCBvbiB0aGUgZnJlZSBsaXN0LgorICAgIC8vCisgICAgd2hpbGUgKCBfX2ttcF91c2VyX2xvY2tfdGFibGUudXNlZCA+IDEgKSB7CisgICAgICAgIGNvbnN0IGlkZW50ICpsb2M7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gcmVkdWNlIF9fa21wX3VzZXJfbG9ja190YWJsZS51c2VkIGJlZm9yZSBmcmVlaW5nIHRoZSBsb2NrLAorICAgICAgICAvLyBzbyB0aGF0IHN0YXRlIG9mIGxvY2tzIGlzIGNvbnNpc3RlbnQKKyAgICAgICAgLy8KKyAgICAgICAga21wX3VzZXJfbG9ja19wIGxjayA9IF9fa21wX3VzZXJfbG9ja190YWJsZS50YWJsZVsKKyAgICAgICAgICAtLV9fa21wX3VzZXJfbG9ja190YWJsZS51c2VkIF07CisKKyAgICAgICAgaWYgKCAoIF9fa21wX2lzX3VzZXJfbG9ja19pbml0aWFsaXplZF8gIT0gTlVMTCApICYmCisgICAgICAgICAgKCAqX19rbXBfaXNfdXNlcl9sb2NrX2luaXRpYWxpemVkXyApKCBsY2sgKSApIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBJc3N1ZSBhIHdhcm5pbmcgaWY6IEtNUF9DT05TSVNURU5DWV9DSEVDSyBBTkQgbG9jayBpcworICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZWQgQU5EIGl0IGlzIE5PVCBhIGNyaXRpY2FsIHNlY3Rpb24gKHVzZXIgaXMgbm90CisgICAgICAgICAgICAvLyByZXNwb25zaWJsZSBmb3IgZGVzdHJveWluZyBjcml0aWNhbHMpIEFORCB3ZSBrbm93IHNvdXJjZQorICAgICAgICAgICAgLy8gbG9jYXRpb24gdG8gcmVwb3J0LgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICYmICggISBJU19DUklUSUNBTCggbGNrICkgKSAmJgorICAgICAgICAgICAgICAoICggbG9jID0gX19rbXBfZ2V0X3VzZXJfbG9ja19sb2NhdGlvbiggbGNrICkgKSAhPSBOVUxMICkgJiYKKyAgICAgICAgICAgICAgKCBsb2MtPnBzb3VyY2UgIT0gTlVMTCApICkgeworICAgICAgICAgICAgICAgIGttcF9zdHJfbG9jX3Qgc3RyX2xvYyA9IF9fa21wX3N0cl9sb2NfaW5pdCggbG9jLT5wc291cmNlLCAwICk7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIENuc0xvY2tOb3REZXN0cm95ZWQsIHN0cl9sb2MuZmlsZSwgc3RyX2xvYy5mdW5jLAorICAgICAgICAgICAgICAgICAgc3RyX2xvYy5saW5lLCBzdHJfbG9jLmNvbCApOworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9sb2NfZnJlZSggJnN0cl9sb2MpOworICAgICAgICAgICAgfQorCisjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICBpZiAoIElTX0NSSVRJQ0FMKCBsY2sgKSApIHsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfY2xlYW51cF91c2VyX2xvY2tzOiBmcmVlIGNyaXRpY2FsIHNlY3Rpb24gbG9jayAlcCAoJXApXG4iLCBsY2ssICoodm9pZCoqKWxjayApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfY2xlYW51cF91c2VyX2xvY2tzOiBmcmVlIGxvY2sgJXAgKCVwKVxuIiwgbGNrLCAqKHZvaWQqKilsY2sgKSApOworICAgICAgICAgICAgfQorI2VuZGlmIC8vIEtNUF9ERUJVRworCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gQ2xlYW51cCBpbnRlcm5hbCBsb2NrIGR5bmFtaWMgcmVzb3VyY2VzCisgICAgICAgICAgICAvLyAoZm9yIGRyZHBhIGxvY2tzIHBhcnRpY3VsYXJseSkuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgX19rbXBfZGVzdHJveV91c2VyX2xvY2soIGxjayApOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRnJlZSB0aGUgbG9jayBpZiBibG9jayBhbGxvY2F0aW9uIG9mIGxvY2tzIGlzIG5vdCB1c2VkLgorICAgICAgICAvLworICAgICAgICBpZiAoIF9fa21wX2xvY2tfYmxvY2tzID09IE5VTEwgKSB7CisgICAgICAgICAgICBfX2ttcF9mcmVlKCBsY2sgKTsKKyAgICAgICAgfQorICAgIH0KKworI3VuZGVmIElTX0NSSVRJQ0FMCisKKyAgICAvLworICAgIC8vIGRlbGV0ZSBsb2NrIHRhYmxlKHMpLgorICAgIC8vCisgICAga21wX3VzZXJfbG9ja19wICp0YWJsZV9wdHIgPSBfX2ttcF91c2VyX2xvY2tfdGFibGUudGFibGU7CisgICAgX19rbXBfdXNlcl9sb2NrX3RhYmxlLnRhYmxlID0gTlVMTDsKKyAgICBfX2ttcF91c2VyX2xvY2tfdGFibGUuYWxsb2NhdGVkID0gMDsKKworICAgIHdoaWxlICggdGFibGVfcHRyICE9IE5VTEwgKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIEluIHRoZSBmaXJzdCBlbGVtZW50IHdlIHNhdmVkIHRoZSBwb2ludGVyIHRvIHRoZSBwcmV2aW91cworICAgICAgICAvLyAoc21hbGxlcikgbG9jayB0YWJsZS4KKyAgICAgICAgLy8KKyAgICAgICAga21wX3VzZXJfbG9ja19wICpuZXh0ID0gKGttcF91c2VyX2xvY2tfcCAqKSggdGFibGVfcHRyWyAwIF0gKTsKKyAgICAgICAgX19rbXBfZnJlZSggdGFibGVfcHRyICk7CisgICAgICAgIHRhYmxlX3B0ciA9IG5leHQ7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBGcmVlIGJ1ZmZlcnMgYWxsb2NhdGVkIGZvciBibG9ja3Mgb2YgbG9ja3MuCisgICAgLy8KKyAgICBrbXBfYmxvY2tfb2ZfbG9ja3NfdCAqYmxvY2tfcHRyID0gX19rbXBfbG9ja19ibG9ja3M7CisgICAgX19rbXBfbG9ja19ibG9ja3MgPSBOVUxMOworCisgICAgd2hpbGUgKCBibG9ja19wdHIgIT0gTlVMTCApIHsKKyAgICAgICAga21wX2Jsb2NrX29mX2xvY2tzX3QgKm5leHQgPSBibG9ja19wdHItPm5leHRfYmxvY2s7CisgICAgICAgIF9fa21wX2ZyZWUoIGJsb2NrX3B0ci0+bG9ja3MgKTsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gKmJsb2NrX3B0ciBpdHNlbGYgd2FzIGFsbG9jYXRlZCBhdCB0aGUgZW5kIG9mIHRoZSBsb2NrcyB2ZWN0b3IuCisgICAgICAgIC8vCisJYmxvY2tfcHRyID0gbmV4dDsKKyAgICB9CisKKyAgICBUQ1dfNChfX2ttcF9pbml0X3VzZXJfbG9ja3MsIEZBTFNFKTsKK30KKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2xvY2suaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9sb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVjZTgzOAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9sb2NrLmgKQEAgLTAsMCArMSw5ODkgQEAKKy8qCisgKiBrbXBfbG9jay5oIC0tIGxvY2sgaGVhZGVyIGZpbGUKKyAqICRSZXZpc2lvbjogNDI4MTAgJAorICogJERhdGU6IDIwMTMtMTEtMDcgMTI6MDY6MzMgLTA2MDAgKFRodSwgMDcgTm92IDIwMTMpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBLTVBfTE9DS19ICisjZGVmaW5lIEtNUF9MT0NLX0gKKworI2luY2x1ZGUgPGxpbWl0cy5oPiAgICAvLyBDSEFSX0JJVAorI2luY2x1ZGUgPHN0ZGRlZi5oPiAgICAvLyBvZmZzZXRvZgorCisjaW5jbHVkZSAia21wX29zLmgiCisjaW5jbHVkZSAia21wX2RlYnVnLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGF2ZSB0byBjb3B5IHRoZXNlIGRlZmluaXRpb25zIGZyb20ga21wLmggYmVjYXVzZSBrbXAuaCBjYW5ub3QgYmUgaW5jbHVkZWQKKy8vIGR1ZSB0byBjaXJjdWxhciBkZXBlbmRlbmNpZXMuICBXaWxsIHVuZGVmIHRoZXNlIGF0IGVuZCBvZiBmaWxlLgorCisjZGVmaW5lIEtNUF9QQUQodHlwZSwgc3opICAgICAoc2l6ZW9mKHR5cGUpICsgKHN6IC0gKChzaXplb2YodHlwZSkgLSAxKSAlIChzeikpIC0gMSkpCisjZGVmaW5lIEtNUF9HVElEX0RORSAoLTIpCisKKy8vIEZvcndhcmQgZGVjbGFyYXRpb24gb2YgaWRlbnQgYW5kIGlkZW50X3QKKworc3RydWN0IGlkZW50OwordHlwZWRlZiBzdHJ1Y3QgaWRlbnQgaWRlbnRfdDsKKworLy8gRW5kIG9mIGNvcGllZCBjb2RlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLworLy8gV2UgbmVlZCB0byBrbm93IHRoZSBzaXplIG9mIHRoZSBhcmVhIHdlIGNhbiBhc3N1bWUgdGhhdCB0aGUgY29tcGlsZXIocykKKy8vIGFsbG9jYXRlZCBmb3Igb2JlY3RzIG9mIHR5cGUgb21wX2xvY2tfdCBhbmQgb21wX25lc3RfbG9ja190LiAgVGhlIEludGVsCisvLyBjb21waWxlciBhbHdheXMgYWxsb2NhdGVzIGEgcG9pbnRlci1zaXplZCBhcmVhLCBhcyBkb2VzIHZpc3VhbCBzdHVkaW8uCisvLworLy8gZ2NjIGhvd2V2ZXIsIG9ubHkgYWxsb2NhdGVzIDQgYnl0ZXMgZm9yIHJlZ3VsYXIgbG9ja3MsIGV2ZW4gb24gNjQtYml0CisvLyBpbnRlbCBhcmNocy4gIEl0IGFsbG9jYXRlcyBhdCBsZWFzdCA4IGJ5dGVzIGZvciBuZXN0ZWQgbG9jayAobW9yZSBvbgorLy8gcmVjZW50IHZlcnNpb25zKSwgYnV0IHdlIGFyZSBib3VuZGVkIGJ5IHRoZSBwb2ludGVyLXNpemVkIGNodW5rcyB0aGF0CisvLyB0aGUgSW50ZWwgY29tcGlsZXIgYWxsb2NhdGVzLgorLy8KKworI2lmIEtNUF9PU19MSU5VWCAmJiBkZWZpbmVkKEtNUF9HT01QX0NPTVBBVCkKKyMgZGVmaW5lIE9NUF9MT0NLX1RfU0laRSAgICAgICAgc2l6ZW9mKGludCkKKyMgZGVmaW5lIE9NUF9ORVNUX0xPQ0tfVF9TSVpFICAgc2l6ZW9mKHZvaWQgKikKKyNlbHNlCisjIGRlZmluZSBPTVBfTE9DS19UX1NJWkUgICAgICAgIHNpemVvZih2b2lkICopCisjIGRlZmluZSBPTVBfTkVTVF9MT0NLX1RfU0laRSAgIHNpemVvZih2b2lkICopCisjZW5kaWYKKworLy8KKy8vIFRoZSBJbnRlbCBjb21waWxlciBhbGxvY2F0ZXMgYSAzMi1ieXRlIGNodW5rIGZvciBhIGNyaXRpY2FsIHNlY3Rpb24uCisvLyBCb3RoIGdjYyBhbmQgdmlzdWFsIHN0dWRpbyBvbmx5IGFsbG9jYXRlIGVub3VnaCBzcGFjZSBmb3IgYSBwb2ludGVyLgorLy8gU29tZXRpbWVzIHdlIGtub3cgdGhhdCB0aGUgc3BhY2Ugd2FzIGFsbG9jYXRlZCBieSB0aGUgSW50ZWwgY29tcGlsZXIuCisvLworI2RlZmluZSBPTVBfQ1JJVElDQUxfU0laRSAgICAgICBzaXplb2Yodm9pZCAqKQorI2RlZmluZSBJTlRFTF9DUklUSUNBTF9TSVpFICAgICAzMgorCisvLworLy8gbG9jayBmbGFncworLy8KK3R5cGVkZWYga21wX3VpbnQzMiBrbXBfbG9ja19mbGFnc190OworCisjZGVmaW5lIGttcF9sZl9jcml0aWNhbF9zZWN0aW9uIDEKKworLy8KKy8vIFdoZW4gYSBsb2NrIHRhYmxlIGlzIHVzZWQsIHRoZSBpbmRpY2VzIGFyZSBvZiBrbXBfbG9ja19pbmRleF90CisvLwordHlwZWRlZiBrbXBfdWludDMyIGttcF9sb2NrX2luZGV4X3Q7CisKKy8vCisvLyBXaGVuIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIGxvY2tzIGFyZSBvbiB0aGUgbG9jayBwb29sIChmcmVlIGxpc3QpLAorLy8gaXQgaXMgdHJlYXRlZCBhcyBzdHJ1Y3RzIG9mIHRoaXMgdHlwZS4KKy8vCitzdHJ1Y3Qga21wX2xvY2tfcG9vbCB7CisgICAgdW5pb24ga21wX3VzZXJfbG9jayAqbmV4dDsKKyAgICBrbXBfbG9ja19pbmRleF90IGluZGV4OworfTsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2xvY2tfcG9vbCBrbXBfbG9ja19wb29sX3Q7CisKKworZXh0ZXJuIHZvaWQgX19rbXBfdmFsaWRhdGVfbG9ja3MoIHZvaWQgKTsKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gIFRoZXJlIGFyZSA1IGxvY2sgaW1wbGVtZW50YXRpb25zOgorLy8KKy8vICAgICAgIDEuIFRlc3QgYW5kIHNldCBsb2Nrcy4KKy8vICAgICAgIDIuIGZ1dGV4IGxvY2tzIChMaW51eCogT1Mgb24geDg2IGFuZCBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBhcmNoaXRlY3R1cmUpCisvLyAgICAgICAzLiBUaWNrZXQgKExhbXBvcnQgYmFrZXJ5KSBsb2Nrcy4KKy8vICAgICAgIDQuIFF1ZXVpbmcgbG9ja3MgKHdpdGggc2VwYXJhdGUgc3BpbiBmaWVsZHMpLgorLy8gICAgICAgNS4gRFJQQSAoRHluYW1pY2FsbHkgUmVjb25maWd1cmFibGUgRGlzdHJpYnV0ZWQgUG9sbGluZyBBcmVhKSBsb2NrcworLy8KKy8vICAgYW5kIDMgbG9jayBwdXJwb3NlczoKKy8vCisvLyAgICAgICAxLiBCb290c3RyYXAgbG9ja3MgLS0gVXNlZCBmb3IgYSBmZXcgbG9ja3MgYXZhaWxhYmxlIGF0IGxpYnJhcnkgc3RhcnR1cC1zaHV0ZG93biB0aW1lLgorLy8gICAgICAgICAgVGhlc2UgZG8gbm90IHJlcXVpcmUgbm9uLW5lZ2F0aXZlIGdsb2JhbCB0aHJlYWQgSUQncy4KKy8vICAgICAgIDIuIEludGVybmFsIFJUTCBsb2NrcyAtLSBVc2VkIGV2ZXJ5d2hlcmUgZWxzZSBpbiB0aGUgUlRMCisvLyAgICAgICAzLiBVc2VyIGxvY2tzIChpbmNsdWRlcyBjcml0aWNhbCBzZWN0aW9ucykKKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gTG9jayBpbXBsZW1lbnRhdGlvbnMuCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVGVzdCBhbmQgc2V0IGxvY2tzLgorLy8KKy8vIE5vbi1uZXN0ZWQgdGVzdCBhbmQgc2V0IGxvY2tzIGRpZmZlciBmcm9tIHRoZSBvdGhlciBsb2NrIGtpbmRzIChleGNlcHQKKy8vIGZ1dGV4KSBpbiB0aGF0IHdlIHVzZSB0aGUgbWVtb3J5IGFsbG9jYXRlZCBieSB0aGUgY29tcGlsZXIgZm9yIHRoZSBsb2NrLAorLy8gcmF0aGVyIHRoYW4gYSBwb2ludGVyIHRvIGl0LgorLy8KKy8vIE9uIGxpbjMyLCBsaW5fMzJlLCBhbmQgd2luXzMyLCB0aGUgc3BhY2UgYWxsb2NhdGVkIG1heSBiZSBhcyBzbWFsbCBhcyA0CisvLyBieXRlcywgc28gd2UgaGF2ZSB0byB1c2UgYSBsb2NrIHRhYmxlIGZvciBuZXN0ZWQgbG9ja3MsIGFuZCBhdm9pZCBhY2Nlc3NpbmcKKy8vIHRoZSBkZXB0aF9sb2NrZWQgZmllbGQgZm9yIG5vbi1uZXN0ZWQgbG9ja3MuCisvLworLy8gSW5mb3JtYXRpb24gbm9ybWFsbHkgYXZhaWxhYmxlIHRvIHRoZSB0b29scywgc3VjaCBhcyBsb2NrIGxvY2F0aW9uLAorLy8gbG9jayB1c2FnZSAobm9ybWFsIGxvY2sgdnMuIGNyaXRpY2FsIHNlY3Rpb24pLCBldGMuIGlzIG5vdCBhdmFpbGFibGUgd2l0aAorLy8gdGVzdCBhbmQgc2V0IGxvY2tzLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdHJ1Y3Qga21wX2Jhc2VfdGFzX2xvY2sgeworICAgIHZvbGF0aWxlIGttcF9pbnQzMiBwb2xsOyAgICAgICAgIC8vIDAgPT4gdW5sb2NrZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2NrZWQ6IChndGlkKzEpIG9mIG93bmluZyB0aHJlYWQKKyAgICBrbXBfaW50MzIgICAgICAgICAgZGVwdGhfbG9ja2VkOyAvLyBkZXB0aCBsb2NrZWQsIGZvciBuZXN0ZWQgbG9ja3Mgb25seQorfTsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2Jhc2VfdGFzX2xvY2sga21wX2Jhc2VfdGFzX2xvY2tfdDsKKwordW5pb24ga21wX3Rhc19sb2NrIHsKKyAgICBrbXBfYmFzZV90YXNfbG9ja190IGxrOworICAgIGttcF9sb2NrX3Bvb2xfdCBwb29sOyAgIC8vIG1ha2UgY2VydGFpbiBzdHJ1Y3QgaXMgbGFyZ2UgZW5vdWdoCisgICAgZG91YmxlIGxrX2FsaWduOyAgICAgICAgLy8gdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gY2FjaGUgbGluZSBwYWRkaW5nCit9OworCit0eXBlZGVmIHVuaW9uIGttcF90YXNfbG9jayBrbXBfdGFzX2xvY2tfdDsKKworLy8KKy8vIFN0YXRpYyBpbml0aWFsaXplciBmb3IgdGVzdCBhbmQgc2V0IGxvY2sgdmFyaWFibGVzLiBVc2FnZToKKy8vICAgIGttcF90YXNfbG9ja190IHhsb2NrID0gS01QX1RBU19MT0NLX0lOSVRJQUxJWkVSKCB4bG9jayApOworLy8KKyNkZWZpbmUgS01QX1RBU19MT0NLX0lOSVRJQUxJWkVSKCBsb2NrICkgeyB7IDAsIDAgfSB9CisKK2V4dGVybiB2b2lkIF9fa21wX2FjcXVpcmVfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gaW50IF9fa21wX3Rlc3RfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9yZWxlYXNlX3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBfaW5pdF90YXNfbG9jaygga21wX3Rhc19sb2NrX3QgKmxjayApOworZXh0ZXJuIHZvaWQgX19rbXBfZGVzdHJveV90YXNfbG9jaygga21wX3Rhc19sb2NrX3QgKmxjayApOworCitleHRlcm4gdm9pZCBfX2ttcF9hY3F1aXJlX25lc3RlZF90YXNfbG9jaygga21wX3Rhc19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiBpbnQgX19rbXBfdGVzdF9uZXN0ZWRfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9yZWxlYXNlX25lc3RlZF90YXNfbG9jaygga21wX3Rhc19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2luaXRfbmVzdGVkX3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqbGNrICk7CitleHRlcm4gdm9pZCBfX2ttcF9kZXN0cm95X25lc3RlZF90YXNfbG9jaygga21wX3Rhc19sb2NrX3QgKmxjayApOworCisKKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNKQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdXRleCBsb2Nrcy4gIGZ1dGV4IGxvY2tzIGFyZSBvbmx5IGF2YWlsYWJsZSBvbiBMaW51eCogT1MuCisvLworLy8gTGlrZSBub24tbmVzdGVkIHRlc3QgYW5kIHNldCBsb2NrLCBub24tbmVzdGVkIGZ1dGV4IGxvY2tzIHVzZSB0aGUgbWVtb3J5CisvLyBhbGxvY2F0ZWQgYnkgdGhlIGNvbXBpbGVyIGZvciB0aGUgbG9jaywgcmF0aGVyIHRoYW4gYSBwb2ludGVyIHRvIGl0LgorLy8KKy8vIEluZm9ybWF0aW9uIG5vcm1hbGx5IGF2YWlsYWJsZSB0byB0aGUgdG9vbHMsIHN1Y2ggYXMgbG9jayBsb2NhdGlvbiwKKy8vIGxvY2sgdXNhZ2UgKG5vcm1hbCBsb2NrIHZzLiBjcml0aWNhbCBzZWN0aW9uKSwgZXRjLiBpcyBub3QgYXZhaWxhYmxlIHdpdGgKKy8vIHRlc3QgYW5kIHNldCBsb2Nrcy4gIFdpdGggbm9uLW5lc3RlZCBmdXRleCBsb2NrcywgdGhlIGxvY2sgb3duZXIgaXMgbm90CisvLyBldmVuIGF2YWlsYWJsZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RydWN0IGttcF9iYXNlX2Z1dGV4X2xvY2sgeworICAgIHZvbGF0aWxlIGttcF9pbnQzMiBwb2xsOyAgICAgICAgIC8vIDAgPT4gdW5sb2NrZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyKihndGlkKzEpIG9mIG93bmluZyB0aHJlYWQsIDAgaWYgdW5sb2NrZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2NrZWQ6IChndGlkKzEpIG9mIG93bmluZyB0aHJlYWQKKyAgICBrbXBfaW50MzIgICAgICAgICAgZGVwdGhfbG9ja2VkOyAvLyBkZXB0aCBsb2NrZWQsIGZvciBuZXN0ZWQgbG9ja3Mgb25seQorfTsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2Jhc2VfZnV0ZXhfbG9jayBrbXBfYmFzZV9mdXRleF9sb2NrX3Q7CisKK3VuaW9uIGttcF9mdXRleF9sb2NrIHsKKyAgICBrbXBfYmFzZV9mdXRleF9sb2NrX3QgbGs7CisgICAga21wX2xvY2tfcG9vbF90IHBvb2w7ICAgLy8gbWFrZSBjZXJ0YWluIHN0cnVjdCBpcyBsYXJnZSBlbm91Z2gKKyAgICBkb3VibGUgbGtfYWxpZ247ICAgICAgICAvLyB1c2Ugd29yc3QgY2FzZSBhbGlnbm1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBjYWNoZSBsaW5lIHBhZGRpbmcKK307CisKK3R5cGVkZWYgdW5pb24ga21wX2Z1dGV4X2xvY2sga21wX2Z1dGV4X2xvY2tfdDsKKworLy8KKy8vIFN0YXRpYyBpbml0aWFsaXplciBmb3IgZnV0ZXggbG9jayB2YXJpYWJsZXMuIFVzYWdlOgorLy8gICAga21wX2Z1dGV4X2xvY2tfdCB4bG9jayA9IEtNUF9GVVRFWF9MT0NLX0lOSVRJQUxJWkVSKCB4bG9jayApOworLy8KKyNkZWZpbmUgS01QX0ZVVEVYX0xPQ0tfSU5JVElBTElaRVIoIGxvY2sgKSB7IHsgMCwgMCB9IH0KKworZXh0ZXJuIHZvaWQgX19rbXBfYWNxdWlyZV9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gaW50IF9fa21wX3Rlc3RfZnV0ZXhfbG9jaygga21wX2Z1dGV4X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBfcmVsZWFzZV9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbml0X2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKmxjayApOworZXh0ZXJuIHZvaWQgX19rbXBfZGVzdHJveV9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2sgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfYWNxdWlyZV9uZXN0ZWRfZnV0ZXhfbG9jaygga21wX2Z1dGV4X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIGludCBfX2ttcF90ZXN0X25lc3RlZF9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9yZWxlYXNlX25lc3RlZF9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbml0X25lc3RlZF9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2sgKTsKK2V4dGVybiB2b2lkIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKmxjayApOworCisjZW5kaWYgLy8gS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSkKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaWNrZXQgbG9ja3MuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0cnVjdCBrbXBfYmFzZV90aWNrZXRfbG9jayB7CisgICAgLy8gYGluaXRpYWxpemVkJyBtdXN0IGJlIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgbG9jayBkYXRhIHN0cnVjdHVyZSEKKyAgICB2b2xhdGlsZSB1bmlvbiBrbXBfdGlja2V0X2xvY2sgKiBpbml0aWFsaXplZDsgIC8vIHBvaW50cyB0byB0aGUgbG9jayB1bmlvbiBpZiBpbiBpbml0aWFsaXplZCBzdGF0ZQorICAgIGlkZW50X3QgY29uc3QgKiAgICAgbG9jYXRpb247ICAgICAvLyBTb3VyY2UgY29kZSBsb2NhdGlvbiBvZiBvbXBfaW5pdF9sb2NrKCkuCisgICAgdm9sYXRpbGUga21wX3VpbnQzMiBuZXh0X3RpY2tldDsgIC8vIHRpY2tldCBudW1iZXIgdG8gZ2l2ZSB0byBuZXh0IHRocmVhZCB3aGljaCBhY3F1aXJlcworICAgIHZvbGF0aWxlIGttcF91aW50MzIgbm93X3NlcnZpbmc7ICAvLyB0aWNrZXQgbnVtYmVyIGZvciB0aHJlYWQgd2hpY2ggaG9sZHMgdGhlIGxvY2sKKyAgICB2b2xhdGlsZSBrbXBfaW50MzIgIG93bmVyX2lkOyAgICAgLy8gKGd0aWQrMSkgb2Ygb3duaW5nIHRocmVhZCwgMCBpZiB1bmxvY2tlZAorICAgIGttcF9pbnQzMiAgICAgICAgICAgZGVwdGhfbG9ja2VkOyAvLyBkZXB0aCBsb2NrZWQsIGZvciBuZXN0ZWQgbG9ja3Mgb25seQorICAgIGttcF9sb2NrX2ZsYWdzX3QgICAgZmxhZ3M7ICAgICAgICAvLyBsb2NrIHNwZWNpZmljcywgZS5nLiBjcml0aWNhbCBzZWN0aW9uIGxvY2sKK307CisKK3R5cGVkZWYgc3RydWN0IGttcF9iYXNlX3RpY2tldF9sb2NrIGttcF9iYXNlX3RpY2tldF9sb2NrX3Q7CisKK3VuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfdGlja2V0X2xvY2sgeworICAgIGttcF9iYXNlX3RpY2tldF9sb2NrX3QgbGs7ICAgICAgIC8vIFRoaXMgZmllbGQgbXVzdCBiZSBmaXJzdCB0byBhbGxvdyBzdGF0aWMgaW5pdGlhbGl6aW5nLgorICAgIGttcF9sb2NrX3Bvb2xfdCBwb29sOworICAgIGRvdWJsZSAgICAgICAgICAgICAgICAgbGtfYWxpZ247IC8vIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudAorICAgIGNoYXIgICAgICAgICAgICAgICAgICAgbGtfcGFkWyBLTVBfUEFEKCBrbXBfYmFzZV90aWNrZXRfbG9ja190LCBDQUNIRV9MSU5FICkgXTsKK307CisKK3R5cGVkZWYgdW5pb24ga21wX3RpY2tldF9sb2NrIGttcF90aWNrZXRfbG9ja190OworCisvLworLy8gU3RhdGljIGluaXRpYWxpemVyIGZvciBzaW1wbGUgdGlja2V0IGxvY2sgdmFyaWFibGVzLiBVc2FnZToKKy8vICAgIGttcF90aWNrZXRfbG9ja190IHhsb2NrID0gS01QX1RJQ0tFVF9MT0NLX0lOSVRJQUxJWkVSKCB4bG9jayApOworLy8gTm90ZSB0aGUgbWFjcm8gYXJndW1lbnQuIEl0IGlzIGltcG9ydGFudCB0byBtYWtlIHZhciBwcm9wZXJseSBpbml0aWFsaXplZC4KKy8vCisjZGVmaW5lIEtNUF9USUNLRVRfTE9DS19JTklUSUFMSVpFUiggbG9jayApIHsgeyAoa21wX3RpY2tldF9sb2NrX3QgKikgJiAobG9jayksIE5VTEwsIDAsIDAsIDAsIC0xIH0gfQorCitleHRlcm4gdm9pZCBfX2ttcF9hY3F1aXJlX3RpY2tldF9sb2NrKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIGludCBfX2ttcF90ZXN0X3RpY2tldF9sb2NrKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIGludCBfX2ttcF90ZXN0X3RpY2tldF9sb2NrX3dpdGhfY2hla3MoIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9yZWxlYXNlX3RpY2tldF9sb2NrKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBfaW5pdF90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjayApOworZXh0ZXJuIHZvaWQgX19rbXBfZGVzdHJveV90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjayApOworCitleHRlcm4gdm9pZCBfX2ttcF9hY3F1aXJlX25lc3RlZF90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiBpbnQgX19rbXBfdGVzdF9uZXN0ZWRfdGlja2V0X2xvY2soIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9yZWxlYXNlX25lc3RlZF90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2luaXRfbmVzdGVkX3RpY2tldF9sb2NrKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrICk7CitleHRlcm4gdm9pZCBfX2ttcF9kZXN0cm95X25lc3RlZF90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjayApOworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFF1ZXVpbmcgbG9ja3MuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisKK3N0cnVjdCBrbXBfYWRhcHRpdmVfbG9jazsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2FkYXB0aXZlX2xvY2sga21wX2FkYXB0aXZlX2xvY2tfdDsKKworI2lmIEtNUF9ERUJVR19BREFQVElWRV9MT0NLUworCitzdHJ1Y3Qga21wX2FkYXB0aXZlX2xvY2tfc3RhdGlzdGljcyB7CisgICAgLyogU28gd2UgY2FuIGdldCBzdGF0cyBmcm9tIGxvY2tzIHRoYXQgaGF2ZW4ndCBiZWVuIGRlc3Ryb3llZC4gKi8KKyAgICBrbXBfYWRhcHRpdmVfbG9ja190ICogbmV4dDsKKyAgICBrbXBfYWRhcHRpdmVfbG9ja190ICogcHJldjsKKworICAgIC8qIE90aGVyIHN0YXRpc3RpY3MgKi8KKyAgICBrbXBfdWludDMyIHN1Y2Nlc3NmdWxTcGVjdWxhdGlvbnM7CisgICAga21wX3VpbnQzMiBoYXJkRmFpbGVkU3BlY3VsYXRpb25zOworICAgIGttcF91aW50MzIgc29mdEZhaWxlZFNwZWN1bGF0aW9uczsKKyAgICBrbXBfdWludDMyIG5vblNwZWN1bGF0aXZlQWNxdWlyZXM7CisgICAga21wX3VpbnQzMiBub25TcGVjdWxhdGl2ZUFjcXVpcmVBdHRlbXB0czsKKyAgICBrbXBfdWludDMyIGxlbW1pbmdZaWVsZHM7Cit9OworCit0eXBlZGVmIHN0cnVjdCBrbXBfYWRhcHRpdmVfbG9ja19zdGF0aXN0aWNzIGttcF9hZGFwdGl2ZV9sb2NrX3N0YXRpc3RpY3NfdDsKKworZXh0ZXJuIHZvaWQgX19rbXBfcHJpbnRfc3BlY3VsYXRpdmVfc3RhdHMoKTsKK2V4dGVybiB2b2lkIF9fa21wX2luaXRfc3BlY3VsYXRpdmVfc3RhdHMoKTsKKworI2VuZGlmIC8vIEtNUF9ERUJVR19BREFQVElWRV9MT0NLUworCitzdHJ1Y3Qga21wX2FkYXB0aXZlX2xvY2sKK3sKKyAgICAvKiBWYWx1ZXMgdXNlZCBmb3IgYWRhcHRpdml0eS4KKyAgICAgKiBBbHRob3VnaCB0aGVzZSBhcmUgYWNjZXNzZWQgZnJvbSBtdWx0aXBsZSB0aHJlYWRzIHdlIGRvbid0IGFjY2VzcyB0aGVtIGF0b21pY2FsbHksCisgICAgICogYmVjYXVzZSBpZiB3ZSBtaXNzIHVwZGF0ZXMgaXQgcHJvYmFibHkgZG9lc24ndCBtYXR0ZXIgbXVjaC4gKEl0IGp1c3QgYWZmZWN0cyBvdXIKKyAgICAgKiBkZWNpc2lvbiBhYm91dCB3aGV0aGVyIHRvIHRyeSBzcGVjdWxhdGlvbiBvbiB0aGUgbG9jaykuCisgICAgICovCisgICAga21wX3VpbnQzMiB2b2xhdGlsZSBiYWRuZXNzOworICAgIGttcF91aW50MzIgdm9sYXRpbGUgYWNxdWlyZV9hdHRlbXB0czsKKyAgICAvKiBQYXJhbWV0ZXJzIG9mIHRoZSBsb2NrLiAqLworICAgIGttcF91aW50MzIgbWF4X2JhZG5lc3M7CisgICAga21wX3VpbnQzMiBtYXhfc29mdF9yZXRyaWVzOworCisjaWYgS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTCisgICAga21wX2FkYXB0aXZlX2xvY2tfc3RhdGlzdGljc190IHZvbGF0aWxlIHN0YXRzOworI2VuZGlmCit9OworCisjZW5kaWYgLy8gS01QX1VTRV9BREFQVElWRV9MT0NLUworCisKK3N0cnVjdCBrbXBfYmFzZV9xdWV1aW5nX2xvY2sgeworCisgICAgLy8gIGBpbml0aWFsaXplZCcgbXVzdCBiZSB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIGxvY2sgZGF0YSBzdHJ1Y3R1cmUhCisgICAgdm9sYXRpbGUgdW5pb24ga21wX3F1ZXVpbmdfbG9jayAqaW5pdGlhbGl6ZWQ7IC8vIFBvaW50cyB0byB0aGUgbG9jayB1bmlvbiBpZiBpbiBpbml0aWFsaXplZCBzdGF0ZS4KKworICAgIGlkZW50X3QgY29uc3QgKiAgICAgbG9jYXRpb247ICAgICAvLyBTb3VyY2UgY29kZSBsb2NhdGlvbiBvZiBvbXBfaW5pdF9sb2NrKCkuCisKKyAgICBLTVBfQUxJR04oIDggKSAgICAgICAgICAgICAgICAgICAgLy8gdGFpbF9pZCAgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZCEKKworICAgIHZvbGF0aWxlIGttcF9pbnQzMiAgdGFpbF9pZDsgICAgICAvLyAoZ3RpZCsxKSBvZiB0aHJlYWQgYXQgdGFpbCBvZiB3YWl0IHF1ZXVlLCAwIGlmIGVtcHR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE11c3QgYmUgbm8gcGFkZGluZyBoZXJlIHNpbmNlIGhlYWQvdGFpbCB1c2VkIGluIDgtYnl0ZSBDQVMKKyAgICB2b2xhdGlsZSBrbXBfaW50MzIgIGhlYWRfaWQ7ICAgICAgLy8gKGd0aWQrMSkgb2YgdGhyZWFkIGF0IGhlYWQgb2Ygd2FpdCBxdWV1ZSwgMCBpZiBlbXB0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEZWNsIG9yZGVyIGFzc3VtZXMgbGl0dGxlIGVuZGlhbgorICAgIC8vIGJha2VyeS1zdHlsZSBsb2NrCisgICAgdm9sYXRpbGUga21wX3VpbnQzMiBuZXh0X3RpY2tldDsgIC8vIHRpY2tldCBudW1iZXIgdG8gZ2l2ZSB0byBuZXh0IHRocmVhZCB3aGljaCBhY3F1aXJlcworICAgIHZvbGF0aWxlIGttcF91aW50MzIgbm93X3NlcnZpbmc7ICAvLyB0aWNrZXQgbnVtYmVyIGZvciB0aHJlYWQgd2hpY2ggaG9sZHMgdGhlIGxvY2sKKyAgICB2b2xhdGlsZSBrbXBfaW50MzIgIG93bmVyX2lkOyAgICAgLy8gKGd0aWQrMSkgb2Ygb3duaW5nIHRocmVhZCwgMCBpZiB1bmxvY2tlZAorICAgIGttcF9pbnQzMiAgICAgICAgICAgZGVwdGhfbG9ja2VkOyAvLyBkZXB0aCBsb2NrZWQsIGZvciBuZXN0ZWQgbG9ja3Mgb25seQorCisgICAga21wX2xvY2tfZmxhZ3NfdCAgICBmbGFnczsgICAgICAgIC8vIGxvY2sgc3BlY2lmaWNzLCBlLmcuIGNyaXRpY2FsIHNlY3Rpb24gbG9jaworI2lmIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKyAgICBLTVBfQUxJR04oQ0FDSEVfTElORSkKKyAgICBrbXBfYWRhcHRpdmVfbG9ja190IGFkYXB0aXZlOyAgICAgLy8gSW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjdWxhdGl2ZSBhZGFwdGl2ZSBsb2NrCisjZW5kaWYKK307CisKK3R5cGVkZWYgc3RydWN0IGttcF9iYXNlX3F1ZXVpbmdfbG9jayBrbXBfYmFzZV9xdWV1aW5nX2xvY2tfdDsKKworS01QX0JVSUxEX0FTU0VSVCggb2Zmc2V0b2YoIGttcF9iYXNlX3F1ZXVpbmdfbG9ja190LCB0YWlsX2lkICkgJSA4ID09IDAgKTsKKwordW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF9xdWV1aW5nX2xvY2sgeworICAgIGttcF9iYXNlX3F1ZXVpbmdfbG9ja190IGxrOyAgICAgICAvLyBUaGlzIGZpZWxkIG11c3QgYmUgZmlyc3QgdG8gYWxsb3cgc3RhdGljIGluaXRpYWxpemluZy4KKyAgICBrbXBfbG9ja19wb29sX3QgcG9vbDsKKyAgICBkb3VibGUgICAgICAgICAgICAgICAgICAgbGtfYWxpZ247IC8vIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudAorICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICBsa19wYWRbIEtNUF9QQUQoIGttcF9iYXNlX3F1ZXVpbmdfbG9ja190LCBDQUNIRV9MSU5FICkgXTsKK307CisKK3R5cGVkZWYgdW5pb24ga21wX3F1ZXVpbmdfbG9jayBrbXBfcXVldWluZ19sb2NrX3Q7CisKK2V4dGVybiB2b2lkIF9fa21wX2FjcXVpcmVfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiBpbnQgX19rbXBfdGVzdF9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBfcmVsZWFzZV9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBfaW5pdF9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrICk7CitleHRlcm4gdm9pZCBfX2ttcF9kZXN0cm95X3F1ZXVpbmdfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICpsY2sgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfYWNxdWlyZV9uZXN0ZWRfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiBpbnQgX19rbXBfdGVzdF9uZXN0ZWRfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX3JlbGVhc2VfbmVzdGVkX3F1ZXVpbmdfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbml0X25lc3RlZF9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrICk7CitleHRlcm4gdm9pZCBfX2ttcF9kZXN0cm95X25lc3RlZF9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrICk7CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRFJEUEEgdGlja2V0IGxvY2tzLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdHJ1Y3Qga21wX2Jhc2VfZHJkcGFfbG9jayB7CisgICAgLy8KKyAgICAvLyBBbGwgb2YgdGhlIGZpZWxkcyBvbiB0aGUgZmlyc3QgY2FjaGUgbGluZSBhcmUgb25seSB3cml0dGVuIHdoZW4KKyAgICAvLyBpbml0aWFsaXppbmcgb3IgcmVjb25maWd1cmluZyB0aGUgbG9jay4gIFRoZXNlIGFyZSByZWxhdGl2ZWx5IHJhcmUKKyAgICAvLyBvcGVyYXRpb25zLCBzbyBkYXRhIGZyb20gdGhlIGZpcnN0IGNhY2hlIGxpbmUgd2lsbCB1c3VhbGx5IHN0YXkKKyAgICAvLyByZXNpZGVudCBpbiB0aGUgY2FjaGUgb2YgZWFjaCB0aHJlYWQgdHJ5aW5nIHRvIGFjcXVpcmUgdGhlIGxvY2suCisgICAgLy8KKyAgICAvLyBpbml0aWFsaXplZCBtdXN0IGJlIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgbG9jayBkYXRhIHN0cnVjdHVyZSEKKyAgICAvLworICAgIEtNUF9BTElHTl9DQUNIRQorCisgICAgdm9sYXRpbGUgdW5pb24ga21wX2RyZHBhX2xvY2sgKiBpbml0aWFsaXplZDsgICAgLy8gcG9pbnRzIHRvIHRoZSBsb2NrIHVuaW9uIGlmIGluIGluaXRpYWxpemVkIHN0YXRlCisgICAgaWRlbnRfdCBjb25zdCAqICAgICAgICAgICAgICAgICBsb2NhdGlvbjsgICAgICAgLy8gU291cmNlIGNvZGUgbG9jYXRpb24gb2Ygb21wX2luaXRfbG9jaygpLgorICAgIHZvbGF0aWxlIHN0cnVjdCBrbXBfbG9ja19wb2xsIHsKKyAgICAgICAga21wX3VpbnQ2NCBwb2xsOworICAgIH0gKiB2b2xhdGlsZSBwb2xsczsKKyAgICB2b2xhdGlsZSBrbXBfdWludDY0ICAgICAgICAgICAgIG1hc2s7ICAgICAgICAgICAvLyBpcyAyKipudW1fcG9sbHMtMSBmb3IgbW9kIG9wCisgICAga21wX3VpbnQ2NCAgICAgICAgICAgICAgICAgICAgICBjbGVhbnVwX3RpY2tldDsgLy8gdGhyZWFkIHdpdGggY2xlYW51cCB0aWNrZXQKKyAgICB2b2xhdGlsZSBzdHJ1Y3Qga21wX2xvY2tfcG9sbCAqIG9sZF9wb2xsczsgICAgICAvLyB3aWxsIGRlYWxsb2NhdGUgb2xkX3BvbGxzCisgICAga21wX3VpbnQzMiAgICAgICAgICAgICAgICAgICAgICBudW1fcG9sbHM7ICAgICAgLy8gbXVzdCBiZSBwb3dlciBvZiAyCisKKyAgICAvLworICAgIC8vIG5leHRfdGlja2V0IGl0IG5lZWRzIHRvIGV4aXN0IGluIGEgc2VwYXJhdGUgY2FjaGUgbGluZSwgYXMgaXQgaXMKKyAgICAvLyBpbnZhbGlkYXRlZCBldmVyeSB0aW1lIGEgdGhyZWFkIHRha2VzIGEgbmV3IHRpY2tldC4KKyAgICAvLworICAgIEtNUF9BTElHTl9DQUNIRQorCisgICAgdm9sYXRpbGUga21wX3VpbnQ2NCAgICAgICAgICAgICBuZXh0X3RpY2tldDsKKworICAgIC8vCisgICAgLy8gbm93X3NlcnZpbmcgaXMgdXNlZCB0byBzdG9yZSBvdXIgdGlja2V0IHZhbHVlIHdoaWxlIHdlIGhvbGQgdGhlIGxvY2suCisgICAgLy8gSXQgaGFzIGEgc2xpZ2h0bHkgZGlmZmVyZW50IG1lYW5pbmcgaW4gdGhlIERSRFBBIHRpY2tldCBsb2NrcyAod2hlcmUKKyAgICAvLyBpdCBpcyB3cml0dGVuIGJ5IHRoZSBhY3F1aXJpbmcgdGhyZWFkKSB0aGFuIGl0IGRvZXMgaW4gdGhlIHNpbXBsZQorICAgIC8vIHRpY2tldCBsb2NrcyAod2hlcmUgaXQgaXMgd3JpdHRlbiBieSB0aGUgcmVsZWFzaW5nIHRocmVhZCkuCisgICAgLy8KKyAgICAvLyBTaW5jZSBub3dfc2VydmluZyBpcyBvbmx5IHJlYWQgYW4gd3JpdHRlbiBpbiB0aGUgY3JpdGljYWwgc2VjdGlvbiwKKyAgICAvLyBpdCBpcyBub24tdm9sYXRpbGUsIGJ1dCBpdCBuZWVkcyB0byBleGlzdCBvbiBhIHNlcGFyYXRlIGNhY2hlIGxpbmUsCisgICAgLy8gYXMgaXQgaXMgaW52YWxpZGF0ZWQgYXQgZXZlcnkgbG9jayBhY3F1aXJlLgorICAgIC8vCisgICAgLy8gTGlrZXdpc2UsIHRoZSB2YXJzIHVzZWQgZm9yIG5lc3RlZCBsb2NrcyAob3duZXJfaWQgYW5kIGRlcHRoX2xvY2tlZCkKKyAgICAvLyBhcmUgb25seSB3cml0dGVuIGJ5IHRoZSB0aHJlYWQgb3duaW5nIHRoZSBsb2NrLCBzbyB0aGV5IGFyZSBwdXQgaW4KKyAgICAvLyB0aGlzIGNhY2hlIGxpbmUuICBvd25lcl9pZCBpcyByZWFkIGJ5IG90aGVyIHRocmVhZHMsIHNvIGl0IG11c3QgYmUKKyAgICAvLyBkZWNsYXJlZCB2b2xhdGlsZS4KKyAgICAvLworICAgIEtNUF9BTElHTl9DQUNIRQorCisgICAga21wX3VpbnQ2NCAgICAgICAgICAgICAgICAgICAgICBub3dfc2VydmluZzsgICAgLy8gZG9lc24ndCBoYXZlIHRvIGJlIHZvbGF0aWxlCisgICAgdm9sYXRpbGUga21wX3VpbnQzMiAgICAgICAgICAgICBvd25lcl9pZDsgICAgICAgLy8gKGd0aWQrMSkgb2Ygb3duaW5nIHRocmVhZCwgMCBpZiB1bmxvY2tlZAorICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhfbG9ja2VkOyAgIC8vIGRlcHRoIGxvY2tlZAorICAgIGttcF9sb2NrX2ZsYWdzX3QgICAgICAgICAgICAgICAgZmxhZ3M7ICAgICAgICAgIC8vIGxvY2sgc3BlY2lmaWNzLCBlLmcuIGNyaXRpY2FsIHNlY3Rpb24gbG9jaworfTsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2Jhc2VfZHJkcGFfbG9jayBrbXBfYmFzZV9kcmRwYV9sb2NrX3Q7CisKK3VuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfZHJkcGFfbG9jayB7CisgICAga21wX2Jhc2VfZHJkcGFfbG9ja190IGxrOyAgICAgICAvLyBUaGlzIGZpZWxkIG11c3QgYmUgZmlyc3QgdG8gYWxsb3cgc3RhdGljIGluaXRpYWxpemluZy4gKi8KKyAgICBrbXBfbG9ja19wb29sX3QgcG9vbDsKKyAgICBkb3VibGUgICAgICAgICAgICAgICAgbGtfYWxpZ247IC8vIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudAorICAgIGNoYXIgICAgICAgICAgICAgICAgICBsa19wYWRbIEtNUF9QQUQoIGttcF9iYXNlX2RyZHBhX2xvY2tfdCwgQ0FDSEVfTElORSApIF07Cit9OworCit0eXBlZGVmIHVuaW9uIGttcF9kcmRwYV9sb2NrIGttcF9kcmRwYV9sb2NrX3Q7CisKK2V4dGVybiB2b2lkIF9fa21wX2FjcXVpcmVfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIGludCBfX2ttcF90ZXN0X2RyZHBhX2xvY2soIGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX3JlbGVhc2VfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBfaW5pdF9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2sgKTsKK2V4dGVybiB2b2lkIF9fa21wX2Rlc3Ryb3lfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqbGNrICk7CisKK2V4dGVybiB2b2lkIF9fa21wX2FjcXVpcmVfbmVzdGVkX2RyZHBhX2xvY2soIGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiBpbnQgX19rbXBfdGVzdF9uZXN0ZWRfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBfcmVsZWFzZV9uZXN0ZWRfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBfaW5pdF9uZXN0ZWRfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqbGNrICk7CitleHRlcm4gdm9pZCBfX2ttcF9kZXN0cm95X25lc3RlZF9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2sgKTsKKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBMb2NrIHB1cnBvc2VzLgorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEJvb3RzdHJhcCBsb2Nrcy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gQm9vdHN0cmFwIGxvY2tzIC0tIHZlcnkgZmV3IGxvY2tzIHVzZWQgYXQgbGlicmFyeSBpbml0aWFsaXphdGlvbiB0aW1lLgorLy8gQm9vdHN0cmFwIGxvY2tzIGFyZSBjdXJyZW50bHkgaW1wbGVtZW50ZWQgYXMgdGlja2V0IGxvY2tzLgorLy8gVGhleSBjb3VsZCBhbHNvIGJlIGltcGxlbWVudGVkIGFzIHRlc3QgYW5kIHNldCBsb2NrLCBidXQgY2Fubm90IGJlCisvLyBpbXBsZW1lbnRlZCB3aXRoIG90aGVyIGxvY2sga2luZHMgYXMgdGhleSByZXF1aXJlIGd0aWRzIHdoaWNoIGFyZSBub3QKKy8vIGF2YWlsYWJsZSBhdCBpbml0aWFsaXphdGlvbiB0aW1lLgorCit0eXBlZGVmIGttcF90aWNrZXRfbG9ja190IGttcF9ib290c3RyYXBfbG9ja190OworCisjZGVmaW5lIEtNUF9CT09UU1RSQVBfTE9DS19JTklUSUFMSVpFUiggbG9jayApIEtNUF9USUNLRVRfTE9DS19JTklUSUFMSVpFUiggKGxvY2spICkKKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCBrbXBfYm9vdHN0cmFwX2xvY2tfdCAqbGNrICkKK3sKKyAgICBfX2ttcF9hY3F1aXJlX3RpY2tldF9sb2NrKCBsY2ssIEtNUF9HVElEX0RORSApOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19rbXBfdGVzdF9ib290c3RyYXBfbG9jaygga21wX2Jvb3RzdHJhcF9sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIF9fa21wX3Rlc3RfdGlja2V0X2xvY2soIGxjaywgS01QX0dUSURfRE5FICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jaygga21wX2Jvb3RzdHJhcF9sb2NrX3QgKmxjayApCit7CisgICAgX19rbXBfcmVsZWFzZV90aWNrZXRfbG9jayggbGNrLCBLTVBfR1RJRF9ETkUgKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9pbml0X2Jvb3RzdHJhcF9sb2NrKCBrbXBfYm9vdHN0cmFwX2xvY2tfdCAqbGNrICkKK3sKKyAgICBfX2ttcF9pbml0X3RpY2tldF9sb2NrKCBsY2sgKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9kZXN0cm95X2Jvb3RzdHJhcF9sb2NrKCBrbXBfYm9vdHN0cmFwX2xvY2tfdCAqbGNrICkKK3sKKyAgICBfX2ttcF9kZXN0cm95X3RpY2tldF9sb2NrKCBsY2sgKTsKK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbnRlcm5hbCBSVEwgbG9ja3MuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vCisvLyBJbnRlcm5hbCBSVEwgbG9ja3MgYXJlIGFsc28gaW1wbGVtZW50ZWQgYXMgdGlja2V0IGxvY2tzLCBmb3Igbm93LgorLy8KKy8vIEZJWE1FIC0gV2Ugc2hvdWxkIGdvIHRocm91Z2ggYW5kIGZpZ3VyZSBvdXQgd2hpY2ggbG9jayBraW5kIHdvcmtzIGJlc3QgZm9yCisvLyBlYWNoIGludGVybmFsIGxvY2ssIGFuZCB1c2UgdGhlIHR5cGUgZGVjbGFyYXRpb24gYW5kIGZ1bmN0aW9uIGNhbGxzIGZvcgorLy8gdGhhdCBleHBsaWNpdCBsb2NrIGtpbmQgKGFuZCBnZXQgcmlkIG9mIHRoaXMgc2VjdGlvbikuCisvLworCit0eXBlZGVmIGttcF90aWNrZXRfbG9ja190IGttcF9sb2NrX3Q7CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfYWNxdWlyZV9sb2NrKCBrbXBfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBfX2ttcF9hY3F1aXJlX3RpY2tldF9sb2NrKCBsY2ssIGd0aWQgKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fa21wX3Rlc3RfbG9jaygga21wX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgcmV0dXJuIF9fa21wX3Rlc3RfdGlja2V0X2xvY2soIGxjaywgZ3RpZCApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX3JlbGVhc2VfbG9jaygga21wX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgX19rbXBfcmVsZWFzZV90aWNrZXRfbG9jayggbGNrLCBndGlkICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfaW5pdF9sb2NrKCBrbXBfbG9ja190ICpsY2sgKQoreworICAgIF9fa21wX2luaXRfdGlja2V0X2xvY2soIGxjayApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX2Rlc3Ryb3lfbG9jaygga21wX2xvY2tfdCAqbGNrICkKK3sKKyAgICBfX2ttcF9kZXN0cm95X3RpY2tldF9sb2NrKCBsY2sgKTsKK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBVc2VyIGxvY2tzLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLworLy8gRG8gbm90IGFsbG9jYXRlIG9iamVjdHMgb2YgdHlwZSB1bmlvbiBrbXBfdXNlcl9sb2NrISEhCisvLyBUaGlzIHdpbGwgd2FzdGUgc3BhY2UgdW5sZXNzIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX2RyZHBhLgorLy8gSW5zdGVhZCwgY2hlY2sgdGhlIHZhbHVlIG9mIF9fa21wX3VzZXJfbG9ja19raW5kIGFuZCBhbGxvY2F0ZSBvYmplY3RzIG9mCisvLyB0aGUgdHlwZSBvZiB0aGUgYXBwcm9wcmlhdGUgdW5pb24gbWVtYmVyLCBhbmQgY2FzdCB0aGVpciBhZGRyZXNzZXMgdG8KKy8vIGttcF91c2VyX2xvY2tfcC4KKy8vCisKK2VudW0ga21wX2xvY2tfa2luZCB7CisgICAgbGtfZGVmYXVsdCA9IDAsCisgICAgbGtfdGFzLAorI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0pCisgICAgbGtfZnV0ZXgsCisjZW5kaWYKKyAgICBsa190aWNrZXQsCisgICAgbGtfcXVldWluZywKKyAgICBsa19kcmRwYSwKKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisgICAgbGtfYWRhcHRpdmUKKyNlbmRpZiAvLyBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCit9OworCit0eXBlZGVmIGVudW0ga21wX2xvY2tfa2luZCBrbXBfbG9ja19raW5kX3Q7CisKK2V4dGVybiBrbXBfbG9ja19raW5kX3QgX19rbXBfdXNlcl9sb2NrX2tpbmQ7CisKK3VuaW9uIGttcF91c2VyX2xvY2sgeworICAgIGttcF90YXNfbG9ja190ICAgICB0YXM7CisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSkKKyAgICBrbXBfZnV0ZXhfbG9ja190ICAgZnV0ZXg7CisjZW5kaWYKKyAgICBrbXBfdGlja2V0X2xvY2tfdCAgdGlja2V0OworICAgIGttcF9xdWV1aW5nX2xvY2tfdCBxdWV1aW5nOworICAgIGttcF9kcmRwYV9sb2NrX3QgICBkcmRwYTsKKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisgICAga21wX2FkYXB0aXZlX2xvY2tfdCAgICAgYWRhcHRpdmU7CisjZW5kaWYgLy8gS01QX1VTRV9BREFQVElWRV9MT0NLUworICAgIGttcF9sb2NrX3Bvb2xfdCAgICBwb29sOworfTsKKwordHlwZWRlZiB1bmlvbiBrbXBfdXNlcl9sb2NrICprbXBfdXNlcl9sb2NrX3A7CisKK2V4dGVybiBzaXplX3QgX19rbXBfYmFzZV91c2VyX2xvY2tfc2l6ZTsKK2V4dGVybiBzaXplX3QgX19rbXBfdXNlcl9sb2NrX3NpemU7CisKK2V4dGVybiBrbXBfaW50MzIgKCAqX19rbXBfZ2V0X3VzZXJfbG9ja19vd25lcl8gKSgga21wX3VzZXJfbG9ja19wIGxjayApOworCitzdGF0aWMgaW5saW5lIGttcF9pbnQzMgorX19rbXBfZ2V0X3VzZXJfbG9ja19vd25lcigga21wX3VzZXJfbG9ja19wIGxjayApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfZ2V0X3VzZXJfbG9ja19vd25lcl8gIT0gTlVMTCApOworICAgIHJldHVybiAoICpfX2ttcF9nZXRfdXNlcl9sb2NrX293bmVyXyApKCBsY2sgKTsKK30KKworZXh0ZXJuIHZvaWQgKCAqX19rbXBfYWNxdWlyZV91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICk7CisKKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNKQorCisjZGVmaW5lIF9fa21wX2FjcXVpcmVfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKGxjayxndGlkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX3RhcykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfc2V0X2xvY2siOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoICggc2l6ZW9mICgga21wX3Rhc19sb2NrX3QgKSA8PSBPTVBfTE9DS19UX1NJWkUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgJiYgbGNrLT50YXMubGsuZGVwdGhfbG9ja2VkICE9IC0xICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoICggZ3RpZCA+PSAwICkgJiYgKCBsY2stPnRhcy5say5wb2xsIC0gMSA9PSBndGlkICkgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNBbHJlYWR5T3duZWQsIGZ1bmMgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICggKCBsY2stPnRhcy5say5wb2xsICE9IDAgKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMiggJihsY2stPnRhcy5say5wb2xsKSwgMCwgZ3RpZCArIDEgKSApICApIHsgICAgICAgICAgICBcCisgICAgICAgICAgICBrbXBfdWludDMyIHNwaW5zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfRlNZTkNfUFJFUEFSRSggbGNrICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfSU5JVF9ZSUVMRCggc3BpbnMgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoIFRDUl80KF9fa21wX250aCkgPiAoX19rbXBfYXZhaWxfcHJvYyA/IF9fa21wX2F2YWlsX3Byb2MgOiBfX2ttcF94cHJvYykgKSB7ICAgICBcCisgICAgICAgICAgICAgICAgS01QX1lJRUxEKCBUUlVFICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgS01QX1lJRUxEX1NQSU4oIHNwaW5zICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB3aGlsZSAoICggbGNrLT50YXMubGsucG9sbCAhPSAwICkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoICYobGNrLT50YXMubGsucG9sbCksIDAsIGd0aWQgKyAxICkgKSAgKSAgeyAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKCBUQ1JfNChfX2ttcF9udGgpID4gKF9fa21wX2F2YWlsX3Byb2MgPyBfX2ttcF9hdmFpbF9wcm9jIDogX19rbXBfeHByb2MpICkgeyBcCisgICAgICAgICAgICAgICAgICAgIEtNUF9ZSUVMRCggVFJVRSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIEtNUF9ZSUVMRF9TUElOKCBzcGlucyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9GU1lOQ19BQ1FVSVJFRCggbGNrICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2FjcXVpcmVfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyAhPSBOVUxMICk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICggKl9fa21wX2FjcXVpcmVfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBsY2ssIGd0aWQgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9hY3F1aXJlX3VzZXJfbG9ja193aXRoX2NoZWNrcygga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2FjcXVpcmVfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyAhPSBOVUxMICk7CisgICAgKCAqX19rbXBfYWNxdWlyZV91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGxjaywgZ3RpZCApOworfQorI2VuZGlmCisKK2V4dGVybiBpbnQgKCAqX19rbXBfdGVzdF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICk7CisKKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNKQorCisjaW5jbHVkZSAia21wX2kxOG4uaCIgICAgICAgICAgICAgICAgICAgICAgIC8qIEFDOiBLTVBfRkFUQUwgZGVmaW5pdGlvbiAqLworZXh0ZXJuIGludCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2s7ICAgICAvKiBBQzogY29weSBmcm9tIGttcC5oIGhlcmUgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2ttcF90ZXN0X3VzZXJfbG9ja193aXRoX2NoZWNrcygga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGlmICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfdGFzICkgeworICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF90ZXN0X2xvY2siOworICAgICAgICAgICAgaWYgKCAoIHNpemVvZiAoIGttcF90YXNfbG9ja190ICkgPD0gT01QX0xPQ0tfVF9TSVpFICkKKyAgICAgICAgICAgICAgICAmJiBsY2stPnRhcy5say5kZXB0aF9sb2NrZWQgIT0gLTEgKSB7CisgICAgICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKCAoIGxjay0+dGFzLmxrLnBvbGwgPT0gMCApICYmCisgICAgICAgICAgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCAmKGxjay0+dGFzLmxrLnBvbGwpLCAwLCBndGlkICsgMSApICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGVzdF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICE9IE5VTEwgKTsKKyAgICAgICAgcmV0dXJuICggKl9fa21wX3Rlc3RfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBsY2ssIGd0aWQgKTsKKyAgICB9Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQKK19fa21wX3Rlc3RfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGVzdF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICE9IE5VTEwgKTsKKyAgICByZXR1cm4gKCAqX19rbXBfdGVzdF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGxjaywgZ3RpZCApOworfQorI2VuZGlmCisKK2V4dGVybiB2b2lkICggKl9fa21wX3JlbGVhc2VfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfaW50MzIgZ3RpZCApOworCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX3JlbGVhc2VfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfcmVsZWFzZV91c2VyX2xvY2tfd2l0aF9jaGVja3NfICE9IE5VTEwgKTsKKyAgICAoICpfX2ttcF9yZWxlYXNlX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSAoIGxjaywgZ3RpZCApOworfQorCitleHRlcm4gdm9pZCAoICpfX2ttcF9pbml0X3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjayApOworCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX2luaXRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdXNlcl9sb2NrX3AgbGNrICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3VzZXJfbG9ja193aXRoX2NoZWNrc18gIT0gTlVMTCApOworICAgICggKl9fa21wX2luaXRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBsY2sgKTsKK30KKworLy8KKy8vIFdlIG5lZWQgYSBub24tY2hlY2tpbmcgdmVyc2lvbiBvZiBkZXN0cm95IGxvY2sgZm9yIHdoZW4gdGhlIFJUTCBpcworLy8gZG9pbmcgdGhlIGNsZWFudXAgYXMgaXQgY2FuJ3QgYWx3YXlzIHRlbGwgaWYgdGhlIGxvY2sgaXMgbmVzdGVkIG9yIG5vdC4KKy8vCitleHRlcm4gdm9pZCAoICpfX2ttcF9kZXN0cm95X3VzZXJfbG9ja18gKSgga21wX3VzZXJfbG9ja19wIGxjayApOworCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrKCBrbXBfdXNlcl9sb2NrX3AgbGNrICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9kZXN0cm95X3VzZXJfbG9ja18gIT0gTlVMTCApOworICAgICggKl9fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrXyApKCBsY2sgKTsKK30KKworZXh0ZXJuIHZvaWQgKCAqX19rbXBfZGVzdHJveV91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2sgKTsKKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9kZXN0cm95X3VzZXJfbG9ja193aXRoX2NoZWNrcygga21wX3VzZXJfbG9ja19wIGxjayApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfZGVzdHJveV91c2VyX2xvY2tfd2l0aF9jaGVja3NfICE9IE5VTEwgKTsKKyAgICAoICpfX2ttcF9kZXN0cm95X3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSggbGNrICk7Cit9CisKK2V4dGVybiB2b2lkICggKl9fa21wX2FjcXVpcmVfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKTsKKworI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCkKKworI2RlZmluZSBfX2ttcF9hY3F1aXJlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3MobGNrLGd0aWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfdGFzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3NldF9uZXN0X2xvY2siOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICggKCBzaXplb2YgKCBrbXBfdGFzX2xvY2tfdCApIDw9IE9NUF9ORVNUX0xPQ0tfVF9TSVpFICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgJiYgbGNrLT50YXMubGsuZGVwdGhfbG9ja2VkID09IC0xICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIGxjay0+dGFzLmxrLnBvbGwgLSAxID09IGd0aWQgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGxjay0+dGFzLmxrLmRlcHRoX2xvY2tlZCArPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKCAoIGxjay0+dGFzLmxrLnBvbGwgIT0gMCApIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMiggJihsY2stPnRhcy5say5wb2xsKSwgMCwgZ3RpZCArIDEgKSApICApIHsgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAga21wX3VpbnQzMiBzcGluczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEtNUF9GU1lOQ19QUkVQQVJFKCBsY2sgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBLTVBfSU5JVF9ZSUVMRCggc3BpbnMgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKCBUQ1JfNChfX2ttcF9udGgpID4gKF9fa21wX2F2YWlsX3Byb2MgPyBfX2ttcF9hdmFpbF9wcm9jIDogX19rbXBfeHByb2MpICkgeyAgICAgXAorICAgICAgICAgICAgICAgICAgICBLTVBfWUlFTEQoIFRSVUUgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIEtNUF9ZSUVMRF9TUElOKCBzcGlucyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB3aGlsZSAoICggbGNrLT50YXMubGsucG9sbCAhPSAwICkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCAmKGxjay0+dGFzLmxrLnBvbGwpLCAwLCBndGlkICsgMSApICkgICkgeyAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBpZiAoIFRDUl80KF9fa21wX250aCkgPiAoX19rbXBfYXZhaWxfcHJvYyA/IF9fa21wX2F2YWlsX3Byb2MgOiBfX2ttcF94cHJvYykgKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ZSUVMRCggVFJVRSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgS01QX1lJRUxEX1NQSU4oIHNwaW5zICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGxjay0+dGFzLmxrLmRlcHRoX2xvY2tlZCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfRlNZTkNfQUNRVUlSRUQoIGxjayApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2FjcXVpcmVfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gIT0gTlVMTCApOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoICpfX2ttcF9hY3F1aXJlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGxjaywgZ3RpZCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX2FjcXVpcmVfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrcygga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2FjcXVpcmVfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gIT0gTlVMTCApOworICAgICggKl9fa21wX2FjcXVpcmVfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSggbGNrLCBndGlkICk7Cit9CisjZW5kaWYKKworZXh0ZXJuIGludCAoICpfX2ttcF90ZXN0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICk7CisKKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQpCitzdGF0aWMgaW5saW5lIGludAorX19rbXBfdGVzdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaWYgKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKSB7CisgICAgICAgIGludCByZXR2YWw7CisgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Rlc3RfbmVzdF9sb2NrIjsKKyAgICAgICAgICAgIGlmICggKCBzaXplb2YgKCBrbXBfdGFzX2xvY2tfdCApIDw9IE9NUF9ORVNUX0xPQ0tfVF9TSVpFICkKKyAgICAgICAgICAgICAgICAmJiBsY2stPnRhcy5say5kZXB0aF9sb2NrZWQgPT0gLTEgKSB7CisgICAgICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKyAgICAgICAgaWYgKCBsY2stPnRhcy5say5wb2xsIC0gMSA9PSBndGlkICkgeyAgIC8qIF9fa21wX2dldF90YXNfbG9ja19vd25lciggbGNrICkgPT0gZ3RpZCAqLworICAgICAgICAgICAgcmV0dXJuICsrbGNrLT50YXMubGsuZGVwdGhfbG9ja2VkOyAgLyogc2FtZSBvd25lciwgZGVwdGggaW5jcmVhc2VkICovCisgICAgICAgIH0KKyAgICAgICAgcmV0dmFsID0gKCAoIGxjay0+dGFzLmxrLnBvbGwgPT0gMCApICYmCisgICAgICAgICAgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCAmKGxjay0+dGFzLmxrLnBvbGwpLCAwLCBndGlkICsgMSApICk7CisgICAgICAgIGlmICggcmV0dmFsICkgeworICAgICAgICAgICAgS01QX01CKCk7CisgICAgICAgICAgICBsY2stPnRhcy5say5kZXB0aF9sb2NrZWQgPSAxOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGVzdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyAhPSBOVUxMICk7CisgICAgICAgIHJldHVybiAoICpfX2ttcF90ZXN0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGxjaywgZ3RpZCApOworICAgIH0KK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIGludAorX19rbXBfdGVzdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGVzdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyAhPSBOVUxMICk7CisgICAgcmV0dXJuICggKl9fa21wX3Rlc3RfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSggbGNrLCBndGlkICk7Cit9CisjZW5kaWYKKworZXh0ZXJuIHZvaWQgKCAqX19rbXBfcmVsZWFzZV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfaW50MzIgZ3RpZCApOworCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX3JlbGVhc2VfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrcygga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3JlbGVhc2VfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gIT0gTlVMTCApOworICAgICggKl9fa21wX3JlbGVhc2VfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSggbGNrLCBndGlkICk7Cit9CisKK2V4dGVybiB2b2lkICggKl9fa21wX2luaXRfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjayApOworCitzdGF0aWMgaW5saW5lIHZvaWQgX19rbXBfaW5pdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdXNlcl9sb2NrX3AgbGNrICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICE9IE5VTEwgKTsKKyAgICAoICpfX2ttcF9pbml0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGxjayApOworfQorCitleHRlcm4gdm9pZCAoICpfX2ttcF9kZXN0cm95X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2sgKTsKKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9kZXN0cm95X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3MoIGttcF91c2VyX2xvY2tfcCBsY2sgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gIT0gTlVMTCApOworICAgICggKl9fa21wX2Rlc3Ryb3lfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSggbGNrICk7Cit9CisKKy8vCisvLyB1c2VyIGxvY2sgZnVuY3Rpb25zIHdoaWNoIGRvIG5vdCBuZWNlc3NhcmlseSBleGlzdCBmb3IgYWxsIGxvY2sga2luZHMuCisvLworLy8gVGhlICJzZXQiIGZ1bmN0aW9ucyB1c3VhbGx5IGhhdmUgd3JhcHBlciByb3V0aW5lcyB0aGF0IGNoZWNrIGZvciBhIE5VTEwgc2V0CisvLyBmdW5jdGlvbiBwb2ludGVyIGFuZCBjYWxsIGl0IGlmIG5vbi1OVUxMLgorLy8KKy8vIEluIHNvbWUgY2FzZXMsIGl0IG1ha2VzIHNlbnNlIHRvIGhhdmUgYSAiZ2V0IiB3cmFwcGVyIGZ1bmN0aW9uIGNoZWNrIGZvciBhCisvLyBOVUxMIGdldCBmdW5jdGlvbiBwb2ludGVyIGFuZCByZXR1cm4gTlVMTCAvIGludmFsaWQgdmFsdWUgLyBlcnJvciBjb2RlIGlmCisvLyB0aGUgZnVuY3Rpb24gcG9pbnRlciBpcyBOVUxMLgorLy8KKy8vIEluIG90aGVyIGNhc2VzLCB0aGUgY2FsbGluZyBjb2RlIHJlYWxseSBzaG91bGQgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGFuCisvLyB1bmltcGxlbWVudGVkIGZ1bmN0aW9uIGFuZCBvbmUgdGhhdCBpcyBpbXBsZW1lbnRlZCBidXQgcmV0dXJuaW5nIE5VTEwgLworLy8gaW52YWxpZWQgdmFsdWUuICBJZiB0aGlzIGlzIHRoZSBjYXNlLCBubyBnZXQgZnVuY3Rpb24gd3JhcHBlciBleGlzdHMuCisvLworCitleHRlcm4gaW50ICggKl9fa21wX2lzX3VzZXJfbG9ja19pbml0aWFsaXplZF8gKSgga21wX3VzZXJfbG9ja19wIGxjayApOworCisvLyBubyBzZXQgZnVuY3Rpb247IGZpZWxkcyBzZXQgZHVyaW5pbmcgbG9jYWwgYWxsb2NhdGlvbgorCitleHRlcm4gY29uc3QgaWRlbnRfdCAqICggKl9fa21wX2dldF91c2VyX2xvY2tfbG9jYXRpb25fICkoIGttcF91c2VyX2xvY2tfcCBsY2sgKTsKKworc3RhdGljIGlubGluZSBjb25zdCBpZGVudF90ICoKK19fa21wX2dldF91c2VyX2xvY2tfbG9jYXRpb24oIGttcF91c2VyX2xvY2tfcCBsY2sgKQoreworICAgIGlmICggX19rbXBfZ2V0X3VzZXJfbG9ja19sb2NhdGlvbl8gICE9IE5VTEwgKSB7CisgICAgICAgIHJldHVybiAoICpfX2ttcF9nZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyApKCBsY2sgKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KK30KKworZXh0ZXJuIHZvaWQgKCAqX19rbXBfc2V0X3VzZXJfbG9ja19sb2NhdGlvbl8gKSgga21wX3VzZXJfbG9ja19wIGxjaywgY29uc3QgaWRlbnRfdCAqbG9jICk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfc2V0X3VzZXJfbG9ja19sb2NhdGlvbigga21wX3VzZXJfbG9ja19wIGxjaywgY29uc3QgaWRlbnRfdCAqbG9jICkKK3sKKyAgICBpZiAoIF9fa21wX3NldF91c2VyX2xvY2tfbG9jYXRpb25fICAhPSBOVUxMICkgeworICAgICAgICAoICpfX2ttcF9zZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyApKCBsY2ssIGxvYyApOworICAgIH0KK30KKworZXh0ZXJuIGttcF9sb2NrX2ZsYWdzX3QgKCAqX19rbXBfZ2V0X3VzZXJfbG9ja19mbGFnc18gKSgga21wX3VzZXJfbG9ja19wIGxjayApOworCitleHRlcm4gdm9pZCAoICpfX2ttcF9zZXRfdXNlcl9sb2NrX2ZsYWdzXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfbG9ja19mbGFnc190IGZsYWdzICk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfc2V0X3VzZXJfbG9ja19mbGFncygga21wX3VzZXJfbG9ja19wIGxjaywga21wX2xvY2tfZmxhZ3NfdCBmbGFncyApCit7CisgICAgaWYgKCBfX2ttcF9zZXRfdXNlcl9sb2NrX2ZsYWdzXyAgIT0gTlVMTCApIHsKKyAgICAgICAgKCAqX19rbXBfc2V0X3VzZXJfbG9ja19mbGFnc18gKSggbGNrLCBmbGFncyApOworICAgIH0KK30KKworLy8KKy8vIFRoZSBmdWN0aW9uIHdoaWNoIHNldHMgdXAgYWxsIG9mIHRoZSB2dGJsIHBvaW50ZXJzIGZvciBrbXBfdXNlcl9sb2NrX3QuCisvLworZXh0ZXJuIHZvaWQgX19rbXBfc2V0X3VzZXJfbG9ja192cHRycygga21wX2xvY2tfa2luZF90IHVzZXJfbG9ja19raW5kICk7CisKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBVc2VyIGxvY2sgdGFibGUgJiBsb2NrIGFsbG9jYXRpb24KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoKKyAgICBPbiA2NC1iaXQgTGludXgqIE9TIChhbmQgT1MgWCopIEdOVSBjb21waWxlciBhbGxvY2F0ZXMgb25seSA0IGJ5dGVtcyBtZW1vcnkgZm9yIGxvY2sgdmFyaWFibGUsIHdoaWNoCisgICAgaXMgbm90IGVub3VnaCB0byBzdG9yZSBhIHBvaW50ZXIsIHNvIHdlIGhhdmUgdG8gdXNlIGxvY2sgaW5kZXhlcyBpbnN0ZWFkIG9mIHBvaW50ZXJzIGFuZAorICAgIG1haW50YWluIGxvY2sgdGFibGUgdG8gbWFwIGluZGV4ZXMgdG8gcG9pbnRlcnMuCisKKworICAgIE5vdGU6IFRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSB0YWJsZSBpcyBub3QgYSBwb2ludGVyIHRvIGxvY2shIEl0IGlzIGEgcG9pbnRlciB0byBwcmV2aW91c2x5CisgICAgYWxsb2NhdGVkIHRhYmxlIChvciBOVUxMIGlmIGl0IGlzIHRoZSBmaXJzdCB0YWJsZSkuCisKKyAgICBVc2FnZToKKworICAgICAgICBpZiAoIE9NUF9MT0NLX1RfU0laRSA8IHNpemVvZiggPGxvY2s+ICkgKSB7IC8vIG9yIE9NUF9ORVNUX0xPQ0tfVF9TSVpFCisgICAgICAgICAgICBMb2NrIHRhYmxlIGlzIGZ1bGx5IHV0aWxpemVkLiBVc2VyIGxvY2tzIGFyZSBpbmRleGVzLCBzbyB0YWJsZSBpcworICAgICAgICAgICAgdXNlZCBvbiB1c2VyIGxvY2sgb3BlcmF0aW9uLgorICAgICAgICAgICAgTm90ZTogaXQgbWF5IGJlIHRoZSBjYXNlIChsaW5fMzIpIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byB1c2UgYSBsb2NrCisgICAgICAgICAgICB0YWJsZSBmb3IgcmVndWxhciBsb2NrcywgYnV0IGRvIG5lZWQgdGhlIHRhYmxlIGZvciBuZXN0ZWQgbG9ja3MuCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBMb2NrIHRhYmxlIGluaXRpYWxpemVkIGJ1dCBub3QgYWN0dWFsbHkgdXNlZC4KKyAgICAgICAgfQorKi8KKworc3RydWN0IGttcF9sb2NrX3RhYmxlIHsKKyAgICBrbXBfbG9ja19pbmRleF90ICB1c2VkOyAgICAgIC8vIE51bWJlciBvZiB1c2VkIGVsZW1lbnRzCisgICAga21wX2xvY2tfaW5kZXhfdCAgYWxsb2NhdGVkOyAvLyBOdW1iZXIgb2YgYWxsb2NhdGVkIGVsZW1lbnRzCisgICAga21wX3VzZXJfbG9ja19wICogdGFibGU7ICAgICAvLyBMb2NrIHRhYmxlLgorfTsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2xvY2tfdGFibGUga21wX2xvY2tfdGFibGVfdDsKKworZXh0ZXJuIGttcF9sb2NrX3RhYmxlX3QgX19rbXBfdXNlcl9sb2NrX3RhYmxlOworZXh0ZXJuIGttcF91c2VyX2xvY2tfcCBfX2ttcF9sb2NrX3Bvb2w7CisKK3N0cnVjdCBrbXBfYmxvY2tfb2ZfbG9ja3MgeworICAgIHN0cnVjdCBrbXBfYmxvY2tfb2ZfbG9ja3MgKiBuZXh0X2Jsb2NrOworICAgIHZvaWQgKiAgICAgICAgICAgICAgICAgICAgICBsb2NrczsKK307CisKK3R5cGVkZWYgc3RydWN0IGttcF9ibG9ja19vZl9sb2NrcyBrbXBfYmxvY2tfb2ZfbG9ja3NfdDsKKworZXh0ZXJuIGttcF9ibG9ja19vZl9sb2Nrc190ICpfX2ttcF9sb2NrX2Jsb2NrczsKK2V4dGVybiBpbnQgX19rbXBfbnVtX2xvY2tzX2luX2Jsb2NrOworCitleHRlcm4ga21wX3VzZXJfbG9ja19wIF9fa21wX3VzZXJfbG9ja19hbGxvY2F0ZSggdm9pZCAqKnVzZXJfbG9jaywga21wX2ludDMyIGd0aWQsIGttcF9sb2NrX2ZsYWdzX3QgZmxhZ3MgKTsKK2V4dGVybiB2b2lkIF9fa21wX3VzZXJfbG9ja19mcmVlKCB2b2lkICoqdXNlcl9sb2NrLCBrbXBfaW50MzIgZ3RpZCwga21wX3VzZXJfbG9ja19wIGxjayApOworZXh0ZXJuIGttcF91c2VyX2xvY2tfcCBfX2ttcF9sb29rdXBfdXNlcl9sb2NrKCB2b2lkICoqdXNlcl9sb2NrLCBjaGFyIGNvbnN0ICpmdW5jICk7CitleHRlcm4gdm9pZCBfX2ttcF9jbGVhbnVwX3VzZXJfbG9ja3MoKTsKKworI2RlZmluZSBLTVBfQ0hFQ0tfVVNFUl9MT0NLX0lOSVQoKSBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoICEgVENSXzQoIF9fa21wX2luaXRfdXNlcl9sb2NrcyApICkgeyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKCAhIFRDUl80KCBfX2ttcF9pbml0X3VzZXJfbG9ja3MgKSApIHsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIFRDV180KCBfX2ttcF9pbml0X3VzZXJfbG9ja3MsIFRSVUUgKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0KKworI3VuZGVmIEtNUF9QQUQKKyN1bmRlZiBLTVBfR1RJRF9ETkUKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8vIGV4dGVybiAiQyIKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisjZW5kaWYgLyogS01QX0xPQ0tfSCAqLworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfb21wLmggYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfb21wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY3ZGJjOQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9vbXAuaApAQCAtMCwwICsxLDIwMiBAQAorLyoKKyAqIGttcF9vbXAuaCAtLSBPcGVuTVAgZGVmaW5pdGlvbiBmb3Iga21wX29tcF9zdHJ1Y3RfaW5mb190LgorICogICAgICAgICAgICAgIFRoaXMgaXMgZm9yIGluZm9ybWF0aW9uIGFib3V0IHJ1bnRpbWUgbGlicmFyeSBzdHJ1Y3R1cmVzLgorICogJFJldmlzaW9uOiA0MjEwNSAkCisgKiAkRGF0ZTogMjAxMy0wMy0xMSAxNDo1MTozNCAtMDUwMCAoTW9uLCAxMSBNYXIgMjAxMykgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvKiBUSElTIEZJTEUgU0hPVUxEIE5PVCBCRSBNT0RJRklFRCBJTiBJREIgSU5URVJGQUNFIExJQlJBUlkgQ09ERQorICogSXQgc2hvdWxkIGluc3RlYWQgYmUgbW9kaWZpZWQgaW4gdGhlIE9wZW5NUCBydW50aW1lIGFuZCBjb3BpZWQKKyAqIHRvIHRoZSBpbnRlcmZhY2UgbGlicmFyeSBjb2RlLiAgVGhpcyB3YXkgd2UgY2FuIG1pbmltaXplIHRoZQorICogcHJvYmxlbXMgdGhhdCB0aGlzIGlzIHN1cmUgdG8gY2F1c2UgaGF2aW5nIHR3byBjb3BpZXMgb2YgdGhlCisgKiBzYW1lIGZpbGUuCisgKgorICogZmlsZXMgbGl2ZSBpbiBsaWJvbXAgYW5kIGxpYm9tcF9kYi9zcmMvaW5jbHVkZQorICovCisKKy8qIENIQU5HRSBUSElTIFdIRU4gU1RSVUNUVVJFUyBCRUxPVyBDSEFOR0UKKyAqIEJlZm9yZSB3ZSByZWxlYXNlIHRoaXMgdG8gYSBjdXN0b21lciwgcGxlYXNlIGRvbid0IGNoYW5nZSB0aGlzIHZhbHVlLiAgQWZ0ZXIgaXQgaXMgcmVsZWFzZWQgYW5kCisgKiBzdGFibGUsIHRoZW4gYW55IG5ldyB1cGRhdGVzIHRvIHRoZSBzdHJ1Y3R1cmVzIG9yIGRhdGEgc3RydWN0dXJlIHRyYXZlcnNhbCBhbGdvcml0aG1zIG5lZWQgdG8KKyAqIGNoYW5nZSB0aGlzIHZhbHVlLgorICovCisjZGVmaW5lIEtNUF9PTVBfVkVSU0lPTiA4CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBrbXBfaW50MzIgIG9mZnNldDsKKyAgICBrbXBfaW50MzIgIHNpemU7Cit9IG9mZnNldF9hbmRfc2l6ZV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAga21wX3VpbnQ2NCAgICBhZGRyOworICAgIGttcF9pbnQzMiAgICAgc2l6ZTsKKyAgICBrbXBfaW50MzIgICAgIHBhZGRpbmc7Cit9IGFkZHJfYW5kX3NpemVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGttcF91aW50NjQgICBmbGFnczsgICAgICAgICAvLyBGbGFncyBmb3IgZnV0dXJlIGV4dGVuc2lvbnMuCisgICAga21wX3VpbnQ2NCAgIGZpbGU7ICAgICAgICAgIC8vIFBvaW50ZXIgdG8gbmFtZSBvZiBzb3VyY2UgZmlsZSB3aGVyZSB0aGUgcGFyYWxsZWwgcmVnaW9uIGlzLgorICAgIGttcF91aW50NjQgICBmdW5jOyAgICAgICAgICAvLyBQb2ludGVyIHRvIG5hbWUgb2Ygcm91dGluZSB3aGVyZSB0aGUgcGFyYWxsZWwgcmVnaW9uIGlzLgorICAgIGttcF9pbnQzMiAgICBiZWdpbjsgICAgICAgICAvLyBCZWdpbm5pbmcgb2Ygc291cmNlIGxpbmUgcmFuZ2UuCisgICAga21wX2ludDMyICAgIGVuZDsgICAgICAgICAgIC8vIEVuZCBvZiBzb3VyY2UgbGluZSByYW5nZS4KKyAgICBrbXBfaW50MzIgICAgbnVtX3RocmVhZHM7ICAgLy8gU3BlY2lmaWVkIG51bWJlciBvZiB0aHJlYWRzLgorfSBrbXBfb21wX250aHJfaXRlbV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAga21wX2ludDMyICAgICBudW07ICAgICAgICAgIC8vIE51bWJlciBvZiBpdGVtcyBpbiB0aGUgYXJycmF5LgorICAgIGttcF91aW50NjQgICAgYXJyYXk7ICAgICAgICAvLyBBZGRyZXNzIG9mIGFycmF5IG9mIGttcF9vbXBfbnVtX3RocmVhZHNfaXRlbV90LgorfSBrbXBfb21wX250aHJfaW5mb190OworCisKKy8qIFRoaXMgc3RydWN0dXJlIGlzIGtub3duIHRvIHRoZSBpZGIgaW50ZXJmYWNlIGxpYnJhcnkgKi8KK3R5cGVkZWYgc3RydWN0IHsKKworICAgIC8qIENoYW5nZSB0aGlzIG9ubHkgaWYgeW91IG1ha2UgYSBmdW5kYW1lbnRhbCBkYXRhIHN0cnVjdHVyZSBjaGFuZ2UgaGVyZSAqLworICAgIGttcF9pbnQzMiAgICAgICAgICBsaWJfdmVyc2lvbjsKKworICAgIC8qIHNhbml0eSBjaGVjay4gIE9ubHkgc2hvdWxkIGJlIGNoZWNrZWQgaWYgdmVyc2lvbnMgYXJlIGlkZW50aWNhbAorICAgICAqIFRoaXMgaXMgYWxzbyB1c2VkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHRvIGdldCB0aGUgcnVudGltZQorICAgICAqIHN0cnVjdHVyZSBzaXplIGlmIGl0IHRoZSBydW50aW1lIGlzIG9sZGVyIHRoYW4gdGhlIGludGVyZmFjZSAqLworICAgIGttcF9pbnQzMiAgICAgICAgICBzaXplb2ZfdGhpc19zdHJ1Y3R1cmU7CisKKyAgICAvKiBPcGVuTVAgUlRMIHZlcnNpb24gaW5mby4gKi8KKyAgICBhZGRyX2FuZF9zaXplX3QgICAgbWFqb3I7CisgICAgYWRkcl9hbmRfc2l6ZV90ICAgIG1pbm9yOworICAgIGFkZHJfYW5kX3NpemVfdCAgICBidWlsZDsKKyAgICBhZGRyX2FuZF9zaXplX3QgICAgYmFubmVyOworCisgICAgLyogVmFyaW91cyBnbG9iYWxzLiAqLworICAgIGFkZHJfYW5kX3NpemVfdCAgdGhyZWFkczsgICAgICAgICAgICAvLyBQb2ludGVyIHRvIF9fa21wX3RocmVhZHMuCisgICAgYWRkcl9hbmRfc2l6ZV90ICByb290czsgICAgICAgICAgICAgIC8vIFBvaW50ZXIgdG8gX19rbXBfcm9vdC4KKyAgICBhZGRyX2FuZF9zaXplX3QgIGNhcGFjaXR5OyAgICAgICAgICAgLy8gUG9pbnRlciB0byBfX2ttcF90aHJlYWRzX2NhcGFjaXR5LgorICAgIGFkZHJfYW5kX3NpemVfdCAgbW9uaXRvcjsgICAgICAgICAgICAvLyBQb2ludGVyIHRvIF9fa21wX21vbml0b3IuCisgICAgYWRkcl9hbmRfc2l6ZV90ICBsb2NrX3RhYmxlOyAgICAgICAgIC8vIFBvaW50ZXIgdG8gX19rbXBfbG9ja190YWJsZS4KKyAgICBhZGRyX2FuZF9zaXplX3QgIGZ1bmNfbWljcm90YXNrOworICAgIGFkZHJfYW5kX3NpemVfdCAgZnVuY19mb3JrOworICAgIGFkZHJfYW5kX3NpemVfdCAgdGVhbV9jb3VudGVyOworICAgIGFkZHJfYW5kX3NpemVfdCAgdGFza19jb3VudGVyOworICAgIGFkZHJfYW5kX3NpemVfdCAgbnRocl9pbmZvOworICAgIGttcF9pbnQzMiAgICAgICAgYWRkcmVzc193aWR0aDsKKyAgICBrbXBfaW50MzIgICAgICAgIGluZGV4ZWRfbG9ja3M7CisgICAga21wX2ludDMyICAgICAgICBsYXN0X2JhcnJpZXI7CisgICAga21wX2ludDMyICAgICAgICBkZXF1ZV9zaXplOworCisgICAgLyogdGhyZWFkIHN0cnVjdHVyZSBpbmZvcm1hdGlvbi4gKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgdGhfc2l6ZW9mX3N0cnVjdDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGhfaW5mbzsgICAgICAgICAgLy8gZGVzY3JpcHRvciBmb3IgdGhyZWFkCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRoX3RlYW07ICAgICAgICAgIC8vIHRlYW0gZm9yIHRoaXMgdGhyZWFkCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRoX3Jvb3Q7ICAgICAgICAgIC8vIHJvb3QgZm9yIHRoaXMgdGhyZWFkCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRoX3NlcmlhbF90ZWFtOyAgIC8vIHNlcmlhbCB0ZWFtIHVuZGVyIHRoaXMgdGhyZWFkCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRoX2lkZW50OyAgICAgICAgIC8vIGxvY2F0aW9uIGZvciB0aGlzIHRocmVhZCAoaWYgYXZhaWxhYmxlKQorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0aF9zcGluX2hlcmU7ICAgICAvLyBpcyB0aHJlYWQgd2FpdGluZyBmb3IgbG9jayAoaWYgYXZhaWxhYmxlKQorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0aF9uZXh0X3dhaXRpbmc7ICAvLyBuZXh0IHRocmVhZCB3YWl0aW5nIGZvciBsb2NrIChpZiBhdmFpbGFibGUpCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRoX3Rhc2tfdGVhbTsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGhfY3VycmVudF90YXNrOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0aF90YXNrX3N0YXRlOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0aF9iYXI7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRoX2Jfd29ya2VyX2Fycml2ZWQ7CisKKyAgICAvKiBrbXBfZGVzYyBzdHJ1Y3R1cmUgKGZvciBpbmZvIGZpZWxkIGFib3ZlKSAqLworICAgIGttcF9pbnQzMiAgICAgICAgICBkc19zaXplb2Zfc3RydWN0OworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBkc190aWQ7ICAgICAgICAgICAvLyB0ZWFtIHRocmVhZCBpZAorICAgIG9mZnNldF9hbmRfc2l6ZV90ICBkc19ndGlkOyAgICAgICAgICAvLyBnbG9iYWwgdGhyZWFkIGlkCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGRzX3RocmVhZDsgICAgICAgIC8vIG5hdGl2ZSB0aHJlYWQgaWQKKworICAgIC8qIHRlYW0gc3RydWN0dXJlIGluZm9ybWF0aW9uICovCisgICAga21wX2ludDMyICAgICAgICAgIHRfc2l6ZW9mX3N0cnVjdDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdF9tYXN0ZXJfdGlkOyAgICAgLy8gdGlkIG9mIG1hc3RlciBpbiBwYXJlbnQgdGVhbQorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0X2lkZW50OyAgICAgICAgICAvLyBsb2NhdGlvbiBvZiBwYXJhbGxlbCByZWdpb24KKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdF9wYXJlbnQ7ICAgICAgICAgLy8gcGFyZW50IHRlYW0KKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdF9ucHJvYzsgICAgICAgICAgLy8gIyB0ZWFtIHRocmVhZHMKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdF90aHJlYWRzOyAgICAgICAgLy8gYXJyYXkgb2YgdGhyZWFkcworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0X3NlcmlhbGl6ZWQ7ICAgICAvLyAjIGxldmVscyBvZiBzZXJpYWxpemVkIHRlYW1zCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRfaWQ7ICAgICAgICAgICAgIC8vIHVuaXF1ZSB0ZWFtIGlkCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRfcGtmbjsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdF90YXNrX3RlYW07CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRfaW1wbGljaXRfdGFzazsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdF9iYXI7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRfYl9tYXN0ZXJfYXJyaXZlZDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdF9iX3RlYW1fYXJyaXZlZDsKKworICAgIC8qIHJvb3Qgc3RydWN0dXJlIGluZm9ybWF0aW9uICovCisgICAga21wX2ludDMyICAgICAgICAgIHJfc2l6ZW9mX3N0cnVjdDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgcl9yb290X3RlYW07ICAgICAgLy8gdGVhbSBhdCByb290CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHJfaG90X3RlYW07ICAgICAgIC8vIGhvdCB0ZWFtIGZvciB0aGlzIHJvb3QKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgcl91YmVyX3RocmVhZDsgICAgLy8gcm9vdCB0aHJlYWQKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgcl9yb290X2lkOyAgICAgICAgLy8gdW5pcXVlIHJvb3QgaWQgKGlmIGF2YWlsYWJsZSkKKworICAgIC8qIGlkZW50IHN0cnVjdHVyZSBpbmZvcm1hdGlvbiAqLworICAgIGttcF9pbnQzMiAgICAgICAgICBpZF9zaXplb2Zfc3RydWN0OworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBpZF9wc291cmNlOyAgICAgICAvKiBhZGRyZXNzIG9mIHN0cmluZyAiO2ZpbGU7ZnVuYztsaW5lMTtsaW5lMjs7Ii4gKi8KKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgaWRfZmxhZ3M7CisKKyAgICAvKiBsb2NrIHN0cnVjdHVyZSBpbmZvcm1hdGlvbiAqLworICAgIGttcF9pbnQzMiAgICAgICAgICBsa19zaXplb2Zfc3RydWN0OworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBsa19pbml0aWFsaXplZDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgbGtfbG9jYXRpb247CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGxrX3RhaWxfaWQ7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGxrX2hlYWRfaWQ7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGxrX25leHRfdGlja2V0OworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBsa19ub3dfc2VydmluZzsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgbGtfb3duZXJfaWQ7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGxrX2RlcHRoX2xvY2tlZDsKKworICAgIC8qIGxvY2tfdGFibGVfdCAqLworICAgIGttcF9pbnQzMiAgICAgICAgICBsdF9zaXplX29mX3N0cnVjdDsgICAgLyogU2l6ZSBhbmQgbGF5b3V0IG9mIGttcF9sb2NrX3RhYmxlX3QuICovCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGx0X3VzZWQ7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGx0X2FsbG9jYXRlZDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgbHRfdGFibGU7CisKKyAgICAvKiB0YXNrX3RlYW1fdCAqLworICAgIGttcF9pbnQzMiAgICAgICAgICB0dF9zaXplb2Zfc3RydWN0OworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0dF90aHJlYWRzX2RhdGE7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHR0X2ZvdW5kX3Rhc2tzOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0dF9ucHJvYzsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdHRfdW5maW5pc2hlZF90aHJlYWRzOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0dF9hY3RpdmU7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHR0X3N0YXRlOworCisgICAgLyoga21wX3Rhc2tkYXRhX3QgKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgdGRfc2l6ZW9mX3N0cnVjdDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGRfdGFza19pZDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGRfZmxhZ3M7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRkX3RlYW07CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRkX3BhcmVudDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGRfaWRlbnQ7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRkX2FsbG9jYXRlZF9jaGlsZF90YXNrczsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGRfaW5jb21wbGV0ZV9jaGlsZF90YXNrczsKKworICAgIC8qIGttcF90aHJlYWRfZGF0YV90ICovCisgICAga21wX2ludDMyICAgICAgICAgIGhkX3NpemVvZl9zdHJ1Y3Q7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGhkX2RlcXVlOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBoZF9kZXF1ZV9oZWFkOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBoZF9kZXF1ZV90YWlsOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBoZF9kZXF1ZV9udGFza3M7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGhkX2RlcXVlX2xhc3Rfc3RvbGVuOworCisgICAgLy8gVGhlIGxhc3QgZmllbGQgb2Ygc3RhYmxlIHZlcnNpb24uCisgICAga21wX3VpbnQ2NCAgICAgICAgIGxhc3RfZmllbGQ7CisgICAgLy8gRXh0ZW5zaW9ucy4gCisgICAgLy8gV2hlbiBLTVBfT01QX1ZFUlNJT04gaXMgYnVtcGVkLCBtb3ZlIHRoZXNlIGZpZWxkcyB1cCB0byBhcHByb3ByaWF0ZSBsb2NhdGlvbiwKKyAgICAvLyB0byBsZXQgbGFzdF9maWVsZCBiZSBhY3R1YWxseSBsYXN0LgorICAgIGFkZHJfYW5kX3NpemVfdCAgICBvcGVubXBfdmVyc2lvbjsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGRfdGFza3dhaXRfaWRlbnQ7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRkX3Rhc2t3YWl0X2NvdW50ZXI7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRkX3Rhc2t3YWl0X3RocmVhZDsKKworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBsa19sb2NrX2ZsYWdzOworCit9IGttcF9vbXBfc3RydWN0X2luZm9fdDsKKworCisvKiBlbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX29zLmggYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODlmOGY3Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX29zLmgKQEAgLTAsMCArMSw4MjMgQEAKKy8qCisgKiBrbXBfb3MuaCAtLSBLUFRTIHJ1bnRpbWUgaGVhZGVyIGZpbGUuCisgKiAkUmV2aXNpb246IDQyODIwICQKKyAqICREYXRlOiAyMDEzLTExLTEzIDE2OjUzOjQ0IC0wNjAwIChXZWQsIDEzIE5vdiAyMDEzKSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX09TX0gKKyNkZWZpbmUgS01QX09TX0gKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjZGVmaW5lIEtNUF9GVE5fUExBSU4gICAxCisjZGVmaW5lIEtNUF9GVE5fQVBQRU5EICAyCisjZGVmaW5lIEtNUF9GVE5fVVBQRVIgICAzCisvKgorI2RlZmluZSBLTVBfRlROX1BSRVBFTkQgNAorI2RlZmluZSBLTVBfRlROX1VBUFBFTkQgNQorKi8KKworI2RlZmluZSBLTVBfUFRSX1NLSVAgICAgKHNpemVvZih2b2lkKikpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbXBpbGVyIHZhcmlhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgS01QX09GRgkJCQkwCisjZGVmaW5lIEtNUF9PTgkJCQkxCisKKyNkZWZpbmUgS01QX01FTV9DT05TX1ZPTEFUSUxFCQkwCisjZGVmaW5lIEtNUF9NRU1fQ09OU19GRU5DRQkJMQorCisjaWZuZGVmIEtNUF9NRU1fQ09OU19NT0RFTAorIyBkZWZpbmUgS01QX01FTV9DT05TX01PREVMCSBLTVBfTUVNX0NPTlNfVk9MQVRJTEUKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbXBpbGVyIHJlY29nbml0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgS01QX0NPTVBJTEVSX0lDQyAwCisjZGVmaW5lIEtNUF9DT01QSUxFUl9HQ0MgMAorI2RlZmluZSBLTVBfQ09NUElMRVJfQ0xBTkcgMAorI2RlZmluZSBLTVBfQ09NUElMRVJfTVNWQyAwCisKKyNpZiBkZWZpbmVkKCBfX0lOVEVMX0NPTVBJTEVSICkKKyMgdW5kZWYgS01QX0NPTVBJTEVSX0lDQworIyBkZWZpbmUgS01QX0NPTVBJTEVSX0lDQyAxCisjZWxpZiBkZWZpbmVkKCBfX2NsYW5nX18gKQorIyB1bmRlZiBLTVBfQ09NUElMRVJfQ0xBTkcKKyMgZGVmaW5lIEtNUF9DT01QSUxFUl9DTEFORyAxCisjZWxpZiBkZWZpbmVkKCBfX0dOVUNfXyApCisjIHVuZGVmIEtNUF9DT01QSUxFUl9HQ0MKKyMgZGVmaW5lIEtNUF9DT01QSUxFUl9HQ0MgMQorI2VsaWYgZGVmaW5lZCggX01TQ19WRVIgKQorIyB1bmRlZiBLTVBfQ09NUElMRVJfTVNWQworIyBkZWZpbmUgS01QX0NPTVBJTEVSX01TVkMgMQorI2Vsc2UKKyMgZXJyb3IgVW5rbm93biBjb21waWxlcgorI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gT3BlcmF0aW5nIHN5c3RlbSByZWNvZ25pdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgS01QX09TX0xJTlVYICAgIDAKKyNkZWZpbmUgS01QX09TX0ZSRUVCU0QgIDAKKyNkZWZpbmUgS01QX09TX0RBUldJTiAgIDAKKyNkZWZpbmUgS01QX09TX1dJTkRPV1MgICAgMAorI2RlZmluZSBLTVBfT1NfQ05LICAgICAgMAorI2RlZmluZSBLTVBfT1NfVU5JWCAgICAgMCAgLyogZGlzanVuY3Rpb24gb2YgS01QX09TX0xJTlVYLCBLTVBfT1NfREFSV0lOIGV0Yy4gKi8KKworI2RlZmluZSBLTVBfQVJDSF9YODYgICAgICAgIDAKKyNkZWZpbmUgS01QX0FSQ0hfWDg2XzY0CSAgICAwCisjZGVmaW5lIEtNUF9BUkNIX1BQQzY0ICAgICAgMAorCisjaWZkZWYgX1dJTjMyCisjIHVuZGVmIEtNUF9PU19XSU5ET1dTCisjIGRlZmluZSBLTVBfT1NfV0lORE9XUyAxCisjZW5kaWYKKworI2lmICggZGVmaW5lZCBfX0FQUExFX18gJiYgZGVmaW5lZCBfX01BQ0hfXyApCisjIHVuZGVmIEtNUF9PU19EQVJXSU4KKyMgZGVmaW5lIEtNUF9PU19EQVJXSU4gMQorI2VuZGlmCisKKy8vIGluIHNvbWUgcHBjNjQgbGludXggaW5zdGFsbGF0aW9ucywgb25seSB0aGUgc2Vjb25kIGNvbmRpdGlvbiBpcyBtZXQKKyNpZiAoIGRlZmluZWQgX19saW51eCApCisjIHVuZGVmIEtNUF9PU19MSU5VWAorIyBkZWZpbmUgS01QX09TX0xJTlVYIDEKKyNlbGlmICggZGVmaW5lZCBfX2xpbnV4X18pCisjIHVuZGVmIEtNUF9PU19MSU5VWAorIyBkZWZpbmUgS01QX09TX0xJTlVYIDEKKyNlbHNlCisjZW5kaWYKKworI2lmICggZGVmaW5lZCBfX0ZyZWVCU0RfXyApCisjIHVuZGVmIEtNUF9PU19GUkVFQlNECisjIGRlZmluZSBLTVBfT1NfRlJFRUJTRCAxCisjZW5kaWYKKworI2lmICggZGVmaW5lZCBfX2JncV9fICkKKyMgdW5kZWYgS01QX09TX0NOSworIyBkZWZpbmUgS01QX09TX0NOSyAxCisjZW5kaWYKKworI2lmICgxICE9IEtNUF9PU19MSU5VWCArIEtNUF9PU19GUkVFQlNEICsgS01QX09TX0RBUldJTiArIEtNUF9PU19XSU5ET1dTKQorIyBlcnJvciBVbmtub3duIE9TCisjZW5kaWYKKworI2lmIEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfRlJFRUJTRCB8fCBLTVBfT1NfREFSV0lOCisjIHVuZGVmIEtNUF9PU19VTklYCisjIGRlZmluZSBLTVBfT1NfVU5JWCAxCisjZW5kaWYKKworI2lmIEtNUF9PU19XSU5ET1dTCisjIGlmIGRlZmluZWQgX01fQU1ENjQKKyMgIHVuZGVmIEtNUF9BUkNIX1g4Nl82NAorIyAgZGVmaW5lIEtNUF9BUkNIX1g4Nl82NCAxCisjIGVsc2UKKyMgIHVuZGVmIEtNUF9BUkNIX1g4NgorIyAgZGVmaW5lIEtNUF9BUkNIX1g4NiAxCisjIGVuZGlmCisjZW5kaWYKKworI2lmIEtNUF9PU19VTklYCisjIGlmIGRlZmluZWQgX194ODZfNjQKKyMgIHVuZGVmIEtNUF9BUkNIX1g4Nl82NAorIyAgZGVmaW5lIEtNUF9BUkNIX1g4Nl82NCAxCisjIGVsaWYgZGVmaW5lZCBfX2kzODYKKyMgIHVuZGVmIEtNUF9BUkNIX1g4NgorIyAgZGVmaW5lIEtNUF9BUkNIX1g4NiAxCisjIGVsaWYgZGVmaW5lZCBfX3Bvd2VycGM2NF9fCisjICB1bmRlZiBLTVBfQVJDSF9QUEM2NAorIyAgZGVmaW5lIEtNUF9BUkNIX1BQQzY0IDEKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0FSTV9BUkNIXzdfXykgICB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfN1JfXykgIHx8IFwKKyAgICBkZWZpbmVkKF9fQVJNX0FSQ0hfN0FfXykKKyMgZGVmaW5lIEtNUF9BUkNIX0FSTVY3IDEKKyNlbmRpZgorCisjaWYgZGVmaW5lZChLTVBfQVJDSF9BUk1WNykgICB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNl9fKSAgIHx8IFwKKyAgICBkZWZpbmVkKF9fQVJNX0FSQ0hfNkpfXykgIHx8IGRlZmluZWQoX19BUk1fQVJDSF82S19fKSAgfHwgXAorICAgIGRlZmluZWQoX19BUk1fQVJDSF82Wl9fKSAgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzZUMl9fKSB8fCBcCisgICAgZGVmaW5lZChfX0FSTV9BUkNIXzZaS19fKQorIyBkZWZpbmUgS01QX0FSQ0hfQVJNVjYgMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEtNUF9BUkNIX0FSTVY2KSAgIHx8IGRlZmluZWQoX19BUk1fQVJDSF81VF9fKSAgfHwgXAorICAgIGRlZmluZWQoX19BUk1fQVJDSF81RV9fKSAgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzVURV9fKSB8fCBcCisgICAgZGVmaW5lZChfX0FSTV9BUkNIXzVURUpfXykKKyMgZGVmaW5lIEtNUF9BUkNIX0FSTVY1IDEKKyNlbmRpZgorCisjaWYgZGVmaW5lZChLTVBfQVJDSF9BUk1WNSkgICB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNF9fKSAgIHx8IFwKKyAgICBkZWZpbmVkKF9fQVJNX0FSQ0hfNFRfXykKKyMgZGVmaW5lIEtNUF9BUkNIX0FSTVY0IDEKKyNlbmRpZgorCisjaWYgZGVmaW5lZChLTVBfQVJDSF9BUk1WNCkgICB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfM19fKSAgIHx8IFwKKyAgICBkZWZpbmVkKF9fQVJNX0FSQ0hfM01fXykKKyMgZGVmaW5lIEtNUF9BUkNIX0FSTVYzIDEKKyNlbmRpZgorCisjaWYgZGVmaW5lZChLTVBfQVJDSF9BUk1WMykgICB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfMl9fKQorIyBkZWZpbmUgS01QX0FSQ0hfQVJNVjIgMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEtNUF9BUkNIX0FSTVYyKQorIyBkZWZpbmUgS01QX0FSQ0hfQVJNIDEKKyNlbmRpZgorCisjaWYgKDEgIT0gS01QX0FSQ0hfWDg2ICsgS01QX0FSQ0hfWDg2XzY0ICsgS01QX0FSQ0hfQVJNICsgS01QX0FSQ0hfUFBDNjQpCisjIGVycm9yIFVua25vd24gb3IgdW5zdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlCisjZW5kaWYKKworLyogQ2hlY2sgZm9yIHF1YWQtcHJlY2lzaW9uIGV4dGVuc2lvbi4gKi8KKyNkZWZpbmUgS01QX0hBVkVfUVVBRCAwCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorIyBpZiBLTVBfQ09NUElMRVJfSUNDCisgICAvKiBfUXVhZCBpcyBhbHJlYWR5IGRlZmluZWQgZm9yIGljYyAqLworIyAgdW5kZWYgIEtNUF9IQVZFX1FVQUQKKyMgIGRlZmluZSBLTVBfSEFWRV9RVUFEIDEKKyMgZWxpZiBLTVBfQ09NUElMRVJfQ0xBTkcKKyAgIC8qIENsYW5nIGRvZXNuJ3Qgc3VwcG9ydCBhIHNvZnR3YXJlLWltcGxlbWVudGVkCisgICAgICAxMjgtYml0IGV4dGVuZGVkIHByZWNpc2lvbiB0eXBlIHlldCAqLworICAgdHlwZWRlZiBsb25nIGRvdWJsZSBfUXVhZDsKKyMgZWxpZiBLTVBfQ09NUElMRVJfR0NDCisgICB0eXBlZGVmIF9fZmxvYXQxMjggX1F1YWQ7CisjICB1bmRlZiAgS01QX0hBVkVfUVVBRAorIyAgZGVmaW5lIEtNUF9IQVZFX1FVQUQgMQorIyBlbGlmIEtNUF9DT01QSUxFUl9NU1ZDCisgICB0eXBlZGVmIGxvbmcgZG91YmxlIF9RdWFkOworIyBlbmRpZgorI2Vsc2UKKyMgaWYgX19MREJMX01BWF9FWFBfXyA+PSAxNjM4NCAmJiBLTVBfQ09NUElMRVJfR0NDCisgICB0eXBlZGVmIGxvbmcgZG91YmxlIF9RdWFkOworIyAgdW5kZWYgIEtNUF9IQVZFX1FVQUQKKyMgIGRlZmluZSBLTVBfSEFWRV9RVUFEIDEKKyMgZW5kaWYKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKyNpZiBLTVBfT1NfV0lORE9XUworICB0eXBlZGVmIGNoYXIgICAgICAgICAgICAgIGttcF9pbnQ4OworICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAgIGttcF91aW50ODsKKyAgdHlwZWRlZiBzaG9ydCAgICAgICAgICAgICBrbXBfaW50MTY7CisgIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAga21wX3VpbnQxNjsKKyAgdHlwZWRlZiBpbnQgICAgICAgICAgICAgICBrbXBfaW50MzI7CisgIHR5cGVkZWYgdW5zaWduZWQgaW50ICAgICAga21wX3VpbnQzMjsKKyMgZGVmaW5lIEtNUF9JTlQzMl9TUEVDICAgICAiZCIKKyMgZGVmaW5lIEtNUF9VSU5UMzJfU1BFQyAgICAidSIKKyMgaWZuZGVmIEtNUF9TVFJVQ1Q2NAorICAgdHlwZWRlZiBfX2ludDY0IAkJa21wX2ludDY0OworICAgdHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IAlrbXBfdWludDY0OworICAgI2RlZmluZSBLTVBfSU5UNjRfU1BFQyAJIkk2NGQiCisgICAjZGVmaW5lIEtNUF9VSU5UNjRfU1BFQwkiSTY0dSIKKyMgZWxzZQorICAgc3RydWN0IGttcF9zdHJ1Y3Q2NCB7CisgICAga21wX2ludDMyICAgYSxiOworICAgfTsKKyAgIHR5cGVkZWYgc3RydWN0IGttcF9zdHJ1Y3Q2NCBrbXBfaW50NjQ7CisgICB0eXBlZGVmIHN0cnVjdCBrbXBfc3RydWN0NjQga21wX3VpbnQ2NDsKKyAgIC8qIE5vdCBzdXJlIHdoYXQgdG8gdXNlIGZvciBLTVBfW1VdSU5UNjRfU1BFQyBoZXJlICovCisjIGVuZGlmCisjIGlmIEtNUF9BUkNIX1g4Nl82NAorIyAgZGVmaW5lIEtNUF9JTlRQVFIgMQorICAgdHlwZWRlZiBfX2ludDY0ICAgICAgICAgCWttcF9pbnRwdHJfdDsKKyAgIHR5cGVkZWYgdW5zaWduZWQgX19pbnQ2NAlrbXBfdWludHB0cl90OworIyAgZGVmaW5lIEtNUF9JTlRQVFJfU1BFQyAgCSJJNjRkIgorIyAgZGVmaW5lIEtNUF9VSU5UUFRSX1NQRUMgCSJJNjR1IgorIyBlbmRpZgorI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCisKKyNpZiBLTVBfT1NfVU5JWAorICB0eXBlZGVmIGNoYXIgICAgICAgICAgICAgICBrbXBfaW50ODsKKyAgdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgICAga21wX3VpbnQ4OworICB0eXBlZGVmIHNob3J0ICAgICAgICAgICAgICBrbXBfaW50MTY7CisgIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAgIGttcF91aW50MTY7CisgIHR5cGVkZWYgaW50ICAgICAgICAgICAgICAgIGttcF9pbnQzMjsKKyAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAga21wX3VpbnQzMjsKKyAgdHlwZWRlZiBsb25nIGxvbmcgICAgICAgICAga21wX2ludDY0OworICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBrbXBfdWludDY0OworIyBkZWZpbmUgS01QX0lOVDMyX1NQRUMgICAgICAiZCIKKyMgZGVmaW5lIEtNUF9VSU5UMzJfU1BFQyAgICAgInUiCisjIGRlZmluZSBLTVBfSU5UNjRfU1BFQwkgICAgICJsbGQiCisjIGRlZmluZSBLTVBfVUlOVDY0X1NQRUMgICAgICJsbHUiCisjZW5kaWYgLyogS01QX09TX1VOSVggKi8KKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9BUk0KKyMgZGVmaW5lIEtNUF9TSVpFX1RfU1BFQyBLTVBfVUlOVDMyX1NQRUMKKyNlbGlmIEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9QUEM2NAorIyBkZWZpbmUgS01QX1NJWkVfVF9TUEVDIEtNUF9VSU5UNjRfU1BFQworI2Vsc2UKKyMgZXJyb3IgIkNhbid0IGRldGVybWluZSBzaXplX3QgcHJpbnRmIGZvcm1hdCBzcGVjaWZpZXIuIgorI2VuZGlmCisKKyNpZiBLTVBfQVJDSF9YODYKKyMgZGVmaW5lIEtNUF9TSVpFX1RfTUFYICgweEZGRkZGRkZGKQorI2Vsc2UKKyMgZGVmaW5lIEtNUF9TSVpFX1RfTUFYICgweEZGRkZGRkZGRkZGRkZGRkYpCisjZW5kaWYKKwordHlwZWRlZiBzaXplX3QgIGttcF9zaXplX3Q7Cit0eXBlZGVmIGZsb2F0ICAga21wX3JlYWwzMjsKK3R5cGVkZWYgZG91YmxlICBrbXBfcmVhbDY0OworCisjaWZuZGVmIEtNUF9JTlRQVFIKKyMgZGVmaW5lIEtNUF9JTlRQVFIgMQorICB0eXBlZGVmIGxvbmcgICAgICAgICAgICAga21wX2ludHB0cl90OworICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgICAga21wX3VpbnRwdHJfdDsKKyMgZGVmaW5lIEtNUF9JTlRQVFJfU1BFQyAgICJsZCIKKyMgZGVmaW5lIEtNUF9VSU5UUFRSX1NQRUMgICJsdSIKKyNlbmRpZgorCisjaWZkZWYgS01QX0k4CisgIHR5cGVkZWYga21wX2ludDY0ICAgICAga21wX2ludDsKKyAgdHlwZWRlZiBrbXBfdWludDY0ICAgICBrbXBfdWludDsKKyMgZGVmaW5lICBLTVBfSU5UX1NQRUMJIEtNUF9JTlQ2NF9TUEVDCisjIGRlZmluZSAgS01QX1VJTlRfU1BFQwkgS01QX1VJTlQ2NF9TUEVDCisjIGRlZmluZSAgS01QX0lOVF9NQVggICAgKChrbXBfaW50NjQpMHg3RkZGRkZGRkZGRkZGRkZGTEwpCisjIGRlZmluZSAgS01QX0lOVF9NSU4gICAgKChrbXBfaW50NjQpMHg4MDAwMDAwMDAwMDAwMDAwTEwpCisjZWxzZQorICB0eXBlZGVmIGttcF9pbnQzMiAgICAgIGttcF9pbnQ7CisgIHR5cGVkZWYga21wX3VpbnQzMiAgICAga21wX3VpbnQ7CisjIGRlZmluZSAgS01QX0lOVF9TUEVDCSBLTVBfSU5UMzJfU1BFQworIyBkZWZpbmUgIEtNUF9VSU5UX1NQRUMJIEtNUF9VSU5UMzJfU1BFQworIyBkZWZpbmUgIEtNUF9JTlRfTUFYICAgICgoa21wX2ludDMyKTB4N0ZGRkZGRkYpCisjIGRlZmluZSAgS01QX0lOVF9NSU4gICAgKChrbXBfaW50MzIpMHg4MDAwMDAwMCkKKyNlbmRpZiAvKiBLTVBfSTggKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gdGVtcGxhdGUgZm9yIGRlYnVnIHByaW50cyBzcGVjaWZpY2F0aW9uICggZCwgdSwgbGxkLCBsbHUgKSwgYW5kIHRvIG9idGFpbgorICAgIC8vIHNpZ25lZC91bnNpZ25lZCBmbGF2b3JzIG9mIGEgdHlwZQorICAgIHRlbXBsYXRlPCB0eXBlbmFtZSBUID4KKyAgICBzdHJ1Y3QgdHJhaXRzX3QgeworICAgICAgICB0eXBlZGVmIFQgICAgICAgICAgIHNpZ25lZF90OworICAgICAgICB0eXBlZGVmIFQgICAgICAgICAgIHVuc2lnbmVkX3Q7CisgICAgICAgIHR5cGVkZWYgVCAgICAgICAgICAgZmxvYXRpbmdfdDsKKyAgICAgICAgc3RhdGljIGNoYXIgY29uc3QgKiBzcGVjOworICAgIH07CisgICAgLy8gaW50CisgICAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCB0cmFpdHNfdDwgc2lnbmVkIGludCA+IHsKKyAgICAgICAgdHlwZWRlZiBzaWduZWQgaW50ICAgIHNpZ25lZF90OworICAgICAgICB0eXBlZGVmIHVuc2lnbmVkIGludCAgdW5zaWduZWRfdDsKKyAgICAgICAgdHlwZWRlZiBkb3VibGUgICAgICAgIGZsb2F0aW5nX3Q7CisgICAgICAgIHN0YXRpYyBjaGFyIGNvbnN0ICogICBzcGVjOworICAgIH07CisgICAgLy8gdW5zaWduZWQgaW50CisgICAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCB0cmFpdHNfdDwgdW5zaWduZWQgaW50ID4geworICAgICAgICB0eXBlZGVmIHNpZ25lZCBpbnQgICAgc2lnbmVkX3Q7CisgICAgICAgIHR5cGVkZWYgdW5zaWduZWQgaW50ICB1bnNpZ25lZF90OworICAgICAgICB0eXBlZGVmIGRvdWJsZSAgICAgICAgZmxvYXRpbmdfdDsKKyAgICAgICAgc3RhdGljIGNoYXIgY29uc3QgKiAgIHNwZWM7CisgICAgfTsKKyAgICAvLyBsb25nIGxvbmcKKyAgICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IHRyYWl0c190PCBzaWduZWQgbG9uZyBsb25nID4geworICAgICAgICB0eXBlZGVmIHNpZ25lZCBsb25nIGxvbmcgICAgc2lnbmVkX3Q7CisgICAgICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nICB1bnNpZ25lZF90OworICAgICAgICB0eXBlZGVmIGxvbmcgZG91YmxlICAgICAgICAgZmxvYXRpbmdfdDsKKyAgICAgICAgc3RhdGljIGNoYXIgY29uc3QgKiAgICAgICAgIHNwZWM7CisgICAgfTsKKyAgICAvLyB1bnNpZ25lZCBsb25nIGxvbmcKKyAgICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IHRyYWl0c190PCB1bnNpZ25lZCBsb25nIGxvbmcgPiB7CisgICAgICAgIHR5cGVkZWYgc2lnbmVkIGxvbmcgbG9uZyAgICBzaWduZWRfdDsKKyAgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgIHVuc2lnbmVkX3Q7CisgICAgICAgIHR5cGVkZWYgbG9uZyBkb3VibGUgICAgICAgICBmbG9hdGluZ190OworICAgICAgICBzdGF0aWMgY2hhciBjb25zdCAqICAgICAgICAgc3BlYzsKKyAgICB9OworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKyNkZWZpbmUgS01QX0VYUE9SVAlleHRlcm4JLyogZXhwb3J0IGRlY2xhcmF0aW9uIGluIGd1aWRlIGxpYnJhcmllcyAqLworCisjaWYgX19HTlVDX18gPT0gNAorICAgICNkZWZpbmUgX19mb3JjZWlubGluZSBfX2lubGluZQorI2VuZGlmCisKKyNkZWZpbmUgUEFHRV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAoMHg0MDAwKQorI2RlZmluZSBQQUdFX0FMSUdORUQoX2FkZHIpICAgICAoICEgKChzaXplX3QpIF9hZGRyICYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpKFBBR0VfU0laRSAtIDEpKSkKKyNkZWZpbmUgQUxJR05fVE9fUEFHRSh4KSAgICh2b2lkICopKCgoc2l6ZV90KSh4KSkgJiB+KChzaXplX3QpKFBBR0VfU0laRSAtIDEpKSkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTdXBwb3J0IGZvciBjYWNoZSBhbGlnbm1lbnQsIHBhZGRpbmcsIGV0Yy4gLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKy8qIERlZmluZSB0aGUgZGVmYXVsdCBzaXplIG9mIHRoZSBjYWNoZSBsaW5lICovCisjaWZuZGVmIENBQ0hFX0xJTkUKKyAgICAjZGVmaW5lIENBQ0hFX0xJTkUgICAgICAgICAgICAgICAgICAxMjggICAgICAgICAvKiBjYWNoZSBsaW5lIHNpemUgaW4gYnl0ZXMgKi8KKyNlbHNlCisgICAgI2lmICggQ0FDSEVfTElORSA8IDY0ICkgJiYgISBkZWZpbmVkKCBLTVBfT1NfREFSV0lOICkKKyAgICAgICAgLy8gMjAwNi0wMi0xMzogVGhpcyBwcm9kdWNlcyB0b28gbWFueSB3YXJuaW5ncyBvbiBPUyBYKi4gRGlzYWJsZSBpdCBmb3IgYSB3aGlsZS4uLgorICAgICAgICAjd2FybmluZyBDQUNIRV9MSU5FIGlzIHRvbyBzbWFsbC4KKyAgICAjZW5kaWYKKyNlbmRpZiAvKiBDQUNIRV9MSU5FICovCisKKy8qIFNHSSdzIGNhY2hlIHBhZGRpbmcgaW1wcm92ZW1lbnRzIHVzaW5nIGFsaWduIGRlY2wgc3BlY3MgKFZlciAxOSkgKi8KKyNpZiAhZGVmaW5lZCBLTVBfUEVSRl9WMTkKKyMgZGVmaW5lIEtNUF9QRVJGX1YxOQkJCUtNUF9PTgorI2VuZGlmCisKKy8qIFNHSSdzIGltcHJvdmVtZW50cyBmb3IgaW5saW5lIGFyZ3YgKFZlciAxMDYpICovCisjaWYgIWRlZmluZWQgS01QX1BFUkZfVjEwNgorIyBkZWZpbmUgS01QX1BFUkZfVjEwNgkJCUtNUF9PTgorI2VuZGlmCisKKyNkZWZpbmUgS01QX0NBQ0hFX1BSRUZFVENIKEFERFIpIAkvKiBub3RoaW5nICovCisKKy8qIFRlbXBvcmFyeSBub3RlOiBpZiBwZXJmb3JtYW5jZSB0ZXN0aW5nIG9mIHRoaXMgcGFzc2VzLCB3ZSBjYW4gcmVtb3ZlCisgICBhbGwgcmVmZXJlbmNlcyB0byBLTVBfRE9fQUxJR04gYW5kIHJlcGxhY2Ugd2l0aCBLTVBfQUxJR04uICAqLworI2lmIEtNUF9PU19VTklYICYmIGRlZmluZWQoX19HTlVDX18pCisjIGRlZmluZSBLTVBfRE9fQUxJR04oYnl0ZXMpICBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKGJ5dGVzKSkpCisjIGRlZmluZSBLTVBfQUxJR05fQ0FDSEUgICAgICBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKENBQ0hFX0xJTkUpKSkKKyMgZGVmaW5lIEtNUF9BTElHTihieXRlcykgICAgIF9fYXR0cmlidXRlX18oKGFsaWduZWQoYnl0ZXMpKSkKKyNlbHNlCisjIGRlZmluZSBLTVBfRE9fQUxJR04oYnl0ZXMpICBfX2RlY2xzcGVjKCBhbGlnbihieXRlcykgKQorIyBkZWZpbmUgS01QX0FMSUdOX0NBQ0hFICAgICAgX19kZWNsc3BlYyggYWxpZ24oQ0FDSEVfTElORSkgKQorIyBkZWZpbmUgS01QX0FMSUdOKGJ5dGVzKSAgICAgX19kZWNsc3BlYyggYWxpZ24oYnl0ZXMpICkKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX01JQ19fKSB8fCBkZWZpbmVkKF9fTUlDMl9fKQorICAgICNkZWZpbmUgS01QX01JQyAgMQorLy8gSW50ZWwoUikgQ29tcG9zZXIgWEUgKDEzLjApIGRlZmluZXMgYm90aCBfX01JQ19fIGFuZCBfX01JQzJfXyAhCisjIGlmIF9fTUlDMl9fIHx8IF9fS05DX18KKyAgICAjZGVmaW5lIEtNUF9NSUMxIDAKKyAgICAjZGVmaW5lIEtNUF9NSUMyIDEKKyMgZWxzZQorICAgICNkZWZpbmUgS01QX01JQzEgMQorICAgICNkZWZpbmUgS01QX01JQzIgMAorIyBlbmRpZgorI2Vsc2UKKyAgICAjZGVmaW5lIEtNUF9NSUMgIDAKKyAgICAjZGVmaW5lIEtNUF9NSUMxIDAKKyAgICAjZGVmaW5lIEtNUF9NSUMyIDAKKyNlbmRpZgorCisvKiBHZW5lcmFsIHB1cnBvc2UgZmVuY2UgdHlwZXMgZm9yIG1lbW9yeSBvcGVyYXRpb25zICovCitlbnVtIGttcF9tZW1fZmVuY2VfdHlwZSB7CisgICAga21wX25vX2ZlbmNlLCAgICAgICAgIC8qIE5vIG1lbW9yeSBmZW5jZSAqLworICAgIGttcF9hY3F1aXJlX2ZlbmNlLCAgICAvKiBBY3F1aXJlIChyZWFkKSBtZW1vcnkgZmVuY2UgKi8KKyAgICBrbXBfcmVsZWFzZV9mZW5jZSwgICAgLyogUmVsZWFzZSAod3JpdGUpIG1lbW9yeSBmZW5jZSAqLworICAgIGttcF9mdWxsX2ZlbmNlICAgICAgICAvKiBGdWxsIChyZWFkK3dyaXRlKSBtZW1vcnkgZmVuY2UgKi8KK307CisKKworLy8KKy8vIFN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzCisvLworCisjaWYgS01QX0FTTV9JTlRSSU5TICYmIEtNUF9PU19XSU5ET1dTCisKKyNpbmNsdWRlIDxXaW5kb3dzLmg+CisKKyNwcmFnbWEgaW50cmluc2ljKEludGVybG9ja2VkRXhjaGFuZ2VBZGQpCisjcHJhZ21hIGludHJpbnNpYyhJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZSkKKyNwcmFnbWEgaW50cmluc2ljKEludGVybG9ja2VkRXhjaGFuZ2UpCisjcHJhZ21hIGludHJpbnNpYyhJbnRlcmxvY2tlZEV4Y2hhbmdlNjQpCisKKy8vCisvLyBVc2luZyBJbnRlcmxvY2tlZEluY3JlbWVudCAvIEludGVybG9ja2VkRGVjcmVtZW50IGNhdXNlcyBhIGxpYnJhcnkgbG9hZGluZworLy8gb3JkZXJpbmcgcHJvYmxlbSwgc28gd2UgdXNlIEludGVybG9ja2VkRXhjaGFuZ2VBZGQgaW5zdGVhZC4KKy8vCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0lOQzMyKHApICAgICAgICAgICAgICAgICBJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkKCAodm9sYXRpbGUgbG9uZyAqKShwKSwgMSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0lOQ19BQ1EzMihwKSAgICAgICAgICAgICBJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkKCAodm9sYXRpbGUgbG9uZyAqKShwKSwgMSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDRfMzIocCkgICAgICAgICAgICAgICBJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkKCAodm9sYXRpbGUgbG9uZyAqKShwKSwgNCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDRfQUNRMzIocCkgICAgICAgICAgICBJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkKCAodm9sYXRpbGUgbG9uZyAqKShwKSwgNCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0RFQzMyKHApICAgICAgICAgICAgICAgICBJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkKCAodm9sYXRpbGUgbG9uZyAqKShwKSwgLTEgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9ERUNfQUNRMzIocCkgICAgICAgICAgICAgSW50ZXJsb2NrZWRFeGNoYW5nZUFkZCggKHZvbGF0aWxlIGxvbmcgKikocCksIC0xICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQUREMzIocCwgdikgICAgICAgICAgICAgIEludGVybG9ja2VkRXhjaGFuZ2VBZGQoICh2b2xhdGlsZSBsb25nICopKHApLCAodikgKQorCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUMzIocCwgY3YsIHN2KSBJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZSggKHZvbGF0aWxlIGxvbmcgKikocCksKGxvbmcpKHN2KSwobG9uZykoY3YpICkKKworIyBkZWZpbmUgS01QX1hDSEdfRklYRUQzMihwLCB2KSAgICAgICAgICAgICAgICAgSW50ZXJsb2NrZWRFeGNoYW5nZSggKHZvbGF0aWxlIGxvbmcgKikocCksIChsb25nKSh2KSApCisjIGRlZmluZSBLTVBfWENIR19GSVhFRDY0KHAsIHYpICAgICAgICAgICAgICAgICBJbnRlcmxvY2tlZEV4Y2hhbmdlNjQoICh2b2xhdGlsZSBrbXBfaW50NjQgKikocCksIChrbXBfaW50NjQpKHYpICkKKworaW5saW5lIGttcF9yZWFsMzIgS01QX1hDSEdfUkVBTDMyKCB2b2xhdGlsZSBrbXBfcmVhbDMyICpwLCBrbXBfcmVhbDMyIHYpCit7CisgICAga21wX2ludDMyIHRtcCA9IEludGVybG9ja2VkRXhjaGFuZ2UoICh2b2xhdGlsZSBsb25nICopcCwgKihsb25nICopJnYpOworICAgIHJldHVybiAqKGttcF9yZWFsMzIqKSZ0bXA7Cit9CisKKy8vCisvLyBSb3V0aW5lcyB0aGF0IHdlIHN0aWxsIG5lZWQgdG8gaW1wbGVtZW50IGluIGFzc2VtYmx5LgorLy8KK2V4dGVybiBrbXBfaW50MzIgX19rbXBfdGVzdF90aGVuX2FkZDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiB2ICk7CitleHRlcm4ga21wX2ludDMyIF9fa21wX3Rlc3RfdGhlbl9vcjMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiB2ICk7CitleHRlcm4ga21wX2ludDMyIF9fa21wX3Rlc3RfdGhlbl9hbmQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgdiApOworZXh0ZXJuIGttcF9pbnQ2NCBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IHYgKTsKK2V4dGVybiBrbXBfaW50NjQgX19rbXBfdGVzdF90aGVuX29yNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IHYgKTsKK2V4dGVybiBrbXBfaW50NjQgX19rbXBfdGVzdF90aGVuX2FuZDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCB2ICk7CisKK2V4dGVybiBrbXBfaW50OCBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCBjdiwga21wX2ludDggc3YgKTsKK2V4dGVybiBrbXBfaW50MTYgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgY3YsIGttcF9pbnQxNiBzdiApOworZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBjdiwga21wX2ludDMyIHN2ICk7CitleHRlcm4ga21wX2ludDMyIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGN2LCBrbXBfaW50NjQgc3YgKTsKK2V4dGVybiBrbXBfaW50OCAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OCggIHZvbGF0aWxlIGttcF9pbnQ4ICAqcCwga21wX2ludDggIGN2LCBrbXBfaW50OCAgc3YgKTsKK2V4dGVybiBrbXBfaW50MTYgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IGN2LCBrbXBfaW50MTYgc3YgKTsKK2V4dGVybiBrbXBfaW50MzIgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGN2LCBrbXBfaW50MzIgc3YgKTsKK2V4dGVybiBrbXBfaW50NjQgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGN2LCBrbXBfaW50NjQgc3YgKTsKKworZXh0ZXJuIGttcF9pbnQ4ICBfX2ttcF94Y2hnX2ZpeGVkOCggdm9sYXRpbGUga21wX2ludDggICpwLCBrbXBfaW50OCAgdiApOworZXh0ZXJuIGttcF9pbnQxNiBfX2ttcF94Y2hnX2ZpeGVkMTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IHYgKTsKK2V4dGVybiBrbXBfaW50MzIgX19rbXBfeGNoZ19maXhlZDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiB2ICk7CitleHRlcm4ga21wX2ludDY0IF9fa21wX3hjaGdfZml4ZWQ2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgdiApOworZXh0ZXJuIGttcF9yZWFsMzIgX19rbXBfeGNoZ19yZWFsMzIoIHZvbGF0aWxlIGttcF9yZWFsMzIgKnAsIGttcF9yZWFsMzIgdiApOworZXh0ZXJuIGttcF9yZWFsNjQgX19rbXBfeGNoZ19yZWFsNjQoIHZvbGF0aWxlIGttcF9yZWFsNjQgKnAsIGttcF9yZWFsNjQgdiApOworCisvLyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fSU5DMzIocCkgICAgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggKHApLCAxICkKKy8vIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9JTkNfQUNRMzIocCkgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDMyKCAocCksIDEgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9JTkM2NChwKSAgICAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDY0KCAocCksIDFMTCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0lOQ19BQ1E2NChwKSAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIChwKSwgMUxMICkKKy8vIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ0XzMyKHApICAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDMyKCAocCksIDQgKQorLy8jIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDRfQUNRMzIocCkgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIChwKSwgNCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDRfNjQocCkgICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIChwKSwgNExMICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQURENF9BQ1E2NChwKSAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NCggKHApLCA0TEwgKQorLy8jIGRlZmluZSBLTVBfVEVTVF9USEVOX0RFQzMyKHApICAgICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIChwKSwgLTEgKQorLy8jIGRlZmluZSBLTVBfVEVTVF9USEVOX0RFQ19BQ1EzMihwKSAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIChwKSwgLTEgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9ERUM2NChwKSAgICAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDY0KCAocCksIC0xTEwgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9ERUNfQUNRNjQocCkgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDY0KCAocCksIC0xTEwgKQorLy8jIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDMyKHAsIHYpICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIChwKSwgKHYpICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQURENjQocCwgdikgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NCggKHApLCAodikgKQorCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX09SMzIocCwgdikgICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fb3IzMiggKHApLCAodikgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BTkQzMihwLCB2KSAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FuZDMyKCAocCksICh2KSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX09SNjQocCwgdikgICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fb3I2NCggKHApLCAodikgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BTkQ2NChwLCB2KSAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FuZDY0KCAocCksICh2KSApCisKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1E4KHAsIGN2LCBzdikgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOCggKHApLCAoY3YpLCAoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUw4KHAsIGN2LCBzdikgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOCggKHApLCAoY3YpLCAoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1ExNihwLCBjdiwgc3YpIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYoIChwKSwgKGN2KSwgKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMMTYocCwgY3YsIHN2KSBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2KCAocCksIChjdiksIChzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKHAsIGN2LCBzdikgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMiggKHApLCAoY3YpLCAoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUwzMihwLCBjdiwgc3YpIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIoIChwKSwgKGN2KSwgKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRNjQocCwgY3YsIHN2KSBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0KCAocCksIChjdiksIChzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDY0KHAsIGN2LCBzdikgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCggKHApLCAoY3YpLCAoc3YpICkKKworIyBpZiBLTVBfQVJDSF9YODYKKyMgIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUFRSKHAsIGN2LCBzdikgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIoICh2b2xhdGlsZSBrbXBfaW50MzIqKShwKSwgKGttcF9pbnQzMikoY3YpLCAoa21wX2ludDMyKShzdikgKQorIyBlbHNlIC8qIDY0IGJpdCBwb2ludGVycyAqLworIyAgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9QVFIocCwgY3YsIHN2KSAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCggKHZvbGF0aWxlIGttcF9pbnQ2NCopKHApLCAoa21wX2ludDY0KShjdiksIChrbXBfaW50NjQpKHN2KSApCisjIGVuZGlmIC8qIEtNUF9BUkNIX1g4NiAqLworCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUOChwLCBjdiwgc3YpICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4KCAocCksIChjdiksIChzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFVDE2KHAsIGN2LCBzdikgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYoIChwKSwgKGN2KSwgKHN2KSApCisvLyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQzMihwLCBjdiwgc3YpIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyKCAocCksIChjdiksIChzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFVDY0KHAsIGN2LCBzdikgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQoIChwKSwgKGN2KSwgKHN2KSApCisKKyMgZGVmaW5lIEtNUF9YQ0hHX0ZJWEVEOChwLCB2KSAgICAgICAgICAgICAgICAgIF9fa21wX3hjaGdfZml4ZWQ4KCAocCksICh2KSApOworIyBkZWZpbmUgS01QX1hDSEdfRklYRUQxNihwLCB2KSAgICAgICAgICAgICAgICAgX19rbXBfeGNoZ19maXhlZDE2KCAocCksICh2KSApOworLy8jIGRlZmluZSBLTVBfWENIR19GSVhFRDMyKHAsIHYpICAgICAgICAgICAgICAgICBfX2ttcF94Y2hnX2ZpeGVkMzIoIChwKSwgKHYpICk7CisvLyMgZGVmaW5lIEtNUF9YQ0hHX0ZJWEVENjQocCwgdikgICAgICAgICAgICAgICAgIF9fa21wX3hjaGdfZml4ZWQ2NCggKHApLCAodikgKTsKKy8vIyBkZWZpbmUgS01QX1hDSEdfUkVBTDMyKHAsIHYpICAgICAgICAgICAgICAgICAgX19rbXBfeGNoZ19yZWFsMzIoIChwKSwgKHYpICk7CisjIGRlZmluZSBLTVBfWENIR19SRUFMNjQocCwgdikgICAgICAgICAgICAgICAgICBfX2ttcF94Y2hnX3JlYWw2NCggKHApLCAodikgKTsKKworCisjZWxpZiAoS01QX0FTTV9JTlRSSU5TICYmIChLTVBfT1NfTElOVVggfHwgS01QX09TX0ZSRUVCU0QgfHwgS01QX09TX0RBUldJTikpIHx8ICEoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCkKKworLyogY2FzdCBwIHRvIGNvcnJlY3QgdHlwZSBzbyB0aGF0IHByb3BlciBpbnRyaW5zaWMgd2lsbCBiZSB1c2VkICovCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0lOQzMyKHApICAgICAgICAgICAgICAgICBfX3N5bmNfZmV0Y2hfYW5kX2FkZCggKGttcF9pbnQzMiAqKShwKSwgMSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0lOQ19BQ1EzMihwKSAgICAgICAgICAgICBfX3N5bmNfZmV0Y2hfYW5kX2FkZCggKGttcF9pbnQzMiAqKShwKSwgMSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0lOQzY0KHApICAgICAgICAgICAgICAgICBfX3N5bmNfZmV0Y2hfYW5kX2FkZCggKGttcF9pbnQ2NCAqKShwKSwgMUxMICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fSU5DX0FDUTY0KHApICAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfYWRkKCAoa21wX2ludDY0ICopKHApLCAxTEwgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ0XzMyKHApICAgICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9hZGQoIChrbXBfaW50MzIgKikocCksIDQgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ0X0FDUTMyKHApICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9hZGQoIChrbXBfaW50MzIgKikocCksIDQgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ0XzY0KHApICAgICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9hZGQoIChrbXBfaW50NjQgKikocCksIDRMTCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDRfQUNRNjQocCkgICAgICAgICAgICBfX3N5bmNfZmV0Y2hfYW5kX2FkZCggKGttcF9pbnQ2NCAqKShwKSwgNExMICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fREVDMzIocCkgICAgICAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfc3ViKCAoa21wX2ludDMyICopKHApLCAxICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fREVDX0FDUTMyKHApICAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfc3ViKCAoa21wX2ludDMyICopKHApLCAxICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fREVDNjQocCkgICAgICAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfc3ViKCAoa21wX2ludDY0ICopKHApLCAxTEwgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9ERUNfQUNRNjQocCkgICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9zdWIoIChrbXBfaW50NjQgKikocCksIDFMTCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDMyKHAsIHYpICAgICAgICAgICAgICBfX3N5bmNfZmV0Y2hfYW5kX2FkZCggKGttcF9pbnQzMiAqKShwKSwgKHYpICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQURENjQocCwgdikgICAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfYWRkKCAoa21wX2ludDY0ICopKHApLCAodikgKQorCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX09SMzIocCwgdikgICAgICAgICAgICAgICBfX3N5bmNfZmV0Y2hfYW5kX29yKCAoa21wX2ludDMyICopKHApLCAodikgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BTkQzMihwLCB2KSAgICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9hbmQoIChrbXBfaW50MzIgKikocCksICh2KSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX09SNjQocCwgdikgICAgICAgICAgICAgICBfX3N5bmNfZmV0Y2hfYW5kX29yKCAoa21wX2ludDY0ICopKHApLCAodikgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BTkQ2NChwLCB2KSAgICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9hbmQoIChrbXBfaW50NjQgKikocCksICh2KSApCisKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1E4KHAsIGN2LCBzdikgIF9fc3luY19ib29sX2NvbXBhcmVfYW5kX3N3YXAoICh2b2xhdGlsZSBrbXBfdWludDggKikocCksKGttcF91aW50OCkoY3YpLChrbXBfdWludDgpKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMOChwLCBjdiwgc3YpICBfX3N5bmNfYm9vbF9jb21wYXJlX2FuZF9zd2FwKCAodm9sYXRpbGUga21wX3VpbnQ4ICopKHApLChrbXBfdWludDgpKGN2KSwoa21wX3VpbnQ4KShzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTE2KHAsIGN2LCBzdikgX19zeW5jX2Jvb2xfY29tcGFyZV9hbmRfc3dhcCggKHZvbGF0aWxlIGttcF91aW50MTYgKikocCksKGttcF91aW50MTYpKGN2KSwoa21wX3VpbnQxNikoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUwxNihwLCBjdiwgc3YpIF9fc3luY19ib29sX2NvbXBhcmVfYW5kX3N3YXAoICh2b2xhdGlsZSBrbXBfdWludDE2ICopKHApLChrbXBfdWludDE2KShjdiksKGttcF91aW50MTYpKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIocCwgY3YsIHN2KSBfX3N5bmNfYm9vbF9jb21wYXJlX2FuZF9zd2FwKCAodm9sYXRpbGUga21wX3VpbnQzMiAqKShwKSwoa21wX3VpbnQzMikoY3YpLChrbXBfdWludDMyKShzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDMyKHAsIGN2LCBzdikgX19zeW5jX2Jvb2xfY29tcGFyZV9hbmRfc3dhcCggKHZvbGF0aWxlIGttcF91aW50MzIgKikocCksKGttcF91aW50MzIpKGN2KSwoa21wX3VpbnQzMikoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1E2NChwLCBjdiwgc3YpIF9fc3luY19ib29sX2NvbXBhcmVfYW5kX3N3YXAoICh2b2xhdGlsZSBrbXBfdWludDY0ICopKHApLChrbXBfdWludDY0KShjdiksKGttcF91aW50NjQpKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMNjQocCwgY3YsIHN2KSBfX3N5bmNfYm9vbF9jb21wYXJlX2FuZF9zd2FwKCAodm9sYXRpbGUga21wX3VpbnQ2NCAqKShwKSwoa21wX3VpbnQ2NCkoY3YpLChrbXBfdWludDY0KShzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1BUUihwLCBjdiwgc3YpICAgX19zeW5jX2Jvb2xfY29tcGFyZV9hbmRfc3dhcCggKHZvbGF0aWxlIHZvaWQgKiopKHApLCh2b2lkICopKGN2KSwodm9pZCAqKShzdikgKQorCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUOChwLCBjdiwgc3YpICBfX3N5bmNfdmFsX2NvbXBhcmVfYW5kX3N3YXAoICh2b2xhdGlsZSBrbXBfdWludDggKikocCksKGttcF91aW50OCkoY3YpLChrbXBfdWludDgpKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUMTYocCwgY3YsIHN2KSBfX3N5bmNfdmFsX2NvbXBhcmVfYW5kX3N3YXAoICh2b2xhdGlsZSBrbXBfdWludDE2ICopKHApLChrbXBfdWludDE2KShjdiksKGttcF91aW50MTYpKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUMzIocCwgY3YsIHN2KSBfX3N5bmNfdmFsX2NvbXBhcmVfYW5kX3N3YXAoICh2b2xhdGlsZSBrbXBfdWludDMyICopKHApLChrbXBfdWludDMyKShjdiksKGttcF91aW50MzIpKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUNjQocCwgY3YsIHN2KSBfX3N5bmNfdmFsX2NvbXBhcmVfYW5kX3N3YXAoICh2b2xhdGlsZSBrbXBfdWludDY0ICopKHApLChrbXBfdWludDY0KShjdiksKGttcF91aW50NjQpKHN2KSApCisKKyNkZWZpbmUgS01QX1hDSEdfRklYRUQ4KHAsIHYpICAgICAgICAgICAgICAgICAgIF9fc3luY19sb2NrX3Rlc3RfYW5kX3NldCggKHZvbGF0aWxlIGttcF91aW50OCAqKShwKSwgKGttcF91aW50OCkodikgKQorI2RlZmluZSBLTVBfWENIR19GSVhFRDE2KHAsIHYpICAgICAgICAgICAgICAgICAgX19zeW5jX2xvY2tfdGVzdF9hbmRfc2V0KCAodm9sYXRpbGUga21wX3VpbnQxNiAqKShwKSwgKGttcF91aW50MTYpKHYpICkKKyNkZWZpbmUgS01QX1hDSEdfRklYRUQzMihwLCB2KSAgICAgICAgICAgICAgICAgIF9fc3luY19sb2NrX3Rlc3RfYW5kX3NldCggKHZvbGF0aWxlIGttcF91aW50MzIgKikocCksIChrbXBfdWludDMyKSh2KSApCisjZGVmaW5lIEtNUF9YQ0hHX0ZJWEVENjQocCwgdikgICAgICAgICAgICAgICAgICBfX3N5bmNfbG9ja190ZXN0X2FuZF9zZXQoICh2b2xhdGlsZSBrbXBfdWludDY0ICopKHApLCAoa21wX3VpbnQ2NCkodikgKQorCitpbmxpbmUga21wX3JlYWwzMiBLTVBfWENIR19SRUFMMzIoIHZvbGF0aWxlIGttcF9yZWFsMzIgKnAsIGttcF9yZWFsMzIgdikKK3sKKyAgICBrbXBfaW50MzIgdG1wID0gX19zeW5jX2xvY2tfdGVzdF9hbmRfc2V0KCAoa21wX2ludDMyKilwLCAqKGttcF9pbnQzMiopJnYpOworICAgIHJldHVybiAqKGttcF9yZWFsMzIqKSZ0bXA7Cit9CisKK2lubGluZSBrbXBfcmVhbDY0IEtNUF9YQ0hHX1JFQUw2NCggdm9sYXRpbGUga21wX3JlYWw2NCAqcCwga21wX3JlYWw2NCB2KQoreworICAgIGttcF9pbnQ2NCB0bXAgPSBfX3N5bmNfbG9ja190ZXN0X2FuZF9zZXQoIChrbXBfaW50NjQqKXAsICooa21wX2ludDY0Kikmdik7CisgICAgcmV0dXJuICooa21wX3JlYWw2NCopJnRtcDsKK30KKworI2Vsc2UKKworZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIHYgKTsKK2V4dGVybiBrbXBfaW50MzIgX19rbXBfdGVzdF90aGVuX29yMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIHYgKTsKK2V4dGVybiBrbXBfaW50MzIgX19rbXBfdGVzdF90aGVuX2FuZDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiB2ICk7CitleHRlcm4ga21wX2ludDY0IF9fa21wX3Rlc3RfdGhlbl9hZGQ2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgdiApOworZXh0ZXJuIGttcF9pbnQ2NCBfX2ttcF90ZXN0X3RoZW5fb3I2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgdiApOworZXh0ZXJuIGttcF9pbnQ2NCBfX2ttcF90ZXN0X3RoZW5fYW5kNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IHYgKTsKKworZXh0ZXJuIGttcF9pbnQ4IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGN2LCBrbXBfaW50OCBzdiApOworZXh0ZXJuIGttcF9pbnQxNiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2KCB2b2xhdGlsZSBrbXBfaW50MTYgKnAsIGttcF9pbnQxNiBjdiwga21wX2ludDE2IHN2ICk7CitleHRlcm4ga21wX2ludDMyIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGN2LCBrbXBfaW50MzIgc3YgKTsKK2V4dGVybiBrbXBfaW50MzIgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgY3YsIGttcF9pbnQ2NCBzdiApOworZXh0ZXJuIGttcF9pbnQ4ICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4KCAgdm9sYXRpbGUga21wX2ludDggICpwLCBrbXBfaW50OCAgY3YsIGttcF9pbnQ4ICBzdiApOworZXh0ZXJuIGttcF9pbnQxNiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgY3YsIGttcF9pbnQxNiBzdiApOworZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgY3YsIGttcF9pbnQzMiBzdiApOworZXh0ZXJuIGttcF9pbnQ2NCBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgY3YsIGttcF9pbnQ2NCBzdiApOworCitleHRlcm4ga21wX2ludDggIF9fa21wX3hjaGdfZml4ZWQ4KCB2b2xhdGlsZSBrbXBfaW50OCAgKnAsIGttcF9pbnQ4ICB2ICk7CitleHRlcm4ga21wX2ludDE2IF9fa21wX3hjaGdfZml4ZWQxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgdiApOworZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF94Y2hnX2ZpeGVkMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIHYgKTsKK2V4dGVybiBrbXBfaW50NjQgX19rbXBfeGNoZ19maXhlZDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCB2ICk7CitleHRlcm4ga21wX3JlYWwzMiBfX2ttcF94Y2hnX3JlYWwzMiggdm9sYXRpbGUga21wX3JlYWwzMiAqcCwga21wX3JlYWwzMiB2ICk7CitleHRlcm4ga21wX3JlYWw2NCBfX2ttcF94Y2hnX3JlYWw2NCggdm9sYXRpbGUga21wX3JlYWw2NCAqcCwga21wX3JlYWw2NCB2ICk7CisKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fSU5DMzIocCkgICAgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggKHApLCAxICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fSU5DX0FDUTMyKHApICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggKHApLCAxICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fSU5DNjQocCkgICAgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NCggKHApLCAxTEwgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9JTkNfQUNRNjQocCkgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDY0KCAocCksIDFMTCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDRfMzIocCkgICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIChwKSwgNCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDRfQUNRMzIocCkgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIChwKSwgNCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDRfNjQocCkgICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIChwKSwgNExMICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQURENF9BQ1E2NChwKSAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NCggKHApLCA0TEwgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9ERUMzMihwKSAgICAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDMyKCAocCksIC0xICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fREVDX0FDUTMyKHApICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggKHApLCAtMSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0RFQzY0KHApICAgICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIChwKSwgLTFMTCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0RFQ19BQ1E2NChwKSAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIChwKSwgLTFMTCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDMyKHAsIHYpICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIChwKSwgKHYpICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQURENjQocCwgdikgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NCggKHApLCAodikgKQorCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX09SMzIocCwgdikgICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fb3IzMiggKHApLCAodikgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BTkQzMihwLCB2KSAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FuZDMyKCAocCksICh2KSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX09SNjQocCwgdikgICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fb3I2NCggKHApLCAodikgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BTkQ2NChwLCB2KSAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FuZDY0KCAocCksICh2KSApCisKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1E4KHAsIGN2LCBzdikgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOCggKHApLCAoY3YpLCAoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUw4KHAsIGN2LCBzdikgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOCggKHApLCAoY3YpLCAoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1ExNihwLCBjdiwgc3YpIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYoIChwKSwgKGN2KSwgKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMMTYocCwgY3YsIHN2KSBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2KCAocCksIChjdiksIChzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKHAsIGN2LCBzdikgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMiggKHApLCAoY3YpLCAoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUwzMihwLCBjdiwgc3YpIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIoIChwKSwgKGN2KSwgKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRNjQocCwgY3YsIHN2KSBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0KCAocCksIChjdiksIChzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDY0KHAsIGN2LCBzdikgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCggKHApLCAoY3YpLCAoc3YpICkKKworIyBpZiBLTVBfQVJDSF9YODYKKyMgIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUFRSKHAsIGN2LCBzdikgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIoICh2b2xhdGlsZSBrbXBfaW50MzIqKShwKSwgKGttcF9pbnQzMikoY3YpLCAoa21wX2ludDMyKShzdikgKQorIyBlbHNlIC8qIDY0IGJpdCBwb2ludGVycyAqLworIyAgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9QVFIocCwgY3YsIHN2KSAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCggKHZvbGF0aWxlIGttcF9pbnQ2NCopKHApLCAoa21wX2ludDY0KShjdiksIChrbXBfaW50NjQpKHN2KSApCisjIGVuZGlmIC8qIEtNUF9BUkNIX1g4NiAqLworCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUOChwLCBjdiwgc3YpICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4KCAocCksIChjdiksIChzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFVDE2KHAsIGN2LCBzdikgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYoIChwKSwgKGN2KSwgKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUMzIocCwgY3YsIHN2KSBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMiggKHApLCAoY3YpLCAoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQ2NChwLCBjdiwgc3YpIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0KCAocCksIChjdiksIChzdikgKQorCisjIGRlZmluZSBLTVBfWENIR19GSVhFRDgocCwgdikgICAgICAgICAgICAgICAgICBfX2ttcF94Y2hnX2ZpeGVkOCggKHApLCAodikgKTsKKyMgZGVmaW5lIEtNUF9YQ0hHX0ZJWEVEMTYocCwgdikgICAgICAgICAgICAgICAgIF9fa21wX3hjaGdfZml4ZWQxNiggKHApLCAodikgKTsKKyMgZGVmaW5lIEtNUF9YQ0hHX0ZJWEVEMzIocCwgdikgICAgICAgICAgICAgICAgIF9fa21wX3hjaGdfZml4ZWQzMiggKHApLCAodikgKTsKKyMgZGVmaW5lIEtNUF9YQ0hHX0ZJWEVENjQocCwgdikgICAgICAgICAgICAgICAgIF9fa21wX3hjaGdfZml4ZWQ2NCggKHApLCAodikgKTsKKyMgZGVmaW5lIEtNUF9YQ0hHX1JFQUwzMihwLCB2KSAgICAgICAgICAgICAgICAgIF9fa21wX3hjaGdfcmVhbDMyKCAocCksICh2KSApOworIyBkZWZpbmUgS01QX1hDSEdfUkVBTDY0KHAsIHYpICAgICAgICAgICAgICAgICAgX19rbXBfeGNoZ19yZWFsNjQoIChwKSwgKHYpICk7CisKKyNlbmRpZiAvKiBLTVBfQVNNX0lOVFJJTlMgKi8KKworIyBpZiAhS01QX01JQworLy8KKy8vIG5vIHJvdXRpbmVzIGZvciBmbG9hdGluZyBhZGRpdGlvbiBvbiBNSUMKKy8vIG5vIGludHJpbnNpYyBzdXBwb3J0IGZvciBmbG9hdGluZyBhZGRpdGlvbiBvbiBVTklYCisvLworZXh0ZXJuIGttcF9yZWFsMzIgX19rbXBfdGVzdF90aGVuX2FkZF9yZWFsMzIgKCB2b2xhdGlsZSBrbXBfcmVhbDMyICpwLCBrbXBfcmVhbDMyIHYgKTsKK2V4dGVybiBrbXBfcmVhbDY0IF9fa21wX3Rlc3RfdGhlbl9hZGRfcmVhbDY0ICggdm9sYXRpbGUga21wX3JlYWw2NCAqcCwga21wX3JlYWw2NCB2ICk7CisjICBkZWZpbmUgS01QX1RFU1RfVEhFTl9BRERfUkVBTDMyKHAsIHYpICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkX3JlYWwzMiggKHApLCAodikgKQorIyAgZGVmaW5lIEtNUF9URVNUX1RIRU5fQUREX1JFQUw2NChwLCB2KSAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZF9yZWFsNjQoIChwKSwgKHYpICkKKyMgZW5kaWYKKworCisvKiAtLS0tLS0tLS0tLS0tIHJlbGF4ZWQgY29uc2lzdGVuY3kgbWVtb3J5IG1vZGVsIHN0dWZmIC0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgS01QX09TX1dJTkRPV1MKKyMgaWZkZWYgX19BQlNPRlRfV0lOCisjICAgZGVmaW5lIEtNUF9NQigpICAgICBhc20gKCJub3AiKQorIyAgIGRlZmluZSBLTVBfSU1CKCkgICAgYXNtICgibm9wIikKKyMgZWxzZQorIyAgIGRlZmluZSBLTVBfTUIoKSAgICAgLyogX2FzbXsgbm9wIH0gKi8KKyMgICBkZWZpbmUgS01QX0lNQigpICAgIC8qIF9hc217IG5vcCB9ICovCisjIGVuZGlmCisjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KKworI2lmIEtNUF9BUkNIX1BQQzY0CisjIGRlZmluZSBLTVBfTUIoKSAgICAgICBfX3N5bmNfc3luY2hyb25pemUoKQorI2VuZGlmCisKKyNpZm5kZWYgS01QX01CCisjIGRlZmluZSBLTVBfTUIoKSAgICAgICAvKiBub3RoaW5nIHRvIGRvICovCisjZW5kaWYKKworI2lmbmRlZiBLTVBfSU1CCisjIGRlZmluZSBLTVBfSU1CKCkgICAgICAvKiBub3RoaW5nIHRvIGRvICovCisjZW5kaWYKKworI2lmbmRlZiBLTVBfU1RfUkVMMzIKKyMgZGVmaW5lIEtNUF9TVF9SRUwzMihBLEQpICAgICAgKCAqKEEpID0gKEQpICkKKyNlbmRpZgorCisjaWZuZGVmIEtNUF9TVF9SRUw2NAorIyBkZWZpbmUgS01QX1NUX1JFTDY0KEEsRCkgICAgICAoICooQSkgPSAoRCkgKQorI2VuZGlmCisKKyNpZm5kZWYgS01QX0xEX0FDUTMyCisjIGRlZmluZSBLTVBfTERfQUNRMzIoQSkgICAgICAgICggKihBKSApCisjZW5kaWYKKworI2lmbmRlZiBLTVBfTERfQUNRNjQKKyMgZGVmaW5lIEtNUF9MRF9BQ1E2NChBKSAgICAgICAgKCAqKEEpICkKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8vCisvLyBGSVhNRSAtIG1heWJlIHRoaXMgc2hvdWxkIHRoaXMgYmUKKy8vCisvLyAjZGVmaW5lIFRDUl80KGEpICAgICgqKHZvbGF0aWxlIGttcF9pbnQzMiAqKSgmYSkpCisvLyAjZGVmaW5lIFRDV180KGEsYikgIChhKSA9ICgqKHZvbGF0aWxlIGttcF9pbnQzMiAqKSYoYikpCisvLworLy8gI2RlZmluZSBUQ1JfOChhKSAgICAoKih2b2xhdGlsZSBrbXBfaW50NjQgKikoYSkpCisvLyAjZGVmaW5lIFRDV184KGEsYikgIChhKSA9ICgqKHZvbGF0aWxlIGttcF9pbnQ2NCAqKSgmYikpCisvLworLy8gSSdtIGZhaXJseSBjZXJ0YWluIHRoaXMgaXMgdGhlIGNvcnJlY3QgdGhpbmcgdG8gZG8sIGJ1dCBJJ20gYWZyYWlkCisvLyBvZiBwZXJmb3JtYW5jZSByZWdyZXNzaW9ucy4KKy8vCisKKyNkZWZpbmUgVENSXzQoYSkgICAgICAgICAgICAoYSkKKyNkZWZpbmUgVENXXzQoYSxiKSAgICAgICAgICAoYSkgPSAoYikKKyNkZWZpbmUgVENSXzgoYSkgICAgICAgICAgICAoYSkKKyNkZWZpbmUgVENXXzgoYSxiKSAgICAgICAgICAoYSkgPSAoYikKKyNkZWZpbmUgVENSX1NZTkNfNChhKSAgICAgICAoYSkKKyNkZWZpbmUgVENXX1NZTkNfNChhLGIpICAgICAoYSkgPSAoYikKKyNkZWZpbmUgVENYX1NZTkNfNChhLGIsYykgICBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMMzIoKHZvbGF0aWxlIGttcF9pbnQzMiAqKSh2b2xhdGlsZSB2b2lkICopJihhKSwgKGttcF9pbnQzMikoYiksIChrbXBfaW50MzIpKGMpKQorI2RlZmluZSBUQ1JfU1lOQ184KGEpICAgICAgIChhKQorI2RlZmluZSBUQ1dfU1lOQ184KGEsYikgICAgIChhKSA9IChiKQorI2RlZmluZSBUQ1hfU1lOQ184KGEsYixjKSAgIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUw2NCgodm9sYXRpbGUga21wX2ludDY0ICopKHZvbGF0aWxlIHZvaWQgKikmKGEpLCAoa21wX2ludDY0KShiKSwgKGttcF9pbnQ2NCkoYykpCisKKyNpZiBLTVBfQVJDSF9YODYKKworICAgICNkZWZpbmUgVENSX1BUUihhKSAgICAgICAgICAoKHZvaWQgKilUQ1JfNChhKSkKKyAgICAjZGVmaW5lIFRDV19QVFIoYSxiKSAgICAgICAgVENXXzQoKGEpLChiKSkKKyAgICAjZGVmaW5lIFRDUl9TWU5DX1BUUihhKSAgICAgKCh2b2lkICopVENSX1NZTkNfNChhKSkKKyAgICAjZGVmaW5lIFRDV19TWU5DX1BUUihhLGIpICAgVENXX1NZTkNfNCgoYSksKGIpKQorICAgICNkZWZpbmUgVENYX1NZTkNfUFRSKGEsYixjKSAoKHZvaWQgKilUQ1hfU1lOQ180KChhKSwoYiksKGMpKSkKKworI2Vsc2UgLyogNjQgYml0IHBvaW50ZXJzICovCisKKyAgICAjZGVmaW5lIFRDUl9QVFIoYSkgICAgICAgICAgKCh2b2lkICopVENSXzgoYSkpCisgICAgI2RlZmluZSBUQ1dfUFRSKGEsYikgICAgICAgIFRDV184KChhKSwoYikpCisgICAgI2RlZmluZSBUQ1JfU1lOQ19QVFIoYSkgICAgICgodm9pZCAqKVRDUl9TWU5DXzgoYSkpCisgICAgI2RlZmluZSBUQ1dfU1lOQ19QVFIoYSxiKSAgIFRDV19TWU5DXzgoKGEpLChiKSkKKyAgICAjZGVmaW5lIFRDWF9TWU5DX1BUUihhLGIsYykgKCh2b2lkICopVENYX1NZTkNfOCgoYSksKGIpLChjKSkpCisKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgKi8KKworLyoKKyAqIElmIHRoZXNlIEZUTl97VFJVRSxGQUxTRX0gdmFsdWVzIGNoYW5nZSwgbWF5IG5lZWQgdG8KKyAqIGNoYW5nZSBzZXZlcmFsIHBsYWNlcyB3aGVyZSB0aGV5IGFyZSB1c2VkIHRvIGNoZWNrIHRoYXQKKyAqIGxhbmd1YWdlIGlzIEZvcnRyYW4sIG5vdCBDLgorICovCisKKyNpZm5kZWYgRlROX1RSVUUKKyMgZGVmaW5lIEZUTl9UUlVFICAgICAgIFRSVUUKKyNlbmRpZgorCisjaWZuZGVmIEZUTl9GQUxTRQorIyBkZWZpbmUgRlROX0ZBTFNFICAgICAgRkFMU0UKKyNlbmRpZgorCit0eXBlZGVmIHZvaWQgICAgKCptaWNyb3Rhc2tfdCkoIGludCAqZ3RpZCwgaW50ICpucHIsIC4uLiApOworCisjaWZkZWYgVVNFX1ZPTEFUSUxFX0NBU1QKKyMgZGVmaW5lIFZPTEFUSUxFX0NBU1QoeCkgICAgICAgICh2b2xhdGlsZSB4KQorI2Vsc2UKKyMgZGVmaW5lIFZPTEFUSUxFX0NBU1QoeCkgICAgICAgICh4KQorI2VuZGlmCisKKyNpZmRlZiBLTVBfSTgKKyMgZGVmaW5lIEtNUF9XQUlUX1lJRUxEICAgICAgICAgICBfX2ttcF93YWl0X3lpZWxkXzgKKyMgZGVmaW5lIEtNUF9FUSAgICAgICAgICAgICAgICAgICBfX2ttcF9lcV84CisjIGRlZmluZSBLTVBfTkVRICAgICAgICAgICAgICAgICAgX19rbXBfbmVxXzgKKyMgZGVmaW5lIEtNUF9MVCAgICAgICAgICAgICAgICAgICBfX2ttcF9sdF84CisjIGRlZmluZSBLTVBfR0UgICAgICAgICAgICAgICAgICAgX19rbXBfZ2VfOAorIyBkZWZpbmUgS01QX0xFICAgICAgICAgICAgICAgICAgIF9fa21wX2xlXzgKKyNlbHNlCisjIGRlZmluZSBLTVBfV0FJVF9ZSUVMRCAgICAgICAgICAgX19rbXBfd2FpdF95aWVsZF80CisjIGRlZmluZSBLTVBfRVEgICAgICAgICAgICAgICAgICAgX19rbXBfZXFfNAorIyBkZWZpbmUgS01QX05FUSAgICAgICAgICAgICAgICAgIF9fa21wX25lcV80CisjIGRlZmluZSBLTVBfTFQgICAgICAgICAgICAgICAgICAgX19rbXBfbHRfNAorIyBkZWZpbmUgS01QX0dFICAgICAgICAgICAgICAgICAgIF9fa21wX2dlXzQKKyMgZGVmaW5lIEtNUF9MRSAgICAgICAgICAgICAgICAgICBfX2ttcF9sZV80CisjZW5kaWYgLyogS01QX0k4ICovCisKKy8qIFdvcmthcm91bmQgZm9yIEludGVsKFIpIDY0IGNvZGUgZ2VuIGJ1ZyB3aGVuIHRha2luZyBhZGRyZXNzIG9mIHN0YXRpYyBhcnJheSAoSW50ZWwoUikgNjQgVHJhY2tlciAjMTM4KSAqLworI2lmIChLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfUFBDNjQpICYmIEtNUF9PU19MSU5VWAorIyBkZWZpbmUgU1RBVElDX0VGSTJfV09SS0FST1VORAorI2Vsc2UKKyMgZGVmaW5lIFNUQVRJQ19FRkkyX1dPUktBUk9VTkQgc3RhdGljCisjZW5kaWYKKworLy8gU3VwcG9ydCBvZiBCR0VUIHVzYWdlCisjaWZuZGVmIEtNUF9VU0VfQkdFVAorI2RlZmluZSBLTVBfVVNFX0JHRVQgMQorI2VuZGlmCisKKworLy8gU3dpdGNoZXMgZm9yIE9TUyBidWlsZHMKKyNpZm5kZWYgVVNFX1NZU0ZTX0lORk8KKyMgZGVmaW5lIFVTRV9TWVNGU19JTkZPICAwCisjZW5kaWYKKyNpZm5kZWYgVVNFX0NNUFhDSEdfRklYCisjIGRlZmluZSBVU0VfQ01QWENIR19GSVggMQorI2VuZGlmCisKKy8vIFdhcm5pbmcgbGV2ZWxzCitlbnVtIGttcF93YXJuaW5nc19sZXZlbCB7CisgICAga21wX3dhcm5pbmdzX29mZiA9IDAsCQkvKiBObyB3YXJuaW5ncyAqLworICAgIGttcF93YXJuaW5nc19sb3csCQkJLyogTWluaW1hbCB3YXJuaW5ncyAoZGVmYXVsdCkgKi8KKyAgICBrbXBfd2FybmluZ3NfZXhwbGljaXQgPSA2LAkJLyogRXhwbGljaXRseSBzZXQgdG8gT04gLSBtb3JlIHdhcm5pbmdzICovCisgICAga21wX3dhcm5pbmdzX3ZlcmJvc2UJCS8qIHJlc2VydmVkICovCit9OworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLy8gZXh0ZXJuICJDIgorI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKyNlbmRpZiAvKiBLTVBfT1NfSCAqLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX3J1bnRpbWUuYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9ydW50aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI0MzcwMAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9ydW50aW1lLmMKQEAgLTAsMCArMSw4NTU5IEBACisvKgorICoga21wX3J1bnRpbWUuYyAtLSBLUFRTIHJ1bnRpbWUgc3VwcG9ydCBsaWJyYXJ5CisgKiAkUmV2aXNpb246IDQyODM5ICQKKyAqICREYXRlOiAyMDEzLTExLTI0IDEzOjAxOjAwIC0wNjAwIChTdW4sIDI0IE5vdiAyMDEzKSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfYXRvbWljLmgiCisjaW5jbHVkZSAia21wX3dyYXBwZXJfZ2V0cGlkLmgiCisjaW5jbHVkZSAia21wX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAia21wX2l0dC5oIgorI2luY2x1ZGUgImttcF9zdHIuaCIKKyNpbmNsdWRlICJrbXBfc2V0dGluZ3MuaCIKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorI2luY2x1ZGUgImttcF9pby5oIgorI2luY2x1ZGUgImttcF9lcnJvci5oIgorCisvKiB0aGVzZSBhcmUgdGVtcG9yYXJ5IGlzc3VlcyB0byBiZSBkZWFsdCB3aXRoICovCisjZGVmaW5lIEtNUF9VU0VfUFJDVEwgMAorI2RlZmluZSBLTVBfVVNFX1BPT0xFRF9BTExPQyAwCisKKyNpZiBLTVBfTUlDCisjaW5jbHVkZSA8aW1taW50cmluLmg+CisjZGVmaW5lIFVTRV9OR09fU1RPUkVTIDEKKyNlbmRpZiAvLyBLTVBfTUlDCisKKyNpZiBLTVBfTUlDICYmIFVTRV9OR09fU1RPUkVTCisjZGVmaW5lIGxvYWRfaWN2cyhzcmMpICAgICAgICAgX19tNTEyZCBWdF9pY3ZzID0gX21tNTEyX2xvYWRfcGQoKHZvaWQgKikoc3JjKSkKKyNkZWZpbmUgc3RvcmVfaWN2cyhkc3QsIHNyYykgICBfbW01MTJfc3RvcmVucm5nb19wZCgodm9pZCAqKShkc3QpLCBWdF9pY3ZzKQorI2RlZmluZSBzeW5jX2ljdnMoKSAgICAgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKCJsb2NrOyBhZGRsICQwLDAoJSVyc3ApIiA6OjogIm1lbW9yeSIpCisjZWxzZQorI2RlZmluZSBsb2FkX2ljdnMoc3JjKSAgICAgICAgICgodm9pZCkwKQorI2RlZmluZSBzdG9yZV9pY3ZzKGRzdCwgc3JjKSAgIGNvcHlfaWN2cygoZHN0KSwgKHNyYykpCisjZGVmaW5lIHN5bmNfaWN2cygpICAgICAgICAgICAgKCh2b2lkKTApCisjZW5kaWYgLyogS01QX01JQyAmJiBVU0VfTkdPX1NUT1JFUyAqLworCisjaWYgS01QX09TX1dJTkRPV1MKKyNpbmNsdWRlIDxwcm9jZXNzLmg+CisjZW5kaWYKKworCisjaWYgZGVmaW5lZChLTVBfR09NUF9DT01QQVQpCitjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fYWx0X2NvbXBbXSA9IEtNUF9WRVJTSU9OX1BSRUZJWCAiYWx0ZXJuYXRpdmUgY29tcGlsZXIgc3VwcG9ydDogeWVzIjsKKyNlbmRpZiAvKiBkZWZpbmVkKEtNUF9HT01QX0NPTVBBVCkgKi8KKworY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX29tcF9hcGlbXSA9IEtNUF9WRVJTSU9OX1BSRUZJWCAiQVBJIHZlcnNpb246ICIKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICI0LjAgKDIwMTMwNykiOworI2VsaWYgT01QXzMwX0VOQUJMRUQKKyAgICAiMy4xICgyMDExMDcpIjsKKyNlbHNlCisgICAgIjIuNSAoMjAwNTA1KSI7CisjZW5kaWYKKworI2lmZGVmIEtNUF9ERUJVRworCitjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fbG9ja1tdID0gS01QX1ZFUlNJT05fUFJFRklYICJsb2NrIHR5cGU6IHJ1biB0aW1lIHNlbGVjdGFibGUiOworCitjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fcGVyZl92MTlbXSA9IEtNUF9WRVJTSU9OX1BSRUZJWCAicGVyZiB2MTk6ICIKKyNpZiBLTVBfUEVSRl9WMTkgPT0gS01QX09OCisgICAgIm9uIjsKKyNlbGlmIEtNUF9QRVJGX1YxOSA9PSBLTVBfT0ZGCisgICAgIm9mZiI7CisjZWxzZQorICAgICNlcnJvciAiTXVzdCBzcGVjaWZ5IEtNUF9QRVJGX1YxOSBvcHRpb24iCisjZW5kaWYKKworY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX3BlcmZfdjEwNltdID0gS01QX1ZFUlNJT05fUFJFRklYICJwZXJmIHYxMDY6ICIKKyNpZiBLTVBfUEVSRl9WMTA2ID09IEtNUF9PTgorICAgICJvbiI7CisjZWxpZiBLTVBfUEVSRl9WMTA2ID09IEtNUF9PRkYKKyAgICAib2ZmIjsKKyNlbHNlCisgICAgI2Vycm9yICJNdXN0IHNwZWNpZnkgS01QX1BFUkZfVjEwNiBvcHRpb24iCisjZW5kaWYKKworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCisKKyNkZWZpbmUgS01QX01JTiggeCwgeSApICggKHgpIDwgKHkpID8gKHgpIDogKHkpICkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwora21wX2luZm9fdCBfX2ttcF9tb25pdG9yOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworCit2b2lkIF9fa21wX2NsZWFudXAoIHZvaWQgKTsKKworc3RhdGljIHZvaWQgX19rbXBfaW5pdGlhbGl6ZV9pbmZvKCBrbXBfaW5mb190ICosIGttcF90ZWFtX3QgKiwgaW50IHRpZCwgaW50IGd0aWQgKTsKK3N0YXRpYyB2b2lkIF9fa21wX2luaXRpYWxpemVfdGVhbSgKKyAgICBrbXBfdGVhbV90ICogdGVhbSwKKyAgICBpbnQgICAgICAgICAgbmV3X25wcm9jLAorICAgICNpZiBPTVBfMzBfRU5BQkxFRAorICAgICAgICBrbXBfaW50ZXJuYWxfY29udHJvbF90ICogbmV3X2ljdnMsCisgICAgICAgIGlkZW50X3QgKiAgICAgICAgICAgICAgICBsb2MKKyAgICAjZWxzZQorICAgICAgICBpbnQgbmV3X3NldF9ucHJvYywgaW50IG5ld19zZXRfZHluYW1pYywgaW50IG5ld19zZXRfbmVzdGVkLAorICAgICAgICBpbnQgbmV3X3NldF9ibG9ja3RpbWUsIGludCBuZXdfYnRfaW50ZXJ2YWxzLCBpbnQgbmV3X2J0X3NldAorICAgICNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorKTsKK3N0YXRpYyB2b2lkIF9fa21wX3BhcnRpdGlvbl9wbGFjZXMoIGttcF90ZWFtX3QgKnRlYW0gKTsKK3N0YXRpYyB2b2lkIF9fa21wX2RvX3NlcmlhbF9pbml0aWFsaXplKCB2b2lkICk7CisKKworI2lmZGVmIFVTRV9MT0FEX0JBTEFOQ0UKK3N0YXRpYyBpbnQgX19rbXBfbG9hZF9iYWxhbmNlX25wcm9jKCBrbXBfcm9vdF90ICogcm9vdCwgaW50IHNldF9ucHJvYyApOworI2VuZGlmCisKK3N0YXRpYyBpbnQgX19rbXBfZXhwYW5kX3RocmVhZHMoaW50IG5XaXNoLCBpbnQgbk5lZWQpOworc3RhdGljIGludCBfX2ttcF91bnJlZ2lzdGVyX3Jvb3Rfb3RoZXJfdGhyZWFkKCBpbnQgZ3RpZCApOworc3RhdGljIHZvaWQgX19rbXBfdW5yZWdpc3Rlcl9saWJyYXJ5KCB2b2lkICk7IC8vIGNhbGxlZCBieSBfX2ttcF9pbnRlcm5hbF9lbmQoKQorc3RhdGljIHZvaWQgX19rbXBfcmVhcF90aHJlYWQoIGttcF9pbmZvX3QgKiB0aHJlYWQsIGludCBpc19yb290ICk7CitzdGF0aWMga21wX2luZm9fdCAqX19rbXBfdGhyZWFkX3Bvb2xfaW5zZXJ0X3B0ID0gTlVMTDsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogQ2FsY3VsYXRlIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBjdXJyZW50IHRocmVhZCAqLworLyogZmFzdCAoYW5kIHNvbWV3aGF0IHBvcnRhYmxlKSB3YXkgdG8gZ2V0IHVuaXF1ZSAqLworLyogaWRlbnRpZmllciBvZiBleGVjdXRpbmcgdGhyZWFkLiAgICAgICAgICAgICAgICAqLworLyogcmV0dXJucyBLTVBfR1RJRF9ETkUgaWYgd2UgaGF2ZW4ndCBiZWVuIGFzc2lnbmVkIGEgZ3RpZCAgICovCisKK2ludAorX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWQoICkKK3sKKyAgICBpbnQgaTsKKyAgICBrbXBfaW5mb190ICAgKipvdGhlcl90aHJlYWRzOworICAgIHNpemVfdCAgICAgICAgIHN0YWNrX2RhdGE7CisgICAgY2hhciAgICAgICAgICAqc3RhY2tfYWRkcjsKKyAgICBzaXplX3QgICAgICAgICBzdGFja19zaXplOworICAgIGNoYXIgICAgICAgICAgKnN0YWNrX2Jhc2U7CisKKyAgICBLQV9UUkFDRSggMTAwMCwgKCAiKioqIF9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkOiBlbnRlcmluZywgbnByb2M9JWQgIGFsbF9ucHJvYz0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9udGgsIF9fa21wX2FsbF9udGggKSk7CisKKyAgICAvKiBKUEggLSB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgX19rbXBjX2VuZCgwKSBpcyBjYWxsZWQgaW1tZWRpYXRlbHkgcHJpb3IgdG8gYQorICAgICAgICAgICAgIHBhcmFsbGVsIHJlZ2lvbiwgbWFkZSBpdCByZXR1cm4gS01QX0dUSURfRE5FIHRvIGZvcmNlIHNlcmlhbF9pbml0aWFsaXplIGJ5CisgICAgICAgICAgICAgY2FsbGVyLiAgSGFkIHRvIGhhbmRsZSBLTVBfR1RJRF9ETkUgYXQgYWxsIGNhbGwtc2l0ZXMsIG9yIGVsc2UgZ3VhcmFudGVlCisgICAgICAgICAgICAgX19rbXBfaW5pdF9ndGlkIGZvciB0aGlzIHRvIHdvcmsuICAqLworCisgICAgaWYgKCAhVENSXzQoX19rbXBfaW5pdF9ndGlkKSApIHJldHVybiBLTVBfR1RJRF9ETkU7CisKKyNpZmRlZiBLTVBfVERBVEFfR1RJRAorICAgIGlmICggVENSXzQoX19rbXBfZ3RpZF9tb2RlKSA+PSAzKSB7CisgICAgICAgIEtBX1RSQUNFKCAxMDAwLCAoICIqKiogX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWQ6IHVzaW5nIFREQVRBXG4iICkpOworICAgICAgICByZXR1cm4gX19rbXBfZ3RpZDsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAoIFRDUl80KF9fa21wX2d0aWRfbW9kZSkgPj0gMikgeworICAgICAgICBLQV9UUkFDRSggMTAwMCwgKCAiKioqIF9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkOiB1c2luZyBrZXllZCBUTFNcbiIgKSk7CisgICAgICAgIHJldHVybiBfX2ttcF9ndGlkX2dldF9zcGVjaWZpYygpOworICAgIH0KKyAgICBLQV9UUkFDRSggMTAwMCwgKCAiKioqIF9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkOiB1c2luZyBpbnRlcm5hbCBhbGcuXG4iICkpOworCisgICAgc3RhY2tfYWRkciAgICA9IChjaGFyKikgJiBzdGFja19kYXRhOworICAgIG90aGVyX3RocmVhZHMgPSBfX2ttcF90aHJlYWRzOworCisgICAgLyoKKyAgICAgICAgQVRUOiBUaGUgY29kZSBiZWxvdyBpcyBhIHNvdXJjZSBvZiBwb3RlbnRpYWwgYnVncyBkdWUgdG8gdW5zeW5jaHJvbml6ZWQgYWNjZXNzIHRvCisgICAgICAgIF9fa21wX3RocmVhZHMgYXJyYXkuIEZvciBleGFtcGxlOgorICAgICAgICAgICAgMS4gQ3VycmVudCB0aHJlYWQgbG9hZHMgb3RoZXJfdGhyZWFkc1tpXSB0byB0aHIgYW5kIGNoZWNrcyBpdCwgaXQgaXMgbm9uLU5VTEwuCisgICAgICAgICAgICAyLiBDdXJyZW50IHRocmVhZCBpcyBzdXNwZW5kZWQgYnkgT1MuCisgICAgICAgICAgICAzLiBBbm90aGVyIHRocmVhZCB1bnJlZ2lzdGVycyBhbmQgZmluaXNoZXMgKGRlYnVnIHZlcnNpb25zIG9mIGZyZWUoKSBtYXkgZmlsbCBtZW1vcnkKKyAgICAgICAgICAgICAgIHdpdGggc29tZXRoaW5nIGxpa2UgMHhFRikuCisgICAgICAgICAgICA0LiBDdXJyZW50IHRocmVhZCBpcyByZXN1bWVkLgorICAgICAgICAgICAgNS4gQ3VycmVudCB0aHJlYWQgcmVhZHMganVuayBmcm9tICp0aHIuCisgICAgICAgIFRPRE86IEZpeCBpdC4KKyAgICAgICAgLS1sbgorICAgICovCisKKyAgICBmb3IoIGkgPSAwIDsgaSA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHkgOyBpKysgKSB7CisKKyAgICAgICAga21wX2luZm9fdCAqdGhyID0gKGttcF9pbmZvX3QgKilUQ1JfU1lOQ19QVFIob3RoZXJfdGhyZWFkc1tpXSk7CisgICAgICAgIGlmKCAhdGhyICkgY29udGludWU7CisKKyAgICAgICAgc3RhY2tfc2l6ZSA9ICAoc2l6ZV90KVRDUl9QVFIodGhyIC0+IHRoLnRoX2luZm8uZHMuZHNfc3RhY2tzaXplKTsKKyAgICAgICAgc3RhY2tfYmFzZSA9ICAoY2hhciAqKVRDUl9QVFIodGhyIC0+IHRoLnRoX2luZm8uZHMuZHNfc3RhY2tiYXNlKTsKKworICAgICAgICAvKiBzdGFjayBncm93cyBkb3duIC0tIHNlYXJjaCB0aHJvdWdoIGFsbCBvZiB0aGUgYWN0aXZlIHRocmVhZHMgKi8KKworICAgICAgICBpZiggc3RhY2tfYWRkciA8PSBzdGFja19iYXNlICkgeworICAgICAgICAgICAgc2l6ZV90IHN0YWNrX2RpZmYgPSBzdGFja19iYXNlIC0gc3RhY2tfYWRkcjsKKworICAgICAgICAgICAgaWYoIHN0YWNrX2RpZmYgPD0gc3RhY2tfc2l6ZSApIHsKKyAgICAgICAgICAgICAgICAvKiBUaGUgb25seSB3YXkgd2UgY2FuIGJlIGNsb3NlciB0aGFuIHRoZSBhbGxvY2F0ZWQgKi8KKyAgICAgICAgICAgICAgICAvKiBzdGFjayBzaXplIGlzIGlmIHdlIGFyZSBydW5uaW5nIG9uIHRoaXMgdGhyZWFkLiAqLworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2d0aWRfZ2V0X3NwZWNpZmljKCkgPT0gaSApOworICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogZ2V0IHNwZWNpZmljIHRvIHRyeSBhbmQgZGV0ZXJtaW5lIG91ciBndGlkICovCisgICAgS0FfVFJBQ0UoIDEwMDAsICggIioqKiBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZDogaW50ZXJuYWwgYWxnLiBmYWlsZWQgdG8gZmluZCAiCisgICAgICAgICAgICAgICAgICAgICAgInRocmVhZCwgdXNpbmcgVExTXG4iICkpOworICAgIGkgPSBfX2ttcF9ndGlkX2dldF9zcGVjaWZpYygpOworCisgICAgLypmcHJpbnRmKCBzdGRlcnIsICI9PT0gJWRcbiIsIGkgKTsgICovIC8qIEdST08gKi8KKworICAgIC8qIGlmIHdlIGhhdm4ndCBiZWVuIGFzc2lnbmVkIGEgZ3RpZCwgdGhlbiByZXR1cm4gY29kZSAqLworICAgIGlmKCBpPDAgKSByZXR1cm4gaTsKKworICAgIC8qIGR5bmFtaWNhbGx5IHVwZGF0ZWQgc3RhY2sgd2luZG93IGZvciB1YmVyIHRocmVhZHMgdG8gYXZvaWQgZ2V0X3NwZWNpZmljIGNhbGwgKi8KKyAgICBpZiggISBUQ1JfNChvdGhlcl90aHJlYWRzW2ldLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrZ3JvdykgKSB7CisgICAgICAgIEtNUF9GQVRBTCggU3RhY2tPdmVyZmxvdywgaSApOworICAgIH0KKworICAgIHN0YWNrX2Jhc2UgPSAoY2hhciAqKSBvdGhlcl90aHJlYWRzW2ldIC0+IHRoLnRoX2luZm8uZHMuZHNfc3RhY2tiYXNlOworICAgIGlmKCBzdGFja19hZGRyID4gc3RhY2tfYmFzZSApIHsKKyAgICAgICAgVENXX1BUUihvdGhlcl90aHJlYWRzW2ldLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrYmFzZSwgc3RhY2tfYWRkcik7CisgICAgICAgIFRDV19QVFIob3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfaW5mby5kcy5kc19zdGFja3NpemUsCisgICAgICAgICAgb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfaW5mby5kcy5kc19zdGFja3NpemUgKyBzdGFja19hZGRyIC0gc3RhY2tfYmFzZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgVENXX1BUUihvdGhlcl90aHJlYWRzW2ldLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZSwgc3RhY2tfYmFzZSAtIHN0YWNrX2FkZHIpOworICAgIH0KKworICAgIC8qIFJlcHJpbnQgc3RhY2sgYm91bmRzIGZvciB1YmVybWFzdGVyIHNpbmNlIHRoZXkgaGF2ZSBiZWVuIHJlZmluZWQgKi8KKyAgICBpZiAoIF9fa21wX3N0b3JhZ2VfbWFwICkgeworICAgICAgICBjaGFyICpzdGFja19lbmQgPSAoY2hhciAqKSBvdGhlcl90aHJlYWRzW2ldIC0+IHRoLnRoX2luZm8uZHMuZHNfc3RhY2tiYXNlOworICAgICAgICBjaGFyICpzdGFja19iZWcgPSBzdGFja19lbmQgLSBvdGhlcl90aHJlYWRzW2ldIC0+IHRoLnRoX2luZm8uZHMuZHNfc3RhY2tzaXplOworICAgICAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCBpLCBzdGFja19iZWcsIHN0YWNrX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfdGhyZWFkc1tpXSAtPiB0aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoXyVkIHN0YWNrIChyZWZpbmVtZW50KSIsIGkgKTsKKyAgICB9CisgICAgcmV0dXJuIGk7Cit9CisKK2ludAorX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWRfcmVnKCApCit7CisgICAgaW50IGd0aWQ7CisKKyAgICBpZiAoICFfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgZ3RpZCA9IEtNUF9HVElEX0RORTsKKyAgICB9IGVsc2UKKyNpZmRlZiBLTVBfVERBVEFfR1RJRAorICAgIGlmICggVENSXzQoX19rbXBfZ3RpZF9tb2RlKSA+PSAzICkgeworICAgICAgICBLQV9UUkFDRSggMTAwMCwgKCAiKioqIF9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkX3JlZzogdXNpbmcgVERBVEFcbiIgKSk7CisgICAgICAgIGd0aWQgPSBfX2ttcF9ndGlkOworICAgIH0gZWxzZQorI2VuZGlmCisgICAgaWYgKCBUQ1JfNChfX2ttcF9ndGlkX21vZGUpID49IDIgKSB7CisgICAgICAgIEtBX1RSQUNFKCAxMDAwLCAoICIqKiogX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWRfcmVnOiB1c2luZyBrZXllZCBUTFNcbiIgKSk7CisgICAgICAgIGd0aWQgPSBfX2ttcF9ndGlkX2dldF9zcGVjaWZpYygpOworICAgIH0gZWxzZSB7CisgICAgICAgIEtBX1RSQUNFKCAxMDAwLCAoICIqKiogX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWRfcmVnOiB1c2luZyBpbnRlcm5hbCBhbGcuXG4iICkpOworICAgICAgICBndGlkID0gX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWQoKTsKKyAgICB9CisKKyAgICAvKiB3ZSBtdXN0IGJlIGEgbmV3IHViZXIgbWFzdGVyIHNpYmxpbmcgdGhyZWFkICovCisgICAgaWYoIGd0aWQgPT0gS01QX0dUSURfRE5FICkgeworICAgICAgICBLQV9UUkFDRSggMTAsICggIl9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkX3JlZzogRW5jb3VudGVyZWQgbmV3IHJvb3QgdGhyZWFkLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiUmVnaXN0ZXJpbmcgYSBuZXcgZ3RpZC5cbiIgKSk7CisgICAgICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisgICAgICAgIGlmKCAhX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgICAgICBfX2ttcF9kb19zZXJpYWxfaW5pdGlhbGl6ZSgpOworICAgICAgICAgICAgZ3RpZCA9IF9fa21wX2d0aWRfZ2V0X3NwZWNpZmljKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBndGlkID0gX19rbXBfcmVnaXN0ZXJfcm9vdChGQUxTRSk7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKKyAgICAgICAgLypfX2ttcF9wcmludGYoICIrKysgJWRcbiIsIGd0aWQgKTsgKi8gLyogR1JPTyAqLworICAgIH0KKworICAgIEtNUF9ERUJVR19BU1NFUlQoIGd0aWQgPj0wICk7CisKKyAgICByZXR1cm4gZ3RpZDsKK30KKworLyogY2FsbGVyIG11c3QgaG9sZCBmb3Jram9pbl9sb2NrICovCit2b2lkCitfX2ttcF9jaGVja19zdGFja19vdmVybGFwKCBrbXBfaW5mb190ICp0aCApCit7CisgICAgaW50IGY7CisgICAgY2hhciAqc3RhY2tfYmVnID0gTlVMTDsKKyAgICBjaGFyICpzdGFja19lbmQgPSBOVUxMOworICAgIGludCBndGlkOworCisgICAgS0FfVFJBQ0UoMTAsKCJfX2ttcF9jaGVja19zdGFja19vdmVybGFwOiBjYWxsZWRcbiIpKTsKKyAgICBpZiAoIF9fa21wX3N0b3JhZ2VfbWFwICkgeworICAgICAgICBzdGFja19lbmQgPSAoY2hhciAqKSB0aCAtPiB0aC50aF9pbmZvLmRzLmRzX3N0YWNrYmFzZTsKKyAgICAgICAgc3RhY2tfYmVnID0gc3RhY2tfZW5kIC0gdGggLT4gdGgudGhfaW5mby5kcy5kc19zdGFja3NpemU7CisKKyAgICAgICAgZ3RpZCA9IF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRoICk7CisKKyAgICAgICAgaWYgKGd0aWQgPT0gS01QX0dUSURfTU9OSVRPUikgeworICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggZ3RpZCwgc3RhY2tfYmVnLCBzdGFja19lbmQsIHRoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhfJXMgc3RhY2sgKCVzKSIsICJtb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggdGgtPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tncm93ICkgPyAiaW5pdGlhbCIgOiAiYWN0dWFsIiApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggZ3RpZCwgc3RhY2tfYmVnLCBzdGFja19lbmQsIHRoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhfJWQgc3RhY2sgKCVzKSIsIGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCB0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja2dyb3cgKSA/ICJpbml0aWFsIiA6ICJhY3R1YWwiICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBObyBwb2ludCBpbiBjaGVja2luZyB1YmVybWFzdGVyIHRocmVhZHMgc2luY2UgdGhleSB1c2UgcmVmaW5lbWVudCBhbmQgY2Fubm90IG92ZXJsYXAgKi8KKyAgICBpZiAoIF9fa21wX2Vudl9jaGVja3MgPT0gVFJVRSAmJiAhS01QX1VCRVJfR1RJRChndGlkID0gX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGggKSkpCisgICAgeworICAgICAgICBLQV9UUkFDRSgxMCwoIl9fa21wX2NoZWNrX3N0YWNrX292ZXJsYXA6IHBlcmZvcm1pbmcgZXh0ZW5zaXZlIGNoZWNraW5nXG4iKSk7CisgICAgICAgIGlmICggc3RhY2tfYmVnID09IE5VTEwgKSB7CisgICAgICAgICAgICBzdGFja19lbmQgPSAoY2hhciAqKSB0aCAtPiB0aC50aF9pbmZvLmRzLmRzX3N0YWNrYmFzZTsKKyAgICAgICAgICAgIHN0YWNrX2JlZyA9IHN0YWNrX2VuZCAtIHRoIC0+IHRoLnRoX2luZm8uZHMuZHNfc3RhY2tzaXplOworICAgICAgICB9CisKKyAgICAgICAgZm9yKCBmPTAgOyBmIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eSA7IGYrKyApIHsKKyAgICAgICAgICAgIGttcF9pbmZvX3QgKmZfdGggPSAoa21wX2luZm9fdCAqKVRDUl9TWU5DX1BUUihfX2ttcF90aHJlYWRzW2ZdKTsKKworICAgICAgICAgICAgaWYoIGZfdGggJiYgZl90aCAhPSB0aCApIHsKKyAgICAgICAgICAgICAgICBjaGFyICpvdGhlcl9zdGFja19lbmQgPSAoY2hhciAqKVRDUl9QVFIoZl90aC0+dGgudGhfaW5mby5kcy5kc19zdGFja2Jhc2UpOworICAgICAgICAgICAgICAgIGNoYXIgKm90aGVyX3N0YWNrX2JlZyA9IG90aGVyX3N0YWNrX2VuZCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVfdClUQ1JfUFRSKGZfdGgtPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tzaXplKTsKKyAgICAgICAgICAgICAgICBpZigoc3RhY2tfYmVnID4gb3RoZXJfc3RhY2tfYmVnICYmIHN0YWNrX2JlZyA8IG90aGVyX3N0YWNrX2VuZCkgfHwKKyAgICAgICAgICAgICAgICAgICAoc3RhY2tfZW5kID4gb3RoZXJfc3RhY2tfYmVnICYmIHN0YWNrX2VuZCA8IG90aGVyX3N0YWNrX2VuZCkpIHsKKworICAgICAgICAgICAgICAgICAgICAvKiBQcmludCB0aGUgb3RoZXIgc3RhY2sgdmFsdWVzIGJlZm9yZSB0aGUgYWJvcnQgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9zdG9yYWdlX21hcCApCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCAtMSwgb3RoZXJfc3RhY2tfYmVnLCBvdGhlcl9zdGFja19lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVfdClUQ1JfUFRSKGZfdGgtPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tzaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhfJWQgc3RhY2sgKG92ZXJsYXBwZWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCBmX3RoICkgKTsKKworICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2coIGttcF9tc19mYXRhbCwgS01QX01TRyggU3RhY2tPdmVybGFwICksIEtNUF9ITlQoIENoYW5nZVN0YWNrTGltaXQgKSwgX19rbXBfbXNnX251bGwgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgS0FfVFJBQ0UoMTAsKCJfX2ttcF9jaGVja19zdGFja19vdmVybGFwOiByZXR1cm5pbmdcbiIpKTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBLTVBfREVCVUcKKyMgZGVmaW5lIF9fa21wX3N0YXRpY19kZWxheSggYXJnICkgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyNlbHNlCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGF0aWNfZGVsYXkoIGludCBhcmcgKQoreworLyogV29yayBhcm91bmQgd2VpcmQgY29kZS1nZW4gYnVnIHRoYXQgY2F1c2VzIGFzc2VydCB0byB0cmlwICovCisjIGlmIEtNUF9BUkNIX1g4Nl82NCAmJiBLTVBfT1NfTElOVVgKKyAgICBLTVBfQVNTRVJUKCBhcmcgIT0gMCApOworIyBlbHNlCisgICAgS01QX0FTU0VSVCggYXJnID49IDAgKTsKKyMgZW5kaWYKK30KKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKworc3RhdGljIHZvaWQKK19fa21wX3N0YXRpY195aWVsZCggaW50IGFyZyApCit7CisgICAgX19rbXBfeWllbGQoIGFyZyApOworfQorCisvKgorICogU3BpbiB3YWl0IGxvb3AgdGhhdCBmaXJzdCBkb2VzIHBhdXNlLCB0aGVuIHlpZWxkLCB0aGVuIHNsZWVwLgorICogV2FpdCB1bnRpbCBzcGlubmVyIGlzIGVxdWFsIHRvIGNoZWNrZXIgdG8gZXhpdC4KKyAqCisgKiBBIHRocmVhZCB0aGF0IGNhbGxzIF9fa21wX3dhaXRfc2xlZXAgbXVzdCBtYWtlIGNlcnRhaW4gdGhhdCBhbm90aGVyIHRocmVhZAorICogY2FsbHMgX19rbXBfcmVsZWFzZSB0byB3YWtlIGl0IGJhY2sgdXAgdXAgdG8gcHJldmVudCBkZWFkbG9ja3MhCisgKi8KKwordm9pZAorX19rbXBfd2FpdF9zbGVlcCgga21wX2luZm9fdCAqdGhpc190aHIsCisgICAgICAgICAgICAgICAgICB2b2xhdGlsZSBrbXBfdWludCAqc3Bpbm5lciwKKyAgICAgICAgICAgICAgICAgIGttcF91aW50IGNoZWNrZXIsCisgICAgICAgICAgICAgICAgICBpbnQgZmluYWxfc3BpbgorICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcgKHZvaWQgKiBpdHRfc3luY19vYmopCispCit7CisgICAgLyogbm90ZTogd2UgbWF5IG5vdCBiZWxvbmcgdG8gYSB0ZWFtIGF0IHRoaXMgcG9pbnQgKi8KKyAgICByZWdpc3RlciB2b2xhdGlsZSBrbXBfdWludCAgICAqc3BpbiAgICAgID0gc3Bpbm5lcjsKKyAgICByZWdpc3RlciAgICAgICAgICBrbXBfdWludCAgICAgY2hlY2sgICAgID0gY2hlY2tlcjsKKyAgICByZWdpc3RlciAgICAgICAgICBrbXBfdWludDMyICAgc3BpbnM7CisgICAgcmVnaXN0ZXIgICAgICAgICAga21wX3VpbnQzMiAgIGhpYmVybmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgdGhfZ3RpZCwgdGhfdGlkOworI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIGZsYWcgPSBGQUxTRTsKKyNlbmRpZiAvKiBPTVBfMzBfRU5BQkxFRCAqLworCisgICAgS01QX0ZTWU5DX1NQSU5fSU5JVCggc3BpbiwgTlVMTCApOworICAgIGlmKCBUQ1JfNCgqc3BpbikgPT0gY2hlY2sgKSB7CisgICAgICAgIEtNUF9GU1lOQ19TUElOX0FDUVVJUkVEKCBzcGluICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0aF9ndGlkID0gdGhpc190aHItPnRoLnRoX2luZm8uZHMuZHNfZ3RpZDsKKworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF93YWl0X3NsZWVwOiBUIyVkIHdhaXRpbmcgZm9yIHNwaW4oJXApID09ICVkXG4iLAorICAgICAgICAgICAgICAgICAgdGhfZ3RpZCwKKyAgICAgICAgICAgICAgICAgIHNwaW4sIGNoZWNrICkgKTsKKworICAgIC8qIHNldHVwIGZvciB3YWl0aW5nICovCisgICAgS01QX0lOSVRfWUlFTEQoIHNwaW5zICk7CisKKyAgICBpZiAoIF9fa21wX2RmbHRfYmxvY2t0aW1lICE9IEtNUF9NQVhfQkxPQ0tUSU1FICkgeworICAgICAgICAvLworICAgICAgICAvLyBUaGUgd29ya2VyIHRocmVhZHMgY2Fubm90IHJlbHkgb24gdGhlIHRlYW0gc3RydWN0IGV4aXN0aW5nIGF0IHRoaXMKKyAgICAgICAgLy8gcG9pbnQuICBVc2UgdGhlIGJ0IHZhbHVlcyBjYWNoZWQgaW4gdGhlIHRocmVhZCBzdHJ1Y3QgaW5zdGVhZC4KKyAgICAgICAgLy8KKyAjaWZkZWYgS01QX0FESlVTVF9CTE9DS1RJTUUKKyAgICAgICAgaWYgKCBfX2ttcF96ZXJvX2J0ICYmICEgdGhpc190aHItPnRoLnRoX3RlYW1fYnRfc2V0ICkgeworICAgICAgICAgICAgLyogZm9yY2UgaW1tZWRpYXRlIHN1c3BlbmQgaWYgbm90IHNldCBieSB1c2VyIGFuZCBtb3JlIHRocmVhZHMgdGhhbiBhdmFpbGFibGUgcHJvY3MgKi8KKyAgICAgICAgICAgIGhpYmVybmF0ZSA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBoaWJlcm5hdGUgPSB0aGlzX3Roci0+dGgudGhfdGVhbV9idF9pbnRlcnZhbHM7CisgICAgICAgIH0KKyAjZWxzZQorICAgICAgICBoaWJlcm5hdGUgPSB0aGlzX3Roci0+dGgudGhfdGVhbV9idF9pbnRlcnZhbHM7CisgI2VuZGlmIC8qIEtNUF9BREpVU1RfQkxPQ0tUSU1FICovCisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gSWYgdGhlIGJsb2NrdGltZSBpcyBub256ZXJvLCB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IHdlIHNwaW4KKyAgICAgICAgLy8gd2FpdCBmb3IgdGhlIGVudGlyZXR5IG9mIHRoZSBzcGVjaWZpZWQgI2ludGVydmFscywgcGx1cyB1cCB0bworICAgICAgICAvLyBvbmUgaW50ZXJ2YWwgbW9yZS4gIFRoaXMgaW5jcmVtZW50IG1ha2UgY2VydGFpbiB0aGF0IHRoaXMgdGhyZWFkCisgICAgICAgIC8vIGRvZXNuJ3QgZ28gdG8gc2xlZXAgdG9vIHNvb24uCisgICAgICAgIC8vCisgICAgICAgIGlmICggaGliZXJuYXRlICE9IDAgKSB7CisgICAgICAgICAgICBoaWJlcm5hdGUrKzsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIEFkZCBpbiB0aGUgY3VycmVudCB0aW1lIHZhbHVlLgorICAgICAgICAvLworICAgICAgICBoaWJlcm5hdGUgKz0gVENSXzQoIF9fa21wX2dsb2JhbC5nLmdfdGltZS5kdC50X3ZhbHVlICk7CisKKyAgICAgICAgS0ZfVFJBQ0UoIDIwLCAoIl9fa21wX3dhaXRfc2xlZXA6IFQjJWQgbm93PSVkLCBoaWJlcm5hdGU9JWQsIGludGVydmFscz0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgdGhfZ3RpZCwgX19rbXBfZ2xvYmFsLmcuZ190aW1lLmR0LnRfdmFsdWUsIGhpYmVybmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaGliZXJuYXRlIC0gX19rbXBfZ2xvYmFsLmcuZ190aW1lLmR0LnRfdmFsdWUgKSk7CisgICAgfQorCisgICAgS01QX01CKCk7CisKKyAgICAvKiBtYWluIHdhaXQgc3BpbiBsb29wICovCisgICAgd2hpbGUoIFRDUl80KCpzcGluKSAhPSBjaGVjayApIHsKKyAgICAgICAgaW50IGluX3Bvb2w7CisKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgICAgICAvLworICAgICAgICAvLyBJZiB0aGUgdGFzayB0ZWFtIGlzIE5VTEwsIGl0IG1lYW5zIG9uZSBvZiB0aGluZ3M6CisgICAgICAgIC8vICAgMSkgQSBuZXdseS1jcmVhdGVkIHRocmVhZCBpcyBmaXJzdCBiZWluZyByZWxlYXNlZCBieQorICAgICAgICAvLyAgICAgIF9fa21wX2ZvcmtfYmFycmllcigpLCBhbmQgaXRzIHRhc2sgdGVhbSBoYXMgbm90IGJlZW4gc2V0IHVwCisgICAgICAgIC8vICAgICAgeWV0LgorICAgICAgICAvLyAgIDIpIEFsbCB0YXNrcyBoYXZlIGJlZW4gZXhlY3V0ZWQgdG8gY29tcGxldGlvbiwgdGhpcyB0aHJlYWQgaGFzCisgICAgICAgIC8vICAgICAgZGVjcmVtZW50ZWQgdGhlIHRhc2sgdGVhbSdzIHJlZiBjdCBhbmQgcG9zc2libHkgZGVhbGxvY2F0ZWQKKyAgICAgICAgLy8gICAgICBpdCwgYW5kIHNob3VsZCBubyBsb25nZXIgcmVmZXJlbmNlIGl0LgorICAgICAgICAvLyAgIDMpIFRhc2tpbmcgaXMgb2ZmIGZvciB0aGlzIHJlZ2lvbi4gIFRoaXMgY291bGQgYmUgYmVjYXVzZSB3ZQorICAgICAgICAvLyAgICAgIGFyZSBpbiBhIHNlcmlhbGl6ZWQgcmVnaW9uIChwZXJoYXBzIHRoZSBvdXRlciBvbmUpLCBvciBlbHNlCisgICAgICAgIC8vICAgICAgdGFza2luZyB3YXMgbWFudWFsbHkgZGlzYWJsZWQgKEtNUF9UQVNLSU5HPTApLgorICAgICAgICAvLworICAgICAgICBrbXBfdGFza190ZWFtX3QgKiB0YXNrX3RlYW0gPSBOVUxMOworICAgICAgICBpZiAoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICkgeworICAgICAgICAgICAgdGFza190ZWFtID0gdGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbTsKKyAgICAgICAgICAgIGlmICggdGFza190ZWFtICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgaWYgKCAhIFRDUl9TWU5DXzQoIHRhc2tfdGVhbS0+dHQudHRfYWN0aXZlICkgKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoICEgS01QX01BU1RFUl9USUQoIHRoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX3RpZCApICk7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX3VucmVmX3Rhc2tfdGVhbSggdGFza190ZWFtLCB0aGlzX3RociApOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIEtNUF9UQVNLSU5HX0VOQUJMRUQoIHRhc2tfdGVhbSwgdGhpc190aHItPnRoLnRoX3Rhc2tfc3RhdGUgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfZXhlY3V0ZV90YXNrcyggdGhpc190aHIsIHRoX2d0aWQsIHNwaW4sIGNoZWNrLCBmaW5hbF9zcGluLCAmZmxhZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyggaXR0X3N5bmNfb2JqICksIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH07IC8vIGlmCisjZW5kaWYgLyogT01QXzMwX0VOQUJMRUQgKi8KKworICAgICAgICBLTVBfRlNZTkNfU1BJTl9QUkVQQVJFKCBzcGluICk7CisgICAgICAgIGlmKCBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpICkgeworICAgICAgICAgICAgaWYoIF9fa21wX2dsb2JhbC5nLmdfYWJvcnQgKQorICAgICAgICAgICAgICAgIF9fa21wX2Fib3J0X3RocmVhZCggKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgX19rbXBfc3RhdGljX2RlbGF5KCAxICk7CisKKyAgICAgICAgLyogaWYgd2UgYXJlIG92ZXJzdWJzY3JpYmVkLAorICAgICAgICAgICBvciBoYXZlIHdhaXRlZCBhIGJpdCAoYW5kIEtNUF9MSUJSQVJZPXRocm91Z2hwdXQpLCB0aGVuIHlpZWxkICovCisgICAgICAgIEtNUF9ZSUVMRCggVENSXzQoX19rbXBfbnRoKSA+IF9fa21wX2F2YWlsX3Byb2MgKTsKKyAgICAgICAgLy8gVE9ETzogU2hvdWxkIGl0IGJlIG51bWJlciBvZiBjb3JlcyBpbnN0ZWFkIG9mIHRocmVhZCBjb250ZXh0cz8gTGlrZToKKyAgICAgICAgLy8gS01QX1lJRUxEKCBUQ1JfNChfX2ttcF9udGgpID4gX19rbXBfbmNvcmVzICk7CisgICAgICAgIC8vIE5lZWQgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgZGF0YSB0byBtYWtlIHRoZSBjaGFuZ2UuLi4KKyAgICAgICAgS01QX1lJRUxEX1NQSU4oIHNwaW5zICk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyB0aHJlYWQgd2FzIHRyYW5zZmVycmVkIGZyb20gYSB0ZWFtCisgICAgICAgIC8vIHRvIHRoZSB0aHJlYWQgcG9vbCAob3IgdmljZS12ZXJzYSkgd2hpbGUgc3Bpbm5pbmcuCisgICAgICAgIC8vCisgICAgICAgIGluX3Bvb2wgPSAhIVRDUl80KHRoaXNfdGhyLT50aC50aF9pbl9wb29sKTsKKyAgICAgICAgaWYgKCBpbl9wb29sICE9ICEhdGhpc190aHItPnRoLnRoX2FjdGl2ZV9pbl9wb29sICkgeworICAgICAgICAgICAgaWYgKCBpbl9wb29sICkgeworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gcmVjZW50bHkgdHJhbnNmZXJyZWQgZnJvbSB0ZWFtIHRvIHBvb2wKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIEtNUF9URVNUX1RIRU5fSU5DMzIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa21wX2ludDMyICopICZfX2ttcF90aHJlYWRfcG9vbF9hY3RpdmVfbnRoICk7CisgICAgICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX2FjdGl2ZV9pbl9wb29sID0gVFJVRTsKKworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gSGVyZSwgd2UgY2Fubm90IGFzc2VydCB0aGF0CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBLTVBfREVCVUdfQVNTRVJUKCBUQ1JfNChfX2ttcF90aHJlYWRfcG9vbF9hY3RpdmVfbnRoKQorICAgICAgICAgICAgICAgIC8vICA8PSBfX2ttcF90aHJlYWRfcG9vbF9udGggKTsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIF9fa21wX3RocmVhZF9wb29sX250aCBpcyBpbmMvZGVjJ2QgYnkgdGhlIG1hc3RlciB0aHJlYWQKKyAgICAgICAgICAgICAgICAvLyB3aGlsZSB0aGUgZm9yay9qb2luIGxvY2sgaXMgaGVsZCwgd2hlcmVhcworICAgICAgICAgICAgICAgIC8vIF9fa21wX3RocmVhZF9wb29sX2FjdGl2ZV9udGggaXMgaW5jL2RlYydkIGFzeW5jaHJvbm91c2x5CisgICAgICAgICAgICAgICAgLy8gYnkgdGhlIHdvcmtlcnMuICBUaGUgdHdvIGNhbiBnZXQgb3V0IG9mIHN5bmMgZm9yIGJyaWVmCisgICAgICAgICAgICAgICAgLy8gcGVyaW9kcyBvZiB0aW1lLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIHJlY2VudGx5IHRyYW5zZmVycmVkIGZyb20gcG9vbCB0byB0ZWFtCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBLTVBfVEVTVF9USEVOX0RFQzMyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGttcF9pbnQzMiAqKSAmX19rbXBfdGhyZWFkX3Bvb2xfYWN0aXZlX250aCApOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIFRDUl80KF9fa21wX3RocmVhZF9wb29sX2FjdGl2ZV9udGgpID49IDAgKTsKKyAgICAgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfYWN0aXZlX2luX3Bvb2wgPSBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgICAgLy8gRG9uJ3Qgc3VzcGVuZCBpZiB0aGVyZSBpcyBhIGxpa2VsaWhvb2Qgb2YgbmV3IHRhc2tzIGJlaW5nIHNwYXduZWQuCisgICAgICAgIGlmICggKCB0YXNrX3RlYW0gIT0gTlVMTCApICYmIFRDUl80KHRhc2tfdGVhbS0+dHQudHRfZm91bmRfdGFza3MpICkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyNlbmRpZiAvKiBPTVBfMzBfRU5BQkxFRCAqLworCisgICAgICAgIC8qIERvbid0IHN1c3BlbmQgaWYgS01QX0JMT0NLVElNRSBpcyBzZXQgdG8gImluZmluaXRlIiAqLworICAgICAgICBpZiAoIF9fa21wX2RmbHRfYmxvY2t0aW1lID09IEtNUF9NQVhfQkxPQ0tUSU1FICkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvKiBpZiB3ZSBoYXZlIHdhaXRlZCBhIGJpdCBtb3JlLCBmYWxsIGFzbGVlcCAqLworICAgICAgICBpZiAoIFRDUl80KCBfX2ttcF9nbG9iYWwuZy5nX3RpbWUuZHQudF92YWx1ZSApIDwgaGliZXJuYXRlICkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBLRl9UUkFDRSggNTAsICgiX19rbXBfd2FpdF9zbGVlcDogVCMlZCBzdXNwZW5kIHRpbWUgcmVhY2hlZFxuIiwgdGhfZ3RpZCApICk7CisKKyAgICAgICAgX19rbXBfc3VzcGVuZCggdGhfZ3RpZCwgc3BpbiwgY2hlY2sgKTsKKworICAgICAgICBpZiggVENSXzQoIF9fa21wX2dsb2JhbC5nLmdfZG9uZSApICYmIF9fa21wX2dsb2JhbC5nLmdfYWJvcnQgKSB7CisgICAgICAgICAgICBfX2ttcF9hYm9ydF90aHJlYWQoICk7CisgICAgICAgIH0KKworICAgICAgICAvKiBUT0RPICovCisgICAgICAgIC8qIGlmIHRocmVhZCBpcyBkb25lIHdpdGggd29yayBhbmQgdGltZXNvdXQsIGRpc2JhbmQvZnJlZSAqLworICAgIH0KKworICAgIEtNUF9GU1lOQ19TUElOX0FDUVVJUkVEKCBzcGluICk7Cit9CisKKworLyoKKyAqIFJlbGVhc2UgdGhlIHRocmVhZCBzcGVjaWZpZWQgYnkgdGFyZ2V0X3RociBmcm9tIHdhaXRpbmcgYnkgc2V0dGluZyB0aGUgbG9jYXRpb24KKyAqIHNwZWNpZmllZCBieSBzcGluIGFuZCByZXN1bWUgdGhlIHRocmVhZCBpZiBpbmRpY2F0ZWQgYnkgdGhlIHNsZWVwIHBhcmFtZXRlci4KKyAqCisgKiBBIHRocmVhZCB0aGF0IGNhbGxzIF9fa21wX3dhaXRfc2xlZXAgbXVzdCBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gd2FrZSB1cCB0aGUKKyAqIHBvdGVudGlhbGx5IHNsZWVwaW5nIHRocmVhZCBhbmQgcHJldmVudCBkZWFkbG9ja3MhCisgKi8KKwordm9pZAorX19rbXBfcmVsZWFzZSgga21wX2luZm9fdCAqdGFyZ2V0X3Rociwgdm9sYXRpbGUga21wX3VpbnQgKnNwaW4sCisgICAgICAgICAgICAgICBlbnVtIGttcF9tZW1fZmVuY2VfdHlwZSBmZXRjaGFkZF9mZW5jZSApCit7CisgICAga21wX3VpbnQgb2xkX3NwaW47CisgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICBpbnQgdGFyZ2V0X2d0aWQgPSB0YXJnZXRfdGhyLT50aC50aF9pbmZvLmRzLmRzX2d0aWQ7CisgICAgICAgIGludCBndGlkID0gVENSXzQoX19rbXBfaW5pdF9ndGlkKSA/IF9fa21wX2dldF9ndGlkKCkgOiAtMTsKKyAgICAjZW5kaWYKKworICAgIEtGX1RSQUNFKCAyMCwgKCAiX19rbXBfcmVsZWFzZTogVCMlZCByZWxlYXNpbmcgVCMlZCBzcGluKCVwKSBmZW5jZV90eXBlKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFyZ2V0X2d0aWQsIHNwaW4sIGZldGNoYWRkX2ZlbmNlICkpOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggc3BpbiApOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggZmV0Y2hhZGRfZmVuY2UgPT0ga21wX2FjcXVpcmVfZmVuY2UgfHwKKyAgICAgICAgICAgICAgICAgICAgICBmZXRjaGFkZF9mZW5jZSA9PSBrbXBfcmVsZWFzZV9mZW5jZSApOworCisgICAgS01QX0ZTWU5DX1JFTEVBU0lORyggc3BpbiApOworCisgICAgb2xkX3NwaW4gPSAoIGZldGNoYWRkX2ZlbmNlID09IGttcF9hY3F1aXJlX2ZlbmNlICkKKyAgICAgICAgICAgICAgICAgPyBLTVBfVEVTVF9USEVOX0FERDRfQUNRMzIoICh2b2xhdGlsZSBrbXBfaW50MzIgKikgc3BpbiApCisgICAgICAgICAgICAgICAgIDogS01QX1RFU1RfVEhFTl9BREQ0XzMyKCAodm9sYXRpbGUga21wX2ludDMyICopIHNwaW4gKTsKKworICAgIEtGX1RSQUNFKCAxMDAsICggIl9fa21wX3JlbGVhc2U6IFQjJWQgb2xkIHNwaW4oJXApPSVkLCBzZXQgbmV3IHNwaW49JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICBndGlkLCBzcGluLCBvbGRfc3BpbiwgKnNwaW4gKSApOworCisgICAgaWYgKCBfX2ttcF9kZmx0X2Jsb2NrdGltZSAhPSBLTVBfTUFYX0JMT0NLVElNRSApIHsKKyAgICAgICAgLyogT25seSBuZWVkIHRvIGNoZWNrIHNsZWVwIHN0dWZmIGlmIGluZmluaXRlIGJsb2NrIHRpbWUgbm90IHNldCAqLworICAgICAgICBpZiAoIG9sZF9zcGluICYgS01QX0JBUlJJRVJfU0xFRVBfU1RBVEUgKSB7CisgI2lmbmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgIGludCB0YXJnZXRfZ3RpZCA9IHRhcmdldF90aHItPnRoLnRoX2luZm8uZHMuZHNfZ3RpZDsKKyAjZW5kaWYKKyAgICAgICAgICAgIC8qIHdha2UgdXAgdGhyZWFkIGlmIG5lZWRlZCAqLworICAgICAgICAgICAgS0ZfVFJBQ0UoIDUwLCAoICJfX2ttcF9yZWxlYXNlOiBUIyVkIHdha2luZyB1cCB0aHJlYWQgVCMlZCBzaW5jZSBzbGVlcCBzcGluKCVwKSBzZXRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFyZ2V0X2d0aWQsIHNwaW4gKSk7CisgICAgICAgICAgICBfX2ttcF9yZXN1bWUoIHRhcmdldF9ndGlkLCBzcGluICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBLRl9UUkFDRSggNTAsICggIl9fa21wX3JlbGVhc2U6IFQjJWQgZG9uJ3Qgd2FrZSB1cCB0aHJlYWQgVCMlZCBzaW5jZSBzbGVlcCBzcGluKCVwKSBub3Qgc2V0XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRhcmdldF9ndGlkLCBzcGluICkpOworICAgICAgICB9CisgICAgfQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAorX19rbXBfaW5maW5pdGVfbG9vcCggdm9pZCApCit7CisgICAgc3RhdGljIGludCBkb25lID0gRkFMU0U7CisKKyAgICB3aGlsZSAoISBkb25lKSB7CisgICAgICAgIEtNUF9ZSUVMRCggMSApOworICAgIH0KK30KKworI2RlZmluZSBNQVhfTUVTU0FHRSAgICAgNTEyCisKK3ZvaWQKK19fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIGludCBndGlkLCB2b2lkICpwMSwgdm9pZCAqcDIsIHNpemVfdCBzaXplLCBjaGFyIGNvbnN0ICpmb3JtYXQsIC4uLikgeworICAgIGNoYXIgYnVmZmVyW01BWF9NRVNTQUdFXTsKKyAgICBpbnQgbm9kZTsKKyAgICB2YV9saXN0IGFwOworCisgICAgdmFfc3RhcnQoIGFwLCBmb3JtYXQpOworICAgIHNwcmludGYoIGJ1ZmZlciwgIk9NUCBzdG9yYWdlIG1hcDogJXAgJXAlOGx1ICVzXG4iLCBwMSwgcDIsICh1bnNpZ25lZCBsb25nKSBzaXplLCBmb3JtYXQgKTsKKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX3N0ZGlvX2xvY2sgKTsKKyAgICBfX2ttcF92cHJpbnRmKCBrbXBfZXJyLCBidWZmZXIsIGFwICk7CisjaWYgS01QX1BSSU5UX0RBVEFfUExBQ0VNRU5UCisgICAgaWYoZ3RpZCA+PSAwKSB7CisgICAgICAgIGlmKHAxIDw9IHAyICYmIChjaGFyKilwMiAtIChjaGFyKilwMSA9PSBzaXplKSB7CisgICAgICAgICAgICBpZiggX19rbXBfc3RvcmFnZV9tYXBfdmVyYm9zZSApIHsKKyAgICAgICAgICAgICAgICBub2RlID0gX19rbXBfZ2V0X2hvc3Rfbm9kZShwMSk7CisgICAgICAgICAgICAgICAgaWYobm9kZSA8IDApICAvKiBkb2Vzbid0IHdvcmssIHNvIGRvbid0IHRyeSB0aGlzIG5leHQgdGltZSAqLworICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdG9yYWdlX21hcF92ZXJib3NlID0gRkFMU0U7CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgKmxhc3Q7CisgICAgICAgICAgICAgICAgICAgIGludCBsYXN0Tm9kZTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGxvY2FsUHJvYyA9IF9fa21wX2dldF9jcHVfZnJvbV9ndGlkKGd0aWQpOworCisgICAgICAgICAgICAgICAgICAgIHAxID0gKHZvaWQgKikoIChzaXplX3QpcDEgJiB+KChzaXplX3QpUEFHRV9TSVpFIC0gMSkgKTsKKyAgICAgICAgICAgICAgICAgICAgcDIgPSAodm9pZCAqKSggKChzaXplX3QpIHAyIC0gMSkgJiB+KChzaXplX3QpUEFHRV9TSVpFIC0gMSkgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYobG9jYWxQcm9jID49IDApCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9wcmludGZfbm9fbG9jaygiICBHVElEICVkIGxvY2FsTm9kZSAlZFxuIiwgZ3RpZCwgbG9jYWxQcm9jPj4xKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRmX25vX2xvY2soIiAgR1RJRCAlZFxuIiwgZ3RpZCk7CisjIGlmIEtNUF9VU0VfUFJDVEwKKy8qIFRoZSBtb3JlIGVsYWJvcmF0ZSBmb3JtYXQgaXMgZGlzYWJsZWQgZm9yIG5vdyBiZWNhdXNlIG9mIHRoZSBwcmN0bCBoYW5naW5nIGJ1Zy4gKi8KKyAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCA9IHAxOworICAgICAgICAgICAgICAgICAgICAgICAgbGFzdE5vZGUgPSBub2RlOworICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBsb29wIGNvbGxhdGVzIGFkamFjZW50IHBhZ2VzIHdpdGggdGhlIHNhbWUgaG9zdCBub2RlLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKilwMSArPSBQQUdFX1NJWkU7CisgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKHAxIDw9IHAyICYmIChub2RlID0gX19rbXBfZ2V0X2hvc3Rfbm9kZShwMSkpID09IGxhc3ROb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCIgICAgJXAtJXAgbWVtTm9kZSAlZFxuIiwgbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKilwMSAtIDEsIGxhc3ROb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgfSB3aGlsZShwMSA8PSBwMik7CisjIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRmX25vX2xvY2soIiAgICAlcC0lcCBtZW1Ob2RlICVkXG4iLCBwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKXAxICsgKFBBR0VfU0laRSAtIDEpLCBfX2ttcF9nZXRfaG9zdF9ub2RlKHAxKSk7CisgICAgICAgICAgICAgICAgICAgIGlmKHAxIDwgcDIpICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9wcmludGZfbm9fbG9jaygiICAgICVwLSVwIG1lbU5vZGUgJWRcbiIsIHAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKXAyICsgKFBBR0VfU0laRSAtIDEpLCBfX2ttcF9nZXRfaG9zdF9ub2RlKHAyKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyMgZW5kaWYKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgX19rbXBfcHJpbnRmX25vX2xvY2soIiAgJXNcbiIsIEtNUF9JMThOX1NUUiggU3RvcmFnZU1hcFdhcm5pbmcgKSApOworICAgIH0KKyNlbmRpZiAvKiBLTVBfUFJJTlRfREFUQV9QTEFDRU1FTlQgKi8KKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX3N0ZGlvX2xvY2sgKTsKK30KKwordm9pZAorX19rbXBfd2FybiggY2hhciBjb25zdCAqIGZvcm1hdCwgLi4uICkKK3sKKyAgICBjaGFyIGJ1ZmZlcltNQVhfTUVTU0FHRV07CisgICAgdmFfbGlzdCBhcDsKKworICAgIGlmICggX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MgPT0ga21wX3dhcm5pbmdzX29mZiApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHZhX3N0YXJ0KCBhcCwgZm9ybWF0ICk7CisKKyAgICBzbnByaW50ZiggYnVmZmVyLCBzaXplb2YoYnVmZmVyKSAsICJPTVAgd2FybmluZzogJXNcbiIsIGZvcm1hdCApOworICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfc3RkaW9fbG9jayApOworICAgIF9fa21wX3ZwcmludGYoIGttcF9lcnIsIGJ1ZmZlciwgYXAgKTsKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX3N0ZGlvX2xvY2sgKTsKKworICAgIHZhX2VuZCggYXAgKTsKK30KKwordm9pZAorX19rbXBfYWJvcnRfcHJvY2VzcygpCit7CisKKyAgICAvLyBMYXRlciB0aHJlYWRzIG1heSBzdGFsbCBoZXJlLCBidXQgdGhhdCdzIG9rIGJlY2F1c2UgYWJvcnQoKSB3aWxsIGtpbGwgdGhlbS4KKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX2V4aXRfbG9jayApOworCisgICAgaWYgKCBfX2ttcF9kZWJ1Z19idWYgKSB7CisgICAgICAgIF9fa21wX2R1bXBfZGVidWdfYnVmZmVyKCk7CisgICAgfTsgLy8gaWYKKworICAgIGlmICggS01QX09TX1dJTkRPV1MgKSB7CisgICAgICAgIC8vIExldCBvdGhlciB0aHJlYWRzIGtub3cgb2YgYWJub3JtYWwgdGVybWluYXRpb24gYW5kIHByZXZlbnQgZGVhZGxvY2sKKyAgICAgICAgLy8gaWYgYWJvcnQgaGFwcGVuZWQgZHVyaW5nIGxpYnJhcnkgaW5pdGlhbGl6YXRpb24gb3Igc2h1dGRvd24KKyAgICAgICAgX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCA9IFNJR0FCUlQ7CisKKyAgICAgICAgLyoKKyAgICAgICAgICAgIE9uIFdpbmRvd3MqIE9TIGJ5IGRlZmF1bHQgYWJvcnQoKSBjYXVzZXMgcG9wLXVwIGVycm9yIGJveCwgd2hpY2ggc3RhbGxzIG5pZ2h0bHkgdGVzdGluZy4KKyAgICAgICAgICAgIFVuZm9ydHVuYXRlbHksIHdlIGNhbm5vdCByZWxpYWJseSBzdXBwcmVzcyBwb3AtdXAgZXJyb3IgYm94ZXMuIF9zZXRfYWJvcnRfYmVoYXZpb3IoKQorICAgICAgICAgICAgd29ya3Mgd2VsbCwgYnV0IHRoaXMgZnVuY3Rpb24gaXMgbm90IGF2YWlsYWJsZSBpbiBWUzcgKHRoaXMgaXMgbm90IHByb2JsZW0gZm9yIERMTCwgYnV0CisgICAgICAgICAgICBpdCBpcyBhIHByb2JsZW0gZm9yIHN0YXRpYyBPcGVuTVAgUlRMKS4gU2V0RXJyb3JNb2RlIChhbmQgc28sIHRpbWVsaW1pdCB1dGlsaXR5KSBkb2VzCisgICAgICAgICAgICBub3QgaGVscCwgYXQgbGVhc3QgaW4gc29tZSB2ZXJzaW9ucyBvZiBNUyBDIFJUTC4KKworICAgICAgICAgICAgSXQgc2VlbXMgZm9sbG93aW5nIHNlcXVlbmNlIGlzIHRoZSBvbmx5IHdheSB0byBzaW11bGF0ZSBhYm9ydCgpIGFuZCBhdm9pZCBwb3AtdXAgZXJyb3IKKyAgICAgICAgICAgIGJveC4KKyAgICAgICAgKi8KKyAgICAgICAgcmFpc2UoIFNJR0FCUlQgKTsKKyAgICAgICAgX2V4aXQoIDMgKTsgICAgLy8gSnVzdCBpbiBjYXNlLCBpZiBzaWduYWwgaWdub3JlZCwgZXhpdCBhbnl3YXkuCisgICAgfSBlbHNlIHsKKyAgICAgICAgYWJvcnQoKTsKKyAgICB9OyAvLyBpZgorCisgICAgX19rbXBfaW5maW5pdGVfbG9vcCgpOworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfZXhpdF9sb2NrICk7CisKK30gLy8gX19rbXBfYWJvcnRfcHJvY2VzcworCit2b2lkCitfX2ttcF9hYm9ydF90aHJlYWQoIHZvaWQgKQoreworICAgIC8vIFRPRE86IEVsaW1pbmF0ZSBnX2Fib3J0IGdsb2JhbCB2YXJpYWJsZSBhbmQgdGhpcyBmdW5jdGlvbi4KKyAgICAvLyBJbiBjYXNlIG9mIGFib3J0IGp1c3QgY2FsbCBhYm9ydCgpLCBpdCB3aWxsIGtpbGwgYWxsIHRoZSB0aHJlYWRzLgorICAgIF9fa21wX2luZmluaXRlX2xvb3AoKTsKK30gLy8gX19rbXBfYWJvcnRfdGhyZWFkCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogUHJpbnQgb3V0IHRoZSBzdG9yYWdlIG1hcCBmb3IgdGhlIG1ham9yIGttcF9pbmZvX3QgdGhyZWFkIGRhdGEgc3RydWN0dXJlcworICogdGhhdCBhcmUgYWxsb2NhdGVkIHRvZ2V0aGVyLgorICovCisKK3N0YXRpYyB2b2lkCitfX2ttcF9wcmludF90aHJlYWRfc3RvcmFnZV9tYXAoIGttcF9pbmZvX3QgKnRociwgaW50IGd0aWQgKQoreworICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIGd0aWQsIHRociwgdGhyICsgMSwgc2l6ZW9mKGttcF9pbmZvX3QpLCAidGhfJWQiLCBndGlkICk7CisKKyAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCBndGlkLCAmdGhyLT50aC50aF9pbmZvLCAmdGhyLT50aC50aF90ZWFtLCBzaXplb2Yoa21wX2Rlc2NfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aF8lZC50aF9pbmZvIiwgZ3RpZCApOworCisgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggZ3RpZCwgJnRoci0+dGgudGhfbG9jYWwsICZ0aHItPnRoLnRoX3ByaV9oZWFkLCBzaXplb2Yoa21wX2xvY2FsX3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhfJWQudGhfbG9jYWwiLCBndGlkICk7CisKKyAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCBndGlkLCAmdGhyLT50aC50aF9iYXJbMF0sICZ0aHItPnRoLnRoX2Jhcltic19sYXN0X2JhcnJpZXJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoa21wX2JhbGlnbl90KSAqIGJzX2xhc3RfYmFycmllciwgInRoXyVkLnRoX2JhciIsIGd0aWQgKTsKKworICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIGd0aWQsICZ0aHItPnRoLnRoX2Jhcltic19wbGFpbl9iYXJyaWVyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoci0+dGgudGhfYmFyW2JzX3BsYWluX2JhcnJpZXIrMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrbXBfYmFsaWduX3QpLCAidGhfJWQudGhfYmFyW3BsYWluXSIsIGd0aWQpOworCisgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggZ3RpZCwgJnRoci0+dGgudGhfYmFyW2JzX2Zvcmtqb2luX2JhcnJpZXJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhyLT50aC50aF9iYXJbYnNfZm9ya2pvaW5fYmFycmllcisxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGttcF9iYWxpZ25fdCksICJ0aF8lZC50aF9iYXJbZm9ya2pvaW5dIiwgZ3RpZCk7CisKKyAgICAjaWYgS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICAgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggZ3RpZCwgJnRoci0+dGgudGhfYmFyW2JzX3JlZHVjdGlvbl9iYXJyaWVyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoci0+dGgudGhfYmFyW2JzX3JlZHVjdGlvbl9iYXJyaWVyKzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoa21wX2JhbGlnbl90KSwgInRoXyVkLnRoX2JhcltyZWR1Y3Rpb25dIiwgZ3RpZCk7CisgICAgI2VuZGlmIC8vIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCit9CisKKy8qCisgKiBQcmludCBvdXQgdGhlIHN0b3JhZ2UgbWFwIGZvciB0aGUgbWFqb3Iga21wX3RlYW1fdCB0ZWFtIGRhdGEgc3RydWN0dXJlcworICogdGhhdCBhcmUgYWxsb2NhdGVkIHRvZ2V0aGVyLgorICovCisKK3N0YXRpYyB2b2lkCitfX2ttcF9wcmludF90ZWFtX3N0b3JhZ2VfbWFwKCBjb25zdCBjaGFyICpoZWFkZXIsIGttcF90ZWFtX3QgKnRlYW0sIGludCB0ZWFtX2lkLCBpbnQgbnVtX3RociApCit7CisgICAgaW50IG51bV9kaXNwX2J1ZmYgPSB0ZWFtLT50LnRfbWF4X25wcm9jID4gMSA/IEtNUF9NQVhfRElTUF9CVUYgOiAyOworICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIC0xLCB0ZWFtLCB0ZWFtICsgMSwgc2l6ZW9mKGttcF90ZWFtX3QpLCAiJXNfJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIsIHRlYW1faWQgKTsKKworICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIC0xLCAmdGVhbS0+dC50X2JhclswXSwgJnRlYW0tPnQudF9iYXJbYnNfbGFzdF9iYXJyaWVyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGttcF9iYWxpZ25fdGVhbV90KSAqIGJzX2xhc3RfYmFycmllciwgIiVzXyVkLnRfYmFyIiwgaGVhZGVyLCB0ZWFtX2lkICk7CisKKworICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIC0xLCAmdGVhbS0+dC50X2Jhcltic19wbGFpbl9iYXJyaWVyXSwgJnRlYW0tPnQudF9iYXJbYnNfcGxhaW5fYmFycmllcisxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGttcF9iYWxpZ25fdGVhbV90KSwgIiVzXyVkLnRfYmFyW3BsYWluXSIsIGhlYWRlciwgdGVhbV9pZCApOworCisgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggLTEsICZ0ZWFtLT50LnRfYmFyW2JzX2Zvcmtqb2luX2JhcnJpZXJdLCAmdGVhbS0+dC50X2Jhcltic19mb3Jram9pbl9iYXJyaWVyKzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoa21wX2JhbGlnbl90ZWFtX3QpLCAiJXNfJWQudF9iYXJbZm9ya2pvaW5dIiwgaGVhZGVyLCB0ZWFtX2lkICk7CisKKyAgICAjaWYgS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICAgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggLTEsICZ0ZWFtLT50LnRfYmFyW2JzX3JlZHVjdGlvbl9iYXJyaWVyXSwgJnRlYW0tPnQudF9iYXJbYnNfcmVkdWN0aW9uX2JhcnJpZXIrMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrbXBfYmFsaWduX3RlYW1fdCksICIlc18lZC50X2JhcltyZWR1Y3Rpb25dIiwgaGVhZGVyLCB0ZWFtX2lkICk7CisgICAgI2VuZGlmIC8vIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisKKyAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCAtMSwgJnRlYW0tPnQudF9kaXNwYXRjaFswXSwgJnRlYW0tPnQudF9kaXNwYXRjaFtudW1fdGhyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGttcF9kaXNwX3QpICogbnVtX3RociwgIiVzXyVkLnRfZGlzcGF0Y2giLCBoZWFkZXIsIHRlYW1faWQgKTsKKworICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIC0xLCAmdGVhbS0+dC50X3RocmVhZHNbMF0sICZ0ZWFtLT50LnRfdGhyZWFkc1tudW1fdGhyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGttcF9pbmZvX3QgKikgKiBudW1fdGhyLCAiJXNfJWQudF90aHJlYWRzIiwgaGVhZGVyLCB0ZWFtX2lkICk7CisKKyAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCAtMSwgJnRlYW0tPnQudF9kaXNwX2J1ZmZlclswXSwgJnRlYW0tPnQudF9kaXNwX2J1ZmZlcltudW1fZGlzcF9idWZmXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGRpc3BhdGNoX3NoYXJlZF9pbmZvX3QpICogbnVtX2Rpc3BfYnVmZiwgIiVzXyVkLnRfZGlzcF9idWZmZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIsIHRlYW1faWQgKTsKKworICAgIC8qCisgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggLTEsICZ0ZWFtLT50LnRfc2V0X25wcm9jWzBdLCAmdGVhbS0+dC50X3NldF9ucHJvY1tudW1fdGhyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGludCkgKiBudW1fdGhyLCAiJXNfJWQudF9zZXRfbnByb2MiLCBoZWFkZXIsIHRlYW1faWQgKTsKKworICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIC0xLCAmdGVhbS0+dC50X3NldF9keW5hbWljWzBdLCAmdGVhbS0+dC50X3NldF9keW5hbWljW251bV90aHJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW50KSAqIG51bV90aHIsICIlc18lZC50X3NldF9keW5hbWljIiwgaGVhZGVyLCB0ZWFtX2lkICk7CisKKyAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCAtMSwgJnRlYW0tPnQudF9zZXRfbmVzdGVkWzBdLCAmdGVhbS0+dC50X3NldF9uZXN0ZWRbbnVtX3Rocl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihpbnQpICogbnVtX3RociwgIiVzXyVkLnRfc2V0X25lc3RlZCIsIGhlYWRlciwgdGVhbV9pZCApOworCisgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggLTEsICZ0ZWFtLT50LnRfc2V0X2Jsb2NrdGltZVswXSwgJnRlYW0tPnQudF9zZXRfYmxvY2t0aW1lW251bV90aHJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW50KSAqIG51bV90aHIsICIlc18lZC50X3NldF9ucHJvYyIsIGhlYWRlciwgdGVhbV9pZCApOworCisgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggLTEsICZ0ZWFtLT50LnRfc2V0X2J0X2ludGVydmFsc1swXSwgJnRlYW0tPnQudF9zZXRfYnRfaW50ZXJ2YWxzW251bV90aHJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW50KSAqIG51bV90aHIsICIlc18lZC50X3NldF9keW5hbWljIiwgaGVhZGVyLCB0ZWFtX2lkICk7CisKKyAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCAtMSwgJnRlYW0tPnQudF9zZXRfYnRfc2V0WzBdLCAmdGVhbS0+dC50X3NldF9idF9zZXRbbnVtX3Rocl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihpbnQpICogbnVtX3RociwgIiVzXyVkLnRfc2V0X25lc3RlZCIsIGhlYWRlciwgdGVhbV9pZCApOworCisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAvL19fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIC0xLCAmdGVhbS0+dC50X3NldF9tYXhfYWN0aXZlX2xldmVsc1swXSwgJnRlYW0tPnQudF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHNbbnVtX3Rocl0sCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW50KSAqIG51bV90aHIsICIlc18lZC50X3NldF9tYXhfYWN0aXZlX2xldmVscyIsIGhlYWRlciwgdGVhbV9pZCApOworCisgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggLTEsICZ0ZWFtLT50LnRfc2V0X3NjaGVkWzBdLCAmdGVhbS0+dC50X3NldF9zY2hlZFtudW1fdGhyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGttcF9yX3NjaGVkX3QpICogbnVtX3RociwgIiVzXyVkLnRfc2V0X3NjaGVkIiwgaGVhZGVyLCB0ZWFtX2lkICk7CisjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIC0xLCAmdGVhbS0+dC50X3NldF9wcm9jX2JpbmRbMF0sICZ0ZWFtLT50LnRfc2V0X3Byb2NfYmluZFtudW1fdGhyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGttcF9wcm9jX2JpbmRfdCkgKiBudW1fdGhyLCAiJXNfJWQudF9zZXRfcHJvY19iaW5kIiwgaGVhZGVyLCB0ZWFtX2lkICk7CisjZW5kaWYKKyAgICAqLworCisgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggLTEsICZ0ZWFtLT50LnRfdGFza3EsICZ0ZWFtLT50LnRfY29weXByaXZfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGttcF90YXNrcV90KSwgIiVzXyVkLnRfdGFza3EiLCBoZWFkZXIsIHRlYW1faWQgKTsKK30KKworc3RhdGljIHZvaWQgX19rbXBfaW5pdF9hbGxvY2F0b3IoKSB7fQorc3RhdGljIHZvaWQgX19rbXBfZmluaV9hbGxvY2F0b3IoKSB7fQorc3RhdGljIHZvaWQgX19rbXBfZmluaV9hbGxvY2F0b3JfdGhyZWFkKCkge30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZmRlZiBHVUlERURMTF9FWFBPUlRTCisjIGlmIEtNUF9PU19XSU5ET1dTCisKKworc3RhdGljIHZvaWQKK19fa21wX3Jlc2V0X2xvY2soIGttcF9ib290c3RyYXBfbG9ja190KiBsY2sgKSB7CisgICAgLy8gVE9ETzogQ2hhbmdlIHRvIF9fa21wX2JyZWFrX2Jvb3RzdHJhcF9sb2NrKCkuCisgICAgX19rbXBfaW5pdF9ib290c3RyYXBfbG9jayggbGNrICk7IC8vIG1ha2UgdGhlIGxvY2sgcmVsZWFzZWQKK30KKworc3RhdGljIHZvaWQKK19fa21wX3Jlc2V0X2xvY2tzX29uX3Byb2Nlc3NfZGV0YWNoKCBpbnQgZ3RpZF9yZXEgKSB7CisgICAgaW50IGk7CisgICAgaW50IHRocmVhZF9jb3VudDsKKworICAgIC8vIFBST0NFU1NfREVUQUNIIGlzIGV4cGVjdGVkIHRvIGJlIGNhbGxlZCBieSBhIHRocmVhZAorICAgIC8vIHRoYXQgZXhlY3V0ZXMgUHJvY2Vzc0V4aXQoKSBvciBGcmVlTGlicmFyeSgpLgorICAgIC8vIE9TIHRlcm1pbmF0ZXMgb3RoZXIgdGhyZWFkcyAoZXhjZXB0IHRoZSBvbmUgY2FsbGluZyBQcm9jZXNzRXhpdCBvciBGcmVlTGlicmFyeSkuCisgICAgLy8gU28sIGl0IG1pZ2h0IGJlIHNhZmUgdG8gYWNjZXNzIHRoZSBfX2ttcF90aHJlYWRzW10gd2l0aG91dCB0YWtpbmcgdGhlIGZvcmtqb2luX2xvY2suCisgICAgLy8gSG93ZXZlciwgaW4gZmFjdCwgc29tZSB0aHJlYWRzIGNhbiBiZSBzdGlsbCBhbGl2ZSBoZXJlLCBhbHRob3VnaCBiZWluZyBhYm91dCB0byBiZSB0ZXJtaW5hdGVkLgorICAgIC8vIFRoZSB0aHJlYWRzIGluIHRoZSBhcnJheSB3aXRoIGRzX3RocmVhZD09MCBhcmUgbW9zdCBzdXNwaWNpb3VzLgorICAgIC8vIEFjdHVhbGx5LCBpdCBjYW4gYmUgbm90IHNhZmUgdG8gYWNjZXNzIHRoZSBfX2ttcF90aHJlYWRzW10uCisKKyAgICAvLyBUT0RPOiBkb2VzIGl0IG1ha2Ugc2Vuc2UgdG8gY2hlY2sgX19rbXBfcm9vdHNbXSA/CisKKyAgICAvLyBMZXQncyBjaGVjayB0aGF0IHRoZXJlIGFyZSBubyBvdGhlciBhbGl2ZSB0aHJlYWRzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgT01QIGxpYi4KKyAgICB3aGlsZSggMSApIHsKKyAgICAgICAgdGhyZWFkX2NvdW50ID0gMDsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7ICsraSApIHsKKyAgICAgICAgICAgIGlmKCAhX19rbXBfdGhyZWFkcyApIGNvbnRpbnVlOworICAgICAgICAgICAga21wX2luZm9fdCogdGggPSBfX2ttcF90aHJlYWRzWyBpIF07CisgICAgICAgICAgICBpZiggdGggPT0gTlVMTCApIGNvbnRpbnVlOworICAgICAgICAgICAgaW50IGd0aWQgPSB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkOworICAgICAgICAgICAgaWYoIGd0aWQgPT0gZ3RpZF9yZXEgKSBjb250aW51ZTsKKyAgICAgICAgICAgIGlmKCBndGlkIDwgMCApIGNvbnRpbnVlOworICAgICAgICAgICAgRFdPUkQgZXhpdF92YWw7CisgICAgICAgICAgICBpbnQgYWxpdmUgPSBfX2ttcF9pc190aHJlYWRfYWxpdmUoIHRoLCAmZXhpdF92YWwgKTsKKyAgICAgICAgICAgIGlmKCBhbGl2ZSApIHsKKyAgICAgICAgICAgICsrdGhyZWFkX2NvdW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKCB0aHJlYWRfY291bnQgPT0gMCApIGJyZWFrOyAvLyBzdWNjZXNzCisgICAgfQorCisgICAgLy8gQXNzdW1lIHRoYXQgSSdtIGFsb25lLgorCisgICAgLy8gTm93IGl0IG1pZ2h0IGJlIHByb2JhYmx5IHNhZmUgdG8gY2hlY2sgYW5kIHJlc2V0IGxvY2tzLgorICAgIC8vIF9fa21wX2Zvcmtqb2luX2xvY2sgYW5kIF9fa21wX3N0ZGlvX2xvY2sgYXJlIGV4cGVjdGVkIHRvIGJlIHJlc2V0LgorICAgIF9fa21wX3Jlc2V0X2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisgICAgI2lmZGVmIEtNUF9ERUJVRworICAgIF9fa21wX3Jlc2V0X2xvY2soICZfX2ttcF9zdGRpb19sb2NrICk7CisgICAgI2VuZGlmIC8vIEtNUF9ERUJVRworCisKK30KKworQk9PTCBXSU5BUEkKK0RsbE1haW4oIEhJTlNUQU5DRSBoSW5zdERMTCwgRFdPUkQgZmR3UmVhc29uLCBMUFZPSUQgbHBSZXNlcnZlZCApIHsKKyAgICAvL19fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisKKyAgICBzd2l0Y2goIGZkd1JlYXNvbiApIHsKKworICAgICAgICBjYXNlIERMTF9QUk9DRVNTX0FUVEFDSDoKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJEbGxNYWluOiBQUk9DRVNTX0FUVEFDSFxuIiApKTsKKworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisKKyAgICAgICAgY2FzZSBETExfUFJPQ0VTU19ERVRBQ0g6CisgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiRGxsTWFpbjogUFJPQ0VTU19ERVRBQ0ggVCMlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZ2V0X3NwZWNpZmljKCkgKSk7CisKKyAgICAgICAgICAgIGlmKCBscFJlc2VydmVkICE9IE5VTEwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGxwUmVzZXJ2ZWQgaXMgdXNlZCBmb3IgdGVsbGluZyB0aGUgZGlmZmVyZW5jZToKKyAgICAgICAgICAgICAgICAvLyAgbHBSZXNlcnZlZCA9PSBOVUxMIHdoZW4gRnJlZUxpYnJhcnkoKSB3YXMgY2FsbGVkLAorICAgICAgICAgICAgICAgIC8vICBscFJlc2VydmVkICE9IE5VTEwgd2hlbiB0aGUgcHJvY2VzcyB0ZXJtaW5hdGVzLgorICAgICAgICAgICAgICAgIC8vIFdoZW4gRnJlZUxpYnJhcnkoKSBpcyBjYWxsZWQsIHdvcmtlciB0aHJlYWRzIHJlbWFpbiBhbGl2ZS4KKyAgICAgICAgICAgICAgICAvLyBTbyB0aGV5IHdpbGwgcmVsZWFzZSB0aGUgZm9ya2pvaW4gbG9jayBieSB0aGVtc2VsdmVzLgorICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIHByb2Nlc3MgdGVybWluYXRlcywgd29ya2VyIHRocmVhZHMgZGlzYXBwZWFyIHRyaWdnZXJpbmcKKyAgICAgICAgICAgICAgICAvLyB0aGUgcHJvYmxlbSBvZiB1bnJlbGVhc2VkIGZvcmtqb2luIGxvY2sgYXMgZGVzY3JpYmVkIGJlbG93LgorCisgICAgICAgICAgICAgICAgLy8gQSB3b3JrZXIgdGhyZWFkIGNhbiB0YWtlIHRoZSBmb3Jram9pbiBsb2NrCisgICAgICAgICAgICAgICAgLy8gaW4gX19rbXBfc3VzcGVuZCgpLT5fX2ttcF9ybWxfZGVjcmVhc2VfbG9hZF9iZWZvcmVfc2xlZXAoKS4KKyAgICAgICAgICAgICAgICAvLyBUaGUgcHJvYmxlbSBjb21lcyB1cCBpZiB0aGF0IHdvcmtlciB0aHJlYWQgYmVjb21lcyBkZWFkCisgICAgICAgICAgICAgICAgLy8gYmVmb3JlIGl0IHJlbGVhc2VzIHRoZSBmb3Jram9pbiBsb2NrLgorICAgICAgICAgICAgICAgIC8vIFRoZSBmb3Jram9pbiBsb2NrIHJlbWFpbnMgdGFrZW4sIHdoaWxlIHRoZSB0aHJlYWQKKyAgICAgICAgICAgICAgICAvLyBleGVjdXRpbmcgRGxsTWFpbigpLT5QUk9DRVNTX0RFVEFDSC0+X19rbXBfaW50ZXJuYWxfZW5kX2xpYnJhcnkoKSBiZWxvdworICAgICAgICAgICAgICAgIC8vIHdpbGwgdHJ5IHRvIHRha2UgdGhlIGZvcmtqb2luIGxvY2sgYW5kIHdpbGwgYWx3YXlzIGZhaWwsCisgICAgICAgICAgICAgICAgLy8gc28gdGhhdCB0aGUgYXBwbGljYXRpb24gd2lsbCBuZXZlciBmaW5pc2ggW25vcm1hbGx5XS4KKyAgICAgICAgICAgICAgICAvLyBUaGlzIHNjZW5hcmlvIGlzIHBvc3NpYmxlIGlmIF9fa21wY19lbmQoKSBoYXMgbm90IGJlZW4gZXhlY3V0ZWQuCisgICAgICAgICAgICAgICAgLy8gSXQgbG9va3MgbGlrZSBpdCdzIG5vdCBhIGNvcm5lciBjYXNlLCBidXQgY29tbW9uIGNhc2VzOgorICAgICAgICAgICAgICAgIC8vIC0gdGhlIG1haW4gZnVuY3Rpb24gd2FzIGNvbXBpbGVkIGJ5IGFuIGFsdGVybmF0aXZlIGNvbXBpbGVyOworICAgICAgICAgICAgICAgIC8vIC0gdGhlIG1haW4gZnVuY3Rpb24gd2FzIGNvbXBpbGVkIGJ5IGljbCBidXQgd2l0aG91dCAvUW9wZW5tcCAoYXBwbGljYXRpb24gd2l0aCBwbHVnaW5zKTsKKyAgICAgICAgICAgICAgICAvLyAtIGFwcGxpY2F0aW9uIHRlcm1pbmF0ZXMgYnkgY2FsbGluZyBDIGV4aXQoKSwgRm9ydHJhbiBDQUxMIEVYSVQoKSBvciBGb3J0cmFuIFNUT1AuCisgICAgICAgICAgICAgICAgLy8gLSBhbGl2ZSBmb3JlaWduIHRocmVhZCBwcmV2ZW50ZWQgX19rbXBjX2VuZCBmcm9tIGRvaW5nIGNsZWFudXAuCisKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgaGFjayB0byB3b3JrIGFyb3VuZCB0aGUgcHJvYmxlbS4KKyAgICAgICAgICAgICAgICAvLyBUT0RPOiAhISEgdG8gZmlndXJlIG91dCBzb21ldGhpbmcgYmV0dGVyLgorICAgICAgICAgICAgICAgIF9fa21wX3Jlc2V0X2xvY2tzX29uX3Byb2Nlc3NfZGV0YWNoKCBfX2ttcF9ndGlkX2dldF9zcGVjaWZpYygpICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5KCBfX2ttcF9ndGlkX2dldF9zcGVjaWZpYygpICk7CisKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworCisgICAgICAgIGNhc2UgRExMX1RIUkVBRF9BVFRBQ0g6CisgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiRGxsTWFpbjogVEhSRUFEX0FUVEFDSFxuIiApKTsKKworICAgICAgICAgICAgLyogaWYgd2Ugd2FudGVkIHRvIHJlZ2lzdGVyIG5ldyBzaWJsaW5ncyBhbGwgdGhlIHRpbWUgaGVyZSBjYWxsCisgICAgICAgICAgICAgKiBfX2ttcF9nZXRfZ3RpZCgpOyAqLworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisKKyAgICAgICAgY2FzZSBETExfVEhSRUFEX0RFVEFDSDoKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJEbGxNYWluOiBUSFJFQURfREVUQUNIIFQjJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2dldF9zcGVjaWZpYygpICkpOworCisgICAgICAgICAgICBfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkKCBfX2ttcF9ndGlkX2dldF9zcGVjaWZpYygpICk7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworIyBlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworI2VuZGlmIC8qIEdVSURFRExMX0VYUE9SVFMgKi8KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogQ2hhbmdlIHRoZSBsaWJyYXJ5IHR5cGUgdG8gInN0YXR1cyIgYW5kIHJldHVybiB0aGUgb2xkIHR5cGUgKi8KKy8qIGNhbGxlZCBmcm9tIHdpdGhpbiBpbml0aWFsaXphdGlvbiByb3V0aW5lcyB3aGVyZSBfX2ttcF9pbml0el9sb2NrIGlzIGhlbGQgKi8KK2ludAorX19rbXBfY2hhbmdlX2xpYnJhcnkoIGludCBzdGF0dXMgKQoreworICAgIGludCBvbGRfc3RhdHVzOworCisgICAgb2xkX3N0YXR1cyA9IF9fa21wX3lpZWxkX2luaXQgJiAxOyAgLy8gY2hlY2sgd2hldGhlciBLTVBfTElCUkFSWT10aHJvdWdocHV0IChldmVuIGluaXQgY291bnQpCisKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIF9fa21wX3lpZWxkX2luaXQgfD0gMTsgIC8vIHRocm91Z2hwdXQgPT4gdHVybmFyb3VuZCAob2RkIGluaXQgY291bnQpCisgICAgfQorICAgIGVsc2UgeworICAgICAgICBfX2ttcF95aWVsZF9pbml0ICY9IH4xOyAvLyB0dXJuYXJvdW5kID0+IHRocm91Z2hwdXQgKGV2ZW4gaW5pdCBjb3VudCkKKyAgICB9CisKKyAgICByZXR1cm4gb2xkX3N0YXR1czsgIC8vIHJldHVybiBwcmV2aW91cyBzZXR0aW5nIG9mIHdoZXRoZXIgS01QX0xJQlJBUlk9dGhyb3VnaHB1dAorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBfX2ttcF9wYXJhbGxlbF9kZW8gLS0KKyAqIFdhaXQgdW50aWwgaXQncyBvdXIgdHVybi4KKyAqLwordm9pZAorX19rbXBfcGFyYWxsZWxfZGVvKCBpbnQgKmd0aWRfcmVmLCBpbnQgKmNpZF9yZWYsIGlkZW50X3QgKmxvY19yZWYgKQoreworICAgIGludCBndGlkID0gKmd0aWRfcmVmOworI2lmZGVmIEJVSUxEX1BBUkFMTEVMX09SREVSRUQKKyAgICBrbXBfdGVhbV90ICp0ZWFtID0gX19rbXBfdGVhbV9mcm9tX2d0aWQoIGd0aWQgKTsKKyNlbmRpZiAvKiBCVUlMRF9QQVJBTExFTF9PUkRFUkVEICovCisKKyAgICBpZiggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBpZiggX19rbXBfdGhyZWFkc1tndGlkXSAtPiB0aC50aF9yb290IC0+IHIucl9hY3RpdmUgKQorICAgICAgICAgICAgX19rbXBfcHVzaF9zeW5jKCBndGlkLCBjdF9vcmRlcmVkX2luX3BhcmFsbGVsLCBsb2NfcmVmLCBOVUxMICk7CisgICAgfQorI2lmZGVmIEJVSUxEX1BBUkFMTEVMX09SREVSRUQKKyAgICBpZiggIXRlYW0gLT4gdC50X3NlcmlhbGl6ZWQgKSB7CisgICAgICAgIGttcF91aW50MzIgIHNwaW5zOworCisgICAgICAgIEtNUF9NQigpOworICAgICAgICBLTVBfV0FJVF9ZSUVMRCgmdGVhbSAtPiB0LnRfb3JkZXJlZC5kdC50X3ZhbHVlLCBfX2ttcF90aWRfZnJvbV9ndGlkKCBndGlkICksIEtNUF9FUSwgTlVMTCk7CisgICAgICAgIEtNUF9NQigpOworICAgIH0KKyNlbmRpZiAvKiBCVUlMRF9QQVJBTExFTF9PUkRFUkVEICovCit9CisKKy8qIF9fa21wX3BhcmFsbGVsX2R4byAtLQorICogU2lnbmFsIHRoZSBuZXh0IHRhc2suCisgKi8KKwordm9pZAorX19rbXBfcGFyYWxsZWxfZHhvKCBpbnQgKmd0aWRfcmVmLCBpbnQgKmNpZF9yZWYsIGlkZW50X3QgKmxvY19yZWYgKQoreworICAgIGludCBndGlkID0gKmd0aWRfcmVmOworI2lmZGVmIEJVSUxEX1BBUkFMTEVMX09SREVSRUQKKyAgICBpbnQgdGlkID0gIF9fa21wX3RpZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICBrbXBfdGVhbV90ICp0ZWFtID0gX19rbXBfdGVhbV9mcm9tX2d0aWQoIGd0aWQgKTsKKyNlbmRpZiAvKiBCVUlMRF9QQVJBTExFTF9PUkRFUkVEICovCisKKyAgICBpZiggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBpZiggX19rbXBfdGhyZWFkc1tndGlkXSAtPiB0aC50aF9yb290IC0+IHIucl9hY3RpdmUgKQorICAgICAgICAgICAgX19rbXBfcG9wX3N5bmMoIGd0aWQsIGN0X29yZGVyZWRfaW5fcGFyYWxsZWwsIGxvY19yZWYgKTsKKyAgICB9CisjaWZkZWYgQlVJTERfUEFSQUxMRUxfT1JERVJFRAorICAgIGlmICggISB0ZWFtIC0+IHQudF9zZXJpYWxpemVkICkgeworICAgICAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgICAgICAvKiB1c2UgdGhlIHRpZCBvZiB0aGUgbmV4dCB0aHJlYWQgaW4gdGhpcyB0ZWFtICovCisgICAgICAgIC8qIFRPRE8gcmVwbGVhY2Ugd2l0aCBnZW5lcmFsIHJlbGVhc2UgcHJvY2VkdXJlICovCisgICAgICAgIHRlYW0gLT4gdC50X29yZGVyZWQuZHQudF92YWx1ZSA9ICgodGlkICsgMSkgJSB0ZWFtLT50LnRfbnByb2MgKTsKKworICAgICAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKyAgICB9CisjZW5kaWYgLyogQlVJTERfUEFSQUxMRUxfT1JERVJFRCAqLworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBUaGUgQkFSUklFUiBmb3IgYSBTSU5HTEUgcHJvY2VzcyBzZWN0aW9uIGlzIGFsd2F5cyBleHBsaWNpdCAgICovCisKK2ludAorX19rbXBfZW50ZXJfc2luZ2xlKCBpbnQgZ3RpZCwgaWRlbnRfdCAqaWRfcmVmLCBpbnQgcHVzaF93cyApCit7CisgICAgaW50IHN0YXR1czsKKyAgICBrbXBfaW5mb190ICp0aDsKKyAgICBrbXBfdGVhbV90ICp0ZWFtOworCisgICAgaWYoICEgVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkgKQorICAgICAgICBfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCk7CisKKyAgICB0aCAgID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIHRlYW0gPSB0aCAtPiB0aC50aF90ZWFtOworICAgIHN0YXR1cyA9IDA7CisKKyAgICB0aC0+dGgudGhfaWRlbnQgPSBpZF9yZWY7CisKKyAgICBpZiAoIHRlYW0gLT4gdC50X3NlcmlhbGl6ZWQgKSB7CisgICAgICAgIHN0YXR1cyA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAga21wX2ludDMyIG9sZF90aGlzID0gdGgtPnRoLnRoX2xvY2FsLnRoaXNfY29uc3RydWN0OworCisgICAgICAgICsrdGgtPnRoLnRoX2xvY2FsLnRoaXNfY29uc3RydWN0OworICAgICAgICAvKiB0cnkgdG8gc2V0IHRlYW0gY291bnQgdG8gdGhyZWFkIGNvdW50LS1zdWNjZXNzIG1lYW5zIHRocmVhZCBnb3QgdGhlCisgICAgICAgICAgIHNpbmdsZSBibG9jaworICAgICAgICAqLworICAgICAgICAvKiBUT0RPOiBTaG91bGQgdGhpcyBiZSBhY3F1aXJlIG9yIHJlbGVhc2U/ICovCisgICAgICAgIHN0YXR1cyA9IEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMigmdGVhbSAtPiB0LnRfY29uc3RydWN0LCBvbGRfdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9sb2NhbC50aGlzX2NvbnN0cnVjdCk7CisgICAgfQorCisgICAgaWYoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgaWYgKHN0YXR1cyAmJiBwdXNoX3dzKSB7CisgICAgICAgICAgICBfX2ttcF9wdXNoX3dvcmtzaGFyZSggZ3RpZCwgY3RfcHNpbmdsZSwgaWRfcmVmICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfX2ttcF9jaGVja193b3Jrc2hhcmUoIGd0aWQsIGN0X3BzaW5nbGUsIGlkX3JlZiApOworICAgICAgICB9CisgICAgfQorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBpZiAoIHN0YXR1cyApIHsKKyAgICAgICAgX19rbXBfaXR0X3NpbmdsZV9zdGFydCggZ3RpZCApOworICAgIH0KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgcmV0dXJuIHN0YXR1czsKK30KKwordm9pZAorX19rbXBfZXhpdF9zaW5nbGUoIGludCBndGlkICkKK3sKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X3NpbmdsZV9lbmQoIGd0aWQgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgaWYoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApCisgICAgICAgIF9fa21wX3BvcF93b3Jrc2hhcmUoIGd0aWQsIGN0X3BzaW5nbGUsIE5VTEwgKTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZAorX19rbXBfbGluZWFyX2JhcnJpZXJfZ2F0aGVyKCBlbnVtIGJhcnJpZXJfdHlwZSBidCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2luZm9fdCAqdGhpc190aHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqcmVkdWNlKSh2b2lkICosIHZvaWQgKikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqIGl0dF9zeW5jX29iaikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworICAgIHJlZ2lzdGVyIGttcF90ZWFtX3QgICAgKnRlYW0gICAgICAgICAgPSB0aGlzX3RociAtPiB0aC50aF90ZWFtOworICAgIHJlZ2lzdGVyIGttcF9ic3RhdGVfdCAgKnRocl9iYXIgICAgICAgPSAmIHRoaXNfdGhyIC0+IHRoLnRoX2JhclsgYnQgXS5iYjsKKyAgICByZWdpc3RlciBrbXBfaW5mb190ICAgKipvdGhlcl90aHJlYWRzID0gdGVhbSAtPiB0LnRfdGhyZWFkczsKKworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9saW5lYXJfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIGVudGVyIGZvciBiYXJyaWVyIHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGJ0ICkgKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyID09IG90aGVyX3RocmVhZHNbdGhpc190aHItPnRoLnRoX2luZm8uZHMuZHNfdGlkXSApOworCisgICAgLyoKKyAgICAgKiBXZSBub3cgcGVyZm9ybSBhIGxpbmVhciByZWR1Y3Rpb24gdG8gc2lnbmFsIHRoYXQgYWxsCisgICAgICogb2YgdGhlIHRocmVhZHMgaGF2ZSBhcnJpdmVkLgorICAgICAqCisgICAgICogQ29sbGVjdCBhbGwgdGhlIHdvcmtlciB0ZWFtIG1lbWJlciB0aHJlYWRzLgorICAgICAqLworICAgIGlmICggISBLTVBfTUFTVEVSX1RJRCggdGlkICkpIHsKKworICAgICAgICBLQV9UUkFDRSggMjAsICggIl9fa21wX2xpbmVhcl9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgcmVsZWFzaW5nIFQjJWQoJWQ6JWQpIgorICAgICAgICAgICAgICAgICAgICAgICAgImFycml2ZWQoJXApOiAldSA9PiAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RpZCggMCwgdGVhbSApLCB0ZWFtLT50LnRfaWQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAmdGhyX2JhciAtPiBiX2Fycml2ZWQsIHRocl9iYXIgLT4gYl9hcnJpdmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgdGhyX2JhciAtPiBiX2Fycml2ZWQgKyBLTVBfQkFSUklFUl9TVEFURV9CVU1QCisgICAgICAgICAgICAgICAgICAgICAgKSApOworCisgICAgICAgIC8qIG1hcmsgYXJyaXZhbCB0byBtYXN0ZXIgdGhyZWFkICovCisgICAgICAgIC8vCisgICAgICAgIC8vIEFmdGVyIHBlcmZvcm1pbmcgdGhpcyB3cml0ZSwgYSB3b3JrZXIgdGhyZWFkIG1heSBub3QgYXNzdW1lIHRoYXQKKyAgICAgICAgLy8gdGhlIHRlYW0gaXMgdmFsaWQgYW55IG1vcmUgLSBpdCBjb3VsZCBiZSBkZWFsbG9jYXRlZCBieSB0aGUgbWFzdGVyCisgICAgICAgIC8vIHRocmVhZCBhdCBhbnkgdGltZS4KKyAgICAgICAgLy8KKyAgICAgICAgX19rbXBfcmVsZWFzZSggb3RoZXJfdGhyZWFkc1swXSwgJnRocl9iYXIgLT4gYl9hcnJpdmVkLCBrbXBfcmVsZWFzZV9mZW5jZSApOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVnaXN0ZXIga21wX2JhbGlnbl90ZWFtX3QgKnRlYW1fYmFyICA9ICYgdGVhbSAtPiB0LnRfYmFyWyBidCBdOworICAgICAgICByZWdpc3RlciBpbnQgICAgICAgICAgICAgICAgbnByb2MgICAgID0gdGhpc190aHIgLT4gdGgudGhfdGVhbV9ucHJvYzsKKyAgICAgICAgcmVnaXN0ZXIgaW50ICAgICAgICAgICAgICAgIGk7CisgICAgICAgIC8qIERvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgc2xlZXAgYml0IGhlcmUgb3IgYXRvbWljIHNpbmNlIHRlYW0gc2V0dGluZyAqLworICAgICAgICByZWdpc3RlciBrbXBfdWludCAgICAgICAgICAgbmV3X3N0YXRlICA9IHRlYW1fYmFyIC0+IGJfYXJyaXZlZCArIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVA7CisKKyAgICAgICAgLyogQ29sbGVjdCBhbGwgdGhlIHdvcmtlciB0ZWFtIG1lbWJlciB0aHJlYWRzLiAqLworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgbnByb2M7IGkrKykgeworI2lmIEtNUF9DQUNIRV9NQU5BR0UKKyAgICAgICAgICAgIC8qIHByZWZldGNoIG5leHQgdGhyZWFkJ3MgYXJyaXZlZCBjb3VudCAqLworICAgICAgICAgICAgaWYgKCBpKzEgPCBucHJvYyApCisgICAgICAgICAgICAgICAgS01QX0NBQ0hFX1BSRUZFVENIKCAmb3RoZXJfdGhyZWFkc1sgaSsxIF0gLT4gdGgudGhfYmFyWyBidCBdLmJiLmJfYXJyaXZlZCApOworI2VuZGlmIC8qIEtNUF9DQUNIRV9NQU5BR0UgKi8KKyAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfbGluZWFyX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSB3YWl0IFQjJWQoJWQ6JWQpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJyaXZlZCglcCkgPT0gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RpZCggaSwgdGVhbSApLCB0ZWFtLT50LnRfaWQsIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm90aGVyX3RocmVhZHNbaV0gLT4gdGgudGhfYmFyWyBidCBdLmJiLmJfYXJyaXZlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfc3RhdGUgKSApOworCisgICAgICAgICAgICAvKiB3YWl0IGZvciB3b3JrZXIgdGhyZWFkIHRvIGFycml2ZSAqLworICAgICAgICAgICAgX19rbXBfd2FpdF9zbGVlcCggdGhpc190aHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIG90aGVyX3RocmVhZHNbIGkgXSAtPiB0aC50aF9iYXJbIGJ0IF0uYmIuYl9hcnJpdmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3N0YXRlLCBGQUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoIGl0dF9zeW5jX29iaiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICBpZiAocmVkdWNlKSB7CisKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSggMTAwLCAoICJfX2ttcF9saW5lYXJfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpICs9IFQjJWQoJWQ6JWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGlkKCBpLCB0ZWFtICksIHRlYW0tPnQudF9pZCwgaSApICk7CisKKyAgICAgICAgICAgICAgICAoKnJlZHVjZSkoIHRoaXNfdGhyIC0+IHRoLnRoX2xvY2FsLnJlZHVjZV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfdGhyZWFkc1sgaSBdIC0+IHRoLnRoX2xvY2FsLnJlZHVjZV9kYXRhICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgLyogRG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBzbGVlcCBiaXQgaGVyZSBvciBhdG9taWMgc2luY2UgdGVhbSBzZXR0aW5nICovCisgICAgICAgIHRlYW1fYmFyIC0+IGJfYXJyaXZlZCA9IG5ld19zdGF0ZTsKKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF9saW5lYXJfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIHNldCB0ZWFtICVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJhcnJpdmVkKCVwKSA9ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIHRlYW0tPnQudF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ0ZWFtX2JhciAtPiBiX2Fycml2ZWQsIG5ld19zdGF0ZSApICk7CisgICAgfQorCisgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF9saW5lYXJfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIGV4aXQgZm9yIGJhcnJpZXIgdHlwZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGJ0ICkgKTsKK30KKworCitzdGF0aWMgdm9pZAorX19rbXBfdHJlZV9iYXJyaWVyX2dhdGhlciggZW51bSBiYXJyaWVyX3R5cGUgYnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW5mb190ICp0aGlzX3RociwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpyZWR1Y2UpICh2b2lkICosIHZvaWQgKikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKCB2b2lkICogaXR0X3N5bmNfb2JqICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgICByZWdpc3RlciBrbXBfdGVhbV90ICAgICp0ZWFtICAgICAgICAgID0gdGhpc190aHIgLT4gdGgudGhfdGVhbTsKKyAgICByZWdpc3RlciBrbXBfYnN0YXRlX3QgICp0aHJfYmFyICAgICAgID0gJiB0aGlzX3RociAtPiB0aC50aF9iYXJbIGJ0IF0uYmI7CisgICAgcmVnaXN0ZXIga21wX2luZm9fdCAgICoqb3RoZXJfdGhyZWFkcyA9IHRlYW0gLT4gdC50X3RocmVhZHM7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiAgICAgbnByb2MgICAgICAgICA9IHRoaXNfdGhyIC0+IHRoLnRoX3RlYW1fbnByb2M7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiAgICAgYnJhbmNoX2JpdHMgICA9IF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JyYW5jaF9iaXRzWyBidCBdOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgICAgIGJyYW5jaF9mYWN0b3IgPSAxIDw8IGJyYW5jaF9iaXRzIDsKKyAgICByZWdpc3RlciBrbXBfdWludDMyICAgICBjaGlsZDsKKyAgICByZWdpc3RlciBrbXBfdWludDMyICAgICBjaGlsZF90aWQ7CisgICAgcmVnaXN0ZXIga21wX3VpbnQgICAgICAgbmV3X3N0YXRlOworCisgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF90cmVlX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSBlbnRlciBmb3IgYmFycmllciB0eXBlICVkXG4iLAorICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgYnQgKSApOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHIgPT0gb3RoZXJfdGhyZWFkc1t0aGlzX3Roci0+dGgudGhfaW5mby5kcy5kc190aWRdICk7CisKKyAgICAvKgorICAgICAqIFdlIG5vdyBwZXJmb3JtIGEgdHJlZSBnYXRoZXIgdG8gd2FpdCB1bnRpbCBhbGwKKyAgICAgKiBvZiB0aGUgdGhyZWFkcyBoYXZlIGFycml2ZWQsIGFuZCByZWR1Y2UgYW55IHJlcXVpcmVkIGRhdGEKKyAgICAgKiBhcyB3ZSBnby4KKyAgICAgKi8KKworICAgIGNoaWxkX3RpZCA9ICh0aWQgPDwgYnJhbmNoX2JpdHMpICsgMTsKKworICAgIGlmICggY2hpbGRfdGlkIDwgbnByb2MgKSB7CisKKyAgICAgICAgLyogcGFyZW50IHRocmVhZHMgd2FpdCBmb3IgYWxsIHRoZWlyIGNoaWxkcmVuIHRvIGFycml2ZSAqLworICAgICAgICBuZXdfc3RhdGUgPSB0ZWFtIC0+IHQudF9iYXJbIGJ0IF0uYl9hcnJpdmVkICsgS01QX0JBUlJJRVJfU1RBVEVfQlVNUDsKKyAgICAgICAgY2hpbGQgPSAxOworCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHJlZ2lzdGVyIGttcF9pbmZvX3QgICAqY2hpbGRfdGhyID0gb3RoZXJfdGhyZWFkc1sgY2hpbGRfdGlkIF07CisgICAgICAgICAgICByZWdpc3RlciBrbXBfYnN0YXRlX3QgKmNoaWxkX2JhciA9ICYgY2hpbGRfdGhyIC0+IHRoLnRoX2JhclsgYnQgXS5iYjsKKyNpZiBLTVBfQ0FDSEVfTUFOQUdFCisgICAgICAgICAgICAvKiBwcmVmZXRjaCBuZXh0IHRocmVhZCdzIGFycml2ZWQgY291bnQgKi8KKyAgICAgICAgICAgIGlmICggY2hpbGQrMSA8PSBicmFuY2hfZmFjdG9yICYmIGNoaWxkX3RpZCsxIDwgbnByb2MgKQorICAgICAgICAgICAgICAgIEtNUF9DQUNIRV9QUkVGRVRDSCggJm90aGVyX3RocmVhZHNbIGNoaWxkX3RpZCsxIF0gLT4gdGgudGhfYmFyWyBidCBdLmJiLmJfYXJyaXZlZCApOworI2VuZGlmIC8qIEtNUF9DQUNIRV9NQU5BR0UgKi8KKyAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfdHJlZV9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgd2FpdCBUIyVkKCVkOiV1KSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFycml2ZWQoJXApID09ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aWQoIGNoaWxkX3RpZCwgdGVhbSApLCB0ZWFtLT50LnRfaWQsIGNoaWxkX3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hpbGRfYmFyIC0+IGJfYXJyaXZlZCwgbmV3X3N0YXRlICkgKTsKKworICAgICAgICAgICAgLyogd2FpdCBmb3IgY2hpbGQgdG8gYXJyaXZlICovCisgICAgICAgICAgICBfX2ttcF93YWl0X3NsZWVwKCB0aGlzX3RociwgJmNoaWxkX2JhciAtPiBiX2Fycml2ZWQsIG5ld19zdGF0ZSwgRkFMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKCBpdHRfc3luY19vYmopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICBpZiAocmVkdWNlKSB7CisKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSggMTAwLCAoICJfX2ttcF90cmVlX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSArPSBUIyVkKCVkOiV1KVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RpZCggY2hpbGRfdGlkLCB0ZWFtICksIHRlYW0tPnQudF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkX3RpZCApICk7CisKKyAgICAgICAgICAgICAgICAoKnJlZHVjZSkoIHRoaXNfdGhyIC0+IHRoLnRoX2xvY2FsLnJlZHVjZV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRfdGhyIC0+IHRoLnRoX2xvY2FsLnJlZHVjZV9kYXRhICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2hpbGQrKzsKKyAgICAgICAgICAgIGNoaWxkX3RpZCsrOworICAgICAgICB9CisgICAgICAgIHdoaWxlICggY2hpbGQgPD0gYnJhbmNoX2ZhY3RvciAmJiBjaGlsZF90aWQgPCBucHJvYyApOworICAgIH0KKworICAgIGlmICggIUtNUF9NQVNURVJfVElEKHRpZCkgKSB7CisgICAgICAgIC8qIHdvcmtlciB0aHJlYWRzICovCisgICAgICAgIHJlZ2lzdGVyIGttcF9pbnQzMiBwYXJlbnRfdGlkID0gKHRpZCAtIDEpID4+IGJyYW5jaF9iaXRzOworCisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfdHJlZV9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgcmVsZWFzaW5nIFQjJWQoJWQ6JWQpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJhcnJpdmVkKCVwKTogJXUgPT4gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aWQoIHBhcmVudF90aWQsIHRlYW0gKSwgdGVhbS0+dC50X2lkLCBwYXJlbnRfdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRocl9iYXIgLT4gYl9hcnJpdmVkLCB0aHJfYmFyIC0+IGJfYXJyaXZlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocl9iYXIgLT4gYl9hcnJpdmVkICsgS01QX0JBUlJJRVJfU1RBVEVfQlVNUAorICAgICAgICAgICAgICAgICAgICAgICkgKTsKKworICAgICAgICAvKiBtYXJrIGFycml2YWwgdG8gcGFyZW50IHRocmVhZCAqLworICAgICAgICAvLworICAgICAgICAvLyBBZnRlciBwZXJmb3JtaW5nIHRoaXMgd3JpdGUsIGEgd29ya2VyIHRocmVhZCBtYXkgbm90IGFzc3VtZSB0aGF0CisgICAgICAgIC8vIHRoZSB0ZWFtIGlzIHZhbGlkIGFueSBtb3JlIC0gaXQgY291bGQgYmUgZGVhbGxvY2F0ZWQgYnkgdGhlIG1hc3RlcgorICAgICAgICAvLyB0aHJlYWQgYXQgYW55IHRpbWUuCisgICAgICAgIC8vCisgICAgICAgIF9fa21wX3JlbGVhc2UoIG90aGVyX3RocmVhZHNbcGFyZW50X3RpZF0sICZ0aHJfYmFyIC0+IGJfYXJyaXZlZCwga21wX3JlbGVhc2VfZmVuY2UgKTsKKworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIE5lZWQgdG8gdXBkYXRlIHRoZSB0ZWFtIGFycml2ZWQgcG9pbnRlciBpZiB3ZSBhcmUgdGhlIG1hc3RlciB0aHJlYWQgKi8KKworICAgICAgICBpZiAoIG5wcm9jID4gMSApCisgICAgICAgICAgICAvKiBOZXcgdmFsdWUgd2FzIGFscmVhZHkgY29tcHV0ZWQgYWJvdmUgKi8KKyAgICAgICAgICAgIHRlYW0gLT4gdC50X2JhclsgYnQgXS5iX2Fycml2ZWQgPSBuZXdfc3RhdGU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRlYW0gLT4gdC50X2JhclsgYnQgXS5iX2Fycml2ZWQgKz0gS01QX0JBUlJJRVJfU1RBVEVfQlVNUDsKKworICAgICAgICBLQV9UUkFDRSggMjAsICggIl9fa21wX3RyZWVfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIHNldCB0ZWFtICVkIGFycml2ZWQoJXApID0gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgdGVhbS0+dC50X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRlYW0tPnQudF9iYXJbYnRdLmJfYXJyaXZlZCwgdGVhbS0+dC50X2JhcltidF0uYl9hcnJpdmVkICkgKTsKKyAgICB9CisKKyAgICBLQV9UUkFDRSggMjAsICggIl9fa21wX3RyZWVfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIGV4aXQgZm9yIGJhcnJpZXIgdHlwZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGJ0ICkgKTsKK30KKworCitzdGF0aWMgdm9pZAorX19rbXBfaHlwZXJfYmFycmllcl9nYXRoZXIoIGVudW0gYmFycmllcl90eXBlIGJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKnJlZHVjZSkgKHZvaWQgKiwgdm9pZCAqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHICh2b2lkICogaXR0X3N5bmNfb2JqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgICByZWdpc3RlciBrbXBfdGVhbV90ICAgICp0ZWFtICAgICAgICAgID0gdGhpc190aHIgLT4gdGgudGhfdGVhbTsKKyAgICByZWdpc3RlciBrbXBfYnN0YXRlX3QgICp0aHJfYmFyICAgICAgID0gJiB0aGlzX3RociAtPiB0aC50aF9iYXJbIGJ0IF0uYmI7CisgICAgcmVnaXN0ZXIga21wX2luZm9fdCAgICoqb3RoZXJfdGhyZWFkcyA9IHRlYW0gLT4gdC50X3RocmVhZHM7CisgICAgcmVnaXN0ZXIga21wX3VpbnQgICAgICAgbmV3X3N0YXRlICAgICA9IEtNUF9CQVJSSUVSX1VOVVNFRF9TVEFURTsKKyAgICByZWdpc3RlciBrbXBfdWludDMyICAgICBudW1fdGhyZWFkcyAgID0gdGhpc190aHIgLT4gdGgudGhfdGVhbV9ucHJvYzsKKyAgICByZWdpc3RlciBrbXBfdWludDMyICAgICBicmFuY2hfYml0cyAgID0gX19rbXBfYmFycmllcl9nYXRoZXJfYnJhbmNoX2JpdHNbIGJ0IF07CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiAgICAgYnJhbmNoX2ZhY3RvciA9IDEgPDwgYnJhbmNoX2JpdHMgOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgICAgIG9mZnNldDsKKyAgICByZWdpc3RlciBrbXBfdWludDMyICAgICBsZXZlbDsKKworICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfaHlwZXJfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIGVudGVyIGZvciBiYXJyaWVyIHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBidCApICk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3RociA9PSBvdGhlcl90aHJlYWRzW3RoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX3RpZF0gKTsKKworI2lmIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICAvLyBCYXJyaWVyIGltYmFsYW5jZSAtIHNhdmUgYXJyaXZlIHRpbWUgdG8gdGhlIHRocmVhZAorICAgIGlmKCBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9PSAyIHx8IF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDMgKSB7CisgICAgICAgIHRoaXNfdGhyLT50aC50aF9iYXJfYXJyaXZlX3RpbWUgPSBfX2l0dF9nZXRfdGltZXN0YW1wKCk7CisgICAgfQorI2VuZGlmCisgICAgLyoKKyAgICAgKiBXZSBub3cgcGVyZm9ybSBhIGh5cGVyY3ViZS1lbWJlZGRlZCB0cmVlIGdhdGhlciB0byB3YWl0IHVudGlsIGFsbAorICAgICAqIG9mIHRoZSB0aHJlYWRzIGhhdmUgYXJyaXZlZCwgYW5kIHJlZHVjZSBhbnkgcmVxdWlyZWQgZGF0YQorICAgICAqIGFzIHdlIGdvLgorICAgICAqLworCisgICAgZm9yICggbGV2ZWw9MCwgb2Zmc2V0ID0xOworICAgICAgICAgIG9mZnNldCA8IG51bV90aHJlYWRzOworICAgICAgICAgIGxldmVsICs9IGJyYW5jaF9iaXRzLCBvZmZzZXQgPDw9IGJyYW5jaF9iaXRzICkKKyAgICB7CisgICAgICAgIHJlZ2lzdGVyIGttcF91aW50MzIgICAgIGNoaWxkOworICAgICAgICByZWdpc3RlciBrbXBfdWludDMyIGNoaWxkX3RpZDsKKworICAgICAgICBpZiAoICgodGlkID4+IGxldmVsKSAmIChicmFuY2hfZmFjdG9yIC0gMSkpICE9IDAgKSB7CisgICAgICAgICAgICByZWdpc3RlciBrbXBfaW50MzIgcGFyZW50X3RpZCA9IHRpZCAmIH4oICgxIDw8IChsZXZlbCArIGJyYW5jaF9iaXRzKSkgLTEgKTsKKworICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF9oeXBlcl9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgcmVsZWFzaW5nIFQjJWQoJWQ6JWQpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJyaXZlZCglcCk6ICV1ID0+ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aWQoIHBhcmVudF90aWQsIHRlYW0gKSwgdGVhbS0+dC50X2lkLCBwYXJlbnRfdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aHJfYmFyIC0+IGJfYXJyaXZlZCwgdGhyX2JhciAtPiBiX2Fycml2ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyX2JhciAtPiBiX2Fycml2ZWQgKyBLTVBfQkFSUklFUl9TVEFURV9CVU1QCisgICAgICAgICAgICAgICAgICAgICAgICAgICkgKTsKKworICAgICAgICAgICAgLyogbWFyayBhcnJpdmFsIHRvIHBhcmVudCB0aHJlYWQgKi8KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBBZnRlciBwZXJmb3JtaW5nIHRoaXMgd3JpdGUgKGluIHRoZSBsYXN0IGl0ZXJhdGlvbiBvZiB0aGUKKyAgICAgICAgICAgIC8vIGVuY2xvc2luZyBmb3IgbG9vcCksIGEgd29ya2VyIHRocmVhZCBtYXkgbm90IGFzc3VtZSB0aGF0IHRoZQorICAgICAgICAgICAgLy8gdGVhbSBpcyB2YWxpZCBhbnkgbW9yZSAtIGl0IGNvdWxkIGJlIGRlYWxsb2NhdGVkIGJ5IHRoZSBtYXN0ZXIKKyAgICAgICAgICAgIC8vIHRocmVhZCBhdCBhbnkgdGltZS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlKCBvdGhlcl90aHJlYWRzW3BhcmVudF90aWRdLCAmdGhyX2JhciAtPiBiX2Fycml2ZWQsIGttcF9yZWxlYXNlX2ZlbmNlICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHBhcmVudCB0aHJlYWRzIHdhaXQgZm9yIGNoaWxkcmVuIHRvIGFycml2ZSAqLworCisgICAgICAgIGlmIChuZXdfc3RhdGUgPT0gS01QX0JBUlJJRVJfVU5VU0VEX1NUQVRFKQorICAgICAgICAgICAgbmV3X3N0YXRlID0gdGVhbSAtPiB0LnRfYmFyWyBidCBdLmJfYXJyaXZlZCArIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVA7CisKKyAgICAgICAgZm9yICggY2hpbGQgPSAxLCBjaGlsZF90aWQgPSB0aWQgKyAoMSA8PCBsZXZlbCk7CisgICAgICAgICAgICAgIGNoaWxkIDwgYnJhbmNoX2ZhY3RvciAmJiBjaGlsZF90aWQgPCBudW1fdGhyZWFkczsKKyAgICAgICAgICAgICAgY2hpbGQrKywgY2hpbGRfdGlkICs9ICgxIDw8IGxldmVsKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlZ2lzdGVyIGttcF9pbmZvX3QgICAqY2hpbGRfdGhyID0gb3RoZXJfdGhyZWFkc1sgY2hpbGRfdGlkIF07CisgICAgICAgICAgICByZWdpc3RlciBrbXBfYnN0YXRlX3QgKmNoaWxkX2JhciA9ICYgY2hpbGRfdGhyIC0+IHRoLnRoX2JhclsgYnQgXS5iYjsKKyNpZiBLTVBfQ0FDSEVfTUFOQUdFCisgICAgICAgICAgICByZWdpc3RlciBrbXBfdWludDMyIG5leHRfY2hpbGRfdGlkID0gY2hpbGRfdGlkICsgKDEgPDwgbGV2ZWwpOworICAgICAgICAgICAgLyogcHJlZmV0Y2ggbmV4dCB0aHJlYWQncyBhcnJpdmVkIGNvdW50ICovCisgICAgICAgICAgICBpZiAoIGNoaWxkKzEgPCBicmFuY2hfZmFjdG9yICYmIG5leHRfY2hpbGRfdGlkIDwgbnVtX3RocmVhZHMgKQorICAgICAgICAgICAgICAgIEtNUF9DQUNIRV9QUkVGRVRDSCggJm90aGVyX3RocmVhZHNbIG5leHRfY2hpbGRfdGlkIF0gLT4gdGgudGhfYmFyWyBidCBdLmJiLmJfYXJyaXZlZCApOworI2VuZGlmIC8qIEtNUF9DQUNIRV9NQU5BR0UgKi8KKyAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfaHlwZXJfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIHdhaXQgVCMlZCglZDoldSkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcnJpdmVkKCVwKSA9PSAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGlkKCBjaGlsZF90aWQsIHRlYW0gKSwgdGVhbS0+dC50X2lkLCBjaGlsZF90aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoaWxkX2JhciAtPiBiX2Fycml2ZWQsIG5ld19zdGF0ZSApICk7CisKKyAgICAgICAgICAgIC8qIHdhaXQgZm9yIGNoaWxkIHRvIGFycml2ZSAqLworICAgICAgICAgICAgX19rbXBfd2FpdF9zbGVlcCggdGhpc190aHIsICZjaGlsZF9iYXIgLT4gYl9hcnJpdmVkLCBuZXdfc3RhdGUsIEZBTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyAoaXR0X3N5bmNfb2JqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgICAgIC8vIEJhcnJpZXIgaW1iYWxhbmNlIC0gd3JpdGUgbWluIG9mIHRoZSB0aHJlYWQgdGltZSBhbmQgYSBjaGlsZCB0aW1lIHRvIHRoZSB0aHJlYWQuCisgICAgICAgICAgICBpZiggX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMiB8fCBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9PSAzICkgeworICAgICAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9iYXJfYXJyaXZlX3RpbWUgPSBLTVBfTUlOKCB0aGlzX3Roci0+dGgudGhfYmFyX2Fycml2ZV90aW1lLCBjaGlsZF90aHItPnRoLnRoX2Jhcl9hcnJpdmVfdGltZSApOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBpZiAocmVkdWNlKSB7CisKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSggMTAwLCAoICJfX2ttcF9oeXBlcl9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgKz0gVCMlZCglZDoldSlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aWQoIGNoaWxkX3RpZCwgdGVhbSApLCB0ZWFtLT50LnRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZF90aWQgKSApOworCisgICAgICAgICAgICAgICAgKCpyZWR1Y2UpKCB0aGlzX3RociAtPiB0aC50aF9sb2NhbC5yZWR1Y2VfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkX3RociAtPiB0aC50aF9sb2NhbC5yZWR1Y2VfZGF0YSApOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIGlmICggS01QX01BU1RFUl9USUQodGlkKSApIHsKKyAgICAgICAgLyogTmVlZCB0byB1cGRhdGUgdGhlIHRlYW0gYXJyaXZlZCBwb2ludGVyIGlmIHdlIGFyZSB0aGUgbWFzdGVyIHRocmVhZCAqLworCisgICAgICAgIGlmIChuZXdfc3RhdGUgPT0gS01QX0JBUlJJRVJfVU5VU0VEX1NUQVRFKQorICAgICAgICAgICAgdGVhbSAtPiB0LnRfYmFyWyBidCBdLmJfYXJyaXZlZCArPSBLTVBfQkFSUklFUl9TVEFURV9CVU1QOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0ZWFtIC0+IHQudF9iYXJbIGJ0IF0uYl9hcnJpdmVkID0gbmV3X3N0YXRlOworCisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfaHlwZXJfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIHNldCB0ZWFtICVkIGFycml2ZWQoJXApID0gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgdGVhbS0+dC50X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRlYW0tPnQudF9iYXJbYnRdLmJfYXJyaXZlZCwgdGVhbS0+dC50X2JhcltidF0uYl9hcnJpdmVkICkgKTsKKyAgICB9CisKKyAgICBLQV9UUkFDRSggMjAsICggIl9fa21wX2h5cGVyX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSBleGl0IGZvciBiYXJyaWVyIHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBidCApICk7CisKK30KKworc3RhdGljIHZvaWQKK19fa21wX2xpbmVhcl9iYXJyaWVyX3JlbGVhc2UoIGVudW0gYmFycmllcl90eXBlIGJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2luZm9fdCAqdGhpc190aHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJvcGFnYXRlX2ljdnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKiBpdHRfc3luY19vYmopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgICAgcmVnaXN0ZXIga21wX2JzdGF0ZV90ICp0aHJfYmFyID0gJnRoaXNfdGhyIC0+IHRoLnRoX2JhclsgYnQgXS5iYjsKKyAgICByZWdpc3RlciBrbXBfdGVhbV90ICp0ZWFtOworCisgICAgaWYgKEtNUF9NQVNURVJfVElEKCB0aWQgKSkgeworICAgICAgICByZWdpc3RlciB1bnNpZ25lZCBpbnQgaTsKKyAgICAgICAgcmVnaXN0ZXIga21wX3VpbnQzMiBucHJvYyA9IHRoaXNfdGhyIC0+IHRoLnRoX3RlYW1fbnByb2M7CisgICAgICAgIHJlZ2lzdGVyIGttcF9pbmZvX3QgKipvdGhlcl90aHJlYWRzOworCisgICAgICAgIHRlYW0gPSBfX2ttcF90aHJlYWRzWyBndGlkIF0tPiB0aC50aF90ZWFtOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtICE9IE5VTEwgKTsKKyAgICAgICAgb3RoZXJfdGhyZWFkcyA9IHRlYW0gLT4gdC50X3RocmVhZHM7CisKKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF9saW5lYXJfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSBtYXN0ZXIgZW50ZXIgZm9yIGJhcnJpZXIgdHlwZSAlZFxuIiwKKyAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgYnQgKSApOworCisgICAgICAgIGlmIChucHJvYyA+IDEpIHsKKyNpZiBLTVBfQkFSUklFUl9JQ1ZfUFVTSAorICAgICAgICAgICAgaWYgKCBwcm9wYWdhdGVfaWN2cyApIHsKKyAgICAgICAgICAgICAgICBsb2FkX2ljdnMoJnRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhWzBdLnRkX2ljdnMpOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBucHJvYzsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2luaXRfaW1wbGljaXRfdGFzayggdGVhbS0+dC50X2lkZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF90aHJlYWRzW2ldLCB0ZWFtLCBpLCBGQUxTRSApOworICAgICAgICAgICAgICAgICAgICBzdG9yZV9pY3ZzKCZ0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVtpXS50ZF9pY3ZzLCAmdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbMF0udGRfaWN2cyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN5bmNfaWN2cygpOworICAgICAgICAgICAgfQorI2VuZGlmIC8vIEtNUF9CQVJSSUVSX0lDVl9QVVNICisKKyAgICAgICAgICAgIC8qIE5vdywgcmVsZWFzZSBhbGwgb2YgdGhlIHdvcmtlciB0aHJlYWRzICovCisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgbnByb2M7IGkrKykgeworI2lmIEtNUF9DQUNIRV9NQU5BR0UKKyAgICAgICAgICAgICAgICAvKiBwcmVmZXRjaCBuZXh0IHRocmVhZCdzIGdvIGZsYWcgKi8KKyAgICAgICAgICAgICAgICBpZiggaSsxIDwgbnByb2MgKQorICAgICAgICAgICAgICAgICAgICBLTVBfQ0FDSEVfUFJFRkVUQ0goICZvdGhlcl90aHJlYWRzWyBpKzEgXS0+IHRoLnRoX2JhclsgYnQgXS5iYi5iX2dvICk7CisjZW5kaWYgLyogS01QX0NBQ0hFX01BTkFHRSAqLworICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfbGluZWFyX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgcmVsZWFzaW5nIFQjJWQoJWQ6JWQpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdvKCVwKTogJXUgPT4gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcl90aHJlYWRzW2ldLT50aC50aF9pbmZvLmRzLmRzX2d0aWQsIHRlYW0tPnQudF9pZCwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2JhcltidF0uYmIuYl9nbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfYmFyW2J0XS5iYi5iX2dvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcl90aHJlYWRzW2ldLT50aC50aF9iYXJbYnRdLmJiLmJfZ28gKyBLTVBfQkFSUklFUl9TVEFURV9CVU1QCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgKTsKKworICAgICAgICAgICAgICAgIF9fa21wX3JlbGVhc2UoIG90aGVyX3RocmVhZHNbIGkgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3RoZXJfdGhyZWFkc1sgaSBdLT4gdGgudGhfYmFyWyBidCBdLmJiLmJfZ28sIGttcF9hY3F1aXJlX2ZlbmNlICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvKiBXYWl0IGZvciB0aGUgTUFTVEVSIHRocmVhZCB0byByZWxlYXNlIHVzICovCisKKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF9saW5lYXJfYmFycmllcl9yZWxlYXNlOiBUIyVkIHdhaXQgZ28oJXApID09ICV1XG4iLAorICAgICAgICAgIGd0aWQsICZ0aHJfYmFyIC0+IGJfZ28sIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVAgKSApOworCisgICAgICAgIF9fa21wX3dhaXRfc2xlZXAoIHRoaXNfdGhyLCAmdGhyX2JhciAtPiBiX2dvLCBLTVBfQkFSUklFUl9TVEFURV9CVU1QLCBUUlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworI2lmIFVTRV9JVFRfQlVJTEQgJiYgT01QXzMwX0VOQUJMRUQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgaWYgKCAoIF9faXR0X3N5bmNfY3JlYXRlX3B0ciAmJiBpdHRfc3luY19vYmogPT0gTlVMTCApIHx8IEtNUF9JVFRfREVCVUcgKSB7CisgICAgICAgICAgICAvLyB3ZSBhcmUgb24gYSBmb3JrIGJhcnJpZXIgd2hlcmUgd2UgY291bGQgbm90IGdldCB0aGUgb2JqZWN0IHJlbGlhYmx5IChvciBJVFROT1RJRlkgaXMgZGlzYWJsZWQpCisgICAgICAgICAgICBpdHRfc3luY19vYmogID0gX19rbXBfaXR0X2JhcnJpZXJfb2JqZWN0KCBndGlkLCBic19mb3Jram9pbl9iYXJyaWVyLCAwLCAtMSApOworICAgICAgICAgICAgLy8gY2FuY2VsIHdhaXQgb24gcHJldmlvdXMgcGFyYWxsZWwgcmVnaW9uLi4uCisgICAgICAgICAgICBfX2ttcF9pdHRfdGFza19zdGFydGluZyggaXR0X3N5bmNfb2JqICk7CisKKyAgICAgICAgICAgIGlmICggYnQgPT0gYnNfZm9ya2pvaW5fYmFycmllciAmJiBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpICkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIGl0dF9zeW5jX29iaiAgPSBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoIGd0aWQsIGJzX2Zvcmtqb2luX2JhcnJpZXIgKTsKKyAgICAgICAgICAgIGlmICggaXR0X3N5bmNfb2JqICE9IE5VTEwgKQorICAgICAgICAgICAgICAgIF9fa21wX2l0dF90YXNrX2ZpbmlzaGVkKCBpdHRfc3luY19vYmogKTsgIC8vIGNhbGwgcHJlcGFyZSBhcyBlYXJseSBhcyBwb3NzaWJsZSBmb3IgIm5ldyIgYmFycmllcgorCisgICAgICAgIH0gZWxzZQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgJiYgT01QXzMwX0VOQUJMRUQgJiYgVVNFX0lUVF9OT1RJRlkgKi8KKyAgICAgICAgLy8KKyAgICAgICAgLy8gZWFybHkgZXhpdCBmb3IgcmVhcGluZyB0aHJlYWRzIHJlbGVhc2luZyBmb3Jram9pbiBiYXJyaWVyCisgICAgICAgIC8vCisgICAgICAgIGlmICggYnQgPT0gYnNfZm9ya2pvaW5fYmFycmllciAmJiBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpICkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLworICAgICAgICAvLyBUaGUgd29ya2VyIHRocmVhZCBtYXkgbm93IGFzc3VtZSB0aGF0IHRoZSB0ZWFtIGlzIHZhbGlkLgorICAgICAgICAvLworI2lmIFVTRV9JVFRfQlVJTEQgJiYgIU9NUF8zMF9FTkFCTEVEICYmIFVTRV9JVFRfTk9USUZZCisgICAgICAgIC8vIGxpYmd1aWRlIG9ubHkgY29kZSAoY2Fubm90IHVzZSAqaXR0X3Rhc2sqIHJvdXRpbmVzKQorICAgICAgICBpZiAoICggX19pdHRfc3luY19jcmVhdGVfcHRyICYmIGl0dF9zeW5jX29iaiA9PSBOVUxMICkgfHwgS01QX0lUVF9ERUJVRyApIHsKKyAgICAgICAgICAgIC8vIHdlIGFyZSBvbiBhIGZvcmsgYmFycmllciB3aGVyZSB3ZSBjb3VsZCBub3QgZ2V0IHRoZSBvYmplY3QgcmVsaWFibHkKKyAgICAgICAgICAgIGl0dF9zeW5jX29iaiAgPSBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoIGd0aWQsIGJzX2Zvcmtqb2luX2JhcnJpZXIgKTsKKyAgICAgICAgICAgIF9fa21wX2l0dF9iYXJyaWVyX3N0YXJ0aW5nKCBndGlkLCBpdHRfc3luY19vYmogKTsgIC8vIG5vIG5lZWQgdG8gY2FsbCByZWxlYXNpbmcsIGJ1dCB3ZSBoYXZlIHBhaXJlZCBjYWxscy4uLgorICAgICAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAmJiAhT01QXzMwX0VOQUJMRUQgJiYgVVNFX0lUVF9OT1RJRlkgKi8KKyAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ3RpZCApOworICAgICAgICAgICAgdGVhbSA9IF9fa21wX3RocmVhZHNbIGd0aWQgXS0+IHRoLnRoX3RlYW07CisgICAgICAgICNlbmRpZgorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtICE9IE5VTEwgKTsKKworICAgICAgICBUQ1dfNCh0aHJfYmFyLT5iX2dvLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFKTsKKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2xpbmVhcl9iYXJyaWVyX3JlbGVhc2U6IFQjJWQoJWQ6JWQpIHNldCBnbyglcCkgPSAldVxuIiwKKyAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgJnRocl9iYXItPmJfZ28sIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUgKSApOworCisgICAgICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworICAgIH0KKworICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfbGluZWFyX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgZXhpdCBmb3IgYmFycmllciB0eXBlICVkXG4iLAorICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGJ0ICkgKTsKK30KKworCitzdGF0aWMgdm9pZAorX19rbXBfdHJlZV9iYXJyaWVyX3JlbGVhc2UoIGVudW0gYmFycmllcl90eXBlIGJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByb3BhZ2F0ZV9pY3ZzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqIGl0dF9zeW5jX29iaikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgICAgLyogaGFuZGxlIGZvcmsgYmFycmllciB3b3JrZXJzIHdobyBhcmVuJ3QgcGFydCBvZiBhIHRlYW0geWV0ICovCisgICAgcmVnaXN0ZXIga21wX3RlYW1fdCAgICAqdGVhbTsKKyAgICByZWdpc3RlciBrbXBfYnN0YXRlX3QgICp0aHJfYmFyICAgICAgID0gJiB0aGlzX3RociAtPiB0aC50aF9iYXJbIGJ0IF0uYmI7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiAgICAgbnByb2M7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiAgICAgYnJhbmNoX2JpdHMgICA9IF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1sgYnQgXTsKKyAgICByZWdpc3RlciBrbXBfdWludDMyICAgICBicmFuY2hfZmFjdG9yID0gMSA8PCBicmFuY2hfYml0cyA7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiAgICAgY2hpbGQ7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiAgICAgY2hpbGRfdGlkOworCisgICAgLyoKKyAgICAgKiBXZSBub3cgcGVyZm9ybSBhIHRyZWUgcmVsZWFzZSBmb3IgYWxsCisgICAgICogb2YgdGhlIHRocmVhZHMgdGhhdCBoYXZlIGJlZW4gZ2F0aGVyZWQKKyAgICAgKi8KKworICAgIGlmICggISBLTVBfTUFTVEVSX1RJRCggdGlkICkpIHsKKyAgICAgICAgLyogd29ya2VyIHRocmVhZHMgKi8KKworICAgICAgICBLQV9UUkFDRSggMjAsICggIl9fa21wX3RyZWVfYmFycmllcl9yZWxlYXNlOiBUIyVkIHdhaXQgZ28oJXApID09ICV1XG4iLAorICAgICAgICAgIGd0aWQsICZ0aHJfYmFyIC0+IGJfZ28sIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVAgKSApOworCisgICAgICAgIC8qIHdhaXQgZm9yIHBhcmVudCB0aHJlYWQgdG8gcmVsZWFzZSB1cyAqLworICAgICAgICBfX2ttcF93YWl0X3NsZWVwKCB0aGlzX3RociwgJnRocl9iYXIgLT4gYl9nbywgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCwgVFJVRQorICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopCisgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyNpZiBVU0VfSVRUX0JVSUxEICYmIE9NUF8zMF9FTkFCTEVEICYmIFVTRV9JVFRfTk9USUZZCisgICAgICAgIGlmICggKCBfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgJiYgaXR0X3N5bmNfb2JqID09IE5VTEwgKSB8fCBLTVBfSVRUX0RFQlVHICkgeworICAgICAgICAgICAgLy8gd2UgYXJlIG9uIGEgZm9yayBiYXJyaWVyIHdoZXJlIHdlIGNvdWxkIG5vdCBnZXQgdGhlIG9iamVjdCByZWxpYWJseSAob3IgSVRUTk9USUZZIGlzIGRpc2FibGVkKQorICAgICAgICAgICAgaXR0X3N5bmNfb2JqICA9IF9fa21wX2l0dF9iYXJyaWVyX29iamVjdCggZ3RpZCwgYnNfZm9ya2pvaW5fYmFycmllciwgMCwgLTEgKTsKKyAgICAgICAgICAgIC8vIGNhbmNlbCB3YWl0IG9uIHByZXZpb3VzIHBhcmFsbGVsIHJlZ2lvbi4uLgorICAgICAgICAgICAgX19rbXBfaXR0X3Rhc2tfc3RhcnRpbmcoIGl0dF9zeW5jX29iaiApOworCisgICAgICAgICAgICBpZiAoIGJ0ID09IGJzX2Zvcmtqb2luX2JhcnJpZXIgJiYgVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSApCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBpdHRfc3luY19vYmogID0gX19rbXBfaXR0X2JhcnJpZXJfb2JqZWN0KCBndGlkLCBic19mb3Jram9pbl9iYXJyaWVyICk7CisgICAgICAgICAgICBpZiAoIGl0dF9zeW5jX29iaiAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICBfX2ttcF9pdHRfdGFza19maW5pc2hlZCggaXR0X3N5bmNfb2JqICk7ICAvLyBjYWxsIHByZXBhcmUgYXMgZWFybHkgYXMgcG9zc2libGUgZm9yICJuZXciIGJhcnJpZXIKKworICAgICAgICB9IGVsc2UKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICYmIE9NUF8zMF9FTkFCTEVEICYmIFVTRV9JVFRfTk9USUZZICovCisgICAgICAgIC8vCisgICAgICAgIC8vIGVhcmx5IGV4aXQgZm9yIHJlYXBpbmcgdGhyZWFkcyByZWxlYXNpbmcgZm9ya2pvaW4gYmFycmllcgorICAgICAgICAvLworICAgICAgICBpZiAoIGJ0ID09IGJzX2Zvcmtqb2luX2JhcnJpZXIgJiYgVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlIHdvcmtlciB0aHJlYWQgbWF5IG5vdyBhc3N1bWUgdGhhdCB0aGUgdGVhbSBpcyB2YWxpZC4KKyAgICAgICAgLy8KKyNpZiBVU0VfSVRUX0JVSUxEICYmICFPTVBfMzBfRU5BQkxFRCAmJiBVU0VfSVRUX05PVElGWQorICAgICAgICAvLyBsaWJndWlkZSBvbmx5IGNvZGUgKGNhbm5vdCB1c2UgKml0dF90YXNrKiByb3V0aW5lcykKKyAgICAgICAgaWYgKCAoIF9faXR0X3N5bmNfY3JlYXRlX3B0ciAmJiBpdHRfc3luY19vYmogPT0gTlVMTCApIHx8IEtNUF9JVFRfREVCVUcgKSB7CisgICAgICAgICAgICAvLyB3ZSBhcmUgb24gYSBmb3JrIGJhcnJpZXIgd2hlcmUgd2UgY291bGQgbm90IGdldCB0aGUgb2JqZWN0IHJlbGlhYmx5CisgICAgICAgICAgICBpdHRfc3luY19vYmogID0gX19rbXBfaXR0X2JhcnJpZXJfb2JqZWN0KCBndGlkLCBic19mb3Jram9pbl9iYXJyaWVyICk7CisgICAgICAgICAgICBfX2ttcF9pdHRfYmFycmllcl9zdGFydGluZyggZ3RpZCwgaXR0X3N5bmNfb2JqICk7ICAvLyBubyBuZWVkIHRvIGNhbGwgcmVsZWFzaW5nLCBidXQgd2UgaGF2ZSBwYWlyZWQgY2FsbHMuLi4KKyAgICAgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgJiYgIU9NUF8zMF9FTkFCTEVEICYmIFVTRV9JVFRfTk9USUZZICovCisgICAgICAgIHRlYW0gPSBfX2ttcF90aHJlYWRzWyBndGlkIF0tPiB0aC50aF90ZWFtOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtICE9IE5VTEwgKTsKKyAgICAgICAgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ3RpZCApOworCisgICAgICAgIFRDV180KHRocl9iYXItPmJfZ28sIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUpOworICAgICAgICBLQV9UUkFDRSggMjAsICggIl9fa21wX3RyZWVfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSBzZXQgZ28oJXApID0gJXVcbiIsCisgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsICZ0aHJfYmFyLT5iX2dvLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFICkgKTsKKworICAgICAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIH0gZWxzZSB7CisgICAgICAgIHRlYW0gPSBfX2ttcF90aHJlYWRzWyBndGlkIF0tPiB0aC50aF90ZWFtOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtICE9IE5VTEwgKTsKKworICAgICAgICBLQV9UUkFDRSggMjAsICggIl9fa21wX3RyZWVfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSBtYXN0ZXIgZW50ZXIgZm9yIGJhcnJpZXIgdHlwZSAlZFxuIiwKKyAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgYnQgKSApOworICAgIH0KKworICAgIG5wcm9jICAgICA9IHRoaXNfdGhyIC0+IHRoLnRoX3RlYW1fbnByb2M7CisgICAgY2hpbGRfdGlkID0gKCB0aWQgPDwgYnJhbmNoX2JpdHMgKSArIDE7CisKKyAgICBpZiAoIGNoaWxkX3RpZCA8IG5wcm9jICkgeworICAgICAgICByZWdpc3RlciBrbXBfaW5mb190ICoqb3RoZXJfdGhyZWFkcyA9IHRlYW0gLT4gdC50X3RocmVhZHM7CisgICAgICAgIGNoaWxkID0gMTsKKyAgICAgICAgLyogcGFyZW50IHRocmVhZHMgcmVsZWFzZSBhbGwgdGhlaXIgY2hpbGRyZW4gKi8KKworICAgICAgICBkbyB7CisgICAgICAgICAgICByZWdpc3RlciBrbXBfaW5mb190ICAgKmNoaWxkX3RociA9IG90aGVyX3RocmVhZHNbIGNoaWxkX3RpZCBdOworICAgICAgICAgICAgcmVnaXN0ZXIga21wX2JzdGF0ZV90ICpjaGlsZF9iYXIgPSAmIGNoaWxkX3RociAtPiB0aC50aF9iYXJbIGJ0IF0uYmI7CisjaWYgS01QX0NBQ0hFX01BTkFHRQorICAgICAgICAgICAgLyogcHJlZmV0Y2ggbmV4dCB0aHJlYWQncyBnbyBjb3VudCAqLworICAgICAgICAgICAgaWYgKCBjaGlsZCsxIDw9IGJyYW5jaF9mYWN0b3IgJiYgY2hpbGRfdGlkKzEgPCBucHJvYyApCisgICAgICAgICAgICAgICAgS01QX0NBQ0hFX1BSRUZFVENIKCAmb3RoZXJfdGhyZWFkc1sgY2hpbGRfdGlkKzEgXSAtPiB0aC50aF9iYXJbIGJ0IF0uYmIuYl9nbyApOworI2VuZGlmIC8qIEtNUF9DQUNIRV9NQU5BR0UgKi8KKworI2lmIEtNUF9CQVJSSUVSX0lDVl9QVVNICisgICAgICAgICAgICBpZiAoIHByb3BhZ2F0ZV9pY3ZzICkgeworICAgICAgICAgICAgICAgIF9fa21wX2luaXRfaW1wbGljaXRfdGFzayggdGVhbS0+dC50X2lkZW50LAorICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X3RocmVhZHNbY2hpbGRfdGlkXSwgdGVhbSwgY2hpbGRfdGlkLCBGQUxTRSApOworICAgICAgICAgICAgICAgIGxvYWRfaWN2cygmdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbMF0udGRfaWN2cyk7CisgICAgICAgICAgICAgICAgc3RvcmVfaWN2cygmdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbY2hpbGRfdGlkXS50ZF9pY3ZzLCAmdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbMF0udGRfaWN2cyk7CisgICAgICAgICAgICAgICAgc3luY19pY3ZzKCk7CisgICAgICAgICAgICB9CisjZW5kaWYgLy8gS01QX0JBUlJJRVJfSUNWX1BVU0gKKworICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF90cmVlX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgcmVsZWFzaW5nIFQjJWQoJWQ6JXUpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnbyglcCk6ICV1ID0+ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aWQoIGNoaWxkX3RpZCwgdGVhbSApLCB0ZWFtLT50LnRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRfdGlkLCAmY2hpbGRfYmFyIC0+IGJfZ28sIGNoaWxkX2JhciAtPiBiX2dvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkX2JhciAtPiBiX2dvICsgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCApICk7CisKKyAgICAgICAgICAgIC8qIHJlbGVhc2UgY2hpbGQgZnJvbSBiYXJyaWVyICovCisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlKCBjaGlsZF90aHIsICZjaGlsZF9iYXIgLT4gYl9nbywga21wX2FjcXVpcmVfZmVuY2UgKTsKKworICAgICAgICAgICAgY2hpbGQrKzsKKyAgICAgICAgICAgIGNoaWxkX3RpZCsrOworICAgICAgICB9CisgICAgICAgIHdoaWxlICggY2hpbGQgPD0gYnJhbmNoX2ZhY3RvciAmJiBjaGlsZF90aWQgPCBucHJvYyApOworICAgIH0KKworICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfdHJlZV9iYXJyaWVyX3JlbGVhc2U6IFQjJWQoJWQ6JWQpIGV4aXQgZm9yIGJhcnJpZXIgdHlwZSAlZFxuIiwKKyAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBidCApICk7Cit9CisKKy8qIFRoZSByZXZlcnNlIHZlcnNpb25zIHNlZW0gdG8gYmVhdCB0aGUgZm9yd2FyZCB2ZXJzaW9ucyBvdmVyYWxsICovCisjZGVmaW5lIEtNUF9SRVZFUlNFX0hZUEVSX0JBUgorc3RhdGljIHZvaWQKK19fa21wX2h5cGVyX2JhcnJpZXJfcmVsZWFzZSggZW51bSBiYXJyaWVyX3R5cGUgYnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByb3BhZ2F0ZV9pY3ZzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKiBpdHRfc3luY19vYmopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgICAvKiBoYW5kbGUgZm9yayBiYXJyaWVyIHdvcmtlcnMgd2hvIGFyZW4ndCBwYXJ0IG9mIGEgdGVhbSB5ZXQgKi8KKyAgICByZWdpc3RlciBrbXBfdGVhbV90ICAgICp0ZWFtOworICAgIHJlZ2lzdGVyIGttcF9ic3RhdGVfdCAgKnRocl9iYXIgICAgICAgPSAmIHRoaXNfdGhyIC0+IHRoLnRoX2JhclsgYnQgXS5iYjsKKyAgICByZWdpc3RlciBrbXBfaW5mb190ICAgKipvdGhlcl90aHJlYWRzOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgICAgIG51bV90aHJlYWRzOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgICAgIGJyYW5jaF9iaXRzICAgPSBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHNbIGJ0IF07CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiAgICAgYnJhbmNoX2ZhY3RvciA9IDEgPDwgYnJhbmNoX2JpdHM7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiAgICAgY2hpbGQ7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiAgICAgY2hpbGRfdGlkOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgICAgIG9mZnNldDsKKyAgICByZWdpc3RlciBrbXBfdWludDMyICAgICBsZXZlbDsKKworICAgIC8qIFBlcmZvcm0gYSBoeXBlcmN1YmUtZW1iZWRkZWQgdHJlZSByZWxlYXNlIGZvciBhbGwgb2YgdGhlIHRocmVhZHMKKyAgICAgICB0aGF0IGhhdmUgYmVlbiBnYXRoZXJlZC4gIElmIEtNUF9SRVZFUlNFX0hZUEVSX0JBUiBpcyBkZWZpbmVkIChkZWZhdWx0KQorICAgICAgIHRoZSB0aHJlYWRzIGFyZSByZWxlYXNlZCBpbiB0aGUgcmV2ZXJzZSBvcmRlciBvZiB0aGUgY29ycmVzcG9uZGluZyBnYXRoZXIsCisgICAgICAgb3RoZXJ3aXNlIHRocmVhZHMgYXJlIHJlbGVhc2VkIGluIHRoZSBzYW1lIG9yZGVyLiAqLworCisgICAgaWYgKCAhIEtNUF9NQVNURVJfVElEKCB0aWQgKSkgeworICAgICAgICAvKiB3b3JrZXIgdGhyZWFkcyAqLworICAgICAgICBLQV9UUkFDRSggMjAsICggIl9fa21wX2h5cGVyX2JhcnJpZXJfcmVsZWFzZTogVCMlZCB3YWl0IGdvKCVwKSA9PSAldVxuIiwKKyAgICAgICAgICBndGlkLCAmdGhyX2JhciAtPiBiX2dvLCBLTVBfQkFSUklFUl9TVEFURV9CVU1QICkgKTsKKworICAgICAgICAvKiB3YWl0IGZvciBwYXJlbnQgdGhyZWFkIHRvIHJlbGVhc2UgdXMgKi8KKyAgICAgICAgX19rbXBfd2FpdF9zbGVlcCggdGhpc190aHIsICZ0aHJfYmFyIC0+IGJfZ28sIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVAsIFRSVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoIGl0dF9zeW5jX29iaiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyNpZiBVU0VfSVRUX0JVSUxEICYmIE9NUF8zMF9FTkFCTEVEICYmIFVTRV9JVFRfTk9USUZZCisgICAgICAgIGlmICggKCBfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgJiYgaXR0X3N5bmNfb2JqID09IE5VTEwgKSB8fCBLTVBfSVRUX0RFQlVHICkgeworICAgICAgICAgICAgLy8gd2UgYXJlIG9uIGEgZm9yayBiYXJyaWVyIHdoZXJlIHdlIGNvdWxkIG5vdCBnZXQgdGhlIG9iamVjdCByZWxpYWJseQorICAgICAgICAgICAgaXR0X3N5bmNfb2JqICA9IF9fa21wX2l0dF9iYXJyaWVyX29iamVjdCggZ3RpZCwgYnNfZm9ya2pvaW5fYmFycmllciwgMCwgLTEgKTsKKyAgICAgICAgICAgIC8vIGNhbmNlbCB3YWl0IG9uIHByZXZpb3VzIHBhcmFsbGVsIHJlZ2lvbi4uLgorICAgICAgICAgICAgX19rbXBfaXR0X3Rhc2tfc3RhcnRpbmcoIGl0dF9zeW5jX29iaiApOworCisgICAgICAgICAgICBpZiAoIGJ0ID09IGJzX2Zvcmtqb2luX2JhcnJpZXIgJiYgVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSApCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBpdHRfc3luY19vYmogID0gX19rbXBfaXR0X2JhcnJpZXJfb2JqZWN0KCBndGlkLCBic19mb3Jram9pbl9iYXJyaWVyICk7CisgICAgICAgICAgICBpZiAoIGl0dF9zeW5jX29iaiAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICBfX2ttcF9pdHRfdGFza19maW5pc2hlZCggaXR0X3N5bmNfb2JqICk7ICAvLyBjYWxsIHByZXBhcmUgYXMgZWFybHkgYXMgcG9zc2libGUgZm9yICJuZXciIGJhcnJpZXIKKworICAgICAgICB9IGVsc2UKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICYmIE9NUF8zMF9FTkFCTEVEICYmIFVTRV9JVFRfTk9USUZZICovCisgICAgICAgIC8vCisgICAgICAgIC8vIGVhcmx5IGV4aXQgZm9yIHJlYXBpbmcgdGhyZWFkcyByZWxlYXNpbmcgZm9ya2pvaW4gYmFycmllcgorICAgICAgICAvLworICAgICAgICBpZiAoIGJ0ID09IGJzX2Zvcmtqb2luX2JhcnJpZXIgJiYgVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlIHdvcmtlciB0aHJlYWQgbWF5IG5vdyBhc3N1bWUgdGhhdCB0aGUgdGVhbSBpcyB2YWxpZC4KKyAgICAgICAgLy8KKyNpZiBVU0VfSVRUX0JVSUxEICYmICFPTVBfMzBfRU5BQkxFRCAmJiBVU0VfSVRUX05PVElGWQorICAgICAgICAvLyBsaWJndWlkZSBvbmx5IGNvZGUgKGNhbm5vdCB1c2UgKml0dF90YXNrKiByb3V0aW5lcykKKyAgICAgICAgaWYgKCAoIF9faXR0X3N5bmNfY3JlYXRlX3B0ciAmJiBpdHRfc3luY19vYmogPT0gTlVMTCApIHx8IEtNUF9JVFRfREVCVUcgKSB7CisgICAgICAgICAgICAvLyB3ZSBhcmUgb24gYSBmb3JrIGJhcnJpZXIgd2hlcmUgd2UgY291bGQgbm90IGdldCB0aGUgb2JqZWN0IHJlbGlhYmx5CisgICAgICAgICAgICBpdHRfc3luY19vYmogID0gX19rbXBfaXR0X2JhcnJpZXJfb2JqZWN0KCBndGlkLCBic19mb3Jram9pbl9iYXJyaWVyICk7CisgICAgICAgICAgICBfX2ttcF9pdHRfYmFycmllcl9zdGFydGluZyggZ3RpZCwgaXR0X3N5bmNfb2JqICk7ICAvLyBubyBuZWVkIHRvIGNhbGwgcmVsZWFzaW5nLCBidXQgd2UgaGF2ZSBwYWlyZWQgY2FsbHMuLi4KKyAgICAgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgJiYgIU9NUF8zMF9FTkFCTEVEICYmIFVTRV9JVFRfTk9USUZZICovCisgICAgICAgIHRlYW0gPSBfX2ttcF90aHJlYWRzWyBndGlkIF0tPiB0aC50aF90ZWFtOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtICE9IE5VTEwgKTsKKyAgICAgICAgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ3RpZCApOworCisgICAgICAgIFRDV180KHRocl9iYXItPmJfZ28sIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUpOworICAgICAgICBLQV9UUkFDRSggMjAsICggIl9fa21wX2h5cGVyX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgc2V0IGdvKCVwKSA9ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsICZ0aHJfYmFyLT5iX2dvLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFICkgKTsKKworICAgICAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIH0gZWxzZSB7ICAvKiBLTVBfTUFTVEVSX1RJRCh0aWQpICovCisgICAgICAgIHRlYW0gPSBfX2ttcF90aHJlYWRzWyBndGlkIF0tPiB0aC50aF90ZWFtOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtICE9IE5VTEwgKTsKKworICAgICAgICBLQV9UUkFDRSggMjAsICggIl9fa21wX2h5cGVyX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgbWFzdGVyIGVudGVyIGZvciBiYXJyaWVyIHR5cGUgJWRcbiIsCisgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGJ0ICkgKTsKKyAgICB9CisKKyAgICBudW1fdGhyZWFkcyA9IHRoaXNfdGhyIC0+IHRoLnRoX3RlYW1fbnByb2M7CisgICAgb3RoZXJfdGhyZWFkcyA9IHRlYW0gLT4gdC50X3RocmVhZHM7CisKKyNpZmRlZiBLTVBfUkVWRVJTRV9IWVBFUl9CQVIKKyAgICAvKiBjb3VudCB1cCB0byBjb3JyZWN0IGxldmVsIGZvciBwYXJlbnQgKi8KKyAgICBmb3IgKCBsZXZlbCA9IDAsIG9mZnNldCA9IDE7CisgICAgICAgICAgb2Zmc2V0IDwgbnVtX3RocmVhZHMgJiYgKCgodGlkID4+IGxldmVsKSAmIChicmFuY2hfZmFjdG9yLTEpKSA9PSAwKTsKKyAgICAgICAgICBsZXZlbCArPSBicmFuY2hfYml0cywgb2Zmc2V0IDw8PSBicmFuY2hfYml0cyApOworCisgICAgLyogbm93IGdvIGRvd24gZnJvbSB0aGVyZSAqLworICAgIGZvciAoIGxldmVsIC09IGJyYW5jaF9iaXRzLCBvZmZzZXQgPj49IGJyYW5jaF9iaXRzOworICAgICAgICAgIG9mZnNldCAhPSAwOworICAgICAgICAgIGxldmVsIC09IGJyYW5jaF9iaXRzLCBvZmZzZXQgPj49IGJyYW5jaF9iaXRzICkKKyNlbHNlCisgICAgLyogR28gZG93biB0aGUgdHJlZSwgbGV2ZWwgYnkgbGV2ZWwgKi8KKyAgICBmb3IgKCBsZXZlbCA9IDAsIG9mZnNldCA9IDE7CisgICAgICAgICAgb2Zmc2V0IDwgbnVtX3RocmVhZHM7CisgICAgICAgICAgbGV2ZWwgKz0gYnJhbmNoX2JpdHMsIG9mZnNldCA8PD0gYnJhbmNoX2JpdHMgKQorI2VuZGlmIC8vIEtNUF9SRVZFUlNFX0hZUEVSX0JBUgorICAgIHsKKyNpZmRlZiBLTVBfUkVWRVJTRV9IWVBFUl9CQVIKKyAgICAgICAgLyogTm93IGdvIGluIHJldmVyc2Ugb3JkZXIgdGhyb3VnaCB0aGUgY2hpbGRyZW4sIGhpZ2hlc3QgdG8gbG93ZXN0LgorICAgICAgICAgICBJbml0aWFsIHNldHRpbmcgb2YgY2hpbGQgaXMgY29uc2VydmF0aXZlIGhlcmUuICovCisgICAgICAgIGNoaWxkID0gbnVtX3RocmVhZHMgPj4gKChsZXZlbD09MCk/bGV2ZWw6bGV2ZWwtMSk7CisgICAgICAgIGZvciAoIGNoaWxkID0gKGNoaWxkIDwgYnJhbmNoX2ZhY3Rvci0xKSA/IGNoaWxkIDogYnJhbmNoX2ZhY3Rvci0xLAorICAgICAgICAgICAgICAgICAgY2hpbGRfdGlkID0gdGlkICsgKGNoaWxkIDw8IGxldmVsKTsKKyAgICAgICAgICAgICAgY2hpbGQgPj0gMTsKKyAgICAgICAgICAgICAgY2hpbGQtLSwgY2hpbGRfdGlkIC09ICgxIDw8IGxldmVsKSApCisjZWxzZQorICAgICAgICBpZiAoKCh0aWQgPj4gbGV2ZWwpICYgKGJyYW5jaF9mYWN0b3IgLSAxKSkgIT0gMCkKKyAgICAgICAgICAgIC8qIE5vIG5lZWQgdG8gZ28gYW55IGxvd2VyIHRoYW4gdGhpcywgc2luY2UgdGhpcyBpcyB0aGUgbGV2ZWwKKyAgICAgICAgICAgICAgIHBhcmVudCB3b3VsZCBiZSBub3RpZmllZCAqLworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogaXRlcmF0ZSB0aHJvdWdoIGNoaWxkcmVuIG9uIHRoaXMgbGV2ZWwgb2YgdGhlIHRyZWUgKi8KKyAgICAgICAgZm9yICggY2hpbGQgPSAxLCBjaGlsZF90aWQgPSB0aWQgKyAoMSA8PCBsZXZlbCk7CisgICAgICAgICAgICAgIGNoaWxkIDwgYnJhbmNoX2ZhY3RvciAmJiBjaGlsZF90aWQgPCBudW1fdGhyZWFkczsKKyAgICAgICAgICAgICAgY2hpbGQrKywgY2hpbGRfdGlkICs9ICgxIDw8IGxldmVsKSApCisjZW5kaWYgLy8gS01QX1JFVkVSU0VfSFlQRVJfQkFSCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggY2hpbGRfdGlkID49IG51bV90aHJlYWRzICkgY29udGludWU7ICAgLyogY2hpbGQgZG9lc24ndCBleGlzdCBzbyBrZWVwIGdvaW5nICovCisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICByZWdpc3RlciBrbXBfaW5mb190ICAgKmNoaWxkX3RociA9IG90aGVyX3RocmVhZHNbIGNoaWxkX3RpZCBdOworICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGttcF9ic3RhdGVfdCAqY2hpbGRfYmFyID0gJiBjaGlsZF90aHIgLT4gdGgudGhfYmFyWyBidCBdLmJiOworI2lmIEtNUF9DQUNIRV9NQU5BR0UKKyAgICAgICAgICAgICAgICByZWdpc3RlciBrbXBfdWludDMyIG5leHRfY2hpbGRfdGlkID0gY2hpbGRfdGlkIC0gKDEgPDwgbGV2ZWwpOworICAgICAgICAgICAgICAgIC8qIHByZWZldGNoIG5leHQgdGhyZWFkJ3MgZ28gY291bnQgKi8KKyNpZmRlZiBLTVBfUkVWRVJTRV9IWVBFUl9CQVIKKyAgICAgICAgICAgICAgICBpZiAoIGNoaWxkLTEgPj0gMSAmJiBuZXh0X2NoaWxkX3RpZCA8IG51bV90aHJlYWRzICkKKyNlbHNlCisgICAgICAgICAgICAgICAgaWYgKCBjaGlsZCsxIDwgYnJhbmNoX2ZhY3RvciAmJiBuZXh0X2NoaWxkX3RpZCA8IG51bV90aHJlYWRzICkKKyNlbmRpZiAvLyBLTVBfUkVWRVJTRV9IWVBFUl9CQVIKKyAgICAgICAgICAgICAgICAgICAgS01QX0NBQ0hFX1BSRUZFVENIKCAmb3RoZXJfdGhyZWFkc1sgbmV4dF9jaGlsZF90aWQgXS0+dGgudGhfYmFyWyBidCBdLmJiLmJfZ28gKTsKKyNlbmRpZiAvKiBLTVBfQ0FDSEVfTUFOQUdFICovCisKKyNpZiBLTVBfQkFSUklFUl9JQ1ZfUFVTSAorICAgICAgICAgICAgICAgIGlmICggcHJvcGFnYXRlX2ljdnMgKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0gIT0gTlVMTCApOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9pbml0X2ltcGxpY2l0X3Rhc2soIHRlYW0tPnQudF9pZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfdGhyZWFkc1tjaGlsZF90aWRdLCB0ZWFtLCBjaGlsZF90aWQsIEZBTFNFICk7CisgICAgICAgICAgICAgICAgICAgIGxvYWRfaWN2cygmdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbMF0udGRfaWN2cyk7CisgICAgICAgICAgICAgICAgICAgIHN0b3JlX2ljdnMoJnRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW2NoaWxkX3RpZF0udGRfaWN2cywgJnRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhWzBdLnRkX2ljdnMpOworICAgICAgICAgICAgICAgICAgICBzeW5jX2ljdnMoKTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYgLy8gS01QX0JBUlJJRVJfSUNWX1BVU0gKKworICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfaHlwZXJfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSByZWxlYXNpbmcgVCMlZCglZDoldSkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnbyglcCk6ICV1ID0+ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RpZCggY2hpbGRfdGlkLCB0ZWFtICksIHRlYW0tPnQudF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRfdGlkLCAmY2hpbGRfYmFyIC0+IGJfZ28sIGNoaWxkX2JhciAtPiBiX2dvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZF9iYXIgLT4gYl9nbyArIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVAgKSApOworCisgICAgICAgICAgICAgICAgLyogcmVsZWFzZSBjaGlsZCBmcm9tIGJhcnJpZXIgKi8KKyAgICAgICAgICAgICAgICBfX2ttcF9yZWxlYXNlKCBjaGlsZF90aHIsICZjaGlsZF9iYXIgLT4gYl9nbywga21wX2FjcXVpcmVfZmVuY2UgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfaHlwZXJfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSBleGl0IGZvciBiYXJyaWVyIHR5cGUgJWRcbiIsCisgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgYnQgKSApOworfQorCisvKgorICogSW50ZXJuYWwgZnVuY3Rpb24gdG8gZG8gYSBiYXJyaWVyLgorICogSWYgaXNfc3BsaXQgaXMgdHJ1ZSwgZG8gYSBzcGxpdCBiYXJyaWVyLCBvdGhlcndpc2UsIGRvIGEgcGxhaW4gYmFycmllcgorICogSWYgcmVkdWNlIGlzIG5vbi1OVUxMLCBkbyBhIHNwbGl0IHJlZHVjdGlvbiBiYXJyaWVyLCBvdGhlcndpc2UsIGRvIGEgc3BsaXQgYmFycmllcgorICogUmV0dXJucyAwIGlmIG1hc3RlciB0aHJlYWQsIDEgaWYgd29ya2VyIHRocmVhZC4KKyAqLworaW50CitfX2ttcF9iYXJyaWVyKCBlbnVtIGJhcnJpZXJfdHlwZSBidCwgaW50IGd0aWQsIGludCBpc19zcGxpdCwKKyAgICAgICAgICAgICAgIHNpemVfdCByZWR1Y2Vfc2l6ZSwgdm9pZCAqcmVkdWNlX2RhdGEsIHZvaWQgKCpyZWR1Y2UpKHZvaWQgKiwgdm9pZCAqKSApCit7CisgICAgcmVnaXN0ZXIgaW50ICAgICAgICAgIHRpZCAgICAgICAgICAgICA9IF9fa21wX3RpZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICByZWdpc3RlciBrbXBfaW5mb190ICAqdGhpc190aHIgICAgICAgID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIHJlZ2lzdGVyIGttcF90ZWFtX3QgICp0ZWFtICAgICAgICAgICAgPSB0aGlzX3RociAtPiB0aC50aF90ZWFtOworICAgIHJlZ2lzdGVyIGludCBzdGF0dXMgPSAwOworCisgICAgaWRlbnRfdCAqIHRtcF9sb2MgPSBfX2ttcF90aHJlYWRzWyBndGlkIF0tPnRoLnRoX2lkZW50OworCisgICAgS0FfVFJBQ0UoIDE1LCAoICJfX2ttcF9iYXJyaWVyOiBUIyVkKCVkOiVkKSBoYXMgYXJyaXZlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgZ3RpZCwgX19rbXBfdGVhbV9mcm9tX2d0aWQoZ3RpZCktPnQudF9pZCwgX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKSApICk7CisKKyAgICBpZiAoICEgdGVhbS0+dC50X3NlcmlhbGl6ZWQgKSB7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAvLyBUaGlzIHZhbHVlIHdpbGwgYmUgdXNlZCBpbiBpdHQgbm90aWZ5IGV2ZW50cyBiZWxvdy4KKyAgICAgICAgdm9pZCAqIGl0dF9zeW5jX29iaiA9IE5VTEw7CisgICAgICAgICNpZiBVU0VfSVRUX05PVElGWQorICAgICAgICAgICAgaWYgKCBfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgfHwgS01QX0lUVF9ERUJVRyApCisgICAgICAgICAgICAgICAgaXR0X3N5bmNfb2JqID0gX19rbXBfaXR0X2JhcnJpZXJfb2JqZWN0KCBndGlkLCBidCwgMSApOworICAgICAgICAjZW5kaWYKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgICAgICNpZiBPTVBfMzBfRU5BQkxFRAorICAgICAgICAgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgPT0gdHNrbV9leHRyYV9iYXJyaWVyICkgeworICAgICAgICAgICAgICAgIF9fa21wX3Rhc2tpbmdfYmFycmllciggdGVhbSwgdGhpc190aHIsIGd0aWQgKTsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSggMTUsICggIl9fa21wX2JhcnJpZXI6IFQjJWQoJWQ6JWQpIHBhc3QgdGFza2luZyBiYXJyaWVyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIF9fa21wX3RlYW1fZnJvbV9ndGlkKGd0aWQpLT50LnRfaWQsIF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCkgKSApOworICAgICAgICAgICAgfQorICAgICAgICAjZW5kaWYgLyogT01QXzMwX0VOQUJMRUQgKi8KKworICAgICAgICAvLworICAgICAgICAvLyBDb3B5IHRoZSBibG9ja3RpbWUgaW5mbyB0byB0aGUgdGhyZWFkLCB3aGVyZSBfX2ttcF93YWl0X3NsZWVwKCkKKyAgICAgICAgLy8gY2FuIGFjY2VzcyBpdCB3aGVuIHRoZSB0ZWFtIHN0cnVjdCBpcyBub3QgZ3VhcmFudGVlZCB0byBleGlzdC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gU2VlIHRoZSBub3RlIGFib3V0IHRoZSBjb3JyZXNwb25kaW5nIGNvZGUgaW4gX19rbXBfam9pbl9iYXJyaWVyKCkKKyAgICAgICAgLy8gYmVpbmcgcGVyZm9ybWFuY2UtY3JpdGljYWwuCisgICAgICAgIC8vCisgICAgICAgIGlmICggX19rbXBfZGZsdF9ibG9ja3RpbWUgIT0gS01QX01BWF9CTE9DS1RJTUUgKSB7CisgICAgICAgICAgICAjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgICAgICAgICAgICB0aGlzX3RociAtPiB0aC50aF90ZWFtX2J0X2ludGVydmFscyA9IHRlYW0gLT4gdC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS50ZF9pY3ZzLmJ0X2ludGVydmFsczsKKyAgICAgICAgICAgICAgICB0aGlzX3RociAtPiB0aC50aF90ZWFtX2J0X3NldCA9IHRlYW0gLT4gdC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS50ZF9pY3ZzLmJ0X3NldDsKKyAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICAgdGhpc190aHIgLT4gdGgudGhfdGVhbV9idF9pbnRlcnZhbHMgPSB0ZWFtIC0+IHQudF9zZXRfYnRfaW50ZXJ2YWxzW3RpZF07CisgICAgICAgICAgICAgICAgdGhpc190aHIgLT4gdGgudGhfdGVhbV9idF9zZXQ9IHRlYW0gLT4gdC50X3NldF9idF9zZXRbdGlkXTsKKyAgICAgICAgICAgICNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorICAgICAgICB9CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIGlmICggX19pdHRfc3luY19jcmVhdGVfcHRyIHx8IEtNUF9JVFRfREVCVUcgKQorICAgICAgICAgICAgX19rbXBfaXR0X2JhcnJpZXJfc3RhcnRpbmcoIGd0aWQsIGl0dF9zeW5jX29iaiApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgICAgICBpZiAoIHJlZHVjZSAhPSBOVUxMICkgeworICAgICAgICAgICAgLy9LTVBfREVCVUdfQVNTRVJUKCBpc19zcGxpdCA9PSBUUlVFICk7ICAvLyAjQzY5OTU2CisgICAgICAgICAgICB0aGlzX3RociAtPiB0aC50aF9sb2NhbC5yZWR1Y2VfZGF0YSA9IHJlZHVjZV9kYXRhOworICAgICAgICB9CisgICAgICAgIGlmICggX19rbXBfYmFycmllcl9nYXRoZXJfcGF0dGVyblsgYnQgXSA9PSBicF9saW5lYXJfYmFyIHx8IF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JyYW5jaF9iaXRzWyBidCBdID09IDAgKSB7CisgICAgICAgICAgICBfX2ttcF9saW5lYXJfYmFycmllcl9nYXRoZXIoIGJ0LCB0aGlzX3RociwgZ3RpZCwgdGlkLCByZWR1Y2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoIGl0dF9zeW5jX29iaiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIH0gZWxzZSBpZiAoIF9fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdHRlcm5bIGJ0IF0gPT0gYnBfdHJlZV9iYXIgKSB7CisgICAgICAgICAgICBfX2ttcF90cmVlX2JhcnJpZXJfZ2F0aGVyKCBidCwgdGhpc190aHIsIGd0aWQsIHRpZCwgcmVkdWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyggaXR0X3N5bmNfb2JqICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfX2ttcF9oeXBlcl9iYXJyaWVyX2dhdGhlciggYnQsIHRoaXNfdGhyLCBndGlkLCB0aWQsIHJlZHVjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKCBpdHRfc3luY19vYmogKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIH07IC8vIGlmCisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIC8vIFRPRE86IEluIGNhc2Ugb2Ygc3BsaXQgcmVkdWN0aW9uIGJhcnJpZXIsIG1hc3RlciB0aHJlYWQgbWF5IHNlbmQgYWNxdWlyZWQgZXZlbnQgZWFybHksCisgICAgICAgIC8vIGJlZm9yZSB0aGUgZmluYWwgc3VtbWF0aW9uIGludG8gdGhlIHNoYXJlZCB2YXJpYWJsZSBpcyBkb25lIChmaW5hbCBzdW1tYXRpb24gY2FuIGJlIGEKKyAgICAgICAgLy8gbG9uZyBvcGVyYXRpb24gZm9yIGFycmF5IHJlZHVjdGlvbnMpLgorICAgICAgICBpZiAoIF9faXR0X3N5bmNfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHICkKKyAgICAgICAgICAgIF9fa21wX2l0dF9iYXJyaWVyX21pZGRsZSggZ3RpZCwgaXR0X3N5bmNfb2JqICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgICAgIEtNUF9NQigpOworCisgICAgICAgIGlmICggS01QX01BU1RFUl9USUQoIHRpZCApICkgeworICAgICAgICAgICAgc3RhdHVzID0gMDsKKworICAgICAgICAgICAgI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfdGFza190ZWFtX3dhaXQoICB0aGlzX3RociwgdGVhbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKCBpdHRfc3luY19vYmogKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX3Rhc2tfdGVhbV9zZXR1cCggdGhpc190aHIsIHRlYW0gKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAjZW5kaWYgLyogT01QXzMwX0VOQUJMRUQgKi8KKworCisjaWYgVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWQorICAgICAgICAgICAgLy8gQmFycmllciAtIHJlcG9ydCBmcmFtZSBlbmQKKyAgICAgICAgICAgIGlmKCBfX2l0dF9mcmFtZV9zdWJtaXRfdjNfcHRyICYmIF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlICkgeworICAgICAgICAgICAgICAgIGttcF91aW50NjQgdG1wID0gX19pdHRfZ2V0X3RpbWVzdGFtcCgpOworICAgICAgICAgICAgICAgIHN3aXRjaCggX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgX19rbXBfaXR0X2ZyYW1lX3N1Ym1pdCggZ3RpZCwgdGhpc190aHItPnRoLnRoX2ZyYW1lX3RpbWUsIHRtcCwgMCwgdG1wX2xvYyApOworICAgICAgICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX2ZyYW1lX3RpbWUgPSB0bXA7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICBfX2ttcF9pdHRfZnJhbWVfc3VibWl0KCBndGlkLCB0aGlzX3Roci0+dGgudGhfYmFyX2Fycml2ZV90aW1lLCB0bXAsIDEsIHRtcF9sb2MgKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgIF9fa21wX2l0dF9mcmFtZV9zdWJtaXQoIGd0aWQsIHRoaXNfdGhyLT50aC50aF9mcmFtZV90aW1lLCB0bXAsIDAsIHRtcF9sb2MgKTsKKyAgICAgICAgICAgICAgICAgIF9fa21wX2l0dF9mcmFtZV9zdWJtaXQoIGd0aWQsIHRoaXNfdGhyLT50aC50aF9iYXJfYXJyaXZlX3RpbWUsIHRtcCwgMSwgdG1wX2xvYyApOworICAgICAgICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX2ZyYW1lX3RpbWUgPSB0bXA7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIHN0YXR1cyA9PSAxIHx8ICEgaXNfc3BsaXQgKSB7CisgICAgICAgICAgICBpZiAoIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXR0ZXJuWyBidCBdID09IGJwX2xpbmVhcl9iYXIgfHwgX19rbXBfYmFycmllcl9yZWxlYXNlX2JyYW5jaF9iaXRzWyBidCBdID09IDAgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfbGluZWFyX2JhcnJpZXJfcmVsZWFzZSggYnQsIHRoaXNfdGhyLCBndGlkLCB0aWQsIEZBTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoIGl0dF9zeW5jX29iaiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXR0ZXJuWyBidCBdID09IGJwX3RyZWVfYmFyICkgeworICAgICAgICAgICAgICAgIF9fa21wX3RyZWVfYmFycmllcl9yZWxlYXNlKCBidCwgdGhpc190aHIsIGd0aWQsIHRpZCwgRkFMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoIGl0dF9zeW5jX29iaiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIF9fa21wX2h5cGVyX2JhcnJpZXJfcmVsZWFzZSggYnQsIHRoaXNfdGhyLCBndGlkLCB0aWQsIEZBTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyggaXR0X3N5bmNfb2JqICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgICAgICAgICAgICBpZiAoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICkgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF90YXNrX3RlYW1fc3luYyggdGhpc190aHIsIHRlYW0gKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAjZW5kaWYgLyogT01QXzMwX0VOQUJMRUQgKi8KKyAgICAgICAgfQorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAvLyBHRUg6IFRPRE86IE1vdmUgdGhpcyB1bmRlciBpZi1jb25kaXRpb24gYWJvdmUgYW5kIGFsc28gaW5jbHVkZSBpbiBfX2ttcF9lbmRfc3BsaXRfYmFycmllcigpLgorICAgICAgICAvLyAgICAgIFRoaXMgd2lsbCBtb3JlIGFjY3VyYXRlbHkgcmVwcmVzZW50IHRoZSBhY3R1YWwgcmVsZWFzZSB0aW1lIG9mIHRoZSB0aHJlYWRzIGZvciBzcGxpdCBiYXJyaWVycy4KKyAgICAgICAgaWYgKCBfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgfHwgS01QX0lUVF9ERUJVRyApCisgICAgICAgICAgICBfX2ttcF9pdHRfYmFycmllcl9maW5pc2hlZCggZ3RpZCwgaXR0X3N5bmNfb2JqICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgfSBlbHNlIHsgICAgLy8gVGVhbSBpcyBzZXJpYWxpemVkLgorCisgICAgICAgIHN0YXR1cyA9IDA7CisKKyAgICAgICAgI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgICBpZiAoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICkgeworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gVGhlIHRhc2sgdGVhbSBzaG91bGQgYmUgTlVMTCBmb3Igc2VyaWFsaXplZCBjb2RlLgorICAgICAgICAgICAgICAgIC8vICh0YXNrcyB3aWxsIGJlIGV4ZWN1dGVkIGltbWVkaWF0ZWx5KS4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0tPnQudF90YXNrX3RlYW0gPT0gTlVMTCApOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW0gPT0gTlVMTCApOworICAgICAgICAgICAgfQorICAgICAgICAjZW5kaWYgLyogT01QXzMwX0VOQUJMRUQgKi8KKyAgICB9CisKKyAgICBLQV9UUkFDRSggMTUsICggIl9fa21wX2JhcnJpZXI6IFQjJWQoJWQ6JWQpIGlzIGxlYXZpbmcgd2l0aCByZXR1cm4gdmFsdWUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIGd0aWQsIF9fa21wX3RlYW1fZnJvbV9ndGlkKGd0aWQpLT50LnRfaWQsIF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCksCisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyApICk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCit2b2lkCitfX2ttcF9lbmRfc3BsaXRfYmFycmllciggZW51bSBiYXJyaWVyX3R5cGUgYnQsIGludCBndGlkICkKK3sKKyAgICBpbnQgICAgICAgICB0aWQgICAgICA9IF9fa21wX3RpZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICBrbXBfaW5mb190ICp0aGlzX3RociA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICBrbXBfdGVhbV90ICp0ZWFtICAgICA9IHRoaXNfdGhyIC0+IHRoLnRoX3RlYW07CisKKyAgICBpZiggISB0ZWFtIC0+IHQudF9zZXJpYWxpemVkICkgeworICAgICAgICBpZiggS01QX01BU1RFUl9HVElEKCBndGlkICkgKSB7CisgICAgICAgICAgICBpZiAoIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXR0ZXJuWyBidCBdID09IGJwX2xpbmVhcl9iYXIgfHwgX19rbXBfYmFycmllcl9yZWxlYXNlX2JyYW5jaF9iaXRzWyBidCBdID09IDAgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfbGluZWFyX2JhcnJpZXJfcmVsZWFzZSggYnQsIHRoaXNfdGhyLCBndGlkLCB0aWQsIEZBTFNFCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgTlVMTAorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfSBlbHNlIGlmICggX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdHRlcm5bIGJ0IF0gPT0gYnBfdHJlZV9iYXIgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfdHJlZV9iYXJyaWVyX3JlbGVhc2UoIGJ0LCB0aGlzX3RociwgZ3RpZCwgdGlkLCBGQUxTRQorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBOVUxMCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9oeXBlcl9iYXJyaWVyX3JlbGVhc2UoIGJ0LCB0aGlzX3RociwgZ3RpZCwgdGlkLCBGQUxTRQorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgTlVMTAorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfdGFza190ZWFtX3N5bmMoIHRoaXNfdGhyLCB0ZWFtICk7CisgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICNlbmRpZiAvKiBPTVBfMzBfRU5BQkxFRCAqLworICAgICAgICB9CisgICAgfQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogZGV0ZXJtaW5lIGlmIHdlIGNhbiBnbyBwYXJhbGxlbCBvciBtdXN0IHVzZSBhIHNlcmlhbGl6ZWQgcGFyYWxsZWwgcmVnaW9uIGFuZAorICogaG93IG1hbnkgdGhyZWFkcyB3ZSBjYW4gdXNlCisgKiBzZXRfbnByb2MgaXMgdGhlIG51bWJlciBvZiB0aHJlYWRzIHJlcXVlc3RlZCBmb3IgdGhlIHRlYW0KKyAqIHJldHVybnMgMCBpZiB3ZSBzaG91bGQgc2VyaWFsaXplIG9yIG9ubHkgdXNlIG9uZSB0aHJlYWQsCisgKiBvdGhlcndpc2UgdGhlIG51bWJlciBvZiB0aHJlYWRzIHRvIHVzZQorICogVGhlIGZvcmtqb2luIGxvY2sgaXMgaGVsZCBieSB0aGUgY2FsbGVyLgorICovCitzdGF0aWMgaW50CitfX2ttcF9yZXNlcnZlX3RocmVhZHMoIGttcF9yb290X3QgKnJvb3QsIGttcF90ZWFtX3QgKnBhcmVudF90ZWFtLAorICAgaW50IG1hc3Rlcl90aWQsIGludCBzZXRfbnRocmVhZHMKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAsIGludCBlbnRlcl90ZWFtcworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCispCit7CisgICAgaW50IGNhcGFjaXR5OworICAgIGludCBuZXdfbnRocmVhZHM7CisgICAgaW50IHVzZV9ybWxfdG9fYWRqdXN0X250aDsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHJvb3QgJiYgcGFyZW50X3RlYW0gKTsKKworICAgIC8vCisgICAgLy8gSW5pdGlhbCBjaGVjayB0byBzZWUgaWYgd2Ugc2hvdWxkIHVzZSBhIHNlcmlhbGl6ZWQgdGVhbS4KKyAgICAvLworICAgIGlmICggc2V0X250aHJlYWRzID09IDEgKSB7CisgICAgICAgIEtDX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVzZXJ2ZV90aHJlYWRzOiBUIyVkIHJlc2VydmluZyAxIHRocmVhZDsgcmVxdWVzdGVkICVkIHRocmVhZHNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9nZXRfZ3RpZCgpLCBzZXRfbnRocmVhZHMgKSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoICggIWdldF9fbmVzdGVkXzIocGFyZW50X3RlYW0sbWFzdGVyX3RpZCkgJiYgKHJvb3QtPnIucl9pbl9wYXJhbGxlbAorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgJiYgIWVudGVyX3RlYW1zCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICAgICApICkgfHwgKCBfX2ttcF9saWJyYXJ5ID09IGxpYnJhcnlfc2VyaWFsICkgKSB7CisgICAgICAgIEtDX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVzZXJ2ZV90aHJlYWRzOiBUIyVkIHNlcmlhbGl6aW5nIHRlYW07IHJlcXVlc3RlZCAlZCB0aHJlYWRzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ2V0X2d0aWQoKSwgc2V0X250aHJlYWRzICkpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIElmIGR5bi12YXIgaXMgc2V0LCBkeW5hbWljYWxseSBhZGp1c3QgdGhlIG51bWJlciBvZiBkZXNpcmVkIHRocmVhZHMsCisgICAgLy8gYWNjb3JkaW5nIHRvIHRoZSBtZXRob2Qgc3BlY2lmaWVkIGJ5IGR5bmFtaWNfbW9kZS4KKyAgICAvLworICAgIG5ld19udGhyZWFkcyA9IHNldF9udGhyZWFkczsKKyAgICB1c2Vfcm1sX3RvX2FkanVzdF9udGggPSBGQUxTRTsKKyAgICBpZiAoICEgZ2V0X19keW5hbWljXzIoIHBhcmVudF90ZWFtLCBtYXN0ZXJfdGlkICkgKSB7CisgICAgICAgIDsKKyAgICB9CisjaWZkZWYgVVNFX0xPQURfQkFMQU5DRQorICAgIGVsc2UgaWYgKCBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWNfbW9kZSA9PSBkeW5hbWljX2xvYWRfYmFsYW5jZSApIHsKKyAgICAgICAgbmV3X250aHJlYWRzID0gX19rbXBfbG9hZF9iYWxhbmNlX25wcm9jKCByb290LCBzZXRfbnRocmVhZHMgKTsKKyAgICAgICAgaWYgKCBuZXdfbnRocmVhZHMgPT0gMSApIHsKKyAgICAgICAgICAgIEtDX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVzZXJ2ZV90aHJlYWRzOiBUIyVkIGxvYWQgYmFsYW5jZSByZWR1Y2VkIHJlc2VydmF0aW9uIHRvIDEgdGhyZWFkXG4iLAorICAgICAgICAgICAgICBtYXN0ZXJfdGlkICkpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBuZXdfbnRocmVhZHMgPCBzZXRfbnRocmVhZHMgKSB7CisgICAgICAgICAgICBLQ19UUkFDRSggMTAsICggIl9fa21wX3Jlc2VydmVfdGhyZWFkczogVCMlZCBsb2FkIGJhbGFuY2UgcmVkdWNlZCByZXNlcnZhdGlvbiB0byAlZCB0aHJlYWRzXG4iLAorICAgICAgICAgICAgICBtYXN0ZXJfdGlkLCBuZXdfbnRocmVhZHMgKSk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogVVNFX0xPQURfQkFMQU5DRSAqLworICAgIGVsc2UgaWYgKCBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWNfbW9kZSA9PSBkeW5hbWljX3RocmVhZF9saW1pdCApIHsKKyAgICAgICAgbmV3X250aHJlYWRzID0gX19rbXBfYXZhaWxfcHJvYyAtIF9fa21wX250aCArIChyb290LT5yLnJfYWN0aXZlID8gMQorICAgICAgICAgIDogcm9vdC0+ci5yX2hvdF90ZWFtLT50LnRfbnByb2MpOworICAgICAgICBpZiAoIG5ld19udGhyZWFkcyA8PSAxICkgeworICAgICAgICAgICAgS0NfVFJBQ0UoIDEwLCAoICJfX2ttcF9yZXNlcnZlX3RocmVhZHM6IFQjJWQgdGhyZWFkIGxpbWl0IHJlZHVjZWQgcmVzZXJ2YXRpb24gdG8gMSB0aHJlYWRcbiIsCisgICAgICAgICAgICAgIG1hc3Rlcl90aWQgKSk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIG5ld19udGhyZWFkcyA8IHNldF9udGhyZWFkcyApIHsKKyAgICAgICAgICAgIEtDX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVzZXJ2ZV90aHJlYWRzOiBUIyVkIHRocmVhZCBsaW1pdCByZWR1Y2VkIHJlc2VydmF0aW9uIHRvICVkIHRocmVhZHNcbiIsCisgICAgICAgICAgICAgIG1hc3Rlcl90aWQsIG5ld19udGhyZWFkcyApKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG5ld19udGhyZWFkcyA9IHNldF9udGhyZWFkczsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICggX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljX21vZGUgPT0gZHluYW1pY19yYW5kb20gKSB7CisgICAgICAgIGlmICggc2V0X250aHJlYWRzID4gMiApIHsKKyAgICAgICAgICAgIG5ld19udGhyZWFkcyA9IF9fa21wX2dldF9yYW5kb20oIHBhcmVudF90ZWFtLT50LnRfdGhyZWFkc1ttYXN0ZXJfdGlkXSApOworICAgICAgICAgICAgbmV3X250aHJlYWRzID0gKCBuZXdfbnRocmVhZHMgJSBzZXRfbnRocmVhZHMgKSArIDE7CisgICAgICAgICAgICBpZiAoIG5ld19udGhyZWFkcyA9PSAxICkgeworICAgICAgICAgICAgICAgIEtDX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVzZXJ2ZV90aHJlYWRzOiBUIyVkIGR5bmFtaWMgcmFuZG9tIHJlZHVjZWQgcmVzZXJ2YXRpb24gdG8gMSB0aHJlYWRcbiIsCisgICAgICAgICAgICAgICAgICBtYXN0ZXJfdGlkICkpOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBuZXdfbnRocmVhZHMgPCBzZXRfbnRocmVhZHMgKSB7CisgICAgICAgICAgICAgICAgS0NfVFJBQ0UoIDEwLCAoICJfX2ttcF9yZXNlcnZlX3RocmVhZHM6IFQjJWQgZHluYW1pYyByYW5kb20gcmVkdWNlZCByZXNlcnZhdGlvbiB0byAlZCB0aHJlYWRzXG4iLAorICAgICAgICAgICAgICAgICAgbWFzdGVyX3RpZCwgbmV3X250aHJlYWRzICkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBLTVBfQVNTRVJUKCAwICk7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBSZXNwZWN0IEtNUF9BTExfVEhSRUFEUywgS01QX01BWF9USFJFQURTLCBPTVBfVEhSRUFEX0xJTUlULgorICAgIC8vCisgICAgaWYgKCBfX2ttcF9udGggKyBuZXdfbnRocmVhZHMgLSAoIHJvb3QtPnIucl9hY3RpdmUgPyAxIDoKKyAgICAgIHJvb3QtPnIucl9ob3RfdGVhbS0+dC50X25wcm9jICkgPiBfX2ttcF9tYXhfbnRoICkgeworICAgICAgICBpbnQgdGxfbnRocmVhZHMgPSBfX2ttcF9tYXhfbnRoIC0gX19rbXBfbnRoICsgKCByb290LT5yLnJfYWN0aXZlID8gMSA6CisgICAgICAgICAgcm9vdC0+ci5yX2hvdF90ZWFtLT50LnRfbnByb2MgKTsKKyAgICAgICAgaWYgKCB0bF9udGhyZWFkcyA8PSAwICkgeworICAgICAgICAgICAgdGxfbnRocmVhZHMgPSAxOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gSWYgZHluLXZhciBpcyBmYWxzZSwgZW1pdCBhIDEtdGltZSB3YXJuaW5nLgorICAgICAgICAvLworICAgICAgICBpZiAoICEgZ2V0X19keW5hbWljXzIoIHBhcmVudF90ZWFtLCBtYXN0ZXJfdGlkICkKKyAgICAgICAgICAmJiAoICEgX19rbXBfcmVzZXJ2ZV93YXJuICkgKSB7CisgICAgICAgICAgICBfX2ttcF9yZXNlcnZlX3dhcm4gPSAxOworICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgIGttcF9tc193YXJuaW5nLAorICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRGb3JtVGhyVGVhbSwgc2V0X250aHJlYWRzLCB0bF9udGhyZWFkcyApLAorICAgICAgICAgICAgICAgIEtNUF9ITlQoIFVuc2V0X0FMTF9USFJFQURTICksCisgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCB0bF9udGhyZWFkcyA9PSAxICkgeworICAgICAgICAgICAgS0NfVFJBQ0UoIDEwLCAoICJfX2ttcF9yZXNlcnZlX3RocmVhZHM6IFQjJWQgS01QX0FMTF9USFJFQURTIHJlZHVjZWQgcmVzZXJ2YXRpb24gdG8gMSB0aHJlYWRcbiIsCisgICAgICAgICAgICAgIG1hc3Rlcl90aWQgKSk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBLQ19UUkFDRSggMTAsICggIl9fa21wX3Jlc2VydmVfdGhyZWFkczogVCMlZCBLTVBfQUxMX1RIUkVBRFMgcmVkdWNlZCByZXNlcnZhdGlvbiB0byAlZCB0aHJlYWRzXG4iLAorICAgICAgICAgIG1hc3Rlcl90aWQsIHRsX250aHJlYWRzICkpOworICAgICAgICBuZXdfbnRocmVhZHMgPSB0bF9udGhyZWFkczsKKyAgICB9CisKKworICAgIC8vCisgICAgLy8gQ2hlY2sgaWYgdGhlIHRocmVhZHMgYXJyYXkgaXMgbGFyZ2UgZW5vdWdoLCBvciBuZWVkcyBleHBhbmRpbmcuCisgICAgLy8KKyAgICAvLyBTZWUgY29tbWVudCBpbiBfX2ttcF9yZWdpc3Rlcl9yb290KCkgYWJvdXQgdGhlIGFkanVzdG1lbnQgaWYKKyAgICAvLyBfX2ttcF90aHJlYWRzWzBdID09IE5VTEwuCisgICAgLy8KKyAgICBjYXBhY2l0eSA9IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7CisgICAgaWYgKCBUQ1JfUFRSKF9fa21wX3RocmVhZHNbMF0pID09IE5VTEwgKSB7CisgICAgICAgIC0tY2FwYWNpdHk7CisgICAgfQorICAgIGlmICggX19rbXBfbnRoICsgbmV3X250aHJlYWRzIC0gKCByb290LT5yLnJfYWN0aXZlID8gMSA6CisgICAgICByb290LT5yLnJfaG90X3RlYW0tPnQudF9ucHJvYyApID4gY2FwYWNpdHkgKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIEV4cGFuZCB0aGUgdGhyZWFkcyBhcnJheS4KKyAgICAgICAgLy8KKyAgICAgICAgaW50IHNsb3RzUmVxdWlyZWQgPSBfX2ttcF9udGggKyBuZXdfbnRocmVhZHMgLSAoIHJvb3QtPnIucl9hY3RpdmUgPyAxIDoKKyAgICAgICAgICByb290LT5yLnJfaG90X3RlYW0tPnQudF9ucHJvYyApIC0gY2FwYWNpdHk7CisgICAgICAgIGludCBzbG90c0FkZGVkID0gX19rbXBfZXhwYW5kX3RocmVhZHMoc2xvdHNSZXF1aXJlZCwgc2xvdHNSZXF1aXJlZCk7CisgICAgICAgIGlmICggc2xvdHNBZGRlZCA8IHNsb3RzUmVxdWlyZWQgKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gVGhlIHRocmVhZHMgYXJyYXkgd2FzIG5vdCBleHBhbmRlZCBlbm91Z2guCisgICAgICAgICAgICAvLworICAgICAgICAgICAgbmV3X250aHJlYWRzIC09ICggc2xvdHNSZXF1aXJlZCAtIHNsb3RzQWRkZWQgKTsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoIG5ld19udGhyZWFkcyA+PSAxICk7CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBJZiBkeW4tdmFyIGlzIGZhbHNlLCBlbWl0IGEgMS10aW1lIHdhcm5pbmcuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaWYgKCAhIGdldF9fZHluYW1pY18yKCBwYXJlbnRfdGVhbSwgbWFzdGVyX3RpZCApCisgICAgICAgICAgICAgICYmICggISBfX2ttcF9yZXNlcnZlX3dhcm4gKSApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9yZXNlcnZlX3dhcm4gPSAxOworICAgICAgICAgICAgICAgIGlmICggX19rbXBfdHBfY2FjaGVkICkgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbXNfd2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRGb3JtVGhyVGVhbSwgc2V0X250aHJlYWRzLCBuZXdfbnRocmVhZHMgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ITlQoIFNldF9BTExfVEhSRUFEUFJJVkFURSwgX19rbXBfdHBfY2FwYWNpdHkgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ITlQoIFBvc3NpYmxlU3lzdGVtTGltaXRPblRocmVhZHMgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbXNfd2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRGb3JtVGhyVGVhbSwgc2V0X250aHJlYWRzLCBuZXdfbnRocmVhZHMgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ITlQoIFN5c3RlbUxpbWl0T25UaHJlYWRzICksCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICggbmV3X250aHJlYWRzID09IDEgKSB7CisgICAgICAgIEtDX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVzZXJ2ZV90aHJlYWRzOiBUIyVkIHNlcmlhbGl6aW5nIHRlYW0gYWZ0ZXIgcmVjbGFpbWluZyBkZWFkIHJvb3RzIGFuZCByZWNoZWNraW5nOyByZXF1ZXN0ZWQgJWQgdGhyZWFkc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2dldF9ndGlkKCksIHNldF9udGhyZWFkcyApICk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIEtDX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVzZXJ2ZV90aHJlYWRzOiBUIyVkIGFsbG9jYXRpbmcgJWQgdGhyZWFkczsgcmVxdWVzdGVkICVkIHRocmVhZHNcbiIsCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2dldF9ndGlkKCksIG5ld19udGhyZWFkcywgc2V0X250aHJlYWRzICkpOworICAgIHJldHVybiBuZXdfbnRocmVhZHM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIGFsbG9jYXRlIHRocmVhZHMgZnJvbSB0aGUgdGhyZWFkIHBvb2wgYW5kIGFzc2lnbiB0aGVtIHRvIHRoZSBuZXcgdGVhbSAqLworLyogd2UgYXJlIGFzc3VyZWQgdGhhdCB0aGVyZSBhcmUgZW5vdWdoIHRocmVhZHMgYXZhaWxhYmxlLCBiZWNhdXNlIHdlCisgKiBjaGVja2VkIG9uIHRoYXQgZWFybGllciB3aXRoaW4gY3JpdGljYWwgc2VjdGlvbiBmb3Jram9pbiAqLworCitzdGF0aWMgdm9pZAorX19rbXBfZm9ya190ZWFtX3RocmVhZHMoIGttcF9yb290X3QgKnJvb3QsIGttcF90ZWFtX3QgKnRlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAga21wX2luZm9fdCAqbWFzdGVyX3RoLCBpbnQgbWFzdGVyX2d0aWQgKQoreworICAgIGludCAgICAgICAgIGk7CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfZm9ya190ZWFtX3RocmVhZHM6IG5ld19ucHJvY3MgPSAlZFxuIiwgdGVhbS0+dC50X25wcm9jICkgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBtYXN0ZXJfZ3RpZCA9PSBfX2ttcF9nZXRfZ3RpZCgpICk7CisgICAgS01QX01CKCk7CisKKyAgICAvKiBmaXJzdCwgbGV0J3Mgc2V0dXAgdGhlIG1hc3RlciB0aHJlYWQgKi8KKyAgICBtYXN0ZXJfdGggLT4gdGgudGhfaW5mby5kcy5kc190aWQgID0gMDsKKyAgICBtYXN0ZXJfdGggLT4gdGgudGhfdGVhbSAgICAgICAgICAgID0gdGVhbTsKKyAgICBtYXN0ZXJfdGggLT4gdGgudGhfdGVhbV9ucHJvYyAgICAgID0gdGVhbSAtPiB0LnRfbnByb2M7CisgICAgbWFzdGVyX3RoIC0+IHRoLnRoX3RlYW1fbWFzdGVyICAgICA9IG1hc3Rlcl90aDsKKyAgICBtYXN0ZXJfdGggLT4gdGgudGhfdGVhbV9zZXJpYWxpemVkID0gRkFMU0U7CisgICAgbWFzdGVyX3RoIC0+IHRoLnRoX2Rpc3BhdGNoICAgICAgICA9ICYgdGVhbSAtPiB0LnRfZGlzcGF0Y2hbIDAgXTsKKworICAgIC8qIG1ha2Ugc3VyZSB3ZSBhcmUgbm90IHRoZSBvcHRpbWl6ZWQgaG90IHRlYW0gKi8KKyAgICBpZiAoIHRlYW0gIT0gcm9vdC0+ci5yX2hvdF90ZWFtICkgeworCisgICAgICAgIC8qIGluc3RhbGwgdGhlIG1hc3RlciB0aHJlYWQgKi8KKyAgICAgICAgdGVhbSAtPiB0LnRfdGhyZWFkc1sgMCBdICAgID0gbWFzdGVyX3RoOworICAgICAgICBfX2ttcF9pbml0aWFsaXplX2luZm8oIG1hc3Rlcl90aCwgdGVhbSwgMCwgbWFzdGVyX2d0aWQgKTsKKworICAgICAgICAvKiBub3csIGluc3RhbGwgdGhlIHdvcmtlciB0aHJlYWRzICovCisgICAgICAgIGZvciAoIGk9MSA7ICBpIDwgdGVhbS0+dC50X25wcm9jIDsgaSsrICkgeworCisgICAgICAgICAgICAvKiBmb3JrIG9yIHJlYWxsb2NhdGUgYSBuZXcgdGhyZWFkIGFuZCBpbnN0YWxsIGl0IGluIHRlYW0gKi8KKyAgICAgICAgICAgIHRlYW0gLT4gdC50X3RocmVhZHNbIGkgXSA9ICBfX2ttcF9hbGxvY2F0ZV90aHJlYWQoIHJvb3QsIHRlYW0sIGkgKTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0tPnQudF90aHJlYWRzW2ldICk7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtLT50LnRfdGhyZWFkc1tpXS0+dGgudGhfdGVhbSA9PSB0ZWFtICk7CisgICAgICAgICAgICAvKiBhbGlnbiB0ZWFtIGFuZCB0aHJlYWQgYXJyaXZlZCBzdGF0ZXMgKi8KKyAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9mb3JrX3RlYW1fdGhyZWFkczogVCMlZCglZDolZCkgaW5pdCBhcnJpdmVkIFQjJWQoJWQ6JWQpIGpvaW4gPSV1LCBwbGFpbj0ldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGlkKCAwLCB0ZWFtICksIHRlYW0tPnQudF9pZCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGlkKCBpLCB0ZWFtICksIHRlYW0tPnQudF9pZCwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfYmFyWyBic19mb3Jram9pbl9iYXJyaWVyIF0uYl9hcnJpdmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9iYXJbIGJzX3BsYWluX2JhcnJpZXIgXS5iX2Fycml2ZWQgKSApOworCisgICAgICAgICAgICB7IC8vIEluaXRpYWxpemUgdGhyZWFkcycgYmFycmllciBkYXRhLgorICAgICAgICAgICAgICAgIGludCBiOworICAgICAgICAgICAgICAgIGttcF9iYWxpZ25fdCAqIGJhbGlnbiA9IHRlYW0tPnQudF90aHJlYWRzWyBpIF0tPnRoLnRoX2JhcjsKKyAgICAgICAgICAgICAgICBmb3IgKCBiID0gMDsgYiA8IGJzX2xhc3RfYmFycmllcjsgKysgYiApIHsKKyAgICAgICAgICAgICAgICAgICAgYmFsaWduWyBiIF0uYmIuYl9hcnJpdmVkICAgICAgICA9IHRlYW0tPnQudF9iYXJbIGIgXS5iX2Fycml2ZWQ7CisgICAgICAgICAgICAgICAgfTsgLy8gZm9yIGIKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisjaWYgT01QXzQwX0VOQUJMRUQgJiYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICBfX2ttcF9wYXJ0aXRpb25fcGxhY2VzKCB0ZWFtICk7CisjZW5kaWYKKworICAgIH0KKworICAgIEtNUF9NQigpOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfYWxsb2NfYXJndl9lbnRyaWVzKCBpbnQgYXJnYywga21wX3RlYW1fdCAqdGVhbSwgaW50IHJlYWxsb2MgKTsgLy8gZm9yd2FyZCBkZWNsYXJhdGlvbgorCitzdGF0aWMgdm9pZAorX19rbXBfc2V0dXBfaWN2X2NvcHkoIGttcF90ZWFtX3QgKnRlYW0sIGludCBuZXdfbnByb2MsCisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgICAgICAgICAgICAga21wX2ludGVybmFsX2NvbnRyb2xfdCAqIG5ld19pY3ZzLAorICAgICAgICAgICAgICAgICBpZGVudF90ICogICAgICAgICAgICAgICAgbG9jCisjZWxzZQorICAgICAgICAgICAgICAgICBpbnQgbmV3X3NldF9ucHJvYywgaW50IG5ld19zZXRfZHluYW1pYywgaW50IG5ld19zZXRfbmVzdGVkLAorICAgICAgICAgICAgICAgICBpbnQgbmV3X3NldF9ibG9ja3RpbWUsIGludCBuZXdfYnRfaW50ZXJ2YWxzLCBpbnQgbmV3X2J0X3NldAorI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgICAgICAgICk7IC8vIGZvcndhcmQgZGVjbGFyYXRpb24KKworLyogbW9zdCBvZiB0aGUgd29yayBmb3IgYSBmb3JrICovCisvKiByZXR1cm4gdHJ1ZSBpZiB3ZSByZWFsbHkgd2VudCBwYXJhbGxlbCwgZmFsc2UgaWYgc2VyaWFsaXplZCAqLworaW50CitfX2ttcF9mb3JrX2NhbGwoCisgICAgaWRlbnRfdCAgICogbG9jLAorICAgIGludCAgICAgICAgIGd0aWQsCisgICAgaW50ICAgICAgICAgZXhlY19tYXN0ZXIsIC8vIDAgLSBHTlUgbmF0aXZlIGNvZGUsIG1hc3RlciBkb2Vzbid0IGludm9rZSBtaWNyb3Rhc2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMSAtIEludGVsIGNvZGUsIG1hc3RlciBpbnZva2VzIG1pY3JvdGFzaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyIC0gTVMgbmF0aXZlIGNvZGUsIHVzZSBzcGVjaWFsIGludm9rZXIKKyAgICBrbXBfaW50MzIgICBhcmdjLAorICAgIG1pY3JvdGFza190IG1pY3JvdGFzaywKKyAgICBsYXVuY2hfdCAgICBpbnZva2VyLAorLyogVE9ETzogcmV2ZXJ0IHdvcmthcm91bmQgZm9yIEludGVsKFIpIDY0IHRyYWNrZXIgIzk2ICovCisjaWYgKEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0pICYmIEtNUF9PU19MSU5VWAorICAgIHZhX2xpc3QgICAqIGFwCisjZWxzZQorICAgIHZhX2xpc3QgICAgIGFwCisjZW5kaWYKKyAgICApCit7CisgICAgdm9pZCAgICAgICAgICAqKmFyZ3Y7CisgICAgaW50ICAgICAgICAgICAgIGk7CisgICAgaW50ICAgICAgICAgICAgIG1hc3Rlcl90aWQ7CisgICAgaW50ICAgICAgICAgICAgIG1hc3Rlcl90aGlzX2NvbnM7CisgICAgaW50ICAgICAgICAgICAgIG1hc3Rlcl9sYXN0X2NvbnM7CisgICAga21wX3RlYW1fdCAgICAgKnRlYW07CisgICAga21wX3RlYW1fdCAgICAgKnBhcmVudF90ZWFtOworICAgIGttcF9pbmZvX3QgICAgICptYXN0ZXJfdGg7CisgICAga21wX3Jvb3RfdCAgICAgKnJvb3Q7CisgICAgaW50ICAgICAgICAgICAgIG50aHJlYWRzOworICAgIGludCAgICAgICAgICAgICBtYXN0ZXJfYWN0aXZlOworICAgIGludCAgICAgICAgICAgICBtYXN0ZXJfc2V0X251bXRocmVhZHM7CisgICAgaW50ICAgICAgICAgICAgIGxldmVsOworI2lmIE9NUF80MF9FTkFCTEVECisgICAgaW50ICAgICAgICAgICAgIHRlYW1zX2xldmVsOworI2VuZGlmCisKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfZm9ya19jYWxsOiBlbnRlciBUIyVkXG4iLCBndGlkICkpOworCisgICAgLyogaW5pdGlhbGl6ZSBpZiBuZWVkZWQgKi8KKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworICAgIGlmKCAhIFRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpICkKKyAgICAgICAgX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSgpOworCisgICAgLyogc2V0dXAgY3VycmVudCBkYXRhICovCisgICAgbWFzdGVyX3RoICAgICA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICBwYXJlbnRfdGVhbSAgID0gbWFzdGVyX3RoIC0+IHRoLnRoX3RlYW07CisgICAgbWFzdGVyX3RpZCAgICA9IG1hc3Rlcl90aCAtPiB0aC50aF9pbmZvLmRzLmRzX3RpZDsKKyAgICBtYXN0ZXJfdGhpc19jb25zID0gbWFzdGVyX3RoIC0+IHRoLnRoX2xvY2FsLnRoaXNfY29uc3RydWN0OworICAgIG1hc3Rlcl9sYXN0X2NvbnMgPSBtYXN0ZXJfdGggLT4gdGgudGhfbG9jYWwubGFzdF9jb25zdHJ1Y3Q7CisgICAgcm9vdCAgICAgICAgICA9IG1hc3Rlcl90aCAtPiB0aC50aF9yb290OworICAgIG1hc3Rlcl9hY3RpdmUgPSByb290IC0+IHIucl9hY3RpdmU7CisgICAgbWFzdGVyX3NldF9udW10aHJlYWRzID0gbWFzdGVyX3RoIC0+IHRoLnRoX3NldF9ucHJvYzsKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgIC8vIE5lc3RlZCBsZXZlbCB3aWxsIGJlIGFuIGluZGV4IGluIHRoZSBuZXN0ZWQgbnRocmVhZHMgYXJyYXkKKyAgICBsZXZlbCAgICAgICAgID0gcGFyZW50X3RlYW0tPnQudF9sZXZlbDsKKyNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorI2lmIE9NUF80MF9FTkFCTEVECisgICAgdGVhbXNfbGV2ZWwgICAgPSBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX2xldmVsOyAvLyBuZWVkZWQgdG8gY2hlY2sgbmVzdGluZyBpbnNpZGUgdGhlIHRlYW1zCisjZW5kaWYKKworCisgICAgbWFzdGVyX3RoLT50aC50aF9pZGVudCA9IGxvYzsKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgaWYgKCBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1fbWljcm90YXNrICYmCisgICAgICAgICBhcCAmJiBtaWNyb3Rhc2sgIT0gKG1pY3JvdGFza190KV9fa21wX3RlYW1zX21hc3RlciAmJiBsZXZlbCA9PSB0ZWFtc19sZXZlbCApIHsKKyAgICAgICAgLy8gQUM6IFRoaXMgaXMgc3RhcnQgb2YgcGFyYWxsZWwgdGhhdCBpcyBuZXN0ZWQgaW5zaWRlIHRlYW1zIGNvbnN0cnVjdC4KKyAgICAgICAgLy8gICAgIFRoZSB0ZWFtIGlzIGFjdHVhbCAoaG90KSwgYWxsIHdvcmtlcnMgYXJlIHJlYWR5IGF0IHRoZSBmb3JrIGJhcnJpZXIuCisgICAgICAgIC8vICAgICBObyBsb2NrIG5lZWRlZCB0byBpbml0aWFsaXplIHRoZSB0ZWFtIGEgYml0LCB0aGVuIGZyZWUgd29ya2Vycy4KKyAgICAgICAgcGFyZW50X3RlYW0tPnQudF9pZGVudCA9IGxvYzsKKyAgICAgICAgcGFyZW50X3RlYW0tPnQudF9hcmdjICA9IGFyZ2M7CisgICAgICAgIGFyZ3YgPSAodm9pZCoqKXBhcmVudF90ZWFtLT50LnRfYXJndjsKKyAgICAgICAgZm9yKCBpPWFyZ2MtMTsgaSA+PSAwOyAtLWkgKQorLyogVE9ETzogcmV2ZXJ0IHdvcmthcm91bmQgZm9yIEludGVsKFIpIDY0IHRyYWNrZXIgIzk2ICovCisjaWYgKEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0pICYmIEtNUF9PU19MSU5VWAorICAgICAgICAgICAgKmFyZ3YrKyA9IHZhX2FyZyggKmFwLCB2b2lkICogKTsKKyNlbHNlCisgICAgICAgICAgICAqYXJndisrID0gdmFfYXJnKCBhcCwgdm9pZCAqICk7CisjZW5kaWYKKyAgICAgICAgLyogSW5jcmVtZW50IG91ciBuZXN0ZWQgZGVwdGggbGV2ZWxzLCBidXQgbm90IGluY3JlYXNlIHRoZSBzZXJpYWxpemF0aW9uICovCisgICAgICAgIGlmICggcGFyZW50X3RlYW0gPT0gbWFzdGVyX3RoLT50aC50aF9zZXJpYWxfdGVhbSApIHsKKyAgICAgICAgICAgIC8vIEFDOiB3ZSBhcmUgaW4gc2VyaWFsaXplZCBwYXJhbGxlbAorICAgICAgICAgICAgX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWwobG9jLCBndGlkKTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHBhcmVudF90ZWFtLT50LnRfc2VyaWFsaXplZCA+IDEgKTsKKyAgICAgICAgICAgIHBhcmVudF90ZWFtLT50LnRfc2VyaWFsaXplZC0tOyAvLyBBQzogbmVlZCB0aGlzIGluIG9yZGVyIGVucXVpcnkgZnVuY3Rpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHdvcmsgY29ycmVjdGx5LCB3aWxsIHJlc3RvcmUgYXQgam9pbiB0aW1lCisgICAgICAgICAgICBfX2ttcF9pbnZva2VfbWljcm90YXNrKCBtaWNyb3Rhc2ssIGd0aWQsIDAsIGFyZ2MsIHBhcmVudF90ZWFtLT50LnRfYXJndiApOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgcGFyZW50X3RlYW0tPnQudF9wa2ZuICA9IG1pY3JvdGFzazsKKyAgICAgICAgcGFyZW50X3RlYW0tPnQudF9pbnZva2UgPSBpbnZva2VyOworICAgICAgICBLTVBfVEVTVF9USEVOX0lOQzMyKCAoa21wX2ludDMyKikgJnJvb3QtPnIucl9pbl9wYXJhbGxlbCApOworICAgICAgICBwYXJlbnRfdGVhbS0+dC50X2FjdGl2ZV9sZXZlbCArKzsKKyAgICAgICAgcGFyZW50X3RlYW0tPnQudF9sZXZlbCArKzsKKworICAgICAgICAvKiBDaGFuZ2UgbnVtYmVyIG9mIHRocmVhZHMgaW4gdGhlIHRlYW0gaWYgcmVxdWVzdGVkICovCisgICAgICAgIGlmICggbWFzdGVyX3NldF9udW10aHJlYWRzICkgeyAgIC8vIFRoZSBwYXJhbGxlbCBoYXMgbnVtX3RocmVhZHMgY2xhdXNlCisgICAgICAgICAgICBpZiAoIG1hc3Rlcl9zZXRfbnVtdGhyZWFkcyA8IG1hc3Rlcl90aC0+dGgudGhfc2V0X250aF90ZWFtcyApIHsKKyAgICAgICAgICAgICAgICAvLyBBQzogb25seSBjYW4gcmVkdWNlIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBkeW5hbWljYWxseSwgY2Fubm90IGluY3JlYXNlCisgICAgICAgICAgICAgICAga21wX2luZm9fdCAqKm90aGVyX3RocmVhZHMgPSBwYXJlbnRfdGVhbS0+dC50X3RocmVhZHM7CisgICAgICAgICAgICAgICAgcGFyZW50X3RlYW0tPnQudF9ucHJvYyA9IG1hc3Rlcl9zZXRfbnVtdGhyZWFkczsKKyAgICAgICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IG1hc3Rlcl9zZXRfbnVtdGhyZWFkczsgKytpICkgeworICAgICAgICAgICAgICAgICAgICBvdGhlcl90aHJlYWRzW2ldLT50aC50aF90ZWFtX25wcm9jID0gbWFzdGVyX3NldF9udW10aHJlYWRzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBLZWVwIGV4dHJhIHRocmVhZHMgaG90IGluIHRoZSB0ZWFtIGZvciBwb3NzaWJsZSBuZXh0IHBhcmFsbGVscworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWFzdGVyX3RoLT50aC50aF9zZXRfbnByb2MgPSAwOworICAgICAgICB9CisKKworICAgICAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX2ZvcmtfY2FsbDogYmVmb3JlIGludGVybmFsIGZvcms6IHJvb3Q9JXAsIHRlYW09JXAsIG1hc3Rlcl90aD0lcCwgZ3RpZD0lZFxuIiwgcm9vdCwgcGFyZW50X3RlYW0sIG1hc3Rlcl90aCwgZ3RpZCApICk7CisgICAgICAgIF9fa21wX2ludGVybmFsX2ZvcmsoIGxvYywgZ3RpZCwgcGFyZW50X3RlYW0gKTsKKyAgICAgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9mb3JrX2NhbGw6IGFmdGVyIGludGVybmFsIGZvcms6IHJvb3Q9JXAsIHRlYW09JXAsIG1hc3Rlcl90aD0lcCwgZ3RpZD0lZFxuIiwgcm9vdCwgcGFyZW50X3RlYW0sIG1hc3Rlcl90aCwgZ3RpZCApICk7CisKKyAgICAgICAgLyogSW52b2tlIG1pY3JvdGFzayBmb3IgTUFTVEVSIHRocmVhZCAqLworICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfZm9ya19jYWxsOiBUIyVkKCVkOjApIGludm9rZSBtaWNyb3Rhc2sgPSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgZ3RpZCwgcGFyZW50X3RlYW0tPnQudF9pZCwgcGFyZW50X3RlYW0tPnQudF9wa2ZuICkgKTsKKworICAgICAgICBpZiAoISBwYXJlbnRfdGVhbS0+dC50X2ludm9rZSggZ3RpZCApKSB7CisgICAgICAgICAgICBLTVBfQVNTRVJUMiggMCwgImNhbm5vdCBpbnZva2UgbWljcm90YXNrIGZvciBNQVNURVIgdGhyZWFkIiApOworICAgICAgICB9CisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9mb3JrX2NhbGw6IFQjJWQoJWQ6MCkgZG9uZSBtaWNyb3Rhc2sgPSAlcFxuIiwKKyAgICAgICAgICAgIGd0aWQsIHBhcmVudF90ZWFtLT50LnRfaWQsIHBhcmVudF90ZWFtLT50LnRfcGtmbiApICk7CisgICAgICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9mb3JrX2NhbGw6IHBhcmFsbGVsIGV4aXQgVCMlZFxuIiwgZ3RpZCApKTsKKworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworI2lmIE9NUF8zMF9FTkFCTEVEICYmIEtNUF9ERUJVRworICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIG1hc3Rlcl90aC0+dGgudGhfdGFza190ZWFtID09IHBhcmVudF90ZWFtLT50LnRfdGFza190ZWFtICk7CisgICAgfQorI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisKKyAgICAvKiBkZXRlcm1pbmUgaG93IG1hbnkgbmV3IHRocmVhZHMgd2UgY2FuIHVzZSAqLworICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgIGlmICggcGFyZW50X3RlYW0tPnQudF9hY3RpdmVfbGV2ZWwgPj0gbWFzdGVyX3RoLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMubWF4X2FjdGl2ZV9sZXZlbHMgKSB7CisgICAgICAgIG50aHJlYWRzID0gMTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisKKyAgICB7CisgICAgICAgIG50aHJlYWRzID0gbWFzdGVyX3NldF9udW10aHJlYWRzID8KKyAgICAgICAgICAgIG1hc3Rlcl9zZXRfbnVtdGhyZWFkcyA6IGdldF9fbnByb2NfMiggcGFyZW50X3RlYW0sIG1hc3Rlcl90aWQgKTsKKyAgICAgICAgbnRocmVhZHMgPSBfX2ttcF9yZXNlcnZlX3RocmVhZHMoIHJvb3QsIHBhcmVudF90ZWFtLCBtYXN0ZXJfdGlkLCBudGhyZWFkcworI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgIC8vIEFDOiBJZiB3ZSBleGVjdXRlIHRlYW1zIGZyb20gcGFyYWxsZWwgcmVnaW9uIChvbiBob3N0KSwgdGhlbiB0ZWFtcworICAgICAgICAvLyAgICAgc2hvdWxkIGJlIGNyZWF0ZWQgYnV0IGVhY2ggY2FuIG9ubHkgaGF2ZSAxIHRocmVhZCBpZiBuZXN0aW5nIGlzIGRpc2FibGVkLgorICAgICAgICAvLyAgICAgSWYgdGVhbXMgY2FsbGVkIGZyb20gc2VyaWFsIHJlZ2lvbiwgdGhlbiB0ZWFtcyBhbmQgdGhlaXIgdGhyZWFkcworICAgICAgICAvLyAgICAgc2hvdWxkIGJlIGNyZWF0ZWQgcmVnYXJkbGVzcyBvZiB0aGUgbmVzdGluZyBzZXR0aW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwoICggYXAgPT0gTlVMTCAmJiB0ZWFtc19sZXZlbCA9PSAwICkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIGFwICYmIHRlYW1zX2xldmVsID4gMCAmJiB0ZWFtc19sZXZlbCA9PSBsZXZlbCApICkKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgICAgICApOworICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKCBudGhyZWFkcyA+IDAgKTsKKworICAgIC8qIElmIHdlIHRlbXBvcmFyaWx5IGNoYW5nZWQgdGhlIHNldCBudW1iZXIgb2YgdGhyZWFkcyB0aGVuIHJlc3RvcmUgaXQgbm93ICovCisgICAgbWFzdGVyX3RoIC0+IHRoLnRoX3NldF9ucHJvYyA9IDA7CisKKworICAgIC8qIGNyZWF0ZSBhIHNlcmlhbGl6ZWQgcGFyYWxsZWwgcmVnaW9uPyAqLworICAgIGlmICggbnRocmVhZHMgPT0gMSApIHsKKyAgICAgICAgLyogam9zaCB0b2RvOiBoeXBvdGhldGljYWwgcXVlc3Rpb246IHdoYXQgZG8gd2UgZG8gZm9yIE9TIFgqPyAqLworI2lmIEtNUF9PU19MSU5VWCAmJiAoIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNICkKKyAgICAgICAgdm9pZCAqICAgYXJnc1sgYXJnYyBdOworI2Vsc2UKKyAgICAgICAgdm9pZCAqICogYXJncyA9ICh2b2lkKiopIGFsbG9jYSggYXJnYyAqIHNpemVvZiggdm9pZCAqICkgKTsKKyNlbmRpZiAvKiBLTVBfT1NfTElOVVggJiYgKCBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSApICovCisKKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2Zvcmtqb2luX2xvY2sgKTsKKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2ZvcmtfY2FsbDogVCMlZCBzZXJpYWxpemluZyBwYXJhbGxlbCByZWdpb25cbiIsIGd0aWQgKSk7CisKKyAgICAgICAgX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWwobG9jLCBndGlkKTsKKworICAgICAgICBpZiAoIGV4ZWNfbWFzdGVyID09IDAgKSB7CisgICAgICAgICAgICAvLyB3ZSB3ZXJlIGNhbGxlZCBmcm9tIEdOVSBuYXRpdmUgY29kZQorICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2ZvcmtfY2FsbDogVCMlZCBzZXJpYWwgZXhpdFxuIiwgZ3RpZCApKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfSBlbHNlIGlmICggZXhlY19tYXN0ZXIgPT0gMSApIHsKKyAgICAgICAgICAgIC8qIFRPRE8gdGhpcyBzdWNrcywgdXNlIHRoZSBjb21waWxlciBpdHNlbGYgdG8gcGFzcyBhcmdzISA6KSAqLworICAgICAgICAgICAgbWFzdGVyX3RoIC0+IHRoLnRoX3NlcmlhbF90ZWFtIC0+IHQudF9pZGVudCA9ICBsb2M7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgIGlmICggIWFwICkgeworICAgICAgICAgICAgICAgIC8vIHJldmVydCBjaGFuZ2UgbWFkZSBpbiBfX2ttcGNfc2VyaWFsaXplZF9wYXJhbGxlbCgpCisgICAgICAgICAgICAgICAgbWFzdGVyX3RoIC0+IHRoLnRoX3NlcmlhbF90ZWFtIC0+IHQudF9sZXZlbC0tOworICAgICAgICAgICAgICAgIC8vIEdldCBhcmdzIGZyb20gcGFyZW50IHRlYW0gZm9yIHRlYW1zIGNvbnN0cnVjdAorICAgICAgICAgICAgICAgIF9fa21wX2ludm9rZV9taWNyb3Rhc2soIG1pY3JvdGFzaywgZ3RpZCwgMCwgYXJnYywgcGFyZW50X3RlYW0tPnQudF9hcmd2ICk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCBtaWNyb3Rhc2sgPT0gKG1pY3JvdGFza190KV9fa21wX3RlYW1zX21hc3RlciApIHsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBtYXN0ZXJfdGgtPnRoLnRoX3RlYW0gPT0gbWFzdGVyX3RoLT50aC50aF9zZXJpYWxfdGVhbSApOworICAgICAgICAgICAgICAgIHRlYW0gPSBtYXN0ZXJfdGgtPnRoLnRoX3RlYW07CisgICAgICAgICAgICAgICAgLy90ZWFtLT50LnRfcGtmbiA9IG1pY3JvdGFzazsKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaW52b2tlID0gaW52b2tlcjsKKyAgICAgICAgICAgICAgICBfX2ttcF9hbGxvY19hcmd2X2VudHJpZXMoIGFyZ2MsIHRlYW0sIFRSVUUgKTsKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfYXJnYyA9IGFyZ2M7CisgICAgICAgICAgICAgICAgYXJndiA9ICh2b2lkKiopIHRlYW0tPnQudF9hcmd2OworICAgICAgICAgICAgICAgIGlmICggYXAgKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciggaT1hcmdjLTE7IGkgPj0gMDsgLS1pICkKKyAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPOiByZXZlcnQgd29ya2Fyb3VuZCBmb3IgSW50ZWwoUikgNjQgdHJhY2tlciAjOTYgKi8KKyAgICAgICAgICAgICAgICAgICAgICAjaWYgKEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0pICYmIEtNUF9PU19MSU5VWAorICAgICAgICAgICAgICAgICAgICAgICAgKmFyZ3YrKyA9IHZhX2FyZyggKmFwLCB2b2lkICogKTsKKyAgICAgICAgICAgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgKmFyZ3YrKyA9IHZhX2FyZyggYXAsIHZvaWQgKiApOworICAgICAgICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZvciggaT0wOyBpIDwgYXJnYzsgKytpICkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCBhcmdzIGZyb20gcGFyZW50IHRlYW0gZm9yIHRlYW1zIGNvbnN0cnVjdAorICAgICAgICAgICAgICAgICAgICAgICAgYXJndltpXSA9IHBhcmVudF90ZWFtLT50LnRfYXJndltpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gQUM6IHJldmVydCBjaGFuZ2UgbWFkZSBpbiBfX2ttcGNfc2VyaWFsaXplZF9wYXJhbGxlbCgpCisgICAgICAgICAgICAgICAgLy8gICAgIGJlY2F1c2UgaW5pdGlhbCBjb2RlIGluIHRlYW1zIHNob3VsZCBoYXZlIGxldmVsPTAKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfbGV2ZWwtLTsKKyAgICAgICAgICAgICAgICAvLyBBQzogY2FsbCBzcGVjaWFsIGludm9rZXIgZm9yIG91dGVyICJwYXJhbGxlbCIgb2YgdGhlIHRlYW1zIGNvbnN0cnVjdAorICAgICAgICAgICAgICAgIGludm9rZXIoZ3RpZCk7CisgICAgICAgICAgICB9IGVsc2UgeworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgICAgICAgICAgICAgYXJndiA9IGFyZ3M7CisgICAgICAgICAgICAgICAgZm9yKCBpPWFyZ2MtMTsgaSA+PSAwOyAtLWkgKQorICAgICAgICAgICAgICAgIC8qIFRPRE86IHJldmVydCB3b3JrYXJvdW5kIGZvciBJbnRlbChSKSA2NCB0cmFja2VyICM5NiAqLworICAgICAgICAgICAgICAgICNpZiAoS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSkgJiYgS01QX09TX0xJTlVYCisgICAgICAgICAgICAgICAgICAgICphcmd2KysgPSB2YV9hcmcoICphcCwgdm9pZCAqICk7CisgICAgICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgKmFyZ3YrKyA9IHZhX2FyZyggYXAsIHZvaWQgKiApOworICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgIEtNUF9NQigpOworICAgICAgICAgICAgICAgIF9fa21wX2ludm9rZV9taWNyb3Rhc2soIG1pY3JvdGFzaywgZ3RpZCwgMCwgYXJnYywgYXJncyApOworI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICB9CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQyKCBleGVjX21hc3RlciA8PSAxLCAiX19rbXBfZm9ya19jYWxsOiB1bmtub3duIHBhcmFtZXRlciBleGVjX21hc3RlciIgKTsKKyAgICAgICAgfQorCisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9mb3JrX2NhbGw6IFQjJWQgc2VyaWFsIGV4aXRcbiIsIGd0aWQgKSk7CisKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgIC8vIEdFSDogb25seSBtb2RpZnkgdGhlIGV4ZWN1dGluZyBmbGFnIGluIHRoZSBjYXNlIHdoZW4gbm90IHNlcmlhbGl6ZWQKKyAgICAvLyAgICAgIHNlcmlhbGl6ZWQgY2FzZSBpcyBoYW5kbGVkIGluIGttcGNfc2VyaWFsaXplZF9wYXJhbGxlbAorICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfZm9ya19jYWxsOiBwYXJlbnRfdGVhbV9hY2xldmVsPSVkLCBtYXN0ZXJfdGg9JXAsIGN1cnRhc2s9JXAsIGN1cnRhc2tfbWF4X2FjbGV2ZWw9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgIHBhcmVudF90ZWFtLT50LnRfYWN0aXZlX2xldmVsLCBtYXN0ZXJfdGgsIG1hc3Rlcl90aC0+dGgudGhfY3VycmVudF90YXNrLAorICAgICAgICAgICAgICAgICAgICBtYXN0ZXJfdGgtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5tYXhfYWN0aXZlX2xldmVscyApICk7CisgICAgLy8gVE9ETzogR0VIIC0gY2Fubm90IGRvIHRoaXMgYXNzZXJ0aW9uIGJlY2F1c2Ugcm9vdCB0aHJlYWQgbm90IHNldCB1cCBhcyBleGVjdXRpbmcKKyAgICAvLyBLTVBfQVNTRVJUKCBtYXN0ZXJfdGgtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfZmxhZ3MuZXhlY3V0aW5nID09IDEgKTsKKyAgICBtYXN0ZXJfdGgtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfZmxhZ3MuZXhlY3V0aW5nID0gMDsKKyNlbmRpZgorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBpZiAoICFtYXN0ZXJfdGgtPnRoLnRoX3RlYW1fbWljcm90YXNrIHx8IGxldmVsID4gdGVhbXNfbGV2ZWwgKQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgeworICAgICAgICAvKiBJbmNyZW1lbnQgb3VyIG5lc3RlZCBkZXB0aCBsZXZlbCAqLworICAgICAgICBLTVBfVEVTVF9USEVOX0lOQzMyKCAoa21wX2ludDMyKikgJnJvb3QtPnIucl9pbl9wYXJhbGxlbCApOworICAgIH0KKworI2lmIE9NUF8zMF9FTkFCTEVECisgICAgLy8KKyAgICAvLyBTZWUgaWYgd2UgbmVlZCB0byBtYWtlIGEgY29weSBvZiB0aGUgSUNWcy4KKyAgICAvLworICAgIGludCBudGhyZWFkc19pY3YgPSBtYXN0ZXJfdGgtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5ucHJvYzsKKyAgICBpZiAoICggbGV2ZWwgKyAxIDwgX19rbXBfbmVzdGVkX250aC51c2VkICkgJiYKKyAgICAgICggX19rbXBfbmVzdGVkX250aC5udGhbbGV2ZWwgKyAxXSAhPSBudGhyZWFkc19pY3YgKSApIHsKKyAgICAgICAgbnRocmVhZHNfaWN2ID0gX19rbXBfbmVzdGVkX250aC5udGhbbGV2ZWwgKyAxXTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIG50aHJlYWRzX2ljdiA9IDA7ICAvLyBkb24ndCB1cGRhdGUKKyAgICB9CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIC8vCisgICAgLy8gRmlndXJlIG91dCB0aGUgcHJvY19iaW5kX3BvbGljeSBmb3IgdGhlIG5ldyB0ZWFtLgorICAgIC8vCisgICAga21wX3Byb2NfYmluZF90IHByb2NfYmluZCA9IG1hc3Rlcl90aC0+dGgudGhfc2V0X3Byb2NfYmluZDsKKyAgICBrbXBfcHJvY19iaW5kX3QgcHJvY19iaW5kX2ljdjsgLy8gcHJvY19iaW5kX2RlZmF1bHQgbWVhbnMgZG9uJ3QgdXBkYXRlCisKKyAgICBpZiAoIG1hc3Rlcl90aC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLnByb2NfYmluZCA9PSBwcm9jX2JpbmRfZmFsc2UgKSB7CisgICAgICAgIHByb2NfYmluZCA9IHByb2NfYmluZF9mYWxzZTsKKyAgICAgICAgcHJvY19iaW5kX2ljdiA9IHByb2NfYmluZF9kZWZhdWx0OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcHJvY19iaW5kX2ljdiA9IG1hc3Rlcl90aC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLnByb2NfYmluZDsKKyAgICAgICAgaWYgKCBwcm9jX2JpbmQgPT0gcHJvY19iaW5kX2RlZmF1bHQgKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gTm8gcHJvY19iaW5kIGNsYXVzZSB3YXMgc3BlY2lmaWVkLCBzbyB1c2UgdGhlIGN1cnJlbnQgdmFsdWUKKyAgICAgICAgICAgIC8vIG9mIHByb2MtYmluZC12YXIgZm9yIHRoaXMgcGFyYWxsZWwgcmVnaW9uLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIHByb2NfYmluZCA9IHByb2NfYmluZF9pY3Y7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gVGhlIHByb2NfYmluZCBwb2xpY3kgd2FzIHNwZWNpZmllZCBleHBsaWNpdGx5IG9uIHRoZSBwYXJhbGxlbAorICAgICAgICAgICAgLy8gY2xhdXNlLiAgVGhpcyBvdmVycmlkZXMgdGhlIHByb2MtYmluZC12YXIgZm9yIHRoaXMgcGFyYWxsZWwKKyAgICAgICAgICAgIC8vIHJlZ2lvbiwgYnV0IGRvZXMgbm90IGNoYW5nZSBwcm9jLWJpbmQtdmFyLgorICAgICAgICAgICAgLy8KKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIEZpZ3VyZSB0aGUgdmFsdWUgb2YgcHJvYy1iaW5kLXZhciBmb3IgdGhlIGNoaWxkIHRocmVhZHMuCisgICAgICAgIC8vCisgICAgICAgIGlmICggKCBsZXZlbCArIDEgPCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnVzZWQgKQorICAgICAgICAgICYmICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzW2xldmVsICsgMV0gIT0gcHJvY19iaW5kX2ljdiApICkgeworICAgICAgICAgICAgcHJvY19iaW5kX2ljdiA9IF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1tsZXZlbCArIDFdOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcHJvY19iaW5kX2ljdiA9IHByb2NfYmluZF9kZWZhdWx0OworICAgICAgICB9CisgICAgfQorCisgICAgLy8KKyAgICAvLyBSZXNldCBmb3IgbmV4dCBwYXJhbGxlbCByZWdpb24KKyAgICAvLworICAgIG1hc3Rlcl90aC0+dGgudGhfc2V0X3Byb2NfYmluZCA9IHByb2NfYmluZF9kZWZhdWx0OworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKyAgICBpZiAoICggbnRocmVhZHNfaWN2ID4gMCApCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgIHx8ICggcHJvY19iaW5kX2ljdiAhPSBwcm9jX2JpbmRfZGVmYXVsdCApCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICAgICkKKyAgICB7CisgICAgICAgIGttcF9pbnRlcm5hbF9jb250cm9sX3QgbmV3X2ljdnM7CisgICAgICAgIGNvcHlfaWN2cyggJiBuZXdfaWN2cywgJiBtYXN0ZXJfdGgtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cyApOworICAgICAgICBuZXdfaWN2cy5uZXh0ID0gTlVMTDsKKworICAgICAgICBpZiAoIG50aHJlYWRzX2ljdiA+IDAgKSB7CisgICAgICAgICAgICBuZXdfaWN2cy5ucHJvYyA9IG50aHJlYWRzX2ljdjsKKyAgICAgICAgfQorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgaWYgKCBwcm9jX2JpbmRfaWN2ICE9IHByb2NfYmluZF9kZWZhdWx0ICkgeworICAgICAgICAgICAgbmV3X2ljdnMucHJvY19iaW5kID0gcHJvY19iaW5kX2ljdjsKKyAgICAgICAgfQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKyAgICAgICAgLyogYWxsb2NhdGUgYSBuZXcgcGFyYWxsZWwgdGVhbSAqLworICAgICAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX2ZvcmtfY2FsbDogYmVmb3JlIF9fa21wX2FsbG9jYXRlX3RlYW1cbiIgKSApOworICAgICAgICB0ZWFtID0gX19rbXBfYWxsb2NhdGVfdGVhbShyb290LCBudGhyZWFkcywgbnRocmVhZHMsCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICBwcm9jX2JpbmQsCisjZW5kaWYKKyAgICAgICAgICAmbmV3X2ljdnMsIGFyZ2MgKTsKKyAgICB9IGVsc2UKKyNlbmRpZiAvKiBPTVBfMzBfRU5BQkxFRCAqLworICAgIHsKKyAgICAgICAgLyogYWxsb2NhdGUgYSBuZXcgcGFyYWxsZWwgdGVhbSAqLworICAgICAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX2ZvcmtfY2FsbDogYmVmb3JlIF9fa21wX2FsbG9jYXRlX3RlYW1cbiIgKSApOworICAgICAgICB0ZWFtID0gX19rbXBfYWxsb2NhdGVfdGVhbShyb290LCBudGhyZWFkcywgbnRocmVhZHMsCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgICAgICBwcm9jX2JpbmQsCisjZW5kaWYKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgICAgICAgICAgICAgICZtYXN0ZXJfdGgtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cywKKyNlbHNlCisgICAgICAgICAgICAgICAgcGFyZW50X3RlYW0tPnQudF9zZXRfbnByb2NbbWFzdGVyX3RpZF0sCisgICAgICAgICAgICAgICAgcGFyZW50X3RlYW0tPnQudF9zZXRfZHluYW1pY1ttYXN0ZXJfdGlkXSwKKyAgICAgICAgICAgICAgICBwYXJlbnRfdGVhbS0+dC50X3NldF9uZXN0ZWRbbWFzdGVyX3RpZF0sCisgICAgICAgICAgICAgICAgcGFyZW50X3RlYW0tPnQudF9zZXRfYmxvY2t0aW1lW21hc3Rlcl90aWRdLAorICAgICAgICAgICAgICAgIHBhcmVudF90ZWFtLT50LnRfc2V0X2J0X2ludGVydmFsc1ttYXN0ZXJfdGlkXSwKKyAgICAgICAgICAgICAgICBwYXJlbnRfdGVhbS0+dC50X3NldF9idF9zZXRbbWFzdGVyX3RpZF0sCisjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKyAgICAgICAgICAgICAgICBhcmdjICk7CisgICAgfQorCisgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9mb3JrX2NhbGw6IGFmdGVyIF9fa21wX2FsbG9jYXRlX3RlYW0gLSB0ZWFtID0gJXBcbiIsCisgICAgICAgICAgICB0ZWFtICkgKTsKKworICAgIC8qIHNldHVwIHRoZSBuZXcgdGVhbSAqLworICAgIHRlYW0tPnQudF9tYXN0ZXJfdGlkID0gbWFzdGVyX3RpZDsKKyAgICB0ZWFtLT50LnRfbWFzdGVyX3RoaXNfY29ucyA9IG1hc3Rlcl90aGlzX2NvbnM7CisgICAgdGVhbS0+dC50X21hc3Rlcl9sYXN0X2NvbnMgPSBtYXN0ZXJfbGFzdF9jb25zOworCisgICAgdGVhbS0+dC50X3BhcmVudCAgICAgPSBwYXJlbnRfdGVhbTsKKyAgICBUQ1dfU1lOQ19QVFIodGVhbS0+dC50X3BrZm4sIG1pY3JvdGFzayk7CisgICAgdGVhbS0+dC50X2ludm9rZSAgICAgPSBpbnZva2VyOyAgLyogVE9ETyBtb3ZlIHRoaXMgdG8gcm9vdCwgbWF5YmUgKi8KKyAgICB0ZWFtLT50LnRfaWRlbnQgICAgICA9IGxvYzsKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgIC8vIFRPRE86IHBhcmVudF90ZWFtLT50LnRfbGV2ZWwgPT0gSU5UX01BWCA/Pz8KKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGlmICggIW1hc3Rlcl90aC0+dGgudGhfdGVhbV9taWNyb3Rhc2sgfHwgbGV2ZWwgPiB0ZWFtc19sZXZlbCApIHsKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgICAgICB0ZWFtLT50LnRfbGV2ZWwgICAgICAgID0gcGFyZW50X3RlYW0tPnQudF9sZXZlbCArIDE7CisgICAgICAgIHRlYW0tPnQudF9hY3RpdmVfbGV2ZWwgPSBwYXJlbnRfdGVhbS0+dC50X2FjdGl2ZV9sZXZlbCArIDE7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBBQzogRG8gbm90IGluY3JlYXNlIHBhcmFsbGVsIGxldmVsIGF0IHN0YXJ0IG9mIHRoZSB0ZWFtcyBjb25zdHJ1Y3QKKyAgICAgICAgdGVhbS0+dC50X2xldmVsICAgICAgICA9IHBhcmVudF90ZWFtLT50LnRfbGV2ZWw7CisgICAgICAgIHRlYW0tPnQudF9hY3RpdmVfbGV2ZWwgPSBwYXJlbnRfdGVhbS0+dC50X2FjdGl2ZV9sZXZlbDsKKyAgICB9CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICB0ZWFtLT50LnRfc2NoZWQgICAgICA9IGdldF9fc2NoZWRfMiggcGFyZW50X3RlYW0sIG1hc3Rlcl90aWQgKTsgLy8gc2V0IG1hc3RlcidzIHNjaGVkdWxlIGFzIG5ldyBydW4tdGltZSBzY2hlZHVsZQorCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorICAgIGlmICggX19rbXBfaW5oZXJpdF9mcF9jb250cm9sICkgeworICAgICAgICBfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZCggJnRlYW0tPnQudF94ODdfZnB1X2NvbnRyb2xfd29yZCApOworICAgICAgICBfX2ttcF9zdG9yZV9teGNzciggJnRlYW0tPnQudF9teGNzciApOworICAgICAgICB0ZWFtLT50LnRfbXhjc3IgJj0gS01QX1g4Nl9NWENTUl9NQVNLOworICAgICAgICB0ZWFtLT50LnRfZnBfY29udHJvbF9zYXZlZCA9IFRSVUU7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICB0ZWFtLT50LnRfZnBfY29udHJvbF9zYXZlZCA9IEZBTFNFOworICAgIH0KKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKyAgICBpZiAoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICkgeworICAgICAgICAvLworICAgICAgICAvLyBTZXQgdGhlIG1hc3RlciB0aHJlYWQncyB0YXNrIHRlYW0gdG8gdGhlIHRlYW0ncyB0YXNrIHRlYW0uCisgICAgICAgIC8vIFVubGVzcyB0aGlzIGlzIHRoZSBob3QgdGVhbSwgaXQgc2hvdWxkIGJlIE5VTEwuCisgICAgICAgIC8vCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIG1hc3Rlcl90aC0+dGgudGhfdGFza190ZWFtID09IHBhcmVudF90ZWFtLT50LnRfdGFza190ZWFtICk7CisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfZm9ya19jYWxsOiBNYXN0ZXIgVCMlZCBwdXNoaW5nIHRhc2tfdGVhbSAlcCAvIHRlYW0gJXAsIG5ldyB0YXNrX3RlYW0gJXAgLyB0ZWFtICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggbWFzdGVyX3RoICksIG1hc3Rlcl90aC0+dGgudGhfdGFza190ZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50X3RlYW0sIHRlYW0tPnQudF90YXNrX3RlYW0sIHRlYW0gKSApOworICAgICAgICBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfdGVhbSA9IHRlYW0tPnQudF90YXNrX3RlYW07CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoICggbWFzdGVyX3RoLT50aC50aF90YXNrX3RlYW0gPT0gTlVMTCApIHx8ICggdGVhbSA9PSByb290LT5yLnJfaG90X3RlYW0gKSApIDsKKyAgICB9CisjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9mb3JrX2NhbGw6IFQjJWQoJWQ6JWQpLT4oJWQ6MCkgY3JlYXRlZCBhIHRlYW0gb2YgJWQgdGhyZWFkc1xuIiwKKyAgICAgICAgICAgICAgICBndGlkLCBwYXJlbnRfdGVhbS0+dC50X2lkLCB0ZWFtLT50LnRfbWFzdGVyX3RpZCwgdGVhbS0+dC50X2lkLCB0ZWFtLT50LnRfbnByb2MgKSk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSAhPSByb290LT5yLnJfaG90X3RlYW0gfHwKKyAgICAgICAgICAgICAgICAgICAgICAoIHRlYW0tPnQudF9tYXN0ZXJfdGlkID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICggdGVhbS0+dC50X3BhcmVudCA9PSByb290LT5yLnJfcm9vdF90ZWFtIHx8IHRlYW0tPnQudF9wYXJlbnQtPnQudF9zZXJpYWxpemVkICkgKSk7CisgICAgS01QX01CKCk7CisKKyAgICAvKiBub3csIHNldHVwIHRoZSBhcmd1bWVudHMgKi8KKyAgICBhcmd2ID0gKHZvaWQqKikgdGVhbSAtPiB0LnRfYXJndjsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGlmICggYXAgKSB7CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICAgICAgZm9yKCBpPWFyZ2MtMTsgaSA+PSAwOyAtLWkgKQorLyogVE9ETzogcmV2ZXJ0IHdvcmthcm91bmQgZm9yIEludGVsKFIpIDY0IHRyYWNrZXIgIzk2ICovCisjaWYgKEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0pICYmIEtNUF9PU19MSU5VWAorICAgICAgICAgICAgKmFyZ3YrKyA9IHZhX2FyZyggKmFwLCB2b2lkICogKTsKKyNlbHNlCisgICAgICAgICAgICAqYXJndisrID0gdmFfYXJnKCBhcCwgdm9pZCAqICk7CisjZW5kaWYKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIH0gZWxzZSB7CisgICAgICAgIGZvciggaT0wOyBpIDwgYXJnYzsgKytpICkKKyAgICAgICAgICAgIC8vIEdldCBhcmdzIGZyb20gcGFyZW50IHRlYW0gZm9yIHRlYW1zIGNvbnN0cnVjdAorICAgICAgICAgICAgYXJndltpXSA9IHRlYW0tPnQudF9wYXJlbnQtPnQudF9hcmd2W2ldOworICAgIH0KKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisgICAgLyogbm93IGFjdHVhbGx5IGZvcmsgdGhlIHRocmVhZHMgKi8KKworICAgIHRlYW0tPnQudF9tYXN0ZXJfYWN0aXZlID0gbWFzdGVyX2FjdGl2ZTsKKyAgICBpZiAoIXJvb3QgLT4gci5yX2FjdGl2ZSkgIC8qIE9ubHkgZG8gdGhlIGFzc2lnbm1lbnQgaWYgaXQgbWFrZXMgYSBkaWZmZXJlbmNlIHRvIHByZXZlbnQgY2FjaGUgcGluZy1wb25nICovCisgICAgICAgIHJvb3QgLT4gci5yX2FjdGl2ZSA9IFRSVUU7CisKKyAgICBfX2ttcF9mb3JrX3RlYW1fdGhyZWFkcyggcm9vdCwgdGVhbSwgbWFzdGVyX3RoLCBndGlkICk7CisgICAgX19rbXBfc2V0dXBfaWN2X2NvcHkodGVhbSwgbnRocmVhZHMKKyNpZiBPTVBfMzBfRU5BQkxFRAorCQkJICwgJm1hc3Rlcl90aC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLCBsb2MKKyNlbHNlCisJCQkgLCBwYXJlbnRfdGVhbS0+dC50X3NldF9ucHJvY1ttYXN0ZXJfdGlkXSwKKwkJCSBwYXJlbnRfdGVhbS0+dC50X3NldF9keW5hbWljW21hc3Rlcl90aWRdLAorCQkJIHBhcmVudF90ZWFtLT50LnRfc2V0X25lc3RlZFttYXN0ZXJfdGlkXSwKKwkJCSBwYXJlbnRfdGVhbS0+dC50X3NldF9ibG9ja3RpbWVbbWFzdGVyX3RpZF0sCisJCQkgcGFyZW50X3RlYW0tPnQudF9zZXRfYnRfaW50ZXJ2YWxzW21hc3Rlcl90aWRdLAorCQkJIHBhcmVudF90ZWFtLT50LnRfc2V0X2J0X3NldFttYXN0ZXJfdGlkXQorI2VuZGlmIC8qIE9NUF8zMF9FTkFCTEVEICovCisJCQkgKTsKKworCisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2Zvcmtqb2luX2xvY2sgKTsKKworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIC8vIE1hcmsgc3RhcnQgb2YgInBhcmFsbGVsIiByZWdpb24gZm9yIFZUdW5lLiBPbmx5IHVzZSBvbmUgb2YgZnJhbWUgbm90aWZpY2F0aW9uIHNjaGVtZSBhdCB0aGUgbW9tZW50LgorICAgIGlmICggKCBfX2l0dF9mcmFtZV9iZWdpbl92M19wdHIgJiYgX19rbXBfZm9ya2pvaW5fZnJhbWVzICYmICEgX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgKSB8fCBLTVBfSVRUX0RFQlVHICkKKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICBpZiAoICFtYXN0ZXJfdGgtPnRoLnRoX3RlYW1fbWljcm90YXNrIHx8IG1pY3JvdGFzayA9PSAobWljcm90YXNrX3QpX19rbXBfdGVhbXNfbWFzdGVyICkKKyAgICAgICAgLy8gRWl0aGVyIG5vdCBpbiB0ZWFtcyBvciB0aGUgb3V0ZXIgZm9yayBvZiB0aGUgdGVhbXMgY29uc3RydWN0CisjIGVuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgICAgIF9fa21wX2l0dF9yZWdpb25fZm9ya2luZyggZ3RpZCApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworI2lmIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkgJiYgT01QXzMwX0VOQUJMRUQKKyAgICAvLyBJbnRlcm5hbCBmb3JrIC0gcmVwb3J0IGZyYW1lIGJlZ2luCisgICAgaWYoICggX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMSB8fCBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9PSAzICkgJiYgX19pdHRfZnJhbWVfc3VibWl0X3YzX3B0ciAmJiBfX2l0dF9nZXRfdGltZXN0YW1wX3B0ciApCisgICAgeworICAgICAgICBpZiggISAoIHRlYW0tPnQudF9hY3RpdmVfbGV2ZWwgPiAxICkgKSB7CisgICAgICAgICAgICBtYXN0ZXJfdGgtPnRoLnRoX2ZyYW1lX3RpbWUgICA9IF9faXR0X2dldF90aW1lc3RhbXAoKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICAvKiBub3cgZ28gb24gYW5kIGRvIHRoZSB3b3JrICovCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSA9PSBfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF90ZWFtICk7CisgICAgS01QX01CKCk7CisKKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX2ludGVybmFsX2ZvcmsgOiByb290PSVwLCB0ZWFtPSVwLCBtYXN0ZXJfdGg9JXAsIGd0aWQ9JWRcbiIsIHJvb3QsIHRlYW0sIG1hc3Rlcl90aCwgZ3RpZCApICk7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgaWYgKCBfX2l0dF9zdGFja19jYWxsZXJfY3JlYXRlX3B0ciApIHsKKyAgICAgICAgdGVhbS0+dC50X3N0YWNrX2lkID0gX19rbXBfaXR0X3N0YWNrX2NhbGxlcl9jcmVhdGUoKTsgLy8gY3JlYXRlIG5ldyBzdGFjayBzdGl0Y2hpbmcgaWQgYmVmb3JlIGVudGVyaW5nIGZvcmsgYmFycmllcgorICAgIH0KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGlmICggYXAgKSAgIC8vIEFDOiBza2lwIF9fa21wX2ludGVybmFsX2ZvcmsgYXQgdGVhbXMgY29uc3RydWN0LCBsZXQgb25seSBtYXN0ZXIgdGhyZWFkcyBleGVjdXRlCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICB7CisgICAgICAgIF9fa21wX2ludGVybmFsX2ZvcmsoIGxvYywgZ3RpZCwgdGVhbSApOworICAgICAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX2ludGVybmFsX2ZvcmsgOiBhZnRlciA6IHJvb3Q9JXAsIHRlYW09JXAsIG1hc3Rlcl90aD0lcCwgZ3RpZD0lZFxuIiwgcm9vdCwgdGVhbSwgbWFzdGVyX3RoLCBndGlkICkgKTsKKyAgICB9CisKKyAgICBpZiAoISBleGVjX21hc3RlcikgeworICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfZm9ya19jYWxsOiBwYXJhbGxlbCBleGl0IFQjJWRcbiIsIGd0aWQgKSk7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICAgIC8qIEludm9rZSBtaWNyb3Rhc2sgZm9yIE1BU1RFUiB0aHJlYWQgKi8KKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfZm9ya19jYWxsOiBUIyVkKCVkOjApIGludm9rZSBtaWNyb3Rhc2sgPSAlcFxuIiwKKyAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRlYW0tPnQudF9wa2ZuICkgKTsKKworICAgIGlmICghIHRlYW0tPnQudF9pbnZva2UoIGd0aWQgKSkgeworICAgICAgICBLTVBfQVNTRVJUMiggMCwgImNhbm5vdCBpbnZva2UgbWljcm90YXNrIGZvciBNQVNURVIgdGhyZWFkIiApOworICAgIH0KKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfZm9ya19jYWxsOiBUIyVkKCVkOjApIGRvbmUgbWljcm90YXNrID0gJXBcbiIsCisgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGVhbS0+dC50X3BrZm4gKSApOworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2ZvcmtfY2FsbDogcGFyYWxsZWwgZXhpdCBUIyVkXG4iLCBndGlkICkpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKwordm9pZAorX19rbXBfam9pbl9jYWxsKGlkZW50X3QgKmxvYywgaW50IGd0aWQKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgICAgLCBpbnQgZXhpdF90ZWFtcworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCispCit7CisgICAga21wX3RlYW1fdCAgICAgKnRlYW07CisgICAga21wX3RlYW1fdCAgICAgKnBhcmVudF90ZWFtOworICAgIGttcF9pbmZvX3QgICAgICptYXN0ZXJfdGg7CisgICAga21wX3Jvb3RfdCAgICAgKnJvb3Q7CisgICAgaW50ICAgICAgICAgICAgIG1hc3Rlcl9hY3RpdmU7CisgICAgaW50ICAgICAgICAgICAgIGk7CisKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfam9pbl9jYWxsOiBlbnRlciBUIyVkXG4iLCBndGlkICkpOworCisgICAgLyogc2V0dXAgY3VycmVudCBkYXRhICovCisgICAgbWFzdGVyX3RoICAgICA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICByb290ICAgICAgICAgID0gbWFzdGVyX3RoIC0+IHRoLnRoX3Jvb3Q7CisgICAgdGVhbSAgICAgICAgICA9IG1hc3Rlcl90aCAtPiB0aC50aF90ZWFtOworICAgIHBhcmVudF90ZWFtICAgPSB0ZWFtLT50LnRfcGFyZW50OworCisgICAgbWFzdGVyX3RoLT50aC50aF9pZGVudCA9IGxvYzsKKworI2lmIE9NUF8zMF9FTkFCTEVEICYmIEtNUF9ERUJVRworICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKSB7CisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfam9pbl9jYWxsOiBUIyVkLCBvbGQgdGVhbSA9ICVwIG9sZCB0YXNrX3RlYW0gPSAlcCwgdGhfdGFza190ZWFtID0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggbWFzdGVyX3RoICksIHRlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbSAtPiB0LnRfdGFza190ZWFtLCBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfdGVhbSkgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggbWFzdGVyX3RoLT50aC50aF90YXNrX3RlYW0gPT0gdGVhbS0+dC50X3Rhc2tfdGVhbSApOworICAgIH0KKyNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorCisgICAgaWYoIHRlYW0tPnQudF9zZXJpYWxpemVkICkgeworI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgIGlmICggbWFzdGVyX3RoLT50aC50aF90ZWFtX21pY3JvdGFzayApIHsKKyAgICAgICAgICAgIC8vIFdlIGFyZSBpbiB0ZWFtcyBjb25zdHJ1Y3QKKyAgICAgICAgICAgIGludCBsZXZlbCA9IHRlYW0tPnQudF9sZXZlbDsKKyAgICAgICAgICAgIGludCB0bGV2ZWwgPSBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX2xldmVsOworICAgICAgICAgICAgaWYgKCBsZXZlbCA9PSB0bGV2ZWwgKSB7CisgICAgICAgICAgICAgICAgLy8gQUM6IHdlIGhhdmVuJ3QgaW5jcmVtZW50ZWQgaXQgZWFybGllciBhdCBzdGFydCBvZiB0ZWFtcyBjb25zdHJ1Y3QsCisgICAgICAgICAgICAgICAgLy8gICAgIHNvIGRvIGl0IGhlcmUgLSBhdCB0aGUgZW5kIG9mIHRlYW1zIGNvbnN0cnVjdAorICAgICAgICAgICAgICAgIHRlYW0tPnQudF9sZXZlbCsrOworICAgICAgICAgICAgfSBlbHNlIGlmICggbGV2ZWwgPT0gdGxldmVsICsgMSApIHsKKyAgICAgICAgICAgICAgICAvLyBBQzogd2UgYXJlIGV4aXRpbmcgcGFyYWxsZWwgaW5zaWRlIHRlYW1zLCBuZWVkIHRvIGluY3JlbWVudCBzZXJpYWxpemF0aW9uCisgICAgICAgICAgICAgICAgLy8gICAgIGluIG9yZGVyIHRvIHJlc3RvcmUgaXQgaW4gdGhlIG5leHQgY2FsbCB0byBfX2ttcGNfZW5kX3NlcmlhbGl6ZWRfcGFyYWxsZWwKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfc2VyaWFsaXplZCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICAgICAgX19rbXBjX2VuZF9zZXJpYWxpemVkX3BhcmFsbGVsKCBsb2MsIGd0aWQgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1hc3Rlcl9hY3RpdmUgPSB0ZWFtLT50LnRfbWFzdGVyX2FjdGl2ZTsKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgaWYgKCFleGl0X3RlYW1zKQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgeworICAgICAgICAvLyBBQzogTm8gYmFycmllciBmb3IgaW50ZXJuYWwgdGVhbXMgYXQgZXhpdCBmcm9tIHRlYW1zIGNvbnN0cnVjdC4KKyAgICAgICAgLy8gICAgIEJ1dCB0aGVyZSBpcyBiYXJyaWVyIGZvciBleHRlcm5hbCB0ZWFtIChsZWFndWUpLgorICAgICAgICBfX2ttcF9pbnRlcm5hbF9qb2luKCBsb2MsIGd0aWQsIHRlYW0gKTsKKyAgICB9CisgICAgS01QX01CKCk7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgaWYgKCBfX2l0dF9zdGFja19jYWxsZXJfY3JlYXRlX3B0ciApIHsKKyAgICAgICAgX19rbXBfaXR0X3N0YWNrX2NhbGxlcl9kZXN0cm95KCAoX19pdHRfY2FsbGVyKXRlYW0tPnQudF9zdGFja19pZCApOyAvLyBkZXN0cm95IHRoZSBzdGFjayBzdGl0Y2hpbmcgaWQgYWZ0ZXIgam9pbiBiYXJyaWVyCisgICAgfQorCisgICAgLy8gTWFyayBlbmQgb2YgInBhcmFsbGVsIiByZWdpb24gZm9yIFZUdW5lLiBPbmx5IHVzZSBvbmUgb2YgZnJhbWUgbm90aWZpY2F0aW9uIHNjaGVtZSBhdCB0aGUgbW9tZW50LgorICAgIGlmICggKCBfX2l0dF9mcmFtZV9lbmRfdjNfcHRyICYmIF9fa21wX2Zvcmtqb2luX2ZyYW1lcyAmJiAhIF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlICkgfHwgS01QX0lUVF9ERUJVRyApCisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgaWYgKCAhbWFzdGVyX3RoLT50aC50aF90ZWFtX21pY3JvdGFzayAvKiBub3QgaW4gdGVhbXMgKi8gfHwKKyAgICAgICAgICggIWV4aXRfdGVhbXMgJiYgdGVhbS0+dC50X2xldmVsID09IG1hc3Rlcl90aC0+dGgudGhfdGVhbXNfbGV2ZWwgKSApCisgICAgICAgIC8vIEVpdGhlciBub3QgaW4gdGVhbXMgb3IgZXhpdGluZyB0ZWFtcyByZWdpb24KKyAgICAgICAgLy8gKHRlYW1zIGlzIGEgZnJhbWUgYW5kIG5vIG90aGVyIGZyYW1lcyBpbnNpZGUgdGhlIHRlYW1zKQorIyBlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgIHsKKyAgICAgICAgbWFzdGVyX3RoLT50aC50aF9pZGVudCA9IGxvYzsKKyAgICAgICAgX19rbXBfaXR0X3JlZ2lvbl9qb2luZWQoIGd0aWQgKTsKKyAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBpZiAoIG1hc3Rlcl90aC0+dGgudGhfdGVhbV9taWNyb3Rhc2sgJiYKKyAgICAgICAgICFleGl0X3RlYW1zICYmCisgICAgICAgICB0ZWFtLT50LnRfcGtmbiAhPSAobWljcm90YXNrX3QpX19rbXBfdGVhbXNfbWFzdGVyICYmCisgICAgICAgICB0ZWFtLT50LnRfbGV2ZWwgPT0gbWFzdGVyX3RoLT50aC50aF90ZWFtc19sZXZlbCArIDEgKSB7CisgICAgICAgIC8vIEFDOiBXZSBuZWVkIHRvIGxlYXZlIHRoZSB0ZWFtIHN0cnVjdHVyZSBpbnRhY3QgYXQgdGhlIGVuZAorICAgICAgICAvLyAgICAgb2YgcGFyYWxsZWwgaW5zaWRlIHRoZSB0ZWFtcyBjb25zdHJ1Y3QsIHNvIHRoYXQgYXQgdGhlIG5leHQKKyAgICAgICAgLy8gICAgIHBhcmFsbGVsIHNhbWUgKGhvdCkgdGVhbSB3b3Jrcywgb25seSBhZGp1c3QgbmVzdGluZyBsZXZlbHMKKworICAgICAgICAvKiBEZWNyZW1lbnQgb3VyIG5lc3RlZCBkZXB0aCBsZXZlbCAqLworICAgICAgICB0ZWFtLT50LnRfbGV2ZWwgLS07CisgICAgICAgIHRlYW0tPnQudF9hY3RpdmVfbGV2ZWwgLS07CisgICAgICAgIEtNUF9URVNUX1RIRU5fREVDMzIoIChrbXBfaW50MzIqKSAmcm9vdC0+ci5yX2luX3BhcmFsbGVsICk7CisKKyAgICAgICAgLyogUmVzdG9yZSBudW1iZXIgb2YgdGhyZWFkcyBpbiB0aGUgdGVhbSBpZiBuZWVkZWQgKi8KKyAgICAgICAgaWYgKCBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1fbnByb2MgPCBtYXN0ZXJfdGgtPnRoLnRoX3NldF9udGhfdGVhbXMgKSB7CisgICAgICAgICAgICBpbnQgb2xkX251bSA9IG1hc3Rlcl90aC0+dGgudGhfdGVhbV9ucHJvYzsKKyAgICAgICAgICAgIGludCBuZXdfbnVtID0gbWFzdGVyX3RoLT50aC50aF9zZXRfbnRoX3RlYW1zOworICAgICAgICAgICAga21wX2luZm9fdCAqKm90aGVyX3RocmVhZHMgPSB0ZWFtLT50LnRfdGhyZWFkczsKKyAgICAgICAgICAgIHRlYW0tPnQudF9ucHJvYyA9IG5ld19udW07CisgICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IG9sZF9udW07ICsraSApIHsKKyAgICAgICAgICAgICAgICBvdGhlcl90aHJlYWRzW2ldLT50aC50aF90ZWFtX25wcm9jID0gbmV3X251bTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEFkanVzdCBzdGF0ZXMgb2Ygbm9uLXVzZWQgdGhyZWFkcyBvZiB0aGUgdGVhbQorICAgICAgICAgICAgZm9yICggaSA9IG9sZF9udW07IGkgPCBuZXdfbnVtOyArK2kgKSB7CisgICAgICAgICAgICAgICAgLy8gUmUtaW5pdGlhbGl6ZSB0aHJlYWQncyBiYXJyaWVyIGRhdGEuCisgICAgICAgICAgICAgICAgaW50IGI7CisgICAgICAgICAgICAgICAga21wX2JhbGlnbl90ICogYmFsaWduID0gb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfYmFyOworICAgICAgICAgICAgICAgIGZvciAoIGIgPSAwOyBiIDwgYnBfbGFzdF9iYXI7ICsrIGIgKSB7CisgICAgICAgICAgICAgICAgICAgIGJhbGlnblsgYiBdLmJiLmJfYXJyaXZlZCAgICAgICAgPSB0ZWFtLT50LnRfYmFyWyBiIF0uYl9hcnJpdmVkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBTeW5jaHJvbml6ZSB0aHJlYWQncyB0YXNrIHN0YXRlCisgICAgICAgICAgICAgICAgb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfdGFza19zdGF0ZSA9IG1hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgLyogZG8gY2xlYW51cCBhbmQgcmVzdG9yZSB0aGUgcGFyZW50IHRlYW0gKi8KKyAgICBtYXN0ZXJfdGggLT4gdGgudGhfaW5mbyAuZHMuZHNfdGlkID0gdGVhbSAtPiB0LnRfbWFzdGVyX3RpZDsKKyAgICBtYXN0ZXJfdGggLT4gdGgudGhfbG9jYWwudGhpc19jb25zdHJ1Y3QgPSB0ZWFtIC0+IHQudF9tYXN0ZXJfdGhpc19jb25zOworICAgIG1hc3Rlcl90aCAtPiB0aC50aF9sb2NhbC5sYXN0X2NvbnN0cnVjdCA9IHRlYW0gLT4gdC50X21hc3Rlcl9sYXN0X2NvbnM7CisKKyAgICBtYXN0ZXJfdGggLT4gdGgudGhfZGlzcGF0Y2ggPQorICAgICAgICAgICAgICAgICYgcGFyZW50X3RlYW0gLT4gdC50X2Rpc3BhdGNoWyB0ZWFtIC0+IHQudF9tYXN0ZXJfdGlkIF07CisKKyAgICAvKiBqYzogVGhlIGZvbGxvd2luZyBsb2NrIGhhcyBpbnN0cnVjdGlvbnMgd2l0aCBSRUwgYW5kIEFDUSBzZW1hbnRpY3MsCisgICAgICAgc2VwYXJhdGluZyB0aGUgcGFyYWxsZWwgdXNlciBjb2RlIGNhbGxlZCBpbiB0aGlzIHBhcmFsbGVsIHJlZ2lvbgorICAgICAgIGZyb20gdGhlIHNlcmlhbCB1c2VyIGNvZGUgY2FsbGVkIGFmdGVyIHRoaXMgZnVuY3Rpb24gcmV0dXJucy4KKyAgICAqLworICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGlmICggIW1hc3Rlcl90aC0+dGgudGhfdGVhbV9taWNyb3Rhc2sgfHwgdGVhbS0+dC50X2xldmVsID4gbWFzdGVyX3RoLT50aC50aF90ZWFtc19sZXZlbCApCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICB7CisgICAgICAgIC8qIERlY3JlbWVudCBvdXIgbmVzdGVkIGRlcHRoIGxldmVsICovCisgICAgICAgIEtNUF9URVNUX1RIRU5fREVDMzIoIChrbXBfaW50MzIqKSAmcm9vdC0+ci5yX2luX3BhcmFsbGVsICk7CisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQoIHJvb3QtPnIucl9pbl9wYXJhbGxlbCA+PSAwICk7CisKKyAgICAjaWYgT01QXzMwX0VOQUJMRUQKKyAgICBLRl9UUkFDRSggMTAsICgiX19rbXBfam9pbl9jYWxsMTogVCMlZCwgdGhpc190aHJlYWQ9JXAgdGVhbT0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAwLCBtYXN0ZXJfdGgsIHRlYW0gKSApOworICAgIF9fa21wX3BvcF9jdXJyZW50X3Rhc2tfZnJvbV90aHJlYWQoIG1hc3Rlcl90aCApOworICAgICNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorCisjaWYgT01QXzQwX0VOQUJMRUQgJiYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIC8vCisgICAgLy8gUmVzdG9yZSBtYXN0ZXIgdGhyZWFkJ3MgcGFydGl0aW9uLgorICAgIC8vCisgICAgbWFzdGVyX3RoIC0+IHRoLnRoX2ZpcnN0X3BsYWNlID0gdGVhbSAtPiB0LnRfZmlyc3RfcGxhY2U7CisgICAgbWFzdGVyX3RoIC0+IHRoLnRoX2xhc3RfcGxhY2UgPSB0ZWFtIC0+IHQudF9sYXN0X3BsYWNlOworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisgICAgaWYgKCBfX2ttcF9pbmhlcml0X2ZwX2NvbnRyb2wgJiYgdGVhbS0+dC50X2ZwX2NvbnRyb2xfc2F2ZWQgKSB7CisgICAgICAgIF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQoKTsKKyAgICAgICAgX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZCggJnRlYW0tPnQudF94ODdfZnB1X2NvbnRyb2xfd29yZCApOworICAgICAgICBfX2ttcF9sb2FkX214Y3NyKCAmdGVhbS0+dC50X214Y3NyICk7CisgICAgfQorI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworICAgIGlmICggcm9vdCAtPiByLnJfYWN0aXZlICE9IG1hc3Rlcl9hY3RpdmUgKQorICAgICAgICByb290IC0+IHIucl9hY3RpdmUgPSBtYXN0ZXJfYWN0aXZlOworCisgICAgX19rbXBfZnJlZV90ZWFtKCByb290LCB0ZWFtICk7IC8qIHRoaXMgd2lsbCBmcmVlIHdvcmtlciB0aHJlYWRzICovCisKKyAgICAvKiB0aGlzIHJhY2Ugd2FzIGZ1biB0byBmaW5kLiAgbWFrZSBzdXJlIHRoZSBmb2xsb3dpbmcgaXMgaW4gdGhlIGNyaXRpY2FsCisgICAgICogcmVnaW9uIG90aGVyd2lzZSBhc3NlcnRpb25zIG1heSBmYWlsIG9jY2FzaW91bmFsbHkgc2luY2UgdGhlIG9sZCB0ZWFtCisgICAgICogbWF5IGJlIHJlYWxsb2NhdGVkIGFuZCB0aGUgaGllcmFyY2h5IGFwcGVhcnMgaW5jb25zaXN0ZW50LiAgaXQgaXMKKyAgICAgKiBhY3R1YWxseSBzYWZlIHRvIHJ1biBhbmQgd29uJ3QgY2F1c2UgYW55IGJ1Z3MsIGJ1dCB3aWxsIGNhdXNlIHRob29zZQorICAgICAqIGFzc2VydGlvbiBmYWlsdXJlcy4gIGl0J3Mgb25seSBvbmUgZGVyZWYmYXNzaWduIHNvIG1pZ2h0IGFzIHdlbGwgcHV0IHRoaXMKKyAgICAgKiBpbiB0aGUgY3JpdGljYWwgcmVnaW9uICovCisgICAgbWFzdGVyX3RoIC0+IHRoLnRoX3RlYW0gICAgICAgID0gICBwYXJlbnRfdGVhbTsKKyAgICBtYXN0ZXJfdGggLT4gdGgudGhfdGVhbV9ucHJvYyAgPSAgIHBhcmVudF90ZWFtIC0+IHQudF9ucHJvYzsKKyAgICBtYXN0ZXJfdGggLT4gdGgudGhfdGVhbV9tYXN0ZXIgPSAgIHBhcmVudF90ZWFtIC0+IHQudF90aHJlYWRzWzBdOworICAgIG1hc3Rlcl90aCAtPiB0aC50aF90ZWFtX3NlcmlhbGl6ZWQgPSBwYXJlbnRfdGVhbSAtPiB0LnRfc2VyaWFsaXplZDsKKworICAgIC8qIHJlc3RvcmUgc2VyaWFsaXplZCB0ZWFtLCBpZiBuZWVkIGJlICovCisgICAgaWYoIHBhcmVudF90ZWFtIC0+IHQudF9zZXJpYWxpemVkICYmCisgICAgICAgIHBhcmVudF90ZWFtICE9IG1hc3Rlcl90aC0+dGgudGhfc2VyaWFsX3RlYW0gJiYKKyAgICAgICAgcGFyZW50X3RlYW0gIT0gcm9vdC0+ci5yX3Jvb3RfdGVhbSApIHsKKyAgICAgICAgICAgIF9fa21wX2ZyZWVfdGVhbSggcm9vdCwgbWFzdGVyX3RoIC0+IHRoLnRoX3NlcmlhbF90ZWFtICk7CisgICAgICAgICAgICBtYXN0ZXJfdGggLT4gdGgudGhfc2VyaWFsX3RlYW0gPSBwYXJlbnRfdGVhbTsKKyAgICB9CisKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIENvcHkgdGhlIHRhc2sgdGVhbSBmcm9tIHRoZSBuZXcgY2hpbGQgLyBvbGQgcGFyZW50IHRlYW0KKyAgICAgICAgLy8gdG8gdGhlIHRocmVhZC4gIElmIG5vbi1OVUxMLCBjb3B5IHRoZSBzdGF0ZSBmbGFnIGFsc28uCisgICAgICAgIC8vCisgICAgICAgIGlmICggKCBtYXN0ZXJfdGggLT4gdGgudGhfdGFza190ZWFtID0gcGFyZW50X3RlYW0gLT4gdC50X3Rhc2tfdGVhbSApICE9IE5VTEwgKSB7CisgICAgICAgICAgICBtYXN0ZXJfdGggLT4gdGgudGhfdGFza19zdGF0ZSA9IG1hc3Rlcl90aCAtPiB0aC50aF90YXNrX3RlYW0gLT4gdHQudHRfc3RhdGU7CisgICAgICAgIH0KKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF9qb2luX2NhbGw6IE1hc3RlciBUIyVkIHJlc3RvcmluZyB0YXNrX3RlYW0gJXAgLyB0ZWFtICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggbWFzdGVyX3RoICksIG1hc3Rlcl90aC0+dGgudGhfdGFza190ZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50X3RlYW0gKSApOworICAgIH0KKyNlbmRpZiAvKiBPTVBfMzBfRU5BQkxFRCAqLworCisgICAgI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAvLyBUT0RPOiBHRUggLSBjYW5ub3QgZG8gdGhpcyBhc3NlcnRpb24gYmVjYXVzZSByb290IHRocmVhZCBub3Qgc2V0IHVwIGFzIGV4ZWN1dGluZworICAgICAgICAgLy8gS01QX0FTU0VSVCggbWFzdGVyX3RoLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ZsYWdzLmV4ZWN1dGluZyA9PSAwICk7CisgICAgICAgICBtYXN0ZXJfdGgtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfZmxhZ3MuZXhlY3V0aW5nID0gMTsKKyAgICAjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisKKyAgICBLTVBfTUIoKTsKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfam9pbl9jYWxsOiBleGl0IFQjJWRcbiIsIGd0aWQgKSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIENoZWNrIHdoZXRoZXIgd2Ugc2hvdWxkIHB1c2ggYW4gaW50ZXJuYWwgY29udHJvbCByZWNvcmQgb250byB0aGUKKyAgIHNlcmlhbCB0ZWFtIHN0YWNrLiAgSWYgc28sIGRvIGl0LiAgKi8KK3ZvaWQKK19fa21wX3NhdmVfaW50ZXJuYWxfY29udHJvbHMgKCBrbXBfaW5mb190ICogdGhyZWFkICkKK3sKKworICAgIGlmICggdGhyZWFkIC0+IHRoLnRoX3RlYW0gIT0gdGhyZWFkIC0+IHRoLnRoX3NlcmlhbF90ZWFtICkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICh0aHJlYWQgLT4gdGgudGhfdGVhbSAtPiB0LnRfc2VyaWFsaXplZCA+IDEpIHsKKyAgICAgICAgaW50IHB1c2ggPSAwOworCisgICAgICAgIGlmICh0aHJlYWQgLT4gdGgudGhfdGVhbSAtPiB0LnRfY29udHJvbF9zdGFja190b3AgPT0gTlVMTCkgeworICAgICAgICAgICAgcHVzaCA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIHRocmVhZCAtPiB0aC50aF90ZWFtIC0+IHQudF9jb250cm9sX3N0YWNrX3RvcCAtPiBzZXJpYWxfbmVzdGluZ19sZXZlbCAhPQorICAgICAgICAgICAgICAgICB0aHJlYWQgLT4gdGgudGhfdGVhbSAtPiB0LnRfc2VyaWFsaXplZCApIHsKKyAgICAgICAgICAgICAgICBwdXNoID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocHVzaCkgeyAgLyogcHVzaCBhIHJlY29yZCBvbiB0aGUgc2VyaWFsIHRlYW0ncyBzdGFjayAqLworICAgICAgICAgICAga21wX2ludGVybmFsX2NvbnRyb2xfdCAqIGNvbnRyb2wgPSAoa21wX2ludGVybmFsX2NvbnRyb2xfdCAqKSBfX2ttcF9hbGxvY2F0ZShzaXplb2Yoa21wX2ludGVybmFsX2NvbnRyb2xfdCkpOworCisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgICAgICAgIGNvcHlfaWN2cyggY29udHJvbCwgJiB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cyApOworI2Vsc2UKKyAgICAgICAgICAgIGNvbnRyb2wtPm5wcm9jICAgICAgICA9IHRocmVhZC0+dGgudGhfdGVhbS0+dC50X3NldF9ucHJvY1swXTsKKyAgICAgICAgICAgIGNvbnRyb2wtPmR5bmFtaWMgICAgICA9IHRocmVhZC0+dGgudGhfdGVhbS0+dC50X3NldF9keW5hbWljWzBdOworICAgICAgICAgICAgY29udHJvbC0+bmVzdGVkICAgICAgID0gdGhyZWFkLT50aC50aF90ZWFtLT50LnRfc2V0X25lc3RlZFswXTsKKyAgICAgICAgICAgIGNvbnRyb2wtPmJsb2NrdGltZSAgICA9IHRocmVhZC0+dGgudGhfdGVhbS0+dC50X3NldF9ibG9ja3RpbWVbMF07CisgICAgICAgICAgICBjb250cm9sLT5idF9pbnRlcnZhbHMgPSB0aHJlYWQtPnRoLnRoX3RlYW0tPnQudF9zZXRfYnRfaW50ZXJ2YWxzWzBdOworICAgICAgICAgICAgY29udHJvbC0+YnRfc2V0ICAgICAgID0gdGhyZWFkLT50aC50aF90ZWFtLT50LnRfc2V0X2J0X3NldFswXTsKKyNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorCisgICAgICAgICAgICBjb250cm9sLT5zZXJpYWxfbmVzdGluZ19sZXZlbCA9IHRocmVhZC0+dGgudGhfdGVhbS0+dC50X3NlcmlhbGl6ZWQ7CisKKyAgICAgICAgICAgIGNvbnRyb2wtPm5leHQgPSB0aHJlYWQgLT4gdGgudGhfdGVhbSAtPiB0LnRfY29udHJvbF9zdGFja190b3A7CisgICAgICAgICAgICB0aHJlYWQgLT4gdGgudGhfdGVhbSAtPiB0LnRfY29udHJvbF9zdGFja190b3AgPSBjb250cm9sOworICAgICAgICB9CisgICAgfQorfQorCisvKiBDaGFuZ2VzIHNldF9ucHJvYyAqLwordm9pZAorX19rbXBfc2V0X251bV90aHJlYWRzKCBpbnQgbmV3X250aCwgaW50IGd0aWQgKQoreworICAgIGttcF9pbmZvX3QgKnRocmVhZDsKKyAgICBrbXBfcm9vdF90ICpyb290OworCisgICAgS0ZfVFJBQ0UoIDEwLCAoIl9fa21wX3NldF9udW1fdGhyZWFkczogbmV3IF9fa21wX250aCA9ICVkXG4iLCBuZXdfbnRoICkpOworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisKKyAgICBpZiAobmV3X250aCA8IDEpCisgICAgICAgIG5ld19udGggPSAxOworICAgIGVsc2UgaWYgKG5ld19udGggPiBfX2ttcF9tYXhfbnRoKQorICAgICAgICBuZXdfbnRoID0gX19rbXBfbWF4X250aDsKKworICAgIHRocmVhZCA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisKKyAgICBfX2ttcF9zYXZlX2ludGVybmFsX2NvbnRyb2xzKCB0aHJlYWQgKTsKKworICAgIHNldF9fbnByb2MoIHRocmVhZCwgbmV3X250aCApOworCisgICAgLy8KKyAgICAvLyBJZiB0aGlzIG9tcF9zZXRfbnVtX3RocmVhZHMoKSBjYWxsIHdpbGwgY2F1c2UgdGhlIGhvdCB0ZWFtIHNpemUgdG8gYmUKKyAgICAvLyByZWR1Y2VkIChpbiB0aGUgYWJzZW5jZSBvZiBhIG51bV90aHJlYWRzIGNsYXVzZSksIHRoZW4gcmVkdWNlIGl0IG5vdywKKyAgICAvLyByYXRoZXIgdGhhbiB3YWl0aW5nIGZvciB0aGUgbmV4dCBwYXJhbGxlbCByZWdpb24uCisgICAgLy8KKyAgICByb290ID0gdGhyZWFkLT50aC50aF9yb290OworICAgIGlmICggX19rbXBfaW5pdF9wYXJhbGxlbCAmJiAoICEgcm9vdC0+ci5yX2FjdGl2ZSApCisgICAgICAmJiAoIHJvb3QtPnIucl9ob3RfdGVhbS0+dC50X25wcm9jID4gbmV3X250aCApICkgeworICAgICAgICBrbXBfdGVhbV90ICpob3RfdGVhbSA9IHJvb3QtPnIucl9ob3RfdGVhbTsKKyAgICAgICAgaW50IGY7CisKKyAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJl9fa21wX2Zvcmtqb2luX2xvY2sgKTsKKworCisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApIHsKKyAgICAgICAgICAgIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtID0gaG90X3RlYW0tPnQudF90YXNrX3RlYW07CisgICAgICAgICAgICBpZiAoICggdGFza190ZWFtICE9IE5VTEwgKSAmJiBUQ1JfU1lOQ180KHRhc2tfdGVhbS0+dHQudHRfYWN0aXZlKSApIHsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIFNpZ25hbCB0aGUgd29ya2VyIHRocmVhZHMgKGVzcC4gdGhlIGV4dHJhIG9uZXMpIHRvIHN0b3AKKyAgICAgICAgICAgICAgICAvLyBsb29raW5nIGZvciB0YXNrcyB3aGlsZSBzcGluIHdhaXRpbmcuICBUaGUgdGFzayB0ZWFtcworICAgICAgICAgICAgICAgIC8vIGFyZSByZWZlcmVuY2UgY291bnRlZCBhbmQgd2lsbCBiZSBkZWFsbG9jYXRlZCBieSB0aGUKKyAgICAgICAgICAgICAgICAvLyBsYXN0IHdvcmtlciB0aHJlYWQuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBob3RfdGVhbS0+dC50X25wcm9jID4gMSApOworICAgICAgICAgICAgICAgIFRDV19TWU5DXzQoIHRhc2tfdGVhbS0+dHQudHRfYWN0aXZlLCBGQUxTRSApOworICAgICAgICAgICAgICAgIEtNUF9NQigpOworCisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF9zZXRfbnVtX3RocmVhZHM6IHNldHRpbmcgdGFza190ZWFtICVwIHRvIE5VTExcbiIsCisgICAgICAgICAgICAgICAgICAmaG90X3RlYW0tPnQudF90YXNrX3RlYW0gKSApOworICAgICAgICAgICAgICAgICAgaG90X3RlYW0tPnQudF90YXNrX3RlYW0gPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza190ZWFtID09IE5VTEwgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gUmVsZWFzZSB0aGUgZXh0cmEgdGhyZWFkcyB3ZSBkb24ndCBuZWVkIGFueSBtb3JlLgorICAgICAgICAvLworICAgICAgICBmb3IgKCBmID0gbmV3X250aDsgIGYgPCBob3RfdGVhbS0+dC50X25wcm9jOyBmKysgKSB7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBob3RfdGVhbS0+dC50X3RocmVhZHNbZl0gIT0gTlVMTCApOworICAgICAgICAgICAgX19rbXBfZnJlZV90aHJlYWQoIGhvdF90ZWFtLT50LnRfdGhyZWFkc1tmXSApOworICAgICAgICAgICAgaG90X3RlYW0tPnQudF90aHJlYWRzW2ZdID0gIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaG90X3RlYW0tPnQudF9ucHJvYyA9IG5ld19udGg7CisKKworICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfZm9ya2pvaW5fbG9jayApOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFVwZGF0ZSB0aGUgdF9ucHJvYyBmaWVsZCBpbiB0aGUgdGhyZWFkcyB0aGF0IGFyZSBzdGlsbCBhY3RpdmUuCisgICAgICAgIC8vCisgICAgICAgIGZvciggZj0wIDsgZiA8IG5ld19udGg7IGYrKyApIHsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGhvdF90ZWFtLT50LnRfdGhyZWFkc1tmXSAhPSBOVUxMICk7CisgICAgICAgICAgICBob3RfdGVhbS0+dC50X3RocmVhZHNbZl0tPnRoLnRoX3RlYW1fbnByb2MgPSBuZXdfbnRoOworICAgICAgICB9CisjaWYgS01QX01JQworICAgICAgICAvLyBTcGVjaWFsIGZsYWcgaW4gY2FzZSBvbXBfc2V0X251bV90aHJlYWRzKCkgY2FsbAorICAgICAgICBob3RfdGVhbSAtPiB0LnRfc2l6ZV9jaGFuZ2VkID0gLTE7CisjZW5kaWYKKyAgICB9CisKK30KKworI2lmIE9NUF8zMF9FTkFCTEVECisvKiBDaGFuZ2VzIG1heF9hY3RpdmVfbGV2ZWxzICovCit2b2lkCitfX2ttcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMoIGludCBndGlkLCBpbnQgbWF4X2FjdGl2ZV9sZXZlbHMgKQoreworICAgIGttcF9pbmZvX3QgKnRocmVhZDsKKworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzOiBuZXcgbWF4X2FjdGl2ZV9sZXZlbHMgZm9yIHRocmVhZCAlZCA9ICglZClcbiIsIGd0aWQsIG1heF9hY3RpdmVfbGV2ZWxzICkgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworCisgICAgLy8gdmFsaWRhdGUgbWF4X2FjdGl2ZV9sZXZlbHMKKyAgICBpZiggbWF4X2FjdGl2ZV9sZXZlbHMgPCAwICkgeworICAgICAgICBLTVBfV0FSTklORyggQWN0aXZlTGV2ZWxzTmVnYXRpdmUsIG1heF9hY3RpdmVfbGV2ZWxzICk7CisgICAgICAgIC8vIFdlIGlnbm9yZSB0aGlzIGNhbGwgaWYgdGhlIHVzZXIgaGFzIHNwZWNpZmllZCBhIG5lZ2F0aXZlIHZhbHVlLgorICAgICAgICAvLyBUaGUgY3VycmVudCBzZXR0aW5nIHdvbid0IGJlIGNoYW5nZWQuIFRoZSBsYXN0IHZhbGlkIHNldHRpbmcgd2lsbCBiZSB1c2VkLgorICAgICAgICAvLyBBIHdhcm5pbmcgd2lsbCBiZSBpc3N1ZWQgKGlmIHdhcm5pbmdzIGFyZSBhbGxvd2VkIGFzIGNvbnRyb2xsZWQgYnkgdGhlIEtNUF9XQVJOSU5HUyBlbnYgdmFyKS4KKyAgICAgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHM6IHRoZSBjYWxsIGlzIGlnbm9yZWQ6IG5ldyBtYXhfYWN0aXZlX2xldmVscyBmb3IgdGhyZWFkICVkID0gKCVkKVxuIiwgZ3RpZCwgbWF4X2FjdGl2ZV9sZXZlbHMgKSApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKCBtYXhfYWN0aXZlX2xldmVscyA8PSBLTVBfTUFYX0FDVElWRV9MRVZFTFNfTElNSVQgKSB7CisgICAgICAgIC8vIGl0J3MgT0ssIHRoZSBtYXhfYWN0aXZlX2xldmVscyBpcyB3aXRoaW4gdGhlIHZhbGlkIHJhbmdlOiBbIDA7IEtNUF9NQVhfQUNUSVZFX0xFVkVMU19MSU1JVCBdCisgICAgICAgIC8vIFdlIGFsbG93IGEgemVybyB2YWx1ZS4gKGltcGxlbWVudGF0aW9uIGRlZmluZWQgYmVoYXZpb3IpCisgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIEFjdGl2ZUxldmVsc0V4Y2VlZExpbWl0LCBtYXhfYWN0aXZlX2xldmVscywgS01QX01BWF9BQ1RJVkVfTEVWRUxTX0xJTUlUICApOworICAgICAgICBtYXhfYWN0aXZlX2xldmVscyA9IEtNUF9NQVhfQUNUSVZFX0xFVkVMU19MSU1JVDsKKyAgICAgICAgLy8gQ3VycmVudCB1cHBlciBsaW1pdCBpcyBNQVhfSU5ULiAoaW1wbGVtZW50YXRpb24gZGVmaW5lZCBiZWhhdmlvcikKKyAgICAgICAgLy8gSWYgdGhlIGlucHV0IGV4Y2VlZHMgdGhlIHVwcGVyIGxpbWl0LCB3ZSBjb3JyZWN0IHRoZSBpbnB1dCB0byBiZSB0aGUgdXBwZXIgbGltaXQuIChpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGJlaGF2aW9yKQorICAgICAgICAvLyBBY3R1YWxseSwgdGhlIGZsb3cgc2hvdWxkIG5ldmVyIGdldCBoZXJlIHVudGlsIHdlIHVzZSBNQVhfSU5UIGxpbWl0LgorICAgIH0KKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX3NldF9tYXhfYWN0aXZlX2xldmVsczogYWZ0ZXIgdmFsaWRhdGlvbjogbmV3IG1heF9hY3RpdmVfbGV2ZWxzIGZvciB0aHJlYWQgJWQgPSAoJWQpXG4iLCBndGlkLCBtYXhfYWN0aXZlX2xldmVscyApICk7CisKKyAgICB0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisKKyAgICBfX2ttcF9zYXZlX2ludGVybmFsX2NvbnRyb2xzKCB0aHJlYWQgKTsKKworICAgIHNldF9fbWF4X2FjdGl2ZV9sZXZlbHMoIHRocmVhZCwgbWF4X2FjdGl2ZV9sZXZlbHMgKTsKKworfQorCisvKiBHZXRzIG1heF9hY3RpdmVfbGV2ZWxzICovCitpbnQKK19fa21wX2dldF9tYXhfYWN0aXZlX2xldmVscyggaW50IGd0aWQgKQoreworICAgIGttcF9pbmZvX3QgKnRocmVhZDsKKworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzOiB0aHJlYWQgJWRcbiIsIGd0aWQgKSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisKKyAgICB0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhyZWFkIC0+IHRoLnRoX2N1cnJlbnRfdGFzayApOworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzOiB0aHJlYWQgJWQsIGN1cnRhc2s9JXAsIGN1cnRhc2tfbWF4YWNsZXZlbD0lZFxuIiwKKyAgICAgICAgZ3RpZCwgdGhyZWFkIC0+IHRoLnRoX2N1cnJlbnRfdGFzaywgdGhyZWFkIC0+IHRoLnRoX2N1cnJlbnRfdGFzayAtPiB0ZF9pY3ZzLm1heF9hY3RpdmVfbGV2ZWxzICkgKTsKKyAgICByZXR1cm4gdGhyZWFkIC0+IHRoLnRoX2N1cnJlbnRfdGFzayAtPiB0ZF9pY3ZzLm1heF9hY3RpdmVfbGV2ZWxzOworfQorCisvKiBDaGFuZ2VzIGRlZl9zY2hlZF92YXIgSUNWIHZhbHVlcyAocnVuLXRpbWUgc2NoZWR1bGUga2luZCBhbmQgY2h1bmspICovCit2b2lkCitfX2ttcF9zZXRfc2NoZWR1bGUoIGludCBndGlkLCBrbXBfc2NoZWRfdCBraW5kLCBpbnQgY2h1bmsgKQoreworICAgIGttcF9pbmZvX3QgKnRocmVhZDsKKy8vICAgIGttcF90ZWFtX3QgKnRlYW07CisKKyAgICBLRl9UUkFDRSggMTAsICgiX19rbXBfc2V0X3NjaGVkdWxlOiBuZXcgc2NoZWR1bGUgZm9yIHRocmVhZCAlZCA9ICglZCwgJWQpXG4iLCBndGlkLCAoaW50KWtpbmQsIGNodW5rICkpOworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisKKyAgICAvLyBDaGVjayBpZiB0aGUga2luZCBwYXJhbWV0ZXIgaXMgdmFsaWQsIGNvcnJlY3QgaWYgbmVlZGVkLgorICAgIC8vIFZhbGlkIHBhcmFtZXRlcnMgc2hvdWxkIGZpdCBpbiBvbmUgb2YgdHdvIGludGVydmFscyAtIHN0YW5kYXJkIG9yIGV4dGVuZGVkOgorICAgIC8vICAgICAgIDxsb3dlcj4sIDx2YWxpZD4sIDx1cHBlcl9zdGQ+LCA8bG93ZXJfZXh0PiwgPHZhbGlkPiwgPHVwcGVyPgorICAgIC8vIDIwMDgtMDEtMjU6IDAsICAxIC0gNCwgICAgICAgNSwgICAgICAgICAxMDAsICAgICAxMDEgLSAxMDIsIDEwMworICAgIGlmICgga2luZCA8PSBrbXBfc2NoZWRfbG93ZXIgfHwga2luZCA+PSBrbXBfc2NoZWRfdXBwZXIgfHwKKyAgICAgICAoIGtpbmQgPD0ga21wX3NjaGVkX2xvd2VyX2V4dCAmJiBraW5kID49IGttcF9zY2hlZF91cHBlcl9zdGQgKSApCisgICAgeworICAgICAgICAvLyBUT0RPOiBIaW50IG5lZWRzIGF0dGVudGlvbiBpbiBjYXNlIHdlIGNoYW5nZSB0aGUgZGVmYXVsdCBzY2hlZHVsZS4KKyAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAga21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICBLTVBfTVNHKCBTY2hlZHVsZUtpbmRPdXRPZlJhbmdlLCBraW5kICksCisgICAgICAgICAgICBLTVBfSE5UKCBEZWZhdWx0U2NoZWR1bGVLaW5kVXNlZCwgInN0YXRpYywgbm8gY2h1bmsiICksCisgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICApOworICAgICAgICBraW5kID0ga21wX3NjaGVkX2RlZmF1bHQ7CisgICAgICAgIGNodW5rID0gMDsgICAgICAgICAvLyBpZ25vcmUgY2h1bmsgdmFsdWUgaW4gY2FzZSBvZiBiYWQga2luZAorICAgIH0KKworICAgIHRocmVhZCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKworICAgIF9fa21wX3NhdmVfaW50ZXJuYWxfY29udHJvbHMoIHRocmVhZCApOworCisgICAgaWYgKCBraW5kIDwga21wX3NjaGVkX3VwcGVyX3N0ZCApIHsKKyAgICAgICAgaWYgKCBraW5kID09IGttcF9zY2hlZF9zdGF0aWMgJiYgY2h1bmsgPCBLTVBfREVGQVVMVF9DSFVOSyApIHsKKyAgICAgICAgICAgIC8vIGRpZmZlciBzdGF0aWMgY2h1bmtlZCB2cy4gdW5jaHVua2VkOgorICAgICAgICAgICAgLy8gY2h1bmsgc2hvdWxkIGJlIGludmFsaWQgdG8gaW5kaWNhdGUgdW5jaHVua2VkIHNjaGVkdWxlICh3aGljaCBpcyB0aGUgZGVmYXVsdCkKKyAgICAgICAgICAgIHRocmVhZCAtPiB0aC50aF9jdXJyZW50X3Rhc2sgLT4gdGRfaWN2cy5zY2hlZC5yX3NjaGVkX3R5cGUgPSBrbXBfc2NoX3N0YXRpYzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocmVhZCAtPiB0aC50aF9jdXJyZW50X3Rhc2sgLT4gdGRfaWN2cy5zY2hlZC5yX3NjaGVkX3R5cGUgPSBfX2ttcF9zY2hfbWFwWyBraW5kIC0ga21wX3NjaGVkX2xvd2VyIC0gMSBdOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gICAgX19rbXBfc2NoX21hcFsga2luZCAtIGttcF9zY2hlZF9sb3dlcl9leHQgKyBrbXBfc2NoZWRfdXBwZXJfc3RkIC0ga21wX3NjaGVkX2xvd2VyIC0gMiBdOworICAgICAgICB0aHJlYWQgLT4gdGgudGhfY3VycmVudF90YXNrIC0+IHRkX2ljdnMuc2NoZWQucl9zY2hlZF90eXBlID0KKyAgICAgICAgICAgIF9fa21wX3NjaF9tYXBbIGtpbmQgLSBrbXBfc2NoZWRfbG93ZXJfZXh0ICsga21wX3NjaGVkX3VwcGVyX3N0ZCAtIGttcF9zY2hlZF9sb3dlciAtIDIgXTsKKyAgICB9CisgICAgaWYgKCBraW5kID09IGttcF9zY2hlZF9hdXRvICkgeworICAgICAgICAvLyBpZ25vcmUgcGFyYW1ldGVyIGNodW5rIGZvciBzY2hlZHVsZSBhdXRvCisgICAgICAgIHRocmVhZCAtPiB0aC50aF9jdXJyZW50X3Rhc2sgLT4gdGRfaWN2cy5zY2hlZC5jaHVuayA9IEtNUF9ERUZBVUxUX0NIVU5LOworICAgIH0gZWxzZSB7CisgICAgICAgIHRocmVhZCAtPiB0aC50aF9jdXJyZW50X3Rhc2sgLT4gdGRfaWN2cy5zY2hlZC5jaHVuayA9IGNodW5rOworICAgIH0KK30KKworLyogR2V0cyBkZWZfc2NoZWRfdmFyIElDViB2YWx1ZXMgKi8KK3ZvaWQKK19fa21wX2dldF9zY2hlZHVsZSggaW50IGd0aWQsIGttcF9zY2hlZF90ICoga2luZCwgaW50ICogY2h1bmsgKQoreworICAgIGttcF9pbmZvX3QgICAgICp0aHJlYWQ7CisgICAgZW51bSBzY2hlZF90eXBlIHRoX3R5cGU7CisgICAgaW50ICAgICAgICAgICAgIGk7CisKKyAgICBLRl9UUkFDRSggMTAsICgiX19rbXBfZ2V0X3NjaGVkdWxlOiB0aHJlYWQgJWRcbiIsIGd0aWQgKSk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKworICAgIHRocmVhZCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKworICAgIC8vdGhfdHlwZSA9IHRocmVhZCAtPiB0aC50aF90ZWFtIC0+IHQudF9zZXRfc2NoZWRbIHRocmVhZC0+dGgudGhfaW5mby5kcy5kc190aWQgXS5yX3NjaGVkX3R5cGU7CisgICAgdGhfdHlwZSA9IHRocmVhZCAtPiB0aC50aF9jdXJyZW50X3Rhc2sgLT4gdGRfaWN2cy5zY2hlZC5yX3NjaGVkX3R5cGU7CisKKyAgICBzd2l0Y2ggKCB0aF90eXBlICkgeworICAgIGNhc2Uga21wX3NjaF9zdGF0aWM6CisgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19ncmVlZHk6CisgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZDoKKyAgICAgICAgKmtpbmQgPSBrbXBfc2NoZWRfc3RhdGljOworICAgICAgICAqY2h1bmsgPSAwOyAgIC8vIGNodW5rIHdhcyBub3Qgc2V0LCB0cnkgdG8gc2hvdyB0aGlzIGZhY3QgdmlhIHplcm8gdmFsdWUKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfY2h1bmtlZDoKKyAgICAgICAgKmtpbmQgPSBrbXBfc2NoZWRfc3RhdGljOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGttcF9zY2hfZHluYW1pY19jaHVua2VkOgorICAgICAgICAqa2luZCA9IGttcF9zY2hlZF9keW5hbWljOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGttcF9zY2hfZ3VpZGVkX2NodW5rZWQ6CisgICAgY2FzZSBrbXBfc2NoX2d1aWRlZF9pdGVyYXRpdmVfY2h1bmtlZDoKKyAgICBjYXNlIGttcF9zY2hfZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZDoKKyAgICAgICAgKmtpbmQgPSBrbXBfc2NoZWRfZ3VpZGVkOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGttcF9zY2hfYXV0bzoKKyAgICAgICAgKmtpbmQgPSBrbXBfc2NoZWRfYXV0bzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBrbXBfc2NoX3RyYXBlem9pZGFsOgorICAgICAgICAqa2luZCA9IGttcF9zY2hlZF90cmFwZXpvaWRhbDsKKyAgICAgICAgYnJlYWs7CisvKgorICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfc3RlYWw6CisgICAgICAgICpraW5kID0ga21wX3NjaGVkX3N0YXRpY19zdGVhbDsKKyAgICAgICAgYnJlYWs7CisqLworICAgIGRlZmF1bHQ6CisgICAgICAgIEtNUF9GQVRBTCggVW5rbm93blNjaGVkdWxpbmdUeXBlLCB0aF90eXBlICk7CisgICAgfQorCisgICAgLy8qY2h1bmsgPSB0aHJlYWQgLT4gdGgudGhfdGVhbSAtPiB0LnRfc2V0X3NjaGVkWyB0aHJlYWQtPnRoLnRoX2luZm8uZHMuZHNfdGlkIF0uY2h1bms7CisgICAgKmNodW5rID0gdGhyZWFkIC0+IHRoLnRoX2N1cnJlbnRfdGFzayAtPiB0ZF9pY3ZzLnNjaGVkLmNodW5rOworfQorCitpbnQKK19fa21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtKCBpbnQgZ3RpZCwgaW50IGxldmVsICkgeworCisgICAgaW50IGlpLCBkZDsKKyAgICBrbXBfdGVhbV90ICp0ZWFtOworICAgIGttcF9pbmZvX3QgKnRocjsKKworICAgIEtGX1RSQUNFKCAxMCwgKCJfX2ttcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bTogdGhyZWFkICVkICVkXG4iLCBndGlkLCBsZXZlbCApKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworCisgICAgLy8gdmFsaWRhdGUgbGV2ZWwKKyAgICBpZiggbGV2ZWwgPT0gMCApIHJldHVybiAwOworICAgIGlmKCBsZXZlbCA8IDAgKSByZXR1cm4gLTE7CisgICAgdGhyID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIHRlYW0gPSB0aHItPnRoLnRoX3RlYW07CisgICAgaWkgPSB0ZWFtIC0+IHQudF9sZXZlbDsKKyAgICBpZiggbGV2ZWwgPiBpaSApIHJldHVybiAtMTsKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgaWYoIHRoci0+dGgudGhfdGVhbV9taWNyb3Rhc2sgKSB7CisgICAgICAgIC8vIEFDOiB3ZSBhcmUgaW4gdGVhbXMgcmVnaW9uIHdoZXJlIG11bHRpcGxlIG5lc3RlZCB0ZWFtcyBoYXZlIHNhbWUgbGV2ZWwKKyAgICAgICAgaW50IHRsZXZlbCA9IHRoci0+dGgudGhfdGVhbXNfbGV2ZWw7IC8vIHRoZSBsZXZlbCBvZiB0aGUgdGVhbXMgY29uc3RydWN0CisgICAgICAgIGlmKCBsZXZlbCA8PSB0bGV2ZWwgKSB7IC8vIG90aGVyd2lzZSB1c3VhbCBhbGdvcml0aG0gd29ya3MgKHdpbGwgbm90IHRvdWNoIHRoZSB0ZWFtcykKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGlpID49IHRsZXZlbCApOworICAgICAgICAgICAgLy8gQUM6IEFzIHdlIG5lZWQgdG8gcGFzcyBieSB0aGUgdGVhbXMgbGVhZ3VlLCB3ZSBuZWVkIHRvIGFydGlmaWNpYWxseSBpbmNyZWFzZSBpaQorICAgICAgICAgICAgaWYgKCBpaSA9PSB0bGV2ZWwgKSB7CisgICAgICAgICAgICAgICAgaWkgKz0gMjsgLy8gdGhyZWUgdGVhbXMgaGF2ZSBzYW1lIGxldmVsCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlpICsrOyAgIC8vIHR3byB0ZWFtcyBoYXZlIHNhbWUgbGV2ZWwKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgaWYoIGlpID09IGxldmVsICkgcmV0dXJuIF9fa21wX3RpZF9mcm9tX2d0aWQoIGd0aWQgKTsKKworICAgIGRkID0gdGVhbSAtPiB0LnRfc2VyaWFsaXplZDsKKyAgICBsZXZlbCsrOworICAgIHdoaWxlKCBpaSA+IGxldmVsICkKKyAgICB7CisgICAgICAgIGZvciggZGQgPSB0ZWFtIC0+IHQudF9zZXJpYWxpemVkOyAoIGRkID4gMCApICYmICggaWkgPiBsZXZlbCApOyBkZC0tLCBpaS0tICkKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIGlmKCAoIHRlYW0gLT4gdC50X3NlcmlhbGl6ZWQgKSAmJiAoICFkZCApICkgeworICAgICAgICAgICAgdGVhbSA9IHRlYW0tPnQudF9wYXJlbnQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiggaWkgPiBsZXZlbCApIHsKKyAgICAgICAgICAgIHRlYW0gPSB0ZWFtLT50LnRfcGFyZW50OworICAgICAgICAgICAgZGQgPSB0ZWFtIC0+IHQudF9zZXJpYWxpemVkOworICAgICAgICAgICAgaWktLTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoIGRkID4gMSApID8gKCAwICkgOiAoIHRlYW0gLT4gdC50X21hc3Rlcl90aWQgKTsKK30KKworaW50CitfX2ttcF9nZXRfdGVhbV9zaXplKCBpbnQgZ3RpZCwgaW50IGxldmVsICkgeworCisgICAgaW50IGlpLCBkZDsKKyAgICBrbXBfdGVhbV90ICp0ZWFtOworICAgIGttcF9pbmZvX3QgKnRocjsKKworICAgIEtGX1RSQUNFKCAxMCwgKCJfX2ttcF9nZXRfdGVhbV9zaXplOiB0aHJlYWQgJWQgJWRcbiIsIGd0aWQsIGxldmVsICkpOworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisKKyAgICAvLyB2YWxpZGF0ZSBsZXZlbAorICAgIGlmKCBsZXZlbCA9PSAwICkgcmV0dXJuIDE7CisgICAgaWYoIGxldmVsIDwgMCApIHJldHVybiAtMTsKKyAgICB0aHIgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAgdGVhbSA9IHRoci0+dGgudGhfdGVhbTsKKyAgICBpaSA9IHRlYW0gLT4gdC50X2xldmVsOworICAgIGlmKCBsZXZlbCA+IGlpICkgcmV0dXJuIC0xOworCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBpZiggdGhyLT50aC50aF90ZWFtX21pY3JvdGFzayApIHsKKyAgICAgICAgLy8gQUM6IHdlIGFyZSBpbiB0ZWFtcyByZWdpb24gd2hlcmUgbXVsdGlwbGUgbmVzdGVkIHRlYW1zIGhhdmUgc2FtZSBsZXZlbAorICAgICAgICBpbnQgdGxldmVsID0gdGhyLT50aC50aF90ZWFtc19sZXZlbDsgLy8gdGhlIGxldmVsIG9mIHRoZSB0ZWFtcyBjb25zdHJ1Y3QKKyAgICAgICAgaWYoIGxldmVsIDw9IHRsZXZlbCApIHsgLy8gb3RoZXJ3aXNlIHVzdWFsIGFsZ29yaXRobSB3b3JrcyAod2lsbCBub3QgdG91Y2ggdGhlIHRlYW1zKQorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggaWkgPj0gdGxldmVsICk7CisgICAgICAgICAgICAvLyBBQzogQXMgd2UgbmVlZCB0byBwYXNzIGJ5IHRoZSB0ZWFtcyBsZWFndWUsIHdlIG5lZWQgdG8gYXJ0aWZpY2lhbGx5IGluY3JlYXNlIGlpCisgICAgICAgICAgICBpZiAoIGlpID09IHRsZXZlbCApIHsKKyAgICAgICAgICAgICAgICBpaSArPSAyOyAvLyB0aHJlZSB0ZWFtcyBoYXZlIHNhbWUgbGV2ZWwKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWkgKys7ICAgLy8gdHdvIHRlYW1zIGhhdmUgc2FtZSBsZXZlbAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICB3aGlsZSggaWkgPiBsZXZlbCApCisgICAgeworICAgICAgICBmb3IoIGRkID0gdGVhbSAtPiB0LnRfc2VyaWFsaXplZDsgKCBkZCA+IDAgKSAmJiAoIGlpID4gbGV2ZWwgKTsgZGQtLSwgaWktLSApCisgICAgICAgIHsKKyAgICAgICAgfQorICAgICAgICBpZiggdGVhbSAtPiB0LnRfc2VyaWFsaXplZCAmJiAoICFkZCApICkgeworICAgICAgICAgICAgdGVhbSA9IHRlYW0tPnQudF9wYXJlbnQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiggaWkgPiBsZXZlbCApIHsKKyAgICAgICAgICAgIHRlYW0gPSB0ZWFtLT50LnRfcGFyZW50OworICAgICAgICAgICAgaWktLTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0ZWFtIC0+IHQudF9ucHJvYzsKK30KKworI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisKK2ttcF9yX3NjaGVkX3QKK19fa21wX2dldF9zY2hlZHVsZV9nbG9iYWwoKSB7CisvLyBUaGlzIHJvdXRpbmUgY3JlYXRlZCBiZWNhdXNlIHBhaXJzIChfX2ttcF9zY2hlZCwgX19rbXBfY2h1bmspIGFuZCAoX19rbXBfc3RhdGljLCBfX2ttcF9ndWlkZWQpCisvLyBtYXkgYmUgY2hhbmdlZCBieSBrbXBfc2V0X2RlZmF1bHRzIGluZGVwZW5kZW50bHkuIFNvIG9uZSBjYW4gZ2V0IHRoZSB1cGRhdGVkIHNjaGVkdWxlIGhlcmUuCisKKyAgICBrbXBfcl9zY2hlZF90IHJfc2NoZWQ7CisKKyAgICAvLyBjcmVhdGUgc2NoZWR1bGUgZnJvbSA0IGdsb2JhbHM6IF9fa21wX3NjaGVkLCBfX2ttcF9jaHVuaywgX19rbXBfc3RhdGljLCBfX2ttcF9ndWlkZWQKKyAgICAvLyBfX2ttcF9zY2hlZCBzaG91bGQga2VlcCBvcmlnaW5hbCB2YWx1ZSwgc28gdGhhdCB1c2VyIGNhbiBzZXQgS01QX1NDSEVEVUxFIG11bHRpcGxlIHRpbWVzLAorICAgIC8vIGFuZCB0aHVzIGhhdmUgZGlmZmVyZW50IHJ1bi10aW1lIHNjaGVkdWxlcyBpbiBkaWZmZXJlbnQgcm9vdHMgKGV2ZW4gaW4gT01QIDIuNSkKKyAgICBpZiAoIF9fa21wX3NjaGVkID09IGttcF9zY2hfc3RhdGljICkgeworICAgICAgICByX3NjaGVkLnJfc2NoZWRfdHlwZSA9IF9fa21wX3N0YXRpYzsgLy8gcmVwbGFjZSBTVEFUSUMgd2l0aCBtb3JlIGRldGFpbGVkIHNjaGVkdWxlIChiYWxhbmNlZCBvciBncmVlZHkpCisgICAgfSBlbHNlIGlmICggX19rbXBfc2NoZWQgPT0ga21wX3NjaF9ndWlkZWRfY2h1bmtlZCApIHsKKyAgICAgICAgcl9zY2hlZC5yX3NjaGVkX3R5cGUgPSBfX2ttcF9ndWlkZWQ7IC8vIHJlcGxhY2UgR1VJREVEIHdpdGggbW9yZSBkZXRhaWxlZCBzY2hlZHVsZSAoaXRlcmF0aXZlIG9yIGFuYWx5dGljYWwpCisgICAgfSBlbHNlIHsKKyAgICAgICAgcl9zY2hlZC5yX3NjaGVkX3R5cGUgPSBfX2ttcF9zY2hlZDsgIC8vIChTVEFUSUNfQ0hVTktFRCksIG9yIChEWU5BTUlDX0NIVU5LRUQpLCBvciBvdGhlcgorICAgIH0KKworICAgIGlmICggX19rbXBfY2h1bmsgPCBLTVBfREVGQVVMVF9DSFVOSyApIHsgLy8gX19rbXBfY2h1bmsgbWF5IGJlIHdyb25nIGhlcmUgKGlmIGl0IHdhcyBub3QgZXZlciBzZXQpCisgICAgICAgIHJfc2NoZWQuY2h1bmsgPSBLTVBfREVGQVVMVF9DSFVOSzsKKyAgICB9IGVsc2UgeworICAgICAgICByX3NjaGVkLmNodW5rID0gX19rbXBfY2h1bms7CisgICAgfQorCisgICAgcmV0dXJuIHJfc2NoZWQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworLyoKKyAqIEFsbG9jYXRlIChyZWFsbG9jID09IEZBTFNFKSAqIG9yIHJlYWxsb2NhdGUgKHJlYWxsb2MgPT0gVFJVRSkKKyAqIGF0IGxlYXN0IGFyZ2MgbnVtYmVyIG9mICp0X2FyZ3YgZW50cmllcyBmb3IgdGhlIHJlcXVlc3RlZCB0ZWFtLgorICovCitzdGF0aWMgdm9pZAorX19rbXBfYWxsb2NfYXJndl9lbnRyaWVzKCBpbnQgYXJnYywga21wX3RlYW1fdCAqdGVhbSwgaW50IHJlYWxsb2MgKQoreworCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSApOworICAgIGlmKCAhcmVhbGxvYyB8fCBhcmdjID4gdGVhbSAtPiB0LnRfbWF4X2FyZ2MgKSB7CisKKyAgICAgICAgS0FfVFJBQ0UoIDEwMCwgKCAiX19rbXBfYWxsb2NfYXJndl9lbnRyaWVzOiB0ZWFtICVkOiBuZWVkZWQgZW50cmllcz0lZCwgY3VycmVudCBlbnRyaWVzPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgYXJnYywgKCByZWFsbG9jICkgPyB0ZWFtLT50LnRfbWF4X2FyZ2MgOiAwICkpOworI2lmIChLTVBfUEVSRl9WMTA2ID09IEtNUF9PTikKKyAgICAgICAgLyogaWYgcHJldmlvdXNseSBhbGxvY2F0ZWQgaGVhcCBzcGFjZSBmb3IgYXJncywgZnJlZSB0aGVtICovCisgICAgICAgIGlmICggcmVhbGxvYyAmJiB0ZWFtIC0+IHQudF9hcmd2ICE9ICZ0ZWFtIC0+IHQudF9pbmxpbmVfYXJndlswXSApCisgICAgICAgICAgICBfX2ttcF9mcmVlKCAodm9pZCAqKSB0ZWFtIC0+IHQudF9hcmd2ICk7CisKKyAgICAgICAgaWYgKCBhcmdjIDw9IEtNUF9JTkxJTkVfQVJHVl9FTlRSSUVTICkgeworICAgICAgICAgICAgLyogdXNlIHVudXNlZCBzcGFjZSBpbiB0aGUgY2FjaGUgbGluZSBmb3IgYXJndW1lbnRzICovCisgICAgICAgICAgICB0ZWFtIC0+IHQudF9tYXhfYXJnYyA9IEtNUF9JTkxJTkVfQVJHVl9FTlRSSUVTOworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMCwgKCAiX19rbXBfYWxsb2NfYXJndl9lbnRyaWVzOiB0ZWFtICVkOiBpbmxpbmUgYWxsb2NhdGUgJWQgYXJndiBlbnRyaWVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIHRlYW0tPnQudF9tYXhfYXJnYyApKTsKKyAgICAgICAgICAgIHRlYW0gLT4gdC50X2FyZ3YgPSAmdGVhbSAtPiB0LnRfaW5saW5lX2FyZ3ZbMF07CisgICAgICAgICAgICBpZiAoIF9fa21wX3N0b3JhZ2VfbWFwICkgeworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIC0xLCAmdGVhbS0+dC50X2lubGluZV9hcmd2WzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVhbS0+dC50X2lubGluZV9hcmd2W0tNUF9JTkxJTkVfQVJHVl9FTlRSSUVTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVvZih2b2lkICopICogS01QX0lOTElORV9BUkdWX0VOVFJJRVMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVhbV8lZC50X2lubGluZV9hcmd2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBhbGxvY2F0ZSBzcGFjZSBmb3IgYXJndW1lbnRzIGluIHRoZSBoZWFwICovCisgICAgICAgICAgICB0ZWFtIC0+IHQudF9tYXhfYXJnYyA9ICggYXJnYyA8PSAoS01QX01JTl9NQUxMT0NfQVJHVl9FTlRSSUVTID4+IDEgKSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9NSU5fTUFMTE9DX0FSR1ZfRU5UUklFUyA6IDIgKiBhcmdjOworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMCwgKCAiX19rbXBfYWxsb2NfYXJndl9lbnRyaWVzOiB0ZWFtICVkOiBkeW5hbWljIGFsbG9jYXRlICVkIGFyZ3YgZW50cmllc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCB0ZWFtLT50LnRfbWF4X2FyZ2MgKSk7CisgICAgICAgICAgICB0ZWFtIC0+IHQudF9hcmd2ICAgICA9ICh2b2lkKiopIF9fa21wX3BhZ2VfYWxsb2NhdGUoIHNpemVvZih2b2lkKikgKiB0ZWFtLT50LnRfbWF4X2FyZ2MgKTsKKyAgICAgICAgICAgIGlmICggX19rbXBfc3RvcmFnZV9tYXAgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggLTEsICZ0ZWFtLT50LnRfYXJndlswXSwgJnRlYW0tPnQudF9hcmd2W3RlYW0tPnQudF9tYXhfYXJnY10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih2b2lkICopICogdGVhbS0+dC50X21heF9hcmdjLCAidGVhbV8lZC50X2FyZ3YiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2Vsc2UgLyogS01QX1BFUkZfVjEwNiA9PSBLTVBfT0ZGICovCisgICAgICAgIGlmICggcmVhbGxvYyApCisgICAgICAgICAgICBfX2ttcF9mcmVlKCAodm9pZCopIHRlYW0gLT4gdC50X2FyZ3YgKTsKKyAgICAgICAgdGVhbSAtPiB0LnRfbWF4X2FyZ2MgPSAoIGFyZ2MgPD0gKEtNUF9NSU5fTUFMTE9DX0FSR1ZfRU5UUklFUyA+PiAxICkpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX01JTl9NQUxMT0NfQVJHVl9FTlRSSUVTIDogMiAqIGFyZ2M7CisgICAgICAgIEtBX1RSQUNFKCAxMDAsICggIl9fa21wX2FsbG9jX2FyZ3ZfZW50cmllczogdGVhbSAlZDogZHluYW1pYyBhbGxvY2F0ZSAlZCBhcmd2IGVudHJpZXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCB0ZWFtLT50LnRfbWF4X2FyZ2MgKSk7CisgICAgICAgIHRlYW0gLT4gdC50X2FyZ3YgICAgID0gX19rbXBfcGFnZV9hbGxvY2F0ZSggc2l6ZW9mKHZvaWQqKSAqIHRlYW0tPnQudF9tYXhfYXJnYyApOworICAgICAgICBpZiAoIF9fa21wX3N0b3JhZ2VfbWFwICkgeworICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggLTEsICZ0ZWFtLT50LnRfYXJndlswXSwgJnRlYW0tPnQudF9hcmd2W3RlYW0tPnQudF9tYXhfYXJnY10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHZvaWQgKikgKiB0ZWFtLT50LnRfbWF4X2FyZ2MsICJ0ZWFtXyVkLnRfYXJndiIsIHRlYW0tPnQudF9pZCApOworICAgICAgICB9CisjZW5kaWYgLyogS01QX1BFUkZfVjEwNiAqLworCisgICAgfQorfQorCitzdGF0aWMgdm9pZAorX19rbXBfYWxsb2NhdGVfdGVhbV9hcnJheXMoa21wX3RlYW1fdCAqdGVhbSwgaW50IG1heF9udGgpCit7CisgICAgaW50IGk7CisgICAgaW50IG51bV9kaXNwX2J1ZmYgPSBtYXhfbnRoID4gMSA/IEtNUF9NQVhfRElTUF9CVUYgOiAyOworI2lmIEtNUF9VU0VfUE9PTEVEX0FMTE9DCisgICAgLy8gQUM6IFRPRE86IGZpeCBidWcgaGVyZTogc2l6ZSBvZiB0X2Rpc3BfYnVmZmVyIHNob3VsZCBub3QgYmUgbXVsdGlwbGllZCBieSBtYXhfbnRoIQorICAgIGNoYXIgKnB0ciA9IF9fa21wX2FsbG9jYXRlKG1heF9udGggKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICggc2l6ZW9mKGttcF9pbmZvX3QqKSArIHNpemVvZihkaXNwYXRjaF9zaGFyZWRfaW5mb190KSpudW1fZGlzcF9idWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZihrbXBfZGlzcF90KSArIHNpemVvZihpbnQpKjYKKyMgIGlmIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8rIHNpemVvZihpbnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2Yoa21wX3Jfc2NoZWRfdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZihrbXBfdGFza2RhdGFfdCkKKyMgIGVuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgICAgICAgICAgICAgICApICAgICApOworCisgICAgdGVhbSAtPiB0LnRfdGhyZWFkcyAgICAgICAgICA9IChrbXBfaW5mb190KiopIHB0cjsgcHRyICs9IHNpemVvZihrbXBfaW5mb190KikgKiBtYXhfbnRoOworICAgIHRlYW0gLT4gdC50X2Rpc3BfYnVmZmVyICAgICAgPSAoZGlzcGF0Y2hfc2hhcmVkX2luZm9fdCopIHB0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyICs9IHNpemVvZihkaXNwYXRjaF9zaGFyZWRfaW5mb190KSAqIG51bV9kaXNwX2J1ZmY7CisgICAgdGVhbSAtPiB0LnRfZGlzcGF0Y2ggICAgICAgICA9IChrbXBfZGlzcF90KikgcHRyOyBwdHIgKz0gc2l6ZW9mKGttcF9kaXNwX3QpICogbWF4X250aDsKKyAgICB0ZWFtIC0+IHQudF9zZXRfbnByb2MgICAgICAgID0gKGludCopIHB0cjsgcHRyICs9IHNpemVvZihpbnQpICogbWF4X250aDsKKyAgICB0ZWFtIC0+IHQudF9zZXRfZHluYW1pYyAgICAgID0gKGludCopIHB0cjsgcHRyICs9IHNpemVvZihpbnQpICogbWF4X250aDsKKyAgICB0ZWFtIC0+IHQudF9zZXRfbmVzdGVkICAgICAgID0gKGludCopIHB0cjsgcHRyICs9IHNpemVvZihpbnQpICogbWF4X250aDsKKyAgICB0ZWFtIC0+IHQudF9zZXRfYmxvY2t0aW1lICAgID0gKGludCopIHB0cjsgcHRyICs9IHNpemVvZihpbnQpICogbWF4X250aDsKKyAgICB0ZWFtIC0+IHQudF9zZXRfYnRfaW50ZXJ2YWxzID0gKGludCopIHB0cjsgcHRyICs9IHNpemVvZihpbnQpICogbWF4X250aDsKKyAgICB0ZWFtIC0+IHQudF9zZXRfYnRfc2V0ICAgICAgID0gKGludCopIHB0cjsKKyMgIGlmIE9NUF8zMF9FTkFCTEVECisgICAgcHRyICs9IHNpemVvZihpbnQpICogbWF4X250aDsKKyAgICAvL3RlYW0gLT4gdC50X3NldF9tYXhfYWN0aXZlX2xldmVscyA9IChpbnQqKSBwdHI7IHB0ciArPSBzaXplb2YoaW50KSAqIG1heF9udGg7CisgICAgdGVhbSAtPiB0LnRfc2V0X3NjaGVkICAgICAgICA9IChrbXBfcl9zY2hlZF90KikgcHRyOworICAgIHB0ciArPSBzaXplb2Yoa21wX3Jfc2NoZWRfdCkgKiBtYXhfbnRoOworICAgIHRlYW0gLT4gdC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGEgPSAoa21wX3Rhc2tkYXRhX3QqKSBwdHI7CisgICAgcHRyICs9IHNpemVvZihrbXBfdGFza2RhdGFfdCkgKiBtYXhfbnRoOworIyAgZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKyNlbHNlCisKKyAgICB0ZWFtIC0+IHQudF90aHJlYWRzID0gKGttcF9pbmZvX3QqKikgX19rbXBfYWxsb2NhdGUoIHNpemVvZihrbXBfaW5mb190KikgKiBtYXhfbnRoICk7CisgICAgdGVhbSAtPiB0LnRfZGlzcF9idWZmZXIgPSAoZGlzcGF0Y2hfc2hhcmVkX2luZm9fdCopCisgICAgICAgIF9fa21wX2FsbG9jYXRlKCBzaXplb2YoZGlzcGF0Y2hfc2hhcmVkX2luZm9fdCkgKiBudW1fZGlzcF9idWZmICk7CisgICAgdGVhbSAtPiB0LnRfZGlzcGF0Y2ggPSAoa21wX2Rpc3BfdCopIF9fa21wX2FsbG9jYXRlKCBzaXplb2Yoa21wX2Rpc3BfdCkgKiBtYXhfbnRoICk7CisgICAgI2lmIE9NUF8zMF9FTkFCTEVECisgICAgLy90ZWFtIC0+IHQudF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMgPSAoaW50KikgX19rbXBfYWxsb2NhdGUoIHNpemVvZihpbnQpICogbWF4X250aCApOworICAgIC8vdGVhbSAtPiB0LnRfc2V0X3NjaGVkID0gKGttcF9yX3NjaGVkX3QqKSBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKGttcF9yX3NjaGVkX3QpICogbWF4X250aCApOworICAgIHRlYW0gLT4gdC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGEgPSAoa21wX3Rhc2tkYXRhX3QqKSBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKGttcF90YXNrZGF0YV90KSAqIG1heF9udGggKTsKKyAgICAjZWxzZQorICAgIHRlYW0gLT4gdC50X3NldF9ucHJvYyA9IChpbnQqKSBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKGludCkgKiBtYXhfbnRoICk7CisgICAgdGVhbSAtPiB0LnRfc2V0X2R5bmFtaWMgPSAoaW50KikgX19rbXBfYWxsb2NhdGUoIHNpemVvZihpbnQpICogbWF4X250aCApOworICAgIHRlYW0gLT4gdC50X3NldF9uZXN0ZWQgPSAoaW50KikgX19rbXBfYWxsb2NhdGUoIHNpemVvZihpbnQpICogbWF4X250aCApOworICAgIHRlYW0gLT4gdC50X3NldF9ibG9ja3RpbWUgPSAoaW50KikgX19rbXBfYWxsb2NhdGUoIHNpemVvZihpbnQpICogbWF4X250aCApOworICAgIHRlYW0gLT4gdC50X3NldF9idF9pbnRlcnZhbHMgPSAoaW50KikgX19rbXBfYWxsb2NhdGUoIHNpemVvZihpbnQpICogbWF4X250aCApOworICAgIHRlYW0gLT4gdC50X3NldF9idF9zZXQgPSAoaW50KikgX19rbXBfYWxsb2NhdGUoIHNpemVvZihpbnQpICogbWF4X250aCApOworIyAgZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKyNlbmRpZgorICAgIHRlYW0tPnQudF9tYXhfbnByb2MgPSBtYXhfbnRoOworCisgICAgLyogc2V0dXAgZGlzcGF0Y2ggYnVmZmVycyAqLworICAgIGZvcihpID0gMCA7IGkgPCBudW1fZGlzcF9idWZmOyArK2kpCisgICAgICAgIHRlYW0gLT4gdC50X2Rpc3BfYnVmZmVyW2ldLmJ1ZmZlcl9pbmRleCA9IGk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9mcmVlX3RlYW1fYXJyYXlzKGttcF90ZWFtX3QgKnRlYW0pIHsKKyAgICAvKiBOb3RlOiB0aGlzIGRvZXMgbm90IGZyZWUgdGhlIHRocmVhZHMgaW4gdF90aHJlYWRzIChfX2ttcF9mcmVlX3RocmVhZHMpICovCisgICAgaW50IGk7CisgICAgZm9yICggaSA9IDA7IGkgPCB0ZWFtLT50LnRfbWF4X25wcm9jOyArKyBpICkgeworICAgICAgICBpZiAoIHRlYW0tPnQudF9kaXNwYXRjaFsgaSBdLnRoX2Rpc3BfYnVmZmVyICE9IE5VTEwgKSB7CisgICAgICAgICAgICBfX2ttcF9mcmVlKCB0ZWFtLT50LnRfZGlzcGF0Y2hbIGkgXS50aF9kaXNwX2J1ZmZlciApOworICAgICAgICAgICAgdGVhbS0+dC50X2Rpc3BhdGNoWyBpIF0udGhfZGlzcF9idWZmZXIgPSBOVUxMOworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGZvcgorICAgIF9fa21wX2ZyZWUodGVhbS0+dC50X3RocmVhZHMpOworICAgICNpZiAhS01QX1VTRV9QT09MRURfQUxMT0MKKyAgICAgICAgX19rbXBfZnJlZSh0ZWFtLT50LnRfZGlzcF9idWZmZXIpOworICAgICAgICBfX2ttcF9mcmVlKHRlYW0tPnQudF9kaXNwYXRjaCk7CisgICAgICAgICNpZiBPTVBfMzBfRU5BQkxFRAorICAgICAgICAvL19fa21wX2ZyZWUodGVhbS0+dC50X3NldF9tYXhfYWN0aXZlX2xldmVscyk7CisgICAgICAgIC8vX19rbXBfZnJlZSh0ZWFtLT50LnRfc2V0X3NjaGVkKTsKKyAgICAgICAgX19rbXBfZnJlZSh0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YSk7CisgICAgICAgICNlbHNlCisgICAgICAgIF9fa21wX2ZyZWUodGVhbS0+dC50X3NldF9ucHJvYyk7CisgICAgICAgIF9fa21wX2ZyZWUodGVhbS0+dC50X3NldF9keW5hbWljKTsKKyAgICAgICAgX19rbXBfZnJlZSh0ZWFtLT50LnRfc2V0X25lc3RlZCk7CisgICAgICAgIF9fa21wX2ZyZWUodGVhbS0+dC50X3NldF9ibG9ja3RpbWUpOworICAgICAgICBfX2ttcF9mcmVlKHRlYW0tPnQudF9zZXRfYnRfaW50ZXJ2YWxzKTsKKyAgICAgICAgX19rbXBfZnJlZSh0ZWFtLT50LnRfc2V0X2J0X3NldCk7CisgICAgIyAgZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKyAgICAjZW5kaWYKKyAgICB0ZWFtLT50LnRfdGhyZWFkcyAgICAgPSBOVUxMOworICAgIHRlYW0tPnQudF9kaXNwX2J1ZmZlciA9IE5VTEw7CisgICAgdGVhbS0+dC50X2Rpc3BhdGNoICAgID0gTlVMTDsKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgIC8vdGVhbS0+dC50X3NldF9zY2hlZCAgID0gMDsKKyAgICAvL3RlYW0tPnQudF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMgPSAwOworICAgIHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhID0gMDsKKyNlbHNlCisgICAgdGVhbS0+dC50X3NldF9ucHJvYyAgID0gMDsKKyAgICB0ZWFtLT50LnRfc2V0X2R5bmFtaWMgPSAwOworICAgIHRlYW0tPnQudF9zZXRfbmVzdGVkICA9IDA7CisgICAgdGVhbS0+dC50X3NldF9ibG9ja3RpbWUgICA9IDA7CisgICAgdGVhbS0+dC50X3NldF9idF9pbnRlcnZhbHMgPSAwOworICAgIHRlYW0tPnQudF9zZXRfYnRfc2V0ICA9IDA7CisjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKK30KKworc3RhdGljIHZvaWQKK19fa21wX3JlYWxsb2NhdGVfdGVhbV9hcnJheXMoa21wX3RlYW1fdCAqdGVhbSwgaW50IG1heF9udGgpIHsKKyAgICBrbXBfaW5mb190ICoqb2xkVGhyZWFkcyA9IHRlYW0tPnQudF90aHJlYWRzOworCisgICAgI2lmICFLTVBfVVNFX1BPT0xFRF9BTExPQworICAgICAgICBfX2ttcF9mcmVlKHRlYW0tPnQudF9kaXNwX2J1ZmZlcik7CisgICAgICAgIF9fa21wX2ZyZWUodGVhbS0+dC50X2Rpc3BhdGNoKTsKKyAgICAgICAgI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgIC8vX19rbXBfZnJlZSh0ZWFtLT50LnRfc2V0X21heF9hY3RpdmVfbGV2ZWxzKTsKKyAgICAgICAgLy9fX2ttcF9mcmVlKHRlYW0tPnQudF9zZXRfc2NoZWQpOworICAgICAgICBfX2ttcF9mcmVlKHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhKTsKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgX19rbXBfZnJlZSh0ZWFtLT50LnRfc2V0X25wcm9jKTsKKyAgICAgICAgX19rbXBfZnJlZSh0ZWFtLT50LnRfc2V0X2R5bmFtaWMpOworICAgICAgICBfX2ttcF9mcmVlKHRlYW0tPnQudF9zZXRfbmVzdGVkKTsKKyAgICAgICAgX19rbXBfZnJlZSh0ZWFtLT50LnRfc2V0X2Jsb2NrdGltZSk7CisgICAgICAgIF9fa21wX2ZyZWUodGVhbS0+dC50X3NldF9idF9pbnRlcnZhbHMpOworICAgICAgICBfX2ttcF9mcmVlKHRlYW0tPnQudF9zZXRfYnRfc2V0KTsKKyAgICAjICBlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorICAgICNlbmRpZgorICAgIF9fa21wX2FsbG9jYXRlX3RlYW1fYXJyYXlzKHRlYW0sIG1heF9udGgpOworCisgICAgbWVtY3B5KHRlYW0tPnQudF90aHJlYWRzLCBvbGRUaHJlYWRzLCB0ZWFtLT50LnRfbnByb2MgKiBzaXplb2YgKGttcF9pbmZvX3QqKSk7CisKKyAgICBfX2ttcF9mcmVlKG9sZFRocmVhZHMpOworfQorCitzdGF0aWMga21wX2ludGVybmFsX2NvbnRyb2xfdAorX19rbXBfZ2V0X2dsb2JhbF9pY3ZzKCB2b2lkICkgeworCisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICBrbXBfcl9zY2hlZF90IHJfc2NoZWQgPSBfX2ttcF9nZXRfc2NoZWR1bGVfZ2xvYmFsKCk7IC8vIGdldCBjdXJyZW50IHN0YXRlIG9mIHNjaGVkdWxpbmcgZ2xvYmFscworI2VuZGlmIC8qIE9NUF8zMF9FTkFCTEVEICovCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQudXNlZCA+IDAgKTsKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisgICAga21wX2ludGVybmFsX2NvbnRyb2xfdCBnX2ljdnMgPSB7CisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ludCBzZXJpYWxfbmVzdGluZ19sZXZlbDsgLy9jb3JyZXNwb25kcyB0byB0aGUgdmFsdWUgb2YgdGhlIHRoX3RlYW1fc2VyaWFsaXplZCBmaWVsZAorICAgICAgX19rbXBfZGZsdF9uZXN0ZWQsICAgICAgICAgICAgLy9pbnQgbmVzdGVkOyAgICAgICAgICAgICAgIC8vaW50ZXJuYWwgY29udHJvbCBmb3IgbmVzdGVkIHBhcmFsbGVsaXNtIChwZXIgdGhyZWFkKQorICAgICAgX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaW50ZXJuYWwgY29udHJvbCBmb3IgZHluYW1pYyBhZGp1c3RtZW50IG9mIHRocmVhZHMgKHBlciB0aHJlYWQpCisgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pbnQgbnByb2M7ICAgICAgICAgICAgICAgIC8vaW50ZXJuYWwgY29udHJvbCBmb3IgIyBvZiB0aHJlYWRzIGZvciBuZXh0IHBhcmFsbGVsIHJlZ2lvbiAocGVyIHRocmVhZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICh1c2UgYSBtYXggdWIgb24gdmFsdWUgaWYgX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSBub3QgY2FsbGVkIHlldCkKKyAgICAgIF9fa21wX2RmbHRfYmxvY2t0aW1lLCAgICAgICAgIC8vaW50IGJsb2NrdGltZTsgICAgICAgICAgICAvL2ludGVybmFsIGNvbnRyb2wgZm9yIGJsb2NrdGltZQorICAgICAgX19rbXBfYnRfaW50ZXJ2YWxzLCAgICAgICAgICAgLy9pbnQgYnRfaW50ZXJ2YWxzOyAgICAgICAgIC8vaW50ZXJuYWwgY29udHJvbCBmb3IgYmxvY2t0aW1lIGludGVydmFscworICAgICAgX19rbXBfZW52X2Jsb2NrdGltZSwgICAgICAgICAgLy9pbnQgYnRfc2V0OyAgICAgICAgICAgICAgIC8vaW50ZXJuYWwgY29udHJvbCBmb3Igd2hldGhlciBibG9ja3RpbWUgaXMgZXhwbGljaXRseSBzZXQKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgICAgX19rbXBfZGZsdF9tYXhfYWN0aXZlX2xldmVscywgLy9pbnQgbWF4X2FjdGl2ZV9sZXZlbHM7ICAgIC8vaW50ZXJuYWwgY29udHJvbCBmb3IgbWF4X2FjdGl2ZV9sZXZlbHMKKyAgICAgIHJfc2NoZWQsICAgICAgICAgICAgICAgICAgICAgIC8va21wX3Jfc2NoZWRfdCBzY2hlZDsgICAgICAvL2ludGVybmFsIGNvbnRyb2wgZm9yIHJ1bnRpbWUgc2NoZWR1bGUge3NjaGVkLGNodW5rfSBwYWlyCisjZW5kaWYgLyogT01QXzMwX0VOQUJMRUQgKi8KKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdLAorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgICBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAvL3N0cnVjdCBrbXBfaW50ZXJuYWxfY29udHJvbCAqbmV4dDsKKyAgICB9OworCisgICAgcmV0dXJuIGdfaWN2czsKK30KKworc3RhdGljIGttcF9pbnRlcm5hbF9jb250cm9sX3QKK19fa21wX2dldF94X2dsb2JhbF9pY3ZzKCBjb25zdCBrbXBfdGVhbV90ICp0ZWFtICkgeworCisgICAgI2lmIE9NUF8zMF9FTkFCTEVECisgICAga21wX2ludGVybmFsX2NvbnRyb2xfdCBneF9pY3ZzOworICAgIGd4X2ljdnMuc2VyaWFsX25lc3RpbmdfbGV2ZWwgPSAwOyAvLyBwcm9iYWJseSA9dGVhbS0+dC50X3NlcmlhbCBsaWtlIGluIHNhdmVfaW50ZXJfY29udHJvbHMKKyAgICBjb3B5X2ljdnMoICYgZ3hfaWN2cywgJiB0ZWFtLT50LnRfdGhyZWFkc1swXS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzICk7CisgICAgZ3hfaWN2cy5uZXh0ID0gTlVMTDsKKyAgICAjZWxzZQorICAgIGttcF9pbnRlcm5hbF9jb250cm9sX3QgZ3hfaWN2cyA9CisgICAgeworICAgICAgMCwKKyAgICAgIHRlYW0tPnQudF9zZXRfbmVzdGVkWzBdLAorICAgICAgdGVhbS0+dC50X3NldF9keW5hbWljWzBdLAorICAgICAgdGVhbS0+dC50X3NldF9ucHJvY1swXSwKKyAgICAgIHRlYW0tPnQudF9zZXRfYmxvY2t0aW1lWzBdLAorICAgICAgdGVhbS0+dC50X3NldF9idF9pbnRlcnZhbHNbMF0sCisgICAgICB0ZWFtLT50LnRfc2V0X2J0X3NldFswXSwKKyAgICAgIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vc3RydWN0IGttcF9pbnRlcm5hbF9jb250cm9sICpuZXh0OworICAgIH07CisgICAgI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisKKyAgICByZXR1cm4gZ3hfaWN2czsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2luaXRpYWxpemVfcm9vdCgga21wX3Jvb3RfdCAqcm9vdCApCit7CisgICAgaW50ICAgICAgICAgICBmOworICAgIGttcF90ZWFtX3QgICAqcm9vdF90ZWFtOworICAgIGttcF90ZWFtX3QgICAqaG90X3RlYW07CisgICAgc2l6ZV90ICAgICAgICBkaXNwX3NpemUsIGRpc3BhdGNoX3NpemUsIGJhcl9zaXplOworICAgIGludCAgICAgICAgICAgaG90X3RlYW1fbWF4X250aDsKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgIGttcF9yX3NjaGVkX3Qgcl9zY2hlZCA9IF9fa21wX2dldF9zY2hlZHVsZV9nbG9iYWwoKTsgLy8gZ2V0IGN1cnJlbnQgc3RhdGUgb2Ygc2NoZWR1bGluZyBnbG9iYWxzCisgICAga21wX2ludGVybmFsX2NvbnRyb2xfdCByX2ljdnMgPSBfX2ttcF9nZXRfZ2xvYmFsX2ljdnMoKTsKKyNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorICAgIEtNUF9ERUJVR19BU1NFUlQoIHJvb3QgKTsKKyAgICBLTVBfQVNTRVJUKCAhIHJvb3QtPnIucl9iZWdpbiApOworCisgICAgLyogc2V0dXAgdGhlIHJvb3Qgc3RhdGUgc3RydWN0dXJlICovCisgICAgX19rbXBfaW5pdF9sb2NrKCAmcm9vdC0+ci5yX2JlZ2luX2xvY2sgKTsKKyAgICByb290IC0+IHIucl9iZWdpbiAgICAgICAgPSBGQUxTRTsKKyAgICByb290IC0+IHIucl9hY3RpdmUgICAgICAgPSBGQUxTRTsKKyAgICByb290IC0+IHIucl9pbl9wYXJhbGxlbCAgPSAwOworICAgIHJvb3QgLT4gci5yX2Jsb2NrdGltZSAgICA9IF9fa21wX2RmbHRfYmxvY2t0aW1lOworICAgIHJvb3QgLT4gci5yX25lc3RlZCAgICAgICA9IF9fa21wX2RmbHRfbmVzdGVkOworCisgICAgLyogc2V0dXAgdGhlIHJvb3QgdGVhbSBmb3IgdGhpcyB0YXNrICovCisgICAgLyogYWxsb2NhdGUgdGhlIHJvb3QgdGVhbSBzdHJ1Y3R1cmUgKi8KKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX2luaXRpYWxpemVfcm9vdDogYmVmb3JlIHJvb3RfdGVhbVxuIiApICk7CisgICAgcm9vdF90ZWFtID0KKyAgICAgICAgX19rbXBfYWxsb2NhdGVfdGVhbSgKKyAgICAgICAgICAgIHJvb3QsCisgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ld19ucHJvYworICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXhfbnByb2MKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdLAorI2VuZGlmCisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgICAgICAgICZyX2ljdnMsCisjZWxzZQorICAgICAgICAgICAgX19rbXBfZGZsdF90ZWFtX250aF91YiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBudW1fdHJlYWRzCisgICAgICAgICAgICBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGR5bmFtaWMKKyAgICAgICAgICAgIF9fa21wX2RmbHRfbmVzdGVkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVzdGVkCisgICAgICAgICAgICBfX2ttcF9kZmx0X2Jsb2NrdGltZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJsb2NrdGltZQorICAgICAgICAgICAgX19rbXBfYnRfaW50ZXJ2YWxzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidF9pbnRlcnZhbHMKKyAgICAgICAgICAgIF9fa21wX2Vudl9ibG9ja3RpbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnRfc2V0CisjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKyAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJnYworICAgICAgICApOworCisgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9pbml0aWFsaXplX3Jvb3Q6IGFmdGVyIHJvb3RfdGVhbSA9ICVwXG4iLCByb290X3RlYW0gKSApOworCisgICAgcm9vdCAtPiByLnJfcm9vdF90ZWFtID0gcm9vdF90ZWFtOworICAgIHJvb3RfdGVhbSAtPiB0LnRfY29udHJvbF9zdGFja190b3AgPSBOVUxMOworCisgICAgLyogaW5pdGlhbGl6ZSByb290IHRlYW0gKi8KKyAgICByb290X3RlYW0gLT4gdC50X3RocmVhZHNbMF0gPSBOVUxMOworICAgIHJvb3RfdGVhbSAtPiB0LnRfbnByb2MgICAgICA9IDE7CisgICAgcm9vdF90ZWFtIC0+IHQudF9zZXJpYWxpemVkID0gMTsKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgIC8vIFRPRE8/Pz86IHJvb3RfdGVhbSAtPiB0LnRfbWF4X2FjdGl2ZV9sZXZlbHMgPSBfX2ttcF9kZmx0X21heF9hY3RpdmVfbGV2ZWxzOworICAgIHJvb3RfdGVhbSAtPiB0LnRfc2NoZWQucl9zY2hlZF90eXBlID0gcl9zY2hlZC5yX3NjaGVkX3R5cGU7CisgICAgcm9vdF90ZWFtIC0+IHQudF9zY2hlZC5jaHVuayAgICAgICAgPSByX3NjaGVkLmNodW5rOworI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2luaXRpYWxpemVfcm9vdDogaW5pdCByb290IHRlYW0gJWQgYXJyaXZlZDogam9pbj0ldSwgcGxhaW49JXVcbiIsCisgICAgICAgICAgICAgICAgICAgIHJvb3RfdGVhbS0+dC50X2lkLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFICkpOworCisgICAgLyogc2V0dXAgdGhlICBob3QgdGVhbSBmb3IgdGhpcyB0YXNrICovCisgICAgLyogYWxsb2NhdGUgdGhlIGhvdCB0ZWFtIHN0cnVjdHVyZSAqLworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfaW5pdGlhbGl6ZV9yb290OiBiZWZvcmUgaG90X3RlYW1cbiIgKSApOworICAgIGhvdF90ZWFtID0KKyAgICAgICAgX19rbXBfYWxsb2NhdGVfdGVhbSgKKyAgICAgICAgICAgIHJvb3QsCisgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ld19ucHJvYworICAgICAgICAgICAgX19rbXBfZGZsdF90ZWFtX250aF91YiAqIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXhfbnByb2MKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdLAorI2VuZGlmCisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgICAgICAgICZyX2ljdnMsCisjZWxzZQorICAgICAgICAgICAgX19rbXBfZGZsdF90ZWFtX250aF91YiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBudW1fdHJlYWRzCisgICAgICAgICAgICBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGR5bmFtaWMKKyAgICAgICAgICAgIF9fa21wX2RmbHRfbmVzdGVkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVzdGVkCisgICAgICAgICAgICBfX2ttcF9kZmx0X2Jsb2NrdGltZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJsb2NrdGltZQorICAgICAgICAgICAgX19rbXBfYnRfaW50ZXJ2YWxzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidF9pbnRlcnZhbHMKKyAgICAgICAgICAgIF9fa21wX2Vudl9ibG9ja3RpbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnRfc2V0CisjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKyAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJnYworICAgICAgICApOworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfaW5pdGlhbGl6ZV9yb290OiBhZnRlciBob3RfdGVhbSA9ICVwXG4iLCBob3RfdGVhbSApICk7CisKKyAgICByb290IC0+IHIucl9ob3RfdGVhbSA9IGhvdF90ZWFtOworICAgIHJvb3RfdGVhbSAtPiB0LnRfY29udHJvbF9zdGFja190b3AgPSBOVUxMOworCisgICAgLyogZmlyc3QtdGltZSBpbml0aWFsaXphdGlvbiAqLworICAgIGhvdF90ZWFtIC0+IHQudF9wYXJlbnQgPSByb290X3RlYW07CisKKyAgICAvKiBpbml0aWFsaXplIGhvdCB0ZWFtICovCisgICAgaG90X3RlYW1fbWF4X250aCA9IGhvdF90ZWFtLT50LnRfbWF4X25wcm9jOworICAgIGZvciAoIGYgPSAwOyBmIDwgaG90X3RlYW1fbWF4X250aDsgKysgZiApIHsKKyAgICAgICAgaG90X3RlYW0gLT4gdC50X3RocmVhZHNbIGYgXSA9IE5VTEw7CisgICAgfTsgLy8gZm9yCisgICAgaG90X3RlYW0gLT4gdC50X25wcm9jID0gMTsKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgIC8vIFRPRE8/Pz86IGhvdF90ZWFtIC0+IHQudF9tYXhfYWN0aXZlX2xldmVscyA9IF9fa21wX2RmbHRfbWF4X2FjdGl2ZV9sZXZlbHM7CisgICAgaG90X3RlYW0gLT4gdC50X3NjaGVkLnJfc2NoZWRfdHlwZSA9IHJfc2NoZWQucl9zY2hlZF90eXBlOworICAgIGhvdF90ZWFtIC0+IHQudF9zY2hlZC5jaHVuayAgICAgICAgPSByX3NjaGVkLmNodW5rOworI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisjaWYgS01QX01JQworICAgIGhvdF90ZWFtIC0+IHQudF9zaXplX2NoYW5nZWQgPSAwOworI2VuZGlmCisKK30KKworI2lmZGVmIEtNUF9ERUJVRworCisKK3R5cGVkZWYgc3RydWN0IGttcF90ZWFtX2xpc3RfaXRlbSB7CisgICAga21wX3RlYW1fcCBjb25zdCAqICAgICAgICAgICBlbnRyeTsKKyAgICBzdHJ1Y3Qga21wX3RlYW1fbGlzdF9pdGVtICogIG5leHQ7Cit9IGttcF90ZWFtX2xpc3RfaXRlbV90OwordHlwZWRlZiBrbXBfdGVhbV9saXN0X2l0ZW1fdCAqIGttcF90ZWFtX2xpc3RfdDsKKworCitzdGF0aWMgdm9pZAorX19rbXBfcHJpbnRfc3RydWN0dXJlX3RlYW1fYWNjdW0oICAgIC8vIEFkZCB0ZWFtIHRvIGxpc3Qgb2YgdGVhbXMuCisgICAga21wX3RlYW1fbGlzdF90ICAgICBsaXN0LCAgICAgICAgLy8gTGlzdCBvZiB0ZWFtcy4KKyAgICBrbXBfdGVhbV9wIGNvbnN0ICogIHRlYW0gICAgICAgICAvLyBUZWFtIHRvIGFkZC4KKykgeworCisgICAgLy8gTGlzdCBtdXN0IHRlcm1pbmF0ZSB3aXRoIGl0ZW0gd2hlcmUgYm90aCBlbnRyeSBhbmQgbmV4dCBhcmUgTlVMTC4KKyAgICAvLyBUZWFtIGlzIGFkZGVkIHRvIHRoZSBsaXN0IG9ubHkgb25jZS4KKyAgICAvLyBMaXN0IGlzIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIgYnkgdGVhbSBpZC4KKyAgICAvLyBUZWFtIGlkIGlzICpub3QqIGEga2V5LgorCisgICAga21wX3RlYW1fbGlzdF90IGw7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBsaXN0ICE9IE5VTEwgKTsKKyAgICBpZiAoIHRlYW0gPT0gTlVMTCApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisKKyAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGVhbV9hY2N1bSggbGlzdCwgdGVhbS0+dC50X3BhcmVudCApOworICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90ZWFtX2FjY3VtKCBsaXN0LCB0ZWFtLT50LnRfbmV4dF9wb29sICk7CisKKyAgICAvLyBTZWFyY2ggbGlzdCBmb3IgdGhlIHRlYW0uCisgICAgbCA9IGxpc3Q7CisgICAgd2hpbGUgKCBsLT5uZXh0ICE9IE5VTEwgJiYgbC0+ZW50cnkgIT0gdGVhbSApIHsKKyAgICAgICAgbCA9IGwtPm5leHQ7CisgICAgfTsgLy8gd2hpbGUKKyAgICBpZiAoIGwtPm5leHQgIT0gTlVMTCApIHsKKyAgICAgICAgcmV0dXJuOyAgLy8gVGVhbSBoYXMgYmVlbiBhZGRlZCBiZWZvcmUsIGV4aXQuCisgICAgfTsgLy8gaWYKKworICAgIC8vIFRlYW0gaXMgbm90IGZvdW5kLiBTZWFyY2ggbGlzdCBhZ2FpbiBmb3IgaW5zZXJ0aW9uIHBvaW50LgorICAgIGwgPSBsaXN0OworICAgIHdoaWxlICggbC0+bmV4dCAhPSBOVUxMICYmIGwtPmVudHJ5LT50LnRfaWQgPD0gdGVhbS0+dC50X2lkICkgeworICAgICAgICBsID0gbC0+bmV4dDsKKyAgICB9OyAvLyB3aGlsZQorCisgICAgLy8gSW5zZXJ0IHRlYW0uCisgICAgeworICAgICAgICBrbXBfdGVhbV9saXN0X2l0ZW1fdCAqIGl0ZW0gPQorICAgICAgICAgICAgKGttcF90ZWFtX2xpc3RfaXRlbV90ICopS01QX0lOVEVSTkFMX01BTExPQyggc2l6ZW9mKCAga21wX3RlYW1fbGlzdF9pdGVtX3QgKSApOworICAgICAgICAqIGl0ZW0gPSAqIGw7CisgICAgICAgIGwtPmVudHJ5ID0gdGVhbTsKKyAgICAgICAgbC0+bmV4dCAgPSBpdGVtOworICAgIH0KKworfQorCitzdGF0aWMgdm9pZAorX19rbXBfcHJpbnRfc3RydWN0dXJlX3RlYW0oCisgICAgY2hhciBjb25zdCAqICAgICAgIHRpdGxlLAorICAgIGttcF90ZWFtX3AgY29uc3QgKiB0ZWFtCisKKykgeworICAgIF9fa21wX3ByaW50ZiggIiVzIiwgdGl0bGUgKTsKKyAgICBpZiAoIHRlYW0gIT0gTlVMTCApIHsKKyAgICAgICAgX19rbXBfcHJpbnRmKCAiJTJ4ICVwXG4iLCB0ZWFtLT50LnRfaWQsIHRlYW0gKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9wcmludGYoICIgLSAobmlsKVxuIiApOworICAgIH07IC8vIGlmCit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGhyZWFkKAorICAgIGNoYXIgY29uc3QgKiAgICAgICB0aXRsZSwKKyAgICBrbXBfaW5mb19wIGNvbnN0ICogdGhyZWFkCisKKykgeworICAgIF9fa21wX3ByaW50ZiggIiVzIiwgdGl0bGUgKTsKKyAgICBpZiAoIHRocmVhZCAhPSBOVUxMICkgeworICAgICAgICBfX2ttcF9wcmludGYoICIlMmQgJXBcbiIsIHRocmVhZC0+dGgudGhfaW5mby5kcy5kc19ndGlkLCB0aHJlYWQgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9wcmludGYoICIgLSAobmlsKVxuIiApOworICAgIH07IC8vIGlmCit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9wcmludF9zdHJ1Y3R1cmUoCisgICAgdm9pZAorKSB7CisKKyAgICBrbXBfdGVhbV9saXN0X3QgbGlzdDsKKworICAgIC8vIEluaXRpYWxpemUgbGlzdCBvZiB0ZWFtcy4KKyAgICBsaXN0ID0gKGttcF90ZWFtX2xpc3RfaXRlbV90ICopS01QX0lOVEVSTkFMX01BTExPQyggc2l6ZW9mKCBrbXBfdGVhbV9saXN0X2l0ZW1fdCApICk7CisgICAgbGlzdC0+ZW50cnkgPSBOVUxMOworICAgIGxpc3QtPm5leHQgID0gTlVMTDsKKworICAgIF9fa21wX3ByaW50ZiggIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5HbG9iYWwgVGhyZWFkIFRhYmxlXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIgKTsKKyAgICB7CisgICAgICAgIGludCBndGlkOworICAgICAgICBmb3IgKCBndGlkID0gMDsgZ3RpZCA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7ICsrIGd0aWQgKSB7CisgICAgICAgICAgICBfX2ttcF9wcmludGYoICIlMmQiLCBndGlkICk7CisgICAgICAgICAgICBpZiAoIF9fa21wX3RocmVhZHMgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoICIgJXAiLCBfX2ttcF90aHJlYWRzWyBndGlkIF0gKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICBpZiAoIF9fa21wX3Jvb3QgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoICIgJXAiLCBfX2ttcF9yb290WyBndGlkIF0gKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICBfX2ttcF9wcmludGYoICJcbiIgKTsKKyAgICAgICAgfTsgLy8gZm9yIGd0aWQKKyAgICB9CisKKyAgICAvLyBQcmludCBvdXQgX19rbXBfdGhyZWFkcyBhcnJheS4KKyAgICBfX2ttcF9wcmludGYoICJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuVGhyZWFkc1xuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iICk7CisgICAgaWYgKCBfX2ttcF90aHJlYWRzICE9IE5VTEwgKSB7CisgICAgICAgIGludCBndGlkOworICAgICAgICBmb3IgKCBndGlkID0gMDsgZ3RpZCA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7ICsrIGd0aWQgKSB7CisgICAgICAgICAgICBrbXBfaW5mb190IGNvbnN0ICogdGhyZWFkID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgICAgICAgICAgaWYgKCB0aHJlYWQgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoICJHVElEICUyZCAlcDpcbiIsIGd0aWQsIHRocmVhZCApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50ZiggICAgICAgICAgICAgICAgICIgICAgT3VyIFJvb3Q6ICAgICAgICAlcFxuIiwgdGhyZWFkLT50aC50aF9yb290ICk7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RlYW0oICAgIiAgICBPdXIgVGVhbTogICAgICIsICAgICAgICB0aHJlYWQtPnRoLnRoX3RlYW0gKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGVhbSggICAiICAgIFNlcmlhbCBUZWFtOiAgIiwgICAgICAgIHRocmVhZC0+dGgudGhfc2VyaWFsX3RlYW0gKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoICAgICAgICAgICAgICAgICAiICAgIFRocmVhZHM6ICAgICAgJTJkXG4iLCAgIHRocmVhZC0+dGgudGhfdGVhbV9ucHJvYyApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90aHJlYWQoICIgICAgTWFzdGVyOiAgICAgICAiLCAgICAgICAgdGhyZWFkLT50aC50aF90ZWFtX21hc3RlciApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50ZiggICAgICAgICAgICAgICAgICIgICAgU2VyaWFsaXplZD86ICAlMmRcbiIsICAgdGhyZWFkLT50aC50aF90ZWFtX3NlcmlhbGl6ZWQgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoICAgICAgICAgICAgICAgICAiICAgIFNldCBOUHJvYzogICAgJTJkXG4iLCAgIHRocmVhZC0+dGgudGhfc2V0X25wcm9jICk7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoICAgICAgICAgICAgICAgICAiICAgIFNldCBQcm9jIEJpbmQ6ICUyZFxuIiwgIHRocmVhZC0+dGgudGhfc2V0X3Byb2NfYmluZCApOworI2VuZGlmCisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RocmVhZCggIiAgICBOZXh0IGluIHBvb2w6ICIsICAgICAgICB0aHJlYWQtPnRoLnRoX25leHRfcG9vbCApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50ZiggIlxuIiApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90ZWFtX2FjY3VtKCBsaXN0LCB0aHJlYWQtPnRoLnRoX3RlYW0gKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGVhbV9hY2N1bSggbGlzdCwgdGhyZWFkLT50aC50aF9zZXJpYWxfdGVhbSApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gZm9yIGd0aWQKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9wcmludGYoICJUaHJlYWRzIGFycmF5IGlzIG5vdCBhbGxvY2F0ZWQuXG4iICk7CisgICAgfTsgLy8gaWYKKworICAgIC8vIFByaW50IG91dCBfX2ttcF9yb290IGFycmF5LgorICAgIF9fa21wX3ByaW50ZiggIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5VYmVyc1xuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iICk7CisgICAgaWYgKCBfX2ttcF9yb290ICE9IE5VTEwgKSB7CisgICAgICAgIGludCBndGlkOworICAgICAgICBmb3IgKCBndGlkID0gMDsgZ3RpZCA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7ICsrIGd0aWQgKSB7CisgICAgICAgICAgICBrbXBfcm9vdF90IGNvbnN0ICogcm9vdCA9IF9fa21wX3Jvb3RbIGd0aWQgXTsKKyAgICAgICAgICAgIGlmICggcm9vdCAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50ZiggIkdUSUQgJTJkICVwOlxuIiwgZ3RpZCwgcm9vdCApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90ZWFtKCAgICIgICAgUm9vdCBUZWFtOiAgICAiLCAgICAgIHJvb3QtPnIucl9yb290X3RlYW0gKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGVhbSggICAiICAgIEhvdCBUZWFtOiAgICAgIiwgICAgICByb290LT5yLnJfaG90X3RlYW0gKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGhyZWFkKCAiICAgIFViZXIgVGhyZWFkOiAgIiwgICAgICByb290LT5yLnJfdWJlcl90aHJlYWQgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoICAgICAgICAgICAgICAgICAiICAgIEFjdGl2ZT86ICAgICAgJTJkXG4iLCByb290LT5yLnJfYWN0aXZlICk7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRmKCAgICAgICAgICAgICAgICAgIiAgICBOZXN0ZWQ/OiAgICAgICUyZFxuIiwgcm9vdC0+ci5yX25lc3RlZCApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50ZiggICAgICAgICAgICAgICAgICIgICAgSW4gUGFyYWxsZWw6ICAlMmRcbiIsIHJvb3QtPnIucl9pbl9wYXJhbGxlbCApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50ZiggIlxuIiApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90ZWFtX2FjY3VtKCBsaXN0LCByb290LT5yLnJfcm9vdF90ZWFtICk7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RlYW1fYWNjdW0oIGxpc3QsIHJvb3QtPnIucl9ob3RfdGVhbSApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gZm9yIGd0aWQKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9wcmludGYoICJVYmVycyBhcnJheSBpcyBub3QgYWxsb2NhdGVkLlxuIiApOworICAgIH07IC8vIGlmCisKKyAgICBfX2ttcF9wcmludGYoICJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuVGVhbXNcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIiApOworICAgIHdoaWxlICggbGlzdC0+bmV4dCAhPSBOVUxMICkgeworICAgICAgICBrbXBfdGVhbV9wIGNvbnN0ICogdGVhbSA9IGxpc3QtPmVudHJ5OworICAgICAgICBpbnQgaTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCAiVGVhbSAlMnggJXA6XG4iLCB0ZWFtLT50LnRfaWQsIHRlYW0gKTsKKyAgICAgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RlYW0oICIgICAgUGFyZW50IFRlYW06ICAgICAgIiwgICAgICB0ZWFtLT50LnRfcGFyZW50ICk7CisgICAgICAgIF9fa21wX3ByaW50ZiggICAgICAgICAgICAgICAiICAgIE1hc3RlciBUSUQ6ICAgICAgICUyZFxuIiwgdGVhbS0+dC50X21hc3Rlcl90aWQgKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCAgICAgICAgICAgICAgICIgICAgTWF4IHRocmVhZHM6ICAgICAgJTJkXG4iLCB0ZWFtLT50LnRfbWF4X25wcm9jICk7CisgICAgICAgIF9fa21wX3ByaW50ZiggICAgICAgICAgICAgICAiICAgIExldmVscyBvZiBzZXJpYWw6ICUyZFxuIiwgdGVhbS0+dC50X3NlcmlhbGl6ZWQgKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCAgICAgICAgICAgICAgICIgICAgTnVtYmVyIHRocmVhZHM6ICAgJTJkXG4iLCB0ZWFtLT50LnRfbnByb2MgKTsKKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCB0ZWFtLT50LnRfbnByb2M7ICsrIGkgKSB7CisgICAgICAgICAgICBfX2ttcF9wcmludGYoICAgICAgICAgICAiICAgIFRocmVhZCAlMmQ6ICAgICAgIiwgaSApOworICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RocmVhZCggIiIsIHRlYW0tPnQudF90aHJlYWRzWyBpIF0gKTsKKyAgICAgICAgfTsgLy8gZm9yIGkKKyAgICAgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RlYW0oICIgICAgTmV4dCBpbiBwb29sOiAgICAgIiwgICAgICB0ZWFtLT50LnRfbmV4dF9wb29sICk7CisgICAgICAgIF9fa21wX3ByaW50ZiggIlxuIiApOworICAgICAgICBsaXN0ID0gbGlzdC0+bmV4dDsKKyAgICB9OyAvLyB3aGlsZQorCisgICAgLy8gUHJpbnQgb3V0IF9fa21wX3RocmVhZF9wb29sIGFuZCBfX2ttcF90ZWFtX3Bvb2wuCisgICAgX19rbXBfcHJpbnRmKCAiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblBvb2xzXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIgKTsKKyAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGhyZWFkKCAgICJUaHJlYWQgcG9vbDogICAgICAgICAgIiwgKGttcF9pbmZvX3QgKilfX2ttcF90aHJlYWRfcG9vbCApOworICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90ZWFtKCAgICAgIlRlYW0gcG9vbDogICAgICAgICAgICAiLCAoa21wX3RlYW1fdCAqKV9fa21wX3RlYW1fcG9vbCApOworICAgIF9fa21wX3ByaW50ZiggIlxuIiApOworCisgICAgLy8gRnJlZSB0ZWFtIGxpc3QuCisgICAgd2hpbGUgKCBsaXN0ICE9IE5VTEwgKSB7CisgICAgICAgIGttcF90ZWFtX2xpc3RfaXRlbV90ICogaXRlbSA9IGxpc3Q7CisgICAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OworICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSggaXRlbSApOworICAgIH07IC8vIHdoaWxlCisKK30KKworI2VuZGlmCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBTdHVmZiBmb3IgcGVyLXRocmVhZCBmYXN0IHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisvLyAgVGFibGUgb2YgcHJpbWVzCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBfX2ttcF9wcmltZXNbXSA9IHsKKyAgMHg5ZTM3NzliMSwgMHhmZmU2Y2M1OSwgMHgyMTA5ZjZkZCwgMHg0Mzk3N2FiNSwKKyAgMHhiYTU3MDNmNSwgMHhiNDk1YTg3NywgMHhlMTYyNjc0MSwgMHg3OTY5NWU2YiwKKyAgMHhiYzk4YzA5ZiwgMHhkNWJlZTJiMywgMHgyODc0ODhmOSwgMHgzYWYxODIzMSwKKyAgMHg5Njc3Y2Q0ZCwgMHhiZTNhNjkyOSwgMHhhZGM2YTg3NywgMHhkY2YwNjc0YiwKKyAgMHhiZTRkNmZlOSwgMHg1ZjE1ZTIwMSwgMHg5OWFmYzNmZCwgMHhmM2YxNjgwMSwKKyAgMHhlMjIyY2ZmZiwgMHgyNGJhNWZkYiwgMHgwNjIwNDUyZCwgMHg3OWYxNDllMywKKyAgMHhjOGI5M2Y0OSwgMHg5NzI3MDJjZCwgMHhiMDdkZDgyNywgMHg2Yzk3ZDVlZCwKKyAgMHgwODVhM2Q2MSwgMHg0NmViNWVhNywgMHgzZDk5MTBlZCwgMHgyZTY4N2I1YiwKKyAgMHgyOTYwOTIyNywgMHg2ZWIwODFmMSwgMHgwOTU0YzRlMSwgMHg5ZDExNGRiOSwKKyAgMHg1NDJhY2ZhOSwgMHhiM2U2YmQ3YiwgMHgwNzQyZDkxNywgMHhlOWYzZmZhNywKKyAgMHg1NDU4MWVkYiwgMHhmMjQ4MGY0NSwgMHgwYmI5Mjg4ZiwgMHhlZjFhZmZjNywKKyAgMHg4NWZhMGNhNywgMHgzY2NjMTRkYiwgMHhlNmJhZjM0YiwgMHgzNDMzNzdmNywKKyAgMHg1Y2ExOTAzMSwgMHhlNmQ5MjkzYiwgMHhmMGE5ZjM5MSwgMHg1ZDJlOTgwYiwKKyAgMHhmYzQxMTA3MywgMHhjMzc0OTM2MywgMHhiODkyZDgyOSwgMHgzNTQ5MzY2YiwKKyAgMHg2Mjk3NTBhZCwgMHhiOTgyOTRlNSwgMHg4OTJkOTQ4MywgMHhjMjM1YmFmMywKKyAgMHgzZDI0MDJhMywgMHg2YmRlZjNjOSwgMHhiZWMzMzNjZCwgMHg0MGM5NTIwZgorfTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBfX2ttcF9nZXRfcmFuZG9tOiBHZXQgYSByYW5kb20gbnVtYmVyIHVzaW5nIGEgbGluZWFyIGNvbmdydWVudGlhbCBtZXRob2QuCisKK3Vuc2lnbmVkIHNob3J0CitfX2ttcF9nZXRfcmFuZG9tKCBrbXBfaW5mb190ICogdGhyZWFkICkKK3sKKyAgdW5zaWduZWQgeCA9IHRocmVhZCAtPiB0aC50aF94OworICB1bnNpZ25lZCBzaG9ydCByID0geD4+MTY7CisKKyAgdGhyZWFkIC0+IHRoLnRoX3ggPSB4KnRocmVhZC0+dGgudGhfYSsxOworCisgIEtBX1RSQUNFKDMwLCAoIl9fa21wX2dldF9yYW5kb206IFRIUkVBRDogJWQsIFJFVFVSTjogJXVcbiIsCisgICAgICAgICB0aHJlYWQtPnRoLnRoX2luZm8uZHMuZHNfdGlkLCByKSApOworCisgIHJldHVybiByOworfQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfaW5pdF9yYW5kb206IEluaXRpYWxpemUgYSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorCit2b2lkCitfX2ttcF9pbml0X3JhbmRvbSgga21wX2luZm9fdCAqIHRocmVhZCApCit7CisgIHVuc2lnbmVkIHNlZWQgPSB0aHJlYWQtPnRoLnRoX2luZm8uZHMuZHNfdGlkOworCisgIHRocmVhZCAtPiB0aC50aF9hID0gX19rbXBfcHJpbWVzW3NlZWQlKHNpemVvZihfX2ttcF9wcmltZXMpL3NpemVvZihfX2ttcF9wcmltZXNbMF0pKV07CisgIHRocmVhZCAtPiB0aC50aF94ID0gKHNlZWQrMSkqdGhyZWFkLT50aC50aF9hKzE7CisgIEtBX1RSQUNFKDMwLCAoIl9fa21wX2luaXRfcmFuZG9tOiBUSFJFQUQ6ICV1OyBBOiAldVxuIiwgc2VlZCwgdGhyZWFkIC0+IHRoLnRoX2EpICk7Cit9CisKKworI2lmIEtNUF9PU19XSU5ET1dTCisvKiByZWNsYWltIGFycmF5IGVudHJpZXMgZm9yIHJvb3QgdGhyZWFkcyB0aGF0IGFyZSBhbHJlYWR5IGRlYWQsIHJldHVybnMgbnVtYmVyIHJlY2xhaW1lZCAqLworc3RhdGljIGludAorX19rbXBfcmVjbGFpbV9kZWFkX3Jvb3RzKHZvaWQpIHsKKyAgICBpbnQgaSwgciA9IDA7CisKKyAgICBmb3IoaSA9IDA7IGkgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OyArK2kpIHsKKyAgICAgICAgaWYoIEtNUF9VQkVSX0dUSUQoIGkgKSAmJgorICAgICAgICAgICFfX2ttcF9zdGlsbF9ydW5uaW5nKChrbXBfaW5mb190ICopVENSX1NZTkNfUFRSKF9fa21wX3RocmVhZHNbaV0pKSAmJgorICAgICAgICAgICFfX2ttcF9yb290W2ldLT5yLnJfYWN0aXZlICkgeyAvLyBBQzogcmVjbGFpbSBvbmx5IHJvb3RzIGRpZWQgaW4gbm9uLWFjdGl2ZSBzdGF0ZQorICAgICAgICAgICAgciArPSBfX2ttcF91bnJlZ2lzdGVyX3Jvb3Rfb3RoZXJfdGhyZWFkKGkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByOworfQorI2VuZGlmCisKKy8qCisgICBUaGlzIGZ1bmN0aW9uIGF0dGVtcHRzIHRvIGNyZWF0ZSBmcmVlIGVudHJpZXMgaW4gX19rbXBfdGhyZWFkcyBhbmQgX19rbXBfcm9vdCwgYW5kIHJldHVybnMgdGhlIG51bWJlciBvZgorICAgZnJlZSBlbnRyaWVzIGdlbmVyYXRlZC4KKworICAgRm9yIFdpbmRvd3MqIE9TIHN0YXRpYyBsaWJyYXJ5LCB0aGUgZmlyc3QgbWVjaGFuaXNtIHVzZWQgaXMgdG8gcmVjbGFpbSBhcnJheSBlbnRyaWVzIGZvciByb290IHRocmVhZHMgdGhhdCBhcmUKKyAgIGFscmVhZHkgZGVhZC4KKworICAgT24gYWxsIHBsYXRmb3JtcywgZXhwYW5zaW9uIGlzIGF0dGVtcHRlZCBvbiB0aGUgYXJyYXlzIF9fa21wX3RocmVhZHNfIGFuZCBfX2ttcF9yb290LCB3aXRoIGFwcHJvcHJpYXRlCisgICB1cGRhdGUgdG8gX19rbXBfdGhyZWFkc19jYXBhY2l0eS4gIEFycmF5IGNhcGFjaXR5IGlzIGluY3JlYXNlZCBieSBkb3VibGluZyB3aXRoIGNsaXBwaW5nIHRvCisgICAgX19rbXBfdHBfY2FwYWNpdHksIGlmIHRocmVhZHByaXZhdGUgY2FjaGUgYXJyYXkgaGFzIGJlZW4gY3JlYXRlZC4KKyAgIFN5bmNocm9uaXphdGlvbiB3aXRoIF9fa21wY190aHJlYWRwcml2YXRlX2NhY2hlZCBpcyBkb25lIHVzaW5nIF9fa21wX3RwX2NhY2hlZF9sb2NrLgorCisgICBBZnRlciBhbnkgZGVhZCByb290IHJlY2xhbWF0aW9uLCBpZiB0aGUgY2xpcHBpbmcgdmFsdWUgYWxsb3dzIGFycmF5IGV4cGFuc2lvbiB0byByZXN1bHQgaW4gdGhlIGdlbmVyYXRpb24KKyAgIG9mIGEgdG90YWwgb2Ygbldpc2ggZnJlZSBzbG90cywgdGhlIGZ1bmN0aW9uIGRvZXMgdGhhdCBleHBhbnNpb24uICBJZiBub3QsIGJ1dCB0aGUgY2xpcHBpbmcgdmFsdWUgYWxsb3dzCisgICBhcnJheSBleHBhbnNpb24gdG8gcmVzdWx0IGluIHRoZSBnZW5lcmF0aW9uIG9mIGEgdG90YWwgb2Ygbk5lZWQgZnJlZSBzbG90cywgdGhlIGZ1bmN0aW9uIGRvZXMgdGhhdCBleHBhbnNpb24uCisgICBPdGhlcndpc2UsIG5vdGhpbmcgaXMgZG9uZSBiZXlvbmQgdGhlIHBvc3NpYmxlIGluaXRpYWwgcm9vdCB0aHJlYWQgcmVjbGFtYXRpb24uICBIb3dldmVyLCBpZiBuTmVlZCBpcyB6ZXJvLAorICAgYSBiZXN0LWVmZm9ydCBhdHRlbXB0IGlzIG1hZGUgdG8gZnVsZmlsIG5XaXNoIGFzIGZhciBhcyBwb3NzaWJsZSwgaS5lLiB0aGUgZnVuY3Rpb24gd2lsbCBhdHRlbXB0IHRvIGNyZWF0ZQorICAgYXMgbWFueSBmcmVlIHNsb3RzIGFzIHBvc3NpYmxlIHVwIHRvIG5XaXNoLgorCisgICBJZiBhbnkgYXJndW1lbnQgaXMgbmVnYXRpdmUsIHRoZSBiZWhhdmlvciBpcyB1bmRlZmluZWQuCisqLworc3RhdGljIGludAorX19rbXBfZXhwYW5kX3RocmVhZHMoaW50IG5XaXNoLCBpbnQgbk5lZWQpIHsKKyAgICBpbnQgYWRkZWQgPSAwOworICAgIGludCBvbGRfdHBfY2FjaGVkOworICAgIGludCBfX2ttcF9hY3R1YWxfbWF4X250aDsKKworICAgIGlmKG5OZWVkID4gbldpc2gpIC8qIG5vcm1hbGl6ZSB0aGUgYXJndW1lbnRzICovCisgICAgICAgIG5XaXNoID0gbk5lZWQ7CisjaWYgS01QX09TX1dJTkRPV1MgJiYgIWRlZmluZWQgR1VJREVETExfRVhQT1JUUworLyogb25seSBmb3IgV2luZG93cyBzdGF0aWMgbGlicmFyeSAqLworICAgIC8qIHJlY2xhaW0gYXJyYXkgZW50cmllcyBmb3Igcm9vdCB0aHJlYWRzIHRoYXQgYXJlIGFscmVhZHkgZGVhZCAqLworICAgIGFkZGVkID0gX19rbXBfcmVjbGFpbV9kZWFkX3Jvb3RzKCk7CisKKyAgICBpZihuTmVlZCkgeworICAgICAgICBuTmVlZCAtPSBhZGRlZDsKKyAgICAgICAgaWYobk5lZWQgPCAwKQorICAgICAgICAgICAgbk5lZWQgPSAwOworICAgIH0KKyAgICBpZihuV2lzaCkgeworICAgICAgICBuV2lzaCAtPSBhZGRlZDsKKyAgICAgICAgaWYobldpc2ggPCAwKQorICAgICAgICAgICAgbldpc2ggPSAwOworICAgIH0KKyNlbmRpZgorICAgIGlmKG5XaXNoIDw9IDApCisgICAgICAgIHJldHVybiBhZGRlZDsKKworICAgIHdoaWxlKDEpIHsKKyAgICAgICAgaW50IG5UYXJnZXQ7CisgICAgICAgIGludCBtaW5pbXVtUmVxdWlyZWRDYXBhY2l0eTsKKyAgICAgICAgaW50IG5ld0NhcGFjaXR5OworICAgICAgICBrbXBfaW5mb190ICoqbmV3VGhyZWFkczsKKyAgICAgICAga21wX3Jvb3RfdCAqKm5ld1Jvb3Q7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gTm90ZSB0aGF0IF9fa21wX3RocmVhZHNfY2FwYWNpdHkgaXMgbm90IGJvdW5kZWQgYnkgX19rbXBfbWF4X250aC4KKyAgICAgICAgLy8gSWYgX19rbXBfbWF4X250aCBpcyBzZXQgdG8gc29tZSB2YWx1ZSBsZXNzIHRoYW4gX19rbXBfc3lzX21heF9udGgKKyAgICAgICAgLy8gYnkgdGhlIHVzZXIgdmlhIE9NUF9USFJFQURfTElNSVQsIHRoZW4gX19rbXBfdGhyZWFkc19jYXBhY2l0eSBtYXkKKyAgICAgICAgLy8gYmVjb21lID4gX19rbXBfbWF4X250aCBpbiBvbmUgb2YgdHdvIHdheXM6CisgICAgICAgIC8vCisgICAgICAgIC8vIDEpIFRoZSBpbml0aWFsaXphdGlvbiB0aHJlYWQgKGd0aWQgPSAwKSBleGl0cy4gIF9fa21wX3RocmVhZHNbMF0KKyAgICAgICAgLy8gICAgbWF5IG5vdCBiZSByZXN1c2VkIGJ5IGFub3RoZXIgdGhyZWFkLCBzbyB3ZSBtYXkgbmVlZCB0byBpbmNyZWFzZQorICAgICAgICAvLyAgICBfX2ttcF90aHJlYWRzX2NhcGFjaXR5IHRvIF9fa21wX21heF90aHJlYWRzICsgMS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gMikgTmV3IGZvcmVpZ24gcm9vdChzKSBhcmUgZW5jb3VudGVyZWQuICBXZSBhbHdheXMgcmVnaXN0ZXIgbmV3CisgICAgICAgIC8vICAgIGZvcmVpZ24gcm9vdHMuICBUaGlzIG1heSBjYXVzZSBhIHNtYWxsZXIgIyBvZiB0aHJlYWRzIHRvIGJlCisgICAgICAgIC8vICAgIGFsbG9jYXRlZCBhdCBzdWJzZXF1ZW50IHBhcmFsbGVsIHJlZ2lvbnMsIGJ1dCB0aGUgd29ya2VyIHRocmVhZHMKKyAgICAgICAgLy8gICAgaGFuZyBhcm91bmQgKGFuZCBldmVudHVhbGx5IGdvIHRvIHNsZWVwKSBhbmQgbmVlZCBzbG90cyBpbiB0aGUKKyAgICAgICAgLy8gICAgX19rbXBfdGhyZWFkc1tdIGFycmF5LgorICAgICAgICAvLworICAgICAgICAvLyBBbnl3YXksIHRoYXQgaXMgdGhlIHJlYXNvbiBmb3IgbW92aW5nIHRoZSBjaGVjayB0byBzZWUgaWYKKyAgICAgICAgLy8gX19rbXBfbWF4X3RocmVhZHMgd2FzIGV4Y2VlZGVkIGludG8gX19rbXBfcmVzZWVydmVfdGhyZWFkcygpCisgICAgICAgIC8vIGluc3RlYWQgb2YgaGF2aW5nIGl0IHBlcmZvcm1lZCBoZXJlLiAtQkIKKyAgICAgICAgLy8KKyAgICAgICAgb2xkX3RwX2NhY2hlZCA9IF9fa21wX3RwX2NhY2hlZDsKKyAgICAgICAgX19rbXBfYWN0dWFsX21heF9udGggPSBvbGRfdHBfY2FjaGVkID8gX19rbXBfdHBfY2FwYWNpdHkgOiBfX2ttcF9zeXNfbWF4X250aDsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9hY3R1YWxfbWF4X250aCA+PSBfX2ttcF90aHJlYWRzX2NhcGFjaXR5KTsKKworICAgICAgICAvKiBjb21wdXRlIGV4cGFuc2lvbiBoZWFkcm9vbSB0byBjaGVjayBpZiB3ZSBjYW4gZXhwYW5kIGFuZCB3aGV0aGVyIHRvIGFpbSBmb3Igbldpc2ggb3Igbk5lZWQgKi8KKyAgICAgICAgblRhcmdldCA9IG5XaXNoOworICAgICAgICBpZihfX2ttcF9hY3R1YWxfbWF4X250aCAtIF9fa21wX3RocmVhZHNfY2FwYWNpdHkgPCBuVGFyZ2V0KSB7CisgICAgICAgICAgICAvKiBjYW4ndCBmdWxmaWwgbldpc2gsIHNvIHRyeSBuTmVlZCAqLworICAgICAgICAgICAgaWYobk5lZWQpIHsKKyAgICAgICAgICAgICAgICBuVGFyZ2V0ID0gbk5lZWQ7CisgICAgICAgICAgICAgICAgaWYoX19rbXBfYWN0dWFsX21heF9udGggLSBfX2ttcF90aHJlYWRzX2NhcGFjaXR5IDwgblRhcmdldCkgeworICAgICAgICAgICAgICAgICAgICAvKiBwb3NzaWJsZSBleHBhbnNpb24gdG9vIHNtYWxsIC0tIGdpdmUgdXAgKi8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBiZXN0LWVmZm9ydCAqLworICAgICAgICAgICAgICAgIG5UYXJnZXQgPSBfX2ttcF9hY3R1YWxfbWF4X250aCAtIF9fa21wX3RocmVhZHNfY2FwYWNpdHk7CisgICAgICAgICAgICAgICAgaWYoIW5UYXJnZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogY2FuIGV4cGFuZCBhdCBhbGwgLS0gZ2l2ZSB1cCAqLworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbWluaW11bVJlcXVpcmVkQ2FwYWNpdHkgPSBfX2ttcF90aHJlYWRzX2NhcGFjaXR5ICsgblRhcmdldDsKKworICAgICAgICBuZXdDYXBhY2l0eSA9IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7CisgICAgICAgIGRveworICAgICAgICAgICAgbmV3Q2FwYWNpdHkgPQorICAgICAgICAgICAgICAgIG5ld0NhcGFjaXR5IDw9IChfX2ttcF9hY3R1YWxfbWF4X250aCA+PiAxKSA/CisgICAgICAgICAgICAgICAgKG5ld0NhcGFjaXR5IDw8IDEpIDoKKyAgICAgICAgICAgICAgICBfX2ttcF9hY3R1YWxfbWF4X250aDsKKyAgICAgICAgfSB3aGlsZShuZXdDYXBhY2l0eSA8IG1pbmltdW1SZXF1aXJlZENhcGFjaXR5KTsKKyAgICAgICAgbmV3VGhyZWFkcyA9IChrbXBfaW5mb190KiopIF9fa21wX2FsbG9jYXRlKChzaXplb2Yoa21wX2luZm9fdCopICsgc2l6ZW9mKGttcF9yb290X3QqKSkgKiBuZXdDYXBhY2l0eSArIENBQ0hFX0xJTkUpOworICAgICAgICBuZXdSb290ID0gKGttcF9yb290X3QqKikgKChjaGFyKiluZXdUaHJlYWRzICsgc2l6ZW9mKGttcF9pbmZvX3QqKSAqIG5ld0NhcGFjaXR5ICk7CisgICAgICAgIG1lbWNweShuZXdUaHJlYWRzLCBfX2ttcF90aHJlYWRzLCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5ICogc2l6ZW9mKGttcF9pbmZvX3QqKSk7CisgICAgICAgIG1lbWNweShuZXdSb290LCBfX2ttcF9yb290LCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5ICogc2l6ZW9mKGttcF9yb290X3QqKSk7CisgICAgICAgIG1lbXNldChuZXdUaHJlYWRzICsgX19rbXBfdGhyZWFkc19jYXBhY2l0eSwgMCwKKyAgICAgICAgICAgICAgIChuZXdDYXBhY2l0eSAtIF9fa21wX3RocmVhZHNfY2FwYWNpdHkpICogc2l6ZW9mKGttcF9pbmZvX3QqKSk7CisgICAgICAgIG1lbXNldChuZXdSb290ICsgX19rbXBfdGhyZWFkc19jYXBhY2l0eSwgMCwKKyAgICAgICAgICAgICAgIChuZXdDYXBhY2l0eSAtIF9fa21wX3RocmVhZHNfY2FwYWNpdHkpICogc2l6ZW9mKGttcF9yb290X3QqKSk7CisKKyAgICAgICAgaWYoIW9sZF90cF9jYWNoZWQgJiYgX19rbXBfdHBfY2FjaGVkICYmIG5ld0NhcGFjaXR5ID4gX19rbXBfdHBfY2FwYWNpdHkpIHsKKyAgICAgICAgICAgIC8qIF9fa21wX3RwX2NhY2hlZCBoYXMgY2hhbmdlZCwgaS5lLiBfX2ttcGNfdGhyZWFkcHJpdmF0ZV9jYWNoZWQgaGFzIGFsbG9jYXRlZCBhIHRocmVhZHByaXZhdGUgY2FjaGUKKyAgICAgICAgICAgICAgIHdoaWxlIHdlIHdlcmUgYWxsb2NhdGluZyB0aGUgZXhwYW5kZWQgYXJyYXksIGFuZCBvdXIgbmV3IGNhcGFjaXR5IGlzIGxhcmdlciB0aGFuIHRoZSB0aHJlYWRwcml2YXRlCisgICAgICAgICAgICAgICBjYWNoZSBjYXBhY2l0eSwgc28gd2Ugc2hvdWxkIGRlYWxsb2NhdGUgdGhlIGV4cGFuZGVkIGFycmF5cyBhbmQgdHJ5IGFnYWluLiAgVGhpcyBpcyB0aGUgZmlyc3QgY2hlY2sKKyAgICAgICAgICAgICAgIG9mIGEgZG91YmxlLWNoZWNrIHBhaXIuCisgICAgICAgICAgICAqLworICAgICAgICAgICAgX19rbXBfZnJlZShuZXdUaHJlYWRzKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOyAvKiBzdGFydCBvdmVyIGFuZCB0cnkgYWdhaW4gKi8KKyAgICAgICAgfQorICAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCZfX2ttcF90cF9jYWNoZWRfbG9jayk7CisgICAgICAgIGlmKCFvbGRfdHBfY2FjaGVkICYmIF9fa21wX3RwX2NhY2hlZCAmJiBuZXdDYXBhY2l0eSA+IF9fa21wX3RwX2NhcGFjaXR5KSB7CisgICAgICAgICAgICAvKiBTYW1lIGNoZWNrIGFzIGFib3ZlLCBidXQgdGhpcyB0aW1lIHdpdGggdGhlIGxvY2sgc28gd2UgY2FuIGJlIHN1cmUgaWYgd2UgY2FuIHN1Y2NlZWQuICovCisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCZfX2ttcF90cF9jYWNoZWRfbG9jayk7CisgICAgICAgICAgICBfX2ttcF9mcmVlKG5ld1RocmVhZHMpOworICAgICAgICAgICAgY29udGludWU7IC8qIHN0YXJ0IG92ZXIgYW5kIHRyeSBhZ2FpbiAqLworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogc3VjY2VzcyAqLworICAgICAgICAgICAgLy8gX19rbXBfZnJlZSggX19rbXBfdGhyZWFkcyApOyAvLyBBVFQ6IEl0IGxlYWRzIHRvIGNyYXNoLiBOZWVkIHRvIGJlIGludmVzdGlnYXRlZC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAqKGttcF9pbmZvX3QqKnZvbGF0aWxlKikmX19rbXBfdGhyZWFkcyA9IG5ld1RocmVhZHM7CisgICAgICAgICAgICAqKGttcF9yb290X3QqKnZvbGF0aWxlKikmX19rbXBfcm9vdCA9IG5ld1Jvb3Q7CisgICAgICAgICAgICBhZGRlZCArPSBuZXdDYXBhY2l0eSAtIF9fa21wX3RocmVhZHNfY2FwYWNpdHk7CisgICAgICAgICAgICAqKHZvbGF0aWxlIGludCopJl9fa21wX3RocmVhZHNfY2FwYWNpdHkgPSBuZXdDYXBhY2l0eTsKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soJl9fa21wX3RwX2NhY2hlZF9sb2NrKTsKKyAgICAgICAgICAgIGJyZWFrOyAvKiBzdWNjZWVkZWQsIHNvIHdlIGNhbiBleGl0IHRoZSBsb29wICovCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGFkZGVkOworfQorCisvKiByZWdpc3RlciB0aGUgY3VycmVudCB0aHJlYWQgYXMgYSByb290IHRocmVhZCBhbmQgb2J0YWluIG91ciBndGlkICovCisvKiB3ZSBtdXN0IGhhdmUgdGhlIF9fa21wX2luaXR6X2xvY2sgaGVsZCBhdCB0aGlzIHBvaW50ICovCisvKiBBcmd1bWVudCBUUlVFIG9ubHkgaWYgYXJlIHRoZSB0aHJlYWQgdGhhdCBjYWxscyBmcm9tIF9fa21wX2RvX3NlcmlhbF9pbml0aWFsaXplKCkgKi8KK2ludAorX19rbXBfcmVnaXN0ZXJfcm9vdCggaW50IGluaXRpYWxfdGhyZWFkICkKK3sKKyAgICBrbXBfaW5mb190ICpyb290X3RocmVhZDsKKyAgICBrbXBfcm9vdF90ICpyb290OworICAgIGludCAgICAgICAgIGd0aWQ7CisgICAgaW50ICAgICAgICAgY2FwYWNpdHk7CisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJl9fa21wX2Zvcmtqb2luX2xvY2sgKTsKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfcmVnaXN0ZXJfcm9vdDogZW50ZXJlZFxuIikpOworICAgIEtNUF9NQigpOworCisKKyAgICAvKgorICAgICAgICAyMDA3LTAzLTAyOgorCisgICAgICAgIElmIGluaXRpYWwgdGhyZWFkIGRpZCBub3QgaW52b2tlIE9wZW5NUCBSVEwgeWV0LCBhbmQgdGhpcyB0aHJlYWQgaXMgbm90IGFuIGluaXRpYWwgb25lLAorICAgICAgICAiX19rbXBfYWxsX250aCA+PSBfX2ttcF90aHJlYWRzX2NhcGFjaXR5IiBjb25kaXRpb24gZG9lcyBub3Qgd29yayBhcyBleHBlY3RlZCAtLSBpdCBtYXkKKyAgICAgICAgcmV0dXJuIGZhbHNlICh0aGF0IG1lYW5zIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBlbXB0eSBzbG90IGluIF9fa21wX3RocmVhZHMgYXJyYXkpLCBidXQgaXQKKyAgICAgICAgaXMgcG9zc2libGUgdGhlIG9ubHkgZnJlZSBzbG90IGlzICMwLCB3aGljaCBpcyByZXNlcnZlZCBmb3IgaW5pdGlhbCB0aHJlYWQgYW5kIHNvIGNhbm5vdCBiZQorICAgICAgICB1c2VkIGZvciB0aGlzIG9uZS4gRm9sbG93aW5nIGNvZGUgd29ya2Fyb3VuZHMgdGhpcyBidWcuCisKKyAgICAgICAgSG93ZXZlciwgcmlnaHQgc29sdXRpb24gc2VlbXMgdG8gYmUgbm90IHJlc2VydmluZyBzbG90ICMwIGZvciBpbml0aWFsIHRocmVhZCBiZWNhdXNlOgorICAgICAgICAgICAgKDEpIHRoZXJlIGlzIG5vIG1hZ2ljIGluIHNsb3QgIzAsCisgICAgICAgICAgICAoMikgd2UgY2Fubm90IGRldGVjdCBpbml0aWFsIHRocmVhZCByZWxpYWJseSAodGhlIGZpcnN0IHRocmVhZCB3aGljaCBkb2VzIHNlcmlhbAorICAgICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uIG1heSBiZSBub3QgYSByZWFsIGluaXRpYWwgdGhyZWFkKS4KKyAgICAqLworICAgIGNhcGFjaXR5ID0gX19rbXBfdGhyZWFkc19jYXBhY2l0eTsKKyAgICBpZiAoICEgaW5pdGlhbF90aHJlYWQgJiYgVENSX1BUUihfX2ttcF90aHJlYWRzWzBdKSA9PSBOVUxMICkgeworICAgICAgICAtLSBjYXBhY2l0eTsKKyAgICB9OyAvLyBpZgorCisgICAgLyogc2VlIGlmIHRoZXJlIGFyZSB0b28gbWFueSB0aHJlYWRzICovCisgICAgaWYgKCBfX2ttcF9hbGxfbnRoID49IGNhcGFjaXR5ICYmICFfX2ttcF9leHBhbmRfdGhyZWFkcyggMSwgMSApICkgeworICAgICAgICBpZiAoIF9fa21wX3RwX2NhY2hlZCApIHsKKyAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudFJlZ2lzdGVyTmV3VGhyZWFkICksCisgICAgICAgICAgICAgICAgS01QX0hOVCggU2V0X0FMTF9USFJFQURQUklWQVRFLCBfX2ttcF90cF9jYXBhY2l0eSApLAorICAgICAgICAgICAgICAgIEtNUF9ITlQoIFBvc3NpYmxlU3lzdGVtTGltaXRPblRocmVhZHMgKSwKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudFJlZ2lzdGVyTmV3VGhyZWFkICksCisgICAgICAgICAgICAgICAgS01QX0hOVCggU3lzdGVtTGltaXRPblRocmVhZHMgKSwKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH07IC8vIGlmCisKKyAgICAvKiBmaW5kIGFuIGF2YWlsYWJsZSB0aHJlYWQgc2xvdCAqLworICAgIC8qIERvbid0IHJlYXNzaWduIHRoZSB6ZXJvIHNsb3Qgc2luY2Ugd2UgbmVlZCB0aGF0IHRvIG9ubHkgYmUgdXNlZCBieSBpbml0aWFsCisgICAgICAgdGhyZWFkICovCisgICAgZm9yKCBndGlkPShpbml0aWFsX3RocmVhZCA/IDAgOiAxKSA7IFRDUl9QVFIoX19rbXBfdGhyZWFkc1tndGlkXSkgIT0gTlVMTCA7IGd0aWQrKyApOworICAgIEtBX1RSQUNFKCAxLCAoIl9fa21wX3JlZ2lzdGVyX3Jvb3Q6IGZvdW5kIHNsb3QgaW4gdGhyZWFkcyBhcnJheTogVCMlZFxuIiwgZ3RpZCApKTsKKyAgICBLTVBfQVNTRVJUKCBndGlkIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eSApOworCisgICAgLyogdXBkYXRlIGdsb2JhbCBhY2NvdW50aW5nICovCisgICAgX19rbXBfYWxsX250aCArKzsKKyAgICBUQ1dfNChfX2ttcF9udGgsIF9fa21wX250aCArIDEpOworCisgICAgLy8KKyAgICAvLyBpZiBfX2ttcF9hZGp1c3RfZ3RpZF9tb2RlIGlzIHNldCwgdGhlbiB3ZSB1c2UgbWV0aG9kICMxIChzcCBzZWFyY2gpCisgICAgLy8gZm9yIGxvdyBudW1iZXJzIG9mIHByb2NzLCBhbmQgbWV0aG9kICMyIChrZXllZCBBUEkgY2FsbCkgZm9yIGhpZ2hlcgorICAgIC8vIG51bWJlcnMgb2YgcHJvY3MuCisgICAgLy8KKyAgICBpZiAoIF9fa21wX2FkanVzdF9ndGlkX21vZGUgKSB7CisgICAgICAgIGlmICggX19rbXBfYWxsX250aCA+PSBfX2ttcF90bHNfZ3RpZF9taW4gKSB7CisgICAgICAgICAgICBpZiAoIFRDUl80KF9fa21wX2d0aWRfbW9kZSkgIT0gMikgeworICAgICAgICAgICAgICAgIFRDV180KF9fa21wX2d0aWRfbW9kZSwgMik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoVENSXzQoX19rbXBfZ3RpZF9tb2RlKSAhPSAxICkgeworICAgICAgICAgICAgICAgIFRDV180KF9fa21wX2d0aWRfbW9kZSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyNpZmRlZiBLTVBfQURKVVNUX0JMT0NLVElNRQorICAgIC8qIEFkanVzdCBibG9ja3RpbWUgdG8gemVybyBpZiBuZWNlc3NhcnkgICAgICAgICAgICAqLworICAgIC8qIE1pZGRsZSBpbml0aWFsaXphdGlvbiBtaWdodCBub3QgaGF2ZSBvY2N1cnJlZCB5ZXQgKi8KKyAgICBpZiAoICFfX2ttcF9lbnZfYmxvY2t0aW1lICYmICggX19rbXBfYXZhaWxfcHJvYyA+IDAgKSApIHsKKyAgICAgICAgaWYgKCBfX2ttcF9udGggPiBfX2ttcF9hdmFpbF9wcm9jICkgeworICAgICAgICAgICAgX19rbXBfemVyb19idCA9IFRSVUU7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogS01QX0FESlVTVF9CTE9DS1RJTUUgKi8KKworICAgIC8qIHNldHVwIHRoaXMgbmV3IGhpZXJhcmNoeSAqLworICAgIGlmKCAhICggcm9vdCA9IF9fa21wX3Jvb3RbZ3RpZF0gKSkgeworICAgICAgICByb290ID0gX19rbXBfcm9vdFtndGlkXSA9IChrbXBfcm9vdF90KikgX19rbXBfYWxsb2NhdGUoIHNpemVvZihrbXBfcm9vdF90KSApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAhIHJvb3QtPnIucl9yb290X3RlYW0gKTsKKyAgICB9CisKKyAgICBfX2ttcF9pbml0aWFsaXplX3Jvb3QoIHJvb3QgKTsKKworICAgIC8qIHNldHVwIG5ldyByb290IHRocmVhZCBzdHJ1Y3R1cmUgKi8KKyAgICBpZiggcm9vdCAtPiByLnJfdWJlcl90aHJlYWQgKSB7CisgICAgICAgIHJvb3RfdGhyZWFkID0gcm9vdCAtPiByLnJfdWJlcl90aHJlYWQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcm9vdF90aHJlYWQgPSAoa21wX2luZm9fdCopIF9fa21wX2FsbG9jYXRlKCBzaXplb2Yoa21wX2luZm9fdCkgKTsKKyAgICAgICAgaWYgKCBfX2ttcF9zdG9yYWdlX21hcCApIHsKKyAgICAgICAgICAgIF9fa21wX3ByaW50X3RocmVhZF9zdG9yYWdlX21hcCggcm9vdF90aHJlYWQsIGd0aWQgKTsKKyAgICAgICAgfQorICAgICAgICByb290X3RocmVhZCAtPiB0aC50aF9pbmZvIC5kcy5kc19ndGlkID0gZ3RpZDsKKyAgICAgICAgcm9vdF90aHJlYWQgLT4gdGgudGhfcm9vdCA9ICByb290OworICAgICAgICBpZiggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgcm9vdF90aHJlYWQgLT4gdGgudGhfY29ucyA9IF9fa21wX2FsbG9jYXRlX2NvbnNfc3RhY2soIGd0aWQgKTsKKyAgICAgICAgfQorICAgICAgICAjaWYgVVNFX0ZBU1RfTUVNT1JZCisgICAgICAgICAgICBfX2ttcF9pbml0aWFsaXplX2Zhc3RfbWVtb3J5KCByb290X3RocmVhZCApOworICAgICAgICAjZW5kaWYgLyogVVNFX0ZBU1RfTUVNT1JZICovCisKKyAgICAgICAgI2lmIEtNUF9VU0VfQkdFVAorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggcm9vdF90aHJlYWQgLT4gdGgudGhfbG9jYWwuYmdldF9kYXRhID09IE5VTEwgKTsKKyAgICAgICAgICAgIF9fa21wX2luaXRpYWxpemVfYmdldCggcm9vdF90aHJlYWQgKTsKKyAgICAgICAgI2VuZGlmCisgICAgICAgIF9fa21wX2luaXRfcmFuZG9tKCByb290X3RocmVhZCApOyAgLy8gSW5pdGlhbGl6ZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgIH0KKworICAgIC8qIHNldHVwIHRoZSBzZXJpYWwgdGVhbSBoZWxkIGluIHJlc2VydmUgYnkgdGhlIHJvb3QgdGhyZWFkICovCisgICAgaWYoICEgcm9vdF90aHJlYWQgLT4gdGgudGhfc2VyaWFsX3RlYW0gKSB7CisgICAgICAgICNpZiBPTVBfMzBfRU5BQkxFRAorICAgICAgICAgICAga21wX2ludGVybmFsX2NvbnRyb2xfdCByX2ljdnMgPSBfX2ttcF9nZXRfZ2xvYmFsX2ljdnMoKTsKKyAgICAgICAgI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisgICAgICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVnaXN0ZXJfcm9vdDogYmVmb3JlIHNlcmlhbF90ZWFtXG4iICkgKTsKKyAgICAgICAgcm9vdF90aHJlYWQgLT4gdGgudGhfc2VyaWFsX3RlYW0gPSBfX2ttcF9hbGxvY2F0ZV90ZWFtKCByb290LCAxLCAxLAorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgcHJvY19iaW5kX2RlZmF1bHQsCisjZW5kaWYKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgICAgICAgICZyX2ljdnMsCisjZWxzZQorICAgICAgICAgIF9fa21wX2RmbHRfdGVhbV9udGhfdWIsCisgICAgICAgICAgX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljLAorICAgICAgICAgIF9fa21wX2RmbHRfbmVzdGVkLAorICAgICAgICAgIF9fa21wX2RmbHRfYmxvY2t0aW1lLAorICAgICAgICAgIF9fa21wX2J0X2ludGVydmFscywKKyAgICAgICAgICBfX2ttcF9lbnZfYmxvY2t0aW1lLAorI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgMCApOworICAgIH0KKyAgICBLTVBfQVNTRVJUKCByb290X3RocmVhZCAtPiB0aC50aF9zZXJpYWxfdGVhbSApOworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVnaXN0ZXJfcm9vdDogYWZ0ZXIgc2VyaWFsX3RlYW0gPSAlcFxuIiwKKyAgICAgIHJvb3RfdGhyZWFkIC0+IHRoLnRoX3NlcmlhbF90ZWFtICkgKTsKKworICAgIC8qIGRyb3Agcm9vdF90aHJlYWQgaW50byBwbGFjZSAqLworICAgIFRDV19TWU5DX1BUUihfX2ttcF90aHJlYWRzW2d0aWRdLCByb290X3RocmVhZCk7CisKKyAgICByb290IC0+IHIucl9yb290X3RlYW0gLT4gdC50X3RocmVhZHNbMF0gPSByb290X3RocmVhZDsKKyAgICByb290IC0+IHIucl9ob3RfdGVhbSAgLT4gdC50X3RocmVhZHNbMF0gPSByb290X3RocmVhZDsKKyAgICByb290X3RocmVhZCAtPiB0aC50aF9zZXJpYWxfdGVhbSAtPiB0LnRfdGhyZWFkc1swXSA9IHJvb3RfdGhyZWFkOworICAgIHJvb3RfdGhyZWFkIC0+IHRoLnRoX3NlcmlhbF90ZWFtIC0+IHQudF9zZXJpYWxpemVkID0gMDsgLy8gQUM6IHRoZSB0ZWFtIGNyZWF0ZWQgaW4gcmVzZXJ2ZSwgbm90IGZvciBleGVjdXRpb24gKGl0IGlzIHVudXNlZCBmb3Igbm93KS4KKyAgICByb290IC0+IHIucl91YmVyX3RocmVhZCA9IHJvb3RfdGhyZWFkOworCisgICAgLyogaW5pdGlhbGl6ZSB0aGUgdGhyZWFkLCBnZXQgaXQgcmVhZHkgdG8gZ28gKi8KKyAgICBfX2ttcF9pbml0aWFsaXplX2luZm8oIHJvb3RfdGhyZWFkLCByb290LT5yLnJfcm9vdF90ZWFtLCAwLCBndGlkICk7CisKKyAgICAvKiBwcmVwYXJlIHRoZSBtYXN0ZXIgdGhyZWFkIGZvciBnZXRfZ3RpZCgpICovCisgICAgX19rbXBfZ3RpZF9zZXRfc3BlY2lmaWMoIGd0aWQgKTsKKyAgICAjaWZkZWYgS01QX1REQVRBX0dUSUQKKyAgICAgICAgX19rbXBfZ3RpZCA9IGd0aWQ7CisgICAgI2VuZGlmCisgICAgX19rbXBfY3JlYXRlX3dvcmtlciggZ3RpZCwgcm9vdF90aHJlYWQsIF9fa21wX3N0a3NpemUgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9ndGlkX2dldF9zcGVjaWZpYygpID09IGd0aWQgKTsKKyAgICBUQ1dfNChfX2ttcF9pbml0X2d0aWQsIFRSVUUpOworCisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX3JlZ2lzdGVyX3Jvb3Q6IFQjJWQgaW5pdCBUIyVkKCVkOiVkKSBhcnJpdmVkOiBqb2luPSV1LCBwbGFpbj0ldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgZ3RpZCwgX19rbXBfZ3RpZF9mcm9tX3RpZCggMCwgcm9vdC0+ci5yX2hvdF90ZWFtICksCisgICAgICAgICAgICAgICAgICAgIHJvb3QgLT4gci5yX2hvdF90ZWFtIC0+IHQudF9pZCwgMCwgS01QX0lOSVRfQkFSUklFUl9TVEFURSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0lOSVRfQkFSUklFUl9TVEFURSApICk7CisgICAgeyAvLyBJbml0aWFsaXplIGJhcnJpZXIgZGF0YS4KKyAgICAgICAgaW50IGI7CisgICAgICAgIGZvciAoIGIgPSAwOyBiIDwgYnNfbGFzdF9iYXJyaWVyOyArKyBiICkgeworICAgICAgICAgICAgcm9vdF90aHJlYWQtPnRoLnRoX2JhclsgYiBdLmJiLmJfYXJyaXZlZCAgICAgICAgPSBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFOworICAgICAgICB9OyAvLyBmb3IKKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVCggcm9vdC0+ci5yX2hvdF90ZWFtLT50LnRfYmFyWyBic19mb3Jram9pbl9iYXJyaWVyIF0uYl9hcnJpdmVkID09IEtNUF9JTklUX0JBUlJJRVJfU1RBVEUgKTsKKworCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIGlmICggVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICBfX2ttcF9hZmZpbml0eV9zZXRfaW5pdF9tYXNrKCBndGlkLCBUUlVFICk7CisgICAgfQorI2VuZGlmIC8qIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgKi8KKworICAgIF9fa21wX3Jvb3RfY291bnRlciArKzsKKworICAgIEtNUF9NQigpOworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisKKyAgICByZXR1cm4gZ3RpZDsKK30KKworLyogUmVzZXRzIGEgcm9vdCB0aHJlYWQgYW5kIGNsZWFyIGl0cyByb290IGFuZCBob3QgdGVhbXMuCisgICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgX19rbXBfdGhyZWFkcyBlbnRyaWVzIGRpcmVjdGx5IGFuZCBpbmRpcmVjdGx5IGZyZWVkLgorKi8KK3N0YXRpYyBpbnQKK19fa21wX3Jlc2V0X3Jvb3QoaW50IGd0aWQsIGttcF9yb290X3QgKnJvb3QpCit7CisgICAga21wX3RlYW1fdCAqIHJvb3RfdGVhbSA9IHJvb3QtPnIucl9yb290X3RlYW07CisgICAga21wX3RlYW1fdCAqIGhvdF90ZWFtICA9IHJvb3QtPnIucl9ob3RfdGVhbTsKKyAgICBpbnQgICAgICAgICAgbiAgICAgICAgID0gaG90X3RlYW0tPnQudF9ucHJvYzsKKyAgICBpbnQgaTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoICEgcm9vdC0+ci5yX2FjdGl2ZSApOworCisgICAgcm9vdC0+ci5yX3Jvb3RfdGVhbSA9IE5VTEw7CisgICAgcm9vdC0+ci5yX2hvdF90ZWFtICA9IE5VTEw7CisgICAgICAgIC8vIF9fa21wX2ZyZWVfdGVhbSgpIGRvZXMgbm90IGZyZWUgaG90IHRlYW1zLCBzbyB3ZSBoYXZlIHRvIGNsZWFyIHJfaG90X3RlYW0gYmVmb3JlIGNhbGwKKyAgICAgICAgLy8gdG8gX19rbXBfZnJlZV90ZWFtKCkuCisgICAgX19rbXBfZnJlZV90ZWFtKCByb290LCByb290X3RlYW0gKTsKKyAgICBfX2ttcF9mcmVlX3RlYW0oIHJvb3QsIGhvdF90ZWFtICk7CisKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgIC8vCisgICAgLy8gQmVmb3JlIHdlIGNhbiByZWFwIHRoZSB0aHJlYWQsIHdlIG5lZWQgdG8gbWFrZSBjZXJ0YWluIHRoYXQgYWxsCisgICAgLy8gb3RoZXIgdGhyZWFkcyBpbiB0aGUgdGVhbXMgdGhhdCBoYWQgdGhpcyByb290IGFzIGFuY2VzdG9yIGhhdmUgc3RvcHBlZCB0cnlpbmcgdG8gc3RlYWwgdGFza3MuCisgICAgLy8KKyAgICBpZiAoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICkgeworICAgICAgICBfX2ttcF93YWl0X3RvX3VucmVmX3Rhc2tfdGVhbXMoKTsKKyAgICB9CisjZW5kaWYgLyogT01QXzMwX0VOQUJMRUQgKi8KKworICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICAvKiBDbG9zZSBIYW5kbGUgb2Ygcm9vdCBkdXBsaWNhdGVkIGluIF9fa21wX2NyZWF0ZV93b3JrZXIgKHRyICM2MjkxOSkgKi8KKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3Jlc2V0X3Jvb3Q6IGZyZWUgaGFuZGxlLCB0aCA9ICVwLCBoYW5kbGUgPSAlIiBLTVBfVUlOVFBUUl9TUEVDICJcbiIsCisgICAgICAgICAgICAoTFBWT0lEKSYocm9vdC0+ci5yX3ViZXJfdGhyZWFkLT50aCksCisgICAgICAgICAgICByb290LT5yLnJfdWJlcl90aHJlYWQtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkICkgKTsKKyAgICAgICAgX19rbXBfZnJlZV9oYW5kbGUoIHJvb3QtPnIucl91YmVyX3RocmVhZC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQgKTsKKyAgICAjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KKworICAgIFRDV180KF9fa21wX250aCwgX19rbXBfbnRoIC0gMSk7IC8vIF9fa21wX3JlYXBfdGhyZWFkIHdpbGwgZGVjcmVtZW50IF9fa21wX2FsbF9udGguCisgICAgX19rbXBfcmVhcF90aHJlYWQoIHJvb3QtPnIucl91YmVyX3RocmVhZCwgMSApOworCisgICAgICAgIC8vIFdlIGNhbm90IHB1dCByb290IHRocmVhZCB0byBfX2ttcF90aHJlYWRfcG9vbCwgc28gd2UgaGF2ZSB0byByZWFwIGl0IGlzdGVhZCBvZiBmcmVlaW5nLgorICAgIHJvb3QtPnIucl91YmVyX3RocmVhZCA9IE5VTEw7CisgICAgLyogbWFyayByb290IGFzIG5vIGxvbmdlciBpbiB1c2UgKi8KKyAgICByb290IC0+IHIucl9iZWdpbiA9IEZBTFNFOworCisgICAgcmV0dXJuIG47Cit9CisKK3ZvaWQKK19fa21wX3VucmVnaXN0ZXJfcm9vdF9jdXJyZW50X3RocmVhZCggaW50IGd0aWQgKQoreworICAgIGttcF9yb290X3QgKnJvb3QgPSBfX2ttcF9yb290W2d0aWRdOworCisgICAgS0FfVFJBQ0UoIDEsICgiX19rbXBfdW5yZWdpc3Rlcl9yb290X2N1cnJlbnRfdGhyZWFkOiBlbnRlciBUIyVkXG4iLCBndGlkICkpOworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3RocmVhZHMgJiYgX19rbXBfdGhyZWFkc1tndGlkXSApOworICAgIEtNUF9BU1NFUlQoIEtNUF9VQkVSX0dUSUQoIGd0aWQgKSk7CisgICAgS01QX0FTU0VSVCggcm9vdCA9PSBfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF9yb290ICk7CisgICAgS01QX0FTU0VSVCggcm9vdC0+ci5yX2FjdGl2ZSA9PSBGQUxTRSApOworCisgICAgLyogdGhpcyBsb2NrIHNob3VsZCBiZSBvaywgc2luY2UgdW5yZWdpc3Rlcl9yb290X2N1cnJlbnRfdGhyZWFkIGlzIG5ldmVyIGNhbGxlZCBkdXJpbmcKKyAgICAgKiBhbmQgYWJvcnQsIG9ubHkgZHVyaW5nIGEgbm9ybWFsIGNsb3NlLiAgZnVydGhlcm1vcmUsIGlmIHlvdSBoYXZlIHRoZQorICAgICAqIGZvcmtqb2luIGxvY2ssIHlvdSBzaG91bGQgbmV2ZXIgdHJ5IHRvIGdldCB0aGUgaW5pdHogbG9jayAqLworCisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJl9fa21wX2Zvcmtqb2luX2xvY2sgKTsKKworICAgIEtNUF9NQigpOworCisgICAgX19rbXBfcmVzZXRfcm9vdChndGlkLCByb290KTsKKworICAgIC8qIGZyZWUgdXAgdGhpcyB0aHJlYWQgc2xvdCAqLworICAgIF9fa21wX2d0aWRfc2V0X3NwZWNpZmljKCBLTVBfR1RJRF9ETkUgKTsKKyNpZmRlZiBLTVBfVERBVEFfR1RJRAorICAgIF9fa21wX2d0aWQgPSBLTVBfR1RJRF9ETkU7CisjZW5kaWYKKworICAgIEtNUF9NQigpOworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcF91bnJlZ2lzdGVyX3Jvb3RfY3VycmVudF90aHJlYWQ6IFQjJWQgdW5yZWdpc3RlcmVkXG4iLCBndGlkICkpOworCisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2Zvcmtqb2luX2xvY2sgKTsKK30KKworLyogX19rbXBfZm9ya2pvaW5fbG9jayBtdXN0IGJlIGFscmVhZHkgaGVsZAorICAgVW5yZWdpc3RlcnMgYSByb290IHRocmVhZCB0aGF0IGlzIG5vdCB0aGUgY3VycmVudCB0aHJlYWQuICBSZXR1cm5zIHRoZSBudW1iZXIgb2YKKyAgIF9fa21wX3RocmVhZHMgZW50cmllcyBmcmVlZCBhcyBhIHJlc3VsdC4KKyAqLworc3RhdGljIGludAorX19rbXBfdW5yZWdpc3Rlcl9yb290X290aGVyX3RocmVhZCggaW50IGd0aWQgKQoreworICAgIGttcF9yb290X3QgKnJvb3QgPSBfX2ttcF9yb290W2d0aWRdOworICAgIGludCByOworCisgICAgS0FfVFJBQ0UoIDEsICgiX19rbXBfdW5yZWdpc3Rlcl9yb290X290aGVyX3RocmVhZDogZW50ZXIgVCMlZFxuIiwgZ3RpZCApKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90aHJlYWRzICYmIF9fa21wX3RocmVhZHNbZ3RpZF0gKTsKKyAgICBLTVBfQVNTRVJUKCBLTVBfVUJFUl9HVElEKCBndGlkICkpOworICAgIEtNUF9BU1NFUlQoIHJvb3QgPT0gX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfcm9vdCApOworICAgIEtNUF9BU1NFUlQoIHJvb3QtPnIucl9hY3RpdmUgPT0gRkFMU0UgKTsKKworICAgIHIgPSBfX2ttcF9yZXNldF9yb290KGd0aWQsIHJvb3QpOworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcF91bnJlZ2lzdGVyX3Jvb3Rfb3RoZXJfdGhyZWFkOiBUIyVkIHVucmVnaXN0ZXJlZFxuIiwgZ3RpZCApKTsKKyAgICByZXR1cm4gcjsKK30KKworI2lmIE9NUF8zMF9FTkFCTEVECisKKyNpZiBLTVBfREVCVUcKK3ZvaWQgX19rbXBfdGFza19pbmZvKCkgeworCisgICAga21wX2ludDMyIGd0aWQgICAgICAgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAga21wX2ludDMyIHRpZCAgICAgICAgPSBfX2ttcF90aWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAga21wX2luZm9fdCAqdGhpc190aHIgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAga21wX3RlYW1fdCAqc3RlYW0gICAgPSB0aGlzX3RociAtPiB0aC50aF9zZXJpYWxfdGVhbTsKKyAgICBrbXBfdGVhbV90ICp0ZWFtICAgICA9IHRoaXNfdGhyIC0+IHRoLnRoX3RlYW07CisKKyAgICBfX2ttcF9wcmludGYoICJfX2ttcF90YXNrX2luZm86IGd0aWQ9JWQgdGlkPSVkIHRfdGhyZWFkPSVwIHRlYW09JXAgY3VydGFzaz0lcCBwdGFzaz0lcFxuIiwKKyAgICAgICAgZ3RpZCwgdGlkLCB0aGlzX3RociwgdGVhbSwgdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzaywgdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS50ZF9wYXJlbnQgKTsKK30KKyNlbmRpZiAvLyBLTVBfREVCVUcKKworI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisKKy8qIFRPRE8gb3B0aW1pemUgd2l0aCBvbmUgYmlnIG1lbWNsciwgdGFrZSBvdXQgd2hhdCBpc24ndCBuZWVkZWQsCisgKiBzcGxpdCByZXNwb25zaWxpdHkgdG8gd29ya2VycyBhcyBtdWNoIGFzIHBvc3NpYmxlLCBhbmQgZGVsYXkKKyAqIGluaXRpYWxpemF0aW9uIG9mIGZlYXR1cmVzIGFzIG11Y2ggYXMgcG9zc2libGUgICovCitzdGF0aWMgdm9pZAorX19rbXBfaW5pdGlhbGl6ZV9pbmZvKCBrbXBfaW5mb190ICp0aGlzX3Rociwga21wX3RlYW1fdCAqdGVhbSwgaW50IHRpZCwgaW50IGd0aWQgKQoreworICAgIC8qIHRoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgaXMgc2V0dXAgaW4ga21wX2FsbG9jYXRlX3RocmVhZC9jcmVhdGVfd29ya2VyCisgICAgICogdGhpc190aHItPnRoLnRoX3NlcmlhbF90ZWFtIGlzIHNldHVwIGluIF9fa21wX2FsbG9jYXRlX3RocmVhZCAqLworCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHIgIT0gTlVMTCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyIC0+IHRoLnRoX3NlcmlhbF90ZWFtICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0gLT4gdC50X3RocmVhZHMgICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSAtPiB0LnRfZGlzcGF0Y2ggKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtIC0+IHQudF90aHJlYWRzWzBdICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSAtPiB0LnRfdGhyZWFkc1swXSAtPiB0aC50aF9yb290ICk7CisKKyAgICBLTVBfTUIoKTsKKworICAgIFRDV19TWU5DX1BUUih0aGlzX3Roci0+dGgudGhfdGVhbSwgdGVhbSk7CisKKyAgICB0aGlzX3Roci0+dGgudGhfaW5mby5kcy5kc190aWQgID0gdGlkOworICAgIHRoaXNfdGhyLT50aC50aF9zZXRfbnByb2MgICAgICAgPSAwOworI2lmIE9NUF80MF9FTkFCTEVECisgICAgdGhpc190aHItPnRoLnRoX3NldF9wcm9jX2JpbmQgICA9IHByb2NfYmluZF9kZWZhdWx0OworIyBpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgdGhpc190aHItPnRoLnRoX25ld19wbGFjZSAgICAgICA9IHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3BsYWNlOworIyBlbmRpZgorI2VuZGlmCisgICAgdGhpc190aHItPnRoLnRoX3Jvb3QgICAgICAgICAgICA9IHRlYW0gLT4gdC50X3RocmVhZHNbMF0gLT4gdGgudGhfcm9vdDsKKworICAgIC8qIHNldHVwIHRoZSB0aHJlYWQncyBjYWNoZSBvZiB0aGUgdGVhbSBzdHJ1Y3R1cmUgKi8KKyAgICB0aGlzX3Roci0+dGgudGhfdGVhbV9ucHJvYyAgICAgID0gdGVhbSAtPiB0LnRfbnByb2M7CisgICAgdGhpc190aHItPnRoLnRoX3RlYW1fbWFzdGVyICAgICA9IHRlYW0gLT4gdC50X3RocmVhZHNbMF07CisgICAgdGhpc190aHItPnRoLnRoX3RlYW1fc2VyaWFsaXplZCA9IHRlYW0gLT4gdC50X3NlcmlhbGl6ZWQ7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICB0aGlzX3Roci0+dGgudGhfdGVhbV9taWNyb3Rhc2sgID0gdGVhbSAtPiB0LnRfdGhyZWFkc1swXSAtPiB0aC50aF90ZWFtX21pY3JvdGFzazsKKyAgICB0aGlzX3Roci0+dGgudGhfdGVhbXNfbGV2ZWwgICAgID0gdGVhbSAtPiB0LnRfdGhyZWFkc1swXSAtPiB0aC50aF90ZWFtc19sZXZlbDsKKyAgICB0aGlzX3Roci0+dGgudGhfc2V0X250aF90ZWFtcyAgID0gdGVhbSAtPiB0LnRfdGhyZWFkc1swXSAtPiB0aC50aF9zZXRfbnRoX3RlYW1zOworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgVENXX1BUUih0aGlzX3Roci0+dGgudGhfc2xlZXBfbG9jLCBOVUxMKTsKKworI2lmIE9NUF8zMF9FTkFCTEVECisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSAtPiB0LnRfaW1wbGljaXRfdGFza190YXNrZGF0YSApOworICAgIHRoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlID0gMDsKKworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfaW5pdGlhbGl6ZV9pbmZvMTogVCMlZDolZCB0aGlzX3RocmVhZD0lcCBjdXJ0YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgICB0aWQsIGd0aWQsIHRoaXNfdGhyLCB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrICkgKTsKKworICAgIF9fa21wX2luaXRfaW1wbGljaXRfdGFzayggdGhpc190aHItPnRoLnRoX3RlYW1fbWFzdGVyLT50aC50aF9pZGVudCwgdGhpc190aHIsIHRlYW0sIHRpZCwgVFJVRSApOworCisgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9pbml0aWFsaXplX2luZm8yOiBUIyVkOiVkIHRoaXNfdGhyZWFkPSVwIGN1cnRhc2s9JXBcbiIsCisgICAgICAgICAgICAgICAgICAgIHRpZCwgZ3RpZCwgdGhpc190aHIsIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2sgKSApOworICAgIC8vIFRPRE86IEluaXRpYWxpemUgSUNWcyBmcm9tIHBhcmVudDsgR0VIIC0gaXNuJ3QgdGhhdCBhbHJlYWR5IGRvbmUgaW4gX19rbXBfaW5pdGlhbGl6ZV90ZWFtKCk/CisjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKworICAgIC8qIFRPRE8gbm8gd29ya3NoYXJpbmcgaW4gc3BlY3VsYXRpdmUgdGhyZWFkcyAqLworICAgIHRoaXNfdGhyIC0+IHRoLnRoX2Rpc3BhdGNoICAgICAgPSAmdGVhbSAtPiB0LnRfZGlzcGF0Y2hbIHRpZCBdOworCisgICAgdGhpc190aHItPnRoLnRoX2xvY2FsLnRoaXNfY29uc3RydWN0ID0gMDsKKyAgICB0aGlzX3Roci0+dGgudGhfbG9jYWwubGFzdF9jb25zdHJ1Y3QgPSAwOworCisjaWZkZWYgQlVJTERfVFYKKyAgICB0aGlzX3Roci0+dGgudGhfbG9jYWwudHZfZGF0YSA9IDA7CisjZW5kaWYKKworICAgIGlmICggISB0aGlzX3Roci0+dGgudGhfcHJpX2NvbW1vbiApIHsKKyAgICAgICAgdGhpc190aHItPnRoLnRoX3ByaV9jb21tb24gPSAoc3RydWN0IGNvbW1vbl90YWJsZSAqKSBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKHN0cnVjdCBjb21tb25fdGFibGUpICk7CisgICAgICAgIGlmICggX19rbXBfc3RvcmFnZV9tYXAgKSB7CisgICAgICAgICAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKAorICAgICAgICAgICAgICAgIGd0aWQsIHRoaXNfdGhyLT50aC50aF9wcmlfY29tbW9uLCB0aGlzX3Roci0+dGgudGhfcHJpX2NvbW1vbiArIDEsCisgICAgICAgICAgICAgICAgc2l6ZW9mKCBzdHJ1Y3QgY29tbW9uX3RhYmxlICksICJ0aF8lZC50aF9wcmlfY29tbW9uXG4iLCBndGlkCisgICAgICAgICAgICApOworICAgICAgICB9OyAvLyBpZgorICAgICAgICB0aGlzX3Roci0+dGgudGhfcHJpX2hlYWQgPSBOVUxMOworICAgIH07IC8vIGlmCisKKyAgICAvKiBJbml0aWFsaXplIGR5bmFtaWMgZGlzcGF0Y2ggKi8KKyAgICB7CisgICAgICAgIHZvbGF0aWxlIGttcF9kaXNwX3QgKmRpc3BhdGNoID0gdGhpc190aHIgLT4gdGgudGhfZGlzcGF0Y2g7CisgICAgICAgIC8qCisgICAgICAgICAqIFVzZSB0ZWFtIG1heF9ucHJvYyBzaW5jZSB0aGlzIHdpbGwgbmV2ZXIgY2hhbmdlIGZvciB0aGUgdGVhbS4KKyAgICAgICAgICovCisgICAgICAgIHNpemVfdCBkaXNwX3NpemUgPSBzaXplb2YoIGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ICkgKgorICAgICAgICAgICAgKCB0ZWFtLT50LnRfbWF4X25wcm9jID09IDEgPyAxIDogS01QX01BWF9ESVNQX0JVRiApOworICAgICAgICBLRF9UUkFDRSggMTAsICgiX19rbXBfaW5pdGlhbGl6ZV9pbmZvOiBUIyVkIG1heF9ucHJvYzogJWRcbiIsIGd0aWQsIHRlYW0tPnQudF9tYXhfbnByb2MgKSApOworICAgICAgICBLTVBfQVNTRVJUKCBkaXNwYXRjaCApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtIC0+IHQudF9kaXNwYXRjaCApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBkaXNwYXRjaCA9PSAmdGVhbS0+dC50X2Rpc3BhdGNoWyB0aWQgXSApOworCisgICAgICAgIGRpc3BhdGNoLT50aF9kaXNwX2luZGV4ID0gMDsKKworICAgICAgICBpZiggISBkaXNwYXRjaCAtPiB0aF9kaXNwX2J1ZmZlciApICB7CisgICAgICAgICAgICBkaXNwYXRjaCAtPiB0aF9kaXNwX2J1ZmZlciA9IChkaXNwYXRjaF9wcml2YXRlX2luZm9fdCAqKSBfX2ttcF9hbGxvY2F0ZSggZGlzcF9zaXplICk7CisKKyAgICAgICAgICAgIGlmICggX19rbXBfc3RvcmFnZV9tYXAgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggZ3RpZCwgJmRpc3BhdGNoLT50aF9kaXNwX2J1ZmZlclsgMCBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlzcGF0Y2gtPnRoX2Rpc3BfYnVmZmVyWyB0ZWFtLT50LnRfbWF4X25wcm9jID09IDEgPyAxIDogS01QX01BWF9ESVNQX0JVRiBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwX3NpemUsICJ0aF8lZC50aF9kaXNwYXRjaC50aF9kaXNwX2J1ZmZlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIodGVhbV8lZC50X2Rpc3BhdGNoWyVkXS50aF9kaXNwX2J1ZmZlcikiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIGd0aWQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lbXNldCggJiBkaXNwYXRjaCAtPiB0aF9kaXNwX2J1ZmZlclswXSwgJ1wwJywgZGlzcF9zaXplICk7CisgICAgICAgIH0KKworICAgICAgICBkaXNwYXRjaCAtPiB0aF9kaXNwYXRjaF9wcl9jdXJyZW50ID0gMDsKKyAgICAgICAgZGlzcGF0Y2ggLT4gdGhfZGlzcGF0Y2hfc2hfY3VycmVudCA9IDA7CisKKyAgICAgICAgZGlzcGF0Y2ggLT4gdGhfZGVvX2ZjbiA9IDA7ICAgICAgICAgICAgIC8qIE9SREVSRUQgICAgICovCisgICAgICAgIGRpc3BhdGNoIC0+IHRoX2R4b19mY24gPSAwOyAgICAgICAgICAgICAvKiBFTkQgT1JERVJFRCAqLworICAgIH0KKworICAgIHRoaXNfdGhyLT50aC50aF9uZXh0X3Bvb2wgPSBOVUxMOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggIXRoaXNfdGhyLT50aC50aF9zcGluX2hlcmUgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3Roci0+dGgudGhfbmV4dF93YWl0aW5nID09IDAgKTsKKworICAgIEtNUF9NQigpOworfQorCisKKy8qIGFsbG9jYXRlIGEgbmV3IHRocmVhZCBmb3IgdGhlIHJlcXVlc3RpbmcgdGVhbS4gIHRoaXMgaXMgb25seSBjYWxsZWQgZnJvbSB3aXRoaW4gYQorICogZm9ya2pvaW4gY3JpdGljYWwgc2VjdGlvbi4gIHdlIHdpbGwgZmlyc3QgdHJ5IHRvIGdldCBhbiBhdmFpbGFibGUgdGhyZWFkIGZyb20gdGhlCisgKiB0aHJlYWQgcG9vbC4gIGlmIG5vbmUgaXMgYXZhaWxhYmxlLCB3ZSB3aWxsIGZvcmsgYSBuZXcgb25lIGFzc3VtaW5nIHdlIGFyZSBhYmxlCisgKiB0byBjcmVhdGUgYSBuZXcgb25lLiAgdGhpcyBzaG91bGQgYmUgYXNzdXJlZCwgYXMgdGhlIGNhbGxlciBzaG91bGQgY2hlY2sgb24gdGhpcworICogZmlyc3QuCisgKi8KK2ttcF9pbmZvX3QgKgorX19rbXBfYWxsb2NhdGVfdGhyZWFkKCBrbXBfcm9vdF90ICpyb290LCBrbXBfdGVhbV90ICp0ZWFtLCBpbnQgbmV3X3RpZCApCit7CisgICAga21wX3RlYW1fdCAgKnNlcmlhbF90ZWFtOworICAgIGttcF9pbmZvX3QgICpuZXdfdGhyOworICAgIGludCAgICAgICAgICBuZXdfZ3RpZDsKKworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9hbGxvY2F0ZV90aHJlYWQ6IFQjJWRcbiIsIF9fa21wX2dldF9ndGlkKCkgKSk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggcm9vdCAmJiB0ZWFtICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggS01QX01BU1RFUl9HVElEKCBfX2ttcF9nZXRfZ3RpZCgpICkpOworICAgIEtNUF9NQigpOworCisgICAgLyogZmlyc3QsIHRyeSB0byBnZXQgb25lIGZyb20gdGhlIHRocmVhZCBwb29sICovCisgICAgaWYgKCBfX2ttcF90aHJlYWRfcG9vbCApIHsKKworICAgICAgICBuZXdfdGhyID0gKGttcF9pbmZvX3QqKV9fa21wX3RocmVhZF9wb29sOworICAgICAgICBfX2ttcF90aHJlYWRfcG9vbCA9ICh2b2xhdGlsZSBrbXBfaW5mb190ICopIG5ld190aHItPnRoLnRoX25leHRfcG9vbDsKKyAgICAgICAgaWYgKCBuZXdfdGhyID09IF9fa21wX3RocmVhZF9wb29sX2luc2VydF9wdCApIHsKKyAgICAgICAgICAgIF9fa21wX3RocmVhZF9wb29sX2luc2VydF9wdCA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgVENXXzQobmV3X3Roci0+dGgudGhfaW5fcG9vbCwgRkFMU0UpOworICAgICAgICAvLworICAgICAgICAvLyBEb24ndCB0b3VjaCB0aF9hY3RpdmVfaW5fcG9vbCBvciB0aF9hY3RpdmUuCisgICAgICAgIC8vIFRoZSB3b3JrZXIgdGhyZWFkIGFkanVzdHMgdGhvc2UgZmxhZ3MgYXMgaXQgc2xlZXBzL2F3YWtlbnMuCisgICAgICAgIC8vCisKKyAgICAgICAgX19rbXBfdGhyZWFkX3Bvb2xfbnRoLS07CisKKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2FsbG9jYXRlX3RocmVhZDogVCMlZCB1c2luZyB0aHJlYWQgVCMlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfZ2V0X2d0aWQoKSwgbmV3X3Roci0+dGgudGhfaW5mby5kcy5kc19ndGlkICkpOworICAgICAgICBLTVBfQVNTRVJUKCAgICAgICAhIG5ld190aHIgLT4gdGgudGhfdGVhbSApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9udGggPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5ICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3RocmVhZF9wb29sX250aCA+PSAwICk7CisKKyAgICAgICAgLyogc2V0dXAgdGhlIHRocmVhZCBzdHJ1Y3R1cmUgKi8KKyAgICAgICAgX19rbXBfaW5pdGlhbGl6ZV9pbmZvKCBuZXdfdGhyLCB0ZWFtLCBuZXdfdGlkLCBuZXdfdGhyLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggbmV3X3Roci0+dGgudGhfc2VyaWFsX3RlYW0gKTsKKworICAgICAgICBUQ1dfNChfX2ttcF9udGgsIF9fa21wX250aCArIDEpOworCisjaWZkZWYgS01QX0FESlVTVF9CTE9DS1RJTUUKKyAgICAgICAgLyogQWRqdXN0IGJsb2NrdGltZSBiYWNrIHRvIHplcm8gaWYgbmVjZXNzYXIgICAgICB5ICovCisgICAgICAgIC8qIE1pZGRsZSBpbml0aWFsaXphdGlvbiBtaWdodCBub3QgaGF2ZSBvY2N1cnJlZCB5ZXQgKi8KKyAgICAgICAgaWYgKCAhX19rbXBfZW52X2Jsb2NrdGltZSAmJiAoIF9fa21wX2F2YWlsX3Byb2MgPiAwICkgKSB7CisgICAgICAgICAgICBpZiAoIF9fa21wX250aCA+IF9fa21wX2F2YWlsX3Byb2MgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfemVyb19idCA9IFRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvKiBLTVBfQURKVVNUX0JMT0NLVElNRSAqLworCisgICAgICAgIEtGX1RSQUNFKCAxMCwgKCJfX2ttcF9hbGxvY2F0ZV90aHJlYWQ6IFQjJWQgdXNpbmcgdGhyZWFkICVwIFQjJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2dldF9ndGlkKCksIG5ld190aHIsIG5ld190aHItPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCApKTsKKworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgcmV0dXJuIG5ld190aHI7CisgICAgfQorCisKKyAgICAvKiBubywgd2VsbCBmb3JrIGEgbmV3IG9uZSAqLworICAgIEtNUF9BU1NFUlQoIF9fa21wX250aCAgICA9PSBfX2ttcF9hbGxfbnRoICk7CisgICAgS01QX0FTU0VSVCggX19rbXBfYWxsX250aCA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHkgKTsKKworICAgIC8vCisgICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3Qgd29ya2VyIHRocmVhZCB0aGUgUlRMIGlzIGNyZWF0aW5nLCB0aGVuIGFsc28KKyAgICAvLyBsYXVuY2ggdGhlIG1vbml0b3IgdGhyZWFkLiAgV2UgdHJ5IHRvIGRvIHRoaXMgYXMgZWFybHkgYXMgcG9zc2libGUuCisgICAgLy8KKyAgICBpZiAoICEgVENSXzQoIF9fa21wX2luaXRfbW9uaXRvciApICkgeworICAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX21vbml0b3JfbG9jayApOworICAgICAgICBpZiAoICEgVENSXzQoIF9fa21wX2luaXRfbW9uaXRvciApICkgeworICAgICAgICAgICAgS0ZfVFJBQ0UoIDEwLCAoICJiZWZvcmUgX19rbXBfY3JlYXRlX21vbml0b3JcbiIgKSApOworICAgICAgICAgICAgVENXXzQoIF9fa21wX2luaXRfbW9uaXRvciwgMSApOworICAgICAgICAgICAgX19rbXBfY3JlYXRlX21vbml0b3IoICYgX19rbXBfbW9uaXRvciApOworICAgICAgICAgICAgS0ZfVFJBQ0UoIDEwLCAoICJhZnRlciBfX2ttcF9jcmVhdGVfbW9uaXRvclxuIiApICk7CisgICAgICAgICAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgICAgICAgICAvLyBBQzogd2FpdCB1bnRpbCBtb25pdG9yIGhhcyBzdGFydGVkLiBUaGlzIGlzIGEgZml4IGZvciBDUTIzMjgwOC4KKyAgICAgICAgICAgICAgICAvLyAgICAgVGhlIHJlYXNvbiBpcyB0aGF0IGlmIHRoZSBsaWJyYXJ5IGlzIGxvYWRlZC91bmxvYWRlZCBpbiBhIGxvb3Agd2l0aCBzbWFsbCAocGFyYWxsZWwpCisgICAgICAgICAgICAgICAgLy8gICAgIHdvcmsgaW4gYmV0d2VlbiwgdGhlbiB0aGVyZSBpcyBoaWdoIHByb2JhYmlsaXR5IHRoYXQgbW9uaXRvciB0aHJlYWQgc3RhcnRlZCBhZnRlcgorICAgICAgICAgICAgICAgIC8vICAgICB0aGUgbGlicmFyeSBzaHV0ZG93bi4gQXQgc2h1dGRvd24gaXQgaXMgdG9vIGxhdGUgdG8gY29wZSB3aXRoIHRoZSBwcm9ibGVtLCBiZWNhdXNlCisgICAgICAgICAgICAgICAgLy8gICAgIHdoZW4gdGhlIG1hc3RlciBpcyBpbiBEbGxNYWluIChwcm9jZXNzIGRldGFjaCkgdGhlIG1vbml0b3IgaGFzIG5vIGNoYW5jZXMgdG8gc3RhcnQKKyAgICAgICAgICAgICAgICAvLyAgICAgKGl0IGlzIGJsb2NrZWQpLCBhbmQgbWFzdGVyIGhhcyBubyBtZWFucyB0byBpbmZvcm0gdGhlIG1vbml0b3IgdGhhdCB0aGUgbGlicmFyeSBoYXMgZ29uZSwKKyAgICAgICAgICAgICAgICAvLyAgICAgYmVjYXVzZSBhbGwgdGhlIG1lbW9yeSB3aGljaCB0aGUgbW9uaXRvciBjYW4gYWNjZXNzIGlzIGdvaW5nIHRvIGJlIHJlbGVhc2VkL3Jlc2V0LgorICAgICAgICAgICAgICAgIHdoaWxlICggVENSXzQoX19rbXBfaW5pdF9tb25pdG9yKSA8IDIgKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9ZSUVMRCggVFJVRSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBLRl9UUkFDRSggMTAsICggImFmdGVyIG1vbml0b3IgdGhyZWFkIGhhcyBzdGFydGVkXG4iICkgKTsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICB9CisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfbW9uaXRvcl9sb2NrICk7CisgICAgfQorCisgICAgS01QX01CKCk7CisgICAgZm9yKCBuZXdfZ3RpZD0xIDsgVENSX1BUUihfX2ttcF90aHJlYWRzW25ld19ndGlkXSkgIT0gTlVMTDsgKytuZXdfZ3RpZCApIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggbmV3X2d0aWQgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5ICk7CisgICAgfQorCisgICAgLyogYWxsb2NhdGUgc3BhY2UgZm9yIGl0LiAqLworICAgIG5ld190aHIgPSAoa21wX2luZm9fdCopIF9fa21wX2FsbG9jYXRlKCBzaXplb2Yoa21wX2luZm9fdCkgKTsKKworICAgIFRDV19TWU5DX1BUUihfX2ttcF90aHJlYWRzW25ld19ndGlkXSwgbmV3X3Rocik7CisKKyAgICBpZiAoIF9fa21wX3N0b3JhZ2VfbWFwICkgeworICAgICAgICBfX2ttcF9wcmludF90aHJlYWRfc3RvcmFnZV9tYXAoIG5ld190aHIsIG5ld19ndGlkICk7CisgICAgfQorCisgICAgLyogYWRkIHRoZSByZXNlcnZlIHNlcmlhbGl6ZWQgdGVhbSwgaW5pdGlhbGl6ZWQgZnJvbSB0aGUgdGVhbSdzIG1hc3RlciB0aHJlYWQgKi8KKyAgICB7CisgICAgI2lmIE9NUF8zMF9FTkFCTEVECisgICAga21wX2ludGVybmFsX2NvbnRyb2xfdCByX2ljdnMgPSBfX2ttcF9nZXRfeF9nbG9iYWxfaWN2cyggdGVhbSApOworICAgICNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfYWxsb2NhdGVfdGhyZWFkOiBiZWZvcmUgdGhfc2VyaWFsL3NlcmlhbF90ZWFtXG4iICkgKTsKKyAgICBuZXdfdGhyIC0+IHRoLnRoX3NlcmlhbF90ZWFtID0gc2VyaWFsX3RlYW0gPQorICAgICAgICAoa21wX3RlYW1fdCopIF9fa21wX2FsbG9jYXRlX3RlYW0oIHJvb3QsIDEsIDEsCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jX2JpbmRfZGVmYXVsdCwKKyNlbmRpZgorI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJfaWN2cywKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X3NldF9ucHJvY1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfc2V0X2R5bmFtaWNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X3NldF9uZXN0ZWRbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X3NldF9ibG9ja3RpbWVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X3NldF9idF9pbnRlcnZhbHNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X3NldF9idF9zZXRbMF0sCisjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICk7CisgICAgfQorICAgIEtNUF9BU1NFUlQgKCBzZXJpYWxfdGVhbSApOworICAgIHNlcmlhbF90ZWFtIC0+IHQudF9zZXJpYWxpemVkID0gMDsgICAvLyBBQzogdGhlIHRlYW0gY3JlYXRlZCBpbiByZXNlcnZlLCBub3QgZm9yIGV4ZWN1dGlvbiAoaXQgaXMgdW51c2VkIGZvciBub3cpLgorICAgIHNlcmlhbF90ZWFtIC0+IHQudF90aHJlYWRzWzBdID0gbmV3X3RocjsKKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX2FsbG9jYXRlX3RocmVhZDogYWZ0ZXIgdGhfc2VyaWFsL3NlcmlhbF90ZWFtIDogbmV3X3Rocj0lcFxuIiwKKyAgICAgIG5ld190aHIgKSApOworCisgICAgLyogc2V0dXAgdGhlIHRocmVhZCBzdHJ1Y3R1cmVzICovCisgICAgX19rbXBfaW5pdGlhbGl6ZV9pbmZvKCBuZXdfdGhyLCB0ZWFtLCBuZXdfdGlkLCBuZXdfZ3RpZCApOworCisgICAgI2lmIFVTRV9GQVNUX01FTU9SWQorICAgICAgICBfX2ttcF9pbml0aWFsaXplX2Zhc3RfbWVtb3J5KCBuZXdfdGhyICk7CisgICAgI2VuZGlmIC8qIFVTRV9GQVNUX01FTU9SWSAqLworCisgICAgI2lmIEtNUF9VU0VfQkdFVAorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBuZXdfdGhyIC0+IHRoLnRoX2xvY2FsLmJnZXRfZGF0YSA9PSBOVUxMICk7CisgICAgICAgIF9fa21wX2luaXRpYWxpemVfYmdldCggbmV3X3RociApOworICAgICNlbmRpZgorCisgICAgX19rbXBfaW5pdF9yYW5kb20oIG5ld190aHIgKTsgIC8vIEluaXRpYWxpemUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKworICAgIC8qIEluaXRpYWxpemUgdGhlc2Ugb25seSBvbmNlIHdoZW4gdGhyZWFkIGlzIGdyYWJiZWQgZm9yIGEgdGVhbSBhbGxvY2F0aW9uICovCisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2FsbG9jYXRlX3RocmVhZDogVCMlZCBpbml0IGdvIGZvcms9JXUsIHBsYWluPSV1XG4iLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9nZXRfZ3RpZCgpLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFICkpOworCisgICAgbmV3X3Roci0+dGgudGhfYmFyWyBic19mb3Jram9pbl9iYXJyaWVyIF0uYmIuYl9nbyA9IEtNUF9JTklUX0JBUlJJRVJfU1RBVEU7CisgICAgbmV3X3Roci0+dGgudGhfYmFyWyBic19wbGFpbl9iYXJyaWVyICAgIF0uYmIuYl9nbyA9IEtNUF9JTklUX0JBUlJJRVJfU1RBVEU7CisgICAgI2lmIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgbmV3X3Roci0+dGgudGhfYmFyWyBic19yZWR1Y3Rpb25fYmFycmllciBdLmJiLmJfZ28gPSBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFOworICAgICNlbmRpZiAvLyBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorCisgICAgbmV3X3Roci0+dGgudGhfc3Bpbl9oZXJlID0gRkFMU0U7CisgICAgbmV3X3Roci0+dGgudGhfbmV4dF93YWl0aW5nID0gMDsKKworI2lmIE9NUF80MF9FTkFCTEVEICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICBuZXdfdGhyLT50aC50aF9jdXJyZW50X3BsYWNlID0gS01QX1BMQUNFX1VOREVGSU5FRDsKKyAgICBuZXdfdGhyLT50aC50aF9uZXdfcGxhY2UgPSBLTVBfUExBQ0VfVU5ERUZJTkVEOworICAgIG5ld190aHItPnRoLnRoX2ZpcnN0X3BsYWNlID0gS01QX1BMQUNFX1VOREVGSU5FRDsKKyAgICBuZXdfdGhyLT50aC50aF9sYXN0X3BsYWNlID0gS01QX1BMQUNFX1VOREVGSU5FRDsKKyNlbmRpZgorCisgICAgVENXXzQobmV3X3Roci0+dGgudGhfaW5fcG9vbCwgRkFMU0UpOworICAgIG5ld190aHItPnRoLnRoX2FjdGl2ZV9pbl9wb29sID0gRkFMU0U7CisgICAgVENXXzQobmV3X3Roci0+dGgudGhfYWN0aXZlLCBUUlVFKTsKKworICAgIC8qIGFkanVzdCB0aGUgZ2xvYmFsIGNvdW50ZXJzICovCisgICAgX19rbXBfYWxsX250aCArKzsKKyAgICBfX2ttcF9udGggKys7CisKKyAgICAvLworICAgIC8vIGlmIF9fa21wX2FkanVzdF9ndGlkX21vZGUgaXMgc2V0LCB0aGVuIHdlIHVzZSBtZXRob2QgIzEgKHNwIHNlYXJjaCkKKyAgICAvLyBmb3IgbG93IG51bWJlcnMgb2YgcHJvY3MsIGFuZCBtZXRob2QgIzIgKGtleWVkIEFQSSBjYWxsKSBmb3IgaGlnaGVyCisgICAgLy8gbnVtYmVycyBvZiBwcm9jcy4KKyAgICAvLworICAgIGlmICggX19rbXBfYWRqdXN0X2d0aWRfbW9kZSApIHsKKyAgICAgICAgaWYgKCBfX2ttcF9hbGxfbnRoID49IF9fa21wX3Rsc19ndGlkX21pbiApIHsKKyAgICAgICAgICAgIGlmICggVENSXzQoX19rbXBfZ3RpZF9tb2RlKSAhPSAyKSB7CisgICAgICAgICAgICAgICAgVENXXzQoX19rbXBfZ3RpZF9tb2RlLCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChUQ1JfNChfX2ttcF9ndGlkX21vZGUpICE9IDEgKSB7CisgICAgICAgICAgICAgICAgVENXXzQoX19rbXBfZ3RpZF9tb2RlLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworI2lmZGVmIEtNUF9BREpVU1RfQkxPQ0tUSU1FCisgICAgLyogQWRqdXN0IGJsb2NrdGltZSBiYWNrIHRvIHplcm8gaWYgbmVjZXNzYXJ5ICAgICAgICovCisgICAgLyogTWlkZGxlIGluaXRpYWxpemF0aW9uIG1pZ2h0IG5vdCBoYXZlIG9jY3VycmVkIHlldCAqLworICAgIGlmICggIV9fa21wX2Vudl9ibG9ja3RpbWUgJiYgKCBfX2ttcF9hdmFpbF9wcm9jID4gMCApICkgeworICAgICAgICBpZiAoIF9fa21wX250aCA+IF9fa21wX2F2YWlsX3Byb2MgKSB7CisgICAgICAgICAgICBfX2ttcF96ZXJvX2J0ID0gVFJVRTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBLTVBfQURKVVNUX0JMT0NLVElNRSAqLworCisgICAgLyogYWN0dWFsbHkgZm9yayBpdCBhbmQgY3JlYXRlIHRoZSBuZXcgd29ya2VyIHRocmVhZCAqLworICAgIEtGX1RSQUNFKCAxMCwgKCJfX2ttcF9hbGxvY2F0ZV90aHJlYWQ6IGJlZm9yZSBfX2ttcF9jcmVhdGVfd29ya2VyOiAlcFxuIiwgbmV3X3RociApKTsKKyAgICBfX2ttcF9jcmVhdGVfd29ya2VyKCBuZXdfZ3RpZCwgbmV3X3RociwgX19rbXBfc3Rrc2l6ZSApOworICAgIEtGX1RSQUNFKCAxMCwgKCJfX2ttcF9hbGxvY2F0ZV90aHJlYWQ6IGFmdGVyIF9fa21wX2NyZWF0ZV93b3JrZXI6ICVwXG4iLCBuZXdfdGhyICkpOworCisKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfYWxsb2NhdGVfdGhyZWFkOiBUIyVkIGZvcmtlZCBUIyVkXG4iLCBfX2ttcF9nZXRfZ3RpZCgpLCBuZXdfZ3RpZCApKTsKKyAgICBLTVBfTUIoKTsKKyAgICByZXR1cm4gbmV3X3RocjsKK30KKworLyoKKyAqIHJlaW5pdGlhbGl6ZSB0ZWFtIGZvciByZXVzZS4KKyAqCisgKiBUaGUgaG90IHRlYW0gY29kZSBjYWxscyB0aGlzIGNhc2UgYXQgZXZlcnkgZm9yayBiYXJyaWVyLCBzbyBFUENDIGJhcnJpZXIKKyAqIHRlc3QgYXJlIGV4dHJlbWVseSBzZW5zaXRpdmUgdG8gY2hhbmdlcyBpbiBpdCwgZXNwLiB3cml0ZXMgdG8gdGhlIHRlYW0KKyAqIHN0cnVjdCwgd2hpY2ggY2F1c2UgYSBjYWNoZSBpbnZhbGlkYXRpb24gaW4gYWxsIHRocmVhZHMuCisgKgorICogSUYgWU9VIFRPVUNIIFRISVMgUk9VVElORSwgUlVOIEVQQ0MgQyBTWU5DQkVOQ0ggT04gQSBCSUctSVJPTiBNQUNISU5FISEhCisgKi8KK3N0YXRpYyB2b2lkCitfX2ttcF9yZWluaXRpYWxpemVfdGVhbSgga21wX3RlYW1fdCAqdGVhbSwKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnRlcm5hbF9jb250cm9sX3QgKm5ld19pY3ZzLCBpZGVudF90ICpsb2MKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5ld19zZXRfbnByb2MsIGludCBuZXdfc2V0X2R5bmFtaWMsIGludCBuZXdfc2V0X25lc3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmV3X3NldF9ibG9ja3RpbWUsIGludCBuZXdfYnRfaW50ZXJ2YWxzLCBpbnQgbmV3X2J0X3NldAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgKSB7CisgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9yZWluaXRpYWxpemVfdGVhbTogZW50ZXIgdGhpc190aHJlYWQ9JXAgdGVhbT0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X3RocmVhZHNbMF0sIHRlYW0gKSApOworI2lmIE9NUF8zMF9FTkFCTEVECisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSAmJiBuZXdfaWN2cyk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggKCAhIFRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpICkgfHwgbmV3X2ljdnMtPm5wcm9jICk7CisgICAgdGVhbS0+dC50X2lkZW50ID0gbG9jOworI2Vsc2UKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtICYmIG5ld19zZXRfbnByb2MgKTsKKyNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorCisgICAgdGVhbS0+dC50X2lkID0gS01QX0dFTl9URUFNX0lEKCk7CisKKyAgICAvLyBDb3B5IElDVnMgdG8gdGhlIG1hc3RlciB0aHJlYWQncyBpbXBsaWNpdCB0YXNrZGF0YQorI2lmIE9NUF8zMF9FTkFCTEVECisgICAgbG9hZF9pY3ZzKG5ld19pY3ZzKTsKKyAgICBfX2ttcF9pbml0X2ltcGxpY2l0X3Rhc2soIGxvYywgdGVhbS0+dC50X3RocmVhZHNbMF0sIHRlYW0sIDAsIEZBTFNFICk7CisgICAgc3RvcmVfaWN2cygmdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbMF0udGRfaWN2cywgbmV3X2ljdnMpOworICAgIHN5bmNfaWN2cygpOworIyBlbHNlCisgICAgdGVhbSAtPiB0LnRfc2V0X25wcm9jWzBdICAgPSBuZXdfc2V0X25wcm9jOworICAgIHRlYW0gLT4gdC50X3NldF9keW5hbWljWzBdID0gbmV3X3NldF9keW5hbWljOworICAgIHRlYW0gLT4gdC50X3NldF9uZXN0ZWRbMF0gID0gbmV3X3NldF9uZXN0ZWQ7CisgICAgdGVhbSAtPiB0LnRfc2V0X2Jsb2NrdGltZVswXSAgID0gbmV3X3NldF9ibG9ja3RpbWU7CisgICAgdGVhbSAtPiB0LnRfc2V0X2J0X2ludGVydmFsc1swXSA9IG5ld19idF9pbnRlcnZhbHM7CisgICAgdGVhbSAtPiB0LnRfc2V0X2J0X3NldFswXSAgPSBuZXdfYnRfc2V0OworIyBlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorCisgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9yZWluaXRpYWxpemVfdGVhbTogZXhpdCB0aGlzX3RocmVhZD0lcCB0ZWFtPSVwXG4iLAorICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfdGhyZWFkc1swXSwgdGVhbSApICk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zZXR1cF9pY3ZfY29weShrbXBfdGVhbV90ICogIHRlYW0sIGludCAgICAgICAgICAgbmV3X25wcm9jLAorI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgICAgICAga21wX2ludGVybmFsX2NvbnRyb2xfdCAqIG5ld19pY3ZzLAorICAgICAgICAgICAgICAgIGlkZW50X3QgKiAgICAgICAgICAgICAgICBsb2MKKyNlbHNlCisgICAgICAgICAgICAgICAgaW50IG5ld19zZXRfbnByb2MsIGludCBuZXdfc2V0X2R5bmFtaWMsIGludCBuZXdfc2V0X25lc3RlZCwKKyAgICAgICAgICAgICAgICBpbnQgbmV3X3NldF9ibG9ja3RpbWUsIGludCBuZXdfYnRfaW50ZXJ2YWxzLCBpbnQgbmV3X2J0X3NldAorI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgICAgICAgKQoreworICAgIGludCBmOworCisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtICYmIG5ld19ucHJvYyAmJiBuZXdfaWN2cyApOworICAgIEtNUF9ERUJVR19BU1NFUlQoICggISBUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSApIHx8IG5ld19pY3ZzLT5ucHJvYyApOworI2Vsc2UKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtICYmIG5ld19ucHJvYyAmJiBuZXdfc2V0X25wcm9jICk7CisjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKworICAgIC8vIE1hc3RlciB0aHJlYWQncyBjb3B5IG9mIHRoZSBJQ1ZzIHdhcyBzZXQgdXAgb24gdGhlIGltcGxpY2l0IHRhc2tkYXRhIGluIF9fa21wX3JlaW5pdGlhbGl6ZV90ZWFtLgorICAgIC8vIF9fa21wX2ZvcmtfY2FsbCgpIGFzc3VtZXMgdGhlIG1hc3RlciB0aHJlYWQncyBpbXBsaWNpdCB0YXNrIGhhcyB0aGlzIGRhdGEgYmVmb3JlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLgorI2lmIEtNUF9CQVJSSUVSX0lDVl9QVUxMCisgICAgLy8gQ29weSB0aGUgSUNWcyB0byBtYXN0ZXIncyB0aHJlYWQgc3RydWN0dXJlIGludG8gdGhfZml4ZWRfaWN2cyAod2hpY2ggcmVtYWlucyB1bnRvdWNoZWQpLCB3aGVyZSBhbGwgb2YgdGhlCisgICAgLy8gd29ya2VyIHRocmVhZHMgY2FuIGFjY2VzcyB0aGVtIGFuZCBtYWtlIHRoZWlyIG93biBjb3BpZXMgYWZ0ZXIgdGhlIGJhcnJpZXIuCisgICAgbG9hZF9pY3ZzKG5ld19pY3ZzKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRlYW0tPnQudF90aHJlYWRzWzBdKTsgIC8vIHRoZSB0aHJlYWRzIGFycmF5cyBzaG91bGQgYmUgYWxsb2NhdGVkIGF0IHRoaXMgcG9pbnQKKyAgICBzdG9yZV9pY3ZzKCZ0ZWFtLT50LnRfdGhyZWFkc1swXS0+dGgudGhfZml4ZWRfaWN2cywgbmV3X2ljdnMpOworICAgIHN5bmNfaWN2cygpOworICAgIEtGX1RSQUNFKDEwLCAoIl9fa21wX3NldHVwX2ljdl9jb3B5OiBQVUxMOiBUIyVkIHRoaXNfdGhyZWFkPSVwIHRlYW09JXBcbiIsIDAsIHRlYW0tPnQudF90aHJlYWRzWzBdLCB0ZWFtKSk7CisKKyNlbGlmIEtNUF9CQVJSSUVSX0lDVl9QVVNICisgICAgLy8gVGhlIElDVnMgd2lsbCBiZSBwcm9wYWdhdGVkIGluIHRoZSBmb3JrIGJhcnJpZXIsIHNvIG5vdGhpbmcgbmVlZHMgdG8gYmUgZG9uZSBoZXJlLgorICAgIEtGX1RSQUNFKDEwLCAoIl9fa21wX3NldHVwX2ljdl9jb3B5OiBQVVNIOiBUIyVkIHRoaXNfdGhyZWFkPSVwIHRlYW09JXBcbiIsIDAsIHRlYW0tPnQudF90aHJlYWRzWzBdLCB0ZWFtKSk7CisKKyNlbHNlCisgICAgLy8gQ29weSB0aGUgSUNWcyB0byBlYWNoIG9mIHRoZSBub24tbWFzdGVyIHRocmVhZHMuICBUaGlzIHRha2VzIE8obnRocmVhZHMpIHRpbWUuCisjIGlmIE9NUF8zMF9FTkFCTEVECisgICAgbG9hZF9pY3ZzKG5ld19pY3ZzKTsKKyMgZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRlYW0tPnQudF90aHJlYWRzWzBdKTsgIC8vIHRoZSB0aHJlYWRzIGFycmF5cyBzaG91bGQgYmUgYWxsb2NhdGVkIGF0IHRoaXMgcG9pbnQKKyAgICBmb3IoZj0xIDsgZjxuZXdfbnByb2MgOyBmKyspIHsgLy8gc2tpcCB0aGUgbWFzdGVyIHRocmVhZAorIyBpZiBPTVBfMzBfRU5BQkxFRAorICAgICAgICAvLyBUT0RPOiBHRUggLSBwYXNzIGluIGJldHRlciBzb3VyY2UgbG9jYXRpb24gaW5mbyBzaW5jZSB1c3VhbGx5IE5VTEwgaGVyZQorICAgICAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX3NldHVwX2ljdl9jb3B5OiBMSU5FQVI6IFQjJWQgdGhpc190aHJlYWQ9JXAgdGVhbT0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGYsIHRlYW0tPnQudF90aHJlYWRzW2ZdLCB0ZWFtICkgKTsKKyAgICAgICAgX19rbXBfaW5pdF9pbXBsaWNpdF90YXNrKCBsb2MsIHRlYW0tPnQudF90aHJlYWRzW2ZdLCB0ZWFtLCBmLCBGQUxTRSApOworICAgICAgICBzdG9yZV9pY3ZzKCZ0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVtmXS50ZF9pY3ZzLCBuZXdfaWN2cyk7CisgICAgICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfc2V0dXBfaWN2X2NvcHk6IExJTkVBUjogVCMlZCB0aGlzX3RocmVhZD0lcCB0ZWFtPSVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZiwgdGVhbS0+dC50X3RocmVhZHNbZl0sIHRlYW0gKSApOworIyBlbHNlCisgICAgICAgIHRlYW0gLT4gdC50X3NldF9ucHJvY1tmXSAgID0gbmV3X3NldF9ucHJvYzsKKyAgICAgICAgdGVhbSAtPiB0LnRfc2V0X2R5bmFtaWNbZl0gPSBuZXdfc2V0X2R5bmFtaWM7CisgICAgICAgIHRlYW0gLT4gdC50X3NldF9uZXN0ZWRbZl0gID0gbmV3X3NldF9uZXN0ZWQ7CisgICAgICAgIHRlYW0gLT4gdC50X3NldF9ibG9ja3RpbWVbZl0gICA9IG5ld19zZXRfYmxvY2t0aW1lOworICAgICAgICB0ZWFtIC0+IHQudF9zZXRfYnRfaW50ZXJ2YWxzW2ZdID0gbmV3X2J0X2ludGVydmFsczsKKyAgICAgICAgdGVhbSAtPiB0LnRfc2V0X2J0X3NldFtmXSAgPSBuZXdfYnRfc2V0OworIyBlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorICAgIH0KKyMgaWYgT01QXzMwX0VOQUJMRUQKKyAgICBzeW5jX2ljdnMoKTsKKyMgZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKyNlbmRpZiAvLyBLTVBfQkFSUklFUl9JQ1ZfUFVMTAorfQorCisvKiBpbml0aWFsaXplIHRoZSB0ZWFtIGRhdGEgc3RydWN0dXJlCisgKiB0aGlzIGFzc3VtZXMgdGhlIHRfdGhyZWFkcyBhbmQgdF9tYXhfbnByb2MgYXJlIGFscmVhZHkgc2V0CisgKiBhbHNvLCB3ZSBkb24ndCB0b3VjaCB0aGUgYXJndW1lbnRzICovCitzdGF0aWMgdm9pZAorX19rbXBfaW5pdGlhbGl6ZV90ZWFtKAorICAgIGttcF90ZWFtX3QgKiB0ZWFtLAorICAgIGludCAgICAgICAgICBuZXdfbnByb2MsCisgICAgI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgIGttcF9pbnRlcm5hbF9jb250cm9sX3QgKiBuZXdfaWN2cywKKyAgICAgICAgaWRlbnRfdCAqICAgICAgICAgICAgICAgIGxvYworICAgICNlbHNlCisgICAgICAgIGludCBuZXdfc2V0X25wcm9jLCBpbnQgbmV3X3NldF9keW5hbWljLCBpbnQgbmV3X3NldF9uZXN0ZWQsCisgICAgICAgIGludCBuZXdfc2V0X2Jsb2NrdGltZSwgaW50IG5ld19idF9pbnRlcnZhbHMsIGludCBuZXdfYnRfc2V0CisgICAgI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECispIHsKKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX2luaXRpYWxpemVfdGVhbTogZW50ZXI6IHRlYW09JXBcbiIsIHRlYW0gKSApOworCisgICAgLyogdmVyaWZ5ICovCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIG5ld19ucHJvYyA8PSB0ZWFtLT50LnRfbWF4X25wcm9jICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbS0+dC50X3RocmVhZHMgKTsKKyAgICBLTVBfTUIoKTsKKworICAgIHRlYW0gLT4gdC50X21hc3Rlcl90aWQgID0gMDsgICAgLyogbm90IG5lZWRlZCAqLworICAgIC8qIHRlYW0gLT4gdC50X21hc3Rlcl9iYXI7ICAgICAgICBub3QgbmVlZGVkICovCisgICAgdGVhbSAtPiB0LnRfc2VyaWFsaXplZCAgPSBuZXdfbnByb2MgPiAxID8gMCA6IDE7CisgICAgdGVhbSAtPiB0LnRfbnByb2MgICAgICAgPSBuZXdfbnByb2M7CisKKyAgICAvKiB0ZWFtIC0+IHQudF9wYXJlbnQgICAgID0gTlVMTDsgVE9ETyBub3QgbmVlZGVkICYgd291bGQgbWVzcyB1cCBob3QgdGVhbSAqLworICAgIHRlYW0gLT4gdC50X25leHRfcG9vbCAgID0gTlVMTDsKKyAgICAvKiBtZW1zZXQoIHRlYW0gLT4gdC50X3RocmVhZHMsIDAsIHNpemVvZihrbXBfaW5mb190KikqbmV3X25wcm9jICk7IHdvdWxkIG1lc3MgdXAgaG90IHRlYW0gKi8KKworICAgIFRDV19TWU5DX1BUUih0ZWFtLT50LnRfcGtmbiwgTlVMTCk7IC8qIG5vdCBuZWVkZWQgKi8KKyAgICB0ZWFtIC0+IHQudF9pbnZva2UgICAgICA9IE5VTEw7IC8qIG5vdCBuZWVkZWQgKi8KKworI2lmIE9NUF8zMF9FTkFCTEVECisgICAgLy8gVE9ETz8/PzogdGVhbSAtPiB0LnRfbWF4X2FjdGl2ZV9sZXZlbHMgICAgICAgPSBuZXdfbWF4X2FjdGl2ZV9sZXZlbHM7CisgICAgdGVhbSAtPiB0LnRfc2NoZWQgICAgICAgPSBuZXdfaWN2cy0+c2NoZWQ7CisjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyAgICB0ZWFtIC0+IHQudF9mcF9jb250cm9sX3NhdmVkID0gRkFMU0U7IC8qIG5vdCBuZWVkZWQgKi8KKyAgICB0ZWFtIC0+IHQudF94ODdfZnB1X2NvbnRyb2xfd29yZCA9IDA7IC8qIG5vdCBuZWVkZWQgKi8KKyAgICB0ZWFtIC0+IHQudF9teGNzciA9IDA7ICAgICAgICAgICAgICAgIC8qIG5vdCBuZWVkZWQgKi8KKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKyAgICB0ZWFtIC0+IHQudF9jb25zdHJ1Y3QgICA9IDA7CisgICAgX19rbXBfaW5pdF9sb2NrKCAmIHRlYW0gLT4gdC50X3NpbmdsZV9sb2NrICk7CisKKyAgICB0ZWFtIC0+IHQudF9vcmRlcmVkIC5kdC50X3ZhbHVlID0gMDsKKyAgICB0ZWFtIC0+IHQudF9tYXN0ZXJfYWN0aXZlID0gRkFMU0U7CisKKyAgICBtZW1zZXQoICYgdGVhbSAtPiB0LnRfdGFza3EsICdcMCcsIHNpemVvZigga21wX3Rhc2txX3QgKSk7CisKKyNpZmRlZiBLTVBfREVCVUcKKyAgICB0ZWFtIC0+IHQudF9jb3B5cHJpdl9kYXRhID0gTlVMTDsgIC8qIG5vdCBuZWNlc3NhcnksIGJ1dCBuaWNlIGZvciBkZWJ1Z2dpbmcgKi8KKyNlbmRpZgorICAgIHRlYW0gLT4gdC50X2NvcHlpbl9jb3VudGVyID0gMDsgICAgLyogZm9yIGJhcnJpZXItZnJlZSBjb3B5aW4gaW1wbGVtZW50YXRpb24gKi8KKworICAgIHRlYW0gLT4gdC50X2NvbnRyb2xfc3RhY2tfdG9wID0gTlVMTDsKKworICAgIF9fa21wX3JlaW5pdGlhbGl6ZV90ZWFtKCB0ZWFtLAorI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19pY3ZzLCBsb2MKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19zZXRfbnByb2MsIG5ld19zZXRfZHluYW1pYywgbmV3X3NldF9uZXN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19zZXRfYmxvY2t0aW1lLCBuZXdfYnRfaW50ZXJ2YWxzLCBuZXdfYnRfc2V0CisjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworCisgICAgS01QX01CKCk7CisgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9pbml0aWFsaXplX3RlYW06IGV4aXQ6IHRlYW09JXBcbiIsIHRlYW0gKSApOworfQorCisjaWYgS01QX09TX0xJTlVYICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKy8qIFNldHMgZnVsbCBtYXNrIGZvciB0aHJlYWQgYW5kIHJldHVybnMgb2xkIG1hc2ssIG5vIGNoYW5nZXMgdG8gc3RydWN0dXJlcy4gKi8KK3N0YXRpYyB2b2lkCitfX2ttcF9zZXRfdGhyZWFkX2FmZmluaXR5X21hc2tfZnVsbF90bXAoIGttcF9hZmZpbl9tYXNrX3QgKm9sZF9tYXNrICkKK3sKKyAgICBpZiAoIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkgKSB7CisgICAgICAgIGludCBzdGF0dXM7CisgICAgICAgIGlmICggb2xkX21hc2sgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IF9fa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkoIG9sZF9tYXNrLCBUUlVFICk7CisgICAgICAgICAgICBpbnQgZXJyb3IgPSBlcnJubzsKKyAgICAgICAgICAgIGlmICggc3RhdHVzICE9IDAgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIENoYW5nZVRocmVhZEFmZk1hc2tFcnJvciApLAorICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eSggX19rbXBfYWZmaW5pdHlfZ2V0X2Z1bGxNYXNrKCksIFRSVUUgKTsKKyAgICB9Cit9CisjZW5kaWYKKworI2lmIE9NUF80MF9FTkFCTEVEICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKworLy8KKy8vIF9fa21wX3BhcnRpdGlvbl9wbGFjZXMoKSBpcyB0aGUgaGVhcnQgb2YgdGhlIE9wZW5NUCA0LjAgYWZmaW5pdHkgbWVjaGFuaXNtLgorLy8gSXQgY2FsY3VsYXRzIHRoZSB3b3JrZXIgKyBtYXN0ZXIgdGhyZWFkJ3MgcGFydGl0aW9uIGJhc2VkIHVwb24gdGhlIHBhcmVudAorLy8gdGhyZWFkJ3MgcGFydGl0aW9uLCBhbmQgYmluZHMgZWFjaCB3b3JrZXIgdG8gYSB0aHJlYWQgaW4gdGhlaXIgcGFydGl0aW9uLgorLy8gVGhlIG1hc3RlciB0aHJlYWQncyBwYXJ0aXRpb24gc2hvdWxkIGFscmVhZHkgaW5jbHVkZSBpdHMgY3VycmVudCBiaW5kaW5nLgorLy8KK3N0YXRpYyB2b2lkCitfX2ttcF9wYXJ0aXRpb25fcGxhY2VzKCBrbXBfdGVhbV90ICp0ZWFtICkKK3sKKyAgICAvLworICAgIC8vIENvcHkgdGhlIG1hc3RlciB0aHJlYWQncyBwbGFjZSBwYXJ0aW9uIHRvIHRoZSB0ZWFtIHN0cnVjdAorICAgIC8vCisgICAga21wX2luZm9fdCAqbWFzdGVyX3RoID0gdGVhbS0+dC50X3RocmVhZHNbMF07CisgICAgS01QX0RFQlVHX0FTU0VSVCggbWFzdGVyX3RoICE9IE5VTEwgKTsKKyAgICBrbXBfcHJvY19iaW5kX3QgcHJvY19iaW5kID0gdGVhbS0+dC50X3Byb2NfYmluZDsKKyAgICBpbnQgZmlyc3RfcGxhY2UgPSBtYXN0ZXJfdGgtPnRoLnRoX2ZpcnN0X3BsYWNlOworICAgIGludCBsYXN0X3BsYWNlID0gbWFzdGVyX3RoLT50aC50aF9sYXN0X3BsYWNlOworICAgIGludCBtYXN0ZXJzX3BsYWNlID0gbWFzdGVyX3RoLT50aC50aF9jdXJyZW50X3BsYWNlOworICAgIHRlYW0tPnQudF9maXJzdF9wbGFjZSA9IGZpcnN0X3BsYWNlOworICAgIHRlYW0tPnQudF9sYXN0X3BsYWNlID0gbGFzdF9wbGFjZTsKKworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9wYXJ0aXRpb25fcGxhY2VzOiBlbnRlcjogcHJvY19iaW5kID0gJWQgVCMlZCglZDowKSBib3VuZCB0byBwbGFjZSAlZCBwYXJ0aXRpb24gPSBbJWQsJWRdXG4iLAorICAgICAgIHByb2NfYmluZCwgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGVhbS0+dC50X3RocmVhZHNbMF0gKSwgdGVhbS0+dC50X2lkLAorICAgICAgIG1hc3RlcnNfcGxhY2UsIGZpcnN0X3BsYWNlLCBsYXN0X3BsYWNlICkgKTsKKworICAgIHN3aXRjaCAoIHByb2NfYmluZCApIHsKKworICAgICAgICBjYXNlIHByb2NfYmluZF9kZWZhdWx0OgorICAgICAgICAvLworICAgICAgICAvLyBzZXJpYWwgdGVhbXMgbWlnaHQgaGF2ZSB0aGUgcHJvY19iaW5kIHBvbGljeSBzZXQgdG8KKyAgICAgICAgLy8gcHJvY19iaW5kX2RlZmF1bHQuICBJdCBkb2Vzbid0IG1hdHRlciwgYXMgd2UgZG9uJ3QKKyAgICAgICAgLy8gcmViaW5kIHRoZSBtYXN0ZXIgdGhyZWFkIGZvciBhbnkgcHJvY19iaW5kIHBvbGljeS4KKyAgICAgICAgLy8KKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbS0+dC50X25wcm9jID09IDEgKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBwcm9jX2JpbmRfbWFzdGVyOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgZjsKKyAgICAgICAgICAgIGludCBuX3RoID0gdGVhbS0+dC50X25wcm9jOworICAgICAgICAgICAgZm9yICggZiA9IDE7IGYgPCBuX3RoOyBmKysgKSB7CisgICAgICAgICAgICAgICAga21wX2luZm9fdCAqdGggPSB0ZWFtLT50LnRfdGhyZWFkc1tmXTsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aCAhPSBOVUxMICk7CisgICAgICAgICAgICAgICAgdGgtPnRoLnRoX2ZpcnN0X3BsYWNlID0gZmlyc3RfcGxhY2U7CisgICAgICAgICAgICAgICAgdGgtPnRoLnRoX2xhc3RfcGxhY2UgPSBsYXN0X3BsYWNlOworICAgICAgICAgICAgICAgIHRoLT50aC50aF9uZXdfcGxhY2UgPSBtYXN0ZXJzX3BsYWNlOworCisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMCwgKCJfX2ttcF9wYXJ0aXRpb25fcGxhY2VzOiBtYXN0ZXI6IFQjJWQoJWQ6JWQpIHBsYWNlICVkIHBhcnRpdGlvbiA9IFslZCwlZF1cbiIsCisgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0ZWFtLT50LnRfdGhyZWFkc1tmXSApLAorICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCBmLCBtYXN0ZXJzX3BsYWNlLCBmaXJzdF9wbGFjZSwgbGFzdF9wbGFjZSApICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBwcm9jX2JpbmRfY2xvc2U6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBmOworICAgICAgICAgICAgaW50IG5fdGggPSB0ZWFtLT50LnRfbnByb2M7CisgICAgICAgICAgICBpbnQgbl9wbGFjZXM7CisgICAgICAgICAgICBpZiAoIGZpcnN0X3BsYWNlIDw9IGxhc3RfcGxhY2UgKSB7CisgICAgICAgICAgICAgICAgbl9wbGFjZXMgPSBsYXN0X3BsYWNlIC0gZmlyc3RfcGxhY2UgKyAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbl9wbGFjZXMgPSBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgLSBmaXJzdF9wbGFjZSArIGxhc3RfcGxhY2UgKyAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBuX3RoIDw9IG5fcGxhY2VzICkgeworICAgICAgICAgICAgICAgIGludCBwbGFjZSA9IG1hc3RlcnNfcGxhY2U7CisgICAgICAgICAgICAgICAgZm9yICggZiA9IDE7IGYgPCBuX3RoOyBmKysgKSB7CisgICAgICAgICAgICAgICAgICAgIGttcF9pbmZvX3QgKnRoID0gdGVhbS0+dC50X3RocmVhZHNbZl07CisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoICE9IE5VTEwgKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIHBsYWNlID09IGxhc3RfcGxhY2UgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSA9IGZpcnN0X3BsYWNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBwbGFjZSA9PSBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgLSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9maXJzdF9wbGFjZSA9IGZpcnN0X3BsYWNlOworICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfbGFzdF9wbGFjZSA9IGxhc3RfcGxhY2U7CisgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9uZXdfcGxhY2UgPSBwbGFjZTsKKworICAgICAgICAgICAgICAgICAgICBLQV9UUkFDRSggMTAwLCAoIl9fa21wX3BhcnRpdGlvbl9wbGFjZXM6IGNsb3NlOiBUIyVkKCVkOiVkKSBwbGFjZSAlZCBwYXJ0aXRpb24gPSBbJWQsJWRdXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0ZWFtLT50LnRfdGhyZWFkc1tmXSApLAorICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIGYsIHBsYWNlLCBmaXJzdF9wbGFjZSwgbGFzdF9wbGFjZSApICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IFMsIHJlbSwgZ2FwLCBzX2NvdW50OworICAgICAgICAgICAgICAgIFMgPSBuX3RoIC8gbl9wbGFjZXM7CisgICAgICAgICAgICAgICAgc19jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgcmVtID0gbl90aCAtICggUyAqIG5fcGxhY2VzICk7CisgICAgICAgICAgICAgICAgZ2FwID0gcmVtID4gMCA/IG5fcGxhY2VzL3JlbSA6IG5fcGxhY2VzOworICAgICAgICAgICAgICAgIGludCBwbGFjZSA9IG1hc3RlcnNfcGxhY2U7CisgICAgICAgICAgICAgICAgaW50IGdhcF9jdCA9IGdhcDsKKyAgICAgICAgICAgICAgICBmb3IgKCBmID0gMDsgZiA8IG5fdGg7IGYrKyApIHsKKyAgICAgICAgICAgICAgICAgICAga21wX2luZm9fdCAqdGggPSB0ZWFtLT50LnRfdGhyZWFkc1tmXTsKKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGggIT0gTlVMTCApOworCisgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9maXJzdF9wbGFjZSA9IGZpcnN0X3BsYWNlOworICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfbGFzdF9wbGFjZSA9IGxhc3RfcGxhY2U7CisgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9uZXdfcGxhY2UgPSBwbGFjZTsKKyAgICAgICAgICAgICAgICAgICAgc19jb3VudCsrOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKHNfY291bnQgPT0gUykgJiYgcmVtICYmIChnYXBfY3QgPT0gZ2FwKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcsIGFkZCBhbiBleHRyYSB0aHJlYWQgdG8gcGxhY2Ugb24gbmV4dCBpdGVyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHNfY291bnQgPT0gUysxKSAmJiByZW0gJiYgKGdhcF9jdCA9PSBnYXApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgYWRkZWQgYW4gZXh0cmEgdGhyZWFkIHRvIHRoaXMgcGxhY2U7IG1vdmUgdG8gbmV4dCBwbGFjZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwbGFjZSA9PSBsYXN0X3BsYWNlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlID0gZmlyc3RfcGxhY2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggcGxhY2UgPT0gX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzIC0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdhcF9jdCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICByZW0tLTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzX2NvdW50ID09IFMpIHsgLy8gcGxhY2UgZnVsbDsgZG9uJ3QgYWRkIGV4dHJhCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBsYWNlID09IGxhc3RfcGxhY2UgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UgPSBmaXJzdF9wbGFjZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBwbGFjZSA9PSBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgLSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGdhcF9jdCsrOworICAgICAgICAgICAgICAgICAgICAgICAgc19jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBLQV9UUkFDRSggMTAwLCAoIl9fa21wX3BhcnRpdGlvbl9wbGFjZXM6IGNsb3NlOiBUIyVkKCVkOiVkKSBwbGFjZSAlZCBwYXJ0aXRpb24gPSBbJWQsJWRdXG4iLAorICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRlYW0tPnQudF90aHJlYWRzW2ZdICksCisgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCBmLCB0aC0+dGgudGhfbmV3X3BsYWNlLCBmaXJzdF9wbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICBsYXN0X3BsYWNlICkgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggcGxhY2UgPT0gbWFzdGVyc19wbGFjZSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgcHJvY19iaW5kX3NwcmVhZDoKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGY7CisgICAgICAgICAgICBpbnQgbl90aCA9IHRlYW0tPnQudF9ucHJvYzsKKyAgICAgICAgICAgIGludCBuX3BsYWNlczsKKyAgICAgICAgICAgIGlmICggZmlyc3RfcGxhY2UgPD0gbGFzdF9wbGFjZSApIHsKKyAgICAgICAgICAgICAgICBuX3BsYWNlcyA9IGxhc3RfcGxhY2UgLSBmaXJzdF9wbGFjZSArIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBuX3BsYWNlcyA9IF9fa21wX2FmZmluaXR5X251bV9tYXNrcyAtIGZpcnN0X3BsYWNlICsgbGFzdF9wbGFjZSArIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIG5fdGggPD0gbl9wbGFjZXMgKSB7CisgICAgICAgICAgICAgICAgaW50IHBsYWNlID0gbWFzdGVyc19wbGFjZTsKKyAgICAgICAgICAgICAgICBpbnQgUyA9IG5fcGxhY2VzL25fdGg7CisgICAgICAgICAgICAgICAgaW50IHNfY291bnQsIHJlbSwgZ2FwLCBnYXBfY3Q7CisgICAgICAgICAgICAgICAgcmVtID0gbl9wbGFjZXMgLSBuX3RoKlM7CisgICAgICAgICAgICAgICAgZ2FwID0gcmVtID8gbl90aC9yZW0gOiAxOworICAgICAgICAgICAgICAgIGdhcF9jdCA9IGdhcDsKKyAgICAgICAgICAgICAgICBmb3IgKCBmID0gMDsgZiA8IG5fdGg7IGYrKyApIHsKKyAgICAgICAgICAgICAgICAgICAga21wX2luZm9fdCAqdGggPSB0ZWFtLT50LnRfdGhyZWFkc1tmXTsKKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGggIT0gTlVMTCApOworCisgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9maXJzdF9wbGFjZSA9IHBsYWNlOworICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfbmV3X3BsYWNlID0gcGxhY2U7CisgICAgICAgICAgICAgICAgICAgIHNfY291bnQgPSAxOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc19jb3VudCA8IFMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcGxhY2UgPT0gbGFzdF9wbGFjZSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSA9IGZpcnN0X3BsYWNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHBsYWNlID09IF9fa21wX2FmZmluaXR5X251bV9tYXNrcyAtIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSsrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc19jb3VudCsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChyZW0gJiYgKGdhcF9jdCA9PSBnYXApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBsYWNlID09IGxhc3RfcGxhY2UgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UgPSBmaXJzdF9wbGFjZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBwbGFjZSA9PSBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgLSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbS0tOworICAgICAgICAgICAgICAgICAgICAgICAgZ2FwX2N0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfbGFzdF9wbGFjZSA9IHBsYWNlOworICAgICAgICAgICAgICAgICAgICBnYXBfY3QrKzsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIHBsYWNlID09IGxhc3RfcGxhY2UgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSA9IGZpcnN0X3BsYWNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBwbGFjZSA9PSBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgLSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSsrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMCwgKCJfX2ttcF9wYXJ0aXRpb25fcGxhY2VzOiBzcHJlYWQ6IFQjJWQoJWQ6JWQpIHBsYWNlICVkIHBhcnRpdGlvbiA9IFslZCwlZF1cbiIsCisgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGVhbS0+dC50X3RocmVhZHNbZl0gKSwKKyAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIGYsIHRoLT50aC50aF9uZXdfcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgdGgtPnRoLnRoX2ZpcnN0X3BsYWNlLCB0aC0+dGgudGhfbGFzdF9wbGFjZSApICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHBsYWNlID09IG1hc3RlcnNfcGxhY2UgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGludCBTLCByZW0sIGdhcCwgc19jb3VudDsKKyAgICAgICAgICAgICAgICBTID0gbl90aCAvIG5fcGxhY2VzOworICAgICAgICAgICAgICAgIHNfY291bnQgPSAwOworICAgICAgICAgICAgICAgIHJlbSA9IG5fdGggLSAoIFMgKiBuX3BsYWNlcyApOworICAgICAgICAgICAgICAgIGdhcCA9IHJlbSA+IDAgPyBuX3BsYWNlcy9yZW0gOiBuX3BsYWNlczsKKyAgICAgICAgICAgICAgICBpbnQgcGxhY2UgPSBtYXN0ZXJzX3BsYWNlOworICAgICAgICAgICAgICAgIGludCBnYXBfY3QgPSBnYXA7CisgICAgICAgICAgICAgICAgZm9yICggZiA9IDA7IGYgPCBuX3RoOyBmKysgKSB7CisgICAgICAgICAgICAgICAgICAgIGttcF9pbmZvX3QgKnRoID0gdGVhbS0+dC50X3RocmVhZHNbZl07CisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoICE9IE5VTEwgKTsKKworICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfZmlyc3RfcGxhY2UgPSBwbGFjZTsKKyAgICAgICAgICAgICAgICAgICAgdGgtPnRoLnRoX2xhc3RfcGxhY2UgPSBwbGFjZTsKKyAgICAgICAgICAgICAgICAgICAgdGgtPnRoLnRoX25ld19wbGFjZSA9IHBsYWNlOworICAgICAgICAgICAgICAgICAgICBzX2NvdW50Kys7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc19jb3VudCA9PSBTKSAmJiByZW0gJiYgKGdhcF9jdCA9PSBnYXApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZywgYWRkIGFuIGV4dHJhIHRocmVhZCB0byBwbGFjZSBvbiBuZXh0IGl0ZXJhdGlvbgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc19jb3VudCA9PSBTKzEpICYmIHJlbSAmJiAoZ2FwX2N0ID09IGdhcCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBhZGRlZCBhbiBleHRyYSB0aHJlYWQgdG8gdGhpcyBwbGFjZTsgbW92ZSBvbiB0byBuZXh0IHBsYWNlCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBsYWNlID09IGxhc3RfcGxhY2UgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UgPSBmaXJzdF9wbGFjZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBwbGFjZSA9PSBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgLSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNfY291bnQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgZ2FwX2N0ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbS0tOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNfY291bnQgPT0gUykgeyAvLyBwbGFjZSBpcyBmdWxsOyBkb24ndCBhZGQgZXh0cmEgdGhyZWFkCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBsYWNlID09IGxhc3RfcGxhY2UgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UgPSBmaXJzdF9wbGFjZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBwbGFjZSA9PSBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgLSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGdhcF9jdCsrOworICAgICAgICAgICAgICAgICAgICAgICAgc19jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBLQV9UUkFDRSggMTAwLCAoIl9fa21wX3BhcnRpdGlvbl9wbGFjZXM6IHNwcmVhZDogVCMlZCglZDolZCkgcGxhY2UgJWQgcGFydGl0aW9uID0gWyVkLCVkXVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGVhbS0+dC50X3RocmVhZHNbZl0gKSwKKyAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCBmLCB0aC0+dGgudGhfbmV3X3BsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfZmlyc3RfcGxhY2UsIHRoLT50aC50aF9sYXN0X3BsYWNlKSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBwbGFjZSA9PSBtYXN0ZXJzX3BsYWNlICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX3BhcnRpdGlvbl9wbGFjZXM6IGV4aXQgVCMlZFxuIiwgdGVhbS0+dC50X2lkICkgKTsKK30KKworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgKi8KKworLyogYWxsb2NhdGUgYSBuZXcgdGVhbSBkYXRhIHN0cnVjdHVyZSB0byB1c2UuICB0YWtlIG9uZSBvZmYgb2YgdGhlIGZyZWUgcG9vbCBpZiBhdmFpbGFibGUgKi8KK2ttcF90ZWFtX3QgKgorX19rbXBfYWxsb2NhdGVfdGVhbSgga21wX3Jvb3RfdCAqcm9vdCwgaW50IG5ld19ucHJvYywgaW50IG1heF9ucHJvYywKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGttcF9wcm9jX2JpbmRfdCBuZXdfcHJvY19iaW5kLAorI2VuZGlmCisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICBrbXBfaW50ZXJuYWxfY29udHJvbF90ICpuZXdfaWN2cywKKyNlbHNlCisgICAgaW50IG5ld19zZXRfbnByb2MsIGludCBuZXdfc2V0X2R5bmFtaWMsIGludCBuZXdfc2V0X25lc3RlZCwKKyAgICBpbnQgbmV3X3NldF9ibG9ja3RpbWUsIGludCBuZXdfYnRfaW50ZXJ2YWxzLCBpbnQgbmV3X2J0X3NldCwKKyNlbmRpZgorICAgIGludCBhcmdjICkKK3sKKyAgICBpbnQgZjsKKyAgICBrbXBfdGVhbV90ICp0ZWFtOworICAgIGNoYXIgKnB0cjsKKyAgICBzaXplX3Qgc2l6ZTsKKworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9hbGxvY2F0ZV90ZWFtOiBjYWxsZWRcbiIpKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBuZXdfbnByb2MgPj0xICYmIGFyZ2MgPj0wICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggbWF4X25wcm9jID49IG5ld19ucHJvYyApOworICAgIEtNUF9NQigpOworCisgICAgLy8KKyAgICAvLyBvcHRpbWl6YXRpb24gdG8gdXNlIGEgImhvdCIgdGVhbSBmb3IgdGhlIHRvcCBsZXZlbCwKKyAgICAvLyBhcyBpdCBpcyB1c3VhbGx5IHRoZSBzYW1lCisgICAgLy8KKyAgICBpZiAoICEgcm9vdC0+ci5yX2FjdGl2ZSAgJiYgIG5ld19ucHJvYyA+IDEgKSB7CisKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggbmV3X25wcm9jID09IG1heF9ucHJvYyApOworCisgICAgICAgIHRlYW0gPSAgcm9vdCAtPiByLnJfaG90X3RlYW07CisKKyNpZiBPTVBfMzBfRU5BQkxFRCAmJiBLTVBfREVCVUcKKyAgICAgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9hbGxvY2F0ZV90ZWFtOiBob3QgdGVhbSB0YXNrX3RlYW0gPSAlcCBiZWZvcmUgcmVpbml0XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbSAtPiB0LnRfdGFza190ZWFtICkpOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAvKiBoYXMgdGhlIG51bWJlciBvZiB0aHJlYWRzIGNoYW5nZWQ/ICovCisgICAgICAgIGlmKCB0ZWFtIC0+IHQudF9ucHJvYyA+IG5ld19ucHJvYyApIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9hbGxvY2F0ZV90ZWFtOiBkZWNyZWFzaW5nIGhvdCB0ZWFtIHRocmVhZCBjb3VudCB0byAlZFxuIiwgbmV3X25wcm9jICkpOworCisjaWYgS01QX01JQworICAgICAgICAgICAgdGVhbSAtPiB0LnRfc2l6ZV9jaGFuZ2VkID0gMTsKKyNlbmRpZgorI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgICBpZiAoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICkgeworICAgICAgICAgICAgICAgIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtID0gdGVhbS0+dC50X3Rhc2tfdGVhbTsKKyAgICAgICAgICAgICAgICBpZiAoICggdGFza190ZWFtICE9IE5VTEwgKSAmJiBUQ1JfU1lOQ180KHRhc2tfdGVhbS0+dHQudHRfYWN0aXZlKSApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgLy8gU2lnbmFsIHRoZSB3b3JrZXIgdGhyZWFkcyAoZXNwLiB0aGUgZXh0cmEgb25lcykgdG8gc3RvcAorICAgICAgICAgICAgICAgICAgICAvLyBsb29raW5nIGZvciB0YXNrcyB3aGlsZSBzcGluIHdhaXRpbmcuICBUaGUgdGFzayB0ZWFtcworICAgICAgICAgICAgICAgICAgICAvLyBhcmUgcmVmZXJlbmNlIGNvdW50ZWQgYW5kIHdpbGwgYmUgZGVhbGxvY2F0ZWQgYnkgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIGxhc3Qgd29ya2VyIHRocmVhZC4KKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbS0+dC50X25wcm9jID4gMSApOworICAgICAgICAgICAgICAgICAgICBUQ1dfU1lOQ180KCB0YXNrX3RlYW0tPnR0LnR0X2FjdGl2ZSwgRkFMU0UgKTsKKyAgICAgICAgICAgICAgICAgICAgS01QX01CKCk7CisKKyAgICAgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF9hbGxvY2F0ZV90ZWFtOiBzZXR0aW5nIHRhc2tfdGVhbSAlcCB0byBOVUxMXG4iLAorICAgICAgICAgICAgICAgICAgICAgICZ0ZWFtLT50LnRfdGFza190ZWFtICkgKTsKKyAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfdGFza190ZWFtID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tfdGVhbSA9PSBOVUxMICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisKKyAgICAgICAgICAgIC8qIHJlbGVhc2UgdGhlIGV4dHJhIHRocmVhZHMgd2UgZG9uJ3QgbmVlZCBhbnkgbW9yZSAqLworICAgICAgICAgICAgZm9yKCBmID0gbmV3X25wcm9jICA7ICBmIDwgdGVhbS0+dC50X25wcm9jICA7ICBmKysgKSB7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbS0+dC50X3RocmVhZHNbIGYgXSApOworICAgICAgICAgICAgICAgIF9fa21wX2ZyZWVfdGhyZWFkKCB0ZWFtLT50LnRfdGhyZWFkc1sgZiBdICk7CisgICAgICAgICAgICAgICAgdGVhbSAtPiB0LnRfdGhyZWFkc1sgZiBdID0gIE5VTEw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRlYW0gLT4gdC50X25wcm9jID0gIG5ld19ucHJvYzsKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgICAgICAgICAgLy8gVE9ETz8/PzogdGVhbSAtPiB0LnRfbWF4X2FjdGl2ZV9sZXZlbHMgPSBuZXdfbWF4X2FjdGl2ZV9sZXZlbHM7CisgICAgICAgICAgICB0ZWFtIC0+IHQudF9zY2hlZCA9ICBuZXdfaWN2cy0+c2NoZWQ7CisjZW5kaWYKKyAgICAgICAgICAgIF9fa21wX3JlaW5pdGlhbGl6ZV90ZWFtKCB0ZWFtLAorI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2ljdnMsIHJvb3QtPnIucl91YmVyX3RocmVhZC0+dGgudGhfaWRlbnQKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3NldF9ucHJvYywgbmV3X3NldF9keW5hbWljLCBuZXdfc2V0X25lc3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfc2V0X2Jsb2NrdGltZSwgbmV3X2J0X2ludGVydmFscywgbmV3X2J0X3NldAorI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworCisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgICAgICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKSB7CisgICAgICAgICAgICAgICAga21wX3Rhc2tfdGVhbV90ICp0YXNrX3RlYW0gPSB0ZWFtLT50LnRfdGFza190ZWFtOworICAgICAgICAgICAgICAgIGlmICggdGFza190ZWFtICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoICEgVENSXzQodGFza190ZWFtLT50dC50dF9mb3VuZF90YXNrcykgKTsKKyAgICAgICAgICAgICAgICAgICAgdGFza190ZWFtLT50dC50dF9ucHJvYyA9IG5ld19ucHJvYzsKKyAgICAgICAgICAgICAgICAgICAgdGFza190ZWFtLT50dC50dF91bmZpbmlzaGVkX3RocmVhZHMgPSBuZXdfbnByb2M7CisgICAgICAgICAgICAgICAgICAgIHRhc2tfdGVhbS0+dHQudHRfcmVmX2N0ID0gbmV3X25wcm9jIC0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAgICAgLyogdXBkYXRlIHRoZSByZW1haW5pbmcgdGhyZWFkcyAqLworICAgICAgICAgICAgZm9yKCBmID0gMCAgOyAgZiA8IG5ld19ucHJvYyAgOyAgZisrICkgeworICAgICAgICAgICAgICAgIHRlYW0gLT4gdC50X3RocmVhZHNbIGYgXSAtPiB0aC50aF90ZWFtX25wcm9jID0gdGVhbS0+dC50X25wcm9jOworICAgICAgICAgICAgfQorCisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgICAgICAgIC8vIHJlc3RvcmUgdGhlIGN1cnJlbnQgdGFzayBzdGF0ZSBvZiB0aGUgbWFzdGVyIHRocmVhZDogc2hvdWxkIGJlIHRoZSBpbXBsaWNpdCB0YXNrCisgICAgICAgICAgICBLRl9UUkFDRSggMTAsICgiX19rbXBfYWxsb2NhdGVfdGVhbTogVCMlZCwgdGhpc190aHJlYWQ9JXAgdGVhbT0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgMCwgdGVhbS0+dC50X3RocmVhZHNbMF0sIHRlYW0gKSApOworCisgICAgICAgICAgICBfX2ttcF9wdXNoX2N1cnJlbnRfdGFza190b190aHJlYWQoIHRlYW0gLT4gdC50X3RocmVhZHNbIDAgXSwgdGVhbSwgMCApOworI2VuZGlmCisKKyNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgIGZvciAoIGYgPSAwOyBmIDwgdGVhbS0+dC50X25wcm9jOyBmKysgKSB7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbS0+dC50X3RocmVhZHNbZl0gJiYKKyAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X3RocmVhZHNbZl0tPnRoLnRoX3RlYW1fbnByb2MgPT0gdGVhbS0+dC50X25wcm9jICk7CisgICAgICAgICAgICB9CisjZW5kaWYKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICB0ZWFtLT50LnRfcHJvY19iaW5kID0gbmV3X3Byb2NfYmluZDsKKyMgaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICAgICAgX19rbXBfcGFydGl0aW9uX3BsYWNlcyggdGVhbSApOworIyBlbmRpZgorI2VuZGlmCisKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggdGVhbSAtPiB0LnRfbnByb2MgPCBuZXdfbnByb2MgKSB7CisjaWYgS01QX09TX0xJTlVYICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgICAgIGttcF9hZmZpbl9tYXNrX3QgKm9sZF9tYXNrOworICAgICAgICAgICAgaWYgKCBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpICkgeworICAgICAgICAgICAgICAgIEtNUF9DUFVfQUxMT0Mob2xkX21hc2spOworICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9hbGxvY2F0ZV90ZWFtOiBpbmNyZWFzaW5nIGhvdCB0ZWFtIHRocmVhZCBjb3VudCB0byAlZFxuIiwgbmV3X25wcm9jICkpOworCisjaWYgS01QX01JQworICAgICAgICAgICAgdGVhbSAtPiB0LnRfc2l6ZV9jaGFuZ2VkID0gMTsKKyNlbmRpZgorCisKKyAgICAgICAgICAgIGlmKHRlYW0gLT4gdC50X21heF9ucHJvYyA8IG5ld19ucHJvYykgeworICAgICAgICAgICAgICAgIC8qIHJlYWxsb2NhdGUgbGFyZ2VyIGFycmF5cyAqLworICAgICAgICAgICAgICAgIF9fa21wX3JlYWxsb2NhdGVfdGVhbV9hcnJheXModGVhbSwgbmV3X25wcm9jKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9yZWluaXRpYWxpemVfdGVhbSggdGVhbSwKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfaWN2cywgTlVMTAorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3NldF9ucHJvYywgbmV3X3NldF9keW5hbWljLCBuZXdfc2V0X25lc3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3NldF9ibG9ja3RpbWUsIG5ld19idF9pbnRlcnZhbHMsIG5ld19idF9zZXQKKyNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorCisjaWYgS01QX09TX0xJTlVYICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgICAgIC8qIFRlbXBvcmFyaWx5IHNldCBmdWxsIG1hc2sgZm9yIG1hc3RlciB0aHJlYWQgYmVmb3JlCisgICAgICAgICAgICAgICBjcmVhdGlvbiBvZiB3b3JrZXJzLiBUaGUgcmVhc29uIGlzIHRoYXQgd29ya2VycyBpbmhlcml0CisgICAgICAgICAgICAgICB0aGUgYWZmaW5pdHkgZnJvbSBtYXN0ZXIsIHNvIGlmIGEgbG90IG9mIHdvcmtlcnMgYXJlCisgICAgICAgICAgICAgICBjcmVhdGVkIG9uIHRoZSBzaW5nbGUgY29yZSBxdWlja2x5LCB0aGV5IGRvbid0IGdldAorICAgICAgICAgICAgICAgYSBjaGFuY2UgdG8gc2V0IHRoZWlyIG93biBhZmZpbml0eSBmb3IgYSBsb25nIHRpbWUuCisgICAgICAgICAgICAqLworICAgICAgICAgICAgX19rbXBfc2V0X3RocmVhZF9hZmZpbml0eV9tYXNrX2Z1bGxfdG1wKCBvbGRfbWFzayApOworI2VuZGlmCisKKyAgICAgICAgICAgIC8qIGFsbG9jYXRlIG5ldyB0aHJlYWRzIGZvciB0aGUgaG90IHRlYW0gKi8KKyAgICAgICAgICAgIGZvciggZiA9IHRlYW0tPnQudF9ucHJvYyAgOyAgZiA8IG5ld19ucHJvYyAgOyAgZisrICkgeworICAgICAgICAgICAgICAgIGttcF9pbmZvX3QgKiBuZXdfd29ya2VyID0gX19rbXBfYWxsb2NhdGVfdGhyZWFkKCByb290LCB0ZWFtLCBmICk7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggbmV3X3dvcmtlciApOworICAgICAgICAgICAgICAgIHRlYW0tPnQudF90aHJlYWRzWyBmIF0gPSBuZXdfd29ya2VyOworICAgICAgICAgICAgICAgIG5ld193b3JrZXItPnRoLnRoX3RlYW1fbnByb2MgPSB0ZWFtLT50LnRfbnByb2M7CisKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfYWxsb2NhdGVfdGVhbTogdGVhbSAlZCBpbml0IFQjJWQgYXJyaXZlZDogam9pbj0ldSwgcGxhaW49JXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgX19rbXBfZ3RpZF9mcm9tX3RpZCggZiwgdGVhbSApLCB0ZWFtLT50LnRfaWQsIGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9iYXJbYnNfZm9ya2pvaW5fYmFycmllcl0uYl9hcnJpdmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfYmFyW2JzX3BsYWluX2JhcnJpZXJdLmJfYXJyaXZlZCApICk7CisKKyAgICAgICAgICAgICAgICB7IC8vIEluaXRpYWxpemUgYmFycmllciBkYXRhIGZvciBuZXcgdGhyZWFkcy4KKyAgICAgICAgICAgICAgICAgICAgaW50IGI7CisgICAgICAgICAgICAgICAgICAgIGttcF9iYWxpZ25fdCAqIGJhbGlnbiA9IG5ld193b3JrZXItPnRoLnRoX2JhcjsKKyAgICAgICAgICAgICAgICAgICAgZm9yICggYiA9IDA7IGIgPCBicF9sYXN0X2JhcjsgKysgYiApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhbGlnblsgYiBdLmJiLmJfYXJyaXZlZCAgICAgICAgPSB0ZWFtLT50LnRfYmFyWyBiIF0uYl9hcnJpdmVkOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisjaWYgS01QX09TX0xJTlVYICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgICAgIGlmICggS01QX0FGRklOSVRZX0NBUEFCTEUoKSApIHsKKyAgICAgICAgICAgICAgICAvKiBSZXN0b3JlIGluaXRpYWwgbWFzdGVyIHRocmVhZCdzIGFmZmluaXR5IG1hc2sgKi8KKyAgICAgICAgICAgICAgICBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KCBvbGRfbWFzaywgVFJVRSApOworICAgICAgICAgICAgICAgIEtNUF9DUFVfRlJFRShvbGRfbWFzayk7CisgICAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAgICAgLyogbWFrZSBzdXJlIGV2ZXJ5b25lIGlzIHN5bmNyb25pemVkICovCisgICAgICAgICAgICBfX2ttcF9pbml0aWFsaXplX3RlYW0oIHRlYW0sIG5ld19ucHJvYywKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgICAgICAgICAgICBuZXdfaWN2cywKKyAgICAgICAgICAgICAgcm9vdC0+ci5yX3ViZXJfdGhyZWFkLT50aC50aF9pZGVudAorI2Vsc2UKKyAgICAgICAgICAgICAgbmV3X3NldF9ucHJvYywgbmV3X3NldF9keW5hbWljLCBuZXdfc2V0X25lc3RlZCwKKyAgICAgICAgICAgICAgbmV3X3NldF9ibG9ja3RpbWUsIG5ld19idF9pbnRlcnZhbHMsIG5ld19idF9zZXQKKyNlbmRpZgorICAgICAgICAgICAgKTsKKworI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgICBpZiAoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICkgeworICAgICAgICAgICAgICAgIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtID0gdGVhbS0+dC50X3Rhc2tfdGVhbTsKKyAgICAgICAgICAgICAgICBpZiAoIHRhc2tfdGVhbSAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAhIFRDUl80KHRhc2tfdGVhbS0+dHQudHRfZm91bmRfdGFza3MpICk7CisgICAgICAgICAgICAgICAgICAgIHRhc2tfdGVhbS0+dHQudHRfbnByb2MgPSBuZXdfbnByb2M7CisgICAgICAgICAgICAgICAgICAgIHRhc2tfdGVhbS0+dHQudHRfdW5maW5pc2hlZF90aHJlYWRzID0gbmV3X25wcm9jOworICAgICAgICAgICAgICAgICAgICB0YXNrX3RlYW0tPnR0LnR0X3JlZl9jdCA9IG5ld19ucHJvYyAtIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgIC8qIHJlaW5pdGlhbGl6ZSB0aGUgb2xkIHRocmVhZHMgKi8KKyAgICAgICAgICAgIGZvciggZiA9IDAgIDsgIGYgPCB0ZWFtLT50LnRfbnByb2MgIDsgIGYrKyApCisgICAgICAgICAgICAgICAgX19rbXBfaW5pdGlhbGl6ZV9pbmZvKCB0ZWFtLT50LnRfdGhyZWFkc1sgZiBdLCB0ZWFtLCBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RpZCggZiwgdGVhbSApICk7CisjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICBmb3IgKCBmID0gMDsgZiA8IHRlYW0tPnQudF9ucHJvYzsgKysgZiApIHsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtLT50LnRfdGhyZWFkc1tmXSAmJgorICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfdGhyZWFkc1tmXS0+dGgudGhfdGVhbV9ucHJvYyA9PSB0ZWFtLT50LnRfbnByb2MgKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgIHRlYW0tPnQudF9wcm9jX2JpbmQgPSBuZXdfcHJvY19iaW5kOworIyBpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgICAgICBfX2ttcF9wYXJ0aXRpb25fcGxhY2VzKCB0ZWFtICk7CisjIGVuZGlmCisjZW5kaWYKKworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2FsbG9jYXRlX3RlYW06IHJldXNpbmcgaG90IHRlYW1cbiIgKSk7CisjaWYgS01QX01JQworICAgICAgICAgICAgLy8gVGhpcyBjYXNlIGNhbiBtZWFuIHRoYXQgb21wX3NldF9udW1fdGhyZWFkcygpIHdhcyBjYWxsZWQgYW5kIHRoZSBob3QgdGVhbSBzaXplCisgICAgICAgICAgICAvLyB3YXMgYWxyZWFkeSByZWR1Y2VkLCBzbyB3ZSBjaGVjayB0aGUgc3BlY2lhbCBmbGFnCisgICAgICAgICAgICBpZiAoIHRlYW0gLT4gdC50X3NpemVfY2hhbmdlZCA9PSAtMSApIHsKKyAgICAgICAgICAgICAgICB0ZWFtIC0+IHQudF9zaXplX2NoYW5nZWQgPSAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0ZWFtIC0+IHQudF9zaXplX2NoYW5nZWQgPSAwOworICAgICAgICAgICAgfQorI2VuZGlmCisKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgICAgICAgICAgLy8gVE9ETz8/PzogdGVhbSAtPiB0LnRfbWF4X2FjdGl2ZV9sZXZlbHMgPSBuZXdfbWF4X2FjdGl2ZV9sZXZlbHM7CisgICAgICAgICAgICB0ZWFtIC0+IHQudF9zY2hlZCA9ICBuZXdfaWN2cy0+c2NoZWQ7CisjZW5kaWYKKworICAgICAgICAgICAgX19rbXBfcmVpbml0aWFsaXplX3RlYW0oIHRlYW0sCisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfaWN2cywgcm9vdC0+ci5yX3ViZXJfdGhyZWFkLT50aC50aF9pZGVudAorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfc2V0X25wcm9jLCBuZXdfc2V0X2R5bmFtaWMsIG5ld19zZXRfbmVzdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19zZXRfYmxvY2t0aW1lLCBuZXdfYnRfaW50ZXJ2YWxzLCBuZXdfYnRfc2V0CisjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgICAgICAgIEtGX1RSQUNFKCAxMCwgKCJfX2ttcF9hbGxvY2F0ZV90ZWFtMjogVCMlZCwgdGhpc190aHJlYWQ9JXAgdGVhbT0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIHRlYW0tPnQudF90aHJlYWRzWzBdLCB0ZWFtICkgKTsKKyAgICAgICAgICAgIF9fa21wX3B1c2hfY3VycmVudF90YXNrX3RvX3RocmVhZCggdGVhbSAtPiB0LnRfdGhyZWFkc1sgMCBdLCB0ZWFtLCAwICk7CisjZW5kaWYKKworI2lmIE9NUF80MF9FTkFCTEVECisjIGlmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgICAgIGlmICggdGVhbS0+dC50X3Byb2NfYmluZCA9PSBuZXdfcHJvY19iaW5kICkgeworICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAyMDAsICgiX19rbXBfYWxsb2NhdGVfdGVhbTogcmV1c2luZyBob3QgdGVhbSAjJWQgYmluZGluZ3M6IHByb2NfYmluZCA9ICVkLCBwYXJ0aXRpb24gPSBbJWQsJWRdXG4iLAorICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCBuZXdfcHJvY19iaW5kLCB0ZWFtLT50LnRfZmlyc3RfcGxhY2UsCisgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfbGFzdF9wbGFjZSApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfcHJvY19iaW5kID0gbmV3X3Byb2NfYmluZDsKKyAgICAgICAgICAgICAgICBfX2ttcF9wYXJ0aXRpb25fcGxhY2VzKCB0ZWFtICk7CisgICAgICAgICAgICB9CisjIGVsc2UKKyAgICAgICAgICAgIGlmICggdGVhbS0+dC50X3Byb2NfYmluZCAhPSBuZXdfcHJvY19iaW5kICkgeworICAgICAgICAgICAgICAgIHRlYW0tPnQudF9wcm9jX2JpbmQgPSBuZXdfcHJvY19iaW5kOworICAgICAgICAgICAgfQorIyBlbmRpZiAvKiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEICovCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8qIHJlYWxsb2NhdGUgc3BhY2UgZm9yIGFyZ3VtZW50cyBpZiBuZWNlc3NhcnkgKi8KKyAgICAgICAgX19rbXBfYWxsb2NfYXJndl9lbnRyaWVzKCBhcmdjLCB0ZWFtLCBUUlVFICk7CisgICAgICAgIHRlYW0gLT4gdC50X2FyZ2MgICAgID0gYXJnYzsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlIGhvdCB0ZWFtIHJlLXVzZXMgdGhlIHByZXZpb3VzIHRhc2sgdGVhbSwKKyAgICAgICAgLy8gaWYgdW50b3VjaGVkIGR1cmluZyB0aGUgcHJldmlvdXMgcmVsZWFzZS0+Z2F0aGVyIHBoYXNlLgorICAgICAgICAvLworCisgICAgICAgIEtGX1RSQUNFKCAxMCwgKCAiIGhvdF90ZWFtID0gJXBcbiIsIHRlYW0gKSApOworCisjaWYgT01QXzMwX0VOQUJMRUQgJiYgS01QX0RFQlVHCisgICAgICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKSB7CisgICAgICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfYWxsb2NhdGVfdGVhbTogaG90IHRlYW0gdGFza190ZWFtID0gJXAgYWZ0ZXIgcmVpbml0XG4iLAorICAgICAgICAgICAgICB0ZWFtIC0+IHQudF90YXNrX3RlYW0gKSk7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIEtNUF9NQigpOworCisgICAgICAgIHJldHVybiB0ZWFtOworICAgIH0KKworICAgIC8qIG5leHQsIGxldCdzIHRyeSB0byB0YWtlIG9uZSBmcm9tIHRoZSB0ZWFtIHBvb2wgKi8KKyAgICBLTVBfTUIoKTsKKyAgICBmb3IoIHRlYW0gPSAoa21wX3RlYW1fdCopIF9fa21wX3RlYW1fcG9vbCA7ICh0ZWFtKSA7ICkKKyAgICB7CisgICAgICAgIC8qIFRPRE86IGNvbnNpZGVyIHJlc2l6aW5nIHVuZGVyc2l6ZWQgdGVhbXMgaW5zdGVhZCBvZiByZWFwaW5nIHRoZW0sIG5vdyB0aGF0IHdlIGhhdmUgYSByZXNpemluZyBtZWNoYW5pc20gKi8KKyAgICAgICAgaWYgKCB0ZWFtLT50LnRfbWF4X25wcm9jID49IG1heF9ucHJvYyApIHsKKyAgICAgICAgICAgIC8qIHRha2UgdGhpcyB0ZWFtIGZyb20gdGhlIHRlYW0gcG9vbCAqLworICAgICAgICAgICAgX19rbXBfdGVhbV9wb29sID0gdGVhbS0+dC50X25leHRfcG9vbDsKKworICAgICAgICAgICAgLyogc2V0dXAgdGhlIHRlYW0gZm9yIGZyZXNoIHVzZSAqLworICAgICAgICAgICAgX19rbXBfaW5pdGlhbGl6ZV90ZWFtKCB0ZWFtLCBuZXdfbnByb2MsCisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgICAgICAgICAgbmV3X2ljdnMsCisgICAgICAgICAgICAgIE5VTEwgLy8gVE9ETzogISEhCisjZWxzZQorICAgICAgICAgICAgICBuZXdfc2V0X25wcm9jLCBuZXdfc2V0X2R5bmFtaWMsIG5ld19zZXRfbmVzdGVkLAorICAgICAgICAgICAgICBuZXdfc2V0X2Jsb2NrdGltZSwgbmV3X2J0X2ludGVydmFscywgbmV3X2J0X3NldAorI2VuZGlmCisgICAgICAgICAgICApOworCisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfYWxsb2NhdGVfdGVhbTogc2V0dGluZyB0YXNrX3RlYW0gJXAgdG8gTlVMTFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVhbS0+dC50X3Rhc2tfdGVhbSApICk7CisgICAgICAgICAgICB0ZWFtIC0+IHQudF90YXNrX3RlYW0gPSBOVUxMOworI2VuZGlmCisKKyAgICAgICAgICAgIC8qIHJlYWxsb2NhdGUgc3BhY2UgZm9yIGFyZ3VtZW50cyBpZiBuZWNlc3NhcnkgKi8KKyAgICAgICAgICAgIF9fa21wX2FsbG9jX2FyZ3ZfZW50cmllcyggYXJnYywgdGVhbSwgVFJVRSApOworICAgICAgICAgICAgdGVhbSAtPiB0LnRfYXJnYyAgICAgPSBhcmdjOworCisgICAgICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfYWxsb2NhdGVfdGVhbTogdGVhbSAlZCBpbml0IGFycml2ZWQ6IGpvaW49JXUsIHBsYWluPSV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgS01QX0lOSVRfQkFSUklFUl9TVEFURSwgS01QX0lOSVRfQkFSUklFUl9TVEFURSApKTsKKyAgICAgICAgICAgIHsgLy8gSW5pdGlhbGl6ZSBiYXJyaWVyIGRhdGEuCisgICAgICAgICAgICAgICAgaW50IGI7CisgICAgICAgICAgICAgICAgZm9yICggYiA9IDA7IGIgPCBic19sYXN0X2JhcnJpZXI7ICsrIGIpIHsKKyAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2JhclsgYiBdLmJfYXJyaXZlZCAgICAgICAgPSBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICB0ZWFtLT50LnRfcHJvY19iaW5kID0gbmV3X3Byb2NfYmluZDsKKyNlbmRpZgorCisgICAgICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfYWxsb2NhdGVfdGVhbTogdXNpbmcgdGVhbSBmcm9tIHBvb2wgJWQuXG4iLCB0ZWFtLT50LnRfaWQgKSk7CisgICAgICAgICAgICBLTVBfTUIoKTsKKworICAgICAgICAgICAgcmV0dXJuIHRlYW07CisgICAgICAgIH0KKworICAgICAgICAvKiByZWFwIHRlYW0gaWYgaXQgaXMgdG9vIHNtYWxsLCB0aGVuIGxvb3AgYmFjayBhbmQgY2hlY2sgdGhlIG5leHQgb25lICovCisgICAgICAgIC8qIG5vdCBzdXJlIGlmIHRoaXMgaXMgd2lzZSwgYnV0LCB3aWxsIGJlIHJlZG9uZSBkdXJpbmcgdGhlIGhvdC10ZWFtcyByZXdyaXRlLiAqLworICAgICAgICAvKiBUT0RPOiBVc2UgdGVjaG5pcXVlIHRvIGZpbmQgdGhlIHJpZ2h0IHNpemUgaG90LXRlYW0sIGRvbid0IHJlYXAgdGhlbSAqLworICAgICAgICB0ZWFtID0gIF9fa21wX3JlYXBfdGVhbSggdGVhbSApOworICAgICAgICBfX2ttcF90ZWFtX3Bvb2wgPSB0ZWFtOworICAgIH0KKworICAgIC8qIG5vdGhpbmcgYXZhaWxhYmxlIGluIHRoZSBwb29sLCBubyBtYXR0ZXIsIG1ha2UgYSBuZXcgdGVhbSEgKi8KKyAgICBLTVBfTUIoKTsKKyAgICB0ZWFtID0gKGttcF90ZWFtX3QqKSBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKCBrbXBfdGVhbV90ICkgKTsKKworICAgIC8qIGFuZCBzZXQgaXQgdXAgKi8KKyAgICB0ZWFtIC0+IHQudF9tYXhfbnByb2MgICA9IG1heF9ucHJvYzsKKyAgICAvKiBOT1RFIHdlbGwsIGZvciBzb21lIHJlYXNvbiBhbGxvY2F0aW5nIG9uZSBiaWcgYnVmZmVyIGFuZCBkaXZpZGluZyBpdAorICAgICAqIHVwIHNlZW1zIHRvIHJlYWxseSBodXJ0IHBlcmZvcm1hbmNlIGEgbG90IG9uIHRoZSBQNCwgc28sIGxldCdzIG5vdCB1c2UKKyAgICAgKiB0aGlzLi4uICovCisgICAgX19rbXBfYWxsb2NhdGVfdGVhbV9hcnJheXMoIHRlYW0sIG1heF9ucHJvYyApOworCisgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF9hbGxvY2F0ZV90ZWFtOiBtYWtpbmcgYSBuZXcgdGVhbVxuIiApICk7CisgICAgX19rbXBfaW5pdGlhbGl6ZV90ZWFtKCB0ZWFtLCBuZXdfbnByb2MsCisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgIG5ld19pY3ZzLAorICAgICAgTlVMTCAvLyBUT0RPOiAhISEKKyNlbHNlCisgICAgICBuZXdfc2V0X25wcm9jLCBuZXdfc2V0X2R5bmFtaWMsIG5ld19zZXRfbmVzdGVkLAorICAgICAgbmV3X3NldF9ibG9ja3RpbWUsIG5ld19idF9pbnRlcnZhbHMsIG5ld19idF9zZXQKKyNlbmRpZgorICAgICk7CisKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfYWxsb2NhdGVfdGVhbTogc2V0dGluZyB0YXNrX3RlYW0gJXAgdG8gTlVMTFxuIiwKKyAgICAgICAgICAgICAgICAgICAgJnRlYW0tPnQudF90YXNrX3RlYW0gKSApOworICAgIHRlYW0gLT4gdC50X3Rhc2tfdGVhbSA9IE5VTEw7ICAgIC8vIHRvIGJlIHJlbW92ZWQsIGFzIF9fa21wX2FsbG9jYXRlIHplcm9lcyBtZW1vcnksIG5vIG5lZWQgdG8gZHVwbGljYXRlCisjZW5kaWYKKworICAgIGlmICggX19rbXBfc3RvcmFnZV9tYXAgKSB7CisgICAgICAgIF9fa21wX3ByaW50X3RlYW1fc3RvcmFnZV9tYXAoICJ0ZWFtIiwgdGVhbSwgdGVhbS0+dC50X2lkLCBuZXdfbnByb2MgKTsKKyAgICB9CisKKyAgICAvKiBhbGxvY2F0ZSBzcGFjZSBmb3IgYXJndW1lbnRzICovCisgICAgX19rbXBfYWxsb2NfYXJndl9lbnRyaWVzKCBhcmdjLCB0ZWFtLCBGQUxTRSApOworICAgIHRlYW0gLT4gdC50X2FyZ2MgICAgICAgID0gYXJnYzsKKworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9hbGxvY2F0ZV90ZWFtOiB0ZWFtICVkIGluaXQgYXJyaXZlZDogam9pbj0ldSwgcGxhaW49JXVcbiIsCisgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgS01QX0lOSVRfQkFSUklFUl9TVEFURSwgS01QX0lOSVRfQkFSUklFUl9TVEFURSApKTsKKyAgICB7IC8vIEluaXRpYWxpemUgYmFycmllciBkYXRhLgorICAgICAgICBpbnQgYjsKKyAgICAgICAgZm9yICggYiA9IDA7IGIgPCBic19sYXN0X2JhcnJpZXI7ICsrIGIgKSB7CisgICAgICAgICAgICB0ZWFtLT50LnRfYmFyWyBiIF0uYl9hcnJpdmVkICAgICAgICA9IEtNUF9JTklUX0JBUlJJRVJfU1RBVEU7CisgICAgICAgIH0KKyAgICB9CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIHRlYW0tPnQudF9wcm9jX2JpbmQgPSBuZXdfcHJvY19iaW5kOworI2VuZGlmCisKKyAgICBLTVBfTUIoKTsKKworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9hbGxvY2F0ZV90ZWFtOiBkb25lIGNyZWF0aW5nIGEgbmV3IHRlYW0gJWQuXG4iLCB0ZWFtLT50LnRfaWQgKSk7CisKKyAgICByZXR1cm4gdGVhbTsKK30KKworLyogVE9ETyBpbXBsZW1lbnQgaG90LXRlYW1zIGF0IGFsbCBsZXZlbHMgKi8KKy8qIFRPRE8gaW1wbGVtZW50IGxhenkgdGhyZWFkIHJlbGVhc2Ugb24gZGVtYW5kIChkaXNiYW5kIHJlcXVlc3QpICovCisKKy8qIGZyZWUgdGhlIHRlYW0uICByZXR1cm4gaXQgdG8gdGhlIHRlYW0gcG9vbC4gIHJlbGVhc2UgYWxsIHRoZSB0aHJlYWRzCisgKiBhc3NvY2lhdGVkIHdpdGggaXQgKi8KK3ZvaWQKK19fa21wX2ZyZWVfdGVhbSgga21wX3Jvb3RfdCAqcm9vdCwga21wX3RlYW1fdCAqdGVhbSApCit7CisgICAgaW50IGY7CisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2ZyZWVfdGVhbTogVCMlZCBmcmVlaW5nIHRlYW0gJWRcbiIsIF9fa21wX2dldF9ndGlkKCksIHRlYW0tPnQudF9pZCApKTsKKworICAgIC8qIHZlcmlmeSBzdGF0ZSAqLworICAgIEtNUF9ERUJVR19BU1NFUlQoIHJvb3QgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbS0+dC50X25wcm9jIDw9IHRlYW0tPnQudF9tYXhfbnByb2MgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtLT50LnRfdGhyZWFkcyApOworCisgICAgLyogdGVhbSBpcyBkb25lIHdvcmtpbmcgKi8KKyAgICBUQ1dfU1lOQ19QVFIodGVhbS0+dC50X3BrZm4sIE5VTEwpOyAvLyBJbXBvcnRhbnQgZm9yIERlYnVnZ2luZyBTdXBwb3J0IExpYnJhcnkuCisgICAgdGVhbSAtPiB0LnRfY29weWluX2NvdW50ZXIgPSAwOyAvLyBpbml0IGNvdW50ZXIgZm9yIHBvc3NpYmxlIHJldXNlCisgICAgLy8gRG8gbm90IHJlc2V0IHBvaW50ZXIgdG8gcGFyZW50IHRlYW0gdG8gTlVMTCBmb3IgaG90IHRlYW1zLgorCisgICAgLyogaWYgd2UgYXJlIGEgbmVzdGVkIHRlYW0sIHJlbGVhc2Ugb3VyIHRocmVhZHMgKi8KKyAgICBpZiggdGVhbSAhPSByb290LT5yLnJfaG90X3RlYW0gKSB7CisKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgICAgICBpZiAoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICkgeworICAgICAgICAgICAga21wX3Rhc2tfdGVhbV90ICp0YXNrX3RlYW0gPSB0ZWFtLT50LnRfdGFza190ZWFtOworICAgICAgICAgICAgaWYgKCB0YXNrX3RlYW0gIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIFNpZ25hbCB0aGUgd29ya2VyIHRocmVhZHMgdG8gc3RvcCBsb29raW5nIGZvciB0YXNrcyB3aGlsZQorICAgICAgICAgICAgICAgIC8vIHNwaW4gd2FpdGluZy4gIFRoZSB0YXNrIHRlYW1zIGFyZSByZWZlcmVuY2UgY291bnRlZCBhbmQgd2lsbAorICAgICAgICAgICAgICAgIC8vIGJlIGRlYWxsb2NhdGVkIGJ5IHRoZSBsYXN0IHdvcmtlciB0aHJlYWQgdmlhIHRoZSB0aHJlYWQncworICAgICAgICAgICAgICAgIC8vIHBvaW50ZXIgdG8gdGhlIHRhc2sgdGVhbS4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfZnJlZV90ZWFtOiBkZWFjdGl2YXRpbmcgdGFza190ZWFtICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrX3RlYW0gKSApOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0tPnQudF9ucHJvYyA+IDEgKTsKKyAgICAgICAgICAgICAgICBUQ1dfU1lOQ180KCB0YXNrX3RlYW0tPnR0LnR0X2FjdGl2ZSwgRkFMU0UgKTsKKyAgICAgICAgICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfdGFza190ZWFtID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmIC8qIE9NUF8zMF9FTkFCTEVEICovCisKKyAgICAgICAgLy8gUmVzZXQgcG9pbnRlciB0byBwYXJlbnQgdGVhbSBvbmx5IGZvciBub24taG90IHRlYW1zLgorICAgICAgICB0ZWFtIC0+IHQudF9wYXJlbnQgPSBOVUxMOworCisKKyAgICAgICAgLyogZnJlZSB0aGUgd29ya2VyIHRocmVhZHMgKi8KKyAgICAgICAgZm9yICggZiA9IDE7IGYgPCB0ZWFtLT50LnRfbnByb2M7ICsrIGYgKSB7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtLT50LnRfdGhyZWFkc1sgZiBdICk7CisgICAgICAgICAgICBfX2ttcF9mcmVlX3RocmVhZCggdGVhbS0+dC50X3RocmVhZHNbIGYgXSApOworICAgICAgICAgICAgdGVhbS0+dC50X3RocmVhZHNbIGYgXSA9IE5VTEw7CisgICAgICAgIH0KKworCisgICAgICAgIC8qIHB1dCB0aGUgdGVhbSBiYWNrIGluIHRoZSB0ZWFtIHBvb2wgKi8KKyAgICAgICAgLyogVE9ETyBsaW1pdCBzaXplIG9mIHRlYW0gcG9vbCwgY2FsbCByZWFwX3RlYW0gaWYgcG9vbCB0b28gbGFyZ2UgKi8KKyAgICAgICAgdGVhbSAtPiB0LnRfbmV4dF9wb29sICA9IChrbXBfdGVhbV90KikgX19rbXBfdGVhbV9wb29sOworICAgICAgICBfX2ttcF90ZWFtX3Bvb2wgICAgICAgID0gKHZvbGF0aWxlIGttcF90ZWFtX3QqKSB0ZWFtOworICAgIH0KKworICAgIEtNUF9NQigpOworfQorCisKKy8qIHJlYXAgdGhlIHRlYW0uICBkZXN0cm95IGl0LCByZWNsYWltIGFsbCBpdHMgcmVzb3VyY2VzIGFuZCBmcmVlIGl0cyBtZW1vcnkgKi8KK2ttcF90ZWFtX3QgKgorX19rbXBfcmVhcF90ZWFtKCBrbXBfdGVhbV90ICp0ZWFtICkKK3sKKyAgICBrbXBfdGVhbV90ICpuZXh0X3Bvb2wgPSB0ZWFtIC0+IHQudF9uZXh0X3Bvb2w7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSAtPiB0LnRfZGlzcGF0Y2ggICAgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtIC0+IHQudF9kaXNwX2J1ZmZlciApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0gLT4gdC50X3RocmVhZHMgICAgICk7CisgICAgI2lmIE9NUF8zMF9FTkFCTEVECisgICAgI2Vsc2UKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtIC0+IHQudF9zZXRfbnByb2MgICApOworICAgICNlbmRpZgorICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0gLT4gdC50X2FyZ3YgICAgICAgICk7CisKKyAgICAvKiBUT0RPIGNsZWFuIHRoZSB0aHJlYWRzIHRoYXQgYXJlIGEgcGFydCBvZiB0aGlzPyAqLworCisgICAgLyogZnJlZSBzdHVmZiAqLworCisgICAgX19rbXBfZnJlZV90ZWFtX2FycmF5cyggdGVhbSApOworI2lmIChLTVBfUEVSRl9WMTA2ID09IEtNUF9PTikKKyAgICBpZiAoIHRlYW0gLT4gdC50X2FyZ3YgIT0gJnRlYW0gLT4gdC50X2lubGluZV9hcmd2WzBdICkKKyAgICAgICAgX19rbXBfZnJlZSggKHZvaWQqKSB0ZWFtIC0+IHQudF9hcmd2ICk7CisjZWxzZQorICAgIF9fa21wX2ZyZWUoICh2b2lkKikgdGVhbSAtPiB0LnRfYXJndiApOworI2VuZGlmCisgICAgX19rbXBfZnJlZSggdGVhbSApOworCisgICAgS01QX01CKCk7CisgICAgcmV0dXJuIG5leHRfcG9vbDsKK30KKworLy8KKy8vIEZyZWUgdGhlIHRocmVhZC4gIERvbid0IHJlYXAgaXQsIGp1c3QgcGxhY2UgaXQgb24gdGhlIHBvb2wgb2YgYXZhaWxhYmxlCisvLyB0aHJlYWRzLgorLy8KKy8vIENoYW5nZXMgZm9yIFF1YWQgaXNzdWUgNTI3ODQ1OiBXZSBuZWVkIGEgcHJlZGljdGFibGUgT01QIHRpZCA8LT4gZ3RpZAorLy8gYmluZGluZyBmb3IgdGhlIGFmZmluaXR5IG1lY2hhbmlzbSB0byBiZSB1c2VmdWwuCisvLworLy8gTm93LCB3ZSBhbHdheXMga2VlcCB0aGUgZnJlZSBsaXN0IChfX2ttcF90aHJlYWRfcG9vbCkgc29ydGVkIGJ5IGd0aWQuCisvLyBIb3dldmVyLCB3ZSB3YW50IHRvIGF2b2lkIGEgcG90ZW50aWFsIHBlcmZvcm1hbmNlIHByb2JsZW0gYnkgYWx3YXlzCisvLyBzY2FubmluZyB0aHJvdWdoIHRoZSBsaXN0IHRvIGZpbmQgdGhlIGNvcnJlY3QgcG9pbnQgYXQgd2hpY2ggdG8gaW5zZXJ0CisvLyB0aGUgdGhyZWFkIChwb3RlbnRpYWwgTioqMiBiZWhhdmlvcikuICBUbyBkbyB0aGlzIHdlIGtlZXAgdHJhY2sgb2YgdGhlCisvLyBsYXN0IHBsYWNlIGEgdGhyZWFkIHN0cnVjdCB3YXMgaW5zZXJ0ZWQgKF9fa21wX3RocmVhZF9wb29sX2luc2VydF9wdCkuCisvLyBXaXRoIHNpbmdsZS1sZXZlbCBwYXJhbGxlbGlzbSwgdGhyZWFkcyB3aWxsIGFsd2F5cyBiZSBhZGRlZCB0byB0aGUgdGFpbAorLy8gb2YgdGhlIGxpc3QsIGtlcHQgdHJhY2sgb2YgYnkgX19rbXBfdGhyZWFkX3Bvb2xfaW5zZXJ0X3B0LiAgV2l0aCBuZXN0ZWQKKy8vIHBhcmFsbGVsaXNtLCBhbGwgYmV0cyBhcmUgb2ZmIGFuZCB3ZSBtYXkgbmVlZCB0byBzY2FuIHRocm91Z2ggdGhlIGVudGlyZQorLy8gZnJlZSBsaXN0LgorLy8KKy8vIFRoaXMgY2hhbmdlIGFsc28gaGFzIGEgcG90ZW50aWFsbHkgbGFyZ2UgcGVyZm9ybWFuY2UgYmVuZWZpdCwgZm9yIHNvbWUKKy8vIGFwcGxpY2F0aW9ucy4gIFByZXZpb3VzbHksIGFzIHRocmVhZHMgd2VyZSBmcmVlZCBmcm9tIHRoZSBob3QgdGVhbSwgdGhleQorLy8gd291bGQgYmUgcGxhY2VkIGJhY2sgb24gdGhlIGZyZWUgbGlzdCBpbiBpbnZlcnNlIG9yZGVyLiAgSWYgdGhlIGhvdCB0ZWFtCisvLyBncmV3IGJhY2sgdG8gaXQncyBvcmlnaW5hbCBzaXplLCB0aGVuIHRoZSBmcmVlZCB0aHJlYWQgd291bGQgYmUgcGxhY2VkCisvLyBiYWNrIG9uIHRoZSBob3QgdGVhbSBpbiByZXZlcnNlIG9yZGVyLiAgVGhpcyBjb3VsZCBjYXVzZSBiYWQgY2FjaGUKKy8vIGxvY2FsaXR5IHByb2JsZW1zIG9uIHByb2dyYW1zIHdoZXJlIHRoZSBzaXplIG9mIHRoZSBob3QgdGVhbSByZWd1bGFybHkKKy8vIGdyZXcgYW5kIHNocnVuay4KKy8vCisvLyBOb3csIGZvciBzaW5nbGUtbGV2ZWwgcGFyYWxsZWxpc20sIHRoZSBPTVAgdGlkIGlzIGFsd2F5ID09IGd0aWQuCisvLwordm9pZAorX19rbXBfZnJlZV90aHJlYWQoIGttcF9pbmZvX3QgKnRoaXNfdGggKQoreworICAgIGludCBndGlkOworICAgIGttcF9pbmZvX3QgKipzY2FuOworCisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2ZyZWVfdGhyZWFkOiBUIyVkIHB1dHRpbmcgVCMlZCBiYWNrIG9uIGZyZWUgcG9vbC5cbiIsCisgICAgICAgICAgICAgICAgX19rbXBfZ2V0X2d0aWQoKSwgdGhpc190aC0+dGgudGhfaW5mby5kcy5kc19ndGlkICkpOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aCApOworCisKKyAgICAvKiBwdXQgdGhyZWFkIGJhY2sgb24gdGhlIGZyZWUgcG9vbCAqLworICAgIFRDV19QVFIodGhpc190aC0+dGgudGhfdGVhbSwgTlVMTCk7CisgICAgVENXX1BUUih0aGlzX3RoLT50aC50aF9yb290LCBOVUxMKTsKKyAgICBUQ1dfUFRSKHRoaXNfdGgtPnRoLnRoX2Rpc3BhdGNoLCBOVUxMKTsgICAgICAgICAgICAgICAvKiBOT1QgTkVFREVEICovCisKKyAgICAvLworICAgIC8vIElmIHRoZSBfX2ttcF90aHJlYWRfcG9vbF9pbnNlcnRfcHQgaXMgYWxyZWFkeSBwYXN0IHRoZSBuZXcgaW5zZXJ0CisgICAgLy8gcG9pbnQsIHRoZW4gd2UgbmVlZCB0byByZS1zY2FuIHRoZSBlbnRpcmUgbGlzdC4KKyAgICAvLworICAgIGd0aWQgPSB0aGlzX3RoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQ7CisgICAgaWYgKCBfX2ttcF90aHJlYWRfcG9vbF9pbnNlcnRfcHQgIT0gTlVMTCApIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGhyZWFkX3Bvb2wgIT0gTlVMTCApOworICAgICAgICBpZiAoIF9fa21wX3RocmVhZF9wb29sX2luc2VydF9wdC0+dGgudGhfaW5mby5kcy5kc19ndGlkID4gZ3RpZCApIHsKKyAgICAgICAgICAgICBfX2ttcF90aHJlYWRfcG9vbF9pbnNlcnRfcHQgPSBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgLy8KKyAgICAvLyBTY2FuIGRvd24gdGhlIGxpc3QgdG8gZmluZCB0aGUgcGxhY2UgdG8gaW5zZXJ0IHRoZSB0aHJlYWQuCisgICAgLy8gc2NhbiBpcyB0aGUgYWRkcmVzcyBvZiBhIGxpbmsgaW4gdGhlIGxpc3QsIHBvc3NpYmx5IHRoZSBhZGRyZXNzIG9mCisgICAgLy8gX19rbXBfdGhyZWFkX3Bvb2wgaXRzZWxmLgorICAgIC8vCisgICAgLy8gSW4gdGhlIGFic2VuY2Ugb2YgbmVzdGVkIHBhcmFsbGlzbSwgdGhlIGZvciBsb29wIHdpbGwgaGF2ZSAwIGl0ZXJhdGlvbnMuCisgICAgLy8KKyAgICBpZiAoIF9fa21wX3RocmVhZF9wb29sX2luc2VydF9wdCAhPSBOVUxMICkgeworICAgICAgICBzY2FuID0gJiggX19rbXBfdGhyZWFkX3Bvb2xfaW5zZXJ0X3B0LT50aC50aF9uZXh0X3Bvb2wgKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHNjYW4gPSAoa21wX2luZm9fdCAqKikmX19rbXBfdGhyZWFkX3Bvb2w7CisgICAgfQorICAgIGZvciAoOyAoICpzY2FuICE9IE5VTEwgKSAmJiAoICgqc2NhbiktPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCA8IGd0aWQgKTsKKyAgICAgIHNjYW4gPSAmKCAoKnNjYW4pLT50aC50aF9uZXh0X3Bvb2wgKSApOworCisgICAgLy8KKyAgICAvLyBJbnNlcnQgdGhlIG5ldyBlbGVtZW50IG9uIHRoZSBsaXN0LCBhbmQgc2V0IF9fa21wX3RocmVhZF9wb29sX2luc2VydF9wdAorICAgIC8vIHRvIGl0cyBhZGRyZXNzLgorICAgIC8vCisgICAgVENXX1BUUih0aGlzX3RoLT50aC50aF9uZXh0X3Bvb2wsICpzY2FuKTsKKyAgICBfX2ttcF90aHJlYWRfcG9vbF9pbnNlcnRfcHQgPSAqc2NhbiA9IHRoaXNfdGg7CisgICAgS01QX0RFQlVHX0FTU0VSVCggKCB0aGlzX3RoLT50aC50aF9uZXh0X3Bvb2wgPT0gTlVMTCApCisgICAgICB8fCAoIHRoaXNfdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZAorICAgICAgPCB0aGlzX3RoLT50aC50aF9uZXh0X3Bvb2wtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCApICk7CisgICAgVENXXzQodGhpc190aC0+dGgudGhfaW5fcG9vbCwgVFJVRSk7CisgICAgX19rbXBfdGhyZWFkX3Bvb2xfbnRoKys7CisKKyAgICBUQ1dfNChfX2ttcF9udGgsIF9fa21wX250aCAtIDEpOworCisjaWZkZWYgS01QX0FESlVTVF9CTE9DS1RJTUUKKyAgICAvKiBBZGp1c3QgYmxvY2t0aW1lIGJhY2sgdG8gdXNlciBzZXR0aW5nIG9yIGRlZmF1bHQgaWYgbmVjZXNzYXJ5ICovCisgICAgLyogTWlkZGxlIGluaXRpYWxpemF0aW9uIG1pZ2h0IG5ldmVyIGhhdmUgb2NjdXJyZWQgICAgICAgICAgICAgICAgKi8KKyAgICBpZiAoICFfX2ttcF9lbnZfYmxvY2t0aW1lICYmICggX19rbXBfYXZhaWxfcHJvYyA+IDAgKSApIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfYXZhaWxfcHJvYyA+IDAgKTsKKyAgICAgICAgaWYgKCBfX2ttcF9udGggPD0gX19rbXBfYXZhaWxfcHJvYyApIHsKKyAgICAgICAgICAgIF9fa21wX3plcm9fYnQgPSBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBLTVBfQURKVVNUX0JMT0NLVElNRSAqLworCisgICAgS01QX01CKCk7Cit9CisKK3ZvaWQKK19fa21wX2pvaW5fYmFycmllciggaW50IGd0aWQgKQoreworICAgIHJlZ2lzdGVyIGttcF9pbmZvX3QgICAqdGhpc190aHIgICAgICAgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAgcmVnaXN0ZXIga21wX3RlYW1fdCAgICp0ZWFtOworICAgIHJlZ2lzdGVyIGttcF91aW50ICAgICAgbnByb2M7CisgICAga21wX2luZm9fdCAgICAgICAgICAgICptYXN0ZXJfdGhyZWFkOworICAgIGludCAgICAgICAgICAgICAgICAgICAgdGlkOworICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICB0ZWFtX2lkOworICAgICNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKyNpZiBVU0VfSVRUX0JVSUxECisgICAgdm9pZCAqIGl0dF9zeW5jX29iaiA9IE5VTEw7CisgICAgI2lmIFVTRV9JVFRfTk9USUZZCisgICAgICAgIGlmICggX19pdHRfc3luY19jcmVhdGVfcHRyIHx8IEtNUF9JVFRfREVCVUcgKSAvLyBkb24ndCBjYWxsIHJvdXRpbmUgd2l0aG91dCBuZWVkCisgICAgICAgICAgICBpdHRfc3luY19vYmogPSBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoIGd0aWQsIGJzX2Zvcmtqb2luX2JhcnJpZXIgKTsgLy8gZ2V0IG9iamVjdCBjcmVhdGVkIGF0IGZvcmtfYmFycmllcgorICAgICNlbmRpZgorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIEtNUF9NQigpOworCisgICAgLyogZ2V0IGN1cnJlbnQgaW5mbyAqLworICAgIHRlYW0gICAgICAgICAgPSB0aGlzX3RociAtPiB0aC50aF90ZWFtOworICAgIC8qICAgIG5wcm9jICAgICAgICAgPSB0ZWFtIC0+IHQudF9ucHJvYzsqLworICAgIG5wcm9jICAgICAgICAgPSB0aGlzX3RociAtPiB0aC50aF90ZWFtX25wcm9jOworICAgIEtNUF9ERUJVR19BU1NFUlQoIG5wcm9jID09IHRlYW0tPnQudF9ucHJvYyApOworICAgIHRpZCAgICAgICAgICAgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgdGVhbV9pZCAgICAgICA9IHRlYW0gLT4gdC50X2lkOworICAgICNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKyAgICAvKiAgICBtYXN0ZXJfdGhyZWFkID0gdGVhbSAtPiB0LnRfdGhyZWFkc1swXTsqLworICAgIG1hc3Rlcl90aHJlYWQgPSB0aGlzX3RociAtPiB0aC50aF90ZWFtX21hc3RlcjsKKyAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgIGlmICggbWFzdGVyX3RocmVhZCAhPSB0ZWFtLT50LnRfdGhyZWFkc1swXSApIHsKKyAgICAgICAgICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZSgpOworICAgICAgICB9CisgICAgI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworICAgIEtNUF9ERUJVR19BU1NFUlQoIG1hc3Rlcl90aHJlYWQgPT0gdGVhbS0+dC50X3RocmVhZHNbMF0gKTsKKyAgICBLTVBfTUIoKTsKKworICAgIC8qIHZlcmlmeSBzdGF0ZSAqLworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3RocmVhZHMgJiYgX19rbXBfdGhyZWFkc1tndGlkXSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIFRDUl9QVFIodGhpc190aHItPnRoLnRoX3RlYW0pICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggVENSX1BUUih0aGlzX3Roci0+dGgudGhfcm9vdCkgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3RociA9PSB0ZWFtIC0+IHQudF90aHJlYWRzW3RpZF0gKTsKKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9qb2luX2JhcnJpZXI6IFQjJWQoJWQ6JWQpIGFycml2ZWQgYXQgam9pbiBiYXJyaWVyXG4iLAorICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW1faWQsIHRpZCApKTsKKworICAgICNpZiBPTVBfMzBfRU5BQkxFRAorICAgICAgICBpZiAoIF9fa21wX3Rhc2tpbmdfbW9kZSA9PSB0c2ttX2V4dHJhX2JhcnJpZXIgKSB7CisgICAgICAgICAgICBfX2ttcF90YXNraW5nX2JhcnJpZXIoIHRlYW0sIHRoaXNfdGhyLCBndGlkICk7CisKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9qb2luX2JhcnJpZXI6IFQjJWQoJWQ6JWQpIHBhc3QgdGFraW5nIGJhcnJpZXJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtX2lkLCB0aWQgKSk7CisgICAgICAgIH0KKyAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICBpZiAoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICkgeworICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF9qb2luX2JhcnJpZXI6IFQjJWQsIG9sZCB0ZWFtID0gJWQsIG9sZCB0YXNrX3RlYW0gPSAlcCwgdGhfdGFza190ZWFtID0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRoaXNfdGhyICksIHRlYW1faWQsIHRlYW0gLT4gdC50X3Rhc2tfdGVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSApICk7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3Roci0+dGgudGhfdGFza190ZWFtID09IHRlYW0tPnQudF90YXNrX3RlYW0gKTsKKyAgICAgICAgfQorICAgICAgICAjZW5kaWYgLyogS01QX0RFQlVHICovCisgICAgI2VuZGlmIC8qIE9NUF8zMF9FTkFCTEVEICovCisKKyAgICAvLworICAgIC8vIENvcHkgdGhlIGJsb2NrdGltZSBpbmZvIHRvIHRoZSB0aHJlYWQsIHdoZXJlIF9fa21wX3dhaXRfc2xlZXAoKQorICAgIC8vIGNhbiBhY2Nlc3MgaXQgd2hlbiB0aGUgdGVhbSBzdHJ1Y3QgaXMgbm90IGd1YXJhbnRlZWQgdG8gZXhpc3QuCisgICAgLy8KKyAgICAvLyBEb2luZyB0aGVzZSBsb2FkcyBjYXVzZXMgYSBjYWNoZSBtaXNzIHNsb3dzIGRvd24gRVBDQyBwYXJhbGxlbCBieSAyeC4KKyAgICAvLyBBcyBhIHdvcmthcm91bmQsIHdlIGRvIG5vdCBwZXJmb3JtIHRoZSBjb3B5IGlmIGJsb2NrdGltZT1pbmZpbml0ZSwKKyAgICAvLyBzaW5jZSB0aGUgdmFsdWVzIGFyZSBub3QgdXNlZCBieSBfX2ttcF93YWl0X3NsZWVwKCkgaW4gdGhhdCBjYXNlLgorICAgIC8vCisgICAgaWYgKCBfX2ttcF9kZmx0X2Jsb2NrdGltZSAhPSBLTVBfTUFYX0JMT0NLVElNRSApIHsKKyAgICAgICAgI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgICB0aGlzX3RociAtPiB0aC50aF90ZWFtX2J0X2ludGVydmFscyA9IHRlYW0gLT4gdC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS50ZF9pY3ZzLmJ0X2ludGVydmFsczsKKyAgICAgICAgICAgIHRoaXNfdGhyIC0+IHRoLnRoX3RlYW1fYnRfc2V0ID0gdGVhbSAtPiB0LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLnRkX2ljdnMuYnRfc2V0OworICAgICAgICAjZWxzZQorICAgICAgICAgICAgdGhpc190aHIgLT4gdGgudGhfdGVhbV9idF9pbnRlcnZhbHMgPSB0ZWFtIC0+IHQudF9zZXRfYnRfaW50ZXJ2YWxzW3RpZF07CisgICAgICAgICAgICB0aGlzX3RociAtPiB0aC50aF90ZWFtX2J0X3NldD0gdGVhbSAtPiB0LnRfc2V0X2J0X3NldFt0aWRdOworICAgICAgICAjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKyAgICB9CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgaWYgKCBfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgfHwgS01QX0lUVF9ERUJVRyApCisgICAgICAgIF9fa21wX2l0dF9iYXJyaWVyX3N0YXJ0aW5nKCBndGlkLCBpdHRfc3luY19vYmogKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICBpZiAoIF9fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdHRlcm5bIGJzX2Zvcmtqb2luX2JhcnJpZXIgXSA9PSBicF9saW5lYXJfYmFyIHx8IF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JyYW5jaF9iaXRzWyBic19mb3Jram9pbl9iYXJyaWVyIF0gPT0gMCApIHsKKyAgICAgICAgX19rbXBfbGluZWFyX2JhcnJpZXJfZ2F0aGVyKCBic19mb3Jram9pbl9iYXJyaWVyLCB0aGlzX3RociwgZ3RpZCwgdGlkLCBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoIGl0dF9zeW5jX29iaiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICB9IGVsc2UgaWYgKCBfX2ttcF9iYXJyaWVyX2dhdGhlcl9wYXR0ZXJuWyBic19mb3Jram9pbl9iYXJyaWVyIF0gPT0gYnBfdHJlZV9iYXIgKSB7CisgICAgICAgIF9fa21wX3RyZWVfYmFycmllcl9nYXRoZXIoIGJzX2Zvcmtqb2luX2JhcnJpZXIsIHRoaXNfdGhyLCBndGlkLCB0aWQsIE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoIGl0dF9zeW5jX29iaiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfaHlwZXJfYmFycmllcl9nYXRoZXIoIGJzX2Zvcmtqb2luX2JhcnJpZXIsIHRoaXNfdGhyLCBndGlkLCB0aWQsIE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKCBpdHRfc3luY19vYmogKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICB9OyAvLyBpZgorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIGlmICggX19pdHRfc3luY19jcmVhdGVfcHRyIHx8IEtNUF9JVFRfREVCVUcgKQorICAgICAgICBfX2ttcF9pdHRfYmFycmllcl9taWRkbGUoIGd0aWQsIGl0dF9zeW5jX29iaiApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIC8vCisgICAgLy8gRnJvbSB0aGlzIHBvaW50IG9uLCB0aGUgdGVhbSBkYXRhIHN0cnVjdHVyZSBtYXkgYmUgZGVhbGxvY2F0ZWQKKyAgICAvLyBhdCBhbnkgdGltZSBieSB0aGUgbWFzdGVyIHRocmVhZCAtIGl0IGlzIHVuc2FmZSB0byByZWZlcmVuY2UgaXQKKyAgICAvLyBpbiBhbnkgb2YgdGhlIHdvcmtlciB0aHJlYWRzLgorICAgIC8vCisgICAgLy8gQW55IHBlci10ZWFtIGRhdGEgaXRlbXMgdGhhdCBuZWVkIHRvIGJlIHJlZmVyZW5jZWQgYmVmb3JlIHRoZSBlbmQKKyAgICAvLyBvZiB0aGUgYmFycmllciBzaG91bGQgYmUgbW92ZWQgdG8gdGhlIGttcF90YXNrX3RlYW1fdCBzdHJ1Y3RzLgorICAgIC8vCisKKyAgICAjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgICAgaWYgKCBLTVBfTUFTVEVSX1RJRCggdGlkICkgKSB7CisgICAgICAgICAgICBpZiAoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICkgeworICAgICAgICAgICAgICAgIC8vIE1hc3RlciBzaG91bGRuJ3QgY2FsbCBkZWNyZWFzZV9sb2FkKCkuICAgICAgICAgLy8gVE9ETzogZW5hYmxlIG1hc3RlciB0aHJlYWRzLgorICAgICAgICAgICAgICAgIC8vIE1hc3RlciBzaG91bGQgaGF2ZSB0aF9tYXlfZGVjcmVhc2VfbG9hZCA9PSAwLiAgLy8gVE9ETzogZW5hYmxlIG1hc3RlciB0aHJlYWRzLgorICAgICAgICAgICAgICAgIF9fa21wX3Rhc2tfdGVhbV93YWl0KCB0aGlzX3RociwgdGVhbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyggaXR0X3N5bmNfb2JqICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgICAgICAgICAgICAvLyBKb2luIGJhcnJpZXIgLSByZXBvcnQgZnJhbWUgZW5kCisgICAgICAgICAgICBpZiggX19pdHRfZnJhbWVfc3VibWl0X3YzX3B0ciAmJiBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSApIHsKKyAgICAgICAgICAgICAgICBrbXBfdWludDY0IHRtcCA9IF9faXR0X2dldF90aW1lc3RhbXAoKTsKKyAgICAgICAgICAgICAgICBpZGVudF90ICogbG9jID0gdGVhbS0+dC50X2lkZW50OworICAgICAgICAgICAgICAgIHN3aXRjaCggX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgX19rbXBfaXR0X2ZyYW1lX3N1Ym1pdCggZ3RpZCwgdGhpc190aHItPnRoLnRoX2ZyYW1lX3RpbWUsIHRtcCwgMCwgbG9jICk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICBfX2ttcF9pdHRfZnJhbWVfc3VibWl0KCBndGlkLCB0aGlzX3Roci0+dGgudGhfYmFyX2Fycml2ZV90aW1lLCB0bXAsIDEsIGxvYyApOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgX19rbXBfaXR0X2ZyYW1lX3N1Ym1pdCggZ3RpZCwgdGhpc190aHItPnRoLnRoX2ZyYW1lX3RpbWUsIHRtcCwgMCwgbG9jICk7CisgICAgICAgICAgICAgICAgICBfX2ttcF9pdHRfZnJhbWVfc3VibWl0KCBndGlkLCB0aGlzX3Roci0+dGgudGhfYmFyX2Fycml2ZV90aW1lLCB0bXAsIDEsIGxvYyApOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICAgICAgfQorICAgICNlbmRpZiAvKiBPTVBfMzBfRU5BQkxFRCAqLworCisgICAgI2lmIEtNUF9ERUJVRworICAgICAgICBpZiggS01QX01BU1RFUl9USUQoIHRpZCApKSB7CisgICAgICAgICAgICBLQV9UUkFDRSggMTUsICggIl9fa21wX2pvaW5fYmFycmllcjogVCMlZCglZDolZCkgc2F5cyBhbGwgJWQgdGVhbSB0aHJlYWRzIGFycml2ZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbV9pZCwgdGlkLCBucHJvYyApKTsKKyAgICAgICAgfQorICAgICNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKworICAgIC8qIFRPRE8gbm93LCBtYXJrIHdvcmtlciB0aHJlYWRzIGFzIGRvbmUgc28gdGhleSBtYXkgYmUgZGlzYmFuZGVkICovCisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfam9pbl9iYXJyaWVyOiBUIyVkKCVkOiVkKSBsZWF2aW5nXG4iLAorICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW1faWQsIHRpZCApKTsKK30KKworCisvKiBUT0RPIHJlbGVhc2Ugd29ya2VyIHRocmVhZHMnIGZvcmsgYmFycmllcnMgYXMgd2UgYXJlIHJlYWR5IGluc3RlYWQgb2YgYWxsIGF0IG9uY2UgKi8KKwordm9pZAorX19rbXBfZm9ya19iYXJyaWVyKCBpbnQgZ3RpZCwgaW50IHRpZCApCit7CisgICAga21wX2luZm9fdCAqdGhpc190aHIgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAga21wX3RlYW1fdCAqdGVhbSAgICAgPSAoIHRpZCA9PSAwICkgPyB0aGlzX3RociAtPiB0aC50aF90ZWFtIDogTlVMTDsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgdm9pZCAqIGl0dF9zeW5jX29iaiA9IE5VTEw7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcF9mb3JrX2JhcnJpZXI6IFQjJWQoJWQ6JWQpIGhhcyBhcnJpdmVkXG4iLAorICAgICAgICAgICAgICAgICAgICBndGlkLCAoIHRlYW0gIT0gTlVMTCApID8gdGVhbS0+dC50X2lkIDogLTEsIHRpZCApKTsKKworICAgIC8qIHRoX3RlYW0gcG9pbnRlciBvbmx5IHZhbGlkIGZvciBtYXN0ZXIgdGhyZWFkIGhlcmUgKi8KKyAgICBpZiAoIEtNUF9NQVNURVJfVElEKCB0aWQgKSApIHsKKworI2lmIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgICAgIGlmICggX19pdHRfc3luY19jcmVhdGVfcHRyIHx8IEtNUF9JVFRfREVCVUcgKSB7CisgICAgICAgICAgICAgICAgaXR0X3N5bmNfb2JqICA9IF9fa21wX2l0dF9iYXJyaWVyX29iamVjdCggZ3RpZCwgYnNfZm9ya2pvaW5fYmFycmllciwgMSApOyAvLyBjcmVhdGUgaXR0IGJhcnJpZXIgb2JqZWN0CisgICAgICAgICAgICAgICAgLy9fX2ttcF9pdHRfYmFycmllcl9zdGFydGluZyggZ3RpZCwgaXR0X3N5bmNfb2JqICk7ICAgLy8gQUM6IG5vIG5lZWQgdG8gY2FsbCBwcmVwYXJlIHJpZ2h0IGJlZm9yZSBhY3F1aXJlZAorICAgICAgICAgICAgICAgIF9fa21wX2l0dF9iYXJyaWVyX21pZGRsZSggZ3RpZCwgaXR0X3N5bmNfb2JqICk7ICAgICAgIC8vIGNhbGwgYWNxdWlyZWQgLyByZWxlYXNpbmcKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZICovCisKKyNpZmRlZiBLTVBfREVCVUcKKworICAgICAgICByZWdpc3RlciBrbXBfaW5mb190ICoqb3RoZXJfdGhyZWFkcyA9IHRlYW0gLT4gdC50X3RocmVhZHM7CisgICAgICAgIHJlZ2lzdGVyIGludCAgICAgICAgICBpOworCisgICAgICAgIC8qIHZlcmlmeSBzdGF0ZSAqLworICAgICAgICBLTVBfTUIoKTsKKworICAgICAgICBmb3IoIGkgPSAxOyBpIDwgdGVhbSAtPiB0LnRfbnByb2MgOyBpKysgKSB7CisgICAgICAgICAgICBLQV9UUkFDRSggNTAwLCAoICJfX2ttcF9mb3JrX2JhcnJpZXI6IFQjJWQoJWQ6MCkgY2hlY2tpbmcgVCMlZCglZDolZCkgZm9yayAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnbyA9PSAldS5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfaW5mby5kcy5kc19ndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2luZm8uZHMuZHNfdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcl90aHJlYWRzW2ldLT50aC50aF9iYXJbIGJzX2Zvcmtqb2luX2JhcnJpZXIgXS5iYi5iX2dvICkgKTsKKworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKCBUQ1JfNCggb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfYmFyW2JzX2Zvcmtqb2luX2JhcnJpZXJdLmJiLmJfZ28gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIH4oS01QX0JBUlJJRVJfU0xFRVBfU1RBVEUpICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFICk7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBvdGhlcl90aHJlYWRzW2ldLT50aC50aF90ZWFtID09IHRlYW0gKTsKKworICAgICAgICB9CisjZW5kaWYKKworI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKSB7CisgICAgICAgICAgICBfX2ttcF90YXNrX3RlYW1fc2V0dXAoIHRoaXNfdGhyLCB0ZWFtICk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBPTVBfMzBfRU5BQkxFRCAqLworCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZSBtYXN0ZXIgdGhyZWFkIG1heSBoYXZlIGNoYW5nZWQgaXRzIGJsb2NrdGltZSBiZXR3ZWVuIHRoZQorICAgICAgICAvLyBqb2luIGJhcnJpZXIgYW5kIHRoZSBmb3JrIGJhcnJpZXIuCisgICAgICAgIC8vCisgICAgICAgIC8vIENvcHkgdGhlIGJsb2NrdGltZSBpbmZvIHRvIHRoZSB0aHJlYWQsIHdoZXJlIF9fa21wX3dhaXRfc2xlZXAoKQorICAgICAgICAvLyBjYW4gYWNjZXNzIGl0IHdoZW4gdGhlIHRlYW0gc3RydWN0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGV4aXN0LgorICAgICAgICAvLworICAgICAgICAvLyBTZWUgdGhlIG5vdGUgYWJvdXQgdGhlIGNvcnJlc3BvbmRpbmcgY29kZSBpbiBfX2ttcF9qb2luX2JhcnJpZXIoKQorICAgICAgICAvLyBiZWluZyBwZXJmb3JtYW5jZS1jcml0aWNhbC4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCBfX2ttcF9kZmx0X2Jsb2NrdGltZSAhPSBLTVBfTUFYX0JMT0NLVElNRSApIHsKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgICAgICAgICAgdGhpc190aHIgLT4gdGgudGhfdGVhbV9idF9pbnRlcnZhbHMgPSB0ZWFtIC0+IHQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0udGRfaWN2cy5idF9pbnRlcnZhbHM7CisgICAgICAgICAgICB0aGlzX3RociAtPiB0aC50aF90ZWFtX2J0X3NldCA9IHRlYW0gLT4gdC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS50ZF9pY3ZzLmJ0X3NldDsKKyNlbHNlCisgICAgICAgICAgICB0aGlzX3RociAtPiB0aC50aF90ZWFtX2J0X2ludGVydmFscyA9IHRlYW0gLT4gdC50X3NldF9idF9pbnRlcnZhbHNbdGlkXTsKKyAgICAgICAgICAgIHRoaXNfdGhyIC0+IHRoLnRoX3RlYW1fYnRfc2V0PSB0ZWFtIC0+IHQudF9zZXRfYnRfc2V0W3RpZF07CisjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKyAgICAgICAgfQorICAgIH0gLy8gbWFzdGVyCisKKyAgICBpZiAoIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXR0ZXJuWyBic19mb3Jram9pbl9iYXJyaWVyIF0gPT0gYnBfbGluZWFyX2JhciB8fCBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHNbIGJzX2Zvcmtqb2luX2JhcnJpZXIgXSA9PSAwICkgeworICAgICAgICBfX2ttcF9saW5lYXJfYmFycmllcl9yZWxlYXNlKCBic19mb3Jram9pbl9iYXJyaWVyLCB0aGlzX3RociwgZ3RpZCwgdGlkLCBUUlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKCBpdHRfc3luY19vYmogKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgIH0gZWxzZSBpZiAoIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXR0ZXJuWyBic19mb3Jram9pbl9iYXJyaWVyIF0gPT0gYnBfdHJlZV9iYXIgKSB7CisgICAgICAgIF9fa21wX3RyZWVfYmFycmllcl9yZWxlYXNlKCBic19mb3Jram9pbl9iYXJyaWVyLCB0aGlzX3RociwgZ3RpZCwgdGlkLCBUUlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyggaXR0X3N5bmNfb2JqICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfaHlwZXJfYmFycmllcl9yZWxlYXNlKCBic19mb3Jram9pbl9iYXJyaWVyLCB0aGlzX3RociwgZ3RpZCwgdGlkLCBUUlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoIGl0dF9zeW5jX29iaiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICB9OyAvLyBpZgorCisgICAgLy8KKyAgICAvLyBlYXJseSBleGl0IGZvciByZWFwaW5nIHRocmVhZHMgcmVsZWFzaW5nIGZvcmtqb2luIGJhcnJpZXIKKyAgICAvLworICAgIGlmICggVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSApIHsKKworI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgIGlmICggdGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSAhPSBOVUxMICkgeworICAgICAgICAgICAgaWYgKCBLTVBfTUFTVEVSX1RJRCggdGlkICkgKSB7CisgICAgICAgICAgICAgICAgVENXX1BUUih0aGlzX3Roci0+dGgudGhfdGFza190ZWFtLCBOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIF9fa21wX3VucmVmX3Rhc2tfdGVhbSggdGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSwgdGhpc190aHIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmIC8qIE9NUF8zMF9FTkFCTEVEICovCisKKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgICAgICAgIGlmICggX19pdHRfc3luY19jcmVhdGVfcHRyIHx8IEtNUF9JVFRfREVCVUcgKSB7CisgICAgICAgICAgICBpZiAoICFLTVBfTUFTVEVSX1RJRCggdGlkICkgKSB7CisgICAgICAgICAgICAgICAgaXR0X3N5bmNfb2JqICA9IF9fa21wX2l0dF9iYXJyaWVyX29iamVjdCggZ3RpZCwgYnNfZm9ya2pvaW5fYmFycmllciApOworICAgICAgICAgICAgICAgIGlmICggaXR0X3N5bmNfb2JqICkKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfaXR0X2JhcnJpZXJfZmluaXNoZWQoIGd0aWQsIGl0dF9zeW5jX29iaiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWSAqLworICAgICAgICBLQV9UUkFDRSggMTAsICggIl9fa21wX2ZvcmtfYmFycmllcjogVCMlZCBpcyBsZWF2aW5nIGVhcmx5XG4iLCBndGlkICkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8KKyAgICAvLyBXZSBjYW4gbm93IGFzc3VtZSB0aGF0IGEgdmFsaWQgdGVhbSBzdHJ1Y3R1cmUgaGFzIGJlZW4gYWxsb2NhdGVkCisgICAgLy8gYnkgdGhlIG1hc3RlciBhbmQgcHJvcGFnYXRlZCB0byBhbGwgd29ya2VyIHRocmVhZHMuCisgICAgLy8KKyAgICAvLyBUaGUgY3VycmVudCB0aHJlYWQsIGhvd2V2ZXIsIG1heSBub3QgYmUgcGFydCBvZiB0aGUgdGVhbSwgc28gd2UgY2FuJ3QKKyAgICAvLyBibGluZGx5IGFzc3VtZSB0aGF0IHRoZSB0ZWFtIHBvaW50ZXIgaXMgbm9uLW51bGwuCisgICAgLy8KKyAgICB0ZWFtID0gKGttcF90ZWFtX3QgKilUQ1JfUFRSKHRoaXNfdGhyLT50aC50aF90ZWFtKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtICE9IE5VTEwgKTsKKyAgICB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKCBndGlkICk7CisKKyNpZiBPTVBfMzBfRU5BQkxFRAorCisjIGlmIEtNUF9CQVJSSUVSX0lDVl9QVUxMCisgICAgLy8gTWFzdGVyIHRocmVhZCdzIGNvcHkgb2YgdGhlIElDVnMgd2FzIHNldCB1cCBvbiB0aGUgaW1wbGljaXQgdGFza2RhdGEgaW4gX19rbXBfcmVpbml0aWFsaXplX3RlYW0uCisgICAgLy8gX19rbXBfZm9ya19jYWxsKCkgYXNzdW1lcyB0aGUgbWFzdGVyIHRocmVhZCdzIGltcGxpY2l0IHRhc2sgaGFzIHRoaXMgZGF0YSBiZWZvcmUgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuCisgICAgLy8gV2UgY2Fubm90IG1vZGlmeSBfX2ttcF9mb3JrX2NhbGwoKSB0byBsb29rIGF0IHRoZSBmaXhlZCBJQ1ZzIGluIHRoZSBtYXN0ZXIncyB0aHJlYWQgc3RydWN0LCBiZWNhdXNlIGl0IGlzCisgICAgLy8gbm90IGFsd2F5cyB0aGUgY2FzZSB0aGF0IHRoZSB0aHJlYWRzIGFycmF5cyBoYXZlIGJlZW4gYWxsb2NhdGVkIHdoZW4gX19rbXBfZm9ya19jYWxsKCkgaXMgZXhlY3V0ZWQuCisgICAgaWYgKCEgS01QX01BU1RFUl9USUQoIHRpZCApICkgeyAgLy8gbWFzdGVyIHRocmVhZCBhbHJlYWR5IGhhcyBJQ1ZzCisgICAgICAgIC8vIENvcHkgdGhlIGluaXRpYWwgSUNWcyBmcm9tIHRoZSBtYXN0ZXIncyB0aHJlYWQgc3RydWN0IHRvIHRoZSBpbXBsaWNpdCB0YXNrIGZvciB0aGlzIHRpZC4KKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcF9mb3JrX2JhcnJpZXI6IFQjJWQoJWQpIGlzIFBVTExpbmcgSUNWc1xuIiwgZ3RpZCwgdGlkICkpOworICAgICAgICBsb2FkX2ljdnMoJnRlYW0tPnQudF90aHJlYWRzWzBdLT50aC50aF9maXhlZF9pY3ZzKTsKKyAgICAgICAgX19rbXBfaW5pdF9pbXBsaWNpdF90YXNrKCB0ZWFtLT50LnRfaWRlbnQsIHRlYW0tPnQudF90aHJlYWRzW3RpZF0sIHRlYW0sIHRpZCwgRkFMU0UgKTsKKyAgICAgICAgc3RvcmVfaWN2cygmdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS50ZF9pY3ZzLCAmdGVhbS0+dC50X3RocmVhZHNbMF0tPnRoLnRoX2ZpeGVkX2ljdnMpOworICAgICAgICBzeW5jX2ljdnMoKTsKKyAgICB9CisjIGVuZGlmIC8vIEtNUF9CQVJSSUVSX0lDVl9QVUxMCisKKyAgICBpZiAoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICkgeworICAgICAgICBfX2ttcF90YXNrX3RlYW1fc3luYyggdGhpc190aHIsIHRlYW0gKTsKKyAgICB9CisKKyNlbmRpZiAvKiBPTVBfMzBfRU5BQkxFRCAqLworCisjaWYgT01QXzQwX0VOQUJMRUQgJiYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIGttcF9wcm9jX2JpbmRfdCBwcm9jX2JpbmQgPSB0ZWFtLT50LnRfcHJvY19iaW5kOworICAgIGlmICggcHJvY19iaW5kID09IHByb2NfYmluZF9pbnRlbCApIHsKKyNlbmRpZgorI2lmIEtNUF9NSUMKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQ2FsbCBkeW5hbWljIGFmZmluaXR5IHNldHRpbmdzCisgICAgICAgIC8vCisgICAgICAgIGlmKCBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X2JhbGFuY2VkICYmIHRlYW0tPnQudF9zaXplX2NoYW5nZWQgKSB7CisgICAgICAgICAgICBfX2ttcF9iYWxhbmNlZF9hZmZpbml0eSggdGlkLCB0ZWFtLT50LnRfbnByb2MgKTsKKyAgICAgICAgfQorI2VuZGlmCisjaWYgT01QXzQwX0VOQUJMRUQgJiYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIH0KKyAgICBlbHNlIGlmICggKCBwcm9jX2JpbmQgIT0gcHJvY19iaW5kX2ZhbHNlICkKKyAgICAgICAgICAgICAgJiYgKCBwcm9jX2JpbmQgIT0gcHJvY19iaW5kX2Rpc2FibGVkICkpIHsKKyAgICAgICAgaWYgKCB0aGlzX3Roci0+dGgudGhfbmV3X3BsYWNlID09IHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3BsYWNlICkgeworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMCwgKCAiX19rbXBfZm9ya19iYXJyaWVyOiBUIyVkIGFscmVhZHkgaW4gY29ycmVjdCBwbGFjZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhpc190aHIgKSwgdGhpc190aHItPnRoLnRoX2N1cnJlbnRfcGxhY2UgKSApOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfc2V0X3BsYWNlKCBndGlkICk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworI2lmIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoIF9faXR0X3N5bmNfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHICkgeworICAgICAgICBpZiAoICFLTVBfTUFTVEVSX1RJRCggdGlkICkgKSB7CisgICAgICAgICAgICBpdHRfc3luY19vYmogID0gX19rbXBfaXR0X2JhcnJpZXJfb2JqZWN0KCBndGlkLCBic19mb3Jram9pbl9iYXJyaWVyICk7IC8vIGdldCBjb3JyZWN0IGJhcnJpZXIgb2JqZWN0CisgICAgICAgICAgICBfX2ttcF9pdHRfYmFycmllcl9maW5pc2hlZCggZ3RpZCwgaXR0X3N5bmNfb2JqICk7ICAgLy8gd29ya2VycyBjYWxsIGFjcXVpcmVkCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChwcmVwYXJlIGNhbGxlZCBpbnNpZGUgYmFycmllcl9yZWxlYXNlKQorICAgIH0KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZICovCisgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcF9mb3JrX2JhcnJpZXI6IFQjJWQoJWQ6JWQpIGlzIGxlYXZpbmdcbiIsCisgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCApKTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkICoKK19fa21wX2xhdW5jaF90aHJlYWQoIGttcF9pbmZvX3QgKnRoaXNfdGhyICkKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgZ3RpZCA9IHRoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX2d0aWQ7CisvKiAgICB2b2lkICAgICAgICAgICAgICAgICAqc3RhY2tfZGF0YTsqLworICAgIGttcF90ZWFtX3QgKigqdm9sYXRpbGUgcHRlYW0pOworCisgICAgS01QX01CKCk7CisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2xhdW5jaF90aHJlYWQ6IFQjJWQgc3RhcnRcbiIsIGd0aWQgKSApOworCisgICAgaWYoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgdGhpc190aHIgLT4gdGgudGhfY29ucyA9IF9fa21wX2FsbG9jYXRlX2NvbnNfc3RhY2soIGd0aWQgKTsgIC8vIEFUVDogTWVtb3J5IGxlYWs/CisgICAgfQorCisgICAgLyogVGhpcyBpcyB0aGUgcGxhY2Ugd2hlcmUgdGhyZWFkcyB3YWl0IGZvciB3b3JrICovCisgICAgd2hpbGUoICEgVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSApIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHIgPT0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdICk7CisgICAgICAgIEtNUF9NQigpOworCisgICAgICAgIC8qIHdhaXQgZm9yIHdvcmsgdG8gZG8gKi8KKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2xhdW5jaF90aHJlYWQ6IFQjJWQgd2FpdGluZyBmb3Igd29ya1xuIiwgZ3RpZCApKTsKKworICAgICAgICAvKiBObyB0aWQgeWV0IHNpbmNlIG5vdCBwYXJ0IG9mIGEgdGVhbSAqLworICAgICAgICBfX2ttcF9mb3JrX2JhcnJpZXIoIGd0aWQsIEtNUF9HVElEX0RORSApOworCisgICAgICAgIHB0ZWFtID0gKGttcF90ZWFtX3QgKigqKSkoJiB0aGlzX3Roci0+dGgudGhfdGVhbSk7CisKKyAgICAgICAgLyogaGF2ZSB3ZSBiZWVuIGFsbG9jYXRlZD8gKi8KKyAgICAgICAgaWYgKCBUQ1JfU1lOQ19QVFIoKnB0ZWFtKSAmJiAhVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSApIHsKKyAgICAgICAgICAgIC8qIHdlIHdlcmUganVzdCB3b2tlbiB1cCwgc28gcnVuIG91ciBuZXcgdGFzayAqLworICAgICAgICAgICAgaWYgKCBUQ1JfU1lOQ19QVFIoKCpwdGVhbSktPnQudF9wa2ZuKSAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIGludCByYzsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfbGF1bmNoX3RocmVhZDogVCMlZCglZDolZCkgaW52b2tlIG1pY3JvdGFzayA9ICVwXG4iLAorICAgICAgICAgICAgICAgICAgICBndGlkLCAoKnB0ZWFtKS0+dC50X2lkLCBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpLCAoKnB0ZWFtKS0+dC50X3BrZm4gKSk7CisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9pbmhlcml0X2ZwX2NvbnRyb2wgJiYgKCpwdGVhbSktPnQudF9mcF9jb250cm9sX3NhdmVkICkgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkKCk7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQoICYoKnB0ZWFtKS0+dC50X3g4N19mcHVfY29udHJvbF93b3JkICk7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2xvYWRfbXhjc3IoICYoKnB0ZWFtKS0+dC50X214Y3NyICk7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworICAgICAgICAgICAgICAgIHJjID0gKCpwdGVhbSkgLT4gdC50X2ludm9rZSggZ3RpZCApOworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoIHJjICk7CisKKyAgICAgICAgICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfbGF1bmNoX3RocmVhZDogVCMlZCglZDolZCkgZG9uZSBtaWNyb3Rhc2sgPSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsICgqcHRlYW0pLT50LnRfaWQsIF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCksICgqcHRlYW0pLT50LnRfcGtmbiApKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogam9pbiBiYXJyaWVyIGFmdGVyIHBhcmFsbGVsIHJlZ2lvbiAqLworICAgICAgICAgICAgX19rbXBfam9pbl9iYXJyaWVyKCBndGlkICk7CisgICAgICAgIH0KKyAgICB9CisgICAgVENSX1NZTkNfUFRSKF9fa21wX2dsb2JhbC5nLmdfZG9uZSk7CisKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgIGlmICggVENSX1BUUiggdGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSApICE9IE5VTEwgKSB7CisgICAgICAgIF9fa21wX3VucmVmX3Rhc2tfdGVhbSggdGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSwgdGhpc190aHIgKTsKKyAgICB9CisjZW5kaWYgLyogT01QXzMwX0VOQUJMRUQgKi8KKworICAgIC8qIHJ1biB0aGUgZGVzdHJ1Y3RvcnMgZm9yIHRoZSB0aHJlYWRwcml2YXRlIGRhdGEgZm9yIHRoaXMgdGhyZWFkICovCisgICAgX19rbXBfY29tbW9uX2Rlc3Ryb3lfZ3RpZCggZ3RpZCApOworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2xhdW5jaF90aHJlYWQ6IFQjJWQgZG9uZVxuIiwgZ3RpZCApICk7CisgICAgS01QX01CKCk7CisgICAgcmV0dXJuIHRoaXNfdGhyOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKwordm9pZAorX19rbXBfaW50ZXJuYWxfZW5kX2Rlc3QoIHZvaWQgKnNwZWNpZmljX2d0aWQgKQoreworICAgICNpZiBLTVBfQ09NUElMRVJfSUNDCisgICAgICAgICNwcmFnbWEgd2FybmluZyggcHVzaCApCisgICAgICAgICNwcmFnbWEgd2FybmluZyggZGlzYWJsZTogIDgxMCApIC8vIGNvbnZlcnNpb24gZnJvbSAidm9pZCAqIiB0byAiaW50IiBtYXkgbG9zZSBzaWduaWZpY2FudCBiaXRzCisgICAgI2VuZGlmCisgICAgLy8gTWFrZSBzdXJlIG5vIHNpZ25pZmljYW50IGJpdHMgYXJlIGxvc3QKKyAgICBpbnQgZ3RpZCA9IChrbXBfaW50cHRyX3Qpc3BlY2lmaWNfZ3RpZCAtIDE7CisgICAgI2lmIEtNUF9DT01QSUxFUl9JQ0MKKyAgICAgICAgI3ByYWdtYSB3YXJuaW5nKCBwb3AgKQorICAgICNlbmRpZgorCisgICAgS0FfVFJBQ0UoIDMwLCAoIl9fa21wX2ludGVybmFsX2VuZF9kZXN0OiBUIyVkXG4iLCBndGlkKSk7CisgICAgLyogTk9URTogdGhlIGd0aWQgaXMgc3RvcmVkIGFzIGdpdGQrMSBpbiB0aGUgdGhyZWFkLWxvY2FsLXN0b3JhZ2UKKyAgICAgKiB0aGlzIGlzIGJlY2F1c2UgMCBpcyByZXNlcnZlZCBmb3IgdGhlIG5vdGhpbmctc3RvcmVkIGNhc2UgKi8KKworICAgIC8qIGpvc2g6IE9uZSByZWFzb24gZm9yIHNldHRpbmcgdGhlIGd0aWQgc3BlY2lmaWMgZGF0YSBldmVuIHdoZW4gaXQgaXMgYmVpbmcKKyAgICAgICBkZXN0cm95ZWQgYnkgcHRocmVhZCBpcyB0byBhbGxvdyBndGlkIGxvb2t1cCB0aHJvdWdoIHRocmVhZCBzcGVjaWZpYyBkYXRhCisgICAgICAgKF9fa21wX2d0aWRfZ2V0X3NwZWNpZmljKS4gIFNvbWUgb2YgdGhlIGNvZGUsIGVzcGVjaWFsbHkgc3RhdCBjb2RlLAorICAgICAgIHRoYXQgZ2V0cyBleGVjdXRlZCBpbiB0aGUgY2FsbCB0byBfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkLCBhY3R1YWxseQorICAgICAgIGdldHMgdGhlIGd0aWQgdGhyb3VnaCB0aGUgdGhyZWFkIHNwZWNpZmljIGRhdGEuICBTZXR0aW5nIGl0IGhlcmUgc2VlbXMKKyAgICAgICByYXRoZXIgaW5lbGVnYW50IGFuZCBwZXJoYXBzIHdyb25nLCBidXQgYWxsb3dzIF9fa21wX2ludGVybmFsX2VuZF90aHJlYWQKKyAgICAgICB0byBydW4gc21vb3RobHkuCisgICAgICAgdG9kbzogZ2V0IHJpZCBvZiB0aGlzIGFmdGVyIHdlIHJlbW92ZSB0aGUgZGVwZW5kZW5jZSBvbgorICAgICAgIF9fa21wX2d0aWRfZ2V0X3NwZWNpZmljCisgICAgKi8KKyAgICBpZihndGlkID49IDAgJiYgS01QX1VCRVJfR1RJRChndGlkKSkKKyAgICAgICAgX19rbXBfZ3RpZF9zZXRfc3BlY2lmaWMoIGd0aWQgKTsKKyAgICAjaWZkZWYgS01QX1REQVRBX0dUSUQKKyAgICAgICAgX19rbXBfZ3RpZCA9IGd0aWQ7CisgICAgI2VuZGlmCisgICAgX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZCggZ3RpZCApOworfQorCisjaWYgS01QX09TX1VOSVggJiYgR1VJREVETExfRVhQT1JUUworCisvLyAyMDA5LTA5LTA4IChsZXYpOiBJdCBsb29rcyB0aGUgZGVzdHJ1Y3RvciBkb2VzIG5vdCB3b3JrLiBJbiBzaW1wbGUgdGVzdCBjYXNlcyBkZXN0cnVjdG9ycyB3b3JrCisvLyBwZXJmZWN0bHksIGJ1dCBpbiByZWFsIGxpYmlvbXA1LnNvIEkgaGF2ZSBubyBldmlkZW5jZSBpdCBpcyBldmVyIGNhbGxlZC4gSG93ZXZlciwgLWZpbmkgbGlua2VyCisvLyBvcHRpb24gaW4gbWFrZWZpbGUubWsgd29ya3MgZmluZS4KKworX19hdHRyaWJ1dGVfXygoIGRlc3RydWN0b3IgKSkKK3ZvaWQKK19fa21wX2ludGVybmFsX2VuZF9kdG9yKCB2b2lkICkKK3sKKyAgICBfX2ttcF9pbnRlcm5hbF9lbmRfYXRleGl0KCk7Cit9CisKK3ZvaWQKK19fa21wX2ludGVybmFsX2VuZF9maW5pKCB2b2lkICkKK3sKKyAgICBfX2ttcF9pbnRlcm5hbF9lbmRfYXRleGl0KCk7Cit9CisKKyNlbmRpZgorCisvKiBbV2luZG93c10gam9zaDogd2hlbiB0aGUgYXRleGl0IGhhbmRsZXIgaXMgY2FsbGVkLCB0aGVyZSBtYXkgc3RpbGwgYmUgbW9yZSB0aGFuIG9uZSB0aHJlYWQgYWxpdmUgKi8KK3ZvaWQKK19fa21wX2ludGVybmFsX2VuZF9hdGV4aXQoIHZvaWQgKQoreworICAgIEtBX1RSQUNFKCAzMCwgKCAiX19rbXBfaW50ZXJuYWxfZW5kX2F0ZXhpdFxuIiApICk7CisgICAgLyogW1dpbmRvd3NdCisgICAgICAgam9zaDogaWRlYWxseSwgd2Ugd2FudCB0byBjb21wbGV0ZWx5IHNodXRkb3duIHRoZSBsaWJyYXJ5IGluIHRoaXMgYXRleGl0IGhhbmRsZXIsIGJ1dAorICAgICAgIHN0YXQgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhyZWFkIHNwZWNpZmljIGRhdGEgZm9yIGd0aWQgZmFpbHMgYmVjYXVzZSB0aGF0IGRhdGEgYmVjb21lcworICAgICAgIHVuYXZhaWxhYmxlIGF0IHNvbWUgcG9pbnQgZHVyaW5nIHRoZSBzaHV0ZG93biwgc28gd2UgY2FsbCBfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkCisgICAgICAgaW5zdGVhZC4gIFdlIHNob3VsZCBldmVudHVhbGx5IHJlbW92ZSB0aGUgZGVwZW5kZW5jeSBvbiBfX2ttcF9nZXRfc3BlY2lmaWNfZ3RpZCBpbiB0aGUKKyAgICAgICBzdGF0IGNvZGUgYW5kIHVzZSBfX2ttcF9pbnRlcm5hbF9lbmRfbGlicmFyeSB0byBjbGVhbmx5IHNodXRkb3duIHRoZSBsaWJyYXJ5LgorCisvLyBUT0RPOiBDYW4gc29tZSBvZiB0aGlzIGNvbW1lbnQgYWJvdXQgR1ZTIGJlIHJlbW92ZWQ/CisgICAgICAgSSBzdXNwZWN0IHRoYXQgdGhlIG9mZmVuZGluZyBzdGF0IGNvZGUgaXMgZXhlY3V0ZWQgd2hlbiB0aGUgY2FsbGluZyB0aHJlYWQgdHJpZXMgdG8KKyAgICAgICBjbGVhbiB1cCBhIGRlYWQgcm9vdCB0aHJlYWQncyBkYXRhIHN0cnVjdHVyZXMsIHJlc3VsdGluZyBpbiBHVlMgY29kZSB0cnlpbmcgdG8gY2xvc2UKKyAgICAgICB0aGUgR1ZTIHN0cnVjdHVyZXMgZm9yIHRoYXQgdGhyZWFkLCBidXQgc2luY2UgdGhlIHN0YXQgY29kZSB1c2VzCisgICAgICAgX19rbXBfZ2V0X3NwZWNpZmljX2d0aWQgdG8gZ2V0IHRoZSBndGlkIHdpdGggdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgY2FsbGluZyB0aHJlYWQgaXMKKyAgICAgICBjbGVhbmluZyB1cCBpdHNlbGYgaW5zdGVhZCBvZiBhbm90aGVyIHRocmVhZCwgaXQgZ2V0cyBjb25mdXNlZC4gIFRoaXMgaGFwcGVucyBiZWNhdXNlCisgICAgICAgYWxsb3dpbmcgYSB0aHJlYWQgdG8gdW5yZWdpc3RlciBhbmQgY2xlYW51cCBhbm90aGVyIHRocmVhZCBpcyBhIHJlY2VudCBtb2RpZmljYXRpb24gZm9yCisgICAgICAgYWRkcmVzc2luZyBhbiBpc3N1ZSB3aXRoIE1heG9uIENpbmVtYTRELiAgQmFzZWQgb24gdGhlIGN1cnJlbnQgZGVzaWduICgyMDA1MDcyMiksIGEKKyAgICAgICB0aHJlYWQgbWF5IGVuZCB1cCB0cnlpbmcgdG8gdW5yZWdpc3RlciBhbm90aGVyIHRocmVhZCBvbmx5IGlmIHRocmVhZCBkZWF0aCBkb2VzIG5vdAorICAgICAgIHRyaWdnZXIgdGhlIGNhbGxpbmcgb2YgX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZC4gIEZvciBMaW51eCogT1MsIHRoZXJlIGlzIHRoZSB0aHJlYWQKKyAgICAgICBzcGVjaWZpYyBkYXRhIGRlc3RydWN0b3IgZnVuY3Rpb24gdG8gZGV0ZWN0IHRocmVhZCBkZWF0aC4gIEZvciBXaW5kb3dzIGR5bmFtaWMsIHRoZXJlCisgICAgICAgaXMgRGxsTWFpbihUSFJFQURfREVUQUNIKS4gIEZvciBXaW5kb3dzIHN0YXRpYywgdGhlcmUgaXMgbm90aGluZy4gIFRodXMsIHRoZQorICAgICAgIHdvcmthcm91bmQgaXMgYXBwbGljYWJsZSBvbmx5IGZvciBXaW5kb3dzIHN0YXRpYyBzdGF0IGxpYnJhcnkuCisgICAgKi8KKyAgICBfX2ttcF9pbnRlcm5hbF9lbmRfbGlicmFyeSggLTEgKTsKKyAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgX19rbXBfY2xvc2VfY29uc29sZSgpOworICAgICNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorX19rbXBfcmVhcF90aHJlYWQoCisgICAga21wX2luZm9fdCAqIHRocmVhZCwKKyAgICBpbnQgaXNfcm9vdAorKSB7CisKKyAgICAvLyBJdCBpcyBhc3N1bWVkIF9fa21wX2Zvcmtqb2luX2xvY2sgaXMgYWNxdWlyZWQuCisKKyAgICBpbnQgZ3RpZDsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRocmVhZCAhPSBOVUxMICk7CisKKyAgICBndGlkID0gdGhyZWFkLT50aC50aF9pbmZvLmRzLmRzX2d0aWQ7CisKKyAgICBpZiAoICEgaXNfcm9vdCApIHsKKworICAgICAgICBpZiAoIF9fa21wX2RmbHRfYmxvY2t0aW1lICE9IEtNUF9NQVhfQkxPQ0tUSU1FICkgeworICAgICAgICAgICAgLyogQXNzdW1lIHRoZSB0aHJlYWRzIGFyZSBhdCB0aGUgZm9yayBiYXJyaWVyIGhlcmUgKi8KKyAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9yZWFwX3RocmVhZDogcmVsZWFzaW5nIFQjJWQgZnJvbSBmb3JrIGJhcnJpZXIgZm9yIHJlYXBcbiIsIGd0aWQgKSApOworICAgICAgICAgICAgLyogTmVlZCByZWxlYXNlIGZlbmNlIGhlcmUgdG8gcHJldmVudCBzZWcgZmF1bHRzIGZvciB0cmVlIGZvcmtqb2luIGJhcnJpZXIgKEdFSCkgKi8KKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2UoCisgICAgICAgICAgICAgICAgdGhyZWFkLAorICAgICAgICAgICAgICAgICZ0aHJlYWQtPnRoLnRoX2JhclsgYnNfZm9ya2pvaW5fYmFycmllciBdLmJiLmJfZ28sCisgICAgICAgICAgICAgICAga21wX3JlbGVhc2VfZmVuY2UKKyAgICAgICAgICAgICk7CisgICAgICAgIH07IC8vIGlmCisKKworICAgICAgICAvLyBUZXJtaW5hdGUgT1MgdGhyZWFkLgorICAgICAgICBfX2ttcF9yZWFwX3dvcmtlciggdGhyZWFkICk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlIHRocmVhZCB3YXMga2lsbGVkIGFzeW5jaHJvbm91c2x5LiAgSWYgaXQgd2FzIGFjdGl2ZWx5CisgICAgICAgIC8vIHNwaW5uaW5nIGluIHRoZSBpbiB0aGUgdGhyZWFkIHBvb2wsIGRlY3JlbWVudCB0aGUgZ2xvYmFsIGNvdW50LgorICAgICAgICAvLworICAgICAgICAvLyBUaGVyZSBpcyBhIHNtYWxsIHRpbWluZyBob2xlIGhlcmUgLSBpZiB0aGUgd29ya2VyIHRocmVhZCB3YXMKKyAgICAgICAgLy8ganVzdCB3YWtpbmcgdXAgYWZ0ZXIgc2xlZXBpbmcgaW4gdGhlIHBvb2wsIGhhZCByZXNldCBpdCdzCisgICAgICAgIC8vIHRoX2FjdGl2ZV9pbl9wb29sIGZsYWcgYnV0IG5vdCBkZWNyZW1lbnRlZCB0aGUgZ2xvYmFsIGNvdW50ZXIKKyAgICAgICAgLy8gX19rbXBfdGhyZWFkX3Bvb2xfYWN0aXZlX250aCB5ZXQsIHRoZW4gdGhlIGdsb2JhbCBjb3VudGVyCisgICAgICAgIC8vIG1pZ2h0IG5vdCBnZXQgdXBkYXRlZC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gQ3VycmVudGx5LCB0aGlzIGNhbiBvbmx5IGhhcHBlbiBhcyB0aGUgbGlicmFyeSBpcyB1bmxvYWRlZCwKKyAgICAgICAgLy8gc28gdGhlcmUgYXJlIG5vIGhhcm1mdWwgc2lkZSBlZmZlY3RzLgorICAgICAgICAvLworICAgICAgICBpZiAoIHRocmVhZC0+dGgudGhfYWN0aXZlX2luX3Bvb2wgKSB7CisgICAgICAgICAgICB0aHJlYWQtPnRoLnRoX2FjdGl2ZV9pbl9wb29sID0gRkFMU0U7CisgICAgICAgICAgICBLTVBfVEVTVF9USEVOX0RFQzMyKAorICAgICAgICAgICAgICAoa21wX2ludDMyICopICZfX2ttcF90aHJlYWRfcG9vbF9hY3RpdmVfbnRoICk7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBUQ1JfNChfX2ttcF90aHJlYWRfcG9vbF9hY3RpdmVfbnRoKSA+PSAwICk7CisgICAgICAgIH0KKworICAgICAgICAvLyBEZWNyZW1lbnQgIyBvZiBbd29ya2VyXSB0aHJlYWRzIGluIHRoZSBwb29sLgorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90aHJlYWRfcG9vbF9udGggPiAwICk7CisgICAgICAgIC0tX19rbXBfdGhyZWFkX3Bvb2xfbnRoOworICAgIH07IC8vIGlmCisKKyAgICAvLyBGcmVlIHRoZSBmYXN0IG1lbW9yeSBmb3IgdGFza2luZworICAgICNpZiBVU0VfRkFTVF9NRU1PUlkKKyAgICAgICAgX19rbXBfZnJlZV9mYXN0X21lbW9yeSggdGhyZWFkICk7CisgICAgI2VuZGlmIC8qIFVTRV9GQVNUX01FTU9SWSAqLworCisgICAgX19rbXBfc3VzcGVuZF91bmluaXRpYWxpemVfdGhyZWFkKCB0aHJlYWQgKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3RocmVhZHNbIGd0aWQgXSA9PSB0aHJlYWQgKTsKKyAgICBUQ1dfU1lOQ19QVFIoX19rbXBfdGhyZWFkc1tndGlkXSwgTlVMTCk7CisKKyAgICAtLSBfX2ttcF9hbGxfbnRoOworICAgIC8vIF9fa21wX250aCB3YXMgZGVjcmVtZW50ZWQgd2hlbiB0aHJlYWQgaXMgYWRkZWQgdG8gdGhlIHBvb2wuCisKKyNpZmRlZiBLTVBfQURKVVNUX0JMT0NLVElNRQorICAgIC8qIEFkanVzdCBibG9ja3RpbWUgYmFjayB0byB1c2VyIHNldHRpbmcgb3IgZGVmYXVsdCBpZiBuZWNlc3NhcnkgKi8KKyAgICAvKiBNaWRkbGUgaW5pdGlhbGl6YXRpb24gbWlnaHQgbmV2ZXIgaGF2ZSBvY2N1cnJlZCAgICAgICAgICAgICAgICAqLworICAgIGlmICggIV9fa21wX2Vudl9ibG9ja3RpbWUgJiYgKCBfX2ttcF9hdmFpbF9wcm9jID4gMCApICkgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9hdmFpbF9wcm9jID4gMCApOworICAgICAgICBpZiAoIF9fa21wX250aCA8PSBfX2ttcF9hdmFpbF9wcm9jICkgeworICAgICAgICAgICAgX19rbXBfemVyb19idCA9IEZBTFNFOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIEtNUF9BREpVU1RfQkxPQ0tUSU1FICovCisKKyAgICAvKiBmcmVlIHRoZSBtZW1vcnkgYmVpbmcgdXNlZCAqLworICAgIGlmKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGlmICggdGhyZWFkLT50aC50aF9jb25zICkgeworICAgICAgICAgICAgX19rbXBfZnJlZV9jb25zX3N0YWNrKCB0aHJlYWQtPnRoLnRoX2NvbnMgKTsKKyAgICAgICAgICAgIHRocmVhZC0+dGgudGhfY29ucyA9IE5VTEw7CisgICAgICAgIH07IC8vIGlmCisgICAgfQorCisgICAgaWYgKCB0aHJlYWQtPnRoLnRoX3ByaV9jb21tb24gIT0gTlVMTCApIHsKKyAgICAgICAgX19rbXBfZnJlZSggdGhyZWFkLT50aC50aF9wcmlfY29tbW9uICk7CisgICAgICAgIHRocmVhZC0+dGgudGhfcHJpX2NvbW1vbiA9IE5VTEw7CisgICAgfTsgLy8gaWYKKworICAgICNpZiBLTVBfVVNFX0JHRVQKKyAgICAgICAgaWYgKCB0aHJlYWQtPnRoLnRoX2xvY2FsLmJnZXRfZGF0YSAhPSBOVUxMICkgeworICAgICAgICAgICAgX19rbXBfZmluYWxpemVfYmdldCggdGhyZWFkICk7CisgICAgICAgIH07IC8vIGlmCisgICAgI2VuZGlmCisKKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgaWYgKCB0aHJlYWQtPnRoLnRoX2FmZmluX21hc2sgIT0gTlVMTCApIHsKKyAgICAgICAgS01QX0NQVV9GUkVFKCB0aHJlYWQtPnRoLnRoX2FmZmluX21hc2sgKTsKKyAgICAgICAgdGhyZWFkLT50aC50aF9hZmZpbl9tYXNrID0gTlVMTDsKKyAgICB9OyAvLyBpZgorI2VuZGlmIC8qIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgKi8KKworICAgIF9fa21wX3JlYXBfdGVhbSggdGhyZWFkLT50aC50aF9zZXJpYWxfdGVhbSApOworICAgIHRocmVhZC0+dGgudGhfc2VyaWFsX3RlYW0gPSBOVUxMOworICAgIF9fa21wX2ZyZWUoIHRocmVhZCApOworCisgICAgS01QX01CKCk7CisKK30gLy8gX19rbXBfcmVhcF90aHJlYWQKKworc3RhdGljIHZvaWQKK19fa21wX2ludGVybmFsX2VuZCh2b2lkKQoreworICAgIGludCBpOworCisgICAgLyogRmlyc3QsIHVucmVnaXN0ZXIgdGhlIGxpYnJhcnkgKi8KKyAgICBfX2ttcF91bnJlZ2lzdGVyX2xpYnJhcnkoKTsKKworICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICAvKiBJbiBXaW4gc3RhdGljIGxpYnJhcnksIHdlIGNhbid0IHRlbGwgd2hlbiBhIHJvb3QgYWN0dWFsbHkgZGllcywgc28gd2UKKyAgICAgICAgICAgcmVjbGFpbSB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGZvciBhbnkgcm9vdCB0aHJlYWRzIHRoYXQgaGF2ZSBkaWVkIGJ1dCBub3QKKyAgICAgICAgICAgdW5yZWdpc3RlcmVkIHRoZW1zZWx2ZXMsIGluIG9yZGVyIHRvIHNodXQgZG93biBjbGVhbmx5LgorICAgICAgICAgICBJbiBXaW4gZHluYW1pYyBsaWJyYXJ5IHdlIGFsc28gY2FuJ3QgdGVsbCB3aGVuIGEgdGhyZWFkIGRpZXMuCisgICAgICAgICovCisgICAgICAgIF9fa21wX3JlY2xhaW1fZGVhZF9yb290cygpOyAvLyBBQzogbW92ZWQgaGVyZSB0byBhbHdheXMgY2xlYW4gcmVzb3VyY2VzIG9mIGRlYWQgcm9vdHMKKyAgICAjZW5kaWYKKworICAgIGZvciggaT0wIDsgaTxfX2ttcF90aHJlYWRzX2NhcGFjaXR5IDsgaSsrICkKKyAgICAgICAgaWYoIF9fa21wX3Jvb3RbaV0gKQorICAgICAgICAgICAgaWYoIF9fa21wX3Jvb3RbaV0gLT4gci5yX2FjdGl2ZSApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisgICAgVENXX1NZTkNfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUsIFRSVUUpOworCisgICAgaWYgKCBpIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eSApIHsKKyAgICAgICAgLy8gMjAwOS0wOS0wOCAobGV2KTogT3RoZXIgYWxpdmUgcm9vdHMgZm91bmQuIFdoeSBkbyB3ZSBraWxsIHRoZSBtb25pdG9yPz8KKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gTmVlZCB0byBjaGVjayB0aGF0IG1vbml0b3Igd2FzIGluaXRpYWxpemVkIGJlZm9yZSByZWFwaW5nIGl0LgorICAgICAgICAvLyBJZiB3ZSBhcmUgY2FsbGVkIGZvcm0gX19rbXBfYXRmb3JrX2NoaWxkICh3aGljaCBzZXRzCisgICAgICAgIC8vIF9fa21wX2luaXRfcGFyYWxsZWwgPSAwKSwgdGhlbiBfX2ttcF9tb25pdG9yIHdpbGwgYXBwZWFyIHRvCisgICAgICAgIC8vIGNvbnRhaW4gdmFsaWQgZGF0YSwgYnV0IGl0IGlzIG9ubHkgdmFsaWQgaW4gdGhlIHBhcmVudCBwcm9jZXNzLAorICAgICAgICAvLyBub3QgdGhlIGNoaWxkLgorICAgICAgICAvLworICAgICAgICAvLyBPbmUgb2YgdGhlIHBvc3NpYmxlIGZpeGVzIGZvciBDUTEzODQzNCAvIENRMTQwMTI2CisgICAgICAgIC8vICh1c2VkIGluIDIwMDkxMTAzX2RyZWFtd29ya3MgcGF0Y2gpCisgICAgICAgIC8vCisgICAgICAgIC8vIE5ldyBiZWhhdmlvciAoMjAxMDA4KTogaW5zdGVhZCBvZiBrZXlpbmcgb2ZmIG9mIHRoZSBmbGFnCisgICAgICAgIC8vIF9fa21wX2luaXRfcGFyYWxsZWwsIHRoZSBtb25pdG9yIHRocmVhZCBjcmVhdGlvbiBpcyBrZXllZCBvZmYKKyAgICAgICAgLy8gb2YgdGhlIG5ldyBmbGFnIF9fa21wX2luaXRfbW9uaXRvci4KKyAgICAgICAgLy8KKyAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiBfX2ttcF9tb25pdG9yX2xvY2sgKTsKKyAgICAgICAgaWYgKCBUQ1JfNCggX19rbXBfaW5pdF9tb25pdG9yICkgKSB7CisgICAgICAgICAgICBfX2ttcF9yZWFwX21vbml0b3IoICYgX19rbXBfbW9uaXRvciApOworICAgICAgICAgICAgVENXXzQoIF9fa21wX2luaXRfbW9uaXRvciwgMCApOworICAgICAgICB9CisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfbW9uaXRvcl9sb2NrICk7CisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmQ6IG1vbml0b3IgcmVhcGVkXG4iICkgKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBUT0RPIG1vdmUgdGhpcyB0byBjbGVhbnVwIGNvZGUgKi8KKyAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgLyogbWFrZSBzdXJlIHRoYXQgZXZlcnl0aGluZyBoYXMgcHJvcGVybHkgZW5kZWQgKi8KKyAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eTsgaSsrICkgeworICAgICAgICAgICAgICAgIGlmKCBfX2ttcF9yb290W2ldICkgeworICAgICAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKCAhIEtNUF9VQkVSX0dUSUQoIGkgKSApOworICAgICAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKCAhIF9fa21wX3Jvb3RbaV0gLT4gci5yX2FjdGl2ZSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgI2VuZGlmCisKKyAgICAgICAgS01QX01CKCk7CisKKyAgICAgICAgLy8gUmVhcCB0aGUgd29ya2VyIHRocmVhZHMuCisgICAgICAgIC8vIFRoaXMgaXMgdmFsaWQgZm9yIG5vdywgYnV0IGJlIGNhcmVmdWwgaWYgdGhyZWFkcyBhcmUgcmVhcGVkIHNvb25lci4KKyAgICAgICAgd2hpbGUgKCBfX2ttcF90aHJlYWRfcG9vbCAhPSBOVUxMICkgeyAgICAvLyBMb29wIHRocnUgYWxsIHRoZSB0aHJlYWQgaW4gdGhlIHBvb2wuCisgICAgICAgICAgICAvLyBHZXQgdGhlIG5leHQgdGhyZWFkIGZyb20gdGhlIHBvb2wuCisgICAgICAgICAgICBrbXBfaW5mb190ICogdGhyZWFkID0gKGttcF9pbmZvX3QgKikgX19rbXBfdGhyZWFkX3Bvb2w7CisgICAgICAgICAgICBfX2ttcF90aHJlYWRfcG9vbCA9IHRocmVhZC0+dGgudGhfbmV4dF9wb29sOworICAgICAgICAgICAgLy8gUmVhcCBpdC4KKyAgICAgICAgICAgIHRocmVhZC0+dGgudGhfbmV4dF9wb29sID0gTlVMTDsKKyAgICAgICAgICAgIHRocmVhZC0+dGgudGhfaW5fcG9vbCA9IEZBTFNFOworICAgICAgICAgICAgX19rbXBfcmVhcF90aHJlYWQoIHRocmVhZCwgMCApOworICAgICAgICB9OyAvLyB3aGlsZQorICAgICAgICBfX2ttcF90aHJlYWRfcG9vbF9pbnNlcnRfcHQgPSBOVUxMOworCisgICAgICAgIC8vIFJlYXAgdGVhbXMuCisgICAgICAgIHdoaWxlICggX19rbXBfdGVhbV9wb29sICE9IE5VTEwgKSB7ICAgICAvLyBMb29wIHRocnUgYWxsIHRoZSB0ZWFtcyBpbiB0aGUgcG9vbC4KKyAgICAgICAgICAgIC8vIEdldCB0aGUgbmV4dCB0ZWFtIGZyb20gdGhlIHBvb2wuCisgICAgICAgICAgICBrbXBfdGVhbV90ICogdGVhbSA9IChrbXBfdGVhbV90ICopIF9fa21wX3RlYW1fcG9vbDsKKyAgICAgICAgICAgIF9fa21wX3RlYW1fcG9vbCA9IHRlYW0tPnQudF9uZXh0X3Bvb2w7CisgICAgICAgICAgICAvLyBSZWFwIGl0LgorICAgICAgICAgICAgdGVhbS0+dC50X25leHRfcG9vbCA9IE5VTEw7CisgICAgICAgICAgICBfX2ttcF9yZWFwX3RlYW0oIHRlYW0gKTsKKyAgICAgICAgfTsgLy8gd2hpbGUKKworICAgICAgICAjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgICAgICAgIF9fa21wX3JlYXBfdGFza190ZWFtcyggKTsKKyAgICAgICAgI2VuZGlmIC8qIE9NUF8zMF9FTkFCTEVEICovCisKKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OyArKyBpICkgeworICAgICAgICAgICAgLy8gVEJEOiBBZGQgc29tZSBjaGVja2luZy4uLgorICAgICAgICAgICAgLy8gU29tZXRoaW5nIGxpa2UgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGhyZWFkWyBpIF0gPT0gTlVMTCApOworICAgICAgICB9CisKKyAgICAgICAgLyogTWFrZSBzdXJlIGFsbCB0aHJlYWRwcml2YXRlIGRlc3RydWN0b3JzIGdldCBydW4gYnkgam9pbmluZyB3aXRoIGFsbCB3b3JrZXIKKyAgICAgICAgICAgdGhyZWFkcyBiZWZvcmUgcmVzZXR0aW5nIHRoaXMgZmxhZyAqLworICAgICAgICBUQ1dfU1lOQ180KF9fa21wX2luaXRfY29tbW9uLCBGQUxTRSk7CisKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZDogYWxsIHdvcmtlcnMgcmVhcGVkXG4iICkgKTsKKyAgICAgICAgS01QX01CKCk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gU2VlIG5vdGUgYWJvdmU6IE9uZSBvZiB0aGUgcG9zc2libGUgZml4ZXMgZm9yIENRMTM4NDM0IC8gQ1ExNDAxMjYKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRklYTUU6IHB1c2ggYm90aCBjb2RlIGZyYWdtZW50cyBkb3duIGFuZCBDU0UgdGhlbT8KKyAgICAgICAgLy8gcHVzaCB0aGVtIGludG8gX19rbXBfY2xlYW51cCgpID8KKyAgICAgICAgLy8KKyAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiBfX2ttcF9tb25pdG9yX2xvY2sgKTsKKyAgICAgICAgaWYgKCBUQ1JfNCggX19rbXBfaW5pdF9tb25pdG9yICkgKSB7CisgICAgICAgICAgICBfX2ttcF9yZWFwX21vbml0b3IoICYgX19rbXBfbW9uaXRvciApOworICAgICAgICAgICAgVENXXzQoIF9fa21wX2luaXRfbW9uaXRvciwgMCApOworICAgICAgICB9CisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfbW9uaXRvcl9sb2NrICk7CisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmQ6IG1vbml0b3IgcmVhcGVkXG4iICkgKTsKKworICAgIH0gLyogZWxzZSAhX19rbXBfZ2xvYmFsLnRfYWN0aXZlICovCisgICAgVENXXzQoX19rbXBfaW5pdF9ndGlkLCBGQUxTRSk7CisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKworICAgIF9fa21wX2NsZWFudXAoKTsKK30KKwordm9pZAorX19rbXBfaW50ZXJuYWxfZW5kX2xpYnJhcnkoIGludCBndGlkX3JlcSApCit7CisgICAgaW50IGk7CisKKyAgICAvKiBpZiB3ZSBoYXZlIGFscmVhZHkgY2xlYW5lZCB1cCwgZG9uJ3QgdHJ5IGFnYWluLCBpdCB3b3VsZG4ndCBiZSBwcmV0dHkgKi8KKyAgICAvKiB0aGlzIHNob3VsZG4ndCBiZSBhIHJhY2UgY29uZGl0aW9uIGJlY2F1c2UgX19rbXBfaW50ZXJuYWxfZW5kKCkgaXMgdGhlCisgICAgICogb25seSBwbGFjZSB0byBjbGVhciBfX2ttcF9zZXJpYWxfaW5pdCAqLworICAgIC8qIHdlJ2xsIGNoZWNrIHRoaXMgbGF0ZXIgdG9vLCBhZnRlciB3ZSBnZXQgdGhlIGxvY2sgKi8KKyAgICAvLyAyMDA5LTA5LTA2OiBXZSBkbyBub3Qgc2V0IGdfYWJvcnQgd2l0aG91dCBzZXR0aW5nIGdfZG9uZS4gVGhpcyBjaGVjayBsb29rcyByZWR1bmRhYW50LAorICAgIC8vIGJlY2F1c2UgdGhlIG5leHQgY2hlY2sgd2lsbCB3b3JrIGluIGFueSBjYXNlLgorICAgIGlmKCBfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ICkgeworICAgICAgICBLQV9UUkFDRSggMTEsICgiX19rbXBfaW50ZXJuYWxfZW5kX2xpYnJhcnk6IGFib3J0LCBleGl0aW5nXG4iICkpOworICAgICAgICAvKiBUT0RPIGFib3J0PyAqLworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKCBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpIHx8ICFfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5OiBhbHJlYWR5IGZpbmlzaGVkXG4iICkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIC8qIGZpbmQgb3V0IHdobyB3ZSBhcmUgYW5kIHdoYXQgd2Ugc2hvdWxkIGRvICovCisgICAgeworICAgICAgICBpbnQgZ3RpZCA9IChndGlkX3JlcT49MCkgPyBndGlkX3JlcSA6IF9fa21wX2d0aWRfZ2V0X3NwZWNpZmljKCk7CisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfbGlicmFyeTogZW50ZXIgVCMlZCAgKCVkKVxuIiwgZ3RpZCwgZ3RpZF9yZXEgKSk7CisgICAgICAgIGlmKCBndGlkID09IEtNUF9HVElEX1NIVVRET1dOICkgeworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5OiAhX19rbXBfaW5pdF9ydW50aW1lLCBzeXN0ZW0gYWxyZWFkeSBzaHV0ZG93blxuIiApKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmKCBndGlkID09IEtNUF9HVElEX01PTklUT1IgKSB7CisgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX2xpYnJhcnk6IG1vbml0b3IgdGhyZWFkLCBndGlkIG5vdCByZWdpc3RlcmVkLCBvciBzeXN0ZW0gc2h1dGRvd25cbiIgKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiggZ3RpZCA9PSBLTVBfR1RJRF9ETkUgKSB7CisgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX2xpYnJhcnk6IGd0aWQgbm90IHJlZ2lzdGVyZWQgb3Igc3lzdGVtIHNodXRkb3duXG4iICkpOworICAgICAgICAgICAgLyogd2UgZG9uJ3Qga25vdyB3aG8gd2UgYXJlLCBidXQgd2UgbWF5IHN0aWxsIHNodXRkb3duIHRoZSBsaWJyYXJ5ICovCisgICAgICAgIH0gZWxzZSBpZiggS01QX1VCRVJfR1RJRCggZ3RpZCApKSB7CisgICAgICAgICAgICAvKiB1bnJlZ2lzdGVyIG91cnNlbHZlcyBhcyBhbiB1YmVyIHRocmVhZC4gIGd0aWQgaXMgbm8gbG9uZ2VyIHZhbGlkICovCisgICAgICAgICAgICBpZiggX19rbXBfcm9vdFtndGlkXSAtPiByLnJfYWN0aXZlICkgeworICAgICAgICAgICAgICAgIF9fa21wX2dsb2JhbC5nLmdfYWJvcnQgPSAtMTsKKyAgICAgICAgICAgICAgICBUQ1dfU1lOQ180KF9fa21wX2dsb2JhbC5nLmdfZG9uZSwgVFJVRSk7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5OiByb290IHN0aWxsIGFjdGl2ZSwgYWJvcnQgVCMlZFxuIiwgZ3RpZCApKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfbGlicmFyeTogdW5yZWdpc3RlcmluZyBzaWJsaW5nIFQjJWRcbiIsIGd0aWQgKSk7CisgICAgICAgICAgICAgICAgX19rbXBfdW5yZWdpc3Rlcl9yb290X2N1cnJlbnRfdGhyZWFkKCBndGlkICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiB3b3JrZXIgdGhyZWFkcyBtYXkgY2FsbCB0aGlzIGZ1bmN0aW9uIHRocm91Z2ggdGhlIGF0ZXhpdCBoYW5kbGVyLCBpZiB0aGV5IGNhbGwgZXhpdCgpICovCisgICAgICAgICAgICAvKiBGb3Igbm93LCBza2lwIHRoZSB1c3VhbCBzdWJzZXF1ZW50IHByb2Nlc3NpbmcgYW5kIGp1c3QgZHVtcCB0aGUgZGVidWcgYnVmZmVyLgorICAgICAgICAgICAgICAgVE9ETzogZG8gYSB0aG9yb3VnaCBzaHV0ZG93biBpbnN0ZWFkCisgICAgICAgICAgICAqLworICAgICAgICAgICAgI2lmZGVmIERVTVBfREVCVUdfT05fRVhJVAorICAgICAgICAgICAgICAgIGlmICggX19rbXBfZGVidWdfYnVmICkKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfZHVtcF9kZWJ1Z19idWZmZXIoICk7CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBzeW5jaHJvbml6ZSB0aGUgdGVybWluYXRpb24gcHJvY2VzcyAqLworICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisKKyAgICAvKiBoYXZlIHdlIGFscmVhZHkgZmluaXNoZWQgKi8KKyAgICBpZiggX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCApIHsKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5OiBhYm9ydCwgZXhpdGluZ1xuIiApKTsKKyAgICAgICAgLyogVE9ETyBhYm9ydD8gKi8KKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiggVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSB8fCAhX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBXZSBuZWVkIHRoaXMgbG9jayB0byBlbmZvcmNlIG11dGV4IGJldHdlZW4gdGhpcyByZWFkaW5nIG9mCisgICAgICAgX19rbXBfdGhyZWFkc19jYXBhY2l0eSBhbmQgdGhlIHdyaXRpbmcgYnkgX19rbXBfcmVnaXN0ZXJfcm9vdC4KKyAgICAgICBBbHRlcm5hdGl2ZWx5LCB3ZSBjYW4gdXNlIGEgY291bnRlciBvZiByb290cyB0aGF0IGlzCisgICAgICAgYXRvbWljYWxseSB1cGRhdGVkIGJ5IF9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkX3JlZywKKyAgICAgICBfX2ttcF9kb19zZXJpYWxfaW5pdGlhbGl6ZSBhbmQgX19rbXBfaW50ZXJuYWxfZW5kXyouCisgICAgKi8KKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfZm9ya2pvaW5fbG9jayApOworCisgICAgLyogbm93IHdlIGNhbiBzYWZlbHkgY29uZHVjdCB0aGUgYWN0dWFsIHRlcm1pbmF0aW9uICovCisgICAgX19rbXBfaW50ZXJuYWxfZW5kKCk7CisKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfZm9ya2pvaW5fbG9jayApOworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX2xpYnJhcnk6IGV4aXRcbiIgKSApOworCisgICAgI2lmZGVmIERVTVBfREVCVUdfT05fRVhJVAorICAgICAgICBpZiAoIF9fa21wX2RlYnVnX2J1ZiApCisgICAgICAgICAgICBfX2ttcF9kdW1wX2RlYnVnX2J1ZmZlcigpOworICAgICNlbmRpZgorCisgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIF9fa21wX2Nsb3NlX2NvbnNvbGUoKTsKKyAgICAjZW5kaWYKKworICAgIF9fa21wX2ZpbmlfYWxsb2NhdG9yKCk7CisKK30gLy8gX19rbXBfaW50ZXJuYWxfZW5kX2xpYnJhcnkKKwordm9pZAorX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZCggaW50IGd0aWRfcmVxICkKK3sKKyAgICBpbnQgaTsKKworICAgIC8qIGlmIHdlIGhhdmUgYWxyZWFkeSBjbGVhbmVkIHVwLCBkb24ndCB0cnkgYWdhaW4sIGl0IHdvdWxkbid0IGJlIHByZXR0eSAqLworICAgIC8qIHRoaXMgc2hvdWxkbid0IGJlIGEgcmFjZSBjb25kaXRpb24gYmVjYXVzZSBfX2ttcF9pbnRlcm5hbF9lbmQoKSBpcyB0aGUKKyAgICAgKiBvbmx5IHBsYWNlIHRvIGNsZWFyIF9fa21wX3NlcmlhbF9pbml0ICovCisgICAgLyogd2UnbGwgY2hlY2sgdGhpcyBsYXRlciB0b28sIGFmdGVyIHdlIGdldCB0aGUgbG9jayAqLworICAgIC8vIDIwMDktMDktMDY6IFdlIGRvIG5vdCBzZXQgZ19hYm9ydCB3aXRob3V0IHNldHRpbmcgZ19kb25lLiBUaGlzIGNoZWNrIGxvb2tzIHJlZHVuZGFudCwKKyAgICAvLyBiZWNhdXNlIHRoZSBuZXh0IGNoZWNrIHdpbGwgd29yayBpbiBhbnkgY2FzZS4KKyAgICBpZiggX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCApIHsKKyAgICAgICAgS0FfVFJBQ0UoIDExLCAoIl9fa21wX2ludGVybmFsX2VuZF90aHJlYWQ6IGFib3J0LCBleGl0aW5nXG4iICkpOworICAgICAgICAvKiBUT0RPIGFib3J0PyAqLworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKCBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpIHx8ICFfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF90aHJlYWQ6IGFscmVhZHkgZmluaXNoZWRcbiIgKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIC8qIGZpbmQgb3V0IHdobyB3ZSBhcmUgYW5kIHdoYXQgd2Ugc2hvdWxkIGRvICovCisgICAgeworICAgICAgICBpbnQgZ3RpZCA9IChndGlkX3JlcT49MCkgPyBndGlkX3JlcSA6IF9fa21wX2d0aWRfZ2V0X3NwZWNpZmljKCk7CisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkOiBlbnRlciBUIyVkICAoJWQpXG4iLCBndGlkLCBndGlkX3JlcSApKTsKKyAgICAgICAgaWYoIGd0aWQgPT0gS01QX0dUSURfU0hVVERPV04gKSB7CisgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZDogIV9fa21wX2luaXRfcnVudGltZSwgc3lzdGVtIGFscmVhZHkgc2h1dGRvd25cbiIgKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiggZ3RpZCA9PSBLTVBfR1RJRF9NT05JVE9SICkgeworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF90aHJlYWQ6IG1vbml0b3IgdGhyZWFkLCBndGlkIG5vdCByZWdpc3RlcmVkLCBvciBzeXN0ZW0gc2h1dGRvd25cbiIgKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiggZ3RpZCA9PSBLTVBfR1RJRF9ETkUgKSB7CisgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZDogZ3RpZCBub3QgcmVnaXN0ZXJlZCBvciBzeXN0ZW0gc2h1dGRvd25cbiIgKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAvKiB3ZSBkb24ndCBrbm93IHdobyB3ZSBhcmUgKi8KKyAgICAgICAgfSBlbHNlIGlmKCBLTVBfVUJFUl9HVElEKCBndGlkICkpIHsKKyAgICAgICAgLyogdW5yZWdpc3RlciBvdXJzZWx2ZXMgYXMgYW4gdWJlciB0aHJlYWQuICBndGlkIGlzIG5vIGxvbmdlciB2YWxpZCAqLworICAgICAgICAgICAgaWYoIF9fa21wX3Jvb3RbZ3RpZF0gLT4gci5yX2FjdGl2ZSApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ID0gLTE7CisgICAgICAgICAgICAgICAgVENXX1NZTkNfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUsIFRSVUUpOworICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkOiByb290IHN0aWxsIGFjdGl2ZSwgYWJvcnQgVCMlZFxuIiwgZ3RpZCApKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkOiB1bnJlZ2lzdGVyaW5nIHNpYmxpbmcgVCMlZFxuIiwgZ3RpZCApKTsKKyAgICAgICAgICAgICAgICBfX2ttcF91bnJlZ2lzdGVyX3Jvb3RfY3VycmVudF90aHJlYWQoIGd0aWQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIGp1c3QgYSB3b3JrZXIgdGhyZWFkLCBsZXQncyBsZWF2ZSAqLworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF90aHJlYWQ6IHdvcmtlciB0aHJlYWQgVCMlZFxuIiwgZ3RpZCApKTsKKworICAgICAgICAgICAgI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgICAgICAgaWYgKCBndGlkID49IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgICAgICAgICAgICAgICAgICBpZiAoVENSX1BUUih0aGlzX3Roci0+dGgudGhfdGFza190ZWFtKSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF91bnJlZl90YXNrX3RlYW0odGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSwgdGhpc190aHIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgI2VuZGlmIC8qIE9NUF8zMF9FTkFCTEVEICovCisKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkOiB3b3JrZXIgdGhyZWFkIGRvbmUsIGV4aXRpbmcgVCMlZFxuIiwgZ3RpZCApKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICAjaWYgZGVmaW5lZCBHVUlERURMTF9FWFBPUlRTCisgICAgLy8gQUM6IGxldHMgbm90IHNodXRkb3duIHRoZSBMaW51eCogT1MgZHluYW1pYyBsaWJyYXJ5IGF0IHRoZSBleGl0IG9mIHViZXIgdGhyZWFkLAorICAgIC8vICAgICBiZWNhdXNlIHdlIHdpbGwgYmV0dGVyIHNodXRkb3duIGxhdGVyIGluIHRoZSBsaWJyYXJ5IGRlc3RydWN0b3IuCisgICAgLy8gICAgIFRoZSByZWFzb24gb2YgdGhpcyBjaGFuZ2UgaXMgcGVyZm9ybWFuY2UgcHJvYmxlbSB3aGVuIG5vbi1vcGVubXAgdGhyZWFkCisgICAgLy8gICAgIGluIGEgbG9vcCBmb3JrcyBhbmQgam9pbnMgbWFueSBvcGVubXAgdGhyZWFkcy4gV2UgY2FuIHNhdmUgYSBsb3Qgb2YgdGltZQorICAgIC8vICAgICBrZWVwaW5nIHdvcmtlciB0aHJlYWRzIGFsaXZlIHVudGlsIHRoZSBwcm9ncmFtIHNodXRkb3duLgorICAgIC8vIE9NOiBSZW1vdmVkIExpbnV4KiBPUyByZXN0cmljdGlvbiB0byBmaXggdGhlIGNyYXNoIG9uIE9TIFgqIChEUEQyMDAyMzk5NjYpIGFuZAorICAgIC8vICAgICBXaW5kb3dzKERQRDIwMDI4NzQ0MykgdGhhdCBvY2N1cnMgd2hlbiB1c2luZyBjcml0aWNhbCBzZWN0aW9ucyBmcm9tIGZvcmVpZ24gdGhyZWFkcy4KKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF90aHJlYWQ6IGV4aXRpbmdcbiIpICk7CisgICAgICAgIHJldHVybjsKKyAgICAjZW5kaWYKKyAgICAvKiBzeW5jaHJvbml6ZSB0aGUgdGVybWluYXRpb24gcHJvY2VzcyAqLworICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisKKyAgICAvKiBoYXZlIHdlIGFscmVhZHkgZmluaXNoZWQgKi8KKyAgICBpZiggX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCApIHsKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF90aHJlYWQ6IGFib3J0LCBleGl0aW5nXG4iICkpOworICAgICAgICAvKiBUT0RPIGFib3J0PyAqLworICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKCBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpIHx8ICFfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIFdlIG5lZWQgdGhpcyBsb2NrIHRvIGVuZm9yY2UgbXV0ZXggYmV0d2VlbiB0aGlzIHJlYWRpbmcgb2YKKyAgICAgICBfX2ttcF90aHJlYWRzX2NhcGFjaXR5IGFuZCB0aGUgd3JpdGluZyBieSBfX2ttcF9yZWdpc3Rlcl9yb290LgorICAgICAgIEFsdGVybmF0aXZlbHksIHdlIGNhbiB1c2UgYSBjb3VudGVyIG9mIHJvb3RzIHRoYXQgaXMKKyAgICAgICBhdG9taWNhbGx5IHVwZGF0ZWQgYnkgX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWRfcmVnLAorICAgICAgIF9fa21wX2RvX3NlcmlhbF9pbml0aWFsaXplIGFuZCBfX2ttcF9pbnRlcm5hbF9lbmRfKi4KKyAgICAqLworCisgICAgLyogc2hvdWxkIHdlIGZpbmlzaCB0aGUgcnVuLXRpbWU/ICBhcmUgYWxsIHNpYmxpbmdzIGRvbmU/ICovCisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJl9fa21wX2Zvcmtqb2luX2xvY2sgKTsKKworICAgIGZvciAoIGkgPSAwOyBpIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eTsgKysgaSApIHsKKyAgICAgICAgaWYgKCBLTVBfVUJFUl9HVElEKCBpICkgKSB7CisgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZDogcmVtYWluaW5nIHNpYmxpbmcgdGFzazogZ3RpZD09JWRcbiIsIGkgKSk7CisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfZm9ya2pvaW5fbG9jayApOworICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvKiBub3cgd2UgY2FuIHNhZmVseSBjb25kdWN0IHRoZSBhY3R1YWwgdGVybWluYXRpb24gKi8KKworICAgIF9fa21wX2ludGVybmFsX2VuZCgpOworCisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2Zvcmtqb2luX2xvY2sgKTsKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF90aHJlYWQ6IGV4aXRcbiIgKSApOworCisgICAgI2lmZGVmIERVTVBfREVCVUdfT05fRVhJVAorICAgICAgICBpZiAoIF9fa21wX2RlYnVnX2J1ZiApCisgICAgICAgICAgICBfX2ttcF9kdW1wX2RlYnVnX2J1ZmZlcigpOworICAgICNlbmRpZgorfSAvLyBfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIExpYnJhcnkgcmVnaXN0cmF0aW9uIHN0dWZmLgorCitzdGF0aWMgbG9uZyAgIF9fa21wX3JlZ2lzdHJhdGlvbl9mbGFnID0gMDsKKyAgICAvLyBSYW5kb20gdmFsdWUgdXNlZCB0byBpbmRpY2F0ZSBsaWJyYXJ5IGluaXRpYWxpemF0aW9uLgorc3RhdGljIGNoYXIgKiBfX2ttcF9yZWdpc3RyYXRpb25fc3RyICA9IE5VTEw7CisgICAgLy8gVmFsdWUgdG8gYmUgc2F2ZWQgaW4gZW52IHZhciBfX0tNUF9SRUdJU1RFUkVEX0xJQl88cGlkPi4KKworCitzdGF0aWMgaW5saW5lCitjaGFyICoKK19fa21wX3JlZ19zdGF0dXNfbmFtZSgpIHsKKyAgICAvKgorICAgICAgICBPbiBSSEVMIDN1NSBpZiBsaW5rZWQgc3RhdGljYWxseSwgZ2V0cGlkKCkgcmV0dXJucyBkaWZmZXJlbnQgdmFsdWVzIGluIGVhY2ggdGhyZWFkLgorICAgICAgICBJZiByZWdpc3RyYXRpb24gYW5kIHVucmVnaXN0cmF0aW9uIGdvIGluIGRpZmZlcmVudCB0aHJlYWRzIChvbXBfbWlzY19vdGhlcl9yb290X2V4aXQuY3BwIHRlc3QgY2FzZSksCisgICAgICAgIHRoZSBuYW1lIG9mIHJlZ2lzdGVyZWRfbGliX2VudiBlbnYgdmFyIGNhbiBub3QgYmUgZm91bmQsIGJlY2F1c2UgdGhlIG5hbWUgd2lsbCBjb250YWluIGRpZmZlcmVudCBwaWQuCisgICAgKi8KKyAgICByZXR1cm4gX19rbXBfc3RyX2Zvcm1hdCggIl9fS01QX1JFR0lTVEVSRURfTElCXyVkIiwgKGludCkgZ2V0cGlkKCkgKTsKK30gLy8gX19rbXBfcmVnX3N0YXR1c19nZXQKKworCit2b2lkCitfX2ttcF9yZWdpc3Rlcl9saWJyYXJ5X3N0YXJ0dXAoCisgICAgdm9pZAorKSB7CisKKyAgICBjaGFyICogbmFtZSAgID0gX19rbXBfcmVnX3N0YXR1c19uYW1lKCk7ICAvLyBOYW1lIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKyAgICBpbnQgICAgZG9uZSAgID0gMDsKKyAgICB1bmlvbiB7CisgICAgICAgIGRvdWJsZSBkdGltZTsKKyAgICAgICAgbG9uZyAgIGx0aW1lOworICAgIH0gdGltZTsKKyAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgX19rbXBfaW5pdGlhbGl6ZV9zeXN0ZW1fdGljaygpOworICAgICNlbmRpZgorICAgIF9fa21wX3JlYWRfc3lzdGVtX3RpbWUoICYgdGltZS5kdGltZSApOworICAgIF9fa21wX3JlZ2lzdHJhdGlvbl9mbGFnID0gMHhDQUZFMDAwMEwgfCAoIHRpbWUubHRpbWUgJiAweDAwMDBGRkZGTCApOworICAgIF9fa21wX3JlZ2lzdHJhdGlvbl9zdHIgPQorICAgICAgICBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgIiVwLSVseC0lcyIsCisgICAgICAgICAgICAmIF9fa21wX3JlZ2lzdHJhdGlvbl9mbGFnLAorICAgICAgICAgICAgX19rbXBfcmVnaXN0cmF0aW9uX2ZsYWcsCisgICAgICAgICAgICBLTVBfTElCUkFSWV9GSUxFCisgICAgICAgICk7CisKKyAgICBLQV9UUkFDRSggNTAsICggIl9fa21wX3JlZ2lzdGVyX2xpYnJhcnlfc3RhcnR1cDogJXM9XCIlc1wiXG4iLCBuYW1lLCBfX2ttcF9yZWdpc3RyYXRpb25fc3RyICkgKTsKKworICAgIHdoaWxlICggISBkb25lICkgeworCisgICAgICAgIGNoYXIgKiB2YWx1ZSAgPSBOVUxMOyAvLyBBY3R1YWwgdmFsdWUgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlLgorCisgICAgICAgIC8vIFNldCBlbnZpcm9ubWVudCB2YXJpYWJsZSwgYnV0IGRvIG5vdCBvdmVyd3JpdGUgaWYgaXQgaXMgZXhpc3QuCisgICAgICAgIF9fa21wX2Vudl9zZXQoIG5hbWUsIF9fa21wX3JlZ2lzdHJhdGlvbl9zdHIsIDAgKTsKKyAgICAgICAgLy8gQ2hlY2sgdGhlIHZhcmlhYmxlIGlzIHdyaXR0ZW4uCisgICAgICAgIHZhbHVlID0gX19rbXBfZW52X2dldCggbmFtZSApOworICAgICAgICBpZiAoIHZhbHVlICE9IE5VTEwgJiYgc3RyY21wKCB2YWx1ZSwgX19rbXBfcmVnaXN0cmF0aW9uX3N0ciApID09IDAgKSB7CisKKyAgICAgICAgICAgIGRvbmUgPSAxOyAgICAvLyBPaywgZW52aXJvbm1lbnQgdmFyaWFibGUgc2V0IHN1Y2Nlc3NmdWxseSwgZXhpdCB0aGUgbG9vcC4KKworICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAvLyBPb3BzLiBXcml0ZSBmYWlsZWQuIEFub3RoZXIgY29weSBvZiBPcGVuTVAgUlRMIGlzIGluIG1lbW9yeS4KKyAgICAgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgaXQgYWxpdmUgb3IgZGVhZC4KKyAgICAgICAgICAgIGludCAgICBuZWlnaGJvciA9IDA7IC8vIDAgLS0gdW5rbm93biBzdGF0dXMsIDEgLS0gYWxpdmUsIDIgLS0gZGVhZC4KKyAgICAgICAgICAgIGNoYXIgKiB0YWlsICAgICAgICAgID0gdmFsdWU7CisgICAgICAgICAgICBjaGFyICogZmxhZ19hZGRyX3N0ciA9IE5VTEw7CisgICAgICAgICAgICBjaGFyICogZmxhZ192YWxfc3RyICA9IE5VTEw7CisgICAgICAgICAgICBjaGFyIGNvbnN0ICogZmlsZV9uYW1lICAgICA9IE5VTEw7CisgICAgICAgICAgICBfX2ttcF9zdHJfc3BsaXQoIHRhaWwsICctJywgJiBmbGFnX2FkZHJfc3RyLCAmIHRhaWwgKTsKKyAgICAgICAgICAgIF9fa21wX3N0cl9zcGxpdCggdGFpbCwgJy0nLCAmIGZsYWdfdmFsX3N0ciwgICYgdGFpbCApOworICAgICAgICAgICAgZmlsZV9uYW1lID0gdGFpbDsKKyAgICAgICAgICAgIGlmICggdGFpbCAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIGxvbmcgKiBmbGFnX2FkZHIgPSAwOworICAgICAgICAgICAgICAgIGxvbmcgICBmbGFnX3ZhbCAgPSAwOworICAgICAgICAgICAgICAgIHNzY2FuZiggZmxhZ19hZGRyX3N0ciwgIiVwIiwgICYgZmxhZ19hZGRyICk7CisgICAgICAgICAgICAgICAgc3NjYW5mKCBmbGFnX3ZhbF9zdHIsICAiJWx4IiwgJiBmbGFnX3ZhbCAgKTsKKyAgICAgICAgICAgICAgICBpZiAoIGZsYWdfYWRkciAhPSAwICYmIGZsYWdfdmFsICE9IDAgJiYgc3RyY21wKCBmaWxlX25hbWUsICIiICkgIT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRmlyc3QsIGNoZWNrIHdoZXRoZXIgZW52aXJvbm1lbnQtZW5jb2RlZCBhZGRyZXNzIGlzIG1hcHBlZCBpbnRvIGFkZHIgc3BhY2UuCisgICAgICAgICAgICAgICAgICAgIC8vIElmIHNvLCBkZXJlZmVyZW5jZSBpdCB0byBzZWUgaWYgaXQgc3RpbGwgaGFzIHRoZSByaWdodCB2YWx1ZS4KKworICAgICAgICAgICAgICAgICAgICBpZiAoIF9fa21wX2lzX2FkZHJlc3NfbWFwcGVkKCBmbGFnX2FkZHIgKSAmJiAqIGZsYWdfYWRkciA9PSBmbGFnX3ZhbCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5laWdoYm9yID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIG5vdCwgdGhlbiB3ZSBrbm93IHRoZSBvdGhlciBjb3B5IG9mIHRoZSBsaWJyYXJ5IGlzIG5vIGxvbmdlciBydW5uaW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgbmVpZ2hib3IgPSAyOworICAgICAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgc3dpdGNoICggbmVpZ2hib3IgKSB7CisgICAgICAgICAgICAgICAgY2FzZSAwIDogICAgICAvLyBDYW5ub3QgcGFyc2UgZW52aXJvbm1lbnQgdmFyaWFibGUgLS0gbmVpZ2hib3Igc3RhdHVzIHVua25vd24uCisgICAgICAgICAgICAgICAgICAgIC8vIEFzc3VtZSBpdCBpcyB0aGUgaW5jb21wYXRpYmxlIGZvcm1hdCBvZiBmdXR1cmUgdmVyc2lvbiBvZiB0aGUgbGlicmFyeS4KKyAgICAgICAgICAgICAgICAgICAgLy8gQXNzdW1lIHRoZSBvdGhlciBsaWJyYXJ5IGlzIGFsaXZlLgorICAgICAgICAgICAgICAgICAgICAvLyBXQVJOKCAuLi4gKTsgLy8gVE9ETzogSXNzdWUgYSB3YXJuaW5nLgorICAgICAgICAgICAgICAgICAgICBmaWxlX25hbWUgPSAidW5rbm93biBsaWJyYXJ5IjsKKyAgICAgICAgICAgICAgICAgICAgLy8gQXR0ZW50aW9uISBGYWxsaW5nIHRvIHRoZSBuZXh0IGNhc2UuIFRoYXQncyBpbnRlbnRpb25hbC4KKyAgICAgICAgICAgICAgICBjYXNlIDEgOiB7ICAgIC8vIE5laWdoYm9yIGlzIGFsaXZlLgorICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpdCBpcyBhbGxvd2VkLgorICAgICAgICAgICAgICAgICAgICBjaGFyICogZHVwbGljYXRlX29rID0gX19rbXBfZW52X2dldCggIktNUF9EVVBMSUNBVEVfTElCX09LIiApOworICAgICAgICAgICAgICAgICAgICBpZiAoICEgX19rbXBfc3RyX21hdGNoX3RydWUoIGR1cGxpY2F0ZV9vayApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhhdCdzIG5vdCBhbGxvd2VkLiBJc3N1ZSBmYXRhbCBlcnJvci4KKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX01TRyggRHVwbGljYXRlTGlicmFyeSwgS01QX0xJQlJBUllfRklMRSwgZmlsZV9uYW1lICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0hOVCggRHVwbGljYXRlTGlicmFyeSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSggZHVwbGljYXRlX29rICk7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2R1cGxpY2F0ZV9saWJyYXJ5X29rID0gMTsKKyAgICAgICAgICAgICAgICAgICAgZG9uZSA9IDE7ICAgIC8vIEV4aXQgdGhlIGxvb3AuCisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDIgOiB7ICAgIC8vIE5laWdoYm9yIGlzIGRlYWQuCisgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoZSB2YXJpYWJsZSBhbmQgdHJ5IHRvIHJlZ2lzdGVyIGxpYnJhcnkgYWdhaW4uCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2Vudl91bnNldCggbmFtZSApOworICAgICAgICAgICAgICAgIH0gIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQgOiB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIDAgKTsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgfTsgLy8gc3dpdGNoCisKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopIHZhbHVlICk7CisKKyAgICB9OyAvLyB3aGlsZQorICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSBuYW1lICk7CisKK30gLy8gZnVuYyBfX2ttcF9yZWdpc3Rlcl9saWJyYXJ5X3N0YXJ0dXAKKworCit2b2lkCitfX2ttcF91bnJlZ2lzdGVyX2xpYnJhcnkoIHZvaWQgKSB7CisKKyAgICBjaGFyICogbmFtZSAgPSBfX2ttcF9yZWdfc3RhdHVzX25hbWUoKTsKKyAgICBjaGFyICogdmFsdWUgPSBfX2ttcF9lbnZfZ2V0KCBuYW1lICk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9yZWdpc3RyYXRpb25fZmxhZyAhPSAwICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfcmVnaXN0cmF0aW9uX3N0ciAgIT0gTlVMTCApOworICAgIGlmICggdmFsdWUgIT0gTlVMTCAmJiBzdHJjbXAoIHZhbHVlLCBfX2ttcF9yZWdpc3RyYXRpb25fc3RyICkgPT0gMCApIHsKKyAgICAgICAgLy8gT2ssIHRoaXMgaXMgb3VyIHZhcmlhYmxlLiBEZWxldGUgaXQuCisgICAgICAgIF9fa21wX2Vudl91bnNldCggbmFtZSApOworICAgIH07IC8vIGlmCisKKyAgICBLTVBfSU5URVJOQUxfRlJFRSggX19rbXBfcmVnaXN0cmF0aW9uX3N0ciApOworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCB2YWx1ZSApOworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCBuYW1lICk7CisKKyAgICBfX2ttcF9yZWdpc3RyYXRpb25fZmxhZyA9IDA7CisgICAgX19rbXBfcmVnaXN0cmF0aW9uX3N0ciAgPSBOVUxMOworCit9IC8vIF9fa21wX3VucmVnaXN0ZXJfbGlicmFyeQorCisKKy8vIEVuZCBvZiBMaWJyYXJ5IHJlZ2lzdHJhdGlvbiBzdHVmZi4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX2RvX3NlcmlhbF9pbml0aWFsaXplKCB2b2lkICkKK3sKKyAgICBpbnQgaSwgZ3RpZDsKKyAgICBpbnQgc2l6ZTsKKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZTogZW50ZXJcbiIgKSApOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggc2l6ZW9mKCBrbXBfaW50MzIgKSA9PSA0ICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggc2l6ZW9mKCBrbXBfdWludDMyICkgPT0gNCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHNpemVvZigga21wX2ludDY0ICkgPT0gOCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHNpemVvZigga21wX3VpbnQ2NCApID09IDggKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzaXplb2YoIGttcF9pbnRwdHJfdCApID09IHNpemVvZiggdm9pZCAqICkgKTsKKworICAgIF9fa21wX3ZhbGlkYXRlX2xvY2tzKCk7CisKKyAgICAvKiBJbml0aWFsaXplIGludGVybmFsIG1lbW9yeSBhbGxvY2F0b3IgKi8KKyAgICBfX2ttcF9pbml0X2FsbG9jYXRvcigpOworCisgICAgLyogUmVnaXN0ZXIgdGhlIGxpYnJhcnkgc3RhcnR1cCB2aWEgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUKKyAgICAgICBhbmQgY2hlY2sgdG8gc2VlIHdoZXRoZXIgYW5vdGhlciBjb3B5IG9mIHRoZSBsaWJyYXJ5IGlzIGFscmVhZHkKKyAgICAgICByZWdpc3RlcmVkLiAqLworCisgICAgX19rbXBfcmVnaXN0ZXJfbGlicmFyeV9zdGFydHVwKCApOworCisgICAgLyogVE9ETyByZWluaXRpYWxpemF0aW9uIG9mIGxpYnJhcnkgKi8KKyAgICBpZiggVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSApIHsKKyAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfZG9fc2VyaWFsX2luaXRpYWxpemU6IHJlaW5pdGlhbGl6YXRpb24gb2YgbGlicmFyeVxuIiApICk7CisgICAgfQorCisgICAgX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCA9IDA7CisgICAgVENXX1NZTkNfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUsIEZBTFNFKTsKKworICAgIC8qIGluaXRpYWxpemUgdGhlIGxvY2tzICovCisjaWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworI2lmIEtNUF9ERUJVR19BREFQVElWRV9MT0NLUworICAgIF9fa21wX2luaXRfc3BlY3VsYXRpdmVfc3RhdHMoKTsKKyNlbmRpZgorI2VuZGlmCisgICAgX19rbXBfaW5pdF9sb2NrKCAmIF9fa21wX2dsb2JhbF9sb2NrICAgICApOworICAgIF9fa21wX2luaXRfcXVldWluZ19sb2NrKCAmIF9fa21wX2Rpc3BhdGNoX2xvY2sgKTsKKyAgICBfX2ttcF9pbml0X2xvY2soICYgX19rbXBfZGVidWdfbG9jayAgICAgICk7CisgICAgX19rbXBfaW5pdF9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9jayAgICAgKTsKKyAgICBfX2ttcF9pbml0X2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzFpICApOworICAgIF9fa21wX2luaXRfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfMmkgICk7CisgICAgX19rbXBfaW5pdF9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja180aSAgKTsKKyAgICBfX2ttcF9pbml0X2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzRyICApOworICAgIF9fa21wX2luaXRfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfOGkgICk7CisgICAgX19rbXBfaW5pdF9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja184ciAgKTsKKyAgICBfX2ttcF9pbml0X2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzhjICApOworICAgIF9fa21wX2luaXRfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfMTByICk7CisgICAgX19rbXBfaW5pdF9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja18xNnIgKTsKKyAgICBfX2ttcF9pbml0X2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzE2YyApOworICAgIF9fa21wX2luaXRfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfMjBjICk7CisgICAgX19rbXBfaW5pdF9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja18zMmMgKTsKKyAgICBfX2ttcF9pbml0X2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX2Zvcmtqb2luX2xvY2sgICk7CisgICAgX19rbXBfaW5pdF9ib290c3RyYXBfbG9jayggJiBfX2ttcF9leGl0X2xvY2sgICAgICApOworICAgIF9fa21wX2luaXRfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfbW9uaXRvcl9sb2NrICAgKTsKKyAgICBfX2ttcF9pbml0X2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX3RwX2NhY2hlZF9sb2NrICk7CisKKyAgICAvKiBjb25kdWN0IGluaXRpYWxpemF0aW9uIGFuZCBpbml0aWFsIHNldHVwIG9mIGNvbmZpZ3VyYXRpb24gKi8KKworICAgIF9fa21wX3J1bnRpbWVfaW5pdGlhbGl6ZSgpOworCisgICAgLy8gU29tZSBnbG9iYWwgdmFyaWFibGUgaW5pdGlhbGl6YXRpb24gbW92ZWQgaGVyZSBmcm9tIGttcF9lbnZfaW5pdGlhbGl6ZSgpCisjaWZkZWYgS01QX0RFQlVHCisgICAga21wX2RpYWcgPSAwOworI2VuZGlmCisgICAgX19rbXBfYWJvcnRfZGVsYXkgPSAwOworCisgICAgLy8gRnJvbSBfX2ttcF9pbml0X2RmbHRfdGVhbV9udGgoKQorICAgIC8qIGFzc3VtZSB0aGUgZW50aXJlIG1hY2hpbmUgd2lsbCBiZSB1c2VkICovCisgICAgX19rbXBfZGZsdF90ZWFtX250aF91YiA9IF9fa21wX3hwcm9jOworICAgIGlmKCBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViIDwgS01QX01JTl9OVEggKSB7CisgICAgICAgIF9fa21wX2RmbHRfdGVhbV9udGhfdWIgPSBLTVBfTUlOX05USDsKKyAgICB9CisgICAgaWYoIF9fa21wX2RmbHRfdGVhbV9udGhfdWIgPiBfX2ttcF9zeXNfbWF4X250aCApIHsKKyAgICAgICAgX19rbXBfZGZsdF90ZWFtX250aF91YiA9IF9fa21wX3N5c19tYXhfbnRoOworICAgIH0KKyAgICBfX2ttcF9tYXhfbnRoID0gX19rbXBfc3lzX21heF9udGg7CisKKyAgICAvLyBUaHJlZSB2YXJzIGJlbG93IG1vdmVkIGhlcmUgZnJvbSBfX2ttcF9lbnZfaW5pdGlhbGl6ZSgpICJLTVBfQkxPQ0tUSU1FIiBwYXJ0CisgICAgX19rbXBfZGZsdF9ibG9ja3RpbWUgPSBLTVBfREVGQVVMVF9CTE9DS1RJTUU7CisgICAgX19rbXBfbW9uaXRvcl93YWtldXBzID0gS01QX1dBS0VVUFNfRlJPTV9CTE9DS1RJTUUoIF9fa21wX2RmbHRfYmxvY2t0aW1lLCBfX2ttcF9tb25pdG9yX3dha2V1cHMgKTsKKyAgICBfX2ttcF9idF9pbnRlcnZhbHMgPSBLTVBfSU5URVJWQUxTX0ZST01fQkxPQ0tUSU1FKCBfX2ttcF9kZmx0X2Jsb2NrdGltZSwgX19rbXBfbW9uaXRvcl93YWtldXBzICk7CisgICAgLy8gRnJvbSAiS01QX0xJQlJBUlkiIHBhcnQgb2YgX19rbXBfZW52X2luaXRpYWxpemUoKQorICAgIF9fa21wX2xpYnJhcnkgPSBsaWJyYXJ5X3Rocm91Z2hwdXQ7CisgICAgLy8gRnJvbSBLTVBfU0NIRURVTEUgaW5pdGlhbGl6YXRpb24KKyAgICBfX2ttcF9zdGF0aWMgPSBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZDsKKyAgICAvLyBBQzogZG8gbm90IHVzZSBhbmFseXRpY2FsIGhlcmUsIGJlY2F1c2UgaXQgaXMgbm9uLW1vbm90b25vdXMKKyAgICAvL19fa21wX2d1aWRlZCA9IGttcF9zY2hfZ3VpZGVkX2l0ZXJhdGl2ZV9jaHVua2VkOworICAgICNpZiBPTVBfMzBfRU5BQkxFRAorICAgIC8vX19rbXBfYXV0byA9IGttcF9zY2hfZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZDsgLy8gQUM6IGl0IGlzIHRoZSBkZWZhdWx0LCBubyBuZWVkIHRvIHJlcGVhdGUgYXNzaWdubWVudAorICAgICNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorICAgIC8vIEJhcnJpZXIgaW5pdGlhbGl6YXRpb24uIE1vdmVkIGhlcmUgZnJvbSBfX2ttcF9lbnZfaW5pdGlhbGl6ZSgpIEJhcnJpZXIgYnJhbmNoIGJpdCBjb250cm9sIGFuZCBiYXJyaWVyIG1ldGhvZAorICAgIC8vIGNvbnRyb2wgcGFydHMKKyAgICAjaWYgS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICAgICAgI2RlZmluZSBrbXBfcmVkdWN0aW9uX2JhcnJpZXJfZ2F0aGVyX2JiICgoaW50KTEpCisgICAgICAgICNkZWZpbmUga21wX3JlZHVjdGlvbl9iYXJyaWVyX3JlbGVhc2VfYmIgKChpbnQpMSkKKyAgICAgICAgI2RlZmluZSBrbXBfcmVkdWN0aW9uX2JhcnJpZXJfZ2F0aGVyX3BhdCBicF9oeXBlcl9iYXIKKyAgICAgICAgI2RlZmluZSBrbXBfcmVkdWN0aW9uX2JhcnJpZXJfcmVsZWFzZV9wYXQgYnBfaHlwZXJfYmFyCisgICAgI2VuZGlmIC8vIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgZm9yICggaT1ic19wbGFpbl9iYXJyaWVyOyBpPGJzX2xhc3RfYmFycmllcjsgaSsrICkgeworICAgICAgICBfX2ttcF9iYXJyaWVyX2dhdGhlcl9icmFuY2hfYml0cyBbIGkgXSA9IF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JiX2RmbHQ7CisgICAgICAgIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1sgaSBdID0gX19rbXBfYmFycmllcl9yZWxlYXNlX2JiX2RmbHQ7CisgICAgICAgIF9fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdHRlcm4gWyBpIF0gPSBfX2ttcF9iYXJyaWVyX2dhdGhlcl9wYXRfZGZsdDsKKyAgICAgICAgX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdHRlcm5bIGkgXSA9IF9fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXRfZGZsdDsKKyAgICAgICAgI2lmIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgICAgIGlmKCBpID09IGJzX3JlZHVjdGlvbl9iYXJyaWVyICkgeyAvLyB0ZXN0ZWQgYW5kIGNvbmZpcm1lZCBvbiBBTFRJWCBvbmx5ICggbGluXzY0ICk6IGh5cGVyLDEKKyAgICAgICAgICAgIF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JyYW5jaF9iaXRzIFsgaSBdID0ga21wX3JlZHVjdGlvbl9iYXJyaWVyX2dhdGhlcl9iYjsKKyAgICAgICAgICAgIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1sgaSBdID0ga21wX3JlZHVjdGlvbl9iYXJyaWVyX3JlbGVhc2VfYmI7CisgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX2dhdGhlcl9wYXR0ZXJuIFsgaSBdID0ga21wX3JlZHVjdGlvbl9iYXJyaWVyX2dhdGhlcl9wYXQ7CisgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfcGF0dGVyblsgaSBdID0ga21wX3JlZHVjdGlvbl9iYXJyaWVyX3JlbGVhc2VfcGF0OworICAgICAgICB9CisgICAgICAgICNlbmRpZiAvLyBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgIH0KKyAgICAjaWYgS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICAgICAgI3VuZGVmIGttcF9yZWR1Y3Rpb25fYmFycmllcl9yZWxlYXNlX3BhdAorICAgICAgICAjdW5kZWYga21wX3JlZHVjdGlvbl9iYXJyaWVyX2dhdGhlcl9wYXQKKyAgICAgICAgI3VuZGVmIGttcF9yZWR1Y3Rpb25fYmFycmllcl9yZWxlYXNlX2JiCisgICAgICAgICN1bmRlZiBrbXBfcmVkdWN0aW9uX2JhcnJpZXJfZ2F0aGVyX2JiCisgICAgI2VuZGlmIC8vIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgI2lmIEtNUF9NSUMKKyAgICAgICAgLy8gQUM6IHBsYW5lPTMsMiwgZm9ya2pvaW49MiwxIGFyZSBvcHRpbWFsIGZvciAyNDAgdGhyZWFkcyBvbiBLTkMKKyAgICAgICAgX19rbXBfYmFycmllcl9nYXRoZXJfYnJhbmNoX2JpdHMgWyAwIF0gPSAzOyAgLy8gcGxhbmUgZ2F0aGVyCisgICAgICAgIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1sgMSBdID0gMTsgIC8vIGZvcmtqb2luIHJlbGVhc2UKKyAgICAjZW5kaWYKKworICAgIC8vIEZyb20gS01QX0NIRUNLUyBpbml0aWFsaXphdGlvbgorI2lmZGVmIEtNUF9ERUJVRworICAgIF9fa21wX2Vudl9jaGVja3MgPSBUUlVFOyAgIC8qIGRldmVsb3BtZW50IHZlcnNpb25zIGhhdmUgdGhlIGV4dHJhIGNoZWNrcyAqLworI2Vsc2UKKyAgICBfX2ttcF9lbnZfY2hlY2tzID0gRkFMU0U7ICAvKiBwb3J0IHZlcnNpb25zIGRvIG5vdCBoYXZlIHRoZSBleHRyYSBjaGVja3MgKi8KKyNlbmRpZgorCisgICAgLy8gRnJvbSAiS01QX0ZPUkVJR05fVEhSRUFEU19USFJFQURQUklWQVRFIiBpbml0aWFsaXphdGlvbgorICAgIF9fa21wX2ZvcmVpZ25fdHAgPSBUUlVFOworCisgICAgX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljID0gRkFMU0U7CisgICAgX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljX21vZGUgPSBkeW5hbWljX2RlZmF1bHQ7CisKKyAgICBfX2ttcF9lbnZfaW5pdGlhbGl6ZSggTlVMTCApOworICAgIC8vIFByaW50IGFsbCBtZXNzYWdlcyBpbiBtZXNzYWdlIGNhdGFsb2cgZm9yIHRlc3RpbmcgcHVycG9zZXMuCisgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICBjaGFyIGNvbnN0ICogdmFsID0gX19rbXBfZW52X2dldCggIktNUF9EVU1QX0NBVEFMT0ciICk7CisgICAgICAgIGlmICggX19rbXBfc3RyX21hdGNoX3RydWUoIHZhbCApICkgeworICAgICAgICAgICAga21wX3N0cl9idWZfdCBidWZmZXI7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2luaXQoICYgYnVmZmVyICk7CisgICAgICAgICAgICBfX2ttcF9pMThuX2R1bXBfY2F0YWxvZyggJiBidWZmZXIgKTsKKyAgICAgICAgICAgIF9fa21wX3ByaW50ZiggIiVzIiwgYnVmZmVyLnN0ciApOworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIGJ1ZmZlciApOworICAgICAgICB9OyAvLyBpZgorICAgICAgICBfX2ttcF9lbnZfZnJlZSggJiB2YWwgKTsKKyAgICAjZW5kaWYKKworICAgIF9fa21wX3RocmVhZHNfY2FwYWNpdHkgPSBfX2ttcF9pbml0aWFsX3RocmVhZHNfY2FwYWNpdHkoIF9fa21wX2RmbHRfdGVhbV9udGhfdWIgKTsKKyAgICAvLyBNb3ZlZCBoZXJlIGZyb20gX19rbXBfZW52X2luaXRpYWxpemUoKSAiS01QX0FMTF9USFJFQURQUklWQVRFIiBwYXJ0CisgICAgX19rbXBfdHBfY2FwYWNpdHkgPSBfX2ttcF9kZWZhdWx0X3RwX2NhcGFjaXR5KF9fa21wX2RmbHRfdGVhbV9udGhfdWIsIF9fa21wX21heF9udGgsIF9fa21wX2FsbFRocmVhZHNTcGVjaWZpZWQpOworCisKKyAgICAvLyBJZiB0aGUgbGlicmFyeSBpcyBzaHV0IGRvd24gcHJvcGVybHksIGJvdGggcG9vbHMgbXVzdCBiZSBOVUxMLiBKdXN0IGluIGNhc2UsIHNldCB0aGVtCisgICAgLy8gdG8gTlVMTCAtLSBzb21lIG1lbW9yeSBtYXkgbGVhaywgYnV0IHN1YnNlcXVlbnQgY29kZSB3aWxsIHdvcmsgZXZlbiBpZiBwb29scyBhcmUgbm90IGZyZWVkLgorICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3RocmVhZF9wb29sID09IE5VTEwgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90aHJlYWRfcG9vbF9pbnNlcnRfcHQgPT0gTlVMTCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3RlYW1fcG9vbCAgID09IE5VTEwgKTsKKyAgICBfX2ttcF90aHJlYWRfcG9vbCA9IE5VTEw7CisgICAgX19rbXBfdGhyZWFkX3Bvb2xfaW5zZXJ0X3B0ID0gTlVMTDsKKyAgICBfX2ttcF90ZWFtX3Bvb2wgICA9IE5VTEw7CisKKyAgICAvKiBBbGxvY2F0ZSBhbGwgb2YgdGhlIHZhcmlhYmxlIHNpemVkIHJlY29yZHMgKi8KKyAgICAvKiBOT1RFOiBfX2ttcF90aHJlYWRzX2NhcGFjaXR5IGVudHJpZXMgYXJlIGFsbG9jYXRlZCwgYnV0IHRoZSBhcnJheXMgYXJlIGV4cGFuZGFibGUgKi8KKyAgICAvKiBTaW5jZSBhbGxvY2F0aW9uIGlzIGNhY2hlLWFsaWduZWQsIGp1c3QgYWRkIGV4dHJhIHBhZGRpbmcgYXQgdGhlIGVuZCAqLworICAgIHNpemUgPSAoc2l6ZW9mKGttcF9pbmZvX3QqKSArIHNpemVvZihrbXBfcm9vdF90KikpKl9fa21wX3RocmVhZHNfY2FwYWNpdHkgKyBDQUNIRV9MSU5FOworICAgIF9fa21wX3RocmVhZHMgPSAoa21wX2luZm9fdCoqKSBfX2ttcF9hbGxvY2F0ZSggc2l6ZSApOworICAgIF9fa21wX3Jvb3QgICAgPSAoa21wX3Jvb3RfdCoqKSAoKGNoYXIqKV9fa21wX3RocmVhZHMgKyBzaXplb2Yoa21wX2luZm9fdCopICogX19rbXBfdGhyZWFkc19jYXBhY2l0eSApOworCisgICAgLyogaW5pdCB0aHJlYWQgY291bnRzICovCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfYWxsX250aCA9PSAwICk7IC8vIEFzc2VydHMgZmFpbCBpZiB0aGUgbGlicmFyeSBpcyByZWluaXRpYWxpemluZyBhbmQKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9udGggPT0gMCApOyAgICAgLy8gc29tZXRoaW5nIHdhcyB3cm9uZyBpbiB0ZXJtaW5hdGlvbi4KKyAgICBfX2ttcF9hbGxfbnRoID0gMDsKKyAgICBfX2ttcF9udGggICAgID0gMDsKKworICAgIC8qIHNldHVwIHRoZSB1YmVyIG1hc3RlciB0aHJlYWQgYW5kIGhpZXJhcmNoeSAqLworICAgIGd0aWQgPSBfX2ttcF9yZWdpc3Rlcl9yb290KCBUUlVFICk7CisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2RvX3NlcmlhbF9pbml0aWFsaXplICBUIyVkXG4iLCBndGlkICkpOworICAgIEtNUF9BU1NFUlQoIEtNUF9VQkVSX0dUSUQoIGd0aWQgKSApOworICAgIEtNUF9BU1NFUlQoIEtNUF9JTklUSUFMX0dUSUQoIGd0aWQgKSApOworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBfX2ttcF9jb21tb25faW5pdGlhbGl6ZSgpOworCisgICAgI2lmIEtNUF9PU19VTklYCisgICAgICAgIC8qIGludm9rZSB0aGUgY2hpbGQgZm9yayBoYW5kbGVyICovCisgICAgICAgIF9fa21wX3JlZ2lzdGVyX2F0Zm9yaygpOworICAgICNlbmRpZgorCisgICAgI2lmICEgZGVmaW5lZCBHVUlERURMTF9FWFBPUlRTCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEludm9rZSB0aGUgZXhpdCBoYW5kbGVyIHdoZW4gdGhlIHByb2dyYW0gZmluaXNoZXMsIG9ubHkgZm9yIHN0YXRpYyBsaWJyYXJ5LgorICAgICAgICAgICAgICAgRm9yIGR5bmFtaWMgbGlicmFyeSwgd2UgYWxyZWFkeSBoYXZlIF9maW5pIGFuZCBEbGxNYWluLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpbnQgcmMgPSBhdGV4aXQoIF9fa21wX2ludGVybmFsX2VuZF9hdGV4aXQgKTsKKyAgICAgICAgICAgIGlmICggcmMgIT0gMCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coIGttcF9tc19mYXRhbCwgS01QX01TRyggRnVuY3Rpb25FcnJvciwgImF0ZXhpdCgpIiApLCBLTVBfRVJSKCByYyApLCBfX2ttcF9tc2dfbnVsbCApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfQorICAgICNlbmRpZgorCisgICAgI2lmIEtNUF9IQU5ETEVfU0lHTkFMUworICAgICAgICAjaWYgS01QX09TX1VOSVgKKyAgICAgICAgICAgIC8qIE5PVEU6IG1ha2Ugc3VyZSB0aGF0IHRoaXMgaXMgY2FsbGVkIGJlZm9yZSB0aGUgdXNlciBpbnN0YWxscworICAgICAgICAgICAgICogICAgICAgICAgdGhlaXIgb3duIHNpZ25hbCBoYW5kbGVycyBzbyB0aGF0IHRoZSB1c2VyIGhhbmRsZXJzCisgICAgICAgICAgICAgKiAgICAgICAgICBhcmUgY2FsbGVkIGZpcnN0LiAgdGhpcyB3YXkgdGhleSBjYW4gcmV0dXJuIGZhbHNlLAorICAgICAgICAgICAgICogICAgICAgICAgbm90IGNhbGwgb3VyIGhhbmRsZXIsIGF2b2lkIHRlcm1pbmF0aW5nIHRoZSBsaWJyYXJ5LAorICAgICAgICAgICAgICogICAgICAgICAgYW5kIGNvbnRpbnVlIGV4ZWN1dGlvbiB3aGVyZSB0aGV5IGxlZnQgb2ZmLiAqLworICAgICAgICAgICAgX19rbXBfaW5zdGFsbF9zaWduYWxzKCBGQUxTRSApOworICAgICAgICAjZW5kaWYgLyogS01QX09TX1VOSVggKi8KKyAgICAgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgICAgICBfX2ttcF9pbnN0YWxsX3NpZ25hbHMoIFRSVUUgKTsKKyAgICAgICAgI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCisgICAgI2VuZGlmCisKKyAgICAvKiB3ZSBoYXZlIGZpbmlzaGVkIHRoZSBzZXJpYWwgaW5pdGlhbGl6YXRpb24gKi8KKyAgICBfX2ttcF9pbml0X2NvdW50ZXIgKys7CisKKyAgICBfX2ttcF9pbml0X3NlcmlhbCA9IFRSVUU7CisKKyAgICBpZiAoX19rbXBfc2V0dGluZ3MpIHsKKyAgICAgICAgX19rbXBfZW52X3ByaW50KCk7CisgICAgfQorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBpZiAoX19rbXBfZGlzcGxheV9lbnYgfHwgX19rbXBfZGlzcGxheV9lbnZfdmVyYm9zZSkgeworICAgICAgICBfX2ttcF9lbnZfcHJpbnRfMigpOworICAgIH0KKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorCisgICAgS01QX01CKCk7CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfZG9fc2VyaWFsX2luaXRpYWxpemU6IGV4aXRcbiIgKSApOworfQorCit2b2lkCitfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSggdm9pZCApCit7CisgICAgaWYgKCBfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworICAgIGlmICggX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgX19rbXBfZG9fc2VyaWFsX2luaXRpYWxpemUoKTsKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZG9fbWlkZGxlX2luaXRpYWxpemUoIHZvaWQgKQoreworICAgIGludCBpLCBqOworICAgIGludCBwcmV2X2RmbHRfdGVhbV9udGg7CisKKyAgICBpZiggIV9fa21wX2luaXRfc2VyaWFsICkgeworICAgICAgICBfX2ttcF9kb19zZXJpYWxfaW5pdGlhbGl6ZSgpOworICAgIH0KKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9taWRkbGVfaW5pdGlhbGl6ZTogZW50ZXJcbiIgKSApOworCisgICAgLy8KKyAgICAvLyBTYXZlIHRoZSBwcmV2aW91cyB2YWx1ZSBmb3IgdGhlIF9fa21wX2RmbHRfdGVhbV9udGggc28gdGhhdAorICAgIC8vIHdlIGNhbiBhdm9pZCBzb21lIHJlaW5pdGlhbGl6YXRpb24gaWYgaXQgaGFzbid0IGNoYW5nZWQuCisgICAgLy8KKyAgICBwcmV2X2RmbHRfdGVhbV9udGggPSBfX2ttcF9kZmx0X3RlYW1fbnRoOworCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIC8vCisgICAgLy8gX19rbXBfYWZmaW5pdHlfaW5pdGlhbGl6ZSgpIHdpbGwgdHJ5IHRvIHNldCBfX2ttcF9uY29yZXMgdG8gdGhlCisgICAgLy8gbnVtYmVyIG9mIGNvcmVzIG9uIHRoZSBtYWNoaW5lLgorICAgIC8vCisgICAgX19rbXBfYWZmaW5pdHlfaW5pdGlhbGl6ZSgpOworCisgICAgLy8KKyAgICAvLyBSdW4gdGhyb3VnaCB0aGUgX19rbXBfdGhyZWFkcyBhcnJheSBhbmQgc2V0IHRoZSBhZmZpbml0eSBtYXNrCisgICAgLy8gZm9yIGVhY2ggcm9vdCB0aHJlYWQgdGhhdCBpcyBjdXJyZW50bHkgcmVnaXN0ZXJlZCB3aXRoIHRoZSBSVEwuCisgICAgLy8KKyAgICBmb3IgKCBpID0gMDsgaSA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7IGkrKyApIHsKKyAgICAgICAgaWYgKCBUQ1JfUFRSKCBfX2ttcF90aHJlYWRzWyBpIF0gKSAhPSBOVUxMICkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfc2V0X2luaXRfbWFzayggaSwgVFJVRSApOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgKi8KKworICAgIEtNUF9BU1NFUlQoIF9fa21wX3hwcm9jID4gMCApOworICAgIGlmICggX19rbXBfYXZhaWxfcHJvYyA9PSAwICkgeworICAgICAgICBfX2ttcF9hdmFpbF9wcm9jID0gX19rbXBfeHByb2M7CisgICAgfQorCisgICAgLy8gSWYgdGhlcmUgd2VyZSBlbXB0eSBwbGFjZXMgaW4gbnVtX3RocmVhZHMgbGlzdCAoT01QX05VTV9USFJFQURTPSwsMiwzKSwgY29ycmVjdCB0aGVtIG5vdworICAgIGogPSAwOworICAgIHdoaWxlICggX19rbXBfbmVzdGVkX250aC51c2VkICYmICEgX19rbXBfbmVzdGVkX250aC5udGhbIGogXSApIHsKKyAgICAgICAgX19rbXBfbmVzdGVkX250aC5udGhbIGogXSA9IF9fa21wX2RmbHRfdGVhbV9udGggPSBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViID0gX19rbXBfYXZhaWxfcHJvYzsKKyAgICAgICAgaisrOworICAgIH0KKworICAgIGlmICggX19rbXBfZGZsdF90ZWFtX250aCA9PSAwICkgeworI2lmZGVmIEtNUF9ERkxUX05USF9DT1JFUworICAgICAgICAvLworICAgICAgICAvLyBEZWZhdWx0ICN0aHJlYWRzID0gI2NvcmVzCisgICAgICAgIC8vCisgICAgICAgIF9fa21wX2RmbHRfdGVhbV9udGggPSBfX2ttcF9uY29yZXM7CisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9taWRkbGVfaW5pdGlhbGl6ZTogc2V0dGluZyBfX2ttcF9kZmx0X3RlYW1fbnRoID0gX19rbXBfbmNvcmVzICglZClcbiIsCisgICAgICAgICAgX19rbXBfZGZsdF90ZWFtX250aCApICk7CisjZWxzZQorICAgICAgICAvLworICAgICAgICAvLyBEZWZhdWx0ICN0aHJlYWRzID0gI2F2YWlsYWJsZSBPUyBwcm9jcworICAgICAgICAvLworICAgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoID0gX19rbXBfYXZhaWxfcHJvYzsKKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX21pZGRsZV9pbml0aWFsaXplOiBzZXR0aW5nIF9fa21wX2RmbHRfdGVhbV9udGggPSBfX2ttcF9hdmFpbF9wcm9jKCVkKVxuIiwKKyAgICAgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoICkgKTsKKyNlbmRpZiAvKiBLTVBfREZMVF9OVEhfQ09SRVMgKi8KKyAgICB9CisKKyAgICBpZiAoIF9fa21wX2RmbHRfdGVhbV9udGggPCBLTVBfTUlOX05USCApIHsKKyAgICAgICAgX19rbXBfZGZsdF90ZWFtX250aCA9IEtNUF9NSU5fTlRIOworICAgIH0KKyAgICBpZiggX19rbXBfZGZsdF90ZWFtX250aCA+IF9fa21wX3N5c19tYXhfbnRoICkgeworICAgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoID0gX19rbXBfc3lzX21heF9udGg7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBUaGVyZSdzIG5vIGhhcm0gaW4gY29udGludWluZyBpZiB0aGUgZm9sbG93aW5nIGNoZWNrIGZhaWxzLAorICAgIC8vIGJ1dCBpdCBpbmRpY2F0ZXMgYW4gZXJyb3IgaW4gdGhlIHByZXZpb3VzIGxvZ2ljLgorICAgIC8vCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfZGZsdF90ZWFtX250aCA8PSBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViICk7CisKKyAgICBpZiAoIF9fa21wX2RmbHRfdGVhbV9udGggIT0gcHJldl9kZmx0X3RlYW1fbnRoICkgeworICAgICAgICAvLworICAgICAgICAvLyBSdW4gdGhyb3VnaCB0aGUgX19rbXBfdGhyZWFkcyBhcnJheSBhbmQgc2V0IHRoZSBudW0gdGhyZWFkcyBpY3YKKyAgICAgICAgLy8gZm9yIGVhY2ggcm9vdCB0aHJlYWQgdGhhdCBpcyBjdXJyZW50bHkgcmVnaXN0ZXJlZCB3aXRoIHRoZSBSVEwKKyAgICAgICAgLy8gKHdoaWNoIGhhcyBub3QgYWxyZWFkeSBleHBsaWNpdGx5IHNldCBpdHMgbnRocmVhZHMtdmFyIHdpdGggYQorICAgICAgICAvLyBjYWxsIHRvIG9tcF9zZXRfbnVtX3RocmVhZHMoKSkuCisgICAgICAgIC8vCisgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eTsgaSsrICkgeworICAgICAgICAgICAga21wX2luZm9fdCAqdGhyZWFkID0gX19rbXBfdGhyZWFkc1sgaSBdOworICAgICAgICAgICAgaWYgKCB0aHJlYWQgPT0gTlVMTCApIGNvbnRpbnVlOworI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgICBpZiAoIHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLm5wcm9jICE9IDAgKSBjb250aW51ZTsKKyNlbHNlCisgICAgICAgICAgICBpZiAoIHRocmVhZC0+dGgudGhfdGVhbS0+dC50X3NldF9ucHJvY1sgdGhyZWFkLT50aC50aF9pbmZvLmRzLmRzX3RpZCBdICAhPSAwICkgY29udGludWU7CisjZW5kaWYgLyogT01QXzMwX0VOQUJMRUQgKi8KKworICAgICAgICAgICAgc2V0X19ucHJvY19wKCBfX2ttcF90aHJlYWRzWyBpIF0sIF9fa21wX2RmbHRfdGVhbV9udGggKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfbWlkZGxlX2luaXRpYWxpemU6IGZpbmFsIHZhbHVlIGZvciBfX2ttcF9kZmx0X3RlYW1fbnRoID0gJWRcbiIsCisgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoKSApOworCisjaWZkZWYgS01QX0FESlVTVF9CTE9DS1RJTUUKKyAgICAvKiBBZGp1c3QgYmxvY2t0aW1lIHRvIHplcm8gaWYgbmVjZXNzYXJ5ICovCisgICAgLyogbm93IHRoYXQgX19rbXBfYXZhaWxfcHJvYyBpcyBzZXQgICAgICAqLworICAgIGlmICggIV9fa21wX2Vudl9ibG9ja3RpbWUgJiYgKCBfX2ttcF9hdmFpbF9wcm9jID4gMCApICkgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9hdmFpbF9wcm9jID4gMCApOworICAgICAgICBpZiAoIF9fa21wX250aCA+IF9fa21wX2F2YWlsX3Byb2MgKSB7CisgICAgICAgICAgICBfX2ttcF96ZXJvX2J0ID0gVFJVRTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBLTVBfQURKVVNUX0JMT0NLVElNRSAqLworCisgICAgLyogd2UgaGF2ZSBmaW5pc2hlZCBtaWRkbGUgaW5pdGlhbGl6YXRpb24gKi8KKyAgICBUQ1dfU1lOQ180KF9fa21wX2luaXRfbWlkZGxlLCBUUlVFKTsKKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9kb19taWRkbGVfaW5pdGlhbGl6ZTogZXhpdFxuIiApICk7Cit9CisKK3ZvaWQKK19fa21wX21pZGRsZV9pbml0aWFsaXplKCB2b2lkICkKK3sKKyAgICBpZiAoIF9fa21wX2luaXRfbWlkZGxlICkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisgICAgaWYgKCBfX2ttcF9pbml0X21pZGRsZSApIHsKKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBfX2ttcF9kb19taWRkbGVfaW5pdGlhbGl6ZSgpOworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7Cit9CisKK3ZvaWQKK19fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoIHZvaWQgKQoreworICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOyAgICAgIC8vIHRoaXMgbWlnaHQgYmUgYSBuZXcgcm9vdAorCisgICAgLyogc3luY3Jvbml6ZSBwYXJhbGxlbCBpbml0aWFsaXphdGlvbiAoZm9yIHNpYmxpbmcpICovCisgICAgaWYoIFRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpICkgcmV0dXJuOworICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisgICAgaWYoIFRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpICkgeyBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOyByZXR1cm47IH0KKworICAgIC8qIFRPRE8gcmVpbml0aWFsaXphdGlvbiBhZnRlciB3ZSBoYXZlIGFscmVhZHkgc2h1dCBkb3duICovCisgICAgaWYoIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkgKSB7CisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplOiBhdHRlbXB0IHRvIGluaXQgd2hpbGUgc2h1dHRpbmcgZG93blxuIiApICk7CisgICAgICAgIF9fa21wX2luZmluaXRlX2xvb3AoKTsKKyAgICB9CisKKyAgICAvKiBqYzogVGhlIGxvY2sgX19rbXBfaW5pdHpfbG9jayBpcyBhbHJlYWR5IGhlbGQsIHNvIGNhbGxpbmcgX19rbXBfc2VyaWFsX2luaXRpYWxpemUKKyAgICAgICAgICAgd291bGQgY2F1c2UgYSBkZWFkbG9jay4gIFNvIHdlIGNhbGwgX19rbXBfZG9fc2VyaWFsX2luaXRpYWxpemUgZGlyZWN0bHkuCisgICAgKi8KKyAgICBpZiggIV9fa21wX2luaXRfbWlkZGxlICkgeworICAgICAgICBfX2ttcF9kb19taWRkbGVfaW5pdGlhbGl6ZSgpOworICAgIH0KKworICAgIC8qIGJlZ2luIGluaXRpYWxpemF0aW9uICovCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3BhcmFsbGVsX2luaXRpYWxpemU6IGVudGVyXG4iICkgKTsKKyAgICBLTVBfQVNTRVJUKCBLTVBfVUJFUl9HVElEKCBndGlkICkgKTsKKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyAgICAvLworICAgIC8vIFNhdmUgdGhlIEZQIGNvbnRyb2wgcmVncy4KKyAgICAvLyBXb3JrZXIgdGhyZWFkcyB3aWxsIHNldCB0aGVpcnMgdG8gdGhlc2UgdmFsdWVzIGF0IHRocmVhZCBzdGFydHVwLgorICAgIC8vCisgICAgX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQoICZfX2ttcF9pbml0X3g4N19mcHVfY29udHJvbF93b3JkICk7CisgICAgX19rbXBfc3RvcmVfbXhjc3IoICZfX2ttcF9pbml0X214Y3NyICk7CisgICAgX19rbXBfaW5pdF9teGNzciAmPSBLTVBfWDg2X01YQ1NSX01BU0s7CisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisjaWYgS01QX09TX1VOSVgKKyMgaWYgS01QX0hBTkRMRV9TSUdOQUxTCisgICAgLyogIG11c3QgYmUgYWZ0ZXIgX19rbXBfc2VyaWFsX2luaXRpYWxpemUgICovCisgICAgX19rbXBfaW5zdGFsbF9zaWduYWxzKCBUUlVFICk7CisjIGVuZGlmCisjZW5kaWYKKworICAgIF9fa21wX3N1c3BlbmRfaW5pdGlhbGl6ZSgpOworCisjICBpZiBkZWZpbmVkKFVTRV9MT0FEX0JBTEFOQ0UpCisgICAgaWYgKCBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWNfbW9kZSA9PSBkeW5hbWljX2RlZmF1bHQgKSB7CisgICAgICAgIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pY19tb2RlID0gZHluYW1pY19sb2FkX2JhbGFuY2U7CisgICAgfQorI2Vsc2UKKyAgICBpZiAoIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pY19tb2RlID09IGR5bmFtaWNfZGVmYXVsdCApIHsKKyAgICAgICAgX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljX21vZGUgPSBkeW5hbWljX3RocmVhZF9saW1pdDsKKyAgICB9CisjZW5kaWYKKworICAgIGlmICggX19rbXBfdmVyc2lvbiApIHsKKyAgICAgICAgX19rbXBfcHJpbnRfdmVyc2lvbl8yKCk7CisgICAgfQorCisgICAgLyogd2UgaGF2ZSBmaW5pc2hlZCBwYXJhbGxlbCBpbml0aWFsaXphdGlvbiAqLworICAgIFRDV19TWU5DXzQoX19rbXBfaW5pdF9wYXJhbGxlbCwgVFJVRSk7CisKKyAgICBLTVBfTUIoKTsKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZTogZXhpdFxuIiApICk7CisKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkCitfX2ttcF9ydW5fYmVmb3JlX2ludm9rZWRfdGFzayggaW50IGd0aWQsIGludCB0aWQsIGttcF9pbmZvX3QgKnRoaXNfdGhyLAorICBrbXBfdGVhbV90ICp0ZWFtICkKK3sKKyAgICBrbXBfZGlzcF90ICpkaXNwYXRjaDsKKworICAgIEtNUF9NQigpOworCisgICAgLyogbm9uZSBvZiB0aGUgdGhyZWFkcyBoYXZlIGVuY291bnRlcmVkIGFueSBjb25zdHJ1Y3RzLCB5ZXQuICovCisgICAgdGhpc190aHItPnRoLnRoX2xvY2FsLnRoaXNfY29uc3RydWN0ID0gMDsKKyAgICB0aGlzX3Roci0+dGgudGhfbG9jYWwubGFzdF9jb25zdHJ1Y3QgPSAwOworI2lmIEtNUF9DQUNIRV9NQU5BR0UKKyAgICBLTVBfQ0FDSEVfUFJFRkVUQ0goICZ0aGlzX3RociAtPiB0aC50aF9iYXJbIGJzX2Zvcmtqb2luX2JhcnJpZXIgXS5iYi5iX2Fycml2ZWQgKTsKKyNlbmRpZiAvKiBLTVBfQ0FDSEVfTUFOQUdFICovCisgICAgZGlzcGF0Y2ggPSAoa21wX2Rpc3BfdCAqKVRDUl9QVFIodGhpc190aHItPnRoLnRoX2Rpc3BhdGNoKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBkaXNwYXRjaCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0gLT4gdC50X2Rpc3BhdGNoICk7CisgICAgLy9LTVBfREVCVUdfQVNTRVJUKCB0aGlzX3RociAtPiB0aC50aF9kaXNwYXRjaCA9PSAmdGVhbSAtPiB0LnRfZGlzcGF0Y2hbIHRoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX3RpZCBdICk7CisKKyAgICBkaXNwYXRjaCAtPiB0aF9kaXNwX2luZGV4ID0gMDsgICAgLyogcmVzZXQgdGhlIGRpc3BhdGNoIGJ1ZmZlciBjb3VudGVyICovCisKKyAgICBpZiggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgX19rbXBfcHVzaF9wYXJhbGxlbCggZ3RpZCwgdGVhbS0+dC50X2lkZW50ICk7CisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KK30KKwordm9pZAorX19rbXBfcnVuX2FmdGVyX2ludm9rZWRfdGFzayggaW50IGd0aWQsIGludCB0aWQsIGttcF9pbmZvX3QgKnRoaXNfdGhyLAorICBrbXBfdGVhbV90ICp0ZWFtICkKK3sKKyAgICBpZiggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgX19rbXBfcG9wX3BhcmFsbGVsKCBndGlkLCB0ZWFtLT50LnRfaWRlbnQgKTsKK30KKworaW50CitfX2ttcF9pbnZva2VfdGFza19mdW5jKCBpbnQgZ3RpZCApCit7CisgICAgaW50ICAgICAgICAgIHJjOworICAgIGludCAgICAgICAgICB0aWQgICAgICA9IF9fa21wX3RpZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICBrbXBfaW5mb190ICAqdGhpc190aHIgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAga21wX3RlYW1fdCAgKnRlYW0gICAgID0gdGhpc190aHIgLT4gdGgudGhfdGVhbTsKKworICAgIF9fa21wX3J1bl9iZWZvcmVfaW52b2tlZF90YXNrKCBndGlkLCB0aWQsIHRoaXNfdGhyLCB0ZWFtICk7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgIGlmICggX19pdHRfc3RhY2tfY2FsbGVyX2NyZWF0ZV9wdHIgKSB7CisgICAgICAgIF9fa21wX2l0dF9zdGFja19jYWxsZWVfZW50ZXIoIChfX2l0dF9jYWxsZXIpdGVhbS0+dC50X3N0YWNrX2lkICk7IC8vIGluZm9ybSBpdHRub3RpZnkgYWJvdXQgZW50ZXJpbmcgdXNlcidzIGNvZGUKKyAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgIHJjID0gX19rbXBfaW52b2tlX21pY3JvdGFzayggKG1pY3JvdGFza190KSBUQ1JfU1lOQ19QVFIodGVhbS0+dC50X3BrZm4pLAorICAgICAgZ3RpZCwgdGlkLCAoaW50KSB0ZWFtLT50LnRfYXJnYywgKHZvaWQgKiopIHRlYW0tPnQudF9hcmd2ICk7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgaWYgKCBfX2l0dF9zdGFja19jYWxsZXJfY3JlYXRlX3B0ciApIHsKKyAgICAgICAgX19rbXBfaXR0X3N0YWNrX2NhbGxlZV9sZWF2ZSggKF9faXR0X2NhbGxlcil0ZWFtLT50LnRfc3RhY2tfaWQgKTsgLy8gaW5mb3JtIGl0dG5vdGlmeSBhYm91dCBsZWF2aW5nIHVzZXIncyBjb2RlCisgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICBfX2ttcF9ydW5fYWZ0ZXJfaW52b2tlZF90YXNrKCBndGlkLCB0aWQsIHRoaXNfdGhyLCB0ZWFtICk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKyNpZiBPTVBfNDBfRU5BQkxFRAordm9pZAorX19rbXBfdGVhbXNfbWFzdGVyKCBtaWNyb3Rhc2tfdCBtaWNyb3Rhc2ssIGludCBndGlkICkKK3sKKyAgICAvLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IGFsbCBtYXN0ZXIgdGhyZWFkcyBpbiB0ZWFtcyBjb25zdHJ1Y3QKKyAgICBrbXBfaW5mb190ICAqdGhpc190aHIgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAga21wX3RlYW1fdCAgKnRlYW0gPSB0aGlzX3RociAtPiB0aC50aF90ZWFtOworICAgIGlkZW50X3QgICAgICpsb2MgPSAgdGVhbS0+dC50X2lkZW50OworCisjaWYgS01QX0RFQlVHCisgICAgaW50ICAgICAgICAgIHRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfdGVhbXNfbWFzdGVyOiBUIyVkLCBUaWQgJWQsIG1pY3JvdGFzayAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICBndGlkLCB0aWQsIG1pY3JvdGFzaykgKTsKKyNlbmRpZgorCisgICAgLy8gTGF1bmNoIGxlYWd1ZSBvZiB0ZWFtcyBub3csIGJ1dCBub3QgbGV0IHdvcmtlcnMgZXhlY3V0ZQorICAgIC8vICh0aGV5IGhhbmcgb24gZm9yayBiYXJyaWVyIHVudGlsIG5leHQgcGFyYWxsZWwpCisgICAgdGhpc190aHItPnRoLnRoX3NldF9ucHJvYyA9IHRoaXNfdGhyLT50aC50aF9zZXRfbnRoX3RlYW1zOworICAgIF9fa21wX2ZvcmtfY2FsbCggbG9jLCBndGlkLCBUUlVFLAorICAgICAgICAgICAgdGVhbS0+dC50X2FyZ2MsCisgICAgICAgICAgICBtaWNyb3Rhc2ssCisgICAgICAgICAgICBWT0xBVElMRV9DQVNUKGxhdW5jaF90KSBfX2ttcF9pbnZva2VfdGFza19mdW5jLAorICAgICAgICAgICAgTlVMTCApOworICAgIF9fa21wX2pvaW5fY2FsbCggbG9jLCBndGlkLCAxICk7IC8vIEFDOiBsYXN0IHBhcmFtZXRlciAiMSIgZWxpbWluYXRlcyBqb2luIGJhcnJpZXIgd2hpY2ggd29uJ3Qgd29yayBiZWNhdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ya2VyIHRocmVhZHMgYXJlIGluIGEgZm9yayBiYXJyaWVyIHdhaXRpbmcgZm9yIG1vcmUgcGFyYWxsZWwgcmVnaW9ucworfQorCitpbnQKK19fa21wX2ludm9rZV90ZWFtc19tYXN0ZXIoIGludCBndGlkICkKK3sKKyAgICAjaWYgS01QX0RFQlVHCisgICAgaWYgKCAhX19rbXBfdGhyZWFkc1tndGlkXS0+IHRoLnRoX3RlYW0tPnQudF9zZXJpYWxpemVkICkKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKHZvaWQqKV9fa21wX3RocmVhZHNbZ3RpZF0tPiB0aC50aF90ZWFtLT50LnRfcGtmbiA9PSAodm9pZCopX19rbXBfdGVhbXNfbWFzdGVyICk7CisgICAgI2VuZGlmCisKKyAgICBfX2ttcF90ZWFtc19tYXN0ZXIoIChtaWNyb3Rhc2tfdClfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF90ZWFtX21pY3JvdGFzaywgZ3RpZCApOworCisgICAgcmV0dXJuIDE7Cit9CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworLyogdGhpcyBzZXRzIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIHRocmVhZHMgZm9yIHRoZSBuZXh0IHBhcmFsbGVsIHJlZ2lvbgorICogZW5jb3VudGVyZWQgYnkgdGhpcyB0ZWFtICovCisvKiBzaW5jZSB0aGlzIHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgZm9ya2pvaW4gY3JpdGljYWwgc2VjdGlvbiBpdAorICogc2hvdWxkIGF2b2lkIHJhY2UgY29uZGl0aW9ucyB3aXRoIGFzc3ltbWV0cmljYWwgbmVzdGVkIHBhcmFsbGVsaXNtICovCisKK3ZvaWQKK19fa21wX3B1c2hfbnVtX3RocmVhZHMoIGlkZW50X3QgKmlkLCBpbnQgZ3RpZCwgaW50IG51bV90aHJlYWRzICkKK3sKKyAgICBrbXBfaW5mb190ICp0aHIgPSBfX2ttcF90aHJlYWRzW2d0aWRdOworCisgICAgaWYoIG51bV90aHJlYWRzID4gMCApCisgICAgICAgIHRociAtPiB0aC50aF9zZXRfbnByb2MgPSBudW1fdGhyZWFkczsKK30KKworI2lmIE9NUF80MF9FTkFCTEVECisKKy8qIHRoaXMgc2V0cyB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiB0ZWFtcyBmb3IgdGhlIHRlYW1zIHJlZ2lvbiBhbmQvb3IKKyAqIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBmb3IgdGhlIG5leHQgcGFyYWxsZWwgcmVnaW9uIGVuY291bnRlcmVkICAqLwordm9pZAorX19rbXBfcHVzaF9udW1fdGVhbXMoIGlkZW50X3QgKmlkLCBpbnQgZ3RpZCwgaW50IG51bV90ZWFtcywgaW50IG51bV90aHJlYWRzICkKK3sKKyAgICBrbXBfaW5mb190ICp0aHIgPSBfX2ttcF90aHJlYWRzW2d0aWRdOworICAgIC8vIFRoZSBudW1iZXIgb2YgdGVhbXMgaXMgdGhlIG51bWJlciBvZiB0aHJlYWRzIGluIHRoZSBvdXRlciAicGFyYWxsZWwiCisgICAgaWYoIG51bV90ZWFtcyA+IDAgKSB7CisgICAgICAgIHRociAtPiB0aC50aF9zZXRfbnByb2MgPSBudW1fdGVhbXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyIC0+IHRoLnRoX3NldF9ucHJvYyA9IDE7ICAvLyBBQzogZGVmYXVsdCBudW1iZXIgb2YgdGVhbXMgaXMgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgaXQgYmUgX19rbXBfbmNvcmVzID8KKyAgICB9CisgICAgLy8gVGhlIG51bWJlciBvZiB0aHJlYWRzIGlzIGZvciBpbm5lciBwYXJhbGxlbCByZWdpb25zCisgICAgaWYoIG51bV90aHJlYWRzID4gMCApIHsKKyAgICAgICAgdGhyIC0+IHRoLnRoX3NldF9udGhfdGVhbXMgPSBudW1fdGhyZWFkczsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiggIVRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApCisgICAgICAgICAgICBfX2ttcF9taWRkbGVfaW5pdGlhbGl6ZSgpOworICAgICAgICB0aHIgLT4gdGgudGhfc2V0X250aF90ZWFtcyA9IF9fa21wX2F2YWlsX3Byb2MgLyB0aHIgLT4gdGgudGhfc2V0X25wcm9jOworICAgIH0KK30KKworCisvLworLy8gU2V0IHRoZSBwcm9jX2JpbmQgdmFyIHRvIHVzZSBpbiB0aGUgZm9sbG93aW5nIHBhcmFsbGVsIHJlZ2lvbi4KKy8vCit2b2lkCitfX2ttcF9wdXNoX3Byb2NfYmluZCggaWRlbnRfdCAqaWQsIGludCBndGlkLCBrbXBfcHJvY19iaW5kX3QgcHJvY19iaW5kICkKK3sKKyAgICBrbXBfaW5mb190ICp0aHIgPSBfX2ttcF90aHJlYWRzW2d0aWRdOworICAgIHRociAtPiB0aC50aF9zZXRfcHJvY19iaW5kID0gcHJvY19iaW5kOworfQorCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworLyogTGF1bmNoIHRoZSB3b3JrZXIgdGhyZWFkcyBpbnRvIHRoZSBtaWNyb3Rhc2suICovCisKK3ZvaWQKK19fa21wX2ludGVybmFsX2ZvcmsoIGlkZW50X3QgKmlkLCBpbnQgZ3RpZCwga21wX3RlYW1fdCAqdGVhbSApCit7CisgICAga21wX2luZm9fdCAqdGhpc190aHIgPSBfX2ttcF90aHJlYWRzW2d0aWRdOworCisjaWZkZWYgS01QX0RFQlVHCisgICAgaW50IGY7CisjZW5kaWYgLyogS01QX0RFQlVHICovCisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHIgLT4gdGgudGhfdGVhbSAgPT0gIHRlYW0gKTsKKyAgICBLTVBfQVNTRVJUKCAgICAgICBLTVBfTUFTVEVSX0dUSUQoZ3RpZCkgKTsKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIHRlYW0gLT4gdC50X2NvbnN0cnVjdCA9IDA7ICAgICAgICAgIC8qIG5vIHNpbmdsZSBkaXJlY3RpdmVzIHNlZW4geWV0ICovCisgICAgdGVhbSAtPiB0LnRfb3JkZXJlZC5kdC50X3ZhbHVlID0gMDsgLyogdGhyZWFkIDAgZW50ZXJzIHRoZSBvcmRlcmVkIHNlY3Rpb24gZmlyc3QgKi8KKworICAgIC8qIFJlc2V0IHRoZSBpZGVudGlmaWVycyBvbiB0aGUgZGlzcGF0Y2ggYnVmZmVyICovCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSAtPiB0LnRfZGlzcF9idWZmZXIgKTsKKyAgICBpZiAoIHRlYW0tPnQudF9tYXhfbnByb2MgPiAxICkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8ICBLTVBfTUFYX0RJU1BfQlVGOyArK2kpCisgICAgICAgICAgICB0ZWFtIC0+IHQudF9kaXNwX2J1ZmZlclsgaSBdLmJ1ZmZlcl9pbmRleCA9IGk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGVhbSAtPiB0LnRfZGlzcF9idWZmZXJbIDAgXS5idWZmZXJfaW5kZXggPSAwOworICAgIH0KKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworICAgIEtNUF9BU1NFUlQoIHRoaXNfdGhyIC0+IHRoLnRoX3RlYW0gID09ICB0ZWFtICk7CisKKyNpZmRlZiBLTVBfREVCVUcKKyAgICBmb3IoIGY9MCA7IGY8dGVhbS0+dC50X25wcm9jIDsgZisrICkgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtLT50LnRfdGhyZWFkc1tmXSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfdGhyZWFkc1tmXS0+dGgudGhfdGVhbV9ucHJvYyA9PSB0ZWFtLT50LnRfbnByb2MgKTsKKyAgICB9CisjZW5kaWYgLyogS01QX0RFQlVHICovCisKKyAgICAvKiByZWxlYXNlIHRoZSB3b3JrZXIgdGhyZWFkcyBzbyB0aGV5IG1heSBiZWdpbiB3b3JraW5nICovCisgICAgX19rbXBfZm9ya19iYXJyaWVyKCBndGlkLCAwICk7Cit9CisKKwordm9pZAorX19rbXBfaW50ZXJuYWxfam9pbiggaWRlbnRfdCAqaWQsIGludCBndGlkLCBrbXBfdGVhbV90ICp0ZWFtICkKK3sKKyAgICBrbXBfaW5mb190ICp0aGlzX3RociA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHIgLT4gdGgudGhfdGVhbSAgPT0gIHRlYW0gKTsKKyAgICBLTVBfQVNTRVJUKCAgICAgICBLTVBfTUFTVEVSX0dUSUQoZ3RpZCkgKTsKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIC8qIEpvaW4gYmFycmllciBhZnRlciBmb3JrICovCisKKyNpZmRlZiBLTVBfREVCVUcKKyAgICBpZiAoX19rbXBfdGhyZWFkc1tndGlkXSAmJiBfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF90ZWFtX25wcm9jICE9IHRlYW0tPnQudF9ucHJvYyApIHsKKyAgICAgICAgX19rbXBfcHJpbnRmKCJHVElEOiAlZCwgX19rbXBfdGhyZWFkc1slZF09JXBcbiIsZ3RpZCwgZ3RpZCwgX19rbXBfdGhyZWFkc1tndGlkXSk7CisgICAgICAgIF9fa21wX3ByaW50ZigiX19rbXBfdGhyZWFkc1slZF0tPnRoLnRoX3RlYW1fbnByb2M9JWQsIFRFQU06ICVwLCB0ZWFtLT50LnRfbnByb2M9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICBndGlkLCBfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF90ZWFtX25wcm9jLCB0ZWFtLCB0ZWFtLT50LnRfbnByb2MpOworICAgICAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmUoKTsKKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGhyZWFkc1tndGlkXSAmJgorICAgICAgICAgICAgICAgICAgICAgX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfdGVhbV9ucHJvYyA9PSB0ZWFtLT50LnRfbnByb2MgKTsKKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKworICAgIF9fa21wX2pvaW5fYmFycmllciggZ3RpZCApOyAgLyogd2FpdCBmb3IgZXZlcnlvbmUgKi8KKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworICAgIEtNUF9BU1NFUlQoIHRoaXNfdGhyIC0+IHRoLnRoX3RlYW0gID09ICB0ZWFtICk7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIFVTRV9MT0FEX0JBTEFOQ0UKKworLy8KKy8vIFJldHVybiB0aGUgd29ya2VyIHRocmVhZHMgYWN0aXZlbHkgc3Bpbm5pbmcgaW4gdGhlIGhvdCB0ZWFtLCBpZiB3ZQorLy8gYXJlIGF0IHRoZSBvdXRlcm1vc3QgbGV2ZWwgb2YgcGFyYWxsZWxpc20uICBPdGhlcndpc2UsIHJldHVybiAwLgorLy8KK3N0YXRpYyBpbnQKK19fa21wX2FjdGl2ZV9ob3RfdGVhbV9ucHJvYygga21wX3Jvb3RfdCAqcm9vdCApCit7CisgICAgaW50IGk7CisgICAgaW50IHJldHZhbDsKKyAgICBrbXBfdGVhbV90ICpob3RfdGVhbTsKKworICAgIGlmICggcm9vdC0+ci5yX2FjdGl2ZSApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGhvdF90ZWFtID0gcm9vdC0+ci5yX2hvdF90ZWFtOworICAgIGlmICggX19rbXBfZGZsdF9ibG9ja3RpbWUgPT0gS01QX01BWF9CTE9DS1RJTUUgKSB7CisgICAgICAgIHJldHVybiBob3RfdGVhbS0+dC50X25wcm9jIC0gMTsgIC8vIERvbid0IGNvdW50IG1hc3RlciB0aHJlYWQKKyAgICB9CisKKyAgICAvLworICAgIC8vIFNraXAgdGhlIG1hc3RlciB0aHJlYWQgLSBpdCBpcyBhY2NvdW50ZWQgZm9yIGVsc2V3aGVyZS4KKyAgICAvLworICAgIHJldHZhbCA9IDA7CisgICAgZm9yICggaSA9IDE7IGkgPCBob3RfdGVhbS0+dC50X25wcm9jOyBpKysgKSB7CisgICAgICAgIGlmICggaG90X3RlYW0tPnQudF90aHJlYWRzW2ldLT50aC50aF9hY3RpdmUgKSB7CisgICAgICAgICAgICByZXR2YWwrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorCisvLworLy8gUGVyZm9ybSBhbiBhdXRvbWF0aWMgYWRqdXN0bWVudCB0byB0aGUgbnVtYmVyIG9mCisvLyB0aHJlYWRzIHVzZWQgYnkgdGhlIG5leHQgcGFyYWxsZWwgcmVnaW9uLgorLy8KK3N0YXRpYyBpbnQKK19fa21wX2xvYWRfYmFsYW5jZV9ucHJvYygga21wX3Jvb3RfdCAqcm9vdCwgaW50IHNldF9ucHJvYyApCit7CisgICAgaW50IHJldHZhbDsKKyAgICBpbnQgcG9vbF9hY3RpdmU7CisgICAgaW50IGhvdF90ZWFtX2FjdGl2ZTsKKyAgICBpbnQgdGVhbV9jdXJyX2FjdGl2ZTsKKyAgICBpbnQgc3lzdGVtX2FjdGl2ZTsKKworICAgIEtCX1RSQUNFKCAyMCwgKCJfX2ttcF9sb2FkX2JhbGFuY2VfbnByb2M6IGNhbGxlZCByb290OiVwIHNldF9ucHJvYzolZFxuIiwKKyAgICAgICAgICAgICAgICByb290LCBzZXRfbnByb2MgKSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHJvb3QgKTsKKyAgICAjaWYgT01QXzMwX0VOQUJMRUQKKyAgICBLTVBfREVCVUdfQVNTRVJUKCByb290LT5yLnJfcm9vdF90ZWFtLT50LnRfdGhyZWFkc1swXS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLmR5bmFtaWMgPT0gVFJVRSApOworICAgICNlbHNlCisgICAgS01QX0RFQlVHX0FTU0VSVCggcm9vdC0+ci5yX3Jvb3RfdGVhbS0+dC50X3NldF9keW5hbWljWzBdID09IFRSVUUgKTsKKyAgICAjZW5kaWYKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzZXRfbnByb2MgPiAxICk7CisKKyAgICBpZiAoIHNldF9ucHJvYyA9PSAxKSB7CisgICAgICAgIEtCX1RSQUNFKCAyMCwgKCJfX2ttcF9sb2FkX2JhbGFuY2VfbnByb2M6IHNlcmlhbCBleGVjdXRpb24uXG4iICkgKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBUaHJlYWRzIHRoYXQgYXJlIGFjdGl2ZSBpbiB0aGUgdGhyZWFkIHBvb2wsIGFjdGl2ZSBpbiB0aGUgaG90IHRlYW0KKyAgICAvLyBmb3IgdGhpcyBwYXJ0aWN1bGFyIHJvb3QgKGlmIHdlIGFyZSBhdCB0aGUgb3V0ZXIgcGFyIGxldmVsKSwgYW5kCisgICAgLy8gdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgdGhyZWFkICh0byBiZWNvbWUgdGhlIG1hc3RlcikgYXJlIGF2YWlsYWJsZQorICAgIC8vIHRvIGFkZCB0byB0aGUgbmV3IHRlYW0sIGJ1dCBhcmUgY3VycmVudGx5IGNvbnRyaWJ1dGluZyB0byB0aGUgc3lzdGVtCisgICAgLy8gbG9hZCwgYW5kIG11c3QgYmUgYWNjb3VudGVkIGZvci4KKyAgICAvLworICAgIHBvb2xfYWN0aXZlID0gVENSXzQoX19rbXBfdGhyZWFkX3Bvb2xfYWN0aXZlX250aCk7CisgICAgaG90X3RlYW1fYWN0aXZlID0gX19rbXBfYWN0aXZlX2hvdF90ZWFtX25wcm9jKCByb290ICk7CisgICAgdGVhbV9jdXJyX2FjdGl2ZSA9IHBvb2xfYWN0aXZlICsgaG90X3RlYW1fYWN0aXZlICsgMTsKKworICAgIC8vCisgICAgLy8gQ2hlY2sgdGhlIHN5c3RlbSBsb2FkLgorICAgIC8vCisgICAgc3lzdGVtX2FjdGl2ZSA9IF9fa21wX2dldF9sb2FkX2JhbGFuY2UoIF9fa21wX2F2YWlsX3Byb2MgKyB0ZWFtX2N1cnJfYWN0aXZlICk7CisgICAgS0JfVFJBQ0UoIDMwLCAoIl9fa21wX2xvYWRfYmFsYW5jZV9ucHJvYzogc3lzdGVtIGFjdGl2ZSA9ICVkIHBvb2wgYWN0aXZlID0gJWQgaG90IHRlYW0gYWN0aXZlID0gJWRcbiIsCisgICAgICBzeXN0ZW1fYWN0aXZlLCBwb29sX2FjdGl2ZSwgaG90X3RlYW1fYWN0aXZlICkgKTsKKworICAgIGlmICggc3lzdGVtX2FjdGl2ZSA8IDAgKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZXJlIHdhcyBhbiBlcnJvciByZWFkaW5nIHRoZSBuZWNlc3NhcnkgaW5mbyBmcm9tIC9wcm9jLAorICAgICAgICAvLyBzbyB1c2UgdGhlIHRocmVhZCBsaW1pdCBhbGdvcml0aG0gaW5zdGVhZC4gIE9uY2Ugd2Ugc2V0CisgICAgICAgIC8vIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pY19tb2RlID0gZHluYW1pY190aHJlYWRfbGltaXQsCisgICAgICAgIC8vIHdlIHNob3VsZG4ndCB3aW5kIHVwIGdldHRpbmcgYmFjayBoZXJlLgorICAgICAgICAvLworICAgICAgICBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWNfbW9kZSA9IGR5bmFtaWNfdGhyZWFkX2xpbWl0OworICAgICAgICBLTVBfV0FSTklORyggQ2FudExvYWRCYWxVc2luZywgIktNUF9EWU5BTUlDX01PREU9dGhyZWFkIGxpbWl0IiApOworCisgICAgICAgIC8vCisgICAgICAgIC8vIE1ha2UgdGhpcyBjYWxsIGJlaGF2ZSBsaWtlIHRoZSB0aHJlYWQgbGltaXQgYWxnb3JpdGhtLgorICAgICAgICAvLworICAgICAgICByZXR2YWwgPSBfX2ttcF9hdmFpbF9wcm9jIC0gX19rbXBfbnRoICsgKHJvb3QtPnIucl9hY3RpdmUgPyAxCisgICAgICAgICAgOiByb290LT5yLnJfaG90X3RlYW0tPnQudF9ucHJvYyk7CisgICAgICAgIGlmICggcmV0dmFsID4gc2V0X25wcm9jICkgeworICAgICAgICAgICAgcmV0dmFsID0gc2V0X25wcm9jOworICAgICAgICB9CisgICAgICAgIGlmICggcmV0dmFsIDwgS01QX01JTl9OVEggKSB7CisgICAgICAgICAgICByZXR2YWwgPSBLTVBfTUlOX05USDsKKyAgICAgICAgfQorCisgICAgICAgIEtCX1RSQUNFKCAyMCwgKCJfX2ttcF9sb2FkX2JhbGFuY2VfbnByb2M6IHRocmVhZCBsaW1pdCBleGl0LiByZXR2YWw6JWRcbiIsIHJldHZhbCApICk7CisgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBUaGVyZSBpcyBhIHNsaWdodCBkZWxheSBpbiB0aGUgbG9hZCBiYWxhbmNlIGFsZ29yaXRobSBpbiBkZXRlY3RpbmcKKyAgICAvLyBuZXcgcnVubmluZyBwcm9jcy4gIFRoZSByZWFsIHN5c3RlbSBsb2FkIGF0IHRoaXMgaW5zdGFudCBzaG91bGQgYmUKKyAgICAvLyBhdCBsZWFzdCBhcyBsYXJnZSBhcyB0aGUgI2FjdGl2ZSBvbXAgdGhyZWFkIHRoYXQgYXJlIGF2YWlsYWJsZSB0bworICAgIC8vIGFkZCB0byB0aGUgdGVhbS4KKyAgICAvLworICAgIGlmICggc3lzdGVtX2FjdGl2ZSA8IHRlYW1fY3Vycl9hY3RpdmUgKSB7CisgICAgICAgIHN5c3RlbV9hY3RpdmUgPSB0ZWFtX2N1cnJfYWN0aXZlOworICAgIH0KKyAgICByZXR2YWwgPSBfX2ttcF9hdmFpbF9wcm9jIC0gc3lzdGVtX2FjdGl2ZSArIHRlYW1fY3Vycl9hY3RpdmU7CisgICAgaWYgKCByZXR2YWwgPiBzZXRfbnByb2MgKSB7CisgICAgICAgIHJldHZhbCA9IHNldF9ucHJvYzsKKyAgICB9CisgICAgaWYgKCByZXR2YWwgPCBLTVBfTUlOX05USCApIHsKKyAgICAgICAgcmV0dmFsID0gS01QX01JTl9OVEg7CisgICAgfQorCisgICAgS0JfVFJBQ0UoIDIwLCAoIl9fa21wX2xvYWRfYmFsYW5jZV9ucHJvYzogZXhpdC4gcmV0dmFsOiVkXG4iLCByZXR2YWwgKSApOworICAgIHJldHVybiByZXR2YWw7Cit9IC8vIF9fa21wX2xvYWRfYmFsYW5jZV9ucHJvYygpCisKKyNlbmRpZiAvKiBVU0VfTE9BRF9CQUxBTkNFICovCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogTk9URTogdGhpcyBpcyBjYWxsZWQgd2l0aCB0aGUgX19rbXBfaW5pdF9sb2NrIGhlbGQgKi8KK3ZvaWQKK19fa21wX2NsZWFudXAoIHZvaWQgKQoreworICAgIGludCBmOworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2NsZWFudXA6IGVudGVyXG4iICkgKTsKKworICAgIGlmIChUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSkgeworI2lmIEtNUF9IQU5ETEVfU0lHTkFMUworICAgICAgICBfX2ttcF9yZW1vdmVfc2lnbmFscygpOworI2VuZGlmCisgICAgICAgIFRDV180KF9fa21wX2luaXRfcGFyYWxsZWwsIEZBTFNFKTsKKyAgICB9CisKKyAgICBpZiAoVENSXzQoX19rbXBfaW5pdF9taWRkbGUpKSB7CisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICBfX2ttcF9hZmZpbml0eV91bmluaXRpYWxpemUoKTsKKyNlbmRpZiAvKiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEICovCisgICAgICAgIFRDV180KF9fa21wX2luaXRfbWlkZGxlLCBGQUxTRSk7CisgICAgfQorCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2NsZWFudXA6IGdvIHNlcmlhbCBjbGVhbnVwXG4iICkgKTsKKworICAgIGlmIChfX2ttcF9pbml0X3NlcmlhbCkgeworCisgICAgICAgIF9fa21wX3J1bnRpbWVfZGVzdHJveSgpOworCisgICAgICAgIF9fa21wX2luaXRfc2VyaWFsID0gRkFMU0U7CisgICAgfQorCisgICAgZm9yICggZiA9IDA7IGYgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OyBmKysgKSB7CisgICAgICAgIGlmICggX19rbXBfcm9vdFsgZiBdICE9IE5VTEwgKSB7CisgICAgICAgICAgICBfX2ttcF9mcmVlKCBfX2ttcF9yb290WyBmIF0gKTsKKyAgICAgICAgICAgIF9fa21wX3Jvb3RbIGYgXSA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgX19rbXBfZnJlZSggX19rbXBfdGhyZWFkcyApOworICAgIC8vIF9fa21wX3RocmVhZHMgYW5kIF9fa21wX3Jvb3Qgd2VyZSBhbGxvY2F0ZWQgYXQgb25jZSwgYXMgc2luZ2xlIGJsb2NrLCBzbyB0aGVyZSBpcyBubyBuZWVkIGluCisgICAgLy8gZnJlZWluZyBfX2ttcF9yb290LgorICAgIF9fa21wX3RocmVhZHMgPSBOVUxMOworICAgIF9fa21wX3Jvb3QgICAgPSBOVUxMOworICAgIF9fa21wX3RocmVhZHNfY2FwYWNpdHkgPSAwOworCisgICAgX19rbXBfY2xlYW51cF91c2VyX2xvY2tzKCk7CisKKyAgICAjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSggKHZvaWQgKikgX19rbXBfY3B1aW5mb19maWxlICk7CisgICAgICAgIF9fa21wX2NwdWluZm9fZmlsZSA9IE5VTEw7CisgICAgI2VuZGlmIC8qIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgKi8KKworICAgI2lmIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKyAgICNpZiBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1MKKyAgICAgICBfX2ttcF9wcmludF9zcGVjdWxhdGl2ZV9zdGF0cygpOworICAgI2VuZGlmCisgICAjZW5kaWYKKyAgICBLTVBfSU5URVJOQUxfRlJFRSggX19rbXBfbmVzdGVkX250aC5udGggKTsKKyAgICBfX2ttcF9uZXN0ZWRfbnRoLm50aCA9IE5VTEw7CisgICAgX19rbXBfbmVzdGVkX250aC5zaXplID0gMDsKKyAgICBfX2ttcF9uZXN0ZWRfbnRoLnVzZWQgPSAwOworCisgICAgX19rbXBfaTE4bl9jYXRjbG9zZSgpOworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2NsZWFudXA6IGV4aXRcbiIgKSApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitpbnQKK19fa21wX2lnbm9yZV9tcHBiZWcoIHZvaWQgKQoreworICAgIGNoYXIgKmVudjsKKworICAgIGlmICgoZW52ID0gZ2V0ZW52KCAiS01QX0lHTk9SRV9NUFBCRUciICkpICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKF9fa21wX3N0cl9tYXRjaF9mYWxzZSggZW52ICkpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIC8vIEJ5IGRlZmF1bHQgX19rbXBjX2JlZ2luKCkgaXMgbm8tb3AuCisgICAgcmV0dXJuIFRSVUU7Cit9CisKK2ludAorX19rbXBfaWdub3JlX21wcGVuZCggdm9pZCApCit7CisgICAgY2hhciAqZW52OworCisgICAgaWYgKChlbnYgPSBnZXRlbnYoICJLTVBfSUdOT1JFX01QUEVORCIgKSkgIT0gTlVMTCkgeworICAgICAgICBpZiAoX19rbXBfc3RyX21hdGNoX2ZhbHNlKCBlbnYgKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgLy8gQnkgZGVmYXVsdCBfX2ttcGNfZW5kKCkgaXMgbm8tb3AuCisgICAgcmV0dXJuIFRSVUU7Cit9CisKK3ZvaWQKK19fa21wX2ludGVybmFsX2JlZ2luKCB2b2lkICkKK3sKKyAgICBpbnQgZ3RpZDsKKyAgICBrbXBfcm9vdF90ICpyb290OworCisgICAgLyogdGhpcyBpcyBhIHZlcnkgaW1wb3J0YW50IHN0ZXAgYXMgaXQgd2lsbCByZWdpc3RlciBuZXcgc2libGluZyB0aHJlYWRzCisgICAgICogYW5kIGFzc2lnbiB0aGVzZSBuZXcgdWJlciB0aHJlYWRzIGEgbmV3IGd0aWQgKi8KKyAgICBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgIHJvb3QgPSBfX2ttcF90aHJlYWRzWyBndGlkIF0gLT4gdGgudGhfcm9vdDsKKyAgICBLTVBfQVNTRVJUKCBLTVBfVUJFUl9HVElEKCBndGlkICkpOworCisgICAgaWYoIHJvb3QtPnIucl9iZWdpbiApIHJldHVybjsKKyAgICBfX2ttcF9hY3F1aXJlX2xvY2soICZyb290LT5yLnJfYmVnaW5fbG9jaywgZ3RpZCApOworICAgIGlmKCByb290LT5yLnJfYmVnaW4gKSB7CisgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jayggJiByb290LT5yLnJfYmVnaW5fbG9jaywgZ3RpZCApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcm9vdCAtPiByLnJfYmVnaW4gPSBUUlVFOworCisgICAgX19rbXBfcmVsZWFzZV9sb2NrKCAmIHJvb3QtPnIucl9iZWdpbl9sb2NrLCBndGlkICk7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAorX19rbXBfdXNlcl9zZXRfbGlicmFyeSAoZW51bSBsaWJyYXJ5X3R5cGUgYXJnKQoreworICAgIGludCBndGlkOworICAgIGttcF9yb290X3QgKnJvb3Q7CisgICAga21wX2luZm9fdCAqdGhyZWFkOworCisgICAgLyogZmlyc3QsIG1ha2Ugc3VyZSB3ZSBhcmUgaW5pdGlhbGl6ZWQgc28gd2UgY2FuIGdldCBvdXIgZ3RpZCAqLworCisgICAgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICB0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisKKyAgICByb290ID0gdGhyZWFkIC0+IHRoLnRoX3Jvb3Q7CisKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfdXNlcl9zZXRfbGlicmFyeTogZW50ZXIgVCMlZCwgYXJnOiAlZCwgJWRcbiIsIGd0aWQsIGFyZywgbGlicmFyeV9zZXJpYWwgKSk7CisgICAgaWYgKHJvb3QtPnIucl9pbl9wYXJhbGxlbCkgeyAvKiBNdXN0IGJlIGNhbGxlZCBpbiBzZXJpYWwgc2VjdGlvbiBvZiB0b3AtbGV2ZWwgdGhyZWFkICovCisgICAgICAgIEtNUF9XQVJOSU5HKCBTZXRMaWJyYXJ5SW5jb3JyZWN0Q2FsbCApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3dpdGNoICggYXJnICkgeworICAgIGNhc2UgbGlicmFyeV9zZXJpYWwgOgorICAgICAgICB0aHJlYWQgLT4gdGgudGhfc2V0X25wcm9jID0gMDsKKyAgICAgICAgc2V0X19ucHJvY19wKCB0aHJlYWQsIDEgKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBsaWJyYXJ5X3R1cm5hcm91bmQgOgorICAgICAgICB0aHJlYWQgLT4gdGgudGhfc2V0X25wcm9jID0gMDsKKyAgICAgICAgc2V0X19ucHJvY19wKCB0aHJlYWQsIF9fa21wX2RmbHRfdGVhbV9udGggPyBfX2ttcF9kZmx0X3RlYW1fbnRoIDogX19rbXBfZGZsdF90ZWFtX250aF91YiApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGxpYnJhcnlfdGhyb3VnaHB1dCA6CisgICAgICAgIHRocmVhZCAtPiB0aC50aF9zZXRfbnByb2MgPSAwOworICAgICAgICBzZXRfX25wcm9jX3AoIHRocmVhZCwgX19rbXBfZGZsdF90ZWFtX250aCA/IF9fa21wX2RmbHRfdGVhbV9udGggOiBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViICk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIEtNUF9GQVRBTCggVW5rbm93bkxpYnJhcnlUeXBlLCBhcmcgKTsKKyAgICB9CisKKyAgICBfX2ttcF9hdXhfc2V0X2xpYnJhcnkgKCBhcmcgKTsKK30KKwordm9pZAorX19rbXBfYXV4X3NldF9zdGFja3NpemUoIHNpemVfdCBhcmcgKQoreworICAgIGlmICghIF9fa21wX2luaXRfc2VyaWFsKQorICAgICAgICBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSgpOworCisjaWYgS01QX09TX0RBUldJTgorICAgIGlmIChhcmcgJiAoMHgxMDAwIC0gMSkpIHsKKyAgICAgICAgYXJnICY9IH4oMHgxMDAwIC0gMSk7CisgICAgICAgIGlmKGFyZyArIDB4MTAwMCkgLyogY2hlY2sgZm9yIG92ZXJmbG93IGlmIHdlIHJvdW5kIHVwICovCisgICAgICAgICAgICBhcmcgKz0gMHgxMDAwOworICAgIH0KKyNlbmRpZgorICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisKKyAgICAvKiBvbmx5IGNoYW5nZSB0aGUgZGVmYXVsdCBzdGFja3NpemUgYmVmb3JlIHRoZSBmaXJzdCBwYXJhbGxlbCByZWdpb24gKi8KKyAgICBpZiAoISBUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSkgeworICAgICAgICBzaXplX3QgdmFsdWUgPSBhcmc7ICAgICAgIC8qIGFyZ3VtZW50IGlzIGluIGJ5dGVzICovCisKKyAgICAgICAgaWYgKHZhbHVlIDwgX19rbXBfc3lzX21pbl9zdGtzaXplICkKKyAgICAgICAgICAgIHZhbHVlID0gX19rbXBfc3lzX21pbl9zdGtzaXplIDsKKyAgICAgICAgZWxzZSBpZiAodmFsdWUgPiBLTVBfTUFYX1NUS1NJWkUpCisgICAgICAgICAgICB2YWx1ZSA9IEtNUF9NQVhfU1RLU0laRTsKKworICAgICAgICBfX2ttcF9zdGtzaXplID0gdmFsdWU7CisKKyAgICAgICAgX19rbXBfZW52X3N0a3NpemUgPSBUUlVFOyAgICAvKiB3YXMgS01QX1NUQUNLU0laRSBzcGVjaWZpZWQ/ICovCisgICAgfQorCisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKK30KKworLyogc2V0IHRoZSBiZWhhdmlvdXIgb2YgdGhlIHJ1bnRpbWUgbGlicmFyeSAqLworLyogVE9ETyB0aGlzIGNhbiBjYXVzZSBzb21lIG9kZCBiZWhhdmlvdXIgd2l0aCBzaWJsaW5nIHBhcmFsbGVsaXNtLi4uICovCit2b2lkCitfX2ttcF9hdXhfc2V0X2xpYnJhcnkgKGVudW0gbGlicmFyeV90eXBlIGFyZykKK3sKKyAgICBfX2ttcF9saWJyYXJ5ID0gYXJnOworCisgICAgc3dpdGNoICggX19rbXBfbGlicmFyeSApIHsKKyAgICBjYXNlIGxpYnJhcnlfc2VyaWFsIDoKKyAgICAgICAgeworICAgICAgICAgICAgS01QX0lORk9STSggTGlicmFyeUlzU2VyaWFsICk7CisgICAgICAgICAgICAodm9pZCkgX19rbXBfY2hhbmdlX2xpYnJhcnkoIFRSVUUgKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIGxpYnJhcnlfdHVybmFyb3VuZCA6CisgICAgICAgICh2b2lkKSBfX2ttcF9jaGFuZ2VfbGlicmFyeSggVFJVRSApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGxpYnJhcnlfdGhyb3VnaHB1dCA6CisgICAgICAgICh2b2lkKSBfX2ttcF9jaGFuZ2VfbGlicmFyeSggRkFMU0UgKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgS01QX0ZBVEFMKCBVbmtub3duTGlicmFyeVR5cGUsIGFyZyApOworICAgIH0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAorX19rbXBfYXV4X3NldF9ibG9ja3RpbWUgKGludCBhcmcsIGttcF9pbmZvX3QgKnRocmVhZCwgaW50IHRpZCkKK3sKKyAgICBpbnQgYmxvY2t0aW1lID0gYXJnOyAgICAgICAgLyogYXJndW1lbnQgaXMgaW4gbWlsbGlzZWNvbmRzICovCisgICAgaW50IGJ0X2ludGVydmFsczsKKyAgICBpbnQgYnRfc2V0OworCisgICAgX19rbXBfc2F2ZV9pbnRlcm5hbF9jb250cm9scyggdGhyZWFkICk7CisKKyAgICAvKiBOb3JtYWxpemUgYW5kIHNldCBibG9ja3RpbWUgZm9yIHRoZSB0ZWFtcyAqLworICAgIGlmIChibG9ja3RpbWUgPCBLTVBfTUlOX0JMT0NLVElNRSkKKyAgICAgICAgYmxvY2t0aW1lID0gS01QX01JTl9CTE9DS1RJTUU7CisgICAgZWxzZSBpZiAoYmxvY2t0aW1lID4gS01QX01BWF9CTE9DS1RJTUUpCisgICAgICAgIGJsb2NrdGltZSA9IEtNUF9NQVhfQkxPQ0tUSU1FOworCisgICAgc2V0X19ibG9ja3RpbWVfdGVhbSggdGhyZWFkIC0+IHRoLnRoX3RlYW0sIHRpZCwgYmxvY2t0aW1lICk7CisgICAgc2V0X19ibG9ja3RpbWVfdGVhbSggdGhyZWFkIC0+IHRoLnRoX3NlcmlhbF90ZWFtLCAwLCBibG9ja3RpbWUgKTsKKworICAgIC8qIENhbGN1bGF0ZSBhbmQgc2V0IGJsb2NrdGltZSBpbnRlcnZhbHMgZm9yIHRoZSB0ZWFtcyAqLworICAgIGJ0X2ludGVydmFscyA9IEtNUF9JTlRFUlZBTFNfRlJPTV9CTE9DS1RJTUUoYmxvY2t0aW1lLCBfX2ttcF9tb25pdG9yX3dha2V1cHMpOworCisgICAgc2V0X19idF9pbnRlcnZhbHNfdGVhbSggdGhyZWFkIC0+IHRoLnRoX3RlYW0sIHRpZCwgYnRfaW50ZXJ2YWxzICk7CisgICAgc2V0X19idF9pbnRlcnZhbHNfdGVhbSggdGhyZWFkIC0+IHRoLnRoX3NlcmlhbF90ZWFtLCAwLCBidF9pbnRlcnZhbHMgKTsKKworICAgIC8qIFNldCB3aGV0aGVyIGJsb2NrdGltZSBoYXMgYmVlbiBzZXQgdG8gIlRSVUUiICovCisgICAgYnRfc2V0ID0gVFJVRTsKKworICAgIHNldF9fYnRfc2V0X3RlYW0oIHRocmVhZCAtPiB0aC50aF90ZWFtLCB0aWQsIGJ0X3NldCApOworICAgIHNldF9fYnRfc2V0X3RlYW0oIHRocmVhZCAtPiB0aC50aF9zZXJpYWxfdGVhbSwgMCwgYnRfc2V0ICk7CisgICAgS0ZfVFJBQ0UoMTAsICggImttcF9zZXRfYmxvY2t0aW1lOiBUIyVkKCVkOiVkKSwgYmxvY2t0aW1lPSVkLCBidF9pbnRlcnZhbHM9JWQsIG1vbml0b3JfdXBkYXRlcz0lZFxuIiwKKyAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aWQodGlkLCB0aHJlYWQtPnRoLnRoX3RlYW0pLAorICAgICAgICAgICAgICAgICAgdGhyZWFkLT50aC50aF90ZWFtLT50LnRfaWQsIHRpZCwgYmxvY2t0aW1lLCBidF9pbnRlcnZhbHMsIF9fa21wX21vbml0b3Jfd2FrZXVwcyApICk7Cit9CisKK3ZvaWQKK19fa21wX2F1eF9zZXRfZGVmYXVsdHMoCisgICAgY2hhciBjb25zdCAqIHN0ciwKKyAgICBpbnQgICAgICAgICAgbGVuCispIHsKKyAgICBpZiAoICEgX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgIF9fa21wX3NlcmlhbF9pbml0aWFsaXplKCk7CisgICAgfTsKKyAgICBfX2ttcF9lbnZfaW5pdGlhbGl6ZSggc3RyICk7CisKKyAgICBpZiAoX19rbXBfc2V0dGluZ3MKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICB8fCBfX2ttcF9kaXNwbGF5X2VudiB8fCBfX2ttcF9kaXNwbGF5X2Vudl92ZXJib3NlCisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKyAgICAgICAgKSB7CisgICAgICAgIF9fa21wX2Vudl9wcmludCgpOworICAgIH0KK30gLy8gX19rbXBfYXV4X3NldF9kZWZhdWx0cworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGludGVybmFsIGZhc3QgcmVkdWN0aW9uIHJvdXRpbmVzCisgKi8KKworUEFDS0VEX1JFRFVDVElPTl9NRVRIT0RfVAorX19rbXBfZGV0ZXJtaW5lX3JlZHVjdGlvbl9tZXRob2QoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsCisgICAgICAgIGttcF9pbnQzMiBudW1fdmFycywgc2l6ZV90IHJlZHVjZV9zaXplLCB2b2lkICpyZWR1Y2VfZGF0YSwgdm9pZCAoKnJlZHVjZV9mdW5jKSh2b2lkICpsaHNfZGF0YSwgdm9pZCAqcmhzX2RhdGEpLAorICAgICAgICBrbXBfY3JpdGljYWxfbmFtZSAqbGNrICkKK3sKKworICAgIC8vIERlZmF1bHQgcmVkdWN0aW9uIG1ldGhvZDogY3JpdGljYWwgY29uc3RydWN0ICggbGNrICE9IE5VTEwsIGxpa2UgaW4gY3VycmVudCBQQVJPUFQgKQorICAgIC8vIElmICggcmVkdWNlX2RhdGEhPU5VTEwgJiYgcmVkdWNlX2Z1bmMhPU5VTEwgKTogdGhlIHRyZWUtcmVkdWN0aW9uIG1ldGhvZCBjYW4gYmUgc2VsZWN0ZWQgYnkgUlRMCisgICAgLy8gSWYgbG9jLT5mbGFncyBjb250YWlucyBLTVBfSURFTlRfQVRPTUlDX1JFRFVDRSwgdGhlIGF0b21pYyByZWR1Y2UgbWV0aG9kIGNhbiBiZSBzZWxlY3RlZCBieSBSVEwKKyAgICAvLyBGaW5hbGx5LCBpdCdzIHVwIHRvIE9wZW5NUCBSVEwgdG8gbWFrZSBhIGRlY2lzaW9uIG9uIHdoaWNoIG1ldGhvZCB0byBzZWxlY3QgYW1vbmcgZ2VuZXJhdGVkIGJ5IFBBUk9QVC4KKworICAgIFBBQ0tFRF9SRURVQ1RJT05fTUVUSE9EX1QgcmV0dmFsOworCisgICAgaW50IHRlYW1fc2l6ZTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIGxvYyApOyAgICAvLyBpdCB3b3VsZCBiZSBuaWNlIHRvIHRlc3QgKCBsb2MgIT0gMCApCisgICAgS01QX0RFQlVHX0FTU0VSVCggbGNrICk7ICAgIC8vIGl0IHdvdWxkIGJlIG5pY2UgdG8gdGVzdCAoIGxjayAhPSAwICkKKworICAgICNkZWZpbmUgRkFTVF9SRURVQ1RJT05fQVRPTUlDX01FVEhPRF9HRU5FUkFURUQgKCAoIGxvYy0+ZmxhZ3MgJiAoIEtNUF9JREVOVF9BVE9NSUNfUkVEVUNFICkgKSA9PSAoIEtNUF9JREVOVF9BVE9NSUNfUkVEVUNFICkgKQorICAgICNkZWZpbmUgRkFTVF9SRURVQ1RJT05fVFJFRV9NRVRIT0RfR0VORVJBVEVEICAgKCAoIHJlZHVjZV9kYXRhICkgJiYgKCByZWR1Y2VfZnVuYyApICkKKworICAgIHJldHZhbCA9IGNyaXRpY2FsX3JlZHVjZV9ibG9jazsKKworICAgIHRlYW1fc2l6ZSA9IF9fa21wX2dldF90ZWFtX251bV90aHJlYWRzKCBnbG9iYWxfdGlkICk7IC8vIGFub3RoZXIgY2hvaWNlIG9mIGdldHRpbmcgYSB0ZWFtIHNpemUgKCB3aXRoIDEgZHluYW1pYyBkZWZlcmVuY2UgKSBpcyBzbG93ZXIKKworICAgIGlmKCB0ZWFtX3NpemUgPT0gMSApIHsKKworICAgICAgICByZXR2YWwgPSBlbXB0eV9yZWR1Y2VfYmxvY2s7CisKKyAgICB9IGVsc2UgeworCisgICAgICAgIGludCBhdG9taWNfYXZhaWxhYmxlID0gRkFTVF9SRURVQ1RJT05fQVRPTUlDX01FVEhPRF9HRU5FUkFURUQ7CisgICAgICAgIGludCB0cmVlX2F2YWlsYWJsZSAgID0gRkFTVF9SRURVQ1RJT05fVFJFRV9NRVRIT0RfR0VORVJBVEVEOworCisgICAgICAgICNpZiBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfUFBDNjQKKworICAgICAgICAgICAgI2lmIEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfRlJFRUJTRCB8fCBLTVBfT1NfV0lORE9XUyB8fCBLTVBfT1NfREFSV0lOCisgICAgICAgICAgICAgICAgI2lmIEtNUF9NSUMKKyAgICAgICAgICAgICAgICAgICAgI2RlZmluZSBSRURVQ1RJT05fVEVBTVNJWkVfQ1VUT0ZGIDgKKyAgICAgICAgICAgICAgICAjZWxzZSAvLyBLTVBfTUlDCisgICAgICAgICAgICAgICAgICAgICNkZWZpbmUgUkVEVUNUSU9OX1RFQU1TSVpFX0NVVE9GRiA0CisgICAgICAgICAgICAgICAgI2VuZGlmIC8vIEtNUF9NSUMKKyAgICAgICAgICAgICAgICBpZiggdHJlZV9hdmFpbGFibGUgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCB0ZWFtX3NpemUgPD0gUkVEVUNUSU9OX1RFQU1TSVpFX0NVVE9GRiApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggYXRvbWljX2F2YWlsYWJsZSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBhdG9taWNfcmVkdWNlX2Jsb2NrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gVFJFRV9SRURVQ0VfQkxPQ0tfV0lUSF9SRURVQ1RJT05fQkFSUklFUjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIGF0b21pY19hdmFpbGFibGUgKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IGF0b21pY19yZWR1Y2VfYmxvY2s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgICAjZXJyb3IgIlVua25vd24gb3IgdW5zdXBwb3J0ZWQgT1MiCisgICAgICAgICAgICAjZW5kaWYgLy8gS01QX09TX0xJTlVYIHx8IEtNUF9PU19GUkVFQlNEIHx8IEtNUF9PU19XSU5ET1dTIHx8IEtNUF9PU19EQVJXSU4KKworICAgICAgICAjZWxpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfQVJNCisKKyAgICAgICAgICAgICNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisKKyAgICAgICAgICAgICAgICAvLyBiYXNpYyB0dW5pbmcKKworICAgICAgICAgICAgICAgIGlmKCBhdG9taWNfYXZhaWxhYmxlICkgeworICAgICAgICAgICAgICAgICAgICBpZiggbnVtX3ZhcnMgPD0gMiApIHsgLy8gJiYgKCB0ZWFtX3NpemUgPD0gOCApIGR1ZSB0byBmYWxzZS1zaGFyaW5nID8/PworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gYXRvbWljX3JlZHVjZV9ibG9jazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gLy8gb3RoZXJ3aXNlOiB1c2UgY3JpdGljYWwgc2VjdGlvbgorCisgICAgICAgICAgICAjZWxpZiBLTVBfT1NfREFSV0lOCisKKyAgICAgICAgICAgICAgICBpZiggYXRvbWljX2F2YWlsYWJsZSAmJiAoIG51bV92YXJzIDw9IDMgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IGF0b21pY19yZWR1Y2VfYmxvY2s7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmKCB0cmVlX2F2YWlsYWJsZSApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoICggcmVkdWNlX3NpemUgPiAoIDkgKiBzaXplb2YoIGttcF9yZWFsNjQgKSApICkgJiYgKCByZWR1Y2Vfc2l6ZSA8ICggMjAwMCAqIHNpemVvZigga21wX3JlYWw2NCApICkgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IFRSRUVfUkVEVUNFX0JMT0NLX1dJVEhfUExBSU5fQkFSUklFUjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gLy8gb3RoZXJ3aXNlOiB1c2UgY3JpdGljYWwgc2VjdGlvbgorCisgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgICNlcnJvciAiVW5rbm93biBvciB1bnN1cHBvcnRlZCBPUyIKKyAgICAgICAgICAgICNlbmRpZgorCisgICAgICAgICNlbHNlCisgICAgICAgICAgICAjZXJyb3IgIlVua25vd24gb3IgdW5zdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlIgorICAgICAgICAjZW5kaWYKKworICAgIH0KKworICAgIC8vIEtNUF9GT1JDRV9SRURVQ1RJT04KKworICAgIGlmKCBfX2ttcF9mb3JjZV9yZWR1Y3Rpb25fbWV0aG9kICE9IHJlZHVjdGlvbl9tZXRob2Rfbm90X2RlZmluZWQgKSB7CisKKyAgICAgICAgUEFDS0VEX1JFRFVDVElPTl9NRVRIT0RfVCBmb3JjZWRfcmV0dmFsOworCisgICAgICAgIGludCBhdG9taWNfYXZhaWxhYmxlLCB0cmVlX2F2YWlsYWJsZTsKKworICAgICAgICBzd2l0Y2goICggZm9yY2VkX3JldHZhbCA9IF9fa21wX2ZvcmNlX3JlZHVjdGlvbl9tZXRob2QgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgY3JpdGljYWxfcmVkdWNlX2Jsb2NrOgorICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoIGxjayApOyAgICAgICAgICAgICAgLy8gbGNrIHNob3VsZCBiZSAhPSAwCisgICAgICAgICAgICAgICAgaWYoIHRlYW1fc2l6ZSA8PSAxICkgeworICAgICAgICAgICAgICAgICAgICBmb3JjZWRfcmV0dmFsID0gZW1wdHlfcmVkdWNlX2Jsb2NrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBhdG9taWNfcmVkdWNlX2Jsb2NrOgorICAgICAgICAgICAgICAgIGF0b21pY19hdmFpbGFibGUgPSBGQVNUX1JFRFVDVElPTl9BVE9NSUNfTUVUSE9EX0dFTkVSQVRFRDsKKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKCBhdG9taWNfYXZhaWxhYmxlICk7IC8vIGF0b21pY19hdmFpbGFibGUgc2hvdWxkIGJlICE9IDAKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSB0cmVlX3JlZHVjZV9ibG9jazoKKyAgICAgICAgICAgICAgICB0cmVlX2F2YWlsYWJsZSA9IEZBU1RfUkVEVUNUSU9OX1RSRUVfTUVUSE9EX0dFTkVSQVRFRDsKKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKCB0cmVlX2F2YWlsYWJsZSApOyAgIC8vIHRyZWVfYXZhaWxhYmxlIHNob3VsZCBiZSAhPSAwCisgICAgICAgICAgICAgICAgI2lmIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgICAgICAgICAgICAgZm9yY2VkX3JldHZhbCA9IFRSRUVfUkVEVUNFX0JMT0NLX1dJVEhfUkVEVUNUSU9OX0JBUlJJRVI7CisgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVCggMCApOyAvLyAidW5zdXBwb3J0ZWQgbWV0aG9kIHNwZWNpZmllZCIKKyAgICAgICAgfQorCisgICAgICAgIHJldHZhbCA9IGZvcmNlZF9yZXR2YWw7CisgICAgfQorCisgICAgS0FfVFJBQ0UoMTAsICggInJlZHVjdGlvbiBtZXRob2Qgc2VsZWN0ZWQ9JTA4eFxuIiwgcmV0dmFsICkgKTsKKworICAgICN1bmRlZiBGQVNUX1JFRFVDVElPTl9UUkVFX01FVEhPRF9HRU5FUkFURUQKKyAgICAjdW5kZWYgRkFTVF9SRURVQ1RJT05fQVRPTUlDX01FVEhPRF9HRU5FUkFURUQKKworICAgIHJldHVybiAoIHJldHZhbCApOworfQorCisvLyB0aGlzIGZ1bmN0aW9uIGlzIGZvciB0ZXN0aW5nIHNldC9nZXQvZGV0ZXJtaW5lIHJlZHVjZSBtZXRob2QKK2ttcF9pbnQzMgorX19rbXBfZ2V0X3JlZHVjZV9tZXRob2QoIHZvaWQgKSB7CisgICAgcmV0dXJuICggKCBfX2ttcF9lbnRyeV90aHJlYWQoKSAtPiB0aC50aF9sb2NhbC5wYWNrZWRfcmVkdWN0aW9uX21ldGhvZCApID4+IDggKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfc2NoZWQuY3BwIGIvZmluYWwvcnVudGltZS9zcmMva21wX3NjaGVkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGU1YTM4Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX3NjaGVkLmNwcApAQCAtMCwwICsxLDM2NiBAQAorLyoKKyAqIGttcF9zY2hlZC5jIC0tIHN0YXRpYyBzY2hlZHVsaW5nIC0tIGl0ZXJhdGlvbiBpbml0aWFsaXphdGlvbgorICogJFJldmlzaW9uOiA0MjM1OCAkCisgKiAkRGF0ZTogMjAxMy0wNS0wNyAxMzo0MzoyNiAtMDUwMCAoVHVlLCAwNyBNYXkgMjAxMykgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvKgorICogU3RhdGljIHNjaGVkdWxpbmcgaW5pdGlhbGl6YXRpb24uCisgKgorICogTk9URTogdGVhbS0+dC50X25wcm9jIGlzIGEgY29uc3RhbnQgaW5zaWRlIG9mIGFueSBkaXNwYXRjaCBsb29wLCBob3dldmVyCisgKiAgICAgICBpdCBtYXkgY2hhbmdlIHZhbHVlcyBiZXR3ZWVuIHBhcmFsbGVsIHJlZ2lvbnMuICBfX2ttcF9tYXhfbnRoCisgKiAgICAgICBpcyB0aGUgbGFyZ2VzdCB2YWx1ZSBfX2ttcF9udGggbWF5IHRha2UsIDEgaXMgdGhlIHNtYWxsZXN0LgorICoKKyAqLworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKyNpbmNsdWRlICJrbXBfc3RyLmgiCisjaW5jbHVkZSAia21wX2Vycm9yLmgiCisKKy8vIHRlbXBsYXRlIGZvciB0eXBlIGxpbWl0cwordGVtcGxhdGU8IHR5cGVuYW1lIFQgPgorc3RydWN0IGlfbWF4bWluIHsKKyAgICBzdGF0aWMgY29uc3QgVCBteDsKKyAgICBzdGF0aWMgY29uc3QgVCBtbjsKK307Cit0ZW1wbGF0ZTw+CitzdHJ1Y3QgaV9tYXhtaW48IGludCA+IHsKKyAgICBzdGF0aWMgY29uc3QgaW50IG14ID0gMHg3ZmZmZmZmZjsKKyAgICBzdGF0aWMgY29uc3QgaW50IG1uID0gMHg4MDAwMDAwMDsKK307Cit0ZW1wbGF0ZTw+CitzdHJ1Y3QgaV9tYXhtaW48IHVuc2lnbmVkIGludCA+IHsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG14ID0gMHhmZmZmZmZmZjsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1uID0gMHgwMDAwMDAwMDsKK307Cit0ZW1wbGF0ZTw+CitzdHJ1Y3QgaV9tYXhtaW48IGxvbmcgbG9uZyA+IHsKKyAgICBzdGF0aWMgY29uc3QgbG9uZyBsb25nIG14ID0gMHg3ZmZmZmZmZmZmZmZmZmZmTEw7CisgICAgc3RhdGljIGNvbnN0IGxvbmcgbG9uZyBtbiA9IDB4ODAwMDAwMDAwMDAwMDAwMExMOworfTsKK3RlbXBsYXRlPD4KK3N0cnVjdCBpX21heG1pbjwgdW5zaWduZWQgbG9uZyBsb25nID4geworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgbXggPSAweGZmZmZmZmZmZmZmZmZmZmZMTDsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIG1uID0gMHgwMDAwMDAwMDAwMDAwMDAwTEw7Cit9OworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZkZWYgS01QX0RFQlVHCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHRlbXBsYXRlIGZvciBkZWJ1ZyBwcmludHMgc3BlY2lmaWNhdGlvbiAoIGQsIHUsIGxsZCwgbGx1ICkKKyAgICBjaGFyIGNvbnN0ICogdHJhaXRzX3Q8IGludCA+OjpzcGVjID0gImQiOworICAgIGNoYXIgY29uc3QgKiB0cmFpdHNfdDwgdW5zaWduZWQgaW50ID46OnNwZWMgPSAidSI7CisgICAgY2hhciBjb25zdCAqIHRyYWl0c190PCBsb25nIGxvbmcgPjo6c3BlYyA9ICJsbGQiOworICAgIGNoYXIgY29uc3QgKiB0cmFpdHNfdDwgdW5zaWduZWQgbG9uZyBsb25nID46OnNwZWMgPSAibGx1IjsKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2VuZGlmCisKK3RlbXBsYXRlPCB0eXBlbmFtZSBUID4KK3N0YXRpYyB2b2lkCitfX2ttcF9mb3Jfc3RhdGljX2luaXQoCisgICAgaWRlbnRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgKmxvYywKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3RpZCwKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZWR0eXBlLAorICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICpwbGFzdGl0ZXIsCisgICAgVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBsb3dlciwKKyAgICBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHVwcGVyLAorICAgIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnNpZ25lZF90ICpwc3RyaWRlLAorICAgIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnNpZ25lZF90ICBpbmNyLAorICAgIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnNpZ25lZF90ICBjaHVuaworKSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+Ojp1bnNpZ25lZF90ICBVVDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnNpZ25lZF90ICAgIFNUOworICAgIC8qICB0aGlzIGFsbCBoYXMgdG8gYmUgY2hhbmdlZCBiYWNrIHRvIFRJRCBhbmQgc3VjaC4uICovCisgICAgcmVnaXN0ZXIga21wX2ludDMyICAgZ3RpZCA9IGdsb2JhbF90aWQ7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiAgdGlkOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgIG50aDsKKyAgICByZWdpc3RlciBVVCAgICAgICAgICB0cmlwX2NvdW50OworICAgIHJlZ2lzdGVyIGttcF90ZWFtX3QgKnRlYW07CisKKyAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX2Zvcl9zdGF0aWNfaW5pdCBjYWxsZWQgKCVkKVxuIiwgZ2xvYmFsX3RpZCkpOworICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAiX19rbXBjX2Zvcl9zdGF0aWNfaW5pdDogVCMlJWQgc2NoZWQ9JSVkIGxpdGVyPSUlZCBpdGVyPSglJSVzLCIgXAorICAgICAgICAgICAgIiAlJSVzLCAlJSVzKSBpbmNyPSUlJXMgY2h1bms9JSUlcyBzaWduZWQ/PCVzPlxuIiwKKyAgICAgICAgICAgIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBTVCA+OjpzcGVjLAorICAgICAgICAgICAgdHJhaXRzX3Q8IFNUID46OnNwZWMsIHRyYWl0c190PCBTVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjICk7CisgICAgICAgIEtEX1RSQUNFKDEwMCwgKCBidWZmLCBnbG9iYWxfdGlkLCBzY2hlZHR5cGUsICpwbGFzdGl0ZXIsCisgICAgICAgICAgICAqcGxvd2VyLCAqcHVwcGVyLCAqcHN0cmlkZSwgaW5jciwgY2h1bmsgKSApOworICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICB9CisgICAgI2VuZGlmCisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgX19rbXBfcHVzaF93b3Jrc2hhcmUoIGdsb2JhbF90aWQsIGN0X3BkbywgbG9jICk7CisgICAgICAgIGlmICggaW5jciA9PSAwICkgeworICAgICAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0KCBrbXBfaTE4bl9tc2dfQ25zTG9vcEluY3JaZXJvUHJvaGliaXRlZCwgY3RfcGRvLCBsb2MgKTsKKworICAgICAgICB9CisgICAgfQorICAgIC8qIHNwZWNpYWwgaGFuZGxpbmcgZm9yIHplcm8tdHJpcCBsb29wcyAqLworICAgIGlmICggaW5jciA+IDAgPyAoKnB1cHBlciA8ICpwbG93ZXIpIDogKCpwbG93ZXIgPCAqcHVwcGVyKSApIHsKKyAgICAgICAgKnBsYXN0aXRlciA9IEZBTFNFOworICAgICAgICAvKiBsZWF2ZSBwdXBwZXIgYW5kIHBsb3dlciBzZXQgdG8gZW50aXJlIGl0ZXJhdGlvbiBzcGFjZSAqLworICAgICAgICAqcHN0cmlkZSA9IGluY3I7ICAgLyogdmFsdWUgc2hvdWxkIG5ldmVyIGJlIHVzZWQgKi8KKwkvLyAgICAgICAgKnBsb3dlciA9ICpwdXBwZXIgLSBpbmNyOyAgIC8vIGxldCBjb21waWxlciBieXBhc3MgdGhlIGlsbGVnYWwgbG9vcCAobGlrZSBmb3IoaT0xO2k8MTA7aS0tKSkgIFRISVMgTElORSBDQVVTRUQgc2hhcGUyRi9oX3Rlc3RzXzEuZiBUTyBIQVZFIEEgRkFJTFVSRSBPTiBBIFpFUk8tVFJJUCBMT09QIChsb3dlcj0xLFwKKwkgIHVwcGVyPTAsc3RyaWRlPTEpIC0gSlBIIEp1bmUgMjMsIDIwMDkuCisgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICJfX2ttcGNfZm9yX3N0YXRpY19pbml0OihaRVJPIFRSSVApIGxpdGVyPSUlZCBsb3dlcj0lJSVzIHVwcGVyPSUlJXMgc3RyaWRlID0gJSUlcyBzaWduZWQ/PCVzPiwgbG9jID0gJSVzXG4iLAorICAgICAgICAgICAgICAgIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBTVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjICk7CisgICAgICAgICAgICBLRF9UUkFDRSgxMDAsICggYnVmZiwgKnBsYXN0aXRlciwgKnBsb3dlciwgKnB1cHBlciwgKnBzdHJpZGUsIGxvYy0+cHNvdXJjZSApICk7CisgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgfQorICAgICAgICAjZW5kaWYKKyAgICAgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY19mb3Jfc3RhdGljX2luaXQ6IFQjJWQgcmV0dXJuXG4iLCBnbG9iYWxfdGlkICkgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgICNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGlmICggc2NoZWR0eXBlID4ga21wX29yZF91cHBlciApIHsKKyAgICAgICAgLy8gd2UgYXJlIGluIERJU1RSSUJVVEUgY29uc3RydWN0CisgICAgICAgIHNjaGVkdHlwZSArPSBrbXBfc2NoX3N0YXRpYyAtIGttcF9kaXN0cmlidXRlX3N0YXRpYzsgICAgICAvLyBBQzogY29udmVydCB0byB1c3VhbCBzY2hlZHVsZSB0eXBlCisgICAgICAgIHRpZCAgPSBfX2ttcF90aHJlYWRzWyBndGlkIF0tPnRoLnRoX3RlYW0tPnQudF9tYXN0ZXJfdGlkOworICAgICAgICB0ZWFtID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF90ZWFtLT50LnRfcGFyZW50OworICAgIH0gZWxzZQorICAgICNlbmRpZgorICAgIHsKKyAgICAgICAgdGlkICA9IF9fa21wX3RpZF9mcm9tX2d0aWQoIGdsb2JhbF90aWQgKTsKKyAgICAgICAgdGVhbSA9IF9fa21wX3RocmVhZHNbIGd0aWQgXS0+dGgudGhfdGVhbTsKKyAgICB9CisKKyAgICAvKiBkZXRlcm1pbmUgaWYgImZvciIgbG9vcCBpcyBhbiBhY3RpdmUgd29ya3NoYXJpbmcgY29uc3RydWN0ICovCisgICAgaWYgKCB0ZWFtIC0+IHQudF9zZXJpYWxpemVkICkgeworICAgICAgICAvKiBzZXJpYWxpemVkIHBhcmFsbGVsLCBlYWNoIHRocmVhZCBleGVjdXRlcyB3aG9sZSBpdGVyYXRpb24gc3BhY2UgKi8KKyAgICAgICAgKnBsYXN0aXRlciA9IFRSVUU7CisgICAgICAgIC8qIGxlYXZlIHB1cHBlciBhbmQgcGxvd2VyIHNldCB0byBlbnRpcmUgaXRlcmF0aW9uIHNwYWNlICovCisgICAgICAgICpwc3RyaWRlID0gKGluY3IgPiAwKSA/ICgqcHVwcGVyIC0gKnBsb3dlciArIDEpIDogKC0oKnBsb3dlciAtICpwdXBwZXIgKyAxKSk7CisKKyAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgIl9fa21wY19mb3Jfc3RhdGljX2luaXQ6IChzZXJpYWwpIGxpdGVyPSUlZCBsb3dlcj0lJSVzIHVwcGVyPSUlJXMgc3RyaWRlID0gJSUlc1xuIiwKKyAgICAgICAgICAgICAgICB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgU1QgPjo6c3BlYyApOworICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIGJ1ZmYsICpwbGFzdGl0ZXIsICpwbG93ZXIsICpwdXBwZXIsICpwc3RyaWRlICkgKTsKKyAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICB9CisgICAgICAgICNlbmRpZgorICAgICAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX2Zvcl9zdGF0aWNfaW5pdDogVCMlZCByZXR1cm5cbiIsIGdsb2JhbF90aWQgKSApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG50aCA9IHRlYW0tPnQudF9ucHJvYzsKKyAgICBpZiAoIG50aCA9PSAxICkgeworICAgICAgICAqcGxhc3RpdGVyID0gVFJVRTsKKworICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAiX19rbXBjX2Zvcl9zdGF0aWNfaW5pdDogKHNlcmlhbCkgbGl0ZXI9JSVkIGxvd2VyPSUlJXMgdXBwZXI9JSUlcyBzdHJpZGUgPSAlJSVzXG4iLAorICAgICAgICAgICAgICAgIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBTVCA+OjpzcGVjICk7CisgICAgICAgICAgICBLRF9UUkFDRSgxMDAsICggYnVmZiwgKnBsYXN0aXRlciwgKnBsb3dlciwgKnB1cHBlciwgKnBzdHJpZGUgKSApOworICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgIH0KKyAgICAgICAgI2VuZGlmCisgICAgICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfZm9yX3N0YXRpY19pbml0OiBUIyVkIHJldHVyblxuIiwgZ2xvYmFsX3RpZCApICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBjb21wdXRlIHRyaXAgY291bnQgKi8KKyAgICBpZiAoIGluY3IgPT0gMSApIHsKKyAgICAgICAgdHJpcF9jb3VudCA9ICpwdXBwZXIgLSAqcGxvd2VyICsgMTsKKyAgICB9IGVsc2UgaWYgKGluY3IgPT0gLTEpIHsKKyAgICAgICAgdHJpcF9jb3VudCA9ICpwbG93ZXIgLSAqcHVwcGVyICsgMTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIGluY3IgPiAxICkgeworICAgICAgICAgICAgdHJpcF9jb3VudCA9ICgqcHVwcGVyIC0gKnBsb3dlcikgLyBpbmNyICsgMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyaXBfY291bnQgPSAoKnBsb3dlciAtICpwdXBwZXIpIC8gKCAtaW5jciApICsgMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgLyogdHJpcGNvdW50IG92ZXJmbG93PyAqLworICAgICAgICBpZiAoIHRyaXBfY291bnQgPT0gMCAmJiAqcHVwcGVyICE9ICpwbG93ZXIgKSB7CisgICAgICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QoIGttcF9pMThuX21zZ19DbnNJdGVyYXRpb25SYW5nZVRvb0xhcmdlLCBjdF9wZG8sIGxvYyApOworICAgICAgICB9CisgICAgfQorCisgICAgLyogY29tcHV0ZSByZW1haW5pbmcgcGFyYW1ldGVycyAqLworICAgIHN3aXRjaCAoIHNjaGVkdHlwZSApIHsKKyAgICBjYXNlIGttcF9zY2hfc3RhdGljOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHRyaXBfY291bnQgPCBudGggKSB7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCgKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RhdGljID09IGttcF9zY2hfc3RhdGljX2dyZWVkeSB8fCBcCisgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0YXRpYyA9PSBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZAorICAgICAgICAgICAgICAgICk7IC8vIFVua25vd24gc3RhdGljIHNjaGVkdWxpbmcgdHlwZS4KKyAgICAgICAgICAgICAgICBpZiAoIHRpZCA8IHRyaXBfY291bnQgKSB7CisgICAgICAgICAgICAgICAgICAgICpwdXBwZXIgPSAqcGxvd2VyID0gKnBsb3dlciArIHRpZCAqIGluY3I7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgKnBsb3dlciA9ICpwdXBwZXIgKyBpbmNyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqcGxhc3RpdGVyID0gKCB0aWQgPT0gdHJpcF9jb3VudCAtIDEgKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9zdGF0aWMgPT0ga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQgKSB7CisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIFVUIHNtYWxsX2NodW5rID0gdHJpcF9jb3VudCAvIG50aDsKKyAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgVVQgZXh0cmFzID0gdHJpcF9jb3VudCAlIG50aDsKKyAgICAgICAgICAgICAgICAgICAgKnBsb3dlciArPSBpbmNyICogKCB0aWQgKiBzbWFsbF9jaHVuayArICggdGlkIDwgZXh0cmFzID8gdGlkIDogZXh0cmFzICkgKTsKKyAgICAgICAgICAgICAgICAgICAgKnB1cHBlciA9ICpwbG93ZXIgKyBzbWFsbF9jaHVuayAqIGluY3IgLSAoIHRpZCA8IGV4dHJhcyA/IDAgOiBpbmNyICk7CisgICAgICAgICAgICAgICAgICAgICpwbGFzdGl0ZXIgPSAoIHRpZCA9PSBudGggLSAxICk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgVCBiaWdfY2h1bmtfaW5jX2NvdW50ID0gKCB0cmlwX2NvdW50L250aCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKCB0cmlwX2NvdW50ICUgbnRoICkgPyAxIDogMCkgKSAqIGluY3I7CisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIFQgb2xkX3VwcGVyID0gKnB1cHBlcjsKKworICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9zdGF0aWMgPT0ga21wX3NjaF9zdGF0aWNfZ3JlZWR5ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBVbmtub3duIHN0YXRpYyBzY2hlZHVsaW5nIHR5cGUuCisKKyAgICAgICAgICAgICAgICAgICAgKnBsb3dlciArPSB0aWQgKiBiaWdfY2h1bmtfaW5jX2NvdW50OworICAgICAgICAgICAgICAgICAgICAqcHVwcGVyID0gKnBsb3dlciArIGJpZ19jaHVua19pbmNfY291bnQgLSBpbmNyOworICAgICAgICAgICAgICAgICAgICBpZiAoIGluY3IgPiAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAqcHVwcGVyIDwgKnBsb3dlciApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHVwcGVyID0gaV9tYXhtaW48IFQgPjo6bXg7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAqcGxhc3RpdGVyID0gKnBsb3dlciA8PSBvbGRfdXBwZXIgJiYgKnB1cHBlciA+IG9sZF91cHBlciAtIGluY3I7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICpwdXBwZXIgPiBvbGRfdXBwZXIgKSAqcHVwcGVyID0gb2xkX3VwcGVyOyAvLyB0cmFja2VyIEM3MzI1OAorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAqcHVwcGVyID4gKnBsb3dlciApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHVwcGVyID0gaV9tYXhtaW48IFQgPjo6bW47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAqcGxhc3RpdGVyID0gKnBsb3dlciA+PSBvbGRfdXBwZXIgJiYgKnB1cHBlciA8IG9sZF91cHBlciAtIGluY3I7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICpwdXBwZXIgPCBvbGRfdXBwZXIgKSAqcHVwcGVyID0gb2xkX3VwcGVyOyAvLyB0cmFja2VyIEM3MzI1OAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBjYXNlIGttcF9zY2hfc3RhdGljX2NodW5rZWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlZ2lzdGVyIFQgc3BhbjsKKyAgICAgICAgICAgIGlmICggY2h1bmsgPCAxICkgeworICAgICAgICAgICAgICAgIGNodW5rID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwYW4gPSBjaHVuayAqIGluY3I7CisgICAgICAgICAgICAqcHN0cmlkZSA9IHNwYW4gKiBudGg7CisgICAgICAgICAgICAqcGxvd2VyID0gKnBsb3dlciArIChzcGFuICogdGlkKTsKKyAgICAgICAgICAgICpwdXBwZXIgPSAqcGxvd2VyICsgc3BhbiAtIGluY3I7CisgICAgICAgICAgICAvKiBUT0RPOiBpcyB0aGUgZm9sbG93aW5nIGxpbmUgYSBidWc/ICBTaG91bGRuJ3QgaXQgYmUgcGxhc3RpdGVyIGluc3RlYWQgb2YgKnBsYXN0aXRlciA/ICovCisgICAgICAgICAgICBpZiAoKnBsYXN0aXRlcikgeyAvKiBvbmx5IGNhbGN1bGF0ZSB0aGlzIGlmIGl0IHdhcyByZXF1ZXN0ZWQgKi8KKyAgICAgICAgICAgICAgICBrbXBfaW50MzIgbGFzdHRpZCA9ICgodHJpcF9jb3VudCAtIDEpIC8gKCBVVCApY2h1bmspICUgbnRoOworICAgICAgICAgICAgICAgICpwbGFzdGl0ZXIgPSAodGlkID09IGxhc3R0aWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICBLTVBfQVNTRVJUMiggMCwgIl9fa21wY19mb3Jfc3RhdGljX2luaXQ6IHVua25vd24gc2NoZWR1bGluZyB0eXBlIiApOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgeworICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgIl9fa21wY19mb3Jfc3RhdGljX2luaXQ6IGxpdGVyPSUlZCBsb3dlcj0lJSVzIHVwcGVyPSUlJXMgc3RyaWRlID0gJSUlcyBzaWduZWQ/PCVzPlxuIiwKKyAgICAgICAgICAgIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBTVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjICk7CisgICAgICAgIEtEX1RSQUNFKDEwMCwgKCBidWZmLCAqcGxhc3RpdGVyLCAqcGxvd2VyLCAqcHVwcGVyLCAqcHN0cmlkZSApICk7CisgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgIH0KKyAgICAjZW5kaWYKKyAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX2Zvcl9zdGF0aWNfaW5pdDogVCMlZCByZXR1cm5cbiIsIGdsb2JhbF90aWQgKSApOworICAgIHJldHVybjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZXh0ZXJuICJDIiB7CisKKy8qIQorQGluZ3JvdXAgV09SS19TSEFSSU5HCitAcGFyYW0gICAgbG9jICAgICAgIFNvdXJjZSBjb2RlIGxvY2F0aW9uCitAcGFyYW0gICAgZ3RpZCAgICAgIEdsb2JhbCB0aHJlYWQgaWQgb2YgdGhpcyB0aHJlYWQKK0BwYXJhbSAgICBzY2hlZHR5cGUgIFNjaGVkdWxpbmcgdHlwZQorQHBhcmFtICAgIHBsYXN0aXRlciBQb2ludGVyIHRvIHRoZSAibGFzdCBpdGVyYXRpb24iIGZsYWcKK0BwYXJhbSAgICBwbG93ZXIgICAgUG9pbnRlciB0byB0aGUgbG93ZXIgYm91bmQKK0BwYXJhbSAgICBwdXBwZXIgICAgUG9pbnRlciB0byB0aGUgdXBwZXIgYm91bmQKK0BwYXJhbSAgICBwc3RyaWRlICAgUG9pbnRlciB0byB0aGUgc3RyaWRlCitAcGFyYW0gICAgaW5jciAgICAgIExvb3AgaW5jcmVtZW50CitAcGFyYW0gICAgY2h1bmsgICAgIFRoZSBjaHVuayBzaXplCisKK0VhY2ggb2YgdGhlIGZvdXIgZnVuY3Rpb25zIGhlcmUgYXJlIGlkZW50aWNhbCBhcGFydCBmcm9tIHRoZSBhcmd1bWVudCB0eXBlcy4KKworVGhlIGZ1bmN0aW9ucyBjb21wdXRlIHRoZSB1cHBlciBhbmQgbG93ZXIgYm91bmRzIGFuZCBzdHJpZGUgdG8gYmUgdXNlZCBmb3IgdGhlIHNldCBvZiBpdGVyYXRpb25zCit0byBiZSBleGVjdXRlZCBieSB0aGUgY3VycmVudCB0aHJlYWQgZnJvbSB0aGUgc3RhdGljYWxseSBzY2hlZHVsZWQgbG9vcCB0aGF0IGlzIGRlc2NyaWJlZCBieSB0aGUKK2luaXRpYWwgdmFsdWVzIG9mIHRoZSBicm91bmQsIHN0cmlkZSwgaW5jcmVtZW50IGFuZCBjaHVuayBzaXplLgorCitAeworKi8KK3ZvaWQKK19fa21wY19mb3Jfc3RhdGljX2luaXRfNCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyIHNjaGVkdHlwZSwga21wX2ludDMyICpwbGFzdGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyICpwbG93ZXIsIGttcF9pbnQzMiAqcHVwcGVyLAorICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiAqcHN0cmlkZSwga21wX2ludDMyIGluY3IsIGttcF9pbnQzMiBjaHVuayApCit7CisgICAgX19rbXBfZm9yX3N0YXRpY19pbml0PCBrbXBfaW50MzIgPigKKyAgICAgICAgICAgICAgICAgICAgICBsb2MsIGd0aWQsIHNjaGVkdHlwZSwgcGxhc3RpdGVyLCBwbG93ZXIsIHB1cHBlciwgcHN0cmlkZSwgaW5jciwgY2h1bmsgKTsKK30KKworLyohCisgU2VlIEByZWYgX19rbXBjX2Zvcl9zdGF0aWNfaW5pdF80CisgKi8KK3ZvaWQKK19fa21wY19mb3Jfc3RhdGljX2luaXRfNHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiBzY2hlZHR5cGUsIGttcF9pbnQzMiAqcGxhc3RpdGVyLAorICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50MzIgKnBsb3dlciwga21wX3VpbnQzMiAqcHVwcGVyLAorICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiAqcHN0cmlkZSwga21wX2ludDMyIGluY3IsIGttcF9pbnQzMiBjaHVuayApCit7CisgICAgX19rbXBfZm9yX3N0YXRpY19pbml0PCBrbXBfdWludDMyID4oCisgICAgICAgICAgICAgICAgICAgICAgbG9jLCBndGlkLCBzY2hlZHR5cGUsIHBsYXN0aXRlciwgcGxvd2VyLCBwdXBwZXIsIHBzdHJpZGUsIGluY3IsIGNodW5rICk7Cit9CisKKy8qIQorIFNlZSBAcmVmIF9fa21wY19mb3Jfc3RhdGljX2luaXRfNAorICovCit2b2lkCitfX2ttcGNfZm9yX3N0YXRpY19pbml0XzgoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiBzY2hlZHR5cGUsIGttcF9pbnQzMiAqcGxhc3RpdGVyLAorICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCAqcGxvd2VyLCBrbXBfaW50NjQgKnB1cHBlciwKKyAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgKnBzdHJpZGUsIGttcF9pbnQ2NCBpbmNyLCBrbXBfaW50NjQgY2h1bmsgKQoreworICAgIF9fa21wX2Zvcl9zdGF0aWNfaW5pdDwga21wX2ludDY0ID4oCisgICAgICAgICAgICAgICAgICAgICAgbG9jLCBndGlkLCBzY2hlZHR5cGUsIHBsYXN0aXRlciwgcGxvd2VyLCBwdXBwZXIsIHBzdHJpZGUsIGluY3IsIGNodW5rICk7Cit9CisKKy8qIQorIFNlZSBAcmVmIF9fa21wY19mb3Jfc3RhdGljX2luaXRfNAorICovCit2b2lkCitfX2ttcGNfZm9yX3N0YXRpY19pbml0Xzh1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgc2NoZWR0eXBlLCBrbXBfaW50MzIgKnBsYXN0aXRlciwKKyAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDY0ICpwbG93ZXIsIGttcF91aW50NjQgKnB1cHBlciwKKyAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgKnBzdHJpZGUsIGttcF9pbnQ2NCBpbmNyLCBrbXBfaW50NjQgY2h1bmsgKQoreworICAgIF9fa21wX2Zvcl9zdGF0aWNfaW5pdDwga21wX3VpbnQ2NCA+KAorICAgICAgICAgICAgICAgICAgICAgIGxvYywgZ3RpZCwgc2NoZWR0eXBlLCBwbGFzdGl0ZXIsIHBsb3dlciwgcHVwcGVyLCBwc3RyaWRlLCBpbmNyLCBjaHVuayApOworfQorLyohCitAfQorKi8KKworfSAvLyBleHRlcm4gIkMiCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zZXR0aW5ncy5jIGIvZmluYWwvcnVudGltZS9zcmMva21wX3NldHRpbmdzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg1Njc4ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zZXR0aW5ncy5jCkBAIC0wLDAgKzEsNTIzOSBAQAorLyoKKyAqIGttcF9zZXR0aW5ncy5jIC0tIEluaXRpYWxpemUgZW52aXJvbm1lbnQgdmFyaWFibGVzCisgKiAkUmV2aXNpb246IDQyODE2ICQKKyAqICREYXRlOiAyMDEzLTExLTExIDE1OjMzOjM3IC0wNjAwIChNb24sIDExIE5vdiAyMDEzKSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfd3JhcHBlcl9nZXRwaWQuaCIKKyNpbmNsdWRlICJrbXBfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJrbXBfYXRvbWljLmgiCisjaW5jbHVkZSAia21wX2l0dC5oIgorI2luY2x1ZGUgImttcF9zdHIuaCIKKyNpbmNsdWRlICJrbXBfc2V0dGluZ3MuaCIKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorI2luY2x1ZGUgImttcF9pby5oIgorCisKK3N0YXRpYyBpbnQgX19rbXBfZW52X2lzRGVmaW5lZCggY2hhciBjb25zdCAqIG5hbWUgKTsKK3N0YXRpYyBpbnQgX19rbXBfZW52X3RvUHJpbnQoIGNoYXIgY29uc3QgKiBuYW1lLCBpbnQgZmxhZyApOworCitib29sIF9fa21wX2Vudl9mb3JtYXQgPSAwOyAvLyAwIC0gb2xkIGZvcm1hdDsgMSAtIG5ldyBmb3JtYXQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhlbHBlciBzdHJpbmcgZnVuY3Rpb25zLiBTdWJqZWN0IHRvIG1vdmUgdG8ga21wX3N0ci4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGRvdWJsZQorX19rbXBfY29udmVydF90b19kb3VibGUoIGNoYXIgY29uc3QgKiBzICkKK3sKKyAgICBkb3VibGUgcmVzdWx0OworCisgICAgaWYgKCBzc2NhbmYoIHMsICIlbGYiLCAmcmVzdWx0ICkgPCAxICkgeworICAgICAgICByZXN1bHQgPSAwLjA7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludAorX19rbXBfcmVhZHN0cl93aXRoX3NlbnRpbmVsKGNoYXIgKmRlc3QsIGNoYXIgY29uc3QgKiBzcmMsIHNpemVfdCBsZW4sIGNoYXIgc2VudGluZWwpIHsKKyAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgaWYgKCgqc3JjID09ICdcMCcpIHx8ICgqc3JjID09IHNlbnRpbmVsKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgKihkZXN0KyspID0gKihzcmMrKyk7CisgICAgfQorICAgICpkZXN0ID0gJ1wwJzsKKyAgICByZXR1cm4gaTsKK30KKworc3RhdGljIGludAorX19rbXBfbWF0Y2hfd2l0aF9zZW50aW5lbCggY2hhciBjb25zdCAqIGEsIGNoYXIgY29uc3QgKiBiLCBzaXplX3QgbGVuLCBjaGFyIHNlbnRpbmVsICkgeworICAgIHNpemVfdCBsID0gMDsKKworICAgIGlmKGEgPT0gTlVMTCkKKyAgICAgICAgYSA9ICIiOworICAgIGlmKGIgPT0gTlVMTCkKKyAgICAgICAgYiA9ICIiOworICAgIHdoaWxlKCphICYmICpiICYmICpiICE9IHNlbnRpbmVsKSB7CisgICAgICAgIGNoYXIgY2EgPSAqYSwgY2IgPSAqYjsKKworICAgICAgICBpZihjYSA+PSAnYScgJiYgY2EgPD0gJ3onKQorICAgICAgICAgICAgY2EgLT0gJ2EnIC0gJ0EnOworICAgICAgICBpZihjYiA+PSAnYScgJiYgY2IgPD0gJ3onKQorICAgICAgICAgICAgY2IgLT0gJ2EnIC0gJ0EnOworICAgICAgICBpZihjYSAhPSBjYikKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgKytsOworICAgICAgICArK2E7CisgICAgICAgICsrYjsKKyAgICB9CisgICAgcmV0dXJuIGwgPj0gbGVuOworfQorCisvLworLy8gRXhwZWN0ZWQgdXNhZ2U6CisvLyAgICAgdG9rZW4gaXMgdGhlIHRva2VuIHRvIGNoZWNrIGZvci4KKy8vICAgICBidWYgaXMgdGhlIHN0cmluZyBiZWluZyBwYXJzZWQuCisvLyAgICAgKmVuZCByZXR1cm5zIHRoZSBjaGFyIGFmdGVyIHRoZSBlbmQgb2YgdGhlIHRva2VuLgorLy8gICAgICAgIGl0IGlzIG5vdCBtb2RpZmllZCB1bmxlc3MgYSBtYXRjaCBvY2N1cnMuCisvLworLy8KKy8vIEV4YW1wbGUgMToKKy8vCisvLyAgICAgaWYgKF9fa21wX21hdGNoX3N0cigidG9rZW4iLCBidWYsICplbmQpIHsKKy8vICAgICAgICAgPGRvIHNvbWV0aGluZz4KKy8vICAgICAgICAgYnVmID0gZW5kOworLy8gICAgIH0KKy8vCisvLyAgRXhhbXBsZSAyOgorLy8KKy8vICAgICBpZiAoX19rbXBfbWF0Y2hfc3RyKCJ0b2tlbiIsIGJ1ZiwgKmVuZCkgeworLy8gICAgICAgICBjaGFyICpzYXZlID0gKiplbmQ7CisvLyAgICAgICAgICoqZW5kID0gc2VudGluZWw7CisvLyAgICAgICAgIDx1c2UgYW55IG9mIHRoZSBfX2ttcCpfd2l0aF9zZW50aW5lbCgpIGZ1bmN0aW9ucz4KKy8vICAgICAgICAgKiplbmQgPSBzYXZlOworLy8gICAgICAgICBidWYgPSBlbmQ7CisvLyAgICAgfQorLy8KKworc3RhdGljIGludAorX19rbXBfbWF0Y2hfc3RyKCBjaGFyIGNvbnN0ICp0b2tlbiwgY2hhciBjb25zdCAqYnVmLCBjb25zdCBjaGFyICoqZW5kKSB7CisKKyAgICBLTVBfQVNTRVJUKHRva2VuICE9IE5VTEwpOworICAgIEtNUF9BU1NFUlQoYnVmICE9IE5VTEwpOworICAgIEtNUF9BU1NFUlQoZW5kICE9IE5VTEwpOworCisgICAgd2hpbGUgKCp0b2tlbiAmJiAqYnVmKSB7CisgICAgICAgIGNoYXIgY3QgPSAqdG9rZW4sIGNiID0gKmJ1ZjsKKworICAgICAgICBpZihjdCA+PSAnYScgJiYgY3QgPD0gJ3onKQorICAgICAgICAgICAgY3QgLT0gJ2EnIC0gJ0EnOworICAgICAgICBpZihjYiA+PSAnYScgJiYgY2IgPD0gJ3onKQorICAgICAgICAgICAgY2IgLT0gJ2EnIC0gJ0EnOworICAgICAgICBpZiAoY3QgIT0gY2IpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICsrdG9rZW47CisgICAgICAgICsrYnVmOworICAgIH0KKyAgICBpZiAoKnRva2VuKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgKmVuZCA9IGJ1ZjsKKyAgICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGNoYXIgKgorX19rbXBfc3RyaXBfcXVvdGVzKCBjaGFyICp0YXJnZXQsIGludCBsZW4pIHsKKyAgICBjaGFyICplbmQgPSB0YXJnZXQgKyBsZW4gLSAxOworCisgICAgd2hpbGUoKnRhcmdldCA9PSAnIicgfHwgKnRhcmdldCA9PSAnXCcnKSB7CisgICAgICAgIGlmKGVuZCA8PSB0YXJnZXQgfHwgKCplbmQgIT0gJyInICYmICplbmQgIT0gJ1wnJykpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgKmVuZCA9IDA7CisgICAgICAgIC0tZW5kOworICAgICAgICAqdGFyZ2V0ID0gMDsKKyAgICAgICAgKyt0YXJnZXQ7CisgICAgfQorICAgIHJldHVybiB0YXJnZXQ7Cit9CisKKworc3RhdGljIHNpemVfdAorX19rbXBfcm91bmQ0ayggc2l6ZV90IHNpemUgKSB7CisgICAgc2l6ZV90IF80ayA9IDQgKiAxMDI0OworICAgIGlmICggc2l6ZSAmICggXzRrIC0gMSApICkgeworICAgICAgICBzaXplICY9IH4gKCBfNGsgLSAxICk7CisgICAgICAgIGlmICggc2l6ZSA8PSBLTVBfU0laRV9UX01BWCAtIF80ayApIHsKKyAgICAgICAgICAgIHNpemUgKz0gXzRrOyAgICAvLyBSb3VuZCB1cCBpZiB0aGVyZSBpcyBubyBvdmVyZmxvdy4KKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBpZgorICAgIHJldHVybiBzaXplOworfSAvLyBfX2ttcF9yb3VuZDRrCisKKworc3RhdGljIGludAorX19rbXBfY29udmVydF90b19zZWNvbmRzKCBjaGFyIGNvbnN0ICogZGF0YSApCit7CisgICAgaW50IG52YWx1ZXMsIHZhbHVlLCBmYWN0b3I7CisgICAgY2hhciBtdWx0LCBleHRyYTsKKworICAgIGlmIChkYXRhID09IE5VTEwpIHJldHVybiAoMCk7CisgICAgdmFsdWUgPSAwOworICAgIG11bHQgPSAnXDAnOworICAgIG52YWx1ZXMgPSBzc2NhbmYgKGRhdGEsICIlZCVjJWMiLCAmdmFsdWUsICZtdWx0LCAmZXh0cmEpOworICAgIGlmIChudmFsdWVzIDwgMSkgcmV0dXJuICgwKTsKKyAgICBpZiAobnZhbHVlcyA9PSAxKSBtdWx0ID0gJ1wwJzsKKyAgICBpZiAobnZhbHVlcyA9PSAzKSByZXR1cm4gKC0xKTsKKworICAgIHN3aXRjaCAobXVsdCkgeworICAgIGNhc2UgJ3MnOiBjYXNlICdTJzoKKyAgICAgICAgZmFjdG9yID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnXDAnOgorICAgICAgICBmYWN0b3IgPSA2MDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnbSc6IGNhc2UgJ00nOgorICAgICAgICBmYWN0b3IgPSA2MDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnaCc6IGNhc2UgJ0gnOgorICAgICAgICBmYWN0b3IgPSA2MCAqIDYwOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdkJzogY2FzZSAnRCc6CisgICAgICAgIGZhY3RvciA9IDI0ICogNjAgKiA2MDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuICgtMSk7CisgICAgfQorCisgICAgaWYgKHZhbHVlID4gKElOVF9NQVggLyBmYWN0b3IpKQorICAgICAgICB2YWx1ZSA9IElOVF9NQVg7CisgICAgZWxzZQorICAgICAgICB2YWx1ZSAqPSBmYWN0b3I7CisKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKKy8qCisgICAgSGVyZSwgbXVsdGlwbGllcnMgYXJlIGxpa2UgX19rbXBfY29udmVydF90b19zZWNvbmRzLCBidXQgZmxvYXRpbmctcG9pbnQKKyAgICB2YWx1ZXMgYXJlIGFsbG93ZWQsIGFuZCB0aGUgcmV0dXJuIHZhbHVlIGlzIGluIG1pbGxpc2Vjb25kcy4gIFRoZSBkZWZhdWx0CisgICAgbXVsdGlwbGllciBpcyBtaWxsaXNlY29uZHMuICBSZXR1cm5zIElOVF9NQVggb25seSBpZiB0aGUgdmFsdWUgc3BlY2lmaWVkCisgICAgbWF0Y2hlcyAiaW5maW5pdCoiLiAgUmV0dXJucyAtMSBpZiBzcGVjaWZpZWQgc3RyaW5nIGlzIGludmFsaWQuCisqLworaW50CitfX2ttcF9jb252ZXJ0X3RvX21pbGxpc2Vjb25kcyggY2hhciBjb25zdCAqIGRhdGEgKQoreworICAgIGludCByZXQsIG52YWx1ZXMsIGZhY3RvcjsKKyAgICBjaGFyIG11bHQsIGV4dHJhOworICAgIGRvdWJsZSB2YWx1ZTsKKworICAgIGlmIChkYXRhID09IE5VTEwpIHJldHVybiAoLTEpOworICAgIGlmICggX19rbXBfc3RyX21hdGNoKCAiaW5maW5pdCIsIC0xLCBkYXRhKSkgcmV0dXJuIChJTlRfTUFYKTsKKyAgICB2YWx1ZSA9IChkb3VibGUpIDAuMDsKKyAgICBtdWx0ID0gJ1wwJzsKKyAgICBudmFsdWVzID0gc3NjYW5mIChkYXRhLCAiJWxmJWMlYyIsICZ2YWx1ZSwgJm11bHQsICZleHRyYSk7CisgICAgaWYgKG52YWx1ZXMgPCAxKSByZXR1cm4gKC0xKTsKKyAgICBpZiAobnZhbHVlcyA9PSAxKSBtdWx0ID0gJ1wwJzsKKyAgICBpZiAobnZhbHVlcyA9PSAzKSByZXR1cm4gKC0xKTsKKworICAgIGlmICh2YWx1ZSA8IDApICAgIHJldHVybiAoLTEpOworCisgICAgc3dpdGNoIChtdWx0KSB7CisgICAgY2FzZSAnXDAnOgorICAgICAgICAvKiAgZGVmYXVsdCBpcyBtaWxsaXNlY29uZHMgICovCisgICAgICAgIGZhY3RvciA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ3MnOiBjYXNlICdTJzoKKyAgICAgICAgZmFjdG9yID0gMTAwMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnbSc6IGNhc2UgJ00nOgorICAgICAgICBmYWN0b3IgPSAxMDAwICogNjA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ2gnOiBjYXNlICdIJzoKKyAgICAgICAgZmFjdG9yID0gMTAwMCAqIDYwICogNjA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ2QnOiBjYXNlICdEJzoKKyAgICAgICAgZmFjdG9yID0gMTAwMCAqIDI0ICogNjAgKiA2MDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuICgtMSk7CisgICAgfQorCisgICAgaWYgKCB2YWx1ZSA+PSAoIChJTlRfTUFYLTEpIC8gZmFjdG9yKSApCisgICAgICAgIHJldCA9IElOVF9NQVgtMTsgICAgICAgIC8qIERvbid0IGFsbG93IGluZmluaXRlIHZhbHVlIGhlcmUgKi8KKyAgICBlbHNlCisgICAgICAgIHJldCA9IChpbnQpICh2YWx1ZSAqIChkb3VibGUpIGZhY3Rvcik7ICAvKiB0cnVuY2F0ZSB0byBpbnQgICovCisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMga21wX3VpbnQ2NAorX19rbXBfY29udmVydF90b19uYW5vc2Vjb25kcyggICAgICAgICAvLyBSOiBUaW1lIGluIG5hbm9zZWNvbmRzLCBvciB+MCBpbiBjYXNlIG9mIGVycm9yLgorICAgIGNoYXIgY29uc3QgKiBzdHIgICAgICAgICAgICAgICAgICAvLyBJOiBTdHJpbmcgcmVwcmVzZW50aW5nIHRpbWUuCispIHsKKworICAgIGRvdWJsZSAgICAgdmFsdWU7ICAgIC8vIFBhcnNlZCB2YWx1ZS4KKyAgICBjaGFyICAgICAgIHVuaXQ7ICAgICAvLyBVbml0OiAncycsICdtJywgJ3UnLCBvciAnbicuCisgICAgY2hhciAgICAgICBleHRyYTsgICAgLy8gQnVmZmVyIGZvciBleHRyYSBjaGFyYWN0ZXIgKGlmIGFueSkuCisgICAgaW50ICAgICAgICByYzsgICAgICAgLy8gUmV0dXJuIGNvZGUgb2Ygc3NjYW5mKCkuCisgICAgZG91YmxlICAgICBmYWN0b3I7ICAgLy8gTnVtZXJpYyBmYWN0b3IgY29ycmVzcG9uZGluZyB0byB1bml0LgorICAgIGttcF91aW50NjQgcmVzdWx0OworCisgICAgaWYgKCBzdHIgPT0gTlVMTCB8fCBzdHJbIDAgXSA9PSAwICkgeyAgICAvLyBObyBzdHJpbmcgb3IgZW1wdHkgc3RyaW5nLgorICAgICAgICByZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVmYXVsdCB2YWx1ZS4KKyAgICB9OyAvLyBpZgorICAgIHJjID0gc3NjYW5mKCBzdHIsICIlbGYlYyVjIiwgJnZhbHVlLCAmdW5pdCwgJmV4dHJhICk7CisgICAgc3dpdGNoICggcmMgKSB7CisgICAgICAgIGNhc2UgMDogeyAgICAgICAgICAgICAvLyBWYWx1ZSBpcyBub3QgcGFyc2VkLgorICAgICAgICAgICAgcmV0dXJuIH4gMDsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSAxOiB7ICAgICAgICAgICAgIC8vIE9uZSB2YWx1ZSBwYXJzZWQsIG5vIHVuaXQgaXMgc3BlY2lmaWVkLgorICAgICAgICAgICAgdW5pdCA9ICdzJzsgICAgICAgLy8gVXNlIGRlZmF1bHQgdW5pdC4KKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSAyOiB7ICAgICAgICAgICAgIC8vIFZhbHVlIGFuZCB1bml0IGFyZSBwYXJzZWQuCisgICAgICAgICAgICAvLyBEbyBub3RoaW5nLgorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIDM6IHsgICAgICAgICAgICAgLy8gRXh0cmEgY2hhcmFjdGVycyBpcyBzcGVjaWZpZWQuCisgICAgICAgICAgICByZXR1cm4gfiAwOworICAgICAgICB9IGJyZWFrOworICAgIH07IC8vIHN3aXRjaAorICAgIHN3aXRjaCAoIHVuaXQgKSB7CisgICAgICAgIGNhc2UgJ3MnOiB7CisgICAgICAgICAgICBmYWN0b3IgPSAxLjBFKzk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgJ20nOiB7CisgICAgICAgICAgICBmYWN0b3IgPSAxLjBFKzY7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgJ3UnOiB7CisgICAgICAgICAgICBmYWN0b3IgPSAxLjBFKzM7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgJ24nOiB7CisgICAgICAgICAgICBmYWN0b3IgPSAxLjA7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbGxlZ2FsIHVuaXQuCisgICAgICAgICAgICByZXR1cm4gfiAwOyAgICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gZXJyb3IuCisgICAgICAgIH0gYnJlYWs7CisgICAgfTsgLy8gc3dpdGNoCisgICAgcmVzdWx0ID0gKGttcF91aW50NjQpKCB2YWx1ZSAqIGZhY3RvciApOworICAgIHJldHVybiByZXN1bHQ7CisKK307IC8vIGZ1bmMgX19rbXBfY29udmVydF90b19uYW5vc2Vjb25kcworCisKK3N0YXRpYyBpbnQKK19fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCggY2hhciBjb25zdCAqIGEsIGNoYXIgY29uc3QgKiBiLCBjaGFyIHNlbnRpbmVsICkgeworICAgIGlmKGEgPT0gTlVMTCkKKyAgICAgICAgYSA9ICIiOworICAgIGlmKGIgPT0gTlVMTCkKKyAgICAgICAgYiA9ICIiOworICAgIHdoaWxlKCphICYmICpiICYmICpiICE9IHNlbnRpbmVsKSB7CisgICAgICAgIGNoYXIgY2EgPSAqYSwgY2IgPSAqYjsKKworICAgICAgICBpZihjYSA+PSAnYScgJiYgY2EgPD0gJ3onKQorICAgICAgICAgICAgY2EgLT0gJ2EnIC0gJ0EnOworICAgICAgICBpZihjYiA+PSAnYScgJiYgY2IgPD0gJ3onKQorICAgICAgICAgICAgY2IgLT0gJ2EnIC0gJ0EnOworICAgICAgICBpZihjYSAhPSBjYikKKyAgICAgICAgICAgIHJldHVybiAoaW50KSh1bnNpZ25lZCBjaGFyKSphIC0gKGludCkodW5zaWduZWQgY2hhcikqYjsKKyAgICAgICAgKythOworICAgICAgICArK2I7CisgICAgfQorICAgIHJldHVybiAqYSA/CisgICAgICAgICgqYiAmJiAqYiAhPSBzZW50aW5lbCkgPyAoaW50KSh1bnNpZ25lZCBjaGFyKSphIC0gKGludCkodW5zaWduZWQgY2hhcikqYiA6IDEgOgorICAgICAgICAoKmIgJiYgKmIgIT0gc2VudGluZWwpID8gLTEgOiAwOworfQorCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFRhYmxlIHN0cnVjdHVyZXMgYW5kIGhlbHBlciBmdW5jdGlvbnMuCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3R5cGVkZWYgc3RydWN0IF9fa21wX3NldHRpbmcgICAgICAgIGttcF9zZXR0aW5nX3Q7Cit0eXBlZGVmIHN0cnVjdCBfX2ttcF9zdGdfc3NfZGF0YSAgICBrbXBfc3RnX3NzX2RhdGFfdDsKK3R5cGVkZWYgc3RydWN0IF9fa21wX3N0Z193cF9kYXRhICAgIGttcF9zdGdfd3BfZGF0YV90OwordHlwZWRlZiBzdHJ1Y3QgX19rbXBfc3RnX2ZyX2RhdGEgICAga21wX3N0Z19mcl9kYXRhX3Q7CisKK3R5cGVkZWYgdm9pZCAoICoga21wX3N0Z19wYXJzZV9mdW5jX3QgKSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKTsKK3R5cGVkZWYgdm9pZCAoICoga21wX3N0Z19wcmludF9mdW5jX3QgKSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICk7CisKK3N0cnVjdCBfX2ttcF9zZXR0aW5nIHsKKyAgICBjaGFyIGNvbnN0ICogICAgICAgICBuYW1lOyAgICAgICAgLy8gTmFtZSBvZiBzZXR0aW5nIChlbnZpcm9ubWVudCB2YXJpYWJsZSkuCisgICAga21wX3N0Z19wYXJzZV9mdW5jX3QgcGFyc2U7ICAgICAgIC8vIFBhcnNlciBmdW5jdGlvbi4KKyAgICBrbXBfc3RnX3ByaW50X2Z1bmNfdCBwcmludDsgICAgICAgLy8gUHJpbnQgZnVuY3Rpb24uCisgICAgdm9pZCAqICAgICAgICAgICAgICAgZGF0YTsgICAgICAgIC8vIERhdGEgcGFzc2VkIHRvIHBhcnNlciBhbmQgcHJpbnRlci4KKyAgICBpbnQgICAgICAgICAgICAgICAgICBzZXQ7ICAgICAgICAgLy8gVmFyaWFibGUgc2V0IGR1cmluZyB0aGlzICJzZXNzaW9uIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgKF9fa21wX2Vudl9pbml0aWFsaXplKCkgb3Iga21wX3NldF9kZWZhdWx0cygpIGNhbGwpLgorICAgIGludCAgICAgICAgICAgICAgICAgIGRlZmluZWQ7ICAgICAvLyBWYXJpYWJsZSBzZXQgaW4gYW55ICJzZXNzaW9uIi4KK307IC8vIHN0cnVjdCBfX2ttcF9zZXR0aW5nCisKK3N0cnVjdCBfX2ttcF9zdGdfc3NfZGF0YSB7CisgICAgc2l6ZV90ICAgICAgICAgICAgIGZhY3RvcjsgIC8vIERlZmF1bHQgZmFjdG9yOiAxIGZvciBLTVBfU1RBQ0tTSVpFLCAxMDI0IGZvciBvdGhlcnMuCisgICAga21wX3NldHRpbmdfdCAqICogIHJpdmFsczsgIC8vIEFycmF5IG9mIHBvaW50ZXJzIHRvIHJpdmFscyAoaW5jbHVkaW5nIGl0c2VsZikuCit9OyAvLyBzdHJ1Y3QgX19rbXBfc3RnX3NzX2RhdGEKKworc3RydWN0IF9fa21wX3N0Z193cF9kYXRhIHsKKyAgICBpbnQgICAgICAgICAgICAgICAgb21wOyAgICAgLy8gMCAtLSBLTVBfTElCUkFSWSwgMSAtLSBPTVBfV0FJVF9QT0xJQ1kuCisgICAga21wX3NldHRpbmdfdCAqICogIHJpdmFsczsgIC8vIEFycmF5IG9mIHBvaW50ZXJzIHRvIHJpdmFscyAoaW5jbHVkaW5nIGl0c2VsZikuCit9OyAvLyBzdHJ1Y3QgX19rbXBfc3RnX3dwX2RhdGEKKworc3RydWN0IF9fa21wX3N0Z19mcl9kYXRhIHsKKyAgICBpbnQgICAgICAgICAgICAgICAgZm9yY2U7ICAvLyAwIC0tIEtNUF9ERVRFUk1JTklTVElDX1JFRFVDVElPTiwgMSAtLSBLTVBfRk9SQ0VfUkVEVUNUSU9OLgorICAgIGttcF9zZXR0aW5nX3QgKiAqICByaXZhbHM7ICAvLyBBcnJheSBvZiBwb2ludGVycyB0byByaXZhbHMgKGluY2x1ZGluZyBpdHNlbGYpLgorfTsgLy8gc3RydWN0IF9fa21wX3N0Z19mcl9kYXRhCisKK3N0YXRpYyBpbnQKK19fa21wX3N0Z19jaGVja19yaXZhbHMoICAgICAgICAgIC8vIDAgLS0gT2ssIDEgLS0gZXJyb3JzIGZvdW5kLgorICAgIGNoYXIgY29uc3QgKiAgICAgICBuYW1lLCAgICAgLy8gTmFtZSBvZiB2YXJpYWJsZS4KKyAgICBjaGFyIGNvbnN0ICogICAgICAgdmFsdWUsICAgIC8vIFZhbHVlIG9mIHRoZSB2YXJpYWJsZS4KKyAgICBrbXBfc2V0dGluZ190ICogKiAgcml2YWxzICAgIC8vIExpc3Qgb2Ygcml2YWwgc2V0dGluZ3MgKHRoZSBsaXN0IG11c3QgaW5jbHVkZSBjdXJyZW50IG9uZSkuCispOworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhlbHBlciBwYXJzZSBmdW5jdGlvbnMuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfYm9vbCgKKyAgICBjaGFyIGNvbnN0ICogbmFtZSwKKyAgICBjaGFyIGNvbnN0ICogdmFsdWUsCisgICAgaW50ICogICAgICAgIG91dAorKSB7CisgICAgaWYgKCBfX2ttcF9zdHJfbWF0Y2hfdHJ1ZSggdmFsdWUgKSApIHsKKyAgICAgICAgKiBvdXQgPSBUUlVFOworICAgIH0gZWxzZSBpZiAoX19rbXBfc3RyX21hdGNoX2ZhbHNlKCB2YWx1ZSApICkgeworICAgICAgICAqIG91dCA9IEZBTFNFOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgIGttcF9tc193YXJuaW5nLAorICAgICAgICAgICAgS01QX01TRyggQmFkQm9vbFZhbHVlLCBuYW1lLCB2YWx1ZSApLAorICAgICAgICAgICAgS01QX0hOVCggVmFsaWRCb29sVmFsdWVzICksCisgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICApOworICAgIH07IC8vIGlmCit9IC8vIF9fa21wX3N0Z19wYXJzZV9ib29sCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2Vfc2l6ZSgKKyAgICBjaGFyIGNvbnN0ICogbmFtZSwKKyAgICBjaGFyIGNvbnN0ICogdmFsdWUsCisgICAgc2l6ZV90ICAgICAgIHNpemVfbWluLAorICAgIHNpemVfdCAgICAgICBzaXplX21heCwKKyAgICBpbnQgKiAgICAgICAgaXNfc3BlY2lmaWVkLAorICAgIHNpemVfdCAqICAgICBvdXQsCisgICAgc2l6ZV90ICAgICAgIGZhY3RvcgorKSB7CisgICAgY2hhciBjb25zdCAqIG1zZyA9IE5VTEw7CisgICAgI2lmIEtNUF9PU19EQVJXSU4KKyAgICAgICAgc2l6ZV9taW4gPSBfX2ttcF9yb3VuZDRrKCBzaXplX21pbiApOworICAgICAgICBzaXplX21heCA9IF9fa21wX3JvdW5kNGsoIHNpemVfbWF4ICk7CisgICAgI2VuZGlmIC8vIEtNUF9PU19EQVJXSU4KKyAgICBpZiAoIHZhbHVlICkgeworICAgICAgICBpZiAoIGlzX3NwZWNpZmllZCAhPSBOVUxMICkgeworICAgICAgICAgICAgKiBpc19zcGVjaWZpZWQgPSAxOworICAgICAgICB9OyAvLyBpZgorICAgICAgICBfX2ttcF9zdHJfdG9fc2l6ZSggdmFsdWUsIG91dCwgZmFjdG9yLCAmIG1zZyApOworICAgICAgICBpZiAoIG1zZyA9PSBOVUxMICkgeworICAgICAgICAgICAgaWYgKCAqIG91dCA+IHNpemVfbWF4ICkgeworICAgICAgICAgICAgICAgICogb3V0ID0gc2l6ZV9tYXg7CisgICAgICAgICAgICAgICAgbXNnID0gS01QX0kxOE5fU1RSKCBWYWx1ZVRvb0xhcmdlICk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCAqIG91dCA8IHNpemVfbWluICkgeworICAgICAgICAgICAgICAgICogb3V0ID0gc2l6ZV9taW47CisgICAgICAgICAgICAgICAgbXNnID0gS01QX0kxOE5fU1RSKCBWYWx1ZVRvb1NtYWxsICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICNpZiBLTVBfT1NfREFSV0lOCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCByb3VuZDRrID0gX19rbXBfcm91bmQ0ayggKiBvdXQgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAqIG91dCAhPSByb3VuZDRrICkgeworICAgICAgICAgICAgICAgICAgICAgICAgKiBvdXQgPSByb3VuZDRrOworICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gS01QX0kxOE5fU1RSKCBOb3RNdWx0aXBsZTRLICk7CisgICAgICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gSWYgaW50ZWdlciBvdmVyZmxvdyBvY2N1cnJlZCwgKiBvdXQgPT0gS01QX1NJWkVfVF9NQVguIEN1dCBpdCB0byBzaXplX21heCBzaWxlbnRseS4KKyAgICAgICAgICAgIGlmICggKiBvdXQgPCBzaXplX21pbiApIHsKKyAgICAgICAgICAgICAgICAqIG91dCA9IHNpemVfbWF4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoICogb3V0ID4gIHNpemVfbWF4ICkgeworICAgICAgICAgICAgICAgICogb3V0ID0gc2l6ZV9tYXg7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9OyAvLyBpZgorICAgICAgICBpZiAoIG1zZyAhPSBOVUxMICkgeworICAgICAgICAgICAgLy8gTWVzc2FnZSBpcyBub3QgZW1wdHkuIFByaW50IHdhcm5pbmcuCisgICAgICAgICAgICBrbXBfc3RyX2J1Zl90IGJ1ZjsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfaW5pdCggJiBidWYgKTsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnRfc2l6ZSggJiBidWYsICogb3V0ICk7CisgICAgICAgICAgICBLTVBfV0FSTklORyggUGFyc2VTaXplSW50V2FybiwgbmFtZSwgdmFsdWUsIG1zZyApOworICAgICAgICAgICAgS01QX0lORk9STSggVXNpbmdfc3RyX1ZhbHVlLCBuYW1lLCBidWYuc3RyICk7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoICYgYnVmICk7CisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gaWYKK30gLy8gX19rbXBfc3RnX3BhcnNlX3NpemUKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9zdHIoCisgICAgY2hhciBjb25zdCAqICAgICAgbmFtZSwKKyAgICBjaGFyIGNvbnN0ICogICAgICB2YWx1ZSwKKyAgICBjaGFyIGNvbnN0ICogKiAgICBvdXQKKykgeworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSAqIG91dCApOworICAgICogb3V0ID0gX19rbXBfc3RyX2Zvcm1hdCggIiVzIiwgdmFsdWUgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX3N0cgorCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfaW50KAorICAgIGNoYXIgY29uc3QgKiBuYW1lLCAgIC8vIEk6IE5hbWUgb2YgZW52aXJvbm1lbnQgdmFyaWFibGUgKHVzZWQgaW4gd2FybmluZyBtZXNzYWdlcykuCisgICAgY2hhciBjb25zdCAqIHZhbHVlLCAgLy8gSTogVmFsdWUgb2YgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gcGFyc2UuCisgICAgaW50ICAgICAgICAgIG1pbiwgICAgLy8gSTogTWltaW5hbCBhbGxvd2VkIHZhbHVlLgorICAgIGludCAgICAgICAgICBtYXgsICAgIC8vIEk6IE1heGltdW0gYWxsb3dlZCB2YWx1ZS4KKyAgICBpbnQgKiAgICAgICAgb3V0ICAgICAvLyBPOiBPdXRwdXQgKHBhcnNlZCkgdmFsdWUuCispIHsKKyAgICBjaGFyIGNvbnN0ICogbXNnICA9IE5VTEw7CisgICAga21wX3VpbnQ2NCAgIHVpbnQgPSAqIG91dDsKKyAgICBfX2ttcF9zdHJfdG9fdWludCggdmFsdWUsICYgdWludCwgJiBtc2cgKTsKKyAgICBpZiAoIG1zZyA9PSBOVUxMICkgeworICAgICAgICBpZiAoIHVpbnQgPCAodW5zaWduZWQgaW50KW1pbiApIHsKKyAgICAgICAgICAgIG1zZyA9IEtNUF9JMThOX1NUUiggVmFsdWVUb29TbWFsbCApOworICAgICAgICAgICAgdWludCA9IG1pbjsKKyAgICAgICAgfSBlbHNlIGlmICggdWludCA+ICh1bnNpZ25lZCBpbnQpbWF4ICkgeworICAgICAgICAgICAgbXNnID0gS01QX0kxOE5fU1RSKCBWYWx1ZVRvb0xhcmdlICk7CisgICAgICAgICAgICB1aW50ID0gbWF4OworICAgICAgICB9OyAvLyBpZgorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIElmIG92ZXJmbG93IG9jY3VycmVkIG1zZyBjb250YWlucyBlcnJvciBtZXNzYWdlIGFuZCB1aW50IGlzIHZlcnkgYmlnLiBDdXQgdG1wIGl0CisgICAgICAgIC8vIHRvIElOVF9NQVguCisgICAgICAgIGlmICggdWludCA8ICh1bnNpZ25lZCBpbnQpbWluICkgeworICAgICAgICAgICAgdWludCA9IG1pbjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggdWludCA+ICh1bnNpZ25lZCBpbnQpbWF4ICkgeworICAgICAgICAgICAgdWludCA9IG1heDsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBpZgorICAgIGlmICggbXNnICE9IE5VTEwgKSB7CisgICAgICAgIC8vIE1lc3NhZ2UgaXMgbm90IGVtcHR5LiBQcmludCB3YXJuaW5nLgorICAgICAgICBrbXBfc3RyX2J1Zl90IGJ1ZjsKKyAgICAgICAgS01QX1dBUk5JTkcoIFBhcnNlU2l6ZUludFdhcm4sIG5hbWUsIHZhbHVlLCBtc2cgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIGJ1ZiApOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmYnVmLCAiJSIgS01QX1VJTlQ2NF9TUEVDICIiLCB1aW50ICk7CisgICAgICAgIEtNUF9JTkZPUk0oIFVzaW5nX3VpbnQ2NF9WYWx1ZSwgbmFtZSwgYnVmLnN0ciApOworICAgICAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoICZidWYgKTsKKyAgICB9OyAvLyBpZgorICAgICogb3V0ID0gdWludDsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2ludAorCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfZmlsZSgKKyAgICBjaGFyIGNvbnN0ICogbmFtZSwKKyAgICBjaGFyIGNvbnN0ICogdmFsdWUsCisgICAgY2hhciAqICAgICAgIHN1ZmZpeCwKKyAgICBjaGFyICogKiAgICAgb3V0CispIHsKKyAgICBjaGFyIGJ1ZmZlclsyNTZdOworICAgIGNoYXIgKnQ7CisgICAgaW50IGhhc1N1ZmZpeDsKKyAgICBLTVBfSU5URVJOQUxfRlJFRSggKHZvaWQgKikgKiBvdXQgKTsKKyAgICB0ID0gKGNoYXIgKikgc3RycmNocih2YWx1ZSwgJy4nKTsKKyAgICBoYXNTdWZmaXggPSB0ICYmIF9fa21wX3N0cl9lcWYoIHQsIHN1ZmZpeCApOworICAgIHQgPSBfX2ttcF9zdHJfZm9ybWF0KCAiJXMlcyIsIHZhbHVlLCBoYXNTdWZmaXggPyAiIiA6IHN1ZmZpeCApOworICAgIF9fa21wX2V4cGFuZF9maWxlX25hbWUoIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIHQpOworICAgIEtNUF9JTlRFUk5BTF9GUkVFKHQpOworICAgICogb3V0ID0gX19rbXBfc3RyX2Zvcm1hdCggIiVzIiwgYnVmZmVyICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9maWxlCisKK3N0YXRpYyBjaGFyICogcGFyX3JhbmdlX3RvX3ByaW50ID0gTlVMTDsKKworI2lmZGVmIEtNUF9ERUJVRworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9wYXJfcmFuZ2UoCisgICAgY2hhciBjb25zdCAqIG5hbWUsCisgICAgY2hhciBjb25zdCAqIHZhbHVlLAorICAgIGludCAqICAgICAgICBvdXRfcmFuZ2UsCisgICAgY2hhciAqICAgICAgIG91dF9yb3V0aW5lLAorICAgIGNoYXIgKiAgICAgICBvdXRfZmlsZSwKKyAgICBpbnQgKiAgICAgICAgb3V0X2xiLAorICAgIGludCAqICAgICAgICBvdXRfdWIKKykgeworICAgIHNpemVfdCBsZW4gPSBzdHJsZW4oIHZhbHVlICsgMSApOworICAgIHBhcl9yYW5nZV90b19wcmludCA9IChjaGFyICopIEtNUF9JTlRFUk5BTF9NQUxMT0MoIGxlbiArMSApOworICAgIHN0cm5jcHkoIHBhcl9yYW5nZV90b19wcmludCwgdmFsdWUsIGxlbiArIDEpOworICAgIF9fa21wX3Bhcl9yYW5nZSA9ICsxOworICAgIF9fa21wX3Bhcl9yYW5nZV9sYiA9IDA7CisgICAgX19rbXBfcGFyX3JhbmdlX3ViID0gSU5UX01BWDsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIHVuc2lnbmVkIGludCBsZW47CisgICAgICAgIGlmICgoIHZhbHVlID09IE5VTEwgKSB8fCAoICp2YWx1ZSA9PSAnXDAnICkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICggISBfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoICJyb3V0aW5lIiwgdmFsdWUsICc9JyApKSB7CisgICAgICAgICAgICB2YWx1ZSA9IHN0cmNociggdmFsdWUsICc9JyApICsgMTsKKyAgICAgICAgICAgIGxlbiA9IF9fa21wX3JlYWRzdHJfd2l0aF9zZW50aW5lbCggb3V0X3JvdXRpbmUsCisgICAgICAgICAgICAgIHZhbHVlLCBLTVBfUEFSX1JBTkdFX1JPVVRJTkVfTEVOIC0gMSwgJywnICk7CisgICAgICAgICAgICBpZiAoIGxlbiA9PSAwICkgeworICAgICAgICAgICAgICAgIGdvdG8gcGFyX3JhbmdlX2Vycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFsdWUgPSBzdHJjaHIoIHZhbHVlLCAnLCcgKTsKKyAgICAgICAgICAgIGlmICggdmFsdWUgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAhIF9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCggImZpbGVuYW1lIiwgdmFsdWUsICc9JyApKSB7CisgICAgICAgICAgICB2YWx1ZSA9IHN0cmNociggdmFsdWUsICc9JyApICsgMTsKKyAgICAgICAgICAgIGxlbiA9IF9fa21wX3JlYWRzdHJfd2l0aF9zZW50aW5lbCggb3V0X2ZpbGUsCisgICAgICAgICAgICAgIHZhbHVlLCBLTVBfUEFSX1JBTkdFX0ZJTEVOQU1FX0xFTiAtIDEsICcsJyApOworICAgICAgICAgICAgaWYgKCBsZW4gPT0gMCkgeworICAgICAgICAgICAgICAgIGdvdG8gcGFyX3JhbmdlX2Vycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFsdWUgPSBzdHJjaHIoIHZhbHVlLCAnLCcgKTsKKyAgICAgICAgICAgIGlmICggdmFsdWUgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCggISBfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoICJyYW5nZSIsIHZhbHVlLCAnPScgKSkKKyAgICAgICAgICB8fCAoICEgX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCAiaW5jbF9yYW5nZSIsIHZhbHVlLCAnPScgKSkpIHsKKyAgICAgICAgICAgIHZhbHVlID0gc3RyY2hyKCB2YWx1ZSwgJz0nICkgKyAxOworICAgICAgICAgICAgaWYgKCBzc2NhbmYoIHZhbHVlLCAiJWQ6JWQiLCBvdXRfbGIsIG91dF91YiApICE9IDIgKSB7CisgICAgICAgICAgICAgICAgZ290byBwYXJfcmFuZ2VfZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqb3V0X3JhbmdlID0gKzE7CisgICAgICAgICAgICB2YWx1ZSA9IHN0cmNociggdmFsdWUsICcsJyApOworICAgICAgICAgICAgaWYgKCB2YWx1ZSAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIHZhbHVlKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoICEgX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCAiZXhjbF9yYW5nZSIsIHZhbHVlLCAnPScgKSkgeworICAgICAgICAgICAgdmFsdWUgPSBzdHJjaHIoIHZhbHVlLCAnPScgKSArIDE7CisgICAgICAgICAgICBpZiAoIHNzY2FuZiggdmFsdWUsICIlZDolZCIsIG91dF9sYiwgb3V0X3ViKSAhPSAyICkgeworICAgICAgICAgICAgICAgIGdvdG8gcGFyX3JhbmdlX2Vycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKm91dF9yYW5nZSA9IC0xOworICAgICAgICAgICAgdmFsdWUgPSBzdHJjaHIoIHZhbHVlLCAnLCcgKTsKKyAgICAgICAgICAgIGlmICggdmFsdWUgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgcGFyX3JhbmdlX2Vycm9yOgorICAgICAgICBLTVBfV0FSTklORyggUGFyUmFuZ2VTeW50YXgsIG5hbWUgKTsKKyAgICAgICAgX19rbXBfcGFyX3JhbmdlID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfSAvLyBfX2ttcF9zdGdfcGFyc2VfcGFyX3JhbmdlCisjZW5kaWYKKworaW50CitfX2ttcF9pbml0aWFsX3RocmVhZHNfY2FwYWNpdHkoIGludCByZXFfbnByb2MgKQoreworICAgIGludCBudGggPSAzMjsKKworICAgIC8qIE1JTiggTUFYKCAzMiwgNCAqICRPTVBfTlVNX1RIUkVBRFMsIDQgKiBvbXBfZ2V0X251bV9wcm9jcygpICksIF9fa21wX21heF9udGgpICovCisgICAgaWYgKG50aCA8ICg0ICogcmVxX25wcm9jKSkKKyAgICAgICAgbnRoID0gKDQgKiByZXFfbnByb2MpOworICAgIGlmIChudGggPCAoNCAqIF9fa21wX3hwcm9jKSkKKyAgICAgICAgbnRoID0gKDQgKiBfX2ttcF94cHJvYyk7CisKKyAgICBpZiAobnRoID4gX19rbXBfbWF4X250aCkKKyAgICAgICAgbnRoID0gX19rbXBfbWF4X250aDsKKworICAgIHJldHVybiBudGg7Cit9CisKKworaW50CitfX2ttcF9kZWZhdWx0X3RwX2NhcGFjaXR5KCBpbnQgcmVxX25wcm9jLCBpbnQgbWF4X250aCwgaW50IGFsbF90aHJlYWRzX3NwZWNpZmllZCkgeworICAgIGludCBudGggPSAxMjg7CisKKyAgICBpZihhbGxfdGhyZWFkc19zcGVjaWZpZWQpCisgICAgICAgIHJldHVybiBtYXhfbnRoOworICAgIC8qIE1JTiggTUFYICgxMjgsIDQgKiAkT01QX05VTV9USFJFQURTLCA0ICogb21wX2dldF9udW1fcHJvY3MoKSApLCBfX2ttcF9tYXhfbnRoICkgKi8KKyAgICBpZiAobnRoIDwgKDQgKiByZXFfbnByb2MpKQorICAgICAgICBudGggPSAoNCAqIHJlcV9ucHJvYyk7CisgICAgaWYgKG50aCA8ICg0ICogX19rbXBfeHByb2MpKQorICAgICAgICBudGggPSAoNCAqIF9fa21wX3hwcm9jKTsKKworICAgIGlmIChudGggPiBfX2ttcF9tYXhfbnRoKQorICAgICAgICBudGggPSBfX2ttcF9tYXhfbnRoOworCisgICAgcmV0dXJuIG50aDsKK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIZWxwZXIgcHJpbnQgZnVuY3Rpb25zLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2Jvb2woIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCBpbnQgdmFsdWUgKSB7CisgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgKSB7CisgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX0JPT0w7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXM9JXNcbiIsIG5hbWUsIHZhbHVlID8gInRydWUiIDogImZhbHNlIiApOworICAgIH0KK30gLy8gX19rbXBfc3RnX3ByaW50X2Jvb2wKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9pbnQoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCBpbnQgdmFsdWUgKSB7CisgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgKSB7CisgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX0lOVDsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICAlcz0lZFxuIiwgbmFtZSwgdmFsdWUgKTsKKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wcmludF9pbnQKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF91aW50NjQoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCBrbXBfdWludDY0IHZhbHVlICkgeworICAgIGlmKCBfX2ttcF9lbnZfZm9ybWF0ICkgeworICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9VSU5UNjQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXM9JSIgS01QX1VJTlQ2NF9TUEVDICJcbiIsIG5hbWUsIHZhbHVlICk7CisgICAgfQorfSAvLyBfX2ttcF9zdGdfcHJpbnRfdWludDY0CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfc3RyKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlICkgeworICAgIGlmKCBfX2ttcF9lbnZfZm9ybWF0ICkgeworICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9TVFI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXM9JXNcbiIsIG5hbWUsIHZhbHVlICk7CisgICAgfQorfSAvLyBfX2ttcF9zdGdfcHJpbnRfc3RyCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfc2l6ZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHNpemVfdCB2YWx1ZSApIHsKKyAgICBpZiggX19rbXBfZW52X2Zvcm1hdCApIHsKKyAgICAgICAgS01QX1NUUl9CVUZfUFJJTlRfTkFNRV9FWChuYW1lKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludF9zaXplKCBidWZmZXIsIHZhbHVlICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIidcbiIgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICAlcz0iLCBuYW1lICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnRfc2l6ZSggYnVmZmVyLCB2YWx1ZSApOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICJcbiIgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KK30gLy8gX19rbXBfc3RnX3ByaW50X3NpemUKKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBQYXJzZSBhbmQgcHJpbnQgZnVuY3Rpb25zLgorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfQUxMX1RIUkVBRFMsIEtNUF9NQVhfVEhSRUFEUywgT01QX1RIUkVBRF9MSU1JVAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2FsbF90aHJlYWRzKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKworICAgIGttcF9zZXR0aW5nX3QgKiAqIHJpdmFscyA9IChrbXBfc2V0dGluZ190ICogKikgZGF0YTsKKyAgICBpbnQgICAgICAgICAgICAgICByYzsKKyAgICByYyA9IF9fa21wX3N0Z19jaGVja19yaXZhbHMoIG5hbWUsIHZhbHVlLCByaXZhbHMgKTsKKyAgICBpZiAoIHJjICkgeworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKyAgICBpZiAoICEgX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCAiYWxsIiwgdmFsdWUsIDAgKSApIHsKKyAgICAgICAgX19rbXBfbWF4X250aCA9IF9fa21wX3hwcm9jOworICAgICAgICBfX2ttcF9hbGxUaHJlYWRzU3BlY2lmaWVkID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgMSwgX19rbXBfc3lzX21heF9udGgsICYgX19rbXBfbWF4X250aCApOworICAgICAgICBfX2ttcF9hbGxUaHJlYWRzU3BlY2lmaWVkID0gMDsKKyAgICB9CisgICAgS19ESUFHKCAxLCAoICJfX2ttcF9tYXhfbnRoID09ICVkXG4iLCBfX2ttcF9tYXhfbnRoICkgKTsKKworfSAvLyBfX2ttcF9zdGdfcGFyc2VfYWxsX3RocmVhZHMKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9hbGxfdGhyZWFkcygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfbWF4X250aCApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfYWxsX3RocmVhZHMKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0JMT0NLVElNRQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2Jsb2NrdGltZSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfZGZsdF9ibG9ja3RpbWUgPSBfX2ttcF9jb252ZXJ0X3RvX21pbGxpc2Vjb25kcyggdmFsdWUgKTsKKyAgICBpZiAoIF9fa21wX2RmbHRfYmxvY2t0aW1lIDwgMCApIHsKKyAgICAgICAgX19rbXBfZGZsdF9ibG9ja3RpbWUgPSBLTVBfREVGQVVMVF9CTE9DS1RJTUU7CisgICAgICAgIF9fa21wX21zZygga21wX21zX3dhcm5pbmcsIEtNUF9NU0coIEludmFsaWRWYWx1ZSwgbmFtZSwgdmFsdWUgKSwgX19rbXBfbXNnX251bGwgKTsKKyAgICAgICAgS01QX0lORk9STSggVXNpbmdfaW50X1ZhbHVlLCBuYW1lLCBfX2ttcF9kZmx0X2Jsb2NrdGltZSApOworICAgICAgICBfX2ttcF9lbnZfYmxvY2t0aW1lID0gRkFMU0U7ICAvLyBSZXZlcnQgdG8gZGVmYXVsdCBhcyBpZiB2YXIgbm90IHNldC4KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIF9fa21wX2RmbHRfYmxvY2t0aW1lIDwgS01QX01JTl9CTE9DS1RJTUUgKSB7CisgICAgICAgICAgICBfX2ttcF9kZmx0X2Jsb2NrdGltZSA9IEtNUF9NSU5fQkxPQ0tUSU1FOworICAgICAgICAgICAgX19rbXBfbXNnKCBrbXBfbXNfd2FybmluZywgS01QX01TRyggU21hbGxWYWx1ZSwgbmFtZSwgdmFsdWUgKSwgX19rbXBfbXNnX251bGwgKTsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oIE1pblZhbHVlVXNpbmcsIG5hbWUsIF9fa21wX2RmbHRfYmxvY2t0aW1lICk7CisgICAgICAgIH0gZWxzZSBpZiAoIF9fa21wX2RmbHRfYmxvY2t0aW1lID4gS01QX01BWF9CTE9DS1RJTUUgKSB7CisgICAgICAgICAgICBfX2ttcF9kZmx0X2Jsb2NrdGltZSA9IEtNUF9NQVhfQkxPQ0tUSU1FOworICAgICAgICAgICAgX19rbXBfbXNnKCBrbXBfbXNfd2FybmluZywgS01QX01TRyggTGFyZ2VWYWx1ZSwgbmFtZSwgdmFsdWUgKSwgX19rbXBfbXNnX251bGwgKTsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oIE1heFZhbHVlVXNpbmcsIG5hbWUsIF9fa21wX2RmbHRfYmxvY2t0aW1lICk7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIF9fa21wX2Vudl9ibG9ja3RpbWUgPSBUUlVFOyAgICAvLyBLTVBfQkxPQ0tUSU1FIHdhcyBzcGVjaWZpZWQuCisgICAgfTsgLy8gaWYKKyAgICAvLyBjYWxjdWxhdGUgbnVtYmVyIG9mIG1vbml0b3IgdGhyZWFkIHdha2V1cCBpbnRlcnZhbHMgY29ycmVzb25kaW5nIHRvIGJsb2NrdGltZS4KKyAgICBfX2ttcF9tb25pdG9yX3dha2V1cHMgPSBLTVBfV0FLRVVQU19GUk9NX0JMT0NLVElNRSggX19rbXBfZGZsdF9ibG9ja3RpbWUsIF9fa21wX21vbml0b3Jfd2FrZXVwcyApOworICAgIF9fa21wX2J0X2ludGVydmFscyA9IEtNUF9JTlRFUlZBTFNfRlJPTV9CTE9DS1RJTUUoIF9fa21wX2RmbHRfYmxvY2t0aW1lLCBfX2ttcF9tb25pdG9yX3dha2V1cHMgKTsKKyAgICBLX0RJQUcoIDEsICggIl9fa21wX2Vudl9ibG9ja3RpbWUgPT0gJWRcbiIsIF9fa21wX2Vudl9ibG9ja3RpbWUgKSApOworICAgIGlmICggX19rbXBfZW52X2Jsb2NrdGltZSApIHsKKyAgICAgICAgS19ESUFHKCAxLCAoICJfX2ttcF9kZmx0X2Jsb2NrdGltZSA9PSAlZFxuIiwgX19rbXBfZGZsdF9ibG9ja3RpbWUgKSApOworICAgIH0KK30gLy8gX19rbXBfc3RnX3BhcnNlX2Jsb2NrdGltZQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2Jsb2NrdGltZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfZGZsdF9ibG9ja3RpbWUgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2Jsb2NrdGltZQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfRFVQTElDQVRFX0xJQl9PSworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2R1cGxpY2F0ZV9saWJfb2soIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIC8qIGFjdHVhbGx5IHRoaXMgdmFyaWFibGUgaXMgbm90IHN1cHBvcnRlZCwKKyAgICAgICBwdXQgaGVyZSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGVhcmxpZXIgYnVpbGRzIGFuZCBmb3Igc3RhdGljL2R5bmFtaWMgY29tYmluYXRpb24gKi8KKyAgICBfX2ttcF9zdGdfcGFyc2VfYm9vbCggbmFtZSwgdmFsdWUsICYgX19rbXBfZHVwbGljYXRlX2xpYnJhcnlfb2sgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2R1cGxpY2F0ZV9saWJfb2sKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9kdXBsaWNhdGVfbGliX29rKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2Jvb2woIGJ1ZmZlciwgbmFtZSwgX19rbXBfZHVwbGljYXRlX2xpYnJhcnlfb2sgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2R1cGxpY2F0ZV9saWJfb2sKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0lOSEVSSVRfRlBfQ09OVFJPTAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2luaGVyaXRfZnBfY29udHJvbCggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIF9fa21wX2luaGVyaXRfZnBfY29udHJvbCApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfaW5oZXJpdF9mcF9jb250cm9sCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfaW5oZXJpdF9mcF9jb250cm9sKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisjaWYgS01QX0RFQlVHCisgICAgX19rbXBfc3RnX3ByaW50X2Jvb2woIGJ1ZmZlciwgbmFtZSwgX19rbXBfaW5oZXJpdF9mcF9jb250cm9sICk7CisjZW5kaWYgLyogS01QX0RFQlVHICovCit9IC8vIF9fa21wX3N0Z19wcmludF9pbmhlcml0X2ZwX2NvbnRyb2wKKworI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0xJQlJBUlksIE9NUF9XQUlUX1BPTElDWQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3dhaXRfcG9saWN5KCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKworICAgIGttcF9zdGdfd3BfZGF0YV90ICogd2FpdCA9IChrbXBfc3RnX3dwX2RhdGFfdCAqKSBkYXRhOworICAgIGludCAgICAgICAgICAgICAgICAgcmM7CisKKyAgICByYyA9IF9fa21wX3N0Z19jaGVja19yaXZhbHMoIG5hbWUsIHZhbHVlLCB3YWl0LT5yaXZhbHMgKTsKKyAgICBpZiAoIHJjICkgeworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKworICAgIGlmICggd2FpdC0+b21wICkgeworICAgICAgICBpZiAoIF9fa21wX3N0cl9tYXRjaCggIkFDVElWRSIsIDEsIHZhbHVlICkgKSB7CisgICAgICAgICAgIF9fa21wX2xpYnJhcnkgPSBsaWJyYXJ5X3R1cm5hcm91bmQ7CisgICAgICAgIH0gZWxzZSBpZiAoIF9fa21wX3N0cl9tYXRjaCggIlBBU1NJVkUiLCAxLCB2YWx1ZSApICkgeworICAgICAgICAgICBfX2ttcF9saWJyYXJ5ID0gbGlicmFyeV90aHJvdWdocHV0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIFN0Z0ludmFsaWRWYWx1ZSwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIF9fa21wX3N0cl9tYXRjaCggInNlcmlhbCIsIDEsIHZhbHVlICkgKSB7ICAgICAgICAgICAgIC8qIFMgKi8KKyAgICAgICAgICAgX19rbXBfbGlicmFyeSA9IGxpYnJhcnlfc2VyaWFsOworICAgICAgICB9IGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJ0aHJvdWdocHV0IiwgMiwgdmFsdWUgKSApIHsgIC8qIFRIICovCisgICAgICAgICAgIF9fa21wX2xpYnJhcnkgPSBsaWJyYXJ5X3Rocm91Z2hwdXQ7CisgICAgICAgIH0gZWxzZSBpZiAoIF9fa21wX3N0cl9tYXRjaCggInR1cm5hcm91bmQiLCAyLCB2YWx1ZSApICkgeyAgLyogVFUgKi8KKyAgICAgICAgICAgX19rbXBfbGlicmFyeSA9IGxpYnJhcnlfdHVybmFyb3VuZDsKKyAgICAgICAgfSBlbHNlIGlmICggX19rbXBfc3RyX21hdGNoKCAiZGVkaWNhdGVkIiwgMSwgdmFsdWUgKSApIHsgICAvKiBEICovCisgICAgICAgICAgIF9fa21wX2xpYnJhcnkgPSBsaWJyYXJ5X3R1cm5hcm91bmQ7CisgICAgICAgIH0gZWxzZSBpZiAoIF9fa21wX3N0cl9tYXRjaCggIm11bHRpdXNlciIsIDEsIHZhbHVlICkgKSB7ICAgLyogTSAqLworICAgICAgICAgICBfX2ttcF9saWJyYXJ5ID0gbGlicmFyeV90aHJvdWdocHV0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIFN0Z0ludmFsaWRWYWx1ZSwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBpZgorICAgIF9fa21wX2F1eF9zZXRfbGlicmFyeSggX19rbXBfbGlicmFyeSApOworCit9IC8vIF9fa21wX3N0Z19wYXJzZV93YWl0X3BvbGljeQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3dhaXRfcG9saWN5KCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisKKyAgICBrbXBfc3RnX3dwX2RhdGFfdCAqIHdhaXQgPSAoa21wX3N0Z193cF9kYXRhX3QgKikgZGF0YTsKKyAgICBjaGFyIGNvbnN0ICogICAgICAgIHZhbHVlID0gTlVMTDsKKworICAgIGlmICggd2FpdC0+b21wICkgeworICAgICAgICBzd2l0Y2ggKCBfX2ttcF9saWJyYXJ5ICkgeworICAgICAgICAgICAgY2FzZSBsaWJyYXJ5X3R1cm5hcm91bmQgOiB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSAiQUNUSVZFIjsKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICBjYXNlIGxpYnJhcnlfdGhyb3VnaHB1dCA6IHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9ICJQQVNTSVZFIjsKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgIH07IC8vIHN3aXRjaAorICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaCAoIF9fa21wX2xpYnJhcnkgKSB7CisgICAgICAgICAgICBjYXNlIGxpYnJhcnlfc2VyaWFsIDogeworICAgICAgICAgICAgICAgIHZhbHVlID0gInNlcmlhbCI7CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgY2FzZSBsaWJyYXJ5X3R1cm5hcm91bmQgOiB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSAidHVybmFyb3VuZCI7CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgY2FzZSBsaWJyYXJ5X3Rocm91Z2hwdXQgOiB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSAidGhyb3VnaHB1dCI7CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICB9OyAvLyBzd2l0Y2gKKyAgICB9OyAvLyBpZgorICAgIGlmICggdmFsdWUgIT0gTlVMTCApIHsKKyAgICAgICAgX19rbXBfc3RnX3ByaW50X3N0ciggYnVmZmVyLCBuYW1lLCB2YWx1ZSApOworICAgIH07IC8vIGlmCisKK30gLy8gX19rbXBfc3RnX3ByaW50X3dhaXRfcG9saWN5CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9NT05JVE9SX1NUQUNLU0laRQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX21vbml0b3Jfc3RhY2tzaXplKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2Vfc2l6ZSgKKyAgICAgICAgbmFtZSwKKyAgICAgICAgdmFsdWUsCisgICAgICAgIF9fa21wX3N5c19taW5fc3Rrc2l6ZSwKKyAgICAgICAgS01QX01BWF9TVEtTSVpFLAorICAgICAgICBOVUxMLAorICAgICAgICAmIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSwKKyAgICAgICAgMQorICAgICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9tb25pdG9yX3N0YWNrc2l6ZQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X21vbml0b3Jfc3RhY2tzaXplKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgKSB7CisgICAgICAgIGlmICggIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSA+IDAgKQorICAgICAgICAgICAgS01QX1NUUl9CVUZfUFJJTlRfTkFNRV9FWChuYW1lKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgS01QX1NUUl9CVUZfUFJJTlRfTkFNRTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICAlcyIsIG5hbWUgKTsKKyAgICB9CisgICAgaWYgKCAgX19rbXBfbW9uaXRvcl9zdGtzaXplID4gMCApIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludF9zaXplKCBidWZmZXIsIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSApOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIjogJXNcbiIsIEtNUF9JMThOX1NUUiggTm90RGVmaW5lZCApICk7CisgICAgfQorICAgIGlmKCBfX2ttcF9lbnZfZm9ybWF0ICYmIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSApIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIidcbiIpOworICAgIH0KKworfSAvLyBfX2ttcF9zdGdfcHJpbnRfbW9uaXRvcl9zdGFja3NpemUKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX1NFVFRJTkdTCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2Vfc2V0dGluZ3MoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9ib29sKCBuYW1lLCB2YWx1ZSwgJiBfX2ttcF9zZXR0aW5ncyApOworfSAvLyBfX2ttcF9zdGdfcGFyc2Vfc2V0dGluZ3MKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9zZXR0aW5ncygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9ib29sKCBidWZmZXIsIG5hbWUsIF9fa21wX3NldHRpbmdzICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9zZXR0aW5ncworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfU1RBQ0tPRkZTRVQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9zdGFja29mZnNldCggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX3NpemUoCisgICAgICAgIG5hbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbnYgdmFyIG5hbWUKKyAgICAgICAgdmFsdWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVudiB2YXIgdmFsdWUKKyAgICAgICAgS01QX01JTl9TVEtPRkZTRVQsICAgICAgICAgICAgICAgIC8vIE1pbiB2YWx1ZQorICAgICAgICBLTVBfTUFYX1NUS09GRlNFVCwgICAgICAgICAgICAgICAgLy8gTWF4IHZhbHVlCisgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAmIF9fa21wX3N0a29mZnNldCwgICAgICAgICAgICAgICAgLy8gVmFyIHRvIGluaXRpYWxpemUKKyAgICAgICAgMQorICAgICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9zdGFja29mZnNldAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3N0YWNrb2Zmc2V0KCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X3NpemUoIGJ1ZmZlciwgbmFtZSwgX19rbXBfc3Rrb2Zmc2V0ICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9zdGFja29mZnNldAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfU1RBQ0tTSVpFLCBPTVBfU1RBQ0tTSVpFLCBHT01QX1NUQUNLU0laRQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3N0YWNrc2l6ZSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisKKyAgICBrbXBfc3RnX3NzX2RhdGFfdCAqICBzdGFja3NpemUgPSAoa21wX3N0Z19zc19kYXRhX3QgKikgZGF0YTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICByYzsKKworICAgIHJjID0gX19rbXBfc3RnX2NoZWNrX3JpdmFscyggbmFtZSwgdmFsdWUsIHN0YWNrc2l6ZS0+cml2YWxzICk7CisgICAgaWYgKCByYyApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisgICAgX19rbXBfc3RnX3BhcnNlX3NpemUoCisgICAgICAgIG5hbWUsICAgICAgICAgICAgICAgICAgICAgLy8gRW52IHZhciBuYW1lCisgICAgICAgIHZhbHVlLCAgICAgICAgICAgICAgICAgICAgLy8gRW52IHZhciB2YWx1ZQorICAgICAgICBfX2ttcF9zeXNfbWluX3N0a3NpemUsICAgIC8vIE1pbiB2YWx1ZQorICAgICAgICBLTVBfTUFYX1NUS1NJWkUsICAgICAgICAgIC8vIE1heCB2YWx1ZQorICAgICAgICAmIF9fa21wX2Vudl9zdGtzaXplLCAgICAgIC8vCisgICAgICAgICYgX19rbXBfc3Rrc2l6ZSwgICAgICAgICAgLy8gVmFyIHRvIGluaXRpYWxpemUKKyAgICAgICAgc3RhY2tzaXplLT5mYWN0b3IKKyAgICApOworCit9IC8vIF9fa21wX3N0Z19wYXJzZV9zdGFja3NpemUKKworLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIHByaW50aW5nIGJvdGggS01QX1NUQUNLU0laRSAoZmFjdG9yIGlzIDEpIGFuZCBPTVBfU1RBQ0tTSVpFIChmYWN0b3IgaXMgMTAyNCkuCisvLyBDdXJyZW50bHkgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHByaW50IE9NUF9TVEFDS1NJWkUgdmFsdWUgaW4gYnl0ZXMuIFdlIGNhbiBjb25zaWRlciBhZGRpbmcgdGhpcworLy8gcG9zc2liaWxpdHkgYnkgYSBjdXN0b21lciByZXF1ZXN0IGluIGZ1dHVyZS4KK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfc3RhY2tzaXplKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAga21wX3N0Z19zc19kYXRhX3QgKiAgc3RhY2tzaXplID0gKGttcF9zdGdfc3NfZGF0YV90ICopIGRhdGE7CisgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgKSB7CisgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUVfRVgobmFtZSk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnRfc2l6ZSggYnVmZmVyLCAoX19rbXBfc3Rrc2l6ZSAlIDEwMjQpID8gX19rbXBfc3Rrc2l6ZSAvIHN0YWNrc2l6ZS0+ZmFjdG9yIDogX19rbXBfc3Rrc2l6ZSApOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICInXG4iICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXM9IiwgbmFtZSApOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50X3NpemUoIGJ1ZmZlciwgKF9fa21wX3N0a3NpemUgJSAxMDI0KSA/IF9fa21wX3N0a3NpemUgLyBzdGFja3NpemUtPmZhY3RvciA6IF9fa21wX3N0a3NpemUgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiXG4iICk7CisgICAgfQorfSAvLyBfX2ttcF9zdGdfcHJpbnRfc3RhY2tzaXplCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9WRVJTSU9OCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfdmVyc2lvbiggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIF9fa21wX3ZlcnNpb24gKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX3ZlcnNpb24KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF92ZXJzaW9uKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2Jvb2woIGJ1ZmZlciwgbmFtZSwgX19rbXBfdmVyc2lvbiApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfdmVyc2lvbgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfV0FSTklOR1MKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV93YXJuaW5ncyggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzICk7CisgICAgaWYgKF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzICE9IGttcF93YXJuaW5nc19vZmYpIHsgICAvLyBBQzogd2UgaGF2ZSBvbmx5IDAvMSB2YWx1ZXMgZG9jdW1lbnRlZCwKKyAgICAgICAgX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MgPSBrbXBfd2FybmluZ3NfZXhwbGljaXQ7IC8vICAgICBzbyByZXNldCBpdCB0byBleHBsaWNpdCBpbiBvcmRlciB0bworICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGRpc3Rpbmd1aXNoIGZyb20gZGVmYXVsdCBzZXR0aW5nCit9IC8vIF9fa21wX2Vudl9wYXJzZV93YXJuaW5ncworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3dhcm5pbmdzKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2Jvb2woIGJ1ZmZlciwgbmFtZSwgX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MgKTsgLy8gQUM6IFRPRE86IGNoYW5nZSB0byBwcmludF9pbnQ/Cit9IC8vIF9fa21wX2Vudl9wcmludF93YXJuaW5ncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIChuZWVkcyBkb2N1bWVudGF0aW9uIGNoYW5nZSkuLi4KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT01QX05FU1RFRCwgT01QX05VTV9USFJFQURTCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfbmVzdGVkKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfYm9vbCggbmFtZSwgdmFsdWUsICYgX19rbXBfZGZsdF9uZXN0ZWQgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX25lc3RlZAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X25lc3RlZCgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9ib29sKCBidWZmZXIsIG5hbWUsIF9fa21wX2RmbHRfbmVzdGVkICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9uZXN0ZWQKKworc3RhdGljIHZvaWQKK19fa21wX3BhcnNlX25lc3RlZF9udW1fdGhyZWFkcyggY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICplbnYsIGttcF9uZXN0ZWRfbnRocmVhZHNfdCAqbnRoX2FycmF5ICkKK3sKKyAgICBjb25zdCBjaGFyICpuZXh0ID0gZW52OworICAgIGNvbnN0IGNoYXIgKnNjYW4gPSBuZXh0OworCisgICAgaW50IHRvdGFsID0gMDsgICAgICAgICAgLy8gQ291bnQgZWxlbWVudHMgdGhhdCB3ZXJlIHNldC4gSXQnbGwgYmUgdXNlZCBhcyBhbiBhcnJheSBzaXplCisgICAgaW50IHByZXZfY29tbWEgPSBGQUxTRTsgLy8gRm9yIGNvcnJlY3QgcHJvY2Vzc2luZyBzZXF1ZW50aWFsIGNvbW1hcworCisgICAgLy8gQ291bnQgdGhlIG51bWJlciBvZiB2YWx1ZXMgaW4gdGhlIGVudi4gdmFyIHN0cmluZworICAgIGZvciAoIDsgOyApIHsKKyAgICAgICAgU0tJUF9XUyggbmV4dCApOworCisgICAgICAgIGlmICggKm5leHQgPT0gJ1wwJyApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8vIE5leHQgY2hhcmFjdGVyIGlzIG5vdCBhbiBpbnRlZ2VyIG9yIG5vdCBhIGNvbW1hID0+IGVuZCBvZiBsaXN0CisgICAgICAgIGlmICggKCAoICpuZXh0IDwgJzAnICkgfHwgKCAqbmV4dCA+ICc5JyApICkgJiYgKCAqbmV4dCAhPScsJykgKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggTnRoU3ludGF4RXJyb3IsIHZhciwgZW52ICk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhlIG5leHQgY2hhcmFjdGVyIGlzICcsJworICAgICAgICBpZiAoICpuZXh0ID09ICcsJyApIHsKKyAgICAgICAgICAgIC8vICcsJyBpcyB0aGUgZmlzcnQgY2hhcmFjdGVyCisgICAgICAgICAgICBpZiAoIHRvdGFsID09IDAgfHwgcHJldl9jb21tYSApIHsKKyAgICAgICAgICAgICAgICB0b3RhbCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJldl9jb21tYSA9IFRSVUU7CisgICAgICAgICAgICBuZXh0Kys7IC8vc2tpcCAnLCcKKyAgICAgICAgICAgIFNLSVBfV1MoIG5leHQgKTsKKyAgICAgICAgfQorICAgICAgICAvLyBOZXh0IGNoYXJhY3RlciBpcyBhIGRpZ2l0CisgICAgICAgIGlmICggKm5leHQgPj0gJzAnICYmICpuZXh0IDw9ICc5JyApIHsKKyAgICAgICAgICAgIHByZXZfY29tbWEgPSBGQUxTRTsKKyAgICAgICAgICAgIFNLSVBfRElHSVRTKCBuZXh0ICk7CisgICAgICAgICAgICB0b3RhbCsrOworICAgICAgICAgICAgY29uc3QgY2hhciAqdG1wID0gbmV4dDsKKyAgICAgICAgICAgIFNLSVBfV1MoIHRtcCApOworICAgICAgICAgICAgaWYgKCAoICpuZXh0ID09ICcgJyB8fCAqbmV4dCA9PSAnXHQnICkgJiYgKCAqdG1wID49ICcwJyAmJiAqdG1wIDw9ICc5JyApICkgeworICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBOdGhTcGFjZXNOb3RBbGxvd2VkLCB2YXIsIGVudiApOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0b3RhbCA+IDAgKTsKKyAgICBpZiggdG90YWwgPD0gMCApIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIE50aFN5bnRheEVycm9yLCB2YXIsIGVudiApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gQ2hlY2sgaWYgdGhlIG5lc3RlZCBudGhyZWFkcyBhcnJheSBleGlzdHMKKyAgICBpZiAoICEgbnRoX2FycmF5LT5udGggKSB7CisgICAgICAgIC8vIEFsbG9jYXRlIGFuIGFycmF5IG9mIGRvdWJsZSBzaXplCisgICAgICAgIG50aF9hcnJheS0+bnRoID0gKCBpbnQgKiApS01QX0lOVEVSTkFMX01BTExPQyggc2l6ZW9mKCBpbnQgKSAqIHRvdGFsICogMiApOworICAgICAgICBpZiAoIG50aF9hcnJheS0+bnRoID09IE5VTEwgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIE1lbW9yeUFsbG9jRmFpbGVkICk7CisgICAgICAgIH0KKyAgICAgICAgbnRoX2FycmF5LT5zaXplID0gdG90YWwgKiAyOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICggbnRoX2FycmF5LT5zaXplIDwgdG90YWwgKSB7CisgICAgICAgICAgICAvLyBJbmNyZWFzZSB0aGUgYXJyYXkgc2l6ZQorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIG50aF9hcnJheS0+c2l6ZSAqPSAyOworICAgICAgICAgICAgfSB3aGlsZSAoIG50aF9hcnJheS0+c2l6ZSA8IHRvdGFsICk7CisKKyAgICAgICAgICAgIG50aF9hcnJheS0+bnRoID0gKGludCAqKSBLTVBfSU5URVJOQUxfUkVBTExPQygKKyAgICAgICAgICAgICAgICBudGhfYXJyYXktPm50aCwgc2l6ZW9mKCBpbnQgKSAqIG50aF9hcnJheS0+c2l6ZSApOworICAgICAgICAgICAgaWYgKCBudGhfYXJyYXktPm50aCA9PSBOVUxMICkgeworCQlLTVBfRkFUQUwoIE1lbW9yeUFsbG9jRmFpbGVkICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbnRoX2FycmF5LT51c2VkID0gdG90YWw7CisgICAgaW50IGkgPSAwOworCisgICAgcHJldl9jb21tYSA9IEZBTFNFOworICAgIHRvdGFsID0gMDsKKyAgICAvLyBTYXZlIHZhbHVlcyBpbiB0aGUgYXJyYXkKKyAgICBmb3IgKCA7IDsgKSB7CisgICAgICAgIFNLSVBfV1MoIHNjYW4gKTsKKyAgICAgICAgaWYgKCAqc2NhbiA9PSAnXDAnICkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhlIG5leHQgY2hhcmFjdGVyIGlzICcsJworICAgICAgICBpZiAoICpzY2FuID09ICcsJyApIHsKKyAgICAgICAgICAgIC8vICcsJyBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0CisgICAgICAgICAgICBpZiAoIHRvdGFsID09IDAgKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIHZhbHVlIGlzIHN1cHBvc2VkIHRvIGJlIGVxdWFsIHRvIF9fa21wX2F2YWlsX3Byb2MgYnV0IGl0IGlzIHVua25vd24gYXQgdGhlIG1vbWVudC4KKyAgICAgICAgICAgICAgICAvLyBTbyBsZXQncyBwdXQgYSBwbGFjZWhvbGRlciAoI3RocmVhZHMgPSAwKSB0byBjb3JyZWN0IGl0IGxhdGVyLgorICAgICAgICAgICAgICAgIG50aF9hcnJheS0+bnRoW2krK10gPSAwOworICAgICAgICAgICAgICAgIHRvdGFsKys7CisgICAgICAgICAgICB9ZWxzZSBpZiAoIHByZXZfY29tbWEgKSB7CisgICAgICAgICAgICAgICAgLy8gTnVtIHRocmVhZHMgaXMgaW5oZXJpdGVkIGZyb20gdGhlIHByZXZpb3VzIGxldmVsCisgICAgICAgICAgICAgICAgbnRoX2FycmF5LT5udGhbaV0gPSBudGhfYXJyYXktPm50aFtpIC0gMV07CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIHRvdGFsKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmV2X2NvbW1hID0gVFJVRTsKKyAgICAgICAgICAgIHNjYW4rKzsgLy9za2lwICcsJworICAgICAgICAgICAgU0tJUF9XUyggc2NhbiApOworICAgICAgICB9CisgICAgICAgIC8vIE5leHQgY2hhcmFjdGVyIGlzIGEgZGlnaXQKKyAgICAgICAgaWYgKCAqc2NhbiA+PSAnMCcgJiYgKnNjYW4gPD0gJzknICkgeworICAgICAgICAgICAgaW50IG51bTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJ1ZiA9IHNjYW47CisgICAgICAgICAgICBjaGFyIGNvbnN0ICogbXNnICA9IE5VTEw7CisgICAgICAgICAgICBwcmV2X2NvbW1hID0gRkFMU0U7CisgICAgICAgICAgICBTS0lQX0RJR0lUUyggc2NhbiApOworICAgICAgICAgICAgdG90YWwrKzsKKworICAgICAgICAgICAgbnVtID0gX19rbXBfc3RyX3RvX2ludCggYnVmLCAqc2NhbiApOworICAgICAgICAgICAgaWYgKCBudW0gPCBLTVBfTUlOX05USCApIHsKKyAgICAgICAgICAgICAgICBtc2cgPSBLTVBfSTE4Tl9TVFIoIFZhbHVlVG9vU21hbGwgKTsKKyAgICAgICAgICAgICAgICBudW0gPSBLTVBfTUlOX05USDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIG51bSA+IF9fa21wX3N5c19tYXhfbnRoICkgeworICAgICAgICAgICAgICAgIG1zZyA9IEtNUF9JMThOX1NUUiggVmFsdWVUb29MYXJnZSApOworICAgICAgICAgICAgICAgIG51bSA9IF9fa21wX3N5c19tYXhfbnRoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBtc2cgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAvLyBNZXNzYWdlIGlzIG5vdCBlbXB0eS4gUHJpbnQgd2FybmluZy4KKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggUGFyc2VTaXplSW50V2FybiwgdmFyLCBlbnYsIG1zZyApOworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oIFVzaW5nX2ludF9WYWx1ZSwgdmFyLCBudW0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG50aF9hcnJheS0+bnRoW2krK10gPSBudW07CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfbnVtX3RocmVhZHMoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIC8vIFRPRE86IFJlbW92ZSB0aGlzIG9wdGlvbi4gT01QX05VTV9USFJFQURTIGlzIGEgbGlzdCBvZiBwb3NpdGl2ZSBpbnRlZ2VycyEKKyAgICBpZiAoICEgX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCAiYWxsIiwgdmFsdWUsIDAgKSApIHsKKyAgICAgICAgLy8gVGhlIGFycmF5IG9mIDEgZWxlbWVudAorICAgICAgICBfX2ttcF9uZXN0ZWRfbnRoLm50aCA9ICggaW50KiApS01QX0lOVEVSTkFMX01BTExPQyggc2l6ZW9mKCBpbnQgKSApOworICAgICAgICBfX2ttcF9uZXN0ZWRfbnRoLnNpemUgPSBfX2ttcF9uZXN0ZWRfbnRoLnVzZWQgPSAxOworICAgICAgICBfX2ttcF9uZXN0ZWRfbnRoLm50aFswXSA9IF9fa21wX2RmbHRfdGVhbV9udGggPSBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViID0gX19rbXBfeHByb2M7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfcGFyc2VfbmVzdGVkX251bV90aHJlYWRzKCBuYW1lLCB2YWx1ZSwgJiBfX2ttcF9uZXN0ZWRfbnRoICk7CisgICAgICAgIGlmICggX19rbXBfbmVzdGVkX250aC5udGggKSB7CisgICAgICAgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoID0gX19rbXBfbmVzdGVkX250aC5udGhbMF07CisgICAgICAgICAgICBpZiAoIF9fa21wX2RmbHRfdGVhbV9udGhfdWIgPCBfX2ttcF9kZmx0X3RlYW1fbnRoICkgeworICAgICAgICAgICAgICAgIF9fa21wX2RmbHRfdGVhbV9udGhfdWIgPSBfX2ttcF9kZmx0X3RlYW1fbnRoOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsgLy8gaWYKKyAgICBLX0RJQUcoIDEsICggIl9fa21wX2RmbHRfdGVhbV9udGggPT0gJWRcbiIsIF9fa21wX2RmbHRfdGVhbV9udGggKSApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfbnVtX3RocmVhZHMKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9udW1fdGhyZWFkcygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIGlmKCBfX2ttcF9lbnZfZm9ybWF0ICkgeworICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9OQU1FOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzIiwgbmFtZSApOworICAgIH0KKyAgICBpZiAoIF9fa21wX25lc3RlZF9udGgudXNlZCApIHsKKyAgICAgICAga21wX3N0cl9idWZfdCBidWY7CisgICAgICAgIF9fa21wX3N0cl9idWZfaW5pdCggJmJ1ZiApOworICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBfX2ttcF9uZXN0ZWRfbnRoLnVzZWQ7IGkrKykgeworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJmJ1ZiwgIiVkIiwgX19rbXBfbmVzdGVkX250aC5udGhbaV0gKTsKKyAgICAgICAgICAgIGlmICggaSA8IF9fa21wX25lc3RlZF9udGgudXNlZCAtIDEgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJmJ1ZiwgIiwiICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiPSclcydcbiIsIGJ1Zi5zdHIgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCZidWYpOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIjogJXNcbiIsIEtNUF9JMThOX1NUUiggTm90RGVmaW5lZCApICk7CisgICAgfQorfSAvLyBfX2ttcF9zdGdfcHJpbnRfbnVtX3RocmVhZHMKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT3Blbk1QIDMuMDogS01QX1RBU0tJTkcsIE9NUF9NQVhfQUNUSVZFX0xFVkVMUywKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIE9NUF8zMF9FTkFCTEVECitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3Rhc2tpbmcoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9pbnQoIG5hbWUsIHZhbHVlLCAwLCAoaW50KXRza21fbWF4LCAoaW50ICopJl9fa21wX3Rhc2tpbmdfbW9kZSApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfdGFza2luZworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3Rhc2tpbmcoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIF9fa21wX3Rhc2tpbmdfbW9kZSApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfdGFza2luZworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3Rhc2tfc3RlYWxpbmcoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9pbnQoIG5hbWUsIHZhbHVlLCAwLCAxLCAoaW50ICopJl9fa21wX3Rhc2tfc3RlYWxpbmdfY29uc3RyYWludCApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfdGFza19zdGVhbGluZworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3Rhc2tfc3RlYWxpbmcoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIF9fa21wX3Rhc2tfc3RlYWxpbmdfY29uc3RyYWludCApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfdGFza19zdGVhbGluZworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX21heF9hY3RpdmVfbGV2ZWxzKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKwkgX19rbXBfc3RnX3BhcnNlX2ludCggbmFtZSwgdmFsdWUsIDAsIEtNUF9NQVhfQUNUSVZFX0xFVkVMU19MSU1JVCwgJiBfX2ttcF9kZmx0X21heF9hY3RpdmVfbGV2ZWxzICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9tYXhfYWN0aXZlX2xldmVscworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X21heF9hY3RpdmVfbGV2ZWxzKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF9kZmx0X21heF9hY3RpdmVfbGV2ZWxzICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9tYXhfYWN0aXZlX2xldmVscworI2VuZGlmIC8vIE9NUF8zMF9FTkFCTEVECisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9IQU5ETEVfU0lHTkFMUworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgS01QX0hBTkRMRV9TSUdOQUxTCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfaGFuZGxlX3NpZ25hbHMoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworCV9fa21wX3N0Z19wYXJzZV9ib29sKCBuYW1lLCB2YWx1ZSwgJiBfX2ttcF9oYW5kbGVfc2lnbmFscyApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfaGFuZGxlX3NpZ25hbHMKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9oYW5kbGVfc2lnbmFscygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9ib29sKCBidWZmZXIsIG5hbWUsIF9fa21wX2hhbmRsZV9zaWduYWxzICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9oYW5kbGVfc2lnbmFscworCisjZW5kaWYgLy8gS01QX0hBTkRMRV9TSUdOQUxTCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9YX0RFQlVHLCBLTVBfREVCVUcsIEtNUF9ERUJVR19CVUZfKiwgS01QX0RJQUcKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIEtNUF9ERUJVRworCisjZGVmaW5lIEtNUF9TVEdfWF9ERUJVRyggeCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcGFyc2VfIyN4IyNfZGVidWcoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeyAgICAgXAorCV9fa21wX3N0Z19wYXJzZV9pbnQoIG5hbWUsIHZhbHVlLCAwLCBJTlRfTUFYLCAmIGttcF8jI3gjI19kZWJ1ZyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IC8qIF9fa21wX3N0Z19wYXJzZV94X2RlYnVnICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyB2b2lkIF9fa21wX3N0Z19wcmludF8jI3gjI19kZWJ1Zygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeyBcCisJX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBrbXBfIyN4IyNfZGVidWcgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gLyogX19rbXBfc3RnX3ByaW50X3hfZGVidWcgKi8KKworS01QX1NUR19YX0RFQlVHKCBhICkKK0tNUF9TVEdfWF9ERUJVRyggYiApCitLTVBfU1RHX1hfREVCVUcoIGMgKQorS01QX1NUR19YX0RFQlVHKCBkICkKK0tNUF9TVEdfWF9ERUJVRyggZSApCitLTVBfU1RHX1hfREVCVUcoIGYgKQorCisjdW5kZWYgS01QX1NUR19YX0RFQlVHCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfZGVidWcoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIGludCBkZWJ1ZyA9IDA7CisgICAgX19rbXBfc3RnX3BhcnNlX2ludCggbmFtZSwgdmFsdWUsIDAsIElOVF9NQVgsICYgZGVidWcgKTsKKyAgICBpZiAoIGttcF9hX2RlYnVnIDwgZGVidWcgKSB7CisJa21wX2FfZGVidWcgPSBkZWJ1ZzsKKyAgICB9OyAvLyBpZgorICAgIGlmICgga21wX2JfZGVidWcgPCBkZWJ1ZyApIHsKKwlrbXBfYl9kZWJ1ZyA9IGRlYnVnOworICAgIH07IC8vIGlmCisgICAgaWYgKCBrbXBfY19kZWJ1ZyA8IGRlYnVnICkgeworCWttcF9jX2RlYnVnID0gZGVidWc7CisgICAgfTsgLy8gaWYKKyAgICBpZiAoIGttcF9kX2RlYnVnIDwgZGVidWcgKSB7CisJa21wX2RfZGVidWcgPSBkZWJ1ZzsKKyAgICB9OyAvLyBpZgorICAgIGlmICgga21wX2VfZGVidWcgPCBkZWJ1ZyApIHsKKwlrbXBfZV9kZWJ1ZyA9IGRlYnVnOworICAgIH07IC8vIGlmCisgICAgaWYgKCBrbXBfZl9kZWJ1ZyA8IGRlYnVnICkgeworCWttcF9mX2RlYnVnID0gZGVidWc7CisgICAgfTsgLy8gaWYKK30gLy8gX19rbXBfc3RnX3BhcnNlX2RlYnVnCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfZGVidWdfYnVmKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfYm9vbCggbmFtZSwgdmFsdWUsICYgX19rbXBfZGVidWdfYnVmICk7CisgICAgLy8gISEhIFRPRE86IE1vdmUgYnVmZmVyIGluaXRpYWxpemF0aW9uIG9mIG9mIHRoaXMgZmlsZSEgSXQgbWF5IHdvcmtzIGluY29ycmVjdGx5IGlmCisgICAgLy8gS01QX0RFQlVHX0JVRiBpcyBwYXJzZWQgYmVmb3JlIEtNUF9ERUJVR19CVUZfTElORVMgb3IgS01QX0RFQlVHX0JVRl9DSEFSUy4KKyAgICBpZiAoIF9fa21wX2RlYnVnX2J1ZiApIHsKKwlpbnQgaTsKKwlpbnQgZWxlbWVudHMgPSBfX2ttcF9kZWJ1Z19idWZfbGluZXMgKiBfX2ttcF9kZWJ1Z19idWZfY2hhcnM7CisKKwkvKiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhbGwgZW50cmllcyBpbiBkZWJ1ZyBidWZmZXIgdG8gZW1wdHkgKi8KKwlfX2ttcF9kZWJ1Z19idWZmZXIgPSAoY2hhciAqKSBfX2ttcF9wYWdlX2FsbG9jYXRlKCBlbGVtZW50cyAqIHNpemVvZiggY2hhciApICk7CisJZm9yICggaSA9IDA7IGkgPCBlbGVtZW50czsgaSArPSBfX2ttcF9kZWJ1Z19idWZfY2hhcnMgKQorCSAgIF9fa21wX2RlYnVnX2J1ZmZlcltpXSA9ICdcMCc7CisKKwlfX2ttcF9kZWJ1Z19jb3VudCA9IDA7CisgICAgfQorICAgIEtfRElBRyggMSwgKCAiX19rbXBfZGVidWdfYnVmID0gJWRcbiIsIF9fa21wX2RlYnVnX2J1ZiApICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9kZWJ1Z19idWYKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9kZWJ1Z19idWYoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfYm9vbCggYnVmZmVyLCBuYW1lLCBfX2ttcF9kZWJ1Z19idWYgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2RlYnVnX2J1ZgorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2RlYnVnX2J1Zl9hdG9taWMoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9ib29sKCBuYW1lLCB2YWx1ZSwgJiBfX2ttcF9kZWJ1Z19idWZfYXRvbWljICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9kZWJ1Z19idWZfYXRvbWljCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfZGVidWdfYnVmX2F0b21pYygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9ib29sKCBidWZmZXIsIG5hbWUsIF9fa21wX2RlYnVnX2J1Zl9hdG9taWMgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2RlYnVnX2J1Zl9hdG9taWMKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9kZWJ1Z19idWZfY2hhcnMoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9pbnQoCisJbmFtZSwKKwl2YWx1ZSwKKwlLTVBfREVCVUdfQlVGX0NIQVJTX01JTiwKKwlJTlRfTUFYLAorCSYgX19rbXBfZGVidWdfYnVmX2NoYXJzCisgICAgKTsKK30gLy8gX19rbXBfc3RnX2RlYnVnX3BhcnNlX2J1Zl9jaGFycworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2RlYnVnX2J1Zl9jaGFycygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfZGVidWdfYnVmX2NoYXJzICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9kZWJ1Z19idWZfY2hhcnMKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9kZWJ1Z19idWZfbGluZXMoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9pbnQoCisJbmFtZSwKKwl2YWx1ZSwKKwlLTVBfREVCVUdfQlVGX0xJTkVTX01JTiwKKwlJTlRfTUFYLAorCSYgX19rbXBfZGVidWdfYnVmX2xpbmVzCisgICAgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2RlYnVnX2J1Zl9saW5lcworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2RlYnVnX2J1Zl9saW5lcygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfZGVidWdfYnVmX2xpbmVzICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9kZWJ1Z19idWZfbGluZXMKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9kaWFnKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgMCwgSU5UX01BWCwgJiBrbXBfZGlhZyApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfZGlhZworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2RpYWcoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIGttcF9kaWFnICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9kaWFnCisKKyNlbmRpZiAvLyBLTVBfREVCVUcKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0FMSUdOX0FMTE9DCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfYWxpZ25fYWxsb2MoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9zaXplKAorICAgICAgICBuYW1lLAorICAgICAgICB2YWx1ZSwKKyAgICAgICAgQ0FDSEVfTElORSwKKyAgICAgICAgSU5UX01BWCwKKyAgICAgICAgTlVMTCwKKyAgICAgICAgJiBfX2ttcF9hbGlnbl9hbGxvYywKKyAgICAgICAgMQorICAgICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9hbGlnbl9hbGxvYworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2FsaWduX2FsbG9jKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgICAgIF9fa21wX3N0Z19wcmludF9zaXplKCBidWZmZXIsIG5hbWUsIF9fa21wX2FsaWduX2FsbG9jICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9hbGlnbl9hbGxvYworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfUExBSU5fQkFSUklFUiwgS01QX0ZPUktKT0lOX0JBUlJJRVIsIEtNUF9SRURVQ1RJT05fQkFSUklFUgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBUT0RPOiBSZW1vdmUgX19rbXBfYmFycmllcl9icmFuY2hfYml0X2Vudl9uYW1lIHZhcmliYWxlLCByZW1vdmUgbG9vcHMgZnJvbSBwYXJzZSBhbmQgcHJpbnQKKy8vICAgICAgIGZ1bmN0aW9ucywgcGFzcyByZXF1aXJlZCBpbmZvIHRocm91Z2ggZGF0YSBhcmd1bWVudC4KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9iYXJyaWVyX2JyYW5jaF9iaXQoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIGNvbnN0IGNoYXIgKnZhcjsKKworICAgIC8qIC0tLS0tLS0tLS0gQmFycmllciBicmFuY2ggYml0IGNvbnRyb2wgLS0tLS0tLS0tLS0tICovCisKKyAgICBmb3IgKCBpbnQgaT1ic19wbGFpbl9iYXJyaWVyOyBpPGJzX2xhc3RfYmFycmllcjsgaSsrICkgeworICAgICAgICB2YXIgPSBfX2ttcF9iYXJyaWVyX2JyYW5jaF9iaXRfZW52X25hbWVbIGkgXTsKKworICAgICAgICBpZiAoICggc3RyY21wKCB2YXIsIG5hbWUpID09IDAgKSAmJiAoIHZhbHVlICE9IDAgKSApIHsKKyAgICAgICAgICAgIGNoYXIgICAqY29tbWE7CisKKyAgICAgICAgICAgIGNvbW1hID0gKGNoYXIgKikgc3RyY2hyKCB2YWx1ZSwgJywnICk7CisgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX2dhdGhlcl9icmFuY2hfYml0c1sgaSBdID0gKCBrbXBfdWludDMyICkgX19rbXBfc3RyX3RvX2ludCggdmFsdWUsICcsJyApOworICAgICAgICAgICAgLyogaXMgdGhlcmUgYSBzcGVjaWZpZWQgcmVsZWFzZSBwYXJhbWV0ZXI/ICovCisgICAgICAgICAgICBpZiAoIGNvbW1hID09IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfYmFycmllcl9yZWxlYXNlX2JyYW5jaF9iaXRzWyBpIF0gPSBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYmJfZGZsdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgX19rbXBfYmFycmllcl9yZWxlYXNlX2JyYW5jaF9iaXRzWyBpIF0gPSAoa21wX3VpbnQzMikgX19rbXBfc3RyX3RvX2ludCggY29tbWEgKyAxLCAwICk7CisKKyAgICAgICAgICAgICAgICBpZiAoIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1sgaSBdID4gS01QX01BWF9CUkFOQ0hfQklUUyApIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKCBrbXBfbXNfd2FybmluZywgS01QX01TRyggQmFyclJlbGVhc2VWYWx1ZUludmFsaWQsIG5hbWUsIGNvbW1hICsgMSApLCBfX2ttcF9tc2dfbnVsbCApOworCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1sgaSBdID0gX19rbXBfYmFycmllcl9yZWxlYXNlX2JiX2RmbHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBfX2ttcF9iYXJyaWVyX2dhdGhlcl9icmFuY2hfYml0c1sgaSBdID4gS01QX01BWF9CUkFOQ0hfQklUUyApIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEJhcnJHYXRoZXJWYWx1ZUludmFsaWQsIG5hbWUsIHZhbHVlICk7CisgICAgICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oIFVzaW5nX3VpbnRfVmFsdWUsIG5hbWUsIF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JiX2RmbHQgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX2dhdGhlcl9icmFuY2hfYml0c1sgaSBdID0gIF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JiX2RmbHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgS19ESUFHKDEsICgiJXMgPT0gJWQsJWRcbiIsIF9fa21wX2JhcnJpZXJfYnJhbmNoX2JpdF9lbnZfbmFtZVsgaSBdLCBcCisgICAgICAgICAgICAgICAgICAgX19rbXBfYmFycmllcl9nYXRoZXJfYnJhbmNoX2JpdHMgWyBpIF0sIFwKKyAgICAgICAgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHMgWyBpIF0pKQorICAgIH0KK30gLy8gX19rbXBfc3RnX3BhcnNlX2JhcnJpZXJfYnJhbmNoX2JpdAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2JhcnJpZXJfYnJhbmNoX2JpdCgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIGNvbnN0IGNoYXIgKnZhcjsKKyAgICBmb3IgKCBpbnQgaT1ic19wbGFpbl9iYXJyaWVyOyBpPGJzX2xhc3RfYmFycmllcjsgaSsrICkgeworICAgICAgICB2YXIgPSBfX2ttcF9iYXJyaWVyX2JyYW5jaF9iaXRfZW52X25hbWVbIGkgXTsKKyAgICAgICAgaWYgKCBzdHJjbXAoIHZhciwgbmFtZSkgPT0gMCAgKSB7CisgICAgICAgICAgICBpZiggX19rbXBfZW52X2Zvcm1hdCApIHsKKyAgICAgICAgICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9OQU1FX0VYKF9fa21wX2JhcnJpZXJfYnJhbmNoX2JpdF9lbnZfbmFtZVsgaSBdKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXM9JyIsIF9fa21wX2JhcnJpZXJfYnJhbmNoX2JpdF9lbnZfbmFtZVsgaSBdICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlZCwlZCdcbiIsIF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JyYW5jaF9iaXRzIFsgaSBdLCBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHMgWyBpIF0pOworICAgICAgICB9CisgICAgfQorfSAvLyBfX2ttcF9zdGdfcHJpbnRfYmFycmllcl9icmFuY2hfYml0CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX1BMQUlOX0JBUlJJRVJfUEFUVEVSTiwgS01QX0ZPUktKT0lOX0JBUlJJRVJfUEFUVEVSTiwgS01QX1JFRFVDVElPTl9CQVJSSUVSX1BBVFRFUk4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gVE9ETzogUmVtb3ZlIF9fa21wX2JhcnJpZXJfcGF0dGVybl9uYW1lIHZhcmlhYmxlLCByZW1vdmUgbG9vcHMgZnJvbSBwYXJzZSBhbmQgcHJpbnQgZnVuY3Rpb25zLAorLy8gICAgICAgcGFzcyByZXF1aXJlZCBkYXRhIHRvIGZ1bmN0aW9ucyB0aHJvdWdoIGRhdGEgYXJndW1lbnQuCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfYmFycmllcl9wYXR0ZXJuKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBjb25zdCBjaGFyICp2YXI7CisgICAgLyogLS0tLS0tLS0tLSBCYXJyaWVyIG1ldGhvZCBjb250cm9sIC0tLS0tLS0tLS0tLSAqLworCisgICAgZm9yICggaW50IGk9YnNfcGxhaW5fYmFycmllcjsgaTxic19sYXN0X2JhcnJpZXI7IGkrKyApIHsKKyAgICAgICAgdmFyID0gX19rbXBfYmFycmllcl9wYXR0ZXJuX2Vudl9uYW1lWyBpIF07CisKKyAgICAgICAgaWYgKCAoIHN0cmNtcCAoIHZhciwgbmFtZSApID09IDAgKSAmJiAoIHZhbHVlICE9IDAgKSApIHsKKyAgICAgICAgICAgIGludCBqOworICAgICAgICAgICAgY2hhciAqY29tbWEgPSAoY2hhciAqKSBzdHJjaHIoIHZhbHVlLCAnLCcgKTsKKworICAgICAgICAgICAgLyogaGFuZGxlIGZpcnN0IHBhcmFtZXRlcjogZ2F0aGVyIHBhdHRlcm4gKi8KKyAgICAgICAgICAgIGZvciAoIGogPSBicF9saW5lYXJfYmFyOyBqPGJwX2xhc3RfYmFyOyBqKysgKSB7CisgICAgICAgICAgICAgICAgaWYgKF9fa21wX21hdGNoX3dpdGhfc2VudGluZWwoIF9fa21wX2JhcnJpZXJfcGF0dGVybl9uYW1lW2pdLCB2YWx1ZSwgMSwgJywnICkpIHsKKyAgICAgICAgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX2dhdGhlcl9wYXR0ZXJuWyBpIF0gPSAoa21wX2Jhcl9wYXRfZSkgajsKKyAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGogPT0gYnBfbGFzdF9iYXIgKSB7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEJhcnJHYXRoZXJWYWx1ZUludmFsaWQsIG5hbWUsIHZhbHVlICk7CisgICAgICAgICAgICAgICAgS01QX0lORk9STSggVXNpbmdfc3RyX1ZhbHVlLCBuYW1lLCBfX2ttcF9iYXJyaWVyX3BhdHRlcm5fbmFtZVsgYnBfbGluZWFyX2JhciBdICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGhhbmRsZSBzZWNvbmQgcGFyYW1ldGVyOiByZWxlYXNlIHBhdHRlcm4gKi8KKyAgICAgICAgICAgIGlmICggY29tbWEgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBmb3IgKCBqID0gYnBfbGluZWFyX2JhcjsgaiA8IGJwX2xhc3RfYmFyOyBqKysgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggX19rbXBfc3RyX21hdGNoKCBfX2ttcF9iYXJyaWVyX3BhdHRlcm5fbmFtZVtqXSwgMSwgY29tbWEgKyAxICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXR0ZXJuWyBpIF0gPSAoa21wX2Jhcl9wYXRfZSkgajsKKyAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGogPT0gYnBfbGFzdF9iYXIpIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKCBrbXBfbXNfd2FybmluZywgS01QX01TRyggQmFyclJlbGVhc2VWYWx1ZUludmFsaWQsIG5hbWUsIGNvbW1hICsgMSApLCBfX2ttcF9tc2dfbnVsbCApOworICAgICAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKCBVc2luZ19zdHJfVmFsdWUsIG5hbWUsIF9fa21wX2JhcnJpZXJfcGF0dGVybl9uYW1lWyBicF9saW5lYXJfYmFyIF0gKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9iYXJyaWVyX3BhdHRlcm4KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9iYXJyaWVyX3BhdHRlcm4oIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBjb25zdCBjaGFyICp2YXI7CisgICAgZm9yICggaW50IGk9YnNfcGxhaW5fYmFycmllcjsgaTxic19sYXN0X2JhcnJpZXI7IGkrKyApIHsKKyAgICAgICAgdmFyID0gX19rbXBfYmFycmllcl9wYXR0ZXJuX2Vudl9uYW1lWyBpIF07CisgICAgICAgIGlmICggc3RyY21wICggdmFyLCBuYW1lICkgPT0gMCApIHsKKyAgICAgICAgICAgIGludCBqID0gX19rbXBfYmFycmllcl9nYXRoZXJfcGF0dGVybiBbIGkgXTsKKyAgICAgICAgICAgIGludCBrID0gX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdHRlcm4gWyBpIF07CisgICAgICAgICAgICBpZiggX19rbXBfZW52X2Zvcm1hdCApIHsKKyAgICAgICAgICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9OQU1FX0VYKF9fa21wX2JhcnJpZXJfcGF0dGVybl9lbnZfbmFtZVsgaSBdKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXM9JyIsIF9fa21wX2JhcnJpZXJfcGF0dGVybl9lbnZfbmFtZVsgaSBdICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcywlcydcbiIsIF9fa21wX2JhcnJpZXJfcGF0dGVybl9uYW1lIFsgaiBdLCBfX2ttcF9iYXJyaWVyX3BhdHRlcm5fbmFtZSBbIGsgXSk7CisgICAgICAgIH0KKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wcmludF9iYXJyaWVyX3BhdHRlcm4KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0FCT1JUX0RFTEFZCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfYWJvcnRfZGVsYXkoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIC8vIFVuaXRzIG9mIEtNUF9ERUxBWV9BQk9SVCBhcmUgc2Vjb25kcywgdW5pdHMgb2YgX19rbXBfYWJvcnRfZGVsYXkgaXMgbWlsbGlzZWNvbmRzLgorICAgIGludCBkZWxheSA9IF9fa21wX2Fib3J0X2RlbGF5IC8gMTAwMDsKKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgMCwgSU5UX01BWCAvIDEwMDAsICYgZGVsYXkgKTsKKyAgICBfX2ttcF9hYm9ydF9kZWxheSA9IGRlbGF5ICogMTAwMDsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2Fib3J0X2RlbGF5CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfYWJvcnRfZGVsYXkoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIF9fa21wX2Fib3J0X2RlbGF5ICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9hYm9ydF9kZWxheQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfQ1BVSU5GT19GSUxFCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfY3B1aW5mb19maWxlKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICAjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICBfX2ttcF9zdGdfcGFyc2Vfc3RyKCBuYW1lLCB2YWx1ZSwgJiBfX2ttcF9jcHVpbmZvX2ZpbGUgKTsKKyAgICAgICAgS19ESUFHKCAxLCAoICJfX2ttcF9jcHVpbmZvX2ZpbGUgPT0gJXNcbiIsIF9fa21wX2NwdWluZm9fZmlsZSApICk7CisgICAgI2VuZGlmCit9IC8vX19rbXBfc3RnX3BhcnNlX2NwdWluZm9fZmlsZQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2NwdWluZm9fZmlsZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgICNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIGlmKCBfX2ttcF9lbnZfZm9ybWF0ICkgeworICAgICAgICAgICAgS01QX1NUUl9CVUZfUFJJTlRfTkFNRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzIiwgbmFtZSApOworICAgICAgICB9CisgICAgICAgIGlmICggX19rbXBfY3B1aW5mb19maWxlICkgeworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiPSclcydcbiIsIF9fa21wX2NwdWluZm9fZmlsZSApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiOiAlc1xuIiwgS01QX0kxOE5fU1RSKCBOb3REZWZpbmVkICkgKTsKKyAgICAgICAgfQorICAgICNlbmRpZgorfSAvL19fa21wX3N0Z19wcmludF9jcHVpbmZvX2ZpbGUKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0ZPUkNFX1JFRFVDVElPTiwgS01QX0RFVEVSTUlOSVNUSUNfUkVEVUNUSU9OCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfZm9yY2VfcmVkdWN0aW9uKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApCit7CisgICAga21wX3N0Z19mcl9kYXRhX3QgKiByZWR1Y3Rpb24gPSAoa21wX3N0Z19mcl9kYXRhX3QgKikgZGF0YTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHJjOworCisgICAgcmMgPSBfX2ttcF9zdGdfY2hlY2tfcml2YWxzKCBuYW1lLCB2YWx1ZSwgcmVkdWN0aW9uLT5yaXZhbHMgKTsKKyAgICBpZiAoIHJjICkgeworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKyAgICBpZiAoIHJlZHVjdGlvbi0+Zm9yY2UgKSB7CisgICAgICAgIGlmKCB2YWx1ZSAhPSAwICkgeworICAgICAgICAgICAgaWYoIF9fa21wX3N0cl9tYXRjaCggImNyaXRpY2FsIiwgMCwgdmFsdWUgKSApCisgICAgICAgICAgICAgICBfX2ttcF9mb3JjZV9yZWR1Y3Rpb25fbWV0aG9kID0gY3JpdGljYWxfcmVkdWNlX2Jsb2NrOworICAgICAgICAgICAgZWxzZSBpZiggX19rbXBfc3RyX21hdGNoKCAiYXRvbWljIiwgMCwgdmFsdWUgKSApCisgICAgICAgICAgICAgICBfX2ttcF9mb3JjZV9yZWR1Y3Rpb25fbWV0aG9kID0gYXRvbWljX3JlZHVjZV9ibG9jazsKKyAgICAgICAgICAgIGVsc2UgaWYoIF9fa21wX3N0cl9tYXRjaCggInRyZWUiLCAwLCB2YWx1ZSApICkKKyAgICAgICAgICAgICAgIF9fa21wX2ZvcmNlX3JlZHVjdGlvbl9tZXRob2QgPSB0cmVlX3JlZHVjZV9ibG9jazsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9GQVRBTCggVW5rbm93bkZvcmNlUmVkdWN0aW9uLCBuYW1lLCB2YWx1ZSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIF9fa21wX2RldGVybV9yZWQgKTsKKyAgICAgICAgaWYoIF9fa21wX2RldGVybV9yZWQgKSB7CisgICAgICAgICAgICBfX2ttcF9mb3JjZV9yZWR1Y3Rpb25fbWV0aG9kID0gdHJlZV9yZWR1Y2VfYmxvY2s7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfX2ttcF9mb3JjZV9yZWR1Y3Rpb25fbWV0aG9kID0gcmVkdWN0aW9uX21ldGhvZF9ub3RfZGVmaW5lZDsKKyAgICAgICAgfQorICAgIH0KKyAgICBLX0RJQUcoIDEsICggIl9fa21wX2ZvcmNlX3JlZHVjdGlvbl9tZXRob2QgPT0gJWRcbiIsIF9fa21wX2ZvcmNlX3JlZHVjdGlvbl9tZXRob2QgKSApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfZm9yY2VfcmVkdWN0aW9uCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfZm9yY2VfcmVkdWN0aW9uKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisKKyAgICBrbXBfc3RnX2ZyX2RhdGFfdCAqIHJlZHVjdGlvbiA9IChrbXBfc3RnX2ZyX2RhdGFfdCAqKSBkYXRhOworICAgIGNoYXIgY29uc3QgKiAgICAgICAgdmFsdWUgPSBOVUxMOworICAgIGlmICggcmVkdWN0aW9uLT5mb3JjZSApIHsKKyAgICAgICAgaWYoIF9fa21wX2ZvcmNlX3JlZHVjdGlvbl9tZXRob2QgPT0gY3JpdGljYWxfcmVkdWNlX2Jsb2NrKSB7CisgICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RyKCBidWZmZXIsIG5hbWUsICJjcml0aWNhbCIpOworICAgICAgICB9IGVsc2UgaWYgKCBfX2ttcF9mb3JjZV9yZWR1Y3Rpb25fbWV0aG9kID09IGF0b21pY19yZWR1Y2VfYmxvY2sgKSB7CisgICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RyKCBidWZmZXIsIG5hbWUsICJhdG9taWMiKTsKKyAgICAgICAgfSBlbHNlIGlmICggX19rbXBfZm9yY2VfcmVkdWN0aW9uX21ldGhvZCA9PSB0cmVlX3JlZHVjZV9ibG9jayApIHsKKyAgICAgICAgICAgIF9fa21wX3N0Z19wcmludF9zdHIoIGJ1ZmZlciwgbmFtZSwgInRyZWUiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmKCBfX2ttcF9lbnZfZm9ybWF0ICkgeworICAgICAgICAgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzIiwgbmFtZSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiOiAlc1xuIiwgS01QX0kxOE5fU1RSKCBOb3REZWZpbmVkICkgKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0Z19wcmludF9ib29sKCBidWZmZXIsIG5hbWUsIF9fa21wX2RldGVybV9yZWQgKTsKKyAgICB9CisKKworfSAvLyBfX2ttcF9zdGdfcHJpbnRfZm9yY2VfcmVkdWN0aW9uCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9TVE9SQUdFX01BUAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3N0b3JhZ2VfbWFwKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBpZiAoIF9fa21wX3N0cl9tYXRjaCggICJ2ZXJib3NlIiwgMSwgdmFsdWUgKSApIHsKKyAgICAgICAgX19rbXBfc3RvcmFnZV9tYXAgICAgICAgICA9IFRSVUU7CisgICAgICAgIF9fa21wX3N0b3JhZ2VfbWFwX3ZlcmJvc2UgPSBUUlVFOworICAgICAgICBfX2ttcF9zdG9yYWdlX21hcF92ZXJib3NlX3NwZWNpZmllZCA9IFRSVUU7CisKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdG9yYWdlX21hcF92ZXJib3NlID0gRkFMU0U7CisgICAgICAgIF9fa21wX3N0Z19wYXJzZV9ib29sKCBuYW1lLCB2YWx1ZSwgJiBfX2ttcF9zdG9yYWdlX21hcCApOyAvLyAhISEKKyAgICB9OyAvLyBpZgorfSAvLyBfX2ttcF9zdGdfcGFyc2Vfc3RvcmFnZV9tYXAKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9zdG9yYWdlX21hcCgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIGlmICggX19rbXBfc3RvcmFnZV9tYXBfdmVyYm9zZSB8fCBfX2ttcF9zdG9yYWdlX21hcF92ZXJib3NlX3NwZWNpZmllZCApIHsKKyAgICAgICAgX19rbXBfc3RnX3ByaW50X3N0ciggYnVmZmVyLCBuYW1lLCAidmVyYm9zZSIgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdGdfcHJpbnRfYm9vbCggYnVmZmVyLCBuYW1lLCBfX2ttcF9zdG9yYWdlX21hcCApOworICAgIH0KK30gLy8gX19rbXBfc3RnX3ByaW50X3N0b3JhZ2VfbWFwCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9BTExfVEhSRUFEUFJJVkFURQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2FsbF90aHJlYWRwcml2YXRlKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgX19rbXBfYWxsVGhyZWFkc1NwZWNpZmllZCA/IF9fa21wX21heF9udGggOiAxLCBfX2ttcF9tYXhfbnRoLAorICAgICAgICAmIF9fa21wX3RwX2NhcGFjaXR5ICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9hbGxfdGhyZWFkcHJpdmF0ZQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2FsbF90aHJlYWRwcml2YXRlKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF90cF9jYXBhY2l0eSApOworCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9GT1JFSUdOX1RIUkVBRFNfVEhSRUFEUFJJVkFURQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2ZvcmVpZ25fdGhyZWFkc190aHJlYWRwcml2YXRlKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfYm9vbCggbmFtZSwgdmFsdWUsICYgX19rbXBfZm9yZWlnbl90cCApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfZm9yZWlnbl90aHJlYWRzX3RocmVhZHByaXZhdGUKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9mb3JlaWduX3RocmVhZHNfdGhyZWFkcHJpdmF0ZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9ib29sKCBidWZmZXIsIG5hbWUsIF9fa21wX2ZvcmVpZ25fdHAgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2ZvcmVpZ25fdGhyZWFkc190aHJlYWRwcml2YXRlCisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0FGRklOSVRZLCBHT01QX0NQVV9BRkZJTklUWSwgS01QX1RPUE9MT0dZX01FVEhPRAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorLy8KKy8vIFBhcnNlIHRoZSBwcm9jIGlkIGxpc3QuICBSZXR1cm4gVFJVRSBpZiBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UuCisvLworc3RhdGljIGludAorX19rbXBfcGFyc2VfYWZmaW5pdHlfcHJvY19pZF9saXN0KCBjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKmVudiwKKyAgICBjb25zdCBjaGFyICoqbmV4dEVudiwgY2hhciAqKnByb2NsaXN0ICkKK3sKKyAgICBjb25zdCBjaGFyICpzY2FuID0gZW52OworICAgIGNvbnN0IGNoYXIgKm5leHQgPSBzY2FuOworICAgIGludCBlbXB0eSA9IFRSVUU7CisKKyAgICAqcHJvY2xpc3QgPSBOVUxMOworCisgICAgZm9yICg7OykgeworICAgICAgICBpbnQgc3RhcnQsIGVuZCwgc3RyaWRlOworCisgICAgICAgIFNLSVBfV1Moc2Nhbik7CisgICAgICAgIG5leHQgPSBzY2FuOworICAgICAgICBpZiAoKm5leHQgPT0gJ1wwJykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKm5leHQgPT0gJ3snKSB7CisgICAgICAgICAgICBpbnQgbnVtOworICAgICAgICAgICAgbmV4dCsrOyAgICAgLy8gc2tpcCAneycKKyAgICAgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgICAgICBzY2FuID0gbmV4dDsKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFJlYWQgdGhlIGZpcnN0IGludGVnZXIgaW4gdGhlIHNldC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBpZiAoKCpuZXh0IDwgJzAnKSB8fCAoKm5leHQgPiAnOScpKSB7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZlN5bnRheEVycm9yLCB2YXIgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgICAgIG51bSA9IF9fa21wX3N0cl90b19pbnQoc2NhbiwgKm5leHQpOworICAgICAgICAgICAgS01QX0FTU0VSVChudW0gPj0gMCk7CisKKyAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBlbmQgb2Ygc2V0LgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgICAgICAgICBpZiAoKm5leHQgPT0gJ30nKSB7CisgICAgICAgICAgICAgICAgICAgIG5leHQrKzsgICAgIC8vIHNraXAgJ30nCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gU2tpcCBvcHRpb25hbCBjb21tYS4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIGlmICgqbmV4dCA9PSAnLCcpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV4dCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTS0lQX1dTKG5leHQpOworCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBSZWFkIHRoZSBuZXh0IGludGVnZXIgaW4gdGhlIHNldC4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIHNjYW4gPSBuZXh0OworICAgICAgICAgICAgICAgIGlmICgoKm5leHQgPCAnMCcpIHx8ICgqbmV4dCA+ICc5JykpIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZlN5bnRheEVycm9yLCB2YXIgKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICAgICAgICAgIG51bSA9IF9fa21wX3N0cl90b19pbnQoc2NhbiwgKm5leHQpOworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQobnVtID49IDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZW1wdHkgPSBGQUxTRTsKKworICAgICAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgICAgIGlmICgqbmV4dCA9PSAnLCcpIHsKKyAgICAgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzY2FuID0gbmV4dDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gTmV4dCBjaGFyYWN0ZXIgaXMgbm90IGFuIGludGVnZXIgPT4gZW5kIG9mIGxpc3QKKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCgqbmV4dCA8ICcwJykgfHwgKCpuZXh0ID4gJzknKSkgeworICAgICAgICAgICAgaWYgKGVtcHR5KSB7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZlN5bnRheEVycm9yLCB2YXIgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIFJlYWQgdGhlIGZpcnN0IGludGVnZXIuCisgICAgICAgIC8vCisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBzdGFydCA9IF9fa21wX3N0cl90b19pbnQoc2NhbiwgKm5leHQpOworICAgICAgICBLTVBfQVNTRVJUKHN0YXJ0ID49IDApOworICAgICAgICBTS0lQX1dTKG5leHQpOworCisgICAgICAgIC8vCisgICAgICAgIC8vIElmIHRoaXMgaXNuJ3QgYSByYW5nZSwgdGhlbiBnbyBvbi4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCpuZXh0ICE9ICctJykgeworICAgICAgICAgICAgZW1wdHkgPSBGQUxTRTsKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFNraXAgb3B0aW9uYWwgY29tbWEuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaWYgKCpuZXh0ID09ICcsJykgeworICAgICAgICAgICAgICAgIG5leHQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNjYW4gPSBuZXh0OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBUaGlzIGlzIGEgcmFuZ2UuICBTa2lwIG92ZXIgdGhlICctJyBhbmQgcmVhZCBpbiB0aGUgMm5kIGludC4KKyAgICAgICAgLy8KKyAgICAgICAgbmV4dCsrOyAgICAgICAgIC8vIHNraXAgJy0nCisgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgIHNjYW4gPSBuZXh0OworICAgICAgICBpZiAoKCpuZXh0IDwgJzAnKSB8fCAoKm5leHQgPiAnOScpKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmU3ludGF4RXJyb3IsIHZhciApOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBlbmQgPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgICAgICAgS01QX0FTU0VSVChlbmQgPj0gMCk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQ2hlY2sgZm9yIGEgc3RyaWRlIHBhcmFtZXRlcgorICAgICAgICAvLworICAgICAgICBzdHJpZGUgPSAxOworICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICBpZiAoKm5leHQgPT0gJzonKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gQSBzdHJpZGUgaXMgc3BlY2lmaWVkLiAgU2tpcCBvdmVyIHRoZSAnOiIgYW5kIHJlYWQgdGhlIDNyZCBpbnQuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaW50IHNpZ24gPSArMTsKKyAgICAgICAgICAgIG5leHQrKzsgICAgICAgICAvLyBza2lwICc6JworICAgICAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgICAgIHNjYW4gPSBuZXh0OworICAgICAgICAgICAgaWYgKCpuZXh0ID09ICctJykgeworICAgICAgICAgICAgICAgIHNpZ24gPSAtMTsKKyAgICAgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgICAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgICAgICAgICBzY2FuID0gbmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoKm5leHQgPCAnMCcpIHx8ICgqbmV4dCA+ICc5JykpIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmU3ludGF4RXJyb3IsIHZhciApOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICAgICAgc3RyaWRlID0gX19rbXBfc3RyX3RvX2ludChzY2FuLCAqbmV4dCk7CisgICAgICAgICAgICBLTVBfQVNTRVJUKHN0cmlkZSA+PSAwKTsKKyAgICAgICAgICAgIHN0cmlkZSAqPSBzaWduOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRG8gc29tZSByYW5nZSBjaGVja3MuCisgICAgICAgIC8vCisgICAgICAgIGlmIChzdHJpZGUgPT0gMCkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZlplcm9TdHJpZGUsIHZhciApOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJpZGUgPiAwKSB7CisgICAgICAgICAgICBpZiAoc3RhcnQgPiBlbmQpIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmU3RhcnRHcmVhdGVyRW5kLCB2YXIsIHN0YXJ0LCBlbmQgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoc3RhcnQgPCBlbmQpIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmU3RyaWRlTGVzc1plcm8sIHZhciwgc3RhcnQsIGVuZCApOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoKGVuZCAtIHN0YXJ0KSAvIHN0cmlkZSA+IDY1NTM2ICkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZlJhbmdlVG9vQmlnLCB2YXIsIGVuZCwgc3RhcnQsIHN0cmlkZSApOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgZW1wdHkgPSBGQUxTRTsKKworICAgICAgICAvLworICAgICAgICAvLyBTa2lwIG9wdGlvbmFsIGNvbW1hLgorICAgICAgICAvLworICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICBpZiAoKm5leHQgPT0gJywnKSB7CisgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgIH0KKyAgICAgICAgc2NhbiA9IG5leHQ7CisgICAgfQorCisgICAgKm5leHRFbnYgPSBuZXh0OworCisgICAgeworICAgICAgICBpbnQgbGVuID0gbmV4dCAtIGVudjsKKyAgICAgICAgY2hhciAqcmV0bGlzdCA9IChjaGFyICopX19rbXBfYWxsb2NhdGUoKGxlbiArIDEpICogc2l6ZW9mKGNoYXIpKTsKKyAgICAgICAgbWVtY3B5KHJldGxpc3QsIGVudiwgbGVuICogc2l6ZW9mKGNoYXIpKTsKKyAgICAgICAgcmV0bGlzdFtsZW5dID0gJ1wwJzsKKyAgICAgICAgKnByb2NsaXN0ID0gcmV0bGlzdDsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLy8KKy8vIElmIEtNUF9BRkZJTklUWSBpcyBzcGVjaWZpZWQgd2l0aG91dCBhIHR5cGUsIHRoZW4KKy8vIF9fa21wX2FmZmluaXR5X25vdHlwZSBzaG91bGQgcG9pbnQgdG8gaXRzIHNldHRpbmcuCisvLworc3RhdGljIGttcF9zZXR0aW5nX3QgKl9fa21wX2FmZmluaXR5X25vdHlwZSA9IE5VTEw7CisKK3N0YXRpYyB2b2lkCitfX2ttcF9wYXJzZV9hZmZpbml0eV9lbnYoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsCisgICAgZW51bSBhZmZpbml0eV90eXBlICAqIG91dF90eXBlLAorICAgIGNoYXIgICAgICAgICAgICAgICAgKiogb3V0X3Byb2NsaXN0LAorICAgIGludCAgICAgICAgICAgICAgICAgKiBvdXRfdmVyYm9zZSwKKyAgICBpbnQgICAgICAgICAgICAgICAgICogb3V0X3dhcm4sCisgICAgaW50ICAgICAgICAgICAgICAgICAqIG91dF9yZXNwZWN0LAorICAgIGVudW0gYWZmaW5pdHlfZ3JhbiAgKiBvdXRfZ3JhbiwKKyAgICBpbnQgICAgICAgICAgICAgICAgICogb3V0X2dyYW5fbGV2ZWxzLAorICAgIGludCAgICAgICAgICAgICAgICAgKiBvdXRfZHVwcywKKyAgICBpbnQgICAgICAgICAgICAgICAgICogb3V0X2NvbXBhY3QsCisgICAgaW50ICAgICAgICAgICAgICAgICAqIG91dF9vZmZzZXQKKykKK3sKKyAgICBjaGFyICogYnVmZmVyID0gTlVMTDsgICAgLy8gQ29weSBvZiBlbnYgdmFyIHZhbHVlLgorICAgIGNoYXIgKiBidWYgICAgPSBOVUxMOyAgICAvLyBCdWZmZXIgZm9yIHN0cnRva19yKCkgZnVuY3Rpb24uCisgICAgY2hhciAqIG5leHQgPSBOVUxMOyAgICAgIC8vIGVuZCBvZiB0b2tlbiAvIHN0YXJ0IG9mIG5leHQuCisgICAgY29uc3QgY2hhciAqIHN0YXJ0OyAgICAgIC8vIHN0YXJ0IG9mIGN1cnJlbnQgdG9rZW4gKGZvciBlcnIgbXNncykKKyAgICBpbnQgICAgY291bnQgID0gMDsgICAgICAgLy8gQ291bnRlciBvZiBwYXJzZWQgaW50ZWdlciBudW1iZXJzLgorICAgIGludCAgICBudW1iZXJbIDIgXTsgICAgICAvLyBQYXJzZWQgbnVtYmVycy4KKworICAgIC8vIEd1YXJkcy4KKyAgICBpbnQgdHlwZSAgICAgICAgID0gMDsKKyAgICBpbnQgcHJvY2xpc3QgICAgID0gMDsKKyAgICBpbnQgbWF4X3Byb2NsaXN0ID0gMDsKKyAgICBpbnQgdmVyYm9zZSAgICAgID0gMDsKKyAgICBpbnQgd2FybmluZ3MgICAgID0gMDsKKyAgICBpbnQgcmVzcGVjdCAgICAgID0gMDsKKyAgICBpbnQgZ3JhbiAgICAgICAgID0gMDsKKyAgICBpbnQgZHVwcyAgICAgICAgID0gMDsKKworICAgIEtNUF9BU1NFUlQoIHZhbHVlICE9IE5VTEwgKTsKKworICAgIGlmICggVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICBLTVBfV0FSTklORyggRW52TWlkZGxlV2FybiwgbmFtZSApOworICAgICAgICBfX2ttcF9lbnZfdG9QcmludCggbmFtZSwgMCApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIF9fa21wX2Vudl90b1ByaW50KCBuYW1lLCAxICk7CisKKyAgICBidWZmZXIgPSBfX2ttcF9zdHJfZm9ybWF0KCAiJXMiLCB2YWx1ZSApOyAgICAgICAgIC8vIENvcHkgZW52IHZhciB0byBrZWVwIG9yaWdpbmFsIGludGFjdC4KKyAgICBidWYgPSBidWZmZXI7CisgICAgU0tJUF9XUyhidWYpOworCisgICAgLy8gSGVscGVyIG1hY3Jvcy4KKworICAgIC8vCisgICAgLy8gSWYgd2Ugc2VlIGEgcGFyc2UgZXJyb3IsIGVtaXQgYSB3YXJuaW5nIGFuZCBzY2FuIHRvIHRoZSBuZXh0ICIsIi4KKyAgICAvLworICAgIC8vIEZJWE1FIC0gdGhlcmUncyBnb3QgdG8gYmUgYSBiZXR0ZXIgd2F5IHRvIHByaW50IGFuIGVycm9yCisgICAgLy8gbWVzc2FnZSwgaG9wZWZ1bGx5IHdpdGhvdXQgb3ZlcndyaXR0aW5nIHBlaWNlcyBvZiBidWYuCisgICAgLy8KKyAgICAjZGVmaW5lIEVNSVRfV0FSTihza2lwLGVycmxpc3QpIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNoYXIgY2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmIChza2lwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBTS0lQX1RPKG5leHQsICcsJyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNoID0gKm5leHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICpuZXh0ID0gJ1wwJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HIGVycmxpc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICpuZXh0ID0gY2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmIChza2lwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJywnKSBuZXh0Kys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfQorCisgICAgI2RlZmluZSBfc2V0X3BhcmFtKF9ndWFyZCxfdmFyLF92YWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoIF9ndWFyZCA9PSAwICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX3ZhciA9IF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgRU1JVF9XQVJOKCBGQUxTRSwgKCBBZmZQYXJhbURlZmluZWQsIG5hbWUsIHN0YXJ0ICkgKTsgICAgICAgICBcCisgICAgICAgICAgICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICArKyBfZ3VhcmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0KKworICAgICNkZWZpbmUgc2V0X3R5cGUodmFsKSAgICAgICAgICBfc2V0X3BhcmFtKCB0eXBlLCAgICAgKm91dF90eXBlLCAgICAgICAgdmFsICkKKyAgICAjZGVmaW5lIHNldF92ZXJib3NlKHZhbCkgICAgICAgX3NldF9wYXJhbSggdmVyYm9zZSwgICpvdXRfdmVyYm9zZSwgICAgIHZhbCApCisgICAgI2RlZmluZSBzZXRfd2FybmluZ3ModmFsKSAgICAgIF9zZXRfcGFyYW0oIHdhcm5pbmdzLCAqb3V0X3dhcm4sICAgICAgICB2YWwgKQorICAgICNkZWZpbmUgc2V0X3Jlc3BlY3QodmFsKSAgICAgICBfc2V0X3BhcmFtKCByZXNwZWN0LCAgKm91dF9yZXNwZWN0LCAgICAgdmFsICkKKyAgICAjZGVmaW5lIHNldF9kdXBzKHZhbCkgICAgICAgICAgX3NldF9wYXJhbSggZHVwcywgICAgICpvdXRfZHVwcywgICAgICAgIHZhbCApCisgICAgI2RlZmluZSBzZXRfcHJvY2xpc3QodmFsKSAgICAgIF9zZXRfcGFyYW0oIHByb2NsaXN0LCAqb3V0X3Byb2NsaXN0LCAgICB2YWwgKQorCisgICAgI2RlZmluZSBzZXRfZ3Jhbih2YWwsbGV2ZWxzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoIGdyYW4gPT0gMCApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKm91dF9ncmFuID0gdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKm91dF9ncmFuX2xldmVscyA9IGxldmVsczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgRU1JVF9XQVJOKCBGQUxTRSwgKCBBZmZQYXJhbURlZmluZWQsIG5hbWUsIHN0YXJ0ICkgKTsgICAgICAgICBcCisgICAgICAgICAgICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICArKyBncmFuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0KKworIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgIEtNUF9ERUJVR19BU1NFUlQoICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzICE9IE5VTEwgKQorICAgICAgJiYgKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnVzZWQgPiAwICkgKTsKKyAgICBpZiAoICggX19rbXBfYWZmaW5pdHlfbm90eXBlICE9IE5VTEwgKQorICAgICAgJiYgKCAoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9PSBwcm9jX2JpbmRfZGVmYXVsdCApCisgICAgICB8fCAoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9PSBwcm9jX2JpbmRfaW50ZWwgKSApICkgeworICAgICAgICB0eXBlID0gVFJVRTsKKyAgICB9CisjIGVuZGlmCisKKyAgICB3aGlsZSAoICpidWYgIT0gJ1wwJyApIHsKKyAgICAgICAgc3RhcnQgPSBuZXh0ID0gYnVmOworCisgICAgICAgIGlmIChfX2ttcF9tYXRjaF9zdHIoIm5vbmUiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgc2V0X3R5cGUoIGFmZmluaXR5X25vbmUgKTsKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJzY2F0dGVyIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgIHNldF90eXBlKCBhZmZpbml0eV9zY2F0dGVyICk7CisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigiY29tcGFjdCIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICBzZXRfdHlwZSggYWZmaW5pdHlfY29tcGFjdCApOworICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoImxvZ2ljYWwiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgc2V0X3R5cGUoIGFmZmluaXR5X2xvZ2ljYWwgKTsKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJwaHlzaWNhbCIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICBzZXRfdHlwZSggYWZmaW5pdHlfcGh5c2ljYWwgKTsKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJleHBsaWNpdCIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICBzZXRfdHlwZSggYWZmaW5pdHlfZXhwbGljaXQgKTsKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisjIGlmIEtNUF9NSUMKKyAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoImJhbGFuY2VkIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgIHNldF90eXBlKCBhZmZpbml0eV9iYWxhbmNlZCApOworICAgICAgICAgICAgYnVmID0gbmV4dDsKKyMgZW5kaWYKKyAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoImRpc2FibGVkIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgIHNldF90eXBlKCBhZmZpbml0eV9kaXNhYmxlZCApOworICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoInZlcmJvc2UiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgc2V0X3ZlcmJvc2UoIFRSVUUgKTsKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJub3ZlcmJvc2UiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgc2V0X3ZlcmJvc2UoIEZBTFNFICk7CisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigid2FybmluZ3MiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgc2V0X3dhcm5pbmdzKCBUUlVFICk7CisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigibm93YXJuaW5ncyIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICBzZXRfd2FybmluZ3MoIEZBTFNFICk7CisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigicmVzcGVjdCIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICBzZXRfcmVzcGVjdCggVFJVRSApOworICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoIm5vcmVzcGVjdCIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICBzZXRfcmVzcGVjdCggRkFMU0UgKTsKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJkdXBsaWNhdGVzIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkKKyAgICAgICAgICB8fCBfX2ttcF9tYXRjaF9zdHIoImR1cHMiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgc2V0X2R1cHMoIFRSVUUgKTsKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJub2R1cGxpY2F0ZXMiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KQorICAgICAgICAgIHx8IF9fa21wX21hdGNoX3N0cigibm9kdXBzIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgIHNldF9kdXBzKCBGQUxTRSApOworICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoImdyYW51bGFyaXR5IiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkKKyAgICAgICAgICB8fCBfX2ttcF9tYXRjaF9zdHIoImdyYW4iLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgICAgIGlmICgqbmV4dCAhPSAnPScpIHsKKyAgICAgICAgICAgICAgICBFTUlUX1dBUk4oIFRSVUUsICggQWZmSW52YWxpZFBhcmFtLCBuYW1lLCBzdGFydCApICk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuZXh0Kys7ICAgICAgLy8gc2tpcCAnPScKKyAgICAgICAgICAgIFNLSVBfV1MobmV4dCk7CisKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgICAgICBpZiAoX19rbXBfbWF0Y2hfc3RyKCJmaW5lIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgICAgICBzZXRfZ3JhbiggYWZmaW5pdHlfZ3Jhbl9maW5lLCAtMSApOworICAgICAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigidGhyZWFkIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgICAgICBzZXRfZ3JhbiggYWZmaW5pdHlfZ3Jhbl90aHJlYWQsIC0xICk7CisgICAgICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJjb3JlIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgICAgICBzZXRfZ3JhbiggYWZmaW5pdHlfZ3Jhbl9jb3JlLCAtMSApOworICAgICAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigicGFja2FnZSIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICAgICAgc2V0X2dyYW4oIGFmZmluaXR5X2dyYW5fcGFja2FnZSwgLTEgKTsKKyAgICAgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoIm5vZGUiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgICAgIHNldF9ncmFuKCBhZmZpbml0eV9ncmFuX25vZGUsIC0xICk7CisgICAgICAgICAgICAgICAgYnVmID0gbmV4dDsKKyMgaWYgS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2XzY0CisgICAgICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigiZ3JvdXAiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgICAgIHNldF9ncmFuKCBhZmZpbml0eV9ncmFuX2dyb3VwLCAtMSApOworICAgICAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisjIGVuZGlmIC8qIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4Nl82NCAqLworICAgICAgICAgICAgfSBlbHNlIGlmICgoKmJ1ZiA+PSAnMCcpICYmICgqYnVmIDw9ICc5JykpIHsKKyAgICAgICAgICAgICAgICBpbnQgbjsKKyAgICAgICAgICAgICAgICBuZXh0ID0gYnVmOworICAgICAgICAgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICAgICAgICAgIG4gPSBfX2ttcF9zdHJfdG9faW50KCBidWYsICpuZXh0ICk7CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVChuID49IDApOworICAgICAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgICAgICAgICAgc2V0X2dyYW4oIGFmZmluaXR5X2dyYW5fZGVmYXVsdCwgbiApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBFTUlUX1dBUk4oIFRSVUUsICggQWZmSW52YWxpZFBhcmFtLCBuYW1lLCBzdGFydCApICk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJwcm9jbGlzdCIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICBjaGFyICp0ZW1wX3Byb2NsaXN0OworCisgICAgICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICAgICAgaWYgKCpuZXh0ICE9ICc9JykgeworICAgICAgICAgICAgICAgIEVNSVRfV0FSTiggVFJVRSwgKCBBZmZJbnZhbGlkUGFyYW0sIG5hbWUsIHN0YXJ0ICkgKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5leHQrKzsgICAgICAvLyBza2lwICc9JworICAgICAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgICAgIGlmICgqbmV4dCAhPSAnWycpIHsKKyAgICAgICAgICAgICAgICBFTUlUX1dBUk4oIFRSVUUsICggQWZmSW52YWxpZFBhcmFtLCBuYW1lLCBzdGFydCApICk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuZXh0Kys7ICAgICAgLy8gc2tpcCAnWycKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgICAgICBpZiAoISBfX2ttcF9wYXJzZV9hZmZpbml0eV9wcm9jX2lkX2xpc3QobmFtZSwgYnVmLAorICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKikmbmV4dCwgJnRlbXBfcHJvY2xpc3QpKSB7CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyB3YXJuaW5nIGFscmVhZHkgZW1pdHRlZC4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIFNLSVBfVE8obmV4dCwgJ10nKTsKKyAgICAgICAgICAgICAgICBpZiAoKm5leHQgPT0gJ10nKSBuZXh0Kys7CisgICAgICAgICAgICAgICAgU0tJUF9UTyhuZXh0LCAnLCcpOworICAgICAgICAgICAgICAgIGlmICgqbmV4dCA9PSAnLCcpIG5leHQrKzsKKyAgICAgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCpuZXh0ICE9ICddJykgeworICAgICAgICAgICAgICAgIEVNSVRfV0FSTiggVFJVRSwgKCBBZmZJbnZhbGlkUGFyYW0sIG5hbWUsIHN0YXJ0ICkgKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5leHQrKzsgICAgICAvLyBza2lwICddJworICAgICAgICAgICAgc2V0X3Byb2NsaXN0KCB0ZW1wX3Byb2NsaXN0ICk7CisgICAgICAgIH0gZWxzZSBpZiAoKCpidWYgPj0gJzAnKSAmJiAoKmJ1ZiA8PSAnOScpKSB7CisgICAgICAgICAgICAvLyBQYXJzZSBpbnRlZ2VyIG51bWJlcnMgLS0gcGVybXV0ZSBhbmQgb2Zmc2V0LgorICAgICAgICAgICAgaW50IG47CisgICAgICAgICAgICBuZXh0ID0gYnVmOworICAgICAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgICAgICBuID0gX19rbXBfc3RyX3RvX2ludCggYnVmLCAqbmV4dCApOworICAgICAgICAgICAgS01QX0FTU0VSVChuID49IDApOworICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgICAgIGlmICggY291bnQgPCAyICkgeworICAgICAgICAgICAgICAgIG51bWJlclsgY291bnQgXSA9IG47CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZNYW55UGFyYW1zLCBuYW1lLCBzdGFydCApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICsrIGNvdW50OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRU1JVF9XQVJOKCBUUlVFLCAoIEFmZkludmFsaWRQYXJhbSwgbmFtZSwgc3RhcnQgKSApOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICBpZiAoKm5leHQgPT0gJywnKSB7CisgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCpuZXh0ICE9ICdcMCcpIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRlbXAgPSBuZXh0OworICAgICAgICAgICAgRU1JVF9XQVJOKCBUUlVFLCAoIFBhcnNlRXh0cmFDaGFyc1dhcm4sIG5hbWUsIHRlbXAgKSApOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgYnVmID0gbmV4dDsKKyAgICB9IC8vIHdoaWxlCisKKyAgICAjdW5kZWYgRU1JVF9XQVJOCisgICAgI3VuZGVmIF9zZXRfcGFyYW0KKyAgICAjdW5kZWYgc2V0X3R5cGUKKyAgICAjdW5kZWYgc2V0X3ZlcmJvc2UKKyAgICAjdW5kZWYgc2V0X3dhcm5pbmdzCisgICAgI3VuZGVmIHNldF9yZXNwZWN0CisgICAgI3VuZGVmIHNldF9ncmFudWxhcml0eQorCisgICAgS01QX0lOVEVSTkFMX0ZSRUUoIGJ1ZmZlciApOworCisgICAgaWYgKCBwcm9jbGlzdCApIHsKKyAgICAgICAgaWYgKCAhIHR5cGUgKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmUHJvY0xpc3ROb1R5cGUsIG5hbWUgKTsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9leHBsaWNpdDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9leHBsaWNpdCApIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZQcm9jTGlzdE5vdEV4cGxpY2l0LCBuYW1lICk7CisgICAgICAgICAgICBLTVBfQVNTRVJUKCAqb3V0X3Byb2NsaXN0ICE9IE5VTEwgKTsKKyAgICAgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAqb3V0X3Byb2NsaXN0ICk7CisgICAgICAgICAgICAqb3V0X3Byb2NsaXN0ID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBzd2l0Y2ggKCAqb3V0X3R5cGUgKSB7CisgICAgICAgIGNhc2UgYWZmaW5pdHlfbG9naWNhbDoKKyAgICAgICAgY2FzZSBhZmZpbml0eV9waHlzaWNhbDogeworICAgICAgICAgICAgaWYgKCBjb3VudCA+IDAgKSB7CisgICAgICAgICAgICAgICAgKm91dF9vZmZzZXQgPSBudW1iZXJbIDAgXTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICBpZiAoIGNvdW50ID4gMSApIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmTWFueVBhcmFtc0ZvckxvZ2ljLCBuYW1lLCBudW1iZXJbIDEgXSApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfSBicmVhazsKKyMgaWYgS01QX01JQworICAgICAgICBjYXNlIGFmZmluaXR5X2JhbGFuY2VkOiB7CisgICAgICAgICAgICBpZiAoIGNvdW50ID4gMCApIHsKKyAgICAgICAgICAgICAgICAqb3V0X2NvbXBhY3QgPSBudW1iZXJbIDAgXTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICBpZiAoIGNvdW50ID4gMSApIHsKKyAgICAgICAgICAgICAgICAqb3V0X29mZnNldCA9IG51bWJlclsgMSBdOworICAgICAgICAgICAgfTsgLy8gaWYKKworICAgICAgICAgICAgLy8gSWYgZ3JhbnVsYXJpdHkgaXMgbmVpdGhlciB0aHJlYWQgbm9yIGNvcmUgbGV0IGl0IGJlIGRlZmF1bHQgdmFsdWU9ZmluZQorICAgICAgICAgICAgaWYoIF9fa21wX2FmZmluaXR5X2dyYW4gIT0gYWZmaW5pdHlfZ3Jhbl9kZWZhdWx0ICYmIF9fa21wX2FmZmluaXR5X2dyYW4gIT0gYWZmaW5pdHlfZ3Jhbl9maW5lCisgICAgICAgICAgICAgICAgJiYgX19rbXBfYWZmaW5pdHlfZ3JhbiAhPSBhZmZpbml0eV9ncmFuX3RocmVhZCAmJiBfX2ttcF9hZmZpbml0eV9ncmFuICE9IGFmZmluaXR5X2dyYW5fY29yZSApIHsKKyAgICAgICAgICAgICAgICBpZiggX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCBfX2ttcF9hZmZpbml0eV93YXJuaW5ncyApIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZkdyYW5Vc2luZywgIktNUF9BRkZJTklUWSIsICJjb3JlIiApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9maW5lOworICAgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworIyBlbmRpZgorICAgICAgICBjYXNlIGFmZmluaXR5X3NjYXR0ZXI6CisgICAgICAgIGNhc2UgYWZmaW5pdHlfY29tcGFjdDogeworICAgICAgICAgICAgaWYgKCBjb3VudCA+IDAgKSB7CisgICAgICAgICAgICAgICAgKm91dF9jb21wYWN0ID0gbnVtYmVyWyAwIF07CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgaWYgKCBjb3VudCA+IDEgKSB7CisgICAgICAgICAgICAgICAgKm91dF9vZmZzZXQgPSBudW1iZXJbIDEgXTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgYWZmaW5pdHlfZXhwbGljaXQ6IHsKKyAgICAgICAgICAgIGlmICggKm91dF9wcm9jbGlzdCA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZOb1Byb2NMaXN0LCBuYW1lICk7CisgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X25vbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGNvdW50ID4gMCApIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmTm9QYXJhbSwgbmFtZSwgImV4cGxpY2l0IiApOworICAgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIGFmZmluaXR5X25vbmU6IHsKKyAgICAgICAgICAgIGlmICggY291bnQgPiAwICkgeworICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZOb1BhcmFtLCBuYW1lLCAibm9uZSIgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgYWZmaW5pdHlfZGlzYWJsZWQ6IHsKKyAgICAgICAgICAgIGlmICggY291bnQgPiAwICkgeworICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZOb1BhcmFtLCBuYW1lLCAiZGlzYWJsZWQiICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIGFmZmluaXR5X2RlZmF1bHQ6IHsKKyAgICAgICAgICAgIGlmICggY291bnQgPiAwICkgeworICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZOb1BhcmFtLCBuYW1lLCAiZGVmYXVsdCIgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoIDAgKTsKKyAgICAgICAgfTsKKyAgICB9OyAvLyBzd2l0Y2gKK30gLy8gX19rbXBfcGFyc2VfYWZmaW5pdHlfZW52CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfYWZmaW5pdHkoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkKK3sKKyAgICBrbXBfc2V0dGluZ190ICoqcml2YWxzID0gKGttcF9zZXR0aW5nX3QgKiopIGRhdGE7CisgICAgaW50IHJjOworCisgICAgcmMgPSBfX2ttcF9zdGdfY2hlY2tfcml2YWxzKCBuYW1lLCB2YWx1ZSwgcml2YWxzICk7CisgICAgaWYgKCByYyApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIF9fa21wX3BhcnNlX2FmZmluaXR5X2VudiggbmFtZSwgdmFsdWUsICYgX19rbXBfYWZmaW5pdHlfdHlwZSwKKyAgICAgICYgX19rbXBfYWZmaW5pdHlfcHJvY2xpc3QsICYgX19rbXBfYWZmaW5pdHlfdmVyYm9zZSwKKyAgICAgICYgX19rbXBfYWZmaW5pdHlfd2FybmluZ3MsICYgX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrLAorICAgICAgJiBfX2ttcF9hZmZpbml0eV9ncmFuLCAmIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzLAorICAgICAgJiBfX2ttcF9hZmZpbml0eV9kdXBzLCAmIF9fa21wX2FmZmluaXR5X2NvbXBhY3QsCisgICAgICAmIF9fa21wX2FmZmluaXR5X29mZnNldCApOworCit9IC8vIF9fa21wX3N0Z19wYXJzZV9hZmZpbml0eQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2FmZmluaXR5KCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgKSB7CisgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUVfRVgobmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXM9JyIsIG5hbWUgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9hZmZpbml0eV92ZXJib3NlICkgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcywiLCAidmVyYm9zZSIpOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzLCIsICJub3ZlcmJvc2UiKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9hZmZpbml0eV93YXJuaW5ncyApIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsIiwgIndhcm5pbmdzIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsIiwgIm5vd2FybmluZ3MiKTsKKyAgICB9CisgICAgaWYgKCBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpICkgeworICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzayApIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzLCIsICJyZXNwZWN0Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcywiLCAibm9yZXNwZWN0Iik7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoICggX19rbXBfYWZmaW5pdHlfZ3JhbiApIHsKKyAgICAgICAgICAgIGNhc2UgYWZmaW5pdHlfZ3Jhbl9kZWZhdWx0OgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzIiwgImdyYW51bGFyaXR5PWRlZmF1bHQsIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGFmZmluaXR5X2dyYW5fZmluZToKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcyIsICJncmFudWxhcml0eT1maW5lLCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBhZmZpbml0eV9ncmFuX3RocmVhZDoKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcyIsICJncmFudWxhcml0eT10aHJlYWQsIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGFmZmluaXR5X2dyYW5fY29yZToKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcyIsICJncmFudWxhcml0eT1jb3JlLCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBhZmZpbml0eV9ncmFuX3BhY2thZ2U6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMiLCAiZ3JhbnVsYXJpdHk9cGFja2FnZSwiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgYWZmaW5pdHlfZ3Jhbl9ub2RlOgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzIiwgImdyYW51bGFyaXR5PW5vZGUsIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisjIGlmIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4Nl82NAorICAgICAgICAgICAgY2FzZSBhZmZpbml0eV9ncmFuX2dyb3VwOgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzIiwgImdyYW51bGFyaXR5PWdyb3VwLCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworIyBlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAmJiBLTVBfQVJDSF9YODZfNjQgKi8KKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X2R1cHMgKSB7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcywiLCAiZHVwbGljYXRlcyIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsIiwgIm5vZHVwbGljYXRlcyIpOworICAgICAgICB9CisgICAgfQorICAgIGlmICggISBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpICkgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcyIsICJkaXNhYmxlZCIgKTsKKyAgICB9CisgICAgZWxzZSBzd2l0Y2ggKCBfX2ttcF9hZmZpbml0eV90eXBlICl7CisgICAgICAgIGNhc2UgYWZmaW5pdHlfbm9uZToKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzIiwgIm5vbmUiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGFmZmluaXR5X3BoeXNpY2FsOgorICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsJWQiLCAicGh5c2ljYWwiLAorICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9vZmZzZXQgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGFmZmluaXR5X2xvZ2ljYWw6CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcywlZCIsICJsb2dpY2FsIiwKKyAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfb2Zmc2V0ICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhZmZpbml0eV9jb21wYWN0OgorICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsJWQsJWQiLCAiY29tcGFjdCIsCisgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2NvbXBhY3QsIF9fa21wX2FmZmluaXR5X29mZnNldCApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgYWZmaW5pdHlfc2NhdHRlcjoKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzLCVkLCVkIiwgInNjYXR0ZXIiLAorICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9jb21wYWN0LCBfX2ttcF9hZmZpbml0eV9vZmZzZXQgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGFmZmluaXR5X2V4cGxpY2l0OgorICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXM9WyVzXSwlcyIsICJwcm9jbGlzdCIsCisgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3Byb2NsaXN0LCAiZXhwbGljaXQiICk7CisgICAgICAgICAgICBicmVhazsKKyMgaWYgS01QX01JQworICAgICAgICBjYXNlIGFmZmluaXR5X2JhbGFuY2VkOgorICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsJWQsJWQiLCAiYmFsYW5jZWQiLAorICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9jb21wYWN0LCBfX2ttcF9hZmZpbml0eV9vZmZzZXQgKTsKKyAgICAgICAgICAgIGJyZWFrOworIyBlbmRpZgorICAgICAgICBjYXNlIGFmZmluaXR5X2Rpc2FibGVkOgorICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMiLCAiZGlzYWJsZWQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGFmZmluaXR5X2RlZmF1bHQ6CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcyIsICJkZWZhdWx0Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzIiwgIjx1bmtub3duPiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICInXG4iICk7Cit9IC8vX19rbXBfc3RnX3ByaW50X2FmZmluaXR5CisKKyMgaWZkZWYgS01QX0dPTVBfQ09NUEFUCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfZ29tcF9jcHVfYWZmaW5pdHkoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkKK3sKKyAgICBjb25zdCBjaGFyICogbmV4dCA9IE5VTEw7CisgICAgY2hhciAqIHRlbXBfcHJvY2xpc3Q7CisgICAga21wX3NldHRpbmdfdCAqKnJpdmFscyA9IChrbXBfc2V0dGluZ190ICoqKSBkYXRhOworICAgIGludCByYzsKKworICAgIHJjID0gX19rbXBfc3RnX2NoZWNrX3JpdmFscyggbmFtZSwgdmFsdWUsIHJpdmFscyApOworICAgIGlmICggcmMgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIEVudk1pZGRsZVdhcm4sIG5hbWUgKTsKKyAgICAgICAgX19rbXBfZW52X3RvUHJpbnQoIG5hbWUsIDAgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIF9fa21wX2Vudl90b1ByaW50KCBuYW1lLCAxICk7CisKKyAgICBpZiAoIF9fa21wX3BhcnNlX2FmZmluaXR5X3Byb2NfaWRfbGlzdCggbmFtZSwgdmFsdWUsICZuZXh0LAorICAgICAgJnRlbXBfcHJvY2xpc3QgKSkgeworICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICBpZiAoKm5leHQgPT0gJ1wwJykgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIEdPTVBfQ1BVX0FGRklOSVRZID0+IGdyYW51bGFyaXR5PWZpbmUsZXhwbGljaXQscHJvY2xpc3Q9Li4uCisgICAgICAgICAgICAvLworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJvY2xpc3QgPSB0ZW1wX3Byb2NsaXN0OworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X2V4cGxpY2l0OworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fZmluZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZTeW50YXhFcnJvciwgbmFtZSApOworICAgICAgICAgICAgaWYgKHRlbXBfcHJvY2xpc3QgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKCh2b2lkICopdGVtcF9wcm9jbGlzdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIFdhcm5pbmcgYWxyZWFkeSBlbWl0dGVkCisgICAgICAgIC8vCisgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9ub25lOworICAgIH0KK30gLy8gX19rbXBfc3RnX3BhcnNlX2dvbXBfY3B1X2FmZmluaXR5CisKKyMgZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisKKworIyBpZiBPTVBfNDBfRU5BQkxFRAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBPTVBfUExBQ0VTIHByb2MgaWQgbGlzdCBwYXJzZXIuIEhlcmUgaXMgdGhlIGdyYW1tYXI6CisKK3BsYWNlX2xpc3QgOj0gcGxhY2UKK3BsYWNlX2xpc3QgOj0gcGxhY2UgLCBwbGFjZV9saXN0CitwbGFjZSA6PSBudW0KK3BsYWNlIDo9IHBsYWNlIDogbnVtCitwbGFjZSA6PSBwbGFjZSA6IG51bSA6IHNpZ25lZAorcGxhY2UgOj0geyBzdWJwbGFjZWxpc3QgfQorcGxhY2UgOj0gISBwbGFjZSAgICAgICAgICAgICAgICAgIC8vIChsb3dlc3QgcHJpb3JpdHkpCitzdWJwbGFjZV9saXN0IDo9IHN1YnBsYWNlCitzdWJwbGFjZV9saXN0IDo9IHN1YnBsYWNlICwgc3VicGxhY2VfbGlzdAorc3VicGxhY2UgOj0gbnVtCitzdWJwbGFjZSA6PSBudW0gOiBudW0KK3N1YnBsYWNlIDo9IG51bSA6IG51bSA6IHNpZ25lZAorc2lnbmVkIDo9IG51bQorc2lnbmVkIDo9ICsgc2lnbmVkCitzaWduZWQgOj0gLSBzaWduZWQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50CitfX2ttcF9wYXJzZV9zdWJwbGFjZV9saXN0KCBjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKipzY2FuICkKK3sKKyAgICBjb25zdCBjaGFyICpuZXh0OworCisgICAgZm9yICg7OykgeworICAgICAgICBpbnQgc3RhcnQsIGNvdW50LCBzdHJpZGU7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gUmVhZCBpbiB0aGUgc3RhcnRpbmcgcHJvYyBpZAorICAgICAgICAvLworICAgICAgICBTS0lQX1dTKCpzY2FuKTsKKyAgICAgICAgaWYgKCgqKnNjYW4gPCAnMCcpIHx8ICgqKnNjYW4gPiAnOScpKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggU3ludGF4RXJyb3JVc2luZywgdmFyLCAiXCJ0aHJlYWRzXCIiICk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgbmV4dCA9ICpzY2FuOworICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgc3RhcnQgPSBfX2ttcF9zdHJfdG9faW50KCpzY2FuLCAqbmV4dCk7CisgICAgICAgIEtNUF9BU1NFUlQoc3RhcnQgPj0gMCk7CisgICAgICAgICpzY2FuID0gbmV4dDsKKworICAgICAgICAvLworICAgICAgICAvLyB2YWxpZCBmb2xsb3cgc2V0cyBhcmUgJywnICc6JyBhbmQgJ30nCisgICAgICAgIC8vCisgICAgICAgIFNLSVBfV1MoKnNjYW4pOworICAgICAgICBpZiAoKipzY2FuID09ICd9JykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCoqc2NhbiA9PSAnLCcpIHsKKyAgICAgICAgICAgICgqc2NhbikrKzsgIC8vIHNraXAgJywnCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKipzY2FuICE9ICc6JykgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIFN5bnRheEVycm9yVXNpbmcsIHZhciwgIlwidGhyZWFkc1wiIiApOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgICgqc2NhbikrKzsgICAgICAvLyBza2lwICc6JworCisgICAgICAgIC8vCisgICAgICAgIC8vIFJlYWQgY291bnQgcGFyYW1ldGVyCisgICAgICAgIC8vCisgICAgICAgIFNLSVBfV1MoKnNjYW4pOworICAgICAgICBpZiAoKCoqc2NhbiA8ICcwJykgfHwgKCoqc2NhbiA+ICc5JykpIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBTeW50YXhFcnJvclVzaW5nLCB2YXIsICJcInRocmVhZHNcIiIgKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBuZXh0ID0gKnNjYW47CisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBjb3VudCA9IF9fa21wX3N0cl90b19pbnQoKnNjYW4sICpuZXh0KTsKKyAgICAgICAgS01QX0FTU0VSVChjb3VudCA+PSAwKTsKKyAgICAgICAgKnNjYW4gPSBuZXh0OworCisgICAgICAgIC8vCisgICAgICAgIC8vIHZhbGlkIGZvbGxvdyBzZXRzIGFyZSAnLCcgJzonIGFuZCAnfScKKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUygqc2Nhbik7CisgICAgICAgIGlmICgqKnNjYW4gPT0gJ30nKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoKipzY2FuID09ICcsJykgeworICAgICAgICAgICAgKCpzY2FuKSsrOyAgLy8gc2tpcCAnLCcKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICgqKnNjYW4gIT0gJzonKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggU3ludGF4RXJyb3JVc2luZywgdmFyLCAiXCJ0aHJlYWRzXCIiICk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgKCpzY2FuKSsrOyAgICAgIC8vIHNraXAgJzonCisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gUmVhZCBzdHJpZGUgcGFyYW1ldGVyCisgICAgICAgIC8vCisgICAgICAgIGludCBzaWduID0gKzE7CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIFNLSVBfV1MoKnNjYW4pOworICAgICAgICAgICAgaWYgKCoqc2NhbiA9PSAnKycpIHsKKyAgICAgICAgICAgICAgICAoKnNjYW4pKys7IC8vIHNraXAgJysnCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKipzY2FuID09ICctJykgeworICAgICAgICAgICAgICAgIHNpZ24gKj0gLTE7CisgICAgICAgICAgICAgICAgKCpzY2FuKSsrOyAvLyBza2lwICctJworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgU0tJUF9XUygqc2Nhbik7CisgICAgICAgIGlmICgoKipzY2FuIDwgJzAnKSB8fCAoKipzY2FuID4gJzknKSkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIFN5bnRheEVycm9yVXNpbmcsIHZhciwgIlwidGhyZWFkc1wiIiApOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIG5leHQgPSAqc2NhbjsKKyAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgIHN0cmlkZSA9IF9fa21wX3N0cl90b19pbnQoKnNjYW4sICpuZXh0KTsKKyAgICAgICAgS01QX0FTU0VSVChzdHJpZGUgPj0gMCk7CisgICAgICAgICpzY2FuID0gbmV4dDsKKyAgICAgICAgc3RyaWRlICo9IHNpZ247CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gdmFsaWQgZm9sbG93IHNldHMgYXJlICcsJyBhbmQgJ30nCisgICAgICAgIC8vCisgICAgICAgIFNLSVBfV1MoKnNjYW4pOworICAgICAgICBpZiAoKipzY2FuID09ICd9JykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCoqc2NhbiA9PSAnLCcpIHsKKyAgICAgICAgICAgICgqc2NhbikrKzsgIC8vIHNraXAgJywnCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEtNUF9XQVJOSU5HKCBTeW50YXhFcnJvclVzaW5nLCB2YXIsICJcInRocmVhZHNcIiIgKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludAorX19rbXBfcGFyc2VfcGxhY2UoIGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqKiBzY2FuICkKK3sKKyAgICBjb25zdCBjaGFyICpuZXh0OworCisgICAgLy8KKyAgICAvLyB2YWxpZCBmb2xsb3cgc2V0cyBhcmUgJ3snICchJyBhbmQgbnVtCisgICAgLy8KKyAgICBTS0lQX1dTKCpzY2FuKTsKKyAgICBpZiAoKipzY2FuID09ICd7JykgeworICAgICAgICAoKnNjYW4pKys7ICAgICAgLy8gc2tpcCAneycKKyAgICAgICAgaWYgKCEgX19rbXBfcGFyc2Vfc3VicGxhY2VfbGlzdCh2YXIsIHNjYW4pKSB7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCoqc2NhbiAhPSAnfScpIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBTeW50YXhFcnJvclVzaW5nLCB2YXIsICJcInRocmVhZHNcIiIgKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICAoKnNjYW4pKys7ICAgICAgLy8gc2tpcCAnfScKKyAgICB9CisgICAgZWxzZSBpZiAoKipzY2FuID09ICchJykgeworICAgICAgICAoKnNjYW4pKys7ICAgICAgLy8gc2tpcCAnIScKKyAgICAgICAgcmV0dXJuIF9fa21wX3BhcnNlX3BsYWNlKHZhciwgc2Nhbik7IC8vJyEnIGhhcyBsb3dlciBwcmVjZWRlbmNlIHRoYW4gJzonCisgICAgfQorICAgIGVsc2UgaWYgKCgqKnNjYW4gPj0gJzAnKSAmJiAoKipzY2FuIDw9ICc5JykpIHsKKyAgICAgICAgbmV4dCA9ICpzY2FuOworICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgaW50IHByb2MgPSBfX2ttcF9zdHJfdG9faW50KCpzY2FuLCAqbmV4dCk7CisgICAgICAgIEtNUF9BU1NFUlQocHJvYyA+PSAwKTsKKyAgICAgICAgKnNjYW4gPSBuZXh0OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIFN5bnRheEVycm9yVXNpbmcsIHZhciwgIlwidGhyZWFkc1wiIiApOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50CitfX2ttcF9wYXJzZV9wbGFjZV9saXN0KCBjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKmVudiwgY2hhciAqKnBsYWNlX2xpc3QgKQoreworICAgIGNvbnN0IGNoYXIgKnNjYW4gPSBlbnY7CisgICAgY29uc3QgY2hhciAqbmV4dCA9IHNjYW47CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGludCBzdGFydCwgY291bnQsIHN0cmlkZTsKKworICAgICAgICBpZiAoISBfX2ttcF9wYXJzZV9wbGFjZSh2YXIsICZzY2FuKSkgeworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gdmFsaWQgZm9sbG93IHNldHMgYXJlICcsJyAnOicgYW5kIEVPTAorICAgICAgICAvLworICAgICAgICBTS0lQX1dTKHNjYW4pOworICAgICAgICBpZiAoKnNjYW4gPT0gJ1wwJykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCpzY2FuID09ICcsJykgeworICAgICAgICAgICAgc2NhbisrOyAgICAgLy8gc2tpcCAnLCcKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICgqc2NhbiAhPSAnOicpIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBTeW50YXhFcnJvclVzaW5nLCB2YXIsICJcInRocmVhZHNcIiIgKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBzY2FuKys7ICAgICAgICAgLy8gc2tpcCAnOicKKworICAgICAgICAvLworICAgICAgICAvLyBSZWFkIGNvdW50IHBhcmFtZXRlcgorICAgICAgICAvLworICAgICAgICBTS0lQX1dTKHNjYW4pOworICAgICAgICBpZiAoKCpzY2FuIDwgJzAnKSB8fCAoKnNjYW4gPiAnOScpKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggU3ludGF4RXJyb3JVc2luZywgdmFyLCAiXCJ0aHJlYWRzXCIiICk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgbmV4dCA9IHNjYW47CisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBjb3VudCA9IF9fa21wX3N0cl90b19pbnQoc2NhbiwgKm5leHQpOworICAgICAgICBLTVBfQVNTRVJUKGNvdW50ID49IDApOworICAgICAgICBzY2FuID0gbmV4dDsKKworICAgICAgICAvLworICAgICAgICAvLyB2YWxpZCBmb2xsb3cgc2V0cyBhcmUgJywnICc6JyBhbmQgRU9MCisgICAgICAgIC8vCisgICAgICAgIFNLSVBfV1Moc2Nhbik7CisgICAgICAgIGlmICgqc2NhbiA9PSAnXDAnKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoKnNjYW4gPT0gJywnKSB7CisgICAgICAgICAgICBzY2FuKys7ICAgICAvLyBza2lwICcsJworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCpzY2FuICE9ICc6JykgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIFN5bnRheEVycm9yVXNpbmcsIHZhciwgIlwidGhyZWFkc1wiIiApOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIHNjYW4rKzsgICAgICAgICAvLyBza2lwICc6JworCisgICAgICAgIC8vCisgICAgICAgIC8vIFJlYWQgc3RyaWRlIHBhcmFtZXRlcgorICAgICAgICAvLworICAgICAgICBpbnQgc2lnbiA9ICsxOworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBTS0lQX1dTKHNjYW4pOworICAgICAgICAgICAgaWYgKCpzY2FuID09ICcrJykgeworICAgICAgICAgICAgICAgIHNjYW4rKzsgLy8gc2tpcCAnKycKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgqc2NhbiA9PSAnLScpIHsKKyAgICAgICAgICAgICAgICBzaWduICo9IC0xOworICAgICAgICAgICAgICAgIHNjYW4rKzsgLy8gc2tpcCAnLScKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIFNLSVBfV1Moc2Nhbik7CisgICAgICAgIGlmICgoKnNjYW4gPCAnMCcpIHx8ICgqc2NhbiA+ICc5JykpIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBTeW50YXhFcnJvclVzaW5nLCB2YXIsICJcInRocmVhZHNcIiIgKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBuZXh0ID0gc2NhbjsKKyAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgIHN0cmlkZSA9IF9fa21wX3N0cl90b19pbnQoc2NhbiwgKm5leHQpOworICAgICAgICBLTVBfQVNTRVJUKHN0cmlkZSA+PSAwKTsKKyAgICAgICAgc2NhbiA9IG5leHQ7CisgICAgICAgIHN0cmlkZSAqPSBzaWduOworCisgICAgICAgIC8vCisgICAgICAgIC8vIHZhbGlkIGZvbGxvdyBzZXRzIGFyZSAnLCcgYW5kIEVPTAorICAgICAgICAvLworICAgICAgICBTS0lQX1dTKHNjYW4pOworICAgICAgICBpZiAoKnNjYW4gPT0gJ1wwJykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCpzY2FuID09ICcsJykgeworICAgICAgICAgICAgc2NhbisrOyAgICAgLy8gc2tpcCAnLCcKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgS01QX1dBUk5JTkcoIFN5bnRheEVycm9yVXNpbmcsIHZhciwgIlwidGhyZWFkc1wiIiApOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgeworICAgICAgICBpbnQgbGVuID0gc2NhbiAtIGVudjsKKyAgICAgICAgY2hhciAqcmV0bGlzdCA9IChjaGFyICopX19rbXBfYWxsb2NhdGUoKGxlbiArIDEpICogc2l6ZW9mKGNoYXIpKTsKKyAgICAgICAgbWVtY3B5KHJldGxpc3QsIGVudiwgbGVuICogc2l6ZW9mKGNoYXIpKTsKKyAgICAgICAgcmV0bGlzdFtsZW5dID0gJ1wwJzsKKyAgICAgICAgKnBsYWNlX2xpc3QgPSByZXRsaXN0OworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9wbGFjZXMoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkKK3sKKyAgICBpbnQgY291bnQ7CisgICAgY29uc3QgY2hhciAqc2NhbiA9IHZhbHVlOworICAgIGNvbnN0IGNoYXIgKm5leHQgPSBzY2FuOworICAgIGNvbnN0IGNoYXIgKmtpbmQgPSAiXCJ0aHJlYWRzXCIiOworCisgICAgLy9fX2ttcF9hZmZpbml0eV9udW1fcGxhY2VzID0gMDsKKworICAgIGlmICggX19rbXBfbWF0Y2hfc3RyKCAidGhyZWFkcyIsIHNjYW4sICZuZXh0ICkgKSB7CisgICAgICAgIHNjYW4gPSBuZXh0OworICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfY29tcGFjdDsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fdGhyZWFkOworICAgICAgICBfX2ttcF9hZmZpbml0eV9kdXBzID0gRkFMU0U7CisgICAgICAgIGtpbmQgPSAiXCJ0aHJlYWRzXCIiOworICAgIH0KKyAgICBlbHNlIGlmICggX19rbXBfbWF0Y2hfc3RyKCAiY29yZXMiLCBzY2FuLCAmbmV4dCApICkgeworICAgICAgICBzY2FuID0gbmV4dDsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X2NvbXBhY3Q7CisgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2NvcmU7CisgICAgICAgIF9fa21wX2FmZmluaXR5X2R1cHMgPSBGQUxTRTsKKyAgICAgICAga2luZCA9ICJcImNvcmVzXCIiOworICAgIH0KKyAgICBlbHNlIGlmICggX19rbXBfbWF0Y2hfc3RyKCAic29ja2V0cyIsIHNjYW4sICZuZXh0ICkgKSB7CisgICAgICAgIHNjYW4gPSBuZXh0OworICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfY29tcGFjdDsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fcGFja2FnZTsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfZHVwcyA9IEZBTFNFOworICAgICAgICBraW5kID0gIlwic29ja2V0c1wiIjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmICggX19rbXBfYWZmaW5pdHlfcHJvY2xpc3QgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKV9fa21wX2FmZmluaXR5X3Byb2NsaXN0ICk7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9wcm9jbGlzdCA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBfX2ttcF9wYXJzZV9wbGFjZV9saXN0KCBuYW1lLCB2YWx1ZSwgJl9fa21wX2FmZmluaXR5X3Byb2NsaXN0ICkgKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfZXhwbGljaXQ7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9maW5lOworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZHVwcyA9IEZBTFNFOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBTS0lQX1dTKHNjYW4pOworICAgIGlmICggKnNjYW4gPT0gJ1wwJyApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vCisgICAgLy8gUGFyc2Ugb3B0aW9uIGNvdW50IHBhcmFtZXRlciBpbiBwYXJlbnRoZXNlcworICAgIC8vCisgICAgaWYgKCAqc2NhbiAhPSAnKCcgKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBTeW50YXhFcnJvclVzaW5nLCBuYW1lLCBraW5kICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2NhbisrOyAgICAgLy8gc2tpcCAnKCcKKworICAgIFNLSVBfV1Moc2Nhbik7CisgICAgbmV4dCA9IHNjYW47CisgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgY291bnQgPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgICBLTVBfQVNTRVJUKGNvdW50ID49IDApOworICAgIHNjYW4gPSBuZXh0OworCisgICAgU0tJUF9XUyhzY2FuKTsKKyAgICBpZiAoICpzY2FuICE9ICcpJyApIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIFN5bnRheEVycm9yVXNpbmcsIG5hbWUsIGtpbmQgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzY2FuKys7ICAgICAvLyBza2lwICcpJworCisgICAgU0tJUF9XUyhzY2FuKTsKKyAgICBpZiAoICpzY2FuICE9ICdcMCcgKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBQYXJzZUV4dHJhQ2hhcnNXYXJuLCBuYW1lLCBzY2FuICk7CisgICAgfQorICAgIF9fa21wX2FmZmluaXR5X251bV9wbGFjZXMgPSBjb3VudDsKK30KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9wbGFjZXMoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLAorICB2b2lkICogZGF0YSApCit7CisgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgKSB7CisgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXMiLCBuYW1lICk7CisgICAgfQorICAgIGlmICggKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnVzZWQgPT0gMCApCisgICAgICB8fCAoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlcyA9PSBOVUxMICkKKyAgICAgIHx8ICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID09IHByb2NfYmluZF9mYWxzZSApCisgICAgICB8fCAoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9PSBwcm9jX2JpbmRfaW50ZWwgKSApIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiOiAlc1xuIiwgS01QX0kxOE5fU1RSKCBOb3REZWZpbmVkICkgKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfZXhwbGljaXQgKSB7CisgICAgICAgIGlmICggX19rbXBfYWZmaW5pdHlfcHJvY2xpc3QgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIj0nJXMnXG4iLCBfX2ttcF9hZmZpbml0eV9wcm9jbGlzdCApOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiOiAlc1xuIiwgS01QX0kxOE5fU1RSKCBOb3REZWZpbmVkICkgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICggX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9jb21wYWN0ICkgeworICAgICAgICBpbnQgbnVtOworICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X251bV9tYXNrcyA+IDAgKSB7CisgICAgICAgICAgICBudW0gPSBfX2ttcF9hZmZpbml0eV9udW1fbWFza3M7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIF9fa21wX2FmZmluaXR5X251bV9wbGFjZXMgPiAwICkgeworICAgICAgICAgICAgbnVtID0gX19rbXBfYWZmaW5pdHlfbnVtX3BsYWNlczsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG51bSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fdGhyZWFkICkgeworICAgICAgICAgICAgaWYgKCBudW0gPiAwICkgeworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIj0ndGhyZWFkcyglZCknXG4iLCBudW0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIj0ndGhyZWFkcydcbiIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX2NvcmUgKSB7CisgICAgICAgICAgICBpZiAoIG51bSA+IDAgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiPSdjb3JlcyglZCknIFxuIiwgbnVtICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICI9J2NvcmVzJ1xuIiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fcGFja2FnZSApIHsKKyAgICAgICAgICAgIGlmICggbnVtID4gMCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICI9J3NvY2tldHMoJWQpJ1xuIiwgbnVtICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICI9J3NvY2tldHMnXG4iICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICI6ICVzXG4iLCBLTVBfSTE4Tl9TVFIoIE5vdERlZmluZWQgKSApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICI6ICVzXG4iLCBLTVBfSTE4Tl9TVFIoIE5vdERlZmluZWQgKSApOworICAgIH0KK30KKworIyBlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisjIGlmIE9NUF8zMF9FTkFCTEVEICYmICghIE9NUF80MF9FTkFCTEVEKQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3Byb2NfYmluZCggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKQoreworICAgIGludCBlbmFibGVkOworICAgIGttcF9zZXR0aW5nX3QgKipyaXZhbHMgPSAoa21wX3NldHRpbmdfdCAqKikgZGF0YTsKKyAgICBpbnQgcmM7CisKKyAgICByYyA9IF9fa21wX3N0Z19jaGVja19yaXZhbHMoIG5hbWUsIHZhbHVlLCByaXZhbHMgKTsKKyAgICBpZiAoIHJjICkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8KKyAgICAvLyBpbiBPTVAgMy4xLCBPTVBfUFJPQ19CSU5EIGlzIHN0cmljdGx5IGEgYm9vbGVhbgorICAgIC8vCisgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIGVuYWJsZWQgKTsKKyAgICBpZiAoIGVuYWJsZWQgKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gT01QX1BST0NfQklORCA9PiBncmFudWxhcml0eT1jb3JlLHNjYXR0ZXIKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfc2NhdHRlcjsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2NvcmU7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfbm9uZTsKKyAgICB9Cit9IC8vIF9fa21wX3BhcnNlX3Byb2NfYmluZAorCisjIGVuZGlmIC8qIGlmIE9NUF8zMF9FTkFCTEVEICYmICghIE9NUF80MF9FTkFCTEVEKSAqLworCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfdG9wb2xvZ3lfbWV0aG9kKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLAorICB2b2lkICogZGF0YSApIHsKKyAgICBpZiAoIF9fa21wX3N0cl9tYXRjaCggImFsbCIsIDEsIHZhbHVlICkgKSB7CisgICAgICAgX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9IGFmZmluaXR5X3RvcF9tZXRob2RfYWxsOworICAgIH0KKyMgaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorICAgIGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJ4MmFwaWMgaWQiLCA5LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJ4MmFwaWNfaWQiLCA5LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJ4MmFwaWMtaWQiLCA5LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJ4MmFwaWNpZCIsIDgsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkIGxlYWYgMTEiLCAxMywgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWRfbGVhZl8xMSIsIDEzLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZC1sZWFmLTExIiwgMTMsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkIGxlYWYxMSIsIDEyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZF9sZWFmMTEiLCAxMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWQtbGVhZjExIiwgMTIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkbGVhZiAxMSIsIDEyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZGxlYWZfMTEiLCAxMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWRsZWFmLTExIiwgMTIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkbGVhZjExIiwgMTEsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkIDExIiwgOCwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWRfMTEiLCA4LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZC0xMSIsIDgsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkMTEiLCA3LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJsZWFmIDExIiwgNywgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAibGVhZl8xMSIsIDcsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImxlYWYtMTEiLCA3LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJsZWFmMTEiLCA2LCB2YWx1ZSApICkgeworICAgICAgICBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID0gYWZmaW5pdHlfdG9wX21ldGhvZF94MmFwaWNpZDsKKyAgICB9CisgICAgZWxzZSBpZiAoIF9fa21wX3N0cl9tYXRjaCggImFwaWMgaWQiLCA3LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJhcGljX2lkIiwgNywgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiYXBpYy1pZCIsIDcsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImFwaWNpZCIsIDYsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkIGxlYWYgNCIsIDEyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZF9sZWFmXzQiLCAxMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWQtbGVhZi00IiwgMTIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkIGxlYWY0IiwgMTEsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkX2xlYWY0IiwgMTEsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkLWxlYWY0IiwgMTEsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkbGVhZiA0IiwgMTEsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkbGVhZl80IiwgMTEsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkbGVhZi00IiwgMTEsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkbGVhZjQiLCAxMCwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWQgNCIsIDcsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkXzQiLCA3LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZC00IiwgNywgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWQ0IiwgNiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAibGVhZiA0IiwgNiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAibGVhZl80IiwgNiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAibGVhZi00IiwgNiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAibGVhZjQiLCA1LCB2YWx1ZSApICkgeworICAgICAgICBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID0gYWZmaW5pdHlfdG9wX21ldGhvZF9hcGljaWQ7CisgICAgfQorIyBlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisgICAgZWxzZSBpZiAoIF9fa21wX3N0cl9tYXRjaCggIi9wcm9jL2NwdWluZm8iLCAyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpbmZvIiwgNSwgdmFsdWUgKSkgeworICAgICAgICBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID0gYWZmaW5pdHlfdG9wX21ldGhvZF9jcHVpbmZvOworICAgIH0KKyMgaWYgS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2XzY0CisgICAgZWxzZSBpZiAoIF9fa21wX3N0cl9tYXRjaCggImdyb3VwIiwgMSwgdmFsdWUgKSApIHsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9IGFmZmluaXR5X3RvcF9tZXRob2RfZ3JvdXA7CisgICAgfQorIyBlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAmJiBLTVBfQVJDSF9YODZfNjQgKi8KKyAgICBlbHNlIGlmICggX19rbXBfc3RyX21hdGNoKCAiZmxhdCIsIDEsIHZhbHVlICkgKSB7CisgICAgICAgIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPSBhZmZpbml0eV90b3BfbWV0aG9kX2ZsYXQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBLTVBfV0FSTklORyggU3RnSW52YWxpZFZhbHVlLCBuYW1lLCB2YWx1ZSApOworICAgIH0KK30gLy8gX19rbXBfc3RnX3BhcnNlX3RvcG9sb2d5X21ldGhvZAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3RvcG9sb2d5X21ldGhvZCgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsCisgIHZvaWQgKiBkYXRhICkgeworIyBpZiBLTVBfREVCVUcKKyAgICBjaGFyIGNvbnN0ICogdmFsdWUgPSBOVUxMOworCisgICAgc3dpdGNoICggX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCApIHsKKyAgICAgICAgY2FzZSBhZmZpbml0eV90b3BfbWV0aG9kX2RlZmF1bHQ6CisgICAgICAgIHZhbHVlID0gImRlZmF1bHQiOworICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGFmZmluaXR5X3RvcF9tZXRob2RfYWxsOgorICAgICAgICB2YWx1ZSA9ICJhbGwiOworICAgICAgICBicmVhazsKKworIyAgaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorICAgICAgICBjYXNlIGFmZmluaXR5X3RvcF9tZXRob2RfeDJhcGljaWQ6CisgICAgICAgIHZhbHVlID0gIngyQVBJQyBpZCI7CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgYWZmaW5pdHlfdG9wX21ldGhvZF9hcGljaWQ6CisgICAgICAgIHZhbHVlID0gIkFQSUMgaWQiOworICAgICAgICBicmVhazsKKyMgIGVuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworICAgICAgICBjYXNlIGFmZmluaXR5X3RvcF9tZXRob2RfY3B1aW5mbzoKKyAgICAgICAgdmFsdWUgPSAiY3B1aW5mbyI7CisgICAgICAgIGJyZWFrOworCisjICBpZiBLTVBfT1NfV0lORE9XUyAmJiBLTVBfQVJDSF9YODZfNjQKKyAgICAgICAgY2FzZSBhZmZpbml0eV90b3BfbWV0aG9kX2dyb3VwOgorICAgICAgICB2YWx1ZSA9ICJncm91cCI7CisgICAgICAgIGJyZWFrOworIyAgZW5kaWYgLyogS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2XzY0ICovCisKKyAgICAgICAgY2FzZSBhZmZpbml0eV90b3BfbWV0aG9kX2ZsYXQ6CisgICAgICAgIHZhbHVlID0gImZsYXQiOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIHZhbHVlICE9IE5VTEwgKSB7CisgICAgICAgIF9fa21wX3N0Z19wcmludF9zdHIoIGJ1ZmZlciwgbmFtZSwgdmFsdWUgKTsKKyAgICB9CisjIGVuZGlmIC8qIEtNUF9ERUJVRyAqLworfSAvLyBfX2ttcF9zdGdfcHJpbnRfdG9wb2xvZ3lfbWV0aG9kCisKKyNlbmRpZiAvKiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEICovCisKKworI2lmIE9NUF80MF9FTkFCTEVECisKKy8vCisvLyBPTVBfUFJPQ19CSU5EIC8gYmluZC12YXIgaXMgZnVuY3Rpb25hbCBvbiBhbGwgNC4wIGJ1aWxkcywgaW5jbHVkaW5nIE9TIFgqCisvLyBPTVBfUExBQ0VTIC8gcGxhY2UtcGFydGl0aW9uLXZhciBpcyBub3QuCisvLworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9wcm9jX2JpbmQoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkKK3sKKyAgICBrbXBfc2V0dGluZ190ICoqcml2YWxzID0gKGttcF9zZXR0aW5nX3QgKiopIGRhdGE7CisgICAgaW50IHJjOworCisgICAgcmMgPSBfX2ttcF9zdGdfY2hlY2tfcml2YWxzKCBuYW1lLCB2YWx1ZSwgcml2YWxzICk7CisgICAgaWYgKCByYyApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vCisgICAgLy8gaW4gT01QIDQuMCBPTVBfUFJPQ19CSU5EIGlzIGEgdmVjdG9yIG9mIHByb2NfYmluZCB0eXBlcy4KKyAgICAvLworICAgIEtNUF9ERUJVR19BU1NFUlQoIChfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXMgIT0gTlVMTCkKKyAgICAgICYmICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC51c2VkID4gMCApICk7CisKKyAgICBjb25zdCBjaGFyICpidWYgPSB2YWx1ZTsKKyAgICBjb25zdCBjaGFyICpuZXh0OworICAgIGludCBudW07CisgICAgU0tJUF9XUyggYnVmICk7CisgICAgaWYgKCAoKmJ1ZiA+PSAnMCcpICYmICgqYnVmIDw9ICc5JykgKSB7CisgICAgICAgIG5leHQgPSBidWY7CisgICAgICAgIFNLSVBfRElHSVRTKCBuZXh0ICk7CisgICAgICAgIG51bSA9IF9fa21wX3N0cl90b19pbnQoIGJ1ZiwgKm5leHQgKTsKKyAgICAgICAgS01QX0FTU0VSVCggbnVtID49IDAgKTsKKyAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgU0tJUF9XUyggYnVmICk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBudW0gPSAtMTsKKyAgICB9CisKKyAgICBuZXh0ID0gYnVmOworICAgIGlmICggX19rbXBfbWF0Y2hfc3RyKCAiZGlzYWJsZWQiLCBidWYsICZuZXh0ICkgKSB7CisgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIFNLSVBfV1MoIGJ1ZiApOworIyBpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9kaXNhYmxlZDsKKyMgZW5kaWYgLyogS01QX0FGRklOSVRZX1NVUFBPUlRFRCAqLworICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnVzZWQgPSAxOworICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfZGlzYWJsZWQ7CisgICAgfQorICAgIGVsc2UgaWYgKCAoIG51bSA9PSAoaW50KXByb2NfYmluZF9mYWxzZSApCisgICAgICB8fCBfX2ttcF9tYXRjaF9zdHIoICJmYWxzZSIsIGJ1ZiwgJm5leHQgKSApIHsKKyAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgU0tJUF9XUyggYnVmICk7CisjIGlmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X25vbmU7CisjIGVuZGlmIC8qIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgKi8KKyAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC51c2VkID0gMTsKKyAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX2ZhbHNlOworICAgIH0KKyAgICBlbHNlIGlmICggKCBudW0gPT0gKGludClwcm9jX2JpbmRfdHJ1ZSApCisgICAgICB8fCBfX2ttcF9tYXRjaF9zdHIoICJ0cnVlIiwgYnVmLCAmbmV4dCApICkgeworICAgICAgICBidWYgPSBuZXh0OworICAgICAgICBTS0lQX1dTKCBidWYgKTsKKyAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC51c2VkID0gMTsKKworICAgICAgICAvLworICAgICAgICAvLyAidHJ1ZSIgY3VycmVudGx5IG1hcHMgdG8gInNwcmVhZCIKKyAgICAgICAgLy8KKyAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX3NwcmVhZDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIENvdW50IHRoZSBudW1iZXIgb2YgdmFsdWVzIGluIHRoZSBlbnYgdmFyIHN0cmluZworICAgICAgICAvLworICAgICAgICBjb25zdCBjaGFyICpzY2FuOworICAgICAgICBpbnQgbmVsZW0gPSAxOworICAgICAgICBmb3IgKCBzY2FuID0gYnVmOyAqc2NhbiAhPSAnXDAnOyBzY2FuKysgKSB7CisgICAgICAgICAgICBpZiAoICpzY2FuID09ICcsJyApIHsKKyAgICAgICAgICAgICAgICBuZWxlbSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQ3JlYXRlIC8gZXhwYW5kIHRoZSBuZXN0ZWQgcHJvY19iaW5kIGFycmF5IGFzIG5lZWRlZAorICAgICAgICAvLworICAgICAgICBpZiAoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuc2l6ZSA8IG5lbGVtICkgeworICAgICAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzID0gKGttcF9wcm9jX2JpbmRfdCAqKQorICAgICAgICAgICAgICAgIEtNUF9JTlRFUk5BTF9SRUFMTE9DKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXMsCisgICAgICAgICAgICAgICAgc2l6ZW9mKGttcF9wcm9jX2JpbmRfdCkgKiBuZWxlbSApOworICAgICAgICAgICAgaWYgKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXMgPT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBLTVBfRkFUQUwoIE1lbW9yeUFsbG9jRmFpbGVkICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnNpemUgPSBuZWxlbTsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnVzZWQgPSBuZWxlbTsKKworICAgICAgICAvLworICAgICAgICAvLyBTYXZlIHZhbHVlcyBpbiB0aGUgbmVzdGVkIHByb2NfYmluZCBhcnJheQorICAgICAgICAvLworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIGVudW0ga21wX3Byb2NfYmluZF90IGJpbmQ7CisKKyAgICAgICAgICAgIGlmICggKCBudW0gPT0gKGludClwcm9jX2JpbmRfbWFzdGVyICkKKyAgICAgICAgICAgICAgfHwgX19rbXBfbWF0Y2hfc3RyKCAibWFzdGVyIiwgYnVmLCAmbmV4dCApICkgeworICAgICAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgICAgICAgICAgU0tJUF9XUyggYnVmICk7CisgICAgICAgICAgICAgICAgYmluZCA9IHByb2NfYmluZF9tYXN0ZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggKCBudW0gPT0gKGludClwcm9jX2JpbmRfY2xvc2UgKQorICAgICAgICAgICAgICB8fCBfX2ttcF9tYXRjaF9zdHIoICJjbG9zZSIsIGJ1ZiwgJm5leHQgKSApIHsKKyAgICAgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICAgICAgICAgIFNLSVBfV1MoIGJ1ZiApOworICAgICAgICAgICAgICAgIGJpbmQgPSBwcm9jX2JpbmRfY2xvc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggKCBudW0gPT0gKGludClwcm9jX2JpbmRfc3ByZWFkICkKKyAgICAgICAgICAgICAgfHwgX19rbXBfbWF0Y2hfc3RyKCAic3ByZWFkIiwgYnVmLCAmbmV4dCApICkgeworICAgICAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgICAgICAgICAgU0tJUF9XUyggYnVmICk7CisgICAgICAgICAgICAgICAgYmluZCA9IHByb2NfYmluZF9zcHJlYWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggU3RnSW52YWxpZFZhbHVlLCBuYW1lLCB2YWx1ZSApOworICAgICAgICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9mYWxzZTsKKyAgICAgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnVzZWQgPSAxOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzW2krK10gPSBiaW5kOworICAgICAgICAgICAgaWYgKCBpID49IG5lbGVtICkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKmJ1ZiA9PSAnLCcgKTsKKyAgICAgICAgICAgIGJ1ZisrOworICAgICAgICAgICAgU0tJUF9XUyggYnVmICk7CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBSZWFkIG5leHQgdmFsdWUgaWYgaXQgd2FzIHNwZWNpZmllZCBhcyBhbiBpbnRlZ2VyCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaWYgKCAoKmJ1ZiA+PSAnMCcpICYmICgqYnVmIDw9ICc5JykgKSB7CisgICAgICAgICAgICAgICAgbmV4dCA9IGJ1ZjsKKyAgICAgICAgICAgICAgICBTS0lQX0RJR0lUUyggbmV4dCApOworICAgICAgICAgICAgICAgIG51bSA9IF9fa21wX3N0cl90b19pbnQoIGJ1ZiwgKm5leHQgKTsKKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKCBudW0gPj0gMCApOworICAgICAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgICAgICAgICAgU0tJUF9XUyggYnVmICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBudW0gPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBTS0lQX1dTKCBidWYgKTsKKyAgICB9CisgICAgaWYgKCAqYnVmICE9ICdcMCcgKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBQYXJzZUV4dHJhQ2hhcnNXYXJuLCBuYW1lLCBidWYgKTsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9wcm9jX2JpbmQoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLAorICB2b2lkICogZGF0YSApCit7CisgICAgaW50IG5lbGVtID0gX19rbXBfbmVzdGVkX3Byb2NfYmluZC51c2VkOworICAgIGlmKCBfX2ttcF9lbnZfZm9ybWF0ICkgeworICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9OQU1FOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzIiwgbmFtZSApOworICAgIH0KKyAgICBpZiAoIG5lbGVtID09IDAgKSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIjogJXNcbiIsIEtNUF9JMThOX1NUUiggTm90RGVmaW5lZCApICk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiPSciLCBuYW1lICk7CisgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgbmVsZW07IGkrKyApIHsKKyAgICAgICAgICAgIHN3aXRjaCAoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1tpXSApIHsKKyAgICAgICAgICAgICAgICBjYXNlIHByb2NfYmluZF9mYWxzZToKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICJmYWxzZSIgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgcHJvY19iaW5kX3RydWU6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAidHJ1ZSIgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgcHJvY19iaW5kX21hc3RlcjoKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICJtYXN0ZXIiICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIHByb2NfYmluZF9jbG9zZToKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICJjbG9zZSIgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgcHJvY19iaW5kX3NwcmVhZDoKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICJzcHJlYWQiICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIHByb2NfYmluZF9kaXNhYmxlZDoKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICJkaXNhYmxlZCIgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgcHJvY19iaW5kX2ludGVsOgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgImludGVsIiApOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBwcm9jX2JpbmRfZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICJkZWZhdWx0IiApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBpIDwgbmVsZW0gLSAxICkgeworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiwiICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJ1xuIiApOworICAgIH0KK30KKworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT01QX0RZTkFNSUMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9vbXBfZHluYW1pYyggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKQoreworICAgIF9fa21wX3N0Z19wYXJzZV9ib29sKCBuYW1lLCB2YWx1ZSwgJiAoX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljKSApOworfSAvLyBfX2ttcF9zdGdfcGFyc2Vfb21wX2R5bmFtaWMKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9vbXBfZHluYW1pYygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkKK3sKKyAgICBfX2ttcF9zdGdfcHJpbnRfYm9vbCggYnVmZmVyLCBuYW1lLCBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWMgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X29tcF9keW5hbWljCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2Vfa21wX2R5bmFtaWNfbW9kZSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKQoreworICAgIGlmICggVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkgKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBFbnZQYXJhbGxlbFdhcm4sIG5hbWUgKTsKKyAgICAgICAgX19rbXBfZW52X3RvUHJpbnQoIG5hbWUsIDAgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNpZmRlZiBVU0VfTE9BRF9CQUxBTkNFCisgICAgZWxzZSBpZiAoIF9fa21wX3N0cl9tYXRjaCggImxvYWQgYmFsYW5jZSIsIDIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImxvYWRfYmFsYW5jZSIsIDIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImxvYWQtYmFsYW5jZSIsIDIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImxvYWRiYWxhbmNlIiwgMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiYmFsYW5jZSIsIDEsIHZhbHVlICkgKSB7CisgICAgICAgIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pY19tb2RlID0gZHluYW1pY19sb2FkX2JhbGFuY2U7CisgICAgfQorI2VuZGlmIC8qIFVTRV9MT0FEX0JBTEFOQ0UgKi8KKyAgICBlbHNlIGlmICggX19rbXBfc3RyX21hdGNoKCAidGhyZWFkIGxpbWl0IiwgMSwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAidGhyZWFkX2xpbWl0IiwgMSwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAidGhyZWFkLWxpbWl0IiwgMSwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAidGhyZWFkbGltaXQiLCAxLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJsaW1pdCIsIDIsIHZhbHVlICkgKSB7CisgICAgICAgIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pY19tb2RlID0gZHluYW1pY190aHJlYWRfbGltaXQ7CisgICAgfQorICAgIGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJyYW5kb20iLCAxLCB2YWx1ZSApICkgeworICAgICAgICBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWNfbW9kZSA9IGR5bmFtaWNfcmFuZG9tOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIFN0Z0ludmFsaWRWYWx1ZSwgbmFtZSwgdmFsdWUgKTsKKyAgICB9Cit9IC8vX19rbXBfc3RnX3BhcnNlX2ttcF9keW5hbWljX21vZGUKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9rbXBfZHluYW1pY19tb2RlKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKQoreworI2lmIEtNUF9ERUJVRworICAgIGlmICggX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljX21vZGUgPT0gZHluYW1pY19kZWZhdWx0ICkgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICAlczogJXMgXG4iLCBuYW1lLCBLTVBfSTE4Tl9TVFIoIE5vdERlZmluZWQgKSApOworICAgIH0KKyMgaWZkZWYgVVNFX0xPQURfQkFMQU5DRQorICAgIGVsc2UgaWYgKCBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWNfbW9kZSA9PSBkeW5hbWljX2xvYWRfYmFsYW5jZSApIHsKKyAgICAgICAgX19rbXBfc3RnX3ByaW50X3N0ciggYnVmZmVyLCBuYW1lLCAibG9hZCBiYWxhbmNlIiApOworICAgIH0KKyMgZW5kaWYgLyogVVNFX0xPQURfQkFMQU5DRSAqLworICAgIGVsc2UgaWYgKCBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWNfbW9kZSA9PSBkeW5hbWljX3RocmVhZF9saW1pdCApIHsKKyAgICAgICAgX19rbXBfc3RnX3ByaW50X3N0ciggYnVmZmVyLCBuYW1lLCAidGhyZWFkIGxpbWl0IiApOworICAgIH0KKyAgICBlbHNlIGlmICggX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljX21vZGUgPT0gZHluYW1pY19yYW5kb20gKSB7CisgICAgICAgIF9fa21wX3N0Z19wcmludF9zdHIoIGJ1ZmZlciwgbmFtZSwgInJhbmRvbSIgKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEtNUF9BU1NFUlQoMCk7CisgICAgfQorI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworfSAvLyBfX2ttcF9zdGdfcHJpbnRfa21wX2R5bmFtaWNfbW9kZQorCisKKyNpZmRlZiBVU0VfTE9BRF9CQUxBTkNFCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9MT0FEX0JBTEFOQ0VfSU5URVJWQUwKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9sZF9iYWxhbmNlX2ludGVydmFsKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApCit7CisgICAgZG91YmxlIGludGVydmFsID0gX19rbXBfY29udmVydF90b19kb3VibGUoIHZhbHVlICk7CisgICAgaWYgKCBpbnRlcnZhbCA+PSAwICkgeworICAgICAgICBfX2ttcF9sb2FkX2JhbGFuY2VfaW50ZXJ2YWwgPSBpbnRlcnZhbDsKKyAgICB9IGVsc2UgeworICAgICAgICBLTVBfV0FSTklORyggU3RnSW52YWxpZFZhbHVlLCBuYW1lLCB2YWx1ZSApOworICAgIH07IC8vIGlmCit9IC8vIF9fa21wX3N0Z19wYXJzZV9sb2FkX2JhbGFuY2VfaW50ZXJ2YWwKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9sZF9iYWxhbmNlX2ludGVydmFsKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisjaWYgS01QX0RFQlVHCisgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXM9JTguNmZcbiIsIG5hbWUsIF9fa21wX2xvYWRfYmFsYW5jZV9pbnRlcnZhbCApOworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworfSAvLyBfX2ttcF9zdGdfcHJpbnRfbG9hZF9iYWxhbmNlX2ludGVydmFsCisKKyNlbmRpZiAvKiBVU0VfTE9BRF9CQUxBTkNFICovCisKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfSU5JVF9BVF9GT1JLCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfaW5pdF9hdF9mb3JrKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfYm9vbCggbmFtZSwgdmFsdWUsICYgX19rbXBfbmVlZF9yZWdpc3Rlcl9hdGZvcmsgKTsKKyAgICBpZiAoIF9fa21wX25lZWRfcmVnaXN0ZXJfYXRmb3JrICkgeworICAgICAgICBfX2ttcF9uZWVkX3JlZ2lzdGVyX2F0Zm9ya19zcGVjaWZpZWQgPSBUUlVFOworICAgIH07Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9pbml0X2F0X2ZvcmsKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9pbml0X2F0X2ZvcmsoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfYm9vbCggYnVmZmVyLCBuYW1lLCBfX2ttcF9uZWVkX3JlZ2lzdGVyX2F0Zm9ya19zcGVjaWZpZWQgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2luaXRfYXRfZm9yaworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfU0NIRURVTEUKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9zY2hlZHVsZSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisKKyAgICBpZiAoIHZhbHVlICE9IE5VTEwgKSB7CisgICAgICAgIHNpemVfdCBsZW5ndGggPSBzdHJsZW4oIHZhbHVlICk7CisgICAgICAgIGlmICggbGVuZ3RoID4gSU5UX01BWCApIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBMb25nVmFsdWUsIG5hbWUgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNoYXIgKnNlbWljb2xvbjsKKyAgICAgICAgICAgIGlmKCB2YWx1ZVsgbGVuZ3RoIC0gMSBdID09ICciJyB8fCB2YWx1ZVsgbGVuZ3RoIC0xIF0gPT0gJ1wnJyApCisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIFVuYmFsYW5jZWRRdW90ZXMsIG5hbWUgKTsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBjaGFyIHNlbnRpbmVsOworCisgICAgICAgICAgICAgICAgc2VtaWNvbG9uID0gKGNoYXIgKikgc3RyY2hyKCB2YWx1ZSwgJzsnICk7CisgICAgICAgICAgICAgICAgaWYoICp2YWx1ZSAmJiBzZW1pY29sb24gIT0gdmFsdWUgKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgKmNvbW1hID0gKGNoYXIgKikgc3RyY2hyKCB2YWx1ZSwgJywnICk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBjb21tYSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrY29tbWE7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW50aW5lbCA9ICcsJzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzZW50aW5lbCA9ICc7JzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAhX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCAic3RhdGljIiwgdmFsdWUsIHNlbnRpbmVsICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggIV9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCggImdyZWVkeSIsIGNvbW1hLCAnOycgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGF0aWMgPSBrbXBfc2NoX3N0YXRpY19ncmVlZHk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYoICFfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoICJiYWxhbmNlZCIsIGNvbW1hLCAnOycgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGF0aWMgPSBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggIV9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCggImd1aWRlZCIsIHZhbHVlLCBzZW50aW5lbCApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCAiaXRlcmF0aXZlIiwgY29tbWEsICc7JyApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d1aWRlZCA9IGttcF9zY2hfZ3VpZGVkX2l0ZXJhdGl2ZV9jaHVua2VkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggIV9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCggImFuYWx5dGljYWwiLCBjb21tYSwgJzsnICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5hbHl0aWNhbCBub3QgYWxsb3dlZCBmb3IgdG9vIG1hbnkgdGhyZWFkcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d1aWRlZCA9IGttcF9zY2hfZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggSW52YWxpZENsYXVzZSwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEVtcHR5Q2xhdXNlLCBuYW1lICk7CisgICAgICAgICAgICB9IHdoaWxlICggdmFsdWUgPSBzZW1pY29sb24gPyBzZW1pY29sb24gKyAxIDogTlVMTCApOworICAgICAgICB9CisgICAgfTsgLy8gaWYKKworfSAvLyBfX2ttcF9zdGdfcGFyc2VfX3NjaGVkdWxlCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfc2NoZWR1bGUoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBpZiggX19rbXBfZW52X2Zvcm1hdCApIHsKKyAgICAgICAgS01QX1NUUl9CVUZfUFJJTlRfTkFNRV9FWChuYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICAlcz0nIiwgbmFtZSApOworICAgIH0KKyAgICBpZiAoIF9fa21wX3N0YXRpYyA9PSBrbXBfc2NoX3N0YXRpY19ncmVlZHkgKSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzIiwgInN0YXRpYyxncmVlZHkiKTsKKyAgICB9IGVsc2UgaWYgKCBfX2ttcF9zdGF0aWMgPT0ga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQgKSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQgKCBidWZmZXIsICIlcyIsICJzdGF0aWMsYmFsYW5jZWQiKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9ndWlkZWQgPT0ga21wX3NjaF9ndWlkZWRfaXRlcmF0aXZlX2NodW5rZWQgKSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIjslcydcbiIsICJndWlkZWQsaXRlcmF0aXZlIik7CisgICAgfSBlbHNlIGlmICggX19rbXBfZ3VpZGVkID09IGttcF9zY2hfZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZCApIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiOyVzJ1xuIiwgImd1aWRlZCxhbmFseXRpY2FsIik7CisgICAgfQorfSAvLyBfX2ttcF9zdGdfcHJpbnRfc2NoZWR1bGUKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT01QX1NDSEVEVUxFCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2Vfb21wX3NjaGVkdWxlKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApCit7CisgICAgc2l6ZV90ICAgICAgbGVuZ3RoOworICAgIGlmKCB2YWx1ZSApIHsKKyAgICAgICAgbGVuZ3RoID0gc3RybGVuKCB2YWx1ZSApOworICAgICAgICBpZiggbGVuZ3RoICkgeworICAgICAgICAgICAgY2hhciAqY29tbWEgPSAoY2hhciAqKSBzdHJjaHIoIHZhbHVlLCAnLCcgKTsKKyAgICAgICAgICAgIGlmKCB2YWx1ZVsgbGVuZ3RoIC0gMSBdID09ICciJyB8fCB2YWx1ZVsgbGVuZ3RoIC0xIF0gPT0gJ1wnJykKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggVW5iYWxhbmNlZFF1b3RlcywgbmFtZSApOworICAgICAgICAgICAgLyogZ2V0IHRoZSBzcGVjaWZpZWQgc2NoZWR1bGluZyBzdHlsZSAqLworICAgICAgICAgICAgaWYgKCFfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoImR5bmFtaWMiLCB2YWx1ZSwgJywnKSkgICAgICAgICAgLyogRFlOQU1JQyAqLworICAgICAgICAgICAgICAgIF9fa21wX3NjaGVkID0ga21wX3NjaF9keW5hbWljX2NodW5rZWQ7CisgICAgICAgICAgICBlbHNlIGlmICghX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCJndWlkZWQiLCB2YWx1ZSwgJywnKSkgICAgICAvKiBHVUlERUQgKi8KKyAgICAgICAgICAgICAgICBfX2ttcF9zY2hlZCA9IGttcF9zY2hfZ3VpZGVkX2NodW5rZWQ7CisvLyBBQzogVE9ETzogYWRkIEFVVE8gc2NoZWR1bGUsIGFuZCBwcHJvYmFibHkgcmVtb3ZlIFRSQVBFWk9JREFMIChPTVAgMy4wIGRvZXMgbm90IGFsbG93IGl0KQorICAgICAgICAgICAgI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgICBlbHNlIGlmICghX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCJhdXRvIiwgdmFsdWUsICcsJykpIHsgICAgICAgLyogQVVUTyAqLworICAgICAgICAgICAgICAgIF9fa21wX3NjaGVkID0ga21wX3NjaF9hdXRvOworICAgICAgICAgICAgICAgIGlmKCBjb21tYSApIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKCBrbXBfbXNfd2FybmluZywgS01QX01TRyggSWdub3JlQ2h1bmssIG5hbWUsIGNvbW1hICksIF9fa21wX21zZ19udWxsICk7CisgICAgICAgICAgICAgICAgICAgIGNvbW1hID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKyAgICAgICAgICAgIGVsc2UgaWYgKCFfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoInRyYXBlem9pZGFsIiwgdmFsdWUsICcsJykpIC8qIFRSQVBFWk9JREFMICovCisgICAgICAgICAgICAgICAgX19rbXBfc2NoZWQgPSBrbXBfc2NoX3RyYXBlem9pZGFsOworICAgICAgICAgICAgZWxzZSBpZiAoIV9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCgic3RhdGljIiwgdmFsdWUsICcsJykpICAgICAgLyogU1RBVElDICovCisgICAgICAgICAgICAgICAgX19rbXBfc2NoZWQgPSBrbXBfc2NoX3N0YXRpYzsKKyNpZmRlZiBLTVBfU1RBVElDX1NURUFMX0VOQUJMRUQKKyAgICAgICAgICAgIGVsc2UgaWYgKEtNUF9BUkNIX1g4Nl82NCAmJgorICAgICAgICAgICAgICAgICAgICAgIV9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCgic3RhdGljX3N0ZWFsIiwgdmFsdWUsICcsJykpCisgICAgICAgICAgICAgICAgX19rbXBfc2NoZWQgPSBrbXBfc2NoX3N0YXRpY19zdGVhbDsKKyNlbmRpZgorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIFN0Z0ludmFsaWRWYWx1ZSwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IE5VTEw7IC8qIHNraXAgcHJvY2Vzc2luZyBvZiBjb21tYSAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIHZhbHVlICYmIGNvbW1hICkgeworICAgICAgICAgICAgICAgIF9fa21wX2Vudl9jaHVuayA9IFRSVUU7CisKKyAgICAgICAgICAgICAgICBpZihfX2ttcF9zY2hlZCA9PSBrbXBfc2NoX3N0YXRpYykKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfc2NoZWQgPSBrbXBfc2NoX3N0YXRpY19jaHVua2VkOworICAgICAgICAgICAgICAgICsrY29tbWE7CisgICAgICAgICAgICAgICAgX19rbXBfY2h1bmsgPSBfX2ttcF9zdHJfdG9faW50KCBjb21tYSwgMCApOworICAgICAgICAgICAgICAgIGlmICggX19rbXBfY2h1bmsgPCAxICkgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9jaHVuayA9IEtNUF9ERUZBVUxUX0NIVU5LOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2coIGttcF9tc193YXJuaW5nLCBLTVBfTVNHKCBJbnZhbGlkQ2h1bmssIG5hbWUsIGNvbW1hICksIF9fa21wX21zZ19udWxsICk7CisgICAgICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oIFVzaW5nX2ludF9WYWx1ZSwgbmFtZSwgX19rbXBfY2h1bmsgKTsKKy8vIEFDOiBuZXh0IGJsb2NrIGNvbW1lbnRlZCBvdXQgdW50aWwgS01QX0RFRkFVTFRfQ0hVTksgIT0gS01QX01JTl9DSFVOSyAodG8gaW1wcm92ZSBjb2RlIGNvdmVyYWdlIDopCisvLyAgICAgVGhlIGRlZmF1bHQgY2h1bmsgc2l6ZSBpcyAxIGFjY29yZGluZyB0byBzdGFuZGFyZCwgdGh1cyBtYWtpbmcgS01QX01JTl9DSFVOSyBub3QgMSB3ZSB3b3VsZCBpbnRyb2R1Y2UgbWVzczoKKy8vICAgICB3cm9uZyBjaHVuayBiZWNvbWVzIDEsIGJ1dCBpdCB3aWxsIGJlIGltcG9zc2libGUgdG8gZXhwbGljaXRlbHkgc2V0IDEsIGJlY2F1c2UgaXQgYmVjb21lcyBLTVBfTUlOX0NIVU5LLi4uCisvLyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBfX2ttcF9jaHVuayA8IEtNUF9NSU5fQ0hVTksgKSB7CisvLyAgICAgICAgICAgICAgICAgICAgX19rbXBfY2h1bmsgPSBLTVBfTUlOX0NIVU5LOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIF9fa21wX2NodW5rID4gS01QX01BWF9DSFVOSyApIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfY2h1bmsgPSBLTVBfTUFYX0NIVU5LOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2coIGttcF9tc193YXJuaW5nLCBLTVBfTVNHKCBMYXJnZUNodW5rLCBuYW1lLCBjb21tYSApLCBfX2ttcF9tc2dfbnVsbCApOworICAgICAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKCBVc2luZ19pbnRfVmFsdWUsIG5hbWUsIF9fa21wX2NodW5rICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgX19rbXBfZW52X2NodW5rID0gRkFMU0U7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgS01QX1dBUk5JTkcoIEVtcHR5U3RyaW5nLCBuYW1lICk7CisgICAgfQorICAgIEtfRElBRygxLCAoIl9fa21wX3N0YXRpYyA9PSAlZFxuIiwgX19rbXBfc3RhdGljKSkKKyAgICBLX0RJQUcoMSwgKCJfX2ttcF9ndWlkZWQgPT0gJWRcbiIsIF9fa21wX2d1aWRlZCkpCisgICAgS19ESUFHKDEsICgiX19rbXBfc2NoZWQgPT0gJWRcbiIsIF9fa21wX3NjaGVkKSkKKyAgICBLX0RJQUcoMSwgKCJfX2ttcF9jaHVuayA9PSAlZFxuIiwgX19rbXBfY2h1bmspKQorfSAvLyBfX2ttcF9zdGdfcGFyc2Vfb21wX3NjaGVkdWxlCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfb21wX3NjaGVkdWxlKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgKSB7CisgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUVfRVgobmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXM9JyIsIG5hbWUgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9jaHVuayApIHsKKyAgICAgICAgc3dpdGNoICggX19rbXBfc2NoZWQgKSB7CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfZHluYW1pY19jaHVua2VkOgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzLCVkJ1xuIiwgImR5bmFtaWMiLCBfX2ttcF9jaHVuayk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfZ3VpZGVkX2l0ZXJhdGl2ZV9jaHVua2VkOgorICAgICAgICAgICAgY2FzZSBrbXBfc2NoX2d1aWRlZF9hbmFseXRpY2FsX2NodW5rZWQ6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsJWQnXG4iLCAiZ3VpZGVkIiwgX19rbXBfY2h1bmspOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBrbXBfc2NoX3RyYXBlem9pZGFsOgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzLCVkJ1xuIiwgInRyYXBlem9pZGFsIiwgX19rbXBfY2h1bmspOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBrbXBfc2NoX3N0YXRpYzoKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfY2h1bmtlZDoKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQ6CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfc3RhdGljX2dyZWVkeToKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcywlZCdcbiIsICJzdGF0aWMiLCBfX2ttcF9jaHVuayk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfc3RhdGljX3N0ZWFsOgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzLCVkJ1xuIiwgInN0YXRpY19zdGVhbCIsIF9fa21wX2NodW5rKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9hdXRvOgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzLCVkJ1xuIiwgImF1dG8iLCBfX2ttcF9jaHVuayk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBzd2l0Y2ggKCBfX2ttcF9zY2hlZCApIHsKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9keW5hbWljX2NodW5rZWQ6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMnXG4iLCAiZHluYW1pYyIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBrbXBfc2NoX2d1aWRlZF9pdGVyYXRpdmVfY2h1bmtlZDoKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9ndWlkZWRfYW5hbHl0aWNhbF9jaHVua2VkOgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzJ1xuIiwgImd1aWRlZCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBrbXBfc2NoX3RyYXBlem9pZGFsOgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzJ1xuIiwgInRyYXBlem9pZGFsIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfc3RhdGljOgorICAgICAgICAgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19jaHVua2VkOgorICAgICAgICAgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZDoKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfZ3JlZWR5OgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzJ1xuIiwgInN0YXRpYyIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19zdGVhbDoKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcydcbiIsICJzdGF0aWNfc3RlYWwiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9hdXRvOgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzJ1xuIiwgImF1dG8iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30gLy8gX19rbXBfc3RnX3ByaW50X29tcF9zY2hlZHVsZQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfQVRPTUlDX01PREUKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9hdG9taWNfbW9kZSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgLy8gTW9kZXM6IDAgLS0gZG8gbm90IGNoYW5nZSBkZWZhdWx0OyAxIC0tIEludGVsIHBlcmYgbW9kZSwgMiAtLSBHT01QIGNvbXBhdGliaWxpdHkgbW9kZS4KKyAgICBpbnQgbW9kZSA9IDA7CisgICAgaW50IG1heCAgPSAxOworICAgICNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgbWF4ID0gMjsKKyAgICAjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisgICAgX19rbXBfc3RnX3BhcnNlX2ludCggbmFtZSwgdmFsdWUsIDAsIG1heCwgJiBtb2RlICk7CisgICAgLy8gVE9ETzsgcGFyc2VfaW50IGlzIG5vdCB2ZXJ5IHN1aXRhYmxlIGZvciB0aGlzIGNhc2UuIEluIGNhc2Ugb2Ygb3ZlcmZsb3cgaXQgaXMgYmV0dGVyIHRvIHVzZQorICAgIC8vIDAgcmF0aGVyIHRoYXQgbWF4IHZhbHVlLgorICAgIGlmICggbW9kZSA+IDAgKSB7CisgICAgICAgIF9fa21wX2F0b21pY19tb2RlID0gbW9kZTsKKyAgICB9OyAvLyBpZgorfSAvLyBfX2ttcF9zdGdfcGFyc2VfYXRvbWljX21vZGUKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9hdG9taWNfbW9kZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfYXRvbWljX21vZGUgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2F0b21pY19tb2RlCisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0NPTlNJU1RFTkNZX0NIRUNLCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfY29uc2lzdGVuY3lfY2hlY2soIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIGlmICggISBfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoICJhbGwiLCB2YWx1ZSwgMCApICkgeworICAgICAgICAvLyBOb3RlLCB0aGlzIHdpbGwgbm90IHdvcmsgZnJvbSBrbXBfc2V0X2RlZmF1bHRzIGJlY2F1c2UgdGhfY29ucyBzdGFjayB3YXMgbm90IGFsbG9jYXRlZAorICAgICAgICAvLyBmb3IgZXhpc3RlZCB0aHJlYWQocykgdGh1cyB0aGUgZmlyc3QgX19rbXBfcHVzaF88Y29uc3RydWN0PiB3aWxsIGJyZWFrIHdpdGggYXNzZXJ0aW9uLgorICAgICAgICAvLyBUT0RPOiBhbGxvY2F0ZSB0aF9jb25zIGlmIGNhbGxlZCBmcm9tIGttcF9zZXRfZGVmYXVsdHMuCisgICAgICAgIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayA9IFRSVUU7CisgICAgfSBlbHNlIGlmICggISBfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoICJub25lIiwgdmFsdWUsIDAgKSApIHsKKyAgICAgICAgX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrID0gRkFMU0U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIFN0Z0ludmFsaWRWYWx1ZSwgbmFtZSwgdmFsdWUgKTsKKyAgICB9OyAvLyBpZgorfSAvLyBfX2ttcF9zdGdfcGFyc2VfY29uc2lzdGVuY3lfY2hlY2sKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9jb25zaXN0ZW5jeV9jaGVjaygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworI2lmIEtNUF9ERUJVRworICAgIGNvbnN0IGNoYXIgKnZhbHVlID0gTlVMTDsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICB2YWx1ZSA9ICJhbGwiOworICAgIH0gZWxzZSB7CisgICAgICAgIHZhbHVlID0gIm5vbmUiOworICAgIH0KKworICAgIGlmICggdmFsdWUgIT0gTlVMTCApIHsKKyAgICAgICAgX19rbXBfc3RnX3ByaW50X3N0ciggYnVmZmVyLCBuYW1lLCB2YWx1ZSApOworICAgIH0KKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KK30gLy8gX19rbXBfc3RnX3ByaW50X2NvbnNpc3RlbmN5X2NoZWNrCisKKworI2lmIFVTRV9JVFRfQlVJTEQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9JVFRfUFJFUEFSRV9ERUxBWQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgVVNFX0lUVF9OT1RJRlkKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9pdHRfcHJlcGFyZV9kZWxheSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKQoreworICAgIC8vIEV4cGVyaW1lbnRhbCBjb2RlOiBLTVBfSVRUX1BSRVBBUkVfREVMQVkgc3BlY2lmaWVzIG51bWJlcnQgb2YgbG9vcCBpdGVyYXRpb25zLgorICAgIGludCBkZWxheSA9IDA7CisgICAgX19rbXBfc3RnX3BhcnNlX2ludCggbmFtZSwgdmFsdWUsIDAsIElOVF9NQVgsICYgZGVsYXkgKTsKKyAgICBfX2ttcF9pdHRfcHJlcGFyZV9kZWxheSA9IGRlbGF5OworfSAvLyBfX2ttcF9zdHJfcGFyc2VfaXR0X3ByZXBhcmVfZGVsYXkKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9pdHRfcHJlcGFyZV9kZWxheSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF91aW50NjQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfaXR0X3ByZXBhcmVfZGVsYXkgKTsKKworfSAvLyBfX2ttcF9zdHJfcHJpbnRfaXR0X3ByZXBhcmVfZGVsYXkKKworI2VuZGlmIC8vIFVTRV9JVFRfTk9USUZZCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfTUFMTE9DX1BPT0xfSU5DUgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX21hbGxvY19wb29sX2luY3IoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9zaXplKAorICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgIHZhbHVlLAorICAgICAgICAgICAgS01QX01JTl9NQUxMT0NfUE9PTF9JTkNSLAorICAgICAgICAgICAgS01QX01BWF9NQUxMT0NfUE9PTF9JTkNSLAorICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICYgX19rbXBfbWFsbG9jX3Bvb2xfaW5jciwKKyAgICAgICAgICAgIDEKKyAgICAgICAgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX21hbGxvY19wb29sX2luY3IKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9tYWxsb2NfcG9vbF9pbmNyKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgICAgX19rbXBfc3RnX3ByaW50X3NpemUoIGJ1ZmZlciwgbmFtZSwgX19rbXBfbWFsbG9jX3Bvb2xfaW5jciApOworCit9IC8vIF9rbXBfc3RnX3ByaW50X21hbGxvY19wb29sX2luY3IKKworCisjaWZkZWYgS01QX0RFQlVHCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9QQVJfUkFOR0UKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9wYXJfcmFuZ2VfZW52KCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICAgICAgX19rbXBfc3RnX3BhcnNlX3Bhcl9yYW5nZSgKKyAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICB2YWx1ZSwKKyAgICAgICAgICAgICYgX19rbXBfcGFyX3JhbmdlLAorICAgICAgICAgICAgX19rbXBfcGFyX3JhbmdlX3JvdXRpbmUsCisgICAgICAgICAgICBfX2ttcF9wYXJfcmFuZ2VfZmlsZW5hbWUsCisgICAgICAgICAgICAmIF9fa21wX3Bhcl9yYW5nZV9sYiwKKyAgICAgICAgICAgICYgX19rbXBfcGFyX3JhbmdlX3ViCisgICAgICAgICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9wYXJfcmFuZ2VfZW52CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfcGFyX3JhbmdlX2Vudigga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIGlmIChfX2ttcF9wYXJfcmFuZ2UgIT0gMCkgeworICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RyKCBidWZmZXIsIG5hbWUsIHBhcl9yYW5nZV90b19wcmludCApOworICAgIH0KK30gLy8gX19rbXBfc3RnX3ByaW50X3Bhcl9yYW5nZV9lbnYKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX1lJRUxEX0NZQ0xFLCBLTVBfWUlFTERfT04sIEtNUF9ZSUVMRF9PRkYKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV95aWVsZF9jeWNsZSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgaW50IGZsYWcgPSBfX2ttcF95aWVsZF9jeWNsZTsKKyAgICBfX2ttcF9zdGdfcGFyc2VfYm9vbCggbmFtZSwgdmFsdWUsICYgZmxhZyApOworICAgIF9fa21wX3lpZWxkX2N5Y2xlID0gZmxhZzsKK30gLy8gX19rbXBfc3RnX3BhcnNlX3lpZWxkX2N5Y2xlCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfeWllbGRfY3ljbGUoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfYm9vbCggYnVmZmVyLCBuYW1lLCBfX2ttcF95aWVsZF9jeWNsZSApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfeWllbGRfY3ljbGUKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV95aWVsZF9vbiggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgICAgIF9fa21wX3N0Z19wYXJzZV9pbnQoIG5hbWUsIHZhbHVlLCAyLCBJTlRfTUFYLCAmIF9fa21wX3lpZWxkX29uX2NvdW50ICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV95aWVsZF9vbgorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3lpZWxkX29uKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF95aWVsZF9vbl9jb3VudCApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfeWllbGRfb24KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV95aWVsZF9vZmYoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgICAgICBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgMiwgSU5UX01BWCwgJiBfX2ttcF95aWVsZF9vZmZfY291bnQgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX3lpZWxkX29mZgorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3lpZWxkX29mZigga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfeWllbGRfb2ZmX2NvdW50ICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF95aWVsZF9vZmYKKworI2VuZGlmCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9JTklUX1dBSVQsIEtNUF9ORVhUX1dBSVQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9pbml0X3dhaXQoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgaW50IHdhaXQ7CisgICBLTVBfQVNTRVJUKCAoIF9fa21wX2luaXRfd2FpdCAmIDEgKSA9PSAwICk7CisgICB3YWl0ID0gX19rbXBfaW5pdF93YWl0IC8gMjsKKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgS01QX01JTl9JTklUX1dBSVQsIEtNUF9NQVhfSU5JVF9XQUlULCAmIHdhaXQgKTsKKyAgICBfX2ttcF9pbml0X3dhaXQgPSB3YWl0ICogMjsKKyAgICBLTVBfQVNTRVJUKCAoIF9fa21wX2luaXRfd2FpdCAmIDEgKSA9PSAwICk7CisgICAgX19rbXBfeWllbGRfaW5pdCA9IF9fa21wX2luaXRfd2FpdDsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2luaXRfd2FpdAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2luaXRfd2FpdCgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfaW5pdF93YWl0ICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9pbml0X3dhaXQKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9uZXh0X3dhaXQoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIGludCB3YWl0OworICAgIEtNUF9BU1NFUlQoICggX19rbXBfbmV4dF93YWl0ICYgMSApID09IDAgKTsKKyAgICB3YWl0ID0gX19rbXBfbmV4dF93YWl0IC8gMjsKKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgS01QX01JTl9ORVhUX1dBSVQsIEtNUF9NQVhfTkVYVF9XQUlULCAmIHdhaXQgKTsKKyAgICBfX2ttcF9uZXh0X3dhaXQgPSB3YWl0ICogMjsKKyAgICBLTVBfQVNTRVJUKCAoIF9fa21wX25leHRfd2FpdCAmIDEgKSA9PSAwICk7CisgICAgX19rbXBfeWllbGRfbmV4dCA9IF9fa21wX25leHRfd2FpdDsKK30gLy8gX19rbXBfc3RnX3BhcnNlX25leHRfd2FpdAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X25leHRfd2FpdCgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfbmV4dF93YWl0ICk7Cit9IC8vX19rbXBfc3RnX3ByaW50X25leHRfd2FpdAorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9HVElEX01PREUKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9ndGlkX21vZGUoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIC8vCisgICAgLy8gTW9kZXM6CisgICAgLy8gICAwIC0tIGRvIG5vdCBjaGFuZ2UgZGVmYXVsdAorICAgIC8vICAgMSAtLSBzcCBzZWFyY2gKKyAgICAvLyAgIDIgLS0gdXNlICJrZXllZCIgVExTIHZhciwgaS5lLgorICAgIC8vICAgICAgICBwdGhyZWFkX2dldHNwZWNpZmljKExpbnV4KiBPUy9PUyBYKikgb3IgVGxzR2V0VmFsdWUoV2luZG93cyogT1MpCisgICAgLy8gICAzIC0tIF9fZGVjbHNwZWModGhyZWFkKSBUTFMgdmFyIGluIHRkYXRhIHNlY3Rpb24KKyAgICAvLworICAgIGludCBtb2RlID0gMDsKKyAgICBpbnQgbWF4ICA9IDI7CisgICAgI2lmZGVmIEtNUF9UREFUQV9HVElECisgICAgICAgIG1heCA9IDM7CisgICAgI2VuZGlmIC8qIEtNUF9UREFUQV9HVElEICovCisgICAgX19rbXBfc3RnX3BhcnNlX2ludCggbmFtZSwgdmFsdWUsIDAsIG1heCwgJiBtb2RlICk7CisgICAgLy8gVE9ETzsgcGFyc2VfaW50IGlzIG5vdCB2ZXJ5IHN1aXRhYmxlIGZvciB0aGlzIGNhc2UuIEluIGNhc2Ugb2Ygb3ZlcmZsb3cgaXQgaXMgYmV0dGVyIHRvIHVzZQorICAgIC8vIDAgcmF0aGVyIHRoYXQgbWF4IHZhbHVlLgorICAgIGlmICggbW9kZSA9PSAwICkgeworICAgICAgICBfX2ttcF9hZGp1c3RfZ3RpZF9tb2RlID0gVFJVRTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIF9fa21wX2d0aWRfbW9kZSA9IG1vZGU7CisgICAgICAgIF9fa21wX2FkanVzdF9ndGlkX21vZGUgPSBGQUxTRTsKKyAgICB9OyAvLyBpZgorfSAvLyBfX2ttcF9zdHJfcGFyc2VfZ3RpZF9tb2RlCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfZ3RpZF9tb2RlKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgaWYgKCBfX2ttcF9hZGp1c3RfZ3RpZF9tb2RlICkgeworICAgICAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIDAgKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfZ3RpZF9tb2RlICk7CisgICAgfQorfSAvLyBfX2ttcF9zdGdfcHJpbnRfZ3RpZF9tb2RlCisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX05VTV9MT0NLU19JTl9CTE9DSworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2xvY2tfYmxvY2soIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9pbnQoIG5hbWUsIHZhbHVlLCAwLCBLTVBfSU5UX01BWCwgJiBfX2ttcF9udW1fbG9ja3NfaW5fYmxvY2sgKTsKK30gLy8gX19rbXBfc3RyX3BhcnNlX2xvY2tfYmxvY2sKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9sb2NrX2Jsb2NrKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF9udW1fbG9ja3NfaW5fYmxvY2sgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2xvY2tfYmxvY2sKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0xPQ0tfS0lORAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2xvY2tfa2luZCggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgaWYgKCBfX2ttcF9pbml0X3VzZXJfbG9ja3MgKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBFbnZMb2NrV2FybiwgbmFtZSApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJ0YXMiLCAyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJ0ZXN0IGFuZCBzZXQiLCAyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJ0ZXN0X2FuZF9zZXQiLCAyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJ0ZXN0LWFuZC1zZXQiLCAyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJ0ZXN0IGFuZHNldCIsIDIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggInRlc3RfYW5kc2V0IiwgMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAidGVzdC1hbmRzZXQiLCAyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJ0ZXN0YW5kIHNldCIsIDIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggInRlc3RhbmRfc2V0IiwgMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAidGVzdGFuZC1zZXQiLCAyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJ0ZXN0YW5kc2V0IiwgMiwgdmFsdWUgKSApIHsKKyAgICAgICAgX19rbXBfdXNlcl9sb2NrX2tpbmQgPSBsa190YXM7CisgICAgfQorI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0pCisgICAgZWxzZSBpZiAoIF9fa21wX3N0cl9tYXRjaCggImZ1dGV4IiwgMSwgdmFsdWUgKSApIHsKKyAgICAgICAgaWYgKCBfX2ttcF9mdXRleF9kZXRlcm1pbmVfY2FwYWJsZSgpICkgeworICAgICAgICAgICAgX19rbXBfdXNlcl9sb2NrX2tpbmQgPSBsa19mdXRleDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBGdXRleE5vdFN1cHBvcnRlZCwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorICAgIGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJ0aWNrZXQiLCAyLCB2YWx1ZSApICkgeworICAgICAgICBfX2ttcF91c2VyX2xvY2tfa2luZCA9IGxrX3RpY2tldDsKKyAgICB9CisgICAgZWxzZSBpZiAoIF9fa21wX3N0cl9tYXRjaCggInF1ZXVpbmciLCAxLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJxdWV1ZSIsIDEsIHZhbHVlICkgKSB7CisgICAgICAgIF9fa21wX3VzZXJfbG9ja19raW5kID0gbGtfcXVldWluZzsKKyAgICB9CisgICAgZWxzZSBpZiAoIF9fa21wX3N0cl9tYXRjaCggImRyZHBhIHRpY2tldCIsIDEsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImRyZHBhX3RpY2tldCIsIDEsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImRyZHBhLXRpY2tldCIsIDEsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImRyZHBhdGlja2V0IiwgMSwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiZHJkcGEiLCAxLCB2YWx1ZSApICkgeworICAgICAgICBfX2ttcF91c2VyX2xvY2tfa2luZCA9IGxrX2RyZHBhOworICAgIH0KKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisgICAgZWxzZSBpZiAoIF9fa21wX3N0cl9tYXRjaCggImFkYXB0aXZlIiwgMSwgdmFsdWUgKSAgKSB7CisgICAgICAgIGlmKCBfX2ttcF9jcHVpbmZvLnJ0bSApIHsgLy8gPz8/IElzIGNwdWluZm8gYXZhaWxhYmxlIGhlcmU/CisgICAgICAgICAgICBfX2ttcF91c2VyX2xvY2tfa2luZCA9IGxrX2FkYXB0aXZlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFkYXB0aXZlTm90U3VwcG9ydGVkLCBuYW1lLCB2YWx1ZSApOworICAgICAgICAgICAgX19rbXBfdXNlcl9sb2NrX2tpbmQgPSBsa19xdWV1aW5nOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8vIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKyAgICBlbHNlIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIFN0Z0ludmFsaWRWYWx1ZSwgbmFtZSwgdmFsdWUgKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfbG9ja19raW5kKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgY29uc3QgY2hhciAqdmFsdWUgPSBOVUxMOworCisgICAgc3dpdGNoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgKSB7CisgICAgICAgIGNhc2UgbGtfZGVmYXVsdDoKKyAgICAgICAgdmFsdWUgPSAiZGVmYXVsdCI7CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgbGtfdGFzOgorICAgICAgICB2YWx1ZSA9ICJ0YXMiOworICAgICAgICBicmVhazsKKworI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCkKKyAgICAgICAgY2FzZSBsa19mdXRleDoKKyAgICAgICAgdmFsdWUgPSAiZnV0ZXgiOworICAgICAgICBicmVhazsKKyNlbmRpZgorCisgICAgICAgIGNhc2UgbGtfdGlja2V0OgorICAgICAgICB2YWx1ZSA9ICJ0aWNrZXQiOworICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGxrX3F1ZXVpbmc6CisgICAgICAgIHZhbHVlID0gInF1ZXVpbmciOworICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGxrX2RyZHBhOgorICAgICAgICB2YWx1ZSA9ICJkcmRwYSI7CisgICAgICAgIGJyZWFrOworI2lmIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKyAgICAgICAgY2FzZSBsa19hZGFwdGl2ZToKKyAgICAgICAgdmFsdWUgPSAiYWRhcHRpdmUiOworICAgICAgICBicmVhazsKKyNlbmRpZgorICAgIH0KKworICAgIGlmICggdmFsdWUgIT0gTlVMTCApIHsKKyAgICAgICAgX19rbXBfc3RnX3ByaW50X3N0ciggYnVmZmVyLCBuYW1lLCB2YWx1ZSApOworICAgIH0KK30KKworI2lmIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0FEQVBUSVZFX0xPQ0tfUFJPUFMsIEtNUF9TUEVDVUxBVElWRV9TVEFUU0ZJTEUKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gUGFyc2Ugb3V0IHZhbHVlcyBmb3IgdGhlIHR1bmFibGUgcGFyYW1ldGVycyBmcm9tIGEgc3RyaW5nIG9mIHRoZSBmb3JtCisvLyBLTVBfQURBUFRJVkVfTE9DS19QUk9QUz1tYXhfc29mdF9yZXRyaWVzWyxtYXhfYmFkbmVzc10KK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfYWRhcHRpdmVfbG9ja19wcm9wcyggY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUsIHZvaWQgKmRhdGEgKQoreworICAgIGludCBtYXhfcmV0cmllcyA9IDA7CisgICAgaW50IG1heF9iYWRuZXNzID0gMDsKKworICAgIGNvbnN0IGNoYXIgKm5leHQgPSB2YWx1ZTsKKyAgICBjb25zdCBjaGFyICpzY2FuID0gbmV4dDsKKworICAgIGludCB0b3RhbCA9IDA7ICAgICAgICAgIC8vIENvdW50IGVsZW1lbnRzIHRoYXQgd2VyZSBzZXQuIEl0J2xsIGJlIHVzZWQgYXMgYW4gYXJyYXkgc2l6ZQorICAgIGludCBwcmV2X2NvbW1hID0gRkFMU0U7IC8vIEZvciBjb3JyZWN0IHByb2Nlc3Npbmcgc2VxdWVudGlhbCBjb21tYXMKKyAgICBpbnQgaTsKKworICAgIC8vIFNhdmUgdmFsdWVzIGluIHRoZSBzdHJ1Y3R1cmUgX19rbXBfc3BlY3VsYXRpdmVfYmFja29mZl9wYXJhbXMKKyAgICAvLyBSdW4gb25seSAzIGl0ZXJhdGlvbnMgYmVjYXVzZSBpdCBpcyBlbm91Z2ggdG8gcmVhZCB0d28gdmFsdWVzIG9yIGZpbmQgYSBzeW50YXggZXJyb3IKKyAgICBmb3IgKCBpID0gMDsgaSA8IDMgOyBpKyspIHsKKyAgICAgICAgU0tJUF9XUyggbmV4dCApOworCisgICAgICAgIGlmICggKm5leHQgPT0gJ1wwJyApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8vIE5leHQgY2hhcmFjdGVyIGlzIG5vdCBhbiBpbnRlZ2VyIG9yIG5vdCBhIGNvbW1hIE9SIG51bWJlciBvZiB2YWx1ZXMgPiAyID0+IGVuZCBvZiBsaXN0CisgICAgICAgIGlmICggKCAoICpuZXh0IDwgJzAnICkgfHwgKCAqbmV4dCA+ICc5JyApICkgJiYgKCAqbmV4dCAhPScsJykgfHwgKCB0b3RhbCA+IDIgKSApIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBFbnZTeW50YXhFcnJvciwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBUaGUgbmV4dCBjaGFyYWN0ZXIgaXMgJywnCisgICAgICAgIGlmICggKm5leHQgPT0gJywnICkgeworICAgICAgICAgICAgLy8gJywnIGlzIHRoZSBmaXNydCBjaGFyYWN0ZXIKKyAgICAgICAgICAgIGlmICggdG90YWwgPT0gMCB8fCBwcmV2X2NvbW1hICkgeworICAgICAgICAgICAgICAgIHRvdGFsKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmV2X2NvbW1hID0gVFJVRTsKKyAgICAgICAgICAgIG5leHQrKzsgLy9za2lwICcsJworICAgICAgICAgICAgU0tJUF9XUyggbmV4dCApOworICAgICAgICB9CisgICAgICAgIC8vIE5leHQgY2hhcmFjdGVyIGlzIGEgZGlnaXQKKyAgICAgICAgaWYgKCAqbmV4dCA+PSAnMCcgJiYgKm5leHQgPD0gJzknICkgeworICAgICAgICAgICAgaW50IG51bTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJ1ZiA9IG5leHQ7CisgICAgICAgICAgICBjaGFyIGNvbnN0ICogbXNnICA9IE5VTEw7CisgICAgICAgICAgICBwcmV2X2NvbW1hID0gRkFMU0U7CisgICAgICAgICAgICBTS0lQX0RJR0lUUyggbmV4dCApOworICAgICAgICAgICAgdG90YWwrKzsKKworICAgICAgICAgICAgY29uc3QgY2hhciAqdG1wID0gbmV4dDsKKyAgICAgICAgICAgIFNLSVBfV1MoIHRtcCApOworICAgICAgICAgICAgaWYgKCAoICpuZXh0ID09ICcgJyB8fCAqbmV4dCA9PSAnXHQnICkgJiYgKCAqdG1wID49ICcwJyAmJiAqdG1wIDw9ICc5JyApICkgeworICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBFbnZTcGFjZXNOb3RBbGxvd2VkLCBuYW1lLCB2YWx1ZSApOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbnVtID0gX19rbXBfc3RyX3RvX2ludCggYnVmLCAqbmV4dCApOworICAgICAgICAgICAgaWYgKCBudW0gPCAxICkgeyAvLyBUaGUgbnVtYmVyIG9mIHJldHJpZXMgc2hvdWxkIGJlID4gMAorICAgICAgICAgICAgICAgIG1zZyA9IEtNUF9JMThOX1NUUiggVmFsdWVUb29TbWFsbCApOworICAgICAgICAgICAgICAgIG51bSA9IDE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCBudW0gPiBLTVBfSU5UX01BWCApIHsKKyAgICAgICAgICAgICAgICBtc2cgPSBLTVBfSTE4Tl9TVFIoIFZhbHVlVG9vTGFyZ2UgKTsKKyAgICAgICAgICAgICAgICBudW0gPSBLTVBfSU5UX01BWDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggbXNnICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgLy8gTWVzc2FnZSBpcyBub3QgZW1wdHkuIFByaW50IHdhcm5pbmcuCisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIFBhcnNlU2l6ZUludFdhcm4sIG5hbWUsIHZhbHVlLCBtc2cgKTsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKCBVc2luZ19pbnRfVmFsdWUsIG5hbWUsIG51bSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIHRvdGFsID09IDEgKSB7CisgICAgICAgICAgICAgICAgbWF4X3JldHJpZXMgPSBudW07CisgICAgICAgICAgICB9IGVsc2UgaWYoIHRvdGFsID09IDIgKSB7CisgICAgICAgICAgICAgICAgbWF4X2JhZG5lc3MgPSBudW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVCggdG90YWwgPiAwICk7CisgICAgaWYoIHRvdGFsIDw9IDAgKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBFbnZTeW50YXhFcnJvciwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiggbWF4X3JldHJpZXMgIT0gMCApIHsKKyAgICAgICAgX19rbXBfYWRhcHRpdmVfYmFja29mZl9wYXJhbXMubWF4X3NvZnRfcmV0cmllcyA9IG1heF9yZXRyaWVzOworICAgIH0KKyAgICBpZiggbWF4X2JhZG5lc3MgIT0gMCApIHsKKyAgICAgICAgX19rbXBfYWRhcHRpdmVfYmFja29mZl9wYXJhbXMubWF4X2JhZG5lc3MgPSBtYXhfYmFkbmVzczsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9hZGFwdGl2ZV9sb2NrX3Byb3BzKGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApCit7CisgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgKSB7CisgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUVfRVgobmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXM9JyIsIG5hbWUgKTsKKyAgICB9CisgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJWQsJWQnXG4iLCBfX2ttcF9hZGFwdGl2ZV9iYWNrb2ZmX3BhcmFtcy5tYXhfc29mdF9yZXRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FkYXB0aXZlX2JhY2tvZmZfcGFyYW1zLm1heF9iYWRuZXNzICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9hZGFwdGl2ZV9sb2NrX3Byb3BzCisKKyNpZiBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1MKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9zcGVjdWxhdGl2ZV9zdGF0c2ZpbGUoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9maWxlKCBuYW1lLCB2YWx1ZSwgIiIsICYgX19rbXBfc3BlY3VsYXRpdmVfc3RhdHNmaWxlICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9zcGVjdWxhdGl2ZV9zdGF0c2ZpbGUKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9zcGVjdWxhdGl2ZV9zdGF0c2ZpbGUoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBpZiAoIF9fa21wX3N0cl9tYXRjaCggIi0iLCAwLCBfX2ttcF9zcGVjdWxhdGl2ZV9zdGF0c2ZpbGUgKSAgKSB7CisgICAgICAgIF9fa21wX3N0Z19wcmludF9zdHIoIGJ1ZmZlciwgbmFtZSwgInN0ZG91dCIgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RyKCBidWZmZXIsIG5hbWUsIF9fa21wX3NwZWN1bGF0aXZlX3N0YXRzZmlsZSApOworICAgIH0KKworfSAvLyBfX2ttcF9zdGdfcHJpbnRfc3BlY3VsYXRpdmVfc3RhdHNmaWxlCisKKyNlbmRpZiAvLyBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1MKKworI2VuZGlmIC8vIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKworI2lmIEtNUF9NSUMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9QTEFDRV9USFJFQURTCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfcGxhY2VfdGhyZWFkcyggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgLy8gVmFsdWUgZXhhbXBsZTogNUN4MlR4MTVPCisgICAgLy8gV2hpY2ggbWVhbnMgInVzZSA1IGNvcmVzIHdpdGggb2Zmc2V0IDE1LCAyIHRocmVhZHMgcGVyIGNvcmUiCisKKyAgICBpbnQgICAgICAgICBudW07CisgICAgaW50ICAgICAgICAgcHJldl9kZWxpbSA9IDA7CisgICAgY29uc3QgY2hhciAqbmV4dCA9IHZhbHVlOworICAgIGNvbnN0IGNoYXIgKnByZXY7CisKKyAgICBTS0lQX1dTKCBuZXh0ICk7CisgICAgaWYgKCAqbmV4dCA9PSAnXDAnICkgeworICAgICAgICByZXR1cm47ICAgLy8gbGVhdmUgZGVmYXVsdCB2YWx1ZXMKKyAgICB9CisKKyAgICAvLyBHZXQgbnVtX2NvcmVzIGZpcnN0CisgICAgaWYgKCAqbmV4dCA+PSAnMCcgJiYgKm5leHQgPD0gJzknICkgeworICAgICAgICBwcmV2ID0gbmV4dDsKKyAgICAgICAgU0tJUF9ESUdJVFMoIG5leHQgKTsKKyAgICAgICAgbnVtID0gX19rbXBfc3RyX3RvX2ludCggcHJldiwgKm5leHQgKTsKKyAgICAgICAgU0tJUF9XUyggbmV4dCApOworICAgICAgICBpZiAoICpuZXh0ID09ICdDJyB8fCAqbmV4dCA9PSAnYycgKSB7CisgICAgICAgICAgICBfX2ttcF9wbGFjZV9udW1fY29yZXMgPSBudW07CisgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgIH0gZWxzZSBpZiAoICpuZXh0ID09ICcsJyB8fCAqbmV4dCA9PSAneCcgKSB7CisgICAgICAgICAgICBfX2ttcF9wbGFjZV9udW1fY29yZXMgPSBudW07CisgICAgICAgICAgICBwcmV2X2RlbGltID0gMTsKKyAgICAgICAgICAgIG5leHQrKzsKKyAgICAgICAgfSBlbHNlIGlmICggKm5leHQgPT0gJ1QnIHx8ICpuZXh0ID09ICd0JyApIHsKKyAgICAgICAgICAgIF9fa21wX3BsYWNlX251bV90aHJlYWRzX3Blcl9jb3JlID0gbnVtOworICAgICAgICAgICAgcmV0dXJuOyAgIC8vIHdlIGlnbm9yZSBvZmZzZXQgdmFsdWUgaW4gY2FzZSBhbGwgY29yZXMgYXJlIHVzZWQKKyAgICAgICAgfSBlbHNlIGlmICggKm5leHQgPT0gJ1wwJyApIHsKKyAgICAgICAgICAgIF9fa21wX3BsYWNlX251bV9jb3JlcyA9IG51bTsKKyAgICAgICAgICAgIHJldHVybjsgICAvLyB0aGUgb25seSB2YWx1ZSBwcm92aWRlZAorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZlRoclBsYWNlSW52YWxpZCwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoICpuZXh0ID09ICcsJyB8fCAqbmV4dCA9PSAneCcgKSB7CisgICAgICAgIC8vIEZpcnN0IGNoYXJhY3RlciBpcyBkZWxpbWl0ZXIsIHNraXAgaXQsIGxlYXZlIG51bV9jb3JlcyBkZWZhdWx0IHZhbHVlCisgICAgICAgIHByZXZfZGVsaW0gPSAyOworICAgICAgICBuZXh0Kys7CisgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIEFmZlRoclBsYWNlSW52YWxpZCwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBTS0lQX1dTKCBuZXh0ICk7CisgICAgaWYgKCAqbmV4dCA9PSAnXDAnICkgeworICAgICAgICByZXR1cm47ICAgLy8gIiBuICAiIC0gc29tZXRoaW5nIGxpa2UgdGhpcworICAgIH0KKyAgICBpZiAoICggKm5leHQgPT0gJywnIHx8ICpuZXh0ID09ICd4JyApICYmICFwcmV2X2RlbGltICkgeworICAgICAgICBwcmV2X2RlbGltID0gMTsKKyAgICAgICAgbmV4dCsrOyAgIC8vIHNraXAgZGVsaW1pdGVyIGFmdGVyIG51bV9jb3JlIHZhbHVlCisgICAgICAgIFNLSVBfV1MoIG5leHQgKTsKKyAgICB9CisKKyAgICAvLyBHZXQgdGhyZWFkc19wZXJfY29yZSBuZXh0CisgICAgaWYgKCAqbmV4dCA+PSAnMCcgJiYgKm5leHQgPD0gJzknICkgeworICAgICAgICBwcmV2X2RlbGltID0gMDsKKyAgICAgICAgcHJldiA9IG5leHQ7CisgICAgICAgIFNLSVBfRElHSVRTKCBuZXh0ICk7CisgICAgICAgIG51bSA9IF9fa21wX3N0cl90b19pbnQoIHByZXYsICpuZXh0ICk7CisgICAgICAgIFNLSVBfV1MoIG5leHQgKTsKKyAgICAgICAgaWYgKCAqbmV4dCA9PSAnVCcgfHwgKm5leHQgPT0gJ3QnICkgeworICAgICAgICAgICAgX19rbXBfcGxhY2VfbnVtX3RocmVhZHNfcGVyX2NvcmUgPSBudW07CisgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgIH0gZWxzZSBpZiAoICpuZXh0ID09ICcsJyB8fCAqbmV4dCA9PSAneCcgKSB7CisgICAgICAgICAgICBfX2ttcF9wbGFjZV9udW1fdGhyZWFkc19wZXJfY29yZSA9IG51bTsKKyAgICAgICAgICAgIHByZXZfZGVsaW0gPSAxOworICAgICAgICAgICAgbmV4dCsrOworICAgICAgICB9IGVsc2UgaWYgKCAqbmV4dCA9PSAnTycgfHwgKm5leHQgPT0gJ28nICkgeworICAgICAgICAgICAgX19rbXBfcGxhY2VfY29yZV9vZmZzZXQgPSBudW07CisgICAgICAgICAgICByZXR1cm47ICAgLy8gdGhyZWFkc19wZXJfY29yZSByZW1haW5zIGRlZmF1bHQKKyAgICAgICAgfSBlbHNlIGlmICggKm5leHQgPT0gJ1wwJyApIHsKKyAgICAgICAgICAgIF9fa21wX3BsYWNlX251bV90aHJlYWRzX3Blcl9jb3JlID0gbnVtOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZlRoclBsYWNlSW52YWxpZCwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoICpuZXh0ID09ICcsJyB8fCAqbmV4dCA9PSAneCcgKSB7CisgICAgICAgIGlmICggcHJldl9kZWxpbSA9PSAyICkgeworICAgICAgICAgICAgcmV0dXJuOyAvLyBubyBzZW5zZSBpbiB0aGUgb25seSBvZmZzZXQgdmFsdWUsIHRodXMgc2tpcCB0aGUgcmVzdAorICAgICAgICB9CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHByZXZfZGVsaW0gPT0gMSApOworICAgICAgICBuZXh0Kys7ICAgICAvLyBubyB2YWx1ZSBmb3IgdGhyZWFkc19wZXJfY29yZSBwcm92aWRlZAorICAgIH0gZWxzZSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZUaHJQbGFjZUludmFsaWQsIG5hbWUsIHZhbHVlICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgU0tJUF9XUyggbmV4dCApOworICAgIGlmICggKm5leHQgPT0gJ1wwJyApIHsKKyAgICAgICAgcmV0dXJuOyAgIC8vICIgbkMsbVQgICIgLSBzb21ldGhpbmcgbGlrZSB0aGlzCisgICAgfQorICAgIGlmICggKCAqbmV4dCA9PSAnLCcgfHwgKm5leHQgPT0gJ3gnICkgJiYgIXByZXZfZGVsaW0gKSB7CisgICAgICAgIHByZXZfZGVsaW0gPSAxOworICAgICAgICBuZXh0Kys7ICAgLy8gc2tpcCBkZWxpbWl0ZXIgYWZ0ZXIgdGhyZWFkc19wZXJfY29yZSB2YWx1ZQorICAgICAgICBTS0lQX1dTKCBuZXh0ICk7CisgICAgfQorCisgICAgLy8gR2V0IGNvcmUgb2Zmc2V0IGxhc3QgaWYgYW55LAorICAgIC8vIGRvbid0IGJvdGhlciBjaGVja2luZyBzeW50YXggYWZ0ZXIgYWxsIGRhdGEgb2J0YWluZWQKKyAgICBpZiAoICpuZXh0ID49ICcwJyAmJiAqbmV4dCA8PSAnOScgKSB7CisgICAgICAgIHByZXYgPSBuZXh0OworICAgICAgICBTS0lQX0RJR0lUUyggbmV4dCApOworICAgICAgICBudW0gPSBfX2ttcF9zdHJfdG9faW50KCBwcmV2LCAqbmV4dCApOworICAgICAgICBfX2ttcF9wbGFjZV9jb3JlX29mZnNldCA9IG51bTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfcGxhY2VfdGhyZWFkcygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIGlmICggX19rbXBfcGxhY2VfbnVtX2NvcmVzICsgX19rbXBfcGxhY2VfbnVtX3RocmVhZHNfcGVyX2NvcmUgKSB7CisgICAgICAgIGttcF9zdHJfYnVmX3QgYnVmOworICAgICAgICBfX2ttcF9zdHJfYnVmX2luaXQoICZidWYgKTsKKyAgICAgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgKSB7CisgICAgICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9OQU1FX0VYKG5hbWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXM9JyIsIG5hbWUgKTsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmYnVmLCAiJWRDIiwgX19rbXBfcGxhY2VfbnVtX2NvcmVzICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICZidWYsICJ4JWRUIiwgX19rbXBfcGxhY2VfbnVtX3RocmVhZHNfcGVyX2NvcmUgKTsKKyAgICAgICAgaWYgKCBfX2ttcF9wbGFjZV9jb3JlX29mZnNldCApIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICZidWYsICIsJWRPIiwgX19rbXBfcGxhY2VfY29yZV9vZmZzZXQgKTsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KGJ1ZmZlciwgIiVzJ1xuIiwgYnVmLnN0ciApOworICAgICAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoJmJ1Zik7CisvKgorICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzOiAlcyBcbiIsIG5hbWUsIEtNUF9JMThOX1NUUiggTm90RGVmaW5lZCApICk7CisqLworICAgIH0KK30KKyNlbmRpZgorCisjaWYgVVNFX0lUVF9CVUlMRAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0ZPUktKT0lOX0ZSQU1FUworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2Zvcmtqb2luX2ZyYW1lcyggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIF9fa21wX2Zvcmtqb2luX2ZyYW1lcyApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfZm9ya2pvaW5fZnJhbWVzCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfZm9ya2pvaW5fZnJhbWVzKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2Jvb2woIGJ1ZmZlciwgbmFtZSwgX19rbXBfZm9ya2pvaW5fZnJhbWVzICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9mb3Jram9pbl9mcmFtZXMKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0ZPUktKT0lOX0ZSQU1FU19NT0RFCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfZm9ya2pvaW5fZnJhbWVzX21vZGUoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9pbnQoIG5hbWUsIHZhbHVlLCAwLCAzLCAmIF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9mb3Jram9pbl9mcmFtZXMKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9mb3Jram9pbl9mcmFtZXNfbW9kZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2Zvcmtqb2luX2ZyYW1lcworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT01QX0RJU1BMQVlfRU5WCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX29tcF9kaXNwbGF5X2VudiggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKQoreworICAgIGlmICggX19rbXBfc3RyX21hdGNoKCAiVkVSQk9TRSIsIDEsIHZhbHVlICkgKQorICAgIHsKKyAgICAgICAgX19rbXBfZGlzcGxheV9lbnZfdmVyYm9zZSA9IFRSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIF9fa21wX2Rpc3BsYXlfZW52ICk7CisgICAgfQorCit9IC8vIF9fa21wX3N0Z19wYXJzZV9vbXBfZGlzcGxheV9lbnYKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9vbXBfZGlzcGxheV9lbnYoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApCit7CisgICAgaWYgKCBfX2ttcF9kaXNwbGF5X2Vudl92ZXJib3NlICkKKyAgICB7CisgICAgICAgIF9fa21wX3N0Z19wcmludF9zdHIoIGJ1ZmZlciwgbmFtZSwgIlZFUkJPU0UiICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RnX3ByaW50X2Jvb2woIGJ1ZmZlciwgbmFtZSwgX19rbXBfZGlzcGxheV9lbnYgKTsKKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wcmludF9vbXBfZGlzcGxheV9lbnYKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9vbXBfY2FuY2VsbGF0aW9uKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfYm9vbCggbmFtZSwgdmFsdWUsICYgX19rbXBfb21wX2NhbmNlbGxhdGlvbiApOworfSAvLyBfX2ttcF9zdGdfcGFyc2Vfb21wX2NhbmNlbGxhdGlvbgorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X29tcF9jYW5jZWxsYXRpb24oIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfYm9vbCggYnVmZmVyLCBuYW1lLCBfX2ttcF9vbXBfY2FuY2VsbGF0aW9uICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9vbXBfY2FuY2VsbGF0aW9uCisKKyNlbmRpZgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUYWJsZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitzdGF0aWMga21wX3NldHRpbmdfdCBfX2ttcF9zdGdfdGFibGVbXSA9IHsKKworICAgIHsgIktNUF9BTExfVEhSRUFEUyIsICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9hbGxfdGhyZWFkcywgICAgICAgIF9fa21wX3N0Z19wcmludF9hbGxfdGhyZWFkcywgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfQkxPQ0tUSU1FIiwgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfYmxvY2t0aW1lLCAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfYmxvY2t0aW1lLCAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0RVUExJQ0FURV9MSUJfT0siLCAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2R1cGxpY2F0ZV9saWJfb2ssICAgX19rbXBfc3RnX3ByaW50X2R1cGxpY2F0ZV9saWJfb2ssICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9MSUJSQVJZIiwgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV93YWl0X3BvbGljeSwgICAgICAgIF9fa21wX3N0Z19wcmludF93YWl0X3BvbGljeSwgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfTUFYX1RIUkVBRFMiLCAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfYWxsX3RocmVhZHMsICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCAwIH0sIC8vIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CisgICAgeyAiS01QX01PTklUT1JfU1RBQ0tTSVpFIiwgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX21vbml0b3Jfc3RhY2tzaXplLCAgX19rbXBfc3RnX3ByaW50X21vbml0b3Jfc3RhY2tzaXplLCAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9TRVRUSU5HUyIsICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9zZXR0aW5ncywgICAgICAgICAgIF9fa21wX3N0Z19wcmludF9zZXR0aW5ncywgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfU1RBQ0tPRkZTRVQiLCAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2Vfc3RhY2tvZmZzZXQsICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RhY2tvZmZzZXQsICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX1NUQUNLU0laRSIsICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3N0YWNrc2l6ZSwgICAgICAgICAgX19rbXBfc3RnX3ByaW50X3N0YWNrc2l6ZSwgICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9WRVJTSU9OIiwgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV92ZXJzaW9uLCAgICAgICAgICAgIF9fa21wX3N0Z19wcmludF92ZXJzaW9uLCAgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfV0FSTklOR1MiLCAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2Vfd2FybmluZ3MsICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfd2FybmluZ3MsICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisKKyAgICB7ICJPTVBfTkVTVEVEIiwgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfbmVzdGVkLCAgICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfbmVzdGVkLCAgICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiT01QX05VTV9USFJFQURTIiwgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX251bV90aHJlYWRzLCAgICAgICAgX19rbXBfc3RnX3ByaW50X251bV90aHJlYWRzLCAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIk9NUF9TVEFDS1NJWkUiLCAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9zdGFja3NpemUsICAgICAgICAgIF9fa21wX3N0Z19wcmludF9zdGFja3NpemUsICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKworI2lmIE9NUF8zMF9FTkFCTEVECisgICAgeyAiS01QX1RBU0tJTkciLCAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3Rhc2tpbmcsICAgICAgICAgICAgX19rbXBfc3RnX3ByaW50X3Rhc2tpbmcsICAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9UQVNLX1NURUFMSU5HX0NPTlNUUkFJTlQiLCAgICAgIF9fa21wX3N0Z19wYXJzZV90YXNrX3N0ZWFsaW5nLCAgICAgIF9fa21wX3N0Z19wcmludF90YXNrX3N0ZWFsaW5nLCAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJPTVBfTUFYX0FDVElWRV9MRVZFTFMiLCAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfbWF4X2FjdGl2ZV9sZXZlbHMsICBfX2ttcF9zdGdfcHJpbnRfbWF4X2FjdGl2ZV9sZXZlbHMsICBOVUxMLCAwLCAwIH0sCisgICAgeyAiT01QX1RIUkVBRF9MSU1JVCIsICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2FsbF90aHJlYWRzLCAgICAgICAgX19rbXBfc3RnX3ByaW50X2FsbF90aHJlYWRzLCAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIk9NUF9XQUlUX1BPTElDWSIsICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV93YWl0X3BvbGljeSwgICAgICAgIF9fa21wX3N0Z19wcmludF93YWl0X3BvbGljeSwgICAgICAgIE5VTEwsIDAsIDAgfSwKKyNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorCisjaWYgS01QX0hBTkRMRV9TSUdOQUxTCisgICAgeyAiS01QX0hBTkRMRV9TSUdOQUxTIiwgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2hhbmRsZV9zaWduYWxzLCAgICAgX19rbXBfc3RnX3ByaW50X2hhbmRsZV9zaWduYWxzLCAgICAgTlVMTCwgMCwgMCB9LAorI2VuZGlmCisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisgICAgeyAiS01QX0lOSEVSSVRfRlBfQ09OVFJPTCIsICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2luaGVyaXRfZnBfY29udHJvbCwgX19rbXBfc3RnX3ByaW50X2luaGVyaXRfZnBfY29udHJvbCwgTlVMTCwgMCwgMCB9LAorI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgIHsgIkdPTVBfU1RBQ0tTSVpFIiwgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9zdGFja3NpemUsICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyNlbmRpZgorCisjaWZkZWYgS01QX0RFQlVHCisgICAgeyAiS01QX0FfREVCVUciLCAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2FfZGVidWcsICAgICAgICAgICAgX19rbXBfc3RnX3ByaW50X2FfZGVidWcsICAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9CX0RFQlVHIiwgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9iX2RlYnVnLCAgICAgICAgICAgIF9fa21wX3N0Z19wcmludF9iX2RlYnVnLCAgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfQ19ERUJVRyIsICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfY19kZWJ1ZywgICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfY19kZWJ1ZywgICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0RfREVCVUciLCAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2RfZGVidWcsICAgICAgICAgICAgX19rbXBfc3RnX3ByaW50X2RfZGVidWcsICAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9FX0RFQlVHIiwgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9lX2RlYnVnLCAgICAgICAgICAgIF9fa21wX3N0Z19wcmludF9lX2RlYnVnLCAgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfRl9ERUJVRyIsICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfZl9kZWJ1ZywgICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfZl9kZWJ1ZywgICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0RFQlVHIiwgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2RlYnVnLCAgICAgICAgICAgICAgTlVMTCwgLyogbm8gcHJpbnQgKi8gICAgICAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9ERUJVR19CVUYiLCAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9kZWJ1Z19idWYsICAgICAgICAgIF9fa21wX3N0Z19wcmludF9kZWJ1Z19idWYsICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfREVCVUdfQlVGX0FUT01JQyIsICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfZGVidWdfYnVmX2F0b21pYywgICBfX2ttcF9zdGdfcHJpbnRfZGVidWdfYnVmX2F0b21pYywgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0RFQlVHX0JVRl9DSEFSUyIsICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2RlYnVnX2J1Zl9jaGFycywgICAgX19rbXBfc3RnX3ByaW50X2RlYnVnX2J1Zl9jaGFycywgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9ERUJVR19CVUZfTElORVMiLCAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9kZWJ1Z19idWZfbGluZXMsICAgIF9fa21wX3N0Z19wcmludF9kZWJ1Z19idWZfbGluZXMsICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfRElBRyIsICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfZGlhZywgICAgICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfZGlhZywgICAgICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisKKyAgICB7ICJLTVBfUEFSX1JBTkdFIiwgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfcGFyX3JhbmdlX2VudiwgICAgICBfX2ttcF9zdGdfcHJpbnRfcGFyX3JhbmdlX2VudiwgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX1lJRUxEX0NZQ0xFIiwgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3lpZWxkX2N5Y2xlLCAgICAgICAgX19rbXBfc3RnX3ByaW50X3lpZWxkX2N5Y2xlLCAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9ZSUVMRF9PTiIsICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV95aWVsZF9vbiwgICAgICAgICAgIF9fa21wX3N0Z19wcmludF95aWVsZF9vbiwgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfWUlFTERfT0ZGIiwgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfeWllbGRfb2ZmLCAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfeWllbGRfb2ZmLCAgICAgICAgICBOVUxMLCAwLCAwIH0sCisjZW5kaWYgLy8gS01QX0RFQlVHCisKKyAgICB7ICJLTVBfQUxJR05fQUxMT0MiLCAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfYWxpZ25fYWxsb2MsICAgICAgICBfX2ttcF9zdGdfcHJpbnRfYWxpZ25fYWxsb2MsICAgICAgICBOVUxMLCAwLCAwIH0sCisKKyAgICB7ICJLTVBfUExBSU5fQkFSUklFUiIsICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfYmFycmllcl9icmFuY2hfYml0LCBfX2ttcF9zdGdfcHJpbnRfYmFycmllcl9icmFuY2hfYml0LCBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX1BMQUlOX0JBUlJJRVJfUEFUVEVSTiIsICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2JhcnJpZXJfcGF0dGVybiwgICAgX19rbXBfc3RnX3ByaW50X2JhcnJpZXJfcGF0dGVybiwgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9GT1JLSk9JTl9CQVJSSUVSIiwgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9iYXJyaWVyX2JyYW5jaF9iaXQsIF9fa21wX3N0Z19wcmludF9iYXJyaWVyX2JyYW5jaF9iaXQsIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfRk9SS0pPSU5fQkFSUklFUl9QQVRURVJOIiwgICAgICBfX2ttcF9zdGdfcGFyc2VfYmFycmllcl9wYXR0ZXJuLCAgICBfX2ttcF9zdGdfcHJpbnRfYmFycmllcl9wYXR0ZXJuLCAgICBOVUxMLCAwLCAwIH0sCisjaWYgS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICB7ICJLTVBfUkVEVUNUSU9OX0JBUlJJRVIiLCAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfYmFycmllcl9icmFuY2hfYml0LCBfX2ttcF9zdGdfcHJpbnRfYmFycmllcl9icmFuY2hfYml0LCBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX1JFRFVDVElPTl9CQVJSSUVSX1BBVFRFUk4iLCAgICAgX19rbXBfc3RnX3BhcnNlX2JhcnJpZXJfcGF0dGVybiwgICAgX19rbXBfc3RnX3ByaW50X2JhcnJpZXJfcGF0dGVybiwgICAgTlVMTCwgMCwgMCB9LAorI2VuZGlmCisKKyAgICB7ICJLTVBfQUJPUlRfREVMQVkiLCAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfYWJvcnRfZGVsYXksICAgICAgICBfX2ttcF9zdGdfcHJpbnRfYWJvcnRfZGVsYXksICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0NQVUlORk9fRklMRSIsICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2NwdWluZm9fZmlsZSwgICAgICAgX19rbXBfc3RnX3ByaW50X2NwdWluZm9fZmlsZSwgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9GT1JDRV9SRURVQ1RJT04iLCAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9mb3JjZV9yZWR1Y3Rpb24sICAgIF9fa21wX3N0Z19wcmludF9mb3JjZV9yZWR1Y3Rpb24sICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfREVURVJNSU5JU1RJQ19SRURVQ1RJT04iLCAgICAgICBfX2ttcF9zdGdfcGFyc2VfZm9yY2VfcmVkdWN0aW9uLCAgICBfX2ttcF9zdGdfcHJpbnRfZm9yY2VfcmVkdWN0aW9uLCAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX1NUT1JBR0VfTUFQIiwgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3N0b3JhZ2VfbWFwLCAgICAgICAgX19rbXBfc3RnX3ByaW50X3N0b3JhZ2VfbWFwLCAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9BTExfVEhSRUFEUFJJVkFURSIsICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9hbGxfdGhyZWFkcHJpdmF0ZSwgIF9fa21wX3N0Z19wcmludF9hbGxfdGhyZWFkcHJpdmF0ZSwgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfRk9SRUlHTl9USFJFQURTX1RIUkVBRFBSSVZBVEUiLCBfX2ttcF9zdGdfcGFyc2VfZm9yZWlnbl90aHJlYWRzX3RocmVhZHByaXZhdGUsIF9fa21wX3N0Z19wcmludF9mb3JlaWduX3RocmVhZHNfdGhyZWFkcHJpdmF0ZSwgICAgIE5VTEwsIDAsIDAgfSwKKworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICB7ICJLTVBfQUZGSU5JVFkiLCAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfYWZmaW5pdHksICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfYWZmaW5pdHksICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisjIGlmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgIHsgIkdPTVBfQ1BVX0FGRklOSVRZIiwgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9nb21wX2NwdV9hZmZpbml0eSwgIE5VTEwsIC8qIG5vIHByaW50ICovICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyMgZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisjIGlmIE9NUF8zMF9FTkFCTEVECisjICBpZiBPTVBfNDBfRU5BQkxFRAorICAgIHsgIk9NUF9QUk9DX0JJTkQiLCAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9wcm9jX2JpbmQsICAgICAgICAgIF9fa21wX3N0Z19wcmludF9wcm9jX2JpbmQsICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJPTVBfUExBQ0VTIiwgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfcGxhY2VzLCAgICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfcGxhY2VzLCAgICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisjICBlbHNlCisgICAgeyAiT01QX1BST0NfQklORCIsICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3Byb2NfYmluZCwgICAgICAgICAgTlVMTCwgLyogbm8gcHJpbnQgKi8gICAgICAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorIyAgZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyMgZW5kaWYgLyogT01QXzMwX0VOQUJMRUQgKi8KKworICAgIHsgIktNUF9UT1BPTE9HWV9NRVRIT0QiLCAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV90b3BvbG9neV9tZXRob2QsICAgIF9fa21wX3N0Z19wcmludF90b3BvbG9neV9tZXRob2QsICAgIE5VTEwsIDAsIDAgfSwKKworI2VsaWYgIUtNUF9BRkZJTklUWV9TVVBQT1JURUQKKworICAgIC8vCisgICAgLy8gS01QX0FGRklOSVRZIGlzIG5vdCBzdXBwb3J0ZWQgb24gT1MgWCosIG5vciBpcyBPTVBfUExBQ0VTLgorICAgIC8vIE9NUF9QUk9DX0JJTkQgYW5kIHByb2MtYmluZC12YXIgYXJlIHN1cHBvcnRlZCwgaG93ZXZlci4KKyAgICAvLworIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgIHsgIk9NUF9QUk9DX0JJTkQiLCAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9wcm9jX2JpbmQsICAgICAgICAgIF9fa21wX3N0Z19wcmludF9wcm9jX2JpbmQsICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyMgZW5kaWYKKworI2Vsc2UKKyAgICAjZXJyb3IgIlVua25vd24gb3IgdW5zdXBwb3J0ZWQgT1MiCisjZW5kaWYgLy8gS01QX0FGRklOSVRZX1NVUFBPUlRFRAorCisgICAgeyAiS01QX0lOSVRfQVRfRk9SSyIsICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2luaXRfYXRfZm9yaywgICAgICAgX19rbXBfc3RnX3ByaW50X2luaXRfYXRfZm9yaywgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9TQ0hFRFVMRSIsICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9zY2hlZHVsZSwgICAgICAgICAgIF9fa21wX3N0Z19wcmludF9zY2hlZHVsZSwgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJPTVBfU0NIRURVTEUiLCAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2Vfb21wX3NjaGVkdWxlLCAgICAgICBfX2ttcF9zdGdfcHJpbnRfb21wX3NjaGVkdWxlLCAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0FUT01JQ19NT0RFIiwgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2F0b21pY19tb2RlLCAgICAgICAgX19rbXBfc3RnX3ByaW50X2F0b21pY19tb2RlLCAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9DT05TSVNURU5DWV9DSEVDSyIsICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9jb25zaXN0ZW5jeV9jaGVjaywgIF9fa21wX3N0Z19wcmludF9jb25zaXN0ZW5jeV9jaGVjaywgIE5VTEwsIDAsIDAgfSwKKworI2lmIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICB7ICJLTVBfSVRUX1BSRVBBUkVfREVMQVkiLCAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfaXR0X3ByZXBhcmVfZGVsYXksICBfX2ttcF9zdGdfcHJpbnRfaXR0X3ByZXBhcmVfZGVsYXksICBOVUxMLCAwLCAwIH0sCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWSAqLworICAgIHsgIktNUF9NQUxMT0NfUE9PTF9JTkNSIiwgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9tYWxsb2NfcG9vbF9pbmNyLCAgIF9fa21wX3N0Z19wcmludF9tYWxsb2NfcG9vbF9pbmNyLCAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfSU5JVF9XQUlUIiwgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfaW5pdF93YWl0LCAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfaW5pdF93YWl0LCAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX05FWFRfV0FJVCIsICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX25leHRfd2FpdCwgICAgICAgICAgX19rbXBfc3RnX3ByaW50X25leHRfd2FpdCwgICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9HVElEX01PREUiLCAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9ndGlkX21vZGUsICAgICAgICAgIF9fa21wX3N0Z19wcmludF9ndGlkX21vZGUsICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJPTVBfRFlOQU1JQyIsICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2Vfb21wX2R5bmFtaWMsICAgICAgICBfX2ttcF9zdGdfcHJpbnRfb21wX2R5bmFtaWMsICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0RZTkFNSUNfTU9ERSIsICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2ttcF9keW5hbWljX21vZGUsICAgX19rbXBfc3RnX3ByaW50X2ttcF9keW5hbWljX21vZGUsICAgTlVMTCwgMCwgMCB9LAorCisjaWZkZWYgVVNFX0xPQURfQkFMQU5DRQorICAgIHsgIktNUF9MT0FEX0JBTEFOQ0VfSU5URVJWQUwiLCAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9sZF9iYWxhbmNlX2ludGVydmFsLF9fa21wX3N0Z19wcmludF9sZF9iYWxhbmNlX2ludGVydmFsLE5VTEwsIDAsIDAgfSwKKyNlbmRpZgorCisKKworICAgIHsgIktNUF9OVU1fTE9DS1NfSU5fQkxPQ0siLCAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9sb2NrX2Jsb2NrLCAgICAgICAgIF9fa21wX3N0Z19wcmludF9sb2NrX2Jsb2NrLCAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfTE9DS19LSU5EIiwgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfbG9ja19raW5kLCAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfbG9ja19raW5kLCAgICAgICAgICBOVUxMLCAwLCAwIH0sCisjaWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworICAgIHsgIktNUF9BREFQVElWRV9MT0NLX1BST1BTIiwgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9hZGFwdGl2ZV9sb2NrX3Byb3BzLF9fa21wX3N0Z19wcmludF9hZGFwdGl2ZV9sb2NrX3Byb3BzLCAgTlVMTCwgMCwgMCB9LAorI2lmIEtNUF9ERUJVR19BREFQVElWRV9MT0NLUworICAgIHsgIktNUF9TUEVDVUxBVElWRV9TVEFUU0ZJTEUiLCAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9zcGVjdWxhdGl2ZV9zdGF0c2ZpbGUsX19rbXBfc3RnX3ByaW50X3NwZWN1bGF0aXZlX3N0YXRzZmlsZSwgIE5VTEwsIDAsIDAgfSwKKyNlbmRpZgorI2VuZGlmIC8vIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKyNpZiBLTVBfTUlDCisgICAgeyAiS01QX1BMQUNFX1RIUkVBRFMiLCAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3BsYWNlX3RocmVhZHMsICAgICAgX19rbXBfc3RnX3ByaW50X3BsYWNlX3RocmVhZHMsICAgICAgTlVMTCwgMCwgMCB9LAorI2VuZGlmCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIHsgIktNUF9GT1JLSk9JTl9GUkFNRVMiLCAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9mb3Jram9pbl9mcmFtZXMsICAgIF9fa21wX3N0Z19wcmludF9mb3Jram9pbl9mcmFtZXMsICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfRk9SS0pPSU5fRlJBTUVTX01PREUiLCAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfZm9ya2pvaW5fZnJhbWVzX21vZGUsX19rbXBfc3RnX3ByaW50X2Zvcmtqb2luX2ZyYW1lc19tb2RlLCAgTlVMTCwgMCwgMCB9LAorI2VuZGlmCisKKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICB7ICJPTVBfRElTUExBWV9FTlYiLCAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2Vfb21wX2Rpc3BsYXlfZW52LCAgICBfX2ttcF9zdGdfcHJpbnRfb21wX2Rpc3BsYXlfZW52LCAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiT01QX0NBTkNFTExBVElPTiIsICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX29tcF9jYW5jZWxsYXRpb24sICAgX19rbXBfc3RnX3ByaW50X29tcF9jYW5jZWxsYXRpb24sICAgTlVMTCwgMCwgMCB9LAorI2VuZGlmCisgICAgeyAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCB9Cit9OyAvLyBzZXR0aW5ncworCitzdGF0aWMgaW50IGNvbnN0IF9fa21wX3N0Z19jb3VudCA9IHNpemVvZiggX19rbXBfc3RnX3RhYmxlICkgLyBzaXplb2YoIGttcF9zZXR0aW5nX3QgKTsKKworc3RhdGljIGlubGluZQora21wX3NldHRpbmdfdCAqCitfX2ttcF9zdGdfZmluZCggY2hhciBjb25zdCAqIG5hbWUgKSB7CisKKyAgICBpbnQgaTsKKyAgICBpZiAoIG5hbWUgIT0gTlVMTCApIHsKKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCBfX2ttcF9zdGdfY291bnQ7ICsrIGkgKSB7CisgICAgICAgICAgICBpZiAoIHN0cmNtcCggX19rbXBfc3RnX3RhYmxlWyBpIF0ubmFtZSwgbmFtZSApID09IDAgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICYgX19rbXBfc3RnX3RhYmxlWyBpIF07CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9OyAvLyBmb3IKKyAgICB9OyAvLyBpZgorICAgIHJldHVybiBOVUxMOworCit9IC8vIF9fa21wX3N0Z19maW5kCisKKworc3RhdGljIGludAorX19rbXBfc3RnX2NtcCggdm9pZCBjb25zdCAqIF9hLCB2b2lkIGNvbnN0ICogX2IgKSB7CisgICAga21wX3NldHRpbmdfdCAqIGEgPSAoa21wX3NldHRpbmdfdCAqKSBfYTsKKyAgICBrbXBfc2V0dGluZ190ICogYiA9IChrbXBfc2V0dGluZ190ICopIF9iOworCisgICAgLy8KKyAgICAvLyBQcm9jZXNzIEtNUF9BRkZJTklUWSBsYXN0LgorICAgIC8vIEl0IG5lZWRzIHRvIGNvbWUgYWZ0ZXIgT01QX1BMQUNFUyBhbmQgR09NUF9DUFVfQUZGSU5JVFkuCisgICAgLy8KKyAgICBpZiAoIHN0cmNtcCggYS0+bmFtZSwgIktNUF9BRkZJTklUWSIgKSA9PSAwICkgeworICAgICAgICBpZiAoIHN0cmNtcCggYi0+bmFtZSwgIktNUF9BRkZJTklUWSIgKSA9PSAwICkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UgaWYgKCBzdHJjbXAoIGItPm5hbWUsICJLTVBfQUZGSU5JVFkiICkgPT0gMCApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gc3RyY21wKCBhLT5uYW1lLCBiLT5uYW1lICk7Cit9IC8vIF9fa21wX3N0Z19jbXAKKworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX2luaXQoIHZvaWQKKykgeworCisgICAgc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7CisKKyAgICBpZiAoICEgaW5pdGlhbGl6ZWQgKSB7CisKKyAgICAgICAgLy8gU29ydCB0YWJsZS4KKyAgICAgICAgcXNvcnQoIF9fa21wX3N0Z190YWJsZSwgX19rbXBfc3RnX2NvdW50IC0gMSwgc2l6ZW9mKCBrbXBfc2V0dGluZ190ICksIF9fa21wX3N0Z19jbXAgKTsKKworICAgICAgICB7IC8vIEluaXRpYWxpemUgKl9TVEFDS1NJWkUgZGF0YS4KKworICAgICAgICAgICAga21wX3NldHRpbmdfdCAqIGttcF9zdGFja3NpemUgID0gX19rbXBfc3RnX2ZpbmQoICJLTVBfU1RBQ0tTSVpFIiAgKTsgICAgICAvLyAxc3QgcHJpb3JpdHkuCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgICAgICAgICBrbXBfc2V0dGluZ190ICogZ29tcF9zdGFja3NpemUgPSBfX2ttcF9zdGdfZmluZCggIkdPTVBfU1RBQ0tTSVpFIiApOyAgICAgIC8vIDJuZCBwcmlvcml0eS4KKyNlbmRpZgorICAgICAgICAgICAga21wX3NldHRpbmdfdCAqIG9tcF9zdGFja3NpemUgID0gX19rbXBfc3RnX2ZpbmQoICJPTVBfU1RBQ0tTSVpFIiAgKTsgICAgICAvLyAzcmQgcHJpb3JpdHkuCisKKyAgICAgICAgICAgIC8vICEhISB2b2xhdGlsZSBrZXl3b3JkIGlzIEludGVsIChSKSBDIENvbXBpbGVyIGJ1ZyBDUTQ5OTA4IHdvcmthcm91bmQuCisgICAgICAgICAgICAvLyAhISEgQ29tcGlsZXIgZG9lcyBub3QgdW5kZXJzdGFuZCByaXZhbHMgaXMgdXNlZCBhbmQgb3B0aW1pemVzIG91dCBhc3NpZ25tZW50cworICAgICAgICAgICAgLy8gISEhICAgICByaXZhbHNbIGkgKysgXSA9IC4uLjsKKyAgICAgICAgICAgIHN0YXRpYyBrbXBfc2V0dGluZ190ICogdm9sYXRpbGUgcml2YWxzWyA0IF07CisgICAgICAgICAgICBzdGF0aWMga21wX3N0Z19zc19kYXRhX3Qga21wX2RhdGEgID0geyAgICAxLCAoa21wX3NldHRpbmdfdCAqKilyaXZhbHMgfTsKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgICAgIHN0YXRpYyBrbXBfc3RnX3NzX2RhdGFfdCBnb21wX2RhdGEgPSB7IDEwMjQsIChrbXBfc2V0dGluZ190ICoqKXJpdmFscyB9OworI2VuZGlmCisgICAgICAgICAgICBzdGF0aWMga21wX3N0Z19zc19kYXRhX3Qgb21wX2RhdGEgID0geyAxMDI0LCAoa21wX3NldHRpbmdfdCAqKilyaXZhbHMgfTsKKyAgICAgICAgICAgIGludCBpID0gMDsKKworICAgICAgICAgICAgcml2YWxzWyBpICsrIF0gPSBrbXBfc3RhY2tzaXplOworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgICAgICAgICAgaWYgKCBnb21wX3N0YWNrc2l6ZSAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIHJpdmFsc1sgaSArKyBdID0gZ29tcF9zdGFja3NpemU7CisgICAgICAgICAgICB9OyAvLyBpZgorI2VuZGlmCisgICAgICAgICAgICByaXZhbHNbIGkgKysgXSA9IG9tcF9zdGFja3NpemU7CisgICAgICAgICAgICByaXZhbHNbIGkgKysgXSA9IE5VTEw7CisKKyAgICAgICAgICAgIGttcF9zdGFja3NpemUtPmRhdGEgPSAmIGttcF9kYXRhOworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgICAgICAgICAgaWYgKCBnb21wX3N0YWNrc2l6ZSAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIGdvbXBfc3RhY2tzaXplLT5kYXRhID0gJiBnb21wX2RhdGE7CisgICAgICAgICAgICB9OyAvLyBpZgorI2VuZGlmCisgICAgICAgICAgICBvbXBfc3RhY2tzaXplLT5kYXRhID0gJiBvbXBfZGF0YTsKKworICAgICAgICB9CisKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgICAgICB7IC8vIEluaXRpYWxpemUgS01QX0xJQlJBUlkgYW5kIE9NUF9XQUlUX1BPTElDWSBkYXRhLgorCisgICAgICAgICAgICBrbXBfc2V0dGluZ190ICoga21wX2xpYnJhcnkgICAgID0gX19rbXBfc3RnX2ZpbmQoICJLTVBfTElCUkFSWSIgKTsgICAgICAgIC8vIDFzdCBwcmlvcml0eS4KKyAgICAgICAgICAgIGttcF9zZXR0aW5nX3QgKiBvbXBfd2FpdF9wb2xpY3kgPSBfX2ttcF9zdGdfZmluZCggIk9NUF9XQUlUX1BPTElDWSIgKTsgICAgLy8gMm5kIHByaW9yaXR5LgorCisgICAgICAgICAgICAvLyAhISEgdm9sYXRpbGUga2V5d29yZCBpcyBJbnRlbCAoUikgQyBDb21waWxlciBidWcgQ1E0OTkwOCB3b3JrYXJvdW5kLgorICAgICAgICAgICAgc3RhdGljIGttcF9zZXR0aW5nX3QgKiB2b2xhdGlsZSByaXZhbHNbIDMgXTsKKyAgICAgICAgICAgIHN0YXRpYyBrbXBfc3RnX3dwX2RhdGFfdCBrbXBfZGF0YSAgPSB7IDAsIChrbXBfc2V0dGluZ190ICoqKXJpdmFscyB9OworICAgICAgICAgICAgc3RhdGljIGttcF9zdGdfd3BfZGF0YV90IG9tcF9kYXRhICA9IHsgMSwgKGttcF9zZXR0aW5nX3QgKiopcml2YWxzIH07CisgICAgICAgICAgICBpbnQgaSA9IDA7CisKKyAgICAgICAgICAgIHJpdmFsc1sgaSArKyBdID0ga21wX2xpYnJhcnk7CisgICAgICAgICAgICBpZiAoIG9tcF93YWl0X3BvbGljeSAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIHJpdmFsc1sgaSArKyBdID0gb21wX3dhaXRfcG9saWN5OworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIHJpdmFsc1sgaSArKyBdID0gTlVMTDsKKworICAgICAgICAgICAga21wX2xpYnJhcnktPmRhdGEgID0gJiBrbXBfZGF0YTsKKyAgICAgICAgICAgIGlmICggb21wX3dhaXRfcG9saWN5ICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgb21wX3dhaXRfcG9saWN5LT5kYXRhID0gJiBvbXBfZGF0YTsKKyAgICAgICAgICAgIH07IC8vIGlmCisKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgeworICAgICAgICAgICAga21wX3NldHRpbmdfdCAqIGttcF9saWJyYXJ5ID0gX19rbXBfc3RnX2ZpbmQoICJLTVBfTElCUkFSWSIgKTsKKyAgICAgICAgICAgIHN0YXRpYyBrbXBfc3RnX3dwX2RhdGFfdCBrbXBfZGF0YSA9IHsgMCwgTlVMTCB9OworICAgICAgICAgICAga21wX2xpYnJhcnktPmRhdGEgPSAmIGttcF9kYXRhOworICAgICAgICB9CisjZW5kaWYgLyogT01QXzMwX0VOQUJMRUQgKi8KKworICAgICAgICB7IC8vIEluaXRpYWxpemUgS01QX0FMTF9USFJFQURTLCBLTVBfTUFYX1RIUkVBRFMsIGFuZCBPTVBfVEhSRUFEX0xJTUlUIGRhdGEuCisKKyAgICAgICAgICAgIGttcF9zZXR0aW5nX3QgKiBrbXBfYWxsX3RocmVhZHMgID0gX19rbXBfc3RnX2ZpbmQoICJLTVBfQUxMX1RIUkVBRFMiICApOyAgLy8gMXN0IHByaW9yaXR5LgorICAgICAgICAgICAga21wX3NldHRpbmdfdCAqIGttcF9tYXhfdGhyZWFkcyAgPSBfX2ttcF9zdGdfZmluZCggIktNUF9NQVhfVEhSRUFEUyIgICk7ICAvLyAybmQgcHJpb3JpdHkuCisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgICAgICAgIGttcF9zZXR0aW5nX3QgKiBvbXBfdGhyZWFkX2xpbWl0ID0gX19rbXBfc3RnX2ZpbmQoICJPTVBfVEhSRUFEX0xJTUlUIiApOyAgLy8gM3JkIHByaW9yaXR5LgorI2VuZGlmCisKKyAgICAgICAgICAgIC8vICEhISB2b2xhdGlsZSBrZXl3b3JkIGlzIEludGVsIChSKSBDIENvbXBpbGVyIGJ1ZyBDUTQ5OTA4IHdvcmthcm91bmQuCisgICAgICAgICAgICBzdGF0aWMga21wX3NldHRpbmdfdCAqIHZvbGF0aWxlIHJpdmFsc1sgNCBdOworICAgICAgICAgICAgaW50IGkgPSAwOworCisgICAgICAgICAgICByaXZhbHNbIGkgKysgXSA9IGttcF9hbGxfdGhyZWFkczsKKyAgICAgICAgICAgIHJpdmFsc1sgaSArKyBdID0ga21wX21heF90aHJlYWRzOworI2lmIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgICBpZiAoIG9tcF90aHJlYWRfbGltaXQgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICByaXZhbHNbIGkgKysgXSA9IG9tcF90aHJlYWRfbGltaXQ7CisgICAgICAgICAgICB9OyAvLyBpZgorI2VuZGlmCisgICAgICAgICAgICByaXZhbHNbIGkgKysgXSA9IE5VTEw7CisKKyAgICAgICAgICAgIGttcF9hbGxfdGhyZWFkcy0+ZGF0YSA9ICh2b2lkKikmIHJpdmFsczsKKyAgICAgICAgICAgIGttcF9tYXhfdGhyZWFkcy0+ZGF0YSA9ICh2b2lkKikmIHJpdmFsczsKKyNpZiBPTVBfMzBfRU5BQkxFRAorICAgICAgICAgICAgaWYgKCBvbXBfdGhyZWFkX2xpbWl0ICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgb21wX3RocmVhZF9saW1pdC0+ZGF0YSA9ICh2b2lkKikmIHJpdmFsczsKKyAgICAgICAgICAgIH07IC8vIGlmCisjZW5kaWYKKworICAgICAgICB9CisKKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIHsgLy8gSW5pdGlhbGl6ZSBLTVBfQUZGSU5JVFksIEdPTVBfQ1BVX0FGRklOSVRZLCBhbmQgT01QX1BST0NfQklORCBkYXRhLgorCisgICAgICAgICAgICBrbXBfc2V0dGluZ190ICoga21wX2FmZmluaXR5ID0gX19rbXBfc3RnX2ZpbmQoICJLTVBfQUZGSU5JVFkiICApOyAgLy8gMXN0IHByaW9yaXR5LgorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCgga21wX2FmZmluaXR5ICE9IE5VTEwgKTsKKworIyBpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgICAgIGttcF9zZXR0aW5nX3QgKiBnb21wX2NwdV9hZmZpbml0eSA9IF9fa21wX3N0Z19maW5kKCAiR09NUF9DUFVfQUZGSU5JVFkiICApOyAgLy8gMm5kIHByaW9yaXR5LgorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggZ29tcF9jcHVfYWZmaW5pdHkgIT0gTlVMTCApOworIyBlbmRpZgorCisjIGlmIE9NUF8zMF9FTkFCTEVECisgICAgICAgICAgICBrbXBfc2V0dGluZ190ICogb21wX3Byb2NfYmluZCA9IF9fa21wX3N0Z19maW5kKCAiT01QX1BST0NfQklORCIgKTsgIC8vIDNyZCBwcmlvcml0eS4KKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIG9tcF9wcm9jX2JpbmQgIT0gTlVMTCApOworIyBlbmRpZgorCisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICBrbXBfc2V0dGluZ190ICogb21wX3BsYWNlcyA9IF9fa21wX3N0Z19maW5kKCAiT01QX1BMQUNFUyIgKTsgIC8vIDNyZCBwcmlvcml0eS4KKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIG9tcF9wbGFjZXMgIT0gTlVMTCApOworIyBlbmRpZgorCisgICAgICAgICAgICAvLyAhISEgdm9sYXRpbGUga2V5d29yZCBpcyBJbnRlbCAoUikgQyBDb21waWxlciBidWcgQ1E0OTkwOCB3b3JrYXJvdW5kLgorICAgICAgICAgICAgc3RhdGljIGttcF9zZXR0aW5nX3QgKiB2b2xhdGlsZSByaXZhbHNbIDUgXTsKKyAgICAgICAgICAgIGludCBpID0gMDsKKworICAgICAgICAgICAgcml2YWxzWyBpICsrIF0gPSBrbXBfYWZmaW5pdHk7CisKKyMgaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgICAgICAgICByaXZhbHNbIGkgKysgXSA9IGdvbXBfY3B1X2FmZmluaXR5OworICAgICAgICAgICAgZ29tcF9jcHVfYWZmaW5pdHktPmRhdGEgPSAodm9pZCopJiByaXZhbHM7CisjIGVuZGlmCisKKyMgaWYgT01QXzMwX0VOQUJMRUQKKyAgICAgICAgICAgIHJpdmFsc1sgaSArKyBdID0gb21wX3Byb2NfYmluZDsKKyAgICAgICAgICAgIG9tcF9wcm9jX2JpbmQtPmRhdGEgPSAodm9pZCopJiByaXZhbHM7CisjIGVuZGlmCisKKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgIHJpdmFsc1sgaSArKyBdID0gb21wX3BsYWNlczsKKyAgICAgICAgICAgIG9tcF9wbGFjZXMtPmRhdGEgPSAodm9pZCopJiByaXZhbHM7CisjIGVuZGlmCisKKyAgICAgICAgICAgIHJpdmFsc1sgaSArKyBdID0gTlVMTDsKKyAgICAgICAgfQorCisjZWxzZQorICAgIC8vIEtNUF9BRkZJTklUWSBub3Qgc3VwcG9ydGVkLCBzbyBPTVBfUFJPQ19CSU5EIGhhcyBubyByaXZhbHMuCisgICAgLy8gT01QX1BMQUNFUyBub3Qgc3VwcG9ydGVkIHlldC4KKyNlbmRpZgorCisgICAgICAgIHsgLy8gSW5pdGlhbGl6ZSBLTVBfREVURVJNSU5JU1RJQ19SRURVQ1RJT04gYW5kIEtNUF9GT1JDRV9SRURVQ1RJT04gZGF0YS4KKworICAgICAgICAgICAga21wX3NldHRpbmdfdCAqIGttcF9mb3JjZV9yZWQgID0gX19rbXBfc3RnX2ZpbmQoICJLTVBfRk9SQ0VfUkVEVUNUSU9OIiApOyAgICAgICAgIC8vIDFzdCBwcmlvcml0eS4KKyAgICAgICAgICAgIGttcF9zZXR0aW5nX3QgKiBrbXBfZGV0ZXJtX3JlZCA9IF9fa21wX3N0Z19maW5kKCAiS01QX0RFVEVSTUlOSVNUSUNfUkVEVUNUSU9OIiApOyAvLyAybmQgcHJpb3JpdHkuCisKKyAgICAgICAgICAgIC8vICEhISB2b2xhdGlsZSBrZXl3b3JkIGlzIEludGVsIChSKSBDIENvbXBpbGVyIGJ1ZyBDUTQ5OTA4IHdvcmthcm91bmQuCisgICAgICAgICAgICBzdGF0aWMga21wX3NldHRpbmdfdCAqIHZvbGF0aWxlIHJpdmFsc1sgMyBdOworICAgICAgICAgICAgc3RhdGljIGttcF9zdGdfZnJfZGF0YV90IGZvcmNlX2RhdGEgICA9IHsgMSwgKGttcF9zZXR0aW5nX3QgKiopcml2YWxzIH07CisgICAgICAgICAgICBzdGF0aWMga21wX3N0Z19mcl9kYXRhX3QgZGV0ZXJtX2RhdGEgID0geyAwLCAoa21wX3NldHRpbmdfdCAqKilyaXZhbHMgfTsKKyAgICAgICAgICAgIGludCBpID0gMDsKKworICAgICAgICAgICAgcml2YWxzWyBpICsrIF0gPSBrbXBfZm9yY2VfcmVkOworICAgICAgICAgICAgaWYgKCBrbXBfZGV0ZXJtX3JlZCAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIHJpdmFsc1sgaSArKyBdID0ga21wX2RldGVybV9yZWQ7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgcml2YWxzWyBpICsrIF0gPSBOVUxMOworCisgICAgICAgICAgICBrbXBfZm9yY2VfcmVkLT5kYXRhID0gJiBmb3JjZV9kYXRhOworICAgICAgICAgICAgaWYgKCBrbXBfZGV0ZXJtX3JlZCAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIGttcF9kZXRlcm1fcmVkLT5kYXRhICA9ICYgZGV0ZXJtX2RhdGE7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9CisKKyAgICAgICAgaW5pdGlhbGl6ZWQgPSAxOworCisgICAgfTsgLy8gaWYKKworICAgIC8vIFJlc2V0IGZsYWdzLgorICAgIGludCBpOworICAgIGZvciAoIGkgPSAwOyBpIDwgX19rbXBfc3RnX2NvdW50OyArKyBpICkgeworICAgICAgICBfX2ttcF9zdGdfdGFibGVbIGkgXS5zZXQgPSAwOworICAgIH07IC8vIGZvcgorCit9IC8vIF9fa21wX3N0Z19pbml0CisKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZSgKKyAgICBjaGFyIGNvbnN0ICogbmFtZSwKKyAgICBjaGFyIGNvbnN0ICogdmFsdWUKKykgeworCisgICAgLy8gT24gV2luZG93cyogT1MgdGhlcmUgYXJlIHNvbWUgbmFtZWxlc3MgdmFyaWFibGVzIGxpa2UgIkM6PUM6XCIgKHllYWgsIHJlYWxseSBuYW1lbGVzcywgdGhleSBhcmUKKyAgICAvLyBwcmVzZW50ZWQgaW4gZW52aXJvbm1lbnQgYmxvY2sgYXMgIj1DOj1DXFxceDAwPUQ6PUQ6XFxceDAwLi4uIiwgc28gbGV0IHVzIHNraXAgdGhlbS4KKyAgICBpZiAoIG5hbWVbIDAgXSA9PSAwICkgeworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKworICAgIGlmICggdmFsdWUgIT0gTlVMTCApIHsKKyAgICAgICAga21wX3NldHRpbmdfdCAqIHNldHRpbmcgPSBfX2ttcF9zdGdfZmluZCggbmFtZSApOworICAgICAgICBpZiAoIHNldHRpbmcgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIHNldHRpbmctPnBhcnNlKCBuYW1lLCB2YWx1ZSwgc2V0dGluZy0+ZGF0YSApOworICAgICAgICAgICAgc2V0dGluZy0+ZGVmaW5lZCA9IDE7CisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gaWYKKworfSAvLyBfX2ttcF9zdGdfcGFyc2UKKworCitzdGF0aWMgaW50CitfX2ttcF9zdGdfY2hlY2tfcml2YWxzKCAgICAgICAgICAvLyAwIC0tIE9rLCAxIC0tIGVycm9ycyBmb3VuZC4KKyAgICBjaGFyIGNvbnN0ICogICAgICAgbmFtZSwgICAgIC8vIE5hbWUgb2YgdmFyaWFibGUuCisgICAgY2hhciBjb25zdCAqICAgICAgIHZhbHVlLCAgICAvLyBWYWx1ZSBvZiB0aGUgdmFyaWFibGUuCisgICAga21wX3NldHRpbmdfdCAqICogIHJpdmFscyAgICAvLyBMaXN0IG9mIHJpdmFsIHNldHRpbmdzICh0aGUgbGlzdCBtdXN0IGluY2x1ZGUgY3VycmVudCBvbmUpLgorKSB7CisKKyAgICBpZiAoIHJpdmFscyA9PSBOVUxMICkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyBMb29wIHRocnUgaGlnaGVyIHByaW9yaXR5IHNldHRpbmdzIChsaXN0ZWQgYmVmb3JlIGN1cnJlbnQpLgorICAgIGludCBpID0gMDsKKyAgICBmb3IgKCA7IHN0cmNtcCggcml2YWxzWyBpIF0tPm5hbWUsIG5hbWUgKSAhPSAwOyBpKysgKSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHJpdmFsc1sgaSBdICE9IE5VTEwgKTsKKworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgaWYgKCByaXZhbHNbIGkgXSA9PSBfX2ttcF9hZmZpbml0eV9ub3R5cGUgKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSWYgS01QX0FGRklOSVRZIGlzIHNwZWNpZmllZCB3aXRob3V0IGEgdHlwZSBuYW1lLAorICAgICAgICAgICAgLy8gaXQgZG9lcyBub3Qgcml2YWwgT01QX1BST0NfQklORCBvciBHT01QX0NQVV9BRkZJTklUWS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgaWYgKCByaXZhbHNbIGkgXS0+c2V0ICkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIFN0Z0lnbm9yZWQsIG5hbWUsIHZhbHVlLCByaXZhbHNbIGkgXS0+bmFtZSApOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gd2hpbGUKKworICAgICsrIGk7IC8vIFNraXAgY3VycmVudCBzZXR0aW5nLgorICAgIHJldHVybiAwOworCit9OyAvLyBfX2ttcF9zdGdfY2hlY2tfcml2YWxzCisKKworCitzdGF0aWMgaW50CitfX2ttcF9lbnZfaXNEZWZpbmVkKCBjaGFyIGNvbnN0ICogbmFtZSApIHsKKyAgICBpbnQgcmMgPSAwOworICAgIGttcF9zZXR0aW5nX3QgKiBzZXR0aW5nID0gX19rbXBfc3RnX2ZpbmQoIG5hbWUgKTsKKyAgICBpZiAoIHNldHRpbmcgIT0gTlVMTCApIHsKKyAgICAgICAgcmMgPSBzZXR0aW5nLT5zZXQ7CisgICAgfTsgLy8gaWYKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX2Vudl90b1ByaW50KCBjaGFyIGNvbnN0ICogbmFtZSwgaW50IGZsYWcgKSB7CisgICAgaW50IHJjID0gMDsKKyAgICBrbXBfc2V0dGluZ190ICogc2V0dGluZyA9IF9fa21wX3N0Z19maW5kKCBuYW1lICk7CisgICAgaWYgKCBzZXR0aW5nICE9IE5VTEwgKSB7CisgICAgICAgIHJjID0gc2V0dGluZy0+ZGVmaW5lZDsKKyAgICAgICAgaWYgKCBmbGFnID49IDAgKSB7CisgICAgICAgICAgICBzZXR0aW5nLT5kZWZpbmVkID0gZmxhZzsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBpZgorICAgIHJldHVybiByYzsKK30KKworCitzdGF0aWMgdm9pZAorX19rbXBfYXV4X2Vudl9pbml0aWFsaXplKCBrbXBfZW52X2Jsa190KiBibG9jayApIHsKKworICAgIGNoYXIgY29uc3QgKiB2YWx1ZTsKKworICAgIC8qIE9NUF9OVU1fVEhSRUFEUyAqLworICAgIHZhbHVlID0gX19rbXBfZW52X2Jsa192YXIoIGJsb2NrLCAiT01QX05VTV9USFJFQURTIiApOworICAgIGlmICggdmFsdWUgKSB7CisgICAgICAgIG9tcGNfc2V0X251bV90aHJlYWRzKCBfX2ttcF9kZmx0X3RlYW1fbnRoICk7CisgICAgfQorCisgICAgLyogS01QX0JMT0NLVElNRSAqLworICAgIHZhbHVlID0gX19rbXBfZW52X2Jsa192YXIoIGJsb2NrLCAiS01QX0JMT0NLVElNRSIgKTsKKyAgICBpZiAoIHZhbHVlICkgeworICAgICAgICBrbXBjX3NldF9ibG9ja3RpbWUoIF9fa21wX2RmbHRfYmxvY2t0aW1lICk7CisgICAgfQorCisgICAgLyogT01QX05FU1RFRCAqLworICAgIHZhbHVlID0gX19rbXBfZW52X2Jsa192YXIoIGJsb2NrLCAiT01QX05FU1RFRCIgKTsKKyAgICBpZiAoIHZhbHVlICkgeworICAgICAgICBvbXBjX3NldF9uZXN0ZWQoIF9fa21wX2RmbHRfbmVzdGVkICk7CisgICAgfQorCisgICAgLyogT01QX0RZTkFNSUMgKi8KKyAgICB2YWx1ZSA9IF9fa21wX2Vudl9ibGtfdmFyKCBibG9jaywgIk9NUF9EWU5BTUlDIiApOworICAgIGlmICggdmFsdWUgKSB7CisgICAgICAgIG9tcGNfc2V0X2R5bmFtaWMoIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pYyApOworICAgIH0KKworfQorCit2b2lkCitfX2ttcF9lbnZfaW5pdGlhbGl6ZSggY2hhciBjb25zdCAqIHN0cmluZyApIHsKKworICAgIGttcF9lbnZfYmxrX3QgYmxvY2s7CisgICAgaW50ICAgICAgICAgICBpOworCisgICAgX19rbXBfc3RnX2luaXQoKTsKKworICAgIC8vIEhhY2shISEKKyAgICBpZiAoIHN0cmluZyA9PSBOVUxMICkgeworICAgICAgICAvLyBfX2ttcF9tYXhfbnRoID0gX19rbXBfc3lzX21heF9udGg7CisgICAgICAgIF9fa21wX3RocmVhZHNfY2FwYWNpdHkgPSBfX2ttcF9pbml0aWFsX3RocmVhZHNfY2FwYWNpdHkoIF9fa21wX2RmbHRfdGVhbV9udGhfdWIgKTsKKyAgICB9OyAvLyBpZgorICAgIF9fa21wX2Vudl9ibGtfaW5pdCggJiBibG9jaywgc3RyaW5nICk7CisKKyAgICAvLworICAgIC8vIHVwZGF0ZSB0aGUgc2V0IGZsYWcgb24gYWxsIGVudHJpZXMgdGhhdCBoYXZlIGFuIGVudiB2YXIKKyAgICAvLworICAgIGZvciAoIGkgPSAwOyBpIDwgYmxvY2suY291bnQ7ICsrIGkgKSB7CisgICAgICAgIGlmICgoIGJsb2NrLnZhcnNbIGkgXS5uYW1lID09IE5VTEwgKQorICAgICAgICAgIHx8ICggKmJsb2NrLnZhcnNbIGkgXS5uYW1lID09ICdcMCcpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIGJsb2NrLnZhcnNbIGkgXS52YWx1ZSA9PSBOVUxMICkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAga21wX3NldHRpbmdfdCAqIHNldHRpbmcgPSBfX2ttcF9zdGdfZmluZCggYmxvY2sudmFyc1sgaSBdLm5hbWUgKTsKKyAgICAgICAgaWYgKCBzZXR0aW5nICE9IE5VTEwgKSB7CisgICAgICAgICAgICBzZXR0aW5nLT5zZXQgPSAxOworICAgICAgICB9CisgICAgfTsgLy8gZm9yIGkKKworICAgIC8vIFNwZWNpYWwgY2FzZS4gSWYgd2UgcGFyc2UgZW52aXJvbm1lbnQsIG5vdCBhIHN0cmluZywgcHJvY2VzcyBLTVBfV0FSTklOR1MgZmlyc3QuCisgICAgaWYgKCBzdHJpbmcgPT0gTlVMTCApIHsKKyAgICAgICAgY2hhciBjb25zdCAqIG5hbWUgID0gIktNUF9XQVJOSU5HUyI7CisgICAgICAgIGNoYXIgY29uc3QgKiB2YWx1ZSA9IF9fa21wX2Vudl9ibGtfdmFyKCAmIGJsb2NrLCBuYW1lICk7CisgICAgICAgIF9fa21wX3N0Z19wYXJzZSggbmFtZSwgdmFsdWUgKTsKKyAgICB9OyAvLyBpZgorCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIC8vCisgICAgLy8gU3BlY2lhbCBjYXNlLiBLTVBfQUZGSU5JVFkgaXMgbm90IGEgcml2YWwgdG8gb3RoZXIgYWZmaW5pdHkgZW52IHZhcnMKKyAgICAvLyBpZiBubyBhZmZpbml0eSB0eXBlIGlzIHNwZWNpZmllZC4gIFdlIHdhbnQgdG8gYWxsb3cKKyAgICAvLyBLTVBfQUZGSU5JVFk9W25vXSx2ZXJib3NlL1tub113YXJuaW5ncy9ldGMuICB0byBiZSBlbmFibGVkIHdoZW4KKyAgICAvLyBzcGVjaWZ5aW5nIHRoZSBhZmZpbml0eSB0eXBlIHZpYSBHT01QX0NQVV9BRkZJTklUWSBvciB0aGUgT01QIDQuMAorICAgIC8vIGFmZmluaXR5IG1lY2hhbmlzbS4KKyAgICAvLworICAgIF9fa21wX2FmZmluaXR5X25vdHlwZSA9IE5VTEw7CisgICAgY2hhciBjb25zdCAqYWZmX3N0ciA9IF9fa21wX2Vudl9ibGtfdmFyKCAmIGJsb2NrLCAiS01QX0FGRklOSVRZIiApOworICAgIGlmICggYWZmX3N0ciAhPSBOVUxMICkgeworICAgICAgICAvLworICAgICAgICAvLyBDaGVjayBpZiB0aGUgS01QX0FGRklOSVRZIHR5cGUgaXMgc3BlY2lmaWVkIGluIHRoZSBzdHJpbmcuCisgICAgICAgIC8vIFdlIGp1c3Qgc2VhcmNoIHRoZSBzdHJpbmcgZm9yICJjb21wYWN0IiwgInNjYXR0ZXIiLCBldGMuCisgICAgICAgIC8vIHdpdGhvdXQgcmVhbGx5IHBhcnNpbmcgdGhlIHN0cmluZy4gIFRoZSBzeW50YXggb2YgdGhlCisgICAgICAgIC8vIEtNUF9BRkZJTklUWSBlbnYgdmFyIGlzIHN1Y2ggdGhhdCBub25lIG9mIHRoZSBhZmZpbml0eQorICAgICAgICAvLyB0eXBlIG5hbWVzIGNhbiBhcHBlYXIgYW55d2hlcmUgb3RoZXIgdGhhdCB0aGUgdHlwZQorICAgICAgICAvLyBzcGVjaWZpZXIsIGV2ZW4gYXMgc3Vic3RyaW5ncy4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gSSBjYW4ndCBmaW5kIGEgY2FzZS1pbnNlbnNpdGl2ZSB2ZXJzaW9uIG9mIHN0cnN0ciBvbiBXaW5kb3dzKiBPUy4KKyAgICAgICAgLy8gVXNlIHRoZSBjYXNlLXNlbnNpdGl2ZSB2ZXJzaW9uIGZvciBub3cuCisgICAgICAgIC8vCisKKyMgaWYgS01QX09TX1dJTkRPV1MKKyMgIGRlZmluZSBGSU5EIHN0cnN0cgorIyBlbHNlCisjICBkZWZpbmUgRklORCBzdHJjYXNlc3RyCisjIGVuZGlmCisKKyAgICAgICAgaWYgKCAoIEZJTkQoIGFmZl9zdHIsICJub25lIiApID09IE5VTEwgKQorICAgICAgICAgICYmICggRklORCggYWZmX3N0ciwgInBoeXNpY2FsIiApID09IE5VTEwgKQorICAgICAgICAgICYmICggRklORCggYWZmX3N0ciwgImxvZ2ljYWwiICkgPT0gTlVMTCApCisgICAgICAgICAgJiYgKCBGSU5EKCBhZmZfc3RyLCAiY29tcGFjdCIgKSA9PSBOVUxMICkKKyAgICAgICAgICAmJiAoIEZJTkQoIGFmZl9zdHIsICJzY2F0dGVyIiApID09IE5VTEwgKQorICAgICAgICAgICYmICggRklORCggYWZmX3N0ciwgImV4cGxpY2l0IiApID09IE5VTEwgKQorIyBpZiBLTVBfTUlDCisgICAgICAgICAgJiYgKCBGSU5EKCBhZmZfc3RyLCAiYmFsYW5jZWQiICkgPT0gTlVMTCApCisjIGVuZGlmCisgICAgICAgICAgJiYgKCBGSU5EKCBhZmZfc3RyLCAiZGlzYWJsZWQiICkgPT0gTlVMTCApICkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfbm90eXBlID0gX19rbXBfc3RnX2ZpbmQoICJLTVBfQUZGSU5JVFkiICApOworICAgICAgICB9CisjIHVuZGVmIEZJTkQKKyAgICB9CisjZW5kaWYgLyogS01QX0FGRklOSVRZX1NVUFBPUlRFRCAqLworCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAvLworICAgIC8vIFNldCB1cCB0aGUgbmVzdGVkIHByb2MgYmluZCB0eXBlIHZlY3Rvci4KKyAgICAvLworICAgIGlmICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzID09IE5VTEwgKSB7CisgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlcyA9IChrbXBfcHJvY19iaW5kX3QgKikKKyAgICAgICAgICBLTVBfSU5URVJOQUxfTUFMTE9DKCBzaXplb2Yoa21wX3Byb2NfYmluZF90KSApOworICAgICAgICBpZiAoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlcyA9PSBOVUxMICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBNZW1vcnlBbGxvY0ZhaWxlZCApOworICAgICAgICB9CisgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuc2l6ZSA9IDE7CisgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQudXNlZCA9IDE7CisgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9kZWZhdWx0OworICAgIH0KKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisgICAgLy8KKyAgICAvLyBOb3cgcHJvY2VzcyBhbGwgb2YgdGhlIHNldHRpbmdzLgorICAgIC8vCisgICAgZm9yICggaSA9IDA7IGkgPCBibG9jay5jb3VudDsgKysgaSApIHsKKyAgICAgICAgX19rbXBfc3RnX3BhcnNlKCBibG9jay52YXJzWyBpIF0ubmFtZSwgYmxvY2sudmFyc1sgaSBdLnZhbHVlICk7CisgICAgfTsgLy8gZm9yIGkKKworICAgIC8vCisgICAgLy8gSWYgdXNlciBsb2NrcyBoYXZlIGJlZW4gYWxsb2NhdGVkIHlldCwgZG9uJ3QgcmVzZXQgdGhlIGxvY2sgdnB0ciB0YWJsZS4KKyAgICAvLworICAgIGlmICggISBfX2ttcF9pbml0X3VzZXJfbG9ja3MgKSB7CisgICAgICAgIGlmICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfZGVmYXVsdCApIHsKKyAgICAgICAgICAgIF9fa21wX3VzZXJfbG9ja19raW5kID0gbGtfcXVldWluZzsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX3ZwdHJzKCBfX2ttcF91c2VyX2xvY2tfa2luZCApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggc3RyaW5nICE9IE5VTEwpOyAvLyBrbXBfc2V0X2RlZmF1bHRzKCkgd2FzIGNhbGxlZAorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF91c2VyX2xvY2tfa2luZCAhPSBsa19kZWZhdWx0ICk7CisgICAgfQorCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIGlmICggISBUQ1JfNChfX2ttcF9pbml0X21pZGRsZSkgKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIERldGVybWluZSBpZiB0aGUgbWFjaGluZS9PUyBpcyBhY3R1YWxseSBjYXBhYmxlIG9mIHN1cHBvcnRpbmcKKyAgICAgICAgLy8gYWZmaW5pdHkuCisgICAgICAgIC8vCisgICAgICAgIGNvbnN0IGNoYXIgKnZhciA9ICJLTVBfQUZGSU5JVFkiOworICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfZGlzYWJsZWQgKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbl9tYXNrX3NpemUgPSAwOyAgLy8gc2hvdWxkIGFscmVhZHkgYmUgMAorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCAhIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkgKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZSggdmFyICk7CisgICAgICAgICAgICBpZiAoICEgS01QX0FGRklOSVRZX0NBUEFCTEUoKSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgKCBfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICAgICAgICAgJiYgKCBfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X2RlZmF1bHQgKQorICAgICAgICAgICAgICAgICAgJiYgKCBfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUgKQorICAgICAgICAgICAgICAgICAgJiYgKCBfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X2Rpc2FibGVkICkgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZk5vdFN1cHBvcnRlZCwgdmFyICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9kaXNhYmxlZDsKKyAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2sgPSAwOworICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2ZpbmU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworIyBpZiBPTVBfNDBfRU5BQkxFRAorCisgICAgICAgIGlmICggX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9kaXNhYmxlZCApICB7CisgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfZGlzYWJsZWQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9PSBwcm9jX2JpbmRfZGVmYXVsdCApIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBXaGVyZSBzdXBwb3J0ZWQgdGhlIGRlZmF1bHQgaXMgdG8gdXNlIHRoZSBLTVBfQUZGSU5JVFkKKyAgICAgICAgICAgIC8vIG1lY2hhbmlzbS4gIE9uIE9TIFgqIGV0Yy4gaXQgaXMgbm9uZS4KKyAgICAgICAgICAgIC8vCisjICBpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfaW50ZWw7CisjICBlbHNlCisgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfZmFsc2U7CisjICBlbmRpZgorICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gSWYgT01QX1BST0NfQklORCB3YXMgc3BlY2lmaWVkIChzbyB3ZSBhcmUgdXNpbmcgT3Blbk1QIDQuMCBhZmZpbml0eSkKKyAgICAgICAgLy8gYnV0IE9NUF9QTEFDRVMgd2FzIG5vdCwgdGhlbiBpdCBkZWZhdWx0cyB0byB0aGUgZXF1aXZhbGVudCBvZgorICAgICAgICAvLyBLTVBfQUZGSU5JVFk9Y29tcGFjdCxub2R1cGxpY2F0ZXMsZ3JhbnVsYXJpdHk9ZmluZS4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPT0gcHJvY19iaW5kX2ludGVsICkgeworICAgICAgICAgICAgaWYgKCAoIF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSApCisjICBpZiAhIEtNUF9NSUMKKyAgICAgICAgICAgICAgfHwgKCBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X2RlZmF1bHQgKQorIyAgZW5kaWYKKyAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdICE9IHByb2NfYmluZF9mYWxzZSApCisgICAgICAgICAgJiYgKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gIT0gcHJvY19iaW5kX2Rpc2FibGVkICkgKSB7CisgICAgICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfZGVmYXVsdCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfY29tcGFjdDsKKyAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9kdXBzID0gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9kZWZhdWx0ICkgeworICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2ZpbmU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyMgZW5kaWYgLy8gIE9NUF80MF9FTkFCTEVECisKKyAgICAgICAgaWYgKCBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpICkgeworCisjIGlmIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4Nl82NAorCisgICAgICAgICAgICBpZiAoIF9fa21wX251bV9wcm9jX2dyb3VwcyA+IDEgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2sgPT0gYWZmaW5pdHlfcmVzcGVjdF9tYXNrX2RlZmF1bHQgKSB7CisgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrID0gRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCAoIF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfZGVmYXVsdCApCisgICAgICAgICAgICAgICAgICB8fCAoIF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSApICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCAoIF9fa21wX2FmZmluaXR5X3dhcm5pbmdzCisgICAgICAgICAgICAgICAgICAgICAgICAgICYmICggX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9ub25lICkgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmVHlwZUNhbnRVc2VNdWx0R3JvdXBzLCAibm9uZSIsICJjb21wYWN0IiApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9jb21wYWN0OworICAgICAgICAgICAgICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPT0gYWZmaW5pdHlfdG9wX21ldGhvZF9kZWZhdWx0ICkgeworICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID0gYWZmaW5pdHlfdG9wX21ldGhvZF9ncm91cDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9PSBhZmZpbml0eV90b3BfbWV0aG9kX2RlZmF1bHQgKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPSBhZmZpbml0eV90b3BfbWV0aG9kX2FsbDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzIDwgMCApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID09IGFmZmluaXR5X3RvcF9tZXRob2RfZ3JvdXAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9kZWZhdWx0ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fZ3JvdXA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX2NvcmUgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8ICggX19rbXBfYWZmaW5pdHlfd2FybmluZ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICggX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9ub25lICkgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZkdyYW5DYW50VXNlTXVsdEdyb3VwcywgImNvcmUiLCAidGhyZWFkIiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl90aHJlYWQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX3BhY2thZ2UgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8ICggX19rbXBfYWZmaW5pdHlfd2FybmluZ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICggX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9ub25lICkgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZkdyYW5DYW50VXNlTXVsdEdyb3VwcywgInBhY2thZ2UiLCAiZ3JvdXAiICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fZ3JvdXA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX25vZGUgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8ICggX19rbXBfYWZmaW5pdHlfd2FybmluZ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICggX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9ub25lICkgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZkdyYW5DYW50VXNlTXVsdEdyb3VwcywgIm5vZGUiLCAiZ3JvdXAiICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fZ3JvdXA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9kZWZhdWx0ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fY29yZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKworIyBlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAmJiBLTVBfQVJDSF9YODZfNjQgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzayA9PSBhZmZpbml0eV9yZXNwZWN0X21hc2tfZGVmYXVsdCApIHsKKyAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2sgPSBUUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfZGVmYXVsdCApIHsKKyMgaWYgS01QX01JQworICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9zY2F0dGVyOworIyBlbHNlCisgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X25vbmU7CisjIGVuZGlmCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICggKCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fZGVmYXVsdCApCisgICAgICAgICAgICAgICAgICAmJiAgKCBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA8IDAgKSApIHsKKyMgaWYgS01QX01JQworICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2ZpbmU7CisjIGVsc2UKKyAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9jb3JlOworIyBlbmRpZgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPT0gYWZmaW5pdHlfdG9wX21ldGhvZF9kZWZhdWx0ICkgeworICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPSBhZmZpbml0eV90b3BfbWV0aG9kX2FsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBLX0RJQUcoIDEsICggIl9fa21wX2FmZmluaXR5X3R5cGUgICAgICAgICA9PSAlZFxuIiwgX19rbXBfYWZmaW5pdHlfdHlwZSAgICAgICAgICkgKTsKKyAgICAgICAgS19ESUFHKCAxLCAoICJfX2ttcF9hZmZpbml0eV9jb21wYWN0ICAgICAgPT0gJWRcbiIsIF9fa21wX2FmZmluaXR5X2NvbXBhY3QgICAgICApICk7CisgICAgICAgIEtfRElBRyggMSwgKCAiX19rbXBfYWZmaW5pdHlfb2Zmc2V0ICAgICAgID09ICVkXG4iLCBfX2ttcF9hZmZpbml0eV9vZmZzZXQgICAgICAgKSApOworICAgICAgICBLX0RJQUcoIDEsICggIl9fa21wX2FmZmluaXR5X3ZlcmJvc2UgICAgICA9PSAlZFxuIiwgX19rbXBfYWZmaW5pdHlfdmVyYm9zZSAgICAgICkgKTsKKyAgICAgICAgS19ESUFHKCAxLCAoICJfX2ttcF9hZmZpbml0eV93YXJuaW5ncyAgICAgPT0gJWRcbiIsIF9fa21wX2FmZmluaXR5X3dhcm5pbmdzICAgICApICk7CisgICAgICAgIEtfRElBRyggMSwgKCAiX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrID09ICVkXG4iLCBfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2sgKSApOworICAgICAgICBLX0RJQUcoIDEsICggIl9fa21wX2FmZmluaXR5X2dyYW4gICAgICAgICA9PSAlZFxuIiwgX19rbXBfYWZmaW5pdHlfZ3JhbiAgICAgICAgICkgKTsKKworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X2RlZmF1bHQpOworIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0KKyAgICAgICAgICAhPSBwcm9jX2JpbmRfZGVmYXVsdCApOworIyBlbmRpZgorICAgIH0KKworI2VuZGlmIC8qIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgKi8KKworICAgIGlmICggX19rbXBfdmVyc2lvbiApIHsKKyAgICAgICAgX19rbXBfcHJpbnRfdmVyc2lvbl8xKCk7CisgICAgfTsgLy8gaWYKKworICAgIC8vIFBvc3QtaW5pdGlhbGl6YXRpb24gc3RlcDogc29tZSBlbnYuIHZhcnMgbmVlZCB0aGVpciB2YWx1ZSdzIGZ1cnRoZXIgcHJvY2Vzc2luZworICAgIGlmICggc3RyaW5nICE9IE5VTEwpIHsgLy8ga21wX3NldF9kZWZhdWx0cygpIHdhcyBjYWxsZWQKKyAgICAgICAgX19rbXBfYXV4X2Vudl9pbml0aWFsaXplKCAmYmxvY2sgKTsKKyAgICB9CisKKyAgICBfX2ttcF9lbnZfYmxrX2ZyZWUoICYgYmxvY2sgKTsKKworICAgIEtNUF9NQigpOworCit9IC8vIF9fa21wX2Vudl9pbml0aWFsaXplCisKKwordm9pZAorX19rbXBfZW52X3ByaW50KCkgeworCisgICAga21wX2Vudl9ibGtfdCBibG9jazsKKyAgICBpbnQgICAgICAgICAgIGk7CisgICAga21wX3N0cl9idWZfdCBidWZmZXI7CisKKyAgICBfX2ttcF9zdGdfaW5pdCgpOworICAgIF9fa21wX3N0cl9idWZfaW5pdCggJiBidWZmZXIgKTsKKworICAgIF9fa21wX2Vudl9ibGtfaW5pdCggJiBibG9jaywgTlVMTCApOworICAgIF9fa21wX2Vudl9ibGtfc29ydCggJiBibG9jayApOworCisgICAgLy8gUHJpbnQgcmVhbCBlbnZpcm9ubWVudCB2YWx1ZXMuCisgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICJcbiVzXG5cbiIsIEtNUF9JMThOX1NUUiggVXNlclNldHRpbmdzICkgICk7CisgICAgZm9yICggaSA9IDA7IGkgPCBibG9jay5jb3VudDsgKysgaSApIHsKKyAgICAgICAgY2hhciBjb25zdCAqIG5hbWUgID0gYmxvY2sudmFyc1sgaSBdLm5hbWU7CisgICAgICAgIGNoYXIgY29uc3QgKiB2YWx1ZSA9IGJsb2NrLnZhcnNbIGkgXS52YWx1ZTsKKyAgICAgICAgaWYgKAorICAgICAgICAgICAgc3RybGVuKCBuYW1lICkgPiA0CisgICAgICAgICAgICAmJgorICAgICAgICAgICAgKCBzdHJuY21wKCBuYW1lLCAiS01QXyIsIDQgKSA9PSAwICkgfHwgc3RybmNtcCggbmFtZSwgIk9NUF8iLCA0ICkgPT0gMAorICAgICAgICAgICAgI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgICAgICAgICAgICAgIHx8IHN0cm5jbXAoIG5hbWUsICJHT01QXyIsIDUgKSA9PSAwCisgICAgICAgICAgICAjZW5kaWYgLy8gS01QX0dPTVBfQ09NUEFUCisgICAgICAgICkgeworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIgICAlcz0lc1xuIiwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBmb3IKKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIlxuIiApOworCisgICAgLy8gUHJpbnQgaW50ZXJuYWwgKGVmZmVjdGl2ZSkgc2V0dGluZ3MuCisgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIlc1xuXG4iLCBLTVBfSTE4Tl9TVFIoIEVmZmVjdGl2ZVNldHRpbmdzICkgKTsKKyAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBfX2ttcF9zdGdfY291bnQ7ICsrIGkgKSB7CisgICAgICAgIGlmICggIF9fa21wX3N0Z190YWJsZVsgaSBdLnByaW50ICE9IE5VTEwgKSB7CisgICAgICAgICAgICBfX2ttcF9zdGdfdGFibGVbIGkgXS5wcmludCggJiBidWZmZXIsIF9fa21wX3N0Z190YWJsZVsgaSBdLm5hbWUsIF9fa21wX3N0Z190YWJsZVsgaSBdLmRhdGEgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBmb3IKKworICAgIF9fa21wX3ByaW50ZiggIiVzIiwgYnVmZmVyLnN0ciApOworCisgICAgX19rbXBfZW52X2Jsa19mcmVlKCAmIGJsb2NrICk7CisgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIGJ1ZmZlciApOworCisgICAgX19rbXBfcHJpbnRmKCJcbiIpOworCit9IC8vIF9fa21wX2Vudl9wcmludAorCisKKyNpZiBPTVBfNDBfRU5BQkxFRAordm9pZAorX19rbXBfZW52X3ByaW50XzIoKSB7CisKKyAgICBrbXBfZW52X2Jsa190IGJsb2NrOworICAgIGludCAgICAgICAgICAgaTsKKyAgICBrbXBfc3RyX2J1Zl90IGJ1ZmZlcjsKKworICAgIF9fa21wX2Vudl9mb3JtYXQgPSAxOworCisgICAgX19rbXBfc3RnX2luaXQoKTsKKyAgICBfX2ttcF9zdHJfYnVmX2luaXQoICYgYnVmZmVyICk7CisKKyAgICBfX2ttcF9lbnZfYmxrX2luaXQoICYgYmxvY2ssIE5VTEwgKTsKKyAgICBfX2ttcF9lbnZfYmxrX3NvcnQoICYgYmxvY2sgKTsKKworICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiXG4lc1xuIiwgS01QX0kxOE5fU1RSKCBEaXNwbGF5RW52QmVnaW4gKSAgKTsKKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIiAgIF9PUEVOTVA9JyVkJ1xuIiwgX19rbXBfb3Blbm1wX3ZlcnNpb24gKTsKKworICAgIGZvciAoIGludCBpID0gMDsgaSA8IF9fa21wX3N0Z19jb3VudDsgKysgaSApIHsKKyAgICAgICAgaWYgKCAgX19rbXBfc3RnX3RhYmxlWyBpIF0ucHJpbnQgIT0gTlVMTCAmJgorICAgICAgICAgICAgICAoICggX19rbXBfZGlzcGxheV9lbnYgJiYgc3RybmNtcCggX19rbXBfc3RnX3RhYmxlWyBpIF0ubmFtZSwgIk9NUF8iLCA0ICkgPT0gMCApIHx8IF9fa21wX2Rpc3BsYXlfZW52X3ZlcmJvc2UgKSApIHsKKyAgICAgICAgICAgIF9fa21wX3N0Z190YWJsZVsgaSBdLnByaW50KCAmIGJ1ZmZlciwgX19rbXBfc3RnX3RhYmxlWyBpIF0ubmFtZSwgX19rbXBfc3RnX3RhYmxlWyBpIF0uZGF0YSApOworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGZvcgorCisgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIlc1xuIiwgS01QX0kxOE5fU1RSKCBEaXNwbGF5RW52RW5kICkgICk7CisgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICJcbiIgKTsKKworICAgIF9fa21wX3ByaW50ZiggIiVzIiwgYnVmZmVyLnN0ciApOworCisgICAgX19rbXBfZW52X2Jsa19mcmVlKCAmIGJsb2NrICk7CisgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIGJ1ZmZlciApOworCisgICAgX19rbXBfcHJpbnRmKCJcbiIpOworCit9IC8vIF9fa21wX2Vudl9wcmludF8yCisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKworCisKKy8vIGVuZCBvZiBmaWxlCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zZXR0aW5ncy5oIGIvZmluYWwvcnVudGltZS9zcmMva21wX3NldHRpbmdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJkZGMxZAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zZXR0aW5ncy5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBrbXBfc2V0dGluZ3MuaCAtLSBJbml0aWFsaXplIGVudmlyb25tZW50IHZhcmlhYmxlcworICogJFJldmlzaW9uOiA0MjU5OCAkCisgKiAkRGF0ZTogMjAxMy0wOC0xOSAxNTo0MDo1NiAtMDUwMCAoTW9uLCAxOSBBdWcgMjAxMykgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIEtNUF9TRVRUSU5HU19ICisjZGVmaW5lIEtNUF9TRVRUSU5HU19ICisKK3ZvaWQgX19rbXBfcmVzZXRfZ2xvYmFsX3ZhcnMoIHZvaWQgKTsKK3ZvaWQgX19rbXBfZW52X2luaXRpYWxpemUoIGNoYXIgY29uc3QgKiApOwordm9pZCBfX2ttcF9lbnZfcHJpbnQoKTsKKyNpZiBPTVBfNDBfRU5BQkxFRAordm9pZCBfX2ttcF9lbnZfcHJpbnRfMigpOworI2VuZGlmIC8vIE9NUF80MF9FTkFCTEVECisKK2ludCBfX2ttcF9pbml0aWFsX3RocmVhZHNfY2FwYWNpdHkoIGludCByZXFfbnByb2MgKTsKK3ZvaWQgX19rbXBfaW5pdF9kZmx0X3RlYW1fbnRoKCk7CitpbnQgX19rbXBfY29udmVydF90b19taWxsaXNlY29uZHMoIGNoYXIgY29uc3QgKiApOworaW50IF9fa21wX2RlZmF1bHRfdHBfY2FwYWNpdHkoIGludCwgaW50LCBpbnQpOworCisjaWYgS01QX01JQworI2RlZmluZSBLTVBfU1RSX0JVRl9QUklOVF9OQU1FICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgJXMgJXMiLCBLTVBfSTE4Tl9TVFIoRGV2aWNlKSwgbmFtZSApCisjZGVmaW5lIEtNUF9TVFJfQlVGX1BSSU5UX05BTUVfRVgoeCkgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAlcyAlcz0nIiwgS01QX0kxOE5fU1RSKERldmljZSksIHggKQorI2RlZmluZSBLTVBfU1RSX0JVRl9QUklOVF9CT09MICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgJXMgJXM9JyVzJ1xuIiwgS01QX0kxOE5fU1RSKERldmljZSksIG5hbWUsIHZhbHVlID8gIlRSVUUiIDogIkZBTFNFIiApOworI2RlZmluZSBLTVBfU1RSX0JVRl9QUklOVF9JTlQgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgJXMgJXM9JyVkJ1xuIiwgS01QX0kxOE5fU1RSKERldmljZSksIG5hbWUsIHZhbHVlICkKKyNkZWZpbmUgS01QX1NUUl9CVUZfUFJJTlRfVUlOVDY0ICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICVzICVzPSclIiBLTVBfVUlOVDY0X1NQRUMgIidcbiIsIEtNUF9JMThOX1NUUihEZXZpY2UpLCBuYW1lLCB2YWx1ZSApOworI2RlZmluZSBLTVBfU1RSX0JVRl9QUklOVF9TVFIgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgJXMgJXM9JyVzJ1xuIiwgS01QX0kxOE5fU1RSKERldmljZSksIG5hbWUsIHZhbHVlICkKKyNlbHNlCisjZGVmaW5lIEtNUF9TVFJfQlVGX1BSSU5UX05BTUUgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAlcyAlcyIsIEtNUF9JMThOX1NUUihIb3N0KSwgbmFtZSApCisjZGVmaW5lIEtNUF9TVFJfQlVGX1BSSU5UX05BTUVfRVgoeCkgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAlcyAlcz0nIiwgS01QX0kxOE5fU1RSKEhvc3QpLCB4ICkKKyNkZWZpbmUgS01QX1NUUl9CVUZfUFJJTlRfQk9PTCAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICVzICVzPSclcydcbiIsIEtNUF9JMThOX1NUUihIb3N0KSwgbmFtZSwgdmFsdWUgPyAiVFJVRSIgOiAiRkFMU0UiICk7CisjZGVmaW5lIEtNUF9TVFJfQlVGX1BSSU5UX0lOVCAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAlcyAlcz0nJWQnXG4iLCBLTVBfSTE4Tl9TVFIoSG9zdCksIG5hbWUsIHZhbHVlICkKKyNkZWZpbmUgS01QX1NUUl9CVUZfUFJJTlRfVUlOVDY0ICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICVzICVzPSclIiBLTVBfVUlOVDY0X1NQRUMgIidcbiIsIEtNUF9JMThOX1NUUihIb3N0KSwgbmFtZSwgdmFsdWUgKTsKKyNkZWZpbmUgS01QX1NUUl9CVUZfUFJJTlRfU1RSICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICVzICVzPSclcydcbiIsIEtNUF9JMThOX1NUUihIb3N0KSwgbmFtZSwgdmFsdWUgKQorI2VuZGlmCisKKyNlbmRpZiAvLyBLTVBfU0VUVElOR1NfSAorCisvLyBlbmQgb2YgZmlsZSAvLworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfc3RyLmMgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfc3RyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMwNDY5ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zdHIuYwpAQCAtMCwwICsxLDg4NyBAQAorLyoKKyAqIGttcF9zdHIuYyAtLSBTdHJpbmcgbWFuaXB1bGF0aW9uIHJvdXRpbmVzLgorICogJFJldmlzaW9uOiA0MjgxMCAkCisgKiAkRGF0ZTogMjAxMy0xMS0wNyAxMjowNjozMyAtMDYwMCAoVGh1LCAwNyBOb3YgMjAxMykgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wX3N0ci5oIgorCisjaW5jbHVkZSA8c3RkYXJnLmg+ICAgIC8vIHZhXyoKKyNpbmNsdWRlIDxzdGRpby5oPiAgICAgLy8gdnNucHJpbnRmKCkKKyNpbmNsdWRlIDxzdGRsaWIuaD4gICAgLy8gbWFsbG9jKCksIHJlYWxsb2MoKQorCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKworLyoKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTdHJpbmcgYnVmZmVyLgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVXNhZ2U6CisKKyAgICAgICAgLy8gRGVjbGFyZSBidWZmZXIgYW5kIGluaXRpYWxpemUgaXQuCisgICAgICAgIGttcF9zdHJfYnVmX3QgIGJ1ZmZlcjsKKwlfX2ttcF9zdHJfYnVmX2luaXQoICYgYnVmZmVyICk7CisKKyAgICAgICAgLy8gUHJpbnQgdG8gYnVmZmVyLgorICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIkVycm9yIGluIGZpbGUgXCIlc1wiIGxpbmUgJWRcbiIsICJmb28uYyIsIDEyICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiICAgIDwlcz5cbiIsIGxpbmUgKTsKKworICAgICAgICAvLyBVc2UgYnVmZmVyIGNvbnRlbnRzLiBidWZmZXIuc3RyIGlzIGEgcG9pbnRlciB0byBkYXRhLCBidWZmZXIudXNlZCBpcyBhIG51bWJlciBvZiBwcmludGVkCisgICAgICAgIC8vIGNoYXJhY3RlcnMgKG5vdCBpbmNsdWRpbmcgdGVybWluYXRpbmcgemVybykuCisgICAgICAgIHdyaXRlKCBmZCwgYnVmZmVyLnN0ciwgYnVmZmVyLnVzZWQgKTsKKworICAgICAgICAvLyBGcmVlIGJ1ZmZlci4KKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIGJ1ZmZlciApOworCisgICAgICAgIC8vIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gZGV0YWNoIGFsbG9jYXRlZCBtZW1vcnkgZnJvbSBidWZmZXI6CisgICAgICAgIF9fa21wX3N0cl9idWZfZGV0YWNoKCAmIGJ1ZmZlciApOworICAgICAgICByZXR1cm4gYnVmZmVyLnN0cjsgICAgLy8gVGhhdCBtZW1vcnkgc2hvdWxkIGJlIGZyZWVkIGV2ZW50dWFsbHkuCisKKworICAgIE5vdGVzOgorCisgICAgICAgICogQnVmZmVyIHVzZXJzIG1heSB1c2UgYnVmZmVyLnN0ciBhbmQgYnVmZmVyLnVzZWQuIFVzZXJzIHNob3VsZCBub3QgY2hhbmdlIGFueSBmaWVsZHMgb2YKKyAgICAgICAgICBidWZmZXIgZGlyZWN0bHkuCisKKyAgICAgICAgKiBidWZmZXIuc3RyIGlzIG5ldmVyIE5VTEwuIElmIGJ1ZmZlciBpcyBlbXB0eSwgYnVmZmVyLnN0ciBwb2ludHMgdG8gZW1wdHkgc3RyaW5nICgiIikuCisKKyAgICAgICAgKiBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgYnVmZmVyIHVzZXMgc3RhY2sgbWVtb3J5IChidWZmZXIuYnVsaykgZmlyc3QuIElmIHN0YWNrIG1lbW9yeSBpcworICAgICAgICAgIGV4aGF1c3RlZCwgYnVmZmVyIGFsbG9jYXRlcyBtZW1vcnkgb24gaGVhcCBieSBtYWxsb2MoKSwgYW5kIHJlYWxsb2NhdGVzIGl0IGJ5IHJlYWxsb2MoKQorICAgICAgICAgIGFzIGFtb3VudCBvZiB1c2VkIG1lbW9yeSBncm93cy4KKworICAgICAgICAqIEJ1ZmZlciBkb3VibGVzIGFtb3VudCBvZiBhbGxvY2F0ZWQgbWVtb3J5IGVhY2ggdGltZSBpdCBpcyBleGhhdXN0ZWQuCisKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKy8vIFRPRE86IF9fa21wX3N0cl9idWZfcHJpbnQoKSBjYW4gdXNlIHRocmVhZCBsb2NhbCBtZW1vcnkgYWxsb2NhdG9yLgorCisjZGVmaW5lIEtNUF9TVFJfQlVGX0lOVkFSSUFOVCggYiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAoYiktPnN0ciAhPSBOVUxMICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIChiKS0+c2l6ZSA+PSBzaXplb2YoIChiKS0+YnVsayApICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKGIpLT5zaXplICUgc2l6ZW9mKCAoYiktPmJ1bGsgKSA9PSAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAodW5zaWduZWQpKGIpLT51c2VkIDwgKGIpLT5zaXplICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIChiKS0+c2l6ZSA9PSBzaXplb2YoIChiKS0+YnVsayApID8gKGIpLT5zdHIgPT0gJiAoYiktPmJ1bGtbIDAgXSA6IDEgKTsgIFwKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKGIpLT5zaXplID4gc2l6ZW9mKCAoYiktPmJ1bGsgKSA/IChiKS0+c3RyICE9ICYgKGIpLT5idWxrWyAwIF0gOiAxICk7ICAgXAorICAgIH0KKwordm9pZAorIF9fa21wX3N0cl9idWZfY2xlYXIoCisgICAgIGttcF9zdHJfYnVmX3QgKiBidWZmZXIKKykgeworICAgIEtNUF9TVFJfQlVGX0lOVkFSSUFOVCggYnVmZmVyICk7CisgICAgaWYgKCBidWZmZXItPnVzZWQgPiAwICkgeworICAgICAgICBidWZmZXItPnVzZWQgPSAwOworICAgICAgICBidWZmZXItPnN0clsgMCBdID0gMDsKKyAgICB9OyAvLyBpZgorICAgIEtNUF9TVFJfQlVGX0lOVkFSSUFOVCggYnVmZmVyICk7Cit9IC8vIF9fa21wX3N0cl9idWZfY2xlYXIKKworCit2b2lkCitfX2ttcF9zdHJfYnVmX3Jlc2VydmUoCisgICAga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwKKyAgICBpbnQgICAgICAgICAgICAgc2l6ZQorKSB7CisKKyAgICBLTVBfU1RSX0JVRl9JTlZBUklBTlQoIGJ1ZmZlciApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHNpemUgPj0gMCApOworCisgICAgaWYgKCBidWZmZXItPnNpemUgPCAodW5zaWduZWQgaW50KXNpemUgKSB7CisKKyAgICAgICAgLy8gQ2FsY3VsYXRlIGJ1ZmZlciBzaXplLgorICAgICAgICBkbyB7CisgICAgICAgICAgICBidWZmZXItPnNpemUgKj0gMjsKKyAgICAgICAgfSB3aGlsZSAoIGJ1ZmZlci0+c2l6ZSA8ICh1bnNpZ25lZCBpbnQpc2l6ZSApOworCisgICAgICAgIC8vIEVubGFyZ2UgYnVmZmVyLgorICAgICAgICBpZiAoIGJ1ZmZlci0+c3RyID09ICYgYnVmZmVyLT5idWxrWyAwIF0gKSB7CisgICAgICAgICAgICBidWZmZXItPnN0ciA9IChjaGFyICopIEtNUF9JTlRFUk5BTF9NQUxMT0MoIGJ1ZmZlci0+c2l6ZSApOworICAgICAgICAgICAgaWYgKCBidWZmZXItPnN0ciA9PSBOVUxMICkgeworCQlLTVBfRkFUQUwoIE1lbW9yeUFsbG9jRmFpbGVkICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgbWVtY3B5KCBidWZmZXItPnN0ciwgYnVmZmVyLT5idWxrLCBidWZmZXItPnVzZWQgKyAxICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBidWZmZXItPnN0ciA9IChjaGFyICopIEtNUF9JTlRFUk5BTF9SRUFMTE9DKCBidWZmZXItPnN0ciwgYnVmZmVyLT5zaXplICk7CisgICAgICAgICAgICBpZiAoIGJ1ZmZlci0+c3RyID09IE5VTEwgKSB7CisJCUtNUF9GQVRBTCggTWVtb3J5QWxsb2NGYWlsZWQgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH07IC8vIGlmCisKKyAgICB9OyAvLyBpZgorCisgICAgS01QX0RFQlVHX0FTU0VSVCggYnVmZmVyLT5zaXplID4gMCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGJ1ZmZlci0+c2l6ZSA+PSAodW5zaWduZWQpc2l6ZSApOworICAgIEtNUF9TVFJfQlVGX0lOVkFSSUFOVCggYnVmZmVyICk7CisKK30gLy8gX19rbXBfc3RyX2J1Zl9yZXNlcnZlCisKKwordm9pZAorX19rbXBfc3RyX2J1Zl9kZXRhY2goCisgICAga21wX3N0cl9idWZfdCAqICBidWZmZXIKKykgeworCisgICAgS01QX1NUUl9CVUZfSU5WQVJJQU5UKCBidWZmZXIgKTsKKworICAgIC8vIElmIGludGVybmFsIGJ1bGsgaXMgdXNlZCwgYWxsb2NhdGUgbWVtb3J5IGFuZCBjb3B5IGl0LgorICAgIGlmICggYnVmZmVyLT5zaXplIDw9IHNpemVvZiggYnVmZmVyLT5idWxrICkgKSB7CisgICAgICAgIGJ1ZmZlci0+c3RyID0gKGNoYXIgKikgS01QX0lOVEVSTkFMX01BTExPQyggYnVmZmVyLT5zaXplICk7CisgICAgICAgIGlmICggYnVmZmVyLT5zdHIgPT0gTlVMTCApIHsKKwkJS01QX0ZBVEFMKCBNZW1vcnlBbGxvY0ZhaWxlZCApOworICAgICAgICB9OyAvLyBpZgorICAgICAgICBtZW1jcHkoIGJ1ZmZlci0+c3RyLCBidWZmZXItPmJ1bGssIGJ1ZmZlci0+dXNlZCArIDEgKTsKKyAgICB9OyAvLyBpZgorCit9IC8vIF9fa21wX3N0cl9idWZfZGV0YWNoCisKKwordm9pZAorX19rbXBfc3RyX2J1Zl9mcmVlKAorICAgIGttcF9zdHJfYnVmX3QgKiBidWZmZXIKKykgeworICAgIEtNUF9TVFJfQlVGX0lOVkFSSUFOVCggYnVmZmVyICk7CisgICAgaWYgKCBidWZmZXItPnNpemUgPiBzaXplb2YoIGJ1ZmZlci0+YnVsayApICkgeworICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSggYnVmZmVyLT5zdHIgKTsKKyAgICB9OyAvLyBpZgorICAgIGJ1ZmZlci0+c3RyICA9IGJ1ZmZlci0+YnVsazsKKyAgICBidWZmZXItPnNpemUgPSBzaXplb2YoIGJ1ZmZlci0+YnVsayApOworICAgIGJ1ZmZlci0+dXNlZCA9IDA7CisgICAgS01QX1NUUl9CVUZfSU5WQVJJQU5UKCBidWZmZXIgKTsKK30gLy8gX19rbXBfc3RyX2J1Zl9mcmVlCisKKwordm9pZAorX19rbXBfc3RyX2J1Zl9jYXQoCisgICAga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwKKyAgICBjaGFyIGNvbnN0ICogICAgc3RyLAorICAgIGludCAgICAgICAgICAgICBsZW4KKykgeworICAgIEtNUF9TVFJfQlVGX0lOVkFSSUFOVCggYnVmZmVyICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggc3RyICE9IE5VTEwgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBsZW4gPj0gMCApOworICAgIF9fa21wX3N0cl9idWZfcmVzZXJ2ZSggYnVmZmVyLCBidWZmZXItPnVzZWQgKyBsZW4gKyAxICk7CisgICAgbWVtY3B5KCBidWZmZXItPnN0ciArIGJ1ZmZlci0+dXNlZCwgc3RyLCBsZW4gKTsKKyAgICBidWZmZXItPnN0clsgYnVmZmVyLT51c2VkICsgbGVuIF0gPSAwOworICAgIGJ1ZmZlci0+dXNlZCArPSBsZW47CisgICAgS01QX1NUUl9CVUZfSU5WQVJJQU5UKCBidWZmZXIgKTsKK30gLy8gX19rbXBfc3RyX2J1Zl9jYXQKKworCit2b2lkCitfX2ttcF9zdHJfYnVmX3ZwcmludCgKKyAgICBrbXBfc3RyX2J1Zl90ICogIGJ1ZmZlciwKKyAgICBjaGFyIGNvbnN0ICogICAgIGZvcm1hdCwKKyAgICB2YV9saXN0ICAgICAgICAgIGFyZ3MKKykgeworCisgICAgS01QX1NUUl9CVUZfSU5WQVJJQU5UKCBidWZmZXIgKTsKKworICAgIGZvciAoIDsgOyApIHsKKworICAgICAgICBpbnQgY29uc3QgZnJlZSA9IGJ1ZmZlci0+c2l6ZSAtIGJ1ZmZlci0+dXNlZDsKKyAgICAgICAgaW50ICAgICAgIHJjOworICAgICAgICBpbnQgICAgICAgc2l6ZTsKKworICAgICAgICAvLyBUcnkgdG8gZm9ybWF0IHN0cmluZy4KKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICBPbiBMaW51eCogT1MgSW50ZWwoUikgNjQsIHZzbnByaW50ZigpIG1vZGlmaWVzIGFyZ3MgYXJndW1lbnQsIHNvIHZzbnByaW50ZigpIGNyYXNoZXMgaWYgaXQKKyAgICAgICAgICAgICAgICBpcyBjYWxsZWQgZm9yIHRoZSBzZWNvbmQgdGltZSB3aXRoIHRoZSBzYW1lIGFyZ3MuIFRvIHByZXZlbnQgdGhlIGNyYXNoLCB3ZSBoYXZlIHRvCisgICAgICAgICAgICAgICAgcGFzcyBhIGZyZXNoIGludGFjdCBjb3B5IG9mIGFyZ3MgdG8gdnNucHJpbnRmKCkgb24gZWFjaCBpdGVyYXRpb24uCisKKyAgICAgICAgICAgICAgICBVbmZvcnR1bmF0ZWx5LCBzdGFuZGFyZCB2YV9jb3B5KCkgbWFjcm8gaXMgbm90IGF2YWlsYWJsZSBvbiBXaW5kb3dzKiBPUy4gSG93ZXZlciwgaXQKKyAgICAgICAgICAgICAgICBzZWVtcyB2c25wcmludGYoKSBkb2VzIG5vdCBtb2RpZnkgYXJncyBhcmd1bWVudCBvbiBXaW5kb3dzKiBPUy4KKyAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICNpZiAhIEtNUF9PU19XSU5ET1dTCisgICAgICAgICAgICAgICAgdmFfbGlzdCBfYXJnczsKKyAgICAgICAgICAgICAgICBfX3ZhX2NvcHkoIF9hcmdzLCBhcmdzICk7ICAvLyBNYWtlIGNvcHkgb2YgYXJncy4KKyAgICAgICAgICAgICAgICAjZGVmaW5lIGFyZ3MgX2FyZ3MgICAgICAgICAvLyBTdWJzdGl0dXRlIGFyZ3Mgd2l0aCBpdHMgY29weSwgX2FyZ3MuCisgICAgICAgICAgICAjZW5kaWYgLy8gS01QX09TX1dJTkRPV1MKKyAgICAgICAgICAgIHJjID0gdnNucHJpbnRmKCBidWZmZXItPnN0ciArIGJ1ZmZlci0+dXNlZCwgZnJlZSwgZm9ybWF0LCBhcmdzICk7CisgICAgICAgICAgICAjaWYgISBLTVBfT1NfV0lORE9XUworICAgICAgICAgICAgICAgICN1bmRlZiBhcmdzICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBzdWJzdGl0dXRpb24uCisgICAgICAgICAgICAgICAgdmFfZW5kKCBfYXJncyApOworICAgICAgICAgICAgI2VuZGlmIC8vIEtNUF9PU19XSU5ET1dTCisgICAgICAgIH0KKworICAgICAgICAvLyBObyBlcnJvcnMsIHN0cmluZyBoYXMgYmVlbiBmb3JtYXR0ZWQuCisgICAgICAgIGlmICggcmMgPj0gMCAmJiByYyA8IGZyZWUgKSB7CisgICAgICAgICAgICBidWZmZXItPnVzZWQgKz0gcmM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfTsgLy8gaWYKKworICAgICAgICAvLyBFcnJvciBvY2N1cnJlZCwgYnVmZmVyIGlzIHRvbyBzbWFsbC4KKyAgICAgICAgaWYgKCByYyA+PSAwICkgeworICAgICAgICAgICAgLy8gQzk5LWNvbmZvcm1pbmcgaW1wbGVtZW50YXRpb24gb2YgdnNucHJpbnRmIHJldHVybnMgcmVxdWlyZWQgYnVmZmVyIHNpemUuCisgICAgICAgICAgICBzaXplID0gYnVmZmVyLT51c2VkICsgcmMgKyAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gT2xkZXIgaW1wbGVtZW50YXRpb25zIGp1c3QgcmV0dXJuIC0xLiBEb3VibGUgYnVmZmVyIHNpemUuCisgICAgICAgICAgICBzaXplID0gYnVmZmVyLT5zaXplICogMjsKKyAgICAgICAgfTsgLy8gaWYKKworICAgICAgICAvLyBFbmxhcmdlIGJ1ZmZlci4KKyAgICAgICAgX19rbXBfc3RyX2J1Zl9yZXNlcnZlKCBidWZmZXIsIHNpemUgKTsKKworICAgICAgICAvLyBBbmQgdHJ5IGFnYWluLgorCisgICAgfTsgLy8gZm9yZXZlcgorCisgICAgS01QX0RFQlVHX0FTU0VSVCggYnVmZmVyLT5zaXplID4gMCApOworICAgIEtNUF9TVFJfQlVGX0lOVkFSSUFOVCggYnVmZmVyICk7CisKK30gLy8gX19rbXBfc3RyX2J1Zl92cHJpbnQKKworCit2b2lkCitfX2ttcF9zdHJfYnVmX3ByaW50KAorICAgIGttcF9zdHJfYnVmX3QgKiAgYnVmZmVyLAorICAgIGNoYXIgY29uc3QgKiAgICAgZm9ybWF0LAorICAgIC4uLgorKSB7CisKKyAgICB2YV9saXN0IGFyZ3M7CisgICAgdmFfc3RhcnQoIGFyZ3MsIGZvcm1hdCApOworICAgIF9fa21wX3N0cl9idWZfdnByaW50KCBidWZmZXIsIGZvcm1hdCwgYXJncyApOworICAgIHZhX2VuZCggYXJncyApOworCit9IC8vIF9fa21wX3N0cl9idWZfcHJpbnQKKworCisvKgorICAgIFRoZSBmdW5jdGlvbiBwcmludHMgc3BlY2lmaWVkIHNpemUgdG8gYnVmZmVyLiBTaXplIGlzIGV4cHJlc3NlZCB1c2luZyBiaWdnZXN0IHBvc3NpYmxlIHVuaXQsIGZvcgorICAgIGV4YW1wbGUgMTAyNCBpcyBwcmludGVkIGFzICIxayIuCisqLworCit2b2lkCitfX2ttcF9zdHJfYnVmX3ByaW50X3NpemUoCisgICAga21wX3N0cl9idWZfdCAqIGJ1ZiwKKyAgICBzaXplX3QgICAgICAgICAgc2l6ZQorKSB7CisKKyAgICBjaGFyIGNvbnN0ICogbmFtZXNbXSA9IHsgIiIsICJrIiwgIk0iLCAiRyIsICJUIiwgIlAiLCAiRSIsICJaIiwgIlkiIH07CisgICAgaW50IGNvbnN0ICAgIHVuaXRzICAgPSBzaXplb2YoIG5hbWVzICkgLyBzaXplb2YoIGNoYXIgY29uc3QgKiApOworICAgIGludCAgICAgICAgICB1ICAgICAgID0gMDsKKyAgICBpbnQgICAgICAgICAgcmM7CisgICAgaWYgKCBzaXplID4gMCApIHsKKyAgICAgICAgd2hpbGUgKCAoIHNpemUgJSAxMDI0ID09IDAgKSAmJiAoIHUgKyAxIDwgdW5pdHMgKSApIHsKKyAgICAgICAgICAgIHNpemUgPSBzaXplIC8gMTAyNDsKKyAgICAgICAgICAgICsrIHU7CisgICAgICAgIH07IC8vIHdoaWxlCisgICAgfTsgLy8gaWYKKworICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZiwgIiUiIEtNUF9TSVpFX1RfU1BFQyAiJXMiLCBzaXplLCBuYW1lc1sgdSBdICk7CisKK30gLy8gX19rbXBfc3RyX2J1Zl9wcmludF9zaXplCisKKwordm9pZAorX19rbXBfc3RyX2ZuYW1lX2luaXQoCisgICAga21wX3N0cl9mbmFtZV90ICogZm5hbWUsCisgICAgY2hhciBjb25zdCAqICAgICAgcGF0aAorKSB7CisKKyAgICBmbmFtZS0+cGF0aCA9IE5VTEw7CisgICAgZm5hbWUtPmRpciAgPSBOVUxMOworICAgIGZuYW1lLT5iYXNlID0gTlVMTDsKKworICAgIGlmICggcGF0aCAhPSBOVUxMICkgeworICAgICAgICBjaGFyICogc2xhc2ggPSBOVUxMOyAgICAvLyBQb2ludGVyIHRvIHRoZSBsYXN0IGNoYXJhY3RlciBvZiBkaXIuCisgICAgICAgIGNoYXIgKiBiYXNlICA9IE5VTEw7ICAgIC8vIFBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiBiYXNlbmFtZS4KKyAgICAgICAgZm5hbWUtPnBhdGggPSBfX2ttcF9zdHJfZm9ybWF0KCAiJXMiLCBwYXRoICk7CisgICAgICAgICAgICAvLyBPcmlnaW5hbCBjb2RlIHVzZWQgc3RyZHVwKCkgZnVuY3Rpb24gdG8gY29weSBhIHN0cmluZywgYnV0IG9uIFdpbmRvd3MqIE9TIEludGVsKFIpIDY0IGl0CisgICAgICAgICAgICAvLyBjYXVzZXMgYXNzZXJ0aW9vbiBpZCBkZWJ1ZyBoZWFwLCBzbyBJIGhhZCB0byByZXBsYWNlIHN0cmR1cCB3aXRoIF9fa21wX3N0cl9mb3JtYXQoKS4KKyAgICAgICAgaWYgKCBLTVBfT1NfV0lORE9XUyApIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9yZXBsYWNlKCBmbmFtZS0+cGF0aCwgJ1xcJywgJy8nICk7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIGZuYW1lLT5kaXIgPSBfX2ttcF9zdHJfZm9ybWF0KCAiJXMiLCBmbmFtZS0+cGF0aCApOworICAgICAgICBzbGFzaCA9IHN0cnJjaHIoIGZuYW1lLT5kaXIsICcvJyApOworICAgICAgICBpZiAoIEtNUF9PU19XSU5ET1dTICYmIHNsYXNoID09IE5VTEwgKSB7ICAgICAgICAgICAvLyBPbiBXaW5kb3dzKiBPUywgaWYgc2xhc2ggbm90IGZvdW5kLAorICAgICAgICAgICAgY2hhciBmaXJzdCA9IFRPTE9XRVIoIGZuYW1lLT5kaXJbIDAgXSApOyAgICAgLy8gbG9vayBmb3IgZHJpdmUuCisgICAgICAgICAgICBpZiAoICdhJyA8PSBmaXJzdCAmJiBmaXJzdCA8PSAneicgJiYgZm5hbWUtPmRpclsgMSBdID09ICc6JyApIHsKKyAgICAgICAgICAgICAgICBzbGFzaCA9ICYgZm5hbWUtPmRpclsgMSBdOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgYmFzZSA9ICggc2xhc2ggPT0gTlVMTCA/IGZuYW1lLT5kaXIgOiBzbGFzaCArIDEgKTsKKyAgICAgICAgZm5hbWUtPmJhc2UgPSBfX2ttcF9zdHJfZm9ybWF0KCAiJXMiLCBiYXNlICk7ICAgIC8vIENvcHkgYmFzZW5hbWUKKyAgICAgICAgKiBiYXNlID0gMDsgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0cnVuY2F0ZSBkaXIuCisgICAgfTsgLy8gaWYKKworfSAvLyBrbXBfc3RyX2ZuYW1lX2luaXQKKworCit2b2lkCitfX2ttcF9zdHJfZm5hbWVfZnJlZSgKKyAgICBrbXBfc3RyX2ZuYW1lX3QgKiBmbmFtZQorKSB7CisgICAgX19rbXBfc3RyX2ZyZWUoIChjaGFyIGNvbnN0ICoqKSggJiBmbmFtZS0+cGF0aCApICk7CisgICAgX19rbXBfc3RyX2ZyZWUoIChjaGFyIGNvbnN0ICoqKSggJiBmbmFtZS0+ZGlyICApICk7CisgICAgX19rbXBfc3RyX2ZyZWUoIChjaGFyIGNvbnN0ICoqKSggJiBmbmFtZS0+YmFzZSApICk7Cit9IC8vIGttcF9zdHJfZm5hbWVfZnJlZQorCisKK2ludAorX19rbXBfc3RyX2ZuYW1lX21hdGNoKAorICAgIGttcF9zdHJfZm5hbWVfdCBjb25zdCAqIGZuYW1lLAorICAgIGNoYXIgY29uc3QgKiAgICAgICAgICAgIHBhdHRlcm4KKykgeworCisgICAgaW50IGRpcl9tYXRjaCAgPSAxOworICAgIGludCBiYXNlX21hdGNoID0gMTsKKworICAgIGlmICggcGF0dGVybiAhPSBOVUxMICkgeworICAgICAgICBrbXBfc3RyX2ZuYW1lX3QgcHRybjsKKyAgICAgICAgX19rbXBfc3RyX2ZuYW1lX2luaXQoICYgcHRybiwgcGF0dGVybiApOworICAgICAgICBkaXJfbWF0Y2ggPQorICAgICAgICAgICAgc3RyY21wKCBwdHJuLmRpciwgIiovIiApID09IDAKKyAgICAgICAgICAgIHx8CisgICAgICAgICAgICAoIGZuYW1lLT5kaXIgIT0gTlVMTCAmJiBfX2ttcF9zdHJfZXFmKCBmbmFtZS0+ZGlyLCBwdHJuLmRpciApICk7CisgICAgICAgIGJhc2VfbWF0Y2ggPQorICAgICAgICAgICAgc3RyY21wKCBwdHJuLmJhc2UsICIqIiApID09IDAKKyAgICAgICAgICAgIHx8CisgICAgICAgICAgICAoIGZuYW1lLT5iYXNlICE9IE5VTEwgJiYgX19rbXBfc3RyX2VxZiggZm5hbWUtPmJhc2UsIHB0cm4uYmFzZSApICk7CisgICAgICAgIF9fa21wX3N0cl9mbmFtZV9mcmVlKCAmIHB0cm4gKTsKKyAgICB9OyAvLyBpZgorCisgICAgcmV0dXJuIGRpcl9tYXRjaCAmJiBiYXNlX21hdGNoOworCit9IC8vIF9fa21wX3N0cl9mbmFtZV9tYXRjaAorCisKK2ttcF9zdHJfbG9jX3QKK19fa21wX3N0cl9sb2NfaW5pdCgKKyAgICBjaGFyIGNvbnN0ICogcHNvdXJjZSwKKyAgICBpbnQgICAgICAgICAgaW5pdF9mbmFtZQorKSB7CisKKyAgICBrbXBfc3RyX2xvY190IGxvYzsKKworICAgIGxvYy5fYnVsayA9IE5VTEw7CisgICAgbG9jLmZpbGUgID0gTlVMTDsKKyAgICBsb2MuZnVuYyAgPSBOVUxMOworICAgIGxvYy5saW5lICA9IDA7CisgICAgbG9jLmNvbCAgID0gMDsKKworICAgIGlmICggcHNvdXJjZSAhPSBOVUxMICkgeworCisgICAgICAgIGNoYXIgKiBzdHIgICA9IE5VTEw7CisgICAgICAgIGNoYXIgKiBkdW1teSA9IE5VTEw7CisgICAgICAgIGNoYXIgKiBsaW5lICA9IE5VTEw7CisgICAgICAgIGNoYXIgKiBjb2wgICA9IE5VTEw7CisKKyAgICAgICAgLy8gQ29weSBwc291cmNlIHRvIGtlZXAgaXQgaW50YWN0LgorICAgICAgICBsb2MuX2J1bGsgPSBfX2ttcF9zdHJfZm9ybWF0KCAiJXMiLCBwc291cmNlICk7CisKKyAgICAgICAgLy8gUGFyc2UgcHNvdXJjZSBzdHJpbmc6ICI7ZmlsZTtmdW5jO2xpbmU7Y29sOzsiCisgICAgICAgIHN0ciA9IGxvYy5fYnVsazsKKyAgICAgICAgX19rbXBfc3RyX3NwbGl0KCBzdHIsICc7JywgJiBkdW1teSwgICAgJiBzdHIgKTsKKyAgICAgICAgX19rbXBfc3RyX3NwbGl0KCBzdHIsICc7JywgJiBsb2MuZmlsZSwgJiBzdHIgKTsKKyAgICAgICAgX19rbXBfc3RyX3NwbGl0KCBzdHIsICc7JywgJiBsb2MuZnVuYywgJiBzdHIgKTsKKyAgICAgICAgX19rbXBfc3RyX3NwbGl0KCBzdHIsICc7JywgJiBsaW5lLCAgICAgJiBzdHIgKTsKKyAgICAgICAgX19rbXBfc3RyX3NwbGl0KCBzdHIsICc7JywgJiBjb2wsICAgICAgJiBzdHIgKTsKKworICAgICAgICAvLyBDb252ZXJ0IGxpbmUgYW5kIGNvbCBpbnRvIG51bWJlcmljIHZhbHVlcy4KKyAgICAgICAgaWYgKCBsaW5lICE9IE5VTEwgKSB7CisgICAgICAgICAgICBsb2MubGluZSA9IGF0b2koIGxpbmUgKTsKKyAgICAgICAgICAgIGlmICggbG9jLmxpbmUgPCAwICkgeworICAgICAgICAgICAgICAgIGxvYy5saW5lID0gMDsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH07IC8vIGlmCisgICAgICAgIGlmICggY29sICE9IE5VTEwgKSB7CisgICAgICAgICAgICBsb2MuY29sID0gYXRvaSggY29sICk7CisgICAgICAgICAgICBpZiAoIGxvYy5jb2wgPCAwICkgeworICAgICAgICAgICAgICAgIGxvYy5jb2wgPSAwOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gaWYKKworICAgIH07IC8vIGlmCisKKyAgICBfX2ttcF9zdHJfZm5hbWVfaW5pdCggJiBsb2MuZm5hbWUsIGluaXRfZm5hbWUgPyBsb2MuZmlsZSA6IE5VTEwgKTsKKworICAgIHJldHVybiBsb2M7CisKK30gLy8ga21wX3N0cl9sb2NfaW5pdAorCisKK3ZvaWQKK19fa21wX3N0cl9sb2NfZnJlZSgKKyAgICBrbXBfc3RyX2xvY190ICogbG9jCispIHsKKyAgICBfX2ttcF9zdHJfZm5hbWVfZnJlZSggJiBsb2MtPmZuYW1lICk7CisgICAgS01QX0lOVEVSTkFMX0ZSRUUoIGxvYy0+X2J1bGsgKTsKKyAgICBsb2MtPl9idWxrID0gTlVMTDsKKyAgICBsb2MtPmZpbGUgID0gTlVMTDsKKyAgICBsb2MtPmZ1bmMgID0gTlVMTDsKK30gLy8ga21wX3N0cl9sb2NfZnJlZQorCisKKworLyoKKyAgICBUaGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIHRvIGNvbXBhcmUgZmlsZSBuYW1lcy4gT24gV2luZG93cyogT1MgZmlsZSBuYW1lcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSwKKyAgICBzbyBmdW5jdGlvbnMgcGVyZm9ybXMgY2FzZS1pbnNlbnNpdGl2ZSBjb21wYXJpc29uLiBPbiBMaW51eCogT1MgaXQgcGVyZm9ybXMgY2FzZS1zZW5zaXRpdmUKKyAgICBjb21wYXJpc29uLgorICAgIE5vdGU6IFRoZSBmdW5jdGlvbiByZXR1cm5zICp0cnVlKiBpZiBzdHJpbmdzIGFyZSAqZXF1YWwqLgorKi8KKworaW50CitfX2ttcF9zdHJfZXFmKCAgICAgICAgIC8vIFRydWUsIGlmIHN0cmluZ3MgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuCisgICAgY2hhciBjb25zdCAqIGxocywgIC8vIEZpcnN0IHN0cmluZy4KKyAgICBjaGFyIGNvbnN0ICogcmhzICAgLy8gU2Vjb25kIHN0cmluZy4KKykgeworICAgIGludCByZXN1bHQ7CisgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIHJlc3VsdCA9ICggX3N0cmljbXAoIGxocywgcmhzICkgPT0gMCApOworICAgICNlbHNlCisgICAgICAgIHJlc3VsdCA9ICggc3RyY21wKCBsaHMsIHJocyApID09IDAgKTsKKyAgICAjZW5kaWYKKyAgICByZXR1cm4gcmVzdWx0OworfSAvLyBfX2ttcF9zdHJfZXFmCisKKworLyoKKyAgICBUaGlzIGZ1bmN0aW9uIGlzIGxpa2Ugc3ByaW50ZiwgYnV0IGl0ICphbGxvY2F0ZXMqIG5ldyBidWZmZXIsIHdoaWNoIG11c3QgYmUgZnJlZWQgZXZlbnR1YWxseSBieQorICAgIF9fa21wX3N0cl9mcmVlKCkuIFRoZSBmdW5jdGlvbiBpcyB2ZXJ5IGNvbnZlbmllbnQgZm9yIGNvbnN0cnVjdGluZyBzdHJpbmdzLCBpdCBzdWNjZXNzZnVsbHkKKyAgICByZXBsYWNlcyBzdHJkdXAoKSwgc3RyY2F0KCksIGl0IGZyZWVzIHByb2dyYW1tZXIgZnJvbSBidWZmZXIgYWxsb2NhdGlvbnMgYW5kIGhlbHBzIHRvIGF2b2lkCisgICAgYnVmZmVyIG92ZXJmbG93cy4gRXhhbXBsZXM6CisKKyAgICAgICAgc3RyID0gX19rbXBfc3RyX2Zvcm1hdCggIiVzIiwgb3JpZyApOyAgICAgICAgICAgICAgLy8gc3RyZHVwKCksIGRvIG5vdCBjYXJlIGFib3V0IGJ1ZmZlciBzaXplLgorICAgICAgICBfX2ttcF9zdHJfZnJlZSggJiBzdHIgKTsKKyAgICAgICAgc3RyID0gX19rbXBfc3RyX2Zvcm1hdCggIiVzJXMiLCBvcmlnMSwgb3JpZzIgKTsgICAgLy8gc3RyY2F0KCksIGRvIG5vdCBjYXJlIGFib3V0IGJ1ZmZlciBzaXplLgorICAgICAgICBfX2ttcF9zdHJfZnJlZSggJiBzdHIgKTsKKyAgICAgICAgc3RyID0gX19rbXBfc3RyX2Zvcm1hdCggIiVzLyVzLnR4dCIsIHBhdGgsIGZpbGUgKTsgLy8gY29uc3RydWN0aW5nIHN0cmluZy4KKyAgICAgICAgX19rbXBfc3RyX2ZyZWUoICYgc3RyICk7CisKKyAgICBQZXJmb3JtYW5jZSBub3RlOgorICAgICAgICBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBtZW1vcnkgd2l0aCBtYWxsb2MoKSBjYWxscywgc28gZG8gbm90IGNhbGwgaXQgZnJvbQorICAgICAgICBwZXJmb3JtYW5jZS1jcml0aWNhbCBjb2RlLiBJbiBwZXJmb3JtYW5jZS1jcml0aWNhbCBjb2RlIGNvbnNpZGVyIHVzaW5nIGttcF9zdHJfYnVmX3QKKyAgICAgICAgaW5zdGVhZCwgc2luY2UgaXQgdXNlcyBzdGFjay1hbGxvY2F0ZWQgYnVmZmVyIGZvciBzaG9ydCBzdHJpbmdzLgorCisgICAgV2h5IGRvZXMgdGhpcyBmdW5jdGlvbiB1c2UgbWFsbG9jKCk/CisgICAgICAgIDEuIF9fa21wX2FsbG9jYXRlKCkgcmV0dXJucyBjYWNoZS1hbGlnbmVkIG1lbW9yeSBhbGxvY2F0ZWQgd2l0aCBtYWxsb2MoKS4gVGhlcmUgYXJlIG5vCisgICAgICAgICAgIHJlYXNvbnMgaW4gdXNpbmcgX19rbXBfYWxsb2NhdGUoKSBmb3Igc3RyaW5ncyBkdWUgdG8gZXh0cmEgb3ZlcmhlYWQgd2hpbGUgY2FjaGUtYWxpZ25lZAorICAgICAgICAgICBtZW1vcnkgaXMgbm90IG5lY2Vzc2FyeS4KKyAgICAgICAgMi4gX19rbXBfdGhyZWFkX21hbGxvYygpIGNhbm5vdCBiZSB1c2VkIGJlY2F1c2UgaXQgcmVxdWlyZXMgcG9pbnRlciB0byB0aHJlYWQgc3RydWN0dXJlLgorICAgICAgICAgICBXZSBuZWVkIHRvIHBlcmZvcm0gc3RyaW5nIG9wZXJhdGlvbnMgZHVyaW5nIGxpYnJhcnkgc3RhcnR1cCAoZm9yIGV4YW1wbGUsIGluCisgICAgICAgICAgIF9fa21wX3JlZ2lzdGVyX2xpYnJhcnlfc3RhcnR1cCgpKSB3aGVuIG5vIHRocmVhZCBzdHJ1Y3R1cmVzIGFyZSBhbGxvY2F0ZWQgeWV0LgorICAgIFNvIHN0YW5kYXJkIG1hbGxvYygpIGlzIHRoZSBvbmx5IGF2YWlsYWJsZSBvcHRpb24uCisqLworCisvLyBUT0RPOiBGaW5kIGFuZCByZXBsYWNlIGFsbCByZWd1bGFyIGZyZWUoKSB3aXRoIF9fa21wX3N0cl9mcmVlKCkuCisKK2NoYXIgKgorX19rbXBfc3RyX2Zvcm1hdCggICAgICAgICAgIC8vIEFsbG9jYXRlZCBzdHJpbmcuCisgICAgY2hhciBjb25zdCAqIGZvcm1hdCwgICAgLy8gRm9ybWF0IHN0cmluZy4KKyAgICAuLi4gICAgICAgICAgICAgICAgICAgICAvLyBPdGhlciBwYXJhbWV0ZXJzLgorKSB7CisKKyAgICB2YV9saXN0IGFyZ3M7CisgICAgaW50ICAgICBzaXplICAgPSA1MTI7CisgICAgY2hhciAqICBidWZmZXIgPSBOVUxMOworICAgIGludCAgICAgcmM7CisKKyAgICAvLyBBbGxvY2F0ZSBidWZmZXIuCisgICAgYnVmZmVyID0gKGNoYXIgKikgS01QX0lOVEVSTkFMX01BTExPQyggc2l6ZSApOworICAgIGlmICggYnVmZmVyID09IE5VTEwgKSB7CisJS01QX0ZBVEFMKCBNZW1vcnlBbGxvY0ZhaWxlZCApOworICAgIH07IC8vIGlmCisKKyAgICBmb3IgKCA7IDsgKSB7CisKKyAgICAgICAgLy8gVHJ5IHRvIGZvcm1hdCBzdHJpbmcuCisgICAgICAgIHZhX3N0YXJ0KCBhcmdzLCBmb3JtYXQgKTsKKyAgICAgICAgcmMgPSB2c25wcmludGYoIGJ1ZmZlciwgc2l6ZSwgZm9ybWF0LCBhcmdzICk7CisgICAgICAgIHZhX2VuZCggYXJncyApOworCisgICAgICAgIC8vIE5vIGVycm9ycywgc3RyaW5nIGhhcyBiZWVuIGZvcm1hdHRlZC4KKyAgICAgICAgaWYgKCByYyA+PSAwICYmIHJjIDwgc2l6ZSApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9OyAvLyBpZgorCisgICAgICAgIC8vIEVycm9yIG9jY3VycmVkLCBidWZmZXIgaXMgdG9vIHNtYWxsLgorICAgICAgICBpZiAoIHJjID49IDAgKSB7CisgICAgICAgICAgICAvLyBDOTktY29uZm9ybWluZyBpbXBsZW1lbnRhdGlvbiBvZiB2c25wcmludGYgcmV0dXJucyByZXF1aXJlZCBidWZmZXIgc2l6ZS4KKyAgICAgICAgICAgIHNpemUgPSByYyArIDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBPbGRlciBpbXBsZW1lbnRhdGlvbnMganVzdCByZXR1cm4gLTEuCisgICAgICAgICAgICBzaXplID0gc2l6ZSAqIDI7CisgICAgICAgIH07IC8vIGlmCisKKyAgICAgICAgLy8gRW5sYXJnZSBidWZmZXIgYW5kIHRyeSBhZ2Fpbi4KKyAgICAgICAgYnVmZmVyID0gKGNoYXIgKikgS01QX0lOVEVSTkFMX1JFQUxMT0MoIGJ1ZmZlciwgc2l6ZSApOworICAgICAgICBpZiAoIGJ1ZmZlciA9PSBOVUxMICkgeworICAgIAkgICAgS01QX0ZBVEFMKCBNZW1vcnlBbGxvY0ZhaWxlZCApOworICAgICAgICB9OyAvLyBpZgorCisgICAgfTsgLy8gZm9yZXZlcgorCisgICAgcmV0dXJuIGJ1ZmZlcjsKKworfSAvLyBmdW5jIF9fa21wX3N0cl9mb3JtYXQKKworCit2b2lkCitfX2ttcF9zdHJfZnJlZSgKKyAgICBjaGFyIGNvbnN0ICogKiBzdHIKKykgeworICAgIEtNUF9ERUJVR19BU1NFUlQoIHN0ciAhPSBOVUxMICk7CisgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopICogc3RyICk7CisgICAgKiBzdHIgPSBOVUxMOworfSAvLyBmdW5jIF9fa21wX3N0cl9mcmVlCisKKworLyogSWYgbGVuIGlzIHplcm8sIHJldHVybnMgdHJ1ZSBpZmYgdGFyZ2V0IGFuZCBkYXRhIGhhdmUgZXhhY3QgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaC4KKyAgIElmIGxlbiBpcyBuZWdhdGl2ZSwgcmV0dXJucyB0cnVlIGlmZiB0YXJnZXQgaXMgYSBjYXNlLWluc2Vuc2l0aXZlIHN1YnN0cmluZyBvZiBkYXRhLgorICAgSWYgbGVuIGlzIHBvc2l0aXZlLCByZXR1cm5zIHRydWUgaWZmIHRhcmdldCBpcyBhIGNhc2UtaW5zZW5zaXRpdmUgc3Vic3RyaW5nIG9mIGRhdGEgb3IKKyAgICAgdmljZSB2ZXJzYSwgYW5kIG5laXRoZXIgaXMgc2hvcnRlciB0aGFuIGxlbi4KKyovCitpbnQKK19fa21wX3N0cl9tYXRjaCgKKyAgICBjaGFyIGNvbnN0ICogdGFyZ2V0LAorICAgIGludCAgICAgICAgICBsZW4sCisgICAgY2hhciBjb25zdCAqIGRhdGEKKykgeworICAgIGludCBpOworICAgIGlmICggdGFyZ2V0ID09IE5VTEwgfHwgZGF0YSA9PSBOVUxMICkgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfTsgLy8gaWYKKyAgICBmb3IgKCBpID0gMDsgdGFyZ2V0W2ldICYmIGRhdGFbaV07ICsrIGkgKSB7CisgICAgICAgIGlmICggVE9MT1dFUiggdGFyZ2V0W2ldICkgIT0gVE9MT1dFUiggZGF0YVtpXSApICkgeworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGZvciBpCisgICAgcmV0dXJuICggKCBsZW4gPiAwICkgPyBpID49IGxlbiA6ICggISB0YXJnZXRbaV0gJiYgKCBsZW4gfHwgISBkYXRhW2ldICkgKSApOworfSAvLyBfX2ttcF9zdHJfbWF0Y2gKKworCitpbnQKK19fa21wX3N0cl9tYXRjaF9mYWxzZSggY2hhciBjb25zdCAqIGRhdGEgKSB7CisgICAgaW50IHJlc3VsdCA9CisgICAgICAgIF9fa21wX3N0cl9tYXRjaCggImZhbHNlIiwgICAxLCBkYXRhICkgfHwKKyAgICAgICAgX19rbXBfc3RyX21hdGNoKCAib2ZmIiwgICAgIDIsIGRhdGEgKSB8fAorICAgICAgICBfX2ttcF9zdHJfbWF0Y2goICIwIiwgICAgICAgMSwgZGF0YSApIHx8CisgICAgICAgIF9fa21wX3N0cl9tYXRjaCggIi5mYWxzZS4iLCAyLCBkYXRhICkgfHwKKyAgICAgICAgX19rbXBfc3RyX21hdGNoKCAiLmYuIiwgICAgIDIsIGRhdGEgKSB8fAorICAgICAgICBfX2ttcF9zdHJfbWF0Y2goICJubyIsICAgICAgMSwgZGF0YSApOworICAgIHJldHVybiByZXN1bHQ7Cit9IC8vIF9fa21wX3N0cl9tYXRjaF9mYWxzZQorCisKK2ludAorX19rbXBfc3RyX21hdGNoX3RydWUoIGNoYXIgY29uc3QgKiBkYXRhICkgeworICAgIGludCByZXN1bHQgPQorICAgICAgICBfX2ttcF9zdHJfbWF0Y2goICJ0cnVlIiwgICAxLCBkYXRhICkgfHwKKyAgICAgICAgX19rbXBfc3RyX21hdGNoKCAib24iLCAgICAgMiwgZGF0YSApIHx8CisgICAgICAgIF9fa21wX3N0cl9tYXRjaCggIjEiLCAgICAgIDEsIGRhdGEgKSB8fAorICAgICAgICBfX2ttcF9zdHJfbWF0Y2goICIudHJ1ZS4iLCAyLCBkYXRhICkgfHwKKyAgICAgICAgX19rbXBfc3RyX21hdGNoKCAiLnQuIiwgICAgMiwgZGF0YSApIHx8CisgICAgICAgIF9fa21wX3N0cl9tYXRjaCggInllcyIsICAgIDEsIGRhdGEgKTsKKyAgICByZXR1cm4gcmVzdWx0OworfSAvLyBfX2ttcF9zdHJfbWF0Y2hfdHJ1ZQorCit2b2lkCitfX2ttcF9zdHJfcmVwbGFjZSgKKyAgICBjaGFyICogc3RyLAorICAgIGNoYXIgICBzZWFyY2hfZm9yLAorICAgIGNoYXIgICByZXBsYWNlX3dpdGgKKykgeworCisgICAgY2hhciAqIGZvdW5kID0gTlVMTDsKKworICAgIGZvdW5kID0gc3RyY2hyKCBzdHIsIHNlYXJjaF9mb3IgKTsKKyAgICB3aGlsZSAoIGZvdW5kICkgeworICAgICAgICAqIGZvdW5kID0gcmVwbGFjZV93aXRoOworICAgICAgICBmb3VuZCA9IHN0cmNociggZm91bmQgKyAxLCBzZWFyY2hfZm9yICk7CisgICAgfTsgLy8gd2hpbGUKKworfSAvLyBfX2ttcF9zdHJfcmVwbGFjZQorCisKK3ZvaWQKK19fa21wX3N0cl9zcGxpdCgKKyAgICBjaGFyICogIHN0ciwgICAgLy8gSTogU3RyaW5nIHRvIHNwbGl0LgorICAgIGNoYXIgICAgZGVsaW0sICAvLyBJOiBDaGFyYWN0ZXIgdG8gc3BsaXQgb24uCisgICAgY2hhciAqKiBoZWFkLCAgIC8vIE86IFBvaW50ZXIgdG8gaGVhZCAobWF5IGJlIE5VTEwpLgorICAgIGNoYXIgKiogdGFpbCAgICAvLyBPOiBQb2ludGVyIHRvIHRhaWwgKG1heSBiZSBOVUxMKS4KKykgeworICAgIGNoYXIgKiBoID0gc3RyOworICAgIGNoYXIgKiB0ID0gTlVMTDsKKyAgICBpZiAoIHN0ciAhPSBOVUxMICkgeworICAgICAgICBjaGFyICogcHRyID0gc3RyY2hyKCBzdHIsIGRlbGltICk7CisgICAgICAgIGlmICggcHRyICE9IE5VTEwgKSB7CisgICAgICAgICAgICAqIHB0ciAgPSAwOworICAgICAgICAgICAgdCA9IHB0ciArIDE7CisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gaWYKKyAgICBpZiAoIGhlYWQgIT0gTlVMTCApIHsKKyAgICAgICAgKiBoZWFkID0gaDsKKyAgICB9OyAvLyBpZgorICAgIGlmICggdGFpbCAhPSBOVUxMICkgeworICAgICAgICAqIHRhaWwgPSB0OworICAgIH07IC8vIGlmCit9IC8vIF9fa21wX3N0cl9zcGxpdAorCisvKgorICAgIHN0cnRva19yKCkgaXMgbm90IGF2YWlsYWJsZSBvbiBXaW5kb3dzKiBPUy4gVGhpcyBmdW5jdGlvbiByZWltcGxlbWVudHMgc3RydG9rX3IoKS4KKyovCitjaGFyICoKK19fa21wX3N0cl90b2tlbigKKyAgICBjaGFyICogICAgICAgc3RyLCAgIC8vIFN0cmluZyB0byBzcGxpdCBpbnRvIHRva2Vucy4gTm90ZTogU3RyaW5nICppcyogbW9kaWZpZWQhCisgICAgY2hhciBjb25zdCAqIGRlbGltLCAvLyBEZWxpbWl0ZXJzLgorICAgIGNoYXIgKiogICAgICBidWYgICAgLy8gSW50ZXJuYWwgYnVmZmVyLgorKSB7CisgICAgY2hhciAqIHRva2VuID0gTlVMTDsKKyAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgLy8gT24gV2luZG93cyogT1MgdGhlcmUgaXMgbm8gc3RydG9rX3IoKSBmdW5jdGlvbi4gTGV0IHVzIGltcGxlbWVudCBpdC4KKyAgICAgICAgaWYgKCBzdHIgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICogYnVmID0gc3RyOyAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlyc3QgY2FsbCwgaW5pdGlhbGl6ZSBidWYuCisgICAgICAgIH07IC8vIGlmCisgICAgICAgICogYnVmICs9IHN0cnNwbiggKiBidWYsIGRlbGltICk7ICAgICAgIC8vIFNraXAgbGVhZGluZyBkZWxpbWl0ZXJzLgorICAgICAgICBpZiAoICoqIGJ1ZiAhPSAwICkgeyAgICAgICAgICAgICAgICAgICAvLyBSZXN0IG9mIHRoZSBzdHJpbmcgaXMgbm90IHlldCBlbXB0eS4KKyAgICAgICAgICAgIHRva2VuID0gKiBidWY7ICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIGl0IGFzIHJlc3VsdC4KKyAgICAgICAgICAgICogYnVmICs9IHN0cmNzcG4oICogYnVmLCBkZWxpbSApOyAgLy8gU2tpcCBub24tZGVsaW1pdGVycy4KKyAgICAgICAgICAgIGlmICggKiogYnVmICE9IDAgKSB7ICAgICAgICAgICAgICAgLy8gUmVzdCBvZiB0aGUgc3RyaW5nIGlzIG5vdCB5ZXQgZW1wdHkuCisgICAgICAgICAgICAgICAgKiogYnVmID0gMDsgICAgICAgICAgICAgICAgICAgIC8vIFRlcm1pbmF0ZSB0b2tlbiBoZXJlLgorICAgICAgICAgICAgICAgICogYnVmICs9IDE7ICAgICAgICAgICAgICAgICAgICAvLyBBZHZhbmNlIGJ1ZiB0byBzdGFydCB3aXRoIHRoZSBuZXh0IHRva2VuIG5leHQgdGltZS4KKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH07IC8vIGlmCisgICAgI2Vsc2UKKyAgICAgICAgLy8gT24gTGludXgqIE9TIGFuZCBPUyBYKiwgc3RydG9rX3IoKSBpcyBhdmFpbGFibGUuIExldCB1cyB1c2UgaXQuCisgICAgICAgIHRva2VuID0gc3RydG9rX3IoIHN0ciwgZGVsaW0sIGJ1ZiApOworICAgICNlbmRpZgorICAgIHJldHVybiB0b2tlbjsKK307IC8vIF9fa21wX3N0cl90b2tlbgorCisKK2ludAorX19rbXBfc3RyX3RvX2ludCgKKyAgICBjaGFyIGNvbnN0ICogc3RyLAorICAgIGNoYXIgICAgICAgICBzZW50aW5lbAorKSB7CisgICAgaW50IHJlc3VsdCwgZmFjdG9yOworICAgIGNoYXIgY29uc3QgKiB0OworCisgICAgcmVzdWx0ID0gMDsKKworICAgIGZvciAodCA9IHN0cjsgKnQgIT0gJ1wwJzsgKyt0KSB7CisgICAgICAgIGlmICgqdCA8ICcwJyB8fCAqdCA+ICc5JykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICByZXN1bHQgPSAocmVzdWx0ICogMTApICsgKCp0IC0gJzAnKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKCp0KSB7CisgICAgY2FzZSAnXDAnOiAgICAgICAgICAvKiB0aGUgY3VycmVudCBkZWZhdWx0IGZvciBubyBzdWZmaXggaXMgYnl0ZXMgKi8KKwlmYWN0b3IgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdiJzogY2FzZSAnQic6IC8qIGJ5dGVzICovCisJKyt0OworCWZhY3RvciA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ2snOiBjYXNlICdLJzogLyoga2lsby1ieXRlcyAqLworCSsrdDsKKwlmYWN0b3IgPSAxMDI0OworICAgICAgICBicmVhazsKKyAgICBjYXNlICdtJzogY2FzZSAnTSc6IC8qIG1lZ2EtYnl0ZXMgKi8KKwkrK3Q7CisJZmFjdG9yID0gKDEwMjQgKiAxMDI0KTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKwlpZigqdCAhPSBzZW50aW5lbCkKKwkgICAgcmV0dXJuICgtMSk7CisJdCA9ICIiOworCWZhY3RvciA9IDE7CisgICAgfQorCisgICAgaWYgKHJlc3VsdCA+IChJTlRfTUFYIC8gZmFjdG9yKSkKKwlyZXN1bHQgPSBJTlRfTUFYOworICAgIGVsc2UKKwlyZXN1bHQgKj0gZmFjdG9yOworCisgICAgcmV0dXJuICgqdCAhPSAwID8gMCA6IHJlc3VsdCk7CisKK30gLy8gX19rbXBfc3RyX3RvX2ludAorCisKKy8qCisgICAgVGhlIHJvdXRpbmUgcGFyc2VzIGlucHV0IHN0cmluZy4gSXQgaXMgZXhwZWN0ZWQgaXQgaXMgYSB1bnNpZ25lZCBpbnRlZ2VyIHdpdGggb3B0aW9uYWwgdW5pdC4KKyAgICBVbml0cyBhcmU6ICJiIiBmb3IgYnl0ZXMsICJrYiIgb3IganVzdCAiayIgZm9yIGtpbG9ieXRlcywgIm1iIiBvciAibSIgZm9yIG1lZ2FieXRlcywgLi4uLCAieWIiCisgICAgb3IgInkiIGZvciB5b3R0YWJ5dGVzLiA6LSkgVW5pdCBuYW1lIGlzIGNhc2UtaW5zZW5zaXRpdmUuIFRoZSByb3V0aW5lIHJldHVybnMgMCBpZiBldmVyeXRoaW5nIGlzCisgICAgb2ssIG9yIGVycm9yIGNvZGU6IC0xIGluIGNhc2Ugb2Ygb3ZlcmZsb3csIC0yIGluIGNhc2Ugb2YgdW5rbm93biB1bml0LiAqc2l6ZSBpcyBzZXQgdG8gcGFyc2VkCisgICAgdmFsdWUuIEluIGNhc2Ugb2Ygb3ZlcmZsb3cgKnNpemUgaXMgc2V0IHRvIEtNUF9TSVpFX1RfTUFYLCBpbiBjYXNlIG9mIHVua25vd24gdW5pdCAqc2l6ZSBpcyBzZXQKKyAgICB0byB6ZXJvLgorKi8KK3ZvaWQKK19fa21wX3N0cl90b19zaXplKCAgICAgICAgIC8vIFI6IEVycm9yIGNvZGUuCisgICAgY2hhciBjb25zdCAqICAgc3RyLCAgICAvLyBJOiBTdHJpbmcgb2YgY2hhcmFjdGVycywgdW5zaWduZWQgbnVtYmVyIGFuZCB1bml0ICgiYiIsICJrYiIsIGV0YykuCisgICAgc2l6ZV90ICogICAgICAgb3V0LCAgICAvLyBPOiBQYXJzZWQgbnVtYmVyLgorICAgIHNpemVfdCAgICAgICAgIGRmYWN0b3IsIC8vIEk6IFRoZSBmYWN0b3IgaWYgbm9uZSBvZiB0aGUgbGV0dGVycyBzcGVjaWZpZWQuCisgICAgY2hhciBjb25zdCAqICogZXJyb3IgICAvLyBPOiBOdWxsIGlmIGV2ZXJ5dGhpbmcgaXMgb2ssIGVycm9yIG1lc3NhZ2Ugb3RoZXJ3aXNlLgorKSB7CisKKyAgICBzaXplX3QgdmFsdWUgICAgPSAwOworICAgIHNpemVfdCBmYWN0b3IgICA9IDA7CisgICAgaW50ICAgIG92ZXJmbG93ID0gMDsKKyAgICBpbnQgICAgYmFkX3VuaXQgPSAwOworICAgIGludCAgICBpICAgICAgICA9IDA7CisgICAgaW50ICAgIGRpZ2l0OworCisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzdHIgIT0gTlVMTCApOworCisgICAgLy8gU2tpcCBzcGFjZXMuCisgICAgd2hpbGUgKCBzdHJbIGkgXSA9PSAnICcgfHwgc3RyWyBpIF0gPT0gJ1x0JykgeworICAgICAgICArKyBpOworICAgIH07IC8vIHdoaWxlCisKKyAgICAvLyBQYXJzZSBudW1iZXIuCisgICAgaWYgKCBzdHJbIGkgXSA8ICcwJyB8fCBzdHJbIGkgXSA+ICc5JyApIHsKKyAgICAgICAgKiBlcnJvciA9IEtNUF9JMThOX1NUUiggTm90QU51bWJlciApOworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKyAgICBkbyB7CisgICAgICAgIGRpZ2l0ID0gc3RyWyBpIF0gLSAnMCc7CisgICAgICAgIG92ZXJmbG93ID0gb3ZlcmZsb3cgfHwgKCB2YWx1ZSA+ICggS01QX1NJWkVfVF9NQVggLSBkaWdpdCApIC8gMTAgKTsKKyAgICAgICAgdmFsdWUgPSAoIHZhbHVlICogMTAgKSArIGRpZ2l0OworICAgICAgICArKyBpOworICAgIH0gd2hpbGUgKCBzdHJbIGkgXSA+PSAnMCcgJiYgc3RyWyBpIF0gPD0gJzknICk7CisKKyAgICAvLyBTa2lwIHNwYWNlcy4KKyAgICB3aGlsZSAoIHN0clsgaSBdID09ICcgJyB8fCBzdHJbIGkgXSA9PSAnXHQnICkgeworICAgICAgICArKyBpOworICAgIH07IC8vIHdoaWxlCisKKyAgICAvLyBQYXJzZSB1bml0LgorICAgICNkZWZpbmUgX2Nhc2UoIGNoLCBleHAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgY2ggOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBjaCAtICggJ2EnIC0gJ0EnICkgOiB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc2l6ZV90IHNoaWZ0ID0gKGV4cCkgKiAxMDsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICArKyBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICggc2hpZnQgPCBzaXplb2YoIHNpemVfdCApICogOCApIHsgICAgICAgXAorICAgICAgICAgICAgICAgIGZhY3RvciA9IChzaXplX3QpKCAxICkgPDwgc2hpZnQ7ICAgICAgICBcCisgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBvdmVyZmxvdyA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gYnJlYWs7CisgICAgc3dpdGNoICggc3RyWyBpIF0gKSB7CisgICAgICAgIF9jYXNlKCAnaycsIDEgKTsgLy8gS2lsbworICAgICAgICBfY2FzZSggJ20nLCAyICk7IC8vIE1lZ2EKKyAgICAgICAgX2Nhc2UoICdnJywgMyApOyAvLyBHaWdhCisgICAgICAgIF9jYXNlKCAndCcsIDQgKTsgLy8gVGVyYQorICAgICAgICBfY2FzZSggJ3AnLCA1ICk7IC8vIFBldGEKKyAgICAgICAgX2Nhc2UoICdlJywgNiApOyAvLyBFeGEKKyAgICAgICAgX2Nhc2UoICd6JywgNyApOyAvLyBaZXR0YQorICAgICAgICBfY2FzZSggJ3knLCA4ICk7IC8vIFlvdHRhCisgICAgICAgIC8vIE9vcHMuIE5vIG1vcmUgdW5pdHMuLi4KKyAgICB9OyAvLyBzd2l0Y2gKKyAgICAjdW5kZWYgX2Nhc2UKKyAgICBpZiAoIHN0clsgaSBdID09ICdiJyB8fCBzdHJbIGkgXSA9PSAnQicgKSB7ICAgIC8vIFNraXAgb3B0aW9uYWwgImIiLgorCWlmICggZmFjdG9yID09IDAgKSB7CisJICAgIGZhY3RvciA9IDE7CisJfQorICAgICAgICArKyBpOworICAgIH07IC8vIGlmCisgICAgaWYgKCAhICggc3RyWyBpIF0gPT0gJyAnIHx8IHN0clsgaSBdID09ICdcdCcgfHwgc3RyWyBpIF0gPT0gMCApICkgeyAvLyBCYWQgdW5pdAorICAgICAgICAqIGVycm9yID0gS01QX0kxOE5fU1RSKCBCYWRVbml0ICk7CisgICAgICAgIHJldHVybjsKKyAgICB9OyAvLyBpZgorCisgICAgaWYgKCBmYWN0b3IgPT0gMCApIHsKKwlmYWN0b3IgPSBkZmFjdG9yOworICAgIH0KKworICAgIC8vIEFwcGx5IGZhY3Rvci4KKyAgICBvdmVyZmxvdyA9IG92ZXJmbG93IHx8ICggdmFsdWUgPiAoIEtNUF9TSVpFX1RfTUFYIC8gZmFjdG9yICkgKTsKKyAgICB2YWx1ZSAqPSBmYWN0b3I7CisKKyAgICAvLyBTa2lwIHNwYWNlcy4KKyAgICB3aGlsZSAoIHN0clsgaSBdID09ICcgJyB8fCBzdHJbIGkgXSA9PSAnXHQnICkgeworICAgICAgICArKyBpOworICAgIH07IC8vIHdoaWxlCisKKyAgICBpZiAoIHN0clsgaSBdICE9IDAgKSB7CisgICAgICAgICogZXJyb3IgPSBLTVBfSTE4Tl9TVFIoIElsbGVnYWxDaGFyYWN0ZXJzICk7CisgICAgICAgIHJldHVybjsKKyAgICB9OyAvLyBpZgorCisgICAgaWYgKCBvdmVyZmxvdyApIHsKKyAgICAgICAgKiBlcnJvciA9IEtNUF9JMThOX1NUUiggVmFsdWVUb29MYXJnZSApOworICAgICAgICAqIG91dCA9IEtNUF9TSVpFX1RfTUFYOworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKworICAgICogZXJyb3IgPSBOVUxMOworICAgICogb3V0ID0gdmFsdWU7CisKK30gLy8gX19rbXBfc3RyX3RvX3NpemUKKworCit2b2lkCitfX2ttcF9zdHJfdG9fdWludCggICAgICAgICAvLyBSOiBFcnJvciBjb2RlLgorICAgIGNoYXIgY29uc3QgKiAgIHN0ciwgICAgLy8gSTogU3RyaW5nIG9mIGNoYXJhY3RlcnMsIHVuc2lnbmVkIG51bWJlci4KKyAgICBrbXBfdWludDY0ICogICBvdXQsICAgIC8vIE86IFBhcnNlZCBudW1iZXIuCisgICAgY2hhciBjb25zdCAqICogZXJyb3IgICAvLyBPOiBOdWxsIGlmIGV2ZXJ5dGhpbmcgaXMgb2ssIGVycm9yIG1lc3NhZ2Ugb3RoZXJ3aXNlLgorKSB7CisKKyAgICBzaXplX3QgdmFsdWUgICAgPSAwOworICAgIGludCAgICBvdmVyZmxvdyA9IDA7CisgICAgaW50ICAgIGkgICAgICAgID0gMDsKKyAgICBpbnQgICAgZGlnaXQ7CisKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHN0ciAhPSBOVUxMICk7CisKKyAgICAvLyBTa2lwIHNwYWNlcy4KKyAgICB3aGlsZSAoIHN0clsgaSBdID09ICcgJyB8fCBzdHJbIGkgXSA9PSAnXHQnICkgeworICAgICAgICArKyBpOworICAgIH07IC8vIHdoaWxlCisKKyAgICAvLyBQYXJzZSBudW1iZXIuCisgICAgaWYgKCBzdHJbIGkgXSA8ICcwJyB8fCBzdHJbIGkgXSA+ICc5JyApIHsKKyAgICAgICAgKiBlcnJvciA9IEtNUF9JMThOX1NUUiggTm90QU51bWJlciApOworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKyAgICBkbyB7CisgICAgICAgIGRpZ2l0ID0gc3RyWyBpIF0gLSAnMCc7CisgICAgICAgIG92ZXJmbG93ID0gb3ZlcmZsb3cgfHwgKCB2YWx1ZSA+ICggS01QX1NJWkVfVF9NQVggLSBkaWdpdCApIC8gMTAgKTsKKyAgICAgICAgdmFsdWUgPSAoIHZhbHVlICogMTAgKSArIGRpZ2l0OworICAgICAgICArKyBpOworICAgIH0gd2hpbGUgKCBzdHJbIGkgXSA+PSAnMCcgJiYgc3RyWyBpIF0gPD0gJzknICk7CisKKyAgICAvLyBTa2lwIHNwYWNlcy4KKyAgICB3aGlsZSAoIHN0clsgaSBdID09ICcgJyB8fCBzdHJbIGkgXSA9PSAnXHQnICkgeworICAgICAgICArKyBpOworICAgIH07IC8vIHdoaWxlCisKKyAgICBpZiAoIHN0clsgaSBdICE9IDAgKSB7CisgICAgICAgICogZXJyb3IgPSBLTVBfSTE4Tl9TVFIoIElsbGVnYWxDaGFyYWN0ZXJzICk7CisgICAgICAgIHJldHVybjsKKyAgICB9OyAvLyBpZgorCisgICAgaWYgKCBvdmVyZmxvdyApIHsKKyAgICAgICAgKiBlcnJvciA9IEtNUF9JMThOX1NUUiggVmFsdWVUb29MYXJnZSApOworICAgICAgICAqIG91dCA9IChrbXBfdWludDY0KSAtMTsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisKKyAgICAqIGVycm9yID0gTlVMTDsKKyAgICAqIG91dCA9IHZhbHVlOworCit9IC8vIF9fa21wX3N0cl90b191bml0CisKKworCisvLyBlbmQgb2YgZmlsZSAvLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX3N0ci5oIGIvZmluYWwvcnVudGltZS9zcmMva21wX3N0ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZTNhMmUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfc3RyLmgKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBrbXBfc3RyLmggLS0gU3RyaW5nIG1hbmlwdWxhdGlvbiByb3V0aW5lcy4KKyAqICRSZXZpc2lvbjogNDI2MTMgJAorICogJERhdGU6IDIwMTMtMDgtMjMgMTM6Mjk6NTAgLTA1MDAgKEZyaSwgMjMgQXVnIDIwMTMpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBLTVBfU1RSX0gKKyNkZWZpbmUgS01QX1NUUl9ICisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2luY2x1ZGUgImttcF9vcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICBleHRlcm4gIkMiIHsKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisjaWYgS01QX09TX1dJTkRPV1MKKyMgZGVmaW5lIHN0cmR1cCAgICBfc3RyZHVwCisjIGRlZmluZSBzbnByaW50ZiAgX3NucHJpbnRmCisjZW5kaWYKKworLyogIHNvbWUgbWFjcm9zIHRvIHJlcGxhY2UgY3R5cGUuaCBmdW5jdGlvbnMgICovCisjZGVmaW5lIFRPTE9XRVIoYykJKCgoKGMpID49ICdBJykgJiYgKChjKSA8PSAnWicpKSA/ICgoYykgKyAnYScgLSAnQScpIDogKGMpKQorCitzdHJ1Y3Qga21wX3N0cl9idWYgeworICAgIGNoYXIgICAgICAgKiBzdHI7ICAgICAgICAgLy8gUG9pbnRlciB0byBidWZmZXIgY29udGVudCwgcmVhZCBvbmx5LgorICAgIHVuc2lnbmVkIGludCBzaXplOyAgICAgICAgLy8gRG8gbm90IGNoYW5nZSB0aGlzIGZpZWxkIQorICAgIGludCAgICAgICAgICB1c2VkOyAgICAgICAgLy8gTnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZCB0byBidWZmZXIsIHJlYWQgb25seS4KKyAgICBjaGFyICAgICAgICAgYnVsa1sgNTEyIF07IC8vIERvIG5vdCB1c2UgdGhpcyBmaWVsZCEKK307IC8vIHN0cnVjdCBrbXBfc3RyX2J1ZgordHlwZWRlZiBzdHJ1Y3Qga21wX3N0cl9idWYgIGttcF9zdHJfYnVmX3Q7CisKKyNkZWZpbmUgX19rbXBfc3RyX2J1Zl9pbml0KCBiICkgICB7IChiKS0+c3RyID0gKGIpLT5idWxrOyAoYiktPnNpemUgPSBzaXplb2YoIChiKS0+YnVsayApOyAoYiktPnVzZWQgPSAwOyAoYiktPmJ1bGtbIDAgXSA9IDA7IH0KKwordm9pZCAgIF9fa21wX3N0cl9idWZfY2xlYXIoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIgKTsKK3ZvaWQgICBfX2ttcF9zdHJfYnVmX3Jlc2VydmUoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGludCBzaXplICk7Cit2b2lkICAgX19rbXBfc3RyX2J1Zl9kZXRhY2goIGttcF9zdHJfYnVmX3QgKiBidWZmZXIgKTsKK3ZvaWQgICBfX2ttcF9zdHJfYnVmX2ZyZWUoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIgKTsKK3ZvaWQgICBfX2ttcF9zdHJfYnVmX2NhdCgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIHN0ciwgaW50IGxlbiApOwordm9pZCAgIF9fa21wX3N0cl9idWZfdnByaW50KCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogZm9ybWF0LCB2YV9saXN0IGFyZ3MgKTsKK3ZvaWQgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogZm9ybWF0LCAuLi4gKTsKK3ZvaWQgICBfX2ttcF9zdHJfYnVmX3ByaW50X3NpemUoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIHNpemVfdCBzaXplICk7CisKKy8qCisgICAgRmlsZSBuYW1lIHBhcnNlci4gVXNhZ2U6CisKKyAgICAgICAga21wX3N0cl9mbmFtZV90IGZuYW1lID0gX19rbXBfc3RyX2ZuYW1lX2luaXQoIHBhdGggKTsKKyAgICAgICAgLy8gVXNlIGZuYW1lLnBhdGggKGNvcHkgb2Ygb3JpZ2luYWwgcGF0aCApLCBmbmFtZS5kaXIsIGZuYW1lLmJhc2UuCisgICAgICAgIC8vIE5vdGUgZm5hbWUuZGlyIGNvbmNhdGVuYXRlZCB3aXRoIGZuYW1lLmJhc2UgZ2l2ZXMgZXhhY3QgY29weSBvZiBwYXRoLgorICAgICAgICBfX2ttcF9zdHJfZm5hbWVfZnJlZSggJiBmbmFtZSApOworCisqLworc3RydWN0IGttcF9zdHJfZm5hbWUgeworICAgIGNoYXIgKiBwYXRoOworICAgIGNoYXIgKiBkaXI7CisgICAgY2hhciAqIGJhc2U7Cit9OyAvLyBzdHJ1Y3Qga21wX3N0cl9mbmFtZQordHlwZWRlZiBzdHJ1Y3Qga21wX3N0cl9mbmFtZSBrbXBfc3RyX2ZuYW1lX3Q7Cit2b2lkIF9fa21wX3N0cl9mbmFtZV9pbml0KCBrbXBfc3RyX2ZuYW1lX3QgKiBmbmFtZSwgY2hhciBjb25zdCAqIHBhdGggKTsKK3ZvaWQgX19rbXBfc3RyX2ZuYW1lX2ZyZWUoIGttcF9zdHJfZm5hbWVfdCAqIGZuYW1lICk7CisvLyBDb21wYXJlcyBmaWxlIG5hbWUgd2l0aCBzcGVjaWZpZWQgcGF0ZXJuLiBJZiBwYXR0ZXJuIGlzIE5VTEwsIGFueSBmbmFtZSBtYXRjaGVkLgoraW50IF9fa21wX3N0cl9mbmFtZV9tYXRjaCgga21wX3N0cl9mbmFtZV90IGNvbnN0ICogZm5hbWUsIGNoYXIgY29uc3QgKiBwYXR0ZXJuICk7CisKKy8qCisgICAgVGhlIGNvbXBpbGVyIHByb3ZpZGVzIHNvdXJjZSBsb2NhdGlvbnMgaW4gc3RyaW5nIGZvcm0gIjtmaWxlO2Z1bmM7bGluZTtjb2w7OyIuIEl0IG5vdCBub3QKKyAgICBjb252ZW5pZW50IGZvciBtYW51cHVsYXRpb24uIFRoZXNlIHN0cnVjdHVyZSBrZWVwcyBzb3VyY2UgbG9jYXRpb24gaW4gbW9yZSBjb252ZW5pZW50IGZvcm0uCisgICAgVXNhZ2U6CisKKyAgICAgICAga21wX3N0cl9sb2NfdCBsb2MgPSBfX2ttcF9zdHJfbG9jX2luaXQoIGlkZW50LT5wc291cmNlLCAwICk7CisgICAgICAgIC8vIHVzZSBsb2MuZmlsZSwgbG9jLmZ1bmMsIGxvYy5saW5lLCBsb2MuY29sLgorICAgICAgICAvLyBsb2MuZm5hbWUgaXMgYXZhaWxhYmxlIGlmIHRoZSBzZWNvbmQgYXJndW1lbnQgb2YgX19rbXBfc3RyX2xvY19pbml0IGlzIHRydWUuCisgICAgICAgIF9fa21wX3N0cl9sb2NfZnJlZSggJiBsb2MgKTsKKworICAgIElmIHBzb3VyY2UgaXMgTlVMTCBvciBkb2VzIG5vdCBmb2xsb3cgZm9ybWF0IGFib3ZlLCBmaWxlIGFuZC9vciBmdW5jIG1heSBiZSBOVUxMIHBvaW50ZXJzLgorKi8KK3N0cnVjdCBrbXBfc3RyX2xvYyB7CisgICAgY2hhciAqICAgICAgICAgIF9idWxrOyAgLy8gRG8gbm90IHVzZSB0aGlkIGZpZWxkLgorICAgIGttcF9zdHJfZm5hbWVfdCBmbmFtZTsgIC8vIFdpbGwgYmUgaW5pdGlhbGl6ZWQgaWYgaW5pdF9mbmFtZSBpcyB0cnVlLgorICAgIGNoYXIgKiAgICAgICAgICBmaWxlOworICAgIGNoYXIgKiAgICAgICAgICBmdW5jOworICAgIGludCAgICAgICAgICAgICBsaW5lOworICAgIGludCAgICAgICAgICAgICBjb2w7Cit9OyAvLyBzdHJ1Y3Qga21wX3N0cl9sb2MKK3R5cGVkZWYgc3RydWN0IGttcF9zdHJfbG9jIGttcF9zdHJfbG9jX3Q7CitrbXBfc3RyX2xvY190IF9fa21wX3N0cl9sb2NfaW5pdCggY2hhciBjb25zdCAqIHBzb3VyY2UsIGludCBpbml0X2ZuYW1lICk7Cit2b2lkIF9fa21wX3N0cl9sb2NfZnJlZSgga21wX3N0cl9sb2NfdCAqIGxvYyApOworCitpbnQgICAgX19rbXBfc3RyX2VxZiggY2hhciBjb25zdCAqIGxocywgY2hhciBjb25zdCAqIHJocyApOworY2hhciAqIF9fa21wX3N0cl9mb3JtYXQoIGNoYXIgY29uc3QgKiBmb3JtYXQsIC4uLiApOwordm9pZCAgIF9fa21wX3N0cl9mcmVlKCBjaGFyIGNvbnN0ICogKiBzdHIgKTsKK2ludCAgICBfX2ttcF9zdHJfbWF0Y2goIGNoYXIgY29uc3QgKiB0YXJnZXQsIGludCBsZW4sIGNoYXIgY29uc3QgKiBkYXRhICk7CitpbnQgICAgX19rbXBfc3RyX21hdGNoX2ZhbHNlKCBjaGFyIGNvbnN0ICogZGF0YSApOworaW50ICAgIF9fa21wX3N0cl9tYXRjaF90cnVlKCBjaGFyIGNvbnN0ICogZGF0YSApOwordm9pZCAgIF9fa21wX3N0cl9yZXBsYWNlKCBjaGFyICogc3RyLCBjaGFyIHNlYXJjaF9mb3IsIGNoYXIgcmVwbGFjZV93aXRoICk7Cit2b2lkICAgX19rbXBfc3RyX3NwbGl0KCBjaGFyICogc3RyLCBjaGFyIGRlbGltLCBjaGFyICoqIGhlYWQsIGNoYXIgKiogdGFpbCApOworY2hhciAqIF9fa21wX3N0cl90b2tlbiggY2hhciAqIHN0ciwgY2hhciBjb25zdCAqIGRlbGltLCBjaGFyICoqIGJ1ZiApOworaW50ICAgIF9fa21wX3N0cl90b19pbnQoIGNoYXIgY29uc3QgKiBzdHIsIGNoYXIgc2VudGluZWwgKTsKKwordm9pZCBfX2ttcF9zdHJfdG9fc2l6ZSggY2hhciBjb25zdCAqIHN0ciwgc2l6ZV90ICogb3V0LCBzaXplX3QgZGZhY3RvciwgY2hhciBjb25zdCAqICogZXJyb3IgKTsKK3ZvaWQgX19rbXBfc3RyX3RvX3VpbnQoIGNoYXIgY29uc3QgKiBzdHIsIGttcF91aW50NjQgKiBvdXQsIGNoYXIgY29uc3QgKiAqIGVycm9yICk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIH0gLy8gZXh0ZXJuICJDIgorI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKyNlbmRpZiAvLyBLTVBfU1RSX0gKKworLy8gZW5kIG9mIGZpbGUgLy8KKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX3N0dWIuYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zdHViLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE5MTRmNAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zdHViLmMKQEAgLTAsMCArMSwyNjggQEAKKy8qCisgKiBrbXBfc3R1Yi5jIC0tIHN0dWIgdmVyc2lvbnMgb2YgdXNlci1jYWxsYWJsZSBPcGVuTVAgUlQgZnVuY3Rpb25zLgorICogJFJldmlzaW9uOiA0MjgyNiAkCisgKiAkRGF0ZTogMjAxMy0xMS0yMCAwMzozOTo0NSAtMDYwMCAoV2VkLCAyMCBOb3YgMjAxMykgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wX3N0dWIuaCIKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlICJrbXBfb3MuaCIgICAgICAgICAgICAgLy8gS01QX09TXyoKKworI2lmIEtNUF9PU19XSU5ET1dTCisgICAgI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbHNlCisgICAgI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYKKworI2luY2x1ZGUgIm9tcC5oIiAgICAgICAgICAgICAgICAvLyBGdW5jdGlvbiByZW5hbWluZ3MuCisjaW5jbHVkZSAia21wLmgiICAgICAgICAgICAgICAgIC8vIEtNUF9ERUZBVUxUX1NUS1NJWkUKKyNpbmNsdWRlICJrbXBfdmVyc2lvbi5oIgorCisvLyBNb3ZlZCBmcm9tIG9tcC5oCisjaWYgT01QXzMwX0VOQUJMRUQKKworI2RlZmluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzICAgIG9tcGNfc2V0X21heF9hY3RpdmVfbGV2ZWxzCisjZGVmaW5lIG9tcF9zZXRfc2NoZWR1bGUgICAgICAgICAgICAgb21wY19zZXRfc2NoZWR1bGUKKyNkZWZpbmUgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtICBvbXBjX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisjZGVmaW5lIG9tcF9nZXRfdGVhbV9zaXplICAgICAgICAgICAgb21wY19nZXRfdGVhbV9zaXplCisKKyNlbmRpZiAvLyBPTVBfMzBfRU5BQkxFRAorCisjZGVmaW5lIG9tcF9zZXRfbnVtX3RocmVhZHMgICAgICAgICAgb21wY19zZXRfbnVtX3RocmVhZHMKKyNkZWZpbmUgb21wX3NldF9keW5hbWljICAgICAgICAgICAgICBvbXBjX3NldF9keW5hbWljCisjZGVmaW5lIG9tcF9zZXRfbmVzdGVkICAgICAgICAgICAgICAgb21wY19zZXRfbmVzdGVkCisjZGVmaW5lIGttcF9zZXRfc3RhY2tzaXplICAgICAgICAgICAga21wY19zZXRfc3RhY2tzaXplCisjZGVmaW5lIGttcF9zZXRfc3RhY2tzaXplX3MgICAgICAgICAga21wY19zZXRfc3RhY2tzaXplX3MKKyNkZWZpbmUga21wX3NldF9ibG9ja3RpbWUgICAgICAgICAgICBrbXBjX3NldF9ibG9ja3RpbWUKKyNkZWZpbmUga21wX3NldF9saWJyYXJ5ICAgICAgICAgICAgICBrbXBjX3NldF9saWJyYXJ5CisjZGVmaW5lIGttcF9zZXRfZGVmYXVsdHMgICAgICAgICAgICAga21wY19zZXRfZGVmYXVsdHMKKyNkZWZpbmUga21wX21hbGxvYyAgICAgICAgICAgICAgICAgICBrbXBjX21hbGxvYworI2RlZmluZSBrbXBfY2FsbG9jICAgICAgICAgICAgICAgICAgIGttcGNfY2FsbG9jCisjZGVmaW5lIGttcF9yZWFsbG9jICAgICAgICAgICAgICAgICAga21wY19yZWFsbG9jCisjZGVmaW5lIGttcF9mcmVlICAgICAgICAgICAgICAgICAgICAga21wY19mcmVlCisKK3N0YXRpYyBkb3VibGUgZnJlcXVlbmN5ID0gMC4wOworCisvLyBIZWxwZXIgZnVuY3Rpb25zLgorc3RhdGljIHNpemVfdCBfX2ttcHNfaW5pdCgpIHsKKyAgICBzdGF0aWMgaW50ICAgIGluaXRpYWxpemVkID0gMDsKKyAgICBzdGF0aWMgc2l6ZV90IGR1bW15ID0gMDsKKyAgICBpZiAoICEgaW5pdGlhbGl6ZWQgKSB7CisKKyAgICAgICAgLy8gVE9ETzogQW5hbHl6ZSBLTVBfVkVSU0lPTiBlbnZpcm9ubWVudCB2YXJpYWJsZSwgcHJpbnQgX19rbXBfdmVyc2lvbl9jb3B5cmlnaHQgYW5kCisgICAgICAgIC8vIF9fa21wX3ZlcnNpb25fYnVpbGRfdGltZS4KKyAgICAgICAgLy8gV0FSTklORzogRG8gbm90IHVzZSAiZnByaW50Ziggc3RkZXJyLCAuLi4gKSIgYmVjYXVzZSBpdCB3aWxsIGNhdXNlIHVucmVzb2x2ZWQgIl9faW9iIgorICAgICAgICAvLyBzeW1ib2wgKHNlZSBDNzAwODApLiBXZSBuZWVkIHRvIGV4dHJhY3QgX19rbXBfcHJpbnRmKCkgc3R1ZmYgZnJvbSBrbXBfcnVudGltZS5jIGFuZCB1c2UKKyAgICAgICAgLy8gaXQuCisKKyAgICAgICAgLy8gVHJpY2sgd2l0aCBkdW1teSB2YXJpYWJsZSBmb3JjZXMgbGlua2VyIHRvIGtlZXAgX19rbXBfdmVyc2lvbl9jb3B5cmlnaHQgYW5kCisgICAgICAgIC8vIF9fa21wX3ZlcnNpb25fYnVpbGRfdGltZSBzdHJpbmdzIGluIGV4ZWN1dGFibGUgZmlsZSAoaW4gY2FzZSBvZiBzdGF0aWMgbGlua2FnZSkuCisgICAgICAgIC8vIFdoZW4gS01QX1ZFUlNJT04gYW5hbHl6ZSBpcyBpbXBsZW1lbnRlZCwgZHVtbXkgdmFyaWFibGUgc2hvdWxkIGJlIGRlbGV0ZWQsIGZ1bmN0aW9uCisgICAgICAgIC8vIHNob3VsZCByZXR1cm4gdm9pZC4KKyAgICAgICAgZHVtbXkgPSBfX2ttcF92ZXJzaW9uX2NvcHlyaWdodCAtIF9fa21wX3ZlcnNpb25fYnVpbGRfdGltZTsKKworICAgICAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgICAgIExBUkdFX0lOVEVHRVIgZnJlcTsKKyAgICAgICAgICAgIEJPT0wgc3RhdHVzID0gUXVlcnlQZXJmb3JtYW5jZUZyZXF1ZW5jeSggJiBmcmVxICk7CisgICAgICAgICAgICBpZiAoIHN0YXR1cyApIHsKKyAgICAgICAgICAgICAgICBmcmVxdWVuY3kgPSBkb3VibGUoIGZyZXEuUXVhZFBhcnQgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICNlbmRpZgorCisgICAgICAgIGluaXRpYWxpemVkID0gMTsKKyAgICB9OyAvLyBpZgorICAgIHJldHVybiBkdW1teTsKK307IC8vIF9fa21wc19pbml0CisKKyNkZWZpbmUgaSBfX2ttcHNfaW5pdCgpOworCisvKiBzZXQgQVBJIGZ1bmN0aW9ucyAqLwordm9pZCBvbXBfc2V0X251bV90aHJlYWRzKCBvbXBfaW50X3QgbnVtX3RocmVhZHMgKSB7IGk7IH0KK3ZvaWQgb21wX3NldF9keW5hbWljKCBvbXBfaW50X3QgZHluYW1pYyApICAgICAgICAgeyBpOyBfX2ttcHNfc2V0X2R5bmFtaWMoIGR5bmFtaWMgKTsgfQordm9pZCBvbXBfc2V0X25lc3RlZCggb21wX2ludF90IG5lc3RlZCApICAgICAgICAgICB7IGk7IF9fa21wc19zZXRfbmVzdGVkKCBuZXN0ZWQgKTsgICB9CisjaWYgT01QXzMwX0VOQUJMRUQKKyAgICB2b2lkIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMoIG9tcF9pbnRfdCBtYXhfYWN0aXZlX2xldmVscyApIHsgaTsgfQorICAgIHZvaWQgb21wX3NldF9zY2hlZHVsZSggb21wX3NjaGVkX3Qga2luZCwgb21wX2ludF90IG1vZGlmaWVyICkgeyBpOyBfX2ttcHNfc2V0X3NjaGVkdWxlKCAoa21wX3NjaGVkX3Qpa2luZCwgbW9kaWZpZXIgKTsgfQorICAgIGludCBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0oIG9tcF9pbnRfdCBsZXZlbCApIHsgaTsgcmV0dXJuICggbGV2ZWwgKSA/ICggLTEgKSA6ICggMCApOyB9CisgICAgaW50IG9tcF9nZXRfdGVhbV9zaXplKCBvbXBfaW50X3QgbGV2ZWwgKSB7IGk7IHJldHVybiAoIGxldmVsICkgPyAoIC0xICkgOiAoIDEgKTsgfQorICAgIGludCBrbXBjX3NldF9hZmZpbml0eV9tYXNrX3Byb2MoIGludCBwcm9jLCB2b2lkICoqbWFzayApIHsgaTsgcmV0dXJuIC0xOyB9CisgICAgaW50IGttcGNfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jKCBpbnQgcHJvYywgdm9pZCAqKm1hc2sgKSB7IGk7IHJldHVybiAtMTsgfQorICAgIGludCBrbXBjX2dldF9hZmZpbml0eV9tYXNrX3Byb2MoIGludCBwcm9jLCB2b2lkICoqbWFzayApIHsgaTsgcmV0dXJuIC0xOyB9CisjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKworLyoga21wIEFQSSBmdW5jdGlvbnMgKi8KK3ZvaWQga21wX3NldF9zdGFja3NpemUoIG9tcF9pbnRfdCBhcmcgKSAgIHsgaTsgX19rbXBzX3NldF9zdGFja3NpemUoIGFyZyApOyB9Cit2b2lkIGttcF9zZXRfc3RhY2tzaXplX3MoIHNpemVfdCBhcmcgKSAgICB7IGk7IF9fa21wc19zZXRfc3RhY2tzaXplKCBhcmcgKTsgfQordm9pZCBrbXBfc2V0X2Jsb2NrdGltZSggb21wX2ludF90IGFyZyApICAgeyBpOyBfX2ttcHNfc2V0X2Jsb2NrdGltZSggYXJnICk7IH0KK3ZvaWQga21wX3NldF9saWJyYXJ5KCBvbXBfaW50X3QgYXJnICkgICAgIHsgaTsgX19rbXBzX3NldF9saWJyYXJ5KCBhcmcgKTsgfQordm9pZCBrbXBfc2V0X2RlZmF1bHRzKCBjaGFyIGNvbnN0ICogc3RyICkgeyBpOyB9CisKKy8qIEtNUCBtZW1vcnkgbWFuYWdlbWVudCBmdW5jdGlvbnMuICovCit2b2lkICoga21wX21hbGxvYyggc2l6ZV90IHNpemUgKSAgICAgICAgICAgICAgICAgeyBpOyByZXR1cm4gbWFsbG9jKCBzaXplICk7IH0KK3ZvaWQgKiBrbXBfY2FsbG9jKCBzaXplX3QgbmVsZW0sIHNpemVfdCBlbHNpemUgKSB7IGk7IHJldHVybiBjYWxsb2MoIG5lbGVtLCBlbHNpemUgKTsgfQordm9pZCAqIGttcF9yZWFsbG9jKCB2b2lkICpwdHIsIHNpemVfdCBzaXplICkgICAgIHsgaTsgcmV0dXJuIHJlYWxsb2MoIHB0ciwgc2l6ZSApOyB9Cit2b2lkICAga21wX2ZyZWUoIHZvaWQgKiBwdHIgKSAgICAgICAgICAgICAgICAgICAgeyBpOyBmcmVlKCBwdHIgKTsgfQorCitzdGF0aWMgaW50IF9fa21wc19ibG9ja3RpbWUgPSBJTlRfTUFYOworCit2b2lkIF9fa21wc19zZXRfYmxvY2t0aW1lKCBpbnQgYXJnICkgeworICAgIGk7CisgICAgX19rbXBzX2Jsb2NrdGltZSA9IGFyZzsKK30gLy8gX19rbXBzX3NldF9ibG9ja3RpbWUKKworaW50IF9fa21wc19nZXRfYmxvY2t0aW1lKCB2b2lkICkgeworICAgIGk7CisgICAgcmV0dXJuIF9fa21wc19ibG9ja3RpbWU7Cit9IC8vIF9fa21wc19nZXRfYmxvY2t0aW1lCisKK3N0YXRpYyBpbnQgX19rbXBzX2R5bmFtaWMgPSAwOworCit2b2lkIF9fa21wc19zZXRfZHluYW1pYyggaW50IGFyZyApIHsKKyAgICBpOworICAgIF9fa21wc19keW5hbWljID0gYXJnOworfSAvLyBfX2ttcHNfc2V0X2R5bmFtaWMKKworaW50IF9fa21wc19nZXRfZHluYW1pYyggdm9pZCApIHsKKyAgICBpOworICAgIHJldHVybiBfX2ttcHNfZHluYW1pYzsKK30gLy8gX19rbXBzX2dldF9keW5hbWljCisKK3N0YXRpYyBpbnQgX19rbXBzX2xpYnJhcnkgPSAxMDAwOworCit2b2lkIF9fa21wc19zZXRfbGlicmFyeSggaW50IGFyZyApIHsKKyAgICBpOworICAgIF9fa21wc19saWJyYXJ5ID0gYXJnOworfSAvLyBfX2ttcHNfc2V0X2xpYnJhcnkKKworaW50IF9fa21wc19nZXRfbGlicmFyeSggdm9pZCApIHsKKyAgICBpOworICAgIHJldHVybiBfX2ttcHNfbGlicmFyeTsKK30gLy8gX19rbXBzX2dldF9saWJyYXJ5CisKK3N0YXRpYyBpbnQgX19rbXBzX25lc3RlZCA9IDA7CisKK3ZvaWQgX19rbXBzX3NldF9uZXN0ZWQoIGludCBhcmcgKSB7CisgICAgaTsKKyAgICBfX2ttcHNfbmVzdGVkID0gYXJnOworfSAvLyBfX2ttcHNfc2V0X25lc3RlZAorCitpbnQgX19rbXBzX2dldF9uZXN0ZWQoIHZvaWQgKSB7CisgICAgaTsKKyAgICByZXR1cm4gX19rbXBzX25lc3RlZDsKK30gLy8gX19rbXBzX2dldF9uZXN0ZWQKKworc3RhdGljIHNpemVfdCBfX2ttcHNfc3RhY2tzaXplID0gS01QX0RFRkFVTFRfU1RLU0laRTsKKwordm9pZCBfX2ttcHNfc2V0X3N0YWNrc2l6ZSggaW50IGFyZyApIHsKKyAgICBpOworICAgIF9fa21wc19zdGFja3NpemUgPSBhcmc7Cit9IC8vIF9fa21wc19zZXRfc3RhY2tzaXplCisKK2ludCBfX2ttcHNfZ2V0X3N0YWNrc2l6ZSggdm9pZCApIHsKKyAgICBpOworICAgIHJldHVybiBfX2ttcHNfc3RhY2tzaXplOworfSAvLyBfX2ttcHNfZ2V0X3N0YWNrc2l6ZQorCisjaWYgT01QXzMwX0VOQUJMRUQKKworc3RhdGljIGttcF9zY2hlZF90IF9fa21wc19zY2hlZF9raW5kICAgICA9IGttcF9zY2hlZF9kZWZhdWx0Oworc3RhdGljIGludCAgICAgICAgIF9fa21wc19zY2hlZF9tb2RpZmllciA9IDA7CisKKyAgICB2b2lkIF9fa21wc19zZXRfc2NoZWR1bGUoIGttcF9zY2hlZF90IGtpbmQsIGludCBtb2RpZmllciApIHsKKyAgICAgICAgaTsKKyAgICAgICAgX19rbXBzX3NjaGVkX2tpbmQgICAgID0ga2luZDsKKyAgICAgICAgX19rbXBzX3NjaGVkX21vZGlmaWVyID0gbW9kaWZpZXI7CisgICAgfSAvLyBfX2ttcHNfc2V0X3NjaGVkdWxlCisKKyAgICB2b2lkIF9fa21wc19nZXRfc2NoZWR1bGUoIGttcF9zY2hlZF90ICpraW5kLCBpbnQgKm1vZGlmaWVyICkgeworICAgICAgICBpOworICAgICAgICAqa2luZCAgICAgPSBfX2ttcHNfc2NoZWRfa2luZDsKKyAgICAgICAgKm1vZGlmaWVyID0gX19rbXBzX3NjaGVkX21vZGlmaWVyOworICAgIH0gLy8gX19rbXBzX2dldF9zY2hlZHVsZQorCisjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKworI2lmIE9NUF80MF9FTkFCTEVECisKK3N0YXRpYyBrbXBfcHJvY19iaW5kX3QgX19rbXBzX3Byb2NfYmluZCA9IHByb2NfYmluZF9mYWxzZTsKKwordm9pZCBfX2ttcHNfc2V0X3Byb2NfYmluZCgga21wX3Byb2NfYmluZF90IGFyZyApIHsKKyAgICBpOworICAgIF9fa21wc19wcm9jX2JpbmQgPSBhcmc7Cit9IC8vIF9fa21wc19zZXRfcHJvY19iaW5kCisKK2ttcF9wcm9jX2JpbmRfdCBfX2ttcHNfZ2V0X3Byb2NfYmluZCggdm9pZCApIHsKKyAgICBpOworICAgIHJldHVybiBfX2ttcHNfcHJvY19iaW5kOworfSAvLyBfX2ttcHNfZ2V0X3Byb2NfYmluZAorCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworZG91YmxlIF9fa21wc19nZXRfd3RpbWUoIHZvaWQgKSB7CisgICAgLy8gRWxhcHNlZCB3YWxsIGNsb2NrIHRpbWUgKGluIHNlY29uZCkgZnJvbSAic29tZXRpbWUgaW4gdGhlIHBhc3QiLgorICAgIGRvdWJsZSB3dGltZSA9IDAuMDsKKyAgICBpOworICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICBpZiAoIGZyZXF1ZW5jeSA+IDAuMCApIHsKKyAgICAgICAgICAgIExBUkdFX0lOVEVHRVIgbm93OworICAgICAgICAgICAgQk9PTCBzdGF0dXMgPSBRdWVyeVBlcmZvcm1hbmNlQ291bnRlciggJiBub3cgKTsKKyAgICAgICAgICAgIGlmICggc3RhdHVzICkgeworICAgICAgICAgICAgICAgIHd0aW1lID0gZG91YmxlKCBub3cuUXVhZFBhcnQgKSAvIGZyZXF1ZW5jeTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH07IC8vIGlmCisgICAgI2Vsc2UKKyAgICAgICAgLy8gZ2V0dGltZW9mZGF5KCkgcmV0dXJucyBzZWNvbmRzIGFuZCBtaWNyb3NlY29uZHMgc2luc2UgdGhlIEVwb2NoLgorICAgICAgICBzdHJ1Y3QgdGltZXZhbCAgdHZhbDsKKyAgICAgICAgaW50ICAgICAgICAgICAgIHJjOworICAgICAgICByYyA9IGdldHRpbWVvZmRheSggJiB0dmFsLCBOVUxMICk7CisgICAgICAgIGlmICggcmMgPT0gMCApIHsKKyAgICAgICAgICAgIHd0aW1lID0gKGRvdWJsZSkoIHR2YWwudHZfc2VjICkgKyAxLjBFLTA2ICogKGRvdWJsZSkoIHR2YWwudHZfdXNlYyApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVE9ETzogQXNzZXJ0IG9yIGFib3J0IGhlcmUuCisgICAgICAgIH07IC8vIGlmCisgICAgI2VuZGlmCisgICAgcmV0dXJuIHd0aW1lOworfTsgLy8gX19rbXBzX2dldF93dGltZQorCitkb3VibGUgX19rbXBzX2dldF93dGljayggdm9pZCApIHsKKyAgICAvLyBOdW1iZXIgb2Ygc2Vjb25kcyBiZXR3ZWVuIHN1Y2Nlc3NpdmUgY2xvY2sgdGlja3MuCisgICAgZG91YmxlIHd0aWNrID0gMC4wOworICAgIGk7CisgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIHsKKyAgICAgICAgICAgIERXT1JEIGluY3JlbWVudDsKKyAgICAgICAgICAgIERXT1JEIGFkanVzdG1lbnQ7CisgICAgICAgICAgICBCT09MICBkaXNhYmxlZDsKKyAgICAgICAgICAgIEJPT0wgIHJjOworICAgICAgICAgICAgcmMgPSBHZXRTeXN0ZW1UaW1lQWRqdXN0bWVudCggJiBhZGp1c3RtZW50LCAmIGluY3JlbWVudCwgJiBkaXNhYmxlZCApOworICAgICAgICAgICAgaWYgKCByYyApIHsKKyAgICAgICAgICAgICAgICB3dGljayA9IDEuMEUtMDcgKiAoZG91YmxlKSggZGlzYWJsZWQgPyBpbmNyZW1lbnQgOiBhZGp1c3RtZW50ICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IEFzc2VydCBvciBhYm9ydCBoZXJlLgorICAgICAgICAgICAgICAgIHd0aWNrID0gMS4wRS0wMzsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH0KKyAgICAjZWxzZQorICAgICAgICAvLyBUT0RPOiBnZXR0aW1lb2ZkYXkoKSByZXR1cm5zIGluIG1pY3Jvc2Vjb25kcywgYnV0IHdoYXQgdGhlIHByZWNpc2lvbj8KKyAgICAgICAgd3RpY2sgPSAxLjBFLTA2OworICAgICNlbmRpZgorICAgIHJldHVybiB3dGljazsKK307IC8vIF9fa21wc19nZXRfd3RpY2sKKworLy8gZW5kIG9mIGZpbGUgLy8KKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX3N0dWIuaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zdHViLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIzZTNlYwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zdHViLmgKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIGttcF9zdHViLmgKKyAqICRSZXZpc2lvbjogNDIwNjEgJAorICogJERhdGU6IDIwMTMtMDItMjggMTY6MzY6MjQgLTA2MDAgKFRodSwgMjggRmViIDIwMTMpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBLTVBfU1RVQl9ICisjZGVmaW5lIEtNUF9TVFVCX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgZXh0ZXJuICJDIiB7CisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKwordm9pZCBfX2ttcHNfc2V0X2Jsb2NrdGltZSggaW50IGFyZyApOworaW50ICBfX2ttcHNfZ2V0X2Jsb2NrdGltZSggdm9pZCApOwordm9pZCBfX2ttcHNfc2V0X2R5bmFtaWMoIGludCBhcmcgKTsKK2ludCAgX19rbXBzX2dldF9keW5hbWljKCB2b2lkICk7Cit2b2lkIF9fa21wc19zZXRfbGlicmFyeSggaW50IGFyZyApOworaW50ICBfX2ttcHNfZ2V0X2xpYnJhcnkoIHZvaWQgKTsKK3ZvaWQgX19rbXBzX3NldF9uZXN0ZWQoIGludCBhcmcgKTsKK2ludCAgX19rbXBzX2dldF9uZXN0ZWQoIHZvaWQgKTsKK3ZvaWQgX19rbXBzX3NldF9zdGFja3NpemUoIGludCBhcmcgKTsKK2ludCAgX19rbXBzX2dldF9zdGFja3NpemUoKTsKKworI2lmIE9NUF8zMF9FTkFCTEVECisjaWZuZGVmIEtNUF9TQ0hFRF9UWVBFX0RFRklORUQKKyNkZWZpbmUgS01QX1NDSEVEX1RZUEVfREVGSU5FRAordHlwZWRlZiBlbnVtIGttcF9zY2hlZCB7CisgICAga21wX3NjaGVkX3N0YXRpYyAgICAgICAgICAgID0gMSwgLy8gbWFwcGVkIHRvIGttcF9zY2hfc3RhdGljX2NodW5rZWQgICAgICAgICAgICgzMykKKyAgICBrbXBfc2NoZWRfZHluYW1pYyAgICAgICAgICAgPSAyLCAvLyBtYXBwZWQgdG8ga21wX3NjaF9keW5hbWljX2NodW5rZWQgICAgICAgICAgKDM1KQorICAgIGttcF9zY2hlZF9ndWlkZWQgICAgICAgICAgICA9IDMsIC8vIG1hcHBlZCB0byBrbXBfc2NoX2d1aWRlZF9jaHVua2VkICAgICAgICAgICAoMzYpCisgICAga21wX3NjaGVkX2F1dG8gICAgICAgICAgICAgID0gNCwgLy8gbWFwcGVkIHRvIGttcF9zY2hfYXV0byAgICAgICAgICAgICAgICAgICAgICgzOCkKKyAgICBrbXBfc2NoZWRfZGVmYXVsdCA9IGttcF9zY2hlZF9zdGF0aWMgICAvLyBkZWZhdWx0IHNjaGVkdWxpbmcKK30ga21wX3NjaGVkX3Q7CisjZW5kaWYKK3ZvaWQgX19rbXBzX3NldF9zY2hlZHVsZSgga21wX3NjaGVkX3Qga2luZCwgaW50IG1vZGlmaWVyICk7Cit2b2lkIF9fa21wc19nZXRfc2NoZWR1bGUoIGttcF9zY2hlZF90ICpraW5kLCBpbnQgKm1vZGlmaWVyICk7CisjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKworI2lmIE9NUF80MF9FTkFCTEVECit2b2lkIF9fa21wc19zZXRfcHJvY19iaW5kKCBlbnVtIGttcF9wcm9jX2JpbmRfdCBhcmcgKTsKK2VudW0ga21wX3Byb2NfYmluZF90IF9fa21wc19nZXRfcHJvY19iaW5kKCB2b2lkICk7CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworZG91YmxlIF9fa21wc19nZXRfd3RpbWUoKTsKK2RvdWJsZSBfX2ttcHNfZ2V0X3d0aWNrKCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIH0gLy8gZXh0ZXJuICJDIgorI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKyNlbmRpZiAvLyBLTVBfU1RVQl9ICisKKy8vIGVuZCBvZiBmaWxlIC8vCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfdGFza2RlcHMuY3BwIGIvZmluYWwvcnVudGltZS9zcmMva21wX3Rhc2tkZXBzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzUxZGUyCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX3Rhc2tkZXBzLmNwcApAQCAtMCwwICsxLDQ0OCBAQAorLyoKKyAqIGttcF90YXNrZGVwcy5jcHAKKyAqICRSZXZpc2lvbjogNDI1MzkgJAorICogJERhdGU6IDIwMTMtMDctMTcgMTE6MjA6MDEgLTA1MDAgKFdlZCwgMTcgSnVsIDIwMTMpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLy8jZGVmaW5lIEtNUF9TVVBQT1JUX0dSQVBIX09VVFBVVCAxCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfaW8uaCIKKworI2lmIE9NUF80MF9FTkFCTEVECisKKy8vVE9ETzogSW1wcm92ZSBtZW1vcnkgYWxsb2NhdGlvbj8ga2VlcCBhIGxpc3Qgb2YgcHJlLWFsbG9jYXRlZCBzdHJ1Y3R1cmVzPyBhbGxvY2F0ZSBpbiBibG9ja3M/IHJlLXVzZSBsaXN0IGZpbmlzaGVkIGxpc3QgZW50cmllcz8KKy8vVE9ETzogZG9uJ3QgdXNlIGF0b21pYyByZWYgY291bnRlcnMgZm9yIHN0YWNrLWFsbG9jYXRlZCBub2Rlcy4KKy8vVE9ETzogZmluZCBhbiBhbHRlcm5hdGUgdG8gYXRvbWljIHJlZnMgZm9yIGhlYXAtYWxsb2NhdGVkIG5vZGVzPworLy9UT0RPOiBGaW5pc2ggZ3JhcGggb3V0cHV0IHN1cHBvcnQKKy8vVE9ETzoga21wX2xvY2tfdCBzZWVtcyBhIHRhZCB0byBiaWcgKGFuZCBoZWF2eSB3ZWlnaHQpIGZvciB0aGlzLiBDaGVjayBvdGhlciBydW50aW1lIGxvY2tzCisvL1RPRE86IEFueSBJVFQgc3VwcG9ydCBuZWVkZWQ/CisKKyNpZmRlZiBLTVBfU1VQUE9SVF9HUkFQSF9PVVRQVVQKK3N0YXRpYyBrbXBfaW50MzIga21wX25vZGVfaWRfc2VlZCA9IDA7CisjZW5kaWYKKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfbm9kZSAoIGttcF9kZXBub2RlX3QgKm5vZGUgKQoreworICAgIG5vZGUtPmRuLnRhc2sgPSBOVUxMOyAvLyBzZXQgdG8gbnVsbCBpbml0aWFsbHksIGl0IHdpbGwgcG9pbnQgdG8gdGhlIHJpZ2h0IHRhc2sgb25jZSBkZXBlbmRlbmNlcyBoYXZlIGJlZW4gcHJvY2Vzc2VkCisgICAgbm9kZS0+ZG4uc3VjY2Vzc29ycyA9IE5VTEw7CisgICAgX19rbXBfaW5pdF9sb2NrKCZub2RlLT5kbi5sb2NrKTsKKyAgICBub2RlLT5kbi5ucmVmcyA9IDE7IC8vIGluaXQgY3JlYXRlcyB0aGUgZmlyc3QgcmVmZXJlbmNlIHRvIHRoZSBub2RlCisjaWZkZWYgS01QX1NVUFBPUlRfR1JBUEhfT1VUUFVUCisgICAgbm9kZS0+ZG4uaWQgPSBLTVBfVEVTVF9USEVOX0lOQzMyKCZrbXBfbm9kZV9pZF9zZWVkKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIGttcF9kZXBub2RlX3QgKgorX19rbXBfbm9kZV9yZWYgKCBrbXBfZGVwbm9kZV90ICpub2RlICkKK3sKKyAgICBLTVBfVEVTVF9USEVOX0lOQzMyKCZub2RlLT5kbi5ucmVmcyk7CisgICAgcmV0dXJuIG5vZGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfbm9kZV9kZXJlZiAoIGttcF9pbmZvX3QgKnRocmVhZCwga21wX2RlcG5vZGVfdCAqbm9kZSApCit7CisgICAgaWYgKCFub2RlKSByZXR1cm47CisKKyAgICBrbXBfaW50MzIgbiA9IEtNUF9URVNUX1RIRU5fREVDMzIoJm5vZGUtPmRuLm5yZWZzKSAtIDE7CisgICAgaWYgKCBuID09IDAgKSB7CisgICAgICAgIEtNUF9BU1NFUlQobm9kZS0+ZG4ubnJlZnMgPT0gMCk7CisjaWYgVVNFX0ZBU1RfTUVNT1JZCisgICAgICAgIF9fa21wX2Zhc3RfZnJlZSh0aHJlYWQsbm9kZSk7CisjZWxzZQorICAgICAgICBfX2ttcF90aHJlYWRfZnJlZSh0aHJlYWQsbm9kZSk7CisjZW5kaWYKKyAgICB9Cit9CisKKyNkZWZpbmUgS01QX0FDUVVJUkVfREVQTk9ERShndGlkLG4pIF9fa21wX2FjcXVpcmVfbG9jaygmKG4pLT5kbi5sb2NrLChndGlkKSkKKyNkZWZpbmUgS01QX1JFTEVBU0VfREVQTk9ERShndGlkLG4pIF9fa21wX3JlbGVhc2VfbG9jaygmKG4pLT5kbi5sb2NrLChndGlkKSkKKworc3RhdGljIHZvaWQKK19fa21wX2RlcG5vZGVfbGlzdF9mcmVlICgga21wX2luZm9fdCAqdGhyZWFkLCBrbXBfZGVwbm9kZV9saXN0ICpsaXN0ICk7CisKK3N0YXRpYyBjb25zdCBrbXBfaW50MzIga21wX2RlcGhhc2hfbG9nMiA9IDY7CitzdGF0aWMgY29uc3Qga21wX2ludDMyIGttcF9kZXBoYXNoX3NpemUgPSAoMSA8PCBrbXBfZGVwaGFzaF9sb2cyKTsKKworc3RhdGljIGlubGluZSBrbXBfaW50MzIKK19fa21wX2RlcGhhc2hfaGFzaCAoIGttcF9pbnRwdHJfdCBhZGRyICkKK3sKKyAgICAvL1RPRE8gYWx0ZXJuYXRlIHRvIHRyeTogc2V0ID0gKCgoQWRkcjY0KShhZGRyVXNlZnVsQml0cyAqIDkuNjE4KSkgJSBtX251bV9zZXRzICk7CisgICAgcmV0dXJuICgoYWRkciA+PiBrbXBfZGVwaGFzaF9sb2cyKSBeIGFkZHIpICUga21wX2RlcGhhc2hfc2l6ZTsKK30KKworc3RhdGljIGttcF9kZXBoYXNoX3QgKgorX19rbXBfZGVwaGFzaF9jcmVhdGUgKCBrbXBfaW5mb190ICp0aHJlYWQgKQoreworICAgIGttcF9kZXBoYXNoX3QgKmg7CisJCisgICAga21wX2ludDMyIHNpemUgPSBrbXBfZGVwaGFzaF9zaXplICogc2l6ZW9mKGttcF9kZXBoYXNoX2VudHJ5X3QpICsgc2l6ZW9mKGttcF9kZXBoYXNoX3QpOworCSAJCisjaWYgVVNFX0ZBU1RfTUVNT1JZCisgICAgaCA9IChrbXBfZGVwaGFzaF90ICopIF9fa21wX2Zhc3RfYWxsb2NhdGUoIHRocmVhZCwgc2l6ZSApOworI2Vsc2UKKyAgICBoID0gKGttcF9kZXBoYXNoX3QgKikgX19rbXBfdGhyZWFkX21hbGxvYyggdGhyZWFkLCBzaXplICk7CisjZW5kaWYKKworI2lmZGVmIEtNUF9ERUJVRwkKKyAgICBoLT5uZWxlbWVudHMgPSAwOworI2VuZGlmCisgICAgaC0+YnVja2V0cyA9IChrbXBfZGVwaGFzaF9lbnRyeSAqKikoaCsxKTsKKwkKKyAgICBmb3IgKCBrbXBfaW50MzIgaSA9IDA7IGkgPCBrbXBfZGVwaGFzaF9zaXplOyBpKysgKQorICAgICAgICBoLT5idWNrZXRzW2ldID0gMDsKKworICAgIHJldHVybiBoOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVwaGFzaF9mcmVlICgga21wX2luZm9fdCAqdGhyZWFkLCBrbXBfZGVwaGFzaF90ICpoICkKK3sKKyAgICBmb3IgKCBrbXBfaW50MzIgaT0wOyBpIDwga21wX2RlcGhhc2hfc2l6ZTsgaSsrICkgeworICAgICAgICBpZiAoIGgtPmJ1Y2tldHNbaV0gKSB7CisgICAgICAgICAgICBrbXBfZGVwaGFzaF9lbnRyeV90ICpuZXh0OworICAgICAgICAgICAgZm9yICgga21wX2RlcGhhc2hfZW50cnlfdCAqZW50cnkgPSBoLT5idWNrZXRzW2ldOyBlbnRyeTsgZW50cnkgPSBuZXh0ICkgeworICAgICAgICAgICAgICAgIG5leHQgPSBlbnRyeS0+bmV4dF9pbl9idWNrZXQ7CisgICAgICAgICAgICAgICAgX19rbXBfZGVwbm9kZV9saXN0X2ZyZWUodGhyZWFkLGVudHJ5LT5sYXN0X2lucyk7CisgICAgICAgICAgICAgICAgX19rbXBfbm9kZV9kZXJlZih0aHJlYWQsZW50cnktPmxhc3Rfb3V0KTsKKyNpZiBVU0VfRkFTVF9NRU1PUlkKKyAgICAgICAgICAgICAgICBfX2ttcF9mYXN0X2ZyZWUodGhyZWFkLGVudHJ5KTsKKyNlbHNlCisgICAgICAgICAgICAgICAgX19rbXBfdGhyZWFkX2ZyZWUodGhyZWFkLGVudHJ5KTsKKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorI2lmIFVTRV9GQVNUX01FTU9SWQorICAgIF9fa21wX2Zhc3RfZnJlZSh0aHJlYWQsaCk7CisjZWxzZQorICAgIF9fa21wX3RocmVhZF9mcmVlKHRocmVhZCxoKTsKKyNlbmRpZgorfQorCitzdGF0aWMga21wX2RlcGhhc2hfZW50cnkgKgorX19rbXBfZGVwaGFzaF9maW5kICgga21wX2luZm9fdCAqdGhyZWFkLCBrbXBfZGVwaGFzaF90ICpoLCBrbXBfaW50cHRyX3QgYWRkciApCit7CisgICAga21wX2ludDMyIGJ1Y2tldCA9IF9fa21wX2RlcGhhc2hfaGFzaChhZGRyKTsKKwkKKyAgICBrbXBfZGVwaGFzaF9lbnRyeV90ICplbnRyeTsKKyAgICBmb3IgKCBlbnRyeSA9IGgtPmJ1Y2tldHNbYnVja2V0XTsgZW50cnk7IGVudHJ5ID0gZW50cnktPm5leHRfaW5fYnVja2V0ICkKKyAgICAgICAgaWYgKCBlbnRyeS0+YWRkciA9PSBhZGRyICkgYnJlYWs7CisJCisgICAgaWYgKCBlbnRyeSA9PSBOVUxMICkgeworICAgICAgICAvLyBjcmVhdGUgZW50cnkuIFRoaXMgaXMgb25seSBkb25lIGJ5IG9uZSB0aHJlYWQgc28gbm8gbG9ja2luZyByZXF1aXJlZAorI2lmIFVTRV9GQVNUX01FTU9SWQorICAgICAgICBlbnRyeSA9IChrbXBfZGVwaGFzaF9lbnRyeV90ICopIF9fa21wX2Zhc3RfYWxsb2NhdGUoIHRocmVhZCwgc2l6ZW9mKGttcF9kZXBoYXNoX2VudHJ5X3QpICk7CisjZWxzZQorICAgICAgICBlbnRyeSA9IChrbXBfZGVwaGFzaF9lbnRyeV90ICopIF9fa21wX3RocmVhZF9tYWxsb2MoIHRocmVhZCwgc2l6ZW9mKGttcF9kZXBoYXNoX2VudHJ5X3QpICk7CisjZW5kaWYKKyAgICAgICAgZW50cnktPmFkZHIgPSBhZGRyOworICAgICAgICBlbnRyeS0+bGFzdF9vdXQgPSBOVUxMOworICAgICAgICBlbnRyeS0+bGFzdF9pbnMgPSBOVUxMOworICAgICAgICBlbnRyeS0+bmV4dF9pbl9idWNrZXQgPSBoLT5idWNrZXRzW2J1Y2tldF07CisgICAgICAgIGgtPmJ1Y2tldHNbYnVja2V0XSA9IGVudHJ5OworI2lmZGVmIEtNUF9ERUJVRworICAgICAgICBoLT5uZWxlbWVudHMrKzsKKyAgICAgICAgaWYgKCBlbnRyeS0+bmV4dF9pbl9idWNrZXQgKSBoLT5uY29uZmxpY3RzKys7CisjZW5kaWYKKyAgICB9CisgICAgcmV0dXJuIGVudHJ5OworfQorCitzdGF0aWMga21wX2RlcG5vZGVfbGlzdF90ICoKK19fa21wX2FkZF9ub2RlICgga21wX2luZm9fdCAqdGhyZWFkLCBrbXBfZGVwbm9kZV9saXN0X3QgKmxpc3QsIGttcF9kZXBub2RlX3QgKm5vZGUgKQoreworICAgIGttcF9kZXBub2RlX2xpc3RfdCAqbmV3X2hlYWQ7CisKKyNpZiBVU0VfRkFTVF9NRU1PUlkKKyAgICBuZXdfaGVhZCA9IChrbXBfZGVwbm9kZV9saXN0X3QgKikgX19rbXBfZmFzdF9hbGxvY2F0ZSh0aHJlYWQsc2l6ZW9mKGttcF9kZXBub2RlX2xpc3RfdCkpOworI2Vsc2UKKyAgICBuZXdfaGVhZCA9IChrbXBfZGVwbm9kZV9saXN0X3QgKikgX19rbXBfdGhyZWFkX21hbGxvYyh0aHJlYWQsc2l6ZW9mKGttcF9kZXBub2RlX2xpc3RfdCkpOworI2VuZGlmCisKKyAgICBuZXdfaGVhZC0+bm9kZSA9IF9fa21wX25vZGVfcmVmKG5vZGUpOworICAgIG5ld19oZWFkLT5uZXh0ID0gbGlzdDsKKworICAgIHJldHVybiBuZXdfaGVhZDsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2RlcG5vZGVfbGlzdF9mcmVlICgga21wX2luZm9fdCAqdGhyZWFkLCBrbXBfZGVwbm9kZV9saXN0ICpsaXN0ICkKK3sKKyAgICBrbXBfZGVwbm9kZV9saXN0ICpuZXh0OworCisgICAgZm9yICggOyBsaXN0IDsgbGlzdCA9IG5leHQgKSB7CisgICAgICAgIG5leHQgPSBsaXN0LT5uZXh0OworCisgICAgICAgIF9fa21wX25vZGVfZGVyZWYodGhyZWFkLGxpc3QtPm5vZGUpOworI2lmIFVTRV9GQVNUX01FTU9SWQorICAgICAgICBfX2ttcF9mYXN0X2ZyZWUodGhyZWFkLGxpc3QpOworI2Vsc2UKKyAgICAgICAgX19rbXBfdGhyZWFkX2ZyZWUodGhyZWFkLGxpc3QpOworI2VuZGlmCisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX3RyYWNrX2RlcGVuZGVuY2UgKCBrbXBfZGVwbm9kZV90ICpzb3VyY2UsIGttcF9kZXBub2RlX3QgKnNpbmsgKQoreworI2lmZGVmIEtNUF9TVVBQT1JUX0dSQVBIX09VVFBVVAorICAgIGttcF90YXNrZGF0YV90ICogdGFza19zb3VyY2UgPSBLTVBfVEFTS19UT19UQVNLREFUQShzb3VyY2UtPmRuLnRhc2spOworICAgIGttcF90YXNrZGF0YV90ICogdGFza19zaW5rID0gS01QX1RBU0tfVE9fVEFTS0RBVEEoc2luay0+ZG4udGFzayk7ICAgIC8vIHRoaXMgY2FuIGJlIE5VTEwgd2hlbiBpZigwKSAuLi4KKworICAgIF9fa21wX3ByaW50ZigiJWQoJXMpIC0+ICVkKCVzKVxuIiwgc291cmNlLT5kbi5pZCwgdGFza19zb3VyY2UtPnRkX2lkZW50LT5wc291cmNlLCBzaW5rLT5kbi5pZCwgdGFza19zaW5rLT50ZF9pZGVudC0+cHNvdXJjZSk7CisjZW5kaWYKK30KKwordGVtcGxhdGU8IGJvb2wgZmlsdGVyID4KK3N0YXRpYyBpbmxpbmUga21wX2ludDMyCitfX2ttcF9wcm9jZXNzX2RlcHMgKCBrbXBfaW50MzIgZ3RpZCwga21wX2RlcG5vZGVfdCAqbm9kZSwga21wX2RlcGhhc2hfdCAqaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVwX2JhcnJpZXIsa21wX2ludDMyIG5kZXBzLCBrbXBfZGVwZW5kX2luZm9fdCAqZGVwX2xpc3QpCit7CisgICAga21wX2luZm9fdCAqdGhyZWFkID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIGttcF9pbnQzMiBucHJlZGVjZXNzb3JzPTA7CisgICAgZm9yICgga21wX2ludDMyIGkgPSAwOyBpIDwgbmRlcHMgOyBpKysgKSB7CisgICAgICAgIGNvbnN0IGttcF9kZXBlbmRfaW5mb190ICogZGVwID0gJmRlcF9saXN0W2ldOworCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoZGVwLT5mbGFncy5pbik7CisKKyAgICAgICAgaWYgKCBmaWx0ZXIgJiYgZGVwLT5iYXNlX2FkZHIgPT0gMCApIGNvbnRpbnVlOyAvLyBza2lwIGZpbHRlcmVkIGVudHJpZXMKKworICAgICAgICBrbXBfZGVwaGFzaF9lbnRyeV90ICppbmZvID0gX19rbXBfZGVwaGFzaF9maW5kKHRocmVhZCxoYXNoLGRlcC0+YmFzZV9hZGRyKTsKKyAgICAgICAga21wX2RlcG5vZGVfdCAqbGFzdF9vdXQgPSBpbmZvLT5sYXN0X291dDsKKworICAgICAgICBpZiAoIGRlcC0+ZmxhZ3Mub3V0ICYmIGluZm8tPmxhc3RfaW5zICkgeworICAgICAgICAgICAgZm9yICgga21wX2RlcG5vZGVfbGlzdF90ICogcCA9IGluZm8tPmxhc3RfaW5zOyBwOyBwID0gcC0+bmV4dCApIHsKKyAgICAgICAgICAgICAgICBrbXBfZGVwbm9kZV90ICogaW5kZXAgPSBwLT5ub2RlOworICAgICAgICAgICAgICAgIGlmICggaW5kZXAtPmRuLnRhc2sgKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9BQ1FVSVJFX0RFUE5PREUoZ3RpZCxpbmRlcCk7CisgICAgICAgICAgICAgICAgICAgIGlmICggaW5kZXAtPmRuLnRhc2sgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF90cmFja19kZXBlbmRlbmNlKGluZGVwLG5vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXAtPmRuLnN1Y2Nlc3NvcnMgPSBfX2ttcF9hZGRfbm9kZSh0aHJlYWQsIGluZGVwLT5kbi5zdWNjZXNzb3JzLCBub2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5wcmVkZWNlc3NvcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBLTVBfUkVMRUFTRV9ERVBOT0RFKGd0aWQsaW5kZXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX19rbXBfZGVwbm9kZV9saXN0X2ZyZWUodGhyZWFkLGluZm8tPmxhc3RfaW5zKTsKKyAgICAgICAgICAgIGluZm8tPmxhc3RfaW5zID0gTlVMTDsKKworICAgICAgICB9IGVsc2UgaWYgKCBsYXN0X291dCAmJiBsYXN0X291dC0+ZG4udGFzayApIHsKKyAgICAgICAgICAgIEtNUF9BQ1FVSVJFX0RFUE5PREUoZ3RpZCxsYXN0X291dCk7CisgICAgICAgICAgICBpZiAoIGxhc3Rfb3V0LT5kbi50YXNrICkgeworICAgICAgICAgICAgICAgIF9fa21wX3RyYWNrX2RlcGVuZGVuY2UobGFzdF9vdXQsbm9kZSk7CisgICAgICAgICAgICAgICAgbGFzdF9vdXQtPmRuLnN1Y2Nlc3NvcnMgPSBfX2ttcF9hZGRfbm9kZSh0aHJlYWQsIGxhc3Rfb3V0LT5kbi5zdWNjZXNzb3JzLCBub2RlKTsKKyAgICAgICAgICAgICAgICBucHJlZGVjZXNzb3JzKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBLTVBfUkVMRUFTRV9ERVBOT0RFKGd0aWQsbGFzdF9vdXQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBkZXBfYmFycmllciApIHsKKyAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgYSBzeW5jIHBvaW50IGluIHRoZSBzZXJpYWwgc2VxdWVuY2UgYW5kIHByZXZpb3VzIG91dHB1dHMgYXJlIGd1YXJhbnRlZWQgdG8gYmUgY29tcGxldGVkIGFmdGVyCisgICAgICAgICAgICAvLyB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgdGFzayBzbyB0aGUgcHJldmlvdXMgb3V0cHV0IG5vZGVzIGNhbiBiZSBjbGVhcmVkLgorICAgICAgICAgICAgX19rbXBfbm9kZV9kZXJlZih0aHJlYWQsbGFzdF9vdXQpOworICAgICAgICAgICAgaW5mby0+bGFzdF9vdXQgPSBOVUxMOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCBkZXAtPmZsYWdzLm91dCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9ub2RlX2RlcmVmKHRocmVhZCxsYXN0X291dCk7CisgICAgICAgICAgICAgICAgaW5mby0+bGFzdF9vdXQgPSBfX2ttcF9ub2RlX3JlZihub2RlKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIGluZm8tPmxhc3RfaW5zID0gX19rbXBfYWRkX25vZGUodGhyZWFkLCBpbmZvLT5sYXN0X2lucywgbm9kZSk7CisgICAgICAgIH0KKworICAgIH0KKyAgICByZXR1cm4gbnByZWRlY2Vzc29yczsKK30KKworI2RlZmluZSBOT19ERVBfQkFSUklFUiAoZmFsc2UpCisjZGVmaW5lIERFUF9CQVJSSUVSICh0cnVlKQorCisvLyByZXR1cm5zIHRydWUgaWYgdGhlIHRhc2sgaGFzIGFueSBvdXRzdGFuZGluZyBkZXBlbmRlbmNlCitzdGF0aWMgYm9vbAorX19rbXBfY2hlY2tfZGVwcyAoIGttcF9pbnQzMiBndGlkLCBrbXBfZGVwbm9kZV90ICpub2RlLCBrbXBfdGFza190ICp0YXNrLCBrbXBfZGVwaGFzaF90ICpoYXNoLCBib29sIGRlcF9iYXJyaWVyLAorICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBuZGVwcywga21wX2RlcGVuZF9pbmZvX3QgKmRlcF9saXN0LAorICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBuZGVwc19ub2FsaWFzLCBrbXBfZGVwZW5kX2luZm9fdCAqbm9hbGlhc19kZXBfbGlzdCApCit7CisgICAgaW50IGk7CisgICAJCisgICAgLy8gRmlsdGVyIGRlcHMgaW4gZGVwX2xpc3QKKyAgICAvLyBUT0RPOiBEaWZmZXJlbnQgYWxnb3JpdGhtIGZvciBsYXJnZSBkZXBfbGlzdCAoID4gMTAgPyApCisgICAgZm9yICggaSA9IDA7IGkgPCBuZGVwczsgaSArKyApIHsKKyAgICAgICAgaWYgKCBkZXBfbGlzdFtpXS5iYXNlX2FkZHIgIT0gMCApCisgICAgICAgICAgICBmb3IgKCBpbnQgaiA9IGkrMTsgaiA8IG5kZXBzOyBqKysgKQorICAgICAgICAgICAgICAgIGlmICggZGVwX2xpc3RbaV0uYmFzZV9hZGRyID09IGRlcF9saXN0W2pdLmJhc2VfYWRkciApIHsKKyAgICAgICAgICAgICAgICAgICAgZGVwX2xpc3RbaV0uZmxhZ3MuaW4gfD0gZGVwX2xpc3Rbal0uZmxhZ3MuaW47CisgICAgICAgICAgICAgICAgICAgIGRlcF9saXN0W2ldLmZsYWdzLm91dCB8PSBkZXBfbGlzdFtqXS5mbGFncy5vdXQ7CisgICAgICAgICAgICAgICAgICAgIGRlcF9saXN0W2pdLmJhc2VfYWRkciA9IDA7IC8vIE1hcmsgaiBlbGVtZW50IGFzIHZvaWQKKyAgICAgICAgICAgICAgICB9CisgICAgfQorCisgICAgLy8gZG9lc24ndCBuZWVkIHRvIGJlIGF0b21pYyBhcyBubyBvdGhlciB0aHJlYWQgaXMgZ29pbmcgdG8gYmUgYWNjZXNzaW5nIHRoaXMgbm9kZSBqdXN0IHlldAorICAgIC8vIG5wcmVkZWNlc3NvcnMgaXMgc2V0IDEgdG8gZW5zdXJlIHRoYXQgbm9uZSBvZiB0aGUgcmVsZWFzaW5nIHRhc2tzIHF1ZXVlcyB0aGlzIHRhc2sgYmVmb3JlIHdlIGhhdmUgZmluaXNoZWQgcHJvY2Vzc2luZyBhbGwgdGhlIGRlcGVuZGVuY2llcworICAgIG5vZGUtPmRuLm5wcmVkZWNlc3NvcnMgPSAxOworCisgICAgLy8gdXNlZCB0byBwYWNrIGFsbCBucHJlZGVjZXNzb3JzIGFkZGl0aW9ucyBpbnRvIGEgc2luZ2xlIGF0b21pYyBvcGVyYXRpb24gYXQgdGhlIGVuZAorICAgIGludCBucHJlZGVjZXNzb3JzOworCisgICAgbnByZWRlY2Vzc29ycyA9IF9fa21wX3Byb2Nlc3NfZGVwczx0cnVlPihndGlkLCBub2RlLCBoYXNoLCBkZXBfYmFycmllciwgbmRlcHMsIGRlcF9saXN0KTsKKyAgICBucHJlZGVjZXNzb3JzICs9IF9fa21wX3Byb2Nlc3NfZGVwczxmYWxzZT4oZ3RpZCwgbm9kZSwgaGFzaCwgZGVwX2JhcnJpZXIsIG5kZXBzX25vYWxpYXMsIG5vYWxpYXNfZGVwX2xpc3QpOworCisgICAgS01QX1RFU1RfVEhFTl9BREQzMigmbm9kZS0+ZG4ubnByZWRlY2Vzc29ycywgbnByZWRlY2Vzc29ycyk7CisKKyAgICAvLyBSZW1vdmUgdGhlIGZha2UgcHJlZGVjZXNzb3IgYW5kIGZpbmQgb3V0IGlmIHRoZXJlJ3MgYW55IG91dHN0YW5kaW5nIGRlcGVuZGVuY2UgKHNvbWUgdGFza3MgbWF5IGhhdmUgZmluaXNoZWQgd2hpbGUgd2UgcHJvY2Vzc2VkIHRoZSBkZXBlbmRlbmNlcykKKyAgICBub2RlLT5kbi50YXNrID0gdGFzazsKKyAgICBLTVBfTUIoKTsKKyAgICBucHJlZGVjZXNzb3JzID0gS01QX1RFU1RfVEhFTl9ERUMzMigmbm9kZS0+ZG4ubnByZWRlY2Vzc29ycykgLSAxOworCisgICAgLy8gYmV5b25kIHRoaXMgcG9pbnQgdGhlIHRhc2sgY291bGQgYmUgcXVldWVkIChhbmQgZXhlY3V0ZWQpIGJ5IGEgcmVsZWFzaW5nIHRhc2suLi4KKyAgICByZXR1cm4gbnByZWRlY2Vzc29ycyA+IDAgPyB0cnVlIDogZmFsc2U7Cit9CisKK3ZvaWQKK19fa21wX3JlbGVhc2VfZGVwcyAoIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza2RhdGFfdCAqdGFzayApCit7CisgICAga21wX2luZm9fdCAqdGhyZWFkID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIGttcF9kZXBub2RlX3QgKm5vZGUgPSB0YXNrLT50ZF9kZXBub2RlOworCisgICAgaWYgKCB0YXNrLT50ZF9kZXBoYXNoICkKKyAgICAgICAgX19rbXBfZGVwaGFzaF9mcmVlKHRocmVhZCx0YXNrLT50ZF9kZXBoYXNoKTsKKworICAgIGlmICggIW5vZGUgKSByZXR1cm47CisKKyAgICBLTVBfQUNRVUlSRV9ERVBOT0RFKGd0aWQsbm9kZSk7CisgICAgbm9kZS0+ZG4udGFzayA9IE5VTEw7IC8vIG1hcmsgdGhpcyB0YXNrIGFzIGZpbmlzaGVkLCBzbyBubyBuZXcgZGVwZW5kZW5jaWVzIGFyZSBnZW5lcmF0ZWQKKyAgICBLTVBfUkVMRUFTRV9ERVBOT0RFKGd0aWQsbm9kZSk7CisKKyAgICBrbXBfZGVwbm9kZV9saXN0X3QgKm5leHQ7CisgICAgZm9yICgga21wX2RlcG5vZGVfbGlzdF90ICpwID0gbm9kZS0+ZG4uc3VjY2Vzc29yczsgcDsgcCA9IG5leHQgKSB7CisgICAgICAgIGttcF9kZXBub2RlX3QgKnN1Y2Nlc3NvciA9IHAtPm5vZGU7CisgICAgICAgIGttcF9pbnQzMiBucHJlZGVjZXNzb3JzID0gS01QX1RFU1RfVEhFTl9ERUMzMigmc3VjY2Vzc29yLT5kbi5ucHJlZGVjZXNzb3JzKSAtIDE7CisKKyAgICAgICAgLy8gc3VjY2Vzc29yIHRhc2sgY2FuIGJlIE5VTEwgZm9yIHdhaXRfZGVwZW5kcyBvciBiZWNhdXNlIGRlcHMgYXJlIHN0aWxsIGJlaW5nIHByb2Nlc3NlZAorICAgICAgICBpZiAoIG5wcmVkZWNlc3NvcnMgPT0gMCApIHsKKyAgICAgICAgICAgIEtNUF9NQigpOworICAgICAgICAgICAgaWYgKCBzdWNjZXNzb3ItPmRuLnRhc2sgKQorICAgICAgICAgICAgLy8gbG9jX3JlZiB3YXMgYWxyZWFkeSBzdG9yZWQgaW4gc3VjY2Vzc29yJ3MgdGFza19kYXRhCisgICAgICAgICAgICAgICAgX19rbXBjX29tcF90YXNrKE5VTEwsZ3RpZCxzdWNjZXNzb3ItPmRuLnRhc2spOworICAgICAgICB9CisKKyAgICAgICAgbmV4dCA9IHAtPm5leHQ7CisgICAgICAgIF9fa21wX25vZGVfZGVyZWYodGhyZWFkLHAtPm5vZGUpOworI2lmIFVTRV9GQVNUX01FTU9SWQorICAgICAgICBfX2ttcF9mYXN0X2ZyZWUodGhyZWFkLHApOworI2Vsc2UKKyAgICAgICAgX19rbXBfdGhyZWFkX2ZyZWUodGhyZWFkLHApOworI2VuZGlmCisgICAgfQorCisgICAgX19rbXBfbm9kZV9kZXJlZih0aHJlYWQsbm9kZSk7Cit9CisKKy8qIQorQGluZ3JvdXAgVEFTS0lORworQHBhcmFtIGxvY19yZWYgbG9jYXRpb24gb2YgdGhlIG9yaWdpbmFsIHRhc2sgZGlyZWN0aXZlCitAcGFyYW0gZ3RpZCBHbG9iYWwgVGhyZWFkIElEIG9mIGVuY291bnRlcmluZyB0aHJlYWQKK0BwYXJhbSBuZXdfdGFzayB0YXNrIHRodW5rIGFsbG9jYXRlZCBieSBfX2ttcF9vbXBfdGFza19hbGxvYygpIGZvciB0aGUgJyduZXcgdGFzaycnCitAcGFyYW0gbmRlcHMgTnVtYmVyIG9mIGRlcGVuZCBpdGVtcyB3aXRoIHBvc3NpYmxlIGFsaWFzaW5nCitAcGFyYW0gZGVwX2xpc3QgTGlzdCBvZiBkZXBlbmQgaXRlbXMgd2l0aCBwb3NzaWJsZSBhbGlhc2luZworQHBhcmFtIG5kZXBzX25vYWxpYXMgTnVtYmVyIG9mIGRlcGVuZCBpdGVtcyB3aXRoIG5vIGFsaWFzaW5nCitAcGFyYW0gbm9hbGlhc19kZXBfbGlzdCBMaXN0IG9mIGRlcGVuZCBpdGVtcyB3aXRoIG5vIGFsaWFzaW5nCisKK0ByZXR1cm4gUmV0dXJucyBlaXRoZXIgVEFTS19DVVJSRU5UX05PVF9RVUVVRUQgaWYgdGhlIGN1cnJlbnQgdGFzayB3YXMgbm90IHN1c3BlbmRlbmQgYW5kIHF1ZXVlZCwgb3IgVEFTS19DVVJSRU5UX1FVRVVFRCBpZiBpdCB3YXMgc3VzcGVuZGVkIGFuZCBxdWV1ZWQKKworU2NoZWR1bGUgYSBub24tdGhyZWFkLXN3aXRjaGFibGUgdGFzayB3aXRoIGRlcGVuZGVuY2VzIGZvciBleGVjdXRpb24KKyovCitrbXBfaW50MzIKK19fa21wY19vbXBfdGFza193aXRoX2RlcHMoIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICogbmV3X3Rhc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgbmRlcHMsIGttcF9kZXBlbmRfaW5mb190ICpkZXBfbGlzdCwKKwkJCQkga21wX2ludDMyIG5kZXBzX25vYWxpYXMsIGttcF9kZXBlbmRfaW5mb190ICpub2FsaWFzX2RlcF9saXN0ICkKK3sKKyAgICBrbXBfaW5mb190ICp0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAga21wX3Rhc2tkYXRhX3QgKiBjdXJyZW50X3Rhc2sgPSB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzazsKKworICAgIGJvb2wgc2VyaWFsID0gY3VycmVudF90YXNrLT50ZF9mbGFncy50ZWFtX3NlcmlhbCB8fCBjdXJyZW50X3Rhc2stPnRkX2ZsYWdzLnRhc2tpbmdfc2VyIHx8IGN1cnJlbnRfdGFzay0+dGRfZmxhZ3MuZmluYWw7CisKKyAgICBpZiAoICFzZXJpYWwgJiYgKCBuZGVwcyA+IDAgfHwgbmRlcHNfbm9hbGlhcyA+IDAgKSkgewkgICAJCQorICAgICAgICAvKiBpZiBubyBkZXBlbmRlbmNpZXMgaGF2ZSBiZWVuIHRyYWNrZWQgeWV0LCBjcmVhdGUgdGhlIGRlcGVuZGVuY2UgaGFzaCAqLworICAgICAgICBpZiAoIGN1cnJlbnRfdGFzay0+dGRfZGVwaGFzaCA9PSBOVUxMICkKKyAgICAgICAgICAgIGN1cnJlbnRfdGFzay0+dGRfZGVwaGFzaCA9IF9fa21wX2RlcGhhc2hfY3JlYXRlKHRocmVhZCk7CisKKyNpZiBVU0VfRkFTVF9NRU1PUlkKKyAgICAgICAga21wX2RlcG5vZGVfdCAqbm9kZSA9IChrbXBfZGVwbm9kZV90ICopIF9fa21wX2Zhc3RfYWxsb2NhdGUodGhyZWFkLHNpemVvZihrbXBfZGVwbm9kZV90KSk7CisjZWxzZQorICAgICAgICBrbXBfZGVwbm9kZV90ICpub2RlID0gKGttcF9kZXBub2RlX3QgKikgX19rbXBfdGhyZWFkX21hbGxvYyh0aHJlYWQsc2l6ZW9mKGttcF9kZXBub2RlX3QpKTsKKyNlbmRpZgorCisgICAgICAgIF9fa21wX2luaXRfbm9kZShub2RlKTsKKyAgICAgICAgS01QX1RBU0tfVE9fVEFTS0RBVEEobmV3X3Rhc2spLT50ZF9kZXBub2RlID0gbm9kZTsKKworICAgICAgICBpZiAoIF9fa21wX2NoZWNrX2RlcHMoIGd0aWQsIG5vZGUsIG5ld190YXNrLCBjdXJyZW50X3Rhc2stPnRkX2RlcGhhc2gsIE5PX0RFUF9CQVJSSUVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5kZXBzLCBkZXBfbGlzdCwgbmRlcHNfbm9hbGlhcyxub2FsaWFzX2RlcF9saXN0ICkgKQorICAgICAgICAgICAgcmV0dXJuIFRBU0tfQ1VSUkVOVF9OT1RfUVVFVUVEOworICAgIH0KKworICAgIHJldHVybiBfX2ttcGNfb21wX3Rhc2sobG9jX3JlZixndGlkLG5ld190YXNrKTsKK30KKworLyohCitAaW5ncm91cCBUQVNLSU5HCitAcGFyYW0gbG9jX3JlZiBsb2NhdGlvbiBvZiB0aGUgb3JpZ2luYWwgdGFzayBkaXJlY3RpdmUKK0BwYXJhbSBndGlkIEdsb2JhbCBUaHJlYWQgSUQgb2YgZW5jb3VudGVyaW5nIHRocmVhZAorQHBhcmFtIG5kZXBzIE51bWJlciBvZiBkZXBlbmQgaXRlbXMgd2l0aCBwb3NzaWJsZSBhbGlhc2luZworQHBhcmFtIGRlcF9saXN0IExpc3Qgb2YgZGVwZW5kIGl0ZW1zIHdpdGggcG9zc2libGUgYWxpYXNpbmcKK0BwYXJhbSBuZGVwc19ub2FsaWFzIE51bWJlciBvZiBkZXBlbmQgaXRlbXMgd2l0aCBubyBhbGlhc2luZworQHBhcmFtIG5vYWxpYXNfZGVwX2xpc3QgTGlzdCBvZiBkZXBlbmQgaXRlbXMgd2l0aCBubyBhbGlhc2luZworCitCbG9ja3MgdGhlIGN1cnJlbnQgdGFzayB1bnRpbCBhbGwgc3BlY2lmaWVzIGRlcGVuZGVuY2llcyBoYXZlIGJlZW4gZnVsZmlsbGVkLgorKi8KK3ZvaWQKK19fa21wY19vbXBfd2FpdF9kZXBzICggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiBuZGVwcywga21wX2RlcGVuZF9pbmZvX3QgKmRlcF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgbmRlcHNfbm9hbGlhcywga21wX2RlcGVuZF9pbmZvX3QgKm5vYWxpYXNfZGVwX2xpc3QgKQoreworICAgIGlmICggbmRlcHMgPT0gMCAmJiBuZGVwc19ub2FsaWFzID09IDAgKSByZXR1cm47CisKKyAgICBrbXBfaW5mb190ICp0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAga21wX3Rhc2tkYXRhX3QgKiBjdXJyZW50X3Rhc2sgPSB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzazsKKworICAgIC8vIGRlcGVuZGVuY2VzIGFyZSBub3QgY29tcHV0ZWQgaW4gc2VyaWFsIHRlYW1zCisgICAgaWYgKCBjdXJyZW50X3Rhc2stPnRkX2ZsYWdzLnRlYW1fc2VyaWFsIHx8IGN1cnJlbnRfdGFzay0+dGRfZmxhZ3MudGFza2luZ19zZXIgfHwgY3VycmVudF90YXNrLT50ZF9mbGFncy5maW5hbCkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gaWYgdGhlIGRlcGhhc2ggaXMgbm90IHlldCBjcmVhdGVkIGl0IG1lYW5zIHdlIGhhdmUgbm90aGluZyB0byB3YWl0IGZvcgorICAgIGlmICggY3VycmVudF90YXNrLT50ZF9kZXBoYXNoID09IE5VTEwgKSByZXR1cm47CisKKyAgICBrbXBfZGVwbm9kZV90IG5vZGU7CisgICAgX19rbXBfaW5pdF9ub2RlKCZub2RlKTsKKworICAgIGlmICghX19rbXBfY2hlY2tfZGVwcyggZ3RpZCwgJm5vZGUsIE5VTEwsIGN1cnJlbnRfdGFzay0+dGRfZGVwaGFzaCwgREVQX0JBUlJJRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZGVwcywgZGVwX2xpc3QsIG5kZXBzX25vYWxpYXMsIG5vYWxpYXNfZGVwX2xpc3QgKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaW50IHRocmVhZF9maW5pc2hlZCA9IEZBTFNFOworICAgIHdoaWxlICggbm9kZS5kbi5ucHJlZGVjZXNzb3JzID4gMCApIHsKKyAgICAgICAgX19rbXBfZXhlY3V0ZV90YXNrcyggdGhyZWFkLCBndGlkLCAodm9sYXRpbGUga21wX3VpbnQzMiAqKSYobm9kZS5kbi5ucHJlZGVjZXNzb3JzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgRkFMU0UsICZ0aHJlYWRfZmluaXNoZWQsCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3Rhc2tfc3RlYWxpbmdfY29uc3RyYWludCApOworICAgIH0KKworfQorCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX3Rhc2tpbmcuYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF90YXNraW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYwNzU3NwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF90YXNraW5nLmMKQEAgLTAsMCArMSwyNDEzIEBACisvKgorICoga21wX3Rhc2tpbmcuYyAtLSBPcGVuTVAgMy4wIHRhc2tpbmcgc3VwcG9ydC4KKyAqICRSZXZpc2lvbjogNDI4NTIgJAorICogJERhdGU6IDIwMTMtMTItMDQgMTA6NTA6NDkgLTA2MDAgKFdlZCwgMDQgRGVjIDIwMTMpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9pMThuLmgiCisjaW5jbHVkZSAia21wX2l0dC5oIgorCisKKyNpZiBPTVBfMzBfRU5BQkxFRAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qIGZvcndhcmQgZGVjbGFyYXRpb24gKi8KK3N0YXRpYyB2b2lkIF9fa21wX2VuYWJsZV90YXNraW5nKCBrbXBfdGFza190ZWFtX3QgKnRhc2tfdGVhbSwga21wX2luZm9fdCAqdGhpc190aHIgKTsKK3N0YXRpYyB2b2lkIF9fa21wX2FsbG9jX3Rhc2tfZGVxdWUoIGttcF9pbmZvX3QgKnRocmVhZCwga21wX3RocmVhZF9kYXRhX3QgKnRocmVhZF9kYXRhICk7CitzdGF0aWMgaW50ICBfX2ttcF9yZWFsbG9jX3Rhc2tfdGhyZWFkc19kYXRhKCBrbXBfaW5mb190ICp0aHJlYWQsIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtICk7CisKKyNpZm5kZWYgS01QX0RFQlVHCisjIGRlZmluZSBfX2ttcF9zdGF0aWNfZGVsYXkoIGFyZyApICAgICAvKiBub3RoaW5nIHRvIGRvICovCisjZWxzZQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RhdGljX2RlbGF5KCBpbnQgYXJnICkKK3sKKy8qIFdvcmsgYXJvdW5kIHdlaXJkIGNvZGUtZ2VuIGJ1ZyB0aGF0IGNhdXNlcyBhc3NlcnQgdG8gdHJpcCAqLworIyBpZiBLTVBfQVJDSF9YODZfNjQgJiYgS01QX09TX0xJTlVYCisgICAgS01QX0FTU0VSVCggYXJnICE9IDAgKTsKKyMgZWxzZQorICAgIEtNUF9BU1NFUlQoIGFyZyA+PSAwICk7CisjIGVuZGlmCit9CisjZW5kaWYgLyogS01QX0RFQlVHICovCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGF0aWNfeWllbGQoIGludCBhcmcgKQoreworICAgIF9fa21wX3lpZWxkKCBhcmcgKTsKK30KKworI2lmZGVmIEJVSUxEX1RJRURfVEFTS19TVEFDSworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIF9fa21wX3RyYWNlX3Rhc2tfc3RhY2s6IHByaW50IHRoZSB0aWVkIHRhc2tzIGZyb20gdGhlIHRhc2sgc3RhY2sgaW4gb3JkZXIKKy8vICAgICBmcm9tIHRvcCBkbyBib3R0b20KKy8vCisvLyAgZ3RpZDogZ2xvYmFsIHRocmVhZCBpZGVudGlmaWVyIGZvciB0aHJlYWQgY29udGFpbmluZyBzdGFjaworLy8gIHRocmVhZF9kYXRhOiB0aHJlYWQgZGF0YSBmb3IgdGFzayB0ZWFtIHRocmVhZCBjb250YWluaW5nIHN0YWNrCisvLyAgdGhyZXNob2xkOiB2YWx1ZSBhYm92ZSB3aGljaCB0aGUgdHJhY2Ugc3RhdGVtZW50IHRyaWdnZXJzCisvLyAgbG9jYXRpb246IHN0cmluZyBpZGVudGlmeWluZyBjYWxsIHNpdGUgb2YgdGhpcyBmdW5jdGlvbiAoZm9yIHRyYWNlKQorCitzdGF0aWMgdm9pZAorX19rbXBfdHJhY2VfdGFza19zdGFjaygga21wX2ludDMyIGd0aWQsIGttcF90aHJlYWRfZGF0YV90ICp0aHJlYWRfZGF0YSwgaW50IHRocmVzaG9sZCwgY2hhciAqbG9jYXRpb24gKQoreworICAgIGttcF90YXNrX3N0YWNrX3QgKnRhc2tfc3RhY2sgPSAmIHRocmVhZF9kYXRhLT50ZC50ZF9zdXNwX3RpZWRfdGFza3M7CisgICAga21wX3Rhc2tkYXRhX3QgKipzdGFja190b3AgPSB0YXNrX3N0YWNrIC0+IHRzX3RvcDsKKyAgICBrbXBfaW50MzIgZW50cmllcyA9IHRhc2tfc3RhY2sgLT4gdHNfZW50cmllczsKKyAgICBrbXBfdGFza2RhdGFfdCAqdGllZF90YXNrOworCisgICAgS0FfVFJBQ0UodGhyZXNob2xkLCAoIl9fa21wX3RyYWNlX3Rhc2tfc3RhY2soc3RhcnQpOiBsb2NhdGlvbiA9ICVzLCBndGlkID0gJWQsIGVudHJpZXMgPSAlZCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJmaXJzdF9ibG9jayA9ICVwLCBzdGFja190b3AgPSAlcCBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24sIGd0aWQsIGVudHJpZXMsIHRhc2tfc3RhY2stPnRzX2ZpcnN0X2Jsb2NrLCBzdGFja190b3AgKSApOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggc3RhY2tfdG9wICE9IE5VTEwgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBlbnRyaWVzID4gMCApOworCisgICAgd2hpbGUgKCBlbnRyaWVzICE9IDAgKQorICAgIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggc3RhY2tfdG9wICE9ICYgdGFza19zdGFjay0+dHNfZmlyc3RfYmxvY2suc2JfYmxvY2tbMF0gKTsKKyAgICAgICAgLy8gZml4IHVwIHRzX3RvcCBpZiB3ZSBuZWVkIHRvIHBvcCBmcm9tIHByZXZpb3VzIGJsb2NrCisgICAgICAgIGlmICggZW50cmllcyAmIFRBU0tfU1RBQ0tfSU5ERVhfTUFTSyA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAga21wX3N0YWNrX2Jsb2NrX3QgKnN0YWNrX2Jsb2NrID0gKGttcF9zdGFja19ibG9ja190ICopIChzdGFja190b3ApIDsKKworICAgICAgICAgICAgc3RhY2tfYmxvY2sgPSBzdGFja19ibG9jayAtPiBzYl9wcmV2OworICAgICAgICAgICAgc3RhY2tfdG9wID0gJiBzdGFja19ibG9jayAtPiBzYl9ibG9ja1tUQVNLX1NUQUNLX0JMT0NLX1NJWkVdOworICAgICAgICB9CisKKyAgICAgICAgLy8gZmluaXNoIGJvb2trZWVwaW5nCisgICAgICAgIHN0YWNrX3RvcC0tOworICAgICAgICBlbnRyaWVzLS07CisKKyAgICAgICAgdGllZF90YXNrID0gKiBzdGFja190b3A7CisKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGllZF90YXNrICE9IE5VTEwgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGllZF90YXNrIC0+IHRkX2ZsYWdzLnRhc2t0eXBlID09IFRBU0tfVElFRCApOworCisgICAgICAgIEtBX1RSQUNFKHRocmVzaG9sZCwgKCJfX2ttcF90cmFjZV90YXNrX3N0YWNrKCVzKTogICAgICAgICAgICAgZ3RpZD0lZCwgZW50cnk9JWQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0YWNrX3RvcD0lcCwgdGllZF90YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiwgZ3RpZCwgZW50cmllcywgc3RhY2tfdG9wLCB0aWVkX3Rhc2sgKSApOworICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzdGFja190b3AgPT0gJiB0YXNrX3N0YWNrLT50c19maXJzdF9ibG9jay5zYl9ibG9ja1swXSApOworCisgICAgS0FfVFJBQ0UodGhyZXNob2xkLCAoIl9fa21wX3RyYWNlX3Rhc2tfc3RhY2soZXhpdCk6IGxvY2F0aW9uID0gJXMsIGd0aWQgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiwgZ3RpZCApICk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgX19rbXBfaW5pdF90YXNrX3N0YWNrOiBpbml0aWFsaXplIHRoZSB0YXNrIHN0YWNrIGZvciB0aGUgZmlyc3QgdGltZQorLy8gICAgYWZ0ZXIgYSB0aHJlYWRfZGF0YSBzdHJ1Y3R1cmUgaXMgY3JlYXRlZC4KKy8vICAgIEl0IHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5IHRvIGRvIHRoaXMgYWdhaW4gKGFzc3VtaW5nIHRoZSBzdGFjayB3b3JrcykuCisvLworLy8gIGd0aWQ6IGdsb2JhbCB0aHJlYWQgaWRlbnRpZmllciBvZiBjYWxsaW5nIHRocmVhZAorLy8gIHRocmVhZF9kYXRhOiB0aHJlYWQgZGF0YSBmb3IgdGFzayB0ZWFtIHRocmVhZCBjb250YWluaW5nIHN0YWNrCisKK3N0YXRpYyB2b2lkCitfX2ttcF9pbml0X3Rhc2tfc3RhY2soIGttcF9pbnQzMiBndGlkLCBrbXBfdGhyZWFkX2RhdGFfdCAqdGhyZWFkX2RhdGEgKQoreworICAgIGttcF90YXNrX3N0YWNrX3QgKnRhc2tfc3RhY2sgPSAmIHRocmVhZF9kYXRhLT50ZC50ZF9zdXNwX3RpZWRfdGFza3M7CisgICAga21wX3N0YWNrX2Jsb2NrX3QgKmZpcnN0X2Jsb2NrOworCisgICAgLy8gc2V0IHVwIHRoZSBmaXJzdCBibG9jayBvZiB0aGUgc3RhY2sKKyAgICBmaXJzdF9ibG9jayA9ICYgdGFza19zdGFjayAtPiB0c19maXJzdF9ibG9jazsKKyAgICB0YXNrX3N0YWNrIC0+IHRzX3RvcCA9IChrbXBfdGFza2RhdGFfdCAqKikgZmlyc3RfYmxvY2s7CisgICAgbWVtc2V0KCAodm9pZCAqKSBmaXJzdF9ibG9jaywgJ1wwJywgVEFTS19TVEFDS19CTE9DS19TSVpFICogc2l6ZW9mKGttcF90YXNrZGF0YV90ICopKTsKKworICAgIC8vIGluaXRpYWxpemUgdGhlIHN0YWNrIHRvIGJlIGVtcHR5CisgICAgdGFza19zdGFjayAgLT4gdHNfZW50cmllcyA9IFRBU0tfU1RBQ0tfRU1QVFk7CisgICAgZmlyc3RfYmxvY2sgLT4gc2JfbmV4dCA9IE5VTEw7CisgICAgZmlyc3RfYmxvY2sgLT4gc2JfcHJldiA9IE5VTEw7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBfX2ttcF9mcmVlX3Rhc2tfc3RhY2s6IGZyZWUgdGhlIHRhc2sgc3RhY2sgd2hlbiB0aHJlYWRfZGF0YSBpcyBkZXN0cm95ZWQuCisvLworLy8gIGd0aWQ6IGdsb2JhbCB0aHJlYWQgaWRlbnRpZmllciBmb3IgY2FsbGluZyB0aHJlYWQKKy8vICB0aHJlYWRfZGF0YTogdGhyZWFkIGluZm8gZm9yIHRocmVhZCBjb250YWluaW5nIHN0YWNrCisKK3N0YXRpYyB2b2lkCitfX2ttcF9mcmVlX3Rhc2tfc3RhY2soIGttcF9pbnQzMiBndGlkLCBrbXBfdGhyZWFkX2RhdGFfdCAqdGhyZWFkX2RhdGEgKQoreworICAgIGttcF90YXNrX3N0YWNrX3QgKnRhc2tfc3RhY2sgPSAmIHRocmVhZF9kYXRhLT50ZC50ZF9zdXNwX3RpZWRfdGFza3M7CisgICAga21wX3N0YWNrX2Jsb2NrX3QgKnN0YWNrX2Jsb2NrID0gJiB0YXNrX3N0YWNrIC0+IHRzX2ZpcnN0X2Jsb2NrOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza19zdGFjayAtPiB0c19lbnRyaWVzID09IFRBU0tfU1RBQ0tfRU1QVFkgKTsKKyAgICAvLyBmcmVlIGZyb20gdGhlIHNlY29uZCBibG9jayBvZiB0aGUgc3RhY2sKKyAgICB3aGlsZSAoIHN0YWNrX2Jsb2NrICE9IE5VTEwgKSB7CisgICAgICAgIGttcF9zdGFja19ibG9ja190ICpuZXh0X2Jsb2NrID0gKHN0YWNrX2Jsb2NrKSA/IHN0YWNrX2Jsb2NrIC0+IHNiX25leHQgOiBOVUxMOworCisgICAgICAgIHN0YWNrX2Jsb2NrIC0+IHNiX25leHQgPSBOVUxMOworICAgICAgICBzdGFja19ibG9jayAtPiBzYl9wcmV2ID0gTlVMTDsKKyAgICAgICAgaWYgKHN0YWNrX2Jsb2NrICE9ICYgdGFza19zdGFjayAtPiB0c19maXJzdF9ibG9jaykgeworICAgICAgICAgICAgX19rbXBfdGhyZWFkX2ZyZWUoIHRocmVhZCwgc3RhY2tfYmxvY2sgKTsgIC8vIGZyZWUgdGhlIGJsb2NrLCBpZiBub3QgdGhlIGZpcnN0CisgICAgICAgIH0KKyAgICAgICAgc3RhY2tfYmxvY2sgPSBuZXh0X2Jsb2NrOworICAgIH0KKyAgICAvLyBpbml0aWFsaXplIHRoZSBzdGFjayB0byBiZSBlbXB0eQorICAgIHRhc2tfc3RhY2sgLT4gdHNfZW50cmllcyA9IDA7CisgICAgdGFza19zdGFjayAtPiB0c190b3AgPSBOVUxMOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgX19rbXBfcHVzaF90YXNrX3N0YWNrOiBQdXNoIHRoZSB0aWVkIHRhc2sgb250byB0aGUgdGFzayBzdGFjay4KKy8vICAgICBHcm93IHRoZSBzdGFjayBpZiBuZWNlc3NhcnkgYnkgYWxsb2NhdGluZyBhbm90aGVyIGJsb2NrLgorLy8KKy8vICBndGlkOiBnbG9iYWwgdGhyZWFkIGlkZW50aWZpZXIgZm9yIGNhbGxpbmcgdGhyZWFkCisvLyAgdGhyZWFkOiB0aHJlYWQgaW5mbyBmb3IgdGhyZWFkIGNvbnRhaW5pbmcgc3RhY2sKKy8vICB0aWVkX3Rhc2s6IHRoZSB0YXNrIHRvIHB1c2ggb24gdGhlIHN0YWNrCisKK3N0YXRpYyB2b2lkCitfX2ttcF9wdXNoX3Rhc2tfc3RhY2soIGttcF9pbnQzMiBndGlkLCBrbXBfaW5mb190ICp0aHJlYWQsIGttcF90YXNrZGF0YV90ICogdGllZF90YXNrICkKK3sKKyAgICAvLyBHRUggLSBuZWVkIHRvIGNvbnNpZGVyIHdoYXQgdG8gZG8gaWYgdHRfdGhyZWFkc19kYXRhIG5vdCBhbGxvY2F0ZWQgeWV0CisgICAga21wX3RocmVhZF9kYXRhX3QgKnRocmVhZF9kYXRhID0gJiB0aHJlYWQgLT4gdGgudGhfdGFza190ZWFtIC0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHQudHRfdGhyZWFkc19kYXRhWyBfX2ttcF90aWRfZnJvbV9ndGlkKCBndGlkICkgXTsKKyAgICBrbXBfdGFza19zdGFja190ICp0YXNrX3N0YWNrID0gJiB0aHJlYWRfZGF0YS0+dGQudGRfc3VzcF90aWVkX3Rhc2tzIDsKKworICAgIGlmICggdGllZF90YXNrLT50ZF9mbGFncy50ZWFtX3NlcmlhbCB8fCB0aWVkX3Rhc2stPnRkX2ZsYWdzLnRhc2tpbmdfc2VyICkgeworICAgICAgICByZXR1cm47ICAvLyBEb24ndCBwdXNoIGFueXRoaW5nIG9uIHN0YWNrIGlmIHRlYW0gb3IgdGVhbSB0YXNrcyBhcmUgc2VyaWFsaXplZAorICAgIH0KKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRpZWRfdGFzayAtPiB0ZF9mbGFncy50YXNrdHlwZSA9PSBUQVNLX1RJRUQgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrX3N0YWNrIC0+IHRzX3RvcCAhPSBOVUxMICk7CisKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9wdXNoX3Rhc2tfc3RhY2soZW50ZXIpOiBHVElEOiAlZDsgVEhSRUFEOiAlcDsgVEFTSzogJXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0aHJlYWQsIHRpZWRfdGFzayApICk7CisgICAgLy8gU3RvcmUgZW50cnkKKyAgICAqICh0YXNrX3N0YWNrIC0+IHRzX3RvcCkgPSB0aWVkX3Rhc2s7CisKKyAgICAvLyBEbyBib29ra2VlcGluZyBmb3IgbmV4dCBwdXNoCisgICAgdGFza19zdGFjayAtPiB0c190b3ArKzsKKyAgICB0YXNrX3N0YWNrIC0+IHRzX2VudHJpZXMrKzsKKworICAgIGlmICggdGFza19zdGFjayAtPiB0c19lbnRyaWVzICYgVEFTS19TVEFDS19JTkRFWF9NQVNLID09IDAgKQorICAgIHsKKyAgICAgICAgLy8gRmluZCBiZWdpbm5pbmcgb2YgdGhpcyB0YXNrIGJsb2NrCisgICAgICAgIGttcF9zdGFja19ibG9ja190ICpzdGFja19ibG9jayA9CisgICAgICAgICAgICAgKGttcF9zdGFja19ibG9ja190ICopICh0YXNrX3N0YWNrIC0+IHRzX3RvcCAtIFRBU0tfU1RBQ0tfQkxPQ0tfU0laRSk7CisKKyAgICAgICAgLy8gQ2hlY2sgaWYgd2UgYWxyZWFkeSBoYXZlIGEgYmxvY2sKKyAgICAgICAgaWYgKCBzdGFja19ibG9jayAtPiBzYl9uZXh0ICE9IE5VTEwgKQorICAgICAgICB7ICAgIC8vIHJlc2V0IHRzX3RvcCB0byBiZWdpbm5pbmcgb2YgbmV4dCBibG9jaworICAgICAgICAgICAgdGFza19zdGFjayAtPiB0c190b3AgPSAmIHN0YWNrX2Jsb2NrIC0+IHNiX25leHQgLT4gc2JfYmxvY2tbMF07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7ICAgLy8gQWxsb2MgbmV3IGJsb2NrIGFuZCBsaW5rIGl0IHVwCisgICAgICAgICAgICBrbXBfc3RhY2tfYmxvY2tfdCAqbmV3X2Jsb2NrID0gKGttcF9zdGFja19ibG9ja190ICopCisgICAgICAgICAgICAgIF9fa21wX3RocmVhZF9jYWxsb2ModGhyZWFkLCBzaXplb2Yoa21wX3N0YWNrX2Jsb2NrX3QpKTsKKworICAgICAgICAgICAgdGFza19zdGFjayAtPiB0c190b3AgID0gJiBuZXdfYmxvY2sgLT4gc2JfYmxvY2tbMF07CisgICAgICAgICAgICBzdGFja19ibG9jayAtPiBzYl9uZXh0ID0gbmV3X2Jsb2NrOworICAgICAgICAgICAgbmV3X2Jsb2NrICAtPiBzYl9wcmV2ID0gc3RhY2tfYmxvY2s7CisgICAgICAgICAgICBuZXdfYmxvY2sgIC0+IHNiX25leHQgPSBOVUxMOworCisgICAgICAgICAgICBLQV9UUkFDRSgzMCwgKCJfX2ttcF9wdXNoX3Rhc2tfc3RhY2soKTogR1RJRDogJWQ7IFRBU0s6ICVwOyBBbGxvYyBuZXcgYmxvY2s6ICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0aWVkX3Rhc2ssIG5ld19ibG9jayApICk7CisgICAgICAgIH0KKyAgICB9CisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfcHVzaF90YXNrX3N0YWNrKGV4aXQpOiBHVElEOiAlZDsgVEFTSzogJXBcbiIsIGd0aWQsIHRpZWRfdGFzayApICk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgX19rbXBfcG9wX3Rhc2tfc3RhY2s6IFBvcCB0aGUgdGllZCB0YXNrIGZyb20gdGhlIHRhc2sgc3RhY2suICBEb24ndCByZXR1cm4KKy8vICAgICB0aGUgdGFzaywganVzdCBjaGVjayB0byBtYWtlIHN1cmUgaXQgbWF0Y2hlcyB0aGUgZW5kaW5nIHRhc2sgcGFzc2VkIGluLgorLy8KKy8vICBndGlkOiBnbG9iYWwgdGhyZWFkIGlkZW50aWZpZXIgZm9yIHRoZSBjYWxsaW5nIHRocmVhZAorLy8gIHRocmVhZDogdGhyZWFkIGluZm8gc3RydWN0dXJlIGNvbnRhaW5pbmcgc3RhY2sKKy8vICB0aWVkX3Rhc2s6IHRoZSB0YXNrIHBvcHBlZCBvZmYgdGhlIHN0YWNrCisvLyAgZW5kaW5nX3Rhc2s6IHRoZSB0YXNrIHRoYXQgaXMgZW5kaW5nIChzaG91bGQgbWF0Y2ggcG9wcGVkIHRhc2spCisKK3N0YXRpYyB2b2lkCitfX2ttcF9wb3BfdGFza19zdGFjaygga21wX2ludDMyIGd0aWQsIGttcF9pbmZvX3QgKnRocmVhZCwga21wX3Rhc2tkYXRhX3QgKmVuZGluZ190YXNrICkKK3sKKyAgICAvLyBHRUggLSBuZWVkIHRvIGNvbnNpZGVyIHdoYXQgdG8gZG8gaWYgdHRfdGhyZWFkc19kYXRhIG5vdCBhbGxvY2F0ZWQgeWV0CisgICAga21wX3RocmVhZF9kYXRhX3QgKnRocmVhZF9kYXRhID0gJiB0aHJlYWQgLT4gdGgudGhfdGFza190ZWFtIC0+IHR0X3RocmVhZHNfZGF0YVsgX19rbXBfdGlkX2Zyb21fZ3RpZCggZ3RpZCApIF07CisgICAga21wX3Rhc2tfc3RhY2tfdCAqdGFza19zdGFjayA9ICYgdGhyZWFkX2RhdGEtPnRkLnRkX3N1c3BfdGllZF90YXNrcyA7CisgICAga21wX3Rhc2tkYXRhX3QgKnRpZWRfdGFzazsKKworICAgIGlmICggZW5kaW5nX3Rhc2stPnRkX2ZsYWdzLnRlYW1fc2VyaWFsIHx8IGVuZGluZ190YXNrLT50ZF9mbGFncy50YXNraW5nX3NlciApIHsKKyAgICAgICAgcmV0dXJuOyAgLy8gRG9uJ3QgcG9wIGFueXRoaW5nIGZyb20gc3RhY2sgaWYgdGVhbSBvciB0ZWFtIHRhc2tzIGFyZSBzZXJpYWxpemVkCisgICAgfQorCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza19zdGFjayAtPiB0c190b3AgIT0gTlVMTCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tfc3RhY2sgLT4gdHNfZW50cmllcyA+IDAgKTsKKworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3BvcF90YXNrX3N0YWNrKGVudGVyKTogR1RJRDogJWQ7IFRIUkVBRDogJXBcbiIsIGd0aWQsIHRocmVhZCApICk7CisKKyAgICAvLyBmaXggdXAgdHNfdG9wIGlmIHdlIG5lZWQgdG8gcG9wIGZyb20gcHJldmlvdXMgYmxvY2sKKyAgICBpZiAoIHRhc2tfc3RhY2sgLT4gdHNfZW50cmllcyAmIFRBU0tfU1RBQ0tfSU5ERVhfTUFTSyA9PSAwICkKKyAgICB7CisgICAgICAgIGttcF9zdGFja19ibG9ja190ICpzdGFja19ibG9jayA9CisgICAgICAgICAgIChrbXBfc3RhY2tfYmxvY2tfdCAqKSAodGFza19zdGFjayAtPiB0c190b3ApIDsKKworICAgICAgICBzdGFja19ibG9jayA9IHN0YWNrX2Jsb2NrIC0+IHNiX3ByZXY7CisgICAgICAgIHRhc2tfc3RhY2sgLT4gdHNfdG9wID0gJiBzdGFja19ibG9jayAtPiBzYl9ibG9ja1tUQVNLX1NUQUNLX0JMT0NLX1NJWkVdOworICAgIH0KKworICAgIC8vIGZpbmlzaCBib29ra2VlcGluZworICAgIHRhc2tfc3RhY2sgLT4gdHNfdG9wLS07CisgICAgdGFza19zdGFjayAtPiB0c19lbnRyaWVzLS07CisKKyAgICB0aWVkX3Rhc2sgPSAqICh0YXNrX3N0YWNrIC0+IHRzX3RvcCApOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGllZF90YXNrICE9IE5VTEwgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aWVkX3Rhc2sgLT4gdGRfZmxhZ3MudGFza3R5cGUgPT0gVEFTS19USUVEICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGllZF90YXNrID09IGVuZGluZ190YXNrICk7ICAvLyBJZiB3ZSBidWlsdCB0aGUgc3RhY2sgY29ycmVjdGx5CisKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9wb3BfdGFza19zdGFjayhleGl0KTogR1RJRDogJWQ7IFRBU0s6ICVwXG4iLCBndGlkLCB0aWVkX3Rhc2sgKSApOworICAgIHJldHVybjsKK30KKyNlbmRpZiAvKiBCVUlMRF9USUVEX1RBU0tfU1RBQ0sgKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBfX2ttcF9wdXNoX3Rhc2s6IEFkZCBhIHRhc2sgdG8gdGhlIHRocmVhZCdzIGRlcXVlCisKK3N0YXRpYyBrbXBfaW50MzIKK19fa21wX3B1c2hfdGFzayhrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqIHRhc2sgKQoreworICAgIGttcF9pbmZvX3QgKiAgICAgICAgdGhyZWFkID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIGttcF90YXNrZGF0YV90ICogICAgdGFza2RhdGEgPSBLTVBfVEFTS19UT19UQVNLREFUQSh0YXNrKTsKKyAgICBrbXBfdGFza190ZWFtX3QgKiAgIHRhc2tfdGVhbSA9IHRocmVhZC0+dGgudGhfdGFza190ZWFtOworICAgIGttcF9pbnQzMiAgICAgICAgICAgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ3RpZCApOworICAgIGttcF90aHJlYWRfZGF0YV90ICogdGhyZWFkX2RhdGE7CisKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9wdXNoX3Rhc2s6IFQjJWQgdHJ5aW5nIHRvIHB1c2ggdGFzayAlcC5cbiIsIGd0aWQsIHRhc2tkYXRhICkgKTsKKworICAgIC8vIFRoZSBmaXJzdCBjaGVjayBhdm9pZHMgYnVpbGRpbmcgdGFza190ZWFtIHRocmVhZCBkYXRhIGlmIHNlcmlhbGl6ZWQKKyAgICBpZiAoIHRhc2tkYXRhLT50ZF9mbGFncy50YXNrX3NlcmlhbCApIHsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICggIl9fa21wX3B1c2hfdGFzazogVCMlZCB0ZWFtIHNlcmlhbGl6ZWQ7IHJldHVybmluZyBUQVNLX05PVF9QVVNIRUQgZm9yIHRhc2sgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhICkgKTsKKyAgICAgICAgcmV0dXJuIFRBU0tfTk9UX1BVU0hFRDsKKyAgICB9CisKKyAgICAvLyBOb3cgdGhhdCBzZXJpYWxpemVkIHRhc2tzIGhhdmUgcmV0dXJuZWQsIHdlIGNhbiBhc3N1bWUgdGhhdCB3ZSBhcmUgbm90IGluIGltbWVkaWF0ZSBleGVjIG1vZGUKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApOworICAgIGlmICggISBLTVBfVEFTS0lOR19FTkFCTEVEKCB0YXNrX3RlYW0sIHRocmVhZC0+dGgudGhfdGFza19zdGF0ZSApICkgeworICAgICAgICAgX19rbXBfZW5hYmxlX3Rhc2tpbmcoIHRhc2tfdGVhbSwgdGhyZWFkICk7CisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQoIFRDUl80KHRhc2tfdGVhbSAtPiB0dC50dF9mb3VuZF90YXNrcykgPT0gVFJVRSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIFRDUl9QVFIodGFza190ZWFtIC0+IHR0LnR0X3RocmVhZHNfZGF0YSkgIT0gTlVMTCApOworCisgICAgLy8gRmluZCB0YXNraW5nIGRlcXVlIHNwZWNpZmljIHRvIGVuY291bnRlcmluZyB0aHJlYWQKKyAgICB0aHJlYWRfZGF0YSA9ICYgdGFza190ZWFtIC0+IHR0LnR0X3RocmVhZHNfZGF0YVsgdGlkIF07CisKKyAgICAvLyBObyBsb2NrIG5lZWRlZCBzaW5jZSBvbmx5IG93bmVyIGNhbiBhbGxvY2F0ZQorICAgIGlmICh0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZSA9PSBOVUxMICkgeworICAgICAgICBfX2ttcF9hbGxvY190YXNrX2RlcXVlKCB0aHJlYWQsIHRocmVhZF9kYXRhICk7CisgICAgfQorCisgICAgLy8gQ2hlY2sgaWYgZGVxdWUgaXMgZnVsbAorICAgIGlmICggVENSXzQodGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbnRhc2tzKSA+PSBUQVNLX0RFUVVFX1NJWkUgKQorICAgIHsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICggIl9fa21wX3B1c2hfdGFzazogVCMlZCBkZXF1ZSBpcyBmdWxsOyByZXR1cm5pbmcgVEFTS19OT1RfUFVTSEVEIGZvciB0YXNrICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0YXNrZGF0YSApICk7CisgICAgICAgIHJldHVybiBUQVNLX05PVF9QVVNIRUQ7CisgICAgfQorCisgICAgLy8gTG9jayB0aGUgZGVxdWUgZm9yIHRoZSB0YXNrIHB1c2ggb3BlcmF0aW9uCisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9sb2NrICk7CisKKyAgICAvLyBNdXN0IGhhdmUgcm9vbSBzaW5jZSBubyB0aHJlYWQgY2FuIGFkZCB0YXNrcyBidXQgY2FsbGluZyB0aHJlYWQKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBUQ1JfNCh0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9udGFza3MpIDwgVEFTS19ERVFVRV9TSVpFICk7CisKKyAgICB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZVsgdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfdGFpbCBdID0gdGFza2RhdGE7ICAvLyBQdXNoIHRhc2tkYXRhCisgICAgLy8gV3JhcCBpbmRleC4KKyAgICB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV90YWlsID0gKCB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV90YWlsICsgMSApICYgVEFTS19ERVFVRV9NQVNLOworICAgIFRDV180KHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX250YXNrcywgVENSXzQodGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbnRhc2tzKSArIDEpOyAgICAgICAgICAgICAvLyBBZGp1c3QgdGFzayBjb3VudAorCisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9sb2NrICk7CisKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9wdXNoX3Rhc2s6IFQjJWQgcmV0dXJuaW5nIFRBU0tfU1VDQ0VTU0ZVTExZX1BVU0hFRDogIgorICAgICAgICAgICAgICAgICAgInRhc2s9JXAgbnRhc2tzPSVkIGhlYWQ9JXUgdGFpbD0ldVxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhLCB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfbnRhc2tzLAorICAgICAgICAgICAgICAgICAgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX3RhaWwsIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9oZWFkKSApOworCisgICAgcmV0dXJuIFRBU0tfU1VDQ0VTU0ZVTExZX1BVU0hFRDsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF9wb3BfY3VycmVudF90YXNrX2Zyb21fdGhyZWFkOiBzZXQgdXAgY3VycmVudCB0YXNrIGZyb20gY2FsbGVkIHRocmVhZCB3aGVuIHRlYW0gZW5kcworLy8gdGhpc190aHI6IHRocmVhZCBzdHJ1Y3R1cmUgdG8gc2V0IGN1cnJlbnRfdGFzayBpbi4KKwordm9pZAorX19rbXBfcG9wX2N1cnJlbnRfdGFza19mcm9tX3RocmVhZCgga21wX2luZm9fdCAqdGhpc190aHIgKQoreworICAgIEtGX1RSQUNFKCAxMCwgKCJfX2ttcF9wb3BfY3VycmVudF90YXNrX2Zyb21fdGhyZWFkKGVudGVyKTogVCMlZCB0aGlzX3RocmVhZD0lcCwgY3VydGFzaz0lcCwgIgorICAgICAgICAgICAgICAgICAgICJjdXJ0YXNrX3BhcmVudD0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAwLCB0aGlzX3RociwgdGhpc190aHIgLT4gdGgudGhfY3VycmVudF90YXNrLAorICAgICAgICAgICAgICAgICAgIHRoaXNfdGhyIC0+IHRoLnRoX2N1cnJlbnRfdGFzayAtPiB0ZF9wYXJlbnQgKSApOworCisgICAgdGhpc190aHIgLT4gdGgudGhfY3VycmVudF90YXNrID0gdGhpc190aHIgLT4gdGgudGhfY3VycmVudF90YXNrIC0+IHRkX3BhcmVudDsKKworICAgIEtGX1RSQUNFKCAxMCwgKCJfX2ttcF9wb3BfY3VycmVudF90YXNrX2Zyb21fdGhyZWFkKGV4aXQpOiBUIyVkIHRoaXNfdGhyZWFkPSVwLCBjdXJ0YXNrPSVwLCAiCisgICAgICAgICAgICAgICAgICAgImN1cnRhc2tfcGFyZW50PSVwXG4iLAorICAgICAgICAgICAgICAgICAgIDAsIHRoaXNfdGhyLCB0aGlzX3RociAtPiB0aC50aF9jdXJyZW50X3Rhc2ssCisgICAgICAgICAgICAgICAgICAgdGhpc190aHIgLT4gdGgudGhfY3VycmVudF90YXNrIC0+IHRkX3BhcmVudCApICk7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX3B1c2hfY3VycmVudF90YXNrX3RvX3RocmVhZDogc2V0IHVwIGN1cnJlbnQgdGFzayBpbiBjYWxsZWQgdGhyZWFkIGZvciBhIG5ldyB0ZWFtCisvLyB0aGlzX3RocjogdGhyZWFkIHN0cnVjdHVyZSB0byBzZXQgdXAKKy8vIHRlYW06IHRlYW0gZm9yIGltcGxpY2l0IHRhc2sgZGF0YQorLy8gdGlkOiB0aHJlYWQgd2l0aGluIHRlYW0gdG8gc2V0IHVwCisKK3ZvaWQKK19fa21wX3B1c2hfY3VycmVudF90YXNrX3RvX3RocmVhZCgga21wX2luZm9fdCAqdGhpc190aHIsIGttcF90ZWFtX3QgKnRlYW0sIGludCB0aWQgKQoreworICAgIC8vIGN1cnJlbnQgdGFzayBvZiB0aGUgdGhyZWFkIGlzIGEgcGFyZW50IG9mIHRoZSBuZXcganVzdCBjcmVhdGVkIGltcGxpY2l0IHRhc2tzIG9mIG5ldyB0ZWFtCisgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9wdXNoX2N1cnJlbnRfdGFza190b190aHJlYWQoZW50ZXIpOiBUIyVkIHRoaXNfdGhyZWFkPSVwIGN1cnRhc2s9JXAgIgorICAgICAgICAgICAgICAgICAgICAicGFyZW50X3Rhc2s9JXBcbiIsCisgICAgICAgICAgICAgICAgICAgIHRpZCwgdGhpc190aHIsIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2ssCisgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0udGRfcGFyZW50ICkgKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQgKHRoaXNfdGhyICE9IE5VTEwpOworCisgICAgaWYoIHRpZCA9PSAwICkgeworICAgICAgICBpZiggdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzayAhPSAmIHRlYW0gLT4gdC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbIDAgXSApIHsKKyAgICAgICAgICAgIHRlYW0gLT4gdC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbIDAgXS50ZF9wYXJlbnQgPSB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrOworICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzayA9ICYgdGVhbSAtPiB0LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVsgMCBdOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGVhbSAtPiB0LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVsgdGlkIF0udGRfcGFyZW50ID0gdGVhbSAtPiB0LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVsgMCBdLnRkX3BhcmVudDsKKyAgICAgICAgdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzayA9ICYgdGVhbSAtPiB0LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVsgdGlkIF07CisgICAgfQorCisgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9wdXNoX2N1cnJlbnRfdGFza190b190aHJlYWQoZXhpdCk6IFQjJWQgdGhpc190aHJlYWQ9JXAgY3VydGFzaz0lcCAiCisgICAgICAgICAgICAgICAgICAgICJwYXJlbnRfdGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgdGlkLCB0aGlzX3RociwgdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzaywKKyAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS50ZF9wYXJlbnQgKSApOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfdGFza19zdGFydDogYm9va2tlZXBpbmcgZm9yIGEgdGFzayBzdGFydGluZyBleGVjdXRpb24KKy8vIEdUSUQ6IGdsb2JhbCB0aHJlYWQgaWQgb2YgY2FsbGluZyB0aHJlYWQKKy8vIHRhc2s6IHRhc2sgc3RhcnRpbmcgZXhlY3V0aW9uCisvLyBjdXJyZW50X3Rhc2s6IHRhc2sgc3VzcGVuZGluZworCitzdGF0aWMgdm9pZAorX19rbXBfdGFza19zdGFydCgga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKiB0YXNrLCBrbXBfdGFza2RhdGFfdCAqIGN1cnJlbnRfdGFzayApCit7CisgICAga21wX3Rhc2tkYXRhX3QgKiB0YXNrZGF0YSA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spOworICAgIGttcF9pbmZvX3QgKiB0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF90YXNrX3N0YXJ0KGVudGVyKTogVCMlZCBzdGFydGluZyB0YXNrICVwOiBjdXJyZW50X3Rhc2s9JXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0YXNrZGF0YSwgY3VycmVudF90YXNrKSApOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2RhdGEgLT4gdGRfZmxhZ3MudGFza3R5cGUgPT0gVEFTS19FWFBMSUNJVCApOworCisgICAgLy8gbWFyayBjdXJyZW50bHkgZXhlY3V0aW5nIHRhc2sgYXMgc3VzcGVuZGVkCisgICAgLy8gVE9ETzogR0VIIC0gbWFrZSBzdXJlIHJvb3QgdGVhbSBpbXBsaWNpdCB0YXNrIGlzIGluaXRpYWxpemVkIHByb3Blcmx5LgorICAgIC8vIEtNUF9ERUJVR19BU1NFUlQoIGN1cnJlbnRfdGFzayAtPiB0ZF9mbGFncy5leGVjdXRpbmcgPT0gMSApOworICAgIGN1cnJlbnRfdGFzayAtPiB0ZF9mbGFncy5leGVjdXRpbmcgPSAwOworCisgICAgLy8gQWRkIHRhc2sgdG8gc3RhY2sgaWYgdGllZAorI2lmZGVmIEJVSUxEX1RJRURfVEFTS19TVEFDSworICAgIGlmICggdGFza2RhdGEgLT4gdGRfZmxhZ3MudGllZG5lc3MgPT0gVEFTS19USUVEICkKKyAgICB7CisgICAgICAgIF9fa21wX3B1c2hfdGFza19zdGFjayggZ3RpZCwgdGhyZWFkLCB0YXNrZGF0YSApOworICAgIH0KKyNlbmRpZiAvKiBCVUlMRF9USUVEX1RBU0tfU1RBQ0sgKi8KKworICAgIC8vIG1hcmsgc3RhcnRpbmcgdGFzayBhcyBleGVjdXRpbmcgYW5kIGFzIGN1cnJlbnQgdGFzaworICAgIHRocmVhZCAtPiB0aC50aF9jdXJyZW50X3Rhc2sgPSB0YXNrZGF0YTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLnN0YXJ0ZWQgPT0gMCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLmV4ZWN1dGluZyA9PSAwICk7CisgICAgdGFza2RhdGEgLT4gdGRfZmxhZ3Muc3RhcnRlZCA9IDE7CisgICAgdGFza2RhdGEgLT4gdGRfZmxhZ3MuZXhlY3V0aW5nID0gMTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YSAtPiB0ZF9mbGFncy5jb21wbGV0ZSA9PSAwICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2RhdGEgLT4gdGRfZmxhZ3MuZnJlZWQgPT0gMCApOworCisgICAgLy8gR0VIIFRPRE86IHNob3VsZG4ndCB3ZSBwYXNzIHNvbWUgc29ydCBvZiBsb2NhdGlvbiBpZGVudGlmaWVyIGhlcmU/CisgICAgLy8gQVBUOiB5ZXMsIHdlIHdpbGwgcGFzcyBsb2NhdGlvbiBoZXJlLgorICAgIC8vIG5lZWQgdG8gc3RvcmUgY3VycmVudCB0aHJlYWQgc3RhdGUgKGluIGEgdGhyZWFkIG9yIHRhc2tkYXRhIHN0cnVjdHVyZSkKKyAgICAvLyBiZWZvcmUgc2V0dGluZyB3b3JrX3N0YXRlLCBvdGhlcndpc2Ugd3Jvbmcgc3RhdGUgaXMgc2V0IGFmdGVyIGVuZCBvZiB0YXNrCisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF90YXNrX3N0YXJ0KGV4aXQpOiBUIyVkIHRhc2s9JXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0YXNrZGF0YSApICk7CisKKyAgICByZXR1cm47Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcGNfb21wX3Rhc2tfYmVnaW5faWYwOiByZXBvcnQgdGhhdCBhIGdpdmVuIHNlcmlhbGl6ZWQgdGFzayBoYXMgc3RhcnRlZCBleGVjdXRpb24KKy8vIGxvY19yZWY6IHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbjsgcG9pbnRzIHRvIGJlZ2lubmluZyBvZiB0YXNrIGJsb2NrLgorLy8gZ3RpZDogZ2xvYmFsIHRocmVhZCBudW1iZXIuCisvLyB0YXNrOiB0YXNrIHRodW5rIGZvciB0aGUgc3RhcnRlZCB0YXNrLgorCit2b2lkCitfX2ttcGNfb21wX3Rhc2tfYmVnaW5faWYwKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqIHRhc2sgKQoreworICAgIGttcF90YXNrZGF0YV90ICogdGFza2RhdGEgPSBLTVBfVEFTS19UT19UQVNLREFUQSh0YXNrKTsKKyAgICBrbXBfdGFza2RhdGFfdCAqIGN1cnJlbnRfdGFzayA9IF9fa21wX3RocmVhZHNbIGd0aWQgXSAtPiB0aC50aF9jdXJyZW50X3Rhc2s7CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2tfYmVnaW5faWYwKGVudGVyKTogVCMlZCBsb2M9JXAgdGFzaz0lcCBjdXJyZW50X3Rhc2s9JXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBsb2NfcmVmLCB0YXNrZGF0YSwgY3VycmVudF90YXNrICkgKTsKKworICAgIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLnRhc2tfc2VyaWFsID0gMTsgIC8vIEV4ZWN1dGUgdGhpcyB0YXNrIGltbWVkaWF0ZWx5LCBub3QgZGVmZXJyZWQuCisgICAgX19rbXBfdGFza19zdGFydCggZ3RpZCwgdGFzaywgY3VycmVudF90YXNrICk7CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2tfYmVnaW5faWYwKGV4aXQpOiBUIyVkIGxvYz0lcCB0YXNrPSVwLFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsIHRhc2tkYXRhICkgKTsKKworICAgIHJldHVybjsKK30KKworI2lmZGVmIFRBU0tfVU5VU0VECisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wY19vbXBfdGFza19iZWdpbjogcmVwb3J0IHRoYXQgYSBnaXZlbiB0YXNrIGhhcyBzdGFydGVkIGV4ZWN1dGlvbgorLy8gTkVWRVIgR0VORVJBVEVEIEJZIENPTVBJTEVSLCBERVBSRUNBVEVEISEhCisKK3ZvaWQKK19fa21wY19vbXBfdGFza19iZWdpbiggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKiB0YXNrICkKK3sKKyAgICBrbXBfdGFza2RhdGFfdCAqIGN1cnJlbnRfdGFzayA9IF9fa21wX3RocmVhZHNbIGd0aWQgXSAtPiB0aC50aF9jdXJyZW50X3Rhc2s7CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2tfYmVnaW4oZW50ZXIpOiBUIyVkIGxvYz0lcCB0YXNrPSVwIGN1cnJlbnRfdGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsIEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spLCBjdXJyZW50X3Rhc2sgKSApOworCisgICAgX19rbXBfdGFza19zdGFydCggZ3RpZCwgdGFzaywgY3VycmVudF90YXNrICk7CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2tfYmVnaW4oZXhpdCk6IFQjJWQgbG9jPSVwIHRhc2s9JXAsXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgbG9jX3JlZiwgS01QX1RBU0tfVE9fVEFTS0RBVEEodGFzaykgKSApOworCisgICAgcmV0dXJuOworfQorI2VuZGlmIC8vIFRBU0tfVU5VU0VECisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF9mcmVlX3Rhc2s6IGZyZWUgdGhlIGN1cnJlbnQgdGFzayBzcGFjZSBhbmQgdGhlIHNwYWNlIGZvciBzaGFyZWRzCisvLyBndGlkOiBHbG9iYWwgdGhyZWFkIElEIG9mIGNhbGxpbmcgdGhyZWFkCisvLyB0YXNrZGF0YTogdGFzayB0byBmcmVlCisvLyB0aHJlYWQ6IHRocmVhZCBkYXRhIHN0cnVjdHVyZSBvZiBjYWxsZXIKKworc3RhdGljIHZvaWQKK19fa21wX2ZyZWVfdGFzaygga21wX2ludDMyIGd0aWQsIGttcF90YXNrZGF0YV90ICogdGFza2RhdGEsIGttcF9pbmZvX3QgKiB0aHJlYWQgKQoreworICAgIEtBX1RSQUNFKDMwLCAoIl9fa21wX2ZyZWVfdGFzazogVCMlZCBmcmVlaW5nIGRhdGEgZnJvbSB0YXNrICVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEpICk7CisKKyAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgYWxsIGZsYWdzIGFuZCBjb3VudGVycyBoYXZlIHRoZSBjb3JyZWN0IHZhbHVlcworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhLT50ZF9mbGFncy50YXNrdHlwZSA9PSBUQVNLX0VYUExJQ0lUICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2RhdGEtPnRkX2ZsYWdzLmV4ZWN1dGluZyA9PSAwICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2RhdGEtPnRkX2ZsYWdzLmNvbXBsZXRlID09IDEgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YS0+dGRfZmxhZ3MuZnJlZWQgPT0gMCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIFRDUl80KHRhc2tkYXRhLT50ZF9hbGxvY2F0ZWRfY2hpbGRfdGFza3MpID09IDAgIHx8IHRhc2tkYXRhLT50ZF9mbGFncy50YXNrX3NlcmlhbCA9PSAxKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBUQ1JfNCh0YXNrZGF0YS0+dGRfaW5jb21wbGV0ZV9jaGlsZF90YXNrcykgPT0gMCApOworCisgICAgdGFza2RhdGEtPnRkX2ZsYWdzLmZyZWVkID0gMTsKKyAgICAvLyBkZWFsbG9jYXRlIHRoZSB0YXNrZGF0YSBhbmQgc2hhcmVkIHZhcmlhYmxlIGJsb2NrcyBhc3NvY2lhdGVkIHdpdGggdGhpcyB0YXNrCisgICAgI2lmIFVTRV9GQVNUX01FTU9SWQorICAgICAgICBfX2ttcF9mYXN0X2ZyZWUoIHRocmVhZCwgdGFza2RhdGEgKTsKKyAgICAjZWxzZSAvKiAhIFVTRV9GQVNUX01FTU9SWSAqLworICAgICAgICBfX2ttcF90aHJlYWRfZnJlZSggdGhyZWFkLCB0YXNrZGF0YSApOworICAgICNlbmRpZgorCisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfZnJlZV90YXNrOiBUIyVkIGZyZWVkIHRhc2sgJXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0YXNrZGF0YSkgKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF9mcmVlX3Rhc2tfYW5kX2FuY2VzdG9yczogZnJlZSB0aGUgY3VycmVudCB0YXNrIGFuZCBhbmNlc3RvcnMgd2l0aG91dCBjaGlsZHJlbgorLy8KKy8vIGd0aWQ6IEdsb2JhbCB0aHJlYWQgSUQgb2YgY2FsbGluZyB0aHJlYWQKKy8vIHRhc2tkYXRhOiB0YXNrIHRvIGZyZWUKKy8vIHRocmVhZDogdGhyZWFkIGRhdGEgc3RydWN0dXJlIG9mIGNhbGxlcgorCitzdGF0aWMgdm9pZAorX19rbXBfZnJlZV90YXNrX2FuZF9hbmNlc3RvcnMoIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza2RhdGFfdCAqIHRhc2tkYXRhLCBrbXBfaW5mb190ICogdGhyZWFkICkKK3sKKyAgICBrbXBfaW50MzIgY2hpbGRyZW4gPSAwOworICAgIGttcF9pbnQzMiB0ZWFtX29yX3Rhc2tpbmdfc2VyaWFsaXplZCA9IHRhc2tkYXRhIC0+IHRkX2ZsYWdzLnRlYW1fc2VyaWFsIHx8IHRhc2tkYXRhIC0+IHRkX2ZsYWdzLnRhc2tpbmdfc2VyOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2RhdGEgLT4gdGRfZmxhZ3MudGFza3R5cGUgPT0gVEFTS19FWFBMSUNJVCApOworCisgICAgaWYgKCAhdGVhbV9vcl90YXNraW5nX3NlcmlhbGl6ZWQgKSB7CisgICAgICAgIGNoaWxkcmVuID0gS01QX1RFU1RfVEhFTl9ERUMzMiggKGttcF9pbnQzMiAqKSgmIHRhc2tkYXRhIC0+IHRkX2FsbG9jYXRlZF9jaGlsZF90YXNrcykgKSAtIDE7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGNoaWxkcmVuID49IDAgKTsKKyAgICB9CisKKyAgICAvLyBOb3csIGdvIHVwIHRoZSBhbmNlc3RvciB0cmVlIHRvIHNlZSBpZiBhbnkgYW5jZXN0b3JzIGNhbiBub3cgYmUgZnJlZWQuCisgICAgd2hpbGUgKCBjaGlsZHJlbiA9PSAwICkKKyAgICB7CisgICAgICAgIGttcF90YXNrZGF0YV90ICogcGFyZW50X3Rhc2tkYXRhID0gdGFza2RhdGEgLT4gdGRfcGFyZW50OworCisgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2ZyZWVfdGFza19hbmRfYW5jZXN0b3JzKGVudGVyKTogVCMlZCB0YXNrICVwIGNvbXBsZXRlICIKKyAgICAgICAgICAgICAgICAgICAgICAiYW5kIGZyZWVpbmcgaXRzZWxmXG4iLCBndGlkLCB0YXNrZGF0YSkgKTsKKworICAgICAgICAvLyAtLS0gRGVhbGxvY2F0ZSBteSBhbmNlc3RvciB0YXNrIC0tLQorICAgICAgICBfX2ttcF9mcmVlX3Rhc2soIGd0aWQsIHRhc2tkYXRhLCB0aHJlYWQgKTsKKworICAgICAgICB0YXNrZGF0YSA9IHBhcmVudF90YXNrZGF0YTsKKworICAgICAgICAvLyBTdG9wIGNoZWNraW5nIGFuY2VzdG9ycyBhdCBpbXBsaWNpdCB0YXNrIG9yIGlmIHRhc2tpbmcgc2VyaWFsaXplZAorICAgICAgICAvLyBpbnN0ZWFkIG9mIHdhbGtpbmcgdXAgYW5jZXN0b3IgdHJlZSB0byBhdm9pZCBwcmVtYXR1cmUgZGVhbGxvY2F0aW9uIG9mIGFuY2VzdG9ycy4KKyAgICAgICAgaWYgKCB0ZWFtX29yX3Rhc2tpbmdfc2VyaWFsaXplZCB8fCB0YXNrZGF0YSAtPiB0ZF9mbGFncy50YXNrdHlwZSA9PSBUQVNLX0lNUExJQ0lUICkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAoICF0ZWFtX29yX3Rhc2tpbmdfc2VyaWFsaXplZCApIHsKKyAgICAgICAgICAgIC8vIFByZWRlY3JlbWVudCBzaW11bGF0ZWQgYnkgIi0gMSIgY2FsY3VsYXRpb24KKyAgICAgICAgICAgIGNoaWxkcmVuID0gS01QX1RFU1RfVEhFTl9ERUMzMiggKGttcF9pbnQzMiAqKSgmIHRhc2tkYXRhIC0+IHRkX2FsbG9jYXRlZF9jaGlsZF90YXNrcykgKSAtIDE7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBjaGlsZHJlbiA+PSAwICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9mcmVlX3Rhc2tfYW5kX2FuY2VzdG9ycyhleGl0KTogVCMlZCB0YXNrICVwIGhhcyAlZCBjaGlsZHJlbjsgIgorICAgICAgICAgICAgICAgICAgIm5vdCBmcmVlaW5nIGl0IHlldFxuIiwgZ3RpZCwgdGFza2RhdGEsIGNoaWxkcmVuKSApOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfdGFza19maW5pc2g6IGJvb2trZWVwaW5nIHRvIGRvIHdoZW4gYSB0YXNrIGZpbmlzaGVzIGV4ZWN1dGlvbgorLy8gZ3RpZDogZ2xvYmFsIHRocmVhZCBJRCBmb3IgY2FsbGluZyB0aHJlYWQKKy8vIHRhc2s6IHRhc2sgdG8gYmUgZmluaXNoZWQKKy8vIHJlc3VtZWRfdGFzazogdGFzayB0byBiZSByZXN1bWVkLiAgKG1heSBiZSBOVUxMIGlmIHRhc2sgaXMgc2VyaWFsaXplZCkKKworc3RhdGljIHZvaWQKK19fa21wX3Rhc2tfZmluaXNoKCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqdGFzaywga21wX3Rhc2tkYXRhX3QgKnJlc3VtZWRfdGFzayApCit7CisgICAga21wX3Rhc2tkYXRhX3QgKiB0YXNrZGF0YSA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spOworICAgIGttcF9pbmZvX3QgKiB0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAga21wX2ludDMyIGNoaWxkcmVuID0gMDsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3Rhc2tfZmluaXNoKGVudGVyKTogVCMlZCBmaW5pc2hpbmcgdGFzayAlcCBhbmQgcmVzdW1pbmcgdGFzayAlcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhLCByZXN1bWVkX3Rhc2spICk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YSAtPiB0ZF9mbGFncy50YXNrdHlwZSA9PSBUQVNLX0VYUExJQ0lUICk7CisKKyAgICAvLyBQb3AgdGFzayBmcm9tIHN0YWNrIGlmIHRpZWQKKyNpZmRlZiBCVUlMRF9USUVEX1RBU0tfU1RBQ0sKKyAgICBpZiAoIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLnRpZWRuZXNzID09IFRBU0tfVElFRCApCisgICAgeworICAgICAgICBfX2ttcF9wb3BfdGFza19zdGFjayggZ3RpZCwgdGhyZWFkLCB0YXNrZGF0YSApOworICAgIH0KKyNlbmRpZiAvKiBCVUlMRF9USUVEX1RBU0tfU1RBQ0sgKi8KKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLmV4ZWN1dGluZyA9PSAxICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2RhdGEgLT4gdGRfZmxhZ3MuY29tcGxldGUgPT0gMCApOworICAgIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLmV4ZWN1dGluZyA9IDA7ICAvLyBzdXNwZW5kIHRoZSBmaW5pc2hpbmcgdGFzaworICAgIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLmNvbXBsZXRlID0gMTsgICAvLyBtYXJrIHRoZSB0YXNrIGFzIGNvbXBsZXRlZAorICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLnN0YXJ0ZWQgPT0gMSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLmZyZWVkID09IDAgKTsKKworICAgIC8vIE9ubHkgbmVlZCB0byBrZWVwIHRyYWNrIG9mIGNvdW50IGlmIHRlYW0gcGFyYWxsZWwgYW5kIHRhc2tpbmcgbm90IHNlcmlhbGl6ZWQKKyAgICBpZiAoICEoIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLnRlYW1fc2VyaWFsIHx8IHRhc2tkYXRhIC0+IHRkX2ZsYWdzLnRhc2tpbmdfc2VyICkgKSB7CisgICAgICAgIC8vIFByZWRlY3JlbWVudCBzaW11bGF0ZWQgYnkgIi0gMSIgY2FsY3VsYXRpb24KKyAgICAgICAgY2hpbGRyZW4gPSBLTVBfVEVTVF9USEVOX0RFQzMyKCAoa21wX2ludDMyICopKCYgdGFza2RhdGEgLT4gdGRfcGFyZW50IC0+IHRkX2luY29tcGxldGVfY2hpbGRfdGFza3MpICkgLSAxOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBjaGlsZHJlbiA+PSAwICk7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgaWYgKCB0YXNrZGF0YS0+dGRfdGFza2dyb3VwICkKKyAgICAgICAgICAgIEtNUF9URVNUX1RIRU5fREVDMzIoIChrbXBfaW50MzIgKikoJiB0YXNrZGF0YS0+dGRfdGFza2dyb3VwLT5jb3VudCkgKTsKKyAgICAgICAgX19rbXBfcmVsZWFzZV9kZXBzKGd0aWQsdGFza2RhdGEpOworI2VuZGlmCisgICAgfQorCisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfdGFza19maW5pc2g6IFQjJWQgZmluaXNoZWQgdGFzayAlcCwgJWQgaW5jb21wbGV0ZSBjaGlsZHJlblxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhLCBjaGlsZHJlbikgKTsKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgLyogSWYgdGhlIHRhc2tzJyBkZXN0cnVjdG9yIHRodW5rIGZsYWcgaGFzIGJlZW4gc2V0LCB3ZSBuZWVkIHRvIGludm9rZSB0aGUKKyAgICAgICBkZXN0cnVjdG9yIHRodW5rIHRoYXQgaGFzIGJlZW4gZ2VuZXJhdGVkIGJ5IHRoZSBjb21waWxlci4KKyAgICAgICBUaGUgY29kZSBpcyBwbGFjZWQgaGVyZSwgc2luY2UgYXQgdGhpcyBwb2ludCBvdGhlciB0YXNrcyBtaWdodCBoYXZlIGJlZW4gcmVsZWFzZWQKKyAgICAgICBoZW5jZSBvdmVybGFwcGluZyB0aGUgZGVzdHJ1Y3RvciBpbnZva2F0aW9ucyB3aXRoIHNvbWUgb3RoZXIgd29yayBpbiB0aGUKKyAgICAgICByZWxlYXNlZCB0YXNrcy4gIFRoZSBPcGVuTVAgc3BlYyBpcyBub3Qgc3BlY2lmaWMgb24gd2hlbiB0aGUgZGVzdHJ1Y3RvcnMgYXJlCisgICAgICAgaW52b2tlZCwgc28gd2Ugc2hvdWxkIGJlIGZyZWUgdG8gY2hvb3NlLgorICAgICAqLworICAgIGlmICh0YXNrZGF0YS0+dGRfZmxhZ3MuZGVzdHJ1Y3RvcnNfdGh1bmspIHsKKyAgICAgICAga21wX3JvdXRpbmVfZW50cnlfdCBkZXN0cl90aHVuayA9IHRhc2stPmRlc3RydWN0b3JzOworICAgICAgICBLTVBfQVNTRVJUKGRlc3RyX3RodW5rKTsKKyAgICAgICAgZGVzdHJfdGh1bmsoZ3RpZCwgdGFzayk7CisgICAgfQorI2VuZGlmIC8vIE9NUF80MF9FTkFCTEVECisKKyAgICAvLyBib29ra2VlcGluZyBmb3IgcmVzdW1pbmcgdGFzazoKKyAgICAvLyBHRUggLSBub3RlIHRhc2tpbmdfc2VyID0+IHRhc2tfc2VyaWFsCisgICAgS01QX0RFQlVHX0FTU0VSVCggKHRhc2tkYXRhLT50ZF9mbGFncy50YXNraW5nX3NlciB8fCB0YXNrZGF0YS0+dGRfZmxhZ3MudGFza19zZXJpYWwpID09CisgICAgICAgICAgICAgICAgICAgICAgIHRhc2tkYXRhLT50ZF9mbGFncy50YXNrX3NlcmlhbCk7CisgICAgaWYgKCB0YXNrZGF0YS0+dGRfZmxhZ3MudGFza19zZXJpYWwgKQorICAgIHsKKyAgICAgICAgaWYgKHJlc3VtZWRfdGFzayA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXN1bWVkX3Rhc2sgPSB0YXNrZGF0YS0+dGRfcGFyZW50OyAgLy8gSW4gYSBzZXJpYWxpemVkIHRhc2ssIHRoZSByZXN1bWVkIHRhc2sgaXMgdGhlIHBhcmVudAorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy8gdmVyaWZ5IHJlc3VtZWQgdGFzayBwYXNzZWQgaW4gcG9pbnRzIHRvIHBhcmVudAorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggcmVzdW1lZF90YXNrID09IHRhc2tkYXRhLT50ZF9wYXJlbnQgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggcmVzdW1lZF90YXNrICE9IE5VTEwgKTsgICAgICAgIC8vIHZlcmlmeSB0aGF0IHJlc3VtZWQgdGFzayBpcyBwYXNzZWQgYXMgYXJndWVtbnQKKyAgICB9CisKKyAgICAvLyBGcmVlIHRoaXMgdGFzayBhbmQgdGhlbiBhbmNlc3RvciB0YXNrcyBpZiB0aGV5IGhhdmUgbm8gY2hpbGRyZW4uCisgICAgX19rbXBfZnJlZV90YXNrX2FuZF9hbmNlc3RvcnMoZ3RpZCwgdGFza2RhdGEsIHRocmVhZCk7CisKKyAgICBfX2ttcF90aHJlYWRzWyBndGlkIF0gLT4gdGgudGhfY3VycmVudF90YXNrID0gcmVzdW1lZF90YXNrOyAvLyByZXN0b3JlIGN1cnJlbnRfdGFzaworCisgICAgLy8gVE9ETzogR0VIIC0gbWFrZSBzdXJlIHJvb3QgdGVhbSBpbXBsaWNpdCB0YXNrIGlzIGluaXRpYWxpemVkIHByb3Blcmx5LgorICAgIC8vIEtNUF9ERUJVR19BU1NFUlQoIHJlc3VtZWRfdGFzay0+dGRfZmxhZ3MuZXhlY3V0aW5nID09IDAgKTsKKyAgICByZXN1bWVkX3Rhc2stPnRkX2ZsYWdzLmV4ZWN1dGluZyA9IDE7ICAvLyByZXN1bWUgcHJldmlvdXMgdGFzaworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfdGFza19maW5pc2goZXhpdCk6IFQjJWQgZmluaXNoZWQgdGFzayAlcCwgcmVzdW1pbmcgdGFzayAlcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhLCByZXN1bWVkX3Rhc2spICk7CisKKyAgICByZXR1cm47Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcGNfb21wX3Rhc2tfY29tcGxldGVfaWYwOiByZXBvcnQgdGhhdCBhIHRhc2sgaGFzIGNvbXBsZXRlZCBleGVjdXRpb24KKy8vIGxvY19yZWY6IHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbjsgcG9pbnRzIHRvIGVuZCBvZiB0YXNrIGJsb2NrLgorLy8gZ3RpZDogZ2xvYmFsIHRocmVhZCBudW1iZXIuCisvLyB0YXNrOiB0YXNrIHRodW5rIGZvciB0aGUgY29tcGxldGVkIHRhc2suCisKK3ZvaWQKK19fa21wY19vbXBfdGFza19jb21wbGV0ZV9pZjAoIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICp0YXNrICkKK3sKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2tfY29tcGxldGVfaWYwKGVudGVyKTogVCMlZCBsb2M9JXAgdGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsIEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spICkgKTsKKworICAgIF9fa21wX3Rhc2tfZmluaXNoKCBndGlkLCB0YXNrLCBOVUxMICk7ICAvLyB0aGlzIHJvdXRpbmUgd2lsbCBwcm92aWRlIHRhc2sgdG8gcmVzdW1lCisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2tfY29tcGxldGVfaWYwKGV4aXQpOiBUIyVkIGxvYz0lcCB0YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgbG9jX3JlZiwgS01QX1RBU0tfVE9fVEFTS0RBVEEodGFzaykgKSApOworCisgICAgcmV0dXJuOworfQorCisjaWZkZWYgVEFTS19VTlVTRUQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcGNfb21wX3Rhc2tfY29tcGxldGU6IHJlcG9ydCB0aGF0IGEgdGFzayBoYXMgY29tcGxldGVkIGV4ZWN1dGlvbgorLy8gTkVWRVIgR0VORVJBVEVEIEJZIENPTVBJTEVSLCBERVBSRUNBVEVEISEhCisKK3ZvaWQKK19fa21wY19vbXBfdGFza19jb21wbGV0ZSggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKnRhc2sgKQoreworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza19jb21wbGV0ZShlbnRlcik6IFQjJWQgbG9jPSVwIHRhc2s9JXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBsb2NfcmVmLCBLTVBfVEFTS19UT19UQVNLREFUQSh0YXNrKSApICk7CisKKyAgICBfX2ttcF90YXNrX2ZpbmlzaCggZ3RpZCwgdGFzaywgTlVMTCApOyAgLy8gTm90IHN1cmUgaG93IHRvIGZpbmQgdGFzayB0byByZXN1bWUKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza19jb21wbGV0ZShleGl0KTogVCMlZCBsb2M9JXAgdGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsIEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spICkgKTsKKyAgICByZXR1cm47Cit9CisjZW5kaWYgLy8gVEFTS19VTlVTRUQKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX2luaXRfaW1wbGljaXRfdGFzazogSW5pdGlhbGl6ZSB0aGUgYXBwcm9wcmlhdGUgZmllbGRzIGluIHRoZSBpbXBsaWNpdCB0YXNrIGZvciBhIGdpdmVuIHRocmVhZAorLy8KKy8vIGxvY19yZWY6ICByZWZlcmVuY2UgdG8gc291cmNlIGxvY2F0aW9uIG9mIHBhcmFsbGVsIHJlZ2lvbgorLy8gdGhpc190aHI6ICB0aHJlYWQgZGF0YSBzdHJ1Y3R1cmUgY29ycmVzcG9uZGluZyB0byBpbXBsaWNpdCB0YXNrCisvLyB0ZWFtOiB0ZWFtIGZvciB0aGlzX3RocgorLy8gdGlkOiB0aHJlYWQgaWQgb2YgZ2l2ZW4gdGhyZWFkIHdpdGhpbiB0ZWFtCisvLyBzZXRfY3Vycl90YXNrOiBUUlVFIGlmIG5lZWQgdG8gcHVzaCBjdXJyZW50IHRhc2sgdG8gdGhyZWFkCisvLyBOT1RFOiBSb3V0aW5lIGRvZXMgbm90IHNldCB1cCB0aGUgaW1wbGljaXQgdGFzayBJQ1ZTLiAgVGhpcyBpcyBhc3N1bWVkIHRvIGhhdmUgYWxyZWFkeSBiZWVuIGRvbmUgZWxzZXdoZXJlLgorLy8gVE9ETzogR2V0IGJldHRlciBsb2NfcmVmLiAgVmFsdWUgcGFzc2VkIGluIG1heSBiZSBOVUxMCisKK3ZvaWQKK19fa21wX2luaXRfaW1wbGljaXRfdGFzayggaWRlbnRfdCAqbG9jX3JlZiwga21wX2luZm9fdCAqdGhpc190aHIsIGttcF90ZWFtX3QgKnRlYW0sIGludCB0aWQsIGludCBzZXRfY3Vycl90YXNrICkKK3sKKyAgICBrbXBfdGFza2RhdGFfdCAqIHRhc2sgICA9ICYgdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbIHRpZCBdOworCisgICAgS0ZfVFJBQ0UoMTAsICgiX19rbXBfaW5pdF9pbXBsaWNpdF90YXNrKGVudGVyKTogVCM6JWQgdGVhbT0lcCB0YXNrPSVwLCByZWluaXQ9JXNcbiIsCisgICAgICAgICAgICAgICAgICB0aWQsIHRlYW0sIHRhc2ssIHNldF9jdXJyX3Rhc2sgPyAiVFJVRSIgOiAiRkFMU0UiICkgKTsKKworICAgIHRhc2stPnRkX3Rhc2tfaWQgID0gS01QX0dFTl9UQVNLX0lEKCk7CisgICAgdGFzay0+dGRfdGVhbSAgICAgPSB0ZWFtOworLy8gICAgdGFzay0+dGRfcGFyZW50ICAgPSBOVUxMOyAgLy8gZml4IGZvciBDUTIzMDEwMSAoYnJva2VuIHBhcmVudCB0YXNrIGluZm8gaW4gZGVidWdnZXIpCisgICAgdGFzay0+dGRfaWRlbnQgICAgPSBsb2NfcmVmOworICAgIHRhc2stPnRkX3Rhc2t3YWl0X2lkZW50ICAgPSBOVUxMOworICAgIHRhc2stPnRkX3Rhc2t3YWl0X2NvdW50ZXIgPSAwOworICAgIHRhc2stPnRkX3Rhc2t3YWl0X3RocmVhZCAgPSAwOworCisgICAgdGFzay0+dGRfZmxhZ3MudGllZG5lc3MgICAgPSBUQVNLX1RJRUQ7CisgICAgdGFzay0+dGRfZmxhZ3MudGFza3R5cGUgICAgPSBUQVNLX0lNUExJQ0lUOworICAgIC8vIEFsbCBpbXBsaWNpdCB0YXNrcyBhcmUgZXhlY3V0ZWQgaW1tZWRpYXRlbHksIG5vdCBkZWZlcnJlZAorICAgIHRhc2stPnRkX2ZsYWdzLnRhc2tfc2VyaWFsID0gMTsKKyAgICB0YXNrLT50ZF9mbGFncy50YXNraW5nX3NlciA9ICggX19rbXBfdGFza2luZ19tb2RlID09IHRza21faW1tZWRpYXRlX2V4ZWMgKTsKKyAgICB0YXNrLT50ZF9mbGFncy50ZWFtX3NlcmlhbCA9ICggdGVhbS0+dC50X3NlcmlhbGl6ZWQgKSA/IDEgOiAwOworCisgICAgdGFzay0+dGRfZmxhZ3Muc3RhcnRlZCAgICAgPSAxOworICAgIHRhc2stPnRkX2ZsYWdzLmV4ZWN1dGluZyAgID0gMTsKKyAgICB0YXNrLT50ZF9mbGFncy5jb21wbGV0ZSAgICA9IDA7CisgICAgdGFzay0+dGRfZmxhZ3MuZnJlZWQgICAgICAgPSAwOworCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICB0YXNrLT50ZF9kZXBoYXNoID0gTlVMTDsKKyAgICB0YXNrLT50ZF9kZXBub2RlID0gTlVMTDsKKyNlbmRpZgorCisgICAgaWYgKHNldF9jdXJyX3Rhc2spIHsgIC8vIG9ubHkgZG8gdGhpcyBpbml0aWFsaXphdGlvbiB0aGUgZmlyc3QgdGltZSBhIHRocmVhZCBpcyBjcmVhdGVkCisgICAgICAgIHRhc2stPnRkX2luY29tcGxldGVfY2hpbGRfdGFza3MgPSAwOworICAgICAgICB0YXNrLT50ZF9hbGxvY2F0ZWRfY2hpbGRfdGFza3MgID0gMDsgLy8gTm90IHVzZWQgYmVjYXVzZSBkbyBub3QgbmVlZCB0byBkZWFsbG9jYXRlIGltcGxpY2l0IHRhc2sKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICB0YXNrLT50ZF90YXNrZ3JvdXAgPSBOVUxMOyAgICAgICAgICAgLy8gQW4gaW1wbGljaXQgdGFzayBkb2VzIG5vdCBoYXZlIHRhc2tncm91cAorI2VuZGlmCisgICAgICAgIF9fa21wX3B1c2hfY3VycmVudF90YXNrX3RvX3RocmVhZCggdGhpc190aHIsIHRlYW0sIHRpZCApOworICAgIH0gZWxzZSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGFzay0+dGRfaW5jb21wbGV0ZV9jaGlsZF90YXNrcyA9PSAwKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0YXNrLT50ZF9hbGxvY2F0ZWRfY2hpbGRfdGFza3MgID09IDApOworICAgIH0KKworICAgIEtGX1RSQUNFKDEwLCAoIl9fa21wX2luaXRfaW1wbGljaXRfdGFzayhleGl0KTogVCM6JWQgdGVhbT0lcCB0YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgdGlkLCB0ZWFtLCB0YXNrICkgKTsKK30KKworLy8gUm91bmQgdXAgYSBzaXplIHRvIGEgcG93ZXIgb2YgdHdvIHNwZWNpZmllZCBieSB2YWwKKy8vIFVzZWQgdG8gaW5zZXJ0IHBhZGRpbmcgYmV0d2VlbiBzdHJ1Y3R1cmVzIGNvLWFsbG9jYXRlZCB1c2luZyBhIHNpbmdsZSBtYWxsb2MoKSBjYWxsCitzdGF0aWMgc2l6ZV90CitfX2ttcF9yb3VuZF91cF90b192YWwoIHNpemVfdCBzaXplLCBzaXplX3QgdmFsICkgeworICAgIGlmICggc2l6ZSAmICggdmFsIC0gMSApICkgeworICAgICAgICBzaXplICY9IH4gKCB2YWwgLSAxICk7CisgICAgICAgIGlmICggc2l6ZSA8PSBLTVBfU0laRV9UX01BWCAtIHZhbCApIHsKKyAgICAgICAgICAgIHNpemUgKz0gdmFsOyAgICAvLyBSb3VuZCB1cCBpZiB0aGVyZSBpcyBubyBvdmVyZmxvdy4KKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBpZgorICAgIHJldHVybiBzaXplOworfSAvLyBfX2ttcF9yb3VuZF91cF90b192YQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF90YXNrX2FsbG9jOiBBbGxvY2F0ZSB0aGUgdGFza2RhdGEgYW5kIHRhc2sgZGF0YSBzdHJ1Y3R1cmVzIGZvciBhIHRhc2sKKy8vCisvLyBsb2NfcmVmOiBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KKy8vIGd0aWQ6IGdsb2JhbCB0aHJlYWQgbnVtYmVyLgorLy8gZmxhZ3M6IGluY2x1ZGUgdGllZG5lc3MgJiB0YXNrIHR5cGUgKGV4cGxpY2l0IHZzLiBpbXBsaWNpdCkgb2YgdGhlICcnbmV3JycgdGFzayBlbmNvdW50ZXJlZC4KKy8vICAgICAgICBDb252ZXJ0ZWQgZnJvbSBrbXBfaW50MzIgdG8ga21wX3Rhc2tpbmdfZmxhZ3NfdCBpbiByb3V0aW5lLgorLy8gc2l6ZW9mX2ttcF90YXNrX3Q6ICBTaXplIGluIGJ5dGVzIG9mIGttcF90YXNrX3QgZGF0YSBzdHJ1Y3R1cmUgaW5jbHVkaW5nIHByaXZhdGUgdmFycyBhY2Nlc3NlZCBpbiB0YXNrLgorLy8gc2l6ZW9mX3NoYXJlZHM6ICBTaXplIGluIGJ5dGVzIG9mIGFycmF5IG9mIHBvaW50ZXJzIHRvIHNoYXJlZCB2YXJzIGFjY2Vzc2VkIGluIHRhc2suCisvLyB0YXNrX2VudHJ5OiBQb2ludGVyIHRvIHRhc2sgY29kZSBlbnRyeSBwb2ludCBnZW5lcmF0ZWQgYnkgY29tcGlsZXIuCisvLyByZXR1cm5zOiBhIHBvaW50ZXIgdG8gdGhlIGFsbG9jYXRlZCBrbXBfdGFza190IHN0cnVjdHVyZSAodGFzaykuCisKK2ttcF90YXNrX3QgKgorX19rbXBfdGFza19hbGxvYyggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF90YXNraW5nX2ZsYWdzX3QgKmZsYWdzLAorICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemVvZl9rbXBfdGFza190LCBzaXplX3Qgc2l6ZW9mX3NoYXJlZHMsCisgICAgICAgICAgICAgICAgICBrbXBfcm91dGluZV9lbnRyeV90IHRhc2tfZW50cnkgKQoreworICAgIGttcF90YXNrX3QgKnRhc2s7CisgICAga21wX3Rhc2tkYXRhX3QgKnRhc2tkYXRhOworICAgIGttcF9pbmZvX3QgKnRocmVhZCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICBrbXBfdGVhbV90ICp0ZWFtID0gdGhyZWFkLT50aC50aF90ZWFtOworICAgIGttcF90YXNrZGF0YV90ICpwYXJlbnRfdGFzayA9IHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrOworICAgIHNpemVfdCBzaGFyZWRzX29mZnNldDsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3Rhc2tfYWxsb2MoZW50ZXIpOiBUIyVkIGxvYz0lcCwgZmxhZ3M9KDB4JXgpICIKKyAgICAgICAgICAgICAgICAgICJzaXplb2ZfdGFzaz0lbGQgc2l6ZW9mX3NoYXJlZD0lbGQgZW50cnk9JXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBsb2NfcmVmLCAqKChrbXBfaW50MzIgKilmbGFncyksIHNpemVvZl9rbXBfdGFza190LAorICAgICAgICAgICAgICAgICAgc2l6ZW9mX3NoYXJlZHMsIHRhc2tfZW50cnkpICk7CisKKyAgICBpZiAoIHBhcmVudF90YXNrLT50ZF9mbGFncy5maW5hbCApIHsKKyAgICAgICAgaWYgKGZsYWdzLT5tZXJnZWRfaWYwKSB7CisgICAgICAgIH0KKyAgICAgICAgZmxhZ3MtPmZpbmFsID0gMTsKKyAgICB9CisKKyAgICAvLyBDYWxjdWxhdGUgc2hhcmVkIHN0cnVjdHVyZSBvZmZzZXQgaW5jbHVkaW5nIHBhZGRpbmcgYWZ0ZXIga21wX3Rhc2tfdCBzdHJ1Y3QKKyAgICAvLyB0byBhbGlnbiBwb2ludGVycyBpbiBzaGFyZWQgc3RydWN0CisgICAgc2hhcmVkc19vZmZzZXQgPSBzaXplb2YoIGttcF90YXNrZGF0YV90ICkgKyBzaXplb2Zfa21wX3Rhc2tfdDsKKyAgICBzaGFyZWRzX29mZnNldCA9IF9fa21wX3JvdW5kX3VwX3RvX3ZhbCggc2hhcmVkc19vZmZzZXQsIHNpemVvZiggdm9pZCAqICkpOworCisgICAgLy8gQWxsb2NhdGUgYSBrbXBfdGFza2RhdGFfdCBibG9jayBhbmQgYSBrbXBfdGFza190IGJsb2NrLgorICAgIEtBX1RSQUNFKDMwLCAoIl9fa21wX3Rhc2tfYWxsb2M6IFQjJWQgRmlyc3QgbWFsbG9jIHNpemU6ICVsZFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHNoYXJlZHNfb2Zmc2V0KSApOworICAgIEtBX1RSQUNFKDMwLCAoIl9fa21wX3Rhc2tfYWxsb2M6IFQjJWQgU2Vjb25kIG1hbGxvYyBzaXplOiAlbGRcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBzaXplb2Zfc2hhcmVkcykgKTsKKworICAgIC8vIEF2b2lkIGRvdWJsZSBhbGxvY2F0aW9uIGhlcmUgYnkgY29tYmluaW5nIHNoYXJlZHMgd2l0aCB0YXNrZGF0YQorICAgICNpZiBVU0VfRkFTVF9NRU1PUlkKKyAgICB0YXNrZGF0YSA9IChrbXBfdGFza2RhdGFfdCAqKSBfX2ttcF9mYXN0X2FsbG9jYXRlKCB0aHJlYWQsIHNoYXJlZHNfb2Zmc2V0ICsgc2l6ZW9mX3NoYXJlZHMgKTsKKyAgICAjZWxzZSAvKiAhIFVTRV9GQVNUX01FTU9SWSAqLworICAgIHRhc2tkYXRhID0gKGttcF90YXNrZGF0YV90ICopIF9fa21wX3RocmVhZF9tYWxsb2MoIHRocmVhZCwgc2hhcmVkc19vZmZzZXQgKyBzaXplb2Zfc2hhcmVkcyApOworICAgICNlbmRpZiAvKiBVU0VfRkFTVF9NRU1PUlkgKi8KKworICAgIHRhc2sgICAgICAgICAgICAgICAgICAgICAgPSBLTVBfVEFTS0RBVEFfVE9fVEFTSyh0YXNrZGF0YSk7CisKKyAgICAvLyBNYWtlIHN1cmUgdGFzayAmIHRhc2tkYXRhIGFyZSBhbGlnbmVkIGFwcHJvcHJpYXRlbHkKKyNpZiBLTVBfQVJDSF9YODYKKyAgICBLTVBfREVCVUdfQVNTRVJUKCAoICgoa21wX3VpbnRwdHJfdCl0YXNrZGF0YSkgJiAoc2l6ZW9mKGRvdWJsZSktMSkgKSA9PSAwICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggKCAoKGttcF91aW50cHRyX3QpdGFzaykgJiAoc2l6ZW9mKGRvdWJsZSktMSkgKSA9PSAwICk7CisjZWxzZQorICAgIEtNUF9ERUJVR19BU1NFUlQoICggKChrbXBfdWludHB0cl90KXRhc2tkYXRhKSAmIChzaXplb2YoX1F1YWQpLTEpICkgPT0gMCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoICggKChrbXBfdWludHB0cl90KXRhc2spICYgKHNpemVvZihfUXVhZCktMSkgKSA9PSAwICk7CisjZW5kaWYKKyAgICBpZiAoc2l6ZW9mX3NoYXJlZHMgPiAwKSB7CisgICAgICAgIC8vIEF2b2lkIGRvdWJsZSBhbGxvY2F0aW9uIGhlcmUgYnkgY29tYmluaW5nIHNoYXJlZHMgd2l0aCB0YXNrZGF0YQorICAgICAgICB0YXNrLT5zaGFyZWRzICAgICAgICAgPSAmICgoY2hhciAqKSB0YXNrZGF0YSlbIHNoYXJlZHNfb2Zmc2V0IF07CisgICAgICAgIC8vIE1ha2Ugc3VyZSBzaGFyZWRzIHN0cnVjdCBpcyBhbGlnbmVkIHRvIHBvaW50ZXIgc2l6ZQorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAoICgoa21wX3VpbnRwdHJfdCl0YXNrLT5zaGFyZWRzKSAmIChzaXplb2Yodm9pZCAqKS0xKSApID09IDAgKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0YXNrLT5zaGFyZWRzICAgICAgICAgPSBOVUxMOworICAgIH0KKyAgICB0YXNrLT5yb3V0aW5lICAgICAgICAgICAgID0gdGFza19lbnRyeTsKKyAgICB0YXNrLT5wYXJ0X2lkICAgICAgICAgICAgID0gMDsgICAgICAvLyBBQzogQWx3YXlzIHN0YXJ0IHdpdGggMCBwYXJ0IGlkCisKKyAgICB0YXNrZGF0YS0+dGRfdGFza19pZCAgICAgID0gS01QX0dFTl9UQVNLX0lEKCk7CisgICAgdGFza2RhdGEtPnRkX3RlYW0gICAgICAgICA9IHRlYW07CisgICAgdGFza2RhdGEtPnRkX2FsbG9jX3RocmVhZCA9IHRocmVhZDsKKyAgICB0YXNrZGF0YS0+dGRfcGFyZW50ICAgICAgID0gcGFyZW50X3Rhc2s7CisgICAgdGFza2RhdGEtPnRkX2xldmVsICAgICAgICA9IHBhcmVudF90YXNrLT50ZF9sZXZlbCArIDE7IC8vIGluY3JlbWVudCBuZXN0aW5nIGxldmVsCisgICAgdGFza2RhdGEtPnRkX2lkZW50ICAgICAgICA9IGxvY19yZWY7CisgICAgdGFza2RhdGEtPnRkX3Rhc2t3YWl0X2lkZW50ICAgPSBOVUxMOworICAgIHRhc2tkYXRhLT50ZF90YXNrd2FpdF9jb3VudGVyID0gMDsKKyAgICB0YXNrZGF0YS0+dGRfdGFza3dhaXRfdGhyZWFkICA9IDA7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2RhdGEtPnRkX3BhcmVudCAhPSBOVUxMICk7CisgICAgY29weV9pY3ZzKCAmdGFza2RhdGEtPnRkX2ljdnMsICZ0YXNrZGF0YS0+dGRfcGFyZW50LT50ZF9pY3ZzICk7CisKKyAgICB0YXNrZGF0YS0+dGRfZmxhZ3MudGllZG5lc3MgICAgPSBmbGFncy0+dGllZG5lc3M7CisgICAgdGFza2RhdGEtPnRkX2ZsYWdzLmZpbmFsICAgICAgID0gZmxhZ3MtPmZpbmFsOworICAgIHRhc2tkYXRhLT50ZF9mbGFncy5tZXJnZWRfaWYwICA9IGZsYWdzLT5tZXJnZWRfaWYwOworI2lmIE9NUF80MF9FTkFCTEVECisgICAgdGFza2RhdGEtPnRkX2ZsYWdzLmRlc3RydWN0b3JzX3RodW5rID0gZmxhZ3MtPmRlc3RydWN0b3JzX3RodW5rOworI2VuZGlmIC8vIE9NUF80MF9FTkFCTEVECisgICAgdGFza2RhdGEtPnRkX2ZsYWdzLnRhc2t0eXBlICAgID0gVEFTS19FWFBMSUNJVDsKKworICAgIC8vIEdFSCAtIFRPRE86IGZpeCB0aGlzIHRvIGNvcHkgcGFyZW50IHRhc2sncyB2YWx1ZSBvZiB0YXNraW5nX3NlciBmbGFnCisgICAgdGFza2RhdGEtPnRkX2ZsYWdzLnRhc2tpbmdfc2VyID0gKCBfX2ttcF90YXNraW5nX21vZGUgPT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApOworCisgICAgLy8gR0VIIC0gVE9ETzogZml4IHRoaXMgdG8gY29weSBwYXJlbnQgdGFzaydzIHZhbHVlIG9mIHRlYW1fc2VyaWFsIGZsYWcKKyAgICB0YXNrZGF0YS0+dGRfZmxhZ3MudGVhbV9zZXJpYWwgPSAoIHRlYW0tPnQudF9zZXJpYWxpemVkICkgPyAxIDogMDsKKworICAgIC8vIEdFSCAtIE5vdGUgd2Ugc2VyaWFsaXplIHRoZSB0YXNrIGlmIHRoZSB0ZWFtIGlzIHNlcmlhbGl6ZWQgdG8gbWFrZSBzdXJlIGltcGxpY2l0IHBhcmFsbGVsIHJlZ2lvbgorICAgIC8vICAgICAgIHRhc2tzIGFyZSBub3QgbGVmdCB1bnRpbCBwcm9ncmFtIHRlcm1pbmF0aW9uIHRvIGV4ZWN1dGUuICBBbHNvLCBpdCBoZWxwcyBsb2NhbGl0eSB0byBleGVjdXRlCisgICAgLy8gICAgICAgaW1tZWRpYXRlbHkuCisgICAgdGFza2RhdGEtPnRkX2ZsYWdzLnRhc2tfc2VyaWFsID0gKCB0YXNrZGF0YS0+dGRfZmxhZ3MuZmluYWwKKyAgICAgIHx8IHRhc2tkYXRhLT50ZF9mbGFncy50ZWFtX3NlcmlhbCB8fCB0YXNrZGF0YS0+dGRfZmxhZ3MudGFza2luZ19zZXIgKTsKKworICAgIHRhc2tkYXRhLT50ZF9mbGFncy5zdGFydGVkICAgICA9IDA7CisgICAgdGFza2RhdGEtPnRkX2ZsYWdzLmV4ZWN1dGluZyAgID0gMDsKKyAgICB0YXNrZGF0YS0+dGRfZmxhZ3MuY29tcGxldGUgICAgPSAwOworICAgIHRhc2tkYXRhLT50ZF9mbGFncy5mcmVlZCAgICAgICA9IDA7CisKKyAgICB0YXNrZGF0YS0+dGRfZmxhZ3MubmF0aXZlICAgICAgPSBmbGFncy0+bmF0aXZlOworCisgICAgdGFza2RhdGEtPnRkX2luY29tcGxldGVfY2hpbGRfdGFza3MgPSAwOworICAgIHRhc2tkYXRhLT50ZF9hbGxvY2F0ZWRfY2hpbGRfdGFza3MgID0gMTsgLy8gc3RhcnQgYXQgb25lIGJlY2F1c2UgY291bnRzIGN1cnJlbnQgdGFzayBhbmQgY2hpbGRyZW4KKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIHRhc2tkYXRhLT50ZF90YXNrZ3JvdXAgPSBwYXJlbnRfdGFzay0+dGRfdGFza2dyb3VwOyAvLyB0YXNrIGluaGVyaXRzIHRoZSB0YXNrZ3JvdXAgZnJvbSB0aGUgcGFyZW50IHRhc2sKKyAgICB0YXNrZGF0YS0+dGRfZGVwaGFzaCA9IE5VTEw7CisgICAgdGFza2RhdGEtPnRkX2RlcG5vZGUgPSBOVUxMOworI2VuZGlmIAorICAgIC8vIE9ubHkgbmVlZCB0byBrZWVwIHRyYWNrIG9mIGNoaWxkIHRhc2sgY291bnRzIGlmIHRlYW0gcGFyYWxsZWwgYW5kIHRhc2tpbmcgbm90IHNlcmlhbGl6ZWQKKyAgICBpZiAoICEoIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLnRlYW1fc2VyaWFsIHx8IHRhc2tkYXRhIC0+IHRkX2ZsYWdzLnRhc2tpbmdfc2VyICkgKSB7CisgICAgICAgIEtNUF9URVNUX1RIRU5fSU5DMzIoIChrbXBfaW50MzIgKikoJiBwYXJlbnRfdGFzay0+dGRfaW5jb21wbGV0ZV9jaGlsZF90YXNrcykgKTsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICBpZiAoIHBhcmVudF90YXNrLT50ZF90YXNrZ3JvdXAgKQorICAgICAgICAgICAgS01QX1RFU1RfVEhFTl9JTkMzMiggKGttcF9pbnQzMiAqKSgmIHBhcmVudF90YXNrLT50ZF90YXNrZ3JvdXAtPmNvdW50KSApOworI2VuZGlmCisgICAgICAgIC8vIE9ubHkgbmVlZCB0byBrZWVwIHRyYWNrIG9mIGFsbG9jYXRlZCBjaGlsZCB0YXNrcyBmb3IgZXhwbGljaXQgdGFza3Mgc2luY2UgaW1wbGljaXQgbm90IGRlYWxsb2NhdGVkCisgICAgICAgIGlmICggdGFza2RhdGEtPnRkX3BhcmVudC0+dGRfZmxhZ3MudGFza3R5cGUgPT0gVEFTS19FWFBMSUNJVCApIHsKKyAgICAgICAgICAgIEtNUF9URVNUX1RIRU5fSU5DMzIoIChrbXBfaW50MzIgKikoJiB0YXNrZGF0YS0+dGRfcGFyZW50LT50ZF9hbGxvY2F0ZWRfY2hpbGRfdGFza3MpICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF90YXNrX2FsbG9jKGV4aXQpOiBUIyVkIGNyZWF0ZWQgdGFzayAlcCBwYXJlbnQ9JXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0YXNrZGF0YSwgdGFza2RhdGEtPnRkX3BhcmVudCkgKTsKKworICAgIHJldHVybiB0YXNrOworfQorCisKK2ttcF90YXNrX3QgKgorX19rbXBjX29tcF90YXNrX2FsbG9jKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZW9mX2ttcF90YXNrX3QsIHNpemVfdCBzaXplb2Zfc2hhcmVkcywKKyAgICAgICAgICAgICAgICAgICAgICAga21wX3JvdXRpbmVfZW50cnlfdCB0YXNrX2VudHJ5ICkKK3sKKyAgICBrbXBfdGFza190ICpyZXR2YWw7CisgICAga21wX3Rhc2tpbmdfZmxhZ3NfdCAqaW5wdXRfZmxhZ3MgPSAoa21wX3Rhc2tpbmdfZmxhZ3NfdCAqKSAmIGZsYWdzOworCisgICAgaW5wdXRfZmxhZ3MtPm5hdGl2ZSA9IEZBTFNFOworICAgIC8vIF9fa21wX3Rhc2tfYWxsb2MoKSBzZXRzIHVwIGFsbCBvdGhlciBydW50aW1lIGZsYWdzCisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2tfYWxsb2MoZW50ZXIpOiBUIyVkIGxvYz0lcCwgZmxhZ3M9KCVzKSAiCisgICAgICAgICAgICAgICAgICAic2l6ZW9mX3Rhc2s9JWxkIHNpemVvZl9zaGFyZWQ9JWxkIGVudHJ5PSVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgbG9jX3JlZiwgaW5wdXRfZmxhZ3MtPnRpZWRuZXNzID8gInRpZWQgICIgOiAidW50aWVkIiwKKyAgICAgICAgICAgICAgICAgIHNpemVvZl9rbXBfdGFza190LCBzaXplb2Zfc2hhcmVkcywgdGFza19lbnRyeSkgKTsKKworICAgIHJldHZhbCA9IF9fa21wX3Rhc2tfYWxsb2MoIGxvY19yZWYsIGd0aWQsIGlucHV0X2ZsYWdzLCBzaXplb2Zfa21wX3Rhc2tfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Zfc2hhcmVkcywgdGFza19lbnRyeSApOworCisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBjX29tcF90YXNrX2FsbG9jKGV4aXQpOiBUIyVkIHJldHZhbCAlcFxuIiwgZ3RpZCwgcmV0dmFsKSApOworCisgICAgcmV0dXJuIHJldHZhbDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIF9fa21wX2ludm9rZV90YXNrOiBpbnZva2UgdGhlIHNwZWNpZmllZCB0YXNrCisvLworLy8gZ3RpZDogZ2xvYmFsIHRocmVhZCBJRCBvZiBjYWxsZXIKKy8vIHRhc2s6IHRoZSB0YXNrIHRvIGludm9rZQorLy8gY3VycmVudF90YXNrOiB0aGUgdGFzayB0byByZXN1bWUgYWZ0ZXIgdGFzayBpbnZva2F0aW9uCisKK3N0YXRpYyB2b2lkCitfX2ttcF9pbnZva2VfdGFzaygga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKnRhc2ssIGttcF90YXNrZGF0YV90ICogY3VycmVudF90YXNrICkKK3sKKyAgICBrbXBfdGFza2RhdGFfdCAqIHRhc2tkYXRhID0gS01QX1RBU0tfVE9fVEFTS0RBVEEodGFzayk7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBpbnQgZGlzY2FyZCA9IDAgLyogZmFsc2UgKi87CisjZW5kaWYKKyAgICBLQV9UUkFDRSgzMCwgKCJfX2ttcF9pbnZva2VfdGFzayhlbnRlcik6IFQjJWQgaW52b2tpbmcgdGFzayAlcCwgY3VycmVudF90YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEsIGN1cnJlbnRfdGFzaykgKTsKKworICAgIF9fa21wX3Rhc2tfc3RhcnQoIGd0aWQsIHRhc2ssIGN1cnJlbnRfdGFzayApOworCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAvLyBUT0RPOiBjYW5jZWwgdGFza3MgaWYgdGhlIHBhcmFsbGVsIHJlZ2lvbiBoYXMgYWxzbyBiZWVuIGNhbmNlbGxlZAorICAgIC8vIFRPRE86IGNoZWNrIGlmIHRoaXMgc2VxdWVuY2UgY2FuIGJlIGhvaXN0ZWQgYWJvdmUgX19rbXBfdGFza19zdGFydAorICAgIC8vIGlmIGNhbmNlbGxhdGlvbiBoYXMgYmVlbiBlbmFibGVkIGZvciB0aGlzIHJ1biAuLi4KKyAgICBpZiAoX19rbXBfb21wX2NhbmNlbGxhdGlvbikgeworICAgICAgICBrbXBfaW5mb190ICp0aGlzX3RociA9IF9fa21wX3RocmVhZHMgWyBndGlkIF07CisgICAgICAgIGttcF90ZWFtX3QgKiB0aGlzX3RlYW0gPSB0aGlzX3Roci0+dGgudGhfdGVhbTsKKyAgICAgICAga21wX3Rhc2tncm91cF90ICogdGFza2dyb3VwID0gdGFza2RhdGEtPnRkX3Rhc2tncm91cDsKKyAgICAgICAgaWYgKCh0YXNrZ3JvdXAgJiYgdGFza2dyb3VwLT5jYW5jZWxfcmVxdWVzdCkgfHwgKHRoaXNfdGVhbS0+dC50X2NhbmNlbF9yZXF1ZXN0ID09IGNhbmNlbF9wYXJhbGxlbCkpIHsKKyAgICAgICAgICAgIC8vIHRoaXMgdGFzayBiZWxvbmdzIHRvIGEgdGFzayBncm91cCBhbmQgd2UgbmVlZCB0byBjYW5jZWwgaXQKKyAgICAgICAgICAgIGRpc2NhcmQgPSAxIC8qIHRydWUgKi87CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLworICAgIC8vIEludm9rZSB0aGUgdGFzayByb3V0aW5lIGFuZCBwYXNzIGluIHJlbGV2YW50IGRhdGEuCisgICAgLy8gVGh1bmtzIGdlbmVyYXRlZCBieSBnY2MgdGFrZSBhIGRpZmZlcmVudCBhcmd1bWVudCBsaXN0LgorICAgIC8vCisgICAgaWYgKCFkaXNjYXJkKSB7CisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgaWYgKHRhc2tkYXRhLT50ZF9mbGFncy5uYXRpdmUpIHsKKyAgICAgICAgICAgICgodm9pZCAoKikodm9pZCAqKSkoKih0YXNrLT5yb3V0aW5lKSkpKHRhc2stPnNoYXJlZHMpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKyAgICAgICAgeworICAgICAgICAgICAgKCoodGFzay0+cm91dGluZSkpKGd0aWQsIHRhc2spOworICAgICAgICB9CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICB9CisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKworICAgIF9fa21wX3Rhc2tfZmluaXNoKCBndGlkLCB0YXNrLCBjdXJyZW50X3Rhc2sgKTsKKworICAgIEtBX1RSQUNFKDMwLCAoIl9fa21wX2lub3ZrZV90YXNrKGV4aXQpOiBUIyVkIGNvbXBsZXRlZCB0YXNrICVwLCByZXN1bWluZyB0YXNrICVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEsIGN1cnJlbnRfdGFzaykgKTsKKyAgICByZXR1cm47Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wY19vbXBfdGFza19wYXJ0czogU2NoZWR1bGUgYSB0aHJlYWQtc3dpdGNoYWJsZSB0YXNrIGZvciBleGVjdXRpb24KKy8vCisvLyBsb2NfcmVmOiBsb2NhdGlvbiBvZiBvcmlnaW5hbCB0YXNrIHByYWdtYSAoaWdub3JlZCkKKy8vIGd0aWQ6IEdsb2JhbCBUaHJlYWQgSUQgb2YgZW5jb3VudGVyaW5nIHRocmVhZAorLy8gbmV3X3Rhc2s6IHRhc2sgdGh1bmsgYWxsb2NhdGVkIGJ5IF9fa21wX29tcF90YXNrX2FsbG9jKCkgZm9yIHRoZSAnJ25ldyB0YXNrJycKKy8vIFJldHVybnM6CisvLyAgICBUQVNLX0NVUlJFTlRfTk9UX1FVRVVFRCAoMCkgaWYgZGlkIG5vdCBzdXNwZW5kIGFuZCBxdWV1ZSBjdXJyZW50IHRhc2sgdG8gYmUgcmVzdW1lZCBsYXRlci4KKy8vICAgIFRBU0tfQ1VSUkVOVF9RVUVVRUQgKDEpIGlmIHN1c3BlbmRlZCBhbmQgcXVldWVkIHRoZSBjdXJyZW50IHRhc2sgdG8gYmUgcmVzdW1lZCBsYXRlci4KKwora21wX2ludDMyCitfX2ttcGNfb21wX3Rhc2tfcGFydHMoIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICogbmV3X3Rhc2spCit7CisgICAga21wX3Rhc2tkYXRhX3QgKiBuZXdfdGFza2RhdGEgPSBLTVBfVEFTS19UT19UQVNLREFUQShuZXdfdGFzayk7CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2tfcGFydHMoZW50ZXIpOiBUIyVkIGxvYz0lcCB0YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgbG9jX3JlZiwgbmV3X3Rhc2tkYXRhICkgKTsKKworICAgIC8qIFNob3VsZCB3ZSBleGVjdXRlIHRoZSBuZXcgdGFzayBvciBxdWV1ZSBpdD8gICBGb3Igbm93LCBsZXQncyBqdXN0IGFsd2F5cyB0cnkgdG8KKyAgICAgICBxdWV1ZSBpdC4gIElmIHRoZSBxdWV1ZSBmaWxscyB1cCwgdGhlbiB3ZSdsbCBleGVjdXRlIGl0LiAgKi8KKworICAgIGlmICggX19rbXBfcHVzaF90YXNrKCBndGlkLCBuZXdfdGFzayApID09IFRBU0tfTk9UX1BVU0hFRCApIC8vIGlmIGNhbm5vdCBkZWZlcgorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4ZWN1dGUgdGhpcyB0YXNrIGltbWVkaWF0ZWx5CisgICAgICAgIGttcF90YXNrZGF0YV90ICogY3VycmVudF90YXNrID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdIC0+IHRoLnRoX2N1cnJlbnRfdGFzazsKKyAgICAgICAgbmV3X3Rhc2tkYXRhLT50ZF9mbGFncy50YXNrX3NlcmlhbCA9IDE7CisgICAgICAgIF9fa21wX2ludm9rZV90YXNrKCBndGlkLCBuZXdfdGFzaywgY3VycmVudF90YXNrICk7CisgICAgfQorCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrX3BhcnRzKGV4aXQpOiBUIyVkIHJldHVybmluZyBUQVNLX0NVUlJFTlRfTk9UX1FVRVVFRDogIgorICAgICAgICAgICAgICAgICAgImxvYz0lcCB0YXNrPSVwLCByZXR1cm46IFRBU0tfQ1VSUkVOVF9OT1RfUVVFVUVEXG4iLCBndGlkLCBsb2NfcmVmLAorICAgICAgICAgICAgICAgICAgbmV3X3Rhc2tkYXRhICkgKTsKKworICAgIHJldHVybiBUQVNLX0NVUlJFTlRfTk9UX1FVRVVFRDsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBjX29tcF90YXNrOiBTY2hlZHVsZSBhIG5vbi10aHJlYWQtc3dpdGNoYWJsZSB0YXNrIGZvciBleGVjdXRpb24KKy8vIGxvY19yZWY6IGxvY2F0aW9uIG9mIG9yaWdpbmFsIHRhc2sgcHJhZ21hIChpZ25vcmVkKQorLy8gZ3RpZDogR2xvYmFsIFRocmVhZCBJRCBvZiBlbmNvdW50ZXJpbmcgdGhyZWFkCisvLyBuZXdfdGFzazogbm9uLXRocmVhZC1zd2l0Y2hhYmxlIHRhc2sgdGh1bmsgYWxsb2NhdGVkIGJ5IF9fa21wX29tcF90YXNrX2FsbG9jKCkKKy8vIHJldHVybnM6CisvLworLy8gICAgVEFTS19DVVJSRU5UX05PVF9RVUVVRUQgKDApIGlmIGRpZCBub3Qgc3VzcGVuZCBhbmQgcXVldWUgY3VycmVudCB0YXNrIHRvIGJlIHJlc3VtZWQgbGF0ZXIuCisvLyAgICBUQVNLX0NVUlJFTlRfUVVFVUVEICgxKSBpZiBzdXNwZW5kZWQgYW5kIHF1ZXVlZCB0aGUgY3VycmVudCB0YXNrIHRvIGJlIHJlc3VtZWQgbGF0ZXIuCisKK2ttcF9pbnQzMgorX19rbXBjX29tcF90YXNrKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqIG5ld190YXNrKQoreworICAgIGttcF90YXNrZGF0YV90ICogbmV3X3Rhc2tkYXRhID0gS01QX1RBU0tfVE9fVEFTS0RBVEEobmV3X3Rhc2spOworICAgIGttcF9pbnQzMiByYzsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFzayhlbnRlcik6IFQjJWQgbG9jPSVwIHRhc2s9JXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBsb2NfcmVmLCBuZXdfdGFza2RhdGEgKSApOworCisgICAgLyogU2hvdWxkIHdlIGV4ZWN1dGUgdGhlIG5ldyB0YXNrIG9yIHF1ZXVlIGl0PyAgIEZvciBub3csIGxldCdzIGp1c3QgYWx3YXlzIHRyeSB0bworICAgICAgIHF1ZXVlIGl0LiAgSWYgdGhlIHF1ZXVlIGZpbGxzIHVwLCB0aGVuIHdlJ2xsIGV4ZWN1dGUgaXQuICAqLworCisgICAgaWYgKCBfX2ttcF9wdXNoX3Rhc2soIGd0aWQsIG5ld190YXNrICkgPT0gVEFTS19OT1RfUFVTSEVEICkgLy8gaWYgY2Fubm90IGRlZmVyCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXhlY3V0ZSB0aGlzIHRhc2sgaW1tZWRpYXRlbHkKKyAgICAgICAga21wX3Rhc2tkYXRhX3QgKiBjdXJyZW50X3Rhc2sgPSBfX2ttcF90aHJlYWRzWyBndGlkIF0gLT4gdGgudGhfY3VycmVudF90YXNrOworICAgICAgICBuZXdfdGFza2RhdGEgLT4gdGRfZmxhZ3MudGFza19zZXJpYWwgPSAxOworICAgICAgICBfX2ttcF9pbnZva2VfdGFzayggZ3RpZCwgbmV3X3Rhc2ssIGN1cnJlbnRfdGFzayApOworICAgIH0KKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFzayhleGl0KTogVCMlZCByZXR1cm5pbmcgVEFTS19DVVJSRU5UX05PVF9RVUVVRUQ6IGxvYz0lcCB0YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgbG9jX3JlZiwgbmV3X3Rhc2tkYXRhICkgKTsKKworICAgIHJldHVybiBUQVNLX0NVUlJFTlRfTk9UX1FVRVVFRDsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wY19vbXBfdGFza3dhaXQ6IFdhaXQgdW50aWwgYWxsIHRhc2tzIGdlbmVyYXRlZCBieSB0aGUgY3VycmVudCB0YXNrIGFyZSBjb21wbGV0ZQorCitrbXBfaW50MzIKK19fa21wY19vbXBfdGFza3dhaXQoIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBrbXBfdGFza2RhdGFfdCAqIHRhc2tkYXRhOworICAgIGttcF9pbmZvX3QgKiB0aHJlYWQ7CisgICAgaW50IHRocmVhZF9maW5pc2hlZCA9IEZBTFNFOworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrd2FpdChlbnRlcik6IFQjJWQgbG9jPSVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgbG9jX3JlZikgKTsKKworICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKSB7CisgICAgICAgIC8vIEdFSCBUT0RPOiBzaG91bGRuJ3Qgd2UgaGF2ZSBzb21lIHNvcnQgb2YgT01QUkFQIEFQSSBjYWxscyBoZXJlIHRvIG1hcmsgYmVnaW4gd2FpdD8KKworICAgICAgICB0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAgICAgIHRhc2tkYXRhID0gdGhyZWFkIC0+IHRoLnRoX2N1cnJlbnRfdGFzazsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIC8vIE5vdGU6IFRoZXNlIHZhbHVlcyBhcmUgdXNlZCBieSBJVFQgZXZlbnRzIGFzIHdlbGwuCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgICAgICB0YXNrZGF0YS0+dGRfdGFza3dhaXRfY291bnRlciArPSAxOworICAgICAgICB0YXNrZGF0YS0+dGRfdGFza3dhaXRfaWRlbnQgICAgPSBsb2NfcmVmOworICAgICAgICB0YXNrZGF0YS0+dGRfdGFza3dhaXRfdGhyZWFkICAgPSBndGlkICsgMTsKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgdm9pZCAqIGl0dF9zeW5jX29iaiA9IF9fa21wX2l0dF90YXNrd2FpdF9vYmplY3QoIGd0aWQgKTsKKyAgICAgICAgaWYgKCBpdHRfc3luY19vYmogIT0gTlVMTCApCisgICAgICAgICAgICBfX2ttcF9pdHRfdGFza3dhaXRfc3RhcnRpbmcoIGd0aWQsIGl0dF9zeW5jX29iaiApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgICAgICBpZiAoICEgdGFza2RhdGEtPnRkX2ZsYWdzLnRlYW1fc2VyaWFsICkgeworICAgICAgICAgICAgLy8gR0VIOiBpZiB0ZWFtIHNlcmlhbGl6ZWQsIGF2b2lkIHJlYWRpbmcgdGhlIHZvbGF0aWxlIHZhcmlhYmxlIGJlbG93LgorICAgICAgICAgICAgd2hpbGUgKCBUQ1JfNCh0YXNrZGF0YSAtPiB0ZF9pbmNvbXBsZXRlX2NoaWxkX3Rhc2tzKSAhPSAwICkgeworICAgICAgICAgICAgICAgIF9fa21wX2V4ZWN1dGVfdGFza3MoIHRocmVhZCwgZ3RpZCwgJih0YXNrZGF0YS0+dGRfaW5jb21wbGV0ZV9jaGlsZF90YXNrcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgRkFMU0UsICZ0aHJlYWRfZmluaXNoZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3Rhc2tfc3RlYWxpbmdfY29uc3RyYWludCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICBpZiAoIGl0dF9zeW5jX29iaiAhPSBOVUxMICkKKyAgICAgICAgICAgIF9fa21wX2l0dF90YXNrd2FpdF9maW5pc2hlZCggZ3RpZCwgaXR0X3N5bmNfb2JqICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgICAgIC8vIEdFSCBUT0RPOiBzaG91bGRuJ3Qgd2UgaGF2ZSBzb21lIHNvcnQgb2YgT01QUkFQIEFQSSBjYWxscyBoZXJlIHRvIG1hcmsgZW5kIG9mIHdhaXQ/CisgICAgICAgIHRhc2tkYXRhLT50ZF90YXNrd2FpdF90aHJlYWQgPSAtIHRhc2tkYXRhLT50ZF90YXNrd2FpdF90aHJlYWQ7CisgICAgfQorCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrd2FpdChleGl0KTogVCMlZCB0YXNrICVwIGZpbmlzaGVkIHdhaXRpbmcsICIKKyAgICAgICAgICAgICAgICAgICJyZXR1cm5pbmcgVEFTS19DVVJSRU5UX05PVF9RVUVVRURcbiIsIGd0aWQsIHRhc2tkYXRhKSApOworCisgICAgcmV0dXJuIFRBU0tfQ1VSUkVOVF9OT1RfUVVFVUVEOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBjX29tcF90YXNreWllbGQ6IHN3aXRjaCB0byBhIGRpZmZlcmVudCB0YXNrCisKK2ttcF9pbnQzMgorX19rbXBjX29tcF90YXNreWllbGQoIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBpbnQgZW5kX3BhcnQgKQoreworICAgIGttcF90YXNrZGF0YV90ICogdGFza2RhdGE7CisgICAga21wX2luZm9fdCAqIHRocmVhZDsKKyAgICBpbnQgdGhyZWFkX2ZpbmlzaGVkID0gRkFMU0U7CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2t5aWVsZChlbnRlcik6IFQjJWQgbG9jPSVwIGVuZF9wYXJ0ID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBsb2NfcmVmLCBlbmRfcGFydCkgKTsKKworICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKSB7CisgICAgICAgIC8vIEdFSCBUT0RPOiBzaG91bGRuJ3Qgd2UgaGF2ZSBzb21lIHNvcnQgb2YgT01QUkFQIEFQSSBjYWxscyBoZXJlIHRvIG1hcmsgYmVnaW4gd2FpdD8KKworICAgICAgICB0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAgICAgIHRhc2tkYXRhID0gdGhyZWFkIC0+IHRoLnRoX2N1cnJlbnRfdGFzazsKKyAgICAgICAgLy8gU2hvdWxkIHdlIG1vZGVsIHRoaXMgYXMgYSB0YXNrIHdhaXQgb3Igbm90PworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgLy8gTm90ZTogVGhlc2UgdmFsdWVzIGFyZSB1c2VkIGJ5IElUVCBldmVudHMgYXMgd2VsbC4KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgICAgIHRhc2tkYXRhLT50ZF90YXNrd2FpdF9jb3VudGVyICs9IDE7CisgICAgICAgIHRhc2tkYXRhLT50ZF90YXNrd2FpdF9pZGVudCAgICA9IGxvY19yZWY7CisgICAgICAgIHRhc2tkYXRhLT50ZF90YXNrd2FpdF90aHJlYWQgICA9IGd0aWQgKyAxOworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICB2b2lkICogaXR0X3N5bmNfb2JqID0gX19rbXBfaXR0X3Rhc2t3YWl0X29iamVjdCggZ3RpZCApOworICAgICAgICBpZiAoIGl0dF9zeW5jX29iaiAhPSBOVUxMICkKKyAgICAgICAgICAgIF9fa21wX2l0dF90YXNrd2FpdF9zdGFydGluZyggZ3RpZCwgaXR0X3N5bmNfb2JqICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgICAgICBpZiAoICEgdGFza2RhdGEtPnRkX2ZsYWdzLnRlYW1fc2VyaWFsICkgeworICAgICAgICAgICAgX19rbXBfZXhlY3V0ZV90YXNrcyggdGhyZWFkLCBndGlkLCBOVUxMLCAwLCBGQUxTRSwgJnRocmVhZF9maW5pc2hlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3Rhc2tfc3RlYWxpbmdfY29uc3RyYWludCApOworICAgICAgICB9CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIGlmICggaXR0X3N5bmNfb2JqICE9IE5VTEwgKQorICAgICAgICAgICAgX19rbXBfaXR0X3Rhc2t3YWl0X2ZpbmlzaGVkKCBndGlkLCBpdHRfc3luY19vYmogKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICAgICAgLy8gR0VIIFRPRE86IHNob3VsZG4ndCB3ZSBoYXZlIHNvbWUgc29ydCBvZiBPTVBSQVAgQVBJIGNhbGxzIGhlcmUgdG8gbWFyayBlbmQgb2Ygd2FpdD8KKyAgICAgICAgdGFza2RhdGEtPnRkX3Rhc2t3YWl0X3RocmVhZCA9IC0gdGFza2RhdGEtPnRkX3Rhc2t3YWl0X3RocmVhZDsKKyAgICB9CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2t5aWVsZChleGl0KTogVCMlZCB0YXNrICVwIHJlc3VtaW5nLCAiCisgICAgICAgICAgICAgICAgICAicmV0dXJuaW5nIFRBU0tfQ1VSUkVOVF9OT1RfUVVFVUVEXG4iLCBndGlkLCB0YXNrZGF0YSkgKTsKKworICAgIHJldHVybiBUQVNLX0NVUlJFTlRfTk9UX1FVRVVFRDsKK30KKworCisjaWYgT01QXzQwX0VOQUJMRUQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBjX3Rhc2tncm91cDogU3RhcnQgYSBuZXcgdGFza2dyb3VwCisKK3ZvaWQKK19fa21wY190YXNrZ3JvdXAoIGlkZW50X3QqIGxvYywgaW50IGd0aWQgKQoreworICAgIGttcF9pbmZvX3QgICAgICAqIHRocmVhZCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICBrbXBfdGFza2RhdGFfdCAgKiB0YXNrZGF0YSA9IHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrOworICAgIGttcF90YXNrZ3JvdXBfdCAqIHRnX25ldyA9CisgICAgICAgIChrbXBfdGFza2dyb3VwX3QgKilfX2ttcF90aHJlYWRfbWFsbG9jKCB0aHJlYWQsIHNpemVvZigga21wX3Rhc2tncm91cF90ICkgKTsKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfdGFza2dyb3VwOiBUIyVkIGxvYz0lcCBncm91cD0lcFxuIiwgZ3RpZCwgbG9jLCB0Z19uZXcpICk7CisgICAgdGdfbmV3LT5jb3VudCA9IDA7CisgICAgdGdfbmV3LT5jYW5jZWxfcmVxdWVzdCA9IGNhbmNlbF9ub3JlcTsKKyAgICB0Z19uZXctPnBhcmVudCA9IHRhc2tkYXRhLT50ZF90YXNrZ3JvdXA7CisgICAgdGFza2RhdGEtPnRkX3Rhc2tncm91cCA9IHRnX25ldzsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wY19lbmRfdGFza2dyb3VwOiBXYWl0IHVudGlsIGFsbCB0YXNrcyBnZW5lcmF0ZWQgYnkgdGhlIGN1cnJlbnQgdGFzaworLy8gICAgICAgICAgICAgICAgICAgICAgIGFuZCBpdHMgZGVzY2VuZGFudHMgYXJlIGNvbXBsZXRlCisKK3ZvaWQKK19fa21wY19lbmRfdGFza2dyb3VwKCBpZGVudF90KiBsb2MsIGludCBndGlkICkKK3sKKyAgICBrbXBfaW5mb190ICAgICAgKiB0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAga21wX3Rhc2tkYXRhX3QgICogdGFza2RhdGEgPSB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzazsKKyAgICBrbXBfdGFza2dyb3VwX3QgKiB0YXNrZ3JvdXAgPSB0YXNrZGF0YS0+dGRfdGFza2dyb3VwOworICAgIGludCB0aHJlYWRfZmluaXNoZWQgPSBGQUxTRTsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19lbmRfdGFza2dyb3VwKGVudGVyKTogVCMlZCBsb2M9JXBcbiIsIGd0aWQsIGxvYykgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZ3JvdXAgIT0gTlVMTCApOworCisgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApIHsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIC8vIEZvciBJVFQgdGhlIHRhc2tncm91cCB3YWl0IGlzIHNpbWlsYXIgdG8gdGFza3dhaXQgdW50aWwgd2UgbmVlZCB0byBkaXN0aW5ndWlzaCB0aGVtCisgICAgICAgIHZvaWQgKiBpdHRfc3luY19vYmogPSBfX2ttcF9pdHRfdGFza3dhaXRfb2JqZWN0KCBndGlkICk7CisgICAgICAgIGlmICggaXR0X3N5bmNfb2JqICE9IE5VTEwgKQorICAgICAgICAgICAgX19rbXBfaXR0X3Rhc2t3YWl0X3N0YXJ0aW5nKCBndGlkLCBpdHRfc3luY19vYmogKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICAgICAgaWYgKCAhIHRhc2tkYXRhLT50ZF9mbGFncy50ZWFtX3NlcmlhbCApIHsKKyAgICAgICAgICAgIHdoaWxlICggVENSXzQodGFza2dyb3VwLT5jb3VudCkgIT0gMCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9leGVjdXRlX3Rhc2tzKCB0aHJlYWQsIGd0aWQsICYodGFza2dyb3VwLT5jb3VudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgRkFMU0UsICZ0aHJlYWRfZmluaXNoZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3Rhc2tfc3RlYWxpbmdfY29uc3RyYWludCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIGlmICggaXR0X3N5bmNfb2JqICE9IE5VTEwgKQorICAgICAgICAgICAgX19rbXBfaXR0X3Rhc2t3YWl0X2ZpbmlzaGVkKCBndGlkLCBpdHRfc3luY19vYmogKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tncm91cC0+Y291bnQgPT0gMCApOworCisgICAgLy8gUmVzdG9yZSBwYXJlbnQgdGFza2dyb3VwIGZvciB0aGUgY3VycmVudCB0YXNrCisgICAgdGFza2RhdGEtPnRkX3Rhc2tncm91cCA9IHRhc2tncm91cC0+cGFyZW50OworICAgIF9fa21wX3RocmVhZF9mcmVlKCB0aHJlYWQsIHRhc2tncm91cCApOworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX2VuZF90YXNrZ3JvdXAoZXhpdCk6IFQjJWQgdGFzayAlcCBmaW5pc2hlZCB3YWl0aW5nXG4iLCBndGlkLCB0YXNrZGF0YSkgKTsKK30KKyNlbmRpZgorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF9yZW1vdmVfbXlfdGFzazogcmVtb3ZlIGEgdGFzayBmcm9tIG15IG93biBkZXF1ZQorCitzdGF0aWMga21wX3Rhc2tfdCAqCitfX2ttcF9yZW1vdmVfbXlfdGFzaygga21wX2luZm9fdCAqIHRocmVhZCwga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtLAorICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBpc19jb25zdHJhaW5lZCApCit7CisgICAga21wX3Rhc2tfdCAqIHRhc2s7CisgICAga21wX3Rhc2tkYXRhX3QgKiB0YXNrZGF0YTsKKyAgICBrbXBfdGhyZWFkX2RhdGFfdCAqdGhyZWFkX2RhdGE7CisgICAga21wX3VpbnQzMiB0YWlsOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrX3RlYW0gLT4gdHQudHRfdGhyZWFkc19kYXRhICE9IE5VTEwgKTsgLy8gQ2FsbGVyIHNob3VsZCBjaGVjayB0aGlzIGNvbmRpdGlvbgorCisgICAgICAgIHRocmVhZF9kYXRhID0gJiB0YXNrX3RlYW0gLT4gdHQudHRfdGhyZWFkc19kYXRhWyBfX2ttcF90aWRfZnJvbV9ndGlkKCBndGlkICkgXTsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3JlbW92ZV9teV90YXNrKGVudGVyKTogVCMlZCBudGFza3M9JWQgaGVhZD0ldSB0YWlsPSV1XG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX250YXNrcywgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX2hlYWQsCisgICAgICAgICAgICAgICAgICB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfdGFpbCkgKTsKKworICAgIGlmIChUQ1JfNCh0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9udGFza3MpID09IDApIHsKKyAgICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfcmVtb3ZlX215X3Rhc2soZXhpdCAjMSk6IFQjJWQgTm8gdGFza3MgdG8gcmVtb3ZlOiBudGFza3M9JWQgaGVhZD0ldSB0YWlsPSV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9udGFza3MsIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9oZWFkLAorICAgICAgICAgICAgICAgICAgICAgIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV90YWlsKSApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX2xvY2sgKTsKKworICAgIGlmIChUQ1JfNCh0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9udGFza3MpID09IDApIHsKKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9sb2NrICk7CisgICAgICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3JlbW92ZV9teV90YXNrKGV4aXQgIzIpOiBUIyVkIE5vIHRhc2tzIHRvIHJlbW92ZTogbnRhc2tzPSVkIGhlYWQ9JXUgdGFpbD0ldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfbnRhc2tzLCB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfaGVhZCwKKyAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfdGFpbCkgKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgdGFpbCA9ICggdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfdGFpbCAtIDEgKSAmIFRBU0tfREVRVUVfTUFTSzsgIC8vIFdyYXAgaW5kZXguCisgICAgdGFza2RhdGEgPSB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZVsgdGFpbCBdOworCisgICAgaWYgKGlzX2NvbnN0cmFpbmVkKSB7CisgICAgICAgIC8vIHdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIGNhbmRpZGF0ZSBvYmV5cyB0YXNrIHNjaGVkdWxpbmcgY29uc3RyYWludDoKKyAgICAgICAgLy8gb25seSBjaGlsZCBvZiBjdXJyZW50IHRhc2sgY2FuIGJlIHNjaGVkdWxlZAorICAgICAgICBrbXBfdGFza2RhdGFfdCAqIGN1cnJlbnQgPSB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzazsKKyAgICAgICAga21wX2ludDMyICAgICAgICBsZXZlbCA9IGN1cnJlbnQtPnRkX2xldmVsOworICAgICAgICBrbXBfdGFza2RhdGFfdCAqIHBhcmVudCA9IHRhc2tkYXRhLT50ZF9wYXJlbnQ7CisgICAgICAgIHdoaWxlICggcGFyZW50ICE9IGN1cnJlbnQgJiYgcGFyZW50LT50ZF9sZXZlbCA+IGxldmVsICkgeworICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LT50ZF9wYXJlbnQ7ICAvLyBjaGVjayBnZW5lcmF0aW9uIHVwIHRvIHRoZSBsZXZlbCBvZiB0aGUgY3VycmVudCB0YXNrCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHBhcmVudCAhPSBOVUxMKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIHBhcmVudCAhPSBjdXJyZW50ICkgeworICAgICAgICAgICAgLy8gSWYgdGhlIHRhaWwgdGFzayBpcyBub3QgYSBjaGlsZCwgdGhlbiBubyBvdGhlciBjaGlsZHMgY2FuIGFwcGVhciBpbiB0aGUgZGVxdWUuCisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX2xvY2sgKTsKKyAgICAgICAgICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3JlbW92ZV9teV90YXNrKGV4aXQgIzIpOiBUIyVkIE5vIHRhc2tzIHRvIHJlbW92ZTogbnRhc2tzPSVkIGhlYWQ9JXUgdGFpbD0ldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX250YXNrcywgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX2hlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV90YWlsKSApOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV90YWlsID0gdGFpbDsKKyAgICBUQ1dfNCh0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9udGFza3MsIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX250YXNrcyAtIDEpOworCisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfbG9jayApOworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfcmVtb3ZlX215X3Rhc2soZXhpdCAjMik6IFQjJWQgdGFzayAlcCByZW1vdmVkOiBudGFza3M9JWQgaGVhZD0ldSB0YWlsPSV1XG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEsIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9udGFza3MsIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9oZWFkLAorICAgICAgICAgICAgICAgICAgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX3RhaWwpICk7CisKKyAgICB0YXNrID0gS01QX1RBU0tEQVRBX1RPX1RBU0soIHRhc2tkYXRhICk7CisgICAgcmV0dXJuIHRhc2s7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfc3RlYWxfdGFzazogcmVtb3ZlIGEgdGFzayBmcm9tIGFub3RoZXIgdGhyZWFkJ3MgZGVxdWUKKy8vIEFzc3VtZSB0aGF0IGNhbGxpbmcgdGhyZWFkIGhhcyBhbHJlYWR5IGNoZWNrZWQgZXhpc3RlbmNlIG9mCisvLyB0YXNrX3RlYW0gdGhyZWFkX2RhdGEgYmVmb3JlIGNhbGxpbmcgdGhpcyByb3V0aW5lLgorCitzdGF0aWMga21wX3Rhc2tfdCAqCitfX2ttcF9zdGVhbF90YXNrKCBrbXBfaW5mb190ICp2aWN0aW0sIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ZWFtX3QgKnRhc2tfdGVhbSwKKyAgICAgICAgICAgICAgICAgIHZvbGF0aWxlIGttcF91aW50MzIgKnVuZmluaXNoZWRfdGhyZWFkcywgaW50ICp0aHJlYWRfZmluaXNoZWQsCisgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgaXNfY29uc3RyYWluZWQgKQoreworICAgIGttcF90YXNrX3QgKiB0YXNrOworICAgIGttcF90YXNrZGF0YV90ICogdGFza2RhdGE7CisgICAga21wX3RocmVhZF9kYXRhX3QgKnZpY3RpbV90ZCwgKnRocmVhZHNfZGF0YTsKKyAgICBrbXBfaW50MzIgdmljdGltX3RpZCwgdGhyZWFkX3RpZDsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICk7CisKKyAgICB0aHJlYWRzX2RhdGEgPSB0YXNrX3RlYW0gLT4gdHQudHRfdGhyZWFkc19kYXRhOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRocmVhZHNfZGF0YSAhPSBOVUxMICk7ICAvLyBDYWxsZXIgc2hvdWxkIGNoZWNrIHRoaXMgY29uZGl0aW9uCisKKyAgICB2aWN0aW1fdGlkID0gdmljdGltLT50aC50aF9pbmZvLmRzLmRzX3RpZDsKKyAgICB2aWN0aW1fdGQgPSAmIHRocmVhZHNfZGF0YVsgdmljdGltX3RpZCBdOworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfc3RlYWxfdGFzayhlbnRlcik6IFQjJWQgdHJ5IHRvIHN0ZWFsIGZyb20gVCMlZDogdGFza190ZWFtPSVwIG50YXNrcz0lZCAiCisgICAgICAgICAgICAgICAgICAiaGVhZD0ldSB0YWlsPSV1XG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdmljdGltICksIHRhc2tfdGVhbSwgdmljdGltX3RkLT50ZC50ZF9kZXF1ZV9udGFza3MsCisgICAgICAgICAgICAgICAgICB2aWN0aW1fdGQtPnRkLnRkX2RlcXVlX2hlYWQsIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfdGFpbCkgKTsKKworICAgIGlmICggKFRDUl80KHZpY3RpbV90ZCAtPiB0ZC50ZF9kZXF1ZV9udGFza3MpID09IDApIHx8IC8vIENhbGxlciBzaG91bGQgbm90IGNoZWNrIHRoaXMgY29uZGl0aW9uCisgICAgICAgICAoVENSX1BUUih2aWN0aW0tPnRoLnRoX3Rhc2tfdGVhbSkgIT0gdGFza190ZWFtKSkgLy8gR0VIOiB3aHkgd291bGQgdGhpcyBoYXBwZW4/CisgICAgeworICAgICAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9zdGVhbF90YXNrKGV4aXQgIzEpOiBUIyVkIGNvdWxkIG5vdCBzdGVhbCBmcm9tIFQjJWQ6IHRhc2tfdGVhbT0lcCAiCisgICAgICAgICAgICAgICAgICAgICAgIm50YXNrcz0lZCBoZWFkPSV1IHRhaWw9JXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdmljdGltICksIHRhc2tfdGVhbSwgdmljdGltX3RkLT50ZC50ZF9kZXF1ZV9udGFza3MsCisgICAgICAgICAgICAgICAgICAgICAgdmljdGltX3RkLT50ZC50ZF9kZXF1ZV9oZWFkLCB2aWN0aW1fdGQtPnRkLnRkX2RlcXVlX3RhaWwpICk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgdmljdGltX3RkIC0+IHRkLnRkX2RlcXVlX2xvY2sgKTsKKworICAgIC8vIENoZWNrIGFnYWluIGFmdGVyIHdlIGFjcXVpcmUgdGhlIGxvY2sKKyAgICBpZiAoIChUQ1JfNCh2aWN0aW1fdGQgLT4gdGQudGRfZGVxdWVfbnRhc2tzKSA9PSAwKSB8fAorICAgICAgICAgKFRDUl9QVFIodmljdGltLT50aC50aF90YXNrX3RlYW0pICE9IHRhc2tfdGVhbSkpIC8vIEdFSDogd2h5IHdvdWxkIHRoaXMgaGFwcGVuPworICAgIHsKKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiB2aWN0aW1fdGQgLT4gdGQudGRfZGVxdWVfbG9jayApOworICAgICAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9zdGVhbF90YXNrKGV4aXQgIzIpOiBUIyVkIGNvdWxkIG5vdCBzdGVhbCBmcm9tIFQjJWQ6IHRhc2tfdGVhbT0lcCAiCisgICAgICAgICAgICAgICAgICAgICAgIm50YXNrcz0lZCBoZWFkPSV1IHRhaWw9JXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdmljdGltICksIHRhc2tfdGVhbSwgdmljdGltX3RkLT50ZC50ZF9kZXF1ZV9udGFza3MsCisgICAgICAgICAgICAgICAgICAgICAgdmljdGltX3RkLT50ZC50ZF9kZXF1ZV9oZWFkLCB2aWN0aW1fdGQtPnRkLnRkX2RlcXVlX3RhaWwpICk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHZpY3RpbV90ZCAtPiB0ZC50ZF9kZXF1ZSAhPSBOVUxMICk7CisKKyAgICBpZiAoICFpc19jb25zdHJhaW5lZCApIHsKKyAgICAgICAgdGFza2RhdGEgPSB2aWN0aW1fdGQgLT4gdGQudGRfZGVxdWVbIHZpY3RpbV90ZCAtPiB0ZC50ZF9kZXF1ZV9oZWFkIF07CisgICAgICAgIC8vIEJ1bXAgaGVhZCBwb2ludGVyIGFuZCBXcmFwLgorICAgICAgICB2aWN0aW1fdGQgLT4gdGQudGRfZGVxdWVfaGVhZCA9ICggdmljdGltX3RkIC0+IHRkLnRkX2RlcXVlX2hlYWQgKyAxICkgJiBUQVNLX0RFUVVFX01BU0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gV2hpbGUgd2UgaGF2ZSBwb3N0cG9uZWQgdGFza3MgbGV0J3Mgc3RlYWwgZnJvbSB0YWlsIG9mIHRoZSBkZXF1ZSAoc21hbGxlciB0YXNrcykKKyAgICAgICAga21wX2ludDMyIHRhaWwgPSAoIHZpY3RpbV90ZCAtPiB0ZC50ZF9kZXF1ZV90YWlsIC0gMSApICYgVEFTS19ERVFVRV9NQVNLOyAgLy8gV3JhcCBpbmRleC4KKyAgICAgICAgdGFza2RhdGEgPSB2aWN0aW1fdGQgLT4gdGQudGRfZGVxdWVbIHRhaWwgXTsKKyAgICAgICAgLy8gd2UgbmVlZCB0byBjaGVjayBpZiB0aGUgY2FuZGlkYXRlIG9iZXlzIHRhc2sgc2NoZWR1bGluZyBjb25zdHJhaW50OgorICAgICAgICAvLyBvbmx5IGNoaWxkIG9mIGN1cnJlbnQgdGFzayBjYW4gYmUgc2NoZWR1bGVkCisgICAgICAgIGttcF90YXNrZGF0YV90ICogY3VycmVudCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXS0+dGgudGhfY3VycmVudF90YXNrOworICAgICAgICBrbXBfaW50MzIgICAgICAgIGxldmVsID0gY3VycmVudC0+dGRfbGV2ZWw7CisgICAgICAgIGttcF90YXNrZGF0YV90ICogcGFyZW50ID0gdGFza2RhdGEtPnRkX3BhcmVudDsKKyAgICAgICAgd2hpbGUgKCBwYXJlbnQgIT0gY3VycmVudCAmJiBwYXJlbnQtPnRkX2xldmVsID4gbGV2ZWwgKSB7CisgICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQtPnRkX3BhcmVudDsgIC8vIGNoZWNrIGdlbmVyYXRpb24gdXAgdG8gdGhlIGxldmVsIG9mIHRoZSBjdXJyZW50IHRhc2sKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQocGFyZW50ICE9IE5VTEwpOworICAgICAgICB9CisgICAgICAgIGlmICggcGFyZW50ICE9IGN1cnJlbnQgKSB7CisgICAgICAgICAgICAvLyBJZiB0aGUgdGFpbCB0YXNrIGlzIG5vdCBhIGNoaWxkLCB0aGVuIG5vIG90aGVyIGNoaWxkcyBjYW4gYXBwZWFyIGluIHRoZSBkZXF1ZSAoPykuCisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIHZpY3RpbV90ZCAtPiB0ZC50ZF9kZXF1ZV9sb2NrICk7CisgICAgICAgICAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9zdGVhbF90YXNrKGV4aXQgIzIpOiBUIyVkIGNvdWxkIG5vdCBzdGVhbCBmcm9tIFQjJWQ6IHRhc2tfdGVhbT0lcCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJudGFza3M9JWQgaGVhZD0ldSB0YWlsPSV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aHJlYWRzX2RhdGFbdmljdGltX3RpZF0udGQudGRfdGhyICksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tfdGVhbSwgdmljdGltX3RkLT50ZC50ZF9kZXF1ZV9udGFza3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfaGVhZCwgdmljdGltX3RkLT50ZC50ZF9kZXF1ZV90YWlsKSApOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgdmljdGltX3RkIC0+IHRkLnRkX2RlcXVlX3RhaWwgPSB0YWlsOworICAgIH0KKyAgICBpZiAoKnRocmVhZF9maW5pc2hlZCkgeworICAgICAgICAvLyBXZSBuZWVkIHRvIHVuLW1hcmsgdGhpcyB2aWN0aW0gYXMgYSBmaW5pc2hlZCB2aWN0aW0uICBUaGlzIG11c3QgYmUgZG9uZSBiZWZvcmUKKyAgICAgICAgLy8gcmVsZWFzaW5nIHRoZSBsb2NrLCBvciBlbHNlIG90aGVyIHRocmVhZHMgKHN0YXJ0aW5nIHdpdGggdGhlIG1hc3RlciB2aWN0aW0pCisgICAgICAgIC8vIG1pZ2h0IGJlIHByZW1hdHVyZWx5IHJlbGVhc2VkIGZyb20gdGhlIGJhcnJpZXIhISEKKyAgICAgICAga21wX3VpbnQzMiBjb3VudCA9IEtNUF9URVNUX1RIRU5fSU5DMzIoIChrbXBfaW50MzIgKil1bmZpbmlzaGVkX3RocmVhZHMgKTsKKworICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9zdGVhbF90YXNrOiBUIyVkIGluYyB1bmZpbmlzaGVkX3RocmVhZHMgdG8gJWQ6IHRhc2tfdGVhbT0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBndGlkLCBjb3VudCArIDEsIHRhc2tfdGVhbSkgKTsKKworICAgICAgICAqdGhyZWFkX2ZpbmlzaGVkID0gRkFMU0U7CisgICAgfQorICAgIFRDV180KHZpY3RpbV90ZCAtPiB0ZC50ZF9kZXF1ZV9udGFza3MsIFRDUl80KHZpY3RpbV90ZCAtPiB0ZC50ZF9kZXF1ZV9udGFza3MpIC0gMSk7CisKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIHZpY3RpbV90ZCAtPiB0ZC50ZF9kZXF1ZV9sb2NrICk7CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9zdGVhbF90YXNrKGV4aXQgIzMpOiBUIyVkIHN0b2xlIHRhc2sgJXAgZnJvbSBUI2Q6IHRhc2tfdGVhbT0lcCAiCisgICAgICAgICAgICAgICAgICAibnRhc2tzPSVkIGhlYWQ9JXUgdGFpbD0ldVxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhLCBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB2aWN0aW0gKSwgdGFza190ZWFtLAorICAgICAgICAgICAgICAgICAgdmljdGltX3RkLT50ZC50ZF9kZXF1ZV9udGFza3MsIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfaGVhZCwKKyAgICAgICAgICAgICAgICAgIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfdGFpbCkgKTsKKworICAgIHRhc2sgPSBLTVBfVEFTS0RBVEFfVE9fVEFTSyggdGFza2RhdGEgKTsKKyAgICByZXR1cm4gdGFzazsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF9leGVjdXRlX3Rhc2tzOiBDaG9vc2UgYW5kIGV4ZWN1dGUgdGFza3MgdW50aWwgZWl0aGVyIHRoZSBjb25kaXRpb24KKy8vIGlzIHN0YXRpc2ZpZWQgKHJldHVybiB0cnVlKSBvciB0aGVyZSBhcmUgbm9uZSBsZWZ0IChyZXR1cm4gZmFsc2UpLgorLy8gZmluYWxfc3BpbiBpcyBUUlVFIGlmIHRoaXMgaXMgdGhlIHNwaW4gYXQgdGhlIHJlbGVhc2UgYmFycmllci4KKy8vIHRocmVhZF9maW5pc2hlZCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgdGhyZWFkIGlzIGZpbmlzaGVkIGV4ZWN1dGluZyBhbGwKKy8vIHRoZSB0YXNrcyBpdCBoYXMgb24gaXRzIGRlcXVlLCBhbmQgaXMgYXQgdGhlIHJlbGVhc2UgYmFycmllci4KKy8vIHNwaW5uZXIgaXMgdGhlIGxvY2F0aW9uIG9uIHdoaWNoIHRvIHNwaW4uCisvLyBzcGlubmVyID09IE5VTEwgbWVhbnMgb25seSBleGVjdXRlIGEgc2luZ2xlIHRhc2sgYW5kIHJldHVybi4KKy8vIGNoZWNrZXIgaXMgdGhlIHZhbHVlIHRvIGNoZWNrIHRvIHRlcm1pbmF0ZSB0aGUgc3Bpbi4KKworaW50CitfX2ttcF9leGVjdXRlX3Rhc2tzKCBrbXBfaW5mb190ICp0aHJlYWQsCisgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgIHZvbGF0aWxlIGttcF91aW50ICpzcGlubmVyLAorICAgICAgICAgICAgICAgICAgICAga21wX3VpbnQgY2hlY2tlciwKKyAgICAgICAgICAgICAgICAgICAgIGludCBmaW5hbF9zcGluLAorICAgICAgICAgICAgICAgICAgICAgaW50ICp0aHJlYWRfZmluaXNoZWQKKyAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKiBpdHRfc3luY19vYmopLAorICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGlzX2NvbnN0cmFpbmVkICkKK3sKKyAgICBrbXBfdGFza190ZWFtX3QgKiAgICAgdGFza190ZWFtOworICAgIGttcF90ZWFtX3QgKiAgICAgICAgICB0ZWFtOworICAgIGttcF90aHJlYWRfZGF0YV90ICogICB0aHJlYWRzX2RhdGE7CisgICAga21wX3Rhc2tfdCAqICAgICAgICAgIHRhc2s7CisgICAga21wX3Rhc2tkYXRhX3QgKiAgICAgIGN1cnJlbnRfdGFzayA9IHRocmVhZCAtPiB0aC50aF9jdXJyZW50X3Rhc2s7CisgICAgdm9sYXRpbGUga21wX3VpbnQzMiAqIHVuZmluaXNoZWRfdGhyZWFkczsKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgbnRocmVhZHMsIGxhc3Rfc3RvbGVuLCBrLCB0aWQ7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRocmVhZCA9PSBfX2ttcF90aHJlYWRzWyBndGlkIF0gKTsKKworICAgIHRhc2tfdGVhbSA9IHRocmVhZCAtPiB0aC50aF90YXNrX3RlYW07CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza190ZWFtICE9IE5VTEwgKTsKKworICAgIEtBX1RSQUNFKDE1LCAoIl9fa21wX2V4ZWN1dGVfdGFza3MoZW50ZXIpOiBUIyVkIGZpbmFsX3NwaW49JWQgKnRocmVhZF9maW5pc2hlZD0lZFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGZpbmFsX3NwaW4sICp0aHJlYWRfZmluaXNoZWQpICk7CisKKyAgICB0aHJlYWRzX2RhdGEgPSAoa21wX3RocmVhZF9kYXRhX3QgKilUQ1JfUFRSKHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2RhdGEpOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRocmVhZHNfZGF0YSAhPSBOVUxMICk7CisKKyAgICBudGhyZWFkcyA9IHRhc2tfdGVhbSAtPiB0dC50dF9ucHJvYzsKKyAgICB1bmZpbmlzaGVkX3RocmVhZHMgPSAmKHRhc2tfdGVhbSAtPiB0dC50dF91bmZpbmlzaGVkX3RocmVhZHMpOworICAgIEtNUF9ERUJVR19BU1NFUlQoIG50aHJlYWRzID4gMSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIFRDUl80KChpbnQpKnVuZmluaXNoZWRfdGhyZWFkcykgPj0gMCApOworCisgICAgLy8gQ2hvb3NlIHRhc2tzIGZyb20gb3VyIG93biB3b3JrIHF1ZXVlLgorICAgIHN0YXJ0OgorICAgIHdoaWxlICgoIHRhc2sgPSBfX2ttcF9yZW1vdmVfbXlfdGFzayggdGhyZWFkLCBndGlkLCB0YXNrX3RlYW0sIGlzX2NvbnN0cmFpbmVkICkpICE9IE5VTEwgKSB7CisjaWYgVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWQorICAgICAgICBpZiAoIF9faXR0X3N5bmNfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHICkgeworICAgICAgICAgICAgaWYgKCBpdHRfc3luY19vYmogPT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSBhcmUgYXQgZm9yayBiYXJyaWVyIHdoZXJlIHdlIGNvdWxkIG5vdCBnZXQgdGhlIG9iamVjdCByZWxpYWJseQorICAgICAgICAgICAgICAgIGl0dF9zeW5jX29iaiAgPSBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoIGd0aWQsIGJzX2Zvcmtqb2luX2JhcnJpZXIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9fa21wX2l0dF90YXNrX3N0YXJ0aW5nKCBpdHRfc3luY19vYmogKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkgKi8KKyAgICAgICAgX19rbXBfaW52b2tlX3Rhc2soIGd0aWQsIHRhc2ssIGN1cnJlbnRfdGFzayApOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgaWYgKCBpdHRfc3luY19vYmogIT0gTlVMTCApCisgICAgICAgICAgICBfX2ttcF9pdHRfdGFza19maW5pc2hlZCggaXR0X3N5bmNfb2JqICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgICAgIC8vIElmIHRoaXMgdGhyZWFkIGlzIG9ubHkgcGFydHdheSB0aHJvdWdoIHRoZSBiYXJyaWVyIGFuZCB0aGUgY29uZGl0aW9uCisgICAgICAgIC8vIGlzIG1ldCwgdGhlbiByZXR1cm4gbm93LCBzbyB0aGF0IHRoZSBiYXJyaWVyIGdhdGhlci9yZWxlYXNlIHBhdHRlcm4gY2FuIHByb2NlZWQuCisgICAgICAgIC8vIElmIHRoaXMgdGhyZWFkIGlzIGluIHRoZSBsYXN0IHNwaW4gbG9vcCBpbiB0aGUgYmFycmllciwgd2FpdGluZyB0byBiZQorICAgICAgICAvLyByZWxlYXNlZCwgd2Uga25vdyB0aGF0IHRoZSB0ZXJtaW5hdGlvbiBjb25kaXRpb24gd2lsbCBub3QgYmUgc2F0aXNpZmllZCwKKyAgICAgICAgLy8gc28gZG9uJ3Qgd2FzdGUgYW55IGN5Y2xlcyBjaGVja2luZyBpdC4KKyAgICAgICAgaWYgKChzcGlubmVyID09IE5VTEwpIHx8ICgoIWZpbmFsX3NwaW4pICYmIChUQ1JfNCgqc3Bpbm5lcikgPT0gY2hlY2tlcikpKSB7CisgICAgICAgICAgICBLQV9UUkFDRSgxNSwgKCJfX2ttcF9leGVjdXRlX3Rhc2tzKGV4aXQgIzEpOiBUIyVkIHNwaW4gY29uZGl0aW9uIHNhdGlzZmllZFxuIiwgZ3RpZCkgKTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgICAgIEtNUF9ZSUVMRCggX19rbXBfbGlicmFyeSA9PSBsaWJyYXJ5X3Rocm91Z2hwdXQgKTsgICAvLyBZaWVsZCBiZWZvcmUgZXhlY3V0aW5nIG5leHQgdGFzaworICAgIH0KKworICAgIC8vIFRoaXMgdGhyZWFkJ3Mgd29yayBxdWV1ZSBpcyBlbXB0eS4gIElmIHdlIGFyZSBpbiB0aGUgZmluYWwgc3BpbiBsb29wCisgICAgLy8gb2YgdGhlIGJhcnJpZXIsIGNoZWNrIGFuZCBzZWUgaWYgdGhlIHRlcm1pbmF0aW9uIGNvbmRpdGlvbiBpcyBzYXRpc2ZpZWQuCisgICAgaWYgKGZpbmFsX3NwaW4pIHsKKyAgICAgICAgLy8gRmlyc3QsIGRlY3JlbWVudCB0aGUgI3VuZmluaXNoZWQgdGhyZWFkcywgaWYgdGhhdCBoYXMgbm90IGFscmVhZHkKKyAgICAgICAgLy8gYmVlbiBkb25lLiAgVGhpcyBkZWNyZW1lbnQgbWlnaHQgYmUgdG8gdGhlIHNwaW4gbG9jYXRpb24sIGFuZAorICAgICAgICAvLyByZXN1bHQgaW4gdGhlIHRlcm1pbmF0aW9uIGNvbmRpdGlvbiBiZWluZyBzYXRpc2ZpZWQuCisgICAgICAgIGlmICghICp0aHJlYWRfZmluaXNoZWQpIHsKKyAgICAgICAgICAgIGttcF91aW50MzIgY291bnQgPSBLTVBfVEVTVF9USEVOX0RFQzMyKCAoa21wX2ludDMyICopdW5maW5pc2hlZF90aHJlYWRzICkgLSAxOworICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfZXhlY3V0ZV90YXNrcyhkZWMgIzEpOiBUIyVkIGRlYyB1bmZpbmlzaGVkX3RocmVhZHMgdG8gJWQgdGFza190ZWFtPSVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCBjb3VudCwgdGFza190ZWFtKSApOworICAgICAgICAgICAgKnRocmVhZF9maW5pc2hlZCA9IFRSVUU7CisgICAgICAgIH0KKworICAgICAgICAvLyBJdCBpcyBub3cgdW5zYWZlIHRvIHJlZmVyZW5jZSB0aHJlYWQtPnRoLnRoX3RlYW0gISEhCisgICAgICAgIC8vIERlY3JlbWVudGluZyB0YXNrX3RlYW0tPnR0LnR0X3VuZmluaXNoZWRfdGhyZWFkcyBjYW4gYWxsb3cgdGhlIG1hc3RlcgorICAgICAgICAvLyB0aHJlYWQgdG8gcGFzcyB0aHJvdWdoIHRoZSBiYXJyaWVyLCB3aGVyZSBpdCBtaWdodCByZXNldCBlYWNoIHRocmVhZCdzCisgICAgICAgIC8vIHRoLnRoX3RlYW0gZmllbGQgZm9yIHRoZSBuZXh0IHBhcmFsbGVsIHJlZ2lvbi4KKyAgICAgICAgLy8gSWYgd2UgY2FuIHN0ZWFsIG1vcmUgd29yaywgd2Uga25vdyB0aGF0IHRoaXMgaGFzIG5vdCBoYXBwZW5lZCB5ZXQuCisgICAgICAgIGlmICgoc3Bpbm5lciAhPSBOVUxMKSAmJiAoVENSXzQoKnNwaW5uZXIpID09IGNoZWNrZXIpKSB7CisgICAgICAgICAgICBLQV9UUkFDRSgxNSwgKCJfX2ttcF9leGVjdXRlX3Rhc2tzKGV4aXQgIzIpOiBUIyVkIHNwaW4gY29uZGl0aW9uIHNhdGlzZmllZFxuIiwgZ3RpZCkgKTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVHJ5IHRvIHN0ZWFsIGZyb20gdGhlIGxhc3QgcGxhY2UgSSBzdG9sZSBmcm9tIHN1Y2Nlc3NmdWxseS4KKyAgICB0aWQgPSB0aHJlYWQgLT4gdGgudGhfaW5mby5kcy5kc190aWQ7Ly9fX2ttcF90aWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAgbGFzdF9zdG9sZW4gPSB0aHJlYWRzX2RhdGFbIHRpZCBdLnRkLnRkX2RlcXVlX2xhc3Rfc3RvbGVuOworCisgICAgaWYgKGxhc3Rfc3RvbGVuICE9IC0xKSB7CisgICAgICAgIGttcF9pbmZvX3QgKm90aGVyX3RocmVhZCA9IHRocmVhZHNfZGF0YVtsYXN0X3N0b2xlbl0udGQudGRfdGhyOworCisgICAgICAgIHdoaWxlICgodGFzayA9IF9fa21wX3N0ZWFsX3Rhc2soIG90aGVyX3RocmVhZCwgZ3RpZCwgdGFza190ZWFtLCB1bmZpbmlzaGVkX3RocmVhZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZF9maW5pc2hlZCwgaXNfY29uc3RyYWluZWQgKSkgIT0gTlVMTCkKKyAgICAgICAgeworI2lmIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgICAgIGlmICggX19pdHRfc3luY19jcmVhdGVfcHRyIHx8IEtNUF9JVFRfREVCVUcgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBpdHRfc3luY19vYmogPT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gd2UgYXJlIGF0IGZvcmsgYmFycmllciB3aGVyZSB3ZSBjb3VsZCBub3QgZ2V0IHRoZSBvYmplY3QgcmVsaWFibHkKKyAgICAgICAgICAgICAgICAgICAgaXR0X3N5bmNfb2JqICA9IF9fa21wX2l0dF9iYXJyaWVyX29iamVjdCggZ3RpZCwgYnNfZm9ya2pvaW5fYmFycmllciApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfX2ttcF9pdHRfdGFza19zdGFydGluZyggaXR0X3N5bmNfb2JqICk7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWSAqLworICAgICAgICAgICAgX19rbXBfaW52b2tlX3Rhc2soIGd0aWQsIHRhc2ssIGN1cnJlbnRfdGFzayApOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgICAgIGlmICggaXR0X3N5bmNfb2JqICE9IE5VTEwgKQorICAgICAgICAgICAgICAgIF9fa21wX2l0dF90YXNrX2ZpbmlzaGVkKCBpdHRfc3luY19vYmogKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICAgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGlzIHRocmVhZCBjYW4gcHJvY2VlZC4KKyAgICAgICAgICAgIGlmICgoc3Bpbm5lciA9PSBOVUxMKSB8fCAoKCFmaW5hbF9zcGluKSAmJiAoVENSXzQoKnNwaW5uZXIpID09IGNoZWNrZXIpKSkgeworICAgICAgICAgICAgICAgIEtBX1RSQUNFKDE1LCAoIl9fa21wX2V4ZWN1dGVfdGFza3MoZXhpdCAjMyk6IFQjJWQgc3BpbiBjb25kaXRpb24gc2F0aXNmaWVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCkgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgS01QX1lJRUxEKCBfX2ttcF9saWJyYXJ5ID09IGxpYnJhcnlfdGhyb3VnaHB1dCApOyAgIC8vIFlpZWxkIGJlZm9yZSBleGVjdXRpbmcgbmV4dCB0YXNrCisgICAgICAgICAgICAvLyBJZiB0aGUgZXhlY3V0aW9uIG9mIHRoZSBzdG9sZW4gdGFzayByZXN1bHRlZCBpbiBtb3JlIHRhc2tzIGJlaW5nCisgICAgICAgICAgICAvLyBwbGFjZWQgb24gb3VyIHJ1biBxdWV1ZSwgdGhlbiByZXN0YXJ0IHRoZSB3aG9sZSBwcm9jZXNzLgorICAgICAgICAgICAgaWYgKFRDUl80KHRocmVhZHNfZGF0YVsgdGlkIF0udGQudGRfZGVxdWVfbnRhc2tzKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfZXhlY3V0ZV90YXNrczogVCMlZCBzdG9sZW4gdGFzayBzcGF3bmVkIG90aGVyIHRhc2tzLCByZXN0YXJ0XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCkgKTsKKyAgICAgICAgICAgICAgICBnb3RvIHN0YXJ0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRG9uJ3QgZ2l2ZSBwcmlvcml0eSB0byBzdGVhbGluZyBmcm9tIHRoaXMgdGhyZWFkIGFueW1vcmUuCisgICAgICAgIHRocmVhZHNfZGF0YVsgdGlkIF0udGQudGRfZGVxdWVfbGFzdF9zdG9sZW4gPSAtMTsKKworICAgICAgICAvLyBUaGUgdmljdGltcydzIHdvcmsgcXVldWUgaXMgZW1wdHkuICBJZiB3ZSBhcmUgaW4gdGhlIGZpbmFsIHNwaW4gbG9vcAorICAgICAgICAvLyBvZiB0aGUgYmFycmllciwgY2hlY2sgYW5kIHNlZSBpZiB0aGUgdGVybWluYXRpb24gY29uZGl0aW9uIGlzIHNhdGlzZmllZC4KKyAgICAgICAgaWYgKGZpbmFsX3NwaW4pIHsKKyAgICAgICAgICAgIC8vIEZpcnN0LCBkZWNyZW1lbnQgdGhlICN1bmZpbmlzaGVkIHRocmVhZHMsIGlmIHRoYXQgaGFzIG5vdCBhbHJlYWR5CisgICAgICAgICAgICAvLyBiZWVuIGRvbmUuICBUaGlzIGRlY3JlbWVudCBtaWdodCBiZSB0byB0aGUgc3BpbiBsb2NhdGlvbiwgYW5kCisgICAgICAgICAgICAvLyByZXN1bHQgaW4gdGhlIHRlcm1pbmF0aW9uIGNvbmRpdGlvbiBiZWluZyBzYXRpc2ZpZWQuCisgICAgICAgICAgICBpZiAoISAqdGhyZWFkX2ZpbmlzaGVkKSB7CisgICAgICAgICAgICAgICAga21wX3VpbnQzMiBjb3VudCA9IEtNUF9URVNUX1RIRU5fREVDMzIoIChrbXBfaW50MzIgKil1bmZpbmlzaGVkX3RocmVhZHMgKSAtIDE7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfZXhlY3V0ZV90YXNrcyhkZWMgIzIpOiBUIyVkIGRlYyB1bmZpbmlzaGVkX3RocmVhZHMgdG8gJWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhc2tfdGVhbT0lcFxuIiwgZ3RpZCwgY291bnQsIHRhc2tfdGVhbSkgKTsKKyAgICAgICAgICAgICAgICAqdGhyZWFkX2ZpbmlzaGVkID0gVFJVRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMKKyAgICAgICAgICAgIC8vIHRoZW4gaXQgaXMgbm93IHVuc2FmZSB0byByZWZlcmVuY2UgdGhyZWFkLT50aC50aF90ZWFtICEhIQorICAgICAgICAgICAgLy8gRGVjcmVtZW50aW5nIHRhc2tfdGVhbS0+dHQudHRfdW5maW5pc2hlZF90aHJlYWRzIGNhbiBhbGxvdyB0aGUgbWFzdGVyCisgICAgICAgICAgICAvLyB0aHJlYWQgdG8gcGFzcyB0aHJvdWdoIHRoZSBiYXJyaWVyLCB3aGVyZSBpdCBtaWdodCByZXNldCBlYWNoIHRocmVhZCdzCisgICAgICAgICAgICAvLyB0aC50aF90ZWFtIGZpZWxkIGZvciB0aGUgbmV4dCBwYXJhbGxlbCByZWdpb24uCisgICAgICAgICAgICAvLyBJZiB3ZSBjYW4gc3RlYWwgbW9yZSB3b3JrLCB3ZSBrbm93IHRoYXQgdGhpcyBoYXMgbm90IGhhcHBlbmVkIHlldC4KKyAgICAgICAgICAgIGlmICgoc3Bpbm5lciAhPSBOVUxMKSAmJiAoVENSXzQoKnNwaW5uZXIpID09IGNoZWNrZXIpKSB7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMTUsICgiX19rbXBfZXhlY3V0ZV90YXNrcyhleGl0ICM0KTogVCMlZCBzcGluIGNvbmRpdGlvbiBzYXRpc2ZpZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkKSApOworICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gRmluZCBhIGRpZmZlcmVudCB0aHJlYWQgdG8gc3RlYWwgd29yayBmcm9tLiAgUGljayBhIHJhbmRvbSB0aHJlYWQuCisgICAgLy8gTXkgaW5pdGlhbCBwbGFuIHdhcyB0byBjeWNsZSB0aHJvdWdoIGFsbCB0aGUgdGhyZWFkcywgYW5kIG9ubHkgcmV0dXJuCisgICAgLy8gaWYgd2UgdHJpZWQgdG8gc3RlYWwgZnJvbSBldmVyeSB0aHJlYWQsIGFuZCBmYWlsZWQuICBBcmNoIHNheXMgdGhhdCdzCisgICAgLy8gbm90IHN1Y2ggYSBncmVhdCBpZGVhLgorICAgIC8vIEdFSCAtIG5lZWQgeWllbGQgY29kZSBpbiB0aGlzIGxvb3AgZm9yIHRocm91Z2hwdXQgbGlicmFyeSBtb2RlPworICAgIG5ld192aWN0aW06CisgICAgayA9IF9fa21wX2dldF9yYW5kb20oIHRocmVhZCApICUgKG50aHJlYWRzIC0gMSk7CisgICAgaWYgKCBrID49IHRocmVhZCAtPiB0aC50aF9pbmZvLmRzLmRzX3RpZCApIHsKKyAgICAgICAgKytrOyAgICAgICAgICAgICAgIC8vIEFkanVzdHMgcmFuZG9tIGRpc3RyaWJ1dGlvbiB0byBleGNsdWRlIHNlbGYKKyAgICB9CisgICAgeworICAgICAgICBrbXBfaW5mb190ICpvdGhlcl90aHJlYWQgPSB0aHJlYWRzX2RhdGFba10udGQudGRfdGhyOworICAgICAgICBpbnQgZmlyc3Q7CisKKyAgICAgICAgLy8gVGhlcmUgaXMgYSBzbGlnaHQgY2hhbmNlIHRoYXQgX19rbXBfZW5hYmxlX3Rhc2tpbmcoKSBkaWQgbm90IHdha2UgdXAKKyAgICAgICAgLy8gYWxsIHRocmVhZHMgd2FpdGluZyBhdCB0aGUgYmFycmllci4gIElmIHRoaXMgdGhyZWFkIGlzIHNsZWVwaW5nLCB0aGVuCisgICAgICAgIC8vIHRoZW4gd2FrZSBpdCB1cC4gIFNpbmNlIHdlIHdlcmVlIGdvaW5nIHRvIHBheSB0aGUgY2FjaGUgbWlzcyBwZW5hbHR5CisgICAgICAgIC8vIGZvciByZWZlcmVuY2VpbmcgYW5vdGhlciB0aHJlYWQncyBrbXBfaW5mb190IHN0cnVjdCBhbnl3YXksIHRoZSBjaGVjaworICAgICAgICAvLyBzaG91bGRuJ3QgY29zdCB0b28gbXVjaCBwZXJmb3JtYW5jZSBhdCB0aGlzIHBvaW50LgorICAgICAgICAvLyBJbiBleHRyYSBiYXJyaWVyIG1vZGUsIHRhc2tzIGRvIG5vdCBzbGVlcCBhdCB0aGUgc2VwYXJhdGUgdGFza2luZworICAgICAgICAvLyBiYXJyaWVyLCBzbyB0aGlzIGlzbid0IGEgcHJvYmxlbS4KKyAgICAgICAgaWYgKCAoIF9fa21wX3Rhc2tpbmdfbW9kZSA9PSB0c2ttX3Rhc2tfdGVhbXMgKSAmJgorICAgICAgICAgICAgIChfX2ttcF9kZmx0X2Jsb2NrdGltZSAhPSBLTVBfTUFYX0JMT0NLVElNRSkgJiYKKyAgICAgICAgICAgICAoVENSX1BUUihvdGhlcl90aHJlYWQtPnRoLnRoX3NsZWVwX2xvYykgIT0gTlVMTCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fa21wX3Jlc3VtZSggX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggb3RoZXJfdGhyZWFkICksIE5VTEwgKTsKKworICAgICAgICAgICAgLy8gQSBzbGVlcGluZyB0aHJlYWQgc2hvdWxkIG5vdCBoYXZlIGFueSB0YXNrcyBvbiBpdCdzIHF1ZXVlLgorICAgICAgICAgICAgLy8gVGhlcmUgaXMgYSBzbGlnaHQgcG9zc2liaWxpdHkgdGhhdCBpdCByZXN1bWVzLCBzdGVhbHMgYSB0YXNrIGZyb20KKyAgICAgICAgICAgIC8vIGFub3RoZXIgdGhyZWFkLCB3aGljaCBzcGF3bnMgbW9yZSB0YXNrcywgYWxsIGluIHRoZSB0aGF0IGl0IHRha2VzCisgICAgICAgICAgICAvLyB0aGlzIHRocmVhZCB0byBjaGVjayA9PiBkb24ndCB3cml0ZSBhbiBhc3NlcnRpb24gdGhhdCB0aGUgdmljdGltJ3MKKyAgICAgICAgICAgIC8vIHF1ZXVlIGlzIGVtcHR5LiAgVHJ5IHN0ZWFsaW5nIGZyb20gYSBkaWZmZXJlbnQgdGhyZWFkLgorICAgICAgICAgICAgZ290byBuZXdfdmljdGltOworICAgICAgICB9CisKKyAgICAgICAgLy8gTm93IHRyeSB0byBzdGVhbCB3b3JrIGZyb20gdGhlIHNlbGVjdGVkIHRocmVhZAorICAgICAgICBmaXJzdCA9IFRSVUU7CisgICAgICAgIHdoaWxlICgodGFzayA9IF9fa21wX3N0ZWFsX3Rhc2soIG90aGVyX3RocmVhZCwgZ3RpZCwgdGFza190ZWFtLCB1bmZpbmlzaGVkX3RocmVhZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZF9maW5pc2hlZCwgaXNfY29uc3RyYWluZWQgKSkgIT0gTlVMTCkKKyAgICAgICAgeworI2lmIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgICAgIGlmICggX19pdHRfc3luY19jcmVhdGVfcHRyIHx8IEtNUF9JVFRfREVCVUcgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBpdHRfc3luY19vYmogPT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gd2UgYXJlIGF0IGZvcmsgYmFycmllciB3aGVyZSB3ZSBjb3VsZCBub3QgZ2V0IHRoZSBvYmplY3QgcmVsaWFibHkKKyAgICAgICAgICAgICAgICAgICAgaXR0X3N5bmNfb2JqICA9IF9fa21wX2l0dF9iYXJyaWVyX29iamVjdCggZ3RpZCwgYnNfZm9ya2pvaW5fYmFycmllciApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfX2ttcF9pdHRfdGFza19zdGFydGluZyggaXR0X3N5bmNfb2JqICk7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWSAqLworICAgICAgICAgICAgX19rbXBfaW52b2tlX3Rhc2soIGd0aWQsIHRhc2ssIGN1cnJlbnRfdGFzayApOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgICAgIGlmICggaXR0X3N5bmNfb2JqICE9IE5VTEwgKQorICAgICAgICAgICAgICAgIF9fa21wX2l0dF90YXNrX2ZpbmlzaGVkKCBpdHRfc3luY19vYmogKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICAgICAgICAgIC8vIFRyeSBzdGVhbGluZyBmcm9tIHRoaXMgdmljdGltIGFnYWluLCBpbiB0aGUgZnV0dXJlLgorICAgICAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgICAgICAgdGhyZWFkc19kYXRhWyB0aWQgXS50ZC50ZF9kZXF1ZV9sYXN0X3N0b2xlbiA9IGs7CisgICAgICAgICAgICAgICAgZmlyc3QgPSBGQUxTRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoaXMgdGhyZWFkIGNhbiBwcm9jZWVkLgorICAgICAgICAgICAgaWYgKChzcGlubmVyID09IE5VTEwpIHx8ICgoIWZpbmFsX3NwaW4pICYmIChUQ1JfNCgqc3Bpbm5lcikgPT0gY2hlY2tlcikpKSB7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMTUsICgiX19rbXBfZXhlY3V0ZV90YXNrcyhleGl0ICM1KTogVCMlZCBzcGluIGNvbmRpdGlvbiBzYXRpc2ZpZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkKSApOworICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgS01QX1lJRUxEKCBfX2ttcF9saWJyYXJ5ID09IGxpYnJhcnlfdGhyb3VnaHB1dCApOyAgIC8vIFlpZWxkIGJlZm9yZSBleGVjdXRpbmcgbmV4dCB0YXNrCisKKyAgICAgICAgICAgIC8vIElmIHRoZSBleGVjdXRpb24gb2YgdGhlIHN0b2xlbiB0YXNrIHJlc3VsdGVkIGluIG1vcmUgdGFza3MgYmVpbmcKKyAgICAgICAgICAgIC8vIHBsYWNlZCBvbiBvdXIgcnVuIHF1ZXVlLCB0aGVuIHJlc3RhcnQgdGhlIHdob2xlIHByb2Nlc3MuCisgICAgICAgICAgICBpZiAoVENSXzQodGhyZWFkc19kYXRhWyB0aWQgXS50ZC50ZF9kZXF1ZV9udGFza3MpICE9IDApIHsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9leGVjdXRlX3Rhc2tzOiBUIyVkIHN0b2xlbiB0YXNrIHNwYXduZWQgb3RoZXIgdGFza3MsIHJlc3RhcnRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkKSApOworICAgICAgICAgICAgICAgIGdvdG8gc3RhcnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGUgdmljdGltcydzIHdvcmsgcXVldWUgaXMgZW1wdHkuICBJZiB3ZSBhcmUgaW4gdGhlIGZpbmFsIHNwaW4gbG9vcAorICAgICAgICAvLyBvZiB0aGUgYmFycmllciwgY2hlY2sgYW5kIHNlZSBpZiB0aGUgdGVybWluYXRpb24gY29uZGl0aW9uIGlzIHNhdGlzZmllZC4KKyAgICAgICAgLy8gR29pbmcgb24gYW5kIGZpbmRpbmcgYSBuZXcgdmljdGltIHRvIHN0ZWFsIGZyb20gaXMgZXhwZW5zaXZlLCBhcyBpdAorICAgICAgICAvLyBpbnZvbHZlcyBhIGxvdCBvZiBjYWNoZSBtaXNzZXMsIHNvIHdlIGRlZmluaXRlbHkgd2FudCB0byByZS1jaGVjayB0aGUKKyAgICAgICAgLy8gdGVybWluYXRpb24gY29uZGl0aW9uIGJlZm9yZSBkb2luZyB0aGF0LgorICAgICAgICBpZiAoZmluYWxfc3BpbikgeworICAgICAgICAgICAgLy8gRmlyc3QsIGRlY3JlbWVudCB0aGUgI3VuZmluaXNoZWQgdGhyZWFkcywgaWYgdGhhdCBoYXMgbm90IGFscmVhZHkKKyAgICAgICAgICAgIC8vIGJlZW4gZG9uZS4gIFRoaXMgZGVjcmVtZW50IG1pZ2h0IGJlIHRvIHRoZSBzcGluIGxvY2F0aW9uLCBhbmQKKyAgICAgICAgICAgIC8vIHJlc3VsdCBpbiB0aGUgdGVybWluYXRpb24gY29uZGl0aW9uIGJlaW5nIHNhdGlzZmllZC4KKyAgICAgICAgICAgIGlmICghICp0aHJlYWRfZmluaXNoZWQpIHsKKyAgICAgICAgICAgICAgICBrbXBfdWludDMyIGNvdW50ID0gS01QX1RFU1RfVEhFTl9ERUMzMiggKGttcF9pbnQzMiAqKXVuZmluaXNoZWRfdGhyZWFkcyApIC0gMTsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9leGVjdXRlX3Rhc2tzKGRlYyAjMyk6IFQjJWQgZGVjIHVuZmluaXNoZWRfdGhyZWFkcyB0byAlZDsgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhc2tfdGVhbT0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIGNvdW50LCB0YXNrX3RlYW0pICk7CisgICAgICAgICAgICAgICAgKnRocmVhZF9maW5pc2hlZCA9IFRSVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIElmIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjLAorICAgICAgICAgICAgLy8gdGhlbiBpdCBpcyBub3cgdW5zYWZlIHRvIHJlZmVyZW5jZSB0aHJlYWQtPnRoLnRoX3RlYW0gISEhCisgICAgICAgICAgICAvLyBEZWNyZW1lbnRpbmcgdGFza190ZWFtLT50dC50dF91bmZpbmlzaGVkX3RocmVhZHMgY2FuIGFsbG93IHRoZSBtYXN0ZXIKKyAgICAgICAgICAgIC8vIHRocmVhZCB0byBwYXNzIHRocm91Z2ggdGhlIGJhcnJpZXIsIHdoZXJlIGl0IG1pZ2h0IHJlc2V0IGVhY2ggdGhyZWFkJ3MKKyAgICAgICAgICAgIC8vIHRoLnRoX3RlYW0gZmllbGQgZm9yIHRoZSBuZXh0IHBhcmFsbGVsIHJlZ2lvbi4KKyAgICAgICAgICAgIC8vIElmIHdlIGNhbiBzdGVhbCBtb3JlIHdvcmssIHdlIGtub3cgdGhhdCB0aGlzIGhhcyBub3QgaGFwcGVuZWQgeWV0LgorICAgICAgICAgICAgaWYgKChzcGlubmVyICE9IE5VTEwpICYmIChUQ1JfNCgqc3Bpbm5lcikgPT0gY2hlY2tlcikpIHsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSgxNSwgKCJfX2ttcF9leGVjdXRlX3Rhc2tzKGV4aXQgIzYpOiBUIyVkIHNwaW4gY29uZGl0aW9uIHNhdGlzZmllZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQpICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBLQV9UUkFDRSgxNSwgKCJfX2ttcF9leGVjdXRlX3Rhc2tzKGV4aXQgIzcpOiBUIyVkIGNhbid0IGZpbmQgd29ya1xuIiwgZ3RpZCkgKTsKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfZW5hYmxlX3Rhc2tpbmc6IEFsbG9jYXRlIHRhc2sgdGVhbSBhbmQgcmVzdW1lIHRocmVhZHMgc2xlZXBpbmcgYXQgdGhlCisvLyBuZXh0IGJhcnJpZXIgc28gdGhleSBjYW4gYXNzaXN0IGluIGV4ZWN1dGluZyBlbnF1ZXVlZCB0YXNrcy4KKy8vIEZpcnN0IHRocmVhZCBpbiBhbGxvY2F0ZXMgdGhlIHRhc2sgdGVhbSBhdG9taWNhbGx5LgorCitzdGF0aWMgdm9pZAorX19rbXBfZW5hYmxlX3Rhc2tpbmcoIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtLCBrbXBfaW5mb190ICp0aGlzX3RociApCit7CisgICAga21wX3RlYW1fdCAqdGVhbSA9IHRoaXNfdGhyLT50aC50aF90ZWFtOworICAgIGttcF90aHJlYWRfZGF0YV90ICp0aHJlYWRzX2RhdGE7CisgICAgaW50IG50aHJlYWRzLCBpLCBpc19pbml0X3RocmVhZDsKKworICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBfZW5hYmxlX3Rhc2tpbmcoZW50ZXIpOiBUIyVkXG4iLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aGlzX3RociApICkgKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQodGFza190ZWFtICE9IE5VTEwpOworICAgIEtNUF9ERUJVR19BU1NFUlQodGVhbSAhPSBOVUxMKTsKKworICAgIG50aHJlYWRzID0gdGFza190ZWFtLT50dC50dF9ucHJvYzsKKyAgICBLTVBfREVCVUdfQVNTRVJUKG50aHJlYWRzID4gMCk7CisgICAgS01QX0RFQlVHX0FTU0VSVChudGhyZWFkcyA9PSB0ZWFtLT50LnRfbnByb2MpOworCisgICAgLy8gQWxsb2NhdGUgb3IgaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhyZWFkc19kYXRhIGlmIG5lY2Vzc2FyeQorICAgIGlzX2luaXRfdGhyZWFkID0gX19rbXBfcmVhbGxvY190YXNrX3RocmVhZHNfZGF0YSggdGhpc190aHIsIHRhc2tfdGVhbSApOworCisgICAgaWYgKCFpc19pbml0X3RocmVhZCkgeworICAgICAgICAvLyBTb21lIG90aGVyIHRocmVhZCBhbHJlYWR5IHNldCB1cCB0aGUgYXJyYXkuCisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfZW5hYmxlX3Rhc2tpbmcoZXhpdCk6IFQjJWQ6IHRocmVhZHMgYXJyYXkgYWxyZWFkeSBzZXQgdXAuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhpc190aHIgKSApICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgdGhyZWFkc19kYXRhID0gKGttcF90aHJlYWRfZGF0YV90ICopVENSX1BUUih0YXNrX3RlYW0gLT4gdHQudHRfdGhyZWFkc19kYXRhKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aHJlYWRzX2RhdGEgIT0gTlVMTCApOworCisgICAgaWYgKCAoIF9fa21wX3Rhc2tpbmdfbW9kZSA9PSB0c2ttX3Rhc2tfdGVhbXMgKSAmJgorICAgICAgICAgKCBfX2ttcF9kZmx0X2Jsb2NrdGltZSAhPSBLTVBfTUFYX0JMT0NLVElNRSApICkKKyAgICB7CisgICAgICAgIC8vIFJlbGVhc2UgYW55IHRocmVhZHMgc2xlZXBpbmcgYXQgdGhlIGJhcnJpZXIsIHNvIHRoYXQgdGhleSBjYW4gc3RlYWwKKyAgICAgICAgLy8gdGFza3MgYW5kIGV4ZWN1dGUgdGhlbS4gIEluIGV4dHJhIGJhcnJpZXIgbW9kZSwgdGFza3MgZG8gbm90IHNsZWVwCisgICAgICAgIC8vIGF0IHRoZSBzZXBhcmF0ZSB0YXNraW5nIGJhcnJpZXIsIHNvIHRoaXMgaXNuJ3QgYSBwcm9ibGVtLgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnRocmVhZHM7IGkrKykgeworICAgICAgICAgICAgdm9sYXRpbGUga21wX3VpbnQgKnNsZWVwX2xvYzsKKyAgICAgICAgICAgIGttcF9pbmZvX3QgKnRocmVhZCA9IHRocmVhZHNfZGF0YVtpXS50ZC50ZF90aHI7CisKKyAgICAgICAgICAgIGlmIChpID09IHRoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX3RpZCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gU2luY2Ugd2UgaGF2ZW4ndCBsb2NrZWQgdGhlIHRocmVhZCdzIHN1c3BlbmQgbXV0ZXggbG9jayBhdCB0aGlzCisgICAgICAgICAgICAvLyBwb2ludCwgdGhlcmUgaXMgYSBzbWFsbCB3aW5kb3cgd2hlcmUgYSB0aHJlYWQgbWlnaHQgYmUgcHV0dGluZworICAgICAgICAgICAgLy8gaXRzZWxmIHRvIHNsZWVwLCBidXQgaGFzbid0IHNldCB0aGUgdGhfc2xlZXBfbG9jIGZpZWxkIHlldC4KKyAgICAgICAgICAgIC8vIFRvIHdvcmsgYXJvdW5kIHRoaXMsIF9fa21wX2V4ZWN1dGVfdGFza3MoKSBwZXJpb2RpY2FsbHkgY2hlY2tzCisgICAgICAgICAgICAvLyBzZWUgaWYgb3RoZXIgdGhyZWFkcyBhcmUgc2xlZXBpbmcgKHVzaW5nIHRoZSBzYW1lIHJhbmRvbQorICAgICAgICAgICAgLy8gbWVjaGFuaXNtIHRoYXQgaXMgdXNlZCBmb3IgdGFzayBzdGVhbGluZykgYW5kIGF3YWtlbnMgdGhlbSBpZgorICAgICAgICAgICAgLy8gdGhleSBhcmUuCisgICAgICAgICAgICBpZiAoICggc2xlZXBfbG9jID0gICh2b2xhdGlsZSBrbXBfdWludCAqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ1JfUFRSKCB0aHJlYWQgLT4gdGgudGhfc2xlZXBfbG9jKSApICE9IE5VTEwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEtGX1RSQUNFKCA1MCwgKCAiX19rbXBfZW5hYmxlX3Rhc2tpbmc6IFQjJWQgd2FraW5nIHVwIHRocmVhZCBUIyVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhpc190aHIgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRocmVhZCApICkgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9yZXN1bWUoIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRocmVhZCApLCBzbGVlcF9sb2MgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEtGX1RSQUNFKCA1MCwgKCAiX19rbXBfZW5hYmxlX3Rhc2tpbmc6IFQjJWQgZG9uJ3Qgd2FrZSB1cCB0aHJlYWQgVCMlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRoaXNfdGhyICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aHJlYWQgKSApICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBLQV9UUkFDRSggMTAsICggIl9fa21wX2VuYWJsZV90YXNraW5nKGV4aXQpOiBUIyVkXG4iLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aGlzX3RociApICkgKTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzIGZvciAidGFzayB0ZWFtcyIuICBBIHRhc2sgdGVhbSAoa21wX3Rhc2tfdCkgaXMga2luZCBvZgorICogbGlrZSBhIHNoYWRvdyBvZiB0aGUga21wX3RlYW1fdCBkYXRhIHN0cnVjdCwgd2l0aCBhIGRpZmZlcmVudCBsaWZldGltZS4KKyAqIEFmdGVyIGEgY2hpbGQgKiB0aHJlYWQgY2hlY2tzIGludG8gYSBiYXJyaWVyIGFuZCBjYWxscyBfX2ttcF9yZWxlYXNlKCkgZnJvbQorICogdGhlIHBhcnRpY3VsYXIgdmFyaWFudCBvZiBfX2ttcF88YmFycmllcl9raW5kPl9iYXJyaWVyX2dhdGhlcigpLCBpdCBjYW4gbm8KKyAqIGxvbmdlciBhc3N1bWUgdGhhdCB0aGUga21wX3RlYW1fdCBzdHJ1Y3R1cmUgaXMgaW50YWN0IChhdCBhbnkgbW9tZW50LCB0aGUKKyAqIG1hc3RlciB0aHJlYWQgbWF5IGV4aXQgdGhlIGJhcnJpZXIgY29kZSBhbmQgZnJlZSB0aGUgdGVhbSBkYXRhIHN0cnVjdHVyZSwKKyAqIGFuZCByZXR1cm4gdGhlIHRocmVhZHMgdG8gdGhlIHRocmVhZCBwb29sKS4KKyAqCisgKiBUaGlzIGRvZXMgbm90IHdvcmsgd2l0aCB0aGUgdGhlIHRhc2tpbmcgY29kZSwgYXMgdGhlIHRocmVhZCBpcyBzdGlsbAorICogZXhwZWN0ZWQgdG8gcGFydGljaXBhdGUgaW4gdGhlIGV4ZWN1dGlvbiBvZiBhbnkgdGFza3MgdGhhdCBtYXkgaGF2ZSBiZWVuCisgKiBzcGF3bmVkIG15IGEgbWVtYmVyIG9mIHRoZSB0ZWFtLCBhbmQgdGhlIHRocmVhZCBzdGlsbCBuZWVkcyBhY2Nlc3MgdG8gYWxsCisgKiB0byBlYWNoIHRocmVhZCBpbiB0aGUgdGVhbSwgc28gdGhhdCBpdCBjYW4gc3RlYWwgd29yayBmcm9tIGl0LgorICoKKyAqIEVudGVyIHRoZSBleGlzdGVuY2Ugb2YgdGhlIGttcF90YXNrX3RlYW1fdCBzdHJ1Y3QuICBJdCBlbXBsb3lzIGEgcmVmZXJlbmNlCisgKiBjb3VudGluZyBtZWNoYW5pbXMsIGFuZCBpcyBhbGxvY2F0ZWQgYnkgdGhlIG1hc3RlciB0aHJlYWQgYmVmb3JlIGNhbGxpbmcKKyAqIF9fa21wXzxiYXJyaWVyX2tpbmQ+X3JlbGVhc2UsIGFuZCB0aGVuIGlzIHJlbGVhc2UgYnkgdGhlIGxhc3QgdGhyZWFkIHRvCisgKiBleGl0IF9fa21wXzxiYXJyaWVyX2tpbmQ+X3JlbGVhc2UgYXQgdGhlIG5leHQgYmFycmllci4gIEkuZS4gdGhlIGxpZmV0aW1lcworICogb2YgdGhlIGttcF90YXNrX3RlYW1fdCBzdHJ1Y3RzIGZvciBjb25zZWN1dGl2ZSBiYXJyaWVycyBjYW4gb3ZlcmxhcAorICogKGFuZCB3aWxsLCB1bmxlc3MgdGhlIG1hc3RlciB0aHJlYWQgaXMgdGhlIGxhc3QgdGhyZWFkIHRvIGV4aXQgdGhlIGJhcnJpZXIKKyAqIHJlbGVhc2UgcGhhc2UsIHdoaWNoIGlzIG5vdCB0eXBpY2FsKS4KKyAqCisgKiBUaGUgZXhpc3RlbmNlIG9mIHN1Y2ggYSBzdHJ1Y3QgaXMgdXNlZnVsIG91dHNpZGUgdGhlIGNvbnRleHQgb2YgdGFza2luZywKKyAqIGJ1dCBmb3Igbm93LCBJJ20gdHJ5aW5nIHRvIGtlZXAgaXQgc3BlY2lmaWMgdG8gdGhlIE9NUF8zMF9FTkFCTEVEIG1hY3JvLAorICogc28gdGhhdCBhbnkgcGVyZm9ybWFuY2UgZGlmZmVyZW5jZXMgc2hvdyB1cCB3aGVuIGNvbXBhcmluZyB0aGUgMi41IHZzLiAzLjAKKyAqIGxpYnJhcmllcy4KKyAqCisgKiBXZSBjdXJyZW50bHkgdXNlIHRoZSBleGlzdGVuY2Ugb2YgdGhlIHRocmVhZHMgYXJyYXkgYXMgYW4gaW5kaWNhdG9yIHRoYXQKKyAqIHRhc2tzIHdlcmUgc3Bhd25lZCBzaW5jZSB0aGUgbGFzdCBiYXJyaWVyLiAgSWYgdGhlIHN0cnVjdHVyZSBpcyB0byBiZQorICogdXNlZnVsIG91dHNpZGUgdGhlIGNvbnRleHQgb2YgdGFza2luZywgdGhlbiB0aGlzIHdpbGwgaGF2ZSB0byBjaGFuZ2UsIGJ1dAorICogbm90IHNldHR0aW5nIHRoZSBmaWVsZCBtaW5pbWl6ZXMgdGhlIHBlcmZvcm1hbmNlIGltcGFjdCBvZiB0YXNraW5nIG9uCisgKiBiYXJyaWVycywgd2hlbiBubyBleHBsaWNpdCB0YXNrcyB3ZXJlIHNwYXduZWQgKHB1c2hlZCwgYWN0dWFsbHkpLgorICovCisKK3N0YXRpYyBrbXBfdGFza190ZWFtX3QgKl9fa21wX2ZyZWVfdGFza190ZWFtcyA9IE5VTEw7ICAgICAgICAgICAvLyBGcmVlIGxpc3QgZm9yIHRhc2tfdGVhbSBkYXRhIHN0cnVjdHVyZXMKKy8vIExvY2sgZm9yIHRhc2sgdGVhbSBkYXRhIHN0cnVjdHVyZXMKK3N0YXRpYyBrbXBfYm9vdHN0cmFwX2xvY2tfdCBfX2ttcF90YXNrX3RlYW1fbG9jayA9IEtNUF9CT09UU1RSQVBfTE9DS19JTklUSUFMSVpFUiggX19rbXBfdGFza190ZWFtX2xvY2sgKTsKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfYWxsb2NfdGFza19kZXF1ZToKKy8vIEFsbG9jYXRlcyBhIHRhc2sgZGVxdWUgZm9yIGEgcGFydGljdWxhciB0aHJlYWQsIGFuZCBpbml0aWFsaXplIHRoZSBuZWNlc3NhcnkKKy8vIGRhdGEgc3RydWN0dXJlcyByZWxhdGluZyB0byB0aGUgZGVxdWUuICBUaGlzIG9ubHkgaGFwcGVucyBvbmNlIHBlciB0aHJlYWQKKy8vIHBlciB0YXNrIHRlYW0gc2luY2UgdGFzayB0ZWFtcyBhcmUgcmVjeWNsZWQuCisvLyBObyBsb2NrIGlzIG5lZWRlZCBkdXJpbmcgYWxsb2NhdGlvbiBzaW5jZSBlYWNoIHRocmVhZCBhbGxvY2F0ZXMgaXRzIG93bgorLy8gZGVxdWUuCisKK3N0YXRpYyB2b2lkCitfX2ttcF9hbGxvY190YXNrX2RlcXVlKCBrbXBfaW5mb190ICp0aHJlYWQsIGttcF90aHJlYWRfZGF0YV90ICp0aHJlYWRfZGF0YSApCit7CisgICAgX19rbXBfaW5pdF9ib290c3RyYXBfbG9jayggJiB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9sb2NrICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWUgPT0gTlVMTCApOworCisgICAgLy8gSW5pdGlhbGl6ZSBsYXN0IHN0b2xlbiB0YXNrIGZpZWxkIHRvICJub25lIgorICAgIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX2xhc3Rfc3RvbGVuID0gLTE7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBUQ1JfNCh0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9udGFza3MpID09IDAgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9oZWFkID09IDAgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV90YWlsID09IDAgKTsKKworICAgIEtFX1RSQUNFKCAxMCwgKCAiX19rbXBfYWxsb2NfdGFza19kZXF1ZTogVCMlZCBhbGxvY2F0aW5nIGRlcXVlWyVkXSBmb3IgdGhyZWFkX2RhdGEgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhyZWFkICksIFRBU0tfREVRVUVfU0laRSwgdGhyZWFkX2RhdGEgKSApOworICAgIC8vIEFsbG9jYXRlIHNwYWNlIGZvciB0YXNrIGRlcXVlLCBhbmQgemVybyB0aGUgZGVxdWUKKyAgICAvLyBDYW5ub3QgdXNlIF9fa21wX3RocmVhZF9jYWxsb2MoKSBiZWNhdXNlIHRocmVhZHMgbm90IGFyb3VuZCBmb3IKKyAgICAvLyBrbXBfcmVhcF90YXNrX3RlYW0oICkuCisgICAgdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWUgPSAoa21wX3Rhc2tkYXRhX3QgKiopCisgICAgICAgICAgICBfX2ttcF9hbGxvY2F0ZSggVEFTS19ERVFVRV9TSVpFICogc2l6ZW9mKGttcF90YXNrZGF0YV90ICopKTsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfZnJlZV90YXNrX2RlcXVlOgorLy8gRGVhbGxvY2F0ZXMgYSB0YXNrIGRlcXVlIGZvciBhIHBhcnRpY3VsYXIgdGhyZWFkLgorLy8gSGFwcGVucyBhdCBsaWJyYXJ5IGRlYWxsb2NhdGlvbiBzbyBkb24ndCBuZWVkIHRvIHJlc2V0IGFsbCB0aHJlYWQgZGF0YSBmaWVsZHMuCisKK3N0YXRpYyB2b2lkCitfX2ttcF9mcmVlX3Rhc2tfZGVxdWUoIGttcF90aHJlYWRfZGF0YV90ICp0aHJlYWRfZGF0YSApCit7CisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9sb2NrICk7CisKKyAgICBpZiAoIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlICE9IE5VTEwgKSB7CisgICAgICAgIFRDV180KHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX250YXNrcywgMCk7CisgICAgICAgICBfX2ttcF9mcmVlKCB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZSApOworICAgICAgICB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZSA9IE5VTEw7CisgICAgfQorICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbG9jayApOworCisjaWZkZWYgQlVJTERfVElFRF9UQVNLX1NUQUNLCisgICAgLy8gR0VIOiBGaWd1cmUgb3V0IHdoYXQgdG8gZG8gaGVyZSBmb3IgdGRfc3VzcF90aWVkX3Rhc2tzCisgICAgaWYgKCB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9zdXNwX3RpZWRfdGFza3MudHNfZW50cmllcyAhPSBUQVNLX1NUQUNLX0VNUFRZICkgeworICAgICAgICBfX2ttcF9mcmVlX3Rhc2tfc3RhY2soIF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGd0aWQgKSwgdGhyZWFkX2RhdGEgKTsKKyAgICB9CisjZW5kaWYgLy8gQlVJTERfVElFRF9UQVNLX1NUQUNLCit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX3JlYWxsb2NfdGFza190aHJlYWRzX2RhdGE6CisvLyBBbGxvY2F0ZXMgYSB0aHJlYWRzX2RhdGEgYXJyYXkgZm9yIGEgdGFzayB0ZWFtLCBlaXRoZXIgYnkgYWxsb2NhdGluZyBhbiBpbml0aWFsCisvLyBhcnJheSBvciBlbmxhcmdpbmcgYW4gZXhpc3RpbmcgYXJyYXkuICBPbmx5IHRoZSBmaXJzdCB0aHJlYWQgdG8gZ2V0IHRoZSBsb2NrCisvLyBhbGxvY3Mgb3IgZW5sYXJnZXMgdGhlIGFycmF5IGFuZCByZS1pbml0aWFsaXplcyB0aGUgYXJyYXkgZWxlZW1udHMuCisvLyBUaGF0IHRocmVhZCByZXR1cm5zICJUUlVFIiwgdGhlIHJlc3QgcmV0dXJuICJGQUxTRSIuCisvLyBBc3N1bWVzIHRoYXQgdGhlIG5ldyBhcnJheSBzaXplIGlzIGdpdmVuIGJ5IHRhc2tfdGVhbSAtPiB0dC50dF9ucHJvYy4KKy8vIFRoZSBjdXJyZW50IHNpemUgaXMgZ2l2ZW4gYnkgdGFza190ZWFtIC0+IHR0LnR0X21heF90aHJlYWRzLgorCitzdGF0aWMgaW50CitfX2ttcF9yZWFsbG9jX3Rhc2tfdGhyZWFkc19kYXRhKCBrbXBfaW5mb190ICp0aHJlYWQsIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtICkKK3sKKyAgICBrbXBfdGhyZWFkX2RhdGFfdCAqKiB0aHJlYWRzX2RhdGFfcDsKKyAgICBrbXBfaW50MzIgICAgICAgICAgICBudGhyZWFkcywgbWF4dGhyZWFkczsKKyAgICBpbnQgICAgICAgICAgICAgICAgICBpc19pbml0X3RocmVhZCA9IEZBTFNFOworCisgICAgaWYgKCBUQ1JfNCh0YXNrX3RlYW0gLT4gdHQudHRfZm91bmRfdGFza3MpICkgeworICAgICAgICAvLyBBbHJlYWR5IHJlYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZC4KKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHRocmVhZHNfZGF0YV9wID0gJiB0YXNrX3RlYW0gLT4gdHQudHRfdGhyZWFkc19kYXRhOworICAgIG50aHJlYWRzICAgPSB0YXNrX3RlYW0gLT4gdHQudHRfbnByb2M7CisgICAgbWF4dGhyZWFkcyA9IHRhc2tfdGVhbSAtPiB0dC50dF9tYXhfdGhyZWFkczsKKworICAgIC8vIEFsbCB0aHJlYWRzIG11c3QgbG9jayB3aGVuIHRoZXkgZW5jb3VudGVyIHRoZSBmaXJzdCB0YXNrIG9mIHRoZSBpbXBsaWNpdCB0YXNrCisgICAgLy8gcmVnaW9uIHRvIG1ha2Ugc3VyZSB0aHJlYWRzX2RhdGEgZmllbGRzIGFyZSAocmUpaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZWQuCisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiB0YXNrX3RlYW0gLT4gdHQudHRfdGhyZWFkc19sb2NrICk7CisKKyAgICBpZiAoICEgVENSXzQodGFza190ZWFtIC0+IHR0LnR0X2ZvdW5kX3Rhc2tzKSApIHsKKyAgICAgICAgLy8gZmlyc3QgdGhyZWFkIHRvIGVuYWJsZSB0YXNraW5nCisgICAgICAgIGttcF90ZWFtX3QgKnRlYW0gPSB0aHJlYWQgLT4gdGgudGhfdGVhbTsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgaXNfaW5pdF90aHJlYWQgPSBUUlVFOworICAgICAgICBpZiAoIG1heHRocmVhZHMgPCBudGhyZWFkcyApIHsKKworICAgICAgICAgICAgaWYgKCAqdGhyZWFkc19kYXRhX3AgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBrbXBfdGhyZWFkX2RhdGFfdCAqb2xkX2RhdGEgPSAqdGhyZWFkc19kYXRhX3A7CisgICAgICAgICAgICAgICAga21wX3RocmVhZF9kYXRhX3QgKm5ld19kYXRhID0gTlVMTDsKKworICAgICAgICAgICAgICAgIEtFX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVhbGxvY190YXNrX3RocmVhZHNfZGF0YTogVCMlZCByZWFsbG9jYXRpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRzIGRhdGEgZm9yIHRhc2tfdGVhbSAlcCwgbmV3X3NpemUgPSAlZCwgb2xkX3NpemUgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aHJlYWQgKSwgdGFza190ZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG50aHJlYWRzLCBtYXh0aHJlYWRzICkgKTsKKyAgICAgICAgICAgICAgICAvLyBSZWFsbG9jYXRlIHRocmVhZHNfZGF0YSB0byBoYXZlIG1vcmUgZWxlbWVudHMgdGhhbiBjdXJyZW50IGFycmF5CisgICAgICAgICAgICAgICAgLy8gQ2Fubm90IHVzZSBfX2ttcF90aHJlYWRfcmVhbGxvYygpIGJlY2F1c2UgdGhyZWFkcyBub3QgYXJvdW5kIGZvcgorICAgICAgICAgICAgICAgIC8vIGttcF9yZWFwX3Rhc2tfdGVhbSggKS4gIE5vdGUgYWxsIG5ldyBhcnJheSBlbnRyaWVzIGFyZSBpbml0aWFsaXplZAorICAgICAgICAgICAgICAgIC8vIHRvIHplcm8gYnkgX19rbXBfYWxsb2NhdGUoKS4KKyAgICAgICAgICAgICAgICBuZXdfZGF0YSA9IChrbXBfdGhyZWFkX2RhdGFfdCAqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FsbG9jYXRlKCBudGhyZWFkcyAqIHNpemVvZihrbXBfdGhyZWFkX2RhdGFfdCkgKTsKKyAgICAgICAgICAgICAgICAvLyBjb3B5IG9sZCBkYXRhIHRvIG5ldyBkYXRhCisgICAgICAgICAgICAgICAgbWVtY3B5KCAodm9pZCAqKSBuZXdfZGF0YSwgKHZvaWQgKikgb2xkX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBtYXh0aHJlYWRzICogc2l6ZW9mKGttcF90YXNrZGF0YV90ICopICk7CisKKyNpZmRlZiBCVUlMRF9USUVEX1RBU0tfU1RBQ0sKKyAgICAgICAgICAgICAgICAvLyBHRUg6IEZpZ3VyZSBvdXQgaWYgdGhpcyBpcyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8KKyAgICAgICAgICAgICAgICBmb3IgKGkgPSBtYXh0aHJlYWRzOyBpIDwgbnRocmVhZHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBrbXBfdGhyZWFkX2RhdGFfdCAqdGhyZWFkX2RhdGEgPSAmICgqdGhyZWFkc19kYXRhX3ApW2ldOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9pbml0X3Rhc2tfc3RhY2soIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRocmVhZCApLCB0aHJlYWRfZGF0YSApOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBCVUlMRF9USUVEX1RBU0tfU1RBQ0sKKyAgICAgICAgICAgICAgICAvLyBJbnN0YWxsIHRoZSBuZXcgZGF0YSBhbmQgZnJlZSB0aGUgb2xkIGRhdGEKKyAgICAgICAgICAgICAgICAoKnRocmVhZHNfZGF0YV9wKSA9IG5ld19kYXRhOworICAgICAgICAgICAgICAgIF9fa21wX2ZyZWUoIG9sZF9kYXRhICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBLRV9UUkFDRSggMTAsICggIl9fa21wX3JlYWxsb2NfdGFza190aHJlYWRzX2RhdGE6IFQjJWQgYWxsb2NhdGluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRocmVhZHMgZGF0YSBmb3IgdGFza190ZWFtICVwLCBzaXplID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhyZWFkICksIHRhc2tfdGVhbSwgbnRocmVhZHMgKSApOworICAgICAgICAgICAgICAgIC8vIE1ha2UgdGhlIGluaXRpYWwgYWxsb2NhdGUgZm9yIHRocmVhZHNfZGF0YSBhcnJheSwgYW5kIHplcm8gZW50cmllcworICAgICAgICAgICAgICAgIC8vIENhbm5vdCB1c2UgX19rbXBfdGhyZWFkX2NhbGxvYygpIGJlY2F1c2UgdGhyZWFkcyBub3QgYXJvdW5kIGZvcgorICAgICAgICAgICAgICAgIC8vIGttcF9yZWFwX3Rhc2tfdGVhbSggKS4KKyAgICAgICAgICAgICAgICAqdGhyZWFkc19kYXRhX3AgPSAoa21wX3RocmVhZF9kYXRhX3QgKikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hbGxvY2F0ZSggbnRocmVhZHMgKiBzaXplb2Yoa21wX3RocmVhZF9kYXRhX3QpICk7CisjaWZkZWYgQlVJTERfVElFRF9UQVNLX1NUQUNLCisgICAgICAgICAgICAgICAgLy8gR0VIOiBGaWd1cmUgb3V0IGlmIHRoaXMgaXMgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG50aHJlYWRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAga21wX3RocmVhZF9kYXRhX3QgKnRocmVhZF9kYXRhID0gJiAoKnRocmVhZHNfZGF0YV9wKVtpXTsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfaW5pdF90YXNrX3N0YWNrKCBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aHJlYWQgKSwgdGhyZWFkX2RhdGEgKTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYgLy8gQlVJTERfVElFRF9UQVNLX1NUQUNLCisgICAgICAgICAgICB9CisgICAgICAgICAgICB0YXNrX3RlYW0gLT4gdHQudHRfbWF4X3RocmVhZHMgPSBudGhyZWFkczsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIElmIGFycmF5IGhhcyAobW9yZSB0aGFuKSBlbm91Z2ggZWxlbWVudHMsIGdvIGFoZWFkIGFuZCB1c2UgaXQKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoICp0aHJlYWRzX2RhdGFfcCAhPSBOVUxMICk7CisgICAgICAgIH0KKworICAgICAgICAvLyBpbml0aWFsaXplIHRocmVhZHNfZGF0YSBwb2ludGVycyBiYWNrIHRvIHRocmVhZF9pbmZvIHN0cnVjdHVyZXMKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG50aHJlYWRzOyBpKyspIHsKKyAgICAgICAgICAgIGttcF90aHJlYWRfZGF0YV90ICp0aHJlYWRfZGF0YSA9ICYgKCp0aHJlYWRzX2RhdGFfcClbaV07CisgICAgICAgICAgICB0aHJlYWRfZGF0YSAtPiB0ZC50ZF90aHIgPSB0ZWFtIC0+IHQudF90aHJlYWRzW2ldOworCisgICAgICAgICAgICBpZiAoIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX2xhc3Rfc3RvbGVuID49IG50aHJlYWRzKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIGxhc3Qgc3RvbGVuIGZpZWxkIHN1cnZpdmVzIGFjcm9zcyB0ZWFtcyAvIGJhcnJpZXIsIGFuZCB0aGUgbnVtYmVyCisgICAgICAgICAgICAgICAgLy8gb2YgdGhyZWFkcyBtYXkgaGF2ZSBjaGFuZ2VkLiAgSXQncyBwb3NzaWJsZSAobGlrZWx5PykgdGhhdCBhIG5ldworICAgICAgICAgICAgICAgIC8vIHBhcmFsbGVsIHJlZ2lvbiB3aWxsIGV4aGliaXQgdGhlIHNhbWUgYmVoYXZpb3IgYXMgdGhlIHByZXZpb3VzIHJlZ2lvbi4KKyAgICAgICAgICAgICAgICB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9sYXN0X3N0b2xlbiA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIFRDV19TWU5DXzQodGFza190ZWFtIC0+IHR0LnR0X2ZvdW5kX3Rhc2tzLCBUUlVFKTsKKyAgICB9CisKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2xvY2sgKTsKKyAgICByZXR1cm4gaXNfaW5pdF90aHJlYWQ7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX2ZyZWVfdGFza190aHJlYWRzX2RhdGE6CisvLyBEZWFsbG9jYXRlcyBhIHRocmVhZHNfZGF0YSBhcnJheSBmb3IgYSB0YXNrIHRlYW0sIGluY2x1ZGluZyBhbnkgYXR0YWNoZWQKKy8vIHRhc2tpbmcgZGVxdWVzLiAgT25seSBvY2N1cnMgYXQgbGlicmFyeSBzaHV0ZG93bi4KKworc3RhdGljIHZvaWQKK19fa21wX2ZyZWVfdGFza190aHJlYWRzX2RhdGEoIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtICkKK3sKKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2xvY2sgKTsKKyAgICBpZiAoIHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2RhdGEgIT0gTlVMTCApIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0YXNrX3RlYW0tPnR0LnR0X21heF90aHJlYWRzOyBpKysgKSB7CisgICAgICAgICAgICBfX2ttcF9mcmVlX3Rhc2tfZGVxdWUoICYgdGFza190ZWFtIC0+IHR0LnR0X3RocmVhZHNfZGF0YVtpXSApOworICAgICAgICB9CisgICAgICAgIF9fa21wX2ZyZWUoIHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2RhdGEgKTsKKyAgICAgICAgdGFza190ZWFtIC0+IHR0LnR0X3RocmVhZHNfZGF0YSA9IE5VTEw7CisgICAgfQorICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgdGFza190ZWFtIC0+IHR0LnR0X3RocmVhZHNfbG9jayApOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF9hbGxvY2F0ZV90YXNrX3RlYW06CisvLyBBbGxvY2F0ZXMgYSB0YXNrIHRlYW0gYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWMgdGVhbSwgdGFraW5nIGl0IGZyb20KKy8vIHRoZSBnbG9iYWwgdGFzayB0ZWFtIGZyZWUgbGlzdCBpZiBwb3NzaWJsZS4gIEFsc28gaW5pdGlhbGl6ZXMgZGF0YSBzdHJ1Y3R1cmVzLgorCitzdGF0aWMga21wX3Rhc2tfdGVhbV90ICoKK19fa21wX2FsbG9jYXRlX3Rhc2tfdGVhbSgga21wX2luZm9fdCAqdGhyZWFkLCBrbXBfdGVhbV90ICp0ZWFtICkKK3sKKyAgICBrbXBfdGFza190ZWFtX3QgKnRhc2tfdGVhbSA9IE5VTEw7CisgICAgaW50IG50aHJlYWRzOworCisgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF9hbGxvY2F0ZV90YXNrX3RlYW06IFQjJWQgZW50ZXJpbmc7IHRlYW0gPSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgKHRocmVhZCA/IF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRocmVhZCApIDogLTEpLCB0ZWFtICkgKTsKKworICAgIGlmIChUQ1JfUFRSKF9fa21wX2ZyZWVfdGFza190ZWFtcykgIT0gTlVMTCkgeworICAgICAgICAvLyBUYWtlIGEgdGFzayB0ZWFtIGZyb20gdGhlIHRhc2sgdGVhbSBwb29sCisgICAgICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF90YXNrX3RlYW1fbG9jayApOworICAgICAgICBpZiAoX19rbXBfZnJlZV90YXNrX3RlYW1zICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHRhc2tfdGVhbSA9IF9fa21wX2ZyZWVfdGFza190ZWFtczsKKyAgICAgICAgICAgIFRDV19QVFIoX19rbXBfZnJlZV90YXNrX3RlYW1zLCB0YXNrX3RlYW0gLT4gdHQudHRfbmV4dCk7CisgICAgICAgICAgICB0YXNrX3RlYW0gLT4gdHQudHRfbmV4dCA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX3Rhc2tfdGVhbV9sb2NrICk7CisgICAgfQorCisgICAgaWYgKHRhc2tfdGVhbSA9PSBOVUxMKSB7CisgICAgICAgIEtFX1RSQUNFKCAxMCwgKCAiX19rbXBfYWxsb2NhdGVfdGFza190ZWFtOiBUIyVkIGFsbG9jYXRpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAidGFzayB0ZWFtIGZvciB0ZWFtICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aHJlYWQgKSwgdGVhbSApICk7CisgICAgICAgIC8vIEFsbG9jYXRlIGEgbmV3IHRhc2sgdGVhbSBpZiBvbmUgaXMgbm90IGF2YWlsYWJsZS4KKyAgICAgICAgLy8gQ2Fubm90IHVzZSBfX2ttcF90aHJlYWRfbWFsbG9jKCkgYmVjYXVzZSB0aHJlYWRzIG5vdCBhcm91bmQgZm9yCisgICAgICAgIC8vIGttcF9yZWFwX3Rhc2tfdGVhbSggKS4KKyAgICAgICAgdGFza190ZWFtID0gKGttcF90YXNrX3RlYW1fdCAqKSBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKGttcF90YXNrX3RlYW1fdCkgKTsKKyAgICAgICAgX19rbXBfaW5pdF9ib290c3RyYXBfbG9jayggJiB0YXNrX3RlYW0gLT4gdHQudHRfdGhyZWFkc19sb2NrICk7CisgICAgICAgIC8vdGFza190ZWFtIC0+IHR0LnR0X3RocmVhZHNfZGF0YSA9IE5VTEw7ICAgLy8gQUM6IF9fa21wX2FsbG9jYXRlIHplcm9lcyByZXR1cm5lZCBtZW1vcnkKKyAgICAgICAgLy90YXNrX3RlYW0gLT4gdHQudHRfbWF4X3RocmVhZHMgPSAwOworICAgICAgICAvL3Rhc2tfdGVhbSAtPiB0dC50dF9uZXh0ID0gTlVMTDsKKyAgICB9CisKKyAgICBUQ1dfNCh0YXNrX3RlYW0gLT4gdHQudHRfZm91bmRfdGFza3MsIEZBTFNFKTsKKyAgICB0YXNrX3RlYW0gLT4gdHQudHRfbnByb2MgPSBudGhyZWFkcyA9IHRlYW0tPnQudF9ucHJvYzsKKworICAgIHRhc2tfdGVhbSAtPiB0dC50dF9zdGF0ZSA9IDA7CisgICAgVENXXzQoIHRhc2tfdGVhbSAtPiB0dC50dF91bmZpbmlzaGVkX3RocmVhZHMsIG50aHJlYWRzICk7CisgICAgVENXXzQoIHRhc2tfdGVhbSAtPiB0dC50dF9hY3RpdmUsIFRSVUUgKTsKKyAgICBUQ1dfNCggdGFza190ZWFtIC0+IHR0LnR0X3JlZl9jdCwgbnRocmVhZHMgLSAxKTsKKworICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfYWxsb2NhdGVfdGFza190ZWFtOiBUIyVkIGV4aXRpbmc7IHRhc2tfdGVhbSA9ICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAodGhyZWFkID8gX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhyZWFkICkgOiAtMSksIHRhc2tfdGVhbSApICk7CisgICAgcmV0dXJuIHRhc2tfdGVhbTsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfZnJlZV90YXNrX3RlYW06CisvLyBGcmVlcyB0aGUgdGFzayB0ZWFtIGFzc29jaWF0ZWQgd2l0aCBhIHNwZWNpZmljIHRocmVhZCwgYW5kIGFkZHMgaXQKKy8vIHRvIHRoZSBnbG9iYWwgdGFzayB0ZWFtIGZyZWUgbGlzdC4KKy8vCisKK3N0YXRpYyB2b2lkCitfX2ttcF9mcmVlX3Rhc2tfdGVhbSgga21wX2luZm9fdCAqdGhyZWFkLCBrbXBfdGFza190ZWFtX3QgKnRhc2tfdGVhbSApCit7CisgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF9mcmVlX3Rhc2tfdGVhbTogVCMlZCB0YXNrX3RlYW0gPSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkID8gX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhyZWFkICkgOiAtMSwgdGFza190ZWFtICkgKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIFRDUl80KHRhc2tfdGVhbSAtPiB0dC50dF9yZWZfY3QpID09IDAgKTsKKworICAgIC8vIFB1dCB0YXNrIHRlYW0gYmFjayBvbiBmcmVlIGxpc3QKKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX3Rhc2tfdGVhbV9sb2NrICk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrX3RlYW0gLT4gdHQudHRfbmV4dCA9PSBOVUxMICk7CisgICAgdGFza190ZWFtIC0+IHR0LnR0X25leHQgPSBfX2ttcF9mcmVlX3Rhc2tfdGVhbXM7CisgICAgVENXXzQodGFza190ZWFtIC0+IHR0LnR0X2ZvdW5kX3Rhc2tzLCBGQUxTRSk7CisgICAgVENXX1BUUihfX2ttcF9mcmVlX3Rhc2tfdGVhbXMsIHRhc2tfdGVhbSk7CisKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX3Rhc2tfdGVhbV9sb2NrICk7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX3JlYXBfdGFza190ZWFtczoKKy8vIEZyZWUgYWxsIHRoZSB0YXNrIHRlYW1zIG9uIHRoZSB0YXNrIHRlYW0gZnJlZSBsaXN0LgorLy8gU2hvdWxkIG9ubHkgYmUgZG9uZSBkdXJpbmcgbGlicmFyeSBzaHV0ZG93bi4KKy8vIENhbm5vdCBkbyBhbnl0aGluZyB0aGF0IG5lZWRzIGEgdGhyZWFkIHN0cnVjdHVyZSBvciBndGlkIHNpbmNlIHRoZXkgYXJlIGFscmVhZHkgZ29uZS4KKwordm9pZAorX19rbXBfcmVhcF90YXNrX3RlYW1zKCB2b2lkICkKK3sKKyAgICBrbXBfdGFza190ZWFtX3QgICAqdGFza190ZWFtOworCisgICAgaWYgKCBUQ1JfUFRSKF9fa21wX2ZyZWVfdGFza190ZWFtcykgIT0gTlVMTCApIHsKKyAgICAgICAgLy8gRnJlZSBhbGwgdGFza190ZWFtcyBvbiB0aGUgZnJlZSBsaXN0CisgICAgICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF90YXNrX3RlYW1fbG9jayApOworICAgICAgICB3aGlsZSAoICggdGFza190ZWFtID0gX19rbXBfZnJlZV90YXNrX3RlYW1zICkgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIF9fa21wX2ZyZWVfdGFza190ZWFtcyA9IHRhc2tfdGVhbSAtPiB0dC50dF9uZXh0OworICAgICAgICAgICAgdGFza190ZWFtIC0+IHR0LnR0X25leHQgPSBOVUxMOworCisgICAgICAgICAgICAvLyBGcmVlIHRocmVhZHNfZGF0YSBpZiBuZWNlc3NhcnkKKyAgICAgICAgICAgIGlmICggdGFza190ZWFtIC0+IHR0LnR0X3RocmVhZHNfZGF0YSAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIF9fa21wX2ZyZWVfdGFza190aHJlYWRzX2RhdGEoIHRhc2tfdGVhbSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX19rbXBfZnJlZSggdGFza190ZWFtICk7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX3Rhc2tfdGVhbV9sb2NrICk7CisgICAgfQorfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF91bnJlZl90YXNrX3RlYW1zOgorLy8gUmVtb3ZlIG9uZSB0aHJlYWQgZnJvbSByZWZlcmVuY2luZyB0aGUgdGFzayB0ZWFtIHN0cnVjdHVyZSBieQorLy8gZGVjcmVhc2luZyB0aGUgcmVmZXJlbmNlIGNvdW50IGFuZCBkZWFsbG9jYXRlIHRhc2sgdGVhbSBpZiBubyBtb3JlCisvLyByZWZlcmVuY2VzIHRvIGl0LgorLy8KK3ZvaWQKK19fa21wX3VucmVmX3Rhc2tfdGVhbSgga21wX3Rhc2tfdGVhbV90ICp0YXNrX3RlYW0sIGttcF9pbmZvX3QgKnRocmVhZCApCit7CisgICAga21wX3VpbnQgcmVmX2N0OworCisgICAgcmVmX2N0ID0gS01QX1RFU1RfVEhFTl9ERUMzMiggKGttcF9pbnQzMiAqKSgmIHRhc2tfdGVhbS0+dHQudHRfcmVmX2N0KSApIC0gMTsKKworICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfdW5yZWZfdGFza190ZWFtOiBUIyVkIHRhc2tfdGVhbSA9ICVwIHJlZl9jdCA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aHJlYWQgKSwgdGFza190ZWFtLCByZWZfY3QgKSApOworCisKKyAgICBpZiAoIHJlZl9jdCA9PSAwICkgeworICAgICAgICBfX2ttcF9mcmVlX3Rhc2tfdGVhbSggdGhyZWFkLCB0YXNrX3RlYW0gKTsKKyAgICB9CisKKyAgICBUQ1dfUFRSKCAqKCh2b2xhdGlsZSBrbXBfdGFza190ZWFtX3QgKiopKCZ0aHJlYWQtPnRoLnRoX3Rhc2tfdGVhbSkpLCBOVUxMICk7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX3dhaXRfdG9fdW5yZWZfdGFza190ZWFtczoKKy8vIFNvbWUgdGhyZWFkcyBjb3VsZCBzdGlsbCBiZSBpbiB0aGUgZm9yayBiYXJyaWVyIHJlbGVhc2UgY29kZSwgcG9zc2libHkKKy8vIHRyeWluZyB0byBzdGVhbCB0YXNrcy4gIFdhaXQgZm9yIGVhY2ggdGhyZWFkIHRvIHVucmVmZXJlbmNlIGl0cyB0YXNrIHRlYW0uCisvLwordm9pZAorX19rbXBfd2FpdF90b191bnJlZl90YXNrX3RlYW1zKHZvaWQpCit7CisgICAga21wX2luZm9fdCAqdGhyZWFkOworICAgIGttcF91aW50MzIgc3BpbnM7CisgICAgaW50IGRvbmU7CisKKyAgICBLTVBfSU5JVF9ZSUVMRCggc3BpbnMgKTsKKworCisgICAgZm9yICg7OykgeworICAgICAgICBkb25lID0gVFJVRTsKKworICAgICAgICAvLyBUT0RPOiBHRUggLSB0aGlzIG1heSBiZSBpcyB3cm9uZyBiZWNhdXNlIHNvbWUgc3luYyB3b3VsZCBiZSBuZWNlc3NhcnkKKyAgICAgICAgLy8gICAgICAgICAgICAgaW4gY2FzZSB0aHJlYWRzIGFyZSBhZGRlZCB0byB0aGUgcG9vbCBkdXJpbmcgdGhlIHRyYXZlcnNhbC4KKyAgICAgICAgLy8gICAgICAgICAgICAgTmVlZCB0byB2ZXJpZnkgdGhhdCBsb2NrIGZvciB0aHJlYWQgcG9vbCBpcyBoZWxkIHdoZW4gY2FsbGluZworICAgICAgICAvLyAgICAgICAgICAgICB0aGlzIHJvdXRpbmUuCisgICAgICAgIGZvciAodGhyZWFkID0gKGttcF9pbmZvX3QgKilfX2ttcF90aHJlYWRfcG9vbDsKKyAgICAgICAgICAgICB0aHJlYWQgIT0gTlVMTDsKKyAgICAgICAgICAgICB0aHJlYWQgPSB0aHJlYWQtPnRoLnRoX25leHRfcG9vbCkKKyAgICAgICAgeworICAgICAgICAgICAgdm9sYXRpbGUga21wX3VpbnQgKnNsZWVwX2xvYzsKKyNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICAgICAgRFdPUkQgZXhpdF92YWw7CisjZW5kaWYKKyAgICAgICAgICAgIGlmICggVENSX1BUUih0aHJlYWQtPnRoLnRoX3Rhc2tfdGVhbSkgPT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfd2FpdF90b191bnJlZl90YXNrX3RlYW06IFQjJWQgdGFza190ZWFtID09IE5VTExcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhyZWFkICkgKSApOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgICAgICAvLyBUT0RPOiBHRUggLSBhZGQgdGhpcyBjaGVjayBmb3IgTGludXgqIE9TIC8gT1MgWCogYXMgd2VsbD8KKyAgICAgICAgICAgIGlmICghX19rbXBfaXNfdGhyZWFkX2FsaXZlKHRocmVhZCwgJmV4aXRfdmFsKSkgeworICAgICAgICAgICAgICAgIGlmIChUQ1JfUFRSKHRocmVhZC0+dGgudGhfdGFza190ZWFtKSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX3VucmVmX3Rhc2tfdGVhbSggdGhyZWFkLT50aC50aF90YXNrX3RlYW0sIHRocmVhZCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgICBkb25lID0gRkFMU0U7ICAvLyBCZWNhdXNlIHRoX3Rhc2tfdGVhbSBwb2ludGVyIGlzIG5vdCBOVUxMIGZvciB0aGlzIHRocmVhZAorCisgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfd2FpdF90b191bnJlZl90YXNrX3RlYW06IFdhaXRpbmcgZm9yIFQjJWQgdG8gdW5yZWZlcmVuY2UgdGFza190ZWFtXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhyZWFkICkgKSApOworCisgICAgICAgICAgICBpZiAoIF9fa21wX2RmbHRfYmxvY2t0aW1lICE9IEtNUF9NQVhfQkxPQ0tUSU1FICkgeworICAgICAgICAgICAgICAgIC8vIElmIHRoZSB0aHJlYWQgaXMgc2xlZXBpbmcsIGF3YWtlbiBpdC4KKyAgICAgICAgICAgICAgICBpZiAoICggc2xlZXBfbG9jID0gKHZvbGF0aWxlIGttcF91aW50ICopIFRDUl9QVFIoIHRocmVhZC0+dGgudGhfc2xlZXBfbG9jKSApICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBfd2FpdF90b191bnJlZl90YXNrX3RlYW06IFQjJWQgd2FraW5nIHVwIHRocmVhZCBUIyVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhyZWFkICksIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRocmVhZCApICkgKTsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfcmVzdW1lKCBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aHJlYWQgKSwgc2xlZXBfbG9jICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChkb25lKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHdlIGFyZSBvdmVyc3Vic2NyaWJlZCwKKyAgICAgICAgLy8gb3IgaGF2ZSB3YWl0ZWQgYSBiaXQgKGFuZCBsaWJyYXJ5IG1vZGUgaXMgdGhyb3VnaHB1dCksIHlpZWxkLgorICAgICAgICAvLyBQYXVzZSBpcyBpbiB0aGUgZm9sbG93aW5nIGNvZGUuCisgICAgICAgIEtNUF9ZSUVMRCggVENSXzQoX19rbXBfbnRoKSA+IF9fa21wX2F2YWlsX3Byb2MgKTsKKyAgICAgICAgS01QX1lJRUxEX1NQSU4oIHNwaW5zICk7ICAgICAgICAvLyBZaWVsZHMgb25seSBpZiBLTVBfTElCUkFSWT10aHJvdWdocHV0CisgICAgfQorCisKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfdGFza190ZWFtX3NldHVwOiAgQ3JlYXRlIGEgdGFza190ZWFtIGZvciB0aGUgY3VycmVudCB0ZWFtLCBidXQgdXNlCisvLyBhbiBhbHJlYWR5IGNyZWF0ZWQsIHVudXNlZCBvbmUgaWYgaXQgYWxyZWFkeSBleGlzdHMuCisvLyBUaGlzIG1heSBiZSBjYWxsZWQgYnkgYW55IHRocmVhZCwgYnV0IG9ubHkgZm9yIHRlYW1zIHdpdGggIyB0aHJlYWRzID4xLgorCit2b2lkCitfX2ttcF90YXNrX3RlYW1fc2V0dXAoIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBrbXBfdGVhbV90ICp0ZWFtICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApOworCisgICAgaWYgKCAoIHRlYW0tPnQudF90YXNrX3RlYW0gPT0gTlVMTCApICYmICggdGVhbS0+dC50X25wcm9jID4gMSApICkgeworICAgICAgICAvLyBBbGxvY2F0ZSBhIG5ldyB0YXNrIHRlYW0sIHdoaWNoIHdpbGwgYmUgcHJvcGFnYXRlZCB0bworICAgICAgICAvLyBhbGwgb2YgdGhlIHdvcmtlciB0aHJlYWRzIGFmdGVyIHRoZSBiYXJyaWVyLiAgQXMgdGhleQorICAgICAgICAvLyBzcGluIGluIHRoZSBiYXJyaWVyIHJlbGVhc2UgcGhhc2UsIHRoZW4gd2lsbCBjb250aW51ZQorICAgICAgICAvLyB0byB1c2UgdGhlIHByZXZpb3VzIHRhc2sgdGVhbSBzdHJ1Y3QsIHVudGlsIHRoZXkgcmVjZWl2ZQorICAgICAgICAvLyB0aGUgc2lnbmFsIHRvIHN0b3AgY2hlY2tpbmcgZm9yIHRhc2tzICh0aGV5IGNhbid0IHNhZmVseQorICAgICAgICAvLyByZWZlcmVuY2UgdGhlIGttcF90ZWFtX3Qgc3RydWN0LCB3aGljaCBjb3VsZCBiZSByZWFsbG9jYXRlZAorICAgICAgICAvLyBieSB0aGUgbWFzdGVyIHRocmVhZCkuCisgICAgICAgIHRlYW0tPnQudF90YXNrX3RlYW0gPSBfX2ttcF9hbGxvY2F0ZV90YXNrX3RlYW0oIHRoaXNfdGhyLCB0ZWFtICk7CisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfdGFza190ZWFtX3NldHVwOiBNYXN0ZXIgVCMlZCBjcmVhdGVkIG5ldyAiCisgICAgICAgICAgICAgICAgICAgICAgICAidGFza190ZWFtICVwIGZvciB0ZWFtICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhpc190aHIgKSwgdGVhbS0+dC50X3Rhc2tfdGVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgodGVhbSAhPSBOVUxMKSA/IHRlYW0tPnQudF9pZCA6IC0xKSkgKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8vIEFsbCB0aHJlYWRzIGhhdmUgcmVwb3J0ZWQgaW4sIGFuZCBubyB0YXNrcyB3ZXJlIHNwYXduZWQKKyAgICAgICAgLy8gZm9yIHRoaXMgcmVsZWFzZS0+Z2F0aGVyIHJlZ2lvbi4gIExlYXZlIHRoZSBvbGQgdGFzaworICAgICAgICAvLyB0ZWFtIHN0cnVjdCBpbiBwbGFjZSBmb3IgdGhlIHVwY29taW5nIHJlZ2lvbi4gIE5vIHRhc2sKKyAgICAgICAgLy8gdGVhbXMgYXJlIGZvcm1lZCBmb3Igc2VyaWFsaXplZCB0ZWFtcy4KKyAgICB9CisgICAgaWYgKCB0ZWFtLT50LnRfdGFza190ZWFtICE9IE5VTEwgKSB7CisgICAgICAgIC8vIFRvZ2dsZSB0aGUgc3RhdGUgZmxhZyBzbyB0aGF0IHdlIGNhbiB0ZWxsIHdoaWNoIHNpZGUgb2YKKyAgICAgICAgLy8gdGhlIGJhcnJpZXIgd2UgYXJlIG9uLgorICAgICAgICB0ZWFtLT50LnRfdGFza190ZWFtLT50dC50dF9zdGF0ZSA9IDEgLSB0aGlzX3Roci0+dGgudGhfdGFza19zdGF0ZTsKKyAgICB9Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX3Rhc2tfdGVhbV9zeW5jOiBQcm9wYWdhdGlvbiBvZiB0YXNrIHRlYW0gZGF0YSBmcm9tIHRlYW0gdG8gdGhyZWFkcworLy8gd2hpY2ggaGFwcGVucyBqdXN0IGFmdGVyIHRoZSByZWxlYXNlIHBoYXNlIG9mIGEgdGVhbSBiYXJyaWVyLiAgVGhpcyBtYXkgYmUKKy8vIGNhbGxlZCBieSBhbnkgdGhyZWFkLCBidXQgb25seSBmb3IgdGVhbXMgd2l0aCAjIHRocmVhZHMgPiAxLgorCit2b2lkCitfX2ttcF90YXNrX3RlYW1fc3luYygga21wX2luZm9fdCAqdGhpc190aHIsIGttcF90ZWFtX3QgKnRlYW0gKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICk7CisKKyAgICAvLyBPbiB0aGUgcmFyZSBjaGFuY2UgdGhhdCB0aGlzIHRocmVhZCBuZXZlciBzYXcgdGhhdCB0aGUgdGFzaworICAgIC8vIHRlYW0gd2FzIG5vIGxvbmdlciBhY3RpdmUsIHRoZW4gdW5yZWYvZGVhbGxvY2F0ZSBpdCBub3cuCisgICAgaWYgKCB0aGlzX3Roci0+dGgudGhfdGFza190ZWFtICE9IE5VTEwgKSB7CisgICAgICAgIGlmICggISBUQ1JfU1lOQ180KCB0aGlzX3Roci0+dGgudGhfdGFza190ZWFtLT50dC50dF9hY3RpdmUgKSApIHsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoICEgS01QX01BU1RFUl9USUQoIF9fa21wX3RpZF9mcm9tX2d0aWQoIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRoaXNfdGhyICkgKSApICk7CisgICAgICAgICAgICBfX2ttcF91bnJlZl90YXNrX3RlYW0oIHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW0sIHRoaXNfdGhyICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gV2UgYXJlIHJlLXVzaW5nIGEgdGFzayB0ZWFtIHRoYXQgd2FzIG5ldmVyIGVuYWJsZWQuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSA9PSB0ZWFtLT50LnRfdGFza190ZWFtICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLworICAgIC8vIEl0IGlzIG5vdyBzYWZlIHRvIHByb3BhZ2F0ZSB0aGUgdGFzayB0ZWFtIHBvaW50ZXIgZnJvbSB0aGUKKyAgICAvLyB0ZWFtIHN0cnVjdCB0byB0aGUgY3VycmVudCB0aHJlYWQuCisgICAgLy8KKyAgICBUQ1dfUFRSKHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW0sIHRlYW0tPnQudF90YXNrX3RlYW0pOworICAgIGlmICggdGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSAhPSBOVUxMICkgeworICAgICAgICAvLworICAgICAgICAvLyBUb2dnbGUgdGhlIHRoX3Rhc2tfc3RhdGUgZmllbGQsIGluc3RlYWQgb2YgcmVhZGluZyBpdCBmcm9tCisgICAgICAgIC8vIHRoZSB0YXNrIHRlYW0uICBSZWFkaW5nIHRoZSB0dF9zdGF0ZSBmaWVsZCBhdCB0aGlzIHBvaW50CisgICAgICAgIC8vIGNhdXNlcyBhIDMwJSByZWdyZXNzaW9uIG9uIEVQQ0MgcGFyYWxsZWwgLSB0b2dnbGluZyBpdAorICAgICAgICAvLyBpcyBtdWNoIGNoZWFwZXIuCisgICAgICAgIC8vCisgICAgICAgIHRoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlID0gMSAtIHRoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3Roci0+dGgudGhfdGFza19zdGF0ZSA9PSBUQ1JfNCh0ZWFtLT50LnRfdGFza190ZWFtLT50dC50dF9zdGF0ZSkgKTsKKyAgICB9CisgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF90YXNrX3RlYW1fc3luYzogVGhyZWFkIFQjJWQgdGFzayB0ZWFtIGFzc2lnbmVkIHBvaW50ZXIgKCVwKSBmcm9tIFRlYW0gIyVkIHRhc2sgdGVhbVxuIiwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhpc190aHIgKSwgJnRoaXNfdGhyLT50aC50aF90YXNrX3RlYW0sCisgICAgICAgICAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW0sICgodGVhbSAhPSBOVUxMKSA/ICh0ZWFtLT50LnRfaWQpIDogLTEpICkgKTsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfdGFza190ZWFtX3dhaXQ6IE1hc3RlciB0aHJlYWQgd2FpdHMgZm9yIG91dHN0YW5kaW5nIHRhc2tzIGFmdGVyCisvLyB0aGUgYmFycmllciBnYXRoZXIgcGhhc2UuICBPbmx5IGNhbGxlZCBieSBtYXN0ZXIgdGhyZWFkIGlmICN0aHJlYWRzCisvLyBpbiB0ZWFtID4gMSAhCisKK3ZvaWQKK19fa21wX3Rhc2tfdGVhbV93YWl0KCBrbXBfaW5mb190ICp0aGlzX3RociwKKyAgICAgICAgICAgICAgICAgICAgICBrbXBfdGVhbV90ICp0ZWFtCisgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqIGl0dF9zeW5jX29iaikKKyAgICAgICAgICAgICAgICAgICAgICApCit7CisgICAga21wX3Rhc2tfdGVhbV90ICp0YXNrX3RlYW0gPSB0ZWFtLT50LnRfdGFza190ZWFtOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrX3RlYW0gPT0gdGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSApOworCisgICAgaWYgKCAoIHRhc2tfdGVhbSAhPSBOVUxMICkgJiYgS01QX1RBU0tJTkdfRU5BQkxFRCggdGFza190ZWFtLCB0aGlzX3Roci0+dGgudGhfdGFza19zdGF0ZSApICkgeworICAgICAgICBLQV9UUkFDRSggMjAsICggIl9fa21wX3Rhc2tfdGVhbV93YWl0OiBNYXN0ZXIgVCMlZCB3YWl0aW5nIGZvciBhbGwgdGFza3M6IHRhc2tfdGVhbSA9ICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aGlzX3RociApLCB0YXNrX3RlYW0gKSApOworICAgICAgICAvLworICAgICAgICAvLyBBbGwgd29ya2VyIHRocmVhZHMgbWlnaHQgaGF2ZSBkcm9wcGVkIHRocm91Z2ggdG8gdGhlCisgICAgICAgIC8vIHJlbGVhc2UgcGhhc2UsIGJ1dCBjb3VsZCBzdGlsbCBiZSBleGVjdXRpbmcgdGFza3MuCisgICAgICAgIC8vIFdhaXQgaGVyZSBmb3IgYWxsIHRhc2tzIHRvIGNvbXBsZXRlLiAgVG8gYXZvaWQgbWVtb3J5CisgICAgICAgIC8vIGNvbnRlbnRpb24sIG9ubHkgdGhlIG1hc3RlciB0aHJlYWQgY2hlY2tzIGZvciB0aGUKKyAgICAgICAgLy8gdGVybWluYXRpb24gY29uZGl0aW9uLgorICAgICAgICAvLworICAgICAgICBfX2ttcF93YWl0X3NsZWVwKCB0aGlzX3RociwgJnRhc2tfdGVhbS0+dHQudHRfdW5maW5pc2hlZF90aHJlYWRzLCAwLCBUUlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAvLworICAgICAgICAvLyBLaWxsIHRoZSBvbGQgdGFzayB0ZWFtLCBzbyB0aGF0IHRoZSB3b3JrZXIgdGhyZWFkcyB3aWxsCisgICAgICAgIC8vIHN0b3AgcmVmZXJlbmNpbmcgaXQgd2hpbGUgc3Bpbm5pbmcuICBUaGV5IHdpbGwKKyAgICAgICAgLy8gZGVhbGxvY2F0ZSBpdCB3aGVuIHRoZSByZWZlcmVuY2UgY291bnQgcmVhY2hlcyB6ZXJvLgorICAgICAgICAvLyBUaGUgbWFzdGVyIHRocmVhZCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIHJlZiBjb3VudC4KKyAgICAgICAgLy8KKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF90YXNrX3RlYW1fd2FpdDogTWFzdGVyIFQjJWQgZGVhY3RpdmF0aW5nIHRhc2tfdGVhbSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhpc190aHIgKSwgdGFza190ZWFtICkgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza190ZWFtLT50dC50dF9ucHJvYyA+IDEgKTsKKyAgICAgICAgVENXX1NZTkNfNCggdGFza190ZWFtLT50dC50dF9hY3RpdmUsIEZBTFNFICk7CisgICAgICAgIEtNUF9NQigpOworCisgICAgICAgIFRDV19QVFIodGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSwgTlVMTCk7CisgICAgICAgIHRlYW0tPnQudF90YXNrX3RlYW0gPSBOVUxMOworICAgIH0KK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfdGFza2luZ19iYXJyaWVyOgorLy8gSW50ZXJuYWwgZnVuY3Rpb24gdG8gZXhlY3V0ZSBhbGwgdGFza3MgcHJpb3IgdG8gYSByZWd1bGFyIGJhcnJpZXIgb3IgYQorLy8gam9pbiBiYXJyaWVyLiAgSXQgaXMgYSBmdWxsIGJhcnJpZXIgaXRzZWxmLCB3aGljaCB1bmZvcnR1bmF0ZWx5IHR1cm5zCisvLyByZWd1bGFyIGJhcnJpZXJzIGludG8gZG91YmxlIGJhcnJpZXJzIGFuZCBqb2luIGJhcnJpZXJzIGludG8gMSAxLzIKKy8vIGJhcnJpZXJzLgorLy8gVGhpcyByb3V0aW5lIG1heSBvbmx5IGNhbGxlZCB3aGVuIF9fa21wX3Rhc2tpbmdfbW9kZSA9PSB0c2ttX2V4dHJhX2JhcnJpZXIuCisKK3ZvaWQKK19fa21wX3Rhc2tpbmdfYmFycmllcigga21wX3RlYW1fdCAqdGVhbSwga21wX2luZm9fdCAqdGhyZWFkLCBpbnQgZ3RpZCApCit7CisgICAgdm9sYXRpbGUga21wX3VpbnQzMiAqc3BpbiA9ICZ0ZWFtLT50LnRfdGFza190ZWFtLT50dC50dF91bmZpbmlzaGVkX3RocmVhZHM7CisgICAgaW50IGZsYWcgPSBGQUxTRTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90YXNraW5nX21vZGUgPT0gdHNrbV9leHRyYV9iYXJyaWVyICk7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgS01QX0ZTWU5DX1NQSU5fSU5JVCggc3BpbiwgKGttcF91aW50MzIqKSBOVUxMICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgIHdoaWxlICghIF9fa21wX2V4ZWN1dGVfdGFza3MoIHRocmVhZCwgZ3RpZCwgc3BpbiwgMCwgVFJVRSwgJmZsYWcgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoTlVMTCksIDAgKSApIHsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIC8vIFRPRE86IFdoYXQgYWJvdXQgaXR0X3N5bmNfb2JqPz8KKyAgICAgICAgS01QX0ZTWU5DX1NQSU5fUFJFUEFSRSggc3BpbiApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgICAgICBpZiggVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSApIHsKKyAgICAgICAgICAgIGlmKCBfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ICkKKyAgICAgICAgICAgICAgICBfX2ttcF9hYm9ydF90aHJlYWQoICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBLTVBfWUlFTEQoIFRSVUUgKTsgICAgICAgLy8gR0g6IFdlIGFsd2F5cyB5aWVsZCBoZXJlCisgICAgfQorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBLTVBfRlNZTkNfU1BJTl9BQ1FVSVJFRCggKHZvaWQqKSBzcGluICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworfQorCisjZW5kaWYgLy8gT01QXzMwX0VOQUJMRUQKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX3Rhc2txLmMgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfdGFza3EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWJhM2YzCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX3Rhc2txLmMKQEAgLTAsMCArMSwyMDUxIEBACisvKgorICoga21wX3Rhc2txLmMgLS0gVEFTS1Egc3VwcG9ydCBmb3IgT3Blbk1QLgorICogJFJldmlzaW9uOiA0MjU4MiAkCisgKiAkRGF0ZTogMjAxMy0wOC0wOSAwNjozMDoyMiAtMDUwMCAoRnJpLCAwOSBBdWcgMjAxMykgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKyNpbmNsdWRlICJrbXBfaW8uaCIKKyNpbmNsdWRlICJrbXBfZXJyb3IuaCIKKworI2RlZmluZSBNQVhfTUVTU0FHRSA1MTIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIFRhc2txIHJvdXRpbmVzIGFuZCBnbG9iYWwgdmFyaWFibGVzCisgKi8KKworI2RlZmluZSBLTVBfREVCVUdfUkVGX0NUUyh4KSAgICBLRl9UUkFDRSgxLCB4KTsKKworI2RlZmluZSBUSFJFQURfQUxMT0NfRk9SX1RBU0tRCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGF0aWNfZGVsYXkoIGludCBhcmcgKQoreworLyogV29yayBhcm91bmQgd2VpcmQgY29kZS1nZW4gYnVnIHRoYXQgY2F1c2VzIGFzc2VydCB0byB0cmlwICovCisjaWYgS01QX0FSQ0hfWDg2XzY0ICYmIEtNUF9PU19MSU5VWAorICAgIEtNUF9BU1NFUlQoIGFyZyAhPSAwICk7CisjZWxzZQorICAgIEtNUF9BU1NFUlQoIGFyZyA+PSAwICk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK19fa21wX3N0YXRpY195aWVsZCggaW50IGFyZyApCit7CisgICAgX19rbXBfeWllbGQoIGFyZyApOworfQorCitzdGF0aWMgaW50Citpbl9wYXJhbGxlbF9jb250ZXh0KCBrbXBfdGVhbV90ICp0ZWFtICkKK3sKKyAgICByZXR1cm4gISB0ZWFtIC0+IHQudF9zZXJpYWxpemVkOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfdGFza3FfZW8oIGludCAqZ3RpZF9yZWYsIGludCAqY2lkX3JlZiwgaWRlbnRfdCAqbG9jX3JlZiApCit7CisgICAgaW50ICAgICAgICAgICAgICAgIGd0aWQgPSAqZ3RpZF9yZWY7CisgICAgaW50ICAgICAgICAgICAgICAgIHRpZCAgPSBfX2ttcF90aWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAga21wX3VpbnQzMiAgICAgICAgIHNwaW5zOworICAgIGttcF91aW50MzIgICAgICAgICBteV90b2tlbjsKKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAqdGFza3E7CisgICAga21wX3Rhc2txX3QgICAgICAgKnRxICAgPSAmIF9fa21wX3RocmVhZHNbZ3RpZF0gLT4gdGgudGhfdGVhbSAtPiB0LnRfdGFza3E7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApCisgICAgICAgIF9fa21wX3B1c2hfc3luYyggZ3RpZCwgY3Rfb3JkZXJlZF9pbl90YXNrcSwgbG9jX3JlZiwgTlVMTCApOworCisgICAgaWYgKCAhIF9fa21wX3RocmVhZHNbIGd0aWQgXS0+IHRoLnRoX3RlYW0gLT4gdC50X3NlcmlhbGl6ZWQgKSB7CisgICAgICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgICAgIC8qIEdFSCAtIG5lZWQgY2hlY2sgaGVyZSB1bmRlciBzdGF0cyB0byBtYWtlIHN1cmUgICAqLworICAgICAgICAvKiAgICAgICBpbnNpZGUgdGFzayAoY3Vycl90aHVua1sqdGlkX3JlZl0gIT0gTlVMTCkgKi8KKworICAgICAgICBteV90b2tlbiA9dHEtPnRxX2N1cnJfdGh1bmtbIHRpZCBdLT4gdGhfdGFza251bTsKKworICAgICAgICB0YXNrcSA9IHRxLT50cV9jdXJyX3RodW5rWyB0aWQgXS0+IHRoLnRoX3NoYXJlZHMgLT4gc3ZfcXVldWU7CisKKyAgICAgICAgS01QX1dBSVRfWUlFTEQoJnRhc2txLT50cV90YXNrbnVtX3NlcnZpbmcsIG15X3Rva2VuLCBLTVBfRVEsIE5VTEwpOworICAgICAgICBLTVBfTUIoKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF90YXNrcV94byggaW50ICpndGlkX3JlZiwgaW50ICpjaWRfcmVmLCBpZGVudF90ICpsb2NfcmVmICkKK3sKKyAgICBpbnQgICAgICAgICAgIGd0aWQgPSAqZ3RpZF9yZWY7CisgICAgaW50ICAgICAgICAgICB0aWQgID0gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ3RpZCApOworICAgIGttcF91aW50MzIgICAgbXlfdG9rZW47CisgICAga21wX3Rhc2txX3QgICp0cSAgID0gJiBfX2ttcF90aHJlYWRzW2d0aWRdIC0+IHRoLnRoX3RlYW0gLT4gdC50X3Rhc2txOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wb3Bfc3luYyggZ3RpZCwgY3Rfb3JkZXJlZF9pbl90YXNrcSwgbG9jX3JlZiApOworCisgICAgaWYgKCAhIF9fa21wX3RocmVhZHNbIGd0aWQgXS0+IHRoLnRoX3RlYW0gLT4gdC50X3NlcmlhbGl6ZWQgKSB7CisgICAgICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgICAgIC8qIEdFSCAtIG5lZWQgY2hlY2sgaGVyZSB1bmRlciBzdGF0cyB0byBtYWtlIHN1cmUgKi8KKyAgICAgICAgLyogICAgICAgaW5zaWRlIHRhc2sgKGN1cnJfdGh1bmtbdGlkXSAhPSBOVUxMKSAgICAqLworCisgICAgICAgIG15X3Rva2VuID0gdHEtPnRxX2N1cnJfdGh1bmtbIHRpZCBdLT50aF90YXNrbnVtOworCisgICAgICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgICAgIHRxLT50cV9jdXJyX3RodW5rWyB0aWQgXS0+IHRoLnRoX3NoYXJlZHMgLT4gc3ZfcXVldWUgLT4gdHFfdGFza251bV9zZXJ2aW5nID0gbXlfdG9rZW4gKyAxOworCisgICAgICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworICAgIH0KK30KKworc3RhdGljIHZvaWQKK19fa21wX3Rhc2txX2NoZWNrX29yZGVyZWQoIGttcF9pbnQzMiBndGlkLCBrbXBjX3RodW5rX3QgKnRodW5rICkKK3sKKyAgICBrbXBfdWludDMyIHNwaW5zOworICAgIGttcF91aW50MzIgbXlfdG9rZW47CisgICAga21wY190YXNrX3F1ZXVlX3QgKnRhc2txOworCisgICAgLyogYXNzdW1lIHdlIGFyZSBhbHdheXMgY2FsbGVkIGZyb20gYW4gYWN0aXZlIHBhcmFsbGVsIGNvbnRleHQgKi8KKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgbXlfdG9rZW4gPSAgdGh1bmsgLT4gdGhfdGFza251bTsKKworICAgIHRhc2txID0gIHRodW5rIC0+IHRoLnRoX3NoYXJlZHMgLT4gc3ZfcXVldWU7CisKKyAgICBpZih0YXNrcS0+dHFfdGFza251bV9zZXJ2aW5nIDw9IG15X3Rva2VuKSB7CisgICAgICAgIEtNUF9XQUlUX1lJRUxEKCZ0YXNrcS0+dHFfdGFza251bV9zZXJ2aW5nLCBteV90b2tlbiwgS01QX0dFLCBOVUxMKTsKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIHRhc2txLT50cV90YXNrbnVtX3NlcnZpbmcgPSBteV90b2tlbiArMTsKKyAgICAgICAgS01QX01CKCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorX19rbXBfZHVtcF9UUUYoa21wX2ludDMyIGZsYWdzKQoreworICAgIGlmIChmbGFncyAmIFRRRl9JU19PUkRFUkVEKQorICAgICAgICBfX2ttcF9wcmludGYoIk9SREVSRUQgIik7CisgICAgaWYgKGZsYWdzICYgVFFGX0lTX0xBU1RQUklWQVRFKQorICAgICAgICBfX2ttcF9wcmludGYoIkxBU1RfUFJJViAiKTsKKyAgICBpZiAoZmxhZ3MgJiBUUUZfSVNfTk9XQUlUKQorICAgICAgICBfX2ttcF9wcmludGYoIk5PV0FJVCAiKTsKKyAgICBpZiAoZmxhZ3MgJiBUUUZfSEVVUklTVElDUykKKyAgICAgICAgX19rbXBfcHJpbnRmKCJIRVVSSVNUICIpOworICAgIGlmIChmbGFncyAmIFRRRl9JTlRFUkZBQ0VfUkVTRVJWRUQxKQorICAgICAgICBfX2ttcF9wcmludGYoIlJFU0VSVjEgIik7CisgICAgaWYgKGZsYWdzICYgVFFGX0lOVEVSRkFDRV9SRVNFUlZFRDIpCisgICAgICAgIF9fa21wX3ByaW50ZigiUkVTRVJWMiAiKTsKKyAgICBpZiAoZmxhZ3MgJiBUUUZfSU5URVJGQUNFX1JFU0VSVkVEMykKKyAgICAgICAgX19rbXBfcHJpbnRmKCJSRVNFUlYzICIpOworICAgIGlmIChmbGFncyAmIFRRRl9JTlRFUkZBQ0VfUkVTRVJWRUQ0KQorICAgICAgICBfX2ttcF9wcmludGYoIlJFU0VSVjQgIik7CisgICAgaWYgKGZsYWdzICYgVFFGX0lTX0xBU1RfVEFTSykKKyAgICAgICAgX19rbXBfcHJpbnRmKCJMQVNUX1RBU0sgIik7CisgICAgaWYgKGZsYWdzICYgVFFGX1RBU0tRX1RBU0spCisgICAgICAgIF9fa21wX3ByaW50ZigiVEFTS1FfVEFTSyAiKTsKKyAgICBpZiAoZmxhZ3MgJiBUUUZfUkVMRUFTRV9XT1JLRVJTKQorICAgICAgICBfX2ttcF9wcmludGYoIlJFTEVBU0UgIik7CisgICAgaWYgKGZsYWdzICYgVFFGX0FMTF9UQVNLU19RVUVVRUQpCisgICAgICAgIF9fa21wX3ByaW50ZigiQUxMX1FVRVVFRCAiKTsKKyAgICBpZiAoZmxhZ3MgJiBUUUZfUEFSQUxMRUxfQ09OVEVYVCkKKyAgICAgICAgX19rbXBfcHJpbnRmKCJQQVJBTExFTCAiKTsKKyAgICBpZiAoZmxhZ3MgJiBUUUZfREVBTExPQ0FURUQpCisgICAgICAgIF9fa21wX3ByaW50ZigiREVBTExPQyAiKTsKKyAgICBpZiAoIShmbGFncyAmIChUUUZfSU5URVJOQUxfRkxBR1N8VFFGX0lOVEVSRkFDRV9GTEFHUykpKQorICAgICAgICBfX2ttcF9wcmludGYoIihOT05FKSIpOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZHVtcF90aHVuaygga21wX3Rhc2txX3QgKnRxLCBrbXBjX3RodW5rX3QgKnRodW5rLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApCit7CisgICAgaW50IGk7CisgICAgaW50IG5wcm9jID0gX19rbXBfdGhyZWFkc1tnbG9iYWxfdGlkXSAtPiB0aC50aF90ZWFtIC0+IHQudF9ucHJvYzsKKworICAgIF9fa21wX3ByaW50ZigiXHRUaHVuayBhdCAlcCBvbiAoJWQpOiAgIiwgdGh1bmssIGdsb2JhbF90aWQpOworCisgICAgaWYgKHRodW5rICE9IE5VTEwpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5wcm9jOyBpKyspIHsKKyAgICAgICAgICAgIGlmKCB0cS0+dHFfY3Vycl90aHVua1tpXSA9PSB0aHVuayApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoIlslaV0gIiwgaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfcHJpbnRmKCJ0aF9zaGFyZWRzPSVwLCAiLCB0aHVuay0+dGgudGhfc2hhcmVkcyk7CisgICAgICAgIF9fa21wX3ByaW50ZigidGhfdGFzaz0lcCwgIiwgdGh1bmstPnRoX3Rhc2spOworICAgICAgICBfX2ttcF9wcmludGYoInRoX2VuY2xfdGh1bms9JXAsICIsIHRodW5rLT50aF9lbmNsX3RodW5rKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCJ0aF9zdGF0dXM9JWQsICIsIHRodW5rLT50aF9zdGF0dXMpOworICAgICAgICBfX2ttcF9wcmludGYoInRoX3Rhc2tudW09JXUsICIsIHRodW5rLT50aF90YXNrbnVtKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCJ0aF9mbGFncz0iKTsgX19rbXBfZHVtcF9UUUYodGh1bmstPnRoX2ZsYWdzKTsKKyAgICB9CisKKyAgICBfX2ttcF9wcmludGYoIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9kdW1wX3RodW5rX3N0YWNrKGttcGNfdGh1bmtfdCAqdGh1bmssIGttcF9pbnQzMiB0aHJlYWRfbnVtKQoreworICAgIGttcGNfdGh1bmtfdCAqdGg7CisKKyAgICBfX2ttcF9wcmludGYoIiAgICBUaHVuayBzdGFjayBmb3IgVCMlZDogICIsIHRocmVhZF9udW0pOworCisgICAgZm9yICh0aCA9IHRodW5rOyB0aCAhPSBOVUxMOyB0aCA9IHRoLT50aF9lbmNsX3RodW5rICkKKyAgICAgICAgX19rbXBfcHJpbnRmKCIlcCAiLCB0aCk7CisKKyAgICBfX2ttcF9wcmludGYoIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9kdW1wX3Rhc2tfcXVldWUoIGttcF90YXNrcV90ICp0cSwga21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApCit7CisgICAgaW50ICAgICAgICAgICAgICAgICAgcXMsIGNvdW50LCBpOworICAgIGttcGNfdGh1bmtfdCAgICAgICAgKnRodW5rOworICAgIGttcGNfdGFza19xdWV1ZV90ICAgKnRhc2txOworCisgICAgX19rbXBfcHJpbnRmKCJUYXNrIFF1ZXVlIGF0ICVwIG9uICglZCk6XG4iLCBxdWV1ZSwgZ2xvYmFsX3RpZCk7CisKKyAgICBpZiAocXVldWUgIT0gTlVMTCkgeworICAgICAgICBpbnQgaW5fcGFyYWxsZWwgPSBxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfUEFSQUxMRUxfQ09OVEVYVDsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV9sb2MgICAgICAgICAgICAgOiAiKTsKKyAgICB9CisgICAgICAgIGlmIChpbl9wYXJhbGxlbCkgeworCisgICAgICAgICAgICAvL2lmIChxdWV1ZS0+dHEudHFfcGFyZW50ICE9IDApCisgICAgICAgICAgICAgICAgLy9fX2ttcF9hY3F1aXJlX2xvY2soJiBxdWV1ZS0+dHEudHFfcGFyZW50LT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgIC8vX19rbXBfYWNxdWlyZV9sb2NrKCYgcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICAgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgZmluZSB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwICovCisKKyAgICAgICAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX3BhcmVudCAgICAgICAgICA6ICVwXG4iLCBxdWV1ZS0+dHEudHFfcGFyZW50KTsKKyAgICAgICAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX2ZpcnN0X2NoaWxkICAgICA6ICVwXG4iLCBxdWV1ZS0+dHFfZmlyc3RfY2hpbGQpOworICAgICAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfbmV4dF9jaGlsZCAgICAgIDogJXBcbiIsIHF1ZXVlLT50cV9uZXh0X2NoaWxkKTsKKyAgICAgICAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX3ByZXZfY2hpbGQgICAgICA6ICVwXG4iLCBxdWV1ZS0+dHFfcHJldl9jaGlsZCk7CisgICAgICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV9yZWZfY291bnQgICAgICAgOiAlZFxuIiwgcXVldWUtPnRxX3JlZl9jb3VudCk7CisKKyAgICAgICAgICAgIC8vX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICAgICAgLy9pZiAocXVldWUtPnRxLnRxX3BhcmVudCAhPSAwKQorICAgICAgICAgICAgICAgIC8vX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxLnRxX3BhcmVudC0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICAvL19fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cV9mcmVlX3RodW5rc19sY2ssIGdsb2JhbF90aWQpOworICAgICAgICAgICAgLy9fX2ttcF9hY3F1aXJlX2xvY2soJiBxdWV1ZS0+dHFfcXVldWVfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICAgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgZmluZSB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwICovCisgICAgICAgIH0KKworICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV9zaGFyZWRzICAgICAgICAgOiAiKTsKKyAgICAgICAgZm9yIChpPTA7IGk8KChxdWV1ZSA9PSB0cS0+dHFfcm9vdCkgPyBxdWV1ZS0+dHFfbnByb2MgOiAxKTsgaSsrKQorICAgICAgICAgICAgX19rbXBfcHJpbnRmKCIlcCAiLCBxdWV1ZS0+dHFfc2hhcmVkc1tpXS5haV9kYXRhKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCJcbiIpOworCisgICAgICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfdGFza251bV9xdWV1aW5nIDogJXVcbiIsIHF1ZXVlLT50cV90YXNrbnVtX3F1ZXVpbmcpOworICAgICAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfdGFza251bV9zZXJ2aW5nIDogJXVcbiIsIHF1ZXVlLT50cV90YXNrbnVtX3NlcnZpbmcpOworICAgICAgICB9CisKKyAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfcXVldWUgICAgICAgICAgIDogJXBcbiIsIHF1ZXVlLT50cV9xdWV1ZSk7CisgICAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX3RodW5rX3NwYWNlICAgICA6ICVwXG4iLCBxdWV1ZS0+dHFfdGh1bmtfc3BhY2UpOworICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV90YXNrcV9zbG90ICAgICAgOiAlcFxuIiwgcXVldWUtPnRxX3Rhc2txX3Nsb3QpOworCisgICAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX2ZyZWVfdGh1bmtzICAgICA6ICIpOworICAgICAgICBmb3IgKHRodW5rID0gcXVldWUtPnRxX2ZyZWVfdGh1bmtzOyB0aHVuayAhPSBOVUxMOyB0aHVuayA9IHRodW5rLT50aC50aF9uZXh0X2ZyZWUgKQorICAgICAgICAgICAgX19rbXBfcHJpbnRmKCIlcCAiLCB0aHVuayk7CisgICAgICAgIF9fa21wX3ByaW50ZigiXG4iKTsKKworICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV9uc2xvdHMgICAgICAgICAgOiAlZFxuIiwgcXVldWUtPnRxX25zbG90cyk7CisgICAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX2hlYWQgICAgICAgICAgICA6ICVkXG4iLCBxdWV1ZS0+dHFfaGVhZCk7CisgICAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX3RhaWwgICAgICAgICAgICA6ICVkXG4iLCBxdWV1ZS0+dHFfdGFpbCk7CisgICAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX25mdWxsICAgICAgICAgICA6ICVkXG4iLCBxdWV1ZS0+dHFfbmZ1bGwpOworICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV9oaXdhdCAgICAgICAgICAgOiAlZFxuIiwgcXVldWUtPnRxX2hpd2F0KTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfZmxhZ3MgICAgICAgICAgIDogIik7IF9fa21wX2R1bXBfVFFGKHF1ZXVlLT50cV9mbGFncyk7CisgICAgICAgIF9fa21wX3ByaW50ZigiXG4iKTsKKworICAgICAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX3RoX3RodW5rcyAgICAgICA6ICIpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHF1ZXVlLT50cV9ucHJvYzsgaSsrKSB7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRmKCIlZCAiLCBxdWV1ZS0+dHFfdGhfdGh1bmtzW2ldLmFpX2RhdGEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX19rbXBfcHJpbnRmKCJcbiIpOworICAgICAgICB9CisKKyAgICAgICAgX19rbXBfcHJpbnRmKCJcbiIpOworICAgICAgICBfX2ttcF9wcmludGYoIiAgICBRdWV1ZSBzbG90czpcbiIpOworCisKKyAgICAgICAgcXMgPSBxdWV1ZS0+dHFfdGFpbDsKKyAgICAgICAgZm9yICggY291bnQgPSAwOyBjb3VudCA8IHF1ZXVlLT50cV9uZnVsbDsgKytjb3VudCApIHsKKyAgICAgICAgICAgIF9fa21wX3ByaW50ZigiKCVkKSIsIHFzKTsKKyAgICAgICAgICAgIF9fa21wX2R1bXBfdGh1bmsoIHRxLCBxdWV1ZS0+dHFfcXVldWVbcXNdLnFzX3RodW5rLCBnbG9iYWxfdGlkICk7CisgICAgICAgICAgICBxcyA9IChxcysxKSAlIHF1ZXVlLT50cV9uc2xvdHM7CisgICAgICAgIH0KKworICAgICAgICBfX2ttcF9wcmludGYoIlxuIik7CisKKyAgICAgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgICAgICBpZiAocXVldWUtPnRxX3Rhc2txX3Nsb3QgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50ZigiICAgIFRhc2tRIHNsb3Q6XG4iKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9kdW1wX3RodW5rKCB0cSwgKGttcGNfdGh1bmtfdCAqKSBxdWV1ZS0+dHFfdGFza3Ffc2xvdCwgZ2xvYmFsX3RpZCApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50ZigiXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxX3F1ZXVlX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgICAgICAvL19fa21wX3JlbGVhc2VfbG9jaygmIHF1ZXVlLT50cV9mcmVlX3RodW5rc19sY2ssIGdsb2JhbF90aWQpOworICAgICAgICB9CisgICAgfQorCisgICAgX19rbXBfcHJpbnRmKCIgICAgVGFza3EgZnJlZWxpc3Q6ICIpOworCisgICAgLy9fX2ttcF9hY3F1aXJlX2xvY2soICYgdHEtPnRxX2ZyZWVsaXN0X2xjaywgZ2xvYmFsX3RpZCApOworCisgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworCisgICAgZm9yKCB0YXNrcSA9IHRxLT50cV9mcmVlbGlzdDsgdGFza3EgIT0gTlVMTDsgdGFza3EgPSB0YXNrcS0+dHEudHFfbmV4dF9mcmVlICkKKyAgICAgICAgX19rbXBfcHJpbnRmKCIlcCAiLCB0YXNrcSk7CisKKyAgICAvL19fa21wX3JlbGVhc2VfbG9jayggJiB0cS0+dHFfZnJlZWxpc3RfbGNrLCBnbG9iYWxfdGlkICk7CisKKyAgICBfX2ttcF9wcmludGYoIlxuXG4iKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2F1eF9kdW1wX3Rhc2tfcXVldWVfdHJlZSgga21wX3Rhc2txX3QgKnRxLCBrbXBjX3Rhc2tfcXVldWVfdCAqY3Vycl9xdWV1ZSwga21wX2ludDMyIGxldmVsLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApCit7CisgICAgaW50IGksIGNvdW50LCBxczsKKyAgICBpbnQgbnByb2MgPSBfX2ttcF90aHJlYWRzW2dsb2JhbF90aWRdIC0+IHRoLnRoX3RlYW0gLT4gdC50X25wcm9jOworICAgIGttcGNfdGFza19xdWV1ZV90ICpxdWV1ZSA9IGN1cnJfcXVldWU7CisKKyAgICBpZiAoY3Vycl9xdWV1ZSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisKKyAgICBfX2ttcF9wcmludGYoIiAgICAiKTsKKworICAgIGZvciAoaT0wOyBpPGxldmVsOyBpKyspCisgICAgICAgIF9fa21wX3ByaW50ZigiICAiKTsKKworICAgIF9fa21wX3ByaW50ZigiJXAiLCBjdXJyX3F1ZXVlKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBucHJvYzsgaSsrKSB7CisgICAgICAgIGlmKCB0cS0+dHFfY3Vycl90aHVua1tpXSAmJiB0cS0+dHFfY3Vycl90aHVua1tpXS0+dGgudGhfc2hhcmVkcy0+c3ZfcXVldWUgPT0gY3Vycl9xdWV1ZSApIHsKKyAgICAgICAgICAgIF9fa21wX3ByaW50ZigiIFslaV0iLCBpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIF9fa21wX3ByaW50ZigiOiIpOworCisgICAgLy9fX2ttcF9hY3F1aXJlX2xvY2soJiBjdXJyX3F1ZXVlLT50cV9xdWV1ZV9sY2ssIGdsb2JhbF90aWQpOworCisgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworCisgICAgcXMgPSBjdXJyX3F1ZXVlLT50cV90YWlsOworCisgICAgZm9yICggY291bnQgPSAwOyBjb3VudCA8IGN1cnJfcXVldWUtPnRxX25mdWxsOyArK2NvdW50ICkgeworICAgICAgICBfX2ttcF9wcmludGYoIiVwICIsIGN1cnJfcXVldWUtPnRxX3F1ZXVlW3FzXS5xc190aHVuayk7CisgICAgICAgICBxcyA9IChxcysxKSAlIGN1cnJfcXVldWUtPnRxX25zbG90czsKKyAgICB9CisKKyAgICAvL19fa21wX3JlbGVhc2VfbG9jaygmIGN1cnJfcXVldWUtPnRxX3F1ZXVlX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICBfX2ttcF9wcmludGYoIlxuIik7CisKKyAgICBpZiAoY3Vycl9xdWV1ZS0+dHFfZmlyc3RfY2hpbGQpIHsKKyAgICAgICAgLy9fX2ttcF9hY3F1aXJlX2xvY2soJiBjdXJyX3F1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKworICAgICAgICBpZiAoY3Vycl9xdWV1ZS0+dHFfZmlyc3RfY2hpbGQpIHsKKyAgICAgICAgICAgIGZvcihxdWV1ZSA9IChrbXBjX3Rhc2tfcXVldWVfdCAqKWN1cnJfcXVldWUtPnRxX2ZpcnN0X2NoaWxkOworICAgICAgICAgICAgICAgIHF1ZXVlICE9IE5VTEw7CisgICAgICAgICAgICAgICAgcXVldWUgPSBxdWV1ZS0+dHFfbmV4dF9jaGlsZCkgeworICAgICAgICAgICAgICAgIF9fa21wX2F1eF9kdW1wX3Rhc2tfcXVldWVfdHJlZSggdHEsIHF1ZXVlLCBsZXZlbCsxLCBnbG9iYWxfdGlkICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvL19fa21wX3JlbGVhc2VfbG9jaygmIGN1cnJfcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9kdW1wX3Rhc2tfcXVldWVfdHJlZSgga21wX3Rhc2txX3QgKnRxLCBrbXBjX3Rhc2tfcXVldWVfdCAqdHFyb290LCBrbXBfaW50MzIgZ2xvYmFsX3RpZCkKK3sKKyAgICBfX2ttcF9wcmludGYoIlRhc2tRIFRyZWUgYXQgcm9vdCAlcCBvbiAoJWQpOlxuIiwgdHFyb290LCBnbG9iYWxfdGlkKTsKKworICAgIF9fa21wX2F1eF9kdW1wX3Rhc2tfcXVldWVfdHJlZSggdHEsIHRxcm9vdCwgMCwgZ2xvYmFsX3RpZCApOworCisgICAgX19rbXBfcHJpbnRmKCJcbiIpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAgICBOZXcgdGFza3Egc3RvcmFnZSByb3V0aW5lcyB0aGF0IHRyeSB0byBtaW5pbWl6ZSBvdmVyaGVhZCBvZiBtYWxsb2NzIGJ1dAorICAgIHN0aWxsIHByb3ZpZGUgY2FjaGUgbGluZSBhbGlnbm1lbnQuCisqLworCisKK3N0YXRpYyB2b2lkICoKK19fa21wX3Rhc2txX2FsbG9jYXRlKHNpemVfdCBzaXplLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCkKK3sKKyAgICB2b2lkICphZGRyLCAqb3JpZ19hZGRyOworICAgIHNpemVfdCBieXRlczsKKworICAgIEtCX1RSQUNFKCA1LCAoIl9fa21wX3Rhc2txX2FsbG9jYXRlOiBjYWxsZWQgc2l6ZT0lZCwgZ3RpZD0lZFxuIiwgKGludCkgc2l6ZSwgZ2xvYmFsX3RpZCApICk7CisKKyAgICBieXRlcyA9IHNpemVvZih2b2lkICopICsgQ0FDSEVfTElORSArIHNpemU7CisKKyNpZmRlZiBUSFJFQURfQUxMT0NfRk9SX1RBU0tRCisgICAgb3JpZ19hZGRyID0gKHZvaWQgKikgX19rbXBfdGhyZWFkX21hbGxvYyggX19rbXBfdGhyZWFkX2Zyb21fZ3RpZChnbG9iYWxfdGlkKSwgYnl0ZXMgKTsKKyNlbHNlCisgICAgS0VfVFJBQ0UoIDEwLCAoIiUlJSUlJSBNQUxMT0MoICVkIClcbiIsIGJ5dGVzICkgKTsKKyAgICBvcmlnX2FkZHIgPSAodm9pZCAqKSBLTVBfSU5URVJOQUxfTUFMTE9DKCBieXRlcyApOworI2VuZGlmIC8qIFRIUkVBRF9BTExPQ19GT1JfVEFTS1EgKi8KKworICAgIGlmIChvcmlnX2FkZHIgPT0gMCkKKyAgICAgICAgS01QX0ZBVEFMKCBPdXRPZkhlYXBNZW1vcnkgKTsKKworICAgIGFkZHIgPSBvcmlnX2FkZHI7CisKKyAgICBpZiAoKChrbXBfdWludHB0cl90KSBhZGRyICYgKCBDQUNIRV9MSU5FIC0gMSApKSAhPSAwKSB7CisgICAgICAgIEtCX1RSQUNFKCA1MCwgKCJfX2ttcF90YXNrcV9hbGxvY2F0ZTogIGFkanVzdCBmb3IgY2FjaGUgYWxpZ25tZW50XG4iICkgKTsKKyAgICAgICAgYWRkciA9ICh2b2lkICopICgoKGttcF91aW50cHRyX3QpIGFkZHIgKyBDQUNIRV9MSU5FKSAmIH4oIENBQ0hFX0xJTkUgLSAxICkpOworICAgIH0KKworICAgICgqICh2b2lkICoqKSBhZGRyKSA9IG9yaWdfYWRkcjsKKworICAgIEtCX1RSQUNFKCAxMCwgKCJfX2ttcF90YXNrcV9hbGxvY2F0ZTogIGFsbG9jYXRlOiAlcCwgdXNlOiAlcCAtICVwLCBzaXplOiAlZCwgZ3RpZDogJWRcbiIsCisgICAgICAgICAgICAgb3JpZ19hZGRyLCAoKHZvaWQgKiopIGFkZHIpICsgMSwgKChjaGFyICopKCgodm9pZCAqKikgYWRkcikgKyAxKSkgKyBzaXplLTEsCisgICAgICAgICAgICAgKGludCkgc2l6ZSwgZ2xvYmFsX3RpZCApKTsKKworICAgIHJldHVybiAoICgodm9pZCAqKikgYWRkcikgKyAxICk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcGNfdGFza3FfZnJlZSh2b2lkICpwLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCkKK3sKKyAgICBLQl9UUkFDRSggNSwgKCJfX2ttcGNfdGFza3FfZnJlZTogY2FsbGVkIGFkZHI9JXAsIGd0aWQ9JWRcbiIsIHAsIGdsb2JhbF90aWQgKSApOworCisgICAgS0JfVFJBQ0UoMTAsICgiX19rbXBjX3Rhc2txX2ZyZWU6ICBmcmVlaW5nOiAlcCwgZ3RpZDogJWRcbiIsICgqKCAoKHZvaWQgKiopIHApLTEpKSwgZ2xvYmFsX3RpZCApKTsKKworI2lmZGVmIFRIUkVBRF9BTExPQ19GT1JfVEFTS1EKKyAgICBfX2ttcF90aHJlYWRfZnJlZSggX19rbXBfdGhyZWFkX2Zyb21fZ3RpZChnbG9iYWxfdGlkKSwgKiggKCh2b2lkICoqKSBwKS0xKSApOworI2Vsc2UKKyAgICBLTVBfSU5URVJOQUxfRlJFRSggKiggKCh2b2lkICoqKSBwKS0xKSApOworI2VuZGlmIC8qIFRIUkVBRF9BTExPQ19GT1JfVEFTS1EgKi8KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiAgICAgIEtlZXAgZnJlZWQga21wY190YXNrX3F1ZXVlX3Qgb24gYW4gaW50ZXJuYWwgZnJlZWxpc3QgYW5kIHJlY3ljbGUgc2luY2UKKyAqICAgICAgdGhleSdyZSBvZiBjb25zdGFudCBzaXplLgorICovCisKK3N0YXRpYyBrbXBjX3Rhc2tfcXVldWVfdCAqCitfX2ttcF9hbGxvY190YXNrcSAoIGttcF90YXNrcV90ICp0cSwgaW50IGluX3BhcmFsbGVsLCBrbXBfaW50MzIgbnNsb3RzLCBrbXBfaW50MzIgbnRodW5rcywKKyAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIG5zaGFyZWRzLCBrbXBfaW50MzIgbnByb2MsIHNpemVfdCBzaXplb2ZfdGh1bmssCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplb2Zfc2hhcmVkcywga21wY190aHVua190ICoqbmV3X3Rhc2txX3RodW5rLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApCit7CisgICAga21wX2ludDMyICAgICAgICAgICAgICAgICAgaTsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICBieXRlczsKKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAgICAgICAgICAqbmV3X3F1ZXVlOworICAgIGttcGNfYWxpZ25lZF9zaGFyZWRfdmFyc190ICpzaGFyZWRfdmFyX2FycmF5OworICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAgICpzaGFyZWRfdmFyX3N0b3JhZ2U7CisgICAgY2hhciAgICAgICAgICAgICAgICAgICAgICAgKnB0OyAvKiBmb3IgZG9pbmcgYnl0ZS1hZGp1c3RlZCBhZGRyZXNzIGNvbXB1dGF0aW9ucyAqLworCisgICAgX19rbXBfYWNxdWlyZV9sb2NrKCAmIHRxLT50cV9mcmVlbGlzdF9sY2ssIGdsb2JhbF90aWQgKTsKKworICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKworICAgIGlmKCB0cS0+dHFfZnJlZWxpc3QgKSB7CisgICAgICAgIG5ld19xdWV1ZSA9ICB0cSAtPiB0cV9mcmVlbGlzdDsKKyAgICAgICAgdHEgLT4gdHFfZnJlZWxpc3QgPSAgdHEgLT4gdHFfZnJlZWxpc3QgLT4gdHEudHFfbmV4dF9mcmVlOworCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQobmV3X3F1ZXVlLT50cV9mbGFncyAmIFRRRl9ERUFMTE9DQVRFRCk7CisKKyAgICAgICAgbmV3X3F1ZXVlLT50cV9mbGFncyA9IDA7CisKKyAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCAmIHRxLT50cV9mcmVlbGlzdF9sY2ssIGdsb2JhbF90aWQgKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jayggJiB0cS0+dHFfZnJlZWxpc3RfbGNrLCBnbG9iYWxfdGlkICk7CisKKyAgICAgICAgbmV3X3F1ZXVlID0gKGttcGNfdGFza19xdWV1ZV90ICopIF9fa21wX3Rhc2txX2FsbG9jYXRlIChzaXplb2YgKGttcGNfdGFza19xdWV1ZV90KSwgZ2xvYmFsX3RpZCk7CisgICAgICAgIG5ld19xdWV1ZS0+dHFfZmxhZ3MgPSAwOworICAgIH0KKworICAgIC8qICBzcGFjZSBpbiB0aGUgdGFzayBxdWV1ZSBmb3IgcXVldWUgc2xvdHMgKGFsbG9jYXRlIGFzIG9uZSBiaWcgY2h1bmsgKi8KKyAgICAvKiBvZiBzdG9yYWdlIGluY2x1ZGluZyBuZXdfdGFza3FfdGFzayBzcGFjZSkgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICBzaXplb2ZfdGh1bmsgKz0gKENBQ0hFX0xJTkUgLSAoc2l6ZW9mX3RodW5rICUgQ0FDSEVfTElORSkpOyAgICAgICAgIC8qIHBhZCB0byBjYWNoZSBsaW5lIHNpemUgKi8KKyAgICBwdCA9IChjaGFyICopIF9fa21wX3Rhc2txX2FsbG9jYXRlIChudGh1bmtzICogc2l6ZW9mX3RodW5rLCBnbG9iYWxfdGlkKTsKKyAgICBuZXdfcXVldWUtPnRxX3RodW5rX3NwYWNlID0gKGttcGNfdGh1bmtfdCAqKXB0OworICAgICpuZXdfdGFza3FfdGh1bmsgPSAoa21wY190aHVua190ICopKHB0ICsgKG50aHVua3MgLSAxKSAqIHNpemVvZl90aHVuayk7CisKKyAgICAvKiAgY2hhaW4gdGhlIGFsbG9jYXRlZCB0aHVua3MgaW50byBhIGZyZWVsaXN0IGZvciB0aGlzIHF1ZXVlICAqLworCisgICAgbmV3X3F1ZXVlLT50cV9mcmVlX3RodW5rcyA9IChrbXBjX3RodW5rX3QgKilwdDsKKworICAgIGZvciAoaSA9IDA7IGkgPCAobnRodW5rcyAtIDIpOyBpKyspIHsKKyAgICAgICAgKChrbXBjX3RodW5rX3QgKikocHQraSpzaXplb2ZfdGh1bmspKS0+dGgudGhfbmV4dF9mcmVlID0gKGttcGNfdGh1bmtfdCAqKShwdCArIChpKzEpKnNpemVvZl90aHVuayk7CisjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICgoa21wY190aHVua190ICopKHB0K2kqc2l6ZW9mX3RodW5rKSktPnRoX2ZsYWdzID0gVFFGX0RFQUxMT0NBVEVEOworI2VuZGlmCisgICAgfQorCisgICAgKChrbXBjX3RodW5rX3QgKikocHQrKG50aHVua3MtMikqc2l6ZW9mX3RodW5rKSktPnRoLnRoX25leHRfZnJlZSA9IE5VTEw7CisjaWZkZWYgS01QX0RFQlVHCisgICAgKChrbXBjX3RodW5rX3QgKikocHQrKG50aHVua3MtMikqc2l6ZW9mX3RodW5rKSktPnRoX2ZsYWdzID0gVFFGX0RFQUxMT0NBVEVEOworI2VuZGlmCisKKyAgICAvKiBpbml0aWFsaXplIHRoZSBsb2NrcyAqLworCisgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgIF9fa21wX2luaXRfbG9jayggJiBuZXdfcXVldWUtPnRxX2xpbmtfbGNrICk7CisgICAgICAgIF9fa21wX2luaXRfbG9jayggJiBuZXdfcXVldWUtPnRxX2ZyZWVfdGh1bmtzX2xjayApOworICAgICAgICBfX2ttcF9pbml0X2xvY2soICYgbmV3X3F1ZXVlLT50cV9xdWV1ZV9sY2sgKTsKKyAgICB9CisKKyAgICAvKiBub3cgYWxsb2NhdGUgdGhlIHNsb3RzICovCisKKyAgICBieXRlcyA9IG5zbG90cyAqIHNpemVvZiAoa21wY19hbGlnbmVkX3F1ZXVlX3Nsb3RfdCk7CisgICAgbmV3X3F1ZXVlLT50cV9xdWV1ZSA9IChrbXBjX2FsaWduZWRfcXVldWVfc2xvdF90ICopIF9fa21wX3Rhc2txX2FsbG9jYXRlKCBieXRlcywgZ2xvYmFsX3RpZCApOworCisgICAgLyogIHNwYWNlIGZvciBhcnJheSBvZiBwb2ludGVycyB0byBzaGFyZWQgdmFyaWFibGUgc3RydWN0dXJlcyAqLworICAgIHNpemVvZl9zaGFyZWRzICs9IHNpemVvZihrbXBjX3Rhc2tfcXVldWVfdCAqKTsKKyAgICBzaXplb2Zfc2hhcmVkcyArPSAoQ0FDSEVfTElORSAtIChzaXplb2Zfc2hhcmVkcyAlIENBQ0hFX0xJTkUpKTsgICAgIC8qIHBhZCB0byBjYWNoZSBsaW5lIHNpemUgKi8KKworICAgIGJ5dGVzID0gbnNoYXJlZHMgKiBzaXplb2YgKGttcGNfYWxpZ25lZF9zaGFyZWRfdmFyc190KTsKKyAgICBzaGFyZWRfdmFyX2FycmF5ID0gKGttcGNfYWxpZ25lZF9zaGFyZWRfdmFyc190ICopIF9fa21wX3Rhc2txX2FsbG9jYXRlICggYnl0ZXMsIGdsb2JhbF90aWQpOworCisgICAgYnl0ZXMgPSBuc2hhcmVkcyAqIHNpemVvZl9zaGFyZWRzOworICAgIHNoYXJlZF92YXJfc3RvcmFnZSA9IChjaGFyICopIF9fa21wX3Rhc2txX2FsbG9jYXRlICggYnl0ZXMsIGdsb2JhbF90aWQpOworCisgICAgZm9yIChpPTA7IGk8bnNoYXJlZHM7IGkrKykgeworICAgICAgICBzaGFyZWRfdmFyX2FycmF5W2ldLmFpX2RhdGEgPSAoa21wY19zaGFyZWRfdmFyc190ICopIChzaGFyZWRfdmFyX3N0b3JhZ2UgKyBpKnNpemVvZl9zaGFyZWRzKTsKKyAgICAgICAgc2hhcmVkX3Zhcl9hcnJheVtpXS5haV9kYXRhLT5zdl9xdWV1ZSA9IG5ld19xdWV1ZTsKKyAgICB9CisgICAgbmV3X3F1ZXVlLT50cV9zaGFyZWRzID0gc2hhcmVkX3Zhcl9hcnJheTsKKworCisgICAgLyogYXJyYXkgZm9yIG51bWJlciBvZiBvdXRzdGFuZGluZyB0aHVua3MgcGVyIHRocmVhZCAqLworCisgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgIGJ5dGVzID0gbnByb2MgKiBzaXplb2Yoa21wY19hbGlnbmVkX2ludDMyX3QpOworICAgICAgICBuZXdfcXVldWUtPnRxX3RoX3RodW5rcyA9IChrbXBjX2FsaWduZWRfaW50MzJfdCAqKSBfX2ttcF90YXNrcV9hbGxvY2F0ZSAoIGJ5dGVzLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgbmV3X3F1ZXVlLT50cV9ucHJvYyAgICAgPSBucHJvYzsKKworICAgICAgICBmb3IgKGk9MDsgaTxucHJvYzsgaSsrKQorICAgICAgICAgICAgbmV3X3F1ZXVlLT50cV90aF90aHVua3NbaV0uYWlfZGF0YSA9IDA7CisgICAgfQorCisgICAgcmV0dXJuIG5ld19xdWV1ZTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2ZyZWVfdGFza3EgKGttcF90YXNrcV90ICp0cSwga21wY190YXNrX3F1ZXVlX3QgKnAsIGludCBpbl9wYXJhbGxlbCwga21wX2ludDMyIGdsb2JhbF90aWQpCit7CisgICAgX19rbXBjX3Rhc2txX2ZyZWUocC0+dHFfdGh1bmtfc3BhY2UsIGdsb2JhbF90aWQpOworICAgIF9fa21wY190YXNrcV9mcmVlKHAtPnRxX3F1ZXVlLCBnbG9iYWxfdGlkKTsKKworICAgIC8qIGZyZWUgc2hhcmVkIHZhciBzdHJ1Y3R1cmUgc3RvcmFnZSAqLworICAgIF9fa21wY190YXNrcV9mcmVlKCh2b2lkICopIHAtPnRxX3NoYXJlZHNbMF0uYWlfZGF0YSwgZ2xvYmFsX3RpZCk7CisKKyAgICAvKiBmcmVlIGFycmF5IG9mIHBvaW50ZXJzIHRvIHNoYXJlZCB2YXJzIHN0b3JhZ2UgKi8KKyAgICBfX2ttcGNfdGFza3FfZnJlZShwLT50cV9zaGFyZWRzLCBnbG9iYWxfdGlkKTsKKworI2lmZGVmIEtNUF9ERUJVRworICAgIHAtPnRxX2ZpcnN0X2NoaWxkID0gTlVMTDsKKyAgICBwLT50cV9uZXh0X2NoaWxkID0gTlVMTDsKKyAgICBwLT50cV9wcmV2X2NoaWxkID0gTlVMTDsKKyAgICBwLT50cV9yZWZfY291bnQgPSAtMTA7CisgICAgcC0+dHFfc2hhcmVkcyA9IE5VTEw7CisgICAgcC0+dHFfdGFza251bV9xdWV1aW5nID0gMDsKKyAgICBwLT50cV90YXNrbnVtX3NlcnZpbmcgPSAwOworICAgIHAtPnRxX3F1ZXVlID0gTlVMTDsKKyAgICBwLT50cV90aHVua19zcGFjZSA9IE5VTEw7CisgICAgcC0+dHFfdGFza3Ffc2xvdCA9IE5VTEw7CisgICAgcC0+dHFfZnJlZV90aHVua3MgPSBOVUxMOworICAgIHAtPnRxX25zbG90cyA9IDA7CisgICAgcC0+dHFfaGVhZCA9IDA7CisgICAgcC0+dHFfdGFpbCA9IDA7CisgICAgcC0+dHFfbmZ1bGwgPSAwOworICAgIHAtPnRxX2hpd2F0ID0gMDsKKworICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICBpbnQgaTsKKworICAgICAgICBmb3IgKGk9MDsgaTxwLT50cV9ucHJvYzsgaSsrKQorICAgICAgICAgICAgcC0+dHFfdGhfdGh1bmtzW2ldLmFpX2RhdGEgPSAwOworICAgIH0KKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApCisgICAgICAgIHAtPnRxX2xvYyA9IE5VTEw7CisgICAgS01QX0RFQlVHX0FTU0VSVCggcC0+dHFfZmxhZ3MgJiBUUUZfREVBTExPQ0FURUQgKTsKKyAgICBwLT50cV9mbGFncyA9IFRRRl9ERUFMTE9DQVRFRDsKKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKworICAgIGlmIChpbl9wYXJhbGxlbCkgIHsKKyAgICAgICAgX19rbXBjX3Rhc2txX2ZyZWUocC0+dHFfdGhfdGh1bmtzLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgX19rbXBfZGVzdHJveV9sb2NrKCYgcC0+dHFfbGlua19sY2spOworICAgICAgICBfX2ttcF9kZXN0cm95X2xvY2soJiBwLT50cV9xdWV1ZV9sY2spOworICAgICAgICBfX2ttcF9kZXN0cm95X2xvY2soJiBwLT50cV9mcmVlX3RodW5rc19sY2spOworICAgIH0KKyNpZmRlZiBLTVBfREVCVUcKKyAgICBwLT50cV90aF90aHVua3MgPSBOVUxMOworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCisgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworCisgICAgX19rbXBfYWNxdWlyZV9sb2NrKCAmIHRxLT50cV9mcmVlbGlzdF9sY2ssIGdsb2JhbF90aWQgKTsKKyAgICBwLT50cS50cV9uZXh0X2ZyZWUgPSB0cS0+dHFfZnJlZWxpc3Q7CisKKyAgICB0cS0+dHFfZnJlZWxpc3QgPSBwOworICAgIF9fa21wX3JlbGVhc2VfbG9jayggJiB0cS0+dHFfZnJlZWxpc3RfbGNrLCBnbG9iYWxfdGlkICk7Cit9CisKKy8qCisgKiAgICBPbmNlIGEgZ3JvdXAgb2YgdGh1bmtzIGhhcyBiZWVuIGFsbG9jYXRlZCBmb3IgdXNlIGluIGEgcGFydGljdWxhciBxdWV1ZSwKKyAqICAgIHRoZXNlIGFyZSBtYW5hZ2VkIHZpYSBhIHBlci1xdWV1ZSBmcmVlbGlzdC4KKyAqICAgIFdlIGZvcmNlIGEgY2hlY2sgdGhhdCB0aGVyZSdzIGFsd2F5cyBhIHRodW5rIGZyZWUgaWYgd2UgbmVlZCBvbmUuCisgKi8KKworc3RhdGljIGttcGNfdGh1bmtfdCAqCitfX2ttcF9hbGxvY190aHVuayAoa21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlLCBpbnQgaW5fcGFyYWxsZWwsIGttcF9pbnQzMiBnbG9iYWxfdGlkKQoreworICAgIGttcGNfdGh1bmtfdCAqZmw7CisKKyAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCYgcXVldWUtPnRxX2ZyZWVfdGh1bmtzX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKyAgICB9CisKKyAgICBmbCA9IHF1ZXVlLT50cV9mcmVlX3RodW5rczsKKworICAgIEtNUF9ERUJVR19BU1NFUlQgKGZsICE9IE5VTEwpOworCisgICAgcXVldWUtPnRxX2ZyZWVfdGh1bmtzID0gZmwtPnRoLnRoX25leHRfZnJlZTsKKyAgICBmbC0+dGhfZmxhZ3MgPSAwOworCisgICAgaWYgKGluX3BhcmFsbGVsKQorICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBxdWV1ZS0+dHFfZnJlZV90aHVua3NfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgIHJldHVybiBmbDsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2ZyZWVfdGh1bmsgKGttcGNfdGFza19xdWV1ZV90ICpxdWV1ZSwga21wY190aHVua190ICpwLCBpbnQgaW5fcGFyYWxsZWwsIGttcF9pbnQzMiBnbG9iYWxfdGlkKQoreworI2lmZGVmIEtNUF9ERUJVRworICAgIHAtPnRoX3Rhc2sgPSAwOworICAgIHAtPnRoX2VuY2xfdGh1bmsgPSAwOworICAgIHAtPnRoX3N0YXR1cyA9IDA7CisgICAgcC0+dGhfdGFza251bSA9IDA7CisgICAgLyogQWxzbyBjb3VsZCB6ZXJvIHBvaW50ZXJzIHRvIHByaXZhdGUgdmFycyAqLworI2VuZGlmCisKKyAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCYgcXVldWUtPnRxX2ZyZWVfdGh1bmtzX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKyAgICB9CisKKyAgICBwLT50aC50aF9uZXh0X2ZyZWUgPSBxdWV1ZS0+dHFfZnJlZV90aHVua3M7CisgICAgcXVldWUtPnRxX2ZyZWVfdGh1bmtzID0gcDsKKworI2lmZGVmIEtNUF9ERUJVRworICAgIHAtPnRoX2ZsYWdzID0gVFFGX0RFQUxMT0NBVEVEOworI2VuZGlmCisKKyAgICBpZiAoaW5fcGFyYWxsZWwpCisgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIHF1ZXVlLT50cV9mcmVlX3RodW5rc19sY2ssIGdsb2JhbF90aWQpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogIHJldHVybnMgbm9uemVybyBpZiB0aGUgcXVldWUganVzdCBiZWNhbWUgZnVsbCBhZnRlciB0aGUgZW5xdWV1ZSAgKi8KKworc3RhdGljIGttcF9pbnQzMgorX19rbXBfZW5xdWV1ZV90YXNrICgga21wX3Rhc2txX3QgKnRxLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlLCBrbXBjX3RodW5rX3QgKnRodW5rLCBpbnQgaW5fcGFyYWxsZWwgKQoreworICAgIGttcF9pbnQzMiAgICByZXQ7CisKKyAgICAvKiAgZGtwOiBjYW4gd2UgZ2V0IGFyb3VuZCB0aGUgbG9jayBpbiB0aGUgVFFGX1JFTEVBU0VfV09SS0VSUyBjYXNlIChvbmx5IHRoZSBtYXN0ZXIgaXMgZXhlY3V0aW5nIHRoZW4pICAqLworICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJiBxdWV1ZS0+dHFfcXVldWVfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworICAgIH0KKworICAgIEtNUF9ERUJVR19BU1NFUlQgKHF1ZXVlLT50cV9uZnVsbCA8IHF1ZXVlLT50cV9uc2xvdHMpOyAgLyogIGNoZWNrIHF1ZXVlIG5vdCBmdWxsICAqLworCisgICAgcXVldWUtPnRxX3F1ZXVlWyhxdWV1ZS0+dHFfaGVhZCkrK10ucXNfdGh1bmsgPSB0aHVuazsKKworICAgIGlmIChxdWV1ZS0+dHFfaGVhZCA+PSBxdWV1ZS0+dHFfbnNsb3RzKQorICAgICAgICBxdWV1ZS0+dHFfaGVhZCA9IDA7CisKKyAgICAocXVldWUtPnRxX25mdWxsKSsrOworCisgICAgS01QX01CKCk7ICAgLyogdG8gYXNzdXJlIHRoYXQgbmZ1bGwgaXMgc2VlbiB0byBpbmNyZWFzZSBiZWZvcmUgVFFGX0FMTF9UQVNLU19RVUVVRUQgaXMgc2V0ICovCisKKyAgICByZXQgPSAoaW5fcGFyYWxsZWwpID8gKHF1ZXVlLT50cV9uZnVsbCA9PSBxdWV1ZS0+dHFfbnNsb3RzKSA6IEZBTFNFOworCisgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgIC8qIGRvbid0IG5lZWQgdG8gd2FpdCB1bnRpbCB3b3JrZXJzIGFyZSByZWxlYXNlZCBiZWZvcmUgdW5sb2NraW5nICovCisgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIHF1ZXVlLT50cV9xdWV1ZV9sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgIGlmKCB0cS0+dHFfZ2xvYmFsX2ZsYWdzICYgVFFGX1JFTEVBU0VfV09SS0VSUyApIHsKKyAgICAgICAgICAgIC8qIElmIGp1c3QgY3JlYXRpbmcgdGhlIHJvb3QgcXVldWUsIHRoZSB3b3JrZXIgdGhyZWFkcyBhcmUgd2FpdGluZyBhdCAqLworICAgICAgICAgICAgLyogYSBqb2luIGJhcnJpZXIgdW50aWwgbm93LCB3aGVuIHRoZXJlJ3Mgc29tZXRoaW5nIGluIHRoZSBxdWV1ZSBmb3IgICovCisgICAgICAgICAgICAvKiB0aGVtIHRvIGRvOyByZWxlYXNlIHRoZW0gbm93IHRvIGRvIHdvcmsuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIC8qIFRoaXMgc2hvdWxkIG9ubHkgYmUgZG9uZSB3aGVuIHRoaXMgaXMgdGhlIGZpcnN0IHRhc2sgZW5xdWV1ZWQsICAgICAqLworICAgICAgICAgICAgLyogc28gcmVzZXQgdGhlIGZsYWcgaGVyZSBhbHNvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIHRxLT50cV9nbG9iYWxfZmxhZ3MgJj0gflRRRl9SRUxFQVNFX1dPUktFUlM7ICAvKiBubyBsb2NrIG5lZWRlZCwgd29ya2VycyBhcmUgc3RpbGwgaW4gc3BpbiBtb2RlICovCisKKyAgICAgICAgICAgIEtNUF9NQigpOyAgIC8qIGF2b2lkIHJlbGVhc2luZyBiYXJyaWVyIHR3aWNlIGlmIHRhc2txX3Rhc2sgc3dpdGNoZXMgdGhyZWFkcyAqLworCisgICAgICAgICAgICBfX2ttcGNfZW5kX2JhcnJpZXJfbWFzdGVyKCBOVUxMLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBrbXBjX3RodW5rX3QgKgorX19rbXBfZGVxdWV1ZV90YXNrIChrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlLCBpbnQgaW5fcGFyYWxsZWwpCit7CisgICAga21wY190aHVua190ICpwdDsKKyAgICBpbnQgICAgICAgICAgIHRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoIGdsb2JhbF90aWQgKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQgKHF1ZXVlLT50cV9uZnVsbCA+IDApOyAgLyogIGNoZWNrIHF1ZXVlIG5vdCBlbXB0eSAgKi8KKworICAgIGlmIChxdWV1ZS0+dHEudHFfcGFyZW50ICE9IE5VTEwgJiYgaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgaW50IGN0OworICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJiBxdWV1ZS0+dHEudHFfcGFyZW50LT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgIGN0ID0gKysocXVldWUtPnRxX3JlZl9jb3VudCk7CisgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgS01QX0RFQlVHX1JFRl9DVFMoKCJsaW5lICVkIGd0aWQgJWQ6IFEgJXAgaW5jICVkXG4iLAorICAgICAgICAgIF9fTElORV9fLCBnbG9iYWxfdGlkLCBxdWV1ZSwgY3QpKTsKKyAgICB9CisKKyAgICBwdCA9IHF1ZXVlLT50cV9xdWV1ZVsocXVldWUtPnRxX3RhaWwpKytdLnFzX3RodW5rOworCisgICAgaWYgKHF1ZXVlLT50cV90YWlsID49IHF1ZXVlLT50cV9uc2xvdHMpCisgICAgICAgIHF1ZXVlLT50cV90YWlsID0gMDsKKworICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICBxdWV1ZS0+dHFfdGhfdGh1bmtzW3RpZF0uYWlfZGF0YSsrOworCisgICAgICAgIEtNUF9NQigpOyAvKiBuZWNlc3Nhcnkgc28gYWlfZGF0YSBpbmNyZW1lbnQgaXMgcHJvcGFnYXRlZCB0byBvdGhlciB0aHJlYWRzIGltbWVkaWF0ZWx5IChkaWdpdGFsKSAqLworCisgICAgICAgIEtGX1RSQUNFKDIwMCwgKCJfX2ttcF9kZXF1ZXVlX3Rhc2s6IFQjJWQoOiVkKSBub3cgaGFzICVkIG91dHN0YW5kaW5nIHRodW5rcyBmcm9tIHF1ZXVlICVwXG4iLAorICAgICAgICAgICAgZ2xvYmFsX3RpZCwgdGlkLCBxdWV1ZS0+dHFfdGhfdGh1bmtzW3RpZF0uYWlfZGF0YSwgcXVldWUpKTsKKyAgICB9CisKKyAgICAocXVldWUtPnRxX25mdWxsKS0tOworCisjaWZkZWYgS01QX0RFQlVHCisgICAgS01QX01CKCk7CisKKyAgICAvKiBuZWNlc3Nhcnkgc28gKHF1ZXVlLT50cV9uZnVsbCA+IDApIGFib3ZlIHN1Y2NlZWRzIGFmdGVyIHRxX25mdWxsIGlzIGRlY3JlbWVudGVkICovCisKKyAgICBLTVBfREVCVUdfQVNTRVJUKHF1ZXVlLT50cV9uZnVsbCA+PSAwKTsKKworICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHF1ZXVlLT50cV90aF90aHVua3NbdGlkXS5haV9kYXRhIDw9IF9fS01QX1RBU0tRX1RIVU5LU19QRVJfVEgpOworICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIHB0OworfQorCisvKgorICogRmluZCB0aGUgbmV4dCAobm9uLW51bGwpIHRhc2sgdG8gZGVxdWV1ZSBhbmQgcmV0dXJuIGl0LgorICogVGhpcyBpcyBuZXZlciBjYWxsZWQgdW5sZXNzIGluX3BhcmFsbGVsPVRSVUUKKyAqCisgKiBIZXJlIGFyZSB0aGUgcnVsZXMgZm9yIGRlY2lkaW5nIHdoaWNoIHF1ZXVlIHRvIHRha2UgdGhlIHRhc2sgZnJvbToKKyAqIDEuICBXYWxrIHVwIHRoZSB0YXNrIHF1ZXVlIHRyZWUgZnJvbSB0aGUgY3VycmVudCBxdWV1ZSdzIHBhcmVudCBhbmQgbG9vaworICogICAgICBvbiB0aGUgd2F5IHVwIChmb3IgbG9vcCwgYmVsb3cpLgorICogMi4gIERvIGEgZGVwdGgtZmlyc3Qgc2VhcmNoIGJhY2sgZG93biB0aGUgdHJlZSBmcm9tIHRoZSByb290IGFuZAorICogICAgICBsb29rIChmaW5kX3Rhc2tfaW5fZGVzY2FuZGVudF9xdWV1ZSgpKS4KKyAqCisgKiBIZXJlIGFyZSB0aGUgcnVsZXMgZm9yIGRlY2lkaW5nIHdoaWNoIHRhc2sgdG8gdGFrZSBmcm9tIGEgcXVldWUKKyAqIChfX2ttcF9maW5kX3Rhc2tfaW5fcXVldWUgKCkpOgorICogMS4gIE5ldmVyIHRha2UgdGhlIGxhc3QgdGFzayBmcm9tIGEgcXVldWUgaWYgVFFGX0lTX0xBU1RQUklWQVRFOyB0aGlzIHRhc2sKKyAqICAgICBtdXN0IGJlIHN0YWdlZCB0byBtYWtlIHN1cmUgd2UgZXhlY3V0ZSB0aGUgbGFzdCBvbmUgd2l0aAorICogICAgIFRRRl9JU19MQVNUX1RBU0sgYXQgdGhlIGVuZCBvZiB0YXNrIHF1ZXVlIGV4ZWN1dGlvbi4KKyAqIDIuICBJZiB0aGUgcXVldWUgbGVuZ3RoIGlzIGJlbG93IHNvbWUgaGlnaCB3YXRlciBtYXJrIGFuZCB0aGUgdGFza3EgdGFzaworICogICAgIGlzIGVucXVldWVkLCBwcmVmZXIgcnVubmluZyB0aGUgdGFza3EgdGFzay4KKyAqIDMuICBPdGhlcndpc2UsIHRha2UgYSAobm9ybWFsKSB0YXNrIGZyb20gdGhlIHF1ZXVlLgorICoKKyAqIElmIHdlIGRvIGFsbCB0aGlzIGFuZCByZXR1cm4gcHQgPT0gTlVMTCBhdCB0aGUgYm90dG9tIG9mIHRoaXMgcm91dGluZSwKKyAqIHRoaXMgbWVhbnMgdGhlcmUgYXJlIG5vIG1vcmUgdGFza3MgdG8gZXhlY3V0ZSAoZXhjZXB0IHBvc3NpYmx5IGZvcgorICogVFFGX0lTX0xBU1RQUklWQVRFKS4KKyAqLworCitzdGF0aWMga21wY190aHVua190ICoKK19fa21wX2ZpbmRfdGFza19pbl9xdWV1ZSAoa21wX2ludDMyIGdsb2JhbF90aWQsIGttcGNfdGFza19xdWV1ZV90ICpxdWV1ZSkKK3sKKyAgICBrbXBjX3RodW5rX3QgKnB0ICA9IE5VTEw7CisgICAgaW50ICAgICAgICAgICB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKCBnbG9iYWxfdGlkICk7CisKKyAgICAvKiBUbyBwcmV2ZW50IGRlYWRsb2NrIGZyb20gdHFfcXVldWVfbGNrIGlmIHF1ZXVlIGFscmVhZHkgZGVhbGxvY2F0ZWQgKi8KKyAgICBpZiAoICEocXVldWUtPnRxX2ZsYWdzICYgVFFGX0RFQUxMT0NBVEVEKSApIHsKKworICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJiBxdWV1ZS0+dHFfcXVldWVfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICAvKiBDaGVjayBhZ2FpbiB0byBhdm9pZCByYWNlIGluIF9fa21wY19lbmRfdGFza3EoKSAqLworICAgICAgICBpZiAoICEocXVldWUtPnRxX2ZsYWdzICYgVFFGX0RFQUxMT0NBVEVEKSApIHsKKworICAgICAgICAgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgZmluZSB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwICovCisKKyAgICAgICAgICAgIGlmICgocXVldWUtPnRxX3Rhc2txX3Nsb3QgIT0gTlVMTCkgJiYgKHF1ZXVlLT50cV9uZnVsbCA8PSBxdWV1ZS0+dHFfaGl3YXQpKSB7CisgICAgICAgICAgICAgICAgLyogaWYgdGhlcmUncyBlbm91Z2ggcm9vbSBpbiB0aGUgcXVldWUgYW5kIHRoZSBkaXNwYXRjaGVyICovCisgICAgICAgICAgICAgICAgLyogKHRhc2txIHRhc2spIGlzIGF2YWlsYWJsZSwgc2NoZWR1bGUgbW9yZSB0YXNrcyAgICAgICAgICovCisgICAgICAgICAgICAgICAgcHQgPSAoa21wY190aHVua190ICopIHF1ZXVlLT50cV90YXNrcV9zbG90OworICAgICAgICAgICAgICAgIHF1ZXVlLT50cV90YXNrcV9zbG90ID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHF1ZXVlLT50cV9uZnVsbCA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgICBxdWV1ZS0+dHFfdGhfdGh1bmtzW3RpZF0uYWlfZGF0YSA+PSBfX0tNUF9UQVNLUV9USFVOS1NfUEVSX1RIKSB7CisgICAgICAgICAgICAgICAgLyogZG8gbm90aGluZyBpZiBubyB0aHVua3MgYXZhaWxhYmxlIG9yIHRoaXMgdGhyZWFkIGNhbid0ICovCisgICAgICAgICAgICAgICAgLyogcnVuIGFueSBiZWNhdXNlIGl0IGFscmVhZHkgaXMgZXhlY3V0aW5nIHRvbyBtYW55ICAgICAgICovCisKKyAgICAgICAgICAgICAgICBwdCA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChxdWV1ZS0+dHFfbmZ1bGwgPiAxKSB7CisgICAgICAgICAgICAgICAgLyogIGFsd2F5cyBzYWZlIHRvIHNjaGVkdWxlIGEgdGFzayBldmVuIGlmIFRRRl9JU19MQVNUUFJJVkFURSAgKi8KKworICAgICAgICAgICAgICAgIHB0ID0gX19rbXBfZGVxdWV1ZV90YXNrIChnbG9iYWxfdGlkLCBxdWV1ZSwgVFJVRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICghKHF1ZXVlLT50cV9mbGFncyAmIFRRRl9JU19MQVNUUFJJVkFURSkpIHsKKyAgICAgICAgICAgICAgICAvKiAgb25lIHRoaW5nIGluIHF1ZXVlLCBhbHdheXMgc2FmZSB0byBzY2hlZHVsZSBpZiAhVFFGX0lTX0xBU1RQUklWQVRFICAqLworCisgICAgICAgICAgICAgICAgcHQgPSBfX2ttcF9kZXF1ZXVlX3Rhc2sgKGdsb2JhbF90aWQsIHF1ZXVlLCBUUlVFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHF1ZXVlLT50cV9mbGFncyAmIFRRRl9JU19MQVNUX1RBU0spIHsKKyAgICAgICAgICAgICAgICAvKiBUUUZfSVNfTEFTVFBSSVZBVEUsIG9uZSB0aGluZyBpbiBxdWV1ZSwga21wY19lbmRfdGFza3FfdGFzaygpICAgKi8KKyAgICAgICAgICAgICAgICAvKiBoYXMgYmVlbiBydW4gc28gdGhpcyBpcyBsYXN0IHRhc2ssIHJ1biB3aXRoIFRRRl9JU19MQVNUX1RBU0sgc28gKi8KKyAgICAgICAgICAgICAgICAvKiBpbnN0cnVtZW50YXRpb24gZG9lcyBjb3B5LW91dC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgIHB0ID0gX19rbXBfZGVxdWV1ZV90YXNrIChnbG9iYWxfdGlkLCBxdWV1ZSwgVFJVRSk7CisgICAgICAgICAgICAgICAgcHQtPnRoX2ZsYWdzIHw9IFRRRl9JU19MQVNUX1RBU0s7ICAvKiBkb24ndCBuZWVkIHRlc3RfdGhlbl9vciBzaW5jZSBhbHJlYWR5IGxvY2tlZCAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogR0VIIC0gV2hhdCBoYXBwZW5zIGhlcmUgaWYgaXMgbGFzdHByaXZhdGUsIGJ1dCBub3QgbGFzdCB0YXNrPyAqLworICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBxdWV1ZS0+dHFfcXVldWVfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICB9CisKKyAgICByZXR1cm4gcHQ7Cit9CisKKy8qCisgKiBXYWxrIGEgdHJlZSBvZiBxdWV1ZXMgc3RhcnRpbmcgYXQgcXVldWUncyBmaXJzdCBjaGlsZAorICogYW5kIHJldHVybiBhIG5vbi1OVUxMIHRodW5rIGlmIG9uZSBjYW4gYmUgc2NoZWR1bGVkLgorICogTXVzdCBvbmx5IGJlIGNhbGxlZCB3aGVuIGluX3BhcmFsbGVsPVRSVUUKKyAqLworCitzdGF0aWMga21wY190aHVua190ICoKK19fa21wX2ZpbmRfdGFza19pbl9kZXNjZW5kYW50X3F1ZXVlIChrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190YXNrX3F1ZXVlX3QgKmN1cnJfcXVldWUpCit7CisgICAga21wY190aHVua190ICpwdCA9IE5VTEw7CisgICAga21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlID0gY3Vycl9xdWV1ZTsKKworICAgIGlmIChjdXJyX3F1ZXVlLT50cV9maXJzdF9jaGlsZCAhPSBOVUxMKSB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIGN1cnJfcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworCisgICAgICAgIHF1ZXVlID0gKGttcGNfdGFza19xdWV1ZV90ICopIGN1cnJfcXVldWUtPnRxX2ZpcnN0X2NoaWxkOworICAgICAgICBpZiAocXVldWUgPT0gTlVMTCkgeworICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgY3Vycl9xdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAocXVldWUgIT0gTlVMTCkgIHsKKyAgICAgICAgICAgIGludCBjdDsKKyAgICAgICAgICAgIGttcGNfdGFza19xdWV1ZV90ICpuZXh0OworCisgICAgICAgICAgICBjdD0gKysocXVldWUtPnRxX3JlZl9jb3VudCk7CisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBjdXJyX3F1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgICAgICBLTVBfREVCVUdfUkVGX0NUUygoImxpbmUgJWQgZ3RpZCAlZDogUSAlcCBpbmMgJWRcbiIsCisgICAgICAgICAgICAgIF9fTElORV9fLCBnbG9iYWxfdGlkLCBxdWV1ZSwgY3QpKTsKKworICAgICAgICAgICAgcHQgPSBfX2ttcF9maW5kX3Rhc2tfaW5fcXVldWUgKGdsb2JhbF90aWQsIHF1ZXVlKTsKKworICAgICAgICAgICAgaWYgKHB0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpbnQgY3Q7CisKKyAgICAgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJiBjdXJyX3F1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgZmluZSB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwICovCisKKyAgICAgICAgICAgICAgICBjdCA9IC0tKHF1ZXVlLT50cV9yZWZfY291bnQpOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19SRUZfQ1RTKCgibGluZSAlZCBndGlkICVkOiBRICVwIGRlYyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIF9fTElORV9fLCBnbG9iYWxfdGlkLCBxdWV1ZSwgY3QpKTsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBxdWV1ZS0+dHFfcmVmX2NvdW50ID49IDAgKTsKKworICAgICAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIGN1cnJfcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBwdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogYWx0aG91Z2ggcmVmZXJlbmNlIGNvdW50IHN0YXlzIGFjdGl2ZSBkdXJpbmcgZGVzY2VuZGFudCB3YWxrLCBzaG91bGRuJ3QgbWF0dGVyICAqLworICAgICAgICAgICAgLyogc2luY2UgaWYgY2hpbGRyZW4gc3RpbGwgZXhpc3QsIHJlZmVyZW5jZSBjb3VudHMgYXJlbid0IGJlaW5nIG1vbml0b3JlZCBhbnl3YXkgICAqLworCisgICAgICAgICAgICBwdCA9IF9fa21wX2ZpbmRfdGFza19pbl9kZXNjZW5kYW50X3F1ZXVlIChnbG9iYWxfdGlkLCBxdWV1ZSk7CisKKyAgICAgICAgICAgIGlmIChwdCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaW50IGN0OworCisgICAgICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCYgY3Vycl9xdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICAgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworCisgICAgICAgICAgICAgICAgY3QgPSAtLShxdWV1ZS0+dHFfcmVmX2NvdW50KTsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfUkVGX0NUUygoImxpbmUgJWQgZ3RpZCAlZDogUSAlcCBkZWMgJWRcbiIsCisgICAgICAgICAgICAgICAgICBfX0xJTkVfXywgZ2xvYmFsX3RpZCwgcXVldWUsIGN0KSk7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggY3QgPj0gMCApOworCisgICAgICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgY3Vycl9xdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHB0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJiBjdXJyX3F1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworCisgICAgICAgICAgICBuZXh0ID0gcXVldWUtPnRxX25leHRfY2hpbGQ7CisKKyAgICAgICAgICAgIGN0ID0gLS0ocXVldWUtPnRxX3JlZl9jb3VudCk7CisgICAgICAgICAgICBLTVBfREVCVUdfUkVGX0NUUygoImxpbmUgJWQgZ3RpZCAlZDogUSAlcCBkZWMgJWRcbiIsCisgICAgICAgICAgICAgIF9fTElORV9fLCBnbG9iYWxfdGlkLCBxdWV1ZSwgY3QpKTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGN0ID49IDAgKTsKKworICAgICAgICAgICAgcXVldWUgPSBuZXh0OworICAgICAgICB9CisKKyAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgY3Vycl9xdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworICAgIH0KKworICAgIHJldHVybiBwdDsKK30KKworLyoKKyAqIFdhbGsgdXAgdGhlIHRhc2txIHRyZWUgbG9va2luZyBmb3IgYSB0YXNrIHRvIGV4ZWN1dGUuCisgKiBJZiB3ZSBnZXQgdG8gdGhlIHJvb3QsIHNlYXJjaCB0aGUgdHJlZSBmb3IgYSBkZXNjZW5kZW50IHF1ZXVlIHRhc2suCisgKiBNdXN0IG9ubHkgYmUgY2FsbGVkIHdoZW4gaW5fcGFyYWxsZWw9VFJVRQorICovCisKK3N0YXRpYyBrbXBjX3RodW5rX3QgKgorX19rbXBfZmluZF90YXNrX2luX2FuY2VzdG9yX3F1ZXVlIChrbXBfdGFza3FfdCAqdHEsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3Rhc2tfcXVldWVfdCAqY3Vycl9xdWV1ZSkKK3sKKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAqcXVldWU7CisgICAga21wY190aHVua190ICAgICAgKnB0OworCisgICAgcHQgPSBOVUxMOworCisgICAgaWYgKGN1cnJfcXVldWUtPnRxLnRxX3BhcmVudCAhPSBOVUxMKSB7CisgICAgICAgIHF1ZXVlID0gY3Vycl9xdWV1ZS0+dHEudHFfcGFyZW50OworCisgICAgICAgIHdoaWxlIChxdWV1ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAocXVldWUtPnRxLnRxX3BhcmVudCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaW50IGN0OworICAgICAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICAgICAgICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKworICAgICAgICAgICAgICAgIGN0ID0gKysocXVldWUtPnRxX3JlZl9jb3VudCk7CisgICAgICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxLnRxX3BhcmVudC0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19SRUZfQ1RTKCgibGluZSAlZCBndGlkICVkOiBRICVwIGluYyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIF9fTElORV9fLCBnbG9iYWxfdGlkLCBxdWV1ZSwgY3QpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHQgPSBfX2ttcF9maW5kX3Rhc2tfaW5fcXVldWUgKGdsb2JhbF90aWQsIHF1ZXVlKTsKKyAgICAgICAgICAgIGlmIChwdCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKHF1ZXVlLT50cS50cV9wYXJlbnQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBpbnQgY3Q7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICAgICAgICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworCisgICAgICAgICAgICAgICAgICAgIGN0ID0gLS0ocXVldWUtPnRxX3JlZl9jb3VudCk7CisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19SRUZfQ1RTKCgibGluZSAlZCBndGlkICVkOiBRICVwIGRlYyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX0xJTkVfXywgZ2xvYmFsX3RpZCwgcXVldWUsIGN0KSk7CisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGN0ID49IDAgKTsKKworICAgICAgICAgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBxdWV1ZS0+dHEudHFfcGFyZW50LT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIHB0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocXVldWUtPnRxLnRxX3BhcmVudCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaW50IGN0OworICAgICAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICAgICAgICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKworICAgICAgICAgICAgICAgIGN0ID0gLS0ocXVldWUtPnRxX3JlZl9jb3VudCk7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX1JFRl9DVFMoKCJsaW5lICVkIGd0aWQgJWQ6IFEgJXAgZGVjICVkXG4iLAorICAgICAgICAgICAgICAgICAgX19MSU5FX18sIGdsb2JhbF90aWQsIHF1ZXVlLCBjdCkpOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGN0ID49IDAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHF1ZXVlID0gcXVldWUtPnRxLnRxX3BhcmVudDsKKworICAgICAgICAgICAgaWYgKHF1ZXVlICE9IE5VTEwpCisgICAgICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHQgPSBfX2ttcF9maW5kX3Rhc2tfaW5fZGVzY2VuZGFudF9xdWV1ZSggZ2xvYmFsX3RpZCwgdHEtPnRxX3Jvb3QgKTsKKworICAgIHJldHVybiBwdDsKK30KKworc3RhdGljIGludAorX19rbXBfdGFza3FfdGFza3NfZmluaXNoZWQgKGttcGNfdGFza19xdWV1ZV90ICpxdWV1ZSkKK3sKKyAgICBpbnQgaTsKKworICAgIC8qIEtNUF9NQigpOyAqLy8qIGlzIHRoaXMgcmVhbGx5IG5lY2Vzc2FyeT8gKi8KKworICAgIGZvciAoaT0wOyBpPHF1ZXVlLT50cV9ucHJvYzsgaSsrKSB7CisgICAgICAgIGlmIChxdWV1ZS0+dHFfdGhfdGh1bmtzW2ldLmFpX2RhdGEgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludAorX19rbXBfdGFza3FfaGFzX2FueV9jaGlsZHJlbiAoa21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlKQoreworICAgIHJldHVybiAocXVldWUtPnRxX2ZpcnN0X2NoaWxkICE9IE5VTEwpOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfcmVtb3ZlX3F1ZXVlX2Zyb21fdHJlZSgga21wX3Rhc2txX3QgKnRxLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlLCBpbnQgaW5fcGFyYWxsZWwgKQoreworI2lmZGVmIEtNUF9ERUJVRworICAgIGttcF9pbnQzMiAgICAgaTsKKyAgICBrbXBjX3RodW5rX3QgKnRodW5rOworI2VuZGlmCisKKyAgICBLRl9UUkFDRSg1MCwgKCJCZWZvcmUgRGVsZXRpb24gb2YgVGFza1EgYXQgJXAgb24gKCVkKTpcbiIsIHF1ZXVlLCBnbG9iYWxfdGlkKSk7CisgICAgS0ZfRFVNUCg1MCwgX19rbXBfZHVtcF90YXNrX3F1ZXVlKCB0cSwgcXVldWUsIGdsb2JhbF90aWQgKSk7CisKKyAgICAvKiAgc3ViLXF1ZXVlIGluIGEgcmVjdXJzaW9uLCBub3QgdGhlIHJvb3QgdGFzayBxdWV1ZSAgKi8KKyAgICBLTVBfREVCVUdfQVNTRVJUIChxdWV1ZS0+dHEudHFfcGFyZW50ICE9IE5VTEwpOworCisgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworICAgIH0KKworICAgIEtNUF9ERUJVR19BU1NFUlQgKHF1ZXVlLT50cV9maXJzdF9jaGlsZCA9PSBOVUxMKTsKKworICAgIC8qICB1bmxpbmsgcXVldWUgZnJvbSBpdHMgc2libGluZ3MgaWYgYW55IGF0IHRoaXMgbGV2ZWwgICovCisgICAgaWYgKHF1ZXVlLT50cV9wcmV2X2NoaWxkICE9IE5VTEwpCisgICAgICAgIHF1ZXVlLT50cV9wcmV2X2NoaWxkLT50cV9uZXh0X2NoaWxkID0gcXVldWUtPnRxX25leHRfY2hpbGQ7CisgICAgaWYgKHF1ZXVlLT50cV9uZXh0X2NoaWxkICE9IE5VTEwpCisgICAgICAgIHF1ZXVlLT50cV9uZXh0X2NoaWxkLT50cV9wcmV2X2NoaWxkID0gcXVldWUtPnRxX3ByZXZfY2hpbGQ7CisgICAgaWYgKHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2ZpcnN0X2NoaWxkID09IHF1ZXVlKQorICAgICAgICBxdWV1ZS0+dHEudHFfcGFyZW50LT50cV9maXJzdF9jaGlsZCA9IHF1ZXVlLT50cV9uZXh0X2NoaWxkOworCisgICAgcXVldWUtPnRxX3ByZXZfY2hpbGQgPSBOVUxMOworICAgIHF1ZXVlLT50cV9uZXh0X2NoaWxkID0gTlVMTDsKKworICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICBrbXBfdWludDMyIHNwaW5zOworCisgICAgICAgIEtNUF9ERUJVR19SRUZfQ1RTKCgibGluZSAlZCBndGlkICVkOiBRICVwIHdhaXRpbmcgZm9yIHJlZl9jb3VudCBvZiAlZCB0byByZWFjaCAxXG4iLAorICAgICAgICAgIF9fTElORV9fLCBnbG9iYWxfdGlkLCBxdWV1ZSwgcXVldWUtPnRxX3JlZl9jb3VudCkpOworCisgICAgICAgIC8qIHdhaXQgdW50aWwgYWxsIG90aGVyIHRocmVhZHMgaGF2ZSBzdG9wcGVkIGFjY2Vzc2luZyB0aGlzIHF1ZXVlICovCisgICAgICAgIHdoaWxlIChxdWV1ZS0+dHFfcmVmX2NvdW50ID4gMSkgeworICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxLnRxX3BhcmVudC0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICBLTVBfV0FJVF9ZSUVMRCgodm9sYXRpbGUga21wX3VpbnQzMiopJnF1ZXVlLT50cV9yZWZfY291bnQsIDEsIEtNUF9MRSwgTlVMTCk7CisKKyAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICAgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgZmluZSB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwICovCisgICAgICAgIH0KKworICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBxdWV1ZS0+dHEudHFfcGFyZW50LT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgfQorCisgICAgS01QX0RFQlVHX1JFRl9DVFMoKCJsaW5lICVkIGd0aWQgJWQ6IFEgJXAgZnJlZWluZyBxdWV1ZVxuIiwKKyAgICAgIF9fTElORV9fLCBnbG9iYWxfdGlkLCBxdWV1ZSkpOworCisjaWZkZWYgS01QX0RFQlVHCisgICAgS01QX0RFQlVHX0FTU0VSVChxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfQUxMX1RBU0tTX1FVRVVFRCk7CisgICAgS01QX0RFQlVHX0FTU0VSVChxdWV1ZS0+dHFfbmZ1bGwgPT0gMCk7CisKKyAgICBmb3IgKGk9MDsgaTxxdWV1ZS0+dHFfbnByb2M7IGkrKykgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHF1ZXVlLT50cV90aF90aHVua3NbaV0uYWlfZGF0YSA9PSAwKTsKKyAgICB9CisKKyAgICBpID0gMDsKKyAgICBmb3IgKHRodW5rPXF1ZXVlLT50cV9mcmVlX3RodW5rczsgdGh1bmsgIT0gTlVMTDsgdGh1bms9dGh1bmstPnRoLnRoX25leHRfZnJlZSkKKyAgICAgICAgKytpOworCisgICAgS01QX0FTU0VSVCAoaSA9PSBxdWV1ZS0+dHFfbnNsb3RzICsgKHF1ZXVlLT50cV9ucHJvYyAqIF9fS01QX1RBU0tRX1RIVU5LU19QRVJfVEgpKTsKKyNlbmRpZgorCisgICAgLyogIHJlbGVhc2Ugc3RvcmFnZSBmb3IgcXVldWUgZW50cnkgICovCisgICAgX19rbXBfZnJlZV90YXNrcSAoIHRxLCBxdWV1ZSwgVFJVRSwgZ2xvYmFsX3RpZCApOworCisgICAgS0ZfVFJBQ0UoNTAsICgiQWZ0ZXIgRGVsZXRpb24gb2YgVGFza1EgYXQgJXAgb24gKCVkKTpcbiIsIHF1ZXVlLCBnbG9iYWxfdGlkKSk7CisgICAgS0ZfRFVNUCg1MCwgX19rbXBfZHVtcF90YXNrX3F1ZXVlX3RyZWUoIHRxLCB0cS0+dHFfcm9vdCwgZ2xvYmFsX3RpZCApKTsKK30KKworLyoKKyAqIFN0YXJ0aW5nIGZyb20gaW5kaWNhdGVkIHF1ZXVlLCBwcm9jZWVkIGRvd253YXJkIHRocm91Z2ggdHJlZSBhbmQKKyAqIHJlbW92ZSBhbGwgdGFza3FzIHdoaWNoIGFyZSBmaW5pc2hlZCwgYnV0IG9ubHkgZ28gZG93biB0byB0YXNrcXMKKyAqIHdoaWNoIGhhdmUgdGhlICJub3dhaXQiIGNsYXVzZSBwcmVzZW50LiAgQXNzdW1lIHRoaXMgaXMgb25seSBjYWxsZWQKKyAqIHdoZW4gaW5fcGFyYWxsZWw9VFJVRS4KKyAqLworCitzdGF0aWMgdm9pZAorX19rbXBfZmluZF9hbmRfcmVtb3ZlX2ZpbmlzaGVkX2NoaWxkX3Rhc2txKCBrbXBfdGFza3FfdCAqdHEsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3Rhc2tfcXVldWVfdCAqY3Vycl9xdWV1ZSApCit7CisgICAga21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlID0gY3Vycl9xdWV1ZTsKKworICAgIGlmIChjdXJyX3F1ZXVlLT50cV9maXJzdF9jaGlsZCAhPSBOVUxMKSB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIGN1cnJfcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworCisgICAgICAgIHF1ZXVlID0gKGttcGNfdGFza19xdWV1ZV90ICopIGN1cnJfcXVldWUtPnRxX2ZpcnN0X2NoaWxkOworICAgICAgICBpZiAocXVldWUgIT0gTlVMTCkgeworICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgY3Vycl9xdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKHF1ZXVlICE9IE5VTEwpICB7CisgICAgICAgICAgICBrbXBjX3Rhc2tfcXVldWVfdCAqbmV4dDsKKyAgICAgICAgICAgIGludCBjdCA9ICsrKHF1ZXVlLT50cV9yZWZfY291bnQpOworICAgICAgICAgICAgS01QX0RFQlVHX1JFRl9DVFMoKCJsaW5lICVkIGd0aWQgJWQ6IFEgJXAgaW5jICVkXG4iLAorICAgICAgICAgICAgICBfX0xJTkVfXywgZ2xvYmFsX3RpZCwgcXVldWUsIGN0KSk7CisKKworICAgICAgICAgICAgLyogYWx0aG91Z2ggcmVmZXJlbmNlIGNvdW50IHN0YXlzIGFjdGl2ZSBkdXJpbmcgZGVzY2VuZGFudCB3YWxrLCAqLworICAgICAgICAgICAgLyogc2hvdWxkbid0IG1hdHRlciBzaW5jZSBpZiBjaGlsZHJlbiBzdGlsbCBleGlzdCwgcmVmZXJlbmNlICAgICAqLworICAgICAgICAgICAgLyogY291bnRzIGFyZW4ndCBiZWluZyBtb25pdG9yZWQgYW55d2F5ICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICBpZiAocXVldWUtPnRxX2ZsYWdzICYgVFFGX0lTX05PV0FJVCkgeworICAgICAgICAgICAgICAgIF9fa21wX2ZpbmRfYW5kX3JlbW92ZV9maW5pc2hlZF9jaGlsZF90YXNrcSAoIHRxLCBnbG9iYWxfdGlkLCBxdWV1ZSApOworCisgICAgICAgICAgICAgICAgaWYgKChxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfQUxMX1RBU0tTX1FVRVVFRCkgJiYgKHF1ZXVlLT50cV9uZnVsbCA9PSAwKSAmJgorICAgICAgICAgICAgICAgICAgICBfX2ttcF90YXNrcV90YXNrc19maW5pc2hlZChxdWV1ZSkgJiYgISBfX2ttcF90YXNrcV9oYXNfYW55X2NoaWxkcmVuKHF1ZXVlKSkgeworCisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICBPbmx5IHJlbW92ZSB0aGlzIGlmIHdlIGhhdmUgbm90IGFscmVhZHkgbWFya2VkIGl0IGZvciBkZWFsbG9jYXRpb24uCisgICAgICAgICAgICAgICAgICAgICBUaGlzIHNob3VsZCBwcmV2ZW50IG11bHRpcGxlIHRocmVhZHMgZnJvbSB0cnlpbmcgdG8gZnJlZSB0aGlzLgorICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgICAgICBpZiAoIF9fa21wX3Rlc3RfbG9jaygmIHF1ZXVlLT50cV9xdWV1ZV9sY2ssIGdsb2JhbF90aWQpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhKHF1ZXVlLT50cV9mbGFncyAmIFRRRl9ERUFMTE9DQVRFRCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUtPnRxX2ZsYWdzIHw9IFRRRl9ERUFMTE9DQVRFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBxdWV1ZS0+dHFfcXVldWVfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3JlbW92ZV9xdWV1ZV9mcm9tX3RyZWUoIHRxLCBnbG9iYWxfdGlkLCBxdWV1ZSwgVFJVRSApOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2FuJ3QgZG8gYW55IG1vcmUgaGVyZSBzaW5jZSBjYW4ndCBiZSBzdXJlIHdoZXJlIHNpYmxpbmcgcXVldWUgaXMgc28ganVzdCBleGl0IHRoaXMgbGV2ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBxdWV1ZS0+dHFfcXVldWVfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvKiBvdGhlcndpc2UsIGp1c3QgZmFsbCB0aHJvdWdoIGFuZCBkZWNyZW1lbnQgcmVmZXJlbmNlIGNvdW50ICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJiBjdXJyX3F1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworCisgICAgICAgICAgICBuZXh0ID0gcXVldWUtPnRxX25leHRfY2hpbGQ7CisKKyAgICAgICAgICAgIGN0ID0gLS0ocXVldWUtPnRxX3JlZl9jb3VudCk7CisgICAgICAgICAgICBLTVBfREVCVUdfUkVGX0NUUygoImxpbmUgJWQgZ3RpZCAlZDogUSAlcCBkZWMgJWRcbiIsCisgICAgICAgICAgICAgIF9fTElORV9fLCBnbG9iYWxfdGlkLCBxdWV1ZSwgY3QpKTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGN0ID49IDAgKTsKKworICAgICAgICAgICAgcXVldWUgPSBuZXh0OworICAgICAgICB9CisKKyAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgY3Vycl9xdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworICAgIH0KK30KKworLyoKKyAqIFN0YXJ0aW5nIGZyb20gaW5kaWNhdGVkIHF1ZXVlLCBwcm9jZWVkIGRvd253YXJkIHRocm91Z2ggdHJlZSBhbmQKKyAqIHJlbW92ZSBhbGwgdGFza3EncyBhc3N1bWluZyBhbGwgYXJlIGZpbmlzaGVkIGFuZAorICogYXNzdW1pbmcgTk8gb3RoZXIgdGhyZWFkcyBhcmUgZXhlY3V0aW5nIGF0IHRoaXMgcG9pbnQuCisgKi8KKworc3RhdGljIHZvaWQKK19fa21wX3JlbW92ZV9hbGxfY2hpbGRfdGFza3EoIGttcF90YXNrcV90ICp0cSwga21wX2ludDMyIGdsb2JhbF90aWQsIGttcGNfdGFza19xdWV1ZV90ICpxdWV1ZSApCit7CisgICAga21wY190YXNrX3F1ZXVlX3QgKm5leHRfY2hpbGQ7CisKKyAgICBxdWV1ZSA9IChrbXBjX3Rhc2tfcXVldWVfdCAqKSBxdWV1ZS0+dHFfZmlyc3RfY2hpbGQ7CisKKyAgICB3aGlsZSAocXVldWUgIT0gTlVMTCkgIHsKKyAgICAgICAgX19rbXBfcmVtb3ZlX2FsbF9jaGlsZF90YXNrcSAoIHRxLCBnbG9iYWxfdGlkLCBxdWV1ZSApOworCisgICAgICAgIG5leHRfY2hpbGQgPSBxdWV1ZS0+dHFfbmV4dF9jaGlsZDsKKyAgICAgICAgcXVldWUtPnRxX2ZsYWdzIHw9IFRRRl9ERUFMTE9DQVRFRDsKKyAgICAgICAgX19rbXBfcmVtb3ZlX3F1ZXVlX2Zyb21fdHJlZSAoIHRxLCBnbG9iYWxfdGlkLCBxdWV1ZSwgRkFMU0UgKTsKKyAgICAgICAgcXVldWUgPSBuZXh0X2NoaWxkOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK19fa21wX2V4ZWN1dGVfdGFza19mcm9tX3F1ZXVlKCBrbXBfdGFza3FfdCAqdHEsIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcGNfdGh1bmtfdCAqdGh1bmssIGludCBpbl9wYXJhbGxlbCApCit7CisgICAga21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlID0gdGh1bmstPnRoLnRoX3NoYXJlZHMtPnN2X3F1ZXVlOworICAgIGttcF9pbnQzMiAgICAgICAgICB0aWQgICA9IF9fa21wX3RpZF9mcm9tX2d0aWQoIGdsb2JhbF90aWQgKTsKKworICAgIEtGX1RSQUNFKDEwMCwgKCJBZnRlciBkZXF1ZXVlaW5nIHRoaXMgVGFzayBvbiAoJWQpOlxuIiwgZ2xvYmFsX3RpZCkpOworICAgIEtGX0RVTVAoMTAwLCBfX2ttcF9kdW1wX3RodW5rKCB0cSwgdGh1bmssIGdsb2JhbF90aWQgKSk7CisgICAgS0ZfVFJBQ0UoMTAwLCAoIlRhc2sgUXVldWU6ICVwIGxvb2tzIGxpa2UgdGhpcyAoJWQpOlxuIiwgcXVldWUsIGdsb2JhbF90aWQpKTsKKyAgICBLRl9EVU1QKDEwMCwgX19rbXBfZHVtcF90YXNrX3F1ZXVlKCB0cSwgcXVldWUsIGdsb2JhbF90aWQgKSk7CisKKyAgICAvKgorICAgICAqIEZvciB0aGUgdGFza3EgdGFzaywgdGhlIGN1cnJfdGh1bmsgcHVzaGVzIGFuZCBwb3AgcGFpcnMgYXJlIHNldCB1cCBhcyBmb2xsb3dzOgorICAgICAqCisgICAgICogaGFwcGVucyBleGFjdGx5IG9uY2U6CisgICAgICogMSkgX19rbXBjX3Rhc2txICAgICAgICAgICAgIDogcHVzaCAoaWYgcmV0dXJuaW5nIHRodW5rIG9ubHkpCisgICAgICogNCkgX19rbXBjX2VuZF90YXNrcV90YXNrICAgIDogcG9wCisgICAgICoKKyAgICAgKiBvcHRpb25hbGx5IGhhcHBlbnMgKmVhY2gqIHRpbWUgdGFza3EgdGFzayBpcyBkZXF1ZXVlZC9lbnF1ZXVlZDoKKyAgICAgKiAyKSBfX2ttcGNfdGFza3FfdGFzayAgICAgICAgOiBwb3AKKyAgICAgKiAzKSBfX2ttcF9leGVjdXRlX3Rhc2tfZnJvbV9xdWV1ZSAgOiBwdXNoCisgICAgICoKKyAgICAgKiBleGVjdXRpb24gb3JkZXJpbmc6ICAxLCgyLDMpKiw0CisgICAgICovCisKKyAgICBpZiAoISh0aHVuay0+dGhfZmxhZ3MgJiBUUUZfVEFTS1FfVEFTSykpIHsKKyAgICAgICAga21wX2ludDMyIGluZGV4ID0gKHF1ZXVlID09IHRxLT50cV9yb290KSA/IHRpZCA6IDA7CisgICAgICAgIHRodW5rLT50aC50aF9zaGFyZWRzID0gKGttcGNfc2hhcmVkX3ZhcnNfdCAqKSBxdWV1ZS0+dHFfc2hhcmVkc1tpbmRleF0uYWlfZGF0YTsKKworICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgIF9fa21wX3B1c2hfd29ya3NoYXJlKCBnbG9iYWxfdGlkLAorICAgICAgICAgICAgICAgICAgICAocXVldWUtPnRxX2ZsYWdzICYgVFFGX0lTX09SREVSRUQpID8gY3RfdGFza19vcmRlcmVkIDogY3RfdGFzaywKKyAgICAgICAgICAgICAgICAgICAgcXVldWUtPnRxX2xvYyApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApCisgICAgICAgICAgICBfX2ttcF9wdXNoX3dvcmtzaGFyZSggZ2xvYmFsX3RpZCwgY3RfdGFza3EsIHF1ZXVlLT50cV9sb2MgKTsKKyAgICB9CisKKyAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgdGh1bmstPnRoX2VuY2xfdGh1bmsgPSB0cS0+dHFfY3Vycl90aHVua1t0aWRdOworICAgICAgICB0cS0+dHFfY3Vycl90aHVua1t0aWRdID0gdGh1bms7CisKKyAgICAgICAgS0ZfRFVNUCggMjAwLCBfX2ttcF9kdW1wX3RodW5rX3N0YWNrKCB0cS0+dHFfY3Vycl90aHVua1t0aWRdLCBnbG9iYWxfdGlkICkpOworICAgIH0KKworICAgIEtGX1RSQUNFKCA1MCwgKCJCZWdpbiBFeGVjdXRpbmcgVGh1bmsgJXAgZnJvbSBxdWV1ZSAlcCBvbiAoJWQpXG4iLCB0aHVuaywgcXVldWUsIGdsb2JhbF90aWQpKTsKKyAgICB0aHVuay0+dGhfdGFzayAoZ2xvYmFsX3RpZCwgdGh1bmspOworICAgIEtGX1RSQUNFKCA1MCwgKCJFbmQgRXhlY3V0aW5nIFRodW5rICVwIGZyb20gcXVldWUgJXAgb24gKCVkKVxuIiwgdGh1bmssIHF1ZXVlLCBnbG9iYWxfdGlkKSk7CisKKyAgICBpZiAoISh0aHVuay0+dGhfZmxhZ3MgJiBUUUZfVEFTS1FfVEFTSykpIHsKKyAgICAgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICAgICAgX19rbXBfcG9wX3dvcmtzaGFyZSggZ2xvYmFsX3RpZCwgKHF1ZXVlLT50cV9mbGFncyAmIFRRRl9JU19PUkRFUkVEKSA/IGN0X3Rhc2tfb3JkZXJlZCA6IGN0X3Rhc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZS0+dHFfbG9jICk7CisKKyAgICAgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgICAgICB0cS0+dHFfY3Vycl90aHVua1t0aWRdID0gdGh1bmstPnRoX2VuY2xfdGh1bms7CisgICAgICAgICAgICB0aHVuay0+dGhfZW5jbF90aHVuayA9IE5VTEw7CisgICAgICAgICAgICBLRl9EVU1QKCAyMDAsIF9fa21wX2R1bXBfdGh1bmtfc3RhY2soIHRxLT50cV9jdXJyX3RodW5rW3RpZF0sIGdsb2JhbF90aWQgKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHRodW5rLT50aF9mbGFncyAmIFRRRl9JU19PUkRFUkVEKSAmJiBpbl9wYXJhbGxlbCkgeworICAgICAgICAgICAgX19rbXBfdGFza3FfY2hlY2tfb3JkZXJlZChnbG9iYWxfdGlkLCB0aHVuayk7CisgICAgICAgIH0KKworICAgICAgICBfX2ttcF9mcmVlX3RodW5rIChxdWV1ZSwgdGh1bmssIGluX3BhcmFsbGVsLCBnbG9iYWxfdGlkKTsKKworICAgICAgICBLRl9UUkFDRSgxMDAsICgiVCMlZCBBZnRlciBmcmVlaW5nIHRodW5rOiAlcCwgVGFza1EgbG9va3MgbGlrZSB0aGlzOlxuIiwgZ2xvYmFsX3RpZCwgdGh1bmspKTsKKyAgICAgICAgS0ZfRFVNUCgxMDAsIF9fa21wX2R1bXBfdGFza19xdWV1ZSggdHEsIHF1ZXVlLCBnbG9iYWxfdGlkICkpOworCisgICAgICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICAgICAgS01QX01CKCk7ICAgLyogbmVlZGVkIHNvIHRodW5rIHB1dCBvbiBmcmVlIGxpc3QgYmVmb3JlIG91dHN0YW5kaW5nIHRodW5rIGNvdW50IGlzIGRlY3JlbWVudGVkICovCisKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQocXVldWUtPnRxX3RoX3RodW5rc1t0aWRdLmFpX2RhdGEgPj0gMSk7CisKKyAgICAgICAgICAgIEtGX1RSQUNFKCAyMDAsICgiX19rbXBfZXhlY3V0ZV90YXNrX2Zyb21fcXVldWU6IFQjJWQgaGFzICVkIHRodW5rcyBpbiBxdWV1ZSAlcFxuIiwKKyAgICAgICAgICAgICAgICBnbG9iYWxfdGlkLCBxdWV1ZS0+dHFfdGhfdGh1bmtzW3RpZF0uYWlfZGF0YS0xLCBxdWV1ZSkpOworCisgICAgICAgICAgICBxdWV1ZS0+dHFfdGhfdGh1bmtzW3RpZF0uYWlfZGF0YS0tOworCisgICAgICAgICAgICAvKiBLTVBfTUIoKTsgKi8gICAgIC8qIGlzIE1CIHJlYWxseSBuZWNlc3NhcnkgPyAqLworICAgICAgICB9CisKKyAgICAgICAgaWYgKHF1ZXVlLT50cS50cV9wYXJlbnQgIT0gTlVMTCAmJiBpbl9wYXJhbGxlbCkgeworICAgICAgICAgICAgaW50IGN0OworICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCYgcXVldWUtPnRxLnRxX3BhcmVudC0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworICAgICAgICAgICAgY3QgPSAtLShxdWV1ZS0+dHFfcmVmX2NvdW50KTsKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19SRUZfQ1RTKCgibGluZSAlZCBndGlkICVkOiBRICVwIGRlYyAlZFxuIiwKKyAgICAgICAgICAgICAgX19MSU5FX18sIGdsb2JhbF90aWQsIHF1ZXVlLCBjdCkpOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggY3QgPj0gMCApOworICAgICAgICB9CisgICAgfQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogc3RhcnRzIGEgdGFza3E7IGNyZWF0ZXMgYW5kIHJldHVybnMgYSB0aHVuayBmb3IgdGhlIHRhc2txX3Rhc2sgICAgICAgICovCisvKiBhbHNvLCByZXR1cm5zIHBvaW50ZXIgdG8gc2hhcmVkIHZhcnMgZm9yIHRoaXMgdGhyZWFkIGluICJzaGFyZWRzIiBhcmcgKi8KKwora21wY190aHVua190ICoKK19fa21wY190YXNrcSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190YXNrX3QgdGFza3FfdGFzaywKKyAgICAgICAgICAgICAgc2l6ZV90IHNpemVvZl90aHVuaywgc2l6ZV90IHNpemVvZl9zaGFyZWRzLAorICAgICAgICAgICAgICBrbXBfaW50MzIgZmxhZ3MsIGttcGNfc2hhcmVkX3ZhcnNfdCAqKnNoYXJlZHMgKQoreworICAgIGludCAgICAgICAgICAgICAgICAgIGluX3BhcmFsbGVsOworICAgIGttcF9pbnQzMiAgICAgICAgICAgIG5zbG90cywgbnRodW5rcywgbnNoYXJlZHMsIG5wcm9jOworICAgIGttcGNfdGFza19xdWV1ZV90ICAgKm5ld19xdWV1ZSwgKmN1cnJfcXVldWU7CisgICAga21wY190aHVua190ICAgICAgICAqbmV3X3Rhc2txX3RodW5rOworICAgIGttcF9pbmZvX3QgICAgICAgICAgKnRoOworICAgIGttcF90ZWFtX3QgICAgICAgICAgKnRlYW07CisgICAga21wX3Rhc2txX3QgICAgICAgICAqdHE7CisgICAga21wX2ludDMyICAgICAgICAgICAgdGlkOworCisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY190YXNrcSBjYWxsZWQgKCVkKVxuIiwgZ2xvYmFsX3RpZCkpOworCisgICAgdGggPSBfX2ttcF90aHJlYWRzWyBnbG9iYWxfdGlkIF07CisgICAgdGVhbSA9IHRoIC0+IHRoLnRoX3RlYW07CisgICAgdHEgPSAmIHRlYW0gLT4gdC50X3Rhc2txOworICAgIG5wcm9jID0gdGVhbSAtPiB0LnRfbnByb2M7CisgICAgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ2xvYmFsX3RpZCApOworCisgICAgLyogZmluZCBvdXQgd2hldGhlciB0aGlzIGlzIGEgcGFyYWxsZWwgdGFza3Egb3Igc2VyaWFsaXplZCBvbmUuICovCisgICAgaW5fcGFyYWxsZWwgPSBpbl9wYXJhbGxlbF9jb250ZXh0KCB0ZWFtICk7CisKKyAgICBpZiggISB0cS0+dHFfcm9vdCApIHsKKyAgICAgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgICAgICAvKiBWZWN0b3IgT1JERVJFRCBTRUNUSU9OIHRvIHRhc2txIHZlcnNpb24gKi8KKyAgICAgICAgICAgIHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZGVvX2ZjbiA9IF9fa21wX3Rhc2txX2VvOworCisgICAgICAgICAgICAvKiBWZWN0b3IgT1JERVJFRCBTRUNUSU9OIHRvIHRhc2txIHZlcnNpb24gKi8KKyAgICAgICAgICAgIHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZHhvX2ZjbiA9IF9fa21wX3Rhc2txX3hvOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgICAgICAvKiBUaGlzIHNob3VsZG4ndCBiZSBhIGJhcnJpZXIgcmVnaW9uIGJvdW5kYXJ5LCBpdCB3aWxsIGNvbmZ1c2UgdGhlIHVzZXIuICovCisgICAgICAgICAgICAvKiBOZWVkIHRoZSBib3VuZGFyeSB0byBiZSBhdCB0aGUgZW5kIHRhc2txIGluc3RlYWQuICovCisgICAgICAgICAgICBpZiAoIF9fa21wX2JhcnJpZXIoIGJzX3BsYWluX2JhcnJpZXIsIGdsb2JhbF90aWQsIFRSVUUsIDAsIE5VTEwsIE5VTEwgKSkgeworICAgICAgICAgICAgICAgIC8qIENyZWF0aW5nIHRoZSBhY3RpdmUgcm9vdCBxdWV1ZSwgYW5kIHdlIGFyZSBub3QgdGhlIG1hc3RlciB0aHJlYWQuICovCisgICAgICAgICAgICAgICAgLyogVGhlIG1hc3RlciB0aHJlYWQgYmVsb3cgY3JlYXRlZCB0aGUgcXVldWUgYW5kIHRhc2tzIGhhdmUgYmVlbiAgICAgKi8KKyAgICAgICAgICAgICAgICAvKiBlbnF1ZXVlZCwgYW5kIHRoZSBtYXN0ZXIgdGhyZWFkIHJlbGVhc2VkIHRoaXMgYmFycmllci4gIFRoaXMgICAgICAqLworICAgICAgICAgICAgICAgIC8qIHdvcmtlciB0aHJlYWQgY2FuIG5vdyBwcm9jZWVkIGFuZCBleGVjdXRlIHRhc2tzLiAgU2VlIGFsc28gdGhlICAgICovCisgICAgICAgICAgICAgICAgLyogVFFGX1JFTEVBU0VfV09SS0VSUyB3aGljaCBpcyB1c2VkIHRvIGhhbmRsZSB0aGlzIGNhc2UuICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgICpzaGFyZWRzID0gKGttcGNfc2hhcmVkX3ZhcnNfdCAqKSB0cS0+dHFfcm9vdC0+dHFfc2hhcmVkc1t0aWRdLmFpX2RhdGE7CisKKyAgICAgICAgICAgICAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX3Rhc2txIHJldHVybiAoJWQpXG4iLCBnbG9iYWxfdGlkKSk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIG1hc3RlciB0aHJlYWQgb25seSBleGVjdXRlcyB0aGlzIGNvZGUgKi8KKworICAgICAgICBpZiggdHEtPnRxX2N1cnJfdGh1bmtfY2FwYWNpdHkgPCBucHJvYyApIHsKKyAgICAgICAgICAgIGludCBpOworCisgICAgICAgICAgICBpZih0cS0+dHFfY3Vycl90aHVuaykKKyAgICAgICAgICAgICAgICBfX2ttcF9mcmVlKHRxLT50cV9jdXJyX3RodW5rKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8qIG9ubHkgbmVlZCB0byBkbyB0aGlzIG9uY2UgYXQgb3V0ZXIgbGV2ZWwsIGkuZS4gd2hlbiB0cV9jdXJyX3RodW5rIGlzIHN0aWxsIE5VTEwgKi8KKyAgICAgICAgICAgICAgICBfX2ttcF9pbml0X2xvY2soICYgdHEtPnRxX2ZyZWVsaXN0X2xjayApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cS0+dHFfY3Vycl90aHVuayA9IChrbXBjX3RodW5rX3QgKiopIF9fa21wX2FsbG9jYXRlKCBucHJvYyAqIHNpemVvZihrbXBjX3RodW5rX3QgKikgKTsKKyAgICAgICAgICAgIHRxIC0+IHRxX2N1cnJfdGh1bmtfY2FwYWNpdHkgPSBucHJvYzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbl9wYXJhbGxlbCkKKyAgICAgICAgICAgIHRxLT50cV9nbG9iYWxfZmxhZ3MgPSBUUUZfUkVMRUFTRV9XT1JLRVJTOworICAgIH0KKworICAgIC8qIGRrcDogaW4gZnV0dXJlLCBpZiBmbGFncyAmIFRRRl9IRVVSSVNUSUNTLCB3aWxsIGNob29zZSBuc2xvdHMgYmFzZWQgKi8KKyAgICAvKiAgICAgIG9uIHNvbWUgaGV1cmlzdGljcyAoZS5nLiwgZGVwdGggb2YgcXVldWUgbmVzdGluZz8pLiAgICAgICAgICAgICovCisKKyAgICBuc2xvdHMgPSAoaW5fcGFyYWxsZWwpID8gKDIgKiBucHJvYykgOiAxOworCisgICAgLyogVGhlcmUgbXVzdCBiZSBucHJvYyAqIF9fS01QX1RBU0tRX1RIVU5LU19QRVJfVEggZXh0cmEgc2xvdHMgZm9yIHBlbmRpbmcgKi8KKyAgICAvKiBqb2JzIGJlaW5nIGV4ZWN1dGVkIGJ5IG90aGVyIHRocmVhZHMsIGFuZCBvbmUgZXh0cmEgZm9yIHRhc2txIHNsb3QgICAgICAgICAgKi8KKworICAgIG50aHVua3MgPSAoaW5fcGFyYWxsZWwpID8gKG5zbG90cyArIChucHJvYyAqIF9fS01QX1RBU0tRX1RIVU5LU19QRVJfVEgpICsgMSkgOiBuc2xvdHMgKyAyOworCisgICAgLyogT25seSB0aGUgcm9vdCB0YXNrcSBnZXRzIGEgcGVyLXRocmVhZCBhcnJheSBvZiBzaGFyZWRzLiAgICAgICAqLworICAgIC8qIFRoZSByZXN0IG9mIHRoZSB0YXNrcSdzIG9ubHkgZ2V0IG9uZSBjb3B5IG9mIHRoZSBzaGFyZWQgdmFycy4gKi8KKworICAgIG5zaGFyZWRzID0gKCAhdHEtPnRxX3Jvb3QgJiYgaW5fcGFyYWxsZWwpID8gbnByb2MgOiAxOworCisgICAgLyogIGNyZWF0ZSBvdmVyYWxsIHF1ZXVlIGRhdGEgc3RydWN0dXJlIGFuZCBpdHMgY29tcG9uZW50cyB0aGF0IHJlcXVpcmUgYWxsb2NhdGlvbiAqLworCisgICAgbmV3X3F1ZXVlID0gX19rbXBfYWxsb2NfdGFza3EgKCB0cSwgaW5fcGFyYWxsZWwsIG5zbG90cywgbnRodW5rcywgbnNoYXJlZHMsIG5wcm9jLAorICAgICAgICBzaXplb2ZfdGh1bmssIHNpemVvZl9zaGFyZWRzLCAmbmV3X3Rhc2txX3RodW5rLCBnbG9iYWxfdGlkICk7CisKKyAgICAvKiAgcmVzdCBvZiBuZXdfcXVldWUgaW5pdGlhbGl6YXRpb25zICAqLworCisgICAgbmV3X3F1ZXVlLT50cV9mbGFncyAgICAgICAgICAgPSBmbGFncyAmIFRRRl9JTlRFUkZBQ0VfRkxBR1M7CisKKyAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgbmV3X3F1ZXVlLT50cV90YXNrbnVtX3F1ZXVpbmcgID0gMDsKKyAgICAgICAgbmV3X3F1ZXVlLT50cV90YXNrbnVtX3NlcnZpbmcgID0gMDsKKyAgICAgICAgbmV3X3F1ZXVlLT50cV9mbGFncyAgICAgICAgICAgfD0gVFFGX1BBUkFMTEVMX0NPTlRFWFQ7CisgICAgfQorCisgICAgbmV3X3F1ZXVlLT50cV90YXNrcV9zbG90ICAgPSBOVUxMOworICAgIG5ld19xdWV1ZS0+dHFfbnNsb3RzICAgICAgID0gbnNsb3RzOworICAgIG5ld19xdWV1ZS0+dHFfaGl3YXQgICAgICAgID0gSElHSF9XQVRFUl9NQVJLIChuc2xvdHMpOworICAgIG5ld19xdWV1ZS0+dHFfbmZ1bGwgICAgICAgID0gMDsKKyAgICBuZXdfcXVldWUtPnRxX2hlYWQgICAgICAgICA9IDA7CisgICAgbmV3X3F1ZXVlLT50cV90YWlsICAgICAgICAgPSAwOworICAgIG5ld19xdWV1ZS0+dHFfbG9jICAgICAgICAgID0gbG9jOworCisgICAgaWYgKChuZXdfcXVldWUtPnRxX2ZsYWdzICYgVFFGX0lTX09SREVSRUQpICYmIGluX3BhcmFsbGVsKSB7CisgICAgICAgIC8qIHByZXBhcmUgdG8gc2VydmUgdGhlIGZpcnN0LXF1ZXVlZCB0YXNrJ3MgT1JERVJFRCBkaXJlY3RpdmUgKi8KKyAgICAgICAgbmV3X3F1ZXVlLT50cV90YXNrbnVtX3NlcnZpbmcgPSAxOworCisgICAgICAgIC8qIFZlY3RvciBPUkRFUkVEIFNFQ1RJT04gdG8gdGFza3EgdmVyc2lvbiAqLworICAgICAgICB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rlb19mY24gPSBfX2ttcF90YXNrcV9lbzsKKworICAgICAgICAvKiBWZWN0b3IgT1JERVJFRCBTRUNUSU9OIHRvIHRhc2txIHZlcnNpb24gKi8KKyAgICAgICAgdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9keG9fZmNuID0gX19rbXBfdGFza3FfeG87CisgICAgfQorCisgICAgLyogIGNyZWF0ZSBhIG5ldyB0aHVuayBmb3IgdGhlIHRhc2txX3Rhc2sgaW4gdGhlIG5ld19xdWV1ZSAgKi8KKyAgICAqc2hhcmVkcyA9IChrbXBjX3NoYXJlZF92YXJzX3QgKikgbmV3X3F1ZXVlLT50cV9zaGFyZWRzWzBdLmFpX2RhdGE7CisKKyAgICBuZXdfdGFza3FfdGh1bmstPnRoLnRoX3NoYXJlZHMgPSAqc2hhcmVkczsKKyAgICBuZXdfdGFza3FfdGh1bmstPnRoX3Rhc2sgICAgICAgPSB0YXNrcV90YXNrOworICAgIG5ld190YXNrcV90aHVuay0+dGhfZmxhZ3MgICAgICA9IG5ld19xdWV1ZS0+dHFfZmxhZ3MgfCBUUUZfVEFTS1FfVEFTSzsKKyAgICBuZXdfdGFza3FfdGh1bmstPnRoX3N0YXR1cyAgICAgPSAwOworCisgICAgS01QX0RFQlVHX0FTU0VSVCAobmV3X3Rhc2txX3RodW5rLT50aF9mbGFncyAmIFRRRl9UQVNLUV9UQVNLKTsKKworICAgIC8qIEtNUF9NQigpOyAqLyAvKiBtYWtlIHN1cmUgdGhlc2UgaW5pdHMgY29tcGxldGUgYmVmb3JlIHRocmVhZHMgc3RhcnQgdXNpbmcgdGhpcyBxdWV1ZSAobmVjZXNzYXJ5PykgKi8KKworICAgIC8qIGluc2VydCB0aGUgbmV3IHRhc2sgcXVldWUgaW50byB0aGUgdHJlZSwgYnV0IG9ubHkgYWZ0ZXIgYWxsIGZpZWxkcyBpbml0aWFsaXplZCAqLworCisgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgIGlmKCAhIHRxLT50cV9yb290ICkgeworICAgICAgICAgICAgbmV3X3F1ZXVlLT50cS50cV9wYXJlbnQgICA9IE5VTEw7CisgICAgICAgICAgICBuZXdfcXVldWUtPnRxX2ZpcnN0X2NoaWxkID0gTlVMTDsKKyAgICAgICAgICAgIG5ld19xdWV1ZS0+dHFfbmV4dF9jaGlsZCAgPSBOVUxMOworICAgICAgICAgICAgbmV3X3F1ZXVlLT50cV9wcmV2X2NoaWxkICA9IE5VTEw7CisgICAgICAgICAgICBuZXdfcXVldWUtPnRxX3JlZl9jb3VudCAgID0gMTsKKyAgICAgICAgICAgIHRxLT50cV9yb290ID0gbmV3X3F1ZXVlOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY3Vycl9xdWV1ZSA9IHRxLT50cV9jdXJyX3RodW5rW3RpZF0tPnRoLnRoX3NoYXJlZHMtPnN2X3F1ZXVlOworICAgICAgICAgICAgbmV3X3F1ZXVlLT50cS50cV9wYXJlbnQgICA9IGN1cnJfcXVldWU7CisgICAgICAgICAgICBuZXdfcXVldWUtPnRxX2ZpcnN0X2NoaWxkID0gTlVMTDsKKyAgICAgICAgICAgIG5ld19xdWV1ZS0+dHFfcHJldl9jaGlsZCAgPSBOVUxMOworICAgICAgICAgICAgbmV3X3F1ZXVlLT50cV9yZWZfY291bnQgICA9IDE7ICAgICAgLyogZm9yIHRoaXMgdGhlIHRocmVhZCB0aGF0IGJ1aWx0IHRoZSBxdWV1ZSAqLworCisgICAgICAgICAgICBLTVBfREVCVUdfUkVGX0NUUygoImxpbmUgJWQgZ3RpZCAlZDogUSAlcCBhbGxvYyAlZFxuIiwKKyAgICAgICAgICAgICAgX19MSU5FX18sIGdsb2JhbF90aWQsIG5ld19xdWV1ZSwgbmV3X3F1ZXVlLT50cV9yZWZfY291bnQpKTsKKworICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCYgY3Vycl9xdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKworICAgICAgICAgICAgbmV3X3F1ZXVlLT50cV9uZXh0X2NoaWxkID0gKHN0cnVjdCBrbXBjX3Rhc2tfcXVldWVfdCAqKSBjdXJyX3F1ZXVlLT50cV9maXJzdF9jaGlsZDsKKworICAgICAgICAgICAgaWYgKGN1cnJfcXVldWUtPnRxX2ZpcnN0X2NoaWxkICE9IE5VTEwpCisgICAgICAgICAgICAgICAgY3Vycl9xdWV1ZS0+dHFfZmlyc3RfY2hpbGQtPnRxX3ByZXZfY2hpbGQgPSBuZXdfcXVldWU7CisKKyAgICAgICAgICAgIGN1cnJfcXVldWUtPnRxX2ZpcnN0X2NoaWxkID0gbmV3X3F1ZXVlOworCisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBjdXJyX3F1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBzZXQgdXAgdGh1bmsgc3RhY2sgb25seSBhZnRlciBjb2RlIHRoYXQgZGV0ZXJtaW5lcyBjdXJyX3F1ZXVlIGFib3ZlICovCisgICAgICAgIG5ld190YXNrcV90aHVuay0+dGhfZW5jbF90aHVuayA9IHRxLT50cV9jdXJyX3RodW5rW3RpZF07CisgICAgICAgIHRxLT50cV9jdXJyX3RodW5rW3RpZF0gPSBuZXdfdGFza3FfdGh1bms7CisKKyAgICAgICAgS0ZfRFVNUCggMjAwLCBfX2ttcF9kdW1wX3RodW5rX3N0YWNrKCB0cS0+dHFfY3Vycl90aHVua1t0aWRdLCBnbG9iYWxfdGlkICkpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbmV3X3Rhc2txX3RodW5rLT50aF9lbmNsX3RodW5rID0gMDsKKyAgICAgICAgbmV3X3F1ZXVlLT50cS50cV9wYXJlbnQgICA9IE5VTEw7CisgICAgICAgIG5ld19xdWV1ZS0+dHFfZmlyc3RfY2hpbGQgPSBOVUxMOworICAgICAgICBuZXdfcXVldWUtPnRxX25leHRfY2hpbGQgID0gTlVMTDsKKyAgICAgICAgbmV3X3F1ZXVlLT50cV9wcmV2X2NoaWxkICA9IE5VTEw7CisgICAgICAgIG5ld19xdWV1ZS0+dHFfcmVmX2NvdW50ICAgPSAxOworICAgIH0KKworI2lmZGVmIEtNUF9ERUJVRworICAgIEtGX1RSQUNFKDE1MCwgKCJDcmVhdGluZyBUYXNrUSBUYXNrIG9uICglZCk6XG4iLCBnbG9iYWxfdGlkKSk7CisgICAgS0ZfRFVNUCgxNTAsIF9fa21wX2R1bXBfdGh1bmsoIHRxLCBuZXdfdGFza3FfdGh1bmssIGdsb2JhbF90aWQgKSk7CisKKyAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgS0ZfVFJBQ0UoMjUsICgiQWZ0ZXIgVGFza1EgYXQgJXAgQ3JlYXRpb24gb24gKCVkKTpcbiIsIG5ld19xdWV1ZSwgZ2xvYmFsX3RpZCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIEtGX1RSQUNFKDI1LCAoIkFmdGVyIFNlcmlhbCBUYXNrUSBhdCAlcCBDcmVhdGlvbiBvbiAoJWQpOlxuIiwgbmV3X3F1ZXVlLCBnbG9iYWxfdGlkKSk7CisgICAgfQorCisgICAgS0ZfRFVNUCgyNSwgX19rbXBfZHVtcF90YXNrX3F1ZXVlKCB0cSwgbmV3X3F1ZXVlLCBnbG9iYWxfdGlkICkpOworCisgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgIEtGX0RVTVAoNTAsIF9fa21wX2R1bXBfdGFza19xdWV1ZV90cmVlKCB0cSwgdHEtPnRxX3Jvb3QsIGdsb2JhbF90aWQgKSk7CisgICAgfQorI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wdXNoX3dvcmtzaGFyZSggZ2xvYmFsX3RpZCwgY3RfdGFza3EsIG5ld19xdWV1ZS0+dHFfbG9jICk7CisKKyAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX3Rhc2txIHJldHVybiAoJWQpXG4iLCBnbG9iYWxfdGlkKSk7CisKKyAgICByZXR1cm4gbmV3X3Rhc2txX3RodW5rOworfQorCisKKy8qICBlbmRzIGEgdGFza3E7IGxhc3QgdGhyZWFkIG91dCBkZXN0cm95cyB0aGUgcXVldWUgICovCisKK3ZvaWQKK19fa21wY19lbmRfdGFza3EoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190aHVua190ICp0YXNrcV90aHVuaykKK3sKKyNpZmRlZiBLTVBfREVCVUcKKyAgICBrbXBfaW50MzIgICAgICAgICAgIGk7CisjZW5kaWYKKyAgICBrbXBfdGFza3FfdCAgICAgICAgKnRxOworICAgIGludCAgICAgICAgICAgICAgICAgaW5fcGFyYWxsZWw7CisgICAga21wX2luZm9fdCAgICAgICAgICp0aDsKKyAgICBrbXBfaW50MzIgICAgICAgICAgIGlzX291dGVybW9zdDsKKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAgKnF1ZXVlOworICAgIGttcGNfdGh1bmtfdCAgICAgICAqdGh1bms7CisgICAgaW50ICAgICAgICAgICAgICAgICBucHJvYzsKKworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfZW5kX3Rhc2txIGNhbGxlZCAoJWQpXG4iLCBnbG9iYWxfdGlkKSk7CisKKyAgICB0cSA9ICYgX19rbXBfdGhyZWFkc1tnbG9iYWxfdGlkXSAtPiB0aC50aF90ZWFtIC0+IHQudF90YXNrcTsKKyAgICBucHJvYyA9IF9fa21wX3RocmVhZHNbZ2xvYmFsX3RpZF0gLT4gdGgudGhfdGVhbSAtPiB0LnRfbnByb2M7CisKKyAgICAvKiBGb3IgdGhlIG91dGVybW9zdCB0YXNrcSBvbmx5LCBhbGwgYnV0IG9uZSB0aHJlYWQgd2lsbCBoYXZlIHRhc2txX3RodW5rID09IE5VTEwgKi8KKyAgICBxdWV1ZSA9ICh0YXNrcV90aHVuayA9PSBOVUxMKSA/IHRxLT50cV9yb290IDogdGFza3FfdGh1bmstPnRoLnRoX3NoYXJlZHMtPnN2X3F1ZXVlOworCisgICAgS0VfVFJBQ0UoIDUwLCAoIl9fa21wY19lbmRfdGFza3EgcXVldWU9JXAgKCVkKSBcbiIsIHF1ZXVlLCBnbG9iYWxfdGlkKSk7CisgICAgaXNfb3V0ZXJtb3N0ID0gKHF1ZXVlID09IHRxLT50cV9yb290KTsKKyAgICBpbl9wYXJhbGxlbCA9IChxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfUEFSQUxMRUxfQ09OVEVYVCk7CisKKyAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAga21wX3VpbnQzMiBzcGluczsKKworICAgICAgICAvKiB0aGlzIGlzIGp1c3QgYSBzYWZlZ3VhcmQgdG8gcmVsZWFzZSB0aGUgd2FpdGluZyB0aHJlYWRzIGlmICovCisgICAgICAgIC8qIHRoZSBvdXRlcm1vc3QgdGFza3EgbmV2ZXIgcXVldWVzIGEgdGFzayAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICBpZiAoaXNfb3V0ZXJtb3N0ICYmIChLTVBfTUFTVEVSX0dUSUQoIGdsb2JhbF90aWQgKSkpIHsKKyAgICAgICAgICAgIGlmKCB0cS0+dHFfZ2xvYmFsX2ZsYWdzICYgVFFGX1JFTEVBU0VfV09SS0VSUyApIHsKKyAgICAgICAgICAgICAgICAvKiBubyBsb2NrIG5lZWRlZCwgd29ya2VycyBhcmUgc3RpbGwgaW4gc3BpbiBtb2RlICovCisgICAgICAgICAgICAgICAgdHEtPnRxX2dsb2JhbF9mbGFncyAmPSB+VFFGX1JFTEVBU0VfV09SS0VSUzsKKworICAgICAgICAgICAgICAgIF9fa21wX2VuZF9zcGxpdF9iYXJyaWVyKCBic19wbGFpbl9iYXJyaWVyLCBnbG9iYWxfdGlkICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBrZWVwIGRlcXVldWVpbmcgd29yayB1bnRpbCBhbGwgdGFza3MgYXJlIHF1ZXVlZCBhbmQgZGVxdWV1ZWQgKi8KKworICAgICAgICBkbyB7CisgICAgICAgICAgICAvKiB3YWl0IHVudGlsIHNvbWV0aGluZyBpcyBhdmFpbGFibGUgdG8gZGVxdWV1ZSAqLworICAgICAgICAgICAgS01QX0lOSVRfWUlFTEQoc3BpbnMpOworCisgICAgICAgICAgICB3aGlsZSAoIChxdWV1ZS0+dHFfbmZ1bGwgPT0gMCkKKyAgICAgICAgICAgICAgICAgJiYgKHF1ZXVlLT50cV90YXNrcV9zbG90ID09IE5VTEwpCisgICAgICAgICAgICAgICAgICYmICghIF9fa21wX3Rhc2txX2hhc19hbnlfY2hpbGRyZW4ocXVldWUpICkKKyAgICAgICAgICAgICAgICAgJiYgKCEgKHF1ZXVlLT50cV9mbGFncyAmIFRRRl9BTExfVEFTS1NfUVVFVUVEKSApCisgICAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdGF0aWNfZGVsYXkoIDEgKTsKKyAgICAgICAgICAgICAgICBLTVBfWUlFTERfV0hFTiggVFJVRSwgc3BpbnMgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogY2hlY2sgdG8gc2VlIGlmIHdlIGNhbiBleGVjdXRlIHRhc2tzIGluIHRoZSBxdWV1ZSAqLworICAgICAgICAgICAgd2hpbGUgKCAoIChxdWV1ZS0+dHFfbmZ1bGwgIT0gMCkgfHwgKHF1ZXVlLT50cV90YXNrcV9zbG90ICE9IE5VTEwpICkKKyAgICAgICAgICAgICAgICAgJiYgKHRodW5rID0gX19rbXBfZmluZF90YXNrX2luX3F1ZXVlKGdsb2JhbF90aWQsIHF1ZXVlKSkgIT0gTlVMTAorICAgICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgS0ZfVFJBQ0UoNTAsICgiRm91bmQgdGh1bms6ICVwIGluIHByaW1hcnkgcXVldWUgJXAgKCVkKVxuIiwgdGh1bmssIHF1ZXVlLCBnbG9iYWxfdGlkKSk7CisgICAgICAgICAgICAgICAgX19rbXBfZXhlY3V0ZV90YXNrX2Zyb21fcXVldWUoIHRxLCBsb2MsIGdsb2JhbF90aWQsIHRodW5rLCBpbl9wYXJhbGxlbCApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBzZWUgaWYgd29yayBmb3VuZCBjYW4gYmUgZm91bmQgaW4gYSBkZXNjZW5kYW50IHF1ZXVlICovCisgICAgICAgICAgICBpZiAoIChfX2ttcF90YXNrcV9oYXNfYW55X2NoaWxkcmVuKHF1ZXVlKSkKKyAgICAgICAgICAgICAgJiYgKHRodW5rID0gX19rbXBfZmluZF90YXNrX2luX2Rlc2NlbmRhbnRfcXVldWUoZ2xvYmFsX3RpZCwgcXVldWUpKSAhPSBOVUxMCisgICAgICAgICAgICAgICApIHsKKworICAgICAgICAgICAgICAgIEtGX1RSQUNFKDUwLCAoIlN0b2xlIHRodW5rOiAlcCBpbiBkZXNjZW5kYW50IHF1ZXVlOiAlcCB3aGlsZSB3YWl0aW5nIGluIHF1ZXVlOiAlcCAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICB0aHVuaywgdGh1bmstPnRoLnRoX3NoYXJlZHMtPnN2X3F1ZXVlLCBxdWV1ZSwgZ2xvYmFsX3RpZCApKTsKKworICAgICAgICAgICAgICAgIF9fa21wX2V4ZWN1dGVfdGFza19mcm9tX3F1ZXVlKCB0cSwgbG9jLCBnbG9iYWxfdGlkLCB0aHVuaywgaW5fcGFyYWxsZWwgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IHdoaWxlICggKCEgKHF1ZXVlLT50cV9mbGFncyAmIFRRRl9BTExfVEFTS1NfUVVFVUVEKSkKKyAgICAgICAgICAgICAgIHx8IChxdWV1ZS0+dHFfbmZ1bGwgIT0gMCkKKyAgICAgICAgICAgICAgICApOworCisgICAgICAgIEtGX1RSQUNFKDUwLCAoIkFsbCB0YXNrcyBxdWV1ZWQgYW5kIGRlcXVldWVkIGluIHF1ZXVlOiAlcCAoJWQpXG4iLCBxdWV1ZSwgZ2xvYmFsX3RpZCkpOworCisgICAgICAgIC8qIHdhaXQgd2hpbGUgYWxsIHRhc2tzIGFyZSBub3QgZmluaXNoZWQgYW5kIG1vcmUgd29yayBmb3VuZAorICAgICAgICAgICBpbiBkZXNjZW5kYW50IHF1ZXVlcyAqLworCisgICAgICAgIHdoaWxlICggKCFfX2ttcF90YXNrcV90YXNrc19maW5pc2hlZChxdWV1ZSkpCisgICAgICAgICAgICAgJiYgKHRodW5rID0gX19rbXBfZmluZF90YXNrX2luX2Rlc2NlbmRhbnRfcXVldWUoZ2xvYmFsX3RpZCwgcXVldWUpKSAhPSBOVUxMCisgICAgICAgICAgICAgICkgeworCisgICAgICAgICAgICBLRl9UUkFDRSg1MCwgKCJTdG9sZSB0aHVuazogJXAgaW4gZGVzY2VuZGFudCBxdWV1ZTogJXAgd2hpbGUgd2FpdGluZyBpbiBxdWV1ZTogJXAgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICB0aHVuaywgdGh1bmstPnRoLnRoX3NoYXJlZHMtPnN2X3F1ZXVlLCBxdWV1ZSwgZ2xvYmFsX3RpZCkpOworCisgICAgICAgICAgICBfX2ttcF9leGVjdXRlX3Rhc2tfZnJvbV9xdWV1ZSggdHEsIGxvYywgZ2xvYmFsX3RpZCwgdGh1bmssIGluX3BhcmFsbGVsICk7CisgICAgICAgIH0KKworICAgICAgICBLRl9UUkFDRSg1MCwgKCJObyB3b3JrIGZvdW5kIGluIGRlc2NlbmRlbnQgcXVldWVzIG9yIGFsbCB3b3JrIGZpbmlzaGVkIGluIHF1ZXVlOiAlcCAoJWQpXG4iLCBxdWV1ZSwgZ2xvYmFsX3RpZCkpOworCisgICAgICAgIGlmICghaXNfb3V0ZXJtb3N0KSB7CisgICAgICAgICAgICAvKiBuZWVkIHRvIHJldHVybiBpZiBOT1dBSVQgcHJlc2VudCBhbmQgbm90IG91dGVybW9zdCB0YXNrcSAqLworCisgICAgICAgICAgICBpZiAocXVldWUtPnRxX2ZsYWdzICYgVFFGX0lTX05PV0FJVCkgeworICAgICAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgICAgICAgICBxdWV1ZS0+dHFfcmVmX2NvdW50LS07CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggcXVldWUtPnRxX3JlZl9jb3VudCA+PSAwICk7CisgICAgICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxLnRxX3BhcmVudC0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICAgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY19lbmRfdGFza3EgcmV0dXJuIGZvciBub3dhaXQgY2FzZSAoJWQpXG4iLCBnbG9iYWxfdGlkKSk7CisKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9fa21wX2ZpbmRfYW5kX3JlbW92ZV9maW5pc2hlZF9jaGlsZF90YXNrcSggdHEsIGdsb2JhbF90aWQsIHF1ZXVlICk7CisKKyAgICAgICAgICAgIC8qIFdBSVQgdW50aWwgYWxsIHRhc2tzIGFyZSBmaW5pc2hlZCBhbmQgbm8gY2hpbGQgcXVldWVzIGV4aXN0IGJlZm9yZSBwcm9jZWVkaW5nICovCisgICAgICAgICAgICBLTVBfSU5JVF9ZSUVMRChzcGlucyk7CisKKyAgICAgICAgICAgIHdoaWxlICghX19rbXBfdGFza3FfdGFza3NfZmluaXNoZWQocXVldWUpIHx8IF9fa21wX3Rhc2txX2hhc19hbnlfY2hpbGRyZW4ocXVldWUpKSB7CisgICAgICAgICAgICAgICAgdGh1bmsgPSBfX2ttcF9maW5kX3Rhc2tfaW5fYW5jZXN0b3JfcXVldWUoIHRxLCBnbG9iYWxfdGlkLCBxdWV1ZSApOworCisgICAgICAgICAgICAgICAgaWYgKHRodW5rICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgS0ZfVFJBQ0UoNTAsICgiU3RvbGUgdGh1bms6ICVwIGluIGFuY2VzdG9yIHF1ZXVlOiAlcCB3aGlsZSB3YWl0aW5nIGluIHF1ZXVlOiAlcCAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRodW5rLCB0aHVuay0+dGgudGhfc2hhcmVkcy0+c3ZfcXVldWUsIHF1ZXVlLCBnbG9iYWxfdGlkKSk7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2V4ZWN1dGVfdGFza19mcm9tX3F1ZXVlKCB0cSwgbG9jLCBnbG9iYWxfdGlkLCB0aHVuaywgaW5fcGFyYWxsZWwgKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBLTVBfWUlFTERfV0hFTiggdGh1bmsgPT0gTlVMTCwgc3BpbnMgKTsKKworICAgICAgICAgICAgICAgIF9fa21wX2ZpbmRfYW5kX3JlbW92ZV9maW5pc2hlZF9jaGlsZF90YXNrcSggdHEsIGdsb2JhbF90aWQsIHF1ZXVlICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cV9xdWV1ZV9sY2ssIGdsb2JhbF90aWQpOworICAgICAgICAgICAgaWYgKCAhKHF1ZXVlLT50cV9mbGFncyAmIFRRRl9ERUFMTE9DQVRFRCkgKSB7CisgICAgICAgICAgICAgICAgcXVldWUtPnRxX2ZsYWdzIHw9IFRRRl9ERUFMTE9DQVRFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIHF1ZXVlLT50cV9xdWV1ZV9sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICAvKiBvbmx5IHRoZSBhbGxvY2F0aW5nIHRocmVhZCBjYW4gZGVhbGxvY2F0ZSB0aGUgcXVldWUgKi8KKyAgICAgICAgICAgIGlmICh0YXNrcV90aHVuayAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgX19rbXBfcmVtb3ZlX3F1ZXVlX2Zyb21fdHJlZSggdHEsIGdsb2JhbF90aWQsIHF1ZXVlLCBUUlVFICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfZW5kX3Rhc2txIHJldHVybiBmb3Igbm9uX291dGVybW9zdCBxdWV1ZSwgd2FpdCBjYXNlICglZClcbiIsIGdsb2JhbF90aWQpKTsKKworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLyogT3V0ZXJtb3N0IFF1ZXVlOiBzdGVhbCB3b3JrIGZyb20gZGVzY2VuZGFudHMgdW50aWwgYWxsIHRhc2tzIGFyZSBmaW5pc2hlZCAqLworCisgICAgICAgIEtNUF9JTklUX1lJRUxEKHNwaW5zKTsKKworICAgICAgICB3aGlsZSAoIV9fa21wX3Rhc2txX3Rhc2tzX2ZpbmlzaGVkKHF1ZXVlKSkgeworICAgICAgICAgICAgdGh1bmsgPSBfX2ttcF9maW5kX3Rhc2tfaW5fZGVzY2VuZGFudF9xdWV1ZShnbG9iYWxfdGlkLCBxdWV1ZSk7CisKKyAgICAgICAgICAgIGlmICh0aHVuayAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgS0ZfVFJBQ0UoNTAsICgiU3RvbGUgdGh1bms6ICVwIGluIGRlc2NlbmRhbnQgcXVldWU6ICVwIHdoaWxlIHdhaXRpbmcgaW4gcXVldWU6ICVwICglZClcbiIsCisgICAgICAgICAgICAgICAgICAgIHRodW5rLCB0aHVuay0+dGgudGhfc2hhcmVkcy0+c3ZfcXVldWUsIHF1ZXVlLCBnbG9iYWxfdGlkKSk7CisKKyAgICAgICAgICAgICAgICBfX2ttcF9leGVjdXRlX3Rhc2tfZnJvbV9xdWV1ZSggdHEsIGxvYywgZ2xvYmFsX3RpZCwgdGh1bmssIGluX3BhcmFsbGVsICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEtNUF9ZSUVMRF9XSEVOKCB0aHVuayA9PSBOVUxMLCBzcGlucyApOworICAgICAgICB9CisKKyAgICAgICAgLyogTmVlZCB0aGlzIGJhcnJpZXIgdG8gcHJldmVudCBkZXN0cnVjdGlvbiBvZiBxdWV1ZSBiZWZvcmUgdGhyZWFkcyBoYXZlIGFsbCBleGVjdXRlZCBhYm92ZSBjb2RlICovCisgICAgICAgIC8qIFRoaXMgbWF5IG5lZWQgdG8gYmUgZG9uZSBlYXJsaWVyIHdoZW4gTk9XQUlUIGlzIGltcGxlbWVudGVkIGZvciB0aGUgb3V0ZXJtb3N0IGxldmVsICovCisKKyAgICAgICAgaWYgKCAhX19rbXBfYmFycmllciggYnNfcGxhaW5fYmFycmllciwgZ2xvYmFsX3RpZCwgVFJVRSwgMCwgTlVMTCwgTlVMTCApKSB7CisgICAgICAgICAgICAvKiB0aGUgcXVldWUtPnRxX2ZsYWdzICYgVFFGX0lTX05PV0FJVCBjYXNlIGlzIG5vdCB5ZXQgaGFuZGxlZCBoZXJlOyAgICovCisgICAgICAgICAgICAvKiBmb3IgcmlnaHQgbm93LCBldmVyeWJvZHkgd2FpdHMsIGFuZCB0aGUgbWFzdGVyIHRocmVhZCBkZXN0cm95cyB0aGUgICovCisgICAgICAgICAgICAvKiByZW1haW5pbmcgcXVldWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIF9fa21wX3JlbW92ZV9hbGxfY2hpbGRfdGFza3EoIHRxLCBnbG9iYWxfdGlkLCBxdWV1ZSApOworCisgICAgICAgICAgICAvKiBOb3cgZGVzdHJveSB0aGUgcm9vdCBxdWV1ZSAqLworICAgICAgICAgICAgS0ZfVFJBQ0UoMTAwLCAoIlQjJWQgQmVmb3JlIERlbGV0aW9uIG9mIHRvcC1sZXZlbCBUYXNrUSBhdCAlcDpcbiIsIGdsb2JhbF90aWQsIHF1ZXVlICkpOworICAgICAgICAgICAgS0ZfRFVNUCgxMDAsIF9fa21wX2R1bXBfdGFza19xdWV1ZSggdHEsIHF1ZXVlLCBnbG9iYWxfdGlkICkpOworCisjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICAvKiAgdGhlIHJvb3QgcXVldWUgZW50cnkgICovCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUICgocXVldWUtPnRxLnRxX3BhcmVudCA9PSBOVUxMKSAmJiAocXVldWUtPnRxX25leHRfY2hpbGQgPT0gTlVMTCkpOworCisgICAgICAgICAgICAvKiAgY2hpbGRyZW4gbXVzdCBhbGwgYmUgZ29uZSBieSBub3cgYmVjYXVzZSBvZiBiYXJyaWVyIGFib3ZlICovCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUIChxdWV1ZS0+dHFfZmlyc3RfY2hpbGQgPT0gTlVMTCk7CisKKyAgICAgICAgICAgIGZvciAoaT0wOyBpPG5wcm9jOyBpKyspIHsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHF1ZXVlLT50cV90aF90aHVua3NbaV0uYWlfZGF0YSA9PSAwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpPTAsIHRodW5rPXF1ZXVlLT50cV9mcmVlX3RodW5rczsgdGh1bmsgIT0gTlVMTDsgaSsrLCB0aHVuaz10aHVuay0+dGgudGhfbmV4dF9mcmVlKTsKKworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCAoaSA9PSBxdWV1ZS0+dHFfbnNsb3RzICsgKG5wcm9jICogX19LTVBfVEFTS1FfVEhVTktTX1BFUl9USCkpOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnByb2M7IGkrKykgeworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoICEgdHEtPnRxX2N1cnJfdGh1bmtbaV0gKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgLyogIHVubGluayB0aGUgcm9vdCBxdWV1ZSBlbnRyeSAgKi8KKyAgICAgICAgICAgIHRxIC0+IHRxX3Jvb3QgPSAgTlVMTDsKKworICAgICAgICAgICAgLyogIHJlbGVhc2Ugc3RvcmFnZSBmb3Igcm9vdCBxdWV1ZSBlbnRyeSAgKi8KKyAgICAgICAgICAgIEtGX1RSQUNFKDUwLCAoIkFmdGVyIERlbGV0aW9uIG9mIHRvcC1sZXZlbCBUYXNrUSBhdCAlcCBvbiAoJWQpOlxuIiwgcXVldWUsIGdsb2JhbF90aWQpKTsKKworICAgICAgICAgICAgcXVldWUtPnRxX2ZsYWdzIHw9IFRRRl9ERUFMTE9DQVRFRDsKKyAgICAgICAgICAgIF9fa21wX2ZyZWVfdGFza3EgKCB0cSwgcXVldWUsIGluX3BhcmFsbGVsLCBnbG9iYWxfdGlkICk7CisKKyAgICAgICAgICAgIEtGX0RVTVAoNTAsIF9fa21wX2R1bXBfdGFza19xdWV1ZV90cmVlKCB0cSwgdHEtPnRxX3Jvb3QsIGdsb2JhbF90aWQgKSk7CisKKyAgICAgICAgICAgIC8qIHJlbGVhc2UgdGhlIHdvcmtlcnMgbm93IHRoYXQgdGhlIGRhdGEgc3RydWN0dXJlcyBhcmUgdXAgdG8gZGF0ZSAqLworICAgICAgICAgICAgX19rbXBfZW5kX3NwbGl0X2JhcnJpZXIoIGJzX3BsYWluX2JhcnJpZXIsIGdsb2JhbF90aWQgKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoID0gX19rbXBfdGhyZWFkc1sgZ2xvYmFsX3RpZCBdOworCisgICAgICAgIC8qIFJlc2V0IE9SREVSRUQgU0VDVElPTiB0byBwYXJhbGxlbCB2ZXJzaW9uICovCisgICAgICAgIHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZGVvX2ZjbiA9IDA7CisKKyAgICAgICAgLyogUmVzZXQgT1JERVJFRCBTRUNUSU9OIHRvIHBhcmFsbGVsIHZlcnNpb24gKi8KKyAgICAgICAgdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9keG9fZmNuID0gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIGluIHNlcmlhbCBleGVjdXRpb24gY29udGV4dCwgZGVxdWV1ZSB0aGUgbGFzdCB0YXNrICAqLworICAgICAgICAvKiBhbmQgZXhlY3V0ZSBpdCwgaWYgdGhlcmUgd2VyZSBhbnkgdGFza3MgZW5jb3VudGVyZWQgKi8KKworICAgICAgICBpZiAocXVldWUtPnRxX25mdWxsID4gMCkgeworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChxdWV1ZS0+dHFfbmZ1bGwgPT0gMSk7CisKKyAgICAgICAgICAgIHRodW5rID0gX19rbXBfZGVxdWV1ZV90YXNrKGdsb2JhbF90aWQsIHF1ZXVlLCBpbl9wYXJhbGxlbCk7CisKKyAgICAgICAgICAgIGlmIChxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfSVNfTEFTVF9UQVNLKSB7CisgICAgICAgICAgICAgICAgLyogVFFGX0lTX0xBU1RQUklWQVRFLCBvbmUgdGhpbmcgaW4gcXVldWUsIF9fa21wY19lbmRfdGFza3FfdGFzaygpICovCisgICAgICAgICAgICAgICAgLyogaGFzIGJlZW4gcnVuIHNvIHRoaXMgaXMgbGFzdCB0YXNrLCBydW4gd2l0aCBUUUZfSVNfTEFTVF9UQVNLIHNvICovCisgICAgICAgICAgICAgICAgLyogaW5zdHJ1bWVudGF0aW9uIGRvZXMgY29weS1vdXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICAvKiBubyBuZWVkIGZvciB0ZXN0X3RoZW5fb3IgY2FsbCBzaW5jZSBhbHJlYWR5IGxvY2tlZCAqLworICAgICAgICAgICAgICAgIHRodW5rLT50aF9mbGFncyB8PSBUUUZfSVNfTEFTVF9UQVNLOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBLRl9UUkFDRSg1MCwgKCJUIyVkIGZvdW5kIHRodW5rOiAlcCBpbiBzZXJpYWwgcXVldWU6ICVwXG4iLCBnbG9iYWxfdGlkLCB0aHVuaywgcXVldWUpKTsKKworICAgICAgICAgICAgX19rbXBfZXhlY3V0ZV90YXNrX2Zyb21fcXVldWUoIHRxLCBsb2MsIGdsb2JhbF90aWQsIHRodW5rLCBpbl9wYXJhbGxlbCApOworICAgICAgICB9CisKKyAgICAgICAgLyogZGVzdHJveSB0aGUgdW5hdHRhY2hlZCBzZXJpYWwgcXVldWUgbm93IHRoYXQgdGhlcmUgaXMgbm8gbW9yZSB3b3JrIHRvIGRvICovCisgICAgICAgIEtGX1RSQUNFKDEwMCwgKCJCZWZvcmUgRGVsZXRpb24gb2YgU2VyaWFsaXplZCBUYXNrUSBhdCAlcCBvbiAoJWQpOlxuIiwgcXVldWUsIGdsb2JhbF90aWQpKTsKKyAgICAgICAgS0ZfRFVNUCgxMDAsIF9fa21wX2R1bXBfdGFza19xdWV1ZSggdHEsIHF1ZXVlLCBnbG9iYWxfdGlkICkpOworCisjaWZkZWYgS01QX0RFQlVHCisgICAgICAgIGkgPSAwOworICAgICAgICBmb3IgKHRodW5rPXF1ZXVlLT50cV9mcmVlX3RodW5rczsgdGh1bmsgIT0gTlVMTDsgdGh1bms9dGh1bmstPnRoLnRoX25leHRfZnJlZSkKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCAoaSA9PSBxdWV1ZS0+dHFfbnNsb3RzICsgMSk7CisjZW5kaWYKKyAgICAgICAgLyogIHJlbGVhc2Ugc3RvcmFnZSBmb3IgdW5hdHRhY2hlZCBzZXJpYWwgcXVldWUgICovCisgICAgICAgIEtGX1RSQUNFKDUwLCAoIlNlcmlhbGl6ZWQgVGFza1EgYXQgJXAgZGVsZXRlZCBvbiAoJWQpLlxuIiwgcXVldWUsIGdsb2JhbF90aWQpKTsKKworICAgICAgICBxdWV1ZS0+dHFfZmxhZ3MgfD0gVFFGX0RFQUxMT0NBVEVEOworICAgICAgICBfX2ttcF9mcmVlX3Rhc2txICggdHEsIHF1ZXVlLCBpbl9wYXJhbGxlbCwgZ2xvYmFsX3RpZCApOworICAgIH0KKworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfZW5kX3Rhc2txIHJldHVybiAoJWQpXG4iLCBnbG9iYWxfdGlkKSk7Cit9CisKKy8qICBFbnF1ZXVlcyBhIHRhc2sgZm9yIHRodW5rIHByZXZpb3VzbHkgY3JlYXRlZCBieSBfX2ttcGNfdGFza19idWZmZXIuICovCisvKiAgUmV0dXJucyBub256ZXJvIGlmIGp1c3QgZmlsbGVkIHVwIHF1ZXVlICAqLworCitrbXBfaW50MzIKK19fa21wY190YXNrKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcGNfdGh1bmtfdCAqdGh1bmspCit7CisgICAga21wX2ludDMyICAgICAgICAgIHJldDsKKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAqcXVldWU7CisgICAgaW50ICAgICAgICAgICAgICAgIGluX3BhcmFsbGVsOworICAgIGttcF90YXNrcV90ICAgICAgICp0cTsKKworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfdGFzayBjYWxsZWQgKCVkKVxuIiwgZ2xvYmFsX3RpZCkpOworCisgICAgS01QX0RFQlVHX0FTU0VSVCAoISh0aHVuay0+dGhfZmxhZ3MgJiBUUUZfVEFTS1FfVEFTSykpOyAgLyogIHRodW5rLT50aF90YXNrIGlzIGEgcmVndWxhciB0YXNrICAqLworCisgICAgdHEgICAgICAgICAgPSAmX19rbXBfdGhyZWFkc1tnbG9iYWxfdGlkXSAtPiB0aC50aF90ZWFtIC0+IHQudF90YXNrcTsKKyAgICBxdWV1ZSAgICAgICA9IHRodW5rLT50aC50aF9zaGFyZWRzLT5zdl9xdWV1ZTsKKyAgICBpbl9wYXJhbGxlbCA9IChxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfUEFSQUxMRUxfQ09OVEVYVCk7CisKKyAgICBpZiAoaW5fcGFyYWxsZWwgJiYgKHRodW5rLT50aF9mbGFncyAmIFRRRl9JU19PUkRFUkVEKSkKKyAgICAgICAgdGh1bmstPnRoX3Rhc2tudW0gPSArK3F1ZXVlLT50cV90YXNrbnVtX3F1ZXVpbmc7CisKKyAgICAvKiBGb3Igc2VyaWFsIGV4ZWN1dGlvbiBkZXF1ZXVlIHRoZSBwcmVjZWRpbmcgdGFzayBhbmQgZXhlY3V0ZSBpdCwgaWYgb25lIGV4aXN0cyAqLworICAgIC8qIFRoaXMgY2Fubm90IGJlIHRoZSBsYXN0IHRhc2suICBUaGF0IG9uZSBpcyBoYW5kbGVkIGluIF9fa21wY19lbmRfdGFza3EgKi8KKworICAgIGlmICghaW5fcGFyYWxsZWwgJiYgcXVldWUtPnRxX25mdWxsID4gMCkgeworICAgICAgICBrbXBjX3RodW5rX3QgKnByZXZfdGh1bms7CisKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChxdWV1ZS0+dHFfbmZ1bGwgPT0gMSk7CisKKyAgICAgICAgcHJldl90aHVuayA9IF9fa21wX2RlcXVldWVfdGFzayhnbG9iYWxfdGlkLCBxdWV1ZSwgaW5fcGFyYWxsZWwpOworCisgICAgICAgIEtGX1RSQUNFKDUwLCAoIlQjJWQgZm91bmQgdGh1bms6ICVwIGluIHNlcmlhbCBxdWV1ZTogJXBcbiIsIGdsb2JhbF90aWQsIHByZXZfdGh1bmssIHF1ZXVlKSk7CisKKyAgICAgICAgX19rbXBfZXhlY3V0ZV90YXNrX2Zyb21fcXVldWUoIHRxLCBsb2MsIGdsb2JhbF90aWQsIHByZXZfdGh1bmssIGluX3BhcmFsbGVsICk7CisgICAgfQorCisgICAgLyogVGhlIGluc3RydW1lbnRhdGlvbiBzZXF1ZW5jZSBpczogIF9fa21wY190YXNrX2J1ZmZlcigpLCBpbml0aWFsaXplIHByaXZhdGUgICAgKi8KKyAgICAvKiB2YXJpYWJsZXMsIF9fa21wY190YXNrKCkuICBUaGUgX19rbXBjX3Rhc2tfYnVmZmVyIHJvdXRpbmUgY2hlY2tzIHRoYXQgdGhlICAgICAqLworICAgIC8qIHRhc2sgcXVldWUgaXMgbm90IGZ1bGwgYW5kIGFsbG9jYXRlcyBhIHRodW5rICh3aGljaCBpcyB0aGVuIHBhc3NlZCB0byAgICAgICAgICovCisgICAgLyogX19rbXBjX3Rhc2soKSkuICBTbywgdGhlIGVucXVldWUgYmVsb3cgc2hvdWxkIG5ldmVyIGZhaWwgZHVlIHRvIGEgZnVsbCBxdWV1ZS4gKi8KKworICAgIEtGX1RSQUNFKDEwMCwgKCJBZnRlciBlbnF1ZXVlaW5nIHRoaXMgVGFzayBvbiAoJWQpOlxuIiwgZ2xvYmFsX3RpZCkpOworICAgIEtGX0RVTVAoMTAwLCBfX2ttcF9kdW1wX3RodW5rKCB0cSwgdGh1bmssIGdsb2JhbF90aWQgKSk7CisKKyAgICByZXQgPSBfX2ttcF9lbnF1ZXVlX3Rhc2sgKCB0cSwgZ2xvYmFsX3RpZCwgcXVldWUsIHRodW5rLCBpbl9wYXJhbGxlbCApOworCisgICAgS0ZfVFJBQ0UoMTAwLCAoIlRhc2sgUXVldWUgbG9va3MgbGlrZSB0aGlzIG9uICglZCk6XG4iLCBnbG9iYWxfdGlkKSk7CisgICAgS0ZfRFVNUCgxMDAsIF9fa21wX2R1bXBfdGFza19xdWV1ZSggdHEsIHF1ZXVlLCBnbG9iYWxfdGlkICkpOworCisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY190YXNrIHJldHVybiAoJWQpXG4iLCBnbG9iYWxfdGlkKSk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKiAgZW5xdWV1ZXMgYSB0YXNrcV90YXNrIGZvciB0aHVuayBwcmV2aW91c2x5IGNyZWF0ZWQgYnkgX19rbXBjX3Rhc2txICAqLworLyogIHRoaXMgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCB1bmxlc3MgaW4gYSBwYXJhbGxlbCBjb250ZXh0ICAgICAgICAgICAgKi8KKwordm9pZAorX19rbXBjX3Rhc2txX3Rhc2soaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190aHVua190ICp0aHVuaywga21wX2ludDMyIHN0YXR1cykKK3sKKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAqcXVldWU7CisgICAga21wX3Rhc2txX3QgICAgICAgKnRxICA9ICZfX2ttcF90aHJlYWRzW2dsb2JhbF90aWRdIC0+IHRoLnRoX3RlYW0gLT4gdC50X3Rhc2txOworICAgIGludCAgICAgICAgICAgICAgICB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKCBnbG9iYWxfdGlkICk7CisKKyAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX3Rhc2txX3Rhc2sgY2FsbGVkICglZClcbiIsIGdsb2JhbF90aWQpKTsKKyAgICBLRl9UUkFDRSgxMDAsICgiVGFza1EgVGFzayBhcmd1bWVudCB0aHVuayBvbiAoJWQpOlxuIiwgZ2xvYmFsX3RpZCkpOworICAgIEtGX0RVTVAoMTAwLCBfX2ttcF9kdW1wX3RodW5rKCB0cSwgdGh1bmssIGdsb2JhbF90aWQgKSk7CisKKyAgICBxdWV1ZSA9IHRodW5rLT50aC50aF9zaGFyZWRzLT5zdl9xdWV1ZTsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgX19rbXBfcG9wX3dvcmtzaGFyZSggZ2xvYmFsX3RpZCwgY3RfdGFza3EsIGxvYyApOworCisgICAgLyogIHRodW5rLT50aF90YXNrIGlzIHRoZSB0YXNrcV90YXNrICAqLworICAgIEtNUF9ERUJVR19BU1NFUlQgKHRodW5rLT50aF9mbGFncyAmIFRRRl9UQVNLUV9UQVNLKTsKKworICAgIC8qICBub3Qgc3VwcG9zZWQgdG8gY2FsbCBfX2ttcGNfdGFza3FfdGFzayBpZiBpdCdzIGFscmVhZHkgZW5xdWV1ZWQgICovCisgICAgS01QX0RFQlVHX0FTU0VSVCAocXVldWUtPnRxX3Rhc2txX3Nsb3QgPT0gTlVMTCk7CisKKyAgICAvKiBkZXF1ZXVlIHRhc2txIHRodW5rIGZyb20gY3Vycl90aHVuayBzdGFjayAqLworICAgIHRxLT50cV9jdXJyX3RodW5rW3RpZF0gPSB0aHVuay0+dGhfZW5jbF90aHVuazsKKyAgICB0aHVuay0+dGhfZW5jbF90aHVuayA9IE5VTEw7CisKKyAgICBLRl9EVU1QKCAyMDAsIF9fa21wX2R1bXBfdGh1bmtfc3RhY2soIHRxLT50cV9jdXJyX3RodW5rW3RpZF0sIGdsb2JhbF90aWQgKSk7CisKKyAgICB0aHVuay0+dGhfc3RhdHVzID0gc3RhdHVzOworCisgICAgS01QX01CKCk7ICAvKiAgZmx1c2ggdGh1bmstPnRoX3N0YXR1cyBiZWZvcmUgdGFza3FfdGFzayBlbnF1ZXVlZCB0byBhdm9pZCByYWNlIGNvbmRpdGlvbiAgKi8KKworICAgIC8qICBlbnF1ZXVlIHRhc2txX3Rhc2sgaW4gdGh1bmsgaW50byBzcGVjaWFsIHNsb3QgaW4gcXVldWUgICAgICovCisgICAgLyogR0VIIC0gcHJvYmFibHkgZG9uJ3QgbmVlZCB0byBsb2NrIHRhc2txIHNsb3Qgc2luY2Ugb25seSBvbmUgKi8KKyAgICAvKiAgICAgICB0aHJlYWQgZW5xdWV1ZXMgJiBhbHJlYWR5IGEgbG9jayBzZXQgYXQgZGVxdWV1ZSBwb2ludCAqLworCisgICAgcXVldWUtPnRxX3Rhc2txX3Nsb3QgPSB0aHVuazsKKworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfdGFza3FfdGFzayByZXR1cm4gKCVkKVxuIiwgZ2xvYmFsX3RpZCkpOworfQorCisvKiAgZW5kcyBhIHRhc2txX3Rhc2s7IGRvbmUgZ2VuZXJhdGluZyB0YXNrcyAgKi8KKwordm9pZAorX19rbXBjX2VuZF90YXNrcV90YXNrKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcGNfdGh1bmtfdCAqdGh1bmspCit7CisgICAga21wX3Rhc2txX3QgICAgICAgKnRxOworICAgIGttcGNfdGFza19xdWV1ZV90ICpxdWV1ZTsKKyAgICBpbnQgICAgICAgICAgICAgICAgaW5fcGFyYWxsZWw7CisgICAgaW50ICAgICAgICAgICAgICAgIHRpZDsKKworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfZW5kX3Rhc2txX3Rhc2sgY2FsbGVkICglZClcbiIsIGdsb2JhbF90aWQpKTsKKworICAgIHRxICAgICAgICAgID0gJl9fa21wX3RocmVhZHNbZ2xvYmFsX3RpZF0gLT4gdGgudGhfdGVhbSAtPiB0LnRfdGFza3E7CisgICAgcXVldWUgICAgICAgPSB0aHVuay0+dGgudGhfc2hhcmVkcy0+c3ZfcXVldWU7CisgICAgaW5fcGFyYWxsZWwgPSAocXVldWUtPnRxX2ZsYWdzICYgVFFGX1BBUkFMTEVMX0NPTlRFWFQpOworICAgIHRpZCAgICAgICAgID0gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ2xvYmFsX3RpZCApOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wb3Bfd29ya3NoYXJlKCBnbG9iYWxfdGlkLCBjdF90YXNrcSwgbG9jICk7CisKKyAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyNpZiBLTVBfQVJDSF9YODYgfHwgXAorICAgIEtNUF9BUkNIX1g4Nl82NAorCisgICAgICAgIEtNUF9URVNUX1RIRU5fT1IzMiggJnF1ZXVlLT50cV9mbGFncywgKGttcF9pbnQzMikgVFFGX0FMTF9UQVNLU19RVUVVRUQgKTsKKyNlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cV9xdWV1ZV9sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKworICAgICAgICAgICAgcXVldWUtPnRxX2ZsYWdzIHw9IFRRRl9BTExfVEFTS1NfUVVFVUVEOworCisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBxdWV1ZS0+dHFfcXVldWVfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorCisgICAgaWYgKHRodW5rLT50aF9mbGFncyAmIFRRRl9JU19MQVNUUFJJVkFURSkgeworICAgICAgICAvKiBOb3JtYWxseSwgX19rbXBfZmluZF90YXNrX2luX3F1ZXVlKCkgcmVmdXNlcyB0byBzY2hlZHVsZSB0aGUgbGFzdCB0YXNrIGluIHRoZSAqLworICAgICAgICAvKiBxdWV1ZSBpZiBUUUZfSVNfTEFTVFBSSVZBVEUgc28gd2UgY2FuIHBvc2l0aXZlbHkgaWRlbnRpZnkgdGhhdCBsYXN0IHRhc2sgICAgICAqLworICAgICAgICAvKiBhbmQgcnVuIGl0IHdpdGggaXRzIFRRRl9JU19MQVNUX1RBU0sgYml0IHR1cm5lZCBvbiBpbiB0aF9mbGFncy4gIFdoZW4gICAgICAgICAqLworICAgICAgICAvKiBfX2ttcGNfZW5kX3Rhc2txX3Rhc2soKSBpcyBjYWxsZWQgd2UgYXJlIGRvbmUgZ2VuZXJhdGluZyBhbGwgdGhlIHRhc2tzLCBzbyAgICAqLworICAgICAgICAvKiB3ZSBrbm93IHRoZSBsYXN0IG9uZSBpbiB0aGUgcXVldWUgaXMgdGhlIGxhc3Rwcml2YXRlIHRhc2suICBNYXJrIHRoZSBxdWV1ZSAgICAqLworICAgICAgICAvKiBhcyBoYXZpbmcgZ290dGVuIHRvIHRoaXMgc3RhdGUgdmlhIHRxX2ZsYWdzICYgVFFGX0lTX0xBU1RfVEFTSzsgd2hlbiB0aGF0ICAgICAqLworICAgICAgICAvKiB0YXNrIGFjdHVhbGx5IGV4ZWN1dGVzIG1hcmsgaXQgdmlhIHRoX2ZsYWdzICYgVFFGX0lTX0xBU1RfVEFTSyAodGhpcyB0aF9mbGFncyAqLworICAgICAgICAvKiBiaXQgc2lnbmFscyB0aGUgaW5zdHJ1bWVudGVkIGNvZGUgdG8gZG8gY29weS1vdXRzIGFmdGVyIGV4ZWN1dGlvbikuICAgICAgICAgICAqLworCisgICAgICAgIGlmICghIGluX3BhcmFsbGVsKSB7CisgICAgICAgICAgICAvKiBObyBzeW5jaHJvbml6YXRpb24gbmVlZGVkIGZvciBzZXJpYWwgY29udGV4dCAqLworICAgICAgICAgICAgcXVldWUtPnRxX2ZsYWdzIHw9IFRRRl9JU19MQVNUX1RBU0s7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisjaWYgS01QX0FSQ0hfWDg2IHx8IFwKKyAgICBLTVBfQVJDSF9YODZfNjQKKworICAgICAgICAgICAgS01QX1RFU1RfVEhFTl9PUjMyKCAmcXVldWUtPnRxX2ZsYWdzLCAoa21wX2ludDMyKSBUUUZfSVNfTEFTVF9UQVNLICk7CisjZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cV9xdWV1ZV9sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICAgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKworICAgICAgICAgICAgICAgIHF1ZXVlLT50cV9mbGFncyB8PSBUUUZfSVNfTEFTVF9UQVNLOworCisgICAgICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxX3F1ZXVlX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIC8qIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb24gd2hlcmUgbGFzdCB0YXNrIGlzIGRlcXVldWVkIGJ1dCAqLworICAgICAgICAgICAgLyogZmxhZyBpc24ndCB2aXNpYmxlIHlldCAobm90IHN1cmUgYWJvdXQgdGhpcykgICAgICAgICAgICAgICovCisgICAgICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGRlcXVldWUgdGFza3EgdGh1bmsgZnJvbSBjdXJyX3RodW5rIHN0YWNrICovCisgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgIHRxLT50cV9jdXJyX3RodW5rW3RpZF0gPSB0aHVuay0+dGhfZW5jbF90aHVuazsKKyAgICAgICAgdGh1bmstPnRoX2VuY2xfdGh1bmsgPSBOVUxMOworCisgICAgICAgIEtGX0RVTVAoIDIwMCwgX19rbXBfZHVtcF90aHVua19zdGFjayggdHEtPnRxX2N1cnJfdGh1bmtbdGlkXSwgZ2xvYmFsX3RpZCApKTsKKyAgICB9CisKKyAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX2VuZF90YXNrcV90YXNrIHJldHVybiAoJWQpXG4iLCBnbG9iYWxfdGlkKSk7Cit9CisKKy8qIHJldHVybnMgdGh1bmsgZm9yIGEgcmVndWxhciB0YXNrIGJhc2VkIG9uIHRhc2txX3RodW5rICAgICAgICAgICAgICAqLworLyogKF9fa21wY190YXNrcV90YXNrIGRvZXMgdGhlIGFuYWxvZ291cyB0aGluZyBmb3IgYSBUUUZfVEFTS1FfVEFTSykgICovCisKK2ttcGNfdGh1bmtfdCAqCitfX2ttcGNfdGFza19idWZmZXIoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190aHVua190ICp0YXNrcV90aHVuaywga21wY190YXNrX3QgdGFzaykKK3sKKyAgICBrbXBfdGFza3FfdCAgICAgICAqdHE7CisgICAga21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlOworICAgIGttcGNfdGh1bmtfdCAgICAgICpuZXdfdGh1bms7CisgICAgaW50ICAgICAgICAgICAgICAgIGluX3BhcmFsbGVsOworCisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY190YXNrX2J1ZmZlciBjYWxsZWQgKCVkKVxuIiwgZ2xvYmFsX3RpZCkpOworCisgICAgS01QX0RFQlVHX0FTU0VSVCAodGFza3FfdGh1bmstPnRoX2ZsYWdzICYgVFFGX1RBU0tRX1RBU0spOyAgLyogIHRhc2txX3RodW5rLT50aF90YXNrIGlzIHRoZSB0YXNrcV90YXNrICAqLworCisgICAgdHEgICAgICAgICAgPSAmX19rbXBfdGhyZWFkc1tnbG9iYWxfdGlkXSAtPiB0aC50aF90ZWFtIC0+IHQudF90YXNrcTsKKyAgICBxdWV1ZSAgICAgICA9IHRhc2txX3RodW5rLT50aC50aF9zaGFyZWRzLT5zdl9xdWV1ZTsKKyAgICBpbl9wYXJhbGxlbCA9IChxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfUEFSQUxMRUxfQ09OVEVYVCk7CisKKyAgICAvKiBUaGUgaW5zdHJ1bWVudGF0aW9uIHNlcXVlbmNlIGlzOiAgX19rbXBjX3Rhc2tfYnVmZmVyKCksIGluaXRpYWxpemUgcHJpdmF0ZSAqLworICAgIC8qIHZhcmlhYmxlcywgX19rbXBjX3Rhc2soKS4gIFRoZSBfX2ttcGNfdGFza19idWZmZXIgcm91dGluZSBjaGVja3MgdGhhdCB0aGUgICovCisgICAgLyogdGFzayBxdWV1ZSBpcyBub3QgZnVsbCBhbmQgYWxsb2NhdGVzIGEgdGh1bmsgKHdoaWNoIGlzIHRoZW4gcGFzc2VkIHRvICAgICAgKi8KKyAgICAvKiBfX2ttcGNfdGFzaygpKS4gIFNvLCB3ZSBjYW4gcHJlLWFsbG9jYXRlIGEgdGh1bmsgaGVyZSBhc3N1bWluZyBpdCB3aWxsIGJlICAqLworICAgIC8qIHRoZSBuZXh0IHRvIGJlIGVucXVldWVkIGluIF9fa21wY190YXNrKCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICBuZXdfdGh1bmsgPSBfX2ttcF9hbGxvY190aHVuayAocXVldWUsIGluX3BhcmFsbGVsLCBnbG9iYWxfdGlkKTsKKyAgICBuZXdfdGh1bmstPnRoLnRoX3NoYXJlZHMgPSAoa21wY19zaGFyZWRfdmFyc190ICopIHF1ZXVlLT50cV9zaGFyZWRzWzBdLmFpX2RhdGE7CisgICAgbmV3X3RodW5rLT50aF9lbmNsX3RodW5rID0gTlVMTDsKKyAgICBuZXdfdGh1bmstPnRoX3Rhc2sgICAgICAgPSB0YXNrOworCisgICAgLyogR0VIIC0gc2hvdWxkbid0IG5lZWQgdG8gbG9jayB0aGUgcmVhZCBvZiB0cV9mbGFncyBoZXJlICovCisgICAgbmV3X3RodW5rLT50aF9mbGFncyAgICAgID0gcXVldWUtPnRxX2ZsYWdzICYgVFFGX0lOVEVSRkFDRV9GTEFHUzsKKworICAgIG5ld190aHVuay0+dGhfc3RhdHVzICAgICA9IDA7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUICghKG5ld190aHVuay0+dGhfZmxhZ3MgJiBUUUZfVEFTS1FfVEFTSykpOworCisgICAgS0ZfVFJBQ0UoMTAwLCAoIkNyZWF0aW5nIFJlZ3VsYXIgVGFzayBvbiAoJWQpOlxuIiwgZ2xvYmFsX3RpZCkpOworICAgIEtGX0RVTVAoMTAwLCBfX2ttcF9kdW1wX3RodW5rKCB0cSwgbmV3X3RodW5rLCBnbG9iYWxfdGlkICkpOworCisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY190YXNrX2J1ZmZlciByZXR1cm4gKCVkKVxuIiwgZ2xvYmFsX3RpZCkpOworCisgICAgcmV0dXJuIG5ld190aHVuazsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfdGhyZWFkcHJpdmF0ZS5jIGIvZmluYWwvcnVudGltZS9zcmMva21wX3RocmVhZHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWI3OTY5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX3RocmVhZHByaXZhdGUuYwpAQCAtMCwwICsxLDczNSBAQAorLyoKKyAqIGttcF90aHJlYWRwcml2YXRlLmMgLS0gT3Blbk1QIHRocmVhZHByaXZhdGUgc3VwcG9ydCBsaWJyYXJ5CisgKiAkUmV2aXNpb246IDQyNjE4ICQKKyAqICREYXRlOiAyMDEzLTA4LTI3IDA5OjE1OjQ1IC0wNTAwIChUdWUsIDI3IEF1ZyAyMDEzKSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfaXR0LmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBVU0VfQ0hFQ0tTX0NPTU1PTgorCisjZGVmaW5lIEtNUF9JTkxJTkVfU1VCUiAgICAgICAgIDEKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkCitrbXBfdGhyZWFkcHJpdmF0ZV9pbnNlcnRfcHJpdmF0ZV9kYXRhKCBpbnQgZ3RpZCwgdm9pZCAqcGNfYWRkciwgdm9pZCAqZGF0YV9hZGRyLCBzaXplX3QgcGNfc2l6ZSApOworc3RydWN0IHByaXZhdGVfY29tbW9uICoKK2ttcF90aHJlYWRwcml2YXRlX2luc2VydCggaW50IGd0aWQsIHZvaWQgKnBjX2FkZHIsIHZvaWQgKmRhdGFfYWRkciwgc2l6ZV90IHBjX3NpemUgKTsKKworc3RydWN0IHNoYXJlZF90YWJsZSAgICAgX19rbXBfdGhyZWFkcHJpdmF0ZV9kX3RhYmxlOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMKKyNpZmRlZiBLTVBfSU5MSU5FX1NVQlIKK19fZm9yY2VpbmxpbmUKKyNlbmRpZgorc3RydWN0IHByaXZhdGVfY29tbW9uICoKK19fa21wX3RocmVhZHByaXZhdGVfZmluZF90YXNrX2NvbW1vbiggc3RydWN0IGNvbW1vbl90YWJsZSAqdGJsLCBpbnQgZ3RpZCwgdm9pZCAqcGNfYWRkciApCisKK3sKKyAgICBzdHJ1Y3QgcHJpdmF0ZV9jb21tb24gKnRuOworCisjaWZkZWYgS01QX1RBU0tfQ09NTU9OX0RFQlVHCisgICAgS0NfVFJBQ0UoIDEwLCAoICJfX2ttcF90aHJlYWRwcml2YXRlX2ZpbmRfdGFza19jb21tb246IHRocmVhZCMlZCwgY2FsbGVkIHdpdGggYWRkcmVzcyAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgZ3RpZCwgcGNfYWRkciApICk7CisgICAgZHVtcF9saXN0KCk7CisjZW5kaWYKKworICAgIGZvciAodG4gPSB0YmwtPmRhdGFbIEtNUF9IQVNIKHBjX2FkZHIpIF07IHRuOyB0biA9IHRuLT5uZXh0KSB7CisgICAgICAgIGlmICh0bi0+Z2JsX2FkZHIgPT0gcGNfYWRkcikgeworI2lmZGVmIEtNUF9UQVNLX0NPTU1PTl9ERUJVRworICAgICAgICAgICAgS0NfVFJBQ0UoIDEwLCAoICJfX2ttcF90aHJlYWRwcml2YXRlX2ZpbmRfdGFza19jb21tb246IHRocmVhZCMlZCwgZm91bmQgbm9kZSAlcCBvbiBsaXN0XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHBjX2FkZHIgKSApOworI2VuZGlmCisgICAgICAgICAgICByZXR1cm4gdG47CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYworI2lmZGVmIEtNUF9JTkxJTkVfU1VCUgorX19mb3JjZWlubGluZQorI2VuZGlmCitzdHJ1Y3Qgc2hhcmVkX2NvbW1vbiAqCitfX2ttcF9maW5kX3NoYXJlZF90YXNrX2NvbW1vbiggc3RydWN0IHNoYXJlZF90YWJsZSAqdGJsLCBpbnQgZ3RpZCwgdm9pZCAqcGNfYWRkciApCit7CisgICAgc3RydWN0IHNoYXJlZF9jb21tb24gKnRuOworCisgICAgZm9yICh0biA9IHRibC0+ZGF0YVsgS01QX0hBU0gocGNfYWRkcikgXTsgdG47IHRuID0gdG4tPm5leHQpIHsKKyAgICAgICAgaWYgKHRuLT5nYmxfYWRkciA9PSBwY19hZGRyKSB7CisjaWZkZWYgS01QX1RBU0tfQ09NTU9OX0RFQlVHCisgICAgICAgICAgICBLQ19UUkFDRSggMTAsICggIl9fa21wX2ZpbmRfc2hhcmVkX3Rhc2tfY29tbW9uOiB0aHJlYWQjJWQsIGZvdW5kIG5vZGUgJXAgb24gbGlzdFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCBwY19hZGRyICkgKTsKKyNlbmRpZgorICAgICAgICAgICAgcmV0dXJuIHRuOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisKKy8qCisgKiAgICAgIENyZWF0ZSBhIHRlbXBsYXRlIGZvciB0aGUgZGF0YSBpbml0aWFsaXplZCBzdG9yYWdlLgorICogICAgICBFaXRoZXIgdGhlIHRlbXBsYXRlIGlzIE5VTEwgaW5kaWNhdGluZyB6ZXJvIGZpbGwsCisgKiAgICAgIG9yIHRoZSB0ZW1wbGF0ZSBpcyBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIGRhdGEuCisgKi8KKworc3RhdGljIHN0cnVjdCBwcml2YXRlX2RhdGEgKgorX19rbXBfaW5pdF9jb21tb25fZGF0YSggdm9pZCAqcGNfYWRkciwgc2l6ZV90IHBjX3NpemUgKQoreworICAgIHN0cnVjdCBwcml2YXRlX2RhdGEgKmQ7CisgICAgc2l6ZV90ICAgICAgIGk7CisgICAgY2hhciAgICAgICAgKnA7CisKKyAgICBkID0gKHN0cnVjdCBwcml2YXRlX2RhdGEgKikgX19rbXBfYWxsb2NhdGUoIHNpemVvZiggc3RydWN0IHByaXZhdGVfZGF0YSApICk7CisvKgorICAgIGQtPmRhdGEgPSAwOyAgLy8gQUM6IGNvbW1lbnRlZCBvdXQgYmVjYXVzZSBfX2ttcF9hbGxvY2F0ZSB6ZXJvZXMgdGhlIG1lbW9yeQorICAgIGQtPm5leHQgPSAwOworKi8KKyAgICBkLT5zaXplID0gcGNfc2l6ZTsKKyAgICBkLT5tb3JlID0gMTsKKworICAgIHAgPSAoY2hhciopcGNfYWRkcjsKKworICAgIGZvciAoaSA9IHBjX3NpemU7ICBpID4gMDsgLS1pKSB7CisgICAgICAgIGlmICgqcCsrICE9ICdcMCcpIHsKKyAgICAgICAgICAgIGQtPmRhdGEgPSBfX2ttcF9hbGxvY2F0ZSggcGNfc2l6ZSApOworICAgICAgICAgICAgbWVtY3B5KCBkLT5kYXRhLCBwY19hZGRyLCBwY19zaXplICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBkOworfQorCisvKgorICogICAgICBJbml0aWFsaXplIHRoZSBkYXRhIGFyZWEgZnJvbSB0aGUgdGVtcGxhdGUuCisgKi8KKworc3RhdGljIHZvaWQKK19fa21wX2NvcHlfY29tbW9uX2RhdGEoIHZvaWQgKnBjX2FkZHIsIHN0cnVjdCBwcml2YXRlX2RhdGEgKmQgKQoreworICAgIGNoYXIgKmFkZHIgPSAoY2hhciAqKSBwY19hZGRyOworICAgIGludCAgIGksIG9mZnNldDsKKworICAgIGZvciAob2Zmc2V0ID0gMDsgZCAhPSAwOyBkID0gZC0+bmV4dCkgeworICAgICAgICBmb3IgKGkgPSBkLT5tb3JlOyBpID4gMDsgLS1pKSB7CisgICAgICAgICAgICBpZiAoZC0+ZGF0YSA9PSAwKQorICAgICAgICAgICAgICAgIG1lbXNldCggJiBhZGRyWyBvZmZzZXQgXSwgJ1wwJywgZC0+c2l6ZSApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1lbWNweSggJiBhZGRyWyBvZmZzZXQgXSwgZC0+ZGF0YSwgZC0+c2l6ZSApOworICAgICAgICAgICAgb2Zmc2V0ICs9IGQtPnNpemU7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIHdlIGFyZSBjYWxsZWQgZnJvbSBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSgpIHdpdGggX19rbXBfaW5pdHpfbG9jayBoZWxkLiAqLwordm9pZAorX19rbXBfY29tbW9uX2luaXRpYWxpemUoIHZvaWQgKQoreworICAgIGlmKCAhIFRDUl80KF9fa21wX2luaXRfY29tbW9uKSApIHsKKyAgICAgICAgaW50IHE7CisjaWZkZWYgS01QX0RFQlVHCisgICAgICAgIGludCBndGlkOworI2VuZGlmCisKKyAgICAgICAgX19rbXBfdGhyZWFkcHJpdl9jYWNoZV9saXN0ID0gTlVMTDsKKworI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAvKiB2ZXJpZnkgdGhlIHViZXIgbWFzdGVycyB3ZXJlIGluaXRpYWxpemVkICovCisgICAgICAgIGZvcihndGlkID0gMCA7IGd0aWQgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OyBndGlkKysgKQorICAgICAgICAgICAgaWYoIF9fa21wX3Jvb3RbZ3RpZF0gKSB7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfcm9vdFtndGlkXS0+ci5yX3ViZXJfdGhyZWFkICk7CisgICAgICAgICAgICAgICAgZm9yICggcSA9IDA7IHE8IEtNUF9IQVNIX1RBQkxFX1NJWkU7ICsrcSkKKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggIV9fa21wX3Jvb3RbZ3RpZF0tPnIucl91YmVyX3RocmVhZC0+dGgudGhfcHJpX2NvbW1vbi0+ZGF0YVtxXSApOworLyogICAgICAgICAgICAgICAgICAgIF9fa21wX3Jvb3RbIGdpdGQgXS0+IHIucl91YmVyX3RocmVhZCAtPiB0aC50aF9wcmlfY29tbW9uIC0+IGRhdGFbIHEgXSA9IDA7Ki8KKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKworICAgICAgICBmb3IgKHEgPSAwOyBxIDwgS01QX0hBU0hfVEFCTEVfU0laRTsgKytxKQorICAgICAgICAgICAgX19rbXBfdGhyZWFkcHJpdmF0ZV9kX3RhYmxlLmRhdGFbIHEgXSA9IDA7CisKKyAgICAgICAgVENXXzQoX19rbXBfaW5pdF9jb21tb24sIFRSVUUpOworICAgIH0KK30KKworLyogQ2FsbCBhbGwgZGVzdHJ1Y3RvcnMgZm9yIHRocmVhZHByaXZhdGUgZGF0YSBiZWxvbmdpbmcgdG8gYWxsIHRocmVhZHMuCisgICBDdXJyZW50bHkgdW51c2VkISAqLwordm9pZAorX19rbXBfY29tbW9uX2Rlc3Ryb3koIHZvaWQgKQoreworICAgIGlmKCBUQ1JfNChfX2ttcF9pbml0X2NvbW1vbikgKSB7CisgICAgICAgIGludCBxOworCisgICAgICAgIFRDV180KF9fa21wX2luaXRfY29tbW9uLCBGQUxTRSk7CisKKyAgICAgICAgZm9yIChxID0gMDsgcSA8IEtNUF9IQVNIX1RBQkxFX1NJWkU7ICsrcSkgeworICAgICAgICAgICAgaW50IGd0aWQ7CisgICAgICAgICAgICBzdHJ1Y3QgcHJpdmF0ZV9jb21tb24gKnRuOworICAgICAgICAgICAgc3RydWN0IHNoYXJlZF9jb21tb24gICpkX3RuOworCisgICAgICAgICAgICAvKiAgQysrIGRlc3RydWN0b3JzIG5lZWQgdG8gYmUgY2FsbGVkIG9uY2UgcGVyIHRocmVhZCBiZWZvcmUgZXhpdGluZyAgKi8KKyAgICAgICAgICAgIC8qICBkb24ndCBjYWxsIGRlc3RydWN0b3JzIGZvciBtYXN0ZXIgdGhyZWFkIHRob3VnaCB1bmxlc3Mgd2UgdXNlZCBjb3B5IGNvbnN0cnVjdG9yICovCisKKyAgICAgICAgICAgIGZvciAoZF90biA9IF9fa21wX3RocmVhZHByaXZhdGVfZF90YWJsZS5kYXRhWyBxIF07IGRfdG47IGRfdG4gPSBkX3RuLT5uZXh0KSB7CisgICAgICAgICAgICAgICAgaWYgKGRfdG4tPmlzX3ZlYykgeworICAgICAgICAgICAgICAgICAgICBpZiAoZF90bi0+ZHQuZHRvcnYgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChndGlkID0gMDsgZ3RpZCA8IF9fa21wX2FsbF9udGg7ICsrZ3RpZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBfX2ttcF90aHJlYWRzW2d0aWRdICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggKF9fa21wX2ZvcmVpZ25fdHApID8gKCEgS01QX0lOSVRJQUxfR1RJRCAoZ3RpZCkpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghIEtNUF9VQkVSX0dUSUQgKGd0aWQpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRuID0gX19rbXBfdGhyZWFkcHJpdmF0ZV9maW5kX3Rhc2tfY29tbW9uKCBfX2ttcF90aHJlYWRzWyBndGlkIF0tPnRoLnRoX3ByaV9jb21tb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgZF90bi0+Z2JsX2FkZHIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZF90bi0+ZHQuZHRvcnYpICh0bi0+cGFyX2FkZHIsIGRfdG4tPnZlY19sZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRfdG4tPm9ial9pbml0ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmRfdG4tPmR0LmR0b3J2KSAoZF90bi0+b2JqX2luaXQsIGRfdG4tPnZlY19sZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRfdG4tPmR0LmR0b3IgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChndGlkID0gMDsgZ3RpZCA8IF9fa21wX2FsbF9udGg7ICsrZ3RpZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBfX2ttcF90aHJlYWRzW2d0aWRdICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggKF9fa21wX2ZvcmVpZ25fdHApID8gKCEgS01QX0lOSVRJQUxfR1RJRCAoZ3RpZCkpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghIEtNUF9VQkVSX0dUSUQgKGd0aWQpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRuID0gX19rbXBfdGhyZWFkcHJpdmF0ZV9maW5kX3Rhc2tfY29tbW9uKCBfX2ttcF90aHJlYWRzWyBndGlkIF0tPnRoLnRoX3ByaV9jb21tb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgZF90bi0+Z2JsX2FkZHIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZF90bi0+ZHQuZHRvcikgKHRuLT5wYXJfYWRkcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZF90bi0+b2JqX2luaXQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZF90bi0+ZHQuZHRvcikgKGRfdG4tPm9ial9pbml0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9fa21wX3RocmVhZHByaXZhdGVfZF90YWJsZS5kYXRhWyBxIF0gPSAwOworICAgICAgICB9CisgICAgfQorfQorCisvKiBDYWxsIGFsbCBkZXN0cnVjdG9ycyBmb3IgdGhyZWFkcHJpdmF0ZSBkYXRhIGJlbG9uZ2luZyB0byB0aGlzIHRocmVhZCAqLwordm9pZAorX19rbXBfY29tbW9uX2Rlc3Ryb3lfZ3RpZCggaW50IGd0aWQgKQoreworICAgIHN0cnVjdCBwcml2YXRlX2NvbW1vbiAqdG47CisgICAgc3RydWN0IHNoYXJlZF9jb21tb24gKmRfdG47CisKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBfY29tbW9uX2Rlc3Ryb3lfZ3RpZDogVCMlZCBjYWxsZWRcbiIsIGd0aWQgKSApOworICAgIGlmKCAoX19rbXBfZm9yZWlnbl90cCkgPyAoISBLTVBfSU5JVElBTF9HVElEIChndGlkKSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoISBLTVBfVUJFUl9HVElEIChndGlkKSkgKSB7CisKKyAgICAgICAgaWYoIFRDUl80KF9fa21wX2luaXRfY29tbW9uKSApIHsKKworICAgICAgICAgICAgLyogQ2Fubm90IGRvIHRoaXMgaGVyZSBzaW5jZSBub3QgYWxsIHRocmVhZHMgaGF2ZSBkZXN0cm95ZWQgdGhlaXIgZGF0YSAqLworICAgICAgICAgICAgLyogVENXXzQoX19rbXBfaW5pdF9jb21tb24sIEZBTFNFKTsgKi8KKworICAgICAgICAgICAgZm9yICh0biA9IF9fa21wX3RocmVhZHNbIGd0aWQgXS0+dGgudGhfcHJpX2hlYWQ7IHRuOyB0biA9IHRuLT5saW5rKSB7CisKKyAgICAgICAgICAgICAgICBkX3RuID0gX19rbXBfZmluZF9zaGFyZWRfdGFza19jb21tb24oICZfX2ttcF90aHJlYWRwcml2YXRlX2RfdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0bi0+Z2JsX2FkZHIgKTsKKworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGRfdG4gKTsKKworICAgICAgICAgICAgICAgIGlmIChkX3RuLT5pc192ZWMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRfdG4tPmR0LmR0b3J2ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSAoKmRfdG4tPmR0LmR0b3J2KSAodG4tPnBhcl9hZGRyLCBkX3RuLT52ZWNfbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoZF90bi0+b2JqX2luaXQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpICgqZF90bi0+ZHQuZHRvcnYpIChkX3RuLT5vYmpfaW5pdCwgZF90bi0+dmVjX2xlbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoZF90bi0+ZHQuZHRvciAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCkgKCpkX3RuLT5kdC5kdG9yKSAodG4tPnBhcl9hZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoZF90bi0+b2JqX2luaXQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpICgqZF90bi0+ZHQuZHRvcikgKGRfdG4tPm9ial9pbml0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtDX1RSQUNFKCAzMCwgKCJfX2ttcF9jb21tb25fZGVzdHJveV9ndGlkOiBUIyVkIHRocmVhZHByaXZhdGUgZGVzdHJ1Y3RvcnMgY29tcGxldGVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkICkgKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIEtNUF9UQVNLX0NPTU1PTl9ERUJVRworc3RhdGljIHZvaWQKK2R1bXBfbGlzdCggdm9pZCApCit7CisgICAgaW50IHAsIHE7CisKKyAgICBmb3IgKHAgPSAwOyBwIDwgX19rbXBfYWxsX250aDsgKytwKSB7CisgICAgICAgIGlmKCAhX19rbXBfdGhyZWFkc1twXSApIGNvbnRpbnVlOworICAgICAgICBmb3IgKHEgPSAwOyBxIDwgS01QX0hBU0hfVEFCTEVfU0laRTsgKytxKSB7CisgICAgICAgICAgICBpZiAoX19rbXBfdGhyZWFkc1sgcCBdLT50aC50aF9wcmlfY29tbW9uLT5kYXRhWyBxIF0pIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgcHJpdmF0ZV9jb21tb24gKnRuOworCisgICAgICAgICAgICAgICAgS0NfVFJBQ0UoIDEwLCAoICJcdGR1bXBfbGlzdDogZ3RpZDolZCBhZGRyZXNzZXNcbiIsIHAgKSApOworCisgICAgICAgICAgICAgICAgZm9yICh0biA9IF9fa21wX3RocmVhZHNbIHAgXS0+dGgudGhfcHJpX2NvbW1vbi0+ZGF0YVsgcSBdOyB0bjsgdG4gPSB0bi0+bmV4dCkgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgS0NfVFJBQ0UoIDEwLCAoICJcdGR1bXBfbGlzdDogVEhSRUFEUFJJVkFURTogU2VyaWFsICVwIC0+IFBhcmFsbGVsICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG4tPmdibF9hZGRyLCB0bi0+cGFyX2FkZHIgKSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKyNlbmRpZiAvKiBLTVBfVEFTS19DT01NT05fREVCVUcgKi8KKworCisvKgorICogTk9URTogdGhpcyByb3V0aW5lIGlzIHRvIGJlIGNhbGxlZCBvbmx5IGZyb20gdGhlIHNlcmlhbCBwYXJ0IG9mIHRoZSBwcm9ncmFtLgorICovCisKK3ZvaWQKK2ttcF90aHJlYWRwcml2YXRlX2luc2VydF9wcml2YXRlX2RhdGEoIGludCBndGlkLCB2b2lkICpwY19hZGRyLCB2b2lkICpkYXRhX2FkZHIsIHNpemVfdCBwY19zaXplICkKK3sKKyAgICBzdHJ1Y3Qgc2hhcmVkX2NvbW1vbiAqKmxua190biwgKmRfdG47CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGhyZWFkc1sgZ3RpZCBdICYmCisgICAgICAgICAgICBfX2ttcF90aHJlYWRzWyBndGlkIF0gLT4gdGgudGhfcm9vdCAtPiByLnJfYWN0aXZlID09IDAgKTsKKworICAgIGRfdG4gPSBfX2ttcF9maW5kX3NoYXJlZF90YXNrX2NvbW1vbiggJl9fa21wX3RocmVhZHByaXZhdGVfZF90YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHBjX2FkZHIgKTsKKworICAgIGlmIChkX3RuID09IDApIHsKKyAgICAgICAgZF90biA9IChzdHJ1Y3Qgc2hhcmVkX2NvbW1vbiAqKSBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKCBzdHJ1Y3Qgc2hhcmVkX2NvbW1vbiApICk7CisKKyAgICAgICAgZF90bi0+Z2JsX2FkZHIgPSBwY19hZGRyOworICAgICAgICBkX3RuLT5wb2RfaW5pdCA9IF9fa21wX2luaXRfY29tbW9uX2RhdGEoIGRhdGFfYWRkciwgcGNfc2l6ZSApOworLyoKKyAgICAgICAgZF90bi0+b2JqX2luaXQgPSAwOyAgLy8gQUM6IGNvbW1lbnRlZCBvdXQgYmVjYXVzZSBfX2ttcF9hbGxvY2F0ZSB6ZXJvZXMgdGhlIG1lbW9yeQorICAgICAgICBkX3RuLT5jdC5jdG9yID0gMDsKKyAgICAgICAgZF90bi0+Y2N0LmNjdG9yID0gMDs7CisgICAgICAgIGRfdG4tPmR0LmR0b3IgPSAwOworICAgICAgICBkX3RuLT5pc192ZWMgPSBGQUxTRTsKKyAgICAgICAgZF90bi0+dmVjX2xlbiA9IDBMOworKi8KKyAgICAgICAgZF90bi0+Y21uX3NpemUgPSBwY19zaXplOworCisgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jayggJl9fa21wX2dsb2JhbF9sb2NrLCBndGlkICk7CisKKyAgICAgICAgbG5rX3RuID0gJihfX2ttcF90aHJlYWRwcml2YXRlX2RfdGFibGUuZGF0YVsgS01QX0hBU0gocGNfYWRkcikgXSk7CisKKyAgICAgICAgZF90bi0+bmV4dCA9ICpsbmtfdG47CisgICAgICAgICpsbmtfdG4gPSBkX3RuOworCisgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jayggJl9fa21wX2dsb2JhbF9sb2NrLCBndGlkICk7CisgICAgfQorfQorCitzdHJ1Y3QgcHJpdmF0ZV9jb21tb24gKgora21wX3RocmVhZHByaXZhdGVfaW5zZXJ0KCBpbnQgZ3RpZCwgdm9pZCAqcGNfYWRkciwgdm9pZCAqZGF0YV9hZGRyLCBzaXplX3QgcGNfc2l6ZSApCit7CisgICAgc3RydWN0IHByaXZhdGVfY29tbW9uICp0biwgKip0dDsKKyAgICBzdHJ1Y3Qgc2hhcmVkX2NvbW1vbiAgKmRfdG47CisKKyAgICAvKiArKysrKysrKysgU1RBUlQgT0YgQ1JJVElDQUwgU0VDVElPTiArKysrKysrKysgKi8KKworICAgIF9fa21wX2FjcXVpcmVfbG9jayggJiBfX2ttcF9nbG9iYWxfbG9jaywgZ3RpZCApOworCisgICAgdG4gPSAoc3RydWN0IHByaXZhdGVfY29tbW9uICopIF9fa21wX2FsbG9jYXRlKCBzaXplb2YgKHN0cnVjdCBwcml2YXRlX2NvbW1vbikgKTsKKworICAgIHRuLT5nYmxfYWRkciA9IHBjX2FkZHI7CisKKyAgICBkX3RuID0gX19rbXBfZmluZF9zaGFyZWRfdGFza19jb21tb24oICZfX2ttcF90aHJlYWRwcml2YXRlX2RfdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCBwY19hZGRyICk7ICAgICAvKiBPbmx5IHRoZSBNQVNURVIgZGF0YSB0YWJsZSBleGlzdHMuICovCisKKyAgICBpZiAoZF90biAhPSAwKSB7CisgICAgICAgIC8qIFRoaXMgdGhyZWFkcHJpdmF0ZSB2YXJpYWJsZSBoYXMgYWxyZWFkeSBiZWVuIHNlZW4uICovCisKKyAgICAgICAgaWYgKCBkX3RuLT5wb2RfaW5pdCA9PSAwICYmIGRfdG4tPm9ial9pbml0ID09IDAgKSB7CisgICAgICAgICAgICBkX3RuLT5jbW5fc2l6ZSA9IHBjX3NpemU7CisKKyAgICAgICAgICAgIGlmIChkX3RuLT5pc192ZWMpIHsKKyAgICAgICAgICAgICAgICBpZiAoZF90bi0+Y3QuY3RvcnYgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvKiBDb25zdHJ1Y3QgZnJvbSBzY3JhdGNoIHNvIG5vIHByb3RvdHlwZSBleGlzdHMgKi8KKyAgICAgICAgICAgICAgICAgICAgZF90bi0+b2JqX2luaXQgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChkX3RuLT5jY3QuY2N0b3J2ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLyogTm93IGRhdGEgaW5pdGlhbGl6ZSB0aGUgcHJvdG90eXBlIHNpbmNlIGl0IHdhcyBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgZF90bi0+b2JqX2luaXQgPSAodm9pZCAqKSBfX2ttcF9hbGxvY2F0ZSggZF90bi0+Y21uX3NpemUgKTsKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpICgqZF90bi0+Y2N0LmNjdG9ydikgKGRfdG4tPm9ial9pbml0LCBwY19hZGRyLCBkX3RuLT52ZWNfbGVuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRfdG4tPnBvZF9pbml0ID0gX19rbXBfaW5pdF9jb21tb25fZGF0YSggZGF0YV9hZGRyLCBkX3RuLT5jbW5fc2l6ZSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGRfdG4tPmN0LmN0b3IgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvKiBDb25zdHJ1Y3QgZnJvbSBzY3JhdGNoIHNvIG5vIHByb3RvdHlwZSBleGlzdHMgKi8KKyAgICAgICAgICAgICAgICAgICAgZF90bi0+b2JqX2luaXQgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChkX3RuLT5jY3QuY2N0b3IgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvKiBOb3cgZGF0YSBpbml0aWFsaXplIHRoZSBwcm90b3R5cGUgc2luY2UgaXQgd2FzIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCAqLworICAgICAgICAgICAgICAgICAgICBkX3RuLT5vYmpfaW5pdCA9ICh2b2lkICopIF9fa21wX2FsbG9jYXRlKCBkX3RuLT5jbW5fc2l6ZSApOworICAgICAgICAgICAgICAgICAgICAodm9pZCkgKCpkX3RuLT5jY3QuY2N0b3IpIChkX3RuLT5vYmpfaW5pdCwgcGNfYWRkcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkX3RuLT5wb2RfaW5pdCA9IF9fa21wX2luaXRfY29tbW9uX2RhdGEoIGRhdGFfYWRkciwgZF90bi0+Y21uX3NpemUgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHN0cnVjdCBzaGFyZWRfY29tbW9uICoqbG5rX3RuOworCisgICAgICAgIGRfdG4gPSAoc3RydWN0IHNoYXJlZF9jb21tb24gKikgX19rbXBfYWxsb2NhdGUoIHNpemVvZiggc3RydWN0IHNoYXJlZF9jb21tb24gKSApOworICAgICAgICBkX3RuLT5nYmxfYWRkciA9IHBjX2FkZHI7CisgICAgICAgIGRfdG4tPmNtbl9zaXplID0gcGNfc2l6ZTsKKyAgICAgICAgZF90bi0+cG9kX2luaXQgPSBfX2ttcF9pbml0X2NvbW1vbl9kYXRhKCBkYXRhX2FkZHIsIHBjX3NpemUgKTsKKy8qCisgICAgICAgIGRfdG4tPm9ial9pbml0ID0gMDsgIC8vIEFDOiBjb21tZW50ZWQgb3V0IGJlY2F1c2UgX19rbXBfYWxsb2NhdGUgemVyb2VzIHRoZSBtZW1vcnkKKyAgICAgICAgZF90bi0+Y3QuY3RvciA9IDA7CisgICAgICAgIGRfdG4tPmNjdC5jY3RvciA9IDA7CisgICAgICAgIGRfdG4tPmR0LmR0b3IgPSAwOworICAgICAgICBkX3RuLT5pc192ZWMgPSBGQUxTRTsKKyAgICAgICAgZF90bi0+dmVjX2xlbiA9IDBMOworKi8KKyAgICAgICAgbG5rX3RuID0gJihfX2ttcF90aHJlYWRwcml2YXRlX2RfdGFibGUuZGF0YVsgS01QX0hBU0gocGNfYWRkcikgXSk7CisKKyAgICAgICAgZF90bi0+bmV4dCA9ICpsbmtfdG47CisgICAgICAgICpsbmtfdG4gPSBkX3RuOworICAgIH0KKworICAgIHRuLT5jbW5fc2l6ZSA9IGRfdG4tPmNtbl9zaXplOworCisgICAgaWYgKCAoX19rbXBfZm9yZWlnbl90cCkgPyAoS01QX0lOSVRJQUxfR1RJRCAoZ3RpZCkpIDogKEtNUF9VQkVSX0dUSUQgKGd0aWQpKSApIHsKKyAgICAgICAgdG4tPnBhcl9hZGRyID0gKHZvaWQgKikgcGNfYWRkcjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHRuLT5wYXJfYWRkciA9ICh2b2lkICopIF9fa21wX2FsbG9jYXRlKCB0bi0+Y21uX3NpemUgKTsKKyAgICB9CisKKyAgICBfX2ttcF9yZWxlYXNlX2xvY2soICYgX19rbXBfZ2xvYmFsX2xvY2ssIGd0aWQgKTsKKworICAgIC8qICsrKysrKysrKyBFTkQgT0YgQ1JJVElDQUwgU0VDVElPTiArKysrKysrKysgKi8KKworI2lmZGVmIFVTRV9DSEVDS1NfQ09NTU9OCisgICAgICAgIGlmIChwY19zaXplID4gZF90bi0+Y21uX3NpemUpIHsKKyAgICAgICAgICAgIEtDX1RSQUNFKCAxMCwgKCAiX19rbXBfdGhyZWFkcHJpdmF0ZV9pbnNlcnQ6IFRIUkVBRFBSSVZBVEU6ICVwICglIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9VSU5UUFRSX1NQRUMgIiAsJSIgS01QX1VJTlRQVFJfU1BFQyAiKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY19hZGRyLCBwY19zaXplLCBkX3RuLT5jbW5fc2l6ZSApICk7CisgICAgICAgICAgICBLTVBfRkFUQUwoIFRQQ29tbW9uQmxvY2tzSW5jb25zaXN0ICk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBVU0VfQ0hFQ0tTX0NPTU1PTiAqLworCisgICAgdHQgPSAmKF9fa21wX3RocmVhZHNbIGd0aWQgXS0+dGgudGhfcHJpX2NvbW1vbi0+ZGF0YVsgS01QX0hBU0gocGNfYWRkcikgXSk7CisKKyNpZmRlZiBLTVBfVEFTS19DT01NT05fREVCVUcKKyAgICBpZiAoKnR0ICE9IDApIHsKKyAgICAgICAgS0NfVFJBQ0UoIDEwLCAoICJfX2ttcF90aHJlYWRwcml2YXRlX2luc2VydDogV0FSTklORyEgdGhyZWFkIyVkOiBjb2xsaXNpb24gb24gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCBwY19hZGRyICkgKTsKKyAgICB9CisjZW5kaWYKKyAgICB0bi0+bmV4dCA9ICp0dDsKKyAgICAqdHQgPSB0bjsKKworI2lmZGVmIEtNUF9UQVNLX0NPTU1PTl9ERUJVRworICAgIEtDX1RSQUNFKCAxMCwgKCAiX19rbXBfdGhyZWFkcHJpdmF0ZV9pbnNlcnQ6IHRocmVhZCMlZCwgaW5zZXJ0ZWQgbm9kZSAlcCBvbiBsaXN0XG4iLAorICAgICAgICAgICAgICAgICAgICBndGlkLCBwY19hZGRyICkgKTsKKyAgICBkdW1wX2xpc3QoICk7CisjZW5kaWYKKworICAgIC8qIExpbmsgdGhlIG5vZGUgaW50byBhIHNpbXBsZSBsaXN0ICovCisKKyAgICB0bi0+bGluayA9IF9fa21wX3RocmVhZHNbIGd0aWQgXS0+dGgudGhfcHJpX2hlYWQ7CisgICAgX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9wcmlfaGVhZCA9IHRuOworCisjaWZkZWYgQlVJTERfVFYKKyAgICBfX2ttcF90dl90aHJlYWRwcml2YXRlX3N0b3JlKCBfX2ttcF90aHJlYWRzWyBndGlkIF0sIHRuLT5nYmxfYWRkciwgdG4tPnBhcl9hZGRyICk7CisjZW5kaWYKKworICAgIGlmKCAoX19rbXBfZm9yZWlnbl90cCkgPyAoS01QX0lOSVRJQUxfR1RJRCAoZ3RpZCkpIDogKEtNUF9VQkVSX0dUSUQgKGd0aWQpKSApCisgICAgICAgIHJldHVybiB0bjsKKworICAgIC8qCisgICAgICogaWYgQysrIG9iamVjdCB3aXRoIGNvcHkgY29uc3RydWN0b3IsIHVzZSBpdDsKKyAgICAgKiBlbHNlIGlmIEMrKyBvYmplY3Qgd2l0aCBjb25zdHJ1Y3RvciwgdXNlIGl0IGZvciB0aGUgbm9uLW1hc3RlciBjb3BpZXMgb25seTsKKyAgICAgKiBlbHNlIHVzZSBwb2RfaW5pdCBhbmQgbWVtY3B5CisgICAgICoKKyAgICAgKiBDKysgY29uc3RydWN0b3JzIG5lZWQgdG8gYmUgY2FsbGVkIG9uY2UgZm9yIGVhY2ggbm9uLW1hc3RlciB0aHJlYWQgb24gYWxsb2NhdGUKKyAgICAgKiBDKysgY29weSBjb25zdHJ1Y3RvcnMgbmVlZCB0byBiZSBjYWxsZWQgb25jZSBmb3IgZWFjaCB0aHJlYWQgb24gYWxsb2NhdGUKKyAgICAgKi8KKworICAgIC8qCisgICAgICogQysrIG9iamVjdCB3aXRoIGNvbnN0cnVjdG9ycy9kZXN0cnVjdG9yczsKKyAgICAgKiBkb24ndCBjYWxsIGNvbnN0cnVjdG9ycyBmb3IgbWFzdGVyIHRocmVhZCB0aG91Z2gKKyAgICAgKi8KKyAgICBpZiAoZF90bi0+aXNfdmVjKSB7CisgICAgICAgIGlmICggZF90bi0+Y3QuY3RvcnYgIT0gMCkgeworICAgICAgICAgICAgKHZvaWQpICgqZF90bi0+Y3QuY3RvcnYpICh0bi0+cGFyX2FkZHIsIGRfdG4tPnZlY19sZW4pOworICAgICAgICB9IGVsc2UgaWYgKGRfdG4tPmNjdC5jY3RvcnYgIT0gMCkgeworICAgICAgICAgICAgKHZvaWQpICgqZF90bi0+Y2N0LmNjdG9ydikgKHRuLT5wYXJfYWRkciwgZF90bi0+b2JqX2luaXQsIGRfdG4tPnZlY19sZW4pOworICAgICAgICB9IGVsc2UgaWYgKHRuLT5wYXJfYWRkciAhPSB0bi0+Z2JsX2FkZHIpIHsKKyAgICAgICAgICAgIF9fa21wX2NvcHlfY29tbW9uX2RhdGEoIHRuLT5wYXJfYWRkciwgZF90bi0+cG9kX2luaXQgKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmICggZF90bi0+Y3QuY3RvciAhPSAwICkgeworICAgICAgICAgICAgKHZvaWQpICgqZF90bi0+Y3QuY3RvcikgKHRuLT5wYXJfYWRkcik7CisgICAgICAgIH0gZWxzZSBpZiAoZF90bi0+Y2N0LmNjdG9yICE9IDApIHsKKyAgICAgICAgICAgICh2b2lkKSAoKmRfdG4tPmNjdC5jY3RvcikgKHRuLT5wYXJfYWRkciwgZF90bi0+b2JqX2luaXQpOworICAgICAgICB9IGVsc2UgaWYgKHRuLT5wYXJfYWRkciAhPSB0bi0+Z2JsX2FkZHIpIHsKKyAgICAgICAgICAgIF9fa21wX2NvcHlfY29tbW9uX2RhdGEoIHRuLT5wYXJfYWRkciwgZF90bi0+cG9kX2luaXQgKTsKKyAgICAgICAgfQorICAgIH0KKy8qICFCVUlMRF9PUEVOTVBfQworICAgIGlmICh0bi0+cGFyX2FkZHIgIT0gdG4tPmdibF9hZGRyKQorICAgICAgICBfX2ttcF9jb3B5X2NvbW1vbl9kYXRhKCB0bi0+cGFyX2FkZHIsIGRfdG4tPnBvZF9pbml0ICk7ICovCisKKyAgICByZXR1cm4gdG47Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogV2UgYXJlIGN1cnJlbnRseSBwYXJhbGxlbCwgYW5kIHdlIGtub3cgdGhlIHRocmVhZCBpZC4gICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyohCisgQGluZ3JvdXAgVEhSRUFEUFJJVkFURQorCisgQHBhcmFtIGxvYyBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24gCisgQHBhcmFtIGRhdGEgIHBvaW50ZXIgdG8gZGF0YSBiZWluZyBwcml2YXRpemVkIAorIEBwYXJhbSBjdG9yICBwb2ludGVyIHRvIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIGZvciBkYXRhIAorIEBwYXJhbSBjY3RvciAgcG9pbnRlciB0byBjb3B5IGNvbnN0cnVjdG9yIGZ1bmN0aW9uIGZvciBkYXRhIAorIEBwYXJhbSBkdG9yICBwb2ludGVyIHRvIGRlc3RydWN0b3IgZnVuY3Rpb24gZm9yIGRhdGEgCisKKyBSZWdpc3RlciBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGZvciB0aHJlYWQgcHJpdmF0ZSBkYXRhLgorIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gZXhlY3V0aW5nIGluIHBhcmFsbGVsLCB3aGVuIHdlIGtub3cgdGhlIHRocmVhZCBpZC4KKyovCit2b2lkCitfX2ttcGNfdGhyZWFkcHJpdmF0ZV9yZWdpc3RlcihpZGVudF90ICpsb2MsIHZvaWQgKmRhdGEsIGttcGNfY3RvciBjdG9yLCBrbXBjX2NjdG9yIGNjdG9yLCBrbXBjX2R0b3IgZHRvcikKK3sKKyAgICBzdHJ1Y3Qgc2hhcmVkX2NvbW1vbiAqZF90biwgKipsbmtfdG47CisKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX3RocmVhZHByaXZhdGVfcmVnaXN0ZXI6IGNhbGxlZFxuIiApICk7CisKKyNpZmRlZiBVU0VfQ0hFQ0tTX0NPTU1PTgorICAgIC8qIGNvcHkgY29uc3RydWN0b3IgbXVzdCBiZSB6ZXJvIGZvciBjdXJyZW50IGNvZGUgZ2VuIChOb3YgMjAwMiAtIGpwaCkgKi8KKyAgICBLTVBfQVNTRVJUKCBjY3RvciA9PSAwKTsKKyNlbmRpZiAvKiBVU0VfQ0hFQ0tTX0NPTU1PTiAqLworCisgICAgLyogT25seSB0aGUgZ2xvYmFsIGRhdGEgdGFibGUgZXhpc3RzLiAqLworICAgIGRfdG4gPSBfX2ttcF9maW5kX3NoYXJlZF90YXNrX2NvbW1vbiggJl9fa21wX3RocmVhZHByaXZhdGVfZF90YWJsZSwgLTEsIGRhdGEgKTsKKworICAgIGlmIChkX3RuID09IDApIHsKKyAgICAgICAgZF90biA9IChzdHJ1Y3Qgc2hhcmVkX2NvbW1vbiAqKSBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKCBzdHJ1Y3Qgc2hhcmVkX2NvbW1vbiApICk7CisgICAgICAgIGRfdG4tPmdibF9hZGRyID0gZGF0YTsKKworICAgICAgICBkX3RuLT5jdC5jdG9yID0gY3RvcjsKKyAgICAgICAgZF90bi0+Y2N0LmNjdG9yID0gY2N0b3I7CisgICAgICAgIGRfdG4tPmR0LmR0b3IgPSBkdG9yOworLyoKKyAgICAgICAgZF90bi0+aXNfdmVjID0gRkFMU0U7ICAvLyBBQzogY29tbWVudGVkIG91dCBiZWNhdXNlIF9fa21wX2FsbG9jYXRlIHplcm9lcyB0aGUgbWVtb3J5CisgICAgICAgIGRfdG4tPnZlY19sZW4gPSAwTDsKKyAgICAgICAgZF90bi0+b2JqX2luaXQgPSAwOworICAgICAgICBkX3RuLT5wb2RfaW5pdCA9IDA7CisqLworICAgICAgICBsbmtfdG4gPSAmKF9fa21wX3RocmVhZHByaXZhdGVfZF90YWJsZS5kYXRhWyBLTVBfSEFTSChkYXRhKSBdKTsKKworICAgICAgICBkX3RuLT5uZXh0ID0gKmxua190bjsKKyAgICAgICAgKmxua190biA9IGRfdG47CisgICAgfQorfQorCit2b2lkICoKK19fa21wY190aHJlYWRwcml2YXRlKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKQoreworICAgIHZvaWQgKnJldDsKKyAgICBzdHJ1Y3QgcHJpdmF0ZV9jb21tb24gKnRuOworCisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY190aHJlYWRwcml2YXRlOiBUIyVkIGNhbGxlZFxuIiwgZ2xvYmFsX3RpZCApICk7CisKKyNpZmRlZiBVU0VfQ0hFQ0tTX0NPTU1PTgorICAgIGlmICghIF9fa21wX2luaXRfc2VyaWFsKQorICAgICAgICBLTVBfRkFUQUwoIFJUTE5vdEluaXRpYWxpemVkICk7CisjZW5kaWYgLyogVVNFX0NIRUNLU19DT01NT04gKi8KKworICAgIGlmICggISBfX2ttcF90aHJlYWRzW2dsb2JhbF90aWRdIC0+IHRoLnRoX3Jvb3QgLT4gci5yX2FjdGl2ZSAmJiAhIF9fa21wX2ZvcmVpZ25fdHAgKSB7CisgICAgICAgIC8qIFRoZSBwYXJhbGxlbCBhZGRyZXNzIHdpbGwgTkVWRVIgb3ZlcmxhcCB3aXRoIHRoZSBkYXRhX2FkZHJlc3MgKi8KKyAgICAgICAgLyogZGtwOiAzcmQgYXJnIHRvIGttcF90aHJlYWRwcml2YXRlX2luc2VydF9wcml2YXRlX2RhdGEoKSBpcyB0aGUgZGF0YV9hZGRyZXNzOyB1c2UgZGF0YV9hZGRyZXNzID0gZGF0YSAqLworCisgICAgICAgIEtDX1RSQUNFKCAyMCwgKCJfX2ttcGNfdGhyZWFkcHJpdmF0ZTogVCMlZCBpbnNlcnRpbmcgcHJpdmF0ZSBkYXRhXG4iLCBnbG9iYWxfdGlkICkgKTsKKyAgICAgICAga21wX3RocmVhZHByaXZhdGVfaW5zZXJ0X3ByaXZhdGVfZGF0YSggZ2xvYmFsX3RpZCwgZGF0YSwgZGF0YSwgc2l6ZSApOworCisgICAgICAgIHJldCA9IGRhdGE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBLQ19UUkFDRSggNTAsICgiX19rbXBjX3RocmVhZHByaXZhdGU6IFQjJWQgdHJ5IHRvIGZpbmQgcHJpdmF0ZSBkYXRhIGF0IGFkZHJlc3MgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF90aWQsIGRhdGEgKSApOworICAgICAgICB0biA9IF9fa21wX3RocmVhZHByaXZhdGVfZmluZF90YXNrX2NvbW1vbiggX19rbXBfdGhyZWFkc1sgZ2xvYmFsX3RpZCBdLT50aC50aF9wcmlfY29tbW9uLCBnbG9iYWxfdGlkLCBkYXRhICk7CisKKyAgICAgICAgaWYgKCB0biApIHsKKyAgICAgICAgICAgIEtDX1RSQUNFKCAyMCwgKCJfX2ttcGNfdGhyZWFkcHJpdmF0ZTogVCMlZCBmb3VuZCBkYXRhXG4iLCBnbG9iYWxfdGlkICkgKTsKKyNpZmRlZiBVU0VfQ0hFQ0tTX0NPTU1PTgorICAgICAgICAgICAgaWYgKChzaXplX3QpIHNpemUgPiB0bi0+Y21uX3NpemUpIHsKKyAgICAgICAgICAgICAgICBLQ19UUkFDRSggMTAsICggIlRIUkVBRFBSSVZBVEU6ICVwICglIiBLTVBfVUlOVFBUUl9TUEVDICIgLCUiIEtNUF9VSU5UUFRSX1NQRUMgIilcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsIHNpemUsIHRuLT5jbW5fc2l6ZSApICk7CisgICAgICAgICAgICAgICAgS01QX0ZBVEFMKCBUUENvbW1vbkJsb2Nrc0luY29uc2lzdCApOworICAgICAgICAgICAgfQorI2VuZGlmIC8qIFVTRV9DSEVDS1NfQ09NTU9OICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBUaGUgcGFyYWxsZWwgYWRkcmVzcyB3aWxsIE5FVkVSIG92ZXJsYXAgd2l0aCB0aGUgZGF0YV9hZGRyZXNzICovCisgICAgICAgICAgICAvKiBka3A6IDNyZCBhcmcgdG8ga21wX3RocmVhZHByaXZhdGVfaW5zZXJ0KCkgaXMgdGhlIGRhdGFfYWRkcmVzczsgdXNlIGRhdGFfYWRkcmVzcyA9IGRhdGEgKi8KKyAgICAgICAgICAgIEtDX1RSQUNFKCAyMCwgKCJfX2ttcGNfdGhyZWFkcHJpdmF0ZTogVCMlZCBpbnNlcnRpbmcgZGF0YVxuIiwgZ2xvYmFsX3RpZCApICk7CisgICAgICAgICAgICB0biA9IGttcF90aHJlYWRwcml2YXRlX2luc2VydCggZ2xvYmFsX3RpZCwgZGF0YSwgZGF0YSwgc2l6ZSApOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gdG4tPnBhcl9hZGRyOworICAgIH0KKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX3RocmVhZHByaXZhdGU6IFQjJWQgZXhpdGluZzsgcmV0dXJuIHZhbHVlID0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3RpZCwgcmV0ICkgKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qIQorIEBpbmdyb3VwIFRIUkVBRFBSSVZBVEUKKyBAcGFyYW0gbG9jIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiAKKyBAcGFyYW0gZ2xvYmFsX3RpZCAgZ2xvYmFsIHRocmVhZCBudW1iZXIgCisgQHBhcmFtIGRhdGEgIHBvaW50ZXIgdG8gZGF0YSB0byBwcml2YXRpemUgCisgQHBhcmFtIHNpemUgIHNpemUgb2YgZGF0YSB0byBwcml2YXRpemUgCisgQHBhcmFtIGNhY2hlICBwb2ludGVyIHRvIGNhY2hlIAorIEByZXR1cm4gcG9pbnRlciB0byBwcml2YXRlIHN0b3JhZ2UgCisKKyBBbGxvY2F0ZSBwcml2YXRlIHN0b3JhZ2UgZm9yIHRocmVhZHByaXZhdGUgZGF0YS4gCisqLwordm9pZCAqCitfX2ttcGNfdGhyZWFkcHJpdmF0ZV9jYWNoZWQoCisgICAgaWRlbnRfdCAqICBsb2MsCisgICAga21wX2ludDMyICBnbG9iYWxfdGlkLCAgIC8vIGd0aWQuCisgICAgdm9pZCAqICAgICBkYXRhLCAgICAgICAgIC8vIFBvaW50ZXIgdG8gb3JpZ2luYWwgZ2xvYmFsIHZhcmlhYmxlLgorICAgIHNpemVfdCAgICAgc2l6ZSwgICAgICAgICAvLyBTaXplIG9mIG9yaWdpbmFsIGdsb2JhbCB2YXJpYWJsZS4KKyAgICB2b2lkICoqKiAgIGNhY2hlCispIHsKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX3RocmVhZHByaXZhdGVfY2FjaGVkOiBUIyVkIGNhbGxlZCB3aXRoIGNhY2hlOiAlcCwgYWRkcmVzczogJXAsIHNpemU6ICUiCisgICAgICAgICAgICAgICAgICAgS01QX1NJWkVfVF9TUEVDICJcbiIsCisgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3RpZCwgKmNhY2hlLCBkYXRhLCBzaXplICkgKTsKKworICAgIGlmICggVENSX1BUUigqY2FjaGUpID09IDApIHsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCAmIF9fa21wX2dsb2JhbF9sb2NrLCBnbG9iYWxfdGlkICk7CisKKyAgICAgICAgaWYgKCBUQ1JfUFRSKCpjYWNoZSkgPT0gMCkgeworICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jaygmX19rbXBfdHBfY2FjaGVkX2xvY2spOworICAgICAgICAgICAgX19rbXBfdHBfY2FjaGVkID0gMTsKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soJl9fa21wX3RwX2NhY2hlZF9sb2NrKTsKKyAgICAgICAgICAgIHZvaWQgKiogbXlfY2FjaGU7CisgICAgICAgICAgICBLTVBfSVRUX0lHTk9SRSgKKyAgICAgICAgICAgIG15X2NhY2hlID0gKHZvaWQqKikKKyAgICAgICAgICAgICAgICBfX2ttcF9hbGxvY2F0ZShzaXplb2YoIHZvaWQgKiApICogX19rbXBfdHBfY2FwYWNpdHkgKyBzaXplb2YgKCBrbXBfY2FjaGVkX2FkZHJfdCApKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAvLyBObyBuZWVkIHRvIHplcm8gdGhlIGFsbG9jYXRlZCBtZW1vcnk7IF9fa21wX2FsbG9jYXRlIGRvZXMgdGhhdC4KKyAgICAgICAgICAgIEtDX1RSQUNFKCA1MCwgKCJfX2ttcGNfdGhyZWFkcHJpdmF0ZV9jYWNoZWQ6IFQjJWQgYWxsb2NhdGVkIGNhY2hlIGF0IGFkZHJlc3MgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfdGlkLCBteV9jYWNoZSApICk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIFRPRE86IGZyZWUgYWxsIHRoaXMgbWVtb3J5IGluIF9fa21wX2NvbW1vbl9kZXN0cm95IHVzaW5nIF9fa21wX3RocmVhZHByaXZfY2FjaGVfbGlzdCAqLworICAgICAgICAgICAgLyogQWRkIGFkZHJlc3Mgb2YgbXljYWNoZSB0byBsaW5rZWQgbGlzdCBmb3IgY2xlYW51cCBsYXRlciAgKi8KKyAgICAgICAgICAgIGttcF9jYWNoZWRfYWRkcl90ICp0cF9jYWNoZV9hZGRyOworCisgICAgICAgICAgICB0cF9jYWNoZV9hZGRyID0gKGttcF9jYWNoZWRfYWRkcl90ICopICYgbXlfY2FjaGVbX19rbXBfdHBfY2FwYWNpdHldOworICAgICAgICAgICAgdHBfY2FjaGVfYWRkciAtPiBhZGRyID0gbXlfY2FjaGU7CisgICAgICAgICAgICB0cF9jYWNoZV9hZGRyIC0+IG5leHQgPSBfX2ttcF90aHJlYWRwcml2X2NhY2hlX2xpc3Q7CisgICAgICAgICAgICBfX2ttcF90aHJlYWRwcml2X2NhY2hlX2xpc3QgPSB0cF9jYWNoZV9hZGRyOworCisgICAgICAgICAgICBLTVBfTUIoKTsKKworICAgICAgICAgICAgVENXX1BUUiggKmNhY2hlLCBteV9jYWNoZSk7CisKKyAgICAgICAgICAgIEtNUF9NQigpOworICAgICAgICB9CisKKyAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCAmIF9fa21wX2dsb2JhbF9sb2NrLCBnbG9iYWxfdGlkICk7CisgICAgfQorCisgICAgdm9pZCAqcmV0OworICAgIGlmICgocmV0ID0gVENSX1BUUigoKmNhY2hlKVsgZ2xvYmFsX3RpZCBdKSkgPT0gMCkgeworICAgICAgICByZXQgPSBfX2ttcGNfdGhyZWFkcHJpdmF0ZSggbG9jLCBnbG9iYWxfdGlkLCBkYXRhLCAoc2l6ZV90KSBzaXplKTsKKworICAgICAgICBUQ1dfUFRSKCAoKmNhY2hlKVsgZ2xvYmFsX3RpZCBdLCByZXQpOworICAgIH0KKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX3RocmVhZHByaXZhdGVfY2FjaGVkOiBUIyVkIGV4aXRpbmc7IHJldHVybiB2YWx1ZSA9ICVwXG4iLAorICAgICAgICAgICAgICAgICAgIGdsb2JhbF90aWQsIHJldCApICk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKiEKKyBAaW5ncm91cCBUSFJFQURQUklWQVRFCisgQHBhcmFtIGxvYyBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24gCisgQHBhcmFtIGRhdGEgIHBvaW50ZXIgdG8gZGF0YSBiZWluZyBwcml2YXRpemVkIAorIEBwYXJhbSBjdG9yICBwb2ludGVyIHRvIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIGZvciBkYXRhIAorIEBwYXJhbSBjY3RvciAgcG9pbnRlciB0byBjb3B5IGNvbnN0cnVjdG9yIGZ1bmN0aW9uIGZvciBkYXRhIAorIEBwYXJhbSBkdG9yICBwb2ludGVyIHRvIGRlc3RydWN0b3IgZnVuY3Rpb24gZm9yIGRhdGEgCisgQHBhcmFtIHZlY3Rvcl9sZW5ndGggbGVuZ3RoIG9mIHRoZSB2ZWN0b3IgKGJ5dGVzIG9yIGVsZW1lbnRzPykKKyBSZWdpc3RlciB2ZWN0b3IgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBmb3IgdGhyZWFkIHByaXZhdGUgZGF0YS4KKyovCit2b2lkCitfX2ttcGNfdGhyZWFkcHJpdmF0ZV9yZWdpc3Rlcl92ZWMoIGlkZW50X3QgKmxvYywgdm9pZCAqZGF0YSwga21wY19jdG9yX3ZlYyBjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBjX2NjdG9yX3ZlYyBjY3Rvciwga21wY19kdG9yX3ZlYyBkdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmVjdG9yX2xlbmd0aCApCit7CisgICAgc3RydWN0IHNoYXJlZF9jb21tb24gKmRfdG4sICoqbG5rX3RuOworCisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY190aHJlYWRwcml2YXRlX3JlZ2lzdGVyX3ZlYzogY2FsbGVkXG4iICkgKTsKKworI2lmZGVmIFVTRV9DSEVDS1NfQ09NTU9OCisgICAgLyogY29weSBjb25zdHJ1Y3RvciBtdXN0IGJlIHplcm8gZm9yIGN1cnJlbnQgY29kZSBnZW4gKE5vdiAyMDAyIC0ganBoKSAqLworICAgIEtNUF9BU1NFUlQoIGNjdG9yID09IDApOworI2VuZGlmIC8qIFVTRV9DSEVDS1NfQ09NTU9OICovCisKKyAgICBkX3RuID0gX19rbXBfZmluZF9zaGFyZWRfdGFza19jb21tb24oICZfX2ttcF90aHJlYWRwcml2YXRlX2RfdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgZGF0YSApOyAgICAgICAgLyogT25seSB0aGUgZ2xvYmFsIGRhdGEgdGFibGUgZXhpc3RzLiAqLworCisgICAgaWYgKGRfdG4gPT0gMCkgeworICAgICAgICBkX3RuID0gKHN0cnVjdCBzaGFyZWRfY29tbW9uICopIF9fa21wX2FsbG9jYXRlKCBzaXplb2YoIHN0cnVjdCBzaGFyZWRfY29tbW9uICkgKTsKKyAgICAgICAgZF90bi0+Z2JsX2FkZHIgPSBkYXRhOworCisgICAgICAgIGRfdG4tPmN0LmN0b3J2ID0gY3RvcjsKKyAgICAgICAgZF90bi0+Y2N0LmNjdG9ydiA9IGNjdG9yOworICAgICAgICBkX3RuLT5kdC5kdG9ydiA9IGR0b3I7CisgICAgICAgIGRfdG4tPmlzX3ZlYyA9IFRSVUU7CisgICAgICAgIGRfdG4tPnZlY19sZW4gPSAoc2l6ZV90KSB2ZWN0b3JfbGVuZ3RoOworLyoKKyAgICAgICAgZF90bi0+b2JqX2luaXQgPSAwOyAgLy8gQUM6IGNvbW1lbnRlZCBvdXQgYmVjYXVzZSBfX2ttcF9hbGxvY2F0ZSB6ZXJvZXMgdGhlIG1lbW9yeQorICAgICAgICBkX3RuLT5wb2RfaW5pdCA9IDA7CisqLworICAgICAgICBsbmtfdG4gPSAmKF9fa21wX3RocmVhZHByaXZhdGVfZF90YWJsZS5kYXRhWyBLTVBfSEFTSChkYXRhKSBdKTsKKworICAgICAgICBkX3RuLT5uZXh0ID0gKmxua190bjsKKyAgICAgICAgKmxua190biA9IGRfdG47CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX3V0aWxpdHkuYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF91dGlsaXR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFmMzkxNgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF91dGlsaXR5LmMKQEAgLTAsMCArMSw0NDIgQEAKKy8qCisgKiBrbXBfdXRpbGl0eS5jIC0tIFV0aWxpdHkgcm91dGluZXMgZm9yIHRoZSBPcGVuTVAgc3VwcG9ydCBsaWJyYXJ5LgorICogJFJldmlzaW9uOiA0MjU4OCAkCisgKiAkRGF0ZTogMjAxMy0wOC0xMyAwMToyNjowMCAtMDUwMCAoVHVlLCAxMyBBdWcgMjAxMykgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX3dyYXBwZXJfZ2V0cGlkLmgiCisjaW5jbHVkZSAia21wX3N0ci5oIgorI2luY2x1ZGUgPGZsb2F0Lmg+CisjaW5jbHVkZSAia21wX2kxOG4uaCIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKnVua25vd24gPSAidW5rbm93biI7CisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisKKy8qIE5PVEU6IElmIGNhbGxlZCBiZWZvcmUgc2VyaWFsX2luaXRpYWxpemUgKGkuZS4gZnJvbSBydW50aW1lX2luaXRpYWxpemUpLCB0aGVuICovCisvKiB0aGUgZGVidWdnaW5nIHBhY2thZ2UgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIHlldCwgYW5kIG9ubHkgIjAiIHdpbGwgcHJpbnQgICAqLworLyogZGVidWdnaW5nIG91dHB1dCBzaW5jZSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGhhdmUgbm90IGJlZW4gcmVhZC4gICAgICAgICAgKi8KKworc3RhdGljIGludCB0cmFjZV9sZXZlbCA9IDU7CisKKy8qCisgKiBMT0dfSURfQklUUyAgPSAoIDEgKyBmbG9vciggbG9nXzIoIG1heCggbG9nX3Blcl9waHkgLSAxLCAxICkpKSkKKyAqIEFQSUNfSUQgICAgICA9IChQSFlfSUQgPDwgTE9HX0lEX0JJVFMpIHwgTE9HX0lECisgKiBQSFlfSUQgICAgICAgPSBBUElDX0lEID4+IExPR19JRF9CSVRTCisgKi8KK2ludAorX19rbXBfZ2V0X3BoeXNpY2FsX2lkKCBpbnQgbG9nX3Blcl9waHksIGludCBhcGljX2lkICkKK3sKKyAgIGludCBpbmRleF9sc2IsIGluZGV4X21zYiwgdGVtcDsKKworICAgaWYgKGxvZ19wZXJfcGh5ID4gMSkgeworCWluZGV4X2xzYiA9IDA7CisJaW5kZXhfbXNiID0gMzE7CisKKwl0ZW1wID0gbG9nX3Blcl9waHk7CisgICAgICAgIHdoaWxlICggKHRlbXAgJiAxKSA9PSAwICkgeworCSAgICB0ZW1wICA+Pj0gMTsKKwkgICAgaW5kZXhfbHNiKys7CisJfQorCisJdGVtcCA9IGxvZ19wZXJfcGh5OworCXdoaWxlICggKHRlbXAgJiAweDgwMDAwMDAwKT09MCApIHsKKwkgICAgdGVtcCA8PD0gMTsKKwkgICAgaW5kZXhfbXNiLS07CisJfQorCisJLyogSWYgPjEgYml0cyB3ZXJlIHNldCBpbiBsb2dfcGVyX3BoeSwgY2hvb3NlIG5leHQgaGlnaGVyIHBvd2VyIG9mIDIgKi8KKwlpZiAoaW5kZXhfbHNiICE9IGluZGV4X21zYikgaW5kZXhfbXNiKys7CisKKwlyZXR1cm4gKCAoaW50KSAoYXBpY19pZCA+PiBpbmRleF9tc2IpICk7CisgICB9CisKKyAgIHJldHVybiBhcGljX2lkOworfQorCisKKy8qCisgKiBMT0dfSURfQklUUyAgPSAoIDEgKyBmbG9vciggbG9nXzIoIG1heCggbG9nX3Blcl9waHkgLSAxLCAxICkpKSkKKyAqIEFQSUNfSUQgICAgICA9IChQSFlfSUQgPDwgTE9HX0lEX0JJVFMpIHwgTE9HX0lECisgKiBMT0dfSUQgICAgICAgPSBBUElDX0lEICYgKCggMSA8PCBMT0dfSURfQklUUyApIC0gMSApCisgKi8KK2ludAorX19rbXBfZ2V0X2xvZ2ljYWxfaWQoIGludCBsb2dfcGVyX3BoeSwgaW50IGFwaWNfaWQgKQoreworICAgdW5zaWduZWQgY3VycmVudF9iaXQ7CisgICBpbnQgYml0c19zZWVuOworICAgdW5zaWduZWQgbWFzazsKKworICAgaWYgKGxvZ19wZXJfcGh5IDw9IDEpIHJldHVybiAoIDAgKTsKKworICAgYml0c19zZWVuID0gMDsKKworICAgZm9yIChjdXJyZW50X2JpdCA9IDE7IGxvZ19wZXJfcGh5ICE9IDA7IGN1cnJlbnRfYml0IDw8PSAxKSB7CisJaWYgKCBsb2dfcGVyX3BoeSAmIGN1cnJlbnRfYml0ICkgeworCSAgICBsb2dfcGVyX3BoeSAmPSB+Y3VycmVudF9iaXQ7CisJICAgIGJpdHNfc2VlbisrOworCX0KKyAgIH0KKworICAgLyogSWYgZXhhY3RseSAxIGJpdCB3YXMgc2V0IGluIGxvZ19wZXJfcGh5LCBjaG9vc2UgbmV4dCBsb3dlciBwb3dlciBvZiAyICovCisgICBpZiAoYml0c19zZWVuID09IDEpIHsKKwljdXJyZW50X2JpdCA+Pj0gMTsKKyAgIH0KKworICAgcmV0dXJuICggKGludCkgKChjdXJyZW50X2JpdCAtIDEpICYgYXBpY19pZCkgKTsKK30KKworCitzdGF0aWMKK2ttcF91aW50NjQKK19fa21wX3BhcnNlX2ZyZXF1ZW5jeSggICAgICAgIC8vIFI6IEZyZXF1ZW5jeSBpbiBIei4KKyAgICBjaGFyIGNvbnN0ICogZnJlcXVlbmN5ICAgIC8vIEk6IEZsb2F0IG51bWJlciBhbmQgdW5pdDogTUh6LCBHSHosIG9yIFRHei4KKykgeworCisgICAgZG91YmxlICAgICAgIHZhbHVlICA9IDAuMDsKKyAgICBjaGFyIGNvbnN0ICogdW5pdCAgID0gTlVMTDsKKyAgICBrbXBfdWludDY0ICAgcmVzdWx0ID0gfiAwOworCisgICAgaWYgKCBmcmVxdWVuY3kgPT0gTlVMTCApIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9OyAvLyBpZgorICAgIHZhbHVlID0gc3RydG9kKCBmcmVxdWVuY3ksIChjaGFyICogKikgJiB1bml0ICk7IC8vIHN0cnRvZCgpIGRvZXMgbm90IGxpa2UgImNoYXIgY29udHMgKiIuCisgICAgaWYgKCAwIDwgdmFsdWUgJiYgdmFsdWUgPD0gREJMX01BWCApIHsgICAgICAgICAgLy8gR29vZCB2YWx1ZSAobm90IG92ZXJmbG93LCB1bmRlcmZsb3csIGV0YykuCisgICAgICAgIGlmICggc3RyY21wKCB1bml0LCAiTUh6IiApID09IDAgKSB7CisgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlICogMS4wRSs2OworICAgICAgICB9IGVsc2UgaWYgKCBzdHJjbXAoIHVuaXQsICJHSHoiICkgPT0gMCApIHsKKyAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgKiAxLjBFKzk7CisgICAgICAgIH0gZWxzZSBpZiAoIHN0cmNtcCggdW5pdCwgIlRIeiIgKSA9PSAwICkgeworICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSAqIDEuMEUrMTI7CisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgIC8vIFdyb25nIHVuaXQuCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9OyAvLyBpZgorICAgICAgICByZXN1bHQgPSB2YWx1ZTsKKyAgICB9OyAvLyBpZgorICAgIHJldHVybiByZXN1bHQ7CisKK307IC8vIGZ1bmMgX19rbXBfcGFyc2VfY3B1X2ZyZXF1ZW5jeQorCit2b2lkCitfX2ttcF9xdWVyeV9jcHVpZCgga21wX2NwdWluZm9fdCAqcCApCit7CisgICAgc3RydWN0IGttcF9jcHVpZCBidWY7CisgICAgaW50IG1heF9hcmc7CisgICAgaW50IGxvZ19wZXJfcGh5OworICAgIGludCBjZmx1c2hfc2l6ZTsKKworICAgIHAtPmluaXRpYWxpemVkID0gMTsKKworICAgIHAtPnNzZTIgPSAxOyAvLyBBc3N1bWUgU1NFMiBieSBkZWZhdWx0LgorCisgICAgX19rbXBfeDg2X2NwdWlkKCAwLCAwLCAmYnVmICk7CisKKyAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICgiSU5GTzogQ1BVSUQgJWQ6IEVBWD0weCUwOFggRUJYPTB4JTA4WCBFQ1g9MHglMDhYIEVEWD0weCUwOFhcbiIsCisgICAgICAgIDAsIGJ1Zi5lYXgsIGJ1Zi5lYngsIGJ1Zi5lY3gsIGJ1Zi5lZHggKSApOworCisgICAgbWF4X2FyZyA9IGJ1Zi5lYXg7CisKKyAgICBwLT5hcGljX2lkID0gLTE7CisKKyAgICBpZiAobWF4X2FyZyA+PSAxKSB7CisgICAgICAgIGludCBpOworICAgICAgICBrbXBfdWludDMyIHQsIGRhdGFbIDQgXTsKKworICAgICAgICBfX2ttcF94ODZfY3B1aWQoIDEsIDAsICZidWYgKTsKKyAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoIklORk86IENQVUlEICVkOiBFQVg9MHglMDhYIEVCWD0weCUwOFggRUNYPTB4JTA4WCBFRFg9MHglMDhYXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBidWYuZWF4LCBidWYuZWJ4LCBidWYuZWN4LCBidWYuZWR4ICkgKTsKKworICAgICAgICB7CisjZGVmaW5lIGdldF92YWx1ZShyZWcsbG8sbWFzaykgKCAoICggcmVnICkgPj4gKCBsbyApICkgJiAoIG1hc2sgICkgKQorCisgICAgICAgICAgICBwLT5zaWduYXR1cmUgPSBidWYuZWF4OworICAgICAgICAgICAgcC0+ZmFtaWx5ICAgID0gICBnZXRfdmFsdWUoIGJ1Zi5lYXgsIDIwLCAweGZmICkgICAgICAgICsgZ2V0X3ZhbHVlKCBidWYuZWF4LCA4LCAweDBmICk7CisgICAgICAgICAgICBwLT5tb2RlbCAgICAgPSAoIGdldF92YWx1ZSggYnVmLmVheCwgMTYsIDB4MGYgKSA8PCA0ICkgKyBnZXRfdmFsdWUoIGJ1Zi5lYXgsIDQsIDB4MGYgKTsKKyAgICAgICAgICAgIHAtPnN0ZXBwaW5nICA9ICAgZ2V0X3ZhbHVlKCBidWYuZWF4LCAgMCwgMHgwZiApOworCisjdW5kZWYgZ2V0X3ZhbHVlCisKKyAgICAgICAgICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCIgZmFtaWx5ID0gJWQsIG1vZGVsID0gJWQsIHN0ZXBwaW5nID0gJWRcbiIsIHAtPmZhbWlseSwgcC0+bW9kZWwsIHAtPnN0ZXBwaW5nICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoIHQgPSBidWYuZWJ4LCBpID0gMDsgaSA8IDQ7IHQgPj49IDgsICsraSApIHsKKyAgICAgICAgICAgIGRhdGFbIGkgXSA9ICh0ICYgMHhmZik7CisgICAgICAgIH07IC8vIGZvcgorCisgICAgICAgIHAtPnNzZTIgPSAoIGJ1Zi5lZHggPj4gMjYgKSAmIDE7CisKKyNpZmRlZiBLTVBfREVCVUcKKworICAgICAgICBpZiAoIChidWYuZWR4ID4+IDQpICYgMSApIHsKKyAgICAgICAgICAgIC8qIFRTQyAtIFRpbWVzdGFtcCBDb3VudGVyIEF2YWlsYWJsZSAqLworICAgICAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoIiBUU0MiICkgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIChidWYuZWR4ID4+IDgpICYgMSApIHsKKyAgICAgICAgICAgIC8qIENYOCAtIENNUFhDSEc4QiBJbnN0cnVjdGlvbiBBdmFpbGFibGUgKi8KKyAgICAgICAgICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCIgQ1g4IiApICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAoYnVmLmVkeCA+PiA5KSAmIDEgKSB7CisgICAgICAgICAgICAvKiBBUElDIC0gTG9jYWwgQVBJQyBQcmVzZW50IChtdWx0aS1wcm9jZXNzb3Igb3BlcmF0aW9uIHN1cHBvcnQgKi8KKyAgICAgICAgICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCIgQVBJQyIgKSApOworICAgICAgICB9CisgICAgICAgIGlmICggKGJ1Zi5lZHggPj4gMTUpICYgMSApIHsKKyAgICAgICAgICAgIC8qIENNT1YgLSBDb25kaXRpb25hbCBNT1ZlIEluc3RydWN0aW9uIEF2YWlsYWJsZSAqLworICAgICAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoIiBDTU9WIiApICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAoYnVmLmVkeCA+PiAxOCkgJiAxICkgeworICAgICAgICAgICAgLyogUFNOIC0gUHJvY2Vzc29yIFNlcmlhbCBOdW1iZXIgQXZhaWxhYmxlICovCisgICAgICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICgiIFBTTiIgKSApOworICAgICAgICB9CisgICAgICAgIGlmICggKGJ1Zi5lZHggPj4gMTkpICYgMSApIHsKKyAgICAgICAgICAgIC8qIENMRlVMU0ggLSBDYWNoZSBGbHVzaCBJbnN0cnVjdGlvbiBBdmFpbGFibGUgKi8KKyAgICAgICAgICAgIGNmbHVzaF9zaXplID0gZGF0YVsgMSBdICogODsgICAgLyogQml0cyAxNS0wODogQ0xGTFVTSCBsaW5lIHNpemUgPSA4ICg2NCBieXRlcykgKi8KKyAgICAgICAgICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCIgQ0xGTFVTSCglZGIpIiwgY2ZsdXNoX3NpemUgKSApOworCisgICAgICAgIH0KKyAgICAgICAgaWYgKCAoYnVmLmVkeCA+PiAyMSkgJiAxICkgeworICAgICAgICAgICAgLyogRFRFUyAtIERlYnVnIFRyYWNlICYgRU1PTiBTdG9yZSAqLworICAgICAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoIiBEVEVTIiApICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAoYnVmLmVkeCA+PiAyMikgJiAxICkgeworICAgICAgICAgICAgLyogQUNQSSAtIEFDUEkgU3VwcG9ydCBBdmFpbGFibGUgKi8KKyAgICAgICAgICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCIgQUNQSSIgKSApOworICAgICAgICB9CisgICAgICAgIGlmICggKGJ1Zi5lZHggPj4gMjMpICYgMSApIHsKKyAgICAgICAgICAgIC8qIE1NWCAtIE11bHRpbWVkaWEgRXh0ZW5zaW9ucyAqLworICAgICAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoIiBNTVgiICkgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIChidWYuZWR4ID4+IDI1KSAmIDEgKSB7CisgICAgICAgICAgICAvKiBTU0UgLSBTU0UgSW5zdHJ1Y3Rpb25zICovCisgICAgICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICgiIFNTRSIgKSApOworICAgICAgICB9CisgICAgICAgIGlmICggKGJ1Zi5lZHggPj4gMjYpICYgMSApIHsKKyAgICAgICAgICAgIC8qIFNTRTIgLSBTU0UyIEluc3RydWN0aW9ucyAqLworICAgICAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoIiBTU0UyIiApICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAoYnVmLmVkeCA+PiAyNykgJiAxICkgeworICAgICAgICAgICAgLyogU0xGU05QIC0gU2VsZi1Tbm9vcGluZyBDYWNoZSAqLworICAgICAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoIiBTTEZTTlAiICkgKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCisgICAgICAgIF9fa21wX2h0X2NhcGFibGUgPSBGQUxTRTsKKyAgICAgICAgaWYgKCAoYnVmLmVkeCA+PiAyOCkgJiAxICkgeworCisgICAgICAgICAgICAvKiBIVCAtIFByb2Nlc3NvciBpcyBIVCBFbmFibGVkIChmb3JtZXJseSBKVCkgKi8KKyAgICAgICAgICAgIF9fa21wX2h0X2NhcGFibGUgPSBUUlVFOworCisgICAgICAgICAgICAvKiBCaXRzIDIzLTE2OiBMb2dpY2FsIFByb2Nlc3NvcnMgcGVyIFBoeXNpY2FsIFByb2Nlc3NvciAoMSBmb3IgUDQpICovCisgICAgICAgICAgICBsb2dfcGVyX3BoeSA9IGRhdGFbIDIgXTsKKyAgICAgICAgICAgIF9fa21wX2h0X2xvZ19wZXJfcGh5ID0gbG9nX3Blcl9waHk7CisKKyAgICAgICAgICAgIHAtPmFwaWNfaWQgICAgID0gZGF0YVsgMyBdOyAvKiBCaXRzIDMxLTI0OiBQcm9jZXNzb3IgSW5pdGlhbCBBUElDIElEIChYKSAqLworICAgICAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoIiBIVCglZCBUUFVzKSIsIGxvZ19wZXJfcGh5ICkgKTsKKworICAgICAgICAgICAgaWYoIGxvZ19wZXJfcGh5ID4gMSApIHsKKyAgICAgICAgICAgICAgICAvKiBkZWZhdWx0IHRvIDFrIEZPUiBKVC1lbmFibGVkIHByb2Nlc3NvcnMgKDRrIG9uIE9TIFgqKSAqLworI2lmIEtNUF9PU19EQVJXSU4KKyAgICAgICAgICAgICAgICBwLT5jcHVfc3RhY2tvZmZzZXQgPSA0ICogMTAyNDsKKyNlbHNlCisgICAgICAgICAgICAgICAgcC0+Y3B1X3N0YWNrb2Zmc2V0ID0gMSAqIDEwMjQ7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcC0+cGh5c2ljYWxfaWQgPSBfX2ttcF9nZXRfcGh5c2ljYWxfaWQoIGxvZ19wZXJfcGh5LCBwLT5hcGljX2lkICk7CisgICAgICAgICAgICBwLT5sb2dpY2FsX2lkICA9IF9fa21wX2dldF9sb2dpY2FsX2lkKCBsb2dfcGVyX3BoeSwgcC0+YXBpY19pZCApOworICAgICAgICB9CisjaWZkZWYgS01QX0RFQlVHCisgICAgICAgIGlmICggKGJ1Zi5lZHggPj4gMjkpICYgMSApIHsKKyAgICAgICAgICAgIC8qIEFUSFJPVEwgLSBBdXRvbWF0aWMgVGhyb3R0bGUgQ29udHJvbCAqLworICAgICAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoIiBBVEhST1RMIiApICk7CisgICAgICAgIH0KKyAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoIiBdXG4iICkgKTsKKworICAgICAgICBmb3IgKGkgPSAyOyBpIDw9IG1heF9hcmc7ICsraSkgeworICAgICAgICAgICAgX19rbXBfeDg2X2NwdWlkKCBpLCAwLCAmYnVmICk7CisgICAgICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgKCAiSU5GTzogQ1BVSUQgJWQ6IEVBWD0weCUwOFggRUJYPTB4JTA4WCBFQ1g9MHglMDhYIEVEWD0weCUwOFhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBpLCBidWYuZWF4LCBidWYuZWJ4LCBidWYuZWN4LCBidWYuZWR4ICkgKTsKKyAgICAgICAgfQorI2VuZGlmCisjaWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworICAgICAgICBwLT5ydG0gPSAwOworICAgICAgICBpZiAobWF4X2FyZyA+IDcpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFJUTSBiaXQgQ1BVSUQuMDc6RUJYLCBiaXQgMTEgKi8KKyAgICAgICAgICAgIF9fa21wX3g4Nl9jcHVpZCg3LCAwLCAmYnVmKTsKKyAgICAgICAgICAgIHAtPnJ0bSA9IChidWYuZWJ4ID4+IDExKSAmIDE7CisgICAgICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICgiIFJUTSIgKSApOworICAgICAgICB9CisjZW5kaWYKKyAgICB9OyAvLyBpZgorCisgICAgeyAvLyBQYXJzZSBDUFUgYnJhbmQgc3RyaW5nIGZvciBmcmVxdWVuY3kuCisKKyAgICAgICAgdW5pb24ga21wX2NwdV9icmFuZF9zdHJpbmcgeworICAgICAgICAgICAgc3RydWN0IGttcF9jcHVpZCBidWZbIDMgXTsKKyAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgc3RyaW5nWyBzaXplb2YoIHN0cnVjdCBrbXBfY3B1aWQgKSAqIDMgKyAxIF07CisgICAgICAgIH07IC8vIHVuaW9uIGttcF9jcHVfYnJhbmRfc3RyaW5nCisgICAgICAgIHVuaW9uIGttcF9jcHVfYnJhbmRfc3RyaW5nIGJyYW5kOworICAgICAgICBpbnQgaTsKKworICAgICAgICBwLT5mcmVxdWVuY3kgPSAwOworCisgICAgICAgIC8vIEdldCBDUFUgYnJhbmQgc3RyaW5nLgorICAgICAgICBmb3IgKCBpID0gMDsgaSA8IDM7ICsrIGkgKSB7CisgICAgICAgICAgICBfX2ttcF94ODZfY3B1aWQoIDB4ODAwMDAwMDIgKyBpLCAwLCAmYnJhbmQuYnVmWyBpIF0gKTsKKyAgICAgICAgfTsgLy8gZm9yCisgICAgICAgIGJyYW5kLnN0cmluZ1sgc2l6ZW9mKCBicmFuZC5zdHJpbmcgKSAtIDEgXSA9IDA7IC8vIEp1c3QgaW4gY2FzZS4gOy0pCisgICAgICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCAiY3B1IGJyYW5kIHN0cmluZzogXCIlc1wiXG4iLCBicmFuZC5zdHJpbmcgKSApOworCisgICAgICAgIC8vIFBhcnNlIGZyZXF1ZW5jeS4KKyAgICAgICAgcC0+ZnJlcXVlbmN5ID0gX19rbXBfcGFyc2VfZnJlcXVlbmN5KCBzdHJyY2hyKCBicmFuZC5zdHJpbmcsICcgJyApICk7CisgICAgICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCAiY3B1IGZyZXF1ZW5jeSBmcm9tIGJyYW5kIHN0cmluZzogJSIgS01QX1VJTlQ2NF9TUEVDICJcbiIsIHAtPmZyZXF1ZW5jeSApICk7CisgICAgfQorfQorCisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkCitfX2ttcF9leHBhbmRfaG9zdF9uYW1lKCBjaGFyICpidWZmZXIsIHNpemVfdCBzaXplICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKHNpemUgPj0gc2l6ZW9mKHVua25vd24pKTsKKyNpZiBLTVBfT1NfV0lORE9XUworICAgIHsKKwlEV09SRAlzID0gc2l6ZTsKKworCWlmICghIEdldENvbXB1dGVyTmFtZUEoIGJ1ZmZlciwgJiBzICkpCisJICAgIHN0cmNweSggYnVmZmVyLCB1bmtub3duICk7CisgICAgfQorI2Vsc2UKKyAgICBidWZmZXJbc2l6ZSAtIDJdID0gMDsKKyAgICBpZiAoZ2V0aG9zdG5hbWUoIGJ1ZmZlciwgc2l6ZSApIHx8IGJ1ZmZlcltzaXplIC0gMl0gIT0gMCkKKwlzdHJjcHkoIGJ1ZmZlciwgdW5rbm93biApOworI2VuZGlmCit9CisKKy8qIEV4cGFuZCB0aGUgbWV0YSBjaGFyYWN0ZXJzIGluIHRoZSBmaWxlbmFtZToKKyAqCisgKiBDdXJyZW50bHkgZGVmaW5lZCBjaGFyYWN0ZXJzIGFyZToKKyAqCisgKiAlSCB0aGUgaG9zdG5hbWUKKyAqICVQIHRoZSBudW1iZXIgb2YgdGhyZWFkcyB1c2VkLgorICogJUkgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHJ1bi4KKyAqLworCit2b2lkCitfX2ttcF9leHBhbmRfZmlsZV9uYW1lKCBjaGFyICpyZXN1bHQsIHNpemVfdCBybGVuLCBjaGFyICpwYXR0ZXJuICkKK3sKKyAgICBjaGFyCSpwb3MgPSByZXN1bHQsICplbmQgPSByZXN1bHQgKyBybGVuIC0gMTsKKyAgICBjaGFyCSBidWZmZXJbMjU2XTsKKyAgICBpbnQJCSBkZWZhdWx0X2NwdV93aWR0aCA9IDE7CisgICAgaW50ICAgICAgICAgIHNucF9yZXN1bHQ7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKHJsZW4gPiAwKTsKKyAgICAqZW5kID0gMDsKKyAgICB7CisJaW50IGk7CisJZm9yKGkgPSBfX2ttcF94cHJvYzsgaSA+PSAxMDsgaSAvPSAxMCwgKytkZWZhdWx0X2NwdV93aWR0aCk7CisgICAgfQorCisgICAgaWYgKHBhdHRlcm4gIT0gTlVMTCkgeworCXdoaWxlICgqcGF0dGVybiAhPSAnXDAnICYmIHBvcyA8IGVuZCkgeworCSAgICBpZiAoKnBhdHRlcm4gIT0gJyUnKSB7CisJCSpwb3MrKyA9ICpwYXR0ZXJuKys7CisJICAgIH0gZWxzZSB7CisJCWNoYXIgKm9sZF9wYXR0ZXJuID0gcGF0dGVybjsKKwkJaW50IHdpZHRoID0gMTsKKwkJaW50IGNwdV93aWR0aCA9IGRlZmF1bHRfY3B1X3dpZHRoOworCisJCSsrcGF0dGVybjsKKworCQlpZiAoKnBhdHRlcm4gPj0gJzAnICYmICpwYXR0ZXJuIDw9ICc5JykgeworCQkgICAgd2lkdGggPSAwOworCQkgICAgZG8geworCQkJd2lkdGggPSAod2lkdGggKiAxMCkgKyAqcGF0dGVybisrIC0gJzAnOworCQkgICAgfSB3aGlsZSAoKnBhdHRlcm4gPj0gJzAnICYmICpwYXR0ZXJuIDw9ICc5Jyk7CisJCSAgICBpZiAod2lkdGggPCAwIHx8IHdpZHRoID4gMTAyNCkKKwkJCXdpZHRoID0gMTsKKworCQkgICAgY3B1X3dpZHRoID0gd2lkdGg7CisJCX0KKworCQlzd2l0Y2ggKCpwYXR0ZXJuKSB7CisJCWNhc2UgJ0gnOgorCQljYXNlICdoJzoKKwkJICAgIHsKKwkJCV9fa21wX2V4cGFuZF9ob3N0X25hbWUoIGJ1ZmZlciwgc2l6ZW9mKCBidWZmZXIgKSApOworCQkJc3RybmNweSggcG9zLCAgYnVmZmVyLCBlbmQgLSBwb3MgKyAxKTsKKwkJCWlmKCplbmQgPT0gMCkgeworCQkJICAgIHdoaWxlICggKnBvcyApCisJCQkJKytwb3M7CisJCQkgICAgKytwYXR0ZXJuOworCQkJfSBlbHNlCisJCQkgICAgcG9zID0gZW5kOworCQkgICAgfQorCQkgICAgYnJlYWs7CisJCWNhc2UgJ1AnOgorCQljYXNlICdwJzoKKwkJICAgIHsKKwkJCXNucF9yZXN1bHQgPSBzbnByaW50ZiggcG9zLCBlbmQgLSBwb3MgKyAxLCAiJTAqZCIsIGNwdV93aWR0aCwgX19rbXBfZGZsdF90ZWFtX250aCApOworCQkJaWYoc25wX3Jlc3VsdCA+PSAwICYmIHNucF9yZXN1bHQgPD0gZW5kIC0gcG9zKSB7CisJCQkgICAgd2hpbGUgKCAqcG9zICkKKwkJCQkrK3BvczsKKwkJCSAgICArK3BhdHRlcm47CisJCQl9IGVsc2UKKwkJCSAgICBwb3MgPSBlbmQ7CisJCSAgICB9CisJCSAgICBicmVhazsKKwkJY2FzZSAnSSc6CisJCWNhc2UgJ2knOgorCQkgICAgeworCQkJcGlkX3QgaWQgPSBnZXRwaWQoKTsKKwkJCXNucF9yZXN1bHQgPSBzbnByaW50ZiggcG9zLCBlbmQgLSBwb3MgKyAxLCAiJTAqZCIsIHdpZHRoLCBpZCApOworCQkJaWYoc25wX3Jlc3VsdCA+PSAwICYmIHNucF9yZXN1bHQgPD0gZW5kIC0gcG9zKSB7CisJCQkgICAgd2hpbGUgKCAqcG9zICkKKwkJCQkrK3BvczsKKwkJCSAgICArK3BhdHRlcm47CisJCQl9IGVsc2UKKwkJCSAgICBwb3MgPSBlbmQ7CisJCQlicmVhazsKKwkJICAgIH0KKwkJY2FzZSAnJSc6CisJCSAgICB7CisJCQkqcG9zKysgPSAnJSc7CisJCQkrK3BhdHRlcm47CisJCQlicmVhazsKKwkJICAgIH0KKwkJZGVmYXVsdDoKKwkJICAgIHsKKwkJCSpwb3MrKyA9ICclJzsKKwkJCXBhdHRlcm4gPSBvbGRfcGF0dGVybiArIDE7CisJCQlicmVhazsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJfQorCS8qIFRPRE86IEhvdyBkbyB3ZSBnZXQgcmlkIG9mIHRoaXM/ICovCisJaWYoKnBhdHRlcm4gIT0gJ1wwJykKKwkgICAgS01QX0ZBVEFMKCBGaWxlTmFtZVRvb0xvbmcgKTsKKyAgICB9CisKKyAgICAqcG9zID0gJ1wwJzsKK30KKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX3ZlcnNpb24uYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF92ZXJzaW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgzNmMzOQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF92ZXJzaW9uLmMKQEAgLTAsMCArMSwyMTQgQEAKKy8qCisgKiBrbXBfdmVyc2lvbi5jCisgKiAkUmV2aXNpb246IDQyODA2ICQKKyAqICREYXRlOiAyMDEzLTExLTA1IDE2OjE2OjQ1IC0wNjAwIChUdWUsIDA1IE5vdiAyMDEzKSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfaW8uaCIKKyNpbmNsdWRlICJrbXBfdmVyc2lvbi5oIgorCisvLyBSZXBsYWNlIHdpdGggc25hcHNob3QgZGF0ZSBZWVlZTU1ERCBmb3IgcHJvbW90aW9uIGJ1aWxkLgorI2RlZmluZSBLTVBfVkVSU0lPTl9CVUlMRCAgICAwMDAwMDAwMAorCisvLyBIZWxwZXIgbWFjcm9zIHRvIGNvbnZlcnQgdmFsdWUgb2YgbWFjcm8gdG8gc3RyaW5nIGxpdGVyYWwuCisjZGVmaW5lIF9zdHJpbmdlciggeCApICN4CisjZGVmaW5lIHN0cmluZ2VyKCB4ICkgIF9zdHJpbmdlciggeCApCisKKy8vIERldGVjdCBjb21waWxlci4KKyNpZiBLTVBfQ09NUElMRVJfSUNDCisgICAgI2lmICAgX19JTlRFTF9DT01QSUxFUiA9PSAxMDEwCisgICAgICAgICNkZWZpbmUgS01QX0NPTVBJTEVSICJJbnRlbCBDKysgQ29tcGlsZXIgMTAuMSIKKyAgICAjZWxpZiBfX0lOVEVMX0NPTVBJTEVSID09IDExMDAKKyAgICAgICAgI2RlZmluZSBLTVBfQ09NUElMRVIgIkludGVsIEMrKyBDb21waWxlciAxMS4wIgorICAgICNlbGlmIF9fSU5URUxfQ09NUElMRVIgPT0gMTExMAorICAgICAgICAjZGVmaW5lIEtNUF9DT01QSUxFUiAiSW50ZWwgQysrIENvbXBpbGVyIDExLjEiCisgICAgI2VsaWYgX19JTlRFTF9DT01QSUxFUiA9PSAxMjAwCisgICAgICAgICNkZWZpbmUgS01QX0NPTVBJTEVSICJJbnRlbCBDKysgQ29tcGlsZXIgMTIuMCIKKyAgICAjZWxpZiBfX0lOVEVMX0NPTVBJTEVSID09IDEyMTAKKyAgICAgICAgI2RlZmluZSBLTVBfQ09NUElMRVIgIkludGVsIEMrKyBDb21waWxlciAxMi4xIgorICAgICNlbGlmIF9fSU5URUxfQ09NUElMRVIgPT0gMTMwMAorICAgICAgICAjZGVmaW5lIEtNUF9DT01QSUxFUiAiSW50ZWwgQysrIENvbXBpbGVyIDEzLjAiCisgICAgI2VsaWYgX19JTlRFTF9DT01QSUxFUiA9PSAxMzEwCisgICAgICAgICNkZWZpbmUgS01QX0NPTVBJTEVSICJJbnRlbCBDKysgQ29tcGlsZXIgMTMuMSIKKyAgICAjZWxpZiBfX0lOVEVMX0NPTVBJTEVSID09IDE0MDAKKyAgICAgICAgI2RlZmluZSBLTVBfQ09NUElMRVIgIkludGVsIEMrKyBDb21waWxlciAxNC4wIgorICAgICNlbGlmIF9fSU5URUxfQ09NUElMRVIgPT0gMTQxMAorICAgICAgICAjZGVmaW5lIEtNUF9DT01QSUxFUiAiSW50ZWwgQysrIENvbXBpbGVyIDE0LjEiCisgICAgI2VsaWYgX19JTlRFTF9DT01QSUxFUiA9PSA5OTk5CisgICAgICAgICNkZWZpbmUgS01QX0NPTVBJTEVSICJJbnRlbCBDKysgQ29tcGlsZXIgbWFpbmxpbmUiCisgICAgI2VuZGlmCisjZWxpZiBLTVBfQ09NUElMRVJfQ0xBTkcKKyAgICAjZGVmaW5lIEtNUF9DT01QSUxFUiAiQ2xhbmcgIiBzdHJpbmdlciggX19jbGFuZ19tYWpvcl9fICkgIi4iIHN0cmluZ2VyKCBfX2NsYW5nX21pbm9yX18gKQorI2VsaWYgS01QX0NPTVBJTEVSX0dDQworICAgICNkZWZpbmUgS01QX0NPTVBJTEVSICJHQ0MgIiBzdHJpbmdlciggX19HTlVDX18gKSAiLiIgc3RyaW5nZXIoIF9fR05VQ19NSU5PUl9fICkKKyNlbGlmIEtNUF9DT01QSUxFUl9NU1ZDCisgICAgI2RlZmluZSBLTVBfQ09NUElMRVIgIk1TVkMgIiBzdHJpbmdlciggX19NU0NfRlVMTF9WRVIgKQorI2VuZGlmCisjaWZuZGVmIEtNUF9DT01QSUxFUgorICAgICN3YXJuaW5nICJVbmtub3duIGNvbXBpbGVyIgorICAgICNkZWZpbmUgS01QX0NPTVBJTEVSICJ1bmtub3duIGNvbXBpbGVyIgorI2VuZGlmCisKKy8vIERldGVjdCBsaWJycmF5IHR5cGUgKHBlcmYsIHN0dWIpLgorI2lmZGVmIEtNUF9TVFVCCisgICAgI2RlZmluZSBLTVBfTElCX1RZUEUgInN0dWIiCisjZWxzZQorICAgICNkZWZpbmUgS01QX0xJQl9UWVBFICJwZXJmb3JtYW5jZSIKKyNlbmRpZiAvLyBLTVBfTElCX1RZUEUKKworLy8gRGV0ZWN0IGxpbmsgdHlwZSAoc3RhdGljLCBkeW5hbWljKS4KKyNpZmRlZiBHVUlERURMTF9FWFBPUlRTCisgICAgI2RlZmluZSBLTVBfTElOS19UWVBFICJkeW5hbWljIgorI2Vsc2UKKyAgICAjZGVmaW5lIEtNUF9MSU5LX1RZUEUgInN0YXRpYyIKKyNlbmRpZiAvLyBLTVBfTElOS19UWVBFCisKKy8vIEZpbmFsbHksIGRlZmluZSBzdHJpbmdzLgorI2RlZmluZSBLTVBfTElCUkFSWSAgIEtNUF9MSUJfVFlQRSAiIGxpYnJhcnkgKCIgS01QX0xJTktfVFlQRSAiKSIKKyNkZWZpbmUgS01QX0NPUFlSSUdIVCAiQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMsIEludGVsIENvcnBvcmF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLiIKKworaW50IGNvbnN0IF9fa21wX3ZlcnNpb25fbWFqb3IgPSBLTVBfVkVSU0lPTl9NQUpPUjsKK2ludCBjb25zdCBfX2ttcF92ZXJzaW9uX21pbm9yID0gS01QX1ZFUlNJT05fTUlOT1I7CitpbnQgY29uc3QgX19rbXBfdmVyc2lvbl9idWlsZCA9IEtNUF9WRVJTSU9OX0JVSUxEOworaW50IGNvbnN0IF9fa21wX29wZW5tcF92ZXJzaW9uID0KKyAgICAjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgMjAxMzA3OworICAgICNlbGlmIE9NUF8zMF9FTkFCTEVECisgICAgICAgIDIwMTEwNzsKKyAgICAjZWxzZQorICAgICAgICAyMDA1MDU7CisgICAgI2VuZGlmCisKKy8qIERvIE5PVCBjaGFuZ2UgdGhlIGZvcm1hdCBvZiB0aGlzIHN0cmluZyEgIEludGVsKFIpIFRocmVhZCBQcm9maWxlciBjaGVja3MgZm9yIGEKKyAgIHNwZWNpZmljIGZvcm1hdCBzb21lIGNoYW5nZXMgaW4gdGhlIHJlY29nbml0aW9uIHJvdXRpbmUgdGhlcmUgbmVlZCB0bworICAgYmUgbWFkZSBiZWZvcmUgdGhpcyBpcyBjaGFuZ2VkLgorKi8KK2NoYXIgY29uc3QgX19rbXBfY29weXJpZ2h0W10gPQorICAgIEtNUF9WRVJTSU9OX1BSRUZJWCBLTVBfTElCUkFSWQorICAgICIgdmVyLiAiIHN0cmluZ2VyKCBLTVBfVkVSU0lPTl9NQUpPUiApICIuIiBzdHJpbmdlciggS01QX1ZFUlNJT05fTUlOT1IgKQorICAgICIuIiBzdHJpbmdlciggS01QX1ZFUlNJT05fQlVJTEQgKSAiICIKKyAgICBLTVBfQ09QWVJJR0hUOworCitjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fY29weXJpZ2h0W10gICAgICA9IEtNUF9WRVJTSU9OX1BSRUZJWCBLTVBfQ09QWVJJR0hUOworY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2xpYl92ZXJbXSAgICAgICAgPSBLTVBfVkVSU0lPTl9QUkVGSVggInZlcnNpb246ICIgc3RyaW5nZXIoIEtNUF9WRVJTSU9OX01BSk9SICkgIi4iIHN0cmluZ2VyKCBLTVBfVkVSU0lPTl9NSU5PUiApICIuIiBzdHJpbmdlciggS01QX1ZFUlNJT05fQlVJTEQgKTsKK2NoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9saWJfdHlwZVtdICAgICAgID0gS01QX1ZFUlNJT05fUFJFRklYICJsaWJyYXJ5IHR5cGU6ICIgS01QX0xJQl9UWVBFOworY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2xpbmtfdHlwZVtdICAgICAgPSBLTVBfVkVSU0lPTl9QUkVGSVggImxpbmsgdHlwZTogIiBLTVBfTElOS19UWVBFOworY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2J1aWxkX3RpbWVbXSAgICAgPSBLTVBfVkVSU0lPTl9QUkVGSVggImJ1aWxkIHRpbWU6ICIgX0tNUF9CVUlMRF9USU1FOworI2lmIEtNUF9NSUMyCisgICAgY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX3RhcmdldF9lbnZbXSA9IEtNUF9WRVJTSU9OX1BSRUZJWCAidGFyZ2V0IGVudmlyb25tZW50OiBNSUMyIjsKKyNlbmRpZgorY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2J1aWxkX2NvbXBpbGVyW10gPSBLTVBfVkVSU0lPTl9QUkVGSVggImJ1aWxkIGNvbXBpbGVyOiAiIEtNUF9DT01QSUxFUjsKKworLy8KKy8vIENhbGxlZCBhdCBzZXJpYWwgaW5pdGlhbGl6YXRpb24gdGltZS4KKy8vCitzdGF0aWMgaW50IF9fa21wX3ZlcnNpb25fMV9wcmludGVkID0gRkFMU0U7CisKK3ZvaWQKK19fa21wX3ByaW50X3ZlcnNpb25fMSggdm9pZCApCit7CisgICAgaWYgKCBfX2ttcF92ZXJzaW9uXzFfcHJpbnRlZCApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisgICAgX19rbXBfdmVyc2lvbl8xX3ByaW50ZWQgPSBUUlVFOworCisgICAgI2lmbmRlZiBLTVBfU1RVQgorICAgICAgICBrbXBfc3RyX2J1Zl90IGJ1ZmZlcjsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIGJ1ZmZlciApOworICAgICAgICAvLyBQcmludCB2ZXJzaW9uIHN0cmluZ3Mgc2tpcHBpbmcgaW5pdGlhbCBtYWdpYy4KKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIlc1xuIiwgJiBfX2ttcF92ZXJzaW9uX2NvcHlyaWdodFsgS01QX1ZFUlNJT05fTUFHSUNfTEVOIF0gKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIlc1xuIiwgJiBfX2ttcF92ZXJzaW9uX2xpYl92ZXJbIEtNUF9WRVJTSU9OX01BR0lDX0xFTiBdICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiJXNcbiIsICYgX19rbXBfdmVyc2lvbl9saWJfdHlwZVsgS01QX1ZFUlNJT05fTUFHSUNfTEVOIF0gKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIlc1xuIiwgJiBfX2ttcF92ZXJzaW9uX2xpbmtfdHlwZVsgS01QX1ZFUlNJT05fTUFHSUNfTEVOIF0gKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIlc1xuIiwgJiBfX2ttcF92ZXJzaW9uX2J1aWxkX3RpbWVbIEtNUF9WRVJTSU9OX01BR0lDX0xFTiBdICk7CisgICAgICAjaWYgS01QX01JQworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIiVzXG4iLCAmIF9fa21wX3ZlcnNpb25fdGFyZ2V0X2VudlsgS01QX1ZFUlNJT05fTUFHSUNfTEVOIF0gKTsKKyAgICAgICNlbmRpZgorICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIiVzXG4iLCAmIF9fa21wX3ZlcnNpb25fYnVpbGRfY29tcGlsZXJbIEtNUF9WRVJTSU9OX01BR0lDX0xFTiBdICk7CisgICAgICAgICNpZiBkZWZpbmVkKEtNUF9HT01QX0NPTVBBVCkKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiJXNcbiIsICYgX19rbXBfdmVyc2lvbl9hbHRfY29tcFsgS01QX1ZFUlNJT05fTUFHSUNfTEVOIF0gKTsKKyAgICAgICAgI2VuZGlmIC8qIGRlZmluZWQoS01QX0dPTVBfQ09NUEFUKSAqLworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIiVzXG4iLCAmIF9fa21wX3ZlcnNpb25fb21wX2FwaVsgS01QX1ZFUlNJT05fTUFHSUNfTEVOIF0gKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIlc2R5bmFtaWMgZXJyb3IgY2hlY2tpbmc6ICVzXG4iLCBLTVBfVkVSU0lPTl9QUkVGX1NUUiwgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgPyAieWVzIiA6ICJubyIgKSAgKTsKKyAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgZm9yICggaW50IGkgPSBic19wbGFpbl9iYXJyaWVyOyBpIDwgYnNfbGFzdF9iYXJyaWVyOyArKyBpICkgeworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoCisgICAgICAgICAgICAgICAgICAgICYgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAiJXMlcyBiYXJyaWVyIGJyYW5jaCBiaXRzOiBnYXRoZXI9JXUsIHJlbGVhc2U9JXVcbiIsCisgICAgICAgICAgICAgICAgICAgIEtNUF9WRVJTSU9OX1BSRUZfU1RSLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX3R5cGVfbmFtZVsgaSBdLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX2dhdGhlcl9icmFuY2hfYml0c1sgaSBdLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHNbIGkgXQorICAgICAgICAgICAgICAgICk7IC8vIF9fa21wX3N0cl9idWZfcHJpbnQKKyAgICAgICAgICAgIH07IC8vIGZvciBpCisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IGJzX3BsYWluX2JhcnJpZXI7IGkgPCBic19sYXN0X2JhcnJpZXI7ICsrIGkgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgKKyAgICAgICAgICAgICAgICAgICAgJiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICIlcyVzIGJhcnJpZXIgcGF0dGVybjogZ2F0aGVyPSVzLCByZWxlYXNlPSVzXG4iLAorICAgICAgICAgICAgICAgICAgICBLTVBfVkVSU0lPTl9QUkVGX1NUUiwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfYmFycmllcl90eXBlX25hbWVbIGkgXSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfYmFycmllcl9wYXR0ZXJuX25hbWVbIF9fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdHRlcm5bIGkgXSBdLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX3BhdHRlcm5fbmFtZVsgX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdHRlcm5bIGkgXSBdCisgICAgICAgICAgICAgICAgKTsgLy8gX19rbXBfc3RyX2J1Zl9wcmludAorICAgICAgICAgICAgfTsgLy8gZm9yIGkKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiJXNcbiIsICYgX19rbXBfdmVyc2lvbl9sb2NrWyBLTVBfVkVSU0lPTl9NQUdJQ19MRU4gXSApOworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIlc1xuIiwgJiBfX2ttcF92ZXJzaW9uX3BlcmZfdjE5WyBLTVBfVkVSU0lPTl9NQUdJQ19MRU4gXSApOworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIlc1xuIiwgJiBfX2ttcF92ZXJzaW9uX3BlcmZfdjEwNlsgS01QX1ZFUlNJT05fTUFHSUNfTEVOIF0gKTsKKyAgICAgICAgI2VuZGlmCisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoCisgICAgICAgICAgICAmIGJ1ZmZlciwKKyAgICAgICAgICAgICIlc3RocmVhZCBhZmZpbml0eSBzdXBwb3J0OiAlc1xuIiwKKyAgICAgICAgICAgIEtNUF9WRVJTSU9OX1BSRUZfU1RSLAorICAgICAgICAgICAgI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgICAgIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkKKyAgICAgICAgICAgICAgICAgICAgPworICAgICAgICAgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUKKyAgICAgICAgICAgICAgICAgICAgICAgID8KKyAgICAgICAgICAgICAgICAgICAgICAgICJub3QgdXNlZCIKKyAgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICJ5ZXMiCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgICAgICAgICAibm8iCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgICAibm8iCisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCAiJXMiLCBidWZmZXIuc3RyICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSggJiBidWZmZXIgKTsKKyAgICAgICAgS19ESUFHKCAxLCAoICJLTVBfVkVSU0lPTiBpcyB0cnVlXG4iICkgKTsKKyAgICAjZW5kaWYgLy8gS01QX1NUVUIKK30gLy8gX19rbXBfcHJpbnRfdmVyc2lvbl8xCisKKy8vCisvLyBDYWxsZWQgYXQgcGFyYWxsZWwgaW5pdGlhbGl6YXRpb24gdGltZS4KKy8vCitzdGF0aWMgaW50IF9fa21wX3ZlcnNpb25fMl9wcmludGVkID0gRkFMU0U7CisKK3ZvaWQKK19fa21wX3ByaW50X3ZlcnNpb25fMiggdm9pZCApIHsKKyAgICBpZiAoIF9fa21wX3ZlcnNpb25fMl9wcmludGVkICkgeworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKyAgICBfX2ttcF92ZXJzaW9uXzJfcHJpbnRlZCA9IFRSVUU7CisKKyAgICAjaWZuZGVmIEtNUF9TVFVCCisgICAgI2VuZGlmIC8vIEtNUF9TVFVCCit9IC8vIF9fa21wX3ByaW50X3ZlcnNpb25fMgorCisvLyBlbmQgb2YgZmlsZSAvLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX3ZlcnNpb24uaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF92ZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJkMmM0MgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF92ZXJzaW9uLmgKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIGttcF92ZXJzaW9uLmggLS0gdmVyc2lvbiBudW1iZXIgZm9yIHRoaXMgcmVsZWFzZQorICogJFJldmlzaW9uOiA0MjE4MSAkCisgKiAkRGF0ZTogMjAxMy0wMy0yNiAxNTowNDo0NSAtMDUwMCAoVHVlLCAyNiBNYXIgMjAxMykgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIEtNUF9WRVJTSU9OX0gKKyNkZWZpbmUgS01QX1ZFUlNJT05fSAorCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICBleHRlcm4gIkMiIHsKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisjaWZuZGVmIEtNUF9WRVJTSU9OX01BSk9SCisgICAgI2Vycm9yIEtNUF9WRVJTSU9OX01BSk9SIG1hY3JvIGlzIG5vdCBkZWZpbmVkLgorI2VuZGlmCisjZGVmaW5lIEtNUF9WRVJTSU9OX01JTk9SICAgICAgIDAKKy8qCisgICAgVXNpbmcgIm1hZ2ljIiBwcmVmaXggaW4gYWxsIHRoZSB2ZXJzaW9uIHN0cmluZ3MgaXMgcmF0aGVyIGNvbnZlbmllbnQgdG8gZ2V0IHN0YXRpYyB2ZXJzaW9uIGluZm8KKyAgICBmcm9tIGJpbmFyaWVzIGJ5IHVzaW5nIHN0YW5kYXJkIHV0aWxpdGllcyAic3RyaW5ncyIgYW5kICJncmVwIiwgZS4gZy46CisgICAgICAgICQgc3RyaW5ncyBsaWJpb21wNS5zbyB8IGdyZXAgIkAoIykiCisgICAgZ2l2ZXMgY2xlYW4gbGlzdCBvZiBhbGwgdmVyc2lvbiBzdHJpbmdzIGluIHRoZSBsaWJyYXJ5LiBMZWFkaW5nIHplcm8gaGVscHMgdG8ga2VlcCB2ZXJzaW9uCisgICAgc3RyaW5nIHNlcGFyYXRlIGZyb20gcHJpbnRhYmxlIGNoYXJhY3RlcnMgd2hpY2ggbWF5IG9jY3VycyBqdXN0IGJlZm9yZSB2ZXJzaW9uIHN0cmluZy4KKyovCisjZGVmaW5lIEtNUF9WRVJTSU9OX01BR0lDX1NUUiAgICJceDAwQCgjKSAiCisjZGVmaW5lIEtNUF9WRVJTSU9OX01BR0lDX0xFTiAgIDYgICAgICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIEtNUF9WRVJTSU9OX01BR0lDX1NUUi4KKyNkZWZpbmUgS01QX1ZFUlNJT05fUFJFRl9TVFIgICAgIkludGVsKFIpIE9NUCAiCisjZGVmaW5lIEtNUF9WRVJTSU9OX1BSRUZJWCAgICAgIEtNUF9WRVJTSU9OX01BR0lDX1NUUiBLTVBfVkVSU0lPTl9QUkVGX1NUUgorCisvKiBkZWNsYXJlIGFsbCB0aGUgdmVyc2lvbiBzdHJpbmcgY29uc3RhbnRzIGZvciBLTVBfVkVSU0lPTiBlbnYuIHZhcmlhYmxlICovCitleHRlcm4gaW50ICBjb25zdCBfX2ttcF92ZXJzaW9uX21ham9yOworZXh0ZXJuIGludCAgY29uc3QgX19rbXBfdmVyc2lvbl9taW5vcjsKK2V4dGVybiBpbnQgIGNvbnN0IF9fa21wX3ZlcnNpb25fYnVpbGQ7CitleHRlcm4gaW50ICBjb25zdCBfX2ttcF9vcGVubXBfdmVyc2lvbjsKK2V4dGVybiBjaGFyIGNvbnN0IF9fa21wX2NvcHlyaWdodFtdOyAgICAvLyBPbGQgdmFyaWFibGUsIGtlcHQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBJVEMgYW5kIElUUC4KK2V4dGVybiBjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fY29weXJpZ2h0W107CitleHRlcm4gY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2xpYl92ZXJbXTsKK2V4dGVybiBjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fbGliX3R5cGVbXTsKK2V4dGVybiBjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fbGlua190eXBlW107CitleHRlcm4gY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2J1aWxkX3RpbWVbXTsKK2V4dGVybiBjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fdGFyZ2V0X2VudltdOworZXh0ZXJuIGNoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9idWlsZF9jb21waWxlcltdOworZXh0ZXJuIGNoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9hbHRfY29tcFtdOworZXh0ZXJuIGNoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9vbXBfYXBpW107CisvLyA/Pz8gZXh0ZXJuIGNoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9kZWJ1Z1tdOworZXh0ZXJuIGNoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9sb2NrW107CitleHRlcm4gY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX3BlcmZfdjE5W107CitleHRlcm4gY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX3BlcmZfdjEwNltdOworZXh0ZXJuIGNoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9uZXN0ZWRfc3RhdHNfcmVwb3J0aW5nW107CitleHRlcm4gY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2Z0bnN0ZGNhbGxbXTsKK2V4dGVybiBjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fZnRuY2RlY2xbXTsKK2V4dGVybiBjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fZnRuZXh0cmFbXTsKKwordm9pZCBfX2ttcF9wcmludF92ZXJzaW9uXzEoIHZvaWQgKTsKK3ZvaWQgX19rbXBfcHJpbnRfdmVyc2lvbl8yKCB2b2lkICk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIH0gLy8gZXh0ZXJuICJDIgorI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKyNlbmRpZiAvKiBLTVBfVkVSU0lPTl9IICovCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfd3JhcHBlcl9nZXRwaWQuaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF93cmFwcGVyX2dldHBpZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZGMxNjkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfd3JhcHBlcl9nZXRwaWQuaApAQCAtMCwwICsxLDU4IEBACisvKgorICoga21wX3dyYXBwZXJfZ2V0cGlkLmggLS0gZ2V0cGlkKCkgZGVjbGFyYXRpb24uCisgKiAkUmV2aXNpb246IDQyMTgxICQKKyAqICREYXRlOiAyMDEzLTAzLTI2IDE1OjA0OjQ1IC0wNTAwIChUdWUsIDI2IE1hciAyMDEzKSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX1dSQVBQRVJfR0VUUElEX0gKKyNkZWZpbmUgS01QX1dSQVBQRVJfR0VUUElEX0gKKworI2lmIEtNUF9PU19VTklYCisKKyAgICAvLyBPbiBVbml4LWxpa2Ugc3lzdGVtcyAoTGludXgqIE9TIGFuZCBPUyBYKikgZ2V0cGlkKCkgaXMgZGVjbGFyZWQgaW4gc3RhbmRhcmQgaGVhZGVycy4KKyAgICAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisgICAgI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjZWxpZiBLTVBfT1NfV0lORE9XUworCisgICAgLy8gT24gV2luZG93cyogT1MgX2dldHBpZCgpIHJldHVybnMgaW50IChub3QgcGlkX3QpIGFuZCBpcyBkZWNsYXJlZCBpbiAicHJvY2Vzcy5oIi4KKyAgICAjaW5jbHVkZSA8cHJvY2Vzcy5oPgorICAgIC8vIExldCB1cyBzaW11bGF0ZSBVbml4LgorICAgIHR5cGVkZWYgaW50IHBpZF90OworICAgICNkZWZpbmUgZ2V0cGlkIF9nZXRwaWQKKworI2Vsc2UKKworICAgICNlcnJvciBVbmtub3duIG9yIHVuc3VwcG9ydGVkIE9TLgorCisjZW5kaWYKKworLyoKKyAgICBUT0RPOiBBbGwgdGhlIGxpYm9tcCBzb3VyY2UgY29kZSB1c2VzIHBpZF90IHR5cGUgZm9yIHN0b3JpbmcgdGhlIHJlc3VsdCBvZiBnZXRwaWQoKSwgaXQgaXMgZ29vZC4KKyAgICBCdXQgb2Z0ZW4gaXQgcHJpbnRlZCBhcyAiJWQiLCB0aGF0IGlzIG5vdCBnb29kLCBiZWNhdXNlIGl0IGlnbm9yZXMgcGlkX3QgZGVmaW5pdGlvbiAobWF5IHBpZF90CisgICAgYmUgbG9uZ2VyIHRoYXQgaW50PykuIEl0IHNlZW1zIGFsbCBwaWQgcHJpbnRzIHNob3VsZCBiZSByZXdyaXR0ZW4gYXMKKworICAgICAgICBwcmludGYoICIlIiBLTVBfVUlOVDY0X1NQRUMsIChrbXBfdWludDY0KSBwaWQgKTsKKworICAgIG9yIChhdCBsZWFzdCkgYXMKKworICAgICAgICBwcmludGYoICIlIiBLTVBfVUlOVDMyX1NQRUMsIChrbXBfdWludDMyKSBwaWQgKTsKKworICAgIChrbXBfdWludDMyLCBrbXBfdWludDY0LCBLTVBfVUlOVDY0X1NQRUMsIGFuZCBLTVBfVU5JVDMyX1NQRUMgYXJlIGRlZmluZWQgaW4gImttcF9vcy5oIi4pCisKKyovCisKKyNlbmRpZiAvLyBLTVBfV1JBUFBFUl9HRVRQSURfSAorCisvLyBlbmQgb2YgZmlsZSAvLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX3dyYXBwZXJfbWFsbG9jLmggYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfd3JhcHBlcl9tYWxsb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmUzZGJmCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX3dyYXBwZXJfbWFsbG9jLmgKQEAgLTAsMCArMSwyMDcgQEAKKy8qCisgKiBrbXBfd3JhcHBlcl9tYWxsb2MuaCAtLSBXcmFwcGVycyBmb3IgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIChtYWxsb2MoKSwgZnJlZSgpLCBhbmQgb3RoZXJzKS4KKyAqICRSZXZpc2lvbjogNDIxODEgJAorICogJERhdGU6IDIwMTMtMDMtMjYgMTU6MDQ6NDUgLTA1MDAgKFR1ZSwgMjYgTWFyIDIwMTMpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBLTVBfV1JBUFBFUl9NQUxMT0NfSAorI2RlZmluZSBLTVBfV1JBUFBFUl9NQUxMT0NfSAorCisvKgorICAgIFRoaXMgaGVhZGVyIHNlcnZlcyBmb3IgMyBwdXJwb3NlczoKKworICAgICAgICAxLiBEZWNsYXJpbmcgc3RhbmRhcmQgbWVtb3J5IGFsbG9jYXRpb24gcm91cmluZXMgaW4gT1MtaW5kZXBlbmRlbnQgd2F5LgorICAgICAgICAyLiBQYXNzaW5nIHNvdXJjZSBsb2NhdGlvbiBpbmZvIHRocm91Z2ggbWVtb3J5IGFsbG9jYXRpb24gd3JhcHBlcnMuCisgICAgICAgIDMuIEVuYWJsaW5nIG5hdGl2ZSBtZW1vcnkgZGVidWdnaW5nIGNhcGFiaWxpdGllcy4KKworCisgICAgMS4gRGVjbGFyaW5nIHN0YW5kYXJkIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXJpbmVzIGluIE9TLWluZGVwZW5kZW50IHdheS4KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgT24gTGludXgqIE9TLCBhbGxvY2EoKSBmdW5jdGlvbiBpcyBkZWNsYXJlZCBpbiA8YWxsb2NhLmg+IGhlYWRlciwgd2hpbGUgb24gV2luZG93cyogT1MgdGhlcmUgaXMgbm8KKyAgICA8YWxsb2NhLmg+IGhlYWRlciwgZnVuY3Rpb24gX2FsbG9jYSgpIChub3RlIHVuZGVyc2NvcmUhKSBpcyBkZWNsYXJlZCBpbiA8bWFsbG9jLmg+LiBUaGlzIGhlYWRlcgorICAgIGVsaW1pbmF0ZXMgdGhlc2UgZGlmZmVyZW5jZXMsIHNvIGNsaWVudCBjb2RlIGluY2x1aWRpbmcgImttcF93cmFwcGVyX21hbGxvYy5oIiBjYW4gcmVseSBvbgorICAgIGZvbGxvd2luZyByb3V0aW5lczoKKworICAgICAgICBtYWxsb2MKKyAgICAgICAgY2FsbG9jCisgICAgICAgIHJlYWxsb2MKKyAgICAgICAgZnJlZQorICAgICAgICBhbGxvY2EKKworICAgIGluIE9TLWluZGVwZW5kZW50IHdheS4gSXQgYWxzbyBlbmFibGVzIG1lbW9yeSB0cmFja2luZyBjYXBhYmlsaXRpZXMgaW4gZGVidWcgYnVpbGQuIChDdXJyZW50bHkKKyAgICBpdCBpcyBhdmFpbGFibGUgb25seSBvbiBXaW5kb3dzKiBPUy4pCisKKworICAgIDIuIFBhc3Npbmcgc291cmNlIGxvY2F0aW9uIGluZm8gdGhyb3VnaCBtZW1vcnkgYWxsb2NhdGlvbiB3cmFwcGVycy4KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBTb21lIHRvb2xzIG1heSBoZWxwIGRlYnVnZ2luZyBtZW1vcnkgZXJyb3JzLCBmb3IgZXhhbXBsZSwgcmVwb3J0IG1lbW9yeSBsZWFrcy4gSG93ZXZlciwgbWVtb3J5CisgICAgYWxsb2NhdGlvbiB3cmFwcGVycyBtYXkgaGluZGVyIHNvdXJjZSBsb2NhdGlvbi4KKworICAgIEZvciBleGFtcGxlOgorCisgICAgICAgIHZvaWQgKiBhbGlnbmVkX21hbGxvYyggaW50IHNpemUgKSB7CisgICAgICAgICAgICB2b2lkICogcHRyID0gbWFsbG9jKCBzaXplICk7IC8vIEFsbCB0aGUgbWVtb3J5IGxlYWtzIHdpbGwgYmUgcmVwb3J0ZWQgYXQgdGhpcyBsaW5lLgorICAgICAgICAgICAgLy8gc29tZSBhZGp1c3RtZW50cy4uLgorICAgICAgICAgICAgcmV0dXJuIHB0cjsKKyAgICAgICAgfTsKKworICAgICAgICBwdHIgPSBhbGlnbmVkX21hbGxvYyggc2l6ZSApOyAgICAvLyBNZW1vcnkgbGVhayB3aWxsICpub3QqIGJlIGRldGVjdGVkIGhlcmUuIDotKAorCisgICAgVG8gb3ZlcmNvbWUgdGhlIHByb2JsZW0sIGluZm9ybWF0aW9uIGFib3V0IG9yaWdpbmFsIHNvdXJjZSBsb2NhdGlvbiBzaG91bGQgYmUgcGFzc2VkIHRocm91Z2ggYWxsCisgICAgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIHdyYXBwZXJzLCBmb3IgZXhhbXBsZToKKworICAgICAgICB2b2lkICogYWxpZ25lZF9tYWxsb2MoIGludCBzaXplLCBjaGFyIGNvbnN0ICogZmlsZSwgaW50IGxpbmUgKSB7CisgICAgICAgICAgICB2b2lkICogcHRyID0gX21hbGxvY19kYmcoIHNpemUsIGZpbGUsIGxpbmUgKTsKKyAgICAgICAgICAgIC8vIHNvbWUgYWRqdXN0bWVudHMuLi4KKyAgICAgICAgICAgIHJldHVybiBwdHI7CisgICAgICAgIH07CisKKyAgICAgICAgdm9pZCAqIHB0ciA9IGFsaWduZWRfbWFsbG9jKCBzaXplLCBfX0ZJTEVfXywgX19MSU5FX18gKTsKKworICAgIFRoaXMgaXMgYSBnb29kIGlkZWEgZm9yIGRlYnVnLCBidXQgcGFzc2luZyBhZGRpdGlvbmFsIGFyZ3VtZW50cyBpbXBhY3RzIHBlcmZvcm1hbmNlLiBEaXNhYmxpbmcKKyAgICBleHRyYSBhcmd1bWVudHMgaW4gcmVsZWFzZSB2ZXJzaW9uIG9mIHRoZSBzb2Z0d2FyZSBpbnRyb2R1Y2VzIHRvbyBtYW55IGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uLAorICAgIHdoaWNoIG1ha2VzIGNvZGUgdW5yZWFkYWJsZS4gVGhpcyBoZWFkZXIgZGVmaW5lcyBmZXcgbWFjcm9zIGFuZCBmdW5jdGlvbnMgZmFjaWxpdGF0aW5nIGl0OgorCisgICAgICAgIHZvaWQgKiBfYWxpZ25lZF9tYWxsb2MoIGludCBzaXplIEtNUF9TUkNfTE9DX0RFQ0wgKSB7CisgICAgICAgICAgICB2b2lkICogcHRyID0gbWFsbG9jX3NyY19sb2MoIHNpemUgS01QX1NSQ19MT0NfUEFSTSApOworICAgICAgICAgICAgLy8gc29tZSBhZGp1c3RtZW50cy4uLgorICAgICAgICAgICAgcmV0dXJuIHB0cjsKKyAgICAgICAgfTsKKyAgICAgICAgI2RlZmluZSBhbGlnbmVkX21hbGxvYyggc2l6ZSApIF9hbGlnbmVkX21hbGxvYyggKHNpemUpIEtNUF9TUkNfTE9DX0NVUlIgKQorICAgICAgICAgICAgLy8gVXNlIG1hY3JvIGluc3RlYWQgb2YgZGlyZWN0IGNhbGwgdG8gZnVuY3Rpb24uCisKKyAgICAgICAgdm9pZCAqIHB0ciA9IGFsaWduZWRfbWFsbG9jKCBzaXplICk7ICAvLyBCaW5nbyEgTWVtb3J5IGxlYWsgd2lsbCBiZSByZXBvcnRlZCBhdCB0aGlzIGxpbmUuCisKKworICAgIDMuIEVuYWJsaW5nIG5hdGl2ZSBtZW1vcnkgZGVidWdnaW5nIGNhcGFiaWxpdGllcy4KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBTb21lIHBsYXRmb3JtcyBtYXkgb2ZmZXIgbWVtb3J5IGRlYnVnZ2luZyBjYXBhYmlsaXRpZXMuIEZvciBleGFtcGxlLCBkZWJ1ZyB2ZXJzaW9uIG9mIE1pY3Jvc29mdAorICAgIFJUTCB0cmFja3MgYWxsIG1lbW9yeSBhbGxvY2F0aW9ucyBhbmQgY2FuIHJlcG9ydCBtZW1vcnkgbGVha3MuIFRoaXMgaGVhZGVyIGVuYWJsZXMgdGhpcywgYW5kCisgICAgbWFrZXMgcmVwb3J0IG1vcmUgdXNlZnVsIChzZWUgIlBhc3Npbmcgc291cmNlIGxvY2F0aW9uIGluZm8gdGhyb3VnaCBtZW1vcnkgYWxsb2NhdGlvbgorICAgIHdyYXBwZXJzIikuCisKKyovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImttcF9vcy5oIgorCisvLyBJbmNsdWRlIGFsbG9jYSgpIGRlY2xhcmF0aW9uLgorI2lmIEtNUF9PU19XSU5ET1dTCisgICAgI2luY2x1ZGUgPG1hbGxvYy5oPiAgICAgICAgLy8gV2luZG93cyogT1M6IF9hbGxvY2EoKSBkZWNsYXJlZCBpbiAibWFsbG9jLmgiLgorICAgICNkZWZpbmUgYWxsb2NhIF9hbGxvY2EgICAgIC8vIEFsbG93IHRvIHVzZSBhbGxvY2EoKSB3aXRoIG5vIHVuZGVyc2NvcmUuCisjZWxpZiBLTVBfT1NfRlJFRUJTRAorICAgIC8vIERlY2xhcmVkIGluICJzdGRsaWIuaCIuCisjZWxpZiBLTVBfT1NfVU5JWAorICAgICNpbmNsdWRlIDxhbGxvY2EuaD4gICAgICAgIC8vIExpbnV4KiBPUyBhbmQgT1MgWCo6IGFsbG9jKCkgZGVjbGFyZWQgaW4gImFsbG9jYSIuCisjZWxzZQorICAgICNlcnJvciBVbmtub3duIG9yIHVuc3VwcG9ydGVkIE9TLgorI2VuZGlmCisKKy8qCisgICAgS01QX1NSQ19MT0NfREVDTCAtLSBEZWNsYXJpbmcgc291cmNlIGxvY2F0aW9uIHBhcmFtZW10ZXJzLCB0byBiZSB1c2VkIGluIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLgorICAgIEtNUF9TUkNfTE9DX1BBUk0gLS0gU291cmNlIGxvY2F0aW9uIHBhcmFtZW10ZXJzLCB0byBiZSB1c2VkIHRvIHBhc3MgcGFyYW1ldGVycyB0byB1bmRlcmx5aW5nCisgICAgICAgIGxldmVscy4KKyAgICBLTVBfU1JDX0xPQ19DVVJSIC0tIFNvdXJjZSBsb2NhdGlvbiBhcmd1bWVudHMgZGVzY3JpYmluZyBjdXJyZW50IGxvY2F0aW9uLCB0byBiZSB1c2VkIGF0CisgICAgICAgIHRvcC1sZXZlbC4KKworICAgIFR5cGljYWwgdXNhZ2U6CisKKyAgICAgICAgdm9pZCAqIF9hbGlnbmVkX21hbGxvYyggaW50IHNpemUgS01QX1NSQ19MT0NfREVDTCApIHsKKyAgICAgICAgICAgIC8vIE5vdGU6IENvbW1hIGlzIG1pc3NlZCBiZWZvcmUgS01QX1NSQ19MT0NfREVDTC4KKyAgICAgICAgICAgIEtFX1RSQUNFKCAyNSwgKCAiY2FsbGVkIGZyb20gJXM6JWRcbiIsIEtNUF9TUkNfTE9DX1BBUk0gKSApOworICAgICAgICAgICAgLi4uCisgICAgICAgIH0KKyAgICAgICAgI2RlZmluZSBhbGlnbmVkX21hbGxvYyggc2l6ZSApIF9hbGlnbmVkX21hbGxvYyggKHNpemUpIEtNUF9TUkNfTE9DX0NVUlIgKQorICAgICAgICAgICAgLy8gVXNlIG1hY3JvIGluc3RlYWQgb2YgZGlyZWN0IGNhbGwgdG8gZnVuY3Rpb24gLS0gbWFjcm8gcGFzc2VzIGluZm8gYWJvdXQgY3VycmVudAorICAgICAgICAgICAgLy8gc291cmNlIGxvY2F0aW9uIHRvIHRoZSBmdW5jLgorKi8KKyNpZiBLTVBfREVCVUcKKyAgICAjZGVmaW5lIEtNUF9TUkNfTE9DX0RFQ0wgICAgLCBjaGFyIGNvbnN0ICogX2ZpbGVfLCBpbnQgX2xpbmVfCisgICAgI2RlZmluZSBLTVBfU1JDX0xPQ19QQVJNICAgICwgX2ZpbGVfLCBfbGluZV8KKyAgICAjZGVmaW5lIEtNUF9TUkNfTE9DX0NVUlIgICAgLCBfX0ZJTEVfXywgX19MSU5FX18KKyNlbHNlCisgICAgI2RlZmluZSBLTVBfU1JDX0xPQ19ERUNMCisgICAgI2RlZmluZSBLTVBfU1JDX0xPQ19QQVJNCisgICAgI2RlZmluZSBLTVBfU1JDX0xPQ19DVVJSCisjZW5kaWYgLy8gS01QX0RFQlVHCisKKy8qCisgICAgbWFsbG9jX3NyY19sb2MoKSBhbmQgZnJlZV9zcmNfbG9jKCkgYXJlIHBzZXVkby1mdW5jdGlvbnMgKHJlYWxseSBtYWNyb3MpIHdpdGggYWNjZXB0cyBleHRyYQorICAgIGFyZ3VtZW50cyAoc291cmNlIGxvY2F0aW9uIGluZm8pIGluIGRlYnVnIG1vZGUuIFRoZXkgc2hvdWxkIGJlIHVzZWQgaW4gcGxhY2Ugb2YgbWFsbG9jKCkgYW5kCisgICAgZnJlZSgpLCB0aGlzIGFsbG93cyBlbmFibGluZyBuYXRpdmUgbWVtb3J5IGRlYnVnZ2luZyBjYXBhYmlsaXRpZXMgKGlmIGFueSkuCisKKyAgICBUeXBpY2FsIHVzYWdlOgorCisgICAgICAgIHB0ciA9IG1hbGxvY19zcmNfbG9jKCBzaXplIEtNUF9TUkNfTE9DX1BBUk0gKTsKKyAgICAgICAgICAgIC8vIEluc2lkZSBtZW1vcnkgYWxsb2NhdGlvbiB3cmFwcGVyLCBvcgorICAgICAgICBwdHIgPSBtYWxsb2Nfc3JjX2xvYyggc2l6ZSBLTVBfU1JDX0xPQ19DVVJSICk7CisgICAgICAgICAgICAvLyBPdXRzaWRlIG9mIG1lbW9yeSBhbGxvY2F0aW9uIHdyYXBwZXIuCisKKworKi8KKyNkZWZpbmUgbWFsbG9jX3NyY19sb2MoIGFyZ3MgKSAgICBfbWFsbG9jX3NyY19sb2MoIGFyZ3MgKQorI2RlZmluZSBmcmVlX3NyY19sb2MoICAgYXJncyApICAgIF9mcmVlX3NyY19sb2MoICAgYXJncyApCisgICAgLyoKKyAgICAgICAgRGVwZW5kaW5nIG9uIGJ1aWxkIG1vZGUgKGRlYnVnIG9yIHJlbGVhc2UpLCBtYWxsb2Nfc3JjX2xvYyBpcyBkZWNsYXJlZCB3aXRoIDEgb3IgMworICAgICAgICBwYXJhbWV0ZXJzLCBidXQgY2FsbHMgdG8gbWFsbG9jX3NyY19sb2MoKSBhcmUgYWx3YXlzIHRoZSBzYW1lOgorCisgICAgICAgICAgICAuLi4gbWFsbG9jX3NyY19sb2MoIHNpemUgS01QX1NSQ19MT0NfUEFSTSApOyAvLyBvciBLTVBfU1JDX0xPQ19DVVJSCisKKyAgICAgICAgQ29tcGlsZXIgaXNzdWVzIHdhcm5pbmcvZXJyb3IgInRvbyBmZXcgYXJndW1lbnRzIGluIG1hY3JvIGludm9jYXRpb24iLiBEZWNsYXJpbmcgdHdvCisgICAgICAgIG1hY3Jvc2VzLCBtYWxsb2Nfc3JjX2xvYygpIGFuZCBfbWFsbG9jX3NyY19sb2MoKSBvdmVyY29tZXMgdGhlIHByb2JsZW0uCisgICAgKi8KKworI2lmIEtNUF9ERUJVRworCisgICAgI2lmIEtNUF9PU19XSU5ET1dTICYmIF9ERUJVRworICAgICAgICAvLyBLTVBfREVCVUcgIT0gX0RFQlVHLiBNUyBkZWJ1ZyBSVEwgaXMgYXZhaWxhYmxlIG9ubHkgaWYgX0RFQlVHIGlzIGRlZmluZWQuCisKKyAgICAgICAgLy8gV2luZG93cyogT1MgaGFzIG5hdGl2ZSBtZW1vcnkgZGVidWdnaW5nIGNhcGFiaWxpdGllcy4gRW5hYmxlIHRoZW0uCisKKyAgICAgICAgI2luY2x1ZGUgPGNydGRiZy5oPgorCisgICAgICAgICNkZWZpbmUgS01QX01FTV9CTE9DSyAgICAgICAgICAgX0NMSUVOVF9CTE9DSworICAgICAgICAjZGVmaW5lIG1hbGxvYyggc2l6ZSApICAgICAgICAgIF9tYWxsb2NfZGJnKCAoc2l6ZSksIEtNUF9NRU1fQkxPQ0ssIF9fRklMRV9fLCBfX0xJTkVfXyApCisgICAgICAgICNkZWZpbmUgY2FsbG9jKCBudW0sIHNpemUgKSAgICAgX2NhbGxvY19kYmcoIChudW0pLCAoc2l6ZSksIEtNUF9NRU1fQkxPQ0ssIF9fRklMRV9fLCBfX0xJTkVfXyApCisgICAgICAgICNkZWZpbmUgcmVhbGxvYyggcHRyLCBzaXplICkgICAgX3JlYWxsb2NfZGJnKCAocHRyKSwgKHNpemUpLCBLTVBfTUVNX0JMT0NLLCBfX0ZJTEVfXywgX19MSU5FX18gKQorICAgICAgICAjZGVmaW5lIGZyZWUoIHB0ciApICAgICAgICAgICAgIF9mcmVlX2RiZyggKHB0ciksIEtNUF9NRU1fQkxPQ0sgKQorCisgICAgICAgICNkZWZpbmUgX21hbGxvY19zcmNfbG9jKCBzaXplLCBmaWxlLCBsaW5lICkgIF9tYWxsb2NfZGJnKCAoc2l6ZSksIEtNUF9NRU1fQkxPQ0ssIChmaWxlKSwgKGxpbmUpICkKKyAgICAgICAgI2RlZmluZSBfZnJlZV9zcmNfbG9jKCAgICBwdHIsIGZpbGUsIGxpbmUgKSAgX2ZyZWVfZGJnKCAgIChwdHIpLCAgS01QX01FTV9CTE9DSyAgICAgICAgICAgICAgICAgKQorCisgICAgI2Vsc2UKKworICAgICAgICAvLyBMaW51eCogT1MsIE9TIFgqLCBvciBub24tZGVidWcgV2luZG93cyogT1MuCisKKyAgICAgICAgI2RlZmluZSBfbWFsbG9jX3NyY19sb2MoIHNpemUsIGZpbGUsIGxpbmUgKSAgICBtYWxsb2MoIChzaXplKSApCisgICAgICAgICNkZWZpbmUgX2ZyZWVfc3JjX2xvYyggcHRyLCBmaWxlLCBsaW5lICkgICAgICAgZnJlZSggKHB0cikgKQorCisgICAgI2VuZGlmCisKKyNlbHNlCisKKyAgICAvLyBJbiByZWxlYXNlIGJ1aWxkIG1hbGxvY19zcmNfbG9jKCkgYW5kIGZyZWVfc3JjX2xvYygpIGRvIG5vdCBoYXZlIGV4dHJhIHBhcmFtZXRlcnMuCisgICAgI2RlZmluZSBfbWFsbG9jX3NyY19sb2MoIHNpemUgKSAgICBtYWxsb2MoIChzaXplKSApCisgICAgI2RlZmluZSBfZnJlZV9zcmNfbG9jKCBwdHIgKSAgICAgICBmcmVlKCAocHRyKSApCisKKyNlbmRpZiAvLyBLTVBfREVCVUcKKworI2VuZGlmIC8vIEtNUF9XUkFQUEVSX01BTExPQ19ICisKKy8vIGVuZCBvZiBmaWxlIC8vCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9saWJpb21wLnJjLnZhciBiL2ZpbmFsL3J1bnRpbWUvc3JjL2xpYmlvbXAucmMudmFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxOWY5OWIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9saWJpb21wLnJjLnZhcgpAQCAtMCwwICsxLDc0IEBACisvLyBsaWJpb21wLnJjLnZhcgorLy8gJFJldmlzaW9uOiA0MjIxOSAkCisvLyAkRGF0ZTogMjAxMy0wMy0yOSAxMzozNjowNSAtMDUwMCAoRnJpLCAyOSBNYXIgMjAxMykgJAorCisvLworLy8vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vLworLy8vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLy8vCisvLy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLy8vCisvLy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworCisjaW5jbHVkZSAid2lucmVzLmgiCisKK0xBTkdVQUdFIExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX1VTICAgIC8vIEVuZ2xpc2ggKFUuUy4pIHJlc291cmNlcworI3ByYWdtYSBjb2RlX3BhZ2UoMTI1MikKKworVlNfVkVSU0lPTl9JTkZPIFZFUlNJT05JTkZPCisgICAgLy8gUGFydHMgb2YgRklMRVZFUlNJT04gYW5kIFBST0RVQ1RWRVJTSU9OIGFyZSAxNi1iaXQgZmllbGRzLCBlbnRpcmUgYnVpbGQgZGF0ZSB5eXl5bW1kZAorICAgIC8vIGRvZXMgbm90IGZpdCBpbnRvIG9uZSB2ZXJzaW9uIHBhcnQsIHNvIHdlIG5lZWQgdG8gc3BsaXQgaXQgaW50byB5eXl5IGFuZCBtbWRkOgorICAgIEZJTEVWRVJTSU9OICAgICRLTVBfVkVSU0lPTl9NQUpPUiwkS01QX1ZFUlNJT05fTUlOT1IsJHt7IG91ciAkS01QX1ZFUlNJT05fQlVJTEQ7IGludCggJEtNUF9WRVJTSU9OX0JVSUxEIC8gMTAwMDAgKSAuICIsIiAuICggJEtNUF9WRVJTSU9OX0JVSUxEICUgMTAwMDAgKSB9fQorICAgIFBST0RVQ1RWRVJTSU9OICRLTVBfVkVSU0lPTl9NQUpPUiwkS01QX1ZFUlNJT05fTUlOT1IsJHt7IG91ciAkS01QX1ZFUlNJT05fQlVJTEQ7IGludCggJEtNUF9WRVJTSU9OX0JVSUxEIC8gMTAwMDAgKSAuICIsIiAuICggJEtNUF9WRVJTSU9OX0JVSUxEICUgMTAwMDAgKSB9fQorICAgIEZJTEVGTEFHU01BU0sgIFZTX0ZGSV9GSUxFRkxBR1NNQVNLCisgICAgRklMRUZMQUdTICAgICAgMAorICAgICNpZiAkS01QX0RJQUcgfHwgJEtNUF9ERUJVR19JTkZPCisgICAgICAgIHwgVlNfRkZfREVCVUcKKyAgICAjZW5kaWYKKyAgICAjaWYgJEtNUF9WRVJTSU9OX0JVSUxEID09IDAKKyAgICAgICAgfCBWU19GRl9QUklWQVRFQlVJTEQgfCBWU19GRl9QUkVSRUxFQVNFCisgICAgI2VuZGlmCisgICAgRklMRU9TICAgICAgICAgIFZPU19OVF9XSU5ET1dTMzIgICAgLy8gV2luZG93cyogU2VydmVyKiAyMDAzLCBYUCosIDIwMDAsIG9yIE5UKgorICAgIEZJTEVUWVBFICAgICAgICBWRlRfRExMCisgICAgQkVHSU4KKyAgICAgICAgQkxPQ0sgIlN0cmluZ0ZpbGVJbmZvIgorICAgICAgICBCRUdJTgorICAgICAgICAgICAgQkxPQ0sgIjA0MDkwNGIwIiAgICAgICAgICAgIC8vIFUuUy4gRW5nbGlzaCwgVW5pY29kZSAoMHgwNGIwID09IDEyMDApCisgICAgICAgICAgICBCRUdJTgorCisgICAgICAgICAgICAgICAgLy8gRmlsZURlc2NyaXB0aW9uIGFuZCBMZWdhbENvcHlyaWdodCBzaG91bGQgYmUgc2hvcnQuCisgICAgICAgICAgICAgICAgVkFMVUUgIkZpbGVEZXNjcmlwdGlvbiIsICAiSW50ZWwoUikgT3Blbk1QKiBSdW50aW1lIExpYnJhcnkke3sgb3VyICRNRVNTQUdFX0NBVEFMT0c7ICRNRVNTQUdFX0NBVEFMT0cgPyAiIE1lc3NhZ2UgQ2F0YWxvZyIgOiAiIiB9fVwwIgorICAgICAgICAgICAgICAgIFZBTFVFICJMZWdhbENvcHlyaWdodCIsICAgIkNvcHlyaWdodCAoQykgMTk5Ny0yMDEzLCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cMCIKKworICAgICAgICAgICAgICAgIC8vIEZvbGxvd2luZyB2YWx1ZXMgbWF5IGJlIHJlbGF0aXZlbHkgbG9uZy4KKyAgICAgICAgICAgICAgICBWQUxVRSAiQ29tcGFueU5hbWUiLCAgICAgICJJbnRlbCBDb3Jwb3JhdGlvblwwIgorICAgICAgICAgICAgICAgIC8vIFZBTFVFICJMZWdhbFRyYWRlbWFya3MiLCAgIlwwIiAgLy8gTm90IHVzZWQgZm9yIG5vdy4KKyAgICAgICAgICAgICAgICBWQUxVRSAiUHJvZHVjdE5hbWUiLCAgICAgICJJbnRlbChSKSBPcGVuTVAqIFJ1bnRpbWUgTGlicmFyeVwwIgorICAgICAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0VmVyc2lvbiIsICAgIiRLTVBfVkVSU0lPTl9NQUpPUi4kS01QX1ZFUlNJT05fTUlOT1JcMCIKKyAgICAgICAgICAgICAgICBWQUxVRSAiRmlsZVZlcnNpb24iLCAgICAgICIkS01QX1ZFUlNJT05fQlVJTERcMCIKKyAgICAgICAgICAgICAgICBWQUxVRSAiSW50ZXJuYWxOYW1lIiwgICAgICIkS01QX0ZJTEVcMCIKKyAgICAgICAgICAgICAgICBWQUxVRSAiT3JpZ2luYWxGaWxlbmFtZSIsICIkS01QX0ZJTEVcMCIKKyAgICAgICAgICAgICAgICBWQUxVRSAiQ29tbWVudHMiLAorICAgICAgICAgICAgICAgICAgICAiSW50ZWwoUikgT3Blbk1QKiAke3sgb3VyICggJE1FU1NBR0VfQ0FUQUxPRywgJEtNUF9UWVBFICk7ICRNRVNTQUdFX0NBVEFMT0cgPyAiUnVudGltZSBMaWJyYXJ5IE1lc3NhZ2UgQ2F0YWxvZyIgOiAiJEtNUF9UWVBFIExpYnJhcnkiIH19ICIKKyAgICAgICAgICAgICAgICAgICAgInZlcnNpb24gJEtNUF9WRVJTSU9OX01BSk9SLiRLTVBfVkVSU0lPTl9NSU5PUi4kS01QX1ZFUlNJT05fQlVJTEQgIgorICAgICAgICAgICAgICAgICAgICAiZm9yICRLTVBfQVJDSCBhcmNoaXRlY3R1cmUgYnVpbHQgb24gJEtNUF9CVUlMRF9EQVRFLlwwIgorICAgICAgICAgICAgICAgICNpZiAkS01QX1ZFUlNJT05fQlVJTEQgPT0gMAorICAgICAgICAgICAgICAgICAgICBWQUxVRSAiUHJpdmF0ZUJ1aWxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIGlzIGEgZGV2ZWxvcG1lbnQgYnVpbGQgZm9yIGludGVybmFsIHRlc3RpbmcgcHVycG9zZXMgb25seS4gIgorICAgICAgICAgICAgICAgICAgICAgICAgIkRvIG5vdCBkaXN0cmlidXRlIGl0IG91dHNpZGUgb2YgSW50ZWwuXDAiCisgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgLy8gVkFMVUUgIlNwZWNpYWxCdWlsZCIsICAgICAiXDAiICAgIC8vIE5vdCB1c2VkIGZvciBub3cuCisKKyAgICAgICAgICAgIEVORAorICAgICAgICBFTkQKKyAgICAgICAgQkxPQ0sgIlZhckZpbGVJbmZvIgorICAgICAgICBCRUdJTgorICAgICAgICAgICAgVkFMVUUgIlRyYW5zbGF0aW9uIiwgJHt7IG91ciAoICRNRVNTQUdFX0NBVEFMT0csICRMQU5HVUFHRSApOyAkTUVTU0FHRV9DQVRBTE9HID8gJExBTkdVQUdFIDogMTAzMyB9fSwgMTIwMAorICAgICAgICAgICAgLy8gMTAzMyAtLSBVLlMuIEVuZ2xpc2gsIDEyMDAgLS0gVW5pY29kZQorICAgICAgICBFTkQKKyAgICBFTkQKKworLy8gZW5kIG9mIGZpbGUgLy8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL21ha2VmaWxlLm1rIGIvZmluYWwvcnVudGltZS9zcmMvbWFrZWZpbGUubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRlZDhlNQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL21ha2VmaWxlLm1rCkBAIC0wLDAgKzEsMTUyNiBAQAorIyBtYWtlZmlsZS5tayAjCisjICRSZXZpc2lvbjogNDI4MjAgJAorIyAkRGF0ZTogMjAxMy0xMS0xMyAxNjo1Mzo0NCAtMDYwMCAoV2VkLCAxMyBOb3YgMjAxMykgJAorCisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgQ2hlY2sgYW5kIG5vcm1hbGl6ZSBMSUJPTVBfV09SSy4KKyMgVGhpcyBwaWVjZSBvZiBjb2RlIGlzIGNvbW1vbiwgYnV0IGl0IGNhbm5vdCBiZSBtb3ZlZCB0byBjb21tb24gZmlsZS4KK2lmZXEgIiQoTElCT01QX1dPUkspIiAiIgorICAgICQoZXJyb3IgTElCT01QX1dPUksgZW52aXJvbm1lbnQgdmFyaWFibGUgbXVzdCBiZSBzZXQpCitlbmRpZgoraWZuZXEgIiQod29yZHMgJChMSUJPTVBfV09SSykpIiAiMSIKKyAgICAkKGVycm9yIExJQk9NUF9XT1JLIG11c3Qgbm90IGNvbnRhaW4gc3BhY2VzKQorZW5kaWYKK292ZXJyaWRlIExJQk9NUF9XT1JLIDo9ICQoc3Vic3QgXCwvLCQoTElCT01QX1dPUkspKQoraWZlcSAiJChmaWx0ZXIgJS8sJChMSUJPTVBfV09SSykpIiAiIgorICAgIG92ZXJyaWRlIExJQk9NUF9XT1JLIDo9ICQoTElCT01QX1dPUkspLworZW5kaWYKKworIyBJbmNsdWRlIGRlZmluaXRpb25zIGNvbW1vbiBmb3IgUlRMIGFuZCBEU0wuCitpbmNsdWRlICQoTElCT01QX1dPUkspc3JjL2RlZnMubWsKKworc3JjX2RpciAgICAgID0gJChMSUJPTVBfV09SSylzcmMvCitpbmNfZGlyICAgICAgPSAkKExJQk9NUF9XT1JLKXNyYy9pbmNsdWRlLyQoT01QX1ZFUlNJT04pLworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucy4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBCdWlsZCBjb21waWxlcgorQlVJTERfQ09NUElMRVIgOj0gJChjYWxsIGNoZWNrX3ZhcmlhYmxlLEJVSUxEX0NPTVBJTEVSLGljYyBnY2MgY2xhbmcgaWNsIGljbC5leGUpCisjIERpc3RyaWJ1dGlvbiB0eXBlOiBjb20gKGNvbW1lcmNpYWwpIG9yIG9zcyAob3Blbi1zb3VyY2UpCitESVNUUklCVVRJT04gIDo9ICQoY2FsbCBjaGVja192YXJpYWJsZSxESVNUUklCVVRJT04sY29tIG9zcykKKworaWZlcSAiJChjKSIgIiIKKyAgICBjID0gJChCVUlMRF9DT01QSUxFUikKKyAgICBpZmVxICIkKG9zKSIgIndpbiIKKyAgICAgICAgYyA9IGljbC5leGUKKyAgICBlbmRpZgorZW5kaWYKK2lmZXEgIiQoZGlzdCkiICIiCisgICAgZGlzdCA9ICQoRElTVFJJQlVUSU9OKQorZW5kaWYKK2lmZXEgIiQoZGlzdCkiICIiCisgICAgZGlzdCA9IGNvbQorZW5kaWYKKworIyBDb21waWxlIGFsbCBDIGZpbGVzIGFzIEMrKyBzb3VyY2UuCitDUExVU1BMVVMgICAgOj0gJChjYWxsIGNoZWNrX3ZhcmlhYmxlLENQTFVTUExVUyxvbikKKyMgVHVybiBvbiBpbnN0cnVtZW50YXRpb24gZm9yIGNvZGUgY292ZXJhZ2UuCitDT1ZFUkFHRSAgICAgOj0gJChjYWxsIGNoZWNrX3ZhcmlhYmxlLENPVkVSQUdFLG9mZiBvbikKKyMgSW5zdHJ1Y3QgY29tcGlsZXIgdG8gZW1pdCBkZWJ1ZyBpbmZvcm1hdGlvbi4KK0RFQlVHX0lORk8gICA6PSAkKGNhbGwgY2hlY2tfdmFyaWFibGUsREVCVUdfSU5GTyxvbiBvZmYpCisjIFR1cm4gb24gZGVidWcgc3VwcG9ydCBpbiBsaWJyYXJ5IGNvZGUsIGFzc2VydGlvbnMgYW5kIHRyYWNlcy4KK0RJQUcgICAgICAgICA6PSAkKGNhbGwgY2hlY2tfdmFyaWFibGUsRElBRyxvbiBvZmYpCitMSUJfVFlQRSAgICAgOj0gJChjYWxsIGNoZWNrX3ZhcmlhYmxlLExJQl9UWVBFLG5vcm0gcHJvZiBzdHViKQorIyBUeXBlIG9mIGxpYnJhcnk6IGR5bmFtaWMgb3Igc3RhdGljIGxpbmtpbmcuCitMSU5LX1RZUEUgICAgOj0gJChjYWxsIGNoZWNrX3ZhcmlhYmxlLExJTktfVFlQRSxkeW5hIHN0YXQpCisjIFN1cHBvcnRlZCBPcGVuTVAgdmVyc2lvbiwgMi41IG9yIDMuMC4KK09NUF9WRVJTSU9OICA6PSAkKGNhbGwgY2hlY2tfdmFyaWFibGUsT01QX1ZFUlNJT04sNDAgMzAgMjUpCisjIEdlbmVyYXRlIG9wdGltaXplZCBjb2RlLgorT1BUSU1JWkFUSU9OIDo9ICQoY2FsbCBjaGVja192YXJpYWJsZSxPUFRJTUlaQVRJT04sb2ZmIG9uKQorIyBUYXJnZXQgY29tcGlsZXIuCitUQVJHRVRfQ09NUElMRVIgOj0gJChjYWxsIGNoZWNrX3ZhcmlhYmxlLFRBUkdFVF9DT01QSUxFUiwxMiAxMSkKKyMgTGlicmFyeSB2ZXJzaW9uOiA0IC0tIGxlZ2FjeSwgNSAtLSBjb21wYXQuCitWRVJTSU9OICAgICAgOj0gJChjYWxsIGNoZWNrX3ZhcmlhYmxlLFZFUlNJT04sNSA0KQorIyBxdWFkIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludAorSEFWRV9RVUFEICAgICA9IDEKKworVlBBVEggKz0gJChzcmNfZGlyKQorVlBBVEggKz0gJChzcmNfZGlyKWkxOG4vCitWUEFUSCArPSAkKGluY19kaXIpCitWUEFUSCArPSAkKHNyY19kaXIpdGhpcmRwYXJ0eS9pdHRub3RpZnkvCisKKworIyBEZWZpbmUgY29uZmlnLgorZGVmaW5lIGN1cnJfY29uZmlnCisgICAgQ1BMVVNQTFVTPSQoQ1BMVVNQTFVTKQorICAgIENPVkVSQUdFPSQoQ09WRVJBR0UpCisgICAgREVCVUdfSU5GTz0kKERFQlVHX0lORk8pCisgICAgRElBRz0kKERJQUcpCisgICAgTElCX1RZUEU9JChMSUJfVFlQRSkKKyAgICBMSU5LX1RZUEU9JChMSU5LX1RZUEUpCisgICAgT01QX1ZFUlNJT049JChPTVBfVkVSU0lPTikKKyAgICBPUFRJTUlaQVRJT049JChPUFRJTUlaQVRJT04pCisgICAgVEFSR0VUX0NPTVBJTEVSPSQoVEFSR0VUX0NPTVBJTEVSKQorICAgIFZFUlNJT049JChWRVJTSU9OKQorICAgIENQUEZMQUdTPSQoc3Vic3QgJChzcGFjZSksXywkKENQUEZMQUdTKSkKKyAgICBDRkxBR1M9JChzdWJzdCAkKHNwYWNlKSxfLCQoQ0ZMQUdTKSkKKyAgICBDWFhGTEFHUz0kKHN1YnN0ICQoc3BhY2UpLF8sJChDWFhGTEFHUykpCisgICAgRkZMQUdTPSQoc3Vic3QgJChzcGFjZSksXywkKEZGTEFHUykpCisgICAgTERGTEFHUz0kKHN1YnN0ICQoc3BhY2UpLF8sJChMREZMQUdTKSkKK2VuZGVmCisjIEFuZCBjaGVjayBpdC4KK2luY2x1ZGUgJCh0b29sc19kaXIpc3JjL2NvbW1vbi1jaGVja3MubWsKKworIyBGdW5jdGlvbiB0byBjb252ZXJ0IExJQl9UWVBFIHRvIHByaW50YWJsZSBvbmUuCitsZWdhbF90eXBlID0gJChpZiAkKGZpbHRlciBub3JtLCQoTElCX1RZUEUpKSxQZXJmb3JtYW5jZSwkKGlmICQoZmlsdGVyIHByb2YsJChMSUJfVFlQRSkpLFByb2ZpbGluZyxTdHViKSkKKworIyBDaGVjayB0aGUgT1MgWCB2ZXJzaW9uICh3ZSBuZWVkIGl0IHRvIGRlY2lkZSB3aGljaCB0b29sIHVzZSBmb3Igb2JqZWN0cyBhY2N1bXVsYXRpb24pCitpZmVxICIkKG9zKSIgIm1hYyIKKyAgICBtYWNfb3NfbmV3IDo9ICQoc2hlbGwgL2Jpbi9zaCAtYyAnaWYgW1sgYHN3X3ZlcnMgLXByb2R1Y3RWZXJzaW9uYCA+IDEwLjYgXV07IHRoZW4gZWNobyAiMSI7IGVsc2UgZWNobyAiMCI7IGZpJykKK2VuZGlmCisKKyMgRm9ybSB0YXJnZXQgZGlyZWN0b3J5IG5hbWUgZm9yIE1JQyBwbGF0Zm9ybXMKK2lmZXEgIiQoTUlDX0FSQ0gpIiAia25jIgorICAgIG1pYy1wb3N0ZjEgID0gLmtuYworZW5kaWYKK2lmZXEgIiQoTUlDX09TKSIgImxpbiIKKyAgICBtaWMtcG9zdGZpeCA9ICQobWljLXBvc3RmMSkubGluCitlbHNlCisgICAgbWljLXBvc3RmaXggPSAkKG1pYy1wb3N0ZjEpCitlbmRpZgorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRGV2IHRvb2xzIGFuZCBnZW5lcmFsIG9wdGlvbnMgKGxpa2UgLWZwaWMsIC1PMiBvciAtZykuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbmNsdWRlICQodG9vbHNfZGlyKXNyYy9jb21tb24tdG9vbHMubWsKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBQcm9qZWN0LXNwZWNpZmljIHRvb2xzIG9wdGlvbnMuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgLS0tIEFzc2VtYmxlciBvcHRpb25zIC0tLQorCitpZmVxICIkKG9zKSIgIndpbiIKKyAgICBpZmVxICIkKGFyY2gpIiAiMzIiCisgICAgICAgIGFzLWZsYWdzICs9IC1jb2ZmCisgICAgICAgIGFzLWZsYWdzICs9IC1EX01fSUEzMgorICAgIGVuZGlmCisgICAgaWZlcSAiJChhcmNoKSIgIjMyZSIKKyAgICAgICAgYXMtZmxhZ3MgICs9IC1EX01fQU1ENjQKKyAgICBlbmRpZgorICAgIGlmZXEgIiQoYXJjaCkiICI2NCIKKyAgICBlbmRpZgorZW5kaWYKKworIyAtLS0gQy9DKysgb3B0aW9ucyAtLS0KKworIyBFbmFibGUgX1F1YWQgdHlwZS4KK2lmbmVxICIkKGZpbHRlciBpY2MgaWNsIGljbC5leGUsJChjKSkiICIiCisgICAgYy1mbGFncyAgICs9IC1Rb3B0aW9uLGNwcCwtLWV4dGVuZGVkX2Zsb2F0X3R5cGVzCisgICAgY3h4LWZsYWdzICs9IC1Rb3B0aW9uLGNwcCwtLWV4dGVuZGVkX2Zsb2F0X3R5cGVzCitlbmRpZgorCitpZmVxICIkKGMpIiAiZ2NjIgorICAgIGlmZXEgIiQoYXJjaCkiICIzMiIKKyAgICAgICAgYy1mbGFncyArPSAtbTMyIC1tc3NlCisgICAgICAgIGN4eC1mbGFncyArPSAtbTMyIC1tc3NlCisgICAgICAgIGZvcnQtZmxhZ3MgKz0gLW0zMiAtbXNzZQorICAgICAgICBsZC1mbGFncyArPSAtbTMyIC1tc3NlCisgICAgICAgIGFzLWZsYWdzICs9IC1tMzIgLW1zc2UKKyAgICBlbmRpZgorZW5kaWYKKworaWZlcSAiJChjKSIgImNsYW5nIgorICAgIGMtZmxhZ3MgKz0gLVduby11bnVzZWQtdmFsdWUgLVduby1zd2l0Y2ggLVduby1kZXByZWNhdGVkLXJlZ2lzdGVyCisgICAgY3h4LWZsYWdzICs9IC1Xbm8tdW51c2VkLXZhbHVlIC1Xbm8tc3dpdGNoIC1Xbm8tZGVwcmVjYXRlZC1yZWdpc3RlcgorICAgIGlmZXEgIiQoYXJjaCkiICIzMiIKKyAgICAgICAgYy1mbGFncyArPSAtbTMyIC1tc3NlCisgICAgICAgIGN4eC1mbGFncyArPSAtbTMyIC1tc3NlCisgICAgICAgIGZvcnQtZmxhZ3MgKz0gLW0zMiAtbXNzZQorICAgICAgICBsZC1mbGFncyArPSAtbTMyIC1tc3NlCisgICAgICAgIGFzLWZsYWdzICs9IC1tMzIgLW1zc2UKKyAgICBlbmRpZgorICAgIEhBVkVfUVVBRCA9IDAKK2VuZGlmCisKK2lmZXEgIiQoTElOS19UWVBFKSIgImR5bmEiCisjIGRlYnVnLWluZm8KKyAgICBpZmVxICIkKG9zKSIgIndpbiIKKyAgICAgICAgYy1mbGFncyAgICArPSAtWmkKKyAgICAgICAgY3h4LWZsYWdzICArPSAtWmkKKyAgICAgICAgZm9ydC1mbGFncyArPSAtWmkKKyAgICBlbHNlCisgICAgICBpZm5lcSAiJChvcykiICJtYWMiCisgICAgICAgIGMtZmxhZ3MgICAgKz0gLWcKKyAgICAgICAgY3h4LWZsYWdzICArPSAtZworICAgICAgICBmb3J0LWZsYWdzICs9IC1nCisgICAgICAgIGxkLWZsYWdzICAgKz0gLWcKKyAgICAgIGVuZGlmCisgICAgZW5kaWYKK2VuZGlmCisKKyMgRW5hYmxlIDgwLWJpdCAibG9uZyBkb3VibGUiLgorIyA/Pz8gSW4gb3JpZ2luYWwgbWFrZWZpbGUsIGl0IHdhcyBlbmFibGVkIGZvciBhbGwgZmlsZXMgb24gd2luXzMyIGFuZCB3aW5fNjQsIGFuZCBvbmx5IGZvciBvbmUKKyMgZmlsZSBrbXBfYXRvbWljLmMgb24gd2luXzMyZS4KK2lmZXEgIiQob3MpIiAid2luIgorICAgIGMtZmxhZ3MgICArPSAtUWxvbmdfZG91YmxlCisgICAgY3h4LWZsYWdzICs9IC1RbG9uZ19kb3VibGUKK2VuZGlmCisKKyMgRW5hYmxlIHNhdmluZyBjb21waWxlciBvcHRpb25zIGFuZCB2ZXJzaW9uIGluIG9iamVjdCBmaWxlcyBhbmQgbGlicmFyaWVzLgoraWZlcSAiJChmaWx0ZXIgZ2NjIGNsYW5nLCQoYykpIiAiIgorICAgIGlmZXEgIiQob3MpIiAid2luIgorICAgICAgICAjIE5ld2VyIE1TIGxpbmtlciBpc3N1ZXMgd2FybmluZ3MgaWYgLVFzb3ggaXMgdXNlZDoKKyAgICAgICAgIyAid2FybmluZyBMTks0MjI0OiAvQ09NTUVOVCBpcyBubyBsb25nZXIgc3VwcG9ydGVkOyAgaWdub3JlZCIKKyAgICAgICAgIyBzbyBsZXQgdXMgY29tbWVudCBpdCBvdXQgKGFuZCBkZWxldGUgbGF0ZXIpLgorICAgICAgICAjIGlmbmVxICIkKGFyY2gpIiAiMzJlIgorICAgICAgICAjICAgICBjLWZsYWdzICAgKz0gLVFzb3gKKyAgICAgICAgIyAgICAgY3h4LWZsYWdzICs9IC1Rc294CisgICAgICAgICMgZW5kaWYKKyAgICAgICAgZm9ydC1mbGFncyArPSAtUXNveAorICAgIGVsc2UKKyAgICAgICAgIyBGb3IgdW5rbm93biByZWFzb24sIGljYyBhbmQgaWZvcnQgb24gbWFjIGRvZXMgbm90IGFjY2VwdCB0aGlzIG9wdGlvbi4KKyAgICAgICAgaWZuZXEgIiQoZmlsdGVyIGxpbiBscmIsJChvcykpIiAiIgorICAgICAgICAgICAgYy1mbGFncyAgICArPSAtc294CisgICAgICAgICAgICBjeHgtZmxhZ3MgICs9IC1zb3gKKyAgICAgICAgICAgIGZvcnQtZmxhZ3MgKz0gLXNveAorICAgICAgICBlbmRpZgorICAgIGVuZGlmCitlbmRpZgorCitpZmVxICIkKG9zKSIgImxyYiIKKyAgICBjLWZsYWdzICAgICs9IC1tbWljCisgICAgY3h4LWZsYWdzICArPSAtbW1pYworICAgIGZvcnQtZmxhZ3MgKz0gLW1taWMKKyAgICBsZC1mbGFncyAgICs9IC1tbWljCisgICAgYXMtZmxhZ3MgICArPSAtbW1pYworICAgIGNwcC1mbGFncyAgKz0gLW1taWMKK2VuZGlmCisKKyMgRXhjZXB0aW9uIGhhbmRsaW5nLgoraWZlcSAiJChvcykiICJ3aW4iCisgICAgIyA/Pz8gRW5hYmxlIGV4Y2VwdGlvbiBoYW5kbGluZz8KKyAgICBpZmVxICIkKExJTktfVFlQRSkiICJkeW5hIgorICAgICAgICBjLWZsYWdzICAgKz0gLUVIc2MKKyAgICAgICAgY3h4LWZsYWdzICs9IC1FSHNjCisgICAgZW5kaWYKK2Vsc2UKKyAgICAjIERpc2FibGUgZXhjZXB0aW9uIGhhbmRsaW5nLgorICAgIGMtZmxhZ3MgICArPSAtZm5vLWV4Y2VwdGlvbnMKKyAgICBjeHgtZmxhZ3MgKz0gLWZuby1leGNlcHRpb25zCitlbmRpZgorCisjIERpc2FibGUgdXNlIG9mIEVCUCBhcyBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIuCitpZmVxICIkKG9zKSIgIndpbiIKKyAgICBpZmVxICIkKGFyY2gpIiAiMzIiCisgICAgICAgIGMtZmxhZ3MgICArPSAtT3ktCisgICAgICAgIGN4eC1mbGFncyArPSAtT3ktCisgICAgZW5kaWYKK2VuZGlmCisKK2lmZXEgIiQob3MpIiAibGluIgorICAgIGMtZmxhZ3MgICArPSAtV3NpZ24tY29tcGFyZQorICAgIGN4eC1mbGFncyArPSAtV3NpZ24tY29tcGFyZQorICAgIGxkLWZsYWdzICArPSAtV3NpZ24tY29tcGFyZQorICAgIGlmZXEgIiQoZmlsdGVyIGdjYyBjbGFuZywkKGMpKSIgIiIKKyAgICAgICAgYy1mbGFncyAgICs9IC1XZXJyb3IKKyAgICAgICAgY3h4LWZsYWdzICs9IC1XZXJyb3IKKyAgICAgICAgbGQtZmxhZ3MgICs9IC1XZXJyb3IKKyAgICBlbmRpZgorZW5kaWYKK2lmZXEgIiQob3MpIiAid2luIgorICAgIGMtZmxhZ3MgICArPSAtV1gKKyAgICBjeHgtZmxhZ3MgKz0gLVdYCisgICAgbGQtZmxhZ3MgICs9IC1XWDpOTworZW5kaWYKKworaWZlcSAiJChvcykiICJscmIiCisgICAgIyBXaXRoICItZnRscy1tb2RlbD1pbml0aWFsLWV4ZWMiIHRoZSBjb21waWxlciBnZW5lcmF0ZXMgZmFzdGVyIGNvZGUgZm9yIHN0YXRpYyBUTFMKKyAgICAjIGFjY2Vzc2VzLCBpdCBnZW5lcmF0ZXMgc2xvd2VyIGNhbGxzIHRvIGdsaWJjIG90aGVyd2lzZS4gV2UgZG9uJ3QgdXNlIHRoaXMKKyAgICAjIGZlYXR1cmUgb24gTGludXggYmVjYXVzZSBpdCBwcmV2ZW50cyBkeW5hbWljIGxvYWRpbmcgKHVzZSBvZiBkbG9wZW4pIG9mIHRoZSBsaWJyYXJ5LgorICAgICMgUmVsaWFibGUgZHluYW1pYyBsb2FkaW5nIGlzIG1vcmUgaW1wb3J0YW50IHRoYW4gc2xpZ2h0bHkgZmFzdGVyIGFjY2VzcyB0byBUTFMuCisgICAgIyBPbiBJbnRlbChSKSBYZW9uIFBoaShUTSkgY29wcm9jZXNzb3Igd2UgaGF2ZW4ndCBlbmNvdW50ZXJlZCBkeW5hbWljIGxvYWRpbmcgcHJvYmxlbSB5ZXQsIHNvIHVzZSBmYXN0ZXIKKyAgICAjIGFjY2VzcyB0byBzdGF0aWMgVExTLgorICAgIGMtZmxhZ3MgICArPSAtZnRscy1tb2RlbD1pbml0aWFsLWV4ZWMKKyAgICBjeHgtZmxhZ3MgKz0gLWZ0bHMtbW9kZWw9aW5pdGlhbC1leGVjCisgICAgIyBkaXNhYmxlIHN0cmVhbWluZyBzdG9yZXMgaW4gb3JkZXIgdG8gd29yayBvbiBBMCBTaQorICAgIGMtZmxhZ3MgICArPSAtb3B0LXN0cmVhbWluZy1zdG9yZXMgbmV2ZXIKKyAgICBjeHgtZmxhZ3MgKz0gLW9wdC1zdHJlYW1pbmctc3RvcmVzIG5ldmVyCitlbmRpZgorCisjIFNlbGVjdCBDIHJ1bnRpbWUuCitpZmVxICIkKG9zKSIgIndpbiIKKyAgICAjIFJlZ2FyZGxlc3Mgb2YgZm9sbG93aW5nIC1abCBvcHRpb24sIHdlIHNob3VsZCBzcGVjaWZ5IC1NVCBvciAtTVRkLCBvdGhlcndpc2UgdGVzdC10b3VjaAorICAgICMgd2lsIGZhaWxzIGR1ZSB0byB1bnJlc29sdmVkIHJlZmVyZW5jZSAiX2Vycm5vIi4KKyAgICBpZmVxICIkKE9QVElNSVpBVElPTikiICJvbiIKKyAgICAgICAgYy1mbGFncyAgICs9IC1NVAorICAgICAgICBjeHgtZmxhZ3MgKz0gLU1UCisgICAgZWxzZQorICAgICAgICBjLWZsYWdzICAgKz0gLU1UZAorICAgICAgICBjeHgtZmxhZ3MgKz0gLU1UZAorICAgIGVuZGlmCisgICAgaWZlcSAiJChMSU5LX1RZUEUpIiAic3RhdCIKKyAgICAgICAgIyBEbyBub3QgZW1pdCBDIHJ1bnRpbWUgbGlicmFyeSB0byBvYmplY3QgZmlsZS4gSXQgd2lsbCBhbGxvd3MgbGluayBPcGVuTVAgUlRMIHdpdGggZWl0aGVyIHN0YXRpYworICAgICAgICAjIG9yIGR5bmFtaWMgQyBydW50aW1lLiBXaW5kb3dzKiBPUyBzcGVjaWZpYywgYXBwbGljYWJsZSBvbmx5IHRvIHN0YXRpYyBSVEwuCisgICAgICAgIGMtZmxhZ3MgICArPSAtWmwKKyAgICAgICAgY3h4LWZsYWdzICs9IC1abAorICAgIGVuZGlmCitlbmRpZgorCitpZmVxICIkKG9zKSIgIndpbiIKKyAgICBjLWZsYWdzICAgKz0gLVczCisgICAgY3h4LWZsYWdzICs9IC1XMworICAgICMgRGlzYWJsZSB3YXJuaW5nOiAiLi4uIGRlY2xhcmVkIGJ1dCBuZXZlciByZWZlcmVuY2VkIgorICAgICMgRGlzYWJsZSByZW1hcmsgIzUwODI6IERpcmVjdGl2ZSBpZ25vcmVkIC0gU3ludGF4IGVycm9yLCBmb3VuZCBJREVOVElGSUVSICdMUkInLi4uCisgICAgZm9ydC1mbGFncyAgICs9IC1RZGlhZy1kaXNhYmxlOjE3Nyw1MDgyCisgICAgYy1mbGFncyAgICAgICs9IC1RZGlhZy1kaXNhYmxlOjE3NworICAgIGN4eC1mbGFncyAgICArPSAtUWRpYWctZGlzYWJsZToxNzcKK2VuZGlmCisKK2lmZXEgIiQoQ1BMVVNQTFVTKSIgIm9uIgorICAgIGlmZXEgIiQob3MpIiAid2luIgorICAgICAgICBjLWZsYWdzICAgKz0gLVRQCisgICAgZWxzZSBpZmVxICIkKGFyY2gpIiAicHBjNjQiCisgICAgIyBjKysweCBvbiBwcGM2NCBsaW51eCByZW1vdmVzIGRlZmluaXRpb24gb2YgcHJlcHJvYy4gbWFjcm9zLCBuZWVkZWQgaW4gLmhzCisgICAgICBjLWZsYWdzICAgKz0gLXggYysrIC1zdGQ9Z251KysweAorICAgIGVsc2UKKyAgICAgICAgaWZuZXEgIiQoZmlsdGVyIGdjYyBjbGFuZywkKGMpKSIgIiIKKyAgICAgICAgICAgIGMtZmxhZ3MgICArPSAteCBjKysgLXN0ZD1jKysweAorICAgICAgICBlbHNlCisgICAgICAgICAgICBjLWZsYWdzICAgKz0gLUtjKysKKyAgICAgICAgZW5kaWYKKyAgICBlbmRpZgorZW5kaWYKKworIyAtLS0gTGlua2VyIG9wdGlvbnMgLS0tCisKK2lmZXEgIiQob3MpIiAibGluIgorICAgIGlmbmVxICIkKExJQl9UWVBFKSIgInN0dWIiCisgICAgICAgIGlmZXEgIiQobGQpIiAibGQiCisgICAgICAgICAgICAjIFdhcm4gYWJvdXQgbm9uLVBJQyBjb2RlIHByZXNlbmNlCisgICAgICAgICAgICBsZC1mbGFncyArPSAtLXdhcm4tc2hhcmVkLXRleHRyZWwKKyAgICAgICAgICAgIGxkLWZsYWdzICs9IC1maW5pPV9fa21wX2ludGVybmFsX2VuZF9maW5pCisgICAgICAgICAgICBsZC1mbGFncyArPSAtbHB0aHJlYWQKKyAgICAgICAgZWxzZSAjICQoYykgb3IgJChjeHgpCisgICAgICAgICAgICBsZC1mbGFncyArPSAtV2wsLS13YXJuLXNoYXJlZC10ZXh0cmVsCisgICAgICAgICAgICBsZC1mbGFncyArPSAtV2wsLWZpbmk9X19rbXBfaW50ZXJuYWxfZW5kX2ZpbmkKKyAgICAgICAgICAgIGxkLWZsYWdzICs9IC1wdGhyZWFkCisgICAgICAgIGVuZGlmCisgICAgZW5kaWYKKyAgICBpZmVxICIkKGxkKSIgIiQoYykiCisgICAgICAgIGxkLWZsYWdzICs9IC1mUElDCisgICAgICAgIGlmZXEgIiQoREVCVUdfSU5GTykiICJvbiIKKyAgICAgICAgICAgIGxkLWZsYWdzICs9IC1nCisgICAgICAgIGVuZGlmCisgICAgICAgIGlmZXEgIiQoT1BUSU1JWkFUSU9OKSIgIm9mZiIKKyAgICAgICAgICAgIGxkLWZsYWdzICs9IC1PMAorICAgICAgICBlbmRpZgorICAgICAgICBsZC1mbGFncyArPSAtV2wsLS12ZXJzaW9uLXNjcmlwdD0kKHNyY19kaXIpZXhwb3J0c19zby50eHQKKyAgICBlbHNlCisgICAgICAgIGxkLWZsYWdzICs9IC0tdmVyc2lvbi1zY3JpcHQ9JChzcmNfZGlyKWV4cG9ydHNfc28udHh0CisgICAgZW5kaWYKKyAgICBpZmVxICIkKGxkKSIgIiQoYykiCisgICAgICAgICMgdG8gcmVtb3ZlIGRlcGVuZGVuY3kgb24gbGliaW1mLCBsaWJzdm1sLCBsaWJpbnRsYzoKKyAgICAgICAgaWZlcSAiJChjKSIgImljYyIKKyAgICAgICAgICAgIGxkLWZsYWdzLWRsbCArPSAtc3RhdGljLWludGVsCisgICAgICAgIGVuZGlmCisgICAgICAgIGxkLWZsYWdzLWRsbCArPSAtV2wsLS1hcy1uZWVkZWQKKyAgICAgICAgIyB0byByZW1vdmUgZGVwZW5kZW5jeSBvbiBsaWJnY2NfczoKKyAgICAgICAgaWZlcSAiJChjKSIgImdjYyIKKyAgICAgICAgICAgIGxkLWZsYWdzLWRsbCArPSAtc3RhdGljLWxpYmdjYworICAgICAgICAgICAgaWZuZXEgIiQob21wX29zKSIgImZyZWVic2QiCisgICAgICAgICAgICAgICAgbGQtZmxhZ3MtZXh0cmEgKz0gLVdsLC1sZGwKKyAgICAgICAgICAgIGVuZGlmCisgICAgICAgIGVuZGlmCisgICAgICAgIGlmZXEgIiQoYykiICJjbGFuZyIKKyAgICAgICAgICAgIGlmbmVxICIkKG9tcF9vcykiICJmcmVlYnNkIgorICAgICAgICAgICAgICAgIGxkLWZsYWdzLWV4dHJhICs9IC1XbCwtbGRsCisgICAgICAgICAgICBlbmRpZgorICAgICAgICBlbmRpZgorICAgICAgICBpZmVxICIkKGFyY2gpIiAiMzIiCisgICAgICAgICAgICBpZmVxICIkKGZpbHRlciBnY2MgY2xhbmcsJChjKSkiICIiCisgICAgICAgICAgICAjIHRvIHdvcmthcm91bmQgQ1EyMTUyMjkgbGluayBsaWJpcmNfcGljIG1hbnVhbGx5CisgICAgICAgICAgICBsZC1mbGFncy1leHRyYSArPSAtbGlyY19waWMKKyAgICAgICAgICAgIGVuZGlmCisgICAgICAgIGVuZGlmCisgICAgICAgIGlmZXEgIiQoZmlsdGVyIDMyIDMyZSA2NCBwcGM2NCwkKGFyY2gpKSIgIiIKKyAgICAgICAgICAgIGxkLWZsYWdzLWV4dHJhICs9ICQoc2hlbGwgcGtnLWNvbmZpZyAtLWxpYnMgbGliZmZpKQorICAgICAgICBlbmRpZgorICAgIGVsc2UKKyAgICAgICAgaWZlcSAiJChhcmNoKSIgIjMyZSIKKyAgICAgICAgICAgICMgPz8/CisgICAgICAgICAgICBsZC1mbGFncyArPSAtQnN0YXRpYyAtTC91c3IvbGliNjQgLWxjX25vbnNoYXJlZCAtQmR5bmFtaWMKKyAgICAgICAgZW5kaWYKKyAgICBlbmRpZgorZW5kaWYKKworaWZlcSAiJChvcykiICJscmIiCisgIGlmZXEgIiQobGQpIiAibGQiCisgICAgaWZuZXEgIiQoTElCX1RZUEUpIiAic3R1YiIKKyAgICAgICAgbGQtZmxhZ3MgKz0gLWx0aHIKKyAgICAgICAgbGQtZmxhZ3MgKz0gLWZpbmk9X19rbXBfaW50ZXJuYWxfZW5kX2F0ZXhpdAorICAgICAgICAjIFdhcm4gYWJvdXQgbm9uLVBJQyBjb2RlIHByZXNlbmNlCisgICAgICAgIGxkLWZsYWdzICs9IC0td2Fybi1zaGFyZWQtdGV4dHJlbAorICAgIGVuZGlmCisgICAgbGQtZmxhZ3MgKz0gLS12ZXJzaW9uLXNjcmlwdD0kKHNyY19kaXIpZXhwb3J0c19zby50eHQKKyAgZW5kaWYKKyAgaWZlcSAiJChsZCkiICIkKGMpIgorICAgIGxkLWZsYWdzICs9IC1XbCwtLXdhcm4tc2hhcmVkLXRleHRyZWwKKyAgICBsZC1mbGFncyArPSAtV2wsLS12ZXJzaW9uLXNjcmlwdD0kKHNyY19kaXIpZXhwb3J0c19zby50eHQKKyAgICBsZC1mbGFncyArPSAtc3RhdGljLWludGVsCisgICAgIyBEb24ndCBsaW5rIGxpYmNpbGsqLgorICAgIGxkLWZsYWdzICs9IC1uby1pbnRlbC1leHRlbnNpb25zCisgICAgIyBEaXNjYXJkIHVubmVlZGVkIGRlcGVuZGVuY2llcy4KKyAgICBsZC1mbGFncyArPSAtV2wsLS1hcy1uZWVkZWQKKyMgICAgbGQtZmxhZ3MgKz0gLW5vZGVmYXVsdGxpYnMKKyAgICAjIFRvIGNoZWNrIHdoaWNoIGxpYnJhcmllcyB0aGUgY29tcGlsZXIgbGlua3MgY29tbWVudCBhYm92ZSBsaW5lIGFuZCB1bmNvbW1lbnQgYmVsb3cgbGluZQorIyAgICBsZC1mbGFncyArPSAtXCMKKyAgICAjIGxpbmsgbGlicmFyaWVzIGluIHRoZSBvcmRlciB0aGUgaWNjIGNvbXBpbGVyIHVzZXMgKG9idGFpbmVkIHVzaW5nICJpY2MgLXNoYXJlZCAtIyIgY29tbWFuZCBsaW5lKQorICAgICMgQ29tcGlsZXIgMjAxMDEwMTcgdXNlcyAiLWxpbnRsYyAtbHRociAtbGMgLWxpbnRsYyAtbGlyY19zIiBzZXF1ZW5jZSwgd2UgZm9sbG93IGl0OgorIyAgICBsZC1mbGFncyArPSAtbGludGxjCisgICAgaWZuZXEgIiQoTElCX1RZUEUpIiAic3R1YiIKKyAgICAgICAgbGQtZmxhZ3MgKz0gLXB0aHJlYWQKKyAgICAgICAgaWZlcSAiJChNSUNfT1MpIiAibGluIgorICAgICAgICAgICAgbGQtZmxhZ3MgKz0gLWxkbAorICAgICAgICBlbmRpZgorICAgIGVuZGlmCisgIGVuZGlmCitlbmRpZgorCitpZmVxICIkKG9zKSIgIm1hYyIKKyAgICBpZmVxICIkKGMpIiAiaWNjIgorICAgICAgICBsZC1mbGFncyArPSAtbm8taW50ZWwtZXh0ZW5zaW9ucworICAgIGVuZGlmCisgICAgbGQtZmxhZ3MgKz0gLXNpbmdsZV9tb2R1bGUKKyAgICBsZC1mbGFncyArPSAtY3VycmVudF92ZXJzaW9uICQoVkVSU0lPTikuMCAtY29tcGF0aWJpbGl0eV92ZXJzaW9uICQoVkVSU0lPTikuMAorZW5kaWYKKworaWZlcSAiJChvcykiICJ3aW4iCisgICAgbGQtZmxhZ3MgKz0gLWluY3JlbWVudGFsOm5vCisgICAgbGQtZmxhZ3MgKz0gLXZlcnNpb246JChWRVJTSU9OKS4wCitlbmRpZgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFByb2plY3Qtc3BlY2lmaWMgcHJlcHJvY2Vzc29yIGRlZmluaXRpb25zLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjcHAtZmxhZ3MgKz0gLUQgS01QX0FSQ0hfU1RSPSJcIiQoY2FsbCBsZWdhbF9hcmNoLCQoYXJjaCkpXCIiCisKK2lmZXEgIiQob3MpIiAid2luIgorICAgIGNwcC1mbGFncyArPSAtRCBfV0lORE9XUyAtRCBfV0lOTlQgLUQgX1dJTjMyX1dJTk5UPTB4MDUwMQorICAgICMgMHgwNTAxIG1lYW5zIFdpbmRvd3MqIFhQKiBPUyBvciBXaW5kb3dzKiBTZXJ2ZXIgMjAwMyogT1Mgb3IgbGF0ZXIuCisgICAgIyBXZSBuZWVkIHRoaXMgZm9yIEdldE1vZHVsZUhhbmxlRXggZnVuY3Rpb24uCisgICAgaWZlcSAiJChMSU5LX1RZUEUpIiAiZHluYSIKKyAgICAgICAgY3BwLWZsYWdzICs9IC1EIF9VU1JETEwKKyAgICBlbmRpZgorZWxzZSAjIGxpbiwgbHJiIG9yIG1hYworICAgIGNwcC1mbGFncyArPSAtRCBfR05VX1NPVVJDRQorICAgIGNwcC1mbGFncyArPSAtRCBfUkVFTlRSQU5UCitlbmRpZgorCisjIFRPRE86IERJQUcgbGVhZHMgdG8gREVCVUcuIENvbmZ1c2luZyBhIGJpdC4gUmFuYW1lIEtNUF9ERUJVRyB0byBLTVBfRElBRz8KK2lmZXEgIiQoRElBRykiICJvbiIKKyAgICBjcHAtZmxhZ3MgKz0gLUQgS01QX0RFQlVHCitlbmRpZgoraWZlcSAiJChDT1ZFUkFHRSkiICJvbiIKKyAgICBjcHAtZmxhZ3MgKz0gLUQgQ09WRVIKK2VuZGlmCisjIEFzc2VydGlvbnMgaW4gT01QIFJUTCBjb2RlIGFyZSBjb250cm9sbGVkIGJ5IHR3byBtYWNyb3M6IEtNUF9ERUJVRyBlbmFibGVzIG9yIGRpc2FibGVzIGFzc2VydGlvbnMKKyMgaWZmIEtNUF9VU0VfQVNTRVJUIGlzIGRlZmluZWQuIElmIEtNUF9VU0VfQVNTRVJUIGlzIG5vdCBkZWZpbmVkLCBhc3NlcnRpb25zIGRpc2FibGVkIHJlZ2FyZGxlc3Mgb2YKKyMgS01QX0RFQlVHLiBJdCB3YXMgaW1wbGVtZW50ZWQgZm9yIGNvZGUgY292ZXJhZ2UgLS0gdG8gaGF2ZSBkZWJ1ZyBidWlsZCB3aXRoIG5vIGFzc2VydGlvbiwgYnV0IGl0CisjIGRvZXMgbm90IGhhdmUgbXVjaCBlZmZlY3QuIFRPRE86IFJlbW92ZSBtYWNyby4KK2lmZXEgIiQoQ09WRVJBR0UpIiAib2ZmIgorICAgIGNwcC1mbGFncyArPSAtRCBLTVBfVVNFX0FTU0VSVAorZW5kaWYKKworY3BwLWZsYWdzICs9IC1EIEJVSUxEX0k4CitpZm5lcSAiJChvcykiICJ3aW4iCisgICAgY3BwLWZsYWdzICs9IC1EIEJVSUxEX1RWCitlbmRpZgorY3BwLWZsYWdzICs9IC1EIEtNUF9MSUJSQVJZX0ZJTEU9XCIkKGxpYl9maWxlKVwiCitjcHAtZmxhZ3MgKz0gLUQgS01QX1ZFUlNJT05fTUFKT1I9JChWRVJTSU9OKQorCisjIGN1c3RvbWl6ZSBwcGM2NCBjYWNoZSBsaW5lIHNpemUgdG8gMTI4LCA2NCBvdGhlcndpc2UKK2lmZXEgIiQoYXJjaCkiICJwcGM2NCIKKwljcHAtZmxhZ3MgKz0gLUQgQ0FDSEVfTElORT0xMjgKK2Vsc2UgCisJY3BwLWZsYWdzICs9IC1EIENBQ0hFX0xJTkU9NjQKK2VuZGlmCisKK2NwcC1mbGFncyArPSAtRCBLTVBfQURKVVNUX0JMT0NLVElNRT0xCitjcHAtZmxhZ3MgKz0gLUQgQlVJTERfUEFSQUxMRUxfT1JERVJFRAorY3BwLWZsYWdzICs9IC1EIEtNUF9BU01fSU5UUklOUworaWZuZXEgIiQob3MpIiAibHJiIgorICAgIGNwcC1mbGFncyArPSAtRCBVU0VfTE9BRF9CQUxBTkNFCitlbmRpZgoraWZuZXEgIiQob3MpIiAid2luIgorICAgIGNwcC1mbGFncyArPSAtRCBVU0VfQ0JMS0RBVEEKKyAgICAjID8/PyBXaW5kb3dzKiBPUzogVVNFX0NCTEtEQVRBIGRlZmluZWQgaW4ga21wLmguCitlbmRpZgoraWZlcSAiJChvcykiICJ3aW4iCisgICAgY3BwLWZsYWdzICs9IC1EIEtNUF9XSU5fQ0RFQ0wKK2VuZGlmCitpZmVxICIkKExJTktfVFlQRSkiICJkeW5hIgorICAgIGNwcC1mbGFncyArPSAtRCBHVUlERURMTF9FWFBPUlRTCitlbmRpZgoraWZlcSAiJChMSUJfVFlQRSkiICJzdHViIgorICAgIGNwcC1mbGFncyArPSAtRCBLTVBfU1RVQgorZW5kaWYKK2lmZXEgIiQoVkVSU0lPTikiICI0IgorZWxzZSAjIDUKKyAgICBpZmVxICIkKG9zKSIgIndpbiIKKyAgICBlbHNlCisgICAgICAgIGNwcC1mbGFncyArPSAtRCBLTVBfR09NUF9DT01QQVQKKyAgICBlbmRpZgorZW5kaWYKKworaWZuZXEgIiQoZmlsdGVyIDMyIDMyZSwkKGFyY2gpKSIgIiIKK2NwcC1mbGFncyArPSAtRCBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTPTEgLUQgS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTPTAKK2VuZGlmCisKKyMgZGVmaW5lIGNvbXBhdGliaWxpdHkgd2l0aCBkaWZmZXJlbnQgT3Blbk1QIHZlcnNpb25zCitoYXZlX29tcF81MD0wCitoYXZlX29tcF80MT0wCitoYXZlX29tcF80MD0wCitoYXZlX29tcF8zMD0wCitpZmVxICIkKE9NUF9WRVJTSU9OKSIgIjUwIgorCWhhdmVfb21wXzUwPTEKKwloYXZlX29tcF80MT0xCisJaGF2ZV9vbXBfNDA9MQorCWhhdmVfb21wXzMwPTEKK2VuZGlmCitpZmVxICIkKE9NUF9WRVJTSU9OKSIgIjQxIgorCWhhdmVfb21wXzUwPTAKKwloYXZlX29tcF80MT0xCisJaGF2ZV9vbXBfNDA9MQorCWhhdmVfb21wXzMwPTEKK2VuZGlmCitpZmVxICIkKE9NUF9WRVJTSU9OKSIgIjQwIgorCWhhdmVfb21wXzUwPTAKKwloYXZlX29tcF80MT0wCisJaGF2ZV9vbXBfNDA9MQorCWhhdmVfb21wXzMwPTEKK2VuZGlmCitpZmVxICIkKE9NUF9WRVJTSU9OKSIgIjMwIgorCWhhdmVfb21wXzUwPTAKKwloYXZlX29tcF80MT0wCisJaGF2ZV9vbXBfNDA9MAorCWhhdmVfb21wXzMwPTEKK2VuZGlmCitjcHAtZmxhZ3MgKz0gLUQgT01QXzUwX0VOQUJMRUQ9JChoYXZlX29tcF81MCkgLUQgT01QXzQxX0VOQUJMRUQ9JChoYXZlX29tcF80MSkKK2NwcC1mbGFncyArPSAtRCBPTVBfNDBfRU5BQkxFRD0kKGhhdmVfb21wXzQwKSAtRCBPTVBfMzBfRU5BQkxFRD0kKGhhdmVfb21wXzMwKQorCisKKyMgVXNpbmcgaXR0bm90aWZ5IGlzIGVuYWJsZWQgYnkgZGVmYXVsdC4KK1VTRV9JVFRfTk9USUZZID0gMQoraWZlcSAiJChvcyktJChhcmNoKSIgIndpbi02NCIKKyAgICBVU0VfSVRUX05PVElGWSA9IDAKK2VuZGlmCitpZmVxICIkKExJTktfVFlQRSkiICJzdGF0IgorICAgIFVTRV9JVFRfTk9USUZZID0gMAorZW5kaWYKK2NwcC1mbGFncyArPSAtRCBVU0VfSVRUX05PVElGWT0kKFVTRV9JVFRfTk9USUZZKQoraWZlcSAiJChVU0VfSVRUX05PVElGWSkiICIwIgorICAgICMgRGlzYWJsZSBhbGwgaXR0bm90aWZ5IGNhbGxzLgorICAgIGNwcC1mbGFncyArPSAtRCBJTlRFTF9OT19JVFROT1RJRllfQVBJCitlbHNlCisgICAgaWZlcSAiJChvcykiICJ3aW4iCisgICAgICAgIGl0dG5vdGlmeV9zdGF0aWMkKG9iaikgOiBjcHAtZmxhZ3MgKz0gLUQgVU5JQ09ERQorICAgIGVuZGlmCitlbmRpZgorIyBTcGVjaWZ5IHByZWZpeCB0byBiZSB1c2VkIGZvciBleHRlcm5hbCBzeW1ib2xzLiBQcmVmaXggaXMgcmVxdWlyZWQgZXZlbiBpZiBJVFQgTm9maXR5IHR1cm5lZCBvZmYKKyMgYmVjYXVzZSB3ZSBoYXZlIHNvbWUgZnVuY3Rpb25zIHdpdGggX19pdHRfIHByZWZpeCAoX19pdHRfZXJyb3JfaGFuZGxlcikgYW5kIHdhbnQgcHJlZml4IHRvIGJlCisjIGNoYW5nZWQgdG8gX19rbXBfaXR0Xy4KK2NwcC1mbGFncyArPSAtRCBJTlRFTF9JVFROT1RJRllfUFJFRklYPV9fa21wX2l0dF8KKworCisjIExpbnV4KiBPUzogX19kZWNsc3BlYyh0aHJlYWQpIFRMUyBpcyBzdGlsbCBidWdneSBvbiBzdGF0aWMgYnVpbGRzLgorIyBXaW5kb3dzKiBPUzogVGhpcyBkZWZpbmUgY2F1c2VzIHByb2JsZW1zIHdpdGggTG9hZExpYnJhcnkgKyBkZWNsc3BlYyh0aHJlYWQpIG9uIFdpbmRvd3MqIE9TLiBTZWUgQ1E1MDU2NCwKKyMgICAgIHRlc3RzIGttcF9sb2FkX2xpYnJhcnlfbGliKi5jLCBhbmQgdGhlIGZvbGxvd2luZyBNU0ROIHJlZmVyZW5jZToKKyMgICAgIGh0dHA6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20va2IvMTE4ODE2CitpZm5lcSAiJChmaWx0ZXIgbGluIGxyYiwkKG9zKSkiICIiCisgICAgaWZlcSAiJChMSU5LX1RZUEUpIiAiZHluYSIKKyAgICAgICAgY3BwLWZsYWdzICs9IC1EIEtNUF9UREFUQV9HVElECisgICAgZWxzZQorICAgICAgICAjIEFDOiBhbGxvdyBfX3RocmVhZCBpbiBzdGF0aWMgYnVpbGQgZm9yIEludGVsKFIpIDY0LCBsb29rcyBsaWtlIGl0IGlzCisgICAgICAgICMgd29ya2luZyB0aGVyZS4gSXQgaXMgYnJva2VuIG9uIElBLTMyIGFyY2hpdGVjdHVyZSBmb3IgUkhFTDQgYW5kIFNMRVM5LgorICAgICAgICBpZmVxICIkKGFyY2gpIiAiMzJlIgorICAgICAgICAgICAgY3BwLWZsYWdzICs9IC1EIEtNUF9UREFUQV9HVElECisgICAgICAgIGVuZGlmCisgICAgZW5kaWYKK2VuZGlmCisKKyMgSW50ZWwgY29tcGlsZXIgaGFzIGEgYnVnOiBpbiBjYXNlIG9mIGNyb3NzLWJ1aWxkIGlmIHVzZWQgd2l0aAorIyAteCBhc3NlbWJsZXItd2l0aC1jcHAgb3B0aW9uLCBpdCBkZWZpbmVzIG1hY3JvcyBmb3IgYm90aCBhcmNoaXRlY3R1cmVzLAorIyBob3N0IGFuZCB0YXJ0Z2V0LiBGb3IgZXhhbXBsZSwgaWYgY29tcGlsZXIgZm9yIElBLTMyIGFyY2hpdGVjdHVyZQorIyBydW5zIG9uIEludGVsKFIpIDY0LCBpdCBkZWZpbmVzIGJvdGggX19pMzg2IGFuZCBfX3g4Nl82NC4gKE5vdGUgaXQgaXMgYSBidWcKKyMgb25seSBpZiAteCBhc3NlbWJsZXItd2l0aC1jcHAgaXMgc3BlY2lmaWVkLCBpbiBjYXNlIG9mIEMgZmlsZXMgaWNjIGRlZmluZXMKKyMgb25seSBvbmUsIHRhcmdldCBhcmNoaXRlY3R1cmUpLiBTbyB3ZSBjYW5ub3QgYXV0b2RldGVjdCB0YXJnZXQgYXJjaGl0ZWN0dXJlCisjIHdpdGhpbiB0aGUgZmlsZSwgYW5kIGhhdmUgdG8gcGFzcyB0YXJnZXQgYXJjaGl0ZWN0dXJlIGZyb20gY29tbWFuZCBsaW5lLgoraWZuZXEgIiQob3MpIiAid2luIgorICAgIGlmZXEgIiQoYXJjaCkiICJhcm0iCisgICAgICAgIHpfTGludXhfYXNtJChvYmopIDogXAorCQkgICAgY3BwLWZsYWdzICs9IC1EIEtNUF9BUkNIX0FSTQorICAgIGVsc2UgaWZlcSAiJChhcmNoKSIgInBwYzY0IiAKKyAgICAgICAgel9MaW51eF9hc20kKG9iaikgOiBcCisJCQljcHAtZmxhZ3MgKz0gLUQgS01QX0FSQ0hfUFBDNjQJCSAgICAKKyAgICBlbHNlCisgICAgCXpfTGludXhfYXNtJChvYmopIDogXAorICAgICAgIAkJY3BwLWZsYWdzICs9IC1EIEtNUF9BUkNIX1g4NiQoaWYgJChmaWx0ZXIgMzJlLCQoYXJjaCkpLF82NCkJCisgICAgZW5kaWYKK2VuZGlmCisKKyMgRGVmaW5pbmcgS01QX0JVSUxEX0RBVEUgZm9yIGFsbCBmaWxlcyBsZWFkcyB0byB3YXJuaW5nICJpbmNvbXBhdGlibGUgcmVkZWZpbml0aW9uIiwgYmVjYXVzZSB0aGUKKyMgc2FtZSBtYWNybyBpcyBhbHNvIGRlZmluZWQgaW4gb21wLmguIFRvIGF2b2lkIGNvbmZsaWN0LCBsZXQgdXMgZGVmaW5lIG1hY3JvIHdpdGggZGlmZmVyZW50IG5hbWUsCisjIF9LTVBfQlVJTERfVElNRS4KK2ttcF92ZXJzaW9uJChvYmopIDogY3BwLWZsYWdzICs9IC1EIF9LTVBfQlVJTERfVElNRT0iXCIkKGRhdGUpXCIiCisKKyMgLS0tIE1hY3JvcyBmb3IgZ2VuZXJhdGUtZGVmLnBsIC0tLQorCitnZC1mbGFncyArPSAtRCBhcmNoXyQoYXJjaCkKK2dkLWZsYWdzICs9IC1EICQoTElCX1RZUEUpCitpZmVxICIkKEhBVkVfUVVBRCkiICIxIgorICAgIGdkLWZsYWdzICs9IC1EIEhBVkVfUVVBRAorZW5kaWYKK2lmZXEgIiQoT01QX1ZFUlNJT04pIiAiNDAiCisgICAgZ2QtZmxhZ3MgKz0gLUQgT01QXzQwIC1EIE9NUF8zMAorZWxzZQorICAgIGlmZXEgIiQoT01QX1ZFUlNJT04pIiAiMzAiCisgICAgICAgIGdkLWZsYWdzICs9IC1EIE9NUF8zMAorICAgIGVuZGlmCitlbmRpZgoraWZuZXEgIiQoVkVSU0lPTikiICI0IgorICAgIGdkLWZsYWdzICs9IC1EIG1zdmNfY29tcGF0CitlbmRpZgoraWZlcSAiJChESUFHKSIgIm9uIgorICAgIGdkLWZsYWdzICs9IC1EIEtNUF9ERUJVRworZW5kaWYKKworIyAtLS0gTWFjcm8gZm9yIGV4cGFuZC12YXJzLnBsIC0tLQorCisjICRSZXZpc2lvbiBhbmQgJERhdGUgb2Z0ZW4gb2NjdXIgaW4gZmlsZSBoZWFkZXIsIHNvIGRlZmluZSB0aGVzZSB2YXJpYWJsZXMgdG8gc2F0aXNmeSBleHBhbmQtdmFycy5wbC4KK2V2LWZsYWdzICs9IC1EIFJldmlzaW9uPSJcJCRSZXZpc2lvbiIgLUQgRGF0ZT0iXCQkRGF0ZSIKKworIyBWYXJpb3VzIHZhcmlhYmxlcy4KK2V2LWZsYWdzICs9IC1EIEtNUF9UWVBFPSIkKGNhbGwgbGVnYWxfdHlwZSwkKExJQl9UWVBFKSkiIC1EIEtNUF9BUkNIPSIkKGNhbGwgbGVnYWxfYXJjaCwkKGFyY2gpKSIKK2V2LWZsYWdzICs9IC1EIEtNUF9WRVJTSU9OX01BSk9SPSQoVkVSU0lPTikgLUQgS01QX1ZFUlNJT05fTUlOT1I9MCAtRCBLTVBfVkVSU0lPTl9CVUlMRD0kKGJ1aWxkKQorZXYtZmxhZ3MgKz0gLUQgS01QX0JVSUxEX0RBVEU9IiQoZGF0ZSkiCitldi1mbGFncyArPSAtRCBLTVBfVEFSR0VUX0NPTVBJTEVSPSQoVEFSR0VUX0NPTVBJTEVSKQorZXYtZmxhZ3MgKz0gLUQgS01QX0RJQUc9JChpZiAkKGZpbHRlciBvbiwkKERJQUcpKSwxLDApCitldi1mbGFncyArPSAtRCBLTVBfREVCVUdfSU5GTz0kKGlmICQoZmlsdGVyIG9uLCQoREVCVUdfSU5GTykpLDEsMCkKK2lmZXEgIiQoT01QX1ZFUlNJT04pIiAiNDAiCisgICAgZXYtZmxhZ3MgKz0gLUQgT01QX1ZFUlNJT049MjAxMzA3CitlbHNlCisgICAgaWZlcSAiJChPTVBfVkVSU0lPTikiICIzMCIKKyAgICAgICAgZXYtZmxhZ3MgKz0gLUQgT01QX1ZFUlNJT049MjAxMTA3CisgICAgZWxzZQorICAgICAgICBldi1mbGFncyArPSAtRCBPTVBfVkVSU0lPTj0yMDA1MDUKKyAgICBlbmRpZgorZW5kaWYKKworIyAtLSBPcHRpb25zIHNwZWNpZmllZCBpbiBjb21tYW5kIGxpbmUgLS0tCisKK2NwcC1mbGFncyAgKz0gJChDUFBGTEFHUykKK2MtZmxhZ3MgICAgKz0gJChDRkxBR1MpCitjeHgtZmxhZ3MgICs9ICQoQ1hYRkxBR1MpCitmb3J0LWZsYWdzICs9ICQoRkZMQUdTKQorbGQtZmxhZ3MgICArPSAkKExERkxBR1MpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRmlsZXMuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgTGlicmFyeSBmaWxlcy4gVGhlc2UgZmlsZXMgcGFydGljaXBhdGUgaW4gYWxsIGtpbmRzIG9mIGxpYnJhcnkuCitsaWJfY19pdGVtcyA6PSAgICAgIFwKKyAgICBrbXBfZnRuX2NkZWNsICAgXAorICAgIGttcF9mdG5fZXh0cmEgICBcCisgICAga21wX3ZlcnNpb24gICAgIFwKKyAgICAkKGVtcHR5KQorbGliX2NwcF9pdGVtcyA6PQorbGliX2FzbV9pdGVtcyA6PQorCisjIEZpbGVzIHRvIGJlIGxpbmtlZCBpbnRvIGltcG9ydCBsaWJyYXJ5LgoraW1wX2NfaXRlbXMgOj0KKworZG9fdGVzdF90b3VjaF9tdCA6PSAxCisKK2lmZXEgIiQoTElCX1RZUEUpIiAic3R1YiIKKyAgICBsaWJfY19pdGVtcyArPSBrbXBfc3R1YgorZWxzZSAjIG5vcm0gb3IgcHJvZgorICAgIGxpYl9jX2l0ZW1zICs9ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAga21wX2FsbG9jICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGttcF9hdG9taWMgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBrbXBfY3N1cHBvcnQgICAgICAgICAgICAgICAgIFwKKyAgICAgICAga21wX2RlYnVnICAgICAgICAgICAgICAgICAgICBcCisJa21wX2l0dCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICQoZW1wdHkpCisgICAgaWZlcSAiJChVU0VfSVRUX05PVElGWSkiICIxIgorICAgICAgICBsaWJfY19pdGVtcyArPSAgaXR0bm90aWZ5X3N0YXRpYworICAgIGVuZGlmCisKKworICAgIGxpYl9jcHBfaXRlbXMgKz0gICAgICAgICAgICAgICAgIFwKKyAgICAgICAga21wX2Vudmlyb25tZW50ICAgICAgICAgICAgICBcCisgICAgICAgIGttcF9lcnJvciAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBrbXBfZ2xvYmFsICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAga21wX2kxOG4gICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGttcF9pbyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBrbXBfcnVudGltZSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAga21wX3NldHRpbmdzICAgICAgICAgICAgICAgICBcCisgICAgICAgIGttcF9zdHIgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBrbXBfdGFza2luZyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAga21wX3Rhc2txICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGttcF90aHJlYWRwcml2YXRlICAgICAgICAgICAgXAorICAgICAgICBrbXBfdXRpbGl0eSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAga21wX2FmZmluaXR5ICAgICAgICAgICAgICAgICBcCisgICAgICAgIGttcF9kaXNwYXRjaCAgICAgICAgICAgICAgICAgXAorICAgICAgICBrbXBfbG9jayAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAga21wX3NjaGVkICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICQoZW1wdHkpCisKK2lmZXEgIiQoT01QX1ZFUlNJT04pIiAiNDAiCisgICAgbGliX2NwcF9pdGVtcyArPSBrbXBfdGFza2RlcHMKKyAgICBsaWJfY3BwX2l0ZW1zICs9IGttcF9jYW5jZWwKK2VuZGlmCisKKyAgICAjIE9TLXNwZWNpZmljIGZpbGVzLgorICAgIGlmZXEgIiQob3MpIiAid2luIgorICAgICAgICBsaWJfY19pdGVtcyArPSB6X1dpbmRvd3NfTlRfdXRpbAorICAgICAgICAjIEFyY2gtc3BlY2lmaWMgZmlsZXMuCisgICAgICAgIGxpYl9jX2l0ZW1zICAgKz0gel9XaW5kb3dzX05ULTU4Nl91dGlsCisgICAgICAgIGxpYl9hc21faXRlbXMgKz0gel9XaW5kb3dzX05ULTU4Nl9hc20KKyAgICAgICAgaWZlcSAiJChMSU5LX1RZUEUpIiAiZHluYSIKKyAgICAgICAgICAgIGltcF9jX2l0ZW1zICs9IGttcF9pbXBvcnQKKyAgICAgICAgICAgICMgZm9yIHdpbl8zMi93aW5fMzJlIGR5bmFtaWMgbGliZ3VpZGU0MC5kbGwsCisgICAgICAgICAgICAjIGJ1aWxkIHRoZSBzaGltIGxpYiBpbnN0ZWFkCisgICAgICAgICAgICBpZmVxICIkKFZFUlNJT04pIiAiNCIKKyAgICAgICAgICAgICAgICBpZm5lcSAiJChhcmNoKSIgIjY0IgorICAgICAgICAgICAgICAgICAgICBpZmVxICIkKExJQl9UWVBFKSIgIm5vcm0iCisgICAgICAgICAgICAgICAgICAgIGxpYl9jX2l0ZW1zICAgPSBrbXBfc2hpbQorICAgICAgICAgICAgICAgICAgICAgICAgbGliX2NwcF9pdGVtcyA9CisgICAgICAgICAgICAgICAgICAgICAgICBsaWJfYXNtX2l0ZW1zID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGdkLWZsYWdzICs9IC1EIHNoaW0KKyAgICAgICAgICAgICAgICAgICAgICAgICMgZm9yIHNvbWUgcmVhc29uLCB0ZXN0LXRvdWNoLW1kIGlzIGFibGUgdG8gd29yayB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBidWlsZCBjb21waWxlcidzIHZlcnNpb24gb2YgbGliaW9tcDVtZC5kbGwsIGJ1dAorICAgICAgICAgICAgICAgICAgICAgICAgIyB0ZXN0LXRvdWNoLW10IGNhbid0IGxvYWQgaXQuCisgICAgICAgICAgICAgICAgICAgICAgICBkb190ZXN0X3RvdWNoX210IDo9IDAKKyAgICAgICAgICAgICAgICAgICAgZW5kaWYKKyAgICAgICAgICAgICAgICBlbmRpZgorICAgICAgICAgICAgZW5kaWYKKyAgICAgICAgZW5kaWYKKyAgICBlbHNlICMgbGluLCBscmIgb3IgbWFjCisgICAgICAgIGxpYl9jX2l0ZW1zICs9IHpfTGludXhfdXRpbAorICAgICAgICAjIEdDQyBDb21wYXRpYmlsaXR5IGZpbGVzCisgICAgICAgIGlmZXEgIiQoVkVSU0lPTikiICI0IgorICAgICAgICBlbHNlICMgNQorICAgICAgICAgICAgbGliX2NfaXRlbXMgKz0ga21wX2dzdXBwb3J0CisgICAgICAgIGVuZGlmCisjICAgICAgICBpZm5lcSAiJChhcmNoKSIgInBwYzY0IgorICAgICAgICBsaWJfYXNtX2l0ZW1zICs9IHpfTGludXhfYXNtCisjCSAgICAgZW5kaWYKKyAgICBlbmRpZgorZW5kaWYKKworbGliX29ial9maWxlcyA6PSAkKHNvcnQgJChhZGRzdWZmaXggJChvYmopLCQobGliX2NfaXRlbXMpICQobGliX2NwcF9pdGVtcykgJChsaWJfYXNtX2l0ZW1zKSkpCitpbXBfb2JqX2ZpbGVzIDo9ICQoc29ydCAkKGFkZHN1ZmZpeCAkKG9iaiksJChpbXBfY19pdGVtcykgJChpbXBfY3BwX2l0ZW1zKSAkKGltcF9hc21faXRlbXMpKSkKK2RlcF9maWxlcyAgICAgOj0gJChzb3J0ICQoYWRkc3VmZml4IC5kLCQobGliX2NfaXRlbXMpICQobGliX2NwcF9pdGVtcykgJChpbXBfY19pdGVtcykgJChpbXBfY3BwX2l0ZW1zKSkpCitpX2ZpbGVzICAgICAgIDo9ICQoc29ydCAkKGFkZHN1ZmZpeCAuaSwkKGxpYl9jX2l0ZW1zKSAkKGxpYl9jcHBfaXRlbXMpICQoaW1wX2NfaXRlbXMpICQoaW1wX2NwcF9pdGVtcykpKQorCisKKyMgLS0tIENvbnN0cnVjdCBsaWJyYXJ5IGZpbGUgbmFtZSAtLS0KKworaWZlcSAiJChWRVJTSU9OKSIgIjQiCisgICAgaWZlcSAiJChMSUJfVFlQRSkiICJzdHViIgorICAgICAgICBfbGliX2l0ZW0gPSBsaWJvbXBzdHViCisgICAgZWxzZSAjIG5vcm0gb3IgcHJvZgorICAgICAgICBfbGliX2l0ZW0gPSBsaWJndWlkZQorICAgIGVuZGlmCisgICAgaWZlcSAiJChvcyktJChMSU5LX1RZUEUpIiAid2luLWR5bmEiCisgICAgICAgIF9saWJfaXRlbSArPSA0MAorICAgIGVuZGlmCisgICAgaWZlcSAiJChMSUJfVFlQRSkiICJwcm9mIgorICAgICAgICBfbGliX2l0ZW0gKz0gX3N0YXRzCisgICAgZW5kaWYKK2Vsc2UKKyAgICBfbGliX2l0ZW0gPSBsaWJpb21wCisgICAgaWZlcSAiJChMSUJfVFlQRSkiICJwcm9mIgorICAgICAgICBfbGliX2l0ZW0gKz0gcHJvZgorICAgIGVuZGlmCisgICAgaWZlcSAiJChMSUJfVFlQRSkiICJzdHViIgorICAgICAgICBfbGliX2l0ZW0gKz0gc3R1YnMKKyAgICBlbmRpZgorICAgIF9saWJfaXRlbSArPSAkKFZFUlNJT04pCisgICAgaWZlcSAiJChvcykiICJ3aW4iCisgICAgICAgIGlmZXEgIiQoTElOS19UWVBFKSIgImR5bmEiCisgICAgICAgICAgICBfbGliX2l0ZW0gKz0gbWQKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX2xpYl9pdGVtICs9IG10CisgICAgICAgIGVuZGlmCisgICAgZW5kaWYKK2VuZGlmCisjIF9saWJfaXRlbSBpcyBhIGxpc3Qgb2Ygc3BhY2Ugc2VwYXJhdGVkIG5hbWUgcGFydHMuIFJlbW92ZSBzcGFjZXMgdG8gZm9ybSBmaW5hbCBuYW1lLgorbGliX2l0ZW0gPSAkKHN1YnN0ICQoc3BhY2UpLCwkKF9saWJfaXRlbSkpCitpZmVxICIkKExJTktfVFlQRSkiICJkeW5hIgorICAgIGxpYl9leHQgPSAkKGRsbCkKK2Vsc2UKKyAgICBsaWJfZXh0ID0gJChsaWIpCitlbmRpZgorbGliX2ZpbGUgID0gJChsaWJfaXRlbSkkKGxpYl9leHQpCitpZmVxICIkKG9zKS0kKExJTktfVFlQRSkiICJ3aW4tZHluYSIKKyAgICBpbXBfZmlsZSAgPSAkKGxpYl9pdGVtKSQobGliKQorICAgIGRlZl9maWxlICA9ICQobGliX2l0ZW0pLmRlZgorICAgIHJlc19maWxlICA9ICQobGliX2l0ZW0pLnJlcworICAgIHJjX2ZpbGUgICA9ICQobGliX2l0ZW0pLnJjCisgICAgIyBQREIgZmlsZSBzaG91bGQgYmUgZ2VuZXJhdGVkIGlmOiAoIERFQklHX0lORk8gaXMgb24gKSBPUiAoIHdlIGFyZSBidWlsZGluZyAzMi1iaXQgbm9ybWFsCisgICAgIyBsaWJyYXJ5IEFORCB2ZXJzaW9uIGlzIDUgKS4KKyAgICBpZm5lcSAiJChmaWx0ZXIgb24sJChERUJVR19JTkZPKSkkKGZpbHRlciBub3JtLTUsJChMSUJfVFlQRSktJChWRVJTSU9OKSkiICIiCisgICAgICAgIHBkYl9maWxlID0gJChsaWJfaXRlbSkucGRiCisgICAgZW5kaWYKK2VuZGlmCitpZm5lcSAiJChmaWx0ZXIgbGluIGxyYiwkKG9zKSkiICIiCisgICAgaWZlcSAiJChMSU5LX1RZUEUpIiAiZHluYSIKKyAgICAgIGlmbmVxICIkKERFQlVHX0lORk8pIiAib24iCisgICAgICAgIGRiZ19maWxlID0gJChsaWJfaXRlbSkuZGJnCisgICAgICBlbmRpZgorICAgIGVsc2UKKyAgICAgICAgZGJnX3N0cmlwID0gIm9uIgorICAgIGVuZGlmCitlbmRpZgorCisjIC0tLSBPdXRwdXQgZmlsZXMgLS0tCisKK291dF9saWJfZmlsZXMgID0gJChhZGRwcmVmaXggJChvdXRfbGliX2RpciksJChsaWJfZmlsZSkgJChpbXBfZmlsZSkgJChwZGJfZmlsZSkgJChkYmdfZmlsZSkpCitvdXRfaW5jX2ZpbGVzICA9ICQoYWRkcHJlZml4ICQob3V0X3B0Zl9kaXIpaW5jbHVkZV9jb21wYXQvLGlvbXBfbGliLmgpCitvdXRfbW9kX2ZpbGVzICA9IFwKKyAgICAkKGFkZHByZWZpeCAkKG91dF9wdGZfZGlyKWluY2x1ZGUvLG9tcF9saWIubW9kIG9tcF9saWJfa2luZHMubW9kKQorb3V0X2Ntbl9maWxlcyAgPSBcCisgICAgJChhZGRwcmVmaXggJChvdXRfY21uX2RpcilpbmNsdWRlLyxvbXAuaCBvbXBfbGliLmggb21wX2xpYi5mIG9tcF9saWIuZjkwKSBcCisgICAgJChhZGRwcmVmaXggJChvdXRfY21uX2RpcilpbmNsdWRlX2NvbXBhdC8saW9tcC5oKQoraWZuZXEgIiQob3V0X2xpYl9mYXRfZGlyKSIgIiIKKyAgICBvdXRfbGliX2ZhdF9maWxlcyAgPSAkKGFkZHByZWZpeCAkKG91dF9saWJfZmF0X2RpciksJChsaWJfZmlsZSkgJChpbXBfZmlsZSkpCitlbmRpZgorCisjIC0tLSBTcGVjaWFsIGRlcGVuZGVuY2llcyAtLS0KKworIyBXZSBoYXZlIHRvIGVuY29kZSBkZXBlbmRlbmNpZXMgb24gb21wLmggbWFudWFsbHksIGJlY2F1c2UgYXV0b21hdGljIGRlcGVuZGVuY3kgZ2VuZXJhdGlvbgorIyBieSBjb21waWxlciBwcm9kdWNlcyBkZXBlZGVuY3kgb24gb21wLmggZmlsZSBsb2NhdGVkIGluIGNvbXBpbGVyIGluY2x1ZGUgZGlyZWN0b3J5Lgora21wX2NzdXBwb3J0JChvYmopIDogb21wLmgKK2ttcF9zdHViJChvYmopICAgICA6IG9tcC5oCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRXh0ZXJuYWwgbGlicmFyaWVzIHRvIGxpbmsgaW4uCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgV2UgKGFjdHVhbGx5LCBvdXIgY3VzdG9tZXJzKSBkbyBubyB3YW50IE9wZW5NUCBSVEwgZGVwZW5kcyBvbiBleHRlcm5hbCBsaWJyYXJpZXMsIHNvIHdlIGhhdmUgdG8KKyMgcGljayB1cCBzb21lIG9iamVjdCBmaWxlcyBmcm9tIGxpYmlyYyBsaWJyYXJ5IChJbnRlbCBjb21waWxlciBnZW5lcmF0ZSBjb2RlIHdpdGggY2FsbHMgdG8gbGliaXJjKQorIyBhbmQgbGluayB0aGVtIGludG8gT01QIFJUTC4KKyMgbGliaXBnbyBpcyByZXF1aXJlZCBvbmx5IGZvciBjb2xsZWN0aW5nIGNvZGUgY292ZXJhZ2UgZGF0YSwgYnV0IGlzIGlzIGNvbnZlbmllbnQgdG8gbGluayBpbiBpbnRvCisjIE9NUCBSVEwgYXMgd2VsbCwgbm90IHRvIGRlcGVuZCBvbiBleHRyYSBsaWJzIGFuZCBwYXRocy4KKworIyBsaWJpcmMgZG9lcyBtYXR0ZXIgb25seSBpZiBJbnRlbCBjb21waWxlciBpcyB1c2VkLgoraWZuZXEgIiQoZmlsdGVyIGljYyBpY2wgaWNsLmV4ZSwkKGMpKSIgIiIKKworICAgIGlmbmVxICIkKElDQ19MSUJfRElSKSIgIiIKKyAgICAgICAgaWNjX2xpYl9kaXIgOj0gJChJQ0NfTElCX0RJUikKKyAgICBlbHNlCisgICAgICAgICMKKyAgICAgICAgIyBMZXQgdXMgZmluZCBwYXRoIHRvIEludGVsIGxpYnJhcmllcyBmaXJzdC4gKGRvbid0IHVzZSB0YWJzIGluIHRoZXNlIGxpbmVzISkKKyAgICAgICAgIworICAgICAgICBpY2NfcGF0aCA6PSAkKHNoZWxsIHdoaWNoICQoYykpCisgICAgICAgICQoY2FsbCBkZWJ1ZyxpY2NfcGF0aCkKKyAgICAgICAgaWZlcSAiJCh3b3JkcyAkKGljY19wYXRoKSkiICIwIgorICAgICAgICAgICAgJChlcnJvciBQYXRoIHRvICIkKGMpIiBub3QgZm91bmQsIHJlcG9ydGVkIHBhdGg6ICQoaWNjX3BhdGgpKQorICAgICAgICBlbmRpZgorICAgICAgICBpZm5lcSAiJCh3b3JkcyAkKGljY19wYXRoKSkiICIxIgorICAgICAgICAgICAgJChlcnJvciBQYXRoIHRvICIkKGMpIiBjb250YWlucyBzcGFjZXM6ICIkKGljY19wYXRoKSIpCisgICAgICAgIGVuZGlmCisgICAgICAgIGlmZXEgIiQob3MpIiAid2luIiAgIyBXaW5kb3dzKiBPUyBzcGVjaWZpYy4KKyAgICAgICAgICAgICMgYHdoaWNoJyBjYW4gcmV0dXJuIHBhdGggd2l0aCBiYWNrc2xhc2hlcy4gQ29udmVydCB0aGVtLgorICAgICAgICAgICAgaWNjX3BhdGggOj0gJChzdWJzdCBcLC8sJChpY2NfcGF0aCkpCisgICAgICAgICAgICAjIGljYydzICJiaW4vIiBkaXJlY3RvcnkgbWF5IGJlIG5hbWVkIGFzICJCaW4vIiBvciBldmVuICJCSU4vIi4gQ29udmVydCBpdCB0byBsb3dlciBjYXNlLgorICAgICAgICAgICAgaWNjX3BhdGggOj0gJChzdWJzdCBCLGIsJChpY2NfcGF0aCkpCisgICAgICAgICAgICBpY2NfcGF0aCA6PSAkKHN1YnN0IEksaSwkKGljY19wYXRoKSkKKyAgICAgICAgICAgIGljY19wYXRoIDo9ICQoc3Vic3QgTixuLCQoaWNjX3BhdGgpKQorICAgICAgICAgICAgJChjYWxsIGRlYnVnLGljY19wYXRoKQorICAgICAgICBlbmRpZgorICAgICAgICAjIGljYyAxMC54IGRpcmVjdG9yeSBsYXlvdXQ6CisgICAgICAgICMgICAgICAgICBiaW4vCisgICAgICAgICMgICAgICAgICBsaWIvCisgICAgICAgICMgaWNjIDExLnggZGlyZWN0b3J5IGxheW91dDoKKyAgICAgICAgIyAgICAgICAgIGJpbi97aWEzMixpbnRlbDY0fS8KKyAgICAgICAgIyAgICAgICAgIGxpYi97aWEzMixpbnRlbDY0fS8KKyAgICAgICAgIyBpY2MgMTIueCBkaXJlY3RvcnkgbGF5b3V0OgorICAgICAgICAjICAgICAgICAgYmluL3tpYTMyLGludGVsNjR9LworICAgICAgICAjICAgICAgICAgY29tcGlsZXIvbGliL3tpYTMyLGludGVsNjR9LworICAgICAgICAjIE5vdGU6IE9uIE9TIFgqIGZhdCBsaWJyYXJpZXMgcmVzaWRlIGluIGxpYi8gZGlyZWN0b3J5LiBPbiBvdGhlciBzeXN0ZW1zIGxpYnJhcmllcyBhcmUgaW4KKyAgICAgICAgIyBsaWIvPGFyY2g+Ly4KKyAgICAgICAgaWNjX3BhdGhfdXAxIDo9ICQoZGlyICQoaWNjX3BhdGgpKQorICAgICAgICBpY2NfcGF0aF91cDIgOj0gJChkaXIgJChwYXRzdWJzdCAlLywlLCQoaWNjX3BhdGhfdXAxKSkpCisgICAgICAgICQoY2FsbCBkZWJ1ZyxpY2NfcGF0aF91cDEpCisgICAgICAgICQoY2FsbCBkZWJ1ZyxpY2NfcGF0aF91cDIpCisgICAgICAgIGlmbmVxICIkKGZpbHRlciAlL2Jpbi8sJChpY2NfcGF0aF91cDEpKSIgIiIKKyAgICAgICAgICAgICMgTG9vayBsaWtlIDEwLnggY29tcGlsZXIuCisgICAgICAgICAgICBpY2NfbGliX2RpciA6PSAkKHBhdHN1YnN0ICUvYmluLywlL2xpYi8sJChpY2NfcGF0aF91cDEpKQorICAgICAgICBlbHNlCisgICAgICAgICAgICBpZm5lcSAiJChmaWx0ZXIgJS9iaW4vLCQoaWNjX3BhdGhfdXAyKSkiICIiCisgICAgICAgICAgICAgICAgIyBJdCBsb29rcyBsaWtlIDExLnggb3IgbGF0ZXIgY29tcGlsZXIuCisgICAgICAgICAgICAgICAgaWZlcSAiJChvcykiICJtYWMiCisgICAgICAgICAgICAgICAgICAgIGljY19saWIxMiA6PSAkKHBhdHN1YnN0ICUvYmluLywlL2NvbXBpbGVyL2xpYi8sJChpY2NfcGF0aF91cDIpKQorICAgICAgICAgICAgICAgICAgICBpZm5lcSAiJCh3aWxkY2FyZCAkKGljY19saWIxMilsaWJpcmMqJChsaWIpKSIgIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICMgMTIueAorICAgICAgICAgICAgICAgICAgICAgICAgaWNjX2xpYl9kaXIgOj0gJChpY2NfbGliMTIpCisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICMgMTEueAorICAgICAgICAgICAgICAgICAgICAgICAgaWNjX2xpYl9kaXIgOj0gJChwYXRzdWJzdCAlL2Jpbi8sJS9saWIvLCQoaWNjX3BhdGhfdXAyKSkKKyAgICAgICAgICAgICAgICAgICAgZW5kaWYKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGljY19saWIxMiA6PSAkKHBhdHN1YnN0ICUvYmluLywlL2NvbXBpbGVyL2xpYi8sJChpY2NfcGF0aF91cDIpKSQobm90ZGlyICQocGF0c3Vic3QgJS8sJSwkKGljY19wYXRoX3VwMSkpKS8KKyAgICAgICAgICAgICAgICAgICAgaWZuZXEgIiQod2lsZGNhcmQgJChpY2NfbGliMTIpbGliaXJjKiQobGliKSkiICIiCisgICAgICAgICAgICAgICAgICAgICAgICAjIDEyLngKKyAgICAgICAgICAgICAgICAgICAgICAgIGljY19saWJfZGlyIDo9ICQoaWNjX2xpYjEyKQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAjIDExLngKKyAgICAgICAgICAgICAgICAgICAgICAgIGljY19saWJfZGlyIDo9ICQocGF0c3Vic3QgJS9iaW4vLCUvbGliLywkKGljY19wYXRoX3VwMikpJChub3RkaXIgJChwYXRzdWJzdCAlLywlLCQoaWNjX3BhdGhfdXAxKSkpLworICAgICAgICAgICAgICAgICAgICBlbmRpZgorICAgICAgICAgICAgICAgIGVuZGlmCisgICAgICAgICAgICBlbmRpZgorICAgICAgICBlbmRpZgorICAgICAgICAkKGNhbGwgZGVidWcsaWNjX2xpYl9kaXIpCisgICAgICAgIGlmZXEgIiQoaWNjX2xpYl9kaXIpIiAiIgorICAgICAgICAgICAgJChlcnJvciBQYXRoIHRvICQoYykgbGliLyBkaXIgbm90IGZvdW5kKQorICAgICAgICBlbmRpZgorICAgIGVuZGlmCisKKyAgICAjCisgICAgIyBUaGVuIHNlbGVjdCBwcm9wZXIgbGlicmFyaWVzLgorICAgICMKKyAgICBpZmVxICIkKG9zKSIgIndpbiIKKyAgICAgICAgbGliaXJjICA9ICQoaWNjX2xpYl9kaXIpXGxpYmlyY210JChsaWIpCisgICAgICAgIGxpYmlwZ28gPSAkKGljY19saWJfZGlyKVxsaWJpcGdvJChsaWIpCisgICAgZWxzZSAjIGxpbiwgbHJiIG9yIG1hYworICAgICAgICBpZmVxICIkKExJTktfVFlQRSkiICJkeW5hIgorICAgICAgICAgICAgIyBJbiBjYXNlIG9mIGR5bmFtaWMgbGlua2luZywgcHJlZmVyIGxpYmkqX3BpYy5hIGxpYnJhcmllcywgdGhleSBjb250YWlucworICAgICAgICAgICAgIyBwb3NpdGlvbi1pbmRlcGVuZGVudCBjb2RlLgorICAgICAgICAgICAgbGliaXJjICA9ICQoaWNjX2xpYl9kaXIpbGliaXJjX3BpYyQobGliKQorICAgICAgICAgICAgbGliaXBnbyA9ICQoaWNjX2xpYl9kaXIpbGliaXBnb19waWMkKGxpYikKKyAgICAgICAgICAgICMgSWYgbGliaSpfcGljLmEgaXMgbm90IGZvdW5kIChpdCBpcyBtaXNzZWQgaW4gb2xkZXIgY29tcGlsZXJzKSwgdXNlIGxpYmkqLmEuCisgICAgICAgICAgICBpZmVxICIkKHdpbGRjYXJkICQobGliaXJjKSkiICIiCisgICAgICAgICAgICAgICAgbGliaXJjID0gJChpY2NfbGliX2RpcilsaWJpcmMkKGxpYikKKyAgICAgICAgICAgIGVuZGlmCisgICAgICAgICAgICBpZmVxICIkKHdpbGRjYXJkICQobGliaXBnbykpIiAiIgorICAgICAgICAgICAgICAgIGxpYmlwZ28gPSAkKGljY19saWJfZGlyKWxpYmlwZ28kKGxpYikKKyAgICAgICAgICAgIGVuZGlmCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGxpYmlyYyAgPSAkKGljY19saWJfZGlyKWxpYmlyYyQobGliKQorICAgICAgICAgICAgbGliaXBnbyA9ICQoaWNjX2xpYl9kaXIpbGliaXBnbyQobGliKQorICAgICAgICBlbmRpZgorICAgIGVuZGlmCisKKyAgICAjIE9rLCBub3cgbGV0IHVzIGRlY2lkZSB3aGVuIGxpbmtlZAorICAgICMgTGludXgqIE9TOgorICAgICMgV2UgbGluayBpbiBsaWJyYXJpZXMgdG8gc3RhdGljIGxpYnJhcnkgb25seS4KKyAgICBpZmVxICIkKG9zKS0kKExJTktfVFlQRSkiICJsaW4tc3RhdCIKKyAgICAgICAgbGlua2VkX2luX2xpYnMgKz0gbGliaXJjCisgICAgZW5kaWYKKyAgICAjIE9TIFgqOgorICAgICMgVGhlIHRyaWNrIGlzIG5vdCByZXF1aXJlZCBpbiBjYXNlIG9mIGR5bmFtaWMgbGlicmFyeSwgYnV0IG9uIEludGVsKFIpIDY0IGFyY2hpdGVjdHVyZSB3ZSBoYXZlIGEKKyAgICAjIHByb2JsZW06IGxpYmlyYy5hIGlzIGEgZmF0LCBzbyBsaW5rZXIgKGxpYnRvb2wpIHByb2R1Y2VzIGZhdCBsaWJndWlkZS5keWxpYi4uLiA6LSggKE9ubHkKKyAgICAjIGZ1bmN0aW9ucyBmcm9tIGxpYmlyYyBhcmUgcHJlc2VudGVkIGZvciBib3RoIGFyY2hpdGVjdHVyZXMsIGxpYmd1aWRlIGZ1bmN0aW9ucyBhcmUgZm9yIEludGVsKFIpIDY0CisgICAgIyBvbmx5LikgVG8gYXZvaWQgdGhpcyB1bmRlc2lyZWQgZWZmZWN0LCBsaWJpcmMgdHJpY2sgaXMgZW5hYmxlZCBmb3IgYm90aCBzdGF0aWMgYW5kIGR5bmFtaWMKKyAgICAjIGJ1aWxkcy4gUHJvYmFibHkgd2UgY2FuIGluc3RydWN0IGxpYnRvb2wgdG8gcHJvZHVjZSAidGhpbiIgKG5vdCBmYXQpIGxpYnJhcnkgYnkgdXNpbmcKKyAgICAjIC1hcmNoX29ubHkgb3B0aW9uLi4uCisgICAgaWZlcSAiJChvcykiICJtYWMiCisgICAgICAgIGxpbmtlZF9pbl9saWJzICs9IGxpYmlyYworICAgIGVuZGlmCisgICAgIyBXaW5kb3dzKiBPUzoKKyAgICAjIFRoZSB0cmljayBpcyByZXF1aXJlZCBvbmx5IGluIGNhc2Ugb2Ygc3RhdGljIE9NUCBSVEwuIEluIGNhc2Ugb2YgZHluYW1pYyBPTVAgUlRMIGxpbmtlciBkb2VzCisgICAgIyB0aGUgam9iLgorICAgIGlmZXEgIiQob3MpLSQoTElOS19UWVBFKSIgIndpbi1zdGF0IgorICAgICAgICBsaW5rZWRfaW5fbGlicyArPSBsaWJpcmMKKyAgICBlbmRpZgorCisgICAgaWZlcSAiJChDT1ZFUkFHRSkiICJvbiIKKyAgICAgICAgbGlua2VkX2luX2xpYnMgKz0gbGliaXBnbworICAgIGVuZGlmCisKK2VuZGlmCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTWFpbiB0YXJnZXRzLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCithbGwgICAgOiBsaWIgaW5jIG1vZAorbGliICAgIDogdGVzdHMgJChvdXRfbGliX2ZpbGVzKQoraW5jICAgIDogJChvdXRfaW5jX2ZpbGVzKQorbW9kICAgIDogJChvdXRfbW9kX2ZpbGVzKQorY2xlYW4gIDoKKwkkKHJtKSAkKG91dF9saWJfZmlsZXMpICQob3V0X2xpYl9mYXRfZmlsZXMpCisJJChybSkgJChvdXRfaW5jX2ZpbGVzKSAkKG91dF9tb2RfZmlsZXMpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQnVpbGRpbmcgbGlicmFyeS4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworJChsaWJfZmlsZSkgOiAkKGlmICQoZGJnX2ZpbGUpLHN0cmlwcGVkLHVuc3RyaXBwZWQpLyQobGliX2ZpbGUpCisJJCh0YXJnZXQpCisJJChjcCkgJDwgJEAKKworaWZuZXEgIiQoZGJnX2ZpbGUpIiAiIgorICAgICQoZGJnX2ZpbGUpIDogdW5zdHJpcHBlZC8kKGRiZ19maWxlKQorCSQodGFyZ2V0KQorCSQoY3ApICQ8ICRACitlbmRpZgorCitpZm5lcSAiJChmaWx0ZXIgbGluIGxyYiwkKG9zKSkiICIiCisgICAgbGliX2ZpbGVfZGVwcyA9ICQoaWYgJChsaW5rZWRfaW5fbGlicykscmVxdWlyZWQvLm9ianMsJChsaWJfb2JqX2ZpbGVzKSkKK2VuZGlmCitpZmVxICIkKG9zKSIgIm1hYyIKKyAgICBsaWJfZmlsZV9kZXBzID0gaW9tcCQob2JqKQorZW5kaWYKK2lmZXEgIiQob3MpIiAid2luIgorICAgIGxpYl9maWxlX2RlcHMgPSAkKGlmICQobGlua2VkX2luX2xpYnMpLHdpcGVkLy5vYmpzLCQobGliX29ial9maWxlcykpCitlbmRpZgorCisjIG9ial9kZXBfZmlsZXMgLS0gb2JqZWN0IGZpbGVzLCBleHBsaWNpdGx5IHNwZWNpZmllZCBpbiBkZXBlbmRlbmN5IGxpc3QuIE90aGVyIGZpbGVzIChub24tb2JqZWN0KQorIyBhcmUgZmlsdGVyZWQgb3V0Lgorb2JqX2RlcHNfZmlsZXMgPSAkKGZpbHRlciAlJChvYmopLCReKQorIyBvYmpfZGVwc19mbGFncyAtLSBvYmplY3QgZmlsZXMgY29ycmVzcG9uZGluZyB0byBmbGFncywgc3BlY2lmaWVkIGluIGRlcGVuZGVuY3kgbGlzdC4gRmxhZyBpcyBhCisjIHNwZWNpYWwgZmlsZSBsaWtlICJyZXF1aXJlZC8ub2JqcyIuIEZsYWcgZmlsZSBpcyByZXBsYWNlZCB3aXRoIGEgbGlzdCBvZiBhbGwgb2JqZWN0IGZpbGVzIGluIGZsYWcKKyMgZGlyZWN0b3J5LCBmb3IgZXhhbXBsZSwgInJlcXVpcmVkLyoubyIKK29ial9kZXBzX2ZsYWdzID0gJChhZGRzdWZmaXggKiQob2JqKSwkKGRpciAkKGZpbHRlciAlLy5vYmpzLCReKSkpCisjIG9ial9kZXBzX2FsbCAtLSBsaXN0IG9mIGFsbCBvYmplY3QgZmlsZXMgc3BlY2lmaWVkIGluIGRlcGVuZGVuY3kgbGlzdCwgZWl0aGVyIGV4cGxpY2l0IG9yIGZvdW5kCisjIGluIGZsYWdnZWQgZGlyZWN0b3JpZXMuCitvYmpfZGVwc19hbGwgICA9ICQob2JqX2RlcHNfZmlsZXMpICQob2JqX2RlcHNfZmxhZ3MpCisKK3Vuc3RyaXBwZWQvJChsaWJfZmlsZSkubHN0IDogJChsaWJfZmlsZV9kZXBzKSB1bnN0cmlwcGVkLy5kaXIgLnJlYnVpbGQKKwkkKHRhcmdldCkKKwllY2hvICQob2JqX2RlcHNfYWxsKSA+ICRACisKK2lmZXEgIiQob3MpLSQoTElOS19UWVBFKSIgImxpbi1keW5hIgorICAgICQobGliX2ZpbGUpIDogZXhwb3J0c19zby50eHQKK2VuZGlmCisKKyMgQ29weSBvYmplY3QgZmlsZXMsIHdpcGluZyBvdXQgcmVmZXJlbmNlcyB0byBsaWJpcmMgbGlicmFyeS4gT2JqZWN0IGZpbGVzIChvdXJzIGFuZCBleHRyYWN0ZWQKKyMgZnJvbSBsaWJpcmMubGliKSBoYXZlICItZGVmYXVsdGxpYjpsaWJpcmMubGliIiBsaW5rZXIgZGlyZWN0aXZlLCBzbyBsaW5rZXIgd2lsbCByZXF1aXJlIGxpYmlyYy5saWIKKyMgcmVnYXJkbGVzcyBvZiBhYnNlbmNlIG9mIHJlYWwgZGVwZW5kZW5jeS4gQWN0dWFsbHksIHRoaXMgcnVsZSBpcyByZXF1aXJlZCBvbmx5IG9uIFdpbmRvd3MqIE9TLCBidXQKKyMgdGhlcmUgaXMgbm8gV2luZG93cyogT1Mtc3BlY2lmaWMgY29tbWFuZHMsIHNvIEkgb21pdCBjb25kaXRpb25zIHRvIGtlZXAgY29kZSBzaG9ydGVyIGFuZCBiZSBhYmxlIHRlc3QKKyMgdGhlIHJ1bGUgb24gTGludXgqIE9TLgorIyBOb3RlOiBJZiB3ZSBhcmUgbm90IGdvaW5nIHRvIHBpY2sgdXAgb2JqZWN0cyBmcm9tIGxpYmlyYywgdGhlcmUgaXMgbm8gcG9pbnQgaW4gd2lwaW5nIG91dAorIyBsaWJpcmMgcmVmZXJlbmNlcy4KKyMgQWRkaXRpb246IFdpcGUgYWxzbyByZWZlcmVuY2VzIHRvIEMrKyBydW50aW1lIChsaWJjcG10LmxpYikgZm9yIHRoZSBzYW1lIHJlYXNvbjogc29tZXRpbWVzIEMrKworIyBydW50aW1lIHJvdXRpbmVzIGFyZSBub3QgYWN0dWFsbHkgdXNlZCwgYnV0IGNvbXBpbGVyIHB1dHMgIi1kZWZhdWx0bGliOmxpYmNwbXQubGliIiBkaXJlY3RpdmUgdG8KKyMgb2JqZWN0IGZpbGUuIFdpcGUgaXQgb3V0LCBpZiB3ZSBoYXZlIHJlYWwgZGVwZW5kZW5jeSBvbiBDKysgcnVudGltZSwgdGVzdC10b3VjaCB3aWxsIGZhaWwuCit3aXBlZC8ub2JqcyA6IHJlcXVpcmVkLy5vYmpzIFwKKyAgICAkKHRvb2xzX2Rpcil3aXBlLXN0cmluZy5wbCB3aXBlZC8uZGlyIC5yZWJ1aWxkCisJJCh0YXJnZXQpCisJJChybSkgJChkaXIgJEApKiQob2JqKQorICAgIGlmZXEgIiQob3MpIiAid2luIgorCSQocGVybCkgJCh0b29sc19kaXIpd2lwZS1zdHJpbmcucGwgLS1xdWlldCBcCisJICAgIC0td2lwZS1yZWdleHA9IigtfC8pKGRlZmF1bHRsaWJ8REVGQVVMVExJQik6XCIobGliaXJ8bGliY3xMSUJDfE9MRE58bGlibW18bGliZGV8c3ZtbCkuKj9cIiIgXAorCSAgICAtLXRhcmdldC1kaXJlY3Rvcnk9JChkaXIgJEApICQob2JqX2RlcHNfYWxsKQorICAgIGVsc2UKKwkkKHBlcmwpICQodG9vbHNfZGlyKXdpcGUtc3RyaW5nLnBsIC0tcXVpZXQgXAorCSAgICAtLXdpcGUtcmVnZXhwPSIoLXwvKShkZWZhdWx0bGlifERFRkFVTFRMSUIpOlwiKGxpYmlyfGxpYmN8TElCQ3xPTEROKS4qP1wiIiBcCisJICAgIC0tdGFyZ2V0LWRpcmVjdG9yeT0kKGRpciAkQCkgJChvYmpfZGVwc19hbGwpCisgICAgZW5kaWYKKwkkKHRvdWNoKSAkQAorCisjIHJlcXVpcmVkLW9iamVjdHMucGwgdXNlcyAib2JqY29weSIgdXRpbGl0eSB0byByZW5hbWUgc3ltYm9scyBpbiBvYmplY3QgZmlsZXMuIE9uIExpbnV4KiBPUyB0aGlzIGlzIGEKKyMgc3RhbmRhcmQgdXRpbGl0eSAoZnJvbSBiaW51dGlscyBwYWNrYWdlKS4gT24gV2luZG93cyogT1Mgd2UgcHJvdmlkZXMgaG9tZWJyZXcgaW1wbGVtZW50YXRpb24gKHZlcnkKKyMgbGltaXRlZCwgYnV0IGVub3VnaCBmb3Igb3VyIHB1cnBvc2VzKS4KK2lmZXEgIiQob3MpIiAid2luIgorICAgIG9iamNvcHkgPSBvYmpjb3B5JChleGUpCitlbmRpZgorCisjIHJlcXVpcmVkLyBpcyBhIGRpcmVjdG9yeSBjb250YWluaW5nIE9NUCBSVEwgb2JqZWN0IGZpbGVzIGFuZCByZWFsbHkgcmVxdWlyZWQgZmlsZXMgZnJvbSBleHRlcm5hbAorIyBsaWJyYXJpZXMuIHJlcXVpcmVkLy5vYmogaXMgYSBmbGFnLiBJZiB0aGlzIGZpbGUgcHJlc2VudCwgaXQgbWVhbnMgYWxsIHJlcXVpcmVkIG9iamVjdHMgYWxyZWFkeQorIyBpbiBwbGFjZS4gTm90ZSwgcmVxdWlyZWQtb2JqZWN0cy5wbCBjb3BpZXMgZmlsZXMgdG8gc3BlY2lmaWVkIGRpcmVjdG9yeS4gSXQgaXMgbmVjZXNzYXJ5LCBiZWNhdXNlCisjIG9iamVjdCBmaWxlcyBhcmUgZWRpdGVkIGR1cmluZyBjb3B5aW5nIC0tIHN5bWJvbHMgZGVmaW5lZCBpbiBleHRlcm5hbCBvYmplY3QgZmlsZXMgYXJlIHJlbmFtZWQuCityZXF1aXJlZC8ub2JqcyA6ICQobGliX29ial9maWxlcykgJChhZGRzdWZmaXggLy5vYmpzLCQobGlua2VkX2luX2xpYnMpKSBcCisgICAgJCh0b29sc19kaXIpcmVxdWlyZWQtb2JqZWN0cy5wbCAkKG9iamNvcHkpIHJlcXVpcmVkLy5kaXIgLnJlYnVpbGQKKwkkKHRhcmdldCkKKwkkKHJtKSAkKGRpciAkQCkqJChvYmopCisJJChwZXJsKSAkKHRvb2xzX2RpcilyZXF1aXJlZC1vYmplY3RzLnBsIC0tcXVpZXQgJChvYS1vcHRzKSAtLXByZWZpeD1fX2ttcF9leHRlcm5hbF8gXAorCSAgICAtLWJhc2UgJChvYmpfZGVwc19maWxlcykgLS1leHRyYSAkKG9ial9kZXBzX2ZsYWdzKSAtLWNvcHktYWxsPSQoZGlyICRAKQorCSQodG91Y2gpICRACisKKyMgRXh0cmFjdGluZyBvYmplY3QgZmlsZXMgZnJvbSBsaWJpcmMuIEZpbGUgImxpYmlyYy8ub2JqIiBpcyBhIGZsYWcuIElmIHRoZSBmaWxlIHByZXNlbnQsIG1ha2UKKyMgdGhpbmtzIGZpbGVzIGFyZSBleHRyYWN0ZWQuCitpZm5lcSAiJChsaWJpcmMpIiAiIgorICAgIGxpYmlyYy8ub2JqcyA6ICQobGliaXJjKSBcCisJJCh0b29sc19kaXIpZXh0cmFjdC1vYmplY3RzLnBsIGxpYmlyYy8uZGlyIC5yZWJ1aWxkCisJICAgICQodGFyZ2V0KQorCSAgICAkKHJtKSAkKGRpciAkQCkqJChvYmopCisJICAgICQocGVybCkgJCh0b29sc19kaXIpZXh0cmFjdC1vYmplY3RzLnBsIC0tcXVpZXQgJChvYS1vcHRzKSAtLW91dHB1dD0kKGRpciAkQCkgJDwKKwkgICAgJCh0b3VjaCkgJEAKK2VuZGlmCisKKyMgRXh0cmFjdGluZyBvYmplY3QgZmlsZXMgZnJvbSBsaWJpcGdvLiBGaWxlICIvbGliaXBnby8ub2JqIiBpcyBhIGZsYWcuIElmIHRoZSBmaWxlIHByZXNlbnQsIG1ha2UKKyMgdGhpbmtzIG9iamVjdHMgYXJlIGV4dHJhY3RlZC4KK2lmbmVxICIkKGxpYmlwZ28pIiAiIgorICAgIGxpYmlwZ28vLm9ianMgOiAkKGxpYmlwZ28pIFwKKwkkKHRvb2xzX2RpcilleHRyYWN0LW9iamVjdHMucGwgbGliaXBnby8uZGlyIC5yZWJ1aWxkCisJICAgICQodGFyZ2V0KQorCSAgICAkKHJtKSAkKGRpciAkQCkqJChvYmopCisJICAgICQocGVybCkgJCh0b29sc19kaXIpZXh0cmFjdC1vYmplY3RzLnBsIC0tcXVpZXQgJChvYS1vcHRzKSAtLW91dHB1dD0kKGRpciAkQCkgJDwKKwkgICAgJCh0b3VjaCkgJEAKK2VuZGlmCisKKworc3RyaXBwZWQvJChsaWJfZmlsZSkgOiB1bnN0cmlwcGVkLyQobGliX2ZpbGUpICQoZGJnX2ZpbGUpIHN0cmlwcGVkLy5kaXIgLnJlYnVpbGQKKwkkKHRhcmdldCkKKwlvYmpjb3B5IC0tc3RyaXAtZGVidWcgJDwgJEAudG1wCisJb2JqY29weSAtLWFkZC1nbnUtZGVidWdsaW5rPSQoZGJnX2ZpbGUpICRALnRtcCAkQAorCitpZmVxICIkKG9zKSIgIm1hYyIKKworICAgICMgVGhlc2UgdGFyZ2V0cyBhcmUgdW5kZXIgY29uZGl0aW9uIGJlY2F1c2Ugb2Ygc29tZSBPUyBYKi1zcGVjaWZpYyBsZCBhbmQgbm0gb3B0aW9ucy4gRm9yCisgICAgIyBleGFtcGxlLCBHTlUgbm0gZG9lcyBub3QgYWNjZXB0IC1qLCBHTlUgbGQgZG9lcyBub3Qga25vdyAtZmlsZWxpc3QuCisKKyAgICAjIGlvbXAubyBpcyBhIGJpZyBvYmplY3QgZmlsZSBpbmNsdWRpbmcgYWxsIHRoZSBPTVAgUlRMIG9iamVjdCBmaWxlcyBhbmQgb2JqZWN0IGZpbGVzIGZyb20KKyAgICAjIGV4dGVybmFsIGxpYnJhcmllcyAobGlrZSBsaWJpcmMpLiBJdCBpcyBwYXJ0aWFsbHkgbGlua2VkLCByZWZlcmVuY2VzIHRvIGV4dGVybmFsIHN5bWJvbHMKKyAgICAjIChlLiBnLiByZWZlcmVuY2VzIHRvIGxpYmlyYykgYWxyZWFkeSByZXNvbHZlZCwgc3ltYm9scyBkZWZpbmVkIGluIGV4dGVybmFsIGxpYnJhcmllcyBhcmUKKyAgICAjIGhpZGRlbiBieSB1c2luZyAtdW5leHBvcnRlZC1zeW1ib2wtbGlzdCBhbmQgLW5vbl9nbG9iYWxfc3ltYm9sc19zdHJpcF9saXN0IGxpbmtlciBvcHRpb25zCisgICAgIyAoYm90aCBvcHRpb25zIGFyZSByZXF1aXJlZCkuCisgICAgIyBBQzogMjAxMi0wNC0xMjogYWZ0ZXIgTUFDIG1hY2hpbmVzIHVwZ3JhZGUgY29tcGlsZXIgZmFpbHMgdG8gY3JlYXRlIG9iamVjdCwgc28gdXNlIGxpbmtlciBpbnN0ZWFkCitpZmVxICIkKG1hY19vc19uZXcpIiAiMSIKKyAgICBpb21wJChvYmopIDogJChsaWJfb2JqX2ZpbGVzKSBleHRlcm5hbC1zeW1ib2xzLmxzdCBleHRlcm5hbC1vYmplY3RzLmxzdCAucmVidWlsZAorCSAgICAkKHRhcmdldCkKKwkgICAgbGQgLXIgLXVuZXhwb3J0ZWRfc3ltYm9sc19saXN0IGV4dGVybmFsLXN5bWJvbHMubHN0IFwKKwkJLW5vbl9nbG9iYWxfc3ltYm9sc19zdHJpcF9saXN0IGV4dGVybmFsLXN5bWJvbHMubHN0IFwKKwkJLWZpbGVsaXN0IGV4dGVybmFsLW9iamVjdHMubHN0IFwKKwkJLW8gJEAgJChvYmpfZGVwc19maWxlcykKK2Vsc2UKKyAgICBpb21wJChvYmopIDogJChsaWJfb2JqX2ZpbGVzKSBleHRlcm5hbC1zeW1ib2xzLmxzdCBleHRlcm5hbC1vYmplY3RzLmxzdCAucmVidWlsZAorCSAgICAkKHRhcmdldCkKKwkgICAgJChjKSAtciAtbm9zdGFydGZpbGVzIC1zdGF0aWMtaW50ZWwgIC1uby1pbnRlbC1leHRlbnNpb25zIFwKKwkJLVdsLC11bmV4cG9ydGVkX3N5bWJvbHNfbGlzdCxleHRlcm5hbC1zeW1ib2xzLmxzdCBcCisJCS1XbCwtbm9uX2dsb2JhbF9zeW1ib2xzX3N0cmlwX2xpc3QsZXh0ZXJuYWwtc3ltYm9scy5sc3QgXAorCQktZmlsZWxpc3QgZXh0ZXJuYWwtb2JqZWN0cy5sc3QgXAorCQktbyAkQCAkKG9ial9kZXBzX2ZpbGVzKQorZW5kaWYKKworICAgICMgZXh0ZXJuYWwtb2JqZWN0cy5sc3QgaXMgYSBsaXN0IG9mIG9iamVjdCBmaWxlcyBleHRyYWN0ZWQgZnJvbSBleHRlcm5hbCBsaWJyYXJpZXMsIHdoaWNoIHNob3VsZAorICAgICMgYmUgbGlua2VkIGludG8gaW9tcC5vLiBrbXBfZHVtbXkubyBpcyBhZGRlZCB0byB0aGUgbGlzdCB0byBhdm9pZCBlbXB0eSBsaXN0IC0tIE9TIFgqIHV0aWxpdGllcworICAgICMgbm0gYW5kIGxkIGRvIG5vdCBsaWtlIGVtcHR5IGxpc3RzLgorICAgIGV4dGVybmFsLW9iamVjdHMubHN0IDogJChsaWJfb2JqX2ZpbGVzKSAkKGFkZHN1ZmZpeCAvLm9ianMsJChsaW5rZWRfaW5fbGlicykpIGttcF9kdW1teSQob2JqKSBcCisJJCh0b29sc19kaXIpcmVxdWlyZWQtb2JqZWN0cy5wbCAucmVidWlsZAorCSAgICAkKHRhcmdldCkKKwkgICAgJChwZXJsKSAkKHRvb2xzX2RpcilyZXF1aXJlZC1vYmplY3RzLnBsICQob2Etb3B0cykgXAorCQktLWJhc2UgJChvYmpfZGVwc19maWxlcykgLS1leHRyYSAkKG9ial9kZXBzX2ZsYWdzKSAtLXByaW50LWV4dHJhID4gJEAudG1wCisJICAgIGVjaG8gImttcF9kdW1teSQob2JqKSIgPj4gJEAudG1wCisJICAgIG12ICRALnRtcCAkQAorCisgICAgIyBQcmVwYXJlIGxpc3Qgb2Ygc3ltYm9scyBpbiBleHRlcm5hbCBvYmplY3QgZmlsZXMuIFdlIHdpbGwgaGlkZSBhbGwgdGhlc2Ugc3ltYm9scy4KKyAgICAjIE5vdGU6IC1qIGlzIG5vbi1HTlUgb3B0aW9uIHdoaWNoIG1lYW5zICJKdXN0IGRpc3BsYXkgdGhlIHN5bWJvbCBuYW1lcyAobm8gdmFsdWUgb3IgdHlwZSkuIgorICAgIGV4dGVybmFsLXN5bWJvbHMubHN0IDogZXh0ZXJuYWwtb2JqZWN0cy5sc3QgLnJlYnVpbGQKKwkgICAgJCh0YXJnZXQpCisJICAgIG5tIC1nb2ogJCQoY2F0IGV4dGVybmFsLW9iamVjdHMubHN0KSA+ICRALjAudG1wCisJICAgIGN1dCAtZjIgLWQiICIgJEAuMC50bXAgPiAkQC4xLnRtcAorCSAgICBtdiAkQC4xLnRtcCAkQAorCitlbmRpZiAjIG1hYworCisjIEltcG9ydCBsaWJyYXJ5IHRyaWNrcyBhcmUgV2luZG93cyogT1Mtc3BlY2lmaWMuCitpZmVxICIkKG9zKSIgIndpbiIKKworICAgIGltcG9ydCQobGliKSA6ICQobGliX2l0ZW0pJChkbGwpCisKKyAgICAjIENoYW5nZSB0aGUgbmFtZSBvZiBpbXBvcnQgbGlicmFyeSBwcm9kdWNlZCBieSB0aGUgbGlua2VyLCB3ZSB3aWxsIGNvbWJpbmUgaXQgd2l0aCBzb21lIG1vcmUKKyAgICAjIG9iamVjdCBmaWxlcyB0byBwcm9kdWNlICJleHRlbmRlZCBpbXBvcnQgbGliIi4KKyAgICAkKGxpYl9pdGVtKSQoZGxsKSA6IGltcF9maWxlIDo9IGltcG9ydCQobGliKQorCisgICAgIyBEZWZhdWx0IHJ1bGUgImMgdG8gb2JqIiB3aWxsIGNvbXBpbGUgc291cmNlcyB3aXRoIC1NVCBvcHRpb24sIHdoaWNoIGlzIG5vdCBkZXNpcmVkLgorICAgICMgQ2FuY2VsIGVmZmVjdCBvZiAtTVQgd2l0aCAtWmwuCisgICAgIyBBQzogQ3VycmVudGx5IHdlIG9ubHkgaGF2ZSBvbmUgb2JqZWN0IHRoYXQgZG9lcyBub3QgbmVlZCBhbnkgc3BlY2lhbAorICAgICMgICAgIGNvbXBpbGVyIG9wdGlvbnMsIHNvIHVzZSBtaW5pbWFsIHNldC4gV2l0aCBzdGFuZGFyZCBzZXQgb2Ygb3B0aW9ucyB3ZSB1c2VkCisgICAgIyAgICAgdGhlcmUgd2VyZSBwcm9ibGVtcyB3aXRoIGRlYnVnIGluZm8gbGVha2VkIGludG8gdGhlIGltcG9ydCBsaWJyYXJ5CisgICAgIyAgICAgd2l0aCB0aGlzIG9iamVjdCAoYnVnIHJlcG9ydCAjMzM0NTY1KS4KKyAgICAkKGltcF9vYmpfZmlsZXMpIDogYy1mbGFncyA6PSAtWmwgLW5vbG9nbyAtYworCisgICAgJChpbXBfZmlsZSkubHN0IDogJChpbXBfb2JqX2ZpbGVzKSBpbXBvcnQkKGxpYikgLnJlYnVpbGQKKwkgICAgJCh0YXJnZXQpCisJICAgIGVjaG8gJChmaWx0ZXItb3V0IC5yZWJ1aWxkLCReKSA+ICRACisKK2VuZGlmCisKK2ttcF9pMThuX2lkLmluYyA6IGVuX1VTLnR4dCBcCisgICAgJCh0b29sc19kaXIpbWVzc2FnZS1jb252ZXJ0ZXIucGwgLnJlYnVpbGQKKwkkKHRhcmdldCkKKwkkKHBlcmwpICQodG9vbHNfZGlyKW1lc3NhZ2UtY29udmVydGVyLnBsICQob2Etb3B0cykgLS1wcmVmaXg9a21wX2kxOG4gLS1lbnVtPSRAICQ8CisKK2ttcF9pMThuX2RlZmF1bHQuaW5jIDogZW5fVVMudHh0IFwKKyAgICAkKHRvb2xzX2RpciltZXNzYWdlLWNvbnZlcnRlci5wbCAucmVidWlsZAorCSQodGFyZ2V0KQorCSQocGVybCkgJCh0b29sc19kaXIpbWVzc2FnZS1jb252ZXJ0ZXIucGwgJChvYS1vcHRzKSAtLXByZWZpeD1rbXBfaTE4biAtLWRlZmF1bHQ9JEAgJDwKKworIyBSZWJ1aWx0IGttcF92ZXJzaW9uLm8gb24gYW55IGNoYW5nZSB0byBoYXZlIGFjdHVhbCBidWlsZCB0aW1lIHN0cmluZyBhbHdheXMgdXBkYXRlZC4KK2ttcF92ZXJzaW9uJChvYmopOiAkKGZpbHRlci1vdXQga21wX3ZlcnNpb24kKG9iaiksJChsaWJfb2JqX2ZpbGVzKSAkKGltcF9vYmpfZmlsZXMpKQorCiskKGRlZl9maWxlKSA6IGRsbGV4cG9ydHMgXAorICAgICQodG9vbHNfZGlyKWdlbmVyYXRlLWRlZi5wbCAucmVidWlsZAorCSQodGFyZ2V0KQorCSQocGVybCkgJCh0b29sc19kaXIpZ2VuZXJhdGUtZGVmLnBsICQoZ2QtZmxhZ3MpIC1vICRAICQ8CisKK2xpYmlvbXAucmMgOiBsaWJpb21wLnJjLnZhciBrbXBfdmVyc2lvbi5jCitsaWJpb21wLnJjIDogZXYtZmxhZ3MgKz0gLUQgS01QX0ZJTEU9JChsaWJfZmlsZSkKKworJChyY19maWxlKSA6IGxpYmlvbXAucmMgLnJlYnVpbGQKKwkkKHRhcmdldCkKKwkkKGNwKSAkPCAkQAorCitrbXBfZHVtbXkuYyA6IC5yZWJ1aWxkCisJJCh0YXJnZXQpCisJZWNobyAidm9pZCBfX2ttcF9kdW1teSgpIHt9IiA+ICRACisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGVzdHMuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgLS0tIHRlc3QtdG91Y2ggLS0tCisKKyMgdGVzdC10b3VjaCBpcyBub3QgYXZhaWxhYmxlIGZvciBscmIuCitpZm5lcSAiJChvcykiICJscmIiCisKKyAgICAjIENvbXBpbGUgYSBzaW1wbGUgQyB0ZXN0IGFuZCBsaW5rIGl0IHdpdGggdGhlIGxpYnJhcnkuIERvIGl0IHR3byB0aW1lczogdGhlIGZpcnN0IGxpbmsgZ2l2ZXMgdXMKKyAgICAjIGNsZWFyIG1lc3NhZ2UgaWYgdGhlcmUgYXJlIGFueSBwcm9ibGVtcywgdGhlIHNlY29uZCBsaW5rIHJ1biBpbiB2ZXJib3NlIG1vZGUsIGxpbmtlciBvdXRwdXQKKyAgICAjIHNlYXJjaGVkIGZvciAibGliaXJjIiBzdHJpbmcgLS0gc2hvdWxkIG5vdCBiZSBhbnkgbGliaXJjIHJlZmVyZW5jZXMuIEZpbmFsbHksIHRlc3QgZXhlY3V0YWJsZQorICAgICMgcnVuIHdpdGggS01QX1ZFUkJPU0U9MS4KKworICAgIGlmZXEgIiQob3MpIiAid2luIgorICAgICAgICBpZm5lcSAiJChkb190ZXN0X3RvdWNoX210KSIgIjAiCisgICAgICAgICAgICB0ZXN0X3RvdWNoX2l0ZW1zICs9IHRlc3QtdG91Y2gtbWQgdGVzdC10b3VjaC1tdAorICAgICAgICBlbHNlCisgICAgICAgICAgICB0ZXN0X3RvdWNoX2l0ZW1zICs9IHRlc3QtdG91Y2gtbWQKKyAgICAgICAgZW5kaWYKKyAgICBlbHNlCisgICAgICAgIHRlc3RfdG91Y2hfaXRlbXMgKz0gdGVzdC10b3VjaC1ydAorICAgIGVuZGlmCisKKyAgICBmb3JjZS10ZXN0LXRvdWNoIDogJChhZGRzdWZmaXggLy5mb3JjZSwkKHRlc3RfdG91Y2hfaXRlbXMpKSAkKGFkZHN1ZmZpeCAvLnRlc3QsJCh0ZXN0X3RvdWNoX2l0ZW1zKSkKKyAgICB0ZXN0LXRvdWNoICAgICAgIDogJChhZGRzdWZmaXggLy50ZXN0LCQodGVzdF90b3VjaF9pdGVtcykpCisKKyAgICB0dC1leGUtZmlsZSA9ICQoZGlyICRAKXRlc3QtdG91Y2gkKGV4ZSkKKyAgICBpZmVxICIkKG9zKSIgIndpbiIKKyAgICAgICAgIyBPbiBXaW5kb3dzKiBPUyB0aGUgdGVzdCBxdWFsaXR5IGlzIHByb2JsZW1hdGljLCBiZWNhdXNlIExJQiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQgdXAgZm9yCisgICAgICAgICMgSW50ZWwgY29tcGlsZXIgc28gTWljcm9zb2Z0IGNvbXBpbGVyIGlzIGFibGUgdG8gZmluZCBsaWJpcmMgaWYgaXQgaXMgc3BlY2lmaWVkIGluIGRlZmF1bHRsaWIKKyAgICAgICAgIyBkaXJlY3RpdmUgd2l0aGluIG9iamVjdCBmaWxlLi4uIFRoaXMgZGlzYWR2YW50YWdlIGlzIGNvbXBlbnNhdGVkIGJ5IGdyZXBwaW5nIHZlcmJvc2UgbGluaworICAgICAgICAjIG91dHB1dCBmb3IgImxpYmlyYyIgc3RyaW5nLgorICAgICAgICB0dC1jICAgICAgICAgICAgPSBjbAorICAgICAgICB0dC1jLWZsYWdzICAgICArPSAtbm9sb2dvCisgICAgICAgIGlmZXEgIiQoT1BUSU1JWkFUSU9OKSIgIm9uIgorICAgICAgICAgICAgdHQtYy1mbGFncy1tdCA9IC1NVAorICAgICAgICAgICAgdHQtYy1mbGFncy1tZCA9IC1NRAorICAgICAgICBlbHNlCisgICAgICAgICAgICB0dC1jLWZsYWdzLW10ID0gLU1UZAorICAgICAgICAgICAgdHQtYy1mbGFncy1tZCA9IC1NRGQKKyAgICAgICAgZW5kaWYKKyAgICAgICAgaWZlcSAiJChMSU5LX1RZUEUpIiAic3RhdCIKKyAgICAgICAgICAgIHR0LWxpYnMgICs9ICQobGliX2ZpbGUpCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHR0LWxpYnMgICs9ICQoaW1wX2ZpbGUpCisgICAgICAgIGVuZGlmCisgICAgICAgIGlmbmVxICIkKGFyY2gpIiAiMzIiCisgICAgICAgICAgICAjIFRvIHN1Y2Nlc3NmdWxseSBidWlsZCB3aXRoIFZTMjAwOAorICAgICAgICAgICAgIyB0dC1saWJzICs9IGJ1ZmZlcm92ZXJmbG93dS5saWIKKyAgICAgICAgICAgICMgUHJldmVudGluZyAidW5yZXNvbHZlZCBleHRlcm5hbCBzeW1ib2wgX19zZWN1cml0eV9jb29raWUiIChhbmQKKyAgICAgICAgICAgICMgIi4uLiBfX3NlY3VyaXR5X2NoZWNrX2Nvb2tpZSIpIGxpbmtlciBlcnJvcnMgb24gd2luXzMyZSBhbmQgd2luXzY0LgorICAgICAgICBlbmRpZgorICAgICAgICB0dC1jLWZsYWdzICArPSAtRm8kKGRpciAkQCl0ZXN0LXRvdWNoJChvYmopIC1GZSQodHQtZXhlLWZpbGUpCisgICAgICAgIHR0LWxkLWZsYWdzICs9IC1saW5rCisgICAgICAgICMgU29tZSBQb3NpeCBidXQgbm9uLUlTTyBmdW5jdGlvbnMgKGxpa2Ugc3RyZHVwKSBhcmUgZGVmaW5lZCBpbiBvbGRuYW1lcy5saWIsIHdoaWNoIGlzIHVzZWQKKyAgICAgICAgIyBpbXBsaWNpdGx5LiBEcm9wIG9sZG5hbWVzLmxpYiBsaWJyYXJ5LCBzbyB3ZSBjYW4gY2F0Y2gKKyAgICAgICAgdHQtbGQtZmxhZ3MgKz0gLW5vZGVmYXVsdGxpYjpvbGRuYW1lcworICAgICAgICBpZmVxICIkKGFyY2gpIiAiMzIiCisgICAgICAgICAgICB0dC1sZC1mbGFncyArPSAtc2FmZXNlaAorICAgICAgICBlbmRpZgorICAgICAgICB0dC1sZC1mbGFncy12ICs9IC12ZXJib3NlCisgICAgZWxzZSAjIGxpbiBvciBtYWMKKyAgICAgICAgIyBPbiBMaW51eCogT1MgYW5kIE9TIFgqIHRoZSB0ZXN0IGlzIGdvb2QgZW5vdWdoIGJlY2F1c2UgR05VIGNvbXBpbGVyIGtub3dzIG5vdGhpbmcKKyAgICAgICAgIyBhYm91dCBsaWJpcmMgYW5kIEludGVsIGNvbXBpbGVyIHByaXZhdGUgbGliIGRpcmVjdG9yaWVzLCBidXQgd2Ugd2lsbCBncmVwIHZlcmJvc2UgbGlua2VyCisgICAgICAgICMgb3V0cHV0IGp1c3QgaW4gY2FzZS4KKyAgICAgICAgdHQtYyAgICAgICAgPSBjYworICAgICAgICBpZmVxICIkKG9zKSIgImxpbiIgICAgIyBHQ0Mgb24gT1MgWCogZG9lcyBub3QgcmVjb2duaXplIC1wdGhyZWFkLgorICAgICAgICAgICAgdHQtYy1mbGFncyAgKz0gLXB0aHJlYWQKKyAgICAgICAgZW5kaWYKKyAgICAgICAgdHQtYy1mbGFncyArPSAtbyAkKHR0LWV4ZS1maWxlKQorICAgICAgICBpZm5lcSAiJChmaWx0ZXIgMzIgMzJlIDY0LCQoYXJjaCkpIiAiIgorICAgICAgICAgICAgdHQtYy1mbGFncyArPSAkKGlmICQoZmlsdGVyIDY0LCQoYXJjaCkpLCwkKGlmICQoZmlsdGVyIDMyLCQoYXJjaCkpLC1tMzIsLW02NCkpCisgICAgICAgIGVuZGlmCisgICAgICAgIHR0LWxpYnMgICAgKz0gJChsaWJfZmlsZSkKKyAgICAgICAgaWZlcSAiJChvcyktJChDT1ZFUkFHRSktJChMSU5LX1RZUEUpIiAibGluLW9uLXN0YXQiCisgICAgICAgICAgICAjIFN0YXRpYyBjb3ZlcmFnZSBidWlsZCBvbiBMaW51eCogT1MgZmFpbHMgZHVlIHRvIHVucmVzb2x2ZWQgc3ltYm9scyBkbG9wZW4sIGRsc3ltLCBkbGNsb3NlLgorICAgICAgICAgICAgIyBFeHBsaWNpdGx5IGFkZCBkbCBsaWJyYXJ5IHRvIGF2b2lkIGZhaWx1cmUuCisgICAgICAgICAgICB0dC1sZC1mbGFncyArPSAtbGRsCisgICAgICAgIGVuZGlmCisgICAgICAgIGlmZXEgIiQob3MpIiAibWFjIgorICAgICAgICAgICAgdHQtbGQtZmxhZ3MtdiArPSAtV2wsLXQKKyAgICAgICAgICAgIHR0LWVudiAgICAgICAgKz0gRFlMRF9MSUJSQVJZX1BBVEg9Ii46JChEWUxEX0xJQlJBUllfUEFUSCkiCisgICAgICAgIGVsc2UgIyBsaW4KKyAgICAgICAgICAgIHR0LWxkLWZsYWdzLXYgKz0gLVdsLC0tdmVyYm9zZQorICAgICAgICAgICAgdHQtZW52ICAgICAgICArPSBMRF9MSUJSQVJZX1BBVEg9Ii46JChMRF9MSUJSQVJZX1BBVEgpIgorICAgICAgICBlbmRpZgorICAgIGVuZGlmCisgICAgdHQtYy1mbGFncyArPSAkKHR0LWMtZmxhZ3MtcnQpCisgICAgdHQtZW52ICAgICArPSBLTVBfVkVSU0lPTj0xCisgICAgdHQtaSAgICAgICAgPSAkKGlmICQoZmlsdGVyIG9mZiwkKFRFU1RfVE9VQ0gpKSwtKQorCisgICAgaWZuZGVmIHRlc3QtdG91Y2gtY29tbWFuZHMKKyAgICAgICAgIyBUaGUgZmlyc3QgYnVpbGRpbmcgZ2l2ZXMgc2hvcnQgYW5kIGNsZWFyIGVycm9yIG1lc3NhZ2UgaW4gY2FzZSBvZiBhbnkgcHJvYmxlbS4KKyAgICAgICAgIyBUaGUgc2Vjb25kIGJ1aWxkaW5nIHJ1bnMgbGlua2VyIGluIHZlcmJvc2UgbW9kZSBhbmQgc2F2ZXMgbGlua2VyIG91dHB1dCBmb3IgZ3JlcHBpbmcuCisgICAgICBkZWZpbmUgdGVzdC10b3VjaC1jb21tYW5kcworCSAgICAkKHJtKSAkKGRpciAkQCkqCisJICAgICQodHQtaSkkKHR0LWMpICQodHQtYy1mbGFncykgJDwgJCh0dC1saWJzKSAkKHR0LWxkLWZsYWdzKQorCSAgICAkKHJtKSAkKHR0LWV4ZS1maWxlKQorCSAgICAkKHR0LWkpJCh0dC1jKSAkKHR0LWMtZmxhZ3MpIFwKKwkJJDwgJCh0dC1saWJzKSBcCisJCSQodHQtbGQtZmxhZ3MpICQodHQtbGQtZmxhZ3MtdikgXAorCQk+ICQoZGlyICRAKWJ1aWxkLmxvZyAyPiYxCisJICAgICQodHQtaSkkKHR0LWVudikgJCh0dC1leGUtZmlsZSkKKwkgICAgJCh0dC1pKWdyZXAgLWkgLWUgIlteX11saWJpcmMiICQoZGlyICRAKWJ1aWxkLmxvZyA+ICQoZGlyICRAKWxpYmlyYy5sb2c7IFwKKwkJWyAkJD8gLWVxIDEgXQorICAgICAgZW5kZWYKKyAgICBlbmRpZgorCisgICAgdGVzdC10b3VjaC1ydC8udGVzdCA6IHR0LWMtZmxhZ3MtcnQgPQorICAgIHRlc3QtdG91Y2gtbXQvLnRlc3QgOiB0dC1jLWZsYWdzLXJ0ID0gJCh0dC1jLWZsYWdzLW10KQorICAgIHRlc3QtdG91Y2gtbWQvLnRlc3QgOiB0dC1jLWZsYWdzLXJ0ID0gJCh0dC1jLWZsYWdzLW1kKQorCisgICAgdGVzdC10b3VjaC1ydC8udGVzdCA6IHRlc3QtdG91Y2guYyAkKGxpYl9maWxlKSB0ZXN0LXRvdWNoLXJ0Ly5kaXIgLnJlYnVpbGQKKwkgICAgJCh0YXJnZXQpCisJICAgICQodGVzdC10b3VjaC1jb21tYW5kcykKKwkgICAgJCh0b3VjaCkgJEAKKyAgICB0ZXN0LXRvdWNoLW10Ly50ZXN0IDogdGVzdC10b3VjaC5jICQobGliX2ZpbGUpICQoaW1wX2ZpbGUpIHRlc3QtdG91Y2gtbXQvLmRpciAucmVidWlsZAorCSAgICAkKHRhcmdldCkKKwkgICAgJCh0ZXN0LXRvdWNoLWNvbW1hbmRzKQorCSAgICAkKHRvdWNoKSAkQAorICAgIHRlc3QtdG91Y2gtbWQvLnRlc3QgOiB0ZXN0LXRvdWNoLmMgJChsaWJfZmlsZSkgJChpbXBfZmlsZSkgdGVzdC10b3VjaC1tZC8uZGlyIC5yZWJ1aWxkCisJICAgICQodGFyZ2V0KQorCSAgICAkKHRlc3QtdG91Y2gtY29tbWFuZHMpCisJICAgICQodG91Y2gpICRACisKK2VuZGlmCisKKyMgLS0tIHRlc3QtcmVsbyAtLS0KKworIyBCdXQgdGVzdC1yZWxvIGRvZXMgYWN0dWFsIHdvcmsgb25seSBvbiBMaW51eCogT1MgYW5kCisjIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZSBpbiBjYXNlIG9mIGR5bmFtaWMgbGlua2luZy4KK2lmZXEgIiQoaWYgJChmaWx0ZXIgbGluIGxyYiwkKG9zKSksb3MpLSQoTElOS19UWVBFKSIgIm9zLWR5bmEiCisKKyAgICAjIE1ha2Ugc3VyZSBkeW5hbWljIGxpYnJhcnkgZG9lcyBub3QgY29udGFpbiBwb3NpdGlvbi1kZXBlbmRlbnQgY29kZS4KKyAgICBmb3JjZS10ZXN0LXJlbG8gOiB0ZXN0LXJlbG8vLmZvcmNlIHRlc3QtcmVsby8udGVzdAorICAgIHRlc3QtcmVsbyAgICAgICA6IHRlc3QtcmVsby8udGVzdAorCisgICAgdGVzdC1yZWxvLy50ZXN0IDogJChsaWJfaXRlbSkkKGRsbCkgdGVzdC1yZWxvLy5kaXIgLnJlYnVpbGQKKwkgICAgJCh0YXJnZXQpCisJICAgIHJlYWRlbGYgLWQgJDwgPiAkKGRpciAkQClyZWFkZWxmLmxvZworCSAgICBncmVwIC1lIFRFWFRSRUwgJChkaXIgJEApcmVhZGVsZi5sb2c7IFsgJCQ/IC1lcSAxIF0KKwkgICAgJCh0b3VjaCkgJEAKKworZW5kaWYKKworIyAtLS0gdGVzdC1leGVjc3RhY2sgLS0tCisKKyMgQnV0IHRlc3QtZXhlY3N0YWNrIGRvZXMgYWN0dWFsIHdvcmsgb25seSBvbiBMaW51eCogT1MgaW4gY2FzZSBvZiBkeW5hbWljIGxpbmtpbmcuCisjIFRPRE86IEVuYWJsZSBpdCBvbiBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUgYXMgd2VsbC4KK2lmZXEgIiQoaWYgJChmaWx0ZXIgbGluLCQob3MpKSxvcyktJChMSU5LX1RZUEUpIiAib3MtZHluYSIKKworICAgIHRlc3RzICs9IHRlc3QtZXhlY3N0YWNrCisKKyAgICAjIE1ha2Ugc3VyZSBzdGFjayBpcyBub3QgZXhlY3V0YWJsZS4KKyAgICBmb3JjZS10ZXN0LWV4ZWNzdGFjayA6IHRlc3QtZXhlY3N0YWNrLy5mb3JjZSB0ZXN0LWV4ZWNzdGFjay8udGVzdAorICAgIHRlc3QtZXhlY3N0YWNrICAgICAgIDogdGVzdC1leGVjc3RhY2svLnRlc3QKKworICAgIHRlc3QtZXhlY3N0YWNrLy50ZXN0IDogJChsaWJfaXRlbSkkKGRsbCkgdGVzdC1leGVjc3RhY2svLmRpciAucmVidWlsZAorCSAgICAkKHRhcmdldCkKKwkgICAgJChwZXJsKSAkKHRvb2xzX2RpciljaGVjay1leGVjc3RhY2sucGwgJDwKKwkgICAgJCh0b3VjaCkgJEAKKworZW5kaWYKKworIyAtLS0gdGVzdC1pbnN0ciAtLS0KKworIyBCdXQgdGVzdC1pbnN0ciBkb2VzIGFjdHVhbCB3b3JrIG9ubHkgb24gSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlLgoraWZlcSAiJChvcykiICJscmIiCisKKyAgICAjIE1ha2Ugc3VyZSBkeW5hbWljIGxpYnJhcnkgZG9lcyBub3QgY29udGFpbiBwb3NpdGlvbi1kZXBlbmRlbnQgY29kZS4KKyAgICBmb3JjZS10ZXN0LWluc3RyIDogdGVzdC1pbnN0ci8uZm9yY2UgdGVzdC1pbnN0ci8udGVzdAorICAgIHRlc3QtaW5zdHIgICAgICAgOiB0ZXN0LWluc3RyLy50ZXN0CisKKyAgICB0ZXN0LWluc3RyLy50ZXN0IDogJChsaWJfZmlsZSkgJCh0b29sc19kaXIpY2hlY2staW5zdHJ1Y3Rpb24tc2V0LnBsIHRlc3QtaW5zdHIvLmRpciAucmVidWlsZAorCSAgICAkKHRhcmdldCkKKwkgICAgJChwZXJsKSAkKHRvb2xzX2RpciljaGVjay1pbnN0cnVjdGlvbi1zZXQucGwgJChvYS1vcHRzKSAtLXNob3cgLS1taWMtYXJjaD0kKE1JQ19BUkNIKSAtLW1pYy1vcz0kKE1JQ19PUykgJDwKKwkgICAgJCh0b3VjaCkgJEAKKworZW5kaWYKKworIyAtLS0gdGVzdC1kZXBzIC0tLQorCisjIHRlc3QtZGVwcyBkb2VzIGFjdHVhbCB3b3JrIGZvciBkeW1hbmljIGxpbmtpbmcgKGFsbCBPU2VzKSwgYW5kIFdpbmRvd3MqIE9TIChhbGwgbGlua2luZyB0eXBlcykuCitpZm5lcSAiJChmaWx0ZXIgJS1keW5hIHdpbi0lLCQob3MpLSQoTElOS19UWVBFKSkiICIiCisKKyAgICBmb3JjZS10ZXN0LWRlcHMgOiB0ZXN0LWRlcHMvLmZvcmNlIHRlc3QtZGVwcy8udGVzdAorICAgIHRlc3QtZGVwcyAgICAgICA6IHRlc3QtZGVwcy8udGVzdAorCisgICAgdGRfZXhwID0KKyAgICBpZmVxICIkKG9zKSIgImxpbiIKKyAgICAgICAgaWZlcSAiJChhcmNoKSIgIjMyIgorICAgICAgICAgICAgdGRfZXhwICs9IGxpYmMuc28uNgorICAgICAgICAgICAgdGRfZXhwICs9IGxkLWxpbnV4LnNvLjIKKyAgICAgICAgZW5kaWYKKyAgICAgICAgaWZlcSAiJChhcmNoKSIgIjMyZSIKKyAgICAgICAgICAgIHRkX2V4cCArPSBsaWJjLnNvLjYKKyAgICAgICAgICAgIHRkX2V4cCArPSBsZC1saW51eC14ODYtNjQuc28uMgorICAgICAgICBlbmRpZgorICAgICAgICBpZmVxICIkKGFyY2gpIiAiNjQiCisgICAgICAgICAgICB0ZF9leHAgKz0gbGliYy5zby42LjEKKyAgICAgICAgZW5kaWYKKyAgICAgICAgaWZlcSAiJChhcmNoKSIgImFybSIKKyAgICAgICAgICAgIHRkX2V4cCArPSBsaWJjLnNvLjYKKyAgICAgICAgICAgIHRkX2V4cCArPSBsZC1saW51eC1hcm1oZi5zby4zCisgICAgICAgIGVuZGlmCisgICAgICAgIGlmZXEgIiQoYXJjaCkiICJwcGM2NCIKKyAgICAgICAgICAgIHRkX2V4cCArPSBsaWJjLnNvLjYKKyAgICAgICAgICAgIHRkX2V4cCArPSBsZDY0LnNvLjEKKyAgICAgICAgZW5kaWYKKyAgICAgICAgdGRfZXhwICs9IGxpYmRsLnNvLjIKKyAgICAgICAgdGRfZXhwICs9IGxpYmdjY19zLnNvLjEKKyAgICAgICAgaWZlcSAiJChmaWx0ZXIgMzIgMzJlIDY0IHBwYzY0LCQoYXJjaCkpIiAiIgorICAgICAgICAgICAgdGRfZXhwICs9IGxpYmZmaS5zby42CisgICAgICAgICAgICB0ZF9leHAgKz0gbGliZmZpLnNvLjUKKyAgICAgICAgZW5kaWYKKyAgICAgICAgaWZuZXEgIiQoTElCX1RZUEUpIiAic3R1YiIKKyAgICAgICAgICAgIHRkX2V4cCArPSBsaWJwdGhyZWFkLnNvLjAKKyAgICAgICAgZW5kaWYKKyAgICBlbmRpZgorICAgIGlmZXEgIiQob3MpIiAibHJiIgorICAgICAgICBpZmVxICIkKE1JQ19PUykiICJsaW4iCisgICAgICAgICAgICBpZmVxICIkKE1JQ19BUkNIKSIgImtuZiIKKyAgICAgICAgICAgICAgICB0ZF9leHAgKz0gImxkLWxpbnV4LWwxb20uc28uMiIKKyAgICAgICAgICAgICAgICB0ZF9leHAgKz0gbGliYy5zby42CisgICAgICAgICAgICAgICAgdGRfZXhwICs9IGxpYnB0aHJlYWQuc28uMAorICAgICAgICAgICAgICAgIHRkX2V4cCArPSBsaWJkbC5zby4yCisgICAgICAgICAgICAgICAgdGRfZXhwICs9IGxpYmdjY19zLnNvLjEKKyAgICAgICAgICAgIGVuZGlmCisgICAgICAgICAgICBpZmVxICIkKE1JQ19BUkNIKSIgImtuYyIKKyAgICAgICAgICAgICAgICB0ZF9leHAgKz0gImxkLWxpbnV4LWsxb20uc28uMiIKKyAgICAgICAgICAgICAgICB0ZF9leHAgKz0gbGliYy5zby42CisgICAgICAgICAgICAgICAgdGRfZXhwICs9IGxpYmRsLnNvLjIKKyAgICAgICAgICAgICAgICB0ZF9leHAgKz0gbGlicHRocmVhZC5zby4wCisgICAgICAgICAgICBlbmRpZgorICAgICAgICBlbmRpZgorICAgICAgICBpZmVxICIkKE1JQ19PUykiICJic2QiCisgICAgICAgICAgICB0ZF9leHAgKz0gbGliYy5zby43CisgICAgICAgICAgICB0ZF9leHAgKz0gbGlidGhyLnNvLjMKKyAgICAgICAgICAgIHRkX2V4cCArPSBsaWJ1bndpbmQuc28uNQorICAgICAgICBlbmRpZgorICAgIGVuZGlmCisgICAgaWZlcSAiJChvcykiICJtYWMiCisjICAgICAgICB0ZF9leHAgKz0gL3Vzci9saWIvbGliZ2NjX3MuMS5keWxpYgorICAgICAgICB0ZF9leHAgKz0gL3Vzci9saWIvbGliU3lzdGVtLkIuZHlsaWIKKyAgICBlbmRpZgorICAgIGlmZXEgIiQob3MpIiAid2luIgorICAgICAgICBpZmVxICIkKExJTktfVFlQRSkiICJkeW5hIgorICAgICAgICAgICAgdGRfZXhwICs9IGtlcm5lbDMyLmRsbAorICAgICAgICBlbHNlCisgICAgICAgICAgICB0ZF9leHAgKz0gdXVpZAorICAgICAgICBlbmRpZgorICAgIGVuZGlmCisgICAgaWZlcSAiJChvbXBfb3MpIiAiZnJlZWJzZCIKKyAgICAgICAgdGRfZXhwID0KKyAgICAgICAgdGRfZXhwICs9IGxpYmMuc28uNworICAgICAgICB0ZF9leHAgKz0gbGlidGhyLnNvLjMKKyAgICAgICAgdGRfZXhwICs9IGxpYnVud2luZC5zby41CisgICAgZW5kaWYKKworICAgIHRlc3QtZGVwcy8udGVzdCA6ICQobGliX2ZpbGUpICQodG9vbHNfZGlyKWNoZWNrLWRlcGVuZHMucGwgdGVzdC1kZXBzLy5kaXIgLnJlYnVpbGQKKwkgICAgJCh0YXJnZXQpCisJICAgICQodGQtaSkkKHBlcmwpICQodG9vbHNfZGlyKWNoZWNrLWRlcGVuZHMucGwgJChvYS1vcHRzKSBcCisJCSQoaWYgJCh0ZF9leHApLC0tZXhwZWN0ZWQ9IiQoc3Vic3QgJChzcGFjZSksJChjb21tYSksJCh0ZF9leHApKSIpICQ8CisJICAgICQodG91Y2gpICRACisKK2VuZGlmCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGb3J0cmFuIGZpbGVzLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraWZlcSAiJChUQVJHRVRfQ09NUElMRVIpIiAiMTEiCisgICAgb21wX2xpYl9mID0gb21wX2xpYi5mCitlbmRpZgoraWZlcSAiJChUQVJHRVRfQ09NUElMRVIpIiAiMTIiCisgICAgb21wX2xpYl9mID0gb21wX2xpYi5mOTAKK2VuZGlmCitpZmVxICIkKG9tcF9saWJfZikiICIiCisgICAgJChlcnJvciBvbXBfbGliX2YgaXMgbm90IGRlZmluZWQpCitlbmRpZgorb21wX2xpYi5tb2Qgb21wX2xpYl9raW5kcy5tb2QgOiAkKG9tcF9saWJfZikgLnJlYnVpbGQKKwkkKHRhcmdldCkKKwkkKGZvcnQpICQoZm9ydC1mbGFncykgJDwKKworb21wX2xpYi5oICA6IGV2LWZsYWdzICs9IC1EIEtNUF9JTlRfUFRSX0tJTkQ9ImludF9wdHJfa2luZCgpIgoraW9tcF9saWIuaCA6IGV2LWZsYWdzICs9IC1EIEtNUF9JTlRfUFRSX0tJTkQ9JChpZiAkKGZpbHRlciAzMiwkKGFyY2gpKSw0LDgpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29tbW9uIGZpbGVzLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjb21tb24gOiAkKG91dF9jbW5fZmlsZXMpCisKK2NsZWFuLWNvbW1vbiA6CisJJChybSkgJChvdXRfY21uX2ZpbGVzKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIERlcGVuZGVuY3kgZmlsZXMgYW5kIGNvbW1vbiBydWxlcy4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLlBIT05ZIDogZGVwCitkZXAgICAgOiAkKGRlcF9maWxlcykKKwkkKHRhcmdldCkKKworaW5jbHVkZSAkKExJQk9NUF9XT1JLKXNyYy9ydWxlcy5taworCisjIEluaXRpYXRlIHJlYnVpbGQgaWYgYW55IG9mIG1ha2VmaWxlcyBvciBidWlsZCBzcmlwdCBpcyBjaGFuZ2VkLgorIyBXaGVuIGRldmVsb3BpbmcgbWFrZWZpbGVzLCBpdCBpcyB1c2VmdWwgdG8gY29tbWVudCBpdCwgb3RoZXJ3aXNlIG1ha2Ugd2lsbCBwZXJmb3JtIGZ1bGwgcmVidWlsZAorIyBvbiBldmVyeSBjaGFuZ2Ugb2YgbWFrZWZpbGVzLgorLnJlYnVpbGQgOiAkKE1BS0VGSUxFX0xJU1QpICQodG9vbHNfZGlyKWJ1aWxkLnBsICQodG9vbHNfZGlyKWxpYi9CdWlsZC5wbQorCitpZmVxICIkKGNsZWFuKSIgIiIKKyAgICAjIERvIG5vdCBpbmNsdWRlIGRlcGVuZGVuY3kgZmlsZXMgaWYgImNsZWFuIiBnb2FsIGlzIHNwZWNpZmllZC4KKyAgICAtaW5jbHVkZSAkKGRlcF9maWxlcykKK2VuZGlmCisKKyMgZW5kIG9mIGZpbGUgIwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvcnVsZXMubWsgYi9maW5hbC9ydW50aW1lL3NyYy9ydWxlcy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDQwNzM1Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvcnVsZXMubWsKQEAgLTAsMCArMSw5MyBAQAorIyBydWxlcy5tayAjCisjICRSZXZpc2lvbjogNDI0MjMgJAorIyAkRGF0ZTogMjAxMy0wNi0wNyAwOToyNToyMSAtMDUwMCAoRnJpLCAwNyBKdW4gMjAxMykgJAorCisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgLS0tIENvcHkgZmlsZXMgdG8gb3V0IGRpcmVjdG9yaWVzIC0tLQorCiskKG91dF9jbW5fZGlyKWluY2x1ZGUvJSA6ICUgJChvdXRfY21uX2RpcilpbmNsdWRlLy5kaXIgLnJlYnVpbGQKKwkkKHRhcmdldCkKKwkkKGNwKSAkPCAkQAorCiskKG91dF9jbW5fZGlyKWluY2x1ZGVfY29tcGF0LyUgOiAlICQob3V0X2Ntbl9kaXIpaW5jbHVkZV9jb21wYXQvLmRpciAucmVidWlsZAorCSQodGFyZ2V0KQorCSQoY3ApICQ8ICRACisKKyMgRmF0OiB0b3VjaCAudG91Y2ggZmlsZSBvbiBldmVyeSB1cGRhdGUgaW4gJChvdXRfbGliX2RpciksIHNvIHdlIHdpbGwga25vdyBzaG91bGQgd2UgdXBkYXRlIGZhdAorIyBnb2FsIG9yIG5vdC4KKyQob3V0X2xpYl9kaXIpJSA6ICUgJChvdXRfbGliX2RpcikuZGlyIC5yZWJ1aWxkCisJJCh0YXJnZXQpCisJJChjcCkgJDwgJEAKKyAgICAgICAgaWZuZXEgIiQob3V0X2xpYl9mYXRfZGlyKSIgIiIKKwkgICAgJCh0b3VjaCkgJChkaXIgJEApLnRvdWNoCisgICAgICAgIGVuZGlmCisKKyQob3V0X3B0Zl9kaXIpaW5jbHVkZS8lIDogJSAkKG91dF9wdGZfZGlyKWluY2x1ZGUvLmRpciAucmVidWlsZAorCSQodGFyZ2V0KQorCSQoY3ApICQ8ICRACisKKyQob3V0X3B0Zl9kaXIpaW5jbHVkZV9jb21wYXQvJSA6ICUgJChvdXRfcHRmX2RpcilpbmNsdWRlX2NvbXBhdC8uZGlyIC5yZWJ1aWxkCisJJCh0YXJnZXQpCisJJChjcCkgJDwgJEAKKworJChvdXRfbDEwbl9kaXIpJS8kKGNhdF9maWxlKSA6IGwxMG4vJS8kKGNhdF9maWxlKSAkKG91dF9sMTBuX2RpciklLy5kaXIgLnJlYnVpbGQKKwkkKHRhcmdldCkKKwkkKGNwKSAkPCAkQAorCitpZmVxICIkKG9zKSIgIm1hYyIKKyAgICAkKG91dF9sMTBuX2ZhdF9kaXIpJS8kKGNhdF9maWxlKSA6IGwxMG4vJS8kKGNhdF9maWxlKSAkKG91dF9sMTBuX2ZhdF9kaXIpJS8uZGlyIC5yZWJ1aWxkCisJICAgICQodGFyZ2V0KQorCSAgICAkKGNwKSAkPCAkQAorZW5kaWYKKworIyAtLS0gSW5jbHVkZSByZWFsbHkgY29tbW9uIHJ1bGVzIC0tLQorCitpbmNsdWRlICQoTElCT01QX1dPUkspdG9vbHMvc3JjL2NvbW1vbi1ydWxlcy5taworCisjIC0tLSBCdWlsZGluZyBoZWxwZXIgdG9vbHMgZnJvbSBzb3VyY2VzIC0tLQorCisuUFJFQ0lPVVM6ICUkKGV4ZSkgICAgICAgICAgICAgICAgICAgICAjIERvIG5vdCBkZWxldGUgYXV0b21hdGljYWxseSBjcmVhdGVkIGZpbGVzLgorCislJChleGUpIDogJCh0b29sc19kaXIpJS5jcHAgLnJlYnVpbGQKKwkkKHRhcmdldCkKKwkkKGN4eCkgJChjeHgtb3V0KSRAICQ8CisKKyMgLS0tIEZhdCBsaWJyYXJpZXMgLS0tCisKKyMgRXZlcnkgdGltZSBuZXcgZmlsZSBpcyBjb3BpZWQgdG8gJChvdXRfbGliX2RpcikgZGlyZWN0b3J5IHdlIHVwZGF0ZSAkKG91dF9saWJfZGlyKS5yZWJ1aWxkIGZpbGUsCisjIHNvIHdlIGtub3cgc2hvdWxkIHdlIHJlYnVpbGQgZmF0IGxpYnJhcmllcyBvciBub3QuCisKKyMgTm90ZTogT3JpZ2luYWwgaW1wbGVtZW50YXRpb24gYnVpbHQgZmF0IGxpYnJhcmllcyBpbiBtYWNfMzIgZGlyZWN0b3J5LCB0aGVuIGNvcGllZCBhbGwgdGhlCisjIGxpYnJhcmllcyBmcm9tIG1hY18zMiB0byBtYWNfMzJlIGRpcmVjdG9yeS4gSG93ZXZlciwgdGhpcyBtYXkgd29yayB3cm9uZyBpZiBleHBvcnRzL21hY18qL2xpYi8KKyMgY29udGFpbnMgb3RoZXIgbGlicmFyaWVzLiBTbyBub3cgd2UgYnVpbGQgZmF0IGxpYnJhcmllcyB0d2ljZTogaW4gYm90aCBtYWNfMzIKKyMgYW5kIG1hY18zMmUgZGlyZWN0b3JpZXMuCisKK2lmZXEgIiQocGxhdGZvcm0pIiAibWFjXzMyZSIKKworICAgIC5QSE9OWSA6IGZhdAorICAgIGZhdCAgICA6ICQoY2FsbCBfb3V0X2xpYl9mYXRfZGlyLG1hY18zMikuZG9uZSAkKGNhbGwgX291dF9saWJfZmF0X2RpcixtYWNfMzJlKS5kb25lCisKKyAgICAkKGNhbGwgX291dF9saWJfZmF0X2RpcixtYWNfMzIpLmRvbmUgXAorICAgICQoY2FsbCBfb3V0X2xpYl9mYXRfZGlyLG1hY18zMmUpLmRvbmUgOiBcCisgICAgICAgICQoY2FsbCBfb3V0X2xpYl9kaXIsbWFjXzMyKS50b3VjaCBcCisgICAgICAgICQoY2FsbCBfb3V0X2xpYl9kaXIsbWFjXzMyZSkudG91Y2ggXAorICAgICAgICAkKHRvb2xzX2RpciltYWtlLWZhdC1iaW5hcmllcy5wbCBcCisgICAgICAgICQoY2FsbCBfb3V0X2xpYl9mYXRfZGlyLG1hY18zMikuZGlyICQoY2FsbCBfb3V0X2xpYl9mYXRfZGlyLG1hY18zMmUpLmRpciAucmVidWlsZAorCSAgICAkKHRhcmdldCkKKwkgICAgJChwZXJsKSAkKHRvb2xzX2RpciltYWtlLWZhdC1iaW5hcmllcy5wbCBcCisJICAgICAgICAtLW91dHB1dD0kKGRpciAkQCkgJChjYWxsIF9vdXRfbGliX2RpcixtYWNfMzIpICQoY2FsbCBfb3V0X2xpYl9kaXIsbWFjXzMyZSkKKwkgICAgJCh0b3VjaCkgJEAKKworZW5kaWYKKworIyBlbmQgb2YgZmlsZSAjCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy90ZXN0LXRvdWNoLmMgYi9maW5hbC9ydW50aW1lL3NyYy90ZXN0LXRvdWNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ3MGY3YwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL3Rlc3QtdG91Y2guYwpAQCAtMCwwICsxLDI1IEBACisvLyB0ZXN0LXRvdWNoLmMgLy8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKK2V4dGVybiBkb3VibGUgb21wX2dldF93dGltZSgpOworZXh0ZXJuIGludCAgICBvbXBfZ2V0X251bV90aHJlYWRzKCk7CitleHRlcm4gaW50ICAgIG9tcF9nZXRfbWF4X3RocmVhZHMoKTsKKworaW50IG1haW4oKSB7CisgICAgb21wX2dldF93dGltZSgpOworICAgIG9tcF9nZXRfbnVtX3RocmVhZHMoKTsKKyAgICBvbXBfZ2V0X21heF90aHJlYWRzKCk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8vIGVuZCBvZiBmaWxlIC8vCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9kaXNhYmxlX3dhcm5pbmdzLmggYi9maW5hbC9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9kaXNhYmxlX3dhcm5pbmdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIyNDJmZAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2Rpc2FibGVfd2FybmluZ3MuaApAQCAtMCwwICsxLDI5IEBACisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJpdHRub3RpZnlfY29uZmlnLmgiCisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKworI3ByYWdtYSB3YXJuaW5nIChkaXNhYmxlOiA1OTMpICAgLyogcGFyYW1ldGVyICJYWFhYIiB3YXMgc2V0IGJ1dCBuZXZlciB1c2VkICAgICAgICAgICAgICAgICAqLworI3ByYWdtYSB3YXJuaW5nIChkaXNhYmxlOiAzNDQpICAgLyogdHlwZWRlZiBuYW1lIGhhcyBhbHJlYWR5IGJlZW4gZGVjbGFyZWQgKHdpdGggc2FtZSB0eXBlKSAqLworI3ByYWdtYSB3YXJuaW5nIChkaXNhYmxlOiAxNzQpICAgLyogZXhwcmVzc2lvbiBoYXMgbm8gZWZmZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI3ByYWdtYSB3YXJuaW5nIChkaXNhYmxlOiA0MTI3KSAgLyogY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBpcyBjb25zdGFudCAgICAgICAgICAgICAgICAgICAgICAqLworI3ByYWdtYSB3YXJuaW5nIChkaXNhYmxlOiA0MzA2KSAgLyogY29udmVyc2lvbiBmcm9tICc/JyB0byAnPycgb2YgZ3JlYXRlciBzaXplICAgICAgICAgICAgICAqLworCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKyNpZiBkZWZpbmVkIF9fSU5URUxfQ09NUElMRVIKKworI3ByYWdtYSB3YXJuaW5nIChkaXNhYmxlOiA4NjkpICAvKiBwYXJhbWV0ZXIgIlhYWFhYIiB3YXMgbmV2ZXIgcmVmZXJlbmNlZCAgICAgICAgICAgICAgICAgICovCisjcHJhZ21hIHdhcm5pbmcgKGRpc2FibGU6IDE0MTgpIC8qIGV4dGVybmFsIGZ1bmN0aW9uIGRlZmluaXRpb24gd2l0aCBubyBwcmlvciBkZWNsYXJhdGlvbiAgKi8KKyNwcmFnbWEgd2FybmluZyAoZGlzYWJsZTogMTQxOSkgLyogZXh0ZXJuYWwgZGVjbGFyYXRpb24gaW4gcHJpbWFyeSBzb3VyY2UgZmlsZSAgICAgICAgICAgICAqLworCisjZW5kaWYgLyogX19JTlRFTF9DT01QSUxFUiAqLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvaXR0bm90aWZ5LmggYi9maW5hbC9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9pdHRub3RpZnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTk4OGRiCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvaXR0bm90aWZ5LmgKQEAgLTAsMCArMSwzODA1IEBACisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBfSVRUTk9USUZZX0hfCisjZGVmaW5lIF9JVFROT1RJRllfSF8KKworLyoqCitAZmlsZQorQGJyaWVmIFB1YmxpYyBVc2VyIEFQSSBmdW5jdGlvbnMgYW5kIHR5cGVzCitAbWFpbnBhZ2UKKworVGhlIElUVCBBUEkgaXMgdXNlZCB0byBhbm5vdGF0ZSBhIHVzZXIncyBwcm9ncmFtIHdpdGggYWRkaXRpb25hbCBpbmZvcm1hdGlvbgordGhhdCBjYW4gYmUgdXNlZCBieSBjb3JyZWN0bmVzcyBhbmQgcGVyZm9ybWFuY2UgdG9vbHMuIFRoZSB1c2VyIGluc2VydHMKK2NhbGxzIGluIHRoZWlyIHByb2dyYW0uIFRob3NlIGNhbGxzIGdlbmVyYXRlIGluZm9ybWF0aW9uIHRoYXQgaXMgY29sbGVjdGVkCithdCBydW50aW1lLCBhbmQgdXNlZCBieSBJbnRlbChSKSBUaHJlYWRpbmcgVG9vbHMuCisKK0BzZWN0aW9uIEFQSSBDb25jZXB0cworVGhlIGZvbGxvd2luZyBnZW5lcmFsIGNvbmNlcHRzIGFyZSB1c2VkIHRocm91Z2hvdXQgdGhlIEFQSS4KKworQHN1YnNlY3Rpb24gVW5pY29kZSBTdXBwb3J0CitNYW55IEFQSSBmdW5jdGlvbnMgdGFrZSBjaGFyYWN0ZXIgc3RyaW5nIGFyZ3VtZW50cy4gT24gV2luZG93cywgdGhlcmUKK2FyZSB0d28gdmVyc2lvbnMgb2YgZWFjaCBzdWNoIGZ1bmN0aW9uLiBUaGUgZnVuY3Rpb24gbmFtZSBpcyBzdWZmaXhlZAorYnkgVyBpZiBVbmljb2RlIHN1cHBvcnQgaXMgZW5hYmxlZCwgYW5kIGJ5IEEgb3RoZXJ3aXNlLiBBbnkgQVBJIGZ1bmN0aW9uCit0aGF0IHRha2VzIGEgY2hhcmFjdGVyIHN0cmluZyBhcmd1bWVudCBhZGhlcmVzIHRvIHRoaXMgY29udmVudGlvbi4KKworQHN1YnNlY3Rpb24gQ29uZGl0aW9uYWwgQ29tcGlsYXRpb24KK01hbnkgdXNlcnMgcHJlZmVyIGhhdmluZyBhbiBvcHRpb24gdG8gbW9kaWZ5IElUVCBBUEkgY29kZSB3aGVuIGxpbmtpbmcgaXQKK2luc2lkZSB0aGVpciBydW50aW1lcy4gSVRUIEFQSSBoZWFkZXIgZmlsZSBwcm92aWRlcyBhIG1lY2hhbmlzbSB0byByZXBsYWNlCitJVFQgQVBJIGZ1bmN0aW9uIG5hbWVzIGluc2lkZSB5b3VyIGNvZGUgd2l0aCBlbXB0eSBzdHJpbmdzLiBUbyBkbyB0aGlzLAorZGVmaW5lIHRoZSBtYWNyb3MgSU5URUxfTk9fSVRUTk9USUZZX0FQSSBkdXJpbmcgY29tcGlsYXRpb24gYW5kIHJlbW92ZSB0aGUKK3N0YXRpYyBsaWJyYXJ5IGZyb20gdGhlIGxpbmtlciBzY3JpcHQuCisKK0BzdWJzZWN0aW9uIERvbWFpbnMKK1tzZWUgZG9tYWluc10KK0RvbWFpbnMgcHJvdmlkZSBhIHdheSB0byBzZXBhcmF0ZSBub3RpZmljYXRpb24gZm9yIGRpZmZlcmVudCBtb2R1bGVzIG9yCitsaWJyYXJpZXMgaW4gYSBwcm9ncmFtLiBEb21haW5zIGFyZSBzcGVjaWZpZWQgYnkgZG90dGVkIGNoYXJhY3RlciBzdHJpbmdzLAorZS5nLiBUQkIuSW50ZXJuYWwuQ29udHJvbC4KKworQSBtZWNoYW5pc20gKHRvIGJlIHNwZWNpZmllZCkgaXMgcHJvdmlkZWQgdG8gZW5hYmxlIGFuZCBkaXNhYmxlCitkb21haW5zLiBCeSBkZWZhdWx0LCBhbGwgZG9tYWlucyBhcmUgZW5hYmxlZC4KK0BzdWJzZWN0aW9uIE5hbWVkIEVudGl0aWVzIGFuZCBJbnN0YW5jZXMKK05hbWVkIGVudGl0aWVzIChmcmFtZXMsIHJlZ2lvbnMsIHRhc2tzLCBhbmQgbWFya2VycykgY29tbXVuaWNhdGUKK2luZm9ybWF0aW9uIGFib3V0IHRoZSBwcm9ncmFtIHRvIHRoZSBhbmFseXNpcyB0b29scy4gQSBuYW1lZCBlbnRpdHkgb2Z0ZW4KK3JlZmVycyB0byBhIHNlY3Rpb24gb2YgcHJvZ3JhbSBjb2RlLCBvciB0byBzb21lIHNldCBvZiBsb2dpY2FsIGNvbmNlcHRzCit0aGF0IHRoZSBwcm9ncmFtbWVyIHdhbnRzIHRvIGdyb3VwIHRvZ2V0aGVyLgorCitOYW1lZCBlbnRpdGllcyByZWxhdGUgdG8gdGhlIHByb2dyYW1tZXIncyBzdGF0aWMgdmlldyBvZiB0aGUgcHJvZ3JhbS4gV2hlbgordGhlIHByb2dyYW0gYWN0dWFsbHkgZXhlY3V0ZXMsIG1hbnkgaW5zdGFuY2VzIG9mIGEgZ2l2ZW4gbmFtZWQgZW50aXR5CittYXkgYmUgY3JlYXRlZC4KKworVGhlIEFQSSBhbm5vdGF0aW9ucyBkZW5vdGUgaW5zdGFuY2VzIG9mIG5hbWVkIGVudGl0aWVzLiBUaGUgYWN0dWFsCituYW1lZCBlbnRpdGllcyBhcmUgZGlzcGxheWVkIHVzaW5nIHRoZSBhbmFseXNpcyB0b29scy4gSW4gb3RoZXIgd29yZHMsCit0aGUgbmFtZWQgZW50aXRpZXMgY29tZSBpbnRvIGV4aXN0ZW5jZSB3aGVuIGluc3RhbmNlcyBhcmUgY3JlYXRlZC4KKworSW5zdGFuY2VzIG9mIG5hbWVkIGVudGl0aWVzIG1heSBoYXZlIGluc3RhbmNlIGlkZW50aWZpZXJzIChJRHMpLiBTb21lCitBUEkgY2FsbHMgdXNlIGluc3RhbmNlIGlkZW50aWZpZXJzIHRvIGNyZWF0ZSByZWxhdGlvbnNoaXBzIGJldHdlZW4KK2RpZmZlcmVudCBpbnN0YW5jZXMgb2YgbmFtZWQgZW50aXRpZXMuIE90aGVyIEFQSSBjYWxscyBhc3NvY2lhdGUgZGF0YQord2l0aCBpbnN0YW5jZXMgb2YgbmFtZWQgZW50aXRpZXMuCisKK1NvbWUgbmFtZWQgZW50aXRpZXMgbXVzdCBhbHdheXMgaGF2ZSBpbnN0YW5jZSBJRHMuIEluIHBhcnRpY3VsYXIsIHJlZ2lvbnMKK2FuZCBmcmFtZXMgYWx3YXlzIGhhdmUgSURzLiBUYXNrIGFuZCBtYXJrZXJzIG5lZWQgSURzIG9ubHkgaWYgdGhlIElEIGlzCituZWVkZWQgaW4gYW5vdGhlciBBUEkgY2FsbCAoc3VjaCBhcyBhZGRpbmcgYSByZWxhdGlvbiBvciBtZXRhZGF0YSkuCisKK1RoZSBsaWZldGltZSBvZiBpbnN0YW5jZSBJRHMgaXMgZGlzdGluY3QgZnJvbSB0aGUgbGlmZXRpbWUgb2YKK2luc3RhbmNlcy4gVGhpcyBhbGxvd3MgdmFyaW91cyByZWxhdGlvbnNoaXBzIHRvIGJlIHNwZWNpZmllZCBzZXBhcmF0ZQorZnJvbSB0aGUgYWN0dWFsIGV4ZWN1dGlvbiBvZiBpbnN0YW5jZXMuIFRoaXMgZmxleGliaWxpdHkgY29tZXMgYXQgdGhlCitleHBlbnNlIG9mIGV4dHJhIEFQSSBjYWxscy4KKworVGhlIHNhbWUgSUQgbWF5IG5vdCBiZSByZXVzZWQgZm9yIGRpZmZlcmVudCBpbnN0YW5jZXMsIHVubGVzcyBhIHByZXZpb3VzCitbcmVmXSBfX2l0dF9pZF9kZXN0cm95IGNhbGwgZm9yIHRoYXQgSUQgaGFzIGJlZW4gaXNzdWVkLgorKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElUVF9PU19XSU4KKyMgIGRlZmluZSBJVFRfT1NfV0lOICAgMQorI2VuZGlmIC8qIElUVF9PU19XSU4gKi8KKworI2lmbmRlZiBJVFRfT1NfTElOVVgKKyMgIGRlZmluZSBJVFRfT1NfTElOVVggMgorI2VuZGlmIC8qIElUVF9PU19MSU5VWCAqLworCisjaWZuZGVmIElUVF9PU19NQUMKKyMgIGRlZmluZSBJVFRfT1NfTUFDICAgMworI2VuZGlmIC8qIElUVF9PU19NQUMgKi8KKworI2lmbmRlZiBJVFRfT1MKKyMgIGlmIGRlZmluZWQgV0lOMzIgfHwgZGVmaW5lZCBfV0lOMzIKKyMgICAgZGVmaW5lIElUVF9PUyBJVFRfT1NfV0lOCisjICBlbGlmIGRlZmluZWQoIF9fQVBQTEVfXyApICYmIGRlZmluZWQoIF9fTUFDSF9fICkKKyMgICAgZGVmaW5lIElUVF9PUyBJVFRfT1NfTUFDCisjICBlbHNlCisjICAgIGRlZmluZSBJVFRfT1MgSVRUX09TX0xJTlVYCisjICBlbmRpZgorI2VuZGlmIC8qIElUVF9PUyAqLworCisjaWZuZGVmIElUVF9QTEFURk9STV9XSU4KKyMgIGRlZmluZSBJVFRfUExBVEZPUk1fV0lOIDEKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk1fV0lOICovCisKKyNpZm5kZWYgSVRUX1BMQVRGT1JNX1BPU0lYCisjICBkZWZpbmUgSVRUX1BMQVRGT1JNX1BPU0lYIDIKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk1fUE9TSVggKi8KKworI2lmbmRlZiBJVFRfUExBVEZPUk1fTUFDCisjICBkZWZpbmUgSVRUX1BMQVRGT1JNX01BQyAzCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNX01BQyAqLworCisjaWZuZGVmIElUVF9QTEFURk9STQorIyAgaWYgSVRUX09TPT1JVFRfT1NfV0lOCisjICAgIGRlZmluZSBJVFRfUExBVEZPUk0gSVRUX1BMQVRGT1JNX1dJTgorIyAgZWxpZiBJVFRfT1M9PUlUVF9PU19NQUMKKyMgICAgZGVmaW5lIElUVF9QTEFURk9STSBJVFRfUExBVEZPUk1fTUFDCisjICBlbHNlCisjICAgIGRlZmluZSBJVFRfUExBVEZPUk0gSVRUX1BMQVRGT1JNX1BPU0lYCisjICBlbmRpZgorI2VuZGlmIC8qIElUVF9QTEFURk9STSAqLworCisjaWYgZGVmaW5lZChfVU5JQ09ERSkgJiYgIWRlZmluZWQoVU5JQ09ERSkKKyNkZWZpbmUgVU5JQ09ERQorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNpbmNsdWRlIDx0Y2hhci5oPgorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2luY2x1ZGUgPHN0ZGludC5oPgorI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyNpbmNsdWRlIDx3Y2hhci5oPgorI2VuZGlmIC8qIFVOSUNPREUgfHwgX1VOSUNPREUgKi8KKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworI2lmbmRlZiBDREVDTAorIyAgaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjICAgIGRlZmluZSBDREVDTCBfX2NkZWNsCisjICBlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworIyAgICBpZiBkZWZpbmVkIF9NX0lYODYgfHwgZGVmaW5lZCBfX2kzODZfXworIyAgICAgIGRlZmluZSBDREVDTCBfX2F0dHJpYnV0ZV9fICgoY2RlY2wpKQorIyAgICBlbHNlICAvKiBfTV9JWDg2IHx8IF9faTM4Nl9fICovCisjICAgICAgZGVmaW5lIENERUNMIC8qIGFjdHVhbCBvbmx5IG9uIHg4NiBwbGF0Zm9ybSAqLworIyAgICBlbmRpZiAvKiBfTV9JWDg2IHx8IF9faTM4Nl9fICovCisjICBlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBDREVDTCAqLworCisjaWZuZGVmIFNURENBTEwKKyMgIGlmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorIyAgICBkZWZpbmUgU1REQ0FMTCBfX3N0ZGNhbGwKKyMgIGVsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjICAgIGlmIGRlZmluZWQgX01fSVg4NiB8fCBkZWZpbmVkIF9faTM4Nl9fCisjICAgICAgZGVmaW5lIFNURENBTEwgX19hdHRyaWJ1dGVfXyAoKHN0ZGNhbGwpKQorIyAgICBlbHNlICAvKiBfTV9JWDg2IHx8IF9faTM4Nl9fICovCisjICAgICAgZGVmaW5lIFNURENBTEwgLyogc3VwcG9ydGVkIG9ubHkgb24geDg2IHBsYXRmb3JtICovCisjICAgIGVuZGlmIC8qIF9NX0lYODYgfHwgX19pMzg2X18gKi8KKyMgIGVuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIFNURENBTEwgKi8KKworI2RlZmluZSBJVFRBUEkgICAgQ0RFQ0wKKyNkZWZpbmUgTElCSVRUQVBJIENERUNMCisKKy8qIFRPRE86IFRlbXBvcmFyeSBmb3IgY29tcGF0aWJpbGl0eSEgKi8KKyNkZWZpbmUgSVRUQVBJX0NBTEwgICAgQ0RFQ0wKKyNkZWZpbmUgTElCSVRUQVBJX0NBTEwgQ0RFQ0wKKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorLyogdXNlIF9fZm9yY2VpbmxpbmUgKFZDKysgc3BlY2lmaWMpICovCisjZGVmaW5lIElUVF9JTkxJTkUgICAgICAgICAgIF9fZm9yY2VpbmxpbmUKKyNkZWZpbmUgSVRUX0lOTElORV9BVFRSSUJVVEUgLyogbm90aGluZyAqLworI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworLyoKKyAqIEdlbmVyYWxseSwgZnVuY3Rpb25zIGFyZSBub3QgaW5saW5lZCB1bmxlc3Mgb3B0aW1pemF0aW9uIGlzIHNwZWNpZmllZC4KKyAqIEZvciBmdW5jdGlvbnMgZGVjbGFyZWQgaW5saW5lLCB0aGlzIGF0dHJpYnV0ZSBpbmxpbmVzIHRoZSBmdW5jdGlvbiBldmVuCisgKiBpZiBubyBvcHRpbWl6YXRpb24gbGV2ZWwgd2FzIHNwZWNpZmllZC4KKyAqLworI2lmZGVmIF9fU1RSSUNUX0FOU0lfXworI2RlZmluZSBJVFRfSU5MSU5FICAgICAgICAgICBzdGF0aWMKKyNlbHNlICAvKiBfX1NUUklDVF9BTlNJX18gKi8KKyNkZWZpbmUgSVRUX0lOTElORSAgICAgICAgICAgc3RhdGljIGlubGluZQorI2VuZGlmIC8qIF9fU1RSSUNUX0FOU0lfXyAqLworI2RlZmluZSBJVFRfSU5MSU5FX0FUVFJJQlVURSBfX2F0dHJpYnV0ZV9fICgoYWx3YXlzX2lubGluZSwgdW51c2VkKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKy8qKiBAZW5kY29uZCAqLworCisjaWZkZWYgSU5URUxfSVRUTk9USUZZX0VOQUJMRV9MRUdBQ1kKKyMgIGlmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorIyAgICBwcmFnbWEgbWVzc2FnZSgiV0FSTklORyEhISBEZXByZWNhdGVkIEFQSSBpcyB1c2VkLiBQbGVhc2UgdW5kZWZpbmUgSU5URUxfSVRUTk9USUZZX0VOQUJMRV9MRUdBQ1kgbWFjcm8iKQorIyAgZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyMgICAgd2FybmluZyAiRGVwcmVjYXRlZCBBUEkgaXMgdXNlZC4gUGxlYXNlIHVuZGVmaW5lIElOVEVMX0lUVE5PVElGWV9FTkFCTEVfTEVHQUNZIG1hY3JvIgorIyAgZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjICBpbmNsdWRlICJsZWdhY3kvaXR0bm90aWZ5LmgiCisjZW5kaWYgLyogSU5URUxfSVRUTk9USUZZX0VOQUJMRV9MRUdBQ1kgKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisvKiBIZWxwZXIgbWFjcm8gZm9yIGpvaW5pbmcgdG9rZW5zICovCisjZGVmaW5lIElUVF9KT0lOX0FVWChwLG4pIHAjI24KKyNkZWZpbmUgSVRUX0pPSU4ocCxuKSAgICAgSVRUX0pPSU5fQVVYKHAsbikKKworI2lmZGVmIElUVF9NQUpPUgorI3VuZGVmIElUVF9NQUpPUgorI2VuZGlmCisjaWZkZWYgSVRUX01JTk9SCisjdW5kZWYgSVRUX01JTk9SCisjZW5kaWYKKyNkZWZpbmUgSVRUX01BSk9SICAgICAzCisjZGVmaW5lIElUVF9NSU5PUiAgICAgMAorCisvKiBTdGFuZGFyZCB2ZXJzaW9uaW5nIG9mIGEgdG9rZW4gd2l0aCBtYWpvciBhbmQgbWlub3IgdmVyc2lvbiBudW1iZXJzICovCisjZGVmaW5lIElUVF9WRVJTSU9OSVpFKHgpICAgIFwKKyAgICBJVFRfSk9JTih4LCAgICAgICAgICAgICAgXAorICAgIElUVF9KT0lOKF8sICAgICAgICAgICAgICBcCisgICAgSVRUX0pPSU4oSVRUX01BSk9SLCAgICAgIFwKKyAgICBJVFRfSk9JTihfLCBJVFRfTUlOT1IpKSkpCisKKyNpZm5kZWYgSU5URUxfSVRUTk9USUZZX1BSRUZJWAorIyAgZGVmaW5lIElOVEVMX0lUVE5PVElGWV9QUkVGSVggX19pdHRfCisjZW5kaWYgLyogSU5URUxfSVRUTk9USUZZX1BSRUZJWCAqLworI2lmbmRlZiBJTlRFTF9JVFROT1RJRllfUE9TVEZJWAorIyAgZGVmaW5lIElOVEVMX0lUVE5PVElGWV9QT1NURklYIF9wdHJfCisjZW5kaWYgLyogSU5URUxfSVRUTk9USUZZX1BPU1RGSVggKi8KKworI2RlZmluZSBJVFROT1RJRllfTkFNRV9BVVgobikgSVRUX0pPSU4oSU5URUxfSVRUTk9USUZZX1BSRUZJWCxuKQorI2RlZmluZSBJVFROT1RJRllfTkFNRShuKSAgICAgSVRUX1ZFUlNJT05JWkUoSVRUTk9USUZZX05BTUVfQVVYKElUVF9KT0lOKG4sSU5URUxfSVRUTk9USUZZX1BPU1RGSVgpKSkKKworI2RlZmluZSBJVFROT1RJRllfVk9JRChuKSAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICh2b2lkKTAgOiBJVFROT1RJRllfTkFNRShuKQorI2RlZmluZSBJVFROT1RJRllfREFUQShuKSAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICAgICAgIDAgOiBJVFROT1RJRllfTkFNRShuKQorCisjZGVmaW5lIElUVE5PVElGWV9WT0lEX0QwKG4sZCkgICAgICAgKCEoZCktPmZsYWdzKSA/ICh2b2lkKTAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICh2b2lkKTAgOiBJVFROT1RJRllfTkFNRShuKShkKQorI2RlZmluZSBJVFROT1RJRllfVk9JRF9EMShuLGQseCkgICAgICghKGQpLT5mbGFncykgPyAodm9pZCkwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikoZCx4KQorI2RlZmluZSBJVFROT1RJRllfVk9JRF9EMihuLGQseCx5KSAgICghKGQpLT5mbGFncykgPyAodm9pZCkwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkpCisjZGVmaW5lIElUVE5PVElGWV9WT0lEX0QzKG4sZCx4LHkseikgKCEoZCktPmZsYWdzKSA/ICh2b2lkKTAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICh2b2lkKTAgOiBJVFROT1RJRllfTkFNRShuKShkLHgseSx6KQorI2RlZmluZSBJVFROT1RJRllfVk9JRF9ENChuLGQseCx5LHosYSkgICAgICghKGQpLT5mbGFncykgPyAodm9pZCkwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkseixhKQorI2RlZmluZSBJVFROT1RJRllfVk9JRF9ENShuLGQseCx5LHosYSxiKSAgICghKGQpLT5mbGFncykgPyAodm9pZCkwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkseixhLGIpCisjZGVmaW5lIElUVE5PVElGWV9WT0lEX0Q2KG4sZCx4LHkseixhLGIsYykgKCEoZCktPmZsYWdzKSA/ICh2b2lkKTAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICh2b2lkKTAgOiBJVFROT1RJRllfTkFNRShuKShkLHgseSx6LGEsYixjKQorI2RlZmluZSBJVFROT1RJRllfREFUQV9EMChuLGQpICAgICAgICghKGQpLT5mbGFncykgPyAgICAgICAwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAgICAgICAwIDogSVRUTk9USUZZX05BTUUobikoZCkKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEFfRDEobixkLHgpICAgICAoIShkKS0+ZmxhZ3MpID8gICAgICAgMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCkKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEFfRDIobixkLHgseSkgICAoIShkKS0+ZmxhZ3MpID8gICAgICAgMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5KQorI2RlZmluZSBJVFROT1RJRllfREFUQV9EMyhuLGQseCx5LHopICghKGQpLT5mbGFncykgPyAgICAgICAwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAgICAgICAwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkseikKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEFfRDQobixkLHgseSx6LGEpICAgICAoIShkKS0+ZmxhZ3MpID8gMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5LHosYSkKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEFfRDUobixkLHgseSx6LGEsYikgICAoIShkKS0+ZmxhZ3MpID8gMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5LHosYSxiKQorI2RlZmluZSBJVFROT1RJRllfREFUQV9ENihuLGQseCx5LHosYSxiLGMpICghKGQpLT5mbGFncykgPyAwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAgICAgICAwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkseixhLGIsYykKKworI2lmZGVmIElUVF9TVFVCCisjdW5kZWYgSVRUX1NUVUIKKyNlbmRpZgorI2lmZGVmIElUVF9TVFVCVgorI3VuZGVmIElUVF9TVFVCVgorI2VuZGlmCisjZGVmaW5lIElUVF9TVFVCVihhcGksdHlwZSxuYW1lLGFyZ3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdHlwZWRlZiB0eXBlIChhcGkqIElUVF9KT0lOKElUVE5PVElGWV9OQU1FKG5hbWUpLF90KSkgYXJnczsgICBcCisgICAgZXh0ZXJuIElUVF9KT0lOKElUVE5PVElGWV9OQU1FKG5hbWUpLF90KSBJVFROT1RJRllfTkFNRShuYW1lKTsKKyNkZWZpbmUgSVRUX1NUVUIgSVRUX1NUVUJWCisvKiogQGVuZGNvbmQgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2dwYV9kb2N1bWVudGF0aW9uICovCisvKioKKyAqIEBkZWZncm91cCBwdWJsaWMgUHVibGljIEFQSQorICogQHsKKyAqIEB9CisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgY29udHJvbCBDb2xsZWN0aW9uIENvbnRyb2wKKyAqIEBpbmdyb3VwIHB1YmxpYworICogR2VuZXJhbCBiZWhhdmlvcjogYXBwbGljYXRpb24gY29udGludWVzIHRvIHJ1biwgYnV0IG5vIHByb2ZpbGluZyBpbmZvcm1hdGlvbiBpcyBiZWluZyBjb2xsZWN0ZWQKKyAqCisgKiBQYXVzaW5nIG9jY3VycyBub3Qgb25seSBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkIGJ1dCBmb3IgYWxsIHByb2Nlc3MgYXMgd2VsbCBhcyBzcGF3bmVkIHByb2Nlc3NlcworICogLSBJbnRlbChSKSBQYXJhbGxlbCBJbnNwZWN0b3IgYW5kIEludGVsKFIpIEluc3BlY3RvciBYRToKKyAqICAgLSBEb2VzIG5vdCBhbmFseXplIG9yIHJlcG9ydCBlcnJvcnMgdGhhdCBpbnZvbHZlIG1lbW9yeSBhY2Nlc3MuCisgKiAgIC0gT3RoZXIgZXJyb3JzIGFyZSByZXBvcnRlZCBhcyB1c3VhbC4gUGF1c2luZyBkYXRhIGNvbGxlY3Rpb24gaW4KKyAqICAgICBJbnRlbChSKSBQYXJhbGxlbCBJbnNwZWN0b3IgYW5kIEludGVsKFIpIEluc3BlY3RvciBYRQorICogICAgIG9ubHkgcGF1c2VzIHRyYWNpbmcgYW5kIGFuYWx5emluZyBtZW1vcnkgYWNjZXNzLgorICogICAgIEl0IGRvZXMgbm90IHBhdXNlIHRyYWNpbmcgb3IgYW5hbHl6aW5nIHRocmVhZGluZyBBUElzLgorICogICAuCisgKiAtIEludGVsKFIpIFBhcmFsbGVsIEFtcGxpZmllciBhbmQgSW50ZWwoUikgVlR1bmUoVE0pIEFtcGxpZmllciBYRToKKyAqICAgLSBEb2VzIGNvbnRpbnVlIHRvIHJlY29yZCB3aGVuIG5ldyB0aHJlYWRzIGFyZSBzdGFydGVkLgorICogICAuCisgKiAtIE90aGVyIGVmZmVjdHM6CisgKiAgIC0gUG9zc2libGUgcmVkdWN0aW9uIG9mIHJ1bnRpbWUgb3ZlcmhlYWQuCisgKiAgIC4KKyAqIEB7CisgKi8KKy8qKiBAYnJpZWYgUGF1c2UgY29sbGVjdGlvbiAqLwordm9pZCBJVFRBUEkgX19pdHRfcGF1c2Uodm9pZCk7CisvKiogQGJyaWVmIFJlc3VtZSBjb2xsZWN0aW9uICovCit2b2lkIElUVEFQSSBfX2l0dF9yZXN1bWUodm9pZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHBhdXNlLCAgKHZvaWQpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcmVzdW1lLCAodm9pZCkpCisjZGVmaW5lIF9faXR0X3BhdXNlICAgICAgSVRUTk9USUZZX1ZPSUQocGF1c2UpCisjZGVmaW5lIF9faXR0X3BhdXNlX3B0ciAgSVRUTk9USUZZX05BTUUocGF1c2UpCisjZGVmaW5lIF9faXR0X3Jlc3VtZSAgICAgSVRUTk9USUZZX1ZPSUQocmVzdW1lKQorI2RlZmluZSBfX2l0dF9yZXN1bWVfcHRyIElUVE5PVElGWV9OQU1FKHJlc3VtZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3BhdXNlKCkKKyNkZWZpbmUgX19pdHRfcGF1c2VfcHRyICAwCisjZGVmaW5lIF9faXR0X3Jlc3VtZSgpCisjZGVmaW5lIF9faXR0X3Jlc3VtZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3BhdXNlX3B0ciAgMAorI2RlZmluZSBfX2l0dF9yZXN1bWVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSBjb250cm9sIGdyb3VwICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgdGhyZWFkcyBUaHJlYWRzCisgKiBAaW5ncm91cCBwdWJsaWMKKyAqIEdpdmUgbmFtZXMgdG8gdGhyZWFkcworICogQHsKKyAqLworLyoqCisgKiBAYnJpZWYgU2V0cyB0aHJlYWQgbmFtZSBvZiBjYWxsaW5nIHRocmVhZAorICogQHBhcmFtW2luXSBuYW1lIC0gbmFtZSBvZiB0aHJlYWQKKyAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgordm9pZCBJVFRBUEkgX19pdHRfdGhyZWFkX3NldF9uYW1lQShjb25zdCBjaGFyICAgICpuYW1lKTsKK3ZvaWQgSVRUQVBJIF9faXR0X3RocmVhZF9zZXRfbmFtZVcoY29uc3Qgd2NoYXJfdCAqbmFtZSk7CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorIyAgZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZSAgICAgX19pdHRfdGhyZWFkX3NldF9uYW1lVworIyAgZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZV9wdHIgX19pdHRfdGhyZWFkX3NldF9uYW1lV19wdHIKKyNlbHNlIC8qIFVOSUNPREUgKi8KKyMgIGRlZmluZSBfX2l0dF90aHJlYWRfc2V0X25hbWUgICAgIF9faXR0X3RocmVhZF9zZXRfbmFtZUEKKyMgIGRlZmluZSBfX2l0dF90aHJlYWRfc2V0X25hbWVfcHRyIF9faXR0X3RocmVhZF9zZXRfbmFtZUFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLwordm9pZCBJVFRBUEkgX19pdHRfdGhyZWFkX3NldF9uYW1lKGNvbnN0IGNoYXIgKm5hbWUpOworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0aHJlYWRfc2V0X25hbWVBLCAoY29uc3QgY2hhciAgICAqbmFtZSkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0aHJlYWRfc2V0X25hbWVXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSkpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0aHJlYWRfc2V0X25hbWUsICAoY29uc3QgY2hhciAgICAqbmFtZSkpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZUEgICAgIElUVE5PVElGWV9WT0lEKHRocmVhZF9zZXRfbmFtZUEpCisjZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZUFfcHRyIElUVE5PVElGWV9OQU1FKHRocmVhZF9zZXRfbmFtZUEpCisjZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZVcgICAgIElUVE5PVElGWV9WT0lEKHRocmVhZF9zZXRfbmFtZVcpCisjZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZVdfcHRyIElUVE5PVElGWV9OQU1FKHRocmVhZF9zZXRfbmFtZVcpCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfdGhyZWFkX3NldF9uYW1lICAgICBJVFROT1RJRllfVk9JRCh0aHJlYWRfc2V0X25hbWUpCisjZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZV9wdHIgSVRUTk9USUZZX05BTUUodGhyZWFkX3NldF9uYW1lKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfdGhyZWFkX3NldF9uYW1lQShuYW1lKQorI2RlZmluZSBfX2l0dF90aHJlYWRfc2V0X25hbWVBX3B0ciAwCisjZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZVcobmFtZSkKKyNkZWZpbmUgX19pdHRfdGhyZWFkX3NldF9uYW1lV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZShuYW1lKQorI2RlZmluZSBfX2l0dF90aHJlYWRfc2V0X25hbWVfcHRyIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF90aHJlYWRfc2V0X25hbWVBX3B0ciAwCisjZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF90aHJlYWRfc2V0X25hbWVfcHRyIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9ncGFfZG9jdW1lbnRhdGlvbiAqLworCisvKioKKyAqIEBicmllZiBNYXJrIGN1cnJlbnQgdGhyZWFkIGFzIGlnbm9yZWQgZnJvbSB0aGlzIHBvaW50IG9uLCBmb3IgdGhlIGR1cmF0aW9uIG9mIGl0cyBleGlzdGVuY2UuCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3RocmVhZF9pZ25vcmUodm9pZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRocmVhZF9pZ25vcmUsICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfdGhyZWFkX2lnbm9yZSAgICAgSVRUTk9USUZZX1ZPSUQodGhyZWFkX2lnbm9yZSkKKyNkZWZpbmUgX19pdHRfdGhyZWFkX2lnbm9yZV9wdHIgSVRUTk9USUZZX05BTUUodGhyZWFkX2lnbm9yZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3RocmVhZF9pZ25vcmUoKQorI2RlZmluZSBfX2l0dF90aHJlYWRfaWdub3JlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfdGhyZWFkX2lnbm9yZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IHRocmVhZHMgZ3JvdXAgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgc3VwcHJlc3MgRXJyb3Igc3VwcHJlc3Npb24KKyAqIEBpbmdyb3VwIHB1YmxpYworICogR2VuZXJhbCBiZWhhdmlvcjogYXBwbGljYXRpb24gY29udGludWVzIHRvIHJ1biwgYnV0IGVycm9ycyBhcmUgc3VwcHJlc3NlZAorICoKKyAqIEB7CisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKgorICogQG5hbWUgZ3JvdXAgb2YgZnVuY3Rpb25zIHVzZWQgZm9yIGVycm9yIHN1cHByZXNzaW9uIGluIGNvcnJlY3RuZXNzIHRvb2xzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIEB7ICovCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIEBicmllZiBwb3NzaWJsZSB2YWx1ZSBmb3Igc3VwcHJlc3Npb24gbWFzaworICovCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX2FsbF9lcnJvcnMgMHg3ZmZmZmZmZgorCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIEBicmllZiBwb3NzaWJsZSB2YWx1ZSBmb3Igc3VwcHJlc3Npb24gbWFzayAoc3VwcHJlc3NlcyBlcnJvcnMgZnJvbSB0aHJlYWRpbmcgYW5hbHlzaXMpCisgKi8KKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfdGhyZWFkaW5nX2Vycm9ycyAweDAwMDAwMGZmCisKKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogQGJyaWVmIHBvc3NpYmxlIHZhbHVlIGZvciBzdXBwcmVzc2lvbiBtYXNrIChzdXBwcmVzc2VzIGVycm9ycyBmcm9tIG1lbW9yeSBhbmFseXNpcykKKyAqLworI2RlZmluZSBfX2l0dF9zdXBwcmVzc19tZW1vcnlfZXJyb3JzIDB4MDAwMGZmMDAKKworLyoqCisgKiBAYnJpZWYgU3RhcnQgc3VwcHJlc3NpbmcgZXJyb3JzIGlkZW50aWZpZWQgaW4gbWFzayBvbiB0aGlzIHRocmVhZAorICovCit2b2lkIElUVEFQSSBfX2l0dF9zdXBwcmVzc19wdXNoKHVuc2lnbmVkIGludCBtYXNrKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3VwcHJlc3NfcHVzaCwgKHVuc2lnbmVkIGludCBtYXNrKSkKKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfcHVzaCAgICAgSVRUTk9USUZZX1ZPSUQoc3VwcHJlc3NfcHVzaCkKKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfcHVzaF9wdHIgSVRUTk9USUZZX05BTUUoc3VwcHJlc3NfcHVzaCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX3B1c2gobWFzaykKKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfcHVzaF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX3B1c2hfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgVW5kbyB0aGUgZWZmZWN0cyBvZiB0aGUgbWF0Y2hpbmcgY2FsbCB0byBfX2l0dF9zdXBwcmVzc19wdXNoCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3N1cHByZXNzX3BvcCh2b2lkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3VwcHJlc3NfcG9wLCAodm9pZCkpCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX3BvcCAgICAgSVRUTk9USUZZX1ZPSUQoc3VwcHJlc3NfcG9wKQorI2RlZmluZSBfX2l0dF9zdXBwcmVzc19wb3BfcHRyIElUVE5PVElGWV9OQU1FKHN1cHByZXNzX3BvcCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX3BvcCgpCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX3BvcF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX3BvcF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBlbnVtIF9faXR0X21vZGVsX2Rpc2FibGUKKyAqIEBicmllZiBFbnVtZXJhdG9yIGZvciB0aGUgZGlzYWJsZSBtZXRob2RzCisgKi8KK3R5cGVkZWYgZW51bSBfX2l0dF9zdXBwcmVzc19tb2RlIHsKKyAgICBfX2l0dF91bnN1cHByZXNzX3JhbmdlLAorICAgIF9faXR0X3N1cHByZXNzX3JhbmdlCit9IF9faXR0X3N1cHByZXNzX21vZGVfdDsKKworLyoqCisgKiBAYnJpZWYgTWFyayBhIHJhbmdlIG9mIG1lbW9yeSBmb3IgZXJyb3Igc3VwcHJlc3Npb24gb3IgdW5zdXBwcmVzc2lvbiBmb3IgZXJyb3IgdHlwZXMgaW5jbHVkZWQgaW4gbWFzaworICovCit2b2lkIElUVEFQSSBfX2l0dF9zdXBwcmVzc19tYXJrX3JhbmdlKF9faXR0X3N1cHByZXNzX21vZGVfdCBtb2RlLCB1bnNpZ25lZCBpbnQgbWFzaywgdm9pZCAqIGFkZHJlc3MsIHNpemVfdCBzaXplKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3VwcHJlc3NfbWFya19yYW5nZSwgKF9faXR0X3N1cHByZXNzX21vZGVfdCBtb2RlLCB1bnNpZ25lZCBpbnQgbWFzaywgdm9pZCAqIGFkZHJlc3MsIHNpemVfdCBzaXplKSkKKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfbWFya19yYW5nZSAgICAgSVRUTk9USUZZX1ZPSUQoc3VwcHJlc3NfbWFya19yYW5nZSkKKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfbWFya19yYW5nZV9wdHIgSVRUTk9USUZZX05BTUUoc3VwcHJlc3NfbWFya19yYW5nZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX21hcmtfcmFuZ2UobWFzaykKKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfbWFya19yYW5nZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX21hcmtfcmFuZ2VfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgVW5kbyB0aGUgZWZmZWN0IG9mIGEgbWF0Y2hpbmcgY2FsbCB0byBfX2l0dF9zdXBwcmVzc19tYXJrX3JhbmdlLiAgIElmIG5vdCBtYXRjaGluZworICogICAgICAgIGNhbGwgaXMgZm91bmQsIG5vdGhpbmcgaXMgY2hhbmdlZC4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfc3VwcHJlc3NfY2xlYXJfcmFuZ2UoX19pdHRfc3VwcHJlc3NfbW9kZV90IG1vZGUsIHVuc2lnbmVkIGludCBtYXNrLCB2b2lkICogYWRkcmVzcywgc2l6ZV90IHNpemUpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzdXBwcmVzc19jbGVhcl9yYW5nZSwgKF9faXR0X3N1cHByZXNzX21vZGVfdCBtb2RlLCB1bnNpZ25lZCBpbnQgbWFzaywgdm9pZCAqIGFkZHJlc3MsIHNpemVfdCBzaXplKSkKKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfY2xlYXJfcmFuZ2UgICAgIElUVE5PVElGWV9WT0lEKHN1cHByZXNzX2NsZWFyX3JhbmdlKQorI2RlZmluZSBfX2l0dF9zdXBwcmVzc19jbGVhcl9yYW5nZV9wdHIgSVRUTk9USUZZX05BTUUoc3VwcHJlc3NfY2xlYXJfcmFuZ2UpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9zdXBwcmVzc19jbGVhcl9yYW5nZShtYXNrKQorI2RlZmluZSBfX2l0dF9zdXBwcmVzc19jbGVhcl9yYW5nZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX2NsZWFyX3JhbmdlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gKi8KKy8qKiBAfSBzdXBwcmVzcyBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCBzeW5jIFN5bmNocm9uaXphdGlvbgorICogQGluZ3JvdXAgcHVibGljCisgKiBJbmRpY2F0ZSB1c2VyLXdyaXR0ZW4gc3luY2hyb25pemF0aW9uIGNvZGUKKyAqIEB7CisgKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogQGJyaWVmIHBvc3NpYmxlIHZhbHVlIG9mIGF0dHJpYnV0ZSBhcmd1bWVudCBmb3Igc3luYyBvYmplY3QgdHlwZQorICovCisjZGVmaW5lIF9faXR0X2F0dHJfYmFycmllciAxCisKKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogQGJyaWVmIHBvc3NpYmxlIHZhbHVlIG9mIGF0dHJpYnV0ZSBhcmd1bWVudCBmb3Igc3luYyBvYmplY3QgdHlwZQorICovCisjZGVmaW5lIF9faXR0X2F0dHJfbXV0ZXggICAyCisKKy8qKgorQGJyaWVmIE5hbWUgYSBzeW5jaHJvbml6YXRpb24gb2JqZWN0CitAcGFyYW1baW5dIGFkZHIgICAgICAgSGFuZGxlIGZvciB0aGUgc3luY2hyb25pemF0aW9uIG9iamVjdC4gWW91IHNob3VsZAordXNlIGEgcmVhbCBhZGRyZXNzIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSBzeW5jaHJvbml6YXRpb24gb2JqZWN0LgorQHBhcmFtW2luXSBvYmp0eXBlICAgIG51bGwtdGVybWluYXRlZCBvYmplY3QgdHlwZSBzdHJpbmcuIElmIE5VTEwgaXMKK3Bhc3NlZCwgdGhlIG5hbWUgd2lsbCBiZSAiVXNlciBTeW5jaHJvbml6YXRpb24iLgorQHBhcmFtW2luXSBvYmpuYW1lICAgIG51bGwtdGVybWluYXRlZCBvYmplY3QgbmFtZSBzdHJpbmcuIElmIE5VTEwsCitubyBuYW1lIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIG9iamVjdC4KK0BwYXJhbVtpbl0gYXR0cmlidXRlICBvbmUgb2YgWyNfX2l0dF9hdHRyX2JhcnJpZXIsICNfX2l0dF9hdHRyX211dGV4XQorICovCisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK3ZvaWQgSVRUQVBJIF9faXR0X3N5bmNfY3JlYXRlQSh2b2lkICphZGRyLCBjb25zdCBjaGFyICAgICpvYmp0eXBlLCBjb25zdCBjaGFyICAgICpvYmpuYW1lLCBpbnQgYXR0cmlidXRlKTsKK3ZvaWQgSVRUQVBJIF9faXR0X3N5bmNfY3JlYXRlVyh2b2lkICphZGRyLCBjb25zdCB3Y2hhcl90ICpvYmp0eXBlLCBjb25zdCB3Y2hhcl90ICpvYmpuYW1lLCBpbnQgYXR0cmlidXRlKTsKKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjICBkZWZpbmUgX19pdHRfc3luY19jcmVhdGUgICAgIF9faXR0X3N5bmNfY3JlYXRlVworIyAgZGVmaW5lIF9faXR0X3N5bmNfY3JlYXRlX3B0ciBfX2l0dF9zeW5jX2NyZWF0ZVdfcHRyCisjZWxzZSAvKiBVTklDT0RFICovCisjICBkZWZpbmUgX19pdHRfc3luY19jcmVhdGUgICAgIF9faXR0X3N5bmNfY3JlYXRlQQorIyAgZGVmaW5lIF9faXR0X3N5bmNfY3JlYXRlX3B0ciBfX2l0dF9zeW5jX2NyZWF0ZUFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCit2b2lkIElUVEFQSSBfX2l0dF9zeW5jX2NyZWF0ZSAodm9pZCAqYWRkciwgY29uc3QgY2hhciAqb2JqdHlwZSwgY29uc3QgY2hhciAqb2JqbmFtZSwgaW50IGF0dHJpYnV0ZSk7CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfY3JlYXRlQSwgKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm9ianR5cGUsIGNvbnN0IGNoYXIgICAgKm9iam5hbWUsIGludCBhdHRyaWJ1dGUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19jcmVhdGVXLCAodm9pZCAqYWRkciwgY29uc3Qgd2NoYXJfdCAqb2JqdHlwZSwgY29uc3Qgd2NoYXJfdCAqb2JqbmFtZSwgaW50IGF0dHJpYnV0ZSkpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX2NyZWF0ZSwgICh2b2lkICphZGRyLCBjb25zdCBjaGFyKiAgICBvYmp0eXBlLCBjb25zdCBjaGFyKiAgICBvYmpuYW1lLCBpbnQgYXR0cmlidXRlKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfc3luY19jcmVhdGVBICAgICBJVFROT1RJRllfVk9JRChzeW5jX2NyZWF0ZUEpCisjZGVmaW5lIF9faXR0X3N5bmNfY3JlYXRlQV9wdHIgSVRUTk9USUZZX05BTUUoc3luY19jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZVcgICAgIElUVE5PVElGWV9WT0lEKHN5bmNfY3JlYXRlVykKKyNkZWZpbmUgX19pdHRfc3luY19jcmVhdGVXX3B0ciBJVFROT1RJRllfTkFNRShzeW5jX2NyZWF0ZVcpCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfc3luY19jcmVhdGUgICAgIElUVE5PVElGWV9WT0lEKHN5bmNfY3JlYXRlKQorI2RlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgSVRUTk9USUZZX05BTUUoc3luY19jcmVhdGUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZUEoYWRkciwgb2JqdHlwZSwgb2JqbmFtZSwgYXR0cmlidXRlKQorI2RlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfc3luY19jcmVhdGVXKGFkZHIsIG9ianR5cGUsIG9iam5hbWUsIGF0dHJpYnV0ZSkKKyNkZWZpbmUgX19pdHRfc3luY19jcmVhdGVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfc3luY19jcmVhdGUoYWRkciwgb2JqdHlwZSwgb2JqbmFtZSwgYXR0cmlidXRlKQorI2RlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X3N5bmNfY3JlYXRlQV9wdHIgMAorI2RlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKK0BicmllZiBSZW5hbWUgYSBzeW5jaHJvbml6YXRpb24gb2JqZWN0CisKK1lvdSBjYW4gdXNlIHRoZSByZW5hbWUgY2FsbCB0byBhc3NpZ24gb3IgcmVhc3NpZ24gYSBuYW1lIHRvIGEgZ2l2ZW4KK3N5bmNocm9uaXphdGlvbiBvYmplY3QuCitAcGFyYW1baW5dIGFkZHIgIGhhbmRsZSBmb3IgdGhlIHN5bmNocm9uaXphdGlvbiBvYmplY3QuCitAcGFyYW1baW5dIG5hbWUgIG51bGwtdGVybWluYXRlZCBvYmplY3QgbmFtZSBzdHJpbmcuCisqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgordm9pZCBJVFRBUEkgX19pdHRfc3luY19yZW5hbWVBKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm5hbWUpOwordm9pZCBJVFRBUEkgX19pdHRfc3luY19yZW5hbWVXKHZvaWQgKmFkZHIsIGNvbnN0IHdjaGFyX3QgKm5hbWUpOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9zeW5jX3JlbmFtZSAgICAgX19pdHRfc3luY19yZW5hbWVXCisjICBkZWZpbmUgX19pdHRfc3luY19yZW5hbWVfcHRyIF9faXR0X3N5bmNfcmVuYW1lV19wdHIKKyNlbHNlIC8qIFVOSUNPREUgKi8KKyMgIGRlZmluZSBfX2l0dF9zeW5jX3JlbmFtZSAgICAgX19pdHRfc3luY19yZW5hbWVBCisjICBkZWZpbmUgX19pdHRfc3luY19yZW5hbWVfcHRyIF9faXR0X3N5bmNfcmVuYW1lQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3N5bmNfcmVuYW1lKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgKm5hbWUpOworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX3JlbmFtZUEsICh2b2lkICphZGRyLCBjb25zdCBjaGFyICAgICpuYW1lKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfcmVuYW1lVywgKHZvaWQgKmFkZHIsIGNvbnN0IHdjaGFyX3QgKm5hbWUpKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19yZW5hbWUsICAodm9pZCAqYWRkciwgY29uc3QgY2hhciAgICAqbmFtZSkpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X3N5bmNfcmVuYW1lQSAgICAgSVRUTk9USUZZX1ZPSUQoc3luY19yZW5hbWVBKQorI2RlZmluZSBfX2l0dF9zeW5jX3JlbmFtZUFfcHRyIElUVE5PVElGWV9OQU1FKHN5bmNfcmVuYW1lQSkKKyNkZWZpbmUgX19pdHRfc3luY19yZW5hbWVXICAgICBJVFROT1RJRllfVk9JRChzeW5jX3JlbmFtZVcpCisjZGVmaW5lIF9faXR0X3N5bmNfcmVuYW1lV19wdHIgSVRUTk9USUZZX05BTUUoc3luY19yZW5hbWVXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X3N5bmNfcmVuYW1lICAgICBJVFROT1RJRllfVk9JRChzeW5jX3JlbmFtZSkKKyNkZWZpbmUgX19pdHRfc3luY19yZW5hbWVfcHRyIElUVE5PVElGWV9OQU1FKHN5bmNfcmVuYW1lKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfc3luY19yZW5hbWVBKGFkZHIsIG5hbWUpCisjZGVmaW5lIF9faXR0X3N5bmNfcmVuYW1lQV9wdHIgMAorI2RlZmluZSBfX2l0dF9zeW5jX3JlbmFtZVcoYWRkciwgbmFtZSkKKyNkZWZpbmUgX19pdHRfc3luY19yZW5hbWVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfc3luY19yZW5hbWUoYWRkciwgbmFtZSkKKyNkZWZpbmUgX19pdHRfc3luY19yZW5hbWVfcHRyIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9zeW5jX3JlbmFtZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfc3luY19yZW5hbWVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfc3luY19yZW5hbWVfcHRyIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgQGJyaWVmIERlc3Ryb3kgYSBzeW5jaHJvbml6YXRpb24gb2JqZWN0LgorIEBwYXJhbSBhZGRyIEhhbmRsZSBmb3IgdGhlIHN5bmNocm9uaXphdGlvbiBvYmplY3QuCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3N5bmNfZGVzdHJveSh2b2lkICphZGRyKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19kZXN0cm95LCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X3N5bmNfZGVzdHJveSAgICAgSVRUTk9USUZZX1ZPSUQoc3luY19kZXN0cm95KQorI2RlZmluZSBfX2l0dF9zeW5jX2Rlc3Ryb3lfcHRyIElUVE5PVElGWV9OQU1FKHN5bmNfZGVzdHJveSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3N5bmNfZGVzdHJveShhZGRyKQorI2RlZmluZSBfX2l0dF9zeW5jX2Rlc3Ryb3lfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9zeW5jX2Rlc3Ryb3lfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKgorICogQG5hbWUgZ3JvdXAgb2YgZnVuY3Rpb25zIGlzIHVzZWQgZm9yIHBlcmZvcm1hbmNlIG1lYXN1cmVtZW50IHRvb2xzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIEB7ICovCisvKioKKyAqIEBicmllZiBFbnRlciBzcGluIGxvb3Agb24gdXNlci1kZWZpbmVkIHN5bmMgb2JqZWN0CisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3N5bmNfcHJlcGFyZSh2b2lkKiBhZGRyKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19wcmVwYXJlLCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X3N5bmNfcHJlcGFyZSAgICAgSVRUTk9USUZZX1ZPSUQoc3luY19wcmVwYXJlKQorI2RlZmluZSBfX2l0dF9zeW5jX3ByZXBhcmVfcHRyIElUVE5PVElGWV9OQU1FKHN5bmNfcHJlcGFyZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3N5bmNfcHJlcGFyZShhZGRyKQorI2RlZmluZSBfX2l0dF9zeW5jX3ByZXBhcmVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9zeW5jX3ByZXBhcmVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgUXVpdCBzcGluIGxvb3Agd2l0aG91dCBhY3F1aXJpbmcgc3BpbiBvYmplY3QKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfc3luY19jYW5jZWwodm9pZCAqYWRkcik7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfY2FuY2VsLCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X3N5bmNfY2FuY2VsICAgICBJVFROT1RJRllfVk9JRChzeW5jX2NhbmNlbCkKKyNkZWZpbmUgX19pdHRfc3luY19jYW5jZWxfcHRyIElUVE5PVElGWV9OQU1FKHN5bmNfY2FuY2VsKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3luY19jYW5jZWwoYWRkcikKKyNkZWZpbmUgX19pdHRfc3luY19jYW5jZWxfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9zeW5jX2NhbmNlbF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBTdWNjZXNzZnVsIHNwaW4gbG9vcCBjb21wbGV0aW9uIChzeW5jIG9iamVjdCBhY3F1aXJlZCkKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfc3luY19hY3F1aXJlZCh2b2lkICphZGRyKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19hY3F1aXJlZCwgKHZvaWQgKmFkZHIpKQorI2RlZmluZSBfX2l0dF9zeW5jX2FjcXVpcmVkICAgICBJVFROT1RJRllfVk9JRChzeW5jX2FjcXVpcmVkKQorI2RlZmluZSBfX2l0dF9zeW5jX2FjcXVpcmVkX3B0ciBJVFROT1RJRllfTkFNRShzeW5jX2FjcXVpcmVkKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3luY19hY3F1aXJlZChhZGRyKQorI2RlZmluZSBfX2l0dF9zeW5jX2FjcXVpcmVkX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfc3luY19hY3F1aXJlZF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBTdGFydCBzeW5jIG9iamVjdCByZWxlYXNpbmcgY29kZS4gSXMgY2FsbGVkIGJlZm9yZSB0aGUgbG9jayByZWxlYXNlIGNhbGwuCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3N5bmNfcmVsZWFzaW5nKHZvaWQqIGFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX3JlbGVhc2luZywgKHZvaWQgKmFkZHIpKQorI2RlZmluZSBfX2l0dF9zeW5jX3JlbGVhc2luZyAgICAgSVRUTk9USUZZX1ZPSUQoc3luY19yZWxlYXNpbmcpCisjZGVmaW5lIF9faXR0X3N5bmNfcmVsZWFzaW5nX3B0ciBJVFROT1RJRllfTkFNRShzeW5jX3JlbGVhc2luZykKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3N5bmNfcmVsZWFzaW5nKGFkZHIpCisjZGVmaW5lIF9faXR0X3N5bmNfcmVsZWFzaW5nX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfc3luY19yZWxlYXNpbmdfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSAqLworCisvKiogQH0gc3luYyBncm91cCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqCisgKiBAbmFtZSBncm91cCBvZiBmdW5jdGlvbnMgaXMgdXNlZCBmb3IgY29ycmVjdG5lc3MgY2hlY2tpbmcgdG9vbHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogQHsgKi8KKy8qKgorICogQGluZ3JvdXAgbGVnYWN5CisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgRmFzdCBzeW5jaHJvbml6YXRpb24gd2hpY2ggZG9lcyBubyByZXF1aXJlIHNwaW5uaW5nLgorICogLSBUaGlzIHNwZWNpYWwgZnVuY3Rpb24gaXMgdG8gYmUgdXNlZCBieSBUQkIgYW5kIE9wZW5NUCBsaWJyYXJpZXMgb25seSB3aGVuIHRoZXkga25vdworICogICB0aGVyZSBpcyBubyBzcGluIGJ1dCB0aGV5IG5lZWQgdG8gc3VwcHJlc3MgVEMgd2FybmluZ3MgYWJvdXQgc2hhcmVkIHZhcmlhYmxlIG1vZGlmaWNhdGlvbnMuCisgKiAtIEl0IG9ubHkgaGFzIGNvcnJlc3BvbmRpbmcgcG9pbnRlcnMgaW4gc3RhdGljIGxpYnJhcnkgYW5kIGRvZXMgbm90IGhhdmUgY29ycmVzcG9uZGluZyBmdW5jdGlvbgorICogICBpbiBkeW5hbWljIGxpYnJhcnkuCisgKiBAc2VlIHZvaWQgX19pdHRfc3luY19wcmVwYXJlKHZvaWQqIGFkZHIpOworICovCit2b2lkIElUVEFQSSBfX2l0dF9mc3luY19wcmVwYXJlKHZvaWQqIGFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmc3luY19wcmVwYXJlLCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X2ZzeW5jX3ByZXBhcmUgICAgIElUVE5PVElGWV9WT0lEKGZzeW5jX3ByZXBhcmUpCisjZGVmaW5lIF9faXR0X2ZzeW5jX3ByZXBhcmVfcHRyIElUVE5PVElGWV9OQU1FKGZzeW5jX3ByZXBhcmUpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9mc3luY19wcmVwYXJlKGFkZHIpCisjZGVmaW5lIF9faXR0X2ZzeW5jX3ByZXBhcmVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9mc3luY19wcmVwYXJlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGluZ3JvdXAgbGVnYWN5CisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgRmFzdCBzeW5jaHJvbml6YXRpb24gd2hpY2ggZG9lcyBubyByZXF1aXJlIHNwaW5uaW5nLgorICogLSBUaGlzIHNwZWNpYWwgZnVuY3Rpb24gaXMgdG8gYmUgdXNlZCBieSBUQkIgYW5kIE9wZW5NUCBsaWJyYXJpZXMgb25seSB3aGVuIHRoZXkga25vdworICogICB0aGVyZSBpcyBubyBzcGluIGJ1dCB0aGV5IG5lZWQgdG8gc3VwcHJlc3MgVEMgd2FybmluZ3MgYWJvdXQgc2hhcmVkIHZhcmlhYmxlIG1vZGlmaWNhdGlvbnMuCisgKiAtIEl0IG9ubHkgaGFzIGNvcnJlc3BvbmRpbmcgcG9pbnRlcnMgaW4gc3RhdGljIGxpYnJhcnkgYW5kIGRvZXMgbm90IGhhdmUgY29ycmVzcG9uZGluZyBmdW5jdGlvbgorICogICBpbiBkeW5hbWljIGxpYnJhcnkuCisgKiBAc2VlIHZvaWQgX19pdHRfc3luY19jYW5jZWwodm9pZCAqYWRkcik7CisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2ZzeW5jX2NhbmNlbCh2b2lkICphZGRyKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgZnN5bmNfY2FuY2VsLCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X2ZzeW5jX2NhbmNlbCAgICAgSVRUTk9USUZZX1ZPSUQoZnN5bmNfY2FuY2VsKQorI2RlZmluZSBfX2l0dF9mc3luY19jYW5jZWxfcHRyIElUVE5PVElGWV9OQU1FKGZzeW5jX2NhbmNlbCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2ZzeW5jX2NhbmNlbChhZGRyKQorI2RlZmluZSBfX2l0dF9mc3luY19jYW5jZWxfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9mc3luY19jYW5jZWxfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAaW5ncm91cCBsZWdhY3kKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBGYXN0IHN5bmNocm9uaXphdGlvbiB3aGljaCBkb2VzIG5vIHJlcXVpcmUgc3Bpbm5pbmcuCisgKiAtIFRoaXMgc3BlY2lhbCBmdW5jdGlvbiBpcyB0byBiZSB1c2VkIGJ5IFRCQiBhbmQgT3Blbk1QIGxpYnJhcmllcyBvbmx5IHdoZW4gdGhleSBrbm93CisgKiAgIHRoZXJlIGlzIG5vIHNwaW4gYnV0IHRoZXkgbmVlZCB0byBzdXBwcmVzcyBUQyB3YXJuaW5ncyBhYm91dCBzaGFyZWQgdmFyaWFibGUgbW9kaWZpY2F0aW9ucy4KKyAqIC0gSXQgb25seSBoYXMgY29ycmVzcG9uZGluZyBwb2ludGVycyBpbiBzdGF0aWMgbGlicmFyeSBhbmQgZG9lcyBub3QgaGF2ZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uCisgKiAgIGluIGR5bmFtaWMgbGlicmFyeS4KKyAqIEBzZWUgdm9pZCBfX2l0dF9zeW5jX2FjcXVpcmVkKHZvaWQgKmFkZHIpOworICovCit2b2lkIElUVEFQSSBfX2l0dF9mc3luY19hY3F1aXJlZCh2b2lkICphZGRyKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgZnN5bmNfYWNxdWlyZWQsICh2b2lkICphZGRyKSkKKyNkZWZpbmUgX19pdHRfZnN5bmNfYWNxdWlyZWQgICAgIElUVE5PVElGWV9WT0lEKGZzeW5jX2FjcXVpcmVkKQorI2RlZmluZSBfX2l0dF9mc3luY19hY3F1aXJlZF9wdHIgSVRUTk9USUZZX05BTUUoZnN5bmNfYWNxdWlyZWQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9mc3luY19hY3F1aXJlZChhZGRyKQorI2RlZmluZSBfX2l0dF9mc3luY19hY3F1aXJlZF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2ZzeW5jX2FjcXVpcmVkX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGluZ3JvdXAgbGVnYWN5CisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgRmFzdCBzeW5jaHJvbml6YXRpb24gd2hpY2ggZG9lcyBubyByZXF1aXJlIHNwaW5uaW5nLgorICogLSBUaGlzIHNwZWNpYWwgZnVuY3Rpb24gaXMgdG8gYmUgdXNlZCBieSBUQkIgYW5kIE9wZW5NUCBsaWJyYXJpZXMgb25seSB3aGVuIHRoZXkga25vdworICogICB0aGVyZSBpcyBubyBzcGluIGJ1dCB0aGV5IG5lZWQgdG8gc3VwcHJlc3MgVEMgd2FybmluZ3MgYWJvdXQgc2hhcmVkIHZhcmlhYmxlIG1vZGlmaWNhdGlvbnMuCisgKiAtIEl0IG9ubHkgaGFzIGNvcnJlc3BvbmRpbmcgcG9pbnRlcnMgaW4gc3RhdGljIGxpYnJhcnkgYW5kIGRvZXMgbm90IGhhdmUgY29ycmVzcG9uZGluZyBmdW5jdGlvbgorICogICBpbiBkeW5hbWljIGxpYnJhcnkuCisgKiBAc2VlIHZvaWQgX19pdHRfc3luY19yZWxlYXNpbmcodm9pZCogYWRkcik7CisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2ZzeW5jX3JlbGVhc2luZyh2b2lkKiBhZGRyKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgZnN5bmNfcmVsZWFzaW5nLCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X2ZzeW5jX3JlbGVhc2luZyAgICAgSVRUTk9USUZZX1ZPSUQoZnN5bmNfcmVsZWFzaW5nKQorI2RlZmluZSBfX2l0dF9mc3luY19yZWxlYXNpbmdfcHRyIElUVE5PVElGWV9OQU1FKGZzeW5jX3JlbGVhc2luZykKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2ZzeW5jX3JlbGVhc2luZyhhZGRyKQorI2RlZmluZSBfX2l0dF9mc3luY19yZWxlYXNpbmdfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9mc3luY19yZWxlYXNpbmdfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSAqLworCisvKioKKyAqIEBkZWZncm91cCBtb2RlbCBNb2RlbGluZyBieSBJbnRlbChSKSBQYXJhbGxlbCBBZHZpc29yCisgKiBAaW5ncm91cCBwdWJsaWMKKyAqIFRoaXMgaXMgdGhlIHN1YnNldCBvZiBpdHQgdXNlZCBmb3IgbW9kZWxpbmcgYnkgSW50ZWwoUikgUGFyYWxsZWwgQWR2aXNvci4KKyAqIFRoaXMgQVBJIGlzIGNhbGxlZCBPTkxZIHVzaW5nIGFubm90YXRlLmgsIGJ5ICJBbm5vdGF0aW9uIiBtYWNyb3MKKyAqIHRoZSB1c2VyIHBsYWNlcyBpbiB0aGVpciBzb3VyY2VzIGR1cmluZyB0aGUgcGFyYWxsZWxpc20gbW9kZWxpbmcgc3RlcHMuCisgKgorICogc2l0ZV9iZWdpbi9lbmQgYW5kIHRhc2tfYmVnaW4vZW5kIHRha2UgdGhlIGFkZHJlc3Mgb2YgaGFuZGxlIHZhcmlhYmxlcywKKyAqIHdoaWNoIGFyZSB3cml0ZWFibGUgYnkgdGhlIEFQSS4gIEhhbmRsZXMgbXVzdCBiZSAwIGluaXRpYWxpemVkIHByaW9yCisgKiB0byB0aGUgZmlyc3QgY2FsbCB0byBiZWdpbiwgb3IgbWF5IGNhdXNlIGEgcnVuLXRpbWUgZmFpbHVyZS4KKyAqIFRoZSBoYW5kbGVzIGFyZSBpbml0aWFsaXplZCBpbiBhIG11bHRpLXRocmVhZCBzYWZlIHdheSBieSB0aGUgQVBJIGlmCisgKiB0aGUgaGFuZGxlIGlzIDAuICBUaGUgY29tbW9ubHkgZXhwZWN0ZWQgaWRpb20gaXMgb25lIHN0YXRpYyBoYW5kbGUgdG8KKyAqIGlkZW50aWZ5IGEgc2l0ZSBvciB0YXNrLiAgSWYgYSBzaXRlIG9yIHRhc2sgb2YgdGhlIHNhbWUgbmFtZSBoYXMgYWxyZWFkeQorICogYmVlbiBzdGFydGVkIGR1cmluZyB0aGlzIGNvbGxlY3Rpb24sIHRoZSBzYW1lIGhhbmRsZSBNQVkgYmUgcmV0dXJuZWQsCisgKiBidXQgaXMgbm90IHJlcXVpcmVkIHRvIGJlIC0gaXQgaXMgdW5zcGVjaWZpZWQgaWYgZGF0YSBtZXJnaW5nIGlzIGRvbmUKKyAqIGJhc2VkIG9uIG5hbWUuICBUaGVzZSByb3V0aW5lcyBhbHNvIHRha2UgYW4gaW5zdGFuY2UgdmFyaWFibGUuICBMaWtlCisgKiB0aGUgbGV4aWNhbCBpbnN0YW5jZSwgdGhlc2UgbXVzdCBiZSAwIGluaXRpYWxpemVkLiAgVW5saWtlIHRoZSBsZXhpY2FsCisgKiBpbnN0YW5jZSwgdGhpcyBpcyB1c2VkIHRvIHRyYWNrIGEgc2luZ2xlIGR5bmFtaWMgaW5zdGFuY2UuCisgKgorICogQVBJIHVzZWQgYnkgdGhlIEludGVsKFIpIFBhcmFsbGVsIEFkdmlzb3IgdG8gZGVzY3JpYmUgcG90ZW50aWFsIGNvbmN1cnJlbmN5CisgKiBhbmQgcmVsYXRlZCBhY3Rpdml0aWVzLiBVc2VyLWFkZGVkIHNvdXJjZSBhbm5vdGF0aW9ucyBleHBhbmQgdG8gY2FsbHMKKyAqIHRvIHRoZXNlIHByb2NlZHVyZXMgdG8gZW5hYmxlIG1vZGVsaW5nIG9mIGEgaHlwb3RoZXRpY2FsIGNvbmN1cnJlbnQKKyAqIGV4ZWN1dGlvbiBzZXJpYWxseS4KKyAqIEB7CisgKi8KKyNpZiAhZGVmaW5lZChfQURWSVNPUl9BTk5PVEFURV9IXykgfHwgZGVmaW5lZChBTk5PVEFURV9FWFBBTkRfTlVMTCkKKwordHlwZWRlZiB2b2lkKiBfX2l0dF9tb2RlbF9zaXRlOyAgICAgICAgICAgICAvKiE8IEBicmllZiBoYW5kbGUgZm9yIGxleGljYWwgc2l0ZSAgICAgKi8KK3R5cGVkZWYgdm9pZCogX19pdHRfbW9kZWxfc2l0ZV9pbnN0YW5jZTsgICAgLyohPCBAYnJpZWYgaGFuZGxlIGZvciBkeW5hbWljIGluc3RhbmNlICovCit0eXBlZGVmIHZvaWQqIF9faXR0X21vZGVsX3Rhc2s7ICAgICAgICAgICAgIC8qITwgQGJyaWVmIGhhbmRsZSBmb3IgbGV4aWNhbCBzaXRlICAgICAqLwordHlwZWRlZiB2b2lkKiBfX2l0dF9tb2RlbF90YXNrX2luc3RhbmNlOyAgICAvKiE8IEBicmllZiBoYW5kbGUgZm9yIGR5bmFtaWMgaW5zdGFuY2UgKi8KKworLyoqCisgKiBAZW51bSBfX2l0dF9tb2RlbF9kaXNhYmxlCisgKiBAYnJpZWYgRW51bWVyYXRvciBmb3IgdGhlIGRpc2FibGUgbWV0aG9kcworICovCit0eXBlZGVmIGVudW0geworICAgIF9faXR0X21vZGVsX2Rpc2FibGVfb2JzZXJ2YXRpb24sCisgICAgX19pdHRfbW9kZWxfZGlzYWJsZV9jb2xsZWN0aW9uCit9IF9faXR0X21vZGVsX2Rpc2FibGU7CisKKyNlbmRpZiAvKiAhX0FEVklTT1JfQU5OT1RBVEVfSF8gfHwgQU5OT1RBVEVfRVhQQU5EX05VTEwgKi8KKworLyoqCisgKiBAYnJpZWYgQU5OT1RBVEVfU0lURV9CRUdJTi9BTk5PVEFURV9TSVRFX0VORCBzdXBwb3J0LgorICoKKyAqIHNpdGVfYmVnaW4vZW5kIG1vZGVsIGEgcG90ZW50aWFsIGNvbmN1cnJlbmN5IHNpdGUuCisgKiBzaXRlIGluc3RhbmNlcyBtYXkgYmUgcmVjdXJzaXZlbHkgbmVzdGVkIHdpdGggdGhlbXNlbHZlcy4KKyAqIHNpdGVfZW5kIGV4aXRzIHRoZSBtb3N0IHJlY2VudGx5IHN0YXJ0ZWQgYnV0IHVuZW5kZWQgc2l0ZSBmb3IgdGhlIGN1cnJlbnQKKyAqIHRocmVhZC4gIFRoZSBoYW5kbGUgcGFzc2VkIHRvIGVuZCBtYXkgYmUgdXNlZCB0byB2YWxpZGF0ZSBzdHJ1Y3R1cmUuCisgKiBJbnN0YW5jZXMgb2YgYSBzaXRlIGVuY291bnRlcmVkIG9uIGRpZmZlcmVudCB0aHJlYWRzIGNvbmN1cnJlbnRseQorICogYXJlIGNvbnNpZGVyZWQgY29tcGxldGVseSBkaXN0aW5jdC4gSWYgdGhlIHNpdGUgbmFtZSBmb3IgdHdvIGRpZmZlcmVudAorICogbGV4aWNhbCBzaXRlcyBtYXRjaCwgaXQgaXMgdW5zcGVjaWZpZWQgd2hldGhlciB0aGV5IGFyZSB0cmVhdGVkIGFzIHRoZQorICogc2FtZSBvciBkaWZmZXJlbnQgZm9yIGRhdGEgcHJlc2VudGF0aW9uLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luKF9faXR0X21vZGVsX3NpdGUgKnNpdGUsIF9faXR0X21vZGVsX3NpdGVfaW5zdGFuY2UgKmluc3RhbmNlLCBjb25zdCBjaGFyICpuYW1lKTsKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX3NpdGVfYmVnaW5XKGNvbnN0IHdjaGFyX3QgKm5hbWUpOworI2VuZGlmCit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luQShjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX3NpdGVfYmVnaW5BTChjb25zdCBjaGFyICpuYW1lLCBzaXplX3Qgc2l0ZU5hbWVMZW4pOwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfc2l0ZV9lbmQgIChfX2l0dF9tb2RlbF9zaXRlICpzaXRlLCBfX2l0dF9tb2RlbF9zaXRlX2luc3RhbmNlICppbnN0YW5jZSk7Cit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF9zaXRlX2VuZF8yKHZvaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9zaXRlX2JlZ2luLCAgKF9faXR0X21vZGVsX3NpdGUgKnNpdGUsIF9faXR0X21vZGVsX3NpdGVfaW5zdGFuY2UgKmluc3RhbmNlLCBjb25zdCBjaGFyICpuYW1lKSkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3NpdGVfYmVnaW5XLCAgKGNvbnN0IHdjaGFyX3QgKm5hbWUpKQorI2VuZGlmCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9zaXRlX2JlZ2luQSwgIChjb25zdCBjaGFyICpuYW1lKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3NpdGVfYmVnaW5BTCwgIChjb25zdCBjaGFyICpuYW1lLCBzaXplX3Qgc2l0ZU5hbWVMZW4pKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfc2l0ZV9lbmQsICAgIChfX2l0dF9tb2RlbF9zaXRlICpzaXRlLCBfX2l0dF9tb2RlbF9zaXRlX2luc3RhbmNlICppbnN0YW5jZSkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9zaXRlX2VuZF8yLCAgKHZvaWQpKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luICAgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfc2l0ZV9iZWdpbikKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpbl9wdHIgIElUVE5PVElGWV9OQU1FKG1vZGVsX3NpdGVfYmVnaW4pCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfYmVnaW5XICAgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfc2l0ZV9iZWdpblcpCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfYmVnaW5XX3B0ciAgSVRUTk9USUZZX05BTUUobW9kZWxfc2l0ZV9iZWdpblcpCisjZW5kaWYKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpbkEgICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9zaXRlX2JlZ2luQSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpbkFfcHRyICBJVFROT1RJRllfTkFNRShtb2RlbF9zaXRlX2JlZ2luQSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpbkFMICAgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfc2l0ZV9iZWdpbkFMKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luQUxfcHRyICBJVFROT1RJRllfTkFNRShtb2RlbF9zaXRlX2JlZ2luQUwpCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfZW5kICAgICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9zaXRlX2VuZCkKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9lbmRfcHRyICAgIElUVE5PVElGWV9OQU1FKG1vZGVsX3NpdGVfZW5kKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2VuZF8yICAgICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9zaXRlX2VuZF8yKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2VuZF8yX3B0ciAgICBJVFROT1RJRllfTkFNRShtb2RlbF9zaXRlX2VuZF8yKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpbihzaXRlLCBpbnN0YW5jZSwgbmFtZSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpbl9wdHIgIDAKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpblcobmFtZSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpbldfcHRyICAwCisjZW5kaWYKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpbkEobmFtZSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpbkFfcHRyICAwCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfYmVnaW5BTChuYW1lLCBzaXRlTmFtZUxlbikKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpbkFMX3B0ciAgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2VuZChzaXRlLCBpbnN0YW5jZSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9lbmRfcHRyICAgIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9lbmRfMigpCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfZW5kXzJfcHRyICAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luX3B0ciAgMAorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luV19wdHIgIDAKKyNlbmRpZgorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luQV9wdHIgIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpbkFMX3B0ciAgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2VuZF9wdHIgICAgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2VuZF8yX3B0ciAgICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIEFOTk9UQVRFX1RBU0tfQkVHSU4vQU5OT1RBVEVfVEFTS19FTkQgc3VwcG9ydAorICoKKyAqIHRhc2tfYmVnaW4vZW5kIG1vZGVsIGEgcG90ZW50aWFsIHRhc2ssIHdoaWNoIGlzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIG1vc3QKKyAqIGNsb3NlbHkgZW5jbG9zaW5nIGR5bmFtaWMgc2l0ZS4gIHRhc2tfZW5kIGV4aXRzIHRoZSBtb3N0IHJlY2VudGx5IHN0YXJ0ZWQKKyAqIGJ1dCB1bmVuZGVkIHRhc2suICBUaGUgaGFuZGxlIHBhc3NlZCB0byBlbmQgbWF5IGJlIHVzZWQgdG8gdmFsaWRhdGUKKyAqIHN0cnVjdHVyZS4gIEl0IGlzIHVuc3BlY2lmaWVkIGlmIGJhZCBkeW5hbWljIG5lc3RpbmcgaXMgZGV0ZWN0ZWQuICBJZiBpdAorICogaXMsIGl0IHNob3VsZCBiZSBlbmNvZGVkIGluIHRoZSByZXN1bHRpbmcgZGF0YSBjb2xsZWN0aW9uLiAgVGhlIGNvbGxlY3RvcgorICogc2hvdWxkIG5vdCBmYWlsIGR1ZSB0byBjb25zdHJ1Y3QgbmVzdGluZyBpc3N1ZXMsIG5vciBhdHRlbXB0IHRvIGRpcmVjdGx5CisgKiBpbmRpY2F0ZSB0aGUgcHJvYmxlbS4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfdGFza19iZWdpbihfX2l0dF9tb2RlbF90YXNrICp0YXNrLCBfX2l0dF9tb2RlbF90YXNrX2luc3RhbmNlICppbnN0YW5jZSwgY29uc3QgY2hhciAqbmFtZSk7CisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luVyhjb25zdCB3Y2hhcl90ICpuYW1lKTsKK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX2l0ZXJhdGlvbl90YXNrVyhjb25zdCB3Y2hhcl90ICpuYW1lKTsKKyNlbmRpZgordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfdGFza19iZWdpbkEoY29uc3QgY2hhciAqbmFtZSk7Cit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luQUwoY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IHRhc2tOYW1lTGVuKTsKK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX2l0ZXJhdGlvbl90YXNrQShjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX2l0ZXJhdGlvbl90YXNrQUwoY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IHRhc2tOYW1lTGVuKTsKK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX3Rhc2tfZW5kICAoX19pdHRfbW9kZWxfdGFzayAqdGFzaywgX19pdHRfbW9kZWxfdGFza19pbnN0YW5jZSAqaW5zdGFuY2UpOwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfdGFza19lbmRfMih2b2lkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfdGFza19iZWdpbiwgIChfX2l0dF9tb2RlbF90YXNrICp0YXNrLCBfX2l0dF9tb2RlbF90YXNrX2luc3RhbmNlICppbnN0YW5jZSwgY29uc3QgY2hhciAqbmFtZSkpCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF90YXNrX2JlZ2luVywgIChjb25zdCB3Y2hhcl90ICpuYW1lKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2l0ZXJhdGlvbl90YXNrVywgKGNvbnN0IHdjaGFyX3QgKm5hbWUpKQorI2VuZGlmCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF90YXNrX2JlZ2luQSwgIChjb25zdCBjaGFyICpuYW1lKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3Rhc2tfYmVnaW5BTCwgIChjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgdGFza05hbWVMZW4pKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfaXRlcmF0aW9uX3Rhc2tBLCAgKGNvbnN0IGNoYXIgKm5hbWUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfaXRlcmF0aW9uX3Rhc2tBTCwgIChjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgdGFza05hbWVMZW4pKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfdGFza19lbmQsICAgIChfX2l0dF9tb2RlbF90YXNrICp0YXNrLCBfX2l0dF9tb2RlbF90YXNrX2luc3RhbmNlICppbnN0YW5jZSkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF90YXNrX2VuZF8yLCAgKHZvaWQpKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luICAgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfdGFza19iZWdpbikKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpbl9wdHIgIElUVE5PVElGWV9OQU1FKG1vZGVsX3Rhc2tfYmVnaW4pCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfYmVnaW5XICAgICBJVFROT1RJRllfVk9JRChtb2RlbF90YXNrX2JlZ2luVykKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpbldfcHRyIElUVE5PVElGWV9OQU1FKG1vZGVsX3Rhc2tfYmVnaW5XKQorI2RlZmluZSBfX2l0dF9tb2RlbF9pdGVyYXRpb25fdGFza1cgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX2l0ZXJhdGlvbl90YXNrVykKKyNkZWZpbmUgX19pdHRfbW9kZWxfaXRlcmF0aW9uX3Rhc2tXX3B0ciBJVFROT1RJRllfTkFNRShtb2RlbF9pdGVyYXRpb25fdGFza1cpCisjZW5kaWYKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpbkEgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfdGFza19iZWdpbkEpCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfYmVnaW5BX3B0ciBJVFROT1RJRllfTkFNRShtb2RlbF90YXNrX2JlZ2luQSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpbkFMICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX3Rhc2tfYmVnaW5BTCkKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpbkFMX3B0ciBJVFROT1RJRllfTkFNRShtb2RlbF90YXNrX2JlZ2luQUwpCisjZGVmaW5lIF9faXR0X21vZGVsX2l0ZXJhdGlvbl90YXNrQSAgICBJVFROT1RJRllfVk9JRChtb2RlbF9pdGVyYXRpb25fdGFza0EpCisjZGVmaW5lIF9faXR0X21vZGVsX2l0ZXJhdGlvbl90YXNrQV9wdHIgSVRUTk9USUZZX05BTUUobW9kZWxfaXRlcmF0aW9uX3Rhc2tBKQorI2RlZmluZSBfX2l0dF9tb2RlbF9pdGVyYXRpb25fdGFza0FMICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX2l0ZXJhdGlvbl90YXNrQUwpCisjZGVmaW5lIF9faXR0X21vZGVsX2l0ZXJhdGlvbl90YXNrQUxfcHRyIElUVE5PVElGWV9OQU1FKG1vZGVsX2l0ZXJhdGlvbl90YXNrQUwpCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfZW5kICAgICAgICBJVFROT1RJRllfVk9JRChtb2RlbF90YXNrX2VuZCkKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19lbmRfcHRyICAgIElUVE5PVElGWV9OQU1FKG1vZGVsX3Rhc2tfZW5kKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2VuZF8yICAgICAgICBJVFROT1RJRllfVk9JRChtb2RlbF90YXNrX2VuZF8yKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2VuZF8yX3B0ciAgICBJVFROT1RJRllfTkFNRShtb2RlbF90YXNrX2VuZF8yKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpbih0YXNrLCBpbnN0YW5jZSwgbmFtZSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpbl9wdHIgIDAKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpblcobmFtZSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpbldfcHRyICAwCisjZW5kaWYKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpbkEobmFtZSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpbkFfcHRyICAwCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfYmVnaW5BTChuYW1lLCBzaXRlTmFtZUxlbikKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpbkFMX3B0ciAgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9pdGVyYXRpb25fdGFza0EobmFtZSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfaXRlcmF0aW9uX3Rhc2tBX3B0ciAgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9pdGVyYXRpb25fdGFza0FMKG5hbWUsIHNpdGVOYW1lTGVuKQorI2RlZmluZSBfX2l0dF9tb2RlbF9pdGVyYXRpb25fdGFza0FMX3B0ciAgMAorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2VuZCh0YXNrLCBpbnN0YW5jZSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19lbmRfcHRyICAgIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19lbmRfMigpCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfZW5kXzJfcHRyICAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luX3B0ciAgMAorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luV19wdHIgMAorI2VuZGlmCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfYmVnaW5BX3B0ciAgMAorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luQUxfcHRyICAwCisjZGVmaW5lIF9faXR0X21vZGVsX2l0ZXJhdGlvbl90YXNrQV9wdHIgICAgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9pdGVyYXRpb25fdGFza0FMX3B0ciAgICAwCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfZW5kX3B0ciAgICAwCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfZW5kXzJfcHRyICAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgQU5OT1RBVEVfTE9DS19BQ1FVSVJFL0FOTk9UQVRFX0xPQ0tfUkVMRUFTRSBzdXBwb3J0CisgKgorICogbG9ja19hY3F1aXJlL3JlbGVhc2UgbW9kZWwgYSBwb3RlbnRpYWwgbG9jayBmb3IgYm90aCBsb2Nrc2V0IGFuZAorICogcGVyZm9ybWFuY2UgbW9kZWxpbmcuICBFYWNoIHVuaXF1ZSBhZGRyZXNzIGlzIG1vZGVsZWQgYXMgYSBzZXBhcmF0ZQorICogbG9jaywgd2l0aCBpbnZhbGlkIGFkZHJlc3NlcyBiZWluZyB2YWxpZCBsb2NrIElEcy4gIFNwZWNpZmljYWxseToKKyAqIG5vIHN0b3JhZ2UgaXMgYWNjZXNzZWQgYnkgdGhlIEFQSSBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MgLSBpdCBpcyBvbmx5CisgKiB1c2VkIGZvciBsb2NrIGlkZW50aWZpY2F0aW9uLiAgTG9jayBhY3F1aXJlcyBtYXkgYmUgc2VsZi1uZXN0ZWQgYW5kIGFyZQorICogdW5sb2NrZWQgYnkgYSBjb3JyZXNwb25kaW5nIG51bWJlciBvZiByZWxlYXNlcy4KKyAqIChUaGVzZSBjbG9zZWx5IGNvcnJlc3BvbmQgdG8gX19pdHRfc3luY19hY3F1aXJlZC9fX2l0dF9zeW5jX3JlbGVhc2luZywKKyAqIGJ1dCBtYXkgbm90IGhhdmUgaWRlbnRpY2FsIHNlbWFudGljcy4pCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX2xvY2tfYWNxdWlyZSh2b2lkICpsb2NrKTsKK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX2xvY2tfYWNxdWlyZV8yKHZvaWQgKmxvY2spOwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfbG9ja19yZWxlYXNlKHZvaWQgKmxvY2spOwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfbG9ja19yZWxlYXNlXzIodm9pZCAqbG9jayk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2xvY2tfYWNxdWlyZSwgKHZvaWQgKmxvY2spKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfbG9ja19hY3F1aXJlXzIsICh2b2lkICpsb2NrKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2xvY2tfcmVsZWFzZSwgKHZvaWQgKmxvY2spKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfbG9ja19yZWxlYXNlXzIsICh2b2lkICpsb2NrKSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfbG9ja19hY3F1aXJlICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9sb2NrX2FjcXVpcmUpCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfYWNxdWlyZV9wdHIgSVRUTk9USUZZX05BTUUobW9kZWxfbG9ja19hY3F1aXJlKQorI2RlZmluZSBfX2l0dF9tb2RlbF9sb2NrX2FjcXVpcmVfMiAgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfbG9ja19hY3F1aXJlXzIpCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfYWNxdWlyZV8yX3B0ciBJVFROT1RJRllfTkFNRShtb2RlbF9sb2NrX2FjcXVpcmVfMikKKyNkZWZpbmUgX19pdHRfbW9kZWxfbG9ja19yZWxlYXNlICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9sb2NrX3JlbGVhc2UpCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfcmVsZWFzZV9wdHIgSVRUTk9USUZZX05BTUUobW9kZWxfbG9ja19yZWxlYXNlKQorI2RlZmluZSBfX2l0dF9tb2RlbF9sb2NrX3JlbGVhc2VfMiAgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfbG9ja19yZWxlYXNlXzIpCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfcmVsZWFzZV8yX3B0ciBJVFROT1RJRllfTkFNRShtb2RlbF9sb2NrX3JlbGVhc2VfMikKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfYWNxdWlyZShsb2NrKQorI2RlZmluZSBfX2l0dF9tb2RlbF9sb2NrX2FjcXVpcmVfcHRyIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfbG9ja19hY3F1aXJlXzIobG9jaykKKyNkZWZpbmUgX19pdHRfbW9kZWxfbG9ja19hY3F1aXJlXzJfcHRyIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfbG9ja19yZWxlYXNlKGxvY2spCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfcmVsZWFzZV9wdHIgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9sb2NrX3JlbGVhc2VfMihsb2NrKQorI2RlZmluZSBfX2l0dF9tb2RlbF9sb2NrX3JlbGVhc2VfMl9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfYWNxdWlyZV9wdHIgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9sb2NrX2FjcXVpcmVfMl9wdHIgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9sb2NrX3JlbGVhc2VfcHRyIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfbG9ja19yZWxlYXNlXzJfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgQU5OT1RBVEVfUkVDT1JEX0FMTE9DQVRJT04vQU5OT1RBVEVfUkVDT1JEX0RFQUxMT0NBVElPTiBzdXBwb3J0CisgKgorICogcmVjb3JkX2FsbG9jYXRpb24vZGVhbGxvY2F0aW9uIGRlc2NyaWJlIHVzZXItZGVmaW5lZCBtZW1vcnkgYWxsb2NhdG9yCisgKiBiZWhhdmlvciwgd2hpY2ggbWF5IGJlIHJlcXVpcmVkIGZvciBjb3JyZWN0bmVzcyBtb2RlbGluZyB0byB1bmRlcnN0YW5kCisgKiB3aGVuIHN0b3JhZ2UgaXMgbm90IGV4cGVjdGVkIHRvIGJlIGFjdHVhbGx5IHJldXNlZCBhY3Jvc3MgdGhyZWFkcy4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfcmVjb3JkX2FsbG9jYXRpb24gICh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSk7Cit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF9yZWNvcmRfZGVhbGxvY2F0aW9uKHZvaWQgKmFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9yZWNvcmRfYWxsb2NhdGlvbiwgICAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfcmVjb3JkX2RlYWxsb2NhdGlvbiwgKHZvaWQgKmFkZHIpKQorI2RlZmluZSBfX2l0dF9tb2RlbF9yZWNvcmRfYWxsb2NhdGlvbiAgICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9yZWNvcmRfYWxsb2NhdGlvbikKKyNkZWZpbmUgX19pdHRfbW9kZWxfcmVjb3JkX2FsbG9jYXRpb25fcHRyICAgSVRUTk9USUZZX05BTUUobW9kZWxfcmVjb3JkX2FsbG9jYXRpb24pCisjZGVmaW5lIF9faXR0X21vZGVsX3JlY29yZF9kZWFsbG9jYXRpb24gICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX3JlY29yZF9kZWFsbG9jYXRpb24pCisjZGVmaW5lIF9faXR0X21vZGVsX3JlY29yZF9kZWFsbG9jYXRpb25fcHRyIElUVE5PVElGWV9OQU1FKG1vZGVsX3JlY29yZF9kZWFsbG9jYXRpb24pCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9tb2RlbF9yZWNvcmRfYWxsb2NhdGlvbihhZGRyLCBzaXplKQorI2RlZmluZSBfX2l0dF9tb2RlbF9yZWNvcmRfYWxsb2NhdGlvbl9wdHIgICAwCisjZGVmaW5lIF9faXR0X21vZGVsX3JlY29yZF9kZWFsbG9jYXRpb24oYWRkcikKKyNkZWZpbmUgX19pdHRfbW9kZWxfcmVjb3JkX2RlYWxsb2NhdGlvbl9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X21vZGVsX3JlY29yZF9hbGxvY2F0aW9uX3B0ciAgIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfcmVjb3JkX2RlYWxsb2NhdGlvbl9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBBTk5PVEFURV9JTkRVQ1RJT05fVVNFUyBzdXBwb3J0CisgKgorICogTm90ZSBwYXJ0aWN1bGFyIHN0b3JhZ2UgaXMgaW5kdWN0aXZlIHRocm91Z2ggdGhlIGVuZCBvZiB0aGUgY3VycmVudCBzaXRlCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX2luZHVjdGlvbl91c2VzKHZvaWQqIGFkZHIsIHNpemVfdCBzaXplKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfaW5kdWN0aW9uX3VzZXMsICh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSkpCisjZGVmaW5lIF9faXR0X21vZGVsX2luZHVjdGlvbl91c2VzICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9pbmR1Y3Rpb25fdXNlcykKKyNkZWZpbmUgX19pdHRfbW9kZWxfaW5kdWN0aW9uX3VzZXNfcHRyIElUVE5PVElGWV9OQU1FKG1vZGVsX2luZHVjdGlvbl91c2VzKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbW9kZWxfaW5kdWN0aW9uX3VzZXMoYWRkciwgc2l6ZSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfaW5kdWN0aW9uX3VzZXNfcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X21vZGVsX2luZHVjdGlvbl91c2VzX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgQU5OT1RBVEVfUkVEVUNUSU9OX1VTRVMgc3VwcG9ydAorICoKKyAqIE5vdGUgcGFydGljdWxhciBzdG9yYWdlIGlzIHVzZWQgZm9yIHJlZHVjdGlvbiB0aHJvdWdoIHRoZSBlbmQKKyAqIG9mIHRoZSBjdXJyZW50IHNpdGUKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfcmVkdWN0aW9uX3VzZXModm9pZCogYWRkciwgc2l6ZV90IHNpemUpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9yZWR1Y3Rpb25fdXNlcywgKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfcmVkdWN0aW9uX3VzZXMgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX3JlZHVjdGlvbl91c2VzKQorI2RlZmluZSBfX2l0dF9tb2RlbF9yZWR1Y3Rpb25fdXNlc19wdHIgSVRUTk9USUZZX05BTUUobW9kZWxfcmVkdWN0aW9uX3VzZXMpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9tb2RlbF9yZWR1Y3Rpb25fdXNlcyhhZGRyLCBzaXplKQorI2RlZmluZSBfX2l0dF9tb2RlbF9yZWR1Y3Rpb25fdXNlc19wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbW9kZWxfcmVkdWN0aW9uX3VzZXNfcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBBTk5PVEFURV9PQlNFUlZFX1VTRVMgc3VwcG9ydAorICoKKyAqIEhhdmUgY29ycmVjdG5lc3MgbW9kZWxpbmcgcmVjb3JkIG9ic2VydmF0aW9ucyBhYm91dCB1c2VzIG9mIHN0b3JhZ2UKKyAqIHRocm91Z2ggdGhlIGVuZCBvZiB0aGUgY3VycmVudCBzaXRlCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX29ic2VydmVfdXNlcyh2b2lkKiBhZGRyLCBzaXplX3Qgc2l6ZSk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX29ic2VydmVfdXNlcywgKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfb2JzZXJ2ZV91c2VzICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9vYnNlcnZlX3VzZXMpCisjZGVmaW5lIF9faXR0X21vZGVsX29ic2VydmVfdXNlc19wdHIgSVRUTk9USUZZX05BTUUobW9kZWxfb2JzZXJ2ZV91c2VzKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbW9kZWxfb2JzZXJ2ZV91c2VzKGFkZHIsIHNpemUpCisjZGVmaW5lIF9faXR0X21vZGVsX29ic2VydmVfdXNlc19wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbW9kZWxfb2JzZXJ2ZV91c2VzX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgQU5OT1RBVEVfQ0xFQVJfVVNFUyBzdXBwb3J0CisgKgorICogQ2xlYXIgdGhlIHNwZWNpYWwgaGFuZGxpbmcgb2YgYSBwaWVjZSBvZiBzdG9yYWdlIHJlbGF0ZWQgdG8gaW5kdWN0aW9uLAorICogcmVkdWN0aW9uIG9yIG9ic2VydmVfdXNlcworICovCit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF9jbGVhcl91c2VzKHZvaWQqIGFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9jbGVhcl91c2VzLCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X21vZGVsX2NsZWFyX3VzZXMgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX2NsZWFyX3VzZXMpCisjZGVmaW5lIF9faXR0X21vZGVsX2NsZWFyX3VzZXNfcHRyIElUVE5PVElGWV9OQU1FKG1vZGVsX2NsZWFyX3VzZXMpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9tb2RlbF9jbGVhcl91c2VzKGFkZHIpCisjZGVmaW5lIF9faXR0X21vZGVsX2NsZWFyX3VzZXNfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9tb2RlbF9jbGVhcl91c2VzX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIEFOTk9UQVRFX0RJU0FCTEVfKl9QVVNIL0FOTk9UQVRFX0RJU0FCTEVfKl9QT1Agc3VwcG9ydAorICoKKyAqIGRpc2FibGVfcHVzaC9kaXNhYmxlX3BvcCBwdXNoIGFuZCBwb3AgZGlzYWJsaW5nIGJhc2VkIG9uIGEgcGFyYW1ldGVyLgorICogRGlzYWJsaW5nIG9ic2VydmF0aW9ucyBzdG9wcyBwcm9jZXNzaW5nIG9mIG1lbW9yeSByZWZlcmVuY2VzIGR1cmluZworICogY29ycmVjdG5lc3MgbW9kZWxpbmcsIGFuZCBhbGwgYW5ub3RhdGlvbnMgdGhhdCBvY2N1ciBpbiB0aGUgZGlzYWJsZWQKKyAqIHJlZ2lvbi4gIFRoaXMgYWxsb3dzIGRlc2NyaXB0aW9uIG9mIGNvZGUgdGhhdCBpcyBleHBlY3RlZCB0byBiZSBoYW5kbGVkCisgKiBzcGVjaWFsbHkgZHVyaW5nIGNvbnZlcnNpb24gdG8gcGFyYWxsZWxpc20gb3IgdGhhdCBpcyBub3QgcmVjb2duaXplZAorICogYnkgdG9vbHMgKGUuZy4gc29tZSBraW5kcyBvZiBzeW5jaHJvbml6YXRpb24gb3BlcmF0aW9ucy4pCisgKiBUaGlzIG1lY2hhbmlzbSBjYXVzZXMgYWxsIGFubm90YXRpb25zIGluIHRoZSBkaXNhYmxlZCByZWdpb24sIG90aGVyCisgKiB0aGFuIGRpc2FibGVfcHVzaCBhbmQgZGlzYWJsZV9wb3AsIHRvIGJlIGlnbm9yZWQuICAoRm9yIGV4YW1wbGUsIHRoaXMKKyAqIG1pZ2h0IHZhbGlkbHkgYmUgdXNlZCB0byBkaXNhYmxlIGFuIGVudGlyZSBwYXJhbGxlbCBzaXRlIGFuZCB0aGUgY29udGFpbmVkCisgKiB0YXNrcyBhbmQgbG9ja2luZyBpbiBpdCBmb3IgZGF0YSBjb2xsZWN0aW9uIHB1cnBvc2VzLikKKyAqIFRoZSBkaXNhYmxlIGZvciBjb2xsZWN0aW9uIGlzIGEgbW9yZSBleHBlbnNpdmUgb3BlcmF0aW9uLCBidXQgcmVkdWNlcworICogY29sbGVjdG9yIG92ZXJoZWFkIHNpZ25pZmljYW50bHkuICBUaGlzIGFwcGxpZXMgdG8gQk9USCBjb3JyZWN0bmVzcyBkYXRhCisgKiBjb2xsZWN0aW9uIGFuZCBwZXJmb3JtYW5jZSBkYXRhIGNvbGxlY3Rpb24uICBGb3IgZXhhbXBsZSwgYSBzaXRlCisgKiBjb250YWluaW5nIGEgdGFzayBtaWdodCBvbmx5IGVuYWJsZSBkYXRhIGNvbGxlY3Rpb24gZm9yIHRoZSBmaXJzdCAxMAorICogaXRlcmF0aW9ucy4gIEJvdGggcGVyZm9ybWFuY2UgYW5kIGNvcnJlY3RuZXNzIGRhdGEgc2hvdWxkIHJlZmxlY3QgdGhpcywKKyAqIGFuZCB0aGUgcHJvZ3JhbSBzaG91bGQgcnVuIGFzIGNsb3NlIHRvIGZ1bGwgc3BlZWQgYXMgcG9zc2libGUgd2hlbgorICogY29sbGVjdGlvbiBpcyBkaXNhYmxlZC4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfZGlzYWJsZV9wdXNoKF9faXR0X21vZGVsX2Rpc2FibGUgeCk7Cit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF9kaXNhYmxlX3BvcCh2b2lkKTsKK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX2FnZ3JlZ2F0ZV90YXNrKHNpemVfdCB4KTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfZGlzYWJsZV9wdXNoLCAoX19pdHRfbW9kZWxfZGlzYWJsZSB4KSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2Rpc2FibGVfcG9wLCAgKHZvaWQpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfYWdncmVnYXRlX3Rhc2ssIChzaXplX3QgeCkpCisjZGVmaW5lIF9faXR0X21vZGVsX2Rpc2FibGVfcHVzaCAgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfZGlzYWJsZV9wdXNoKQorI2RlZmluZSBfX2l0dF9tb2RlbF9kaXNhYmxlX3B1c2hfcHRyIElUVE5PVElGWV9OQU1FKG1vZGVsX2Rpc2FibGVfcHVzaCkKKyNkZWZpbmUgX19pdHRfbW9kZWxfZGlzYWJsZV9wb3AgICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9kaXNhYmxlX3BvcCkKKyNkZWZpbmUgX19pdHRfbW9kZWxfZGlzYWJsZV9wb3BfcHRyICBJVFROT1RJRllfTkFNRShtb2RlbF9kaXNhYmxlX3BvcCkKKyNkZWZpbmUgX19pdHRfbW9kZWxfYWdncmVnYXRlX3Rhc2sgICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9hZ2dyZWdhdGVfdGFzaykKKyNkZWZpbmUgX19pdHRfbW9kZWxfYWdncmVnYXRlX3Rhc2tfcHRyICBJVFROT1RJRllfTkFNRShtb2RlbF9hZ2dyZWdhdGVfdGFzaykKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X21vZGVsX2Rpc2FibGVfcHVzaCh4KQorI2RlZmluZSBfX2l0dF9tb2RlbF9kaXNhYmxlX3B1c2hfcHRyIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfZGlzYWJsZV9wb3AoKQorI2RlZmluZSBfX2l0dF9tb2RlbF9kaXNhYmxlX3BvcF9wdHIgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9hZ2dyZWdhdGVfdGFzayh4KQorI2RlZmluZSBfX2l0dF9tb2RlbF9hZ2dyZWdhdGVfdGFza19wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X21vZGVsX2Rpc2FibGVfcHVzaF9wdHIgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9kaXNhYmxlX3BvcF9wdHIgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9hZ2dyZWdhdGVfdGFza19wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IG1vZGVsIGdyb3VwICovCisKKy8qKgorICogQGRlZmdyb3VwIGhlYXAgSGVhcAorICogQGluZ3JvdXAgcHVibGljCisgKiBIZWFwIGdyb3VwCisgKiBAeworICovCisKK3R5cGVkZWYgdm9pZCogX19pdHRfaGVhcF9mdW5jdGlvbjsKKworLyoqCisgKiBAYnJpZWYgQ3JlYXRlIGFuIGlkZW50aWZpY2F0aW9uIGZvciBoZWFwIGZ1bmN0aW9uCisgKiBAcmV0dXJuIG5vbi16ZXJvIGlkZW50aWZpZXIgb3IgTlVMTAorICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitfX2l0dF9oZWFwX2Z1bmN0aW9uIElUVEFQSSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZUEoY29uc3QgY2hhciogICAgbmFtZSwgY29uc3QgY2hhciogICAgZG9tYWluKTsKK19faXR0X2hlYXBfZnVuY3Rpb24gSVRUQVBJIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlVyhjb25zdCB3Y2hhcl90KiBuYW1lLCBjb25zdCB3Y2hhcl90KiBkb21haW4pOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZSAgICAgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGVXCisjICBkZWZpbmUgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGVfcHRyIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlV19wdHIKKyNlbHNlCisjICBkZWZpbmUgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGUgICAgIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlQQorIyAgZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlX3B0ciBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZUFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworX19pdHRfaGVhcF9mdW5jdGlvbiBJVFRBUEkgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGUoY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogZG9tYWluKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9oZWFwX2Z1bmN0aW9uLCBoZWFwX2Z1bmN0aW9uX2NyZWF0ZUEsIChjb25zdCBjaGFyKiAgICBuYW1lLCBjb25zdCBjaGFyKiAgICBkb21haW4pKQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9oZWFwX2Z1bmN0aW9uLCBoZWFwX2Z1bmN0aW9uX2NyZWF0ZVcsIChjb25zdCB3Y2hhcl90KiBuYW1lLCBjb25zdCB3Y2hhcl90KiBkb21haW4pKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9oZWFwX2Z1bmN0aW9uLCBoZWFwX2Z1bmN0aW9uX2NyZWF0ZSwgIChjb25zdCBjaGFyKiAgICBuYW1lLCBjb25zdCBjaGFyKiAgICBkb21haW4pKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZUEgICAgIElUVE5PVElGWV9EQVRBKGhlYXBfZnVuY3Rpb25fY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGVBX3B0ciBJVFROT1RJRllfTkFNRShoZWFwX2Z1bmN0aW9uX2NyZWF0ZUEpCisjZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlVyAgICAgSVRUTk9USUZZX0RBVEEoaGVhcF9mdW5jdGlvbl9jcmVhdGVXKQorI2RlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZVdfcHRyIElUVE5PVElGWV9OQU1FKGhlYXBfZnVuY3Rpb25fY3JlYXRlVykKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZSAgICAgIElUVE5PVElGWV9EQVRBKGhlYXBfZnVuY3Rpb25fY3JlYXRlKQorI2RlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZV9wdHIgIElUVE5PVElGWV9OQU1FKGhlYXBfZnVuY3Rpb25fY3JlYXRlKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGVBKG5hbWUsIGRvbWFpbikgKF9faXR0X2hlYXBfZnVuY3Rpb24pMAorI2RlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGVXKG5hbWUsIGRvbWFpbikgKF9faXR0X2hlYXBfZnVuY3Rpb24pMAorI2RlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZShuYW1lLCBkb21haW4pICAoX19pdHRfaGVhcF9mdW5jdGlvbikwCisjZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlQV9wdHIgMAorI2RlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZV9wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgUmVjb3JkIGFuIGFsbG9jYXRpb24gYmVnaW4gb2NjdXJyZW5jZS4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfaGVhcF9hbGxvY2F0ZV9iZWdpbihfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHNpemVfdCBzaXplLCBpbnQgaW5pdGlhbGl6ZWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX2FsbG9jYXRlX2JlZ2luLCAoX19pdHRfaGVhcF9mdW5jdGlvbiBoLCBzaXplX3Qgc2l6ZSwgaW50IGluaXRpYWxpemVkKSkKKyNkZWZpbmUgX19pdHRfaGVhcF9hbGxvY2F0ZV9iZWdpbiAgICAgSVRUTk9USUZZX1ZPSUQoaGVhcF9hbGxvY2F0ZV9iZWdpbikKKyNkZWZpbmUgX19pdHRfaGVhcF9hbGxvY2F0ZV9iZWdpbl9wdHIgSVRUTk9USUZZX05BTUUoaGVhcF9hbGxvY2F0ZV9iZWdpbikKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2hlYXBfYWxsb2NhdGVfYmVnaW4oaCwgc2l6ZSwgaW5pdGlhbGl6ZWQpCisjZGVmaW5lIF9faXR0X2hlYXBfYWxsb2NhdGVfYmVnaW5fcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2hlYXBfYWxsb2NhdGVfYmVnaW5fcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBSZWNvcmQgYW4gYWxsb2NhdGlvbiBlbmQgb2NjdXJyZW5jZS4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfaGVhcF9hbGxvY2F0ZV9lbmQoX19pdHRfaGVhcF9mdW5jdGlvbiBoLCB2b2lkKiogYWRkciwgc2l6ZV90IHNpemUsIGludCBpbml0aWFsaXplZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfYWxsb2NhdGVfZW5kLCAoX19pdHRfaGVhcF9mdW5jdGlvbiBoLCB2b2lkKiogYWRkciwgc2l6ZV90IHNpemUsIGludCBpbml0aWFsaXplZCkpCisjZGVmaW5lIF9faXR0X2hlYXBfYWxsb2NhdGVfZW5kICAgICBJVFROT1RJRllfVk9JRChoZWFwX2FsbG9jYXRlX2VuZCkKKyNkZWZpbmUgX19pdHRfaGVhcF9hbGxvY2F0ZV9lbmRfcHRyIElUVE5PVElGWV9OQU1FKGhlYXBfYWxsb2NhdGVfZW5kKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9hbGxvY2F0ZV9lbmQoaCwgYWRkciwgc2l6ZSwgaW5pdGlhbGl6ZWQpCisjZGVmaW5lIF9faXR0X2hlYXBfYWxsb2NhdGVfZW5kX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9oZWFwX2FsbG9jYXRlX2VuZF9wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFJlY29yZCBhbiBmcmVlIGJlZ2luIG9jY3VycmVuY2UuCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2hlYXBfZnJlZV9iZWdpbihfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHZvaWQqIGFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX2ZyZWVfYmVnaW4sIChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHZvaWQqIGFkZHIpKQorI2RlZmluZSBfX2l0dF9oZWFwX2ZyZWVfYmVnaW4gICAgIElUVE5PVElGWV9WT0lEKGhlYXBfZnJlZV9iZWdpbikKKyNkZWZpbmUgX19pdHRfaGVhcF9mcmVlX2JlZ2luX3B0ciBJVFROT1RJRllfTkFNRShoZWFwX2ZyZWVfYmVnaW4pCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9oZWFwX2ZyZWVfYmVnaW4oaCwgYWRkcikKKyNkZWZpbmUgX19pdHRfaGVhcF9mcmVlX2JlZ2luX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9oZWFwX2ZyZWVfYmVnaW5fcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBSZWNvcmQgYW4gZnJlZSBlbmQgb2NjdXJyZW5jZS4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfaGVhcF9mcmVlX2VuZChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHZvaWQqIGFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX2ZyZWVfZW5kLCAoX19pdHRfaGVhcF9mdW5jdGlvbiBoLCB2b2lkKiBhZGRyKSkKKyNkZWZpbmUgX19pdHRfaGVhcF9mcmVlX2VuZCAgICAgSVRUTk9USUZZX1ZPSUQoaGVhcF9mcmVlX2VuZCkKKyNkZWZpbmUgX19pdHRfaGVhcF9mcmVlX2VuZF9wdHIgSVRUTk9USUZZX05BTUUoaGVhcF9mcmVlX2VuZCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2hlYXBfZnJlZV9lbmQoaCwgYWRkcikKKyNkZWZpbmUgX19pdHRfaGVhcF9mcmVlX2VuZF9wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9mcmVlX2VuZF9wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFJlY29yZCBhbiByZWFsbG9jYXRpb24gYmVnaW4gb2NjdXJyZW5jZS4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfaGVhcF9yZWFsbG9jYXRlX2JlZ2luKF9faXR0X2hlYXBfZnVuY3Rpb24gaCwgdm9pZCogYWRkciwgc2l6ZV90IG5ld19zaXplLCBpbnQgaW5pdGlhbGl6ZWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX3JlYWxsb2NhdGVfYmVnaW4sIChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHZvaWQqIGFkZHIsIHNpemVfdCBuZXdfc2l6ZSwgaW50IGluaXRpYWxpemVkKSkKKyNkZWZpbmUgX19pdHRfaGVhcF9yZWFsbG9jYXRlX2JlZ2luICAgICBJVFROT1RJRllfVk9JRChoZWFwX3JlYWxsb2NhdGVfYmVnaW4pCisjZGVmaW5lIF9faXR0X2hlYXBfcmVhbGxvY2F0ZV9iZWdpbl9wdHIgSVRUTk9USUZZX05BTUUoaGVhcF9yZWFsbG9jYXRlX2JlZ2luKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9yZWFsbG9jYXRlX2JlZ2luKGgsIGFkZHIsIG5ld19zaXplLCBpbml0aWFsaXplZCkKKyNkZWZpbmUgX19pdHRfaGVhcF9yZWFsbG9jYXRlX2JlZ2luX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9oZWFwX3JlYWxsb2NhdGVfYmVnaW5fcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBSZWNvcmQgYW4gcmVhbGxvY2F0aW9uIGVuZCBvY2N1cnJlbmNlLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9oZWFwX3JlYWxsb2NhdGVfZW5kKF9faXR0X2hlYXBfZnVuY3Rpb24gaCwgdm9pZCogYWRkciwgdm9pZCoqIG5ld19hZGRyLCBzaXplX3QgbmV3X3NpemUsIGludCBpbml0aWFsaXplZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfcmVhbGxvY2F0ZV9lbmQsIChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHZvaWQqIGFkZHIsIHZvaWQqKiBuZXdfYWRkciwgc2l6ZV90IG5ld19zaXplLCBpbnQgaW5pdGlhbGl6ZWQpKQorI2RlZmluZSBfX2l0dF9oZWFwX3JlYWxsb2NhdGVfZW5kICAgICBJVFROT1RJRllfVk9JRChoZWFwX3JlYWxsb2NhdGVfZW5kKQorI2RlZmluZSBfX2l0dF9oZWFwX3JlYWxsb2NhdGVfZW5kX3B0ciBJVFROT1RJRllfTkFNRShoZWFwX3JlYWxsb2NhdGVfZW5kKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9yZWFsbG9jYXRlX2VuZChoLCBhZGRyLCBuZXdfYWRkciwgbmV3X3NpemUsIGluaXRpYWxpemVkKQorI2RlZmluZSBfX2l0dF9oZWFwX3JlYWxsb2NhdGVfZW5kX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9oZWFwX3JlYWxsb2NhdGVfZW5kX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqIEBicmllZiBpbnRlcm5hbCBhY2Nlc3MgYmVnaW4gKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2hlYXBfaW50ZXJuYWxfYWNjZXNzX2JlZ2luKHZvaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX2ludGVybmFsX2FjY2Vzc19iZWdpbiwgICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfaGVhcF9pbnRlcm5hbF9hY2Nlc3NfYmVnaW4gICAgICBJVFROT1RJRllfVk9JRChoZWFwX2ludGVybmFsX2FjY2Vzc19iZWdpbikKKyNkZWZpbmUgX19pdHRfaGVhcF9pbnRlcm5hbF9hY2Nlc3NfYmVnaW5fcHRyICBJVFROT1RJRllfTkFNRShoZWFwX2ludGVybmFsX2FjY2Vzc19iZWdpbikKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2hlYXBfaW50ZXJuYWxfYWNjZXNzX2JlZ2luKCkKKyNkZWZpbmUgX19pdHRfaGVhcF9pbnRlcm5hbF9hY2Nlc3NfYmVnaW5fcHRyICAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9pbnRlcm5hbF9hY2Nlc3NfYmVnaW5fcHRyICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKiBAYnJpZWYgaW50ZXJuYWwgYWNjZXNzIGVuZCAqLwordm9pZCBJVFRBUEkgX19pdHRfaGVhcF9pbnRlcm5hbF9hY2Nlc3NfZW5kKHZvaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX2ludGVybmFsX2FjY2Vzc19lbmQsICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfaGVhcF9pbnRlcm5hbF9hY2Nlc3NfZW5kICAgICBJVFROT1RJRllfVk9JRChoZWFwX2ludGVybmFsX2FjY2Vzc19lbmQpCisjZGVmaW5lIF9faXR0X2hlYXBfaW50ZXJuYWxfYWNjZXNzX2VuZF9wdHIgSVRUTk9USUZZX05BTUUoaGVhcF9pbnRlcm5hbF9hY2Nlc3NfZW5kKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9pbnRlcm5hbF9hY2Nlc3NfZW5kKCkKKyNkZWZpbmUgX19pdHRfaGVhcF9pbnRlcm5hbF9hY2Nlc3NfZW5kX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9pbnRlcm5hbF9hY2Nlc3NfZW5kX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKiBAYnJpZWYgcmVjb3JkIG1lbW9yeSBncm93dGggYmVnaW4gKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2hlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfYmVnaW4odm9pZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfYmVnaW4sICAodm9pZCkpCisjZGVmaW5lIF9faXR0X2hlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfYmVnaW4gICAgICBJVFROT1RJRllfVk9JRChoZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2JlZ2luKQorI2RlZmluZSBfX2l0dF9oZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2JlZ2luX3B0ciAgSVRUTk9USUZZX05BTUUoaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9iZWdpbikKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2hlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfYmVnaW4oKQorI2RlZmluZSBfX2l0dF9oZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2JlZ2luX3B0ciAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2hlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfYmVnaW5fcHRyICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKiBAYnJpZWYgcmVjb3JkIG1lbW9yeSBncm93dGggZW5kICovCit2b2lkIElUVEFQSSBfX2l0dF9oZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2VuZCh2b2lkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9lbmQsICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9lbmQgICAgIElUVE5PVElGWV9WT0lEKGhlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfZW5kKQorI2RlZmluZSBfX2l0dF9oZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2VuZF9wdHIgSVRUTk9USUZZX05BTUUoaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9lbmQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9oZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2VuZCgpCisjZGVmaW5lIF9faXR0X2hlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfZW5kX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9lbmRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgU3BlY2lmeSB0aGUgdHlwZSBvZiBoZWFwIGRldGVjdGlvbi9yZXBvcnRpbmcgdG8gbW9kaWZ5LgorICovCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIEBicmllZiBSZXBvcnQgb24gbWVtb3J5IGxlYWtzLgorICovCisjZGVmaW5lIF9faXR0X2hlYXBfbGVha3MgMHgwMDAwMDAwMQorCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIEBicmllZiBSZXBvcnQgb24gbWVtb3J5IGdyb3d0aC4KKyAqLworI2RlZmluZSBfX2l0dF9oZWFwX2dyb3d0aCAweDAwMDAwMDAyCisKKworLyoqIEBicmllZiBoZWFwIHJlc2V0IGRldGVjdGlvbiAqLwordm9pZCBJVFRBUEkgX19pdHRfaGVhcF9yZXNldF9kZXRlY3Rpb24odW5zaWduZWQgaW50IHJlc2V0X21hc2spOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX3Jlc2V0X2RldGVjdGlvbiwgICh1bnNpZ25lZCBpbnQgcmVzZXRfbWFzaykpCisjZGVmaW5lIF9faXR0X2hlYXBfcmVzZXRfZGV0ZWN0aW9uICAgICAgSVRUTk9USUZZX1ZPSUQoaGVhcF9yZXNldF9kZXRlY3Rpb24pCisjZGVmaW5lIF9faXR0X2hlYXBfcmVzZXRfZGV0ZWN0aW9uX3B0ciAgSVRUTk9USUZZX05BTUUoaGVhcF9yZXNldF9kZXRlY3Rpb24pCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9oZWFwX3Jlc2V0X2RldGVjdGlvbigpCisjZGVmaW5lIF9faXR0X2hlYXBfcmVzZXRfZGV0ZWN0aW9uX3B0ciAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2hlYXBfcmVzZXRfZGV0ZWN0aW9uX3B0ciAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKiogQGJyaWVmIHJlcG9ydCAqLwordm9pZCBJVFRBUEkgX19pdHRfaGVhcF9yZWNvcmQodW5zaWduZWQgaW50IHJlY29yZF9tYXNrKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9yZWNvcmQsICh1bnNpZ25lZCBpbnQgcmVjb3JkX21hc2spKQorI2RlZmluZSBfX2l0dF9oZWFwX3JlY29yZCAgICAgSVRUTk9USUZZX1ZPSUQoaGVhcF9yZWNvcmQpCisjZGVmaW5lIF9faXR0X2hlYXBfcmVjb3JkX3B0ciBJVFROT1RJRllfTkFNRShoZWFwX3JlY29yZCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2hlYXBfcmVjb3JkKCkKKyNkZWZpbmUgX19pdHRfaGVhcF9yZWNvcmRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9oZWFwX3JlY29yZF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKiogQH0gaGVhcCBncm91cCAqLworLyoqIEBlbmRjb25kICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKioKKyAqIEBkZWZncm91cCBkb21haW5zIERvbWFpbnMKKyAqIEBpbmdyb3VwIHB1YmxpYworICogRG9tYWlucyBncm91cAorICogQHsKKyAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNwcmFnbWEgcGFjayhwdXNoLCA4KQorCit0eXBlZGVmIHN0cnVjdCBfX19pdHRfZG9tYWluCit7CisgICAgdm9sYXRpbGUgaW50IGZsYWdzOyAvKiE8IFplcm8gaWYgZGlzYWJsZWQsIG5vbi16ZXJvIGlmIGVuYWJsZWQuIFRoZSBtZWFuaW5nIG9mIGRpZmZlcmVudCBub24temVybyB2YWx1ZXMgaXMgcmVzZXJ2ZWQgdG8gdGhlIHJ1bnRpbWUgKi8KKyAgICBjb25zdCBjaGFyKiBuYW1lQTsgIC8qITwgQ29weSBvZiBvcmlnaW5hbCBuYW1lIGluIEFTQ0lJLiAqLworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyAgICBjb25zdCB3Y2hhcl90KiBuYW1lVzsgLyohPCBDb3B5IG9mIG9yaWdpbmFsIG5hbWUgaW4gVU5JQ09ERS4gKi8KKyNlbHNlICAvKiBVTklDT0RFIHx8IF9VTklDT0RFICovCisgICAgdm9pZCogbmFtZVc7CisjZW5kaWYgLyogVU5JQ09ERSB8fCBfVU5JQ09ERSAqLworICAgIGludCAgIGV4dHJhMTsgLyohPCBSZXNlcnZlZCB0byB0aGUgcnVudGltZSAqLworICAgIHZvaWQqIGV4dHJhMjsgLyohPCBSZXNlcnZlZCB0byB0aGUgcnVudGltZSAqLworICAgIHN0cnVjdCBfX19pdHRfZG9tYWluKiBuZXh0OworfSBfX2l0dF9kb21haW47CisKKyNwcmFnbWEgcGFjayhwb3ApCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAaW5ncm91cCBkb21haW5zCisgKiBAYnJpZWYgQ3JlYXRlIGEgZG9tYWluLgorICogQ3JlYXRlIGRvbWFpbiB1c2luZyBzb21lIGRvbWFpbiBuYW1lOiB0aGUgVVJJIG5hbWluZyBzdHlsZSBpcyByZWNvbW1lbmRlZC4KKyAqIEJlY2F1c2UgdGhlIHNldCBvZiBkb21haW5zIGlzIGV4cGVjdGVkIHRvIGJlIHN0YXRpYyBvdmVyIHRoZSBhcHBsaWNhdGlvbidzCisgKiBleGVjdXRpb24gdGltZSwgdGhlcmUgaXMgbm8gbWVjaGFuaXNtIHRvIGRlc3Ryb3kgYSBkb21haW4uCisgKiBBbnkgZG9tYWluIGNhbiBiZSBhY2Nlc3NlZCBieSBhbnkgdGhyZWFkIGluIHRoZSBwcm9jZXNzLCByZWdhcmRsZXNzIG9mCisgKiB3aGljaCB0aHJlYWQgY3JlYXRlZCB0aGUgZG9tYWluLiBUaGlzIGNhbGwgaXMgdGhyZWFkLXNhZmUuCisgKiBAcGFyYW1baW5dIG5hbWUgbmFtZSBvZiBkb21haW4KKyAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorX19pdHRfZG9tYWluKiBJVFRBUEkgX19pdHRfZG9tYWluX2NyZWF0ZUEoY29uc3QgY2hhciAgICAqbmFtZSk7CitfX2l0dF9kb21haW4qIElUVEFQSSBfX2l0dF9kb21haW5fY3JlYXRlVyhjb25zdCB3Y2hhcl90ICpuYW1lKTsKKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjICBkZWZpbmUgX19pdHRfZG9tYWluX2NyZWF0ZSAgICAgX19pdHRfZG9tYWluX2NyZWF0ZVcKKyMgIGRlZmluZSBfX2l0dF9kb21haW5fY3JlYXRlX3B0ciBfX2l0dF9kb21haW5fY3JlYXRlV19wdHIKKyNlbHNlIC8qIFVOSUNPREUgKi8KKyMgIGRlZmluZSBfX2l0dF9kb21haW5fY3JlYXRlICAgICBfX2l0dF9kb21haW5fY3JlYXRlQQorIyAgZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGVfcHRyIF9faXR0X2RvbWFpbl9jcmVhdGVBX3B0cgorI2VuZGlmIC8qIFVOSUNPREUgKi8KKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK19faXR0X2RvbWFpbiogSVRUQVBJIF9faXR0X2RvbWFpbl9jcmVhdGUoY29uc3QgY2hhciAqbmFtZSk7CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfZG9tYWluKiwgZG9tYWluX2NyZWF0ZUEsIChjb25zdCBjaGFyICAgICpuYW1lKSkKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfZG9tYWluKiwgZG9tYWluX2NyZWF0ZVcsIChjb25zdCB3Y2hhcl90ICpuYW1lKSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfZG9tYWluKiwgZG9tYWluX2NyZWF0ZSwgIChjb25zdCBjaGFyICAgICpuYW1lKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfZG9tYWluX2NyZWF0ZUEgICAgIElUVE5PVElGWV9EQVRBKGRvbWFpbl9jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9kb21haW5fY3JlYXRlQV9wdHIgSVRUTk9USUZZX05BTUUoZG9tYWluX2NyZWF0ZUEpCisjZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGVXICAgICBJVFROT1RJRllfREFUQShkb21haW5fY3JlYXRlVykKKyNkZWZpbmUgX19pdHRfZG9tYWluX2NyZWF0ZVdfcHRyIElUVE5PVElGWV9OQU1FKGRvbWFpbl9jcmVhdGVXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGUgICAgIElUVE5PVElGWV9EQVRBKGRvbWFpbl9jcmVhdGUpCisjZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGVfcHRyIElUVE5PVElGWV9OQU1FKGRvbWFpbl9jcmVhdGUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9kb21haW5fY3JlYXRlQShuYW1lKSAoX19pdHRfZG9tYWluKikwCisjZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGVXKG5hbWUpIChfX2l0dF9kb21haW4qKTAKKyNkZWZpbmUgX19pdHRfZG9tYWluX2NyZWF0ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9kb21haW5fY3JlYXRlKG5hbWUpICAoX19pdHRfZG9tYWluKikwCisjZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGVfcHRyIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9kb21haW5fY3JlYXRlQV9wdHIgMAorI2RlZmluZSBfX2l0dF9kb21haW5fY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGVfcHRyICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gZG9tYWlucyBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCBpZHMgSURzCisgKiBAaW5ncm91cCBwdWJsaWMKKyAqIElEcyBncm91cAorICogQHsKKyAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNwcmFnbWEgcGFjayhwdXNoLCA4KQorCit0eXBlZGVmIHN0cnVjdCBfX19pdHRfaWQKK3sKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgZDEsIGQyLCBkMzsKK30gX19pdHRfaWQ7CisKKyNwcmFnbWEgcGFjayhwb3ApCisvKiogQGVuZGNvbmQgKi8KKworc3RhdGljIGNvbnN0IF9faXR0X2lkIF9faXR0X251bGwgPSB7IDAsIDAsIDAgfTsKKworLyoqCisgKiBAaW5ncm91cCBpZHMKKyAqIEBicmllZiBBIGNvbnZlbmllbmNlIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIHRvIGNyZWF0ZSBhbiBJRCB3aXRob3V0IGRvbWFpbiBjb250cm9sLgorICogQGJyaWVmIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBmdW5jdGlvbiB0byBpbml0aWFsaXplIGFuIF9faXR0X2lkIHN0cnVjdHVyZS4gVGhpcyBmdW5jdGlvbgorICogZG9lcyBub3QgYWZmZWN0IHRoZSB0cmFjZSBjb2xsZWN0b3IgcnVudGltZSBpbiBhbnkgd2F5LiBBZnRlciB5b3UgbWFrZSB0aGUgSUQgd2l0aCB0aGlzCisgKiBmdW5jdGlvbiwgeW91IHN0aWxsIG11c3QgY3JlYXRlIGl0IHdpdGggdGhlIF9faXR0X2lkX2NyZWF0ZSBmdW5jdGlvbiBiZWZvcmUgdXNpbmcgdGhlIElECisgKiB0byBpZGVudGlmeSBhIG5hbWVkIGVudGl0eS4KKyAqIEBwYXJhbVtpbl0gYWRkciBUaGUgYWRkcmVzcyBvZiBvYmplY3Q7IGhpZ2ggUVdPUkQgb2YgdGhlIElEIHZhbHVlLgorICogQHBhcmFtW2luXSBleHRyYSBUaGUgZXh0cmEgZGF0YSB0byB1bmlxdWUgaWRlbnRpZnkgb2JqZWN0OyBsb3cgUVdPUkQgb2YgdGhlIElEIHZhbHVlLgorICovCisKK0lUVF9JTkxJTkUgX19pdHRfaWQgSVRUQVBJIF9faXR0X2lkX21ha2Uodm9pZCogYWRkciwgdW5zaWduZWQgbG9uZyBsb25nIGV4dHJhKSBJVFRfSU5MSU5FX0FUVFJJQlVURTsKK0lUVF9JTkxJTkUgX19pdHRfaWQgSVRUQVBJIF9faXR0X2lkX21ha2Uodm9pZCogYWRkciwgdW5zaWduZWQgbG9uZyBsb25nIGV4dHJhKQoreworICAgIF9faXR0X2lkIGlkID0gX19pdHRfbnVsbDsKKyAgICBpZC5kMSA9ICh1bnNpZ25lZCBsb25nIGxvbmcpKCh1aW50cHRyX3QpYWRkcik7CisgICAgaWQuZDIgPSAodW5zaWduZWQgbG9uZyBsb25nKWV4dHJhOworICAgIGlkLmQzID0gKHVuc2lnbmVkIGxvbmcgbG9uZykwOyAvKiBSZXNlcnZlZC4gTXVzdCBiZSB6ZXJvICovCisgICAgcmV0dXJuIGlkOworfQorCisvKioKKyAqIEBpbmdyb3VwIGlkcworICogQGJyaWVmIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBpZGVudGlmaWVyLgorICogVGhpcyBlc3RhYmxpc2hlcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaWZldGltZSBvZiBhbiBpbnN0YW5jZSBvZgorICogdGhlIGdpdmVuIElEIGluIHRoZSB0cmFjZS4gT25jZSB0aGlzIGxpZmV0aW1lIHN0YXJ0cywgdGhlIElECisgKiBjYW4gYmUgdXNlZCB0byB0YWcgbmFtZWQgZW50aXR5IGluc3RhbmNlcyBpbiBjYWxscyBzdWNoIGFzCisgKiBfX2l0dF90YXNrX2JlZ2luLCBhbmQgdG8gc3BlY2lmeSByZWxhdGlvbnNoaXBzIGFtb25nCisgKiBpZGVudGlmaWVkIG5hbWVkIGVudGl0eSBpbnN0YW5jZXMsIHVzaW5nIHRoZSBccmVmIHJlbGF0aW9ucyBBUElzLgorICogSW5zdGFuY2UgSURzIGFyZSBub3QgZG9tYWluIHNwZWNpZmljIQorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBjb250cm9sbGluZyB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgY2FsbC4KKyAqIEBwYXJhbVtpbl0gaWQgVGhlIElEIHRvIGNyZWF0ZS4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfaWRfY3JlYXRlKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGlkX2NyZWF0ZSwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCkpCisjZGVmaW5lIF9faXR0X2lkX2NyZWF0ZShkLHgpIElUVE5PVElGWV9WT0lEX0QxKGlkX2NyZWF0ZSxkLHgpCisjZGVmaW5lIF9faXR0X2lkX2NyZWF0ZV9wdHIgIElUVE5PVElGWV9OQU1FKGlkX2NyZWF0ZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2lkX2NyZWF0ZShkb21haW4saWQpCisjZGVmaW5lIF9faXR0X2lkX2NyZWF0ZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2lkX2NyZWF0ZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBpbmdyb3VwIGlkcworICogQGJyaWVmIERlc3Ryb3kgYW4gaW5zdGFuY2Ugb2YgaWRlbnRpZmllci4KKyAqIFRoaXMgZW5kcyB0aGUgbGlmZXRpbWUgb2YgdGhlIGN1cnJlbnQgaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIElEIHZhbHVlIGluIHRoZSB0cmFjZS4KKyAqIEFueSByZWxhdGlvbnNoaXBzIHRoYXQgYXJlIGVzdGFibGlzaGVkIGFmdGVyIHRoaXMgbGlmZXRpbWUgZW5kcyBhcmUgaW52YWxpZC4KKyAqIFRoaXMgY2FsbCBtdXN0IGJlIHBlcmZvcm1lZCBiZWZvcmUgdGhlIGdpdmVuIElEIHZhbHVlIGNhbiBiZSByZXVzZWQgZm9yIGEgZGlmZmVyZW50CisgKiBuYW1lZCBlbnRpdHkgaW5zdGFuY2UuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBleGVjdXRpb24gb2YgdGhpcyBjYWxsLgorICogQHBhcmFtW2luXSBpZCBUaGUgSUQgdG8gZGVzdHJveS4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfaWRfZGVzdHJveShjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBpZF9kZXN0cm95LCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkKSkKKyNkZWZpbmUgX19pdHRfaWRfZGVzdHJveShkLHgpIElUVE5PVElGWV9WT0lEX0QxKGlkX2Rlc3Ryb3ksZCx4KQorI2RlZmluZSBfX2l0dF9pZF9kZXN0cm95X3B0ciAgSVRUTk9USUZZX05BTUUoaWRfZGVzdHJveSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2lkX2Rlc3Ryb3koZG9tYWluLGlkKQorI2RlZmluZSBfX2l0dF9pZF9kZXN0cm95X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfaWRfZGVzdHJveV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IGlkcyBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCBoYW5kbGVzcyBTdHJpbmcgSGFuZGxlcworICogQGluZ3JvdXAgcHVibGljCisgKiBTdHJpbmcgSGFuZGxlcyBncm91cAorICogQHsKKyAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNwcmFnbWEgcGFjayhwdXNoLCA4KQorCit0eXBlZGVmIHN0cnVjdCBfX19pdHRfc3RyaW5nX2hhbmRsZQoreworICAgIGNvbnN0IGNoYXIqIHN0ckE7IC8qITwgQ29weSBvZiBvcmlnaW5hbCBzdHJpbmcgaW4gQVNDSUkuICovCisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorICAgIGNvbnN0IHdjaGFyX3QqIHN0clc7IC8qITwgQ29weSBvZiBvcmlnaW5hbCBzdHJpbmcgaW4gVU5JQ09ERS4gKi8KKyNlbHNlICAvKiBVTklDT0RFIHx8IF9VTklDT0RFICovCisgICAgdm9pZCogc3RyVzsKKyNlbmRpZiAvKiBVTklDT0RFIHx8IF9VTklDT0RFICovCisgICAgaW50ICAgZXh0cmExOyAvKiE8IFJlc2VydmVkLiBNdXN0IGJlIHplcm8gICAqLworICAgIHZvaWQqIGV4dHJhMjsgLyohPCBSZXNlcnZlZC4gTXVzdCBiZSB6ZXJvICAgKi8KKyAgICBzdHJ1Y3QgX19faXR0X3N0cmluZ19oYW5kbGUqIG5leHQ7Cit9IF9faXR0X3N0cmluZ19oYW5kbGU7CisKKyNwcmFnbWEgcGFjayhwb3ApCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAaW5ncm91cCBoYW5kbGVzCisgKiBAYnJpZWYgQ3JlYXRlIGEgc3RyaW5nIGhhbmRsZS4KKyAqIENyZWF0ZSBhbmQgcmV0dXJuIGhhbmRsZSB2YWx1ZSB0aGF0IGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggYSBzdHJpbmcuCisgKiBDb25zZWN1dGl2ZSBjYWxscyB0byBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZSB3aXRoIHRoZSBzYW1lIG5hbWUKKyAqIHJldHVybiB0aGUgc2FtZSB2YWx1ZS4gQmVjYXVzZSB0aGUgc2V0IG9mIHN0cmluZyBoYW5kbGVzIGlzIGV4cGVjdGVkIHRvIHJlbWFpbgorICogc3RhdGljIGR1cmluZyB0aGUgYXBwbGljYXRpb24ncyBleGVjdXRpb24gdGltZSwgdGhlcmUgaXMgbm8gbWVjaGFuaXNtIHRvIGRlc3Ryb3kgYSBzdHJpbmcgaGFuZGxlLgorICogQW55IHN0cmluZyBoYW5kbGUgY2FuIGJlIGFjY2Vzc2VkIGJ5IGFueSB0aHJlYWQgaW4gdGhlIHByb2Nlc3MsIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggdGhyZWFkIGNyZWF0ZWQKKyAqIHRoZSBzdHJpbmcgaGFuZGxlLiBUaGlzIGNhbGwgaXMgdGhyZWFkLXNhZmUuCisgKiBAcGFyYW1baW5dIG5hbWUgVGhlIGlucHV0IHN0cmluZworICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitfX2l0dF9zdHJpbmdfaGFuZGxlKiBJVFRBUEkgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGVBKGNvbnN0IGNoYXIgICAgKm5hbWUpOworX19pdHRfc3RyaW5nX2hhbmRsZSogSVRUQVBJIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlVyhjb25zdCB3Y2hhcl90ICpuYW1lKTsKKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjICBkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGUgICAgIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlVworIyAgZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlX3B0ciBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZVdfcHRyCisjZWxzZSAvKiBVTklDT0RFICovCisjICBkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGUgICAgIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlQQorIyAgZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlX3B0ciBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZUFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworX19pdHRfc3RyaW5nX2hhbmRsZSogSVRUQVBJIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUpOworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihJVFRBUEksIF9faXR0X3N0cmluZ19oYW5kbGUqLCBzdHJpbmdfaGFuZGxlX2NyZWF0ZUEsIChjb25zdCBjaGFyICAgICpuYW1lKSkKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfc3RyaW5nX2hhbmRsZSosIHN0cmluZ19oYW5kbGVfY3JlYXRlVywgKGNvbnN0IHdjaGFyX3QgKm5hbWUpKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9zdHJpbmdfaGFuZGxlKiwgc3RyaW5nX2hhbmRsZV9jcmVhdGUsICAoY29uc3QgY2hhciAgICAqbmFtZSkpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlQSAgICAgSVRUTk9USUZZX0RBVEEoc3RyaW5nX2hhbmRsZV9jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZUFfcHRyIElUVE5PVElGWV9OQU1FKHN0cmluZ19oYW5kbGVfY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGVXICAgICBJVFROT1RJRllfREFUQShzdHJpbmdfaGFuZGxlX2NyZWF0ZVcpCisjZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlV19wdHIgSVRUTk9USUZZX05BTUUoc3RyaW5nX2hhbmRsZV9jcmVhdGVXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlICAgICBJVFROT1RJRllfREFUQShzdHJpbmdfaGFuZGxlX2NyZWF0ZSkKKyNkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGVfcHRyIElUVE5PVElGWV9OQU1FKHN0cmluZ19oYW5kbGVfY3JlYXRlKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGVBKG5hbWUpIChfX2l0dF9zdHJpbmdfaGFuZGxlKikwCisjZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlQV9wdHIgMAorI2RlZmluZSBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZVcobmFtZSkgKF9faXR0X3N0cmluZ19oYW5kbGUqKTAKKyNkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGUobmFtZSkgIChfX2l0dF9zdHJpbmdfaGFuZGxlKikwCisjZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlX3B0ciAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IGhhbmRsZXMgZ3JvdXAgKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2l0dF90aW1lc3RhbXA7CisvKiogQGVuZGNvbmQgKi8KKworc3RhdGljIGNvbnN0IF9faXR0X3RpbWVzdGFtcCBfX2l0dF90aW1lc3RhbXBfbm9uZSA9IChfX2l0dF90aW1lc3RhbXApLTFMTDsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9ncGFfZG9jdW1lbnRhdGlvbiAqLworCisvKioKKyAqIEBpbmdyb3VwIHRpbWVzdGFtcHMKKyAqIEBicmllZiBSZXR1cm4gdGltZXN0YW1wIGNvcnJlc3BvbmRpbmcgdG8gY3VycmVudCBtb21lbnQuCisgKiBUaGlzIHJldHVybnMgdGhlIHRpbWVzdGFtcCBpbiBmb3JtYXQgdGhhdCBpcyBtb3N0IHJlbGV2YW50IGZvciB0aGUgY3VycmVudAorICogaG9zdCBvciBwbGF0Zm9ybS4gIERvIG5vdCByZWx5IHRoYXQgaXQncyBSRFRTQyB2YWx1ZS4gIEl0IGlzIHBvc3NpYmxlCisgKiB0byBjb21wYXJlIF9faXR0X3RpbWVzdGFtcCB2YWx1ZXMgd2l0aCAiPCIgb3BlcmF0b3IuCisgKi8KK19faXR0X3RpbWVzdGFtcCBJVFRBUEkgX19pdHRfZ2V0X3RpbWVzdGFtcCh2b2lkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF90aW1lc3RhbXAsIGdldF90aW1lc3RhbXAsICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfZ2V0X3RpbWVzdGFtcCAgICAgIElUVE5PVElGWV9EQVRBKGdldF90aW1lc3RhbXApCisjZGVmaW5lIF9faXR0X2dldF90aW1lc3RhbXBfcHRyICBJVFROT1RJRllfTkFNRShnZXRfdGltZXN0YW1wKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfZ2V0X3RpbWVzdGFtcCgpCisjZGVmaW5lIF9faXR0X2dldF90aW1lc3RhbXBfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9nZXRfdGltZXN0YW1wX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gdGltZXN0YW1wcyAqLworLyoqIEBlbmRjb25kICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZ3BhX2RvY3VtZW50YXRpb24gKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgcmVnaW9ucyBSZWdpb25zCisgKiBAaW5ncm91cCBwdWJsaWMKKyAqIFJlZ2lvbnMgZ3JvdXAKKyAqIEB7CisgKi8KKy8qKgorICogQGluZ3JvdXAgcmVnaW9ucworICogQGJyaWVmIEJlZ2luIG9mIHJlZ2lvbiBpbnN0YW5jZS4KKyAqIFN1Y2Nlc3NpdmUgY2FsbHMgdG8gX19pdHRfcmVnaW9uX2JlZ2luIHdpdGggdGhlIHNhbWUgSUQgYXJlIGlnbm9yZWQKKyAqIHVudGlsIGEgY2FsbCB0byBfX2l0dF9yZWdpb25fZW5kIHdpdGggdGhlIHNhbWUgSUQKKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gZm9yIHRoaXMgcmVnaW9uIGluc3RhbmNlCisgKiBAcGFyYW1baW5dIGlkIFRoZSBpbnN0YW5jZSBJRCBmb3IgdGhpcyByZWdpb24gaW5zdGFuY2UuIE11c3Qgbm90IGJlIF9faXR0X251bGwKKyAqIEBwYXJhbVtpbl0gcGFyZW50aWQgVGhlIGluc3RhbmNlIElEIGZvciB0aGUgcGFyZW50IG9mIHRoaXMgcmVnaW9uIGluc3RhbmNlLCBvciBfX2l0dF9udWxsCisgKiBAcGFyYW1baW5dIG5hbWUgVGhlIG5hbWUgb2YgdGhpcyByZWdpb24KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfcmVnaW9uX2JlZ2luKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfaWQgcGFyZW50aWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUpOworCisvKioKKyAqIEBpbmdyb3VwIHJlZ2lvbnMKKyAqIEBicmllZiBFbmQgb2YgcmVnaW9uIGluc3RhbmNlLgorICogVGhlIGZpcnN0IGNhbGwgdG8gX19pdHRfcmVnaW9uX2VuZCB3aXRoIGEgZ2l2ZW4gSUQgZW5kcyB0aGUKKyAqIHJlZ2lvbi4gU3VjY2Vzc2l2ZSBjYWxscyB3aXRoIHRoZSBzYW1lIElEIGFyZSBpZ25vcmVkLCBhcyBhcmUKKyAqIGNhbGxzIHRoYXQgZG8gbm90IGhhdmUgYSBtYXRjaGluZyBfX2l0dF9yZWdpb25fYmVnaW4gY2FsbC4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gZm9yIHRoaXMgcmVnaW9uIGluc3RhbmNlCisgKiBAcGFyYW1baW5dIGlkIFRoZSBpbnN0YW5jZSBJRCBmb3IgdGhpcyByZWdpb24gaW5zdGFuY2UKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfcmVnaW9uX2VuZChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCByZWdpb25fYmVnaW4sIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X2lkIHBhcmVudGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHJlZ2lvbl9lbmQsICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCkpCisjZGVmaW5lIF9faXR0X3JlZ2lvbl9iZWdpbihkLHgseSx6KSBJVFROT1RJRllfVk9JRF9EMyhyZWdpb25fYmVnaW4sZCx4LHkseikKKyNkZWZpbmUgX19pdHRfcmVnaW9uX2JlZ2luX3B0ciAgICAgIElUVE5PVElGWV9OQU1FKHJlZ2lvbl9iZWdpbikKKyNkZWZpbmUgX19pdHRfcmVnaW9uX2VuZChkLHgpICAgICAgIElUVE5PVElGWV9WT0lEX0QxKHJlZ2lvbl9lbmQsZCx4KQorI2RlZmluZSBfX2l0dF9yZWdpb25fZW5kX3B0ciAgICAgICAgSVRUTk9USUZZX05BTUUocmVnaW9uX2VuZCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3JlZ2lvbl9iZWdpbihkLHgseSx6KQorI2RlZmluZSBfX2l0dF9yZWdpb25fYmVnaW5fcHRyIDAKKyNkZWZpbmUgX19pdHRfcmVnaW9uX2VuZChkLHgpCisjZGVmaW5lIF9faXR0X3JlZ2lvbl9lbmRfcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3JlZ2lvbl9iZWdpbl9wdHIgMAorI2RlZmluZSBfX2l0dF9yZWdpb25fZW5kX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSByZWdpb25zIGdyb3VwICovCisKKy8qKgorICogQGRlZmdyb3VwIGZyYW1lcyBGcmFtZXMKKyAqIEBpbmdyb3VwIHB1YmxpYworICogRnJhbWVzIGFyZSBzaW1pbGFyIHRvIHJlZ2lvbnMsIGJ1dCBhcmUgaW50ZW5kZWQgdG8gYmUgZWFzaWVyIHRvIHVzZSBhbmQgdG8gaW1wbGVtZW50LgorICogSW4gcGFydGljdWxhcjoKKyAqIC0gRnJhbWVzIGFsd2F5cyByZXByZXNlbnQgcGVyaW9kcyBvZiBlbGFwc2VkIHRpbWUKKyAqIC0gQnkgZGVmYXVsdCwgZnJhbWVzIGhhdmUgbm8gbmVzdGluZyByZWxhdGlvbnNoaXBzCisgKiBAeworICovCisKKy8qKgorICogQGluZ3JvdXAgZnJhbWVzCisgKiBAYnJpZWYgQmVnaW4gYSBmcmFtZSBpbnN0YW5jZS4KKyAqIFN1Y2Nlc3NpdmUgY2FsbHMgdG8gX19pdHRfZnJhbWVfYmVnaW4gd2l0aCB0aGUKKyAqIHNhbWUgSUQgYXJlIGlnbm9yZWQgdW50aWwgYSBjYWxsIHRvIF9faXR0X2ZyYW1lX2VuZCB3aXRoIHRoZSBzYW1lIElELgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBmb3IgdGhpcyBmcmFtZSBpbnN0YW5jZQorICogQHBhcmFtW2luXSBpZCBUaGUgaW5zdGFuY2UgSUQgZm9yIHRoaXMgZnJhbWUgaW5zdGFuY2Ugb3IgTlVMTAorICovCit2b2lkIElUVEFQSSBfX2l0dF9mcmFtZV9iZWdpbl92Myhjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgKmlkKTsKKworLyoqCisgKiBAaW5ncm91cCBmcmFtZXMKKyAqIEBicmllZiBFbmQgYSBmcmFtZSBpbnN0YW5jZS4KKyAqIFRoZSBmaXJzdCBjYWxsIHRvIF9faXR0X2ZyYW1lX2VuZCB3aXRoIGEgZ2l2ZW4gSUQKKyAqIGVuZHMgdGhlIGZyYW1lLiBTdWNjZXNzaXZlIGNhbGxzIHdpdGggdGhlIHNhbWUgSUQgYXJlIGlnbm9yZWQsIGFzIGFyZQorICogY2FsbHMgdGhhdCBkbyBub3QgaGF2ZSBhIG1hdGNoaW5nIF9faXR0X2ZyYW1lX2JlZ2luIGNhbGwuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGZvciB0aGlzIGZyYW1lIGluc3RhbmNlCisgKiBAcGFyYW1baW5dIGlkIFRoZSBpbnN0YW5jZSBJRCBmb3IgdGhpcyBmcmFtZSBpbnN0YW5jZSBvciBOVUxMIGZvciBjdXJyZW50CisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2ZyYW1lX2VuZF92Myhjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgKmlkKTsKKworLyoqCisgKiBAaW5ncm91cCBmcmFtZXMKKyAqIEBicmllZiBTdWJtaXRzIGEgZnJhbWUgaW5zdGFuY2UuCisgKiBTdWNjZXNzaXZlIGNhbGxzIHRvIF9faXR0X2ZyYW1lX2JlZ2luIG9yIF9faXR0X2ZyYW1lX3N1Ym1pdCB3aXRoIHRoZQorICogc2FtZSBJRCBhcmUgaWdub3JlZCB1bnRpbCBhIGNhbGwgdG8gX19pdHRfZnJhbWVfZW5kIG9yIF9faXR0X2ZyYW1lX3N1Ym1pdAorICogd2l0aCB0aGUgc2FtZSBJRC4KKyAqIFBhc3Npbmcgc3BlY2lhbCBfX2l0dF90aW1lc3RhbXBfbm9uZSB2YWx1ZSBhcyAiZW5kIiBhcmd1bWVudCBtZWFucworICogdGFrZSB0aGUgY3VycmVudCB0aW1lc3RhbXAgYXMgdGhlIGVuZCB0aW1lc3RhbXAuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGZvciB0aGlzIGZyYW1lIGluc3RhbmNlCisgKiBAcGFyYW1baW5dIGlkIFRoZSBpbnN0YW5jZSBJRCBmb3IgdGhpcyBmcmFtZSBpbnN0YW5jZSBvciBOVUxMCisgKiBAcGFyYW1baW5dIGJlZ2luIFRpbWVzdGFtcCBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmcmFtZQorICogQHBhcmFtW2luXSBlbmQgVGltZXN0YW1wIG9mIHRoZSBlbmQgb2YgdGhlIGZyYW1lCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2ZyYW1lX3N1Ym1pdF92Myhjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgKmlkLAorICAgIF9faXR0X3RpbWVzdGFtcCBiZWdpbiwgX19pdHRfdGltZXN0YW1wIGVuZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGZyYW1lX2JlZ2luX3YzLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkICppZCkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmcmFtZV9lbmRfdjMsICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCAqaWQpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgZnJhbWVfc3VibWl0X3YzLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkICppZCwgX19pdHRfdGltZXN0YW1wIGJlZ2luLCBfX2l0dF90aW1lc3RhbXAgZW5kKSkKKyNkZWZpbmUgX19pdHRfZnJhbWVfYmVnaW5fdjMoZCx4KSAgIElUVE5PVElGWV9WT0lEX0QxKGZyYW1lX2JlZ2luX3YzLGQseCkKKyNkZWZpbmUgX19pdHRfZnJhbWVfYmVnaW5fdjNfcHRyICAgIElUVE5PVElGWV9OQU1FKGZyYW1lX2JlZ2luX3YzKQorI2RlZmluZSBfX2l0dF9mcmFtZV9lbmRfdjMoZCx4KSAgICAgSVRUTk9USUZZX1ZPSURfRDEoZnJhbWVfZW5kX3YzLGQseCkKKyNkZWZpbmUgX19pdHRfZnJhbWVfZW5kX3YzX3B0ciAgICAgIElUVE5PVElGWV9OQU1FKGZyYW1lX2VuZF92MykKKyNkZWZpbmUgX19pdHRfZnJhbWVfc3VibWl0X3YzKGQseCxiLGUpIElUVE5PVElGWV9WT0lEX0QzKGZyYW1lX3N1Ym1pdF92MyxkLHgsYixlKQorI2RlZmluZSBfX2l0dF9mcmFtZV9zdWJtaXRfdjNfcHRyICAgICAgSVRUTk9USUZZX05BTUUoZnJhbWVfc3VibWl0X3YzKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfZnJhbWVfYmVnaW5fdjMoZG9tYWluLGlkKQorI2RlZmluZSBfX2l0dF9mcmFtZV9iZWdpbl92M19wdHIgMAorI2RlZmluZSBfX2l0dF9mcmFtZV9lbmRfdjMoZG9tYWluLGlkKQorI2RlZmluZSBfX2l0dF9mcmFtZV9lbmRfdjNfcHRyICAgMAorI2RlZmluZSBfX2l0dF9mcmFtZV9zdWJtaXRfdjMoZG9tYWluLGlkLGJlZ2luLGVuZCkKKyNkZWZpbmUgX19pdHRfZnJhbWVfc3VibWl0X3YzX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9mcmFtZV9iZWdpbl92M19wdHIgMAorI2RlZmluZSBfX2l0dF9mcmFtZV9lbmRfdjNfcHRyICAgMAorI2RlZmluZSBfX2l0dF9mcmFtZV9zdWJtaXRfdjNfcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IGZyYW1lcyBncm91cCAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGRlZmdyb3VwIHRhc2tncm91cCBUYXNrIEdyb3VwCisgKiBAaW5ncm91cCBwdWJsaWMKKyAqIFRhc2sgR3JvdXAKKyAqIEB7CisgKi8KKy8qKgorICogQGluZ3JvdXAgdGFza19ncm91cHMKKyAqIEBicmllZiBEZW5vdGVzIGEgdGFza19ncm91cCBpbnN0YW5jZS4KKyAqIFN1Y2Nlc3NpdmUgY2FsbHMgdG8gX19pdHRfdGFza19ncm91cCB3aXRoIHRoZSBzYW1lIElEIGFyZSBpZ25vcmVkLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBmb3IgdGhpcyB0YXNrX2dyb3VwIGluc3RhbmNlCisgKiBAcGFyYW1baW5dIGlkIFRoZSBpbnN0YW5jZSBJRCBmb3IgdGhpcyB0YXNrX2dyb3VwIGluc3RhbmNlLiBNdXN0IG5vdCBiZSBfX2l0dF9udWxsLgorICogQHBhcmFtW2luXSBwYXJlbnRpZCBUaGUgaW5zdGFuY2UgSUQgZm9yIHRoZSBwYXJlbnQgb2YgdGhpcyB0YXNrX2dyb3VwIGluc3RhbmNlLCBvciBfX2l0dF9udWxsLgorICogQHBhcmFtW2luXSBuYW1lIFRoZSBuYW1lIG9mIHRoaXMgdGFza19ncm91cAorICovCit2b2lkIElUVEFQSSBfX2l0dF90YXNrX2dyb3VwKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfaWQgcGFyZW50aWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2dyb3VwLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9pZCBwYXJlbnRpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSkpCisjZGVmaW5lIF9faXR0X3Rhc2tfZ3JvdXAoZCx4LHkseikgSVRUTk9USUZZX1ZPSURfRDModGFza19ncm91cCxkLHgseSx6KQorI2RlZmluZSBfX2l0dF90YXNrX2dyb3VwX3B0ciAgICAgIElUVE5PVElGWV9OQU1FKHRhc2tfZ3JvdXApCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF90YXNrX2dyb3VwKGQseCx5LHopCisjZGVmaW5lIF9faXR0X3Rhc2tfZ3JvdXBfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF90YXNrX2dyb3VwX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gdGFza2dyb3VwIGdyb3VwICovCisKKy8qKgorICogQGRlZmdyb3VwIHRhc2tzIFRhc2tzCisgKiBAaW5ncm91cCBwdWJsaWMKKyAqIEEgdGFzayBpbnN0YW5jZSByZXByZXNlbnRzIGEgcGllY2Ugb2Ygd29yayBwZXJmb3JtZWQgYnkgYSBwYXJ0aWN1bGFyCisgKiB0aHJlYWQgZm9yIGEgcGVyaW9kIG9mIHRpbWUuIEEgY2FsbCB0byBfX2l0dF90YXNrX2JlZ2luIGNyZWF0ZXMgYQorICogdGFzayBpbnN0YW5jZS4gVGhpcyBiZWNvbWVzIHRoZSBjdXJyZW50IGluc3RhbmNlIGZvciB0aGF0IHRhc2sgb24gdGhhdAorICogdGhyZWFkLiBBIGZvbGxvd2luZyBjYWxsIHRvIF9faXR0X3Rhc2tfZW5kIG9uIHRoZSBzYW1lIHRocmVhZCBlbmRzIHRoZQorICogaW5zdGFuY2UuIFRoZXJlIG1heSBiZSBtdWx0aXBsZSBzaW11bHRhbmVvdXMgaW5zdGFuY2VzIG9mIHRhc2tzIHdpdGggdGhlCisgKiBzYW1lIG5hbWUgb24gZGlmZmVyZW50IHRocmVhZHMuIElmIGFuIElEIGlzIHNwZWNpZmllZCwgdGhlIHRhc2sgaW5zdGFuY2UKKyAqIHJlY2VpdmVzIHRoYXQgSUQuIE5lc3RlZCB0YXNrcyBhcmUgYWxsb3dlZC4KKyAqCisgKiBOb3RlOiBUaGUgdGFzayBpcyBkZWZpbmVkIGJ5IHRoZSBicmFja2V0aW5nIG9mIF9faXR0X3Rhc2tfYmVnaW4gYW5kCisgKiBfX2l0dF90YXNrX2VuZCBvbiB0aGUgc2FtZSB0aHJlYWQuIElmIHNvbWUgc2NoZWR1bGluZyBtZWNoYW5pc20gY2F1c2VzCisgKiB0YXNrIHN3aXRjaGluZyAodGhlIHRocmVhZCBleGVjdXRlcyBhIGRpZmZlcmVudCB1c2VyIHRhc2spIG9yIHRhc2sKKyAqIHN3aXRjaGluZyAodGhlIHVzZXIgdGFzayBzd2l0Y2hlcyB0byBhIGRpZmZlcmVudCB0aHJlYWQpIHRoZW4gdGhpcyBicmVha3MKKyAqIHRoZSBub3Rpb24gb2YgIGN1cnJlbnQgaW5zdGFuY2UuIEFkZGl0aW9uYWwgQVBJIGNhbGxzIGFyZSByZXF1aXJlZCB0bworICogZGVhbCB3aXRoIHRoYXQgcG9zc2liaWxpdHkuCisgKiBAeworICovCisKKy8qKgorICogQGluZ3JvdXAgdGFza3MKKyAqIEBicmllZiBCZWdpbiBhIHRhc2sgaW5zdGFuY2UuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGZvciB0aGlzIHRhc2sKKyAqIEBwYXJhbVtpbl0gdGFza2lkIFRoZSBpbnN0YW5jZSBJRCBmb3IgdGhpcyB0YXNrIGluc3RhbmNlLCBvciBfX2l0dF9udWxsCisgKiBAcGFyYW1baW5dIHBhcmVudGlkIFRoZSBwYXJlbnQgaW5zdGFuY2UgdG8gd2hpY2ggdGhpcyB0YXNrIGluc3RhbmNlIGJlbG9uZ3MsIG9yIF9faXR0X251bGwKKyAqIEBwYXJhbVtpbl0gbmFtZSBUaGUgbmFtZSBvZiB0aGlzIHRhc2sKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfdGFza19iZWdpbihjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgdGFza2lkLCBfX2l0dF9pZCBwYXJlbnRpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSk7CisKKy8qKgorICogQGluZ3JvdXAgdGFza3MKKyAqIEBicmllZiBCZWdpbiBhIHRhc2sgaW5zdGFuY2UuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGZvciB0aGlzIHRhc2sKKyAqIEBwYXJhbVtpbl0gdGFza2lkIFRoZSBpZGVudGlmaWVyIGZvciB0aGlzIHRhc2sgaW5zdGFuY2UgKG1heSBiZSAwKQorICogQHBhcmFtW2luXSBwYXJlbnRpZCBUaGUgcGFyZW50IG9mIHRoaXMgdGFzayAobWF5IGJlIDApCisgKiBAcGFyYW1baW5dIGZuIFRoZSBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB5b3UgYXJlIHRyYWNpbmcKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfdGFza19iZWdpbl9mbihjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgdGFza2lkLCBfX2l0dF9pZCBwYXJlbnRpZCwgdm9pZCogZm4pOworCisvKioKKyAqIEBpbmdyb3VwIHRhc2tzCisgKiBAYnJpZWYgRW5kIHRoZSBjdXJyZW50IHRhc2sgaW5zdGFuY2UuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGZvciB0aGlzIHRhc2sKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfdGFza19lbmQoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4pOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2JlZ2luLCAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9pZCBwYXJlbnRpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2JlZ2luX2ZuLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9pZCBwYXJlbnRpZCwgdm9pZCogZm4pKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19lbmQsICAgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluKSkKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbihkLHgseSx6KSAgICBJVFROT1RJRllfVk9JRF9EMyh0YXNrX2JlZ2luLGQseCx5LHopCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fcHRyICAgICAgICAgSVRUTk9USUZZX05BTUUodGFza19iZWdpbikKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9mbihkLHgseSx6KSBJVFROT1RJRllfVk9JRF9EMyh0YXNrX2JlZ2luX2ZuLGQseCx5LHopCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fZm5fcHRyICAgICAgSVRUTk9USUZZX05BTUUodGFza19iZWdpbl9mbikKKyNkZWZpbmUgX19pdHRfdGFza19lbmQoZCkgICAgICAgICAgICBJVFROT1RJRllfVk9JRF9EMCh0YXNrX2VuZCxkKQorI2RlZmluZSBfX2l0dF90YXNrX2VuZF9wdHIgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHRhc2tfZW5kKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbihkb21haW4saWQscGFyZW50aWQsbmFtZSkKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9wdHIgICAgMAorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX2ZuKGRvbWFpbixpZCxwYXJlbnRpZCxmbikKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9mbl9wdHIgMAorI2RlZmluZSBfX2l0dF90YXNrX2VuZChkb21haW4pCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kX3B0ciAgICAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX3B0ciAgICAwCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fZm5fcHRyIDAKKyNkZWZpbmUgX19pdHRfdGFza19lbmRfcHRyICAgICAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IHRhc2tzIGdyb3VwICovCisKKy8qKgorICogQGRlZmdyb3VwIGNvdW50ZXJzIENvdW50ZXJzCisgKiBAaW5ncm91cCBwdWJsaWMKKyAqIENvdW50ZXJzIGFyZSB1c2VyLWRlZmluZWQgb2JqZWN0cyB3aXRoIGEgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nCisgKiB2YWx1ZS4gQ291bnRlciB2YWx1ZXMgYXJlIDY0LWJpdCB1bnNpZ25lZCBpbnRlZ2Vycy4gQ291bnRlciB2YWx1ZXMKKyAqIGFyZSB0cmFja2VkIHBlci10aHJlYWQuIENvdW50ZXJzIGhhdmUgbmFtZXMgdGhhdCBjYW4gYmUgZGlzcGxheWVkIGluCisgKiB0aGUgdG9vbHMuCisgKiBAeworICovCisKKy8qKgorICogQGluZ3JvdXAgY291bnRlcnMKKyAqIEBicmllZiBJbmNyZW1lbnQgYSBjb3VudGVyIGJ5IG9uZS4KKyAqIFRoZSBmaXJzdCBjYWxsIHdpdGggYSBnaXZlbiBuYW1lIGNyZWF0ZXMgYSBjb3VudGVyIGJ5IHRoYXQgbmFtZSBhbmQgc2V0cyBpdHMKKyAqIHZhbHVlIHRvIHplcm8gb24gZXZlcnkgdGhyZWFkLiBTdWNjZXNzaXZlIGNhbGxzIGluY3JlbWVudCB0aGUgY291bnRlciB2YWx1ZQorICogb24gdGhlIHRocmVhZCBvbiB3aGljaCB0aGUgY2FsbCBpcyBpc3N1ZWQuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBjYWxsLiBDb3VudGVyIG5hbWVzIGFyZSBub3QgZG9tYWluIHNwZWNpZmljLgorICogICAgICAgICAgICBUaGUgZG9tYWluIGFyZ3VtZW50IGlzIHVzZWQgb25seSB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgQVBJIGNhbGxzLgorICogQHBhcmFtW2luXSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBjb3VudGVyCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2NvdW50ZXJfaW5jX3YzKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lKTsKKworLyoqCisgKiBAaW5ncm91cCBjb3VudGVycworICogQGJyaWVmIEluY3JlbWVudCBhIGNvdW50ZXIgYnkgdGhlIHZhbHVlIHNwZWNpZmllZCBpbiBkZWx0YS4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gY29udHJvbGxpbmcgdGhlIGNhbGwuIENvdW50ZXIgbmFtZXMgYXJlIG5vdCBkb21haW4gc3BlY2lmaWMuCisgKiAgICAgICAgICAgIFRoZSBkb21haW4gYXJndW1lbnQgaXMgdXNlZCBvbmx5IHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBBUEkgY2FsbHMuCisgKiBAcGFyYW1baW5dIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGNvdW50ZXIKKyAqIEBwYXJhbVtpbl0gZGVsdGEgVGhlIGFtb3VudCBieSB3aGljaCB0byBpbmNyZW1lbnQgdGhlIGNvdW50ZXIKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfY291bnRlcl9pbmNfZGVsdGFfdjMoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUsIHVuc2lnbmVkIGxvbmcgbG9uZyBkZWx0YSk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGNvdW50ZXJfaW5jX3YzLCAgICAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgY291bnRlcl9pbmNfZGVsdGFfdjMsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSwgdW5zaWduZWQgbG9uZyBsb25nIGRlbHRhKSkKKyNkZWZpbmUgX19pdHRfY291bnRlcl9pbmNfdjMoZCx4KSAgICAgICAgIElUVE5PVElGWV9WT0lEX0QxKGNvdW50ZXJfaW5jX3YzLGQseCkKKyNkZWZpbmUgX19pdHRfY291bnRlcl9pbmNfdjNfcHRyICAgICAgICAgIElUVE5PVElGWV9OQU1FKGNvdW50ZXJfaW5jX3YzKQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2luY19kZWx0YV92MyhkLHgseSkgSVRUTk9USUZZX1ZPSURfRDIoY291bnRlcl9pbmNfZGVsdGFfdjMsZCx4LHkpCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfaW5jX2RlbHRhX3YzX3B0ciAgICBJVFROT1RJRllfTkFNRShjb3VudGVyX2luY19kZWx0YV92MykKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfaW5jX3YzKGRvbWFpbixuYW1lKQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2luY192M19wdHIgICAgICAgMAorI2RlZmluZSBfX2l0dF9jb3VudGVyX2luY19kZWx0YV92Myhkb21haW4sbmFtZSxkZWx0YSkKKyNkZWZpbmUgX19pdHRfY291bnRlcl9pbmNfZGVsdGFfdjNfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9jb3VudGVyX2luY192M19wdHIgICAgICAgMAorI2RlZmluZSBfX2l0dF9jb3VudGVyX2luY19kZWx0YV92M19wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IGNvdW50ZXJzIGdyb3VwICovCisKKy8qKgorICogQGRlZmdyb3VwIG1hcmtlcnMgTWFya2VycworICogTWFya2VycyByZXByZXNlbnQgYSBzaW5nbGUgZGlzY3JlZXQgZXZlbnQgaW4gdGltZS4gTWFya2VycyBoYXZlIGEgc2NvcGUsCisgKiBkZXNjcmliZWQgYnkgYW4gZW51bWVyYXRlZCB0eXBlIF9faXR0X3Njb3BlLiBNYXJrZXJzIGFyZSBjcmVhdGVkIGJ5CisgKiB0aGUgQVBJIGNhbGwgX19pdHRfbWFya2VyLiBBIG1hcmtlciBpbnN0YW5jZSBjYW4gYmUgZ2l2ZW4gYW4gSUQgZm9yIHVzZSBpbgorICogYWRkaW5nIG1ldGFkYXRhLgorICogQHsKKyAqLworCisvKioKKyAqIEBicmllZiBEZXNjcmliZXMgdGhlIHNjb3BlIG9mIGFuIGV2ZW50IG9iamVjdCBpbiB0aGUgdHJhY2UuCisgKi8KK3R5cGVkZWYgZW51bQoreworICAgIF9faXR0X3Njb3BlX3Vua25vd24gPSAwLAorICAgIF9faXR0X3Njb3BlX2dsb2JhbCwKKyAgICBfX2l0dF9zY29wZV90cmFja19ncm91cCwKKyAgICBfX2l0dF9zY29wZV90cmFjaywKKyAgICBfX2l0dF9zY29wZV90YXNrLAorICAgIF9faXR0X3Njb3BlX21hcmtlcgorfSBfX2l0dF9zY29wZTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjZGVmaW5lIF9faXR0X21hcmtlcl9zY29wZV91bmtub3duICBfX2l0dF9zY29wZV91bmtub3duCisjZGVmaW5lIF9faXR0X21hcmtlcl9zY29wZV9nbG9iYWwgICBfX2l0dF9zY29wZV9nbG9iYWwKKyNkZWZpbmUgX19pdHRfbWFya2VyX3Njb3BlX3Byb2Nlc3MgIF9faXR0X3Njb3BlX3RyYWNrX2dyb3VwCisjZGVmaW5lIF9faXR0X21hcmtlcl9zY29wZV90aHJlYWQgICBfX2l0dF9zY29wZV90cmFjaworI2RlZmluZSBfX2l0dF9tYXJrZXJfc2NvcGVfdGFzayAgICAgX19pdHRfc2NvcGVfdGFzaworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGluZ3JvdXAgbWFya2VycworICogQGJyaWVmIENyZWF0ZSBhIG1hcmtlciBpbnN0YW5jZQorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBmb3IgdGhpcyBtYXJrZXIKKyAqIEBwYXJhbVtpbl0gaWQgVGhlIGluc3RhbmNlIElEIGZvciB0aGlzIG1hcmtlciBvciBfX2l0dF9udWxsCisgKiBAcGFyYW1baW5dIG5hbWUgVGhlIG5hbWUgZm9yIHRoaXMgbWFya2VyCisgKiBAcGFyYW1baW5dIHNjb3BlIFRoZSBzY29wZSBmb3IgdGhpcyBtYXJrZXIKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfbWFya2VyKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSwgX19pdHRfc2NvcGUgc2NvcGUpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtYXJrZXIsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUsIF9faXR0X3Njb3BlIHNjb3BlKSkKKyNkZWZpbmUgX19pdHRfbWFya2VyKGQseCx5LHopIElUVE5PVElGWV9WT0lEX0QzKG1hcmtlcixkLHgseSx6KQorI2RlZmluZSBfX2l0dF9tYXJrZXJfcHRyICAgICAgSVRUTk9USUZZX05BTUUobWFya2VyKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbWFya2VyKGRvbWFpbixpZCxuYW1lLHNjb3BlKQorI2RlZmluZSBfX2l0dF9tYXJrZXJfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9tYXJrZXJfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSBtYXJrZXJzIGdyb3VwICovCisKKy8qKgorICogQGRlZmdyb3VwIG1ldGFkYXRhIE1ldGFkYXRhCisgKiBUaGUgbWV0YWRhdGEgQVBJIGlzIHVzZWQgdG8gYXR0YWNoIGV4dHJhIGluZm9ybWF0aW9uIHRvIG5hbWVkCisgKiBlbnRpdGllcy4gTWV0YWRhdGEgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIGlkZW50aWZpZWQgbmFtZWQgZW50aXR5IGJ5IElELAorICogb3IgdG8gdGhlIGN1cnJlbnQgZW50aXR5ICh3aGljaCBpcyBhbHdheXMgYSB0YXNrKS4KKyAqCisgKiBDb25jZXB0dWFsbHkgbWV0YWRhdGEgaGFzIGEgdHlwZSAod2hhdCBraW5kIG9mIG1ldGFkYXRhKSwgYSBrZXkgKHRoZQorICogbmFtZSBvZiB0aGUgbWV0YWRhdGEpLCBhbmQgYSB2YWx1ZSAodGhlIGFjdHVhbCBkYXRhKS4gVGhlIGVuY29kaW5nIG9mCisgKiB0aGUgdmFsdWUgZGVwZW5kcyBvbiB0aGUgdHlwZSBvZiB0aGUgbWV0YWRhdGEuCisgKgorICogVGhlIHR5cGUgb2YgbWV0YWRhdGEgaXMgc3BlY2lmaWVkIGJ5IGFuIGVudW1lcmF0ZWQgdHlwZSBfX2l0dF9tZXRkYXRhX3R5cGUuCisgKiBAeworICovCisKKy8qKgorICogQGluZ3JvdXAgcGFyYW1ldGVycworICogQGJyaWVmIGRlc2NyaWJlcyB0aGUgdHlwZSBvZiBtZXRhZGF0YQorICovCit0eXBlZGVmIGVudW0geworICAgIF9faXR0X21ldGFkYXRhX3Vua25vd24gPSAwLAorICAgIF9faXR0X21ldGFkYXRhX3U2NCwgICAgIC8qKjwgVW5zaWduZWQgNjQtYml0IGludGVnZXIgKi8KKyAgICBfX2l0dF9tZXRhZGF0YV9zNjQsICAgICAvKio8IFNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLworICAgIF9faXR0X21ldGFkYXRhX3UzMiwgICAgIC8qKjwgVW5zaWduZWQgMzItYml0IGludGVnZXIgKi8KKyAgICBfX2l0dF9tZXRhZGF0YV9zMzIsICAgICAvKio8IFNpZ25lZCAzMi1iaXQgaW50ZWdlciAqLworICAgIF9faXR0X21ldGFkYXRhX3UxNiwgICAgIC8qKjwgVW5zaWduZWQgMTYtYml0IGludGVnZXIgKi8KKyAgICBfX2l0dF9tZXRhZGF0YV9zMTYsICAgICAvKio8IFNpZ25lZCAxNi1iaXQgaW50ZWdlciAqLworICAgIF9faXR0X21ldGFkYXRhX2Zsb2F0LCAgIC8qKjwgU2lnbmVkIDMyLWJpdCBmbG9hdGluZy1wb2ludCAqLworICAgIF9faXR0X21ldGFkYXRhX2RvdWJsZSAgIC8qKjwgU0lnbmVkIDY0LWJpdCBmbG9hdGluZy1wb2ludCAqLworfSBfX2l0dF9tZXRhZGF0YV90eXBlOworCisvKioKKyAqIEBpbmdyb3VwIHBhcmFtZXRlcnMKKyAqIEBicmllZiBBZGQgbWV0YWRhdGEgdG8gYW4gaW5zdGFuY2Ugb2YgYSBuYW1lZCBlbnRpdHkuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBjYWxsCisgKiBAcGFyYW1baW5dIGlkIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBpbnN0YW5jZSB0byB3aGljaCB0aGUgbWV0YWRhdGEgaXMgdG8gYmUgYWRkZWQsIG9yIF9faXR0X251bGwgdG8gYWRkIHRvIHRoZSBjdXJyZW50IHRhc2sKKyAqIEBwYXJhbVtpbl0ga2V5IFRoZSBuYW1lIG9mIHRoZSBtZXRhZGF0YQorICogQHBhcmFtW2luXSB0eXBlIFRoZSB0eXBlIG9mIHRoZSBtZXRhZGF0YQorICogQHBhcmFtW2luXSBjb3VudCBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiB0eXBlLiBJZiBjb3VudCA9PSAwLCBubyBtZXRhZGF0YSB3aWxsIGJlIGFkZGVkLgorICogQHBhcmFtW2luXSBkYXRhIFRoZSBtZXRhZGF0YSBpdHNlbGYKKyovCit2b2lkIElUVEFQSSBfX2l0dF9tZXRhZGF0YV9hZGQoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIF9faXR0X21ldGFkYXRhX3R5cGUgdHlwZSwgc2l6ZV90IGNvdW50LCB2b2lkICpkYXRhKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWV0YWRhdGFfYWRkLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIF9faXR0X21ldGFkYXRhX3R5cGUgdHlwZSwgc2l6ZV90IGNvdW50LCB2b2lkICpkYXRhKSkKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfYWRkKGQseCx5LHosYSxiKSBJVFROT1RJRllfVk9JRF9ENShtZXRhZGF0YV9hZGQsZCx4LHkseixhLGIpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX2FkZF9wdHIgICAgICAgICAgSVRUTk9USUZZX05BTUUobWV0YWRhdGFfYWRkKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfYWRkKGQseCx5LHosYSxiKQorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9hZGRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9hZGRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAaW5ncm91cCBwYXJhbWV0ZXJzCisgKiBAYnJpZWYgQWRkIHN0cmluZyBtZXRhZGF0YSB0byBhbiBpbnN0YW5jZSBvZiBhIG5hbWVkIGVudGl0eS4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gY29udHJvbGxpbmcgdGhlIGNhbGwKKyAqIEBwYXJhbVtpbl0gaWQgVGhlIGlkZW50aWZpZXIgb2YgdGhlIGluc3RhbmNlIHRvIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyB0byBiZSBhZGRlZCwgb3IgX19pdHRfbnVsbCB0byBhZGQgdG8gdGhlIGN1cnJlbnQgdGFzaworICogQHBhcmFtW2luXSBrZXkgVGhlIG5hbWUgb2YgdGhlIG1ldGFkYXRhCisgKiBAcGFyYW1baW5dIGRhdGEgVGhlIG1ldGFkYXRhIGl0c2VsZgorICogQHBhcmFtW2luXSBsZW5ndGggVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcsIG9yIC0xIGlmIHRoZSBsZW5ndGggaXMgdW5rbm93biBidXQgdGhlIHN0cmluZyBpcyBudWxsLXRlcm1pbmF0ZWQKKyovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCit2b2lkIElUVEFQSSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkQShjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbmd0aCk7Cit2b2lkIElUVEFQSSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkVyhjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgY29uc3Qgd2NoYXJfdCAqZGF0YSwgc2l6ZV90IGxlbmd0aCk7CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorIyAgZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGQgICAgIF9faXR0X21ldGFkYXRhX3N0cl9hZGRXCisjICBkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF9wdHIgX19pdHRfbWV0YWRhdGFfc3RyX2FkZFdfcHRyCisjZWxzZSAvKiBVTklDT0RFICovCisjICBkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZCAgICAgX19pdHRfbWV0YWRhdGFfc3RyX2FkZEEKKyMgIGRlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3B0ciBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK3ZvaWQgSVRUQVBJIF9faXR0X21ldGFkYXRhX3N0cl9hZGQoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBsZW5ndGgpOworI2VuZGlmCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1ldGFkYXRhX3N0cl9hZGRBLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBsZW5ndGgpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWV0YWRhdGFfc3RyX2FkZFcsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgY29uc3Qgd2NoYXJfdCAqZGF0YSwgc2l6ZV90IGxlbmd0aCkpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtZXRhZGF0YV9zdHJfYWRkLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBsZW5ndGgpKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkQShkLHgseSx6LGEpIElUVE5PVElGWV9WT0lEX0Q0KG1ldGFkYXRhX3N0cl9hZGRBLGQseCx5LHosYSkKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZEFfcHRyICAgICAgICBJVFROT1RJRllfTkFNRShtZXRhZGF0YV9zdHJfYWRkQSkKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZFcoZCx4LHkseixhKSBJVFROT1RJRllfVk9JRF9ENChtZXRhZGF0YV9zdHJfYWRkVyxkLHgseSx6LGEpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRXX3B0ciAgICAgICAgSVRUTk9USUZZX05BTUUobWV0YWRhdGFfc3RyX2FkZFcpCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZChkLHgseSx6LGEpICBJVFROT1RJRllfVk9JRF9ENChtZXRhZGF0YV9zdHJfYWRkLGQseCx5LHosYSkKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF9wdHIgICAgICAgICBJVFROT1RJRllfTkFNRShtZXRhZGF0YV9zdHJfYWRkKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZEEoZCx4LHkseixhKQorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkQV9wdHIgMAorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkVyhkLHgseSx6LGEpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZChkLHgseSx6LGEpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfcHRyIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkQV9wdHIgMAorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfcHRyICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGluZ3JvdXAgcGFyYW1ldGVycworICogQGJyaWVmIEFkZCBtZXRhZGF0YSB0byBhbiBpbnN0YW5jZSBvZiBhIG5hbWVkIGVudGl0eS4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gY29udHJvbGxpbmcgdGhlIGNhbGwKKyAqIEBwYXJhbVtpbl0gc2NvcGUgVGhlIHNjb3BlIG9mIHRoZSBpbnN0YW5jZSB0byB3aGljaCB0aGUgbWV0YWRhdGEgaXMgdG8gYmUgYWRkZWQKKworICogQHBhcmFtW2luXSBpZCBUaGUgaWRlbnRpZmllciBvZiB0aGUgaW5zdGFuY2UgdG8gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIHRvIGJlIGFkZGVkLCBvciBfX2l0dF9udWxsIHRvIGFkZCB0byB0aGUgY3VycmVudCB0YXNrCisKKyAqIEBwYXJhbVtpbl0ga2V5IFRoZSBuYW1lIG9mIHRoZSBtZXRhZGF0YQorICogQHBhcmFtW2luXSB0eXBlIFRoZSB0eXBlIG9mIHRoZSBtZXRhZGF0YQorICogQHBhcmFtW2luXSBjb3VudCBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiB0eXBlLiBJZiBjb3VudCA9PSAwLCBubyBtZXRhZGF0YSB3aWxsIGJlIGFkZGVkLgorICogQHBhcmFtW2luXSBkYXRhIFRoZSBtZXRhZGF0YSBpdHNlbGYKKyovCit2b2lkIElUVEFQSSBfX2l0dF9tZXRhZGF0YV9hZGRfd2l0aF9zY29wZShjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfc2NvcGUgc2NvcGUsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgX19pdHRfbWV0YWRhdGFfdHlwZSB0eXBlLCBzaXplX3QgY291bnQsIHZvaWQgKmRhdGEpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtZXRhZGF0YV9hZGRfd2l0aF9zY29wZSwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9zY29wZSBzY29wZSwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBfX2l0dF9tZXRhZGF0YV90eXBlIHR5cGUsIHNpemVfdCBjb3VudCwgdm9pZCAqZGF0YSkpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX2FkZF93aXRoX3Njb3BlKGQseCx5LHosYSxiKSBJVFROT1RJRllfVk9JRF9ENShtZXRhZGF0YV9hZGRfd2l0aF9zY29wZSxkLHgseSx6LGEsYikKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfYWRkX3dpdGhfc2NvcGVfcHRyICAgICAgICAgIElUVE5PVElGWV9OQU1FKG1ldGFkYXRhX2FkZF93aXRoX3Njb3BlKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfYWRkX3dpdGhfc2NvcGUoZCx4LHkseixhLGIpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX2FkZF93aXRoX3Njb3BlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfYWRkX3dpdGhfc2NvcGVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAaW5ncm91cCBwYXJhbWV0ZXJzCisgKiBAYnJpZWYgQWRkIHN0cmluZyBtZXRhZGF0YSB0byBhbiBpbnN0YW5jZSBvZiBhIG5hbWVkIGVudGl0eS4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gY29udHJvbGxpbmcgdGhlIGNhbGwKKyAqIEBwYXJhbVtpbl0gc2NvcGUgVGhlIHNjb3BlIG9mIHRoZSBpbnN0YW5jZSB0byB3aGljaCB0aGUgbWV0YWRhdGEgaXMgdG8gYmUgYWRkZWQKKworICogQHBhcmFtW2luXSBpZCBUaGUgaWRlbnRpZmllciBvZiB0aGUgaW5zdGFuY2UgdG8gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIHRvIGJlIGFkZGVkLCBvciBfX2l0dF9udWxsIHRvIGFkZCB0byB0aGUgY3VycmVudCB0YXNrCisKKyAqIEBwYXJhbVtpbl0ga2V5IFRoZSBuYW1lIG9mIHRoZSBtZXRhZGF0YQorICogQHBhcmFtW2luXSBkYXRhIFRoZSBtZXRhZGF0YSBpdHNlbGYKKyAqIEBwYXJhbVtpbl0gbGVuZ3RoIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nLCBvciAtMSBpZiB0aGUgbGVuZ3RoIGlzIHVua25vd24gYnV0IHRoZSBzdHJpbmcgaXMgbnVsbC10ZXJtaW5hdGVkCisqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgordm9pZCBJVFRBUEkgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlQShjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfc2NvcGUgc2NvcGUsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbmd0aCk7Cit2b2lkIElUVEFQSSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVXKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9zY29wZSBzY29wZSwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBjb25zdCB3Y2hhcl90ICpkYXRhLCBzaXplX3QgbGVuZ3RoKTsKKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjICBkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlICAgICBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVXCisjICBkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlX3B0ciBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVXX3B0cgorI2Vsc2UgLyogVU5JQ09ERSAqLworIyAgZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZSAgICAgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlQQorIyAgZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZV9wdHIgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK3ZvaWQgSVRUQVBJIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZShjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfc2NvcGUgc2NvcGUsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbmd0aCk7CisjZW5kaWYKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlQSwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9zY29wZSBzY29wZSwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgbGVuZ3RoKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZVcsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfc2NvcGUgc2NvcGUsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgY29uc3Qgd2NoYXJfdCAqZGF0YSwgc2l6ZV90IGxlbmd0aCkpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGUsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfc2NvcGUgc2NvcGUsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbmd0aCkpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZUEoZCx4LHkseixhKSBJVFROT1RJRllfVk9JRF9ENChtZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVBLGQseCx5LHosYSkKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlQV9wdHIgICAgICAgIElUVE5PVElGWV9OQU1FKG1ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZUEpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZVcoZCx4LHkseixhKSBJVFROT1RJRllfVk9JRF9ENChtZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVXLGQseCx5LHosYSkKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlV19wdHIgICAgICAgIElUVE5PVElGWV9OQU1FKG1ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZVcpCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlKGQseCx5LHosYSkgIElUVE5PVElGWV9WT0lEX0Q0KG1ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZSxkLHgseSx6LGEpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZV9wdHIgICAgICAgICBJVFROT1RJRllfTkFNRShtZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVBKGQseCx5LHosYSkKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlQV9wdHIgIDAKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlVyhkLHgseSx6LGEpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZVdfcHRyICAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlKGQseCx5LHosYSkKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlX3B0ciAgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVBX3B0ciAgMAorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVXX3B0ciAgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZV9wdHIgICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKiBAfSBtZXRhZGF0YSBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCByZWxhdGlvbnMgUmVsYXRpb25zCisgKiBJbnN0YW5jZXMgb2YgbmFtZWQgZW50aXRpZXMgY2FuIGJlIGV4cGxpY2l0bHkgYXNzb2NpYXRlZCB3aXRoIG90aGVyCisgKiBpbnN0YW5jZXMgdXNpbmcgaW5zdGFuY2UgSURzIGFuZCB0aGUgcmVsYXRpb25zaGlwIEFQSSBjYWxscy4KKyAqCisgKiBAeworICovCisKKy8qKgorICogQGluZ3JvdXAgcmVsYXRpb25zCisgKiBAYnJpZWYgVGhlIGtpbmQgb2YgcmVsYXRpb24gYmV0d2VlbiB0d28gaW5zdGFuY2VzIGlzIHNwZWNpZmllZCBieSB0aGUgZW51bWVyYXRlZCB0eXBlIF9faXR0X3JlbGF0aW9uLgorICogUmVsYXRpb25zIGJldHdlZW4gaW5zdGFuY2VzIGNhbiBiZSBhZGRlZCB3aXRoIGFuIEFQSSBjYWxsLiBUaGUgcmVsYXRpb24KKyAqIEFQSSB1c2VzIGluc3RhbmNlIElEcy4gUmVsYXRpb25zIGNhbiBiZSBhZGRlZCBiZWZvcmUgb3IgYWZ0ZXIgdGhlIGFjdHVhbAorICogaW5zdGFuY2VzIGFyZSBjcmVhdGVkIGFuZCBwZXJzaXN0IGluZGVwZW5kZW50bHkgb2YgdGhlIGluc3RhbmNlcy4gVGhpcworICogaXMgdGhlIG1vdGl2YXRpb24gZm9yIGhhdmluZyBkaWZmZXJlbnQgbGlmZXRpbWVzIGZvciBpbnN0YW5jZSBJRHMgYW5kCisgKiB0aGUgYWN0dWFsIGluc3RhbmNlcy4KKyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgX19pdHRfcmVsYXRpb25faXNfdW5rbm93biA9IDAsCisgICAgX19pdHRfcmVsYXRpb25faXNfZGVwZW5kZW50X29uLCAgICAgICAgIC8qKjwgIkEgaXMgZGVwZW5kZW50IG9uIEIiIG1lYW5zIHRoYXQgQSBjYW5ub3Qgc3RhcnQgdW50aWwgQiBjb21wbGV0ZXMgKi8KKyAgICBfX2l0dF9yZWxhdGlvbl9pc19zaWJsaW5nX29mLCAgICAgICAgICAgLyoqPCAiQSBpcyBzaWJsaW5nIG9mIEIiIG1lYW5zIHRoYXQgQSBhbmQgQiB3ZXJlIGNyZWF0ZWQgYXMgYSBncm91cCAqLworICAgIF9faXR0X3JlbGF0aW9uX2lzX3BhcmVudF9vZiwgICAgICAgICAgICAvKio8ICJBIGlzIHBhcmVudCBvZiBCIiBtZWFucyB0aGF0IEEgY3JlYXRlZCBCICovCisgICAgX19pdHRfcmVsYXRpb25faXNfY29udGludWF0aW9uX29mLCAgICAgIC8qKjwgIkEgaXMgY29udGludWF0aW9uIG9mIEIiIG1lYW5zIHRoYXQgQSBhc3N1bWVzIHRoZSBkZXBlbmRlbmNpZXMgb2YgQiAqLworICAgIF9faXR0X3JlbGF0aW9uX2lzX2NoaWxkX29mLCAgICAgICAgICAgICAvKio8ICJBIGlzIGNoaWxkIG9mIEIiIG1lYW5zIHRoYXQgQSB3YXMgY3JlYXRlZCBieSBCIChpbnZlcnNlIG9mIGlzX3BhcmVudF9vZikgKi8KKyAgICBfX2l0dF9yZWxhdGlvbl9pc19jb250aW51ZWRfYnksICAgICAgICAgLyoqPCAiQSBpcyBjb250aW51ZWQgYnkgQiIgbWVhbnMgdGhhdCBCIGFzc3VtZXMgdGhlIGRlcGVuZGVuY2llcyBvZiBBIChpbnZlcnNlIG9mIGlzX2NvbnRpbnVhdGlvbl9vZikgKi8KKyAgICBfX2l0dF9yZWxhdGlvbl9pc19wcmVkZWNlc3Nvcl90byAgICAgICAgLyoqPCAiQSBpcyBwcmVkZWNlc3NvciB0byBCIiBtZWFucyB0aGF0IEIgY2Fubm90IHN0YXJ0IHVudGlsIEEgY29tcGxldGVzIChpbnZlcnNlIG9mIGlzX2RlcGVuZGVudF9vbikgKi8KK30gX19pdHRfcmVsYXRpb247CisKKy8qKgorICogQGluZ3JvdXAgcmVsYXRpb25zCisgKiBAYnJpZWYgQWRkIGEgcmVsYXRpb24gdG8gdGhlIGN1cnJlbnQgdGFzayBpbnN0YW5jZS4KKyAqIFRoZSBjdXJyZW50IHRhc2sgaW5zdGFuY2UgaXMgdGhlIGhlYWQgb2YgdGhlIHJlbGF0aW9uLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBjb250cm9sbGluZyB0aGlzIGNhbGwKKyAqIEBwYXJhbVtpbl0gcmVsYXRpb24gVGhlIGtpbmQgb2YgcmVsYXRpb24KKyAqIEBwYXJhbVtpbl0gdGFpbCBUaGUgSUQgZm9yIHRoZSB0YWlsIG9mIHRoZSByZWxhdGlvbgorICovCit2b2lkIElUVEFQSSBfX2l0dF9yZWxhdGlvbl9hZGRfdG9fY3VycmVudChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfcmVsYXRpb24gcmVsYXRpb24sIF9faXR0X2lkIHRhaWwpOworCisvKioKKyAqIEBpbmdyb3VwIHJlbGF0aW9ucworICogQGJyaWVmIEFkZCBhIHJlbGF0aW9uIGJldHdlZW4gdHdvIGluc3RhbmNlIGlkZW50aWZpZXJzLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBjb250cm9sbGluZyB0aGlzIGNhbGwKKyAqIEBwYXJhbVtpbl0gaGVhZCBUaGUgSUQgZm9yIHRoZSBoZWFkIG9mIHRoZSByZWxhdGlvbgorICogQHBhcmFtW2luXSByZWxhdGlvbiBUaGUga2luZCBvZiByZWxhdGlvbgorICogQHBhcmFtW2luXSB0YWlsIFRoZSBJRCBmb3IgdGhlIHRhaWwgb2YgdGhlIHJlbGF0aW9uCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3JlbGF0aW9uX2FkZChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaGVhZCwgX19pdHRfcmVsYXRpb24gcmVsYXRpb24sIF9faXR0X2lkIHRhaWwpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCByZWxhdGlvbl9hZGRfdG9fY3VycmVudCwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9yZWxhdGlvbiByZWxhdGlvbiwgX19pdHRfaWQgdGFpbCkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCByZWxhdGlvbl9hZGQsICAgICAgICAgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBoZWFkLCBfX2l0dF9yZWxhdGlvbiByZWxhdGlvbiwgX19pdHRfaWQgdGFpbCkpCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF90b19jdXJyZW50KGQseCx5KSBJVFROT1RJRllfVk9JRF9EMihyZWxhdGlvbl9hZGRfdG9fY3VycmVudCxkLHgseSkKKyNkZWZpbmUgX19pdHRfcmVsYXRpb25fYWRkX3RvX2N1cnJlbnRfcHRyICAgIElUVE5PVElGWV9OQU1FKHJlbGF0aW9uX2FkZF90b19jdXJyZW50KQorI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGQoZCx4LHkseikgICAgICAgICAgSVRUTk9USUZZX1ZPSURfRDMocmVsYXRpb25fYWRkLGQseCx5LHopCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF9wdHIgICAgICAgICAgICAgICBJVFROT1RJRllfTkFNRShyZWxhdGlvbl9hZGQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfdG9fY3VycmVudChkLHgseSkKKyNkZWZpbmUgX19pdHRfcmVsYXRpb25fYWRkX3RvX2N1cnJlbnRfcHRyIDAKKyNkZWZpbmUgX19pdHRfcmVsYXRpb25fYWRkKGQseCx5LHopCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF90b19jdXJyZW50X3B0ciAwCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IHJlbGF0aW9ucyBncm91cCAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNwcmFnbWEgcGFjayhwdXNoLCA4KQorCit0eXBlZGVmIHN0cnVjdCBfX19pdHRfY2xvY2tfaW5mbworeworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBjbG9ja19mcmVxOyAvKiE8IENsb2NrIGRvbWFpbiBmcmVxdWVuY3kgKi8KKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgY2xvY2tfYmFzZTsgLyohPCBDbG9jayBkb21haW4gYmFzZSB0aW1lc3RhbXAgKi8KK30gX19pdHRfY2xvY2tfaW5mbzsKKworI3ByYWdtYSBwYWNrKHBvcCkKKy8qKiBAZW5kY29uZCAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KK3R5cGVkZWYgdm9pZCAoSVRUQVBJICpfX2l0dF9nZXRfY2xvY2tfaW5mb19mbikoX19pdHRfY2xvY2tfaW5mbyogY2xvY2tfaW5mbywgdm9pZCogZGF0YSk7CisvKiogQGVuZGNvbmQgKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjcHJhZ21hIHBhY2socHVzaCwgOCkKKwordHlwZWRlZiBzdHJ1Y3QgX19faXR0X2Nsb2NrX2RvbWFpbgoreworICAgIF9faXR0X2Nsb2NrX2luZm8gaW5mbzsgICAgICAvKiE8IE1vc3QgcmVjZW50IGNsb2NrIGRvbWFpbiBpbmZvICovCisgICAgX19pdHRfZ2V0X2Nsb2NrX2luZm9fZm4gZm47IC8qITwgQ2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlciAqLworICAgIHZvaWQqIGZuX2RhdGE7ICAgICAgICAgICAgICAvKiE8IElucHV0IGFyZ3VtZW50IGZvciB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKyAgICBpbnQgICBleHRyYTE7ICAgICAgICAgICAgICAgLyohPCBSZXNlcnZlZC4gTXVzdCBiZSB6ZXJvICovCisgICAgdm9pZCogZXh0cmEyOyAgICAgICAgICAgICAgIC8qITwgUmVzZXJ2ZWQuIE11c3QgYmUgemVybyAqLworICAgIHN0cnVjdCBfX19pdHRfY2xvY2tfZG9tYWluKiBuZXh0OworfSBfX2l0dF9jbG9ja19kb21haW47CisKKyNwcmFnbWEgcGFjayhwb3ApCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAaW5ncm91cCBjbG9ja2RvbWFpbnMKKyAqIEBicmllZiBDcmVhdGUgYSBjbG9jayBkb21haW4uCisgKiBDZXJ0YWluIGFwcGxpY2F0aW9ucyByZXF1aXJlIHRoZSBjYXBhYmlsaXR5IHRvIHRyYWNlIHRoZWlyIGFwcGxpY2F0aW9uIHVzaW5nCisgKiBhIGNsb2NrIGRvbWFpbiBkaWZmZXJlbnQgdGhhbiB0aGUgQ1BVLCBmb3IgaW5zdGFuY2UgdGhlIGluc3RydW1lbnRhdGlvbiBvZiBldmVudHMKKyAqIHRoYXQgb2NjdXIgb24gYSBHUFUuCisgKiBCZWNhdXNlIHRoZSBzZXQgb2YgZG9tYWlucyBpcyBleHBlY3RlZCB0byBiZSBzdGF0aWMgb3ZlciB0aGUgYXBwbGljYXRpb24ncyBleGVjdXRpb24gdGltZSwKKyAqIHRoZXJlIGlzIG5vIG1lY2hhbmlzbSB0byBkZXN0cm95IGEgZG9tYWluLgorICogQW55IGRvbWFpbiBjYW4gYmUgYWNjZXNzZWQgYnkgYW55IHRocmVhZCBpbiB0aGUgcHJvY2VzcywgcmVnYXJkbGVzcyBvZiB3aGljaCB0aHJlYWQgY3JlYXRlZAorICogdGhlIGRvbWFpbi4gVGhpcyBjYWxsIGlzIHRocmVhZC1zYWZlLgorICogQHBhcmFtW2luXSBmbiBBIHBvaW50ZXIgdG8gYSBjYWxsYmFjayBmdW5jdGlvbiB3aGljaCByZXRyaWV2ZXMgYWx0ZXJuYXRpdmUgQ1BVIHRpbWVzdGFtcHMKKyAqIEBwYXJhbVtpbl0gZm5fZGF0YSBBcmd1bWVudCBmb3IgYSBjYWxsYmFjayBmdW5jdGlvbjsgbWF5IGJlIE5VTEwKKyAqLworX19pdHRfY2xvY2tfZG9tYWluKiBJVFRBUEkgX19pdHRfY2xvY2tfZG9tYWluX2NyZWF0ZShfX2l0dF9nZXRfY2xvY2tfaW5mb19mbiBmbiwgdm9pZCogZm5fZGF0YSk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfY2xvY2tfZG9tYWluKiwgY2xvY2tfZG9tYWluX2NyZWF0ZSwgKF9faXR0X2dldF9jbG9ja19pbmZvX2ZuIGZuLCB2b2lkKiBmbl9kYXRhKSkKKyNkZWZpbmUgX19pdHRfY2xvY2tfZG9tYWluX2NyZWF0ZSAgICAgSVRUTk9USUZZX0RBVEEoY2xvY2tfZG9tYWluX2NyZWF0ZSkKKyNkZWZpbmUgX19pdHRfY2xvY2tfZG9tYWluX2NyZWF0ZV9wdHIgSVRUTk9USUZZX05BTUUoY2xvY2tfZG9tYWluX2NyZWF0ZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2Nsb2NrX2RvbWFpbl9jcmVhdGUoZm4sZm5fZGF0YSkgKF9faXR0X2Nsb2NrX2RvbWFpbiopMAorI2RlZmluZSBfX2l0dF9jbG9ja19kb21haW5fY3JlYXRlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfY2xvY2tfZG9tYWluX2NyZWF0ZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBpbmdyb3VwIGNsb2NrZG9tYWlucworICogQGJyaWVmIFJlY2FsY3VsYXRlIGNsb2NrIGRvbWFpbnMgZnJlcXVlbmNlcyBhbmQgY2xvY2sgYmFzZSB0aW1lc3RhbXBzLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9jbG9ja19kb21haW5fcmVzZXQodm9pZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGNsb2NrX2RvbWFpbl9yZXNldCwgKHZvaWQpKQorI2RlZmluZSBfX2l0dF9jbG9ja19kb21haW5fcmVzZXQgICAgIElUVE5PVElGWV9WT0lEKGNsb2NrX2RvbWFpbl9yZXNldCkKKyNkZWZpbmUgX19pdHRfY2xvY2tfZG9tYWluX3Jlc2V0X3B0ciBJVFROT1RJRllfTkFNRShjbG9ja19kb21haW5fcmVzZXQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9jbG9ja19kb21haW5fcmVzZXQoKQorI2RlZmluZSBfX2l0dF9jbG9ja19kb21haW5fcmVzZXRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9jbG9ja19kb21haW5fcmVzZXRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAaW5ncm91cCBjbG9ja2RvbWFpbgorICogQGJyaWVmIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBpZGVudGlmaWVyLiBUaGlzIGVzdGFibGlzaGVzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpZmV0aW1lIG9mCisgKiBhbiBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gSUQgaW4gdGhlIHRyYWNlLiBPbmNlIHRoaXMgbGlmZXRpbWUgc3RhcnRzLCB0aGUgSUQgY2FuIGJlIHVzZWQgdG8KKyAqIHRhZyBuYW1lZCBlbnRpdHkgaW5zdGFuY2VzIGluIGNhbGxzIHN1Y2ggYXMgX19pdHRfdGFza19iZWdpbiwgYW5kIHRvIHNwZWNpZnkgcmVsYXRpb25zaGlwcyBhbW9uZworICogaWRlbnRpZmllZCBuYW1lZCBlbnRpdHkgaW5zdGFuY2VzLCB1c2luZyB0aGUgXHJlZiByZWxhdGlvbnMgQVBJcy4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gY29udHJvbGxpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIGNhbGwuCisgKiBAcGFyYW1baW5dIGNsb2NrX2RvbWFpbiBUaGUgY2xvY2sgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBleGVjdXRpb24gb2YgdGhpcyBjYWxsLgorICogQHBhcmFtW2luXSB0aW1lc3RhbXAgVGhlIHVzZXIgZGVmaW5lZCB0aW1lc3RhbXAuCisgKiBAcGFyYW1baW5dIGlkIFRoZSBJRCB0byBjcmVhdGUuCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2lkX2NyZWF0ZV9leChjb25zdCBfX2l0dF9kb21haW4qIGRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIGlkKTsKKworLyoqCisgKiBAaW5ncm91cCBjbG9ja2RvbWFpbgorICogQGJyaWVmIERlc3Ryb3kgYW4gaW5zdGFuY2Ugb2YgaWRlbnRpZmllci4gVGhpcyBlbmRzIHRoZSBsaWZldGltZSBvZiB0aGUgY3VycmVudCBpbnN0YW5jZSBvZiB0aGUKKyAqIGdpdmVuIElEIHZhbHVlIGluIHRoZSB0cmFjZS4gQW55IHJlbGF0aW9uc2hpcHMgdGhhdCBhcmUgZXN0YWJsaXNoZWQgYWZ0ZXIgdGhpcyBsaWZldGltZSBlbmRzIGFyZQorICogaW52YWxpZC4gVGhpcyBjYWxsIG11c3QgYmUgcGVyZm9ybWVkIGJlZm9yZSB0aGUgZ2l2ZW4gSUQgdmFsdWUgY2FuIGJlIHJldXNlZCBmb3IgYSBkaWZmZXJlbnQKKyAqIG5hbWVkIGVudGl0eSBpbnN0YW5jZS4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gY29udHJvbGxpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIGNhbGwuCisgKiBAcGFyYW1baW5dIGNsb2NrX2RvbWFpbiBUaGUgY2xvY2sgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBleGVjdXRpb24gb2YgdGhpcyBjYWxsLgorICogQHBhcmFtW2luXSB0aW1lc3RhbXAgVGhlIHVzZXIgZGVmaW5lZCB0aW1lc3RhbXAuCisgKiBAcGFyYW1baW5dIGlkIFRoZSBJRCB0byBkZXN0cm95LgorICovCit2b2lkIElUVEFQSSBfX2l0dF9pZF9kZXN0cm95X2V4KGNvbnN0IF9faXR0X2RvbWFpbiogZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBpZF9jcmVhdGVfZXgsICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCBpZCkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBpZF9kZXN0cm95X2V4LCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCBpZCkpCisjZGVmaW5lIF9faXR0X2lkX2NyZWF0ZV9leChkLHgseSx6KSAgSVRUTk9USUZZX1ZPSURfRDMoaWRfY3JlYXRlX2V4LGQseCx5LHopCisjZGVmaW5lIF9faXR0X2lkX2NyZWF0ZV9leF9wdHIgICAgICAgSVRUTk9USUZZX05BTUUoaWRfY3JlYXRlX2V4KQorI2RlZmluZSBfX2l0dF9pZF9kZXN0cm95X2V4KGQseCx5LHopIElUVE5PVElGWV9WT0lEX0QzKGlkX2Rlc3Ryb3lfZXgsZCx4LHkseikKKyNkZWZpbmUgX19pdHRfaWRfZGVzdHJveV9leF9wdHIgICAgICBJVFROT1RJRllfTkFNRShpZF9kZXN0cm95X2V4KQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfaWRfY3JlYXRlX2V4KGRvbWFpbixjbG9ja19kb21haW4sdGltZXN0YW1wLGlkKQorI2RlZmluZSBfX2l0dF9pZF9jcmVhdGVfZXhfcHRyICAgIDAKKyNkZWZpbmUgX19pdHRfaWRfZGVzdHJveV9leChkb21haW4sY2xvY2tfZG9tYWluLHRpbWVzdGFtcCxpZCkKKyNkZWZpbmUgX19pdHRfaWRfZGVzdHJveV9leF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2lkX2NyZWF0ZV9leF9wdHIgICAgMAorI2RlZmluZSBfX2l0dF9pZF9kZXN0cm95X2V4X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGluZ3JvdXAgY2xvY2tkb21haW4KKyAqIEBicmllZiBCZWdpbiBhIHRhc2sgaW5zdGFuY2UuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGZvciB0aGlzIHRhc2sKKyAqIEBwYXJhbVtpbl0gY2xvY2tfZG9tYWluIFRoZSBjbG9jayBkb21haW4gY29udHJvbGxpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIGNhbGwuCisgKiBAcGFyYW1baW5dIHRpbWVzdGFtcCBUaGUgdXNlciBkZWZpbmVkIHRpbWVzdGFtcC4KKyAqIEBwYXJhbVtpbl0gdGFza2lkIFRoZSBpbnN0YW5jZSBJRCBmb3IgdGhpcyB0YXNrIGluc3RhbmNlLCBvciBfX2l0dF9udWxsCisgKiBAcGFyYW1baW5dIHBhcmVudGlkIFRoZSBwYXJlbnQgaW5zdGFuY2UgdG8gd2hpY2ggdGhpcyB0YXNrIGluc3RhbmNlIGJlbG9uZ3MsIG9yIF9faXR0X251bGwKKyAqIEBwYXJhbVtpbl0gbmFtZSBUaGUgbmFtZSBvZiB0aGlzIHRhc2sKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfdGFza19iZWdpbl9leChjb25zdCBfX2l0dF9kb21haW4qIGRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIHRhc2tpZCwgX19pdHRfaWQgcGFyZW50aWQsIF9faXR0X3N0cmluZ19oYW5kbGUqIG5hbWUpOworCisvKioKKyAqIEBpbmdyb3VwIGNsb2NrZG9tYWluCisgKiBAYnJpZWYgQmVnaW4gYSB0YXNrIGluc3RhbmNlLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBmb3IgdGhpcyB0YXNrCisgKiBAcGFyYW1baW5dIGNsb2NrX2RvbWFpbiBUaGUgY2xvY2sgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBleGVjdXRpb24gb2YgdGhpcyBjYWxsLgorICogQHBhcmFtW2luXSB0aW1lc3RhbXAgVGhlIHVzZXIgZGVmaW5lZCB0aW1lc3RhbXAuCisgKiBAcGFyYW1baW5dIHRhc2tpZCBUaGUgaWRlbnRpZmllciBmb3IgdGhpcyB0YXNrIGluc3RhbmNlLCBvciBfX2l0dF9udWxsCisgKiBAcGFyYW1baW5dIHBhcmVudGlkIFRoZSBwYXJlbnQgb2YgdGhpcyB0YXNrLCBvciBfX2l0dF9udWxsCisgKiBAcGFyYW1baW5dIGZuIFRoZSBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB5b3UgYXJlIHRyYWNpbmcKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfdGFza19iZWdpbl9mbl9leChjb25zdCBfX2l0dF9kb21haW4qIGRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIHRhc2tpZCwgX19pdHRfaWQgcGFyZW50aWQsIHZvaWQqIGZuKTsKKworLyoqCisgKiBAaW5ncm91cCBjbG9ja2RvbWFpbgorICogQGJyaWVmIEVuZCB0aGUgY3VycmVudCB0YXNrIGluc3RhbmNlLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBmb3IgdGhpcyB0YXNrCisgKiBAcGFyYW1baW5dIGNsb2NrX2RvbWFpbiBUaGUgY2xvY2sgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBleGVjdXRpb24gb2YgdGhpcyBjYWxsLgorICogQHBhcmFtW2luXSB0aW1lc3RhbXAgVGhlIHVzZXIgZGVmaW5lZCB0aW1lc3RhbXAuCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3Rhc2tfZW5kX2V4KGNvbnN0IF9faXR0X2RvbWFpbiogZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfYmVnaW5fZXgsICAgICAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCBpZCwgX19pdHRfaWQgcGFyZW50aWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19iZWdpbl9mbl9leCwgICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIGlkLCBfX2l0dF9pZCBwYXJlbnRpZCwgdm9pZCogZm4pKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19lbmRfZXgsICAgICAgICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXApKQorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX2V4KGQseCx5LHosYSxiKSAgICAgIElUVE5PVElGWV9WT0lEX0Q1KHRhc2tfYmVnaW5fZXgsZCx4LHkseixhLGIpCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fZXhfcHRyICAgICAgICAgICAgICAgSVRUTk9USUZZX05BTUUodGFza19iZWdpbl9leCkKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9mbl9leChkLHgseSx6LGEsYikgICBJVFROT1RJRllfVk9JRF9ENSh0YXNrX2JlZ2luX2ZuX2V4LGQseCx5LHosYSxiKQorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX2ZuX2V4X3B0ciAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHRhc2tfYmVnaW5fZm5fZXgpCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kX2V4KGQseCx5KSAgICAgICAgICAgICAgSVRUTk9USUZZX1ZPSURfRDIodGFza19lbmRfZXgsZCx4LHkpCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kX2V4X3B0ciAgICAgICAgICAgICAgICAgSVRUTk9USUZZX05BTUUodGFza19lbmRfZXgpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX2V4KGRvbWFpbixjbG9ja19kb21haW4sdGltZXN0YW1wLGlkLHBhcmVudGlkLG5hbWUpCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fZXhfcHRyICAgICAgICAgIDAKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9mbl9leChkb21haW4sY2xvY2tfZG9tYWluLHRpbWVzdGFtcCxpZCxwYXJlbnRpZCxmbikKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9mbl9leF9wdHIgICAgICAgMAorI2RlZmluZSBfX2l0dF90YXNrX2VuZF9leChkb21haW4sY2xvY2tfZG9tYWluLHRpbWVzdGFtcCkKKyNkZWZpbmUgX19pdHRfdGFza19lbmRfZXhfcHRyICAgICAgICAgICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fZXhfcHRyICAgICAgICAgIDAKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9mbl9leF9wdHIgICAgICAgMAorI2RlZmluZSBfX2l0dF90YXNrX2VuZF9leF9wdHIgICAgICAgICAgICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGluZ3JvdXAgbWFya2VycworICogQGJyaWVmIENyZWF0ZSBhIG1hcmtlciBpbnN0YW5jZS4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gZm9yIHRoaXMgbWFya2VyCisgKiBAcGFyYW1baW5dIGNsb2NrX2RvbWFpbiBUaGUgY2xvY2sgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBleGVjdXRpb24gb2YgdGhpcyBjYWxsLgorICogQHBhcmFtW2luXSB0aW1lc3RhbXAgVGhlIHVzZXIgZGVmaW5lZCB0aW1lc3RhbXAuCisgKiBAcGFyYW1baW5dIGlkIFRoZSBpbnN0YW5jZSBJRCBmb3IgdGhpcyBtYXJrZXIsIG9yIF9faXR0X251bGwKKyAqIEBwYXJhbVtpbl0gbmFtZSBUaGUgbmFtZSBmb3IgdGhpcyBtYXJrZXIKKyAqIEBwYXJhbVtpbl0gc2NvcGUgVGhlIHNjb3BlIGZvciB0aGlzIG1hcmtlcgorICovCit2b2lkIElUVEFQSSBfX2l0dF9tYXJrZXJfZXgoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sICBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUsIF9faXR0X3Njb3BlIHNjb3BlKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWFya2VyX2V4LCAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sICBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUsIF9faXR0X3Njb3BlIHNjb3BlKSkKKyNkZWZpbmUgX19pdHRfbWFya2VyX2V4KGQseCx5LHosYSxiKSAgICBJVFROT1RJRllfVk9JRF9ENShtYXJrZXJfZXgsZCx4LHkseixhLGIpCisjZGVmaW5lIF9faXR0X21hcmtlcl9leF9wdHIgICAgICAgICAgICAgSVRUTk9USUZZX05BTUUobWFya2VyX2V4KQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbWFya2VyX2V4KGRvbWFpbixjbG9ja19kb21haW4sdGltZXN0YW1wLGlkLG5hbWUsc2NvcGUpCisjZGVmaW5lIF9faXR0X21hcmtlcl9leF9wdHIgICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X21hcmtlcl9leF9wdHIgICAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBpbmdyb3VwIGNsb2NrZG9tYWluCisgKiBAYnJpZWYgQWRkIGEgcmVsYXRpb24gdG8gdGhlIGN1cnJlbnQgdGFzayBpbnN0YW5jZS4KKyAqIFRoZSBjdXJyZW50IHRhc2sgaW5zdGFuY2UgaXMgdGhlIGhlYWQgb2YgdGhlIHJlbGF0aW9uLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBjb250cm9sbGluZyB0aGlzIGNhbGwKKyAqIEBwYXJhbVtpbl0gY2xvY2tfZG9tYWluIFRoZSBjbG9jayBkb21haW4gY29udHJvbGxpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIGNhbGwuCisgKiBAcGFyYW1baW5dIHRpbWVzdGFtcCBUaGUgdXNlciBkZWZpbmVkIHRpbWVzdGFtcC4KKyAqIEBwYXJhbVtpbl0gcmVsYXRpb24gVGhlIGtpbmQgb2YgcmVsYXRpb24KKyAqIEBwYXJhbVtpbl0gdGFpbCBUaGUgSUQgZm9yIHRoZSB0YWlsIG9mIHRoZSByZWxhdGlvbgorICovCit2b2lkIElUVEFQSSBfX2l0dF9yZWxhdGlvbl9hZGRfdG9fY3VycmVudF9leChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9yZWxhdGlvbiByZWxhdGlvbiwgX19pdHRfaWQgdGFpbCk7CisKKy8qKgorICogQGluZ3JvdXAgY2xvY2tkb21haW4KKyAqIEBicmllZiBBZGQgYSByZWxhdGlvbiBiZXR3ZWVuIHR3byBpbnN0YW5jZSBpZGVudGlmaWVycy4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gY29udHJvbGxpbmcgdGhpcyBjYWxsCisgKiBAcGFyYW1baW5dIGNsb2NrX2RvbWFpbiBUaGUgY2xvY2sgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBleGVjdXRpb24gb2YgdGhpcyBjYWxsLgorICogQHBhcmFtW2luXSB0aW1lc3RhbXAgVGhlIHVzZXIgZGVmaW5lZCB0aW1lc3RhbXAuCisgKiBAcGFyYW1baW5dIGhlYWQgVGhlIElEIGZvciB0aGUgaGVhZCBvZiB0aGUgcmVsYXRpb24KKyAqIEBwYXJhbVtpbl0gcmVsYXRpb24gVGhlIGtpbmQgb2YgcmVsYXRpb24KKyAqIEBwYXJhbVtpbl0gdGFpbCBUaGUgSUQgZm9yIHRoZSB0YWlsIG9mIHRoZSByZWxhdGlvbgorICovCit2b2lkIElUVEFQSSBfX2l0dF9yZWxhdGlvbl9hZGRfZXgoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sICBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaGVhZCwgX19pdHRfcmVsYXRpb24gcmVsYXRpb24sIF9faXR0X2lkIHRhaWwpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCByZWxhdGlvbl9hZGRfdG9fY3VycmVudF9leCwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfcmVsYXRpb24gcmVsYXRpb24sIF9faXR0X2lkIHRhaWwpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcmVsYXRpb25fYWRkX2V4LCAgICAgICAgICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIGhlYWQsIF9faXR0X3JlbGF0aW9uIHJlbGF0aW9uLCBfX2l0dF9pZCB0YWlsKSkKKyNkZWZpbmUgX19pdHRfcmVsYXRpb25fYWRkX3RvX2N1cnJlbnRfZXgoZCx4LHkseixhKSBJVFROT1RJRllfVk9JRF9ENChyZWxhdGlvbl9hZGRfdG9fY3VycmVudF9leCxkLHgseSx6LGEpCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF90b19jdXJyZW50X2V4X3B0ciAgICAgICAgSVRUTk9USUZZX05BTUUocmVsYXRpb25fYWRkX3RvX2N1cnJlbnRfZXgpCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF9leChkLHgseSx6LGEsYikgICAgICAgICAgSVRUTk9USUZZX1ZPSURfRDUocmVsYXRpb25fYWRkX2V4LGQseCx5LHosYSxiKQorI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfZXhfcHRyICAgICAgICAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHJlbGF0aW9uX2FkZF9leCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF90b19jdXJyZW50X2V4KGRvbWFpbixjbG9ja19kb21haW4sdGltZXN0YW1lLHJlbGF0aW9uLHRhaWwpCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF90b19jdXJyZW50X2V4X3B0ciAwCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF9leChkb21haW4sY2xvY2tfZG9tYWluLHRpbWVzdGFtcCxoZWFkLHJlbGF0aW9uLHRhaWwpCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF9leF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF90b19jdXJyZW50X2V4X3B0ciAwCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF9leF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KK3R5cGVkZWYgZW51bSBfX19pdHRfdHJhY2tfZ3JvdXBfdHlwZQoreworICAgIF9faXR0X3RyYWNrX2dyb3VwX3R5cGVfbm9ybWFsID0gMAorfSBfX2l0dF90cmFja19ncm91cF90eXBlOworLyoqIEBlbmRjb25kICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI3ByYWdtYSBwYWNrKHB1c2gsIDgpCisKK3R5cGVkZWYgc3RydWN0IF9fX2l0dF90cmFja19ncm91cAoreworICAgIF9faXR0X3N0cmluZ19oYW5kbGUqIG5hbWU7ICAgICAvKiE8IE5hbWUgb2YgdGhlIHRyYWNrIGdyb3VwICovCisgICAgc3RydWN0IF9fX2l0dF90cmFjayogdHJhY2s7ICAgIC8qITwgTGlzdCBvZiBjaGlsZCB0cmFja3MgICAgKi8KKyAgICBfX2l0dF90cmFja19ncm91cF90eXBlIHRndHlwZTsgLyohPCBUeXBlIG9mIHRoZSB0cmFjayBncm91cCAqLworICAgIGludCAgIGV4dHJhMTsgICAgICAgICAgICAgICAgICAvKiE8IFJlc2VydmVkLiBNdXN0IGJlIHplcm8gICovCisgICAgdm9pZCogZXh0cmEyOyAgICAgICAgICAgICAgICAgIC8qITwgUmVzZXJ2ZWQuIE11c3QgYmUgemVybyAgKi8KKyAgICBzdHJ1Y3QgX19faXR0X3RyYWNrX2dyb3VwKiBuZXh0OworfSBfX2l0dF90cmFja19ncm91cDsKKworI3ByYWdtYSBwYWNrKHBvcCkKKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBQbGFjZWhvbGRlciBmb3IgY3VzdG9tIHRyYWNrIHR5cGVzLiBDdXJyZW50bHksICJub3JtYWwiIGN1c3RvbSB0cmFjaworICogaXMgdGhlIG9ubHkgYXZhaWxhYmxlIHRyYWNrIHR5cGUuCisgKi8KK3R5cGVkZWYgZW51bSBfX19pdHRfdHJhY2tfdHlwZQoreworICAgIF9faXR0X3RyYWNrX3R5cGVfbm9ybWFsID0gMAorI2lmZGVmIElOVEVMX0lUVE5PVElGWV9BUElfUFJJVkFURQorICAgICwgX19pdHRfdHJhY2tfdHlwZV9xdWV1ZQorI2VuZGlmIC8qIElOVEVMX0lUVE5PVElGWV9BUElfUFJJVkFURSAqLworfSBfX2l0dF90cmFja190eXBlOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNwcmFnbWEgcGFjayhwdXNoLCA4KQorCit0eXBlZGVmIHN0cnVjdCBfX19pdHRfdHJhY2sKK3sKKyAgICBfX2l0dF9zdHJpbmdfaGFuZGxlKiBuYW1lOyAvKiE8IE5hbWUgb2YgdGhlIHRyYWNrIGdyb3VwICovCisgICAgX19pdHRfdHJhY2tfZ3JvdXAqIGdyb3VwOyAgLyohPCBQYXJlbnQgZ3JvdXAgdG8gYSB0cmFjayAqLworICAgIF9faXR0X3RyYWNrX3R5cGUgdHR5cGU7ICAgIC8qITwgVHlwZSBvZiB0aGUgdHJhY2sgICAgICAgKi8KKyAgICBpbnQgICBleHRyYTE7ICAgICAgICAgICAgICAvKiE8IFJlc2VydmVkLiBNdXN0IGJlIHplcm8gICovCisgICAgdm9pZCogZXh0cmEyOyAgICAgICAgICAgICAgLyohPCBSZXNlcnZlZC4gTXVzdCBiZSB6ZXJvICAqLworICAgIHN0cnVjdCBfX19pdHRfdHJhY2sqIG5leHQ7Cit9IF9faXR0X3RyYWNrOworCisjcHJhZ21hIHBhY2socG9wKQorLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIENyZWF0ZSBsb2dpY2FsIHRyYWNrIGdyb3VwLgorICovCitfX2l0dF90cmFja19ncm91cCogSVRUQVBJIF9faXR0X3RyYWNrX2dyb3VwX2NyZWF0ZShfX2l0dF9zdHJpbmdfaGFuZGxlKiBuYW1lLCBfX2l0dF90cmFja19ncm91cF90eXBlIHRyYWNrX2dyb3VwX3R5cGUpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQihJVFRBUEksIF9faXR0X3RyYWNrX2dyb3VwKiwgdHJhY2tfZ3JvdXBfY3JlYXRlLCAoX19pdHRfc3RyaW5nX2hhbmRsZSogbmFtZSwgX19pdHRfdHJhY2tfZ3JvdXBfdHlwZSB0cmFja19ncm91cF90eXBlKSkKKyNkZWZpbmUgX19pdHRfdHJhY2tfZ3JvdXBfY3JlYXRlICAgICBJVFROT1RJRllfREFUQSh0cmFja19ncm91cF9jcmVhdGUpCisjZGVmaW5lIF9faXR0X3RyYWNrX2dyb3VwX2NyZWF0ZV9wdHIgSVRUTk9USUZZX05BTUUodHJhY2tfZ3JvdXBfY3JlYXRlKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfdHJhY2tfZ3JvdXBfY3JlYXRlKG5hbWUpICAoX19pdHRfdHJhY2tfZ3JvdXAqKTAKKyNkZWZpbmUgX19pdHRfdHJhY2tfZ3JvdXBfY3JlYXRlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfdHJhY2tfZ3JvdXBfY3JlYXRlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIENyZWF0ZSBsb2dpY2FsIHRyYWNrLgorICovCitfX2l0dF90cmFjayogSVRUQVBJIF9faXR0X3RyYWNrX2NyZWF0ZShfX2l0dF90cmFja19ncm91cCogdHJhY2tfZ3JvdXAsIF9faXR0X3N0cmluZ19oYW5kbGUqIG5hbWUsIF9faXR0X3RyYWNrX3R5cGUgdHJhY2tfdHlwZSk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfdHJhY2sqLCB0cmFja19jcmVhdGUsIChfX2l0dF90cmFja19ncm91cCogdHJhY2tfZ3JvdXAsX19pdHRfc3RyaW5nX2hhbmRsZSogbmFtZSwgX19pdHRfdHJhY2tfdHlwZSB0cmFja190eXBlKSkKKyNkZWZpbmUgX19pdHRfdHJhY2tfY3JlYXRlICAgICBJVFROT1RJRllfREFUQSh0cmFja19jcmVhdGUpCisjZGVmaW5lIF9faXR0X3RyYWNrX2NyZWF0ZV9wdHIgSVRUTk9USUZZX05BTUUodHJhY2tfY3JlYXRlKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfdHJhY2tfY3JlYXRlKHRyYWNrX2dyb3VwLG5hbWUsdHJhY2tfdHlwZSkgIChfX2l0dF90cmFjayopMAorI2RlZmluZSBfX2l0dF90cmFja19jcmVhdGVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF90cmFja19jcmVhdGVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgU2V0IHRoZSBsb2dpY2FsIHRyYWNrLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9zZXRfdHJhY2soX19pdHRfdHJhY2sqIHRyYWNrKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc2V0X3RyYWNrLCAoX19pdHRfdHJhY2sgKnRyYWNrKSkKKyNkZWZpbmUgX19pdHRfc2V0X3RyYWNrICAgICBJVFROT1RJRllfVk9JRChzZXRfdHJhY2spCisjZGVmaW5lIF9faXR0X3NldF90cmFja19wdHIgSVRUTk9USUZZX05BTUUoc2V0X3RyYWNrKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc2V0X3RyYWNrKHRyYWNrKQorI2RlZmluZSBfX2l0dF9zZXRfdHJhY2tfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9zZXRfdHJhY2tfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZ3BhX2RvY3VtZW50YXRpb24gKi8KKy8qKgorICogQGRlZmdyb3VwIGV2ZW50cyBFdmVudHMKKyAqIEBpbmdyb3VwIHB1YmxpYworICogRXZlbnRzIGdyb3VwCisgKiBAeworICovCisvKiogQGJyaWVmIHVzZXIgZXZlbnQgdHlwZSAqLwordHlwZWRlZiBpbnQgX19pdHRfZXZlbnQ7CisKKy8qKgorICogQGJyaWVmIENyZWF0ZSBhbiBldmVudCBub3RpZmljYXRpb24KKyAqIEBub3RlIG5hbWUgb3IgbmFtZWxlbiBiZWluZyBudWxsL25hbWUgYW5kIG5hbWVsZW4gbm90IG1hdGNoaW5nLCB1c2VyIGV2ZW50IGZlYXR1cmUgbm90IGVuYWJsZWQKKyAqIEByZXR1cm4gbm9uLXplcm8gZXZlbnQgaWRlbnRpZmllciB1cG9uIHN1Y2Nlc3MgYW5kIF9faXR0X2VyciBvdGhlcndpc2UKKyAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorX19pdHRfZXZlbnQgTElCSVRUQVBJIF9faXR0X2V2ZW50X2NyZWF0ZUEoY29uc3QgY2hhciAgICAqbmFtZSwgaW50IG5hbWVsZW4pOworX19pdHRfZXZlbnQgTElCSVRUQVBJIF9faXR0X2V2ZW50X2NyZWF0ZVcoY29uc3Qgd2NoYXJfdCAqbmFtZSwgaW50IG5hbWVsZW4pOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9ldmVudF9jcmVhdGUgICAgIF9faXR0X2V2ZW50X2NyZWF0ZVcKKyMgIGRlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVfcHRyIF9faXR0X2V2ZW50X2NyZWF0ZVdfcHRyCisjZWxzZQorIyAgZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZSAgICAgX19pdHRfZXZlbnRfY3JlYXRlQQorIyAgZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZV9wdHIgX19pdHRfZXZlbnRfY3JlYXRlQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitfX2l0dF9ldmVudCBMSUJJVFRBUEkgX19pdHRfZXZlbnRfY3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoTElCSVRUQVBJLCBfX2l0dF9ldmVudCwgZXZlbnRfY3JlYXRlQSwgKGNvbnN0IGNoYXIgICAgKm5hbWUsIGludCBuYW1lbGVuKSkKK0lUVF9TVFVCKExJQklUVEFQSSwgX19pdHRfZXZlbnQsIGV2ZW50X2NyZWF0ZVcsIChjb25zdCB3Y2hhcl90ICpuYW1lLCBpbnQgbmFtZWxlbikpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihMSUJJVFRBUEksIF9faXR0X2V2ZW50LCBldmVudF9jcmVhdGUsICAoY29uc3QgY2hhciAgICAqbmFtZSwgaW50IG5hbWVsZW4pKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVBICAgICBJVFROT1RJRllfREFUQShldmVudF9jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVBX3B0ciBJVFROT1RJRllfTkFNRShldmVudF9jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVXICAgICBJVFROT1RJRllfREFUQShldmVudF9jcmVhdGVXKQorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVXX3B0ciBJVFROT1RJRllfTkFNRShldmVudF9jcmVhdGVXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZSAgICAgIElUVE5PVElGWV9EQVRBKGV2ZW50X2NyZWF0ZSkKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlX3B0ciAgSVRUTk9USUZZX05BTUUoZXZlbnRfY3JlYXRlKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlQShuYW1lLCBuYW1lbGVuKSAoX19pdHRfZXZlbnQpMAorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZVcobmFtZSwgbmFtZWxlbikgKF9faXR0X2V2ZW50KTAKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZShuYW1lLCBuYW1lbGVuKSAgKF9faXR0X2V2ZW50KTAKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZV9wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgUmVjb3JkIGFuIGV2ZW50IG9jY3VycmVuY2UuCisgKiBAcmV0dXJuIF9faXR0X2VyciB1cG9uIGZhaWx1cmUgKGludmFsaWQgZXZlbnQgaWQvdXNlciBldmVudCBmZWF0dXJlIG5vdCBlbmFibGVkKQorICovCitpbnQgTElCSVRUQVBJIF9faXR0X2V2ZW50X3N0YXJ0KF9faXR0X2V2ZW50IGV2ZW50KTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsIGV2ZW50X3N0YXJ0LCAoX19pdHRfZXZlbnQgZXZlbnQpKQorI2RlZmluZSBfX2l0dF9ldmVudF9zdGFydCAgICAgSVRUTk9USUZZX0RBVEEoZXZlbnRfc3RhcnQpCisjZGVmaW5lIF9faXR0X2V2ZW50X3N0YXJ0X3B0ciBJVFROT1RJRllfTkFNRShldmVudF9zdGFydCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2V2ZW50X3N0YXJ0KGV2ZW50KSAoaW50KTAKKyNkZWZpbmUgX19pdHRfZXZlbnRfc3RhcnRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9ldmVudF9zdGFydF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBSZWNvcmQgYW4gZXZlbnQgZW5kIG9jY3VycmVuY2UuCisgKiBAbm90ZSBJdCBpcyBvcHRpb25hbCBpZiBldmVudHMgZG8gbm90IGhhdmUgZHVyYXRpb25zLgorICogQHJldHVybiBfX2l0dF9lcnIgdXBvbiBmYWlsdXJlIChpbnZhbGlkIGV2ZW50IGlkL3VzZXIgZXZlbnQgZmVhdHVyZSBub3QgZW5hYmxlZCkKKyAqLworaW50IExJQklUVEFQSSBfX2l0dF9ldmVudF9lbmQoX19pdHRfZXZlbnQgZXZlbnQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQihMSUJJVFRBUEksIGludCwgZXZlbnRfZW5kLCAoX19pdHRfZXZlbnQgZXZlbnQpKQorI2RlZmluZSBfX2l0dF9ldmVudF9lbmQgICAgIElUVE5PVElGWV9EQVRBKGV2ZW50X2VuZCkKKyNkZWZpbmUgX19pdHRfZXZlbnRfZW5kX3B0ciBJVFROT1RJRllfTkFNRShldmVudF9lbmQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9ldmVudF9lbmQoZXZlbnQpIChpbnQpMAorI2RlZmluZSBfX2l0dF9ldmVudF9lbmRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9ldmVudF9lbmRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSBldmVudHMgZ3JvdXAgKi8KKworCisvKioKKyAqIEBkZWZncm91cCBhcnJheXMgQXJyYXlzIFZpc3VhbGl6ZXIKKyAqIEBpbmdyb3VwIHB1YmxpYworICogVmlzdWFsaXplIGFycmF5cworICogQHsKKyAqLworCisvKioKKyAqIEBlbnVtIF9faXR0X2F2X2RhdGFfdHlwZQorICogQGJyaWVmIERlZmluZXMgdHlwZXMgb2YgYXJyYXlzIGRhdGEgKGZvciBDL0MrKyBpbnRyaW5zaWMgdHlwZXMpCisgKi8KK3R5cGVkZWYgZW51bQoreworICAgIF9faXR0X2VfZmlyc3QgPSAwLAorICAgIF9faXR0X2VfY2hhciA9IDAsICAvKiAxLWJ5dGUgaW50ZWdlciAqLworICAgIF9faXR0X2VfdWNoYXIsICAgICAvKiAxLWJ5dGUgdW5zaWduZWQgaW50ZWdlciAqLworICAgIF9faXR0X2VfaW50MTYsICAgICAvKiAyLWJ5dGUgaW50ZWdlciAqLworICAgIF9faXR0X2VfdWludDE2LCAgICAvKiAyLWJ5dGUgdW5zaWduZWQgaW50ZWdlciAgKi8KKyAgICBfX2l0dF9lX2ludDMyLCAgICAgLyogNC1ieXRlIGludGVnZXIgKi8KKyAgICBfX2l0dF9lX3VpbnQzMiwgICAgLyogNC1ieXRlIHVuc2lnbmVkIGludGVnZXIgKi8KKyAgICBfX2l0dF9lX2ludDY0LCAgICAgLyogOC1ieXRlIGludGVnZXIgKi8KKyAgICBfX2l0dF9lX3VpbnQ2NCwgICAgLyogOC1ieXRlIHVuc2lnbmVkIGludGVnZXIgKi8KKyAgICBfX2l0dF9lX2Zsb2F0LCAgICAgLyogNC1ieXRlIGZsb2F0aW5nICovCisgICAgX19pdHRfZV9kb3VibGUsICAgIC8qIDgtYnl0ZSBmbG9hdGluZyAqLworICAgIF9faXR0X2VfbGFzdCA9IF9faXR0X2VfZG91YmxlCit9IF9faXR0X2F2X2RhdGFfdHlwZTsKKworLyoqCisgKiBAYnJpZWYgU2F2ZSBhbiBhcnJheSBkYXRhIHRvIGEgZmlsZS4KKyAqIE91dHB1dCBmb3JtYXQgaXMgZGVmaW5lZCBieSB0aGUgZmlsZSBleHRlbnNpb24uIFRoZSBjc3YgYW5kIGJtcCBmb3JtYXRzIGFyZSBzdXBwb3J0ZWQgKGJtcCAtIGZvciAyLWRpbWVuc2lvbmFsIGFycmF5IG9ubHkpLgorICogQHBhcmFtW2luXSBkYXRhIC0gcG9pbnRlciB0byB0aGUgYXJyYXkgZGF0YQorICogQHBhcmFtW2luXSByYW5rIC0gdGhlIHJhbmsgb2YgdGhlIGFycmF5CisgKiBAcGFyYW1baW5dIGRpbWVuc2lvbnMgLSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGludGVnZXJzLCB3aGljaCBzcGVjaWZpZXMgdGhlIGFycmF5IGRpbWVuc2lvbnMuCisgKiBUaGUgc2l6ZSBvZiBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwgdG8gdGhlIHJhbmsKKyAqIEBwYXJhbVtpbl0gdHlwZSAtIHRoZSB0eXBlIG9mIHRoZSBhcnJheSwgc3BlY2lmaWVkIGFzIG9uZSBvZiB0aGUgX19pdHRfYXZfZGF0YV90eXBlIHZhbHVlcyAoZm9yIGludHJpbnNpYyB0eXBlcykKKyAqIEBwYXJhbVtpbl0gZmlsZVBhdGggLSB0aGUgZmlsZSBwYXRoOyB0aGUgb3V0cHV0IGZvcm1hdCBpcyBkZWZpbmVkIGJ5IHRoZSBmaWxlIGV4dGVuc2lvbgorICogQHBhcmFtW2luXSBjb2x1bW5PcmRlciAtIGRlZmluZXMgaG93IHRoZSBhcnJheSBpcyBzdG9yZWQgaW4gdGhlIGxpbmVhciBtZW1vcnkuCisgKiBJdCBzaG91bGQgYmUgMSBmb3IgY29sdW1uLW1ham9yIG9yZGVyIChlLmcuIGluIEZPUlRSQU4pIG9yIDAgLSBmb3Igcm93LW1ham9yIG9yZGVyIChlLmcuIGluIEMpLgorICovCisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK2ludCBJVFRBUEkgX19pdHRfYXZfc2F2ZUEodm9pZCAqZGF0YSwgaW50IHJhbmssIGNvbnN0IGludCAqZGltZW5zaW9ucywgaW50IHR5cGUsIGNvbnN0IGNoYXIgKmZpbGVQYXRoLCBpbnQgY29sdW1uT3JkZXIpOworaW50IElUVEFQSSBfX2l0dF9hdl9zYXZlVyh2b2lkICpkYXRhLCBpbnQgcmFuaywgY29uc3QgaW50ICpkaW1lbnNpb25zLCBpbnQgdHlwZSwgY29uc3Qgd2NoYXJfdCAqZmlsZVBhdGgsIGludCBjb2x1bW5PcmRlcik7CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorIyAgZGVmaW5lIF9faXR0X2F2X3NhdmUgICAgIF9faXR0X2F2X3NhdmVXCisjICBkZWZpbmUgX19pdHRfYXZfc2F2ZV9wdHIgX19pdHRfYXZfc2F2ZVdfcHRyCisjZWxzZSAvKiBVTklDT0RFICovCisjICBkZWZpbmUgX19pdHRfYXZfc2F2ZSAgICAgX19pdHRfYXZfc2F2ZUEKKyMgIGRlZmluZSBfX2l0dF9hdl9zYXZlX3B0ciBfX2l0dF9hdl9zYXZlQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitpbnQgSVRUQVBJIF9faXR0X2F2X3NhdmUodm9pZCAqZGF0YSwgaW50IHJhbmssIGNvbnN0IGludCAqZGltZW5zaW9ucywgaW50IHR5cGUsIGNvbnN0IGNoYXIgKmZpbGVQYXRoLCBpbnQgY29sdW1uT3JkZXIpOworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihJVFRBUEksIGludCwgYXZfc2F2ZUEsICh2b2lkICpkYXRhLCBpbnQgcmFuaywgY29uc3QgaW50ICpkaW1lbnNpb25zLCBpbnQgdHlwZSwgY29uc3QgY2hhciAqZmlsZVBhdGgsIGludCBjb2x1bW5PcmRlcikpCitJVFRfU1RVQihJVFRBUEksIGludCwgYXZfc2F2ZVcsICh2b2lkICpkYXRhLCBpbnQgcmFuaywgY29uc3QgaW50ICpkaW1lbnNpb25zLCBpbnQgdHlwZSwgY29uc3Qgd2NoYXJfdCAqZmlsZVBhdGgsIGludCBjb2x1bW5PcmRlcikpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIGludCwgYXZfc2F2ZSwgICh2b2lkICpkYXRhLCBpbnQgcmFuaywgY29uc3QgaW50ICpkaW1lbnNpb25zLCBpbnQgdHlwZSwgY29uc3QgY2hhciAqZmlsZVBhdGgsIGludCBjb2x1bW5PcmRlcikpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2F2X3NhdmVBICAgICBJVFROT1RJRllfREFUQShhdl9zYXZlQSkKKyNkZWZpbmUgX19pdHRfYXZfc2F2ZUFfcHRyIElUVE5PVElGWV9OQU1FKGF2X3NhdmVBKQorI2RlZmluZSBfX2l0dF9hdl9zYXZlVyAgICAgSVRUTk9USUZZX0RBVEEoYXZfc2F2ZVcpCisjZGVmaW5lIF9faXR0X2F2X3NhdmVXX3B0ciBJVFROT1RJRllfTkFNRShhdl9zYXZlVykKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9hdl9zYXZlICAgICBJVFROT1RJRllfREFUQShhdl9zYXZlKQorI2RlZmluZSBfX2l0dF9hdl9zYXZlX3B0ciBJVFROT1RJRllfTkFNRShhdl9zYXZlKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfYXZfc2F2ZUEobmFtZSkKKyNkZWZpbmUgX19pdHRfYXZfc2F2ZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfYXZfc2F2ZVcobmFtZSkKKyNkZWZpbmUgX19pdHRfYXZfc2F2ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9hdl9zYXZlKG5hbWUpCisjZGVmaW5lIF9faXR0X2F2X3NhdmVfcHRyIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9hdl9zYXZlQV9wdHIgMAorI2RlZmluZSBfX2l0dF9hdl9zYXZlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2F2X3NhdmVfcHRyIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKwordm9pZCBJVFRBUEkgX19pdHRfZW5hYmxlX2F0dGFjaCh2b2lkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgZW5hYmxlX2F0dGFjaCwgKHZvaWQpKQorI2RlZmluZSBfX2l0dF9lbmFibGVfYXR0YWNoICAgICBJVFROT1RJRllfVk9JRChlbmFibGVfYXR0YWNoKQorI2RlZmluZSBfX2l0dF9lbmFibGVfYXR0YWNoX3B0ciBJVFROT1RJRllfTkFNRShlbmFibGVfYXR0YWNoKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfZW5hYmxlX2F0dGFjaCgpCisjZGVmaW5lIF9faXR0X2VuYWJsZV9hdHRhY2hfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9lbmFibGVfYXR0YWNoX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZ3BhX2RvY3VtZW50YXRpb24gKi8KKworLyoqIEB9IGFycmF5cyBncm91cCAqLworCisvKiogQGVuZGNvbmQgKi8KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgLyogX0lUVE5PVElGWV9IXyAqLworCisjaWZkZWYgSU5URUxfSVRUTk9USUZZX0FQSV9QUklWQVRFCisKKyNpZm5kZWYgX0lUVE5PVElGWV9QUklWQVRFXworI2RlZmluZSBfSVRUTk9USUZZX1BSSVZBVEVfCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworLyoqCisgKiBAaW5ncm91cCB0YXNrcworICogQGJyaWVmIEJlZ2luIGFuIG92ZXJsYXBwZWQgdGFzayBpbnN0YW5jZS4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gZm9yIHRoaXMgdGFzay4KKyAqIEBwYXJhbVtpbl0gdGFza2lkIFRoZSBpZGVudGlmaWVyIGZvciB0aGlzIHRhc2sgaW5zdGFuY2UsICpjYW5ub3QqIGJlIF9faXR0X251bGwuCisgKiBAcGFyYW1baW5dIHBhcmVudGlkIFRoZSBwYXJlbnQgb2YgdGhpcyB0YXNrLCBvciBfX2l0dF9udWxsLgorICogQHBhcmFtW2luXSBuYW1lIFRoZSBuYW1lIG9mIHRoaXMgdGFzay4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfdGFza19iZWdpbl9vdmVybGFwcGVkKGNvbnN0IF9faXR0X2RvbWFpbiogZG9tYWluLCBfX2l0dF9pZCB0YXNraWQsIF9faXR0X2lkIHBhcmVudGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlKiBuYW1lKTsKKworLyoqCisgKiBAaW5ncm91cCBjbG9ja2RvbWFpbgorICogQGJyaWVmIEJlZ2luIGFuIG92ZXJsYXBwZWQgdGFzayBpbnN0YW5jZS4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gZm9yIHRoaXMgdGFzaworICogQHBhcmFtW2luXSBjbG9ja19kb21haW4gVGhlIGNsb2NrIGRvbWFpbiBjb250cm9sbGluZyB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgY2FsbC4KKyAqIEBwYXJhbVtpbl0gdGltZXN0YW1wIFRoZSB1c2VyIGRlZmluZWQgdGltZXN0YW1wLgorICogQHBhcmFtW2luXSB0YXNraWQgVGhlIGlkZW50aWZpZXIgZm9yIHRoaXMgdGFzayBpbnN0YW5jZSwgKmNhbm5vdCogYmUgX19pdHRfbnVsbC4KKyAqIEBwYXJhbVtpbl0gcGFyZW50aWQgVGhlIHBhcmVudCBvZiB0aGlzIHRhc2ssIG9yIF9faXR0X251bGwuCisgKiBAcGFyYW1baW5dIG5hbWUgVGhlIG5hbWUgb2YgdGhpcyB0YXNrLgorICovCit2b2lkIElUVEFQSSBfX2l0dF90YXNrX2JlZ2luX292ZXJsYXBwZWRfZXgoY29uc3QgX19pdHRfZG9tYWluKiBkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCB0YXNraWQsIF9faXR0X2lkIHBhcmVudGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlKiBuYW1lKTsKKworLyoqCisgKiBAaW5ncm91cCB0YXNrcworICogQGJyaWVmIEVuZCBhbiBvdmVybGFwcGVkIHRhc2sgaW5zdGFuY2UuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGZvciB0aGlzIHRhc2sKKyAqIEBwYXJhbVtpbl0gdGFza2lkIEV4cGxpY2l0IElEIG9mIGZpbmlzaGVkIHRhc2sKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfdGFza19lbmRfb3ZlcmxhcHBlZChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgdGFza2lkKTsKKworLyoqCisgKiBAaW5ncm91cCBjbG9ja2RvbWFpbgorICogQGJyaWVmIEVuZCBhbiBvdmVybGFwcGVkIHRhc2sgaW5zdGFuY2UuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGZvciB0aGlzIHRhc2sKKyAqIEBwYXJhbVtpbl0gY2xvY2tfZG9tYWluIFRoZSBjbG9jayBkb21haW4gY29udHJvbGxpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIGNhbGwuCisgKiBAcGFyYW1baW5dIHRpbWVzdGFtcCBUaGUgdXNlciBkZWZpbmVkIHRpbWVzdGFtcC4KKyAqIEBwYXJhbVtpbl0gdGFza2lkIEV4cGxpY2l0IElEIG9mIGZpbmlzaGVkIHRhc2sKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfdGFza19lbmRfb3ZlcmxhcHBlZF9leChjb25zdCBfX2l0dF9kb21haW4qIGRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIHRhc2tpZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfYmVnaW5fb3ZlcmxhcHBlZCwgICAgICAgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCB0YXNraWQsIF9faXR0X2lkIHBhcmVudGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfYmVnaW5fb3ZlcmxhcHBlZF9leCwgICAgICAgKGNvbnN0IF9faXR0X2RvbWFpbiogZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgdGFza2lkLCBfX2l0dF9pZCBwYXJlbnRpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSogbmFtZSkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2VuZF9vdmVybGFwcGVkLCAgICAgICAgICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgdGFza2lkKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfZW5kX292ZXJsYXBwZWRfZXgsICAgICAgICAgKGNvbnN0IF9faXR0X2RvbWFpbiogZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgdGFza2lkKSkKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9vdmVybGFwcGVkKGQseCx5LHopICAgICAgICAgICAgSVRUTk9USUZZX1ZPSURfRDModGFza19iZWdpbl9vdmVybGFwcGVkLGQseCx5LHopCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fb3ZlcmxhcHBlZF9wdHIgICAgICAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHRhc2tfYmVnaW5fb3ZlcmxhcHBlZCkKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9vdmVybGFwcGVkX2V4KGQseCx5LHosYSxiKSAgICAgSVRUTk9USUZZX1ZPSURfRDUodGFza19iZWdpbl9vdmVybGFwcGVkX2V4LGQseCx5LHosYSxiKQorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX292ZXJsYXBwZWRfZXhfcHRyICAgICAgICAgICAgICBJVFROT1RJRllfTkFNRSh0YXNrX2JlZ2luX292ZXJsYXBwZWRfZXgpCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kX292ZXJsYXBwZWQoZCx4KSAgICAgICAgICAgICAgICAgIElUVE5PVElGWV9WT0lEX0QxKHRhc2tfZW5kX292ZXJsYXBwZWQsZCx4KQorI2RlZmluZSBfX2l0dF90YXNrX2VuZF9vdmVybGFwcGVkX3B0ciAgICAgICAgICAgICAgICAgICBJVFROT1RJRllfTkFNRSh0YXNrX2VuZF9vdmVybGFwcGVkKQorI2RlZmluZSBfX2l0dF90YXNrX2VuZF9vdmVybGFwcGVkX2V4KGQseCx5LHopICAgICAgICAgICBJVFROT1RJRllfVk9JRF9EMyh0YXNrX2VuZF9vdmVybGFwcGVkX2V4LGQseCx5LHopCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kX292ZXJsYXBwZWRfZXhfcHRyICAgICAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHRhc2tfZW5kX292ZXJsYXBwZWRfZXgpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX292ZXJsYXBwZWQoZG9tYWluLHRhc2tpZCxwYXJlbnRpZCxuYW1lKQorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX292ZXJsYXBwZWRfcHRyICAgICAgICAgMAorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX292ZXJsYXBwZWRfZXgoZG9tYWluLGNsb2NrX2RvbWFpbix0aW1lc3RhbXAsdGFza2lkLHBhcmVudGlkLG5hbWUpCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fb3ZlcmxhcHBlZF9leF9wdHIgICAgICAwCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kX292ZXJsYXBwZWQoZG9tYWluLHRhc2tpZCkKKyNkZWZpbmUgX19pdHRfdGFza19lbmRfb3ZlcmxhcHBlZF9wdHIgICAgICAgICAgIDAKKyNkZWZpbmUgX19pdHRfdGFza19lbmRfb3ZlcmxhcHBlZF9leChkb21haW4sY2xvY2tfZG9tYWluLHRpbWVzdGFtcCx0YXNraWQpCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kX292ZXJsYXBwZWRfZXhfcHRyICAgICAgICAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9vdmVybGFwcGVkX3B0ciAgICAgICAgIDAKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9vdmVybGFwcGVkX2V4X3B0ciAgICAgIDAKKyNkZWZpbmUgX19pdHRfdGFza19lbmRfb3ZlcmxhcHBlZF9wdHIgICAgICAgICAgIDAKKyNkZWZpbmUgX19pdHRfdGFza19lbmRfb3ZlcmxhcHBlZF9leF9wdHIgICAgICAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgbWFrcnNfaW50ZXJuYWwgTWFya3MKKyAqIEBpbmdyb3VwIGludGVybmFsCisgKiBNYXJrcyBncm91cAorICogQHdhcm5pbmcgSW50ZXJuYWwgQVBJOgorICogICAtIEl0IGlzIG5vdCBzaGlwcGVkIHRvIG91dHNpZGUgb2YgSW50ZWwKKyAqICAgLSBJdCBpcyBkZWxpdmVyZWQgdG8gaW50ZXJuYWwgSW50ZWwgdGVhbXMgdXNpbmcgZS1tYWlsIG9yIFNWTiBhY2Nlc3Mgb25seQorICogQHsKKyAqLworLyoqIEBicmllZiB1c2VyIG1hcmsgdHlwZSAqLwordHlwZWRlZiBpbnQgX19pdHRfbWFya190eXBlOworCisvKioKKyAqIEBicmllZiBDcmVhdGVzIGEgdXNlciBtYXJrIHR5cGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgdXNpbmcgY2hhciBvciBVbmljb2RlIHN0cmluZy4KKyAqIEBwYXJhbVtpbl0gbmFtZSAtIG5hbWUgb2YgbWFyayB0byBjcmVhdGUKKyAqIEByZXR1cm4gUmV0dXJucyBhIGhhbmRsZSB0byB0aGUgbWFyayB0eXBlCisgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK19faXR0X21hcmtfdHlwZSBJVFRBUEkgX19pdHRfbWFya19jcmVhdGVBKGNvbnN0IGNoYXIgICAgKm5hbWUpOworX19pdHRfbWFya190eXBlIElUVEFQSSBfX2l0dF9tYXJrX2NyZWF0ZVcoY29uc3Qgd2NoYXJfdCAqbmFtZSk7CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorIyAgZGVmaW5lIF9faXR0X21hcmtfY3JlYXRlICAgICBfX2l0dF9tYXJrX2NyZWF0ZVcKKyMgIGRlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZV9wdHIgX19pdHRfbWFya19jcmVhdGVXX3B0cgorI2Vsc2UgLyogVU5JQ09ERSAqLworIyAgZGVmaW5lIF9faXR0X21hcmtfY3JlYXRlICAgICBfX2l0dF9tYXJrX2NyZWF0ZUEKKyMgIGRlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZV9wdHIgX19pdHRfbWFya19jcmVhdGVBX3B0cgorI2VuZGlmIC8qIFVOSUNPREUgKi8KKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworX19pdHRfbWFya190eXBlIElUVEFQSSBfX2l0dF9tYXJrX2NyZWF0ZShjb25zdCBjaGFyICpuYW1lKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9tYXJrX3R5cGUsIG1hcmtfY3JlYXRlQSwgKGNvbnN0IGNoYXIgICAgKm5hbWUpKQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9tYXJrX3R5cGUsIG1hcmtfY3JlYXRlVywgKGNvbnN0IHdjaGFyX3QgKm5hbWUpKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9tYXJrX3R5cGUsIG1hcmtfY3JlYXRlLCAgKGNvbnN0IGNoYXIgKm5hbWUpKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZUEgICAgIElUVE5PVElGWV9EQVRBKG1hcmtfY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfbWFya19jcmVhdGVBX3B0ciBJVFROT1RJRllfTkFNRShtYXJrX2NyZWF0ZUEpCisjZGVmaW5lIF9faXR0X21hcmtfY3JlYXRlVyAgICAgSVRUTk9USUZZX0RBVEEobWFya19jcmVhdGVXKQorI2RlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZVdfcHRyIElUVE5PVElGWV9OQU1FKG1hcmtfY3JlYXRlVykKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZSAgICAgIElUVE5PVElGWV9EQVRBKG1hcmtfY3JlYXRlKQorI2RlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZV9wdHIgIElUVE5PVElGWV9OQU1FKG1hcmtfY3JlYXRlKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbWFya19jcmVhdGVBKG5hbWUpIChfX2l0dF9tYXJrX3R5cGUpMAorI2RlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfbWFya19jcmVhdGVXKG5hbWUpIChfX2l0dF9tYXJrX3R5cGUpMAorI2RlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZShuYW1lKSAgKF9faXR0X21hcmtfdHlwZSkwCisjZGVmaW5lIF9faXR0X21hcmtfY3JlYXRlX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X21hcmtfY3JlYXRlQV9wdHIgMAorI2RlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZV9wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgQ3JlYXRlcyBhICJkaXNjcmV0ZSIgdXNlciBtYXJrIHR5cGUgb2YgdGhlIHNwZWNpZmllZCB0eXBlIGFuZCBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgdXNpbmcgY2hhciBvciBVbmljb2RlIHN0cmluZy4KKyAqCisgKiAtIFRoZSBtYXJrIG9mICJkaXNjcmV0ZSIgdHlwZSBpcyBwbGFjZWQgdG8gY29sbGVjdGlvbiByZXN1bHRzIGluIGNhc2Ugb2Ygc3VjY2Vzcy4gSXQgYXBwZWFycyBpbiBvdmVydGltZSB2aWV3KHMpIGFzIGEgc3BlY2lhbCB0aWNrIHNpZ24uCisgKiAtIFRoZSBjYWxsIGlzICJzeW5jaHJvbm91cyIgLSBmdW5jdGlvbiByZXR1cm5zIGFmdGVyIG1hcmsgaXMgYWN0dWFsbHkgYWRkZWQgdG8gcmVzdWx0cy4KKyAqIC0gVGhpcyBmdW5jdGlvbiBpcyB1c2VmdWwsIGZvciBleGFtcGxlLCB0byBtYXJrIGRpZmZlcmVudCBwaGFzZXMgb2YgYXBwbGljYXRpb24KKyAqICAgKGJlZ2lubmluZyBvZiB0aGUgbmV4dCBtYXJrIGF1dG9tYXRpY2FsbHkgbWVhbmQgZW5kIG9mIGN1cnJlbnQgcmVnaW9uKS4KKyAqIC0gQ2FuIGJlIHVzZWQgdG9nZXRoZXIgd2l0aCAiY29udGludW91cyIgbWFya3MgKHNlZSBiZWxvdykgYXQgdGhlIHNhbWUgY29sbGVjdGlvbiBzZXNzaW9uCisgKiBAcGFyYW1baW5dIG10IC0gbWFyaywgY3JlYXRlZCBieSBfX2l0dF9tYXJrX2NyZWF0ZShjb25zdCBjaGFyKiBuYW1lKSBmdW5jdGlvbgorICogQHBhcmFtW2luXSBwYXJhbWV0ZXIgLSBzdHJpbmcgcGFyYW1ldGVyIG9mIG1hcmsKKyAqIEByZXR1cm4gUmV0dXJucyB6ZXJvIHZhbHVlIGluIGNhc2Ugb2Ygc3VjY2Vzcywgbm9uLXplcm8gdmFsdWUgb3RoZXJ3aXNlLgorICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitpbnQgSVRUQVBJIF9faXR0X21hcmtBKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3QgY2hhciAgICAqcGFyYW1ldGVyKTsKK2ludCBJVFRBUEkgX19pdHRfbWFya1coX19pdHRfbWFya190eXBlIG10LCBjb25zdCB3Y2hhcl90ICpwYXJhbWV0ZXIpOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9tYXJrICAgICBfX2l0dF9tYXJrVworIyAgZGVmaW5lIF9faXR0X21hcmtfcHRyIF9faXR0X21hcmtXX3B0cgorI2Vsc2UgLyogVU5JQ09ERSAgKi8KKyMgIGRlZmluZSBfX2l0dF9tYXJrICAgICBfX2l0dF9tYXJrQQorIyAgZGVmaW5lIF9faXR0X21hcmtfcHRyIF9faXR0X21hcmtBX3B0cgorI2VuZGlmIC8qIFVOSUNPREUgKi8KKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworaW50IElUVEFQSSBfX2l0dF9tYXJrKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3QgY2hhciAqcGFyYW1ldGVyKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBpbnQsIG1hcmtBLCAoX19pdHRfbWFya190eXBlIG10LCBjb25zdCBjaGFyICAgICpwYXJhbWV0ZXIpKQorSVRUX1NUVUIoSVRUQVBJLCBpbnQsIG1hcmtXLCAoX19pdHRfbWFya190eXBlIG10LCBjb25zdCB3Y2hhcl90ICpwYXJhbWV0ZXIpKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBpbnQsIG1hcmssICAoX19pdHRfbWFya190eXBlIG10LCBjb25zdCBjaGFyICpwYXJhbWV0ZXIpKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tYXJrQSAgICAgSVRUTk9USUZZX0RBVEEobWFya0EpCisjZGVmaW5lIF9faXR0X21hcmtBX3B0ciBJVFROT1RJRllfTkFNRShtYXJrQSkKKyNkZWZpbmUgX19pdHRfbWFya1cgICAgIElUVE5PVElGWV9EQVRBKG1hcmtXKQorI2RlZmluZSBfX2l0dF9tYXJrV19wdHIgSVRUTk9USUZZX05BTUUobWFya1cpCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfbWFyayAgICAgIElUVE5PVElGWV9EQVRBKG1hcmspCisjZGVmaW5lIF9faXR0X21hcmtfcHRyICBJVFROT1RJRllfTkFNRShtYXJrKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbWFya0EobXQsIHBhcmFtZXRlcikgKGludCkwCisjZGVmaW5lIF9faXR0X21hcmtBX3B0ciAwCisjZGVmaW5lIF9faXR0X21hcmtXKG10LCBwYXJhbWV0ZXIpIChpbnQpMAorI2RlZmluZSBfX2l0dF9tYXJrV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X21hcmsobXQsIHBhcmFtZXRlcikgIChpbnQpMAorI2RlZmluZSBfX2l0dF9tYXJrX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X21hcmtBX3B0ciAwCisjZGVmaW5lIF9faXR0X21hcmtXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfbWFya19wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgVXNlIHRoaXMgaWYgbmVjZXNzYXJ5IHRvIGNyZWF0ZSBhICJkaXNjcmV0ZSIgdXNlciBldmVudCB0eXBlIChtYXJrKSBmb3IgcHJvY2VzcworICogcmF0aGVyIHRoZW4gZm9yIG9uZSB0aHJlYWQKKyAqIEBzZWUgaW50IF9faXR0X21hcmsoX19pdHRfbWFya190eXBlIG10LCBjb25zdCBjaGFyKiBwYXJhbWV0ZXIpOworICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitpbnQgSVRUQVBJIF9faXR0X21hcmtfZ2xvYmFsQShfX2l0dF9tYXJrX3R5cGUgbXQsIGNvbnN0IGNoYXIgICAgKnBhcmFtZXRlcik7CitpbnQgSVRUQVBJIF9faXR0X21hcmtfZ2xvYmFsVyhfX2l0dF9tYXJrX3R5cGUgbXQsIGNvbnN0IHdjaGFyX3QgKnBhcmFtZXRlcik7CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorIyAgZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsICAgICBfX2l0dF9tYXJrX2dsb2JhbFcKKyMgIGRlZmluZSBfX2l0dF9tYXJrX2dsb2JhbF9wdHIgX19pdHRfbWFya19nbG9iYWxXX3B0cgorI2Vsc2UgLyogVU5JQ09ERSAgKi8KKyMgIGRlZmluZSBfX2l0dF9tYXJrX2dsb2JhbCAgICAgX19pdHRfbWFya19nbG9iYWxBCisjICBkZWZpbmUgX19pdHRfbWFya19nbG9iYWxfcHRyIF9faXR0X21hcmtfZ2xvYmFsQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK2ludCBJVFRBUEkgX19pdHRfbWFya19nbG9iYWwoX19pdHRfbWFya190eXBlIG10LCBjb25zdCBjaGFyICpwYXJhbWV0ZXIpOworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihJVFRBUEksIGludCwgbWFya19nbG9iYWxBLCAoX19pdHRfbWFya190eXBlIG10LCBjb25zdCBjaGFyICAgICpwYXJhbWV0ZXIpKQorSVRUX1NUVUIoSVRUQVBJLCBpbnQsIG1hcmtfZ2xvYmFsVywgKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3Qgd2NoYXJfdCAqcGFyYW1ldGVyKSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgaW50LCBtYXJrX2dsb2JhbCwgIChfX2l0dF9tYXJrX3R5cGUgbXQsIGNvbnN0IGNoYXIgKnBhcmFtZXRlcikpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsQSAgICAgSVRUTk9USUZZX0RBVEEobWFya19nbG9iYWxBKQorI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbEFfcHRyIElUVE5PVElGWV9OQU1FKG1hcmtfZ2xvYmFsQSkKKyNkZWZpbmUgX19pdHRfbWFya19nbG9iYWxXICAgICBJVFROT1RJRllfREFUQShtYXJrX2dsb2JhbFcpCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsV19wdHIgSVRUTk9USUZZX05BTUUobWFya19nbG9iYWxXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsICAgICAgSVRUTk9USUZZX0RBVEEobWFya19nbG9iYWwpCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsX3B0ciAgSVRUTk9USUZZX05BTUUobWFya19nbG9iYWwpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbEEobXQsIHBhcmFtZXRlcikgKGludCkwCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsQV9wdHIgMAorI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbFcobXQsIHBhcmFtZXRlcikgKGludCkwCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsKG10LCBwYXJhbWV0ZXIpICAoaW50KTAKKyNkZWZpbmUgX19pdHRfbWFya19nbG9iYWxfcHRyICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbWFya19nbG9iYWxBX3B0ciAwCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBDcmVhdGVzIGFuICJlbmQiIHBvaW50IGZvciAiY29udGludW91cyIgbWFyayB3aXRoIHNwZWNpZmllZCBuYW1lLgorICoKKyAqIC0gUmV0dXJucyB6ZXJvIHZhbHVlIGluIGNhc2Ugb2Ygc3VjY2Vzcywgbm9uLXplcm8gdmFsdWUgb3RoZXJ3aXNlLgorICogICBBbHNvIHJldHVybnMgbm9uLXplcm8gdmFsdWUgd2hlbiBwcmVjZWRpbmcgImJlZ2luIiBwb2ludCBmb3IgdGhlCisgKiAgIG1hcmsgd2l0aCB0aGUgc2FtZSBuYW1lIGZhaWxlZCB0byBiZSBjcmVhdGVkIG9yIG5vdCBjcmVhdGVkLgorICogLSBUaGUgbWFyayBvZiAiY29udGludW91cyIgdHlwZSBpcyBwbGFjZWQgdG8gY29sbGVjdGlvbiByZXN1bHRzIGluCisgKiAgIGNhc2Ugb2Ygc3VjY2Vzcy4gSXQgYXBwZWFycyBpbiBvdmVydGltZSB2aWV3KHMpIGFzIGEgc3BlY2lhbCB0aWNrCisgKiAgIHNpZ24gKGRpZmZlcmVudCBmcm9tICJkaXNjcmV0ZSIgbWFyaykgdG9nZXRoZXIgd2l0aCBsaW5lIGZyb20KKyAqICAgY29ycmVzcG9uZGluZyAiYmVnaW4iIG1hcmsgdG8gImVuZCIgbWFyay4KKyAqIEBub3RlIENvbnRpbnVvdXMgbWFya3MgY2FuIG92ZXJsYXAgYW5kIGJlIG5lc3RlZCBpbnNpZGUgZWFjaCBvdGhlci4KKyAqIERpc2NyZXRlIG1hcmsgY2FuIGJlIG5lc3RlZCBpbnNpZGUgbWFya2VkIHJlZ2lvbgorICogQHBhcmFtW2luXSBtdCAtIG1hcmssIGNyZWF0ZWQgYnkgX19pdHRfbWFya19jcmVhdGUoY29uc3QgY2hhciogbmFtZSkgZnVuY3Rpb24KKyAqIEByZXR1cm4gUmV0dXJucyB6ZXJvIHZhbHVlIGluIGNhc2Ugb2Ygc3VjY2Vzcywgbm9uLXplcm8gdmFsdWUgb3RoZXJ3aXNlLgorICovCitpbnQgSVRUQVBJIF9faXR0X21hcmtfb2ZmKF9faXR0X21hcmtfdHlwZSBtdCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCKElUVEFQSSwgaW50LCBtYXJrX29mZiwgKF9faXR0X21hcmtfdHlwZSBtdCkpCisjZGVmaW5lIF9faXR0X21hcmtfb2ZmICAgICBJVFROT1RJRllfREFUQShtYXJrX29mZikKKyNkZWZpbmUgX19pdHRfbWFya19vZmZfcHRyIElUVE5PVElGWV9OQU1FKG1hcmtfb2ZmKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbWFya19vZmYobXQpIChpbnQpMAorI2RlZmluZSBfX2l0dF9tYXJrX29mZl9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X21hcmtfb2ZmX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFVzZSB0aGlzIGlmIG5lY2Vzc2FyeSB0byBjcmVhdGUgYW4gImVuZCIgcG9pbnQgZm9yIG1hcmsgb2YgcHJvY2VzcworICogQHNlZSBpbnQgX19pdHRfbWFya19vZmYoX19pdHRfbWFya190eXBlIG10KTsKKyAqLworaW50IElUVEFQSSBfX2l0dF9tYXJrX2dsb2JhbF9vZmYoX19pdHRfbWFya190eXBlIG10KTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUIoSVRUQVBJLCBpbnQsIG1hcmtfZ2xvYmFsX29mZiwgKF9faXR0X21hcmtfdHlwZSBtdCkpCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsX29mZiAgICAgSVRUTk9USUZZX0RBVEEobWFya19nbG9iYWxfb2ZmKQorI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbF9vZmZfcHRyIElUVE5PVElGWV9OQU1FKG1hcmtfZ2xvYmFsX29mZikKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsX29mZihtdCkgKGludCkwCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsX29mZl9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsX29mZl9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IG1hcmtzIGdyb3VwICovCisKKy8qKgorICogQGRlZmdyb3VwIGNvdW50ZXJzX2ludGVybmFsIENvdW50ZXJzCisgKiBAaW5ncm91cCBpbnRlcm5hbAorICogQ291bnRlcnMgZ3JvdXAKKyAqIEB7CisgKi8KKy8qKgorICogQGJyaWVmIG9wYXF1ZSBzdHJ1Y3R1cmUgZm9yIGNvdW50ZXIgaWRlbnRpZmljYXRpb24KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX19faXR0X2NvdW50ZXIgKl9faXR0X2NvdW50ZXI7CisKKy8qKgorICogQGJyaWVmIENyZWF0ZSBhIGNvdW50ZXIgd2l0aCBnaXZlbiBuYW1lL2RvbWFpbiBmb3IgdGhlIGNhbGxpbmcgdGhyZWFkCisgKgorICogQWZ0ZXIgX19pdHRfY291bnRlcl9jcmVhdGUoKSBpcyBjYWxsZWQsIF9faXR0X2NvdW50ZXJfaW5jKCkgLyBfX2l0dF9jb3VudGVyX2luY19kZWx0YSgpIGNhbiBiZSB1c2VkCisgKiB0byBpbmNyZW1lbnQgdGhlIGNvdW50ZXIgb24gYW55IHRocmVhZAorICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitfX2l0dF9jb3VudGVyIElUVEFQSSBfX2l0dF9jb3VudGVyX2NyZWF0ZUEoY29uc3QgY2hhciAgICAqbmFtZSwgY29uc3QgY2hhciAgICAqZG9tYWluKTsKK19faXR0X2NvdW50ZXIgSVRUQVBJIF9faXR0X2NvdW50ZXJfY3JlYXRlVyhjb25zdCB3Y2hhcl90ICpuYW1lLCBjb25zdCB3Y2hhcl90ICpkb21haW4pOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9jb3VudGVyX2NyZWF0ZSAgICAgX19pdHRfY291bnRlcl9jcmVhdGVXCisjICBkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGVfcHRyIF9faXR0X2NvdW50ZXJfY3JlYXRlV19wdHIKKyNlbHNlIC8qIFVOSUNPREUgKi8KKyMgIGRlZmluZSBfX2l0dF9jb3VudGVyX2NyZWF0ZSAgICAgX19pdHRfY291bnRlcl9jcmVhdGVBCisjICBkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGVfcHRyIF9faXR0X2NvdW50ZXJfY3JlYXRlQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK19faXR0X2NvdW50ZXIgSVRUQVBJIF9faXR0X2NvdW50ZXJfY3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRvbWFpbik7CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfY291bnRlciwgY291bnRlcl9jcmVhdGVBLCAoY29uc3QgY2hhciAgICAqbmFtZSwgY29uc3QgY2hhciAgICAqZG9tYWluKSkKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfY291bnRlciwgY291bnRlcl9jcmVhdGVXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSwgY29uc3Qgd2NoYXJfdCAqZG9tYWluKSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfY291bnRlciwgY291bnRlcl9jcmVhdGUsICAoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZG9tYWluKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGVBICAgICBJVFROT1RJRllfREFUQShjb3VudGVyX2NyZWF0ZUEpCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfY3JlYXRlQV9wdHIgSVRUTk9USUZZX05BTUUoY291bnRlcl9jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2NyZWF0ZVcgICAgIElUVE5PVElGWV9EQVRBKGNvdW50ZXJfY3JlYXRlVykKKyNkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGVXX3B0ciBJVFROT1RJRllfTkFNRShjb3VudGVyX2NyZWF0ZVcpCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGUgICAgIElUVE5PVElGWV9EQVRBKGNvdW50ZXJfY3JlYXRlKQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2NyZWF0ZV9wdHIgSVRUTk9USUZZX05BTUUoY291bnRlcl9jcmVhdGUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9jb3VudGVyX2NyZWF0ZUEobmFtZSwgZG9tYWluKQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2NyZWF0ZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGVXKG5hbWUsIGRvbWFpbikKKyNkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGUobmFtZSwgZG9tYWluKQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2NyZWF0ZV9wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9jb3VudGVyX2NyZWF0ZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGVfcHRyICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIERlc3Ryb3kgdGhlIGNvdW50ZXIgaWRlbnRpZmllZCBieSB0aGUgcG9pbnRlciBwcmV2aW91c2x5IHJldHVybmVkIGJ5IF9faXR0X2NvdW50ZXJfY3JlYXRlKCkKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfY291bnRlcl9kZXN0cm95KF9faXR0X2NvdW50ZXIgaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBjb3VudGVyX2Rlc3Ryb3ksIChfX2l0dF9jb3VudGVyIGlkKSkKKyNkZWZpbmUgX19pdHRfY291bnRlcl9kZXN0cm95ICAgICBJVFROT1RJRllfVk9JRChjb3VudGVyX2Rlc3Ryb3kpCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfZGVzdHJveV9wdHIgSVRUTk9USUZZX05BTUUoY291bnRlcl9kZXN0cm95KQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfY291bnRlcl9kZXN0cm95KGlkKQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2Rlc3Ryb3lfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9jb3VudGVyX2Rlc3Ryb3lfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgSW5jcmVtZW50IHRoZSBjb3VudGVyIHZhbHVlCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2NvdW50ZXJfaW5jKF9faXR0X2NvdW50ZXIgaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBjb3VudGVyX2luYywgKF9faXR0X2NvdW50ZXIgaWQpKQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2luYyAgICAgSVRUTk9USUZZX1ZPSUQoY291bnRlcl9pbmMpCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfaW5jX3B0ciBJVFROT1RJRllfTkFNRShjb3VudGVyX2luYykKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfaW5jKGlkKQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2luY19wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfaW5jX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIEluY3JlbWVudCB0aGUgY291bnRlciB2YWx1ZSB3aXRoIHgKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfY291bnRlcl9pbmNfZGVsdGEoX19pdHRfY291bnRlciBpZCwgdW5zaWduZWQgbG9uZyBsb25nIHZhbHVlKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgY291bnRlcl9pbmNfZGVsdGEsIChfX2l0dF9jb3VudGVyIGlkLCB1bnNpZ25lZCBsb25nIGxvbmcgdmFsdWUpKQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2luY19kZWx0YSAgICAgSVRUTk9USUZZX1ZPSUQoY291bnRlcl9pbmNfZGVsdGEpCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfaW5jX2RlbHRhX3B0ciBJVFROT1RJRllfTkFNRShjb3VudGVyX2luY19kZWx0YSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfaW5jX2RlbHRhKGlkLCB2YWx1ZSkKKyNkZWZpbmUgX19pdHRfY291bnRlcl9pbmNfZGVsdGFfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9jb3VudGVyX2luY19kZWx0YV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IGNvdW50ZXJzIGdyb3VwICovCisKKy8qKgorICogQGRlZmdyb3VwIHN0aXRjaCBTdGFjayBTdGl0Y2hpbmcKKyAqIEBpbmdyb3VwIGludGVybmFsCisgKiBTdGFjayBTdGl0Y2hpbmcgZ3JvdXAKKyAqIEB7CisgKi8KKy8qKgorICogQGJyaWVmIG9wYXF1ZSBzdHJ1Y3R1cmUgZm9yIGNvdW50ZXIgaWRlbnRpZmljYXRpb24KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX19faXR0X2NhbGxlciAqX19pdHRfY2FsbGVyOworCisvKioKKyAqIEBicmllZiBDcmVhdGUgdGhlIHN0aXRjaCBwb2ludCBlLmcuIGEgcG9pbnQgaW4gY2FsbCBzdGFjayB3aGVyZSBvdGhlciBzdGFja3Mgc2hvdWxkIGJlIHN0aXRjaGVkIHRvLgorICogVGhlIGZ1bmN0aW9uIHJldHVybnMgYSB1bmlxdWUgaWRlbnRpZmllciB3aGljaCBpcyB1c2VkIHRvIG1hdGNoIHRoZSBjdXQgcG9pbnRzIHdpdGggY29ycmVzcG9uZGluZyBzdGl0Y2ggcG9pbnRzLgorICovCitfX2l0dF9jYWxsZXIgSVRUQVBJIF9faXR0X3N0YWNrX2NhbGxlcl9jcmVhdGUodm9pZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfY2FsbGVyLCBzdGFja19jYWxsZXJfY3JlYXRlLCAodm9pZCkpCisjZGVmaW5lIF9faXR0X3N0YWNrX2NhbGxlcl9jcmVhdGUgICAgIElUVE5PVElGWV9EQVRBKHN0YWNrX2NhbGxlcl9jcmVhdGUpCisjZGVmaW5lIF9faXR0X3N0YWNrX2NhbGxlcl9jcmVhdGVfcHRyIElUVE5PVElGWV9OQU1FKHN0YWNrX2NhbGxlcl9jcmVhdGUpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZXJfY3JlYXRlKCkgKF9faXR0X2NhbGxlcikwCisjZGVmaW5lIF9faXR0X3N0YWNrX2NhbGxlcl9jcmVhdGVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZXJfY3JlYXRlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIERlc3Ryb3kgdGhlIGluZm9yYW10aW9uIGFib3V0IHN0aXRjaCBwb2ludCBpZGVudGlmaWVkIGJ5IHRoZSBwb2ludGVyIHByZXZpb3VzbHkgcmV0dXJuZWQgYnkgX19pdHRfc3RhY2tfY2FsbGVyX2NyZWF0ZSgpCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3N0YWNrX2NhbGxlcl9kZXN0cm95KF9faXR0X2NhbGxlciBpZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN0YWNrX2NhbGxlcl9kZXN0cm95LCAoX19pdHRfY2FsbGVyIGlkKSkKKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVyX2Rlc3Ryb3kgICAgIElUVE5PVElGWV9WT0lEKHN0YWNrX2NhbGxlcl9kZXN0cm95KQorI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZXJfZGVzdHJveV9wdHIgSVRUTk9USUZZX05BTUUoc3RhY2tfY2FsbGVyX2Rlc3Ryb3kpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZXJfZGVzdHJveShpZCkKKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVyX2Rlc3Ryb3lfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZXJfZGVzdHJveV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBTZXRzIHRoZSBjdXQgcG9pbnQuIFN0YWNrIGZyb20gZWFjaCBldmVudCB3aGljaCBvY2N1cnMgYWZ0ZXIgdGhpcyBjYWxsIHdpbGwgYmUgY3V0CisgKiBhdCB0aGUgc2FtZSBzdGFjayBsZXZlbCB0aGUgZnVuY3Rpb24gd2FzIGNhbGxlZCBhbmQgc3RpdGNoZWQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgc3RpdGNoIHBvaW50LgorICovCit2b2lkIElUVEFQSSBfX2l0dF9zdGFja19jYWxsZWVfZW50ZXIoX19pdHRfY2FsbGVyIGlkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3RhY2tfY2FsbGVlX2VudGVyLCAoX19pdHRfY2FsbGVyIGlkKSkKKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVlX2VudGVyICAgICBJVFROT1RJRllfVk9JRChzdGFja19jYWxsZWVfZW50ZXIpCisjZGVmaW5lIF9faXR0X3N0YWNrX2NhbGxlZV9lbnRlcl9wdHIgSVRUTk9USUZZX05BTUUoc3RhY2tfY2FsbGVlX2VudGVyKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVlX2VudGVyKGlkKQorI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZWVfZW50ZXJfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZWVfZW50ZXJfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgVGhpcyBmdW5jdGlvbiBlbGltaW5hdGVzIHRoZSBjdXQgcG9pbnQgd2hpY2ggd2FzIHNldCBieSBsYXRlc3QgX19pdHRfc3RhY2tfY2FsbGVlX2VudGVyKCkuCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3N0YWNrX2NhbGxlZV9sZWF2ZShfX2l0dF9jYWxsZXIgaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzdGFja19jYWxsZWVfbGVhdmUsIChfX2l0dF9jYWxsZXIgaWQpKQorI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZWVfbGVhdmUgICAgIElUVE5PVElGWV9WT0lEKHN0YWNrX2NhbGxlZV9sZWF2ZSkKKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVlX2xlYXZlX3B0ciBJVFROT1RJRllfTkFNRShzdGFja19jYWxsZWVfbGVhdmUpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZWVfbGVhdmUoaWQpCisjZGVmaW5lIF9faXR0X3N0YWNrX2NhbGxlZV9sZWF2ZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3N0YWNrX2NhbGxlZV9sZWF2ZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKiogQH0gc3RpdGNoIGdyb3VwICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCit0eXBlZGVmIGVudW0gX19pdHRfZXJyb3JfY29kZQoreworICAgIF9faXR0X2Vycm9yX3N1Y2Nlc3MgICAgICAgPSAwLCAvKiE8IG5vIGVycm9yICovCisgICAgX19pdHRfZXJyb3Jfbm9fbW9kdWxlICAgICA9IDEsIC8qITwgbW9kdWxlIGNhbid0IGJlIGxvYWRlZCAqLworICAgIC8qICUxJHMgLS0gbGlicmFyeSBuYW1lOyB3aW46ICUyJGQgLS0gc3lzdGVtIGVycm9yIGNvZGU7IHVueDogJTIkcyAtLSBzeXN0ZW0gZXJyb3IgbWVzc2FnZS4gKi8KKyAgICBfX2l0dF9lcnJvcl9ub19zeW1ib2wgICAgID0gMiwgLyohPCBzeW1ib2wgbm90IGZvdW5kICovCisgICAgLyogJTEkcyAtLSBsaWJyYXJ5IG5hbWUsICUyJHMgLS0gc3ltYm9sIG5hbWUuICovCisgICAgX19pdHRfZXJyb3JfdW5rbm93bl9ncm91cCA9IDMsIC8qITwgdW5rbm93biBncm91cCBzcGVjaWZpZWQgKi8KKyAgICAvKiAlMSRzIC0tIGVudiB2YXIgbmFtZSwgJTIkcyAtLSBncm91cCBuYW1lLiAqLworICAgIF9faXR0X2Vycm9yX2NhbnRfcmVhZF9lbnYgPSA0LCAvKiE8IEdldEVudmlyb25tZW50VmFyaWFibGUoKSBmYWlsZWQgKi8KKyAgICAvKiAlMSRzIC0tIGVudiB2YXIgbmFtZSwgJTIkZCAtLSBzeXN0ZW0gZXJyb3IuICovCisgICAgX19pdHRfZXJyb3JfZW52X3Rvb19sb25nICA9IDUsIC8qITwgdmFyaWFibGUgdmFsdWUgdG9vIGxvbmcgKi8KKyAgICAvKiAlMSRzIC0tIGVudiB2YXIgbmFtZSwgJTIkZCAtLSBhY3R1YWwgbGVuZ3RoIG9mIHRoZSB2YXIsICUzJGQgLS0gbWF4IGFsbG93ZWQgbGVuZ3RoLiAqLworICAgIF9faXR0X2Vycm9yX3N5c3RlbSAgICAgICAgPSA2ICAvKiE8IHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQgb3IgcHRocmVhZF9tdXRleF9pbml0IGZhaWxlZCAqLworICAgIC8qICUxJHMgLS0gZnVuY3Rpb24gbmFtZSwgJTIkZCAtLSBlcnJuby4gKi8KK30gX19pdHRfZXJyb3JfY29kZTsKKwordHlwZWRlZiB2b2lkIChfX2l0dF9lcnJvcl9oYW5kbGVyX3QpKF9faXR0X2Vycm9yX2NvZGUgY29kZSwgdmFfbGlzdCk7CitfX2l0dF9lcnJvcl9oYW5kbGVyX3QqIF9faXR0X3NldF9lcnJvcl9oYW5kbGVyKF9faXR0X2Vycm9yX2hhbmRsZXJfdCopOworCitjb25zdCBjaGFyKiBJVFRBUEkgX19pdHRfYXBpX3ZlcnNpb24odm9pZCk7CisvKiogQGVuZGNvbmQgKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2RlZmluZSBfX2l0dF9lcnJvcl9oYW5kbGVyIElUVF9KT0lOKElOVEVMX0lUVE5PVElGWV9QUkVGSVgsIGVycm9yX2hhbmRsZXIpCit2b2lkIF9faXR0X2Vycm9yX2hhbmRsZXIoX19pdHRfZXJyb3JfY29kZSBjb2RlLCB2YV9saXN0IGFyZ3MpOworZXh0ZXJuIGNvbnN0IGludCBJVFROT1RJRllfTkFNRShlcnIpOworI2RlZmluZSBfX2l0dF9lcnIgSVRUTk9USUZZX05BTUUoZXJyKQorSVRUX1NUVUIoSVRUQVBJLCBjb25zdCBjaGFyKiwgYXBpX3ZlcnNpb24sICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfYXBpX3ZlcnNpb24gICAgIElUVE5PVElGWV9EQVRBKGFwaV92ZXJzaW9uKQorI2RlZmluZSBfX2l0dF9hcGlfdmVyc2lvbl9wdHIgSVRUTk9USUZZX05BTUUoYXBpX3ZlcnNpb24pCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9hcGlfdmVyc2lvbigpICAgKGNvbnN0IGNoYXIqKTAKKyNkZWZpbmUgX19pdHRfYXBpX3ZlcnNpb25fcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9hcGlfdmVyc2lvbl9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgLyogX0lUVE5PVElGWV9QUklWQVRFXyAqLworCisjZW5kaWYgLyogSU5URUxfSVRUTk9USUZZX0FQSV9QUklWQVRFICovCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9pdHRub3RpZnlfY29uZmlnLmggYi9maW5hbC9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9pdHRub3RpZnlfY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU3YjM2YgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeV9jb25maWcuaApAQCAtMCwwICsxLDQ2NiBAQAorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9JVFROT1RJRllfQ09ORklHX0hfCisjZGVmaW5lIF9JVFROT1RJRllfQ09ORklHX0hfCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJVFRfT1NfV0lOCisjICBkZWZpbmUgSVRUX09TX1dJTiAgIDEKKyNlbmRpZiAvKiBJVFRfT1NfV0lOICovCisKKyNpZm5kZWYgSVRUX09TX0xJTlVYCisjICBkZWZpbmUgSVRUX09TX0xJTlVYIDIKKyNlbmRpZiAvKiBJVFRfT1NfTElOVVggKi8KKworI2lmbmRlZiBJVFRfT1NfTUFDCisjICBkZWZpbmUgSVRUX09TX01BQyAgIDMKKyNlbmRpZiAvKiBJVFRfT1NfTUFDICovCisKKyNpZm5kZWYgSVRUX09TCisjICBpZiBkZWZpbmVkIFdJTjMyIHx8IGRlZmluZWQgX1dJTjMyCisjICAgIGRlZmluZSBJVFRfT1MgSVRUX09TX1dJTgorIyAgZWxpZiBkZWZpbmVkKCBfX0FQUExFX18gKSAmJiBkZWZpbmVkKCBfX01BQ0hfXyApCisjICAgIGRlZmluZSBJVFRfT1MgSVRUX09TX01BQworIyAgZWxzZQorIyAgICBkZWZpbmUgSVRUX09TIElUVF9PU19MSU5VWAorIyAgZW5kaWYKKyNlbmRpZiAvKiBJVFRfT1MgKi8KKworI2lmbmRlZiBJVFRfUExBVEZPUk1fV0lOCisjICBkZWZpbmUgSVRUX1BMQVRGT1JNX1dJTiAxCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNX1dJTiAqLworCisjaWZuZGVmIElUVF9QTEFURk9STV9QT1NJWAorIyAgZGVmaW5lIElUVF9QTEFURk9STV9QT1NJWCAyCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNX1BPU0lYICovCisKKyNpZm5kZWYgSVRUX1BMQVRGT1JNX01BQworIyAgZGVmaW5lIElUVF9QTEFURk9STV9NQUMgMworI2VuZGlmIC8qIElUVF9QTEFURk9STV9NQUMgKi8KKworI2lmbmRlZiBJVFRfUExBVEZPUk0KKyMgIGlmIElUVF9PUz09SVRUX09TX1dJTgorIyAgICBkZWZpbmUgSVRUX1BMQVRGT1JNIElUVF9QTEFURk9STV9XSU4KKyMgIGVsaWYgSVRUX09TPT1JVFRfT1NfTUFDCisjICAgIGRlZmluZSBJVFRfUExBVEZPUk0gSVRUX1BMQVRGT1JNX01BQworIyAgZWxzZQorIyAgICBkZWZpbmUgSVRUX1BMQVRGT1JNIElUVF9QTEFURk9STV9QT1NJWAorIyAgZW5kaWYKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk0gKi8KKworI2lmIGRlZmluZWQoX1VOSUNPREUpICYmICFkZWZpbmVkKFVOSUNPREUpCisjZGVmaW5lIFVOSUNPREUKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjaW5jbHVkZSA8dGNoYXIuaD4KKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjaW5jbHVkZSA8d2NoYXIuaD4KKyNlbmRpZiAvKiBVTklDT0RFIHx8IF9VTklDT0RFICovCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKyNpZm5kZWYgQ0RFQ0wKKyMgIGlmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorIyAgICBkZWZpbmUgQ0RFQ0wgX19jZGVjbAorIyAgZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyMgICAgaWYgZGVmaW5lZCBfTV9JWDg2IHx8IGRlZmluZWQgX19pMzg2X18KKyMgICAgICBkZWZpbmUgQ0RFQ0wgX19hdHRyaWJ1dGVfXyAoKGNkZWNsKSkKKyMgICAgZWxzZSAgLyogX01fSVg4NiB8fCBfX2kzODZfXyAqLworIyAgICAgIGRlZmluZSBDREVDTCAvKiBhY3R1YWwgb25seSBvbiB4ODYgcGxhdGZvcm0gKi8KKyMgICAgZW5kaWYgLyogX01fSVg4NiB8fCBfX2kzODZfXyAqLworIyAgZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogQ0RFQ0wgKi8KKworI2lmbmRlZiBTVERDQUxMCisjICBpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyMgICAgZGVmaW5lIFNURENBTEwgX19zdGRjYWxsCisjICBlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworIyAgICBpZiBkZWZpbmVkIF9NX0lYODYgfHwgZGVmaW5lZCBfX2kzODZfXworIyAgICAgIGRlZmluZSBTVERDQUxMIF9fYXR0cmlidXRlX18gKChzdGRjYWxsKSkKKyMgICAgZWxzZSAgLyogX01fSVg4NiB8fCBfX2kzODZfXyAqLworIyAgICAgIGRlZmluZSBTVERDQUxMIC8qIHN1cHBvcnRlZCBvbmx5IG9uIHg4NiBwbGF0Zm9ybSAqLworIyAgICBlbmRpZiAvKiBfTV9JWDg2IHx8IF9faTM4Nl9fICovCisjICBlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBTVERDQUxMICovCisKKyNkZWZpbmUgSVRUQVBJICAgIENERUNMCisjZGVmaW5lIExJQklUVEFQSSBDREVDTAorCisvKiBUT0RPOiBUZW1wb3JhcnkgZm9yIGNvbXBhdGliaWxpdHkhICovCisjZGVmaW5lIElUVEFQSV9DQUxMICAgIENERUNMCisjZGVmaW5lIExJQklUVEFQSV9DQUxMIENERUNMCisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKy8qIHVzZSBfX2ZvcmNlaW5saW5lIChWQysrIHNwZWNpZmljKSAqLworI2RlZmluZSBJVFRfSU5MSU5FICAgICAgICAgICBfX2ZvcmNlaW5saW5lCisjZGVmaW5lIElUVF9JTkxJTkVfQVRUUklCVVRFIC8qIG5vdGhpbmcgKi8KKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKy8qCisgKiBHZW5lcmFsbHksIGZ1bmN0aW9ucyBhcmUgbm90IGlubGluZWQgdW5sZXNzIG9wdGltaXphdGlvbiBpcyBzcGVjaWZpZWQuCisgKiBGb3IgZnVuY3Rpb25zIGRlY2xhcmVkIGlubGluZSwgdGhpcyBhdHRyaWJ1dGUgaW5saW5lcyB0aGUgZnVuY3Rpb24gZXZlbgorICogaWYgbm8gb3B0aW1pemF0aW9uIGxldmVsIHdhcyBzcGVjaWZpZWQuCisgKi8KKyNpZmRlZiBfX1NUUklDVF9BTlNJX18KKyNkZWZpbmUgSVRUX0lOTElORSAgICAgICAgICAgc3RhdGljCisjZWxzZSAgLyogX19TVFJJQ1RfQU5TSV9fICovCisjZGVmaW5lIElUVF9JTkxJTkUgICAgICAgICAgIHN0YXRpYyBpbmxpbmUKKyNlbmRpZiAvKiBfX1NUUklDVF9BTlNJX18gKi8KKyNkZWZpbmUgSVRUX0lOTElORV9BVFRSSUJVVEUgX19hdHRyaWJ1dGVfXyAoKGFsd2F5c19pbmxpbmUsIHVudXNlZCkpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisvKiogQGVuZGNvbmQgKi8KKworI2lmbmRlZiBJVFRfQVJDSF9JQTMyCisjICBkZWZpbmUgSVRUX0FSQ0hfSUEzMiAgMQorI2VuZGlmIC8qIElUVF9BUkNIX0lBMzIgKi8KKworI2lmbmRlZiBJVFRfQVJDSF9JQTMyRQorIyAgZGVmaW5lIElUVF9BUkNIX0lBMzJFIDIKKyNlbmRpZiAvKiBJVFRfQVJDSF9JQTMyRSAqLworCisjaWZuZGVmIElUVF9BUkNIX0FSTQorIyAgZGVmaW5lIElUVF9BUkNIX0FSTSAgNAorI2VuZGlmIC8qIElUVF9BUkNIX0FSTSAqLworCisjaWZuZGVmIElUVF9BUkNIX1BQQzY0CisjICBkZWZpbmUgSVRUX0FSQ0hfUFBDNjQgIDUKKyNlbmRpZiAvKiBJVFRfQVJDSF9QUEM2NCAqLworCisKKyNpZm5kZWYgSVRUX0FSQ0gKKyMgIGlmIGRlZmluZWQgX01fSVg4NiB8fCBkZWZpbmVkIF9faTM4Nl9fCisjICAgIGRlZmluZSBJVFRfQVJDSCBJVFRfQVJDSF9JQTMyCisjICBlbGlmIGRlZmluZWQgX01fWDY0IHx8IGRlZmluZWQgX01fQU1ENjQgfHwgZGVmaW5lZCBfX3g4Nl82NF9fCisjICAgIGRlZmluZSBJVFRfQVJDSCBJVFRfQVJDSF9JQTMyRQorIyAgZWxpZiBkZWZpbmVkIF9NX0lBNjQgfHwgZGVmaW5lZCBfX2lhNjRfXworIyAgICBkZWZpbmUgSVRUX0FSQ0ggSVRUX0FSQ0hfSUE2NAorIyAgZWxpZiBkZWZpbmVkIF9NX0FSTSB8fCBfX2FybV9fCisjICAgIGRlZmluZSBJVFRfQVJDSCBJVFRfQVJDSF9BUk0KKyMgIGVsaWYgZGVmaW5lZCBfX3Bvd2VycGM2NF9fCisjICAgIGRlZmluZSBJVFRfQVJDSCBJVFRfQVJDSF9QUEM2NAorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKKyMgIGRlZmluZSBJVFRfRVhURVJOX0MgZXh0ZXJuICJDIgorI2Vsc2UKKyMgIGRlZmluZSBJVFRfRVhURVJOX0MgLyogbm90aGluZyAqLworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNkZWZpbmUgSVRUX1RPX1NUUl9BVVgoeCkgI3gKKyNkZWZpbmUgSVRUX1RPX1NUUih4KSAgICAgSVRUX1RPX1NUUl9BVVgoeCkKKworI2RlZmluZSBfX0lUVF9CVUlMRF9BU1NFUlQoZXhwciwgc3VmZml4KSBkbyB7IFwKKyAgICBzdGF0aWMgY2hhciBfX2l0dF9idWlsZF9jaGVja18jI3N1ZmZpeFsoZXhwcikgPyAxIDogLTFdOyBcCisgICAgX19pdHRfYnVpbGRfY2hlY2tfIyNzdWZmaXhbMF0gPSAwOyBcCit9IHdoaWxlKDApCisjZGVmaW5lIF9JVFRfQlVJTERfQVNTRVJUKGV4cHIsIHN1ZmZpeCkgIF9fSVRUX0JVSUxEX0FTU0VSVCgoZXhwciksIHN1ZmZpeCkKKyNkZWZpbmUgSVRUX0JVSUxEX0FTU0VSVChleHByKSAgICAgICAgICAgX0lUVF9CVUlMRF9BU1NFUlQoKGV4cHIpLCBfX0xJTkVfXykKKworI2RlZmluZSBJVFRfTUFHSUMgeyAweEVELCAweEFCLCAweEFCLCAweEVDLCAweDBELCAweEVFLCAweERBLCAweDMwIH0KKworLyogUmVwbGFjZSB3aXRoIHNuYXBzaG90IGRhdGUgWVlZWU1NREQgZm9yIHByb21vdGlvbiBidWlsZC4gKi8KKyNkZWZpbmUgQVBJX1ZFUlNJT05fQlVJTEQgICAgMjAxMTExMTEKKworI2lmbmRlZiBBUElfVkVSU0lPTl9OVU0KKyNkZWZpbmUgQVBJX1ZFUlNJT05fTlVNIDAuMC4wCisjZW5kaWYgLyogQVBJX1ZFUlNJT05fTlVNICovCisKKyNkZWZpbmUgQVBJX1ZFUlNJT04gIklUVC1BUEktVmVyc2lvbiAiIElUVF9UT19TVFIoQVBJX1ZFUlNJT05fTlVNKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKCIgSVRUX1RPX1NUUihBUElfVkVSU0lPTl9CVUlMRCkgIikiCisKKy8qIE9TIGNvbW11bmljYXRpb24gZnVuY3Rpb25zICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjaW5jbHVkZSA8d2luZG93cy5oPgordHlwZWRlZiBITU9EVUxFICAgICAgICAgICBsaWJfdDsKK3R5cGVkZWYgRFdPUkQgICAgICAgICAgICAgVElEVDsKK3R5cGVkZWYgQ1JJVElDQUxfU0VDVElPTiAgbXV0ZXhfdDsKKyNkZWZpbmUgTVVURVhfSU5JVElBTElaRVIgeyAwIH0KKyNkZWZpbmUgc3Ryb25nX2FsaWFzKG5hbWUsIGFsaWFzbmFtZSkgLyogZW1wdHkgZm9yIFdpbmRvd3MgKi8KKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpbmNsdWRlIDxkbGZjbi5oPgorI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyNpbmNsdWRlIDx3Y2hhci5oPgorI2VuZGlmIC8qIFVOSUNPREUgKi8KKyNpZm5kZWYgX0dOVV9TT1VSQ0UKKyNkZWZpbmUgX0dOVV9TT1VSQ0UgMSAvKiBuZWVkIGZvciBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRSAqLworI2VuZGlmIC8qIF9HTlVfU09VUkNFICovCisjaWZuZGVmIF9fVVNFX1VOSVg5OAorI2RlZmluZSBfX1VTRV9VTklYOTggMSAvKiBuZWVkIGZvciBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRSwgb24gU0xFUzExLjEgd2l0aCBnY2MgNC4zLjQgd2hlcmVpbiBwdGhyZWFkLmggbWlzc2luZyBkZXBlbmRlbmN5IG9uIF9fVVNFX1hPUEVOMks4ICovCisjZW5kaWYgLypfX1VTRV9VTklYOTgqLworI2luY2x1ZGUgPHB0aHJlYWQuaD4KK3R5cGVkZWYgdm9pZCogICAgICAgICAgICAgbGliX3Q7Cit0eXBlZGVmIHB0aHJlYWRfdCAgICAgICAgIFRJRFQ7Cit0eXBlZGVmIHB0aHJlYWRfbXV0ZXhfdCAgIG11dGV4X3Q7CisjZGVmaW5lIE1VVEVYX0lOSVRJQUxJWkVSIFBUSFJFQURfTVVURVhfSU5JVElBTElaRVIKKyNkZWZpbmUgX3N0cm9uZ19hbGlhcyhuYW1lLCBhbGlhc25hbWUpIFwKKyAgICAgICAgICAgIGV4dGVybiBfX3R5cGVvZiAobmFtZSkgYWxpYXNuYW1lIF9fYXR0cmlidXRlX18gKChhbGlhcyAoI25hbWUpKSk7CisjZGVmaW5lIHN0cm9uZ19hbGlhcyhuYW1lLCBhbGlhc25hbWUpIF9zdHJvbmdfYWxpYXMobmFtZSwgYWxpYXNuYW1lKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2dldF9wcm9jKGxpYiwgbmFtZSkgR2V0UHJvY0FkZHJlc3MobGliLCBuYW1lKQorI2RlZmluZSBfX2l0dF9tdXRleF9pbml0KG11dGV4KSAgIEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24obXV0ZXgpCisjZGVmaW5lIF9faXR0X211dGV4X2xvY2sobXV0ZXgpICAgRW50ZXJDcml0aWNhbFNlY3Rpb24obXV0ZXgpCisjZGVmaW5lIF9faXR0X211dGV4X3VubG9jayhtdXRleCkgTGVhdmVDcml0aWNhbFNlY3Rpb24obXV0ZXgpCisjZGVmaW5lIF9faXR0X2xvYWRfbGliKG5hbWUpICAgICAgTG9hZExpYnJhcnlBKG5hbWUpCisjZGVmaW5lIF9faXR0X3VubG9hZF9saWIoaGFuZGxlKSAgRnJlZUxpYnJhcnkoaGFuZGxlKQorI2RlZmluZSBfX2l0dF9zeXN0ZW1fZXJyb3IoKSAgICAgIChpbnQpR2V0TGFzdEVycm9yKCkKKyNkZWZpbmUgX19pdHRfZnN0cmNtcChzMSwgczIpICAgICBsc3RyY21wQShzMSwgczIpCisjZGVmaW5lIF9faXR0X2ZzdHJsZW4ocykgICAgICAgICAgbHN0cmxlbkEocykKKyNkZWZpbmUgX19pdHRfZnN0cmNweW4oczEsIHMyLCBsKSBsc3RyY3B5bkEoczEsIHMyLCBsKQorI2RlZmluZSBfX2l0dF9mc3RyZHVwKHMpICAgICAgICAgIF9zdHJkdXAocykKKyNkZWZpbmUgX19pdHRfdGhyZWFkX2lkKCkgICAgICAgICBHZXRDdXJyZW50VGhyZWFkSWQoKQorI2RlZmluZSBfX2l0dF90aHJlYWRfeWllbGQoKSAgICAgIFN3aXRjaFRvVGhyZWFkKCkKKyNpZm5kZWYgSVRUX1NJTVBMRV9JTklUCitJVFRfSU5MSU5FIGxvbmcKK19faXR0X2ludGVybG9ja2VkX2luY3JlbWVudCh2b2xhdGlsZSBsb25nKiBwdHIpIElUVF9JTkxJTkVfQVRUUklCVVRFOworSVRUX0lOTElORSBsb25nIF9faXR0X2ludGVybG9ja2VkX2luY3JlbWVudCh2b2xhdGlsZSBsb25nKiBwdHIpCit7CisgICAgcmV0dXJuIEludGVybG9ja2VkSW5jcmVtZW50KHB0cik7Cit9CisjZW5kaWYgLyogSVRUX1NJTVBMRV9JTklUICovCisjZWxzZSAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfZ2V0X3Byb2MobGliLCBuYW1lKSBkbHN5bShsaWIsIG5hbWUpCisjZGVmaW5lIF9faXR0X211dGV4X2luaXQobXV0ZXgpICAge1wKKyAgICBwdGhyZWFkX211dGV4YXR0cl90IG11dGV4X2F0dHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGVycm9yX2NvZGUgPSBwdGhyZWFkX211dGV4YXR0cl9pbml0KCZtdXRleF9hdHRyKTsgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChlcnJvcl9jb2RlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX19pdHRfcmVwb3J0X2Vycm9yKF9faXR0X2Vycm9yX3N5c3RlbSwgInB0aHJlYWRfbXV0ZXhhdHRyX2luaXQiLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9jb2RlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVycm9yX2NvZGUgPSBwdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlKCZtdXRleF9hdHRyLCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRSk7ICAgICAgICBcCisgICAgaWYgKGVycm9yX2NvZGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfX2l0dF9yZXBvcnRfZXJyb3IoX19pdHRfZXJyb3Jfc3lzdGVtLCAicHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2NvZGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZXJyb3JfY29kZSA9IHB0aHJlYWRfbXV0ZXhfaW5pdChtdXRleCwgJm11dGV4X2F0dHIpOyAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChlcnJvcl9jb2RlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX19pdHRfcmVwb3J0X2Vycm9yKF9faXR0X2Vycm9yX3N5c3RlbSwgInB0aHJlYWRfbXV0ZXhfaW5pdCIsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9jb2RlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVycm9yX2NvZGUgPSBwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95KCZtdXRleF9hdHRyKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZXJyb3JfY29kZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9faXR0X3JlcG9ydF9lcnJvcihfX2l0dF9lcnJvcl9zeXN0ZW0sICJwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95IiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfY29kZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNkZWZpbmUgX19pdHRfbXV0ZXhfbG9jayhtdXRleCkgICBwdGhyZWFkX211dGV4X2xvY2sobXV0ZXgpCisjZGVmaW5lIF9faXR0X211dGV4X3VubG9jayhtdXRleCkgcHRocmVhZF9tdXRleF91bmxvY2sobXV0ZXgpCisjZGVmaW5lIF9faXR0X2xvYWRfbGliKG5hbWUpICAgICAgZGxvcGVuKG5hbWUsIFJUTERfTEFaWSkKKyNkZWZpbmUgX19pdHRfdW5sb2FkX2xpYihoYW5kbGUpICBkbGNsb3NlKGhhbmRsZSkKKyNkZWZpbmUgX19pdHRfc3lzdGVtX2Vycm9yKCkgICAgICBlcnJubworI2RlZmluZSBfX2l0dF9mc3RyY21wKHMxLCBzMikgICAgIHN0cmNtcChzMSwgczIpCisjZGVmaW5lIF9faXR0X2ZzdHJsZW4ocykgICAgICAgICAgc3RybGVuKHMpCisjZGVmaW5lIF9faXR0X2ZzdHJjcHluKHMxLCBzMiwgbCkgc3RybmNweShzMSwgczIsIGwpCisjZGVmaW5lIF9faXR0X2ZzdHJkdXAocykgICAgICAgICAgc3RyZHVwKHMpCisjZGVmaW5lIF9faXR0X3RocmVhZF9pZCgpICAgICAgICAgcHRocmVhZF9zZWxmKCkKKyNkZWZpbmUgX19pdHRfdGhyZWFkX3lpZWxkKCkgICAgICBzY2hlZF95aWVsZCgpCisjaWYgSVRUX0FSQ0g9PUlUVF9BUkNIX0lBNjQKKyNpZmRlZiBfX0lOVEVMX0NPTVBJTEVSCisjZGVmaW5lIF9fVEJCX21hY2hpbmVfZmV0Y2hhZGQ0KGFkZHIsIHZhbCkgX19mZXRjaGFkZDRfYWNxKCh2b2lkICopYWRkciwgdmFsKQorI2Vsc2UgIC8qIF9fSU5URUxfQ09NUElMRVIgKi8KKy8qIFRPRE86IEFkZCBTdXBwb3J0IGZvciBub3QgSW50ZWwgY29tcGlsZXJzIGZvciBJQS02NCBhcmNoaXRlY3R1cmUgKi8KKyNlbmRpZiAvKiBfX0lOVEVMX0NPTVBJTEVSICovCisjZWxpZiBJVFRfQVJDSD09SVRUX0FSQ0hfSUEzMiB8fCBJVFRfQVJDSD09SVRUX0FSQ0hfSUEzMkUgLyogSVRUX0FSQ0ghPUlUVF9BUkNIX0lBNjQgKi8KK0lUVF9JTkxJTkUgbG9uZworX19UQkJfbWFjaGluZV9mZXRjaGFkZDQodm9sYXRpbGUgdm9pZCogcHRyLCBsb25nIGFkZGVuZCkgSVRUX0lOTElORV9BVFRSSUJVVEU7CitJVFRfSU5MSU5FIGxvbmcgX19UQkJfbWFjaGluZV9mZXRjaGFkZDQodm9sYXRpbGUgdm9pZCogcHRyLCBsb25nIGFkZGVuZCkKK3sKKyAgICBsb25nIHJlc3VsdDsKKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygibG9ja1xueGFkZCAlMCwlMSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiPXIiKHJlc3VsdCksIj1tIigqKGludCopcHRyKQorICAgICAgICAgICAgICAgICAgICAgICAgICA6ICIwIihhZGRlbmQpLCAibSIoKihpbnQqKXB0cikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiAibWVtb3J5Iik7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbGlmIElUVF9BUkNIPT1JVFRfQVJDSF9BUk0gfHwgSVRUX0FSQ0g9PUlUVF9BUkNIX1BQQzY0CisjZGVmaW5lIF9fVEJCX21hY2hpbmVfZmV0Y2hhZGQ0KGFkZHIsIHZhbCkgX19zeW5jX2ZldGNoX2FuZF9hZGQoYWRkciwgdmFsKQorI2VuZGlmIC8qIElUVF9BUkNIPT1JVFRfQVJDSF9JQTY0ICovCisjaWZuZGVmIElUVF9TSU1QTEVfSU5JVAorSVRUX0lOTElORSBsb25nCitfX2l0dF9pbnRlcmxvY2tlZF9pbmNyZW1lbnQodm9sYXRpbGUgbG9uZyogcHRyKSBJVFRfSU5MSU5FX0FUVFJJQlVURTsKK0lUVF9JTkxJTkUgbG9uZyBfX2l0dF9pbnRlcmxvY2tlZF9pbmNyZW1lbnQodm9sYXRpbGUgbG9uZyogcHRyKQoreworICAgIHJldHVybiBfX1RCQl9tYWNoaW5lX2ZldGNoYWRkNChwdHIsIDEpICsgMUw7Cit9CisjZW5kaWYgLyogSVRUX1NJTVBMRV9JTklUICovCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgX19pdHRfY29sbGVjdGlvbl9ub3JtYWwgPSAwLAorICAgIF9faXR0X2NvbGxlY3Rpb25fcGF1c2VkID0gMQorfSBfX2l0dF9jb2xsZWN0aW9uX3N0YXRlOworCit0eXBlZGVmIGVudW0geworICAgIF9faXR0X3RocmVhZF9ub3JtYWwgID0gMCwKKyAgICBfX2l0dF90aHJlYWRfaWdub3JlZCA9IDEKK30gX19pdHRfdGhyZWFkX3N0YXRlOworCisjcHJhZ21hIHBhY2socHVzaCwgOCkKKwordHlwZWRlZiBzdHJ1Y3QgX19faXR0X3RocmVhZF9pbmZvCit7CisgICAgY29uc3QgY2hhciogbmFtZUE7IC8qITwgQ29weSBvZiBvcmlnaW5hbCBuYW1lIGluIEFTQ0lJLiAqLworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyAgICBjb25zdCB3Y2hhcl90KiBuYW1lVzsgLyohPCBDb3B5IG9mIG9yaWdpbmFsIG5hbWUgaW4gVU5JQ09ERS4gKi8KKyNlbHNlICAvKiBVTklDT0RFIHx8IF9VTklDT0RFICovCisgICAgdm9pZCogbmFtZVc7CisjZW5kaWYgLyogVU5JQ09ERSB8fCBfVU5JQ09ERSAqLworICAgIFRJRFQgICAgICAgICAgICAgICB0aWQ7CisgICAgX19pdHRfdGhyZWFkX3N0YXRlIHN0YXRlOyAgIC8qITwgVGhyZWFkIHN0YXRlIChwYXVzZWQgb3Igbm9ybWFsKSAqLworICAgIGludCAgICAgICAgICAgICAgICBleHRyYTE7ICAvKiE8IFJlc2VydmVkIHRvIHRoZSBydW50aW1lICovCisgICAgdm9pZCogICAgICAgICAgICAgIGV4dHJhMjsgIC8qITwgUmVzZXJ2ZWQgdG8gdGhlIHJ1bnRpbWUgKi8KKyAgICBzdHJ1Y3QgX19faXR0X3RocmVhZF9pbmZvKiBuZXh0OworfSBfX2l0dF90aHJlYWRfaW5mbzsKKworI2luY2x1ZGUgIml0dG5vdGlmeV90eXBlcy5oIiAvKiBGb3IgX19pdHRfZ3JvdXBfaWQgZGVmaW5pdGlvbiAqLworCit0eXBlZGVmIHN0cnVjdCBfX19pdHRfYXBpX2luZm9fMjAxMDEwMDEKK3sKKyAgICBjb25zdCBjaGFyKiAgICBuYW1lOworICAgIHZvaWQqKiAgICAgICAgIGZ1bmNfcHRyOworICAgIHZvaWQqICAgICAgICAgIGluaXRfZnVuYzsKKyAgICBfX2l0dF9ncm91cF9pZCBncm91cDsKK30gIF9faXR0X2FwaV9pbmZvXzIwMTAxMDAxOworCit0eXBlZGVmIHN0cnVjdCBfX19pdHRfYXBpX2luZm8KK3sKKyAgICBjb25zdCBjaGFyKiAgICBuYW1lOworICAgIHZvaWQqKiAgICAgICAgIGZ1bmNfcHRyOworICAgIHZvaWQqICAgICAgICAgIGluaXRfZnVuYzsKKyAgICB2b2lkKiAgICAgICAgICBudWxsX2Z1bmM7CisgICAgX19pdHRfZ3JvdXBfaWQgZ3JvdXA7Cit9ICBfX2l0dF9hcGlfaW5mbzsKKworc3RydWN0IF9fX2l0dF9kb21haW47CitzdHJ1Y3QgX19faXR0X3N0cmluZ19oYW5kbGU7CisKK3R5cGVkZWYgc3RydWN0IF9fX2l0dF9nbG9iYWwKK3sKKyAgICB1bnNpZ25lZCBjaGFyICAgICAgICAgIG1hZ2ljWzhdOworICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgdmVyc2lvbl9tYWpvcjsKKyAgICB1bnNpZ25lZCBsb25nICAgICAgICAgIHZlcnNpb25fbWlub3I7CisgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICB2ZXJzaW9uX2J1aWxkOworICAgIHZvbGF0aWxlIGxvbmcgICAgICAgICAgYXBpX2luaXRpYWxpemVkOworICAgIHZvbGF0aWxlIGxvbmcgICAgICAgICAgbXV0ZXhfaW5pdGlhbGl6ZWQ7CisgICAgdm9sYXRpbGUgbG9uZyAgICAgICAgICBhdG9taWNfY291bnRlcjsKKyAgICBtdXRleF90ICAgICAgICAgICAgICAgIG11dGV4OworICAgIGxpYl90ICAgICAgICAgICAgICAgICAgbGliOworICAgIHZvaWQqICAgICAgICAgICAgICAgICAgZXJyb3JfaGFuZGxlcjsKKyAgICBjb25zdCBjaGFyKiogICAgICAgICAgIGRsbF9wYXRoX3B0cjsKKyAgICBfX2l0dF9hcGlfaW5mbyogICAgICAgIGFwaV9saXN0X3B0cjsKKyAgICBzdHJ1Y3QgX19faXR0X2dsb2JhbCogIG5leHQ7CisgICAgLyogSm9pbmFibGUgc3RydWN0dXJlcyBiZWxvdyAqLworICAgIF9faXR0X3RocmVhZF9pbmZvKiAgICAgdGhyZWFkX2xpc3Q7CisgICAgc3RydWN0IF9fX2l0dF9kb21haW4qICBkb21haW5fbGlzdDsKKyAgICBzdHJ1Y3QgX19faXR0X3N0cmluZ19oYW5kbGUqIHN0cmluZ19saXN0OworICAgIF9faXR0X2NvbGxlY3Rpb25fc3RhdGUgc3RhdGU7Cit9IF9faXR0X2dsb2JhbDsKKworI3ByYWdtYSBwYWNrKHBvcCkKKworI2RlZmluZSBORVdfVEhSRUFEX0lORk9fVyhncHRyLGgsaF90YWlsLHQscyxuKSB7IFwKKyAgICBoID0gKF9faXR0X3RocmVhZF9pbmZvKiltYWxsb2Moc2l6ZW9mKF9faXR0X3RocmVhZF9pbmZvKSk7IFwKKyAgICBpZiAoaCAhPSBOVUxMKSB7IFwKKyAgICAgICAgaC0+dGlkICAgID0gdDsgXAorICAgICAgICBoLT5uYW1lQSAgPSBOVUxMOyBcCisgICAgICAgIGgtPm5hbWVXICA9IG4gPyBfd2NzZHVwKG4pIDogTlVMTDsgXAorICAgICAgICBoLT5zdGF0ZSAgPSBzOyBcCisgICAgICAgIGgtPmV4dHJhMSA9IDA7ICAgIC8qIHJlc2VydmVkICovIFwKKyAgICAgICAgaC0+ZXh0cmEyID0gTlVMTDsgLyogcmVzZXJ2ZWQgKi8gXAorICAgICAgICBoLT5uZXh0ICAgPSBOVUxMOyBcCisgICAgICAgIGlmIChoX3RhaWwgPT0gTlVMTCkgXAorICAgICAgICAgICAgKGdwdHIpLT50aHJlYWRfbGlzdCA9IGg7IFwKKyAgICAgICAgZWxzZSBcCisgICAgICAgICAgICBoX3RhaWwtPm5leHQgPSBoOyBcCisgICAgfSBcCit9CisKKyNkZWZpbmUgTkVXX1RIUkVBRF9JTkZPX0EoZ3B0cixoLGhfdGFpbCx0LHMsbikgeyBcCisgICAgaCA9IChfX2l0dF90aHJlYWRfaW5mbyopbWFsbG9jKHNpemVvZihfX2l0dF90aHJlYWRfaW5mbykpOyBcCisgICAgaWYgKGggIT0gTlVMTCkgeyBcCisgICAgICAgIGgtPnRpZCAgICA9IHQ7IFwKKyAgICAgICAgaC0+bmFtZUEgID0gbiA/IF9faXR0X2ZzdHJkdXAobikgOiBOVUxMOyBcCisgICAgICAgIGgtPm5hbWVXICA9IE5VTEw7IFwKKyAgICAgICAgaC0+c3RhdGUgID0gczsgXAorICAgICAgICBoLT5leHRyYTEgPSAwOyAgICAvKiByZXNlcnZlZCAqLyBcCisgICAgICAgIGgtPmV4dHJhMiA9IE5VTEw7IC8qIHJlc2VydmVkICovIFwKKyAgICAgICAgaC0+bmV4dCAgID0gTlVMTDsgXAorICAgICAgICBpZiAoaF90YWlsID09IE5VTEwpIFwKKyAgICAgICAgICAgIChncHRyKS0+dGhyZWFkX2xpc3QgPSBoOyBcCisgICAgICAgIGVsc2UgXAorICAgICAgICAgICAgaF90YWlsLT5uZXh0ID0gaDsgXAorICAgIH0gXAorfQorCisjZGVmaW5lIE5FV19ET01BSU5fVyhncHRyLGgsaF90YWlsLG5hbWUpIHsgXAorICAgIGggPSAoX19pdHRfZG9tYWluKiltYWxsb2Moc2l6ZW9mKF9faXR0X2RvbWFpbikpOyBcCisgICAgaWYgKGggIT0gTlVMTCkgeyBcCisgICAgICAgIGgtPmZsYWdzICA9IDA7ICAgIC8qIGRvbWFpbiBpcyBkaXNhYmxlZCBieSBkZWZhdWx0ICovIFwKKyAgICAgICAgaC0+bmFtZUEgID0gTlVMTDsgXAorICAgICAgICBoLT5uYW1lVyAgPSBuYW1lID8gX3djc2R1cChuYW1lKSA6IE5VTEw7IFwKKyAgICAgICAgaC0+ZXh0cmExID0gMDsgICAgLyogcmVzZXJ2ZWQgKi8gXAorICAgICAgICBoLT5leHRyYTIgPSBOVUxMOyAvKiByZXNlcnZlZCAqLyBcCisgICAgICAgIGgtPm5leHQgICA9IE5VTEw7IFwKKyAgICAgICAgaWYgKGhfdGFpbCA9PSBOVUxMKSBcCisgICAgICAgICAgICAoZ3B0ciktPmRvbWFpbl9saXN0ID0gaDsgXAorICAgICAgICBlbHNlIFwKKyAgICAgICAgICAgIGhfdGFpbC0+bmV4dCA9IGg7IFwKKyAgICB9IFwKK30KKworI2RlZmluZSBORVdfRE9NQUlOX0EoZ3B0cixoLGhfdGFpbCxuYW1lKSB7IFwKKyAgICBoID0gKF9faXR0X2RvbWFpbiopbWFsbG9jKHNpemVvZihfX2l0dF9kb21haW4pKTsgXAorICAgIGlmIChoICE9IE5VTEwpIHsgXAorICAgICAgICBoLT5mbGFncyAgPSAwOyAgICAvKiBkb21haW4gaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCAqLyBcCisgICAgICAgIGgtPm5hbWVBICA9IG5hbWUgPyBfX2l0dF9mc3RyZHVwKG5hbWUpIDogTlVMTDsgXAorICAgICAgICBoLT5uYW1lVyAgPSBOVUxMOyBcCisgICAgICAgIGgtPmV4dHJhMSA9IDA7ICAgIC8qIHJlc2VydmVkICovIFwKKyAgICAgICAgaC0+ZXh0cmEyID0gTlVMTDsgLyogcmVzZXJ2ZWQgKi8gXAorICAgICAgICBoLT5uZXh0ICAgPSBOVUxMOyBcCisgICAgICAgIGlmIChoX3RhaWwgPT0gTlVMTCkgXAorICAgICAgICAgICAgKGdwdHIpLT5kb21haW5fbGlzdCA9IGg7IFwKKyAgICAgICAgZWxzZSBcCisgICAgICAgICAgICBoX3RhaWwtPm5leHQgPSBoOyBcCisgICAgfSBcCit9CisKKyNkZWZpbmUgTkVXX1NUUklOR19IQU5ETEVfVyhncHRyLGgsaF90YWlsLG5hbWUpIHsgXAorICAgIGggPSAoX19pdHRfc3RyaW5nX2hhbmRsZSopbWFsbG9jKHNpemVvZihfX2l0dF9zdHJpbmdfaGFuZGxlKSk7IFwKKyAgICBpZiAoaCAhPSBOVUxMKSB7IFwKKyAgICAgICAgaC0+c3RyQSAgID0gTlVMTDsgXAorICAgICAgICBoLT5zdHJXICAgPSBuYW1lID8gX3djc2R1cChuYW1lKSA6IE5VTEw7IFwKKyAgICAgICAgaC0+ZXh0cmExID0gMDsgICAgLyogcmVzZXJ2ZWQgKi8gXAorICAgICAgICBoLT5leHRyYTIgPSBOVUxMOyAvKiByZXNlcnZlZCAqLyBcCisgICAgICAgIGgtPm5leHQgICA9IE5VTEw7IFwKKyAgICAgICAgaWYgKGhfdGFpbCA9PSBOVUxMKSBcCisgICAgICAgICAgICAoZ3B0ciktPnN0cmluZ19saXN0ID0gaDsgXAorICAgICAgICBlbHNlIFwKKyAgICAgICAgICAgIGhfdGFpbC0+bmV4dCA9IGg7IFwKKyAgICB9IFwKK30KKworI2RlZmluZSBORVdfU1RSSU5HX0hBTkRMRV9BKGdwdHIsaCxoX3RhaWwsbmFtZSkgeyBcCisgICAgaCA9IChfX2l0dF9zdHJpbmdfaGFuZGxlKiltYWxsb2Moc2l6ZW9mKF9faXR0X3N0cmluZ19oYW5kbGUpKTsgXAorICAgIGlmIChoICE9IE5VTEwpIHsgXAorICAgICAgICBoLT5zdHJBICAgPSBuYW1lID8gX19pdHRfZnN0cmR1cChuYW1lKSA6IE5VTEw7IFwKKyAgICAgICAgaC0+c3RyVyAgID0gTlVMTDsgXAorICAgICAgICBoLT5leHRyYTEgPSAwOyAgICAvKiByZXNlcnZlZCAqLyBcCisgICAgICAgIGgtPmV4dHJhMiA9IE5VTEw7IC8qIHJlc2VydmVkICovIFwKKyAgICAgICAgaC0+bmV4dCAgID0gTlVMTDsgXAorICAgICAgICBpZiAoaF90YWlsID09IE5VTEwpIFwKKyAgICAgICAgICAgIChncHRyKS0+c3RyaW5nX2xpc3QgPSBoOyBcCisgICAgICAgIGVsc2UgXAorICAgICAgICAgICAgaF90YWlsLT5uZXh0ID0gaDsgXAorICAgIH0gXAorfQorCisjZW5kaWYgLyogX0lUVE5PVElGWV9DT05GSUdfSF8gKi8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeV9zdGF0aWMuYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeV9zdGF0aWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjVmNDY0Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvaXR0bm90aWZ5X3N0YXRpYy5jCkBAIC0wLDAgKzEsOTQzIEBACisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJpdHRub3RpZnlfY29uZmlnLmgiCisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgUEFUSF9NQVggNTEyCisjZWxzZSAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBJTlRFTF9OT19NQUNST19CT0RZCisjZGVmaW5lIElOVEVMX0lUVE5PVElGWV9BUElfUFJJVkFURQorI2luY2x1ZGUgIml0dG5vdGlmeS5oIgorI2luY2x1ZGUgImxlZ2FjeS9pdHRub3RpZnkuaCIKKworI2luY2x1ZGUgImRpc2FibGVfd2FybmluZ3MuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgYXBpX3ZlcnNpb25bXSA9IEFQSV9WRVJTSU9OICJcMFxuQCgjKSAkUmV2aXNpb246IDQyNzU0ICRcbiI7CisKKyNkZWZpbmUgX05fKG4pIElUVF9KT0lOKElOVEVMX0lUVE5PVElGWV9QUkVGSVgsbikKKworI2lmIElUVF9PUz09SVRUX09TX1dJTgorc3RhdGljIGNvbnN0IGNoYXIqIGl0dG5vdGlmeV9saWJfbmFtZSA9ICJsaWJpdHRub3RpZnkuZGxsIjsKKyNlbGlmIElUVF9PUz09SVRUX09TX0xJTlVYCitzdGF0aWMgY29uc3QgY2hhciogaXR0bm90aWZ5X2xpYl9uYW1lID0gImxpYml0dG5vdGlmeS5zbyI7CisjZWxpZiBJVFRfT1M9PUlUVF9PU19NQUMKK3N0YXRpYyBjb25zdCBjaGFyKiBpdHRub3RpZnlfbGliX25hbWUgPSAibGliaXR0bm90aWZ5LmR5bGliIjsKKyNlbHNlCisjZXJyb3IgVW5zdXBwb3J0ZWQgb3IgdW5rbm93biBPUy4KKyNlbmRpZgorCisjaWZkZWYgX19BTkRST0lEX18KKy8qIGRlZmF1bHQgbG9jYXRpb24gb2YgdXNlcmFwaSBjb2xsZWN0b3Igb24gQW5kcm9pZCAqLworI2RlZmluZSBBTkRST0lEX0lUVE5PVElGWV9ERUZBVUxUX1BBVEggICIvZGF0YS9kYXRhL2NvbS5pbnRlbC52dHVuZS9pbnRlbC9saWJpdHRub3RpZnkuc28iCisjZW5kaWYKKworCisjaWZuZGVmIExJQl9WQVJfTkFNRQorI2lmIElUVF9BUkNIPT1JVFRfQVJDSF9JQTMyCisjZGVmaW5lIExJQl9WQVJfTkFNRSBJTlRFTF9MSUJJVFROT1RJRlkzMgorI2Vsc2UKKyNkZWZpbmUgTElCX1ZBUl9OQU1FIElOVEVMX0xJQklUVE5PVElGWTY0CisjZW5kaWYKKyNlbmRpZiAvKiBMSUJfVkFSX05BTUUgKi8KKworI2RlZmluZSBJVFRfTVVURVhfSU5JVF9BTkRfTE9DSyhwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIXAubXV0ZXhfaW5pdGlhbGl6ZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKF9faXR0X2ludGVybG9ja2VkX2luY3JlbWVudCgmcC5hdG9taWNfY291bnRlcikgPT0gMSkgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIF9faXR0X211dGV4X2luaXQoJnAubXV0ZXgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHAubXV0ZXhfaW5pdGlhbGl6ZWQgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHdoaWxlICghcC5tdXRleF9pbml0aWFsaXplZCkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBfX2l0dF90aHJlYWRfeWllbGQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfX2l0dF9tdXRleF9sb2NrKCZwLm11dGV4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitjb25zdCBpbnQgX05fKGVycikgPSAwOworCit0eXBlZGVmIGludCAoX19pdHRfaW5pdF9pdHRsaWJfdCkoY29uc3QgY2hhciosIF9faXR0X2dyb3VwX2lkKTsKKworLyogdGhpcyBkZWZpbmUgdXNlZCB0byBjb250cm9sIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIG5hbWUuICovCisjaWZuZGVmIF9faXR0X2luaXRfaXR0bGliX25hbWUKK0lUVF9FWFRFUk5fQyBpbnQgX05fKGluaXRfaXR0bGliKShjb25zdCBjaGFyKiwgX19pdHRfZ3JvdXBfaWQpOworc3RhdGljIF9faXR0X2luaXRfaXR0bGliX3QqIF9faXR0X2luaXRfaXR0bGliX3B0ciA9IF9OXyhpbml0X2l0dGxpYik7CisjZGVmaW5lIF9faXR0X2luaXRfaXR0bGliX25hbWUgX19pdHRfaW5pdF9pdHRsaWJfcHRyCisjZW5kaWYgLyogX19pdHRfaW5pdF9pdHRsaWJfbmFtZSAqLworCit0eXBlZGVmIHZvaWQgKF9faXR0X2ZpbmlfaXR0bGliX3QpKHZvaWQpOworCisvKiB0aGlzIGRlZmluZSB1c2VkIHRvIGNvbnRyb2wgZmluYWxpemF0aW9uIGZ1bmN0aW9uIG5hbWUuICovCisjaWZuZGVmIF9faXR0X2ZpbmlfaXR0bGliX25hbWUKK0lUVF9FWFRFUk5fQyB2b2lkIF9OXyhmaW5pX2l0dGxpYikodm9pZCk7CitzdGF0aWMgX19pdHRfZmluaV9pdHRsaWJfdCogX19pdHRfZmluaV9pdHRsaWJfcHRyID0gX05fKGZpbmlfaXR0bGliKTsKKyNkZWZpbmUgX19pdHRfZmluaV9pdHRsaWJfbmFtZSBfX2l0dF9maW5pX2l0dGxpYl9wdHIKKyNlbmRpZiAvKiBfX2l0dF9maW5pX2l0dGxpYl9uYW1lICovCisKKy8qIGJ1aWxkaW5nIHBvaW50ZXJzIHRvIGltcG9ydGVkIGZ1bmNzICovCisjdW5kZWYgSVRUX1NUVUJWCisjdW5kZWYgSVRUX1NUVUIKKyNkZWZpbmUgSVRUX1NUVUIoYXBpLHR5cGUsbmFtZSxhcmdzLHBhcmFtcyxwdHIsZ3JvdXAsZm9ybWF0KSAgIFwKK3N0YXRpYyB0eXBlIGFwaSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8obmFtZSksX2luaXQpKSBhcmdzO1wKK3R5cGVkZWYgdHlwZSBhcGkgSVRUX0pPSU4oX05fKG5hbWUpLF90KSBhcmdzOyAgICAgICAgICAgICAgICAgIFwKK0lUVF9FWFRFUk5fQyBJVFRfSk9JTihfTl8obmFtZSksX3QpKiBJVFROT1RJRllfTkFNRShuYW1lKSA9IElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhuYW1lKSxfaW5pdCkpOyBcCitzdGF0aWMgdHlwZSBhcGkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKG5hbWUpLF9pbml0KSkgYXJncyBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19pdHRfaW5pdF9pdHRsaWJfbmFtZShOVUxMLCBfX2l0dF9ncm91cF9hbGwpOyAgICAgICAgICAgICBcCisgICAgaWYgKElUVE5PVElGWV9OQU1FKG5hbWUpICYmIElUVE5PVElGWV9OQU1FKG5hbWUpICE9IElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhuYW1lKSxfaW5pdCkpKSBcCisgICAgICAgIHJldHVybiBJVFROT1RJRllfTkFNRShuYW1lKSBwYXJhbXM7ICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiAodHlwZSkwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgSVRUX1NUVUJWKGFwaSx0eXBlLG5hbWUsYXJncyxwYXJhbXMscHRyLGdyb3VwLGZvcm1hdCkgIFwKK3N0YXRpYyB0eXBlIGFwaSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8obmFtZSksX2luaXQpKSBhcmdzO1wKK3R5cGVkZWYgdHlwZSBhcGkgSVRUX0pPSU4oX05fKG5hbWUpLF90KSBhcmdzOyAgICAgICAgICAgICAgICAgIFwKK0lUVF9FWFRFUk5fQyBJVFRfSk9JTihfTl8obmFtZSksX3QpKiBJVFROT1RJRllfTkFNRShuYW1lKSA9IElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhuYW1lKSxfaW5pdCkpOyBcCitzdGF0aWMgdHlwZSBhcGkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKG5hbWUpLF9pbml0KSkgYXJncyBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19pdHRfaW5pdF9pdHRsaWJfbmFtZShOVUxMLCBfX2l0dF9ncm91cF9hbGwpOyAgICAgICAgICAgICBcCisgICAgaWYgKElUVE5PVElGWV9OQU1FKG5hbWUpICYmIElUVE5PVElGWV9OQU1FKG5hbWUpICE9IElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhuYW1lKSxfaW5pdCkpKSBcCisgICAgICAgIElUVE5PVElGWV9OQU1FKG5hbWUpIHBhcmFtczsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyN1bmRlZiBfX0lUVF9JTlRFUk5BTF9JTklUCisjaW5jbHVkZSAiaXR0bm90aWZ5X3N0YXRpYy5oIgorCisjdW5kZWYgSVRUX1NUVUIKKyN1bmRlZiBJVFRfU1RVQlYKKyNkZWZpbmUgSVRUX1NUVUIoYXBpLHR5cGUsbmFtZSxhcmdzLHBhcmFtcyxwdHIsZ3JvdXAsZm9ybWF0KSAgIFwKK3N0YXRpYyB0eXBlIGFwaSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8obmFtZSksX2luaXQpKSBhcmdzO1wKK3R5cGVkZWYgdHlwZSBhcGkgSVRUX0pPSU4oX05fKG5hbWUpLF90KSBhcmdzOyAgICAgICAgICAgICAgICAgIFwKK0lUVF9FWFRFUk5fQyBJVFRfSk9JTihfTl8obmFtZSksX3QpKiBJVFROT1RJRllfTkFNRShuYW1lKSA9IElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhuYW1lKSxfaW5pdCkpOworCisjZGVmaW5lIElUVF9TVFVCVihhcGksdHlwZSxuYW1lLGFyZ3MscGFyYW1zLHB0cixncm91cCxmb3JtYXQpICBcCitzdGF0aWMgdHlwZSBhcGkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKG5hbWUpLF9pbml0KSkgYXJncztcCit0eXBlZGVmIHR5cGUgYXBpIElUVF9KT0lOKF9OXyhuYW1lKSxfdCkgYXJnczsgICAgICAgICAgICAgICAgICBcCitJVFRfRVhURVJOX0MgSVRUX0pPSU4oX05fKG5hbWUpLF90KSogSVRUTk9USUZZX05BTUUobmFtZSkgPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8obmFtZSksX2luaXQpKTsKKworI2RlZmluZSBfX0lUVF9JTlRFUk5BTF9JTklUCisjaW5jbHVkZSAiaXR0bm90aWZ5X3N0YXRpYy5oIgorI3VuZGVmIF9fSVRUX0lOVEVSTkFMX0lOSVQKKworSVRUX0dST1VQX0xJU1QoZ3JvdXBfbGlzdCk7CisKKyNwcmFnbWEgcGFjayhwdXNoLCA4KQorCit0eXBlZGVmIHN0cnVjdCBfX19pdHRfZ3JvdXBfYWxpYXMKK3sKKyAgICBjb25zdCBjaGFyKiAgICBlbnZfdmFyOworICAgIF9faXR0X2dyb3VwX2lkIGdyb3VwczsKK30gX19pdHRfZ3JvdXBfYWxpYXM7CisKK3N0YXRpYyBfX2l0dF9ncm91cF9hbGlhcyBncm91cF9hbGlhc1tdID0geworICAgIHsgIktNUF9GT1JfVFBST0ZJTEUiLCAoX19pdHRfZ3JvdXBfaWQpKF9faXR0X2dyb3VwX2NvbnRyb2wgfCBfX2l0dF9ncm91cF90aHJlYWQgfCBfX2l0dF9ncm91cF9zeW5jICB8IF9faXR0X2dyb3VwX21hcmspIH0sCisgICAgeyAiS01QX0ZPUl9UQ0hFQ0siLCAgIChfX2l0dF9ncm91cF9pZCkoX19pdHRfZ3JvdXBfY29udHJvbCB8IF9faXR0X2dyb3VwX3RocmVhZCB8IF9faXR0X2dyb3VwX3N5bmMgIHwgX19pdHRfZ3JvdXBfZnN5bmMgfCBfX2l0dF9ncm91cF9tYXJrIHwgX19pdHRfZ3JvdXBfc3VwcHJlc3MpIH0sCisgICAgeyBOVUxMLCAgICAgICAgICAgICAgIChfX2l0dF9ncm91cF9ub25lKSB9LAorICAgIHsgYXBpX3ZlcnNpb24sICAgICAgICAoX19pdHRfZ3JvdXBfbm9uZSkgfSAvKiAhISEgSnVzdCB0byBhdm9pZCB1bnVzZWQgY29kZSBlbGltaW5hdGlvbiAhISEgKi8KK307CisKKyNwcmFnbWEgcGFjayhwb3ApCisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNwcmFnbWEgd2FybmluZyhwdXNoKQorI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6IDQwNTQpIC8qIHdhcm5pbmcgQzQwNTQ6ICd0eXBlIGNhc3QnIDogZnJvbSBmdW5jdGlvbiBwb2ludGVyICdYWFgnIHRvIGRhdGEgcG9pbnRlciAndm9pZCAqJyAqLworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCitzdGF0aWMgX19pdHRfYXBpX2luZm8gYXBpX2xpc3RbXSA9IHsKKy8qIERlZmluZSBmdW5jdGlvbnMgd2l0aCBzdGF0aWMgaW1wbGVtZW50YXRpb24gKi8KKyN1bmRlZiBJVFRfU1RVQgorI3VuZGVmIElUVF9TVFVCVgorI2RlZmluZSBJVFRfU1RVQihhcGksdHlwZSxuYW1lLGFyZ3MscGFyYW1zLG5hbWVpbmRsbCxncm91cCxmb3JtYXQpIHsgSVRUX1RPX1NUUihJVFRfSk9JTihfX2l0dF8sbmFtZWluZGxsKSksICh2b2lkKiopKHZvaWQqKSZJVFROT1RJRllfTkFNRShuYW1lKSwgKHZvaWQqKShzaXplX3QpJklUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhuYW1lKSxfaW5pdCkpLCAodm9pZCopKHNpemVfdCkmSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKG5hbWUpLF9pbml0KSksIChfX2l0dF9ncm91cF9pZCkoZ3JvdXApfSwKKyNkZWZpbmUgSVRUX1NUVUJWIElUVF9TVFVCCisjZGVmaW5lIF9fSVRUX0lOVEVSTkFMX0lOSVQKKyNpbmNsdWRlICJpdHRub3RpZnlfc3RhdGljLmgiCisjdW5kZWYgX19JVFRfSU5URVJOQUxfSU5JVAorLyogRGVmaW5lIGZ1bmN0aW9ucyB3aXRob3V0IHN0YXRpYyBpbXBsZW1lbnRhdGlvbiAqLworI3VuZGVmIElUVF9TVFVCCisjdW5kZWYgSVRUX1NUVUJWCisjZGVmaW5lIElUVF9TVFVCKGFwaSx0eXBlLG5hbWUsYXJncyxwYXJhbXMsbmFtZWluZGxsLGdyb3VwLGZvcm1hdCkge0lUVF9UT19TVFIoSVRUX0pPSU4oX19pdHRfLG5hbWVpbmRsbCkpLCAodm9pZCoqKSh2b2lkKikmSVRUTk9USUZZX05BTUUobmFtZSksICh2b2lkKikoc2l6ZV90KSZJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8obmFtZSksX2luaXQpKSwgTlVMTCwgKF9faXR0X2dyb3VwX2lkKShncm91cCl9LAorI2RlZmluZSBJVFRfU1RVQlYgSVRUX1NUVUIKKyNpbmNsdWRlICJpdHRub3RpZnlfc3RhdGljLmgiCisgICAge05VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIF9faXR0X2dyb3VwX25vbmV9Cit9OworCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjcHJhZ21hIHdhcm5pbmcocG9wKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisvKiBwcml2YXRlLCBpbml0IHRocmVhZCBpbmZvIGl0ZW0uIHVzZWQgZm9yIGludGVybmFsIHB1cnBvc2VzICovCitzdGF0aWMgX19pdHRfdGhyZWFkX2luZm8gaW5pdF90aHJlYWRfaW5mbyA9IHsKKyAgICAoY29uc3QgY2hhciopTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYW1lQSAqLworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyAgICAoY29uc3Qgd2NoYXJfdCopTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBuYW1lVyAqLworI2Vsc2UKKyAgICAodm9pZCopTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYW1lVyAqLworI2VuZGlmCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGlkICovCisgICAgX19pdHRfdGhyZWFkX25vcm1hbCwgICAgICAgICAgICAgICAgICAgICAgLyogc3RhdGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBleHRyYTEgKi8KKyAgICAodm9pZCopTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBleHRyYTIgKi8KKyAgICAoX19pdHRfdGhyZWFkX2luZm8qKU5VTEwgICAgICAgICAgICAgICAgICAvKiBuZXh0ICovCit9OworCisvKiBwcml2YXRlLCBOVUxMIGRvbWFpbiBpdGVtLiB1c2VkIGZvciBpbnRlcm5hbCBwdXJwb3NlcyAqLworc3RhdGljIF9faXR0X2RvbWFpbiBudWxsX2RvbWFpbiA9IHsKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmbGFnczogIGRpc2FibGVkIGJ5IGRlZmF1bHQgKi8KKyAgICAoY29uc3QgY2hhciopTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYW1lQSAqLworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyAgICAoY29uc3Qgd2NoYXJfdCopTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBuYW1lVyAqLworI2Vsc2UKKyAgICAodm9pZCopTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYW1lVyAqLworI2VuZGlmCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXh0cmExICovCisgICAgKHZvaWQqKU5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXh0cmEyICovCisgICAgKF9faXR0X2RvbWFpbiopTlVMTCAgICAgICAgICAgICAgICAgICAgICAgLyogbmV4dCAqLworfTsKKworLyogcHJpdmF0ZSwgTlVMTCBzdHJpbmcgaGFuZGxlIGl0ZW0uIHVzZWQgZm9yIGludGVybmFsIHB1cnBvc2VzICovCitzdGF0aWMgX19pdHRfc3RyaW5nX2hhbmRsZSBudWxsX3N0cmluZ19oYW5kbGUgPSB7CisgICAgKGNvbnN0IGNoYXIqKU5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RyQSAqLworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyAgICAoY29uc3Qgd2NoYXJfdCopTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBzdHJXICovCisjZWxzZQorICAgICh2b2lkKilOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0clcgKi8KKyNlbmRpZgorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV4dHJhMSAqLworICAgICh2b2lkKilOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV4dHJhMiAqLworICAgIChfX2l0dF9zdHJpbmdfaGFuZGxlKilOVUxMICAgICAgICAgICAgICAgIC8qIG5leHQgKi8KK307CisKK3N0YXRpYyBjb25zdCBjaGFyIGRsbF9wYXRoW1BBVEhfTUFYXSA9IHsgMCB9OworCisvKiBzdGF0aWMgcGFydCBkZXNjcmlwdG9yIHdoaWNoIGhhbmRsZXMuIGFsbCBub3RpZmljYXRpb24gYXBpIGF0dHJpYnV0ZXMuICovCitfX2l0dF9nbG9iYWwgX05fKF9pdHRhcGlfZ2xvYmFsKSA9IHsKKyAgICBJVFRfTUFHSUMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlkZW50aWZpY2F0aW9uIGluZm8gKi8KKyAgICBJVFRfTUFKT1IsIElUVF9NSU5PUiwgQVBJX1ZFUlNJT05fQlVJTEQsICAgICAgIC8qIHZlcnNpb24gaW5mbyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYXBpX2luaXRpYWxpemVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtdXRleF9pbml0aWFsaXplZCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYXRvbWljX2NvdW50ZXIgKi8KKyAgICBNVVRFWF9JTklUSUFMSVpFUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11dGV4ICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkeW5hbWljIGxpYnJhcnkgaGFuZGxlICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlcnJvcl9oYW5kbGVyICovCisgICAgKGNvbnN0IGNoYXIqKikmZGxsX3BhdGgsICAgICAgICAgICAgICAgICAgICAgICAvKiBkbGxfcGF0aF9wdHIgKi8KKyAgICAoX19pdHRfYXBpX2luZm8qKSZhcGlfbGlzdCwgICAgICAgICAgICAgICAgICAgIC8qIGFwaV9saXN0X3B0ciAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmV4dCBfX2l0dF9nbG9iYWwgKi8KKyAgICAoX19pdHRfdGhyZWFkX2luZm8qKSZpbml0X3RocmVhZF9pbmZvLCAgICAgICAgIC8qIHRocmVhZF9saXN0ICovCisgICAgKF9faXR0X2RvbWFpbiopJm51bGxfZG9tYWluLCAgICAgICAgICAgICAgICAgICAvKiBkb21haW5fbGlzdCAqLworICAgIChfX2l0dF9zdHJpbmdfaGFuZGxlKikmbnVsbF9zdHJpbmdfaGFuZGxlLCAgICAgLyogc3RyaW5nX2xpc3QgKi8KKyAgICBfX2l0dF9jb2xsZWN0aW9uX25vcm1hbCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbGxlY3Rpb24gc3RhdGUgKi8KK307CisKK3R5cGVkZWYgdm9pZCAoX19pdHRfYXBpX2luaXRfdCkoX19pdHRfZ2xvYmFsKiwgX19pdHRfZ3JvdXBfaWQpOwordHlwZWRlZiB2b2lkIChfX2l0dF9hcGlfZmluaV90KShfX2l0dF9nbG9iYWwqKTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisjaWZkZWYgSVRUX05PVElGWV9FWFRfUkVQT1JUCitJVFRfRVhURVJOX0Mgdm9pZCBfTl8oZXJyb3JfaGFuZGxlcikoX19pdHRfZXJyb3JfY29kZSwgdmFfbGlzdCBhcmdzKTsKKyNlbmRpZiAvKiBJVFRfTk9USUZZX0VYVF9SRVBPUlQgKi8KKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI3ByYWdtYSB3YXJuaW5nKHB1c2gpCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogNDA1NSkgLyogd2FybmluZyBDNDA1NTogJ3R5cGUgY2FzdCcgOiBmcm9tIGRhdGEgcG9pbnRlciAndm9pZCAqJyB0byBmdW5jdGlvbiBwb2ludGVyICdYWFgnICovCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKK3N0YXRpYyB2b2lkIF9faXR0X3JlcG9ydF9lcnJvcihfX2l0dF9lcnJvcl9jb2RlIGNvZGUsIC4uLikKK3sKKyAgICB2YV9saXN0IGFyZ3M7CisgICAgdmFfc3RhcnQoYXJncywgY29kZSk7CisgICAgaWYgKF9OXyhfaXR0YXBpX2dsb2JhbCkuZXJyb3JfaGFuZGxlciAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgX19pdHRfZXJyb3JfaGFuZGxlcl90KiBoYW5kbGVyID0gKF9faXR0X2Vycm9yX2hhbmRsZXJfdCopKHNpemVfdClfTl8oX2l0dGFwaV9nbG9iYWwpLmVycm9yX2hhbmRsZXI7CisgICAgICAgIGhhbmRsZXIoY29kZSwgYXJncyk7CisgICAgfQorI2lmZGVmIElUVF9OT1RJRllfRVhUX1JFUE9SVAorICAgIF9OXyhlcnJvcl9oYW5kbGVyKShjb2RlLCBhcmdzKTsKKyNlbmRpZiAvKiBJVFRfTk9USUZZX0VYVF9SRVBPUlQgKi8KKyAgICB2YV9lbmQoYXJncyk7Cit9CisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNwcmFnbWEgd2FybmluZyhwb3ApCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK3N0YXRpYyBfX2l0dF9kb21haW4qIElUVEFQSSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8oZG9tYWluX2NyZWF0ZVcpLF9pbml0KSkoY29uc3Qgd2NoYXJfdCogbmFtZSkKK3sKKyAgICBfX2l0dF9kb21haW4gKmhfdGFpbCwgKmg7CisKKyAgICBpZiAoIV9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2luaXRpYWxpemVkICYmIF9OXyhfaXR0YXBpX2dsb2JhbCkudGhyZWFkX2xpc3QtPnRpZCA9PSAwKQorICAgIHsKKyAgICAgICAgX19pdHRfaW5pdF9pdHRsaWJfbmFtZShOVUxMLCBfX2l0dF9ncm91cF9hbGwpOworICAgICAgICBpZiAoSVRUTk9USUZZX05BTUUoZG9tYWluX2NyZWF0ZVcpICYmIElUVE5PVElGWV9OQU1FKGRvbWFpbl9jcmVhdGVXKSAhPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8oZG9tYWluX2NyZWF0ZVcpLF9pbml0KSkpCisgICAgICAgICAgICByZXR1cm4gSVRUTk9USUZZX05BTUUoZG9tYWluX2NyZWF0ZVcpKG5hbWUpOworICAgIH0KKworICAgIGlmIChuYW1lID09IE5VTEwpCisgICAgICAgIHJldHVybiBfTl8oX2l0dGFwaV9nbG9iYWwpLmRvbWFpbl9saXN0OworCisgICAgSVRUX01VVEVYX0lOSVRfQU5EX0xPQ0soX05fKF9pdHRhcGlfZ2xvYmFsKSk7CisgICAgZm9yIChoX3RhaWwgPSBOVUxMLCBoID0gX05fKF9pdHRhcGlfZ2xvYmFsKS5kb21haW5fbGlzdDsgaCAhPSBOVUxMOyBoX3RhaWwgPSBoLCBoID0gaC0+bmV4dCkKKyAgICAgICAgaWYgKGgtPm5hbWVXICE9IE5VTEwgJiYgIXdjc2NtcChoLT5uYW1lVywgbmFtZSkpCisgICAgICAgICAgICBicmVhazsKKyAgICBpZiAoaCA9PSBOVUxMKSB7CisgICAgICAgIE5FV19ET01BSU5fVygmX05fKF9pdHRhcGlfZ2xvYmFsKSxoLGhfdGFpbCxuYW1lKTsKKyAgICB9CisgICAgX19pdHRfbXV0ZXhfdW5sb2NrKCZfTl8oX2l0dGFwaV9nbG9iYWwpLm11dGV4KTsKKyAgICByZXR1cm4gaDsKK30KKworc3RhdGljIF9faXR0X2RvbWFpbiogSVRUQVBJIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhkb21haW5fY3JlYXRlQSksX2luaXQpKShjb25zdCBjaGFyKiBuYW1lKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworc3RhdGljIF9faXR0X2RvbWFpbiogSVRUQVBJIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhkb21haW5fY3JlYXRlKSxfaW5pdCkpKGNvbnN0IGNoYXIqIG5hbWUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCit7CisgICAgX19pdHRfZG9tYWluICpoX3RhaWwsICpoOworCisgICAgaWYgKCFfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9pbml0aWFsaXplZCAmJiBfTl8oX2l0dGFwaV9nbG9iYWwpLnRocmVhZF9saXN0LT50aWQgPT0gMCkKKyAgICB7CisgICAgICAgIF9faXR0X2luaXRfaXR0bGliX25hbWUoTlVMTCwgX19pdHRfZ3JvdXBfYWxsKTsKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyAgICAgICAgaWYgKElUVE5PVElGWV9OQU1FKGRvbWFpbl9jcmVhdGVBKSAmJiBJVFROT1RJRllfTkFNRShkb21haW5fY3JlYXRlQSkgIT0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKGRvbWFpbl9jcmVhdGVBKSxfaW5pdCkpKQorICAgICAgICAgICAgcmV0dXJuIElUVE5PVElGWV9OQU1FKGRvbWFpbl9jcmVhdGVBKShuYW1lKTsKKyNlbHNlCisgICAgICAgIGlmIChJVFROT1RJRllfTkFNRShkb21haW5fY3JlYXRlKSAmJiBJVFROT1RJRllfTkFNRShkb21haW5fY3JlYXRlKSAhPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8oZG9tYWluX2NyZWF0ZSksX2luaXQpKSkKKyAgICAgICAgICAgIHJldHVybiBJVFROT1RJRllfTkFNRShkb21haW5fY3JlYXRlKShuYW1lKTsKKyNlbmRpZgorICAgIH0KKworICAgIGlmIChuYW1lID09IE5VTEwpCisgICAgICAgIHJldHVybiBfTl8oX2l0dGFwaV9nbG9iYWwpLmRvbWFpbl9saXN0OworCisgICAgSVRUX01VVEVYX0lOSVRfQU5EX0xPQ0soX05fKF9pdHRhcGlfZ2xvYmFsKSk7CisgICAgZm9yIChoX3RhaWwgPSBOVUxMLCBoID0gX05fKF9pdHRhcGlfZ2xvYmFsKS5kb21haW5fbGlzdDsgaCAhPSBOVUxMOyBoX3RhaWwgPSBoLCBoID0gaC0+bmV4dCkKKyAgICAgICAgaWYgKGgtPm5hbWVBICE9IE5VTEwgJiYgIV9faXR0X2ZzdHJjbXAoaC0+bmFtZUEsIG5hbWUpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgaWYgKGggPT0gTlVMTCkgeworICAgICAgICBORVdfRE9NQUlOX0EoJl9OXyhfaXR0YXBpX2dsb2JhbCksaCxoX3RhaWwsbmFtZSk7CisgICAgfQorICAgIF9faXR0X211dGV4X3VubG9jaygmX05fKF9pdHRhcGlfZ2xvYmFsKS5tdXRleCk7CisgICAgcmV0dXJuIGg7Cit9CisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK3N0YXRpYyBfX2l0dF9zdHJpbmdfaGFuZGxlKiBJVFRBUEkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHN0cmluZ19oYW5kbGVfY3JlYXRlVyksX2luaXQpKShjb25zdCB3Y2hhcl90KiBuYW1lKQoreworICAgIF9faXR0X3N0cmluZ19oYW5kbGUgKmhfdGFpbCwgKmg7CisKKyAgICBpZiAoIV9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2luaXRpYWxpemVkICYmIF9OXyhfaXR0YXBpX2dsb2JhbCkudGhyZWFkX2xpc3QtPnRpZCA9PSAwKQorICAgIHsKKyAgICAgICAgX19pdHRfaW5pdF9pdHRsaWJfbmFtZShOVUxMLCBfX2l0dF9ncm91cF9hbGwpOworICAgICAgICBpZiAoSVRUTk9USUZZX05BTUUoc3RyaW5nX2hhbmRsZV9jcmVhdGVXKSAmJiBJVFROT1RJRllfTkFNRShzdHJpbmdfaGFuZGxlX2NyZWF0ZVcpICE9IElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhzdHJpbmdfaGFuZGxlX2NyZWF0ZVcpLF9pbml0KSkpCisgICAgICAgICAgICByZXR1cm4gSVRUTk9USUZZX05BTUUoc3RyaW5nX2hhbmRsZV9jcmVhdGVXKShuYW1lKTsKKyAgICB9CisKKyAgICBpZiAobmFtZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gX05fKF9pdHRhcGlfZ2xvYmFsKS5zdHJpbmdfbGlzdDsKKworICAgIElUVF9NVVRFWF9JTklUX0FORF9MT0NLKF9OXyhfaXR0YXBpX2dsb2JhbCkpOworICAgIGZvciAoaF90YWlsID0gTlVMTCwgaCA9IF9OXyhfaXR0YXBpX2dsb2JhbCkuc3RyaW5nX2xpc3Q7IGggIT0gTlVMTDsgaF90YWlsID0gaCwgaCA9IGgtPm5leHQpCisgICAgICAgIGlmIChoLT5zdHJXICE9IE5VTEwgJiYgIXdjc2NtcChoLT5zdHJXLCBuYW1lKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIGlmIChoID09IE5VTEwpIHsKKyAgICAgICAgTkVXX1NUUklOR19IQU5ETEVfVygmX05fKF9pdHRhcGlfZ2xvYmFsKSxoLGhfdGFpbCxuYW1lKTsKKyAgICB9CisgICAgX19pdHRfbXV0ZXhfdW5sb2NrKCZfTl8oX2l0dGFwaV9nbG9iYWwpLm11dGV4KTsKKyAgICByZXR1cm4gaDsKK30KKworc3RhdGljIF9faXR0X3N0cmluZ19oYW5kbGUqIElUVEFQSSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8oc3RyaW5nX2hhbmRsZV9jcmVhdGVBKSxfaW5pdCkpKGNvbnN0IGNoYXIqIG5hbWUpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCitzdGF0aWMgX19pdHRfc3RyaW5nX2hhbmRsZSogSVRUQVBJIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhzdHJpbmdfaGFuZGxlX2NyZWF0ZSksX2luaXQpKShjb25zdCBjaGFyKiBuYW1lKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworeworICAgIF9faXR0X3N0cmluZ19oYW5kbGUgKmhfdGFpbCwgKmg7CisKKyAgICBpZiAoIV9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2luaXRpYWxpemVkICYmIF9OXyhfaXR0YXBpX2dsb2JhbCkudGhyZWFkX2xpc3QtPnRpZCA9PSAwKQorICAgIHsKKyAgICAgICAgX19pdHRfaW5pdF9pdHRsaWJfbmFtZShOVUxMLCBfX2l0dF9ncm91cF9hbGwpOworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorICAgICAgICBpZiAoSVRUTk9USUZZX05BTUUoc3RyaW5nX2hhbmRsZV9jcmVhdGVBKSAmJiBJVFROT1RJRllfTkFNRShzdHJpbmdfaGFuZGxlX2NyZWF0ZUEpICE9IElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhzdHJpbmdfaGFuZGxlX2NyZWF0ZUEpLF9pbml0KSkpCisgICAgICAgICAgICByZXR1cm4gSVRUTk9USUZZX05BTUUoc3RyaW5nX2hhbmRsZV9jcmVhdGVBKShuYW1lKTsKKyNlbHNlCisgICAgICAgIGlmIChJVFROT1RJRllfTkFNRShzdHJpbmdfaGFuZGxlX2NyZWF0ZSkgJiYgSVRUTk9USUZZX05BTUUoc3RyaW5nX2hhbmRsZV9jcmVhdGUpICE9IElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhzdHJpbmdfaGFuZGxlX2NyZWF0ZSksX2luaXQpKSkKKyAgICAgICAgICAgIHJldHVybiBJVFROT1RJRllfTkFNRShzdHJpbmdfaGFuZGxlX2NyZWF0ZSkobmFtZSk7CisjZW5kaWYKKyAgICB9CisKKyAgICBpZiAobmFtZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gX05fKF9pdHRhcGlfZ2xvYmFsKS5zdHJpbmdfbGlzdDsKKworICAgIElUVF9NVVRFWF9JTklUX0FORF9MT0NLKF9OXyhfaXR0YXBpX2dsb2JhbCkpOworICAgIGZvciAoaF90YWlsID0gTlVMTCwgaCA9IF9OXyhfaXR0YXBpX2dsb2JhbCkuc3RyaW5nX2xpc3Q7IGggIT0gTlVMTDsgaF90YWlsID0gaCwgaCA9IGgtPm5leHQpCisgICAgICAgIGlmIChoLT5zdHJBICE9IE5VTEwgJiYgIV9faXR0X2ZzdHJjbXAoaC0+c3RyQSwgbmFtZSkpCisgICAgICAgICAgICBicmVhazsKKyAgICBpZiAoaCA9PSBOVUxMKSB7CisgICAgICAgIE5FV19TVFJJTkdfSEFORExFX0EoJl9OXyhfaXR0YXBpX2dsb2JhbCksaCxoX3RhaWwsbmFtZSk7CisgICAgfQorICAgIF9faXR0X211dGV4X3VubG9jaygmX05fKF9pdHRhcGlfZ2xvYmFsKS5tdXRleCk7CisgICAgcmV0dXJuIGg7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIElUVEFQSSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8ocGF1c2UpLF9pbml0KSkodm9pZCkKK3sKKyAgICBpZiAoIV9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2luaXRpYWxpemVkICYmIF9OXyhfaXR0YXBpX2dsb2JhbCkudGhyZWFkX2xpc3QtPnRpZCA9PSAwKQorICAgIHsKKyAgICAgICAgX19pdHRfaW5pdF9pdHRsaWJfbmFtZShOVUxMLCBfX2l0dF9ncm91cF9hbGwpOworICAgICAgICBpZiAoSVRUTk9USUZZX05BTUUocGF1c2UpICYmIElUVE5PVElGWV9OQU1FKHBhdXNlKSAhPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8ocGF1c2UpLF9pbml0KSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHBhdXNlKSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIF9OXyhfaXR0YXBpX2dsb2JhbCkuc3RhdGUgPSBfX2l0dF9jb2xsZWN0aW9uX3BhdXNlZDsKK30KKworc3RhdGljIHZvaWQgSVRUQVBJIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhyZXN1bWUpLF9pbml0KSkodm9pZCkKK3sKKyAgICBpZiAoIV9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2luaXRpYWxpemVkICYmIF9OXyhfaXR0YXBpX2dsb2JhbCkudGhyZWFkX2xpc3QtPnRpZCA9PSAwKQorICAgIHsKKyAgICAgICAgX19pdHRfaW5pdF9pdHRsaWJfbmFtZShOVUxMLCBfX2l0dF9ncm91cF9hbGwpOworICAgICAgICBpZiAoSVRUTk9USUZZX05BTUUocmVzdW1lKSAmJiBJVFROT1RJRllfTkFNRShyZXN1bWUpICE9IElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhyZXN1bWUpLF9pbml0KSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHJlc3VtZSkoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBfTl8oX2l0dGFwaV9nbG9iYWwpLnN0YXRlID0gX19pdHRfY29sbGVjdGlvbl9ub3JtYWw7Cit9CisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK3N0YXRpYyB2b2lkIElUVEFQSSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8odGhyZWFkX3NldF9uYW1lVyksX2luaXQpKShjb25zdCB3Y2hhcl90KiBuYW1lKQoreworICAgIFRJRFQgdGlkID0gX19pdHRfdGhyZWFkX2lkKCk7CisgICAgX19pdHRfdGhyZWFkX2luZm8gKmhfdGFpbCwgKmg7CisKKyAgICBpZiAoIV9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2luaXRpYWxpemVkICYmIF9OXyhfaXR0YXBpX2dsb2JhbCkudGhyZWFkX2xpc3QtPnRpZCA9PSAwKQorICAgIHsKKyAgICAgICAgX19pdHRfaW5pdF9pdHRsaWJfbmFtZShOVUxMLCBfX2l0dF9ncm91cF9hbGwpOworICAgICAgICBpZiAoSVRUTk9USUZZX05BTUUodGhyZWFkX3NldF9uYW1lVykgJiYgSVRUTk9USUZZX05BTUUodGhyZWFkX3NldF9uYW1lVykgIT0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHRocmVhZF9zZXRfbmFtZVcpLF9pbml0KSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHRocmVhZF9zZXRfbmFtZVcpKG5hbWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgX19pdHRfbXV0ZXhfbG9jaygmX05fKF9pdHRhcGlfZ2xvYmFsKS5tdXRleCk7CisgICAgZm9yIChoX3RhaWwgPSBOVUxMLCBoID0gX05fKF9pdHRhcGlfZ2xvYmFsKS50aHJlYWRfbGlzdDsgaCAhPSBOVUxMOyBoX3RhaWwgPSBoLCBoID0gaC0+bmV4dCkKKyAgICAgICAgaWYgKGgtPnRpZCA9PSB0aWQpCisgICAgICAgICAgICBicmVhazsKKyAgICBpZiAoaCA9PSBOVUxMKSB7CisgICAgICAgIE5FV19USFJFQURfSU5GT19XKCZfTl8oX2l0dGFwaV9nbG9iYWwpLCBoLCBoX3RhaWwsIHRpZCwgX19pdHRfdGhyZWFkX25vcm1hbCwgbmFtZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGgtPm5hbWVXID0gbmFtZSA/IF93Y3NkdXAobmFtZSkgOiBOVUxMOworICAgIH0KKyAgICBfX2l0dF9tdXRleF91bmxvY2soJl9OXyhfaXR0YXBpX2dsb2JhbCkubXV0ZXgpOworfQorCitzdGF0aWMgaW50IElUVEFQSSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8odGhyX25hbWVfc2V0VyksX2luaXQpKShjb25zdCB3Y2hhcl90KiBuYW1lLCBpbnQgbmFtZWxlbikKK3sKKyAgICBuYW1lbGVuID0gbmFtZWxlbjsKKyAgICBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8odGhyZWFkX3NldF9uYW1lVyksX2luaXQpKShuYW1lKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgSVRUQVBJIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyh0aHJlYWRfc2V0X25hbWVBKSxfaW5pdCkpKGNvbnN0IGNoYXIqIG5hbWUpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitzdGF0aWMgdm9pZCBJVFRBUEkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHRocmVhZF9zZXRfbmFtZSksX2luaXQpKShjb25zdCBjaGFyKiBuYW1lKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworeworICAgIFRJRFQgdGlkID0gX19pdHRfdGhyZWFkX2lkKCk7CisgICAgX19pdHRfdGhyZWFkX2luZm8gKmhfdGFpbCwgKmg7CisKKyAgICBpZiAoIV9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2luaXRpYWxpemVkICYmIF9OXyhfaXR0YXBpX2dsb2JhbCkudGhyZWFkX2xpc3QtPnRpZCA9PSAwKQorICAgIHsKKyAgICAgICAgX19pdHRfaW5pdF9pdHRsaWJfbmFtZShOVUxMLCBfX2l0dF9ncm91cF9hbGwpOworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorICAgICAgICBpZiAoSVRUTk9USUZZX05BTUUodGhyZWFkX3NldF9uYW1lQSkgJiYgSVRUTk9USUZZX05BTUUodGhyZWFkX3NldF9uYW1lQSkgIT0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHRocmVhZF9zZXRfbmFtZUEpLF9pbml0KSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHRocmVhZF9zZXRfbmFtZUEpKG5hbWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisgICAgICAgIGlmIChJVFROT1RJRllfTkFNRSh0aHJlYWRfc2V0X25hbWUpICYmIElUVE5PVElGWV9OQU1FKHRocmVhZF9zZXRfbmFtZSkgIT0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHRocmVhZF9zZXRfbmFtZSksX2luaXQpKSkKKyAgICAgICAgeworICAgICAgICAgICAgSVRUTk9USUZZX05BTUUodGhyZWFkX3NldF9uYW1lKShuYW1lKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworICAgIH0KKworICAgIF9faXR0X211dGV4X2xvY2soJl9OXyhfaXR0YXBpX2dsb2JhbCkubXV0ZXgpOworICAgIGZvciAoaF90YWlsID0gTlVMTCwgaCA9IF9OXyhfaXR0YXBpX2dsb2JhbCkudGhyZWFkX2xpc3Q7IGggIT0gTlVMTDsgaF90YWlsID0gaCwgaCA9IGgtPm5leHQpCisgICAgICAgIGlmIChoLT50aWQgPT0gdGlkKQorICAgICAgICAgICAgYnJlYWs7CisgICAgaWYgKGggPT0gTlVMTCkgeworICAgICAgICBORVdfVEhSRUFEX0lORk9fQSgmX05fKF9pdHRhcGlfZ2xvYmFsKSwgaCwgaF90YWlsLCB0aWQsIF9faXR0X3RocmVhZF9ub3JtYWwsIG5hbWUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBoLT5uYW1lQSA9IG5hbWUgPyBfX2l0dF9mc3RyZHVwKG5hbWUpIDogTlVMTDsKKyAgICB9CisgICAgX19pdHRfbXV0ZXhfdW5sb2NrKCZfTl8oX2l0dGFwaV9nbG9iYWwpLm11dGV4KTsKK30KKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorc3RhdGljIGludCBJVFRBUEkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHRocl9uYW1lX3NldEEpLF9pbml0KSkoY29uc3QgY2hhciogbmFtZSwgaW50IG5hbWVsZW4pCit7CisgICAgbmFtZWxlbiA9IG5hbWVsZW47CisgICAgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHRocmVhZF9zZXRfbmFtZUEpLF9pbml0KSkobmFtZSk7CisgICAgcmV0dXJuIDA7Cit9CisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitzdGF0aWMgaW50IElUVEFQSSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8odGhyX25hbWVfc2V0KSxfaW5pdCkpKGNvbnN0IGNoYXIqIG5hbWUsIGludCBuYW1lbGVuKQoreworICAgIG5hbWVsZW4gPSBuYW1lbGVuOworICAgIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyh0aHJlYWRfc2V0X25hbWUpLF9pbml0KSkobmFtZSk7CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKK3N0YXRpYyB2b2lkIElUVEFQSSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8odGhyZWFkX2lnbm9yZSksX2luaXQpKSh2b2lkKQoreworICAgIFRJRFQgdGlkID0gX19pdHRfdGhyZWFkX2lkKCk7CisgICAgX19pdHRfdGhyZWFkX2luZm8gKmhfdGFpbCwgKmg7CisKKyAgICBpZiAoIV9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2luaXRpYWxpemVkICYmIF9OXyhfaXR0YXBpX2dsb2JhbCkudGhyZWFkX2xpc3QtPnRpZCA9PSAwKQorICAgIHsKKyAgICAgICAgX19pdHRfaW5pdF9pdHRsaWJfbmFtZShOVUxMLCBfX2l0dF9ncm91cF9hbGwpOworICAgICAgICBpZiAoSVRUTk9USUZZX05BTUUodGhyZWFkX2lnbm9yZSkgJiYgSVRUTk9USUZZX05BTUUodGhyZWFkX2lnbm9yZSkgIT0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHRocmVhZF9pZ25vcmUpLF9pbml0KSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHRocmVhZF9pZ25vcmUpKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX2l0dF9tdXRleF9sb2NrKCZfTl8oX2l0dGFwaV9nbG9iYWwpLm11dGV4KTsKKyAgICBmb3IgKGhfdGFpbCA9IE5VTEwsIGggPSBfTl8oX2l0dGFwaV9nbG9iYWwpLnRocmVhZF9saXN0OyBoICE9IE5VTEw7IGhfdGFpbCA9IGgsIGggPSBoLT5uZXh0KQorICAgICAgICBpZiAoaC0+dGlkID09IHRpZCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIGlmIChoID09IE5VTEwpIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIqIG5hbWUgPSAidW5rbm93biI7CisgICAgICAgIE5FV19USFJFQURfSU5GT19BKCZfTl8oX2l0dGFwaV9nbG9iYWwpLCBoLCBoX3RhaWwsIHRpZCwgX19pdHRfdGhyZWFkX2lnbm9yZWQsIG5hbWUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBoLT5zdGF0ZSA9IF9faXR0X3RocmVhZF9pZ25vcmVkOworICAgIH0KKyAgICBfX2l0dF9tdXRleF91bmxvY2soJl9OXyhfaXR0YXBpX2dsb2JhbCkubXV0ZXgpOworfQorCitzdGF0aWMgdm9pZCBJVFRBUEkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHRocl9pZ25vcmUpLF9pbml0KSkodm9pZCkKK3sKKyAgICBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8odGhyZWFkX2lnbm9yZSksX2luaXQpKSgpOworfQorCitzdGF0aWMgdm9pZCBJVFRBUEkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKGVuYWJsZV9hdHRhY2gpLF9pbml0KSkodm9pZCkKK3sKKyNpZmRlZiBfX0FORFJPSURfXworICAgIC8qCisgICAgICogaWYgTElCX1ZBUl9OQU1FIGVudiB2YXJpYWJsZSB3ZXJlIHNldCBiZWZvcmUgdGhlbiBzdGF5IHByZXZpb3VzIHZhbHVlCisgICAgICogZWxzZSBzZXQgZGVmYXVsdCBwYXRoCisgICAgKi8KKyAgICBzZXRlbnYoSVRUX1RPX1NUUihMSUJfVkFSX05BTUUpLCBBTkRST0lEX0lUVE5PVElGWV9ERUZBVUxUX1BBVEgsIDApOworI2VuZGlmCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBjb25zdCBjaGFyKiBfX2l0dF9mc3BsaXQoY29uc3QgY2hhciogcywgY29uc3QgY2hhciogc2VwLCBjb25zdCBjaGFyKiogb3V0LCBpbnQqIGxlbikKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgajsKKworICAgIGlmICghcyB8fCAhc2VwIHx8ICFvdXQgfHwgIWxlbikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBmb3IgKGkgPSAwOyBzW2ldOyBpKyspCisgICAgeworICAgICAgICBpbnQgYiA9IDA7CisgICAgICAgIGZvciAoaiA9IDA7IHNlcFtqXTsgaisrKQorICAgICAgICAgICAgaWYgKHNbaV0gPT0gc2VwW2pdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGIgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICBpZiAoIWIpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIXNbaV0pCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgKmxlbiA9IDA7CisgICAgKm91dCA9ICZzW2ldOworCisgICAgZm9yICg7IHNbaV07IGkrKywgKCpsZW4pKyspCisgICAgeworICAgICAgICBpbnQgYiA9IDA7CisgICAgICAgIGZvciAoaiA9IDA7IHNlcFtqXTsgaisrKQorICAgICAgICAgICAgaWYgKHNbaV0gPT0gc2VwW2pdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGIgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICBpZiAoYikKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGZvciAoOyBzW2ldOyBpKyspCisgICAgeworICAgICAgICBpbnQgYiA9IDA7CisgICAgICAgIGZvciAoaiA9IDA7IHNlcFtqXTsgaisrKQorICAgICAgICAgICAgaWYgKHNbaV0gPT0gc2VwW2pdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGIgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICBpZiAoIWIpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gJnNbaV07Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gcmV0dXJuIHZhbHVlIG9mIGVudiB2YXJpYWJsZSB0aGF0IHBsYWNlZCBpbnRvIHN0YXRpYyBidWZmZXIuCisgKiAhISEgVGhlIHNhbWUgc3RhdGljIGJ1ZmZlciBpcyB1c2VkIGZvciBzdWJzZXF1ZW50IGNhbGxzLiAhISEKKyAqIFRoaXMgd2FzIGRvbmUgdG8gYXZpb2QgZHluYW1pYyBhbGxvY2F0aW9uIGZvciBmZXcgY2FsbHMuCisgKiBBY3R1YWxseSB3ZSBuZWVkIHRoaXMgZnVuY3Rpb24gb25seSBmb3VyIHRpbWVzLgorICovCitzdGF0aWMgY29uc3QgY2hhciogX19pdHRfZ2V0X2Vudl92YXIoY29uc3QgY2hhciogbmFtZSkKK3sKKyNkZWZpbmUgTUFYX0VOVl9WQUxVRV9TSVpFIDQwODYKKyAgICBzdGF0aWMgY2hhciAgZW52X2J1ZmZbTUFYX0VOVl9WQUxVRV9TSVpFXTsKKyAgICBzdGF0aWMgY2hhciogZW52X3ZhbHVlID0gKGNoYXIqKWVudl9idWZmOworCisgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICB7CisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisgICAgICAgIHNpemVfdCBtYXhfbGVuID0gTUFYX0VOVl9WQUxVRV9TSVpFIC0gKHNpemVfdCkoZW52X3ZhbHVlIC0gZW52X2J1ZmYpOworICAgICAgICBEV09SRCByYyA9IEdldEVudmlyb25tZW50VmFyaWFibGVBKG5hbWUsIGVudl92YWx1ZSwgKERXT1JEKW1heF9sZW4pOworICAgICAgICBpZiAocmMgPj0gbWF4X2xlbikKKyAgICAgICAgICAgIF9faXR0X3JlcG9ydF9lcnJvcihfX2l0dF9lcnJvcl9lbnZfdG9vX2xvbmcsIG5hbWUsIChzaXplX3QpcmMgLSAxLCAoc2l6ZV90KShtYXhfbGVuIC0gMSkpOworICAgICAgICBlbHNlIGlmIChyYyA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHJldCA9IChjb25zdCBjaGFyKillbnZfdmFsdWU7CisgICAgICAgICAgICBlbnZfdmFsdWUgKz0gcmMgKyAxOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIElmIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIGVtcHR5LCBHZXRFbnZpcm9ybm1lbnRWYXJpYWJsZXMoKQorICAgICAgICAgICAgICogcmV0dXJucyB6ZXJvIChudW1iZXIgb2YgY2hhcmFjdGVycyAobm90IGluY2x1ZGluZyB0ZXJtaW5hdGluZyBudWxsKSwKKyAgICAgICAgICAgICAqIGFuZCBHZXRMYXN0RXJyb3IoKSByZXR1cm5zIEVSUk9SX1NVQ0NFU1MuICovCisgICAgICAgICAgICBEV09SRCBlcnIgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gRVJST1JfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICByZXR1cm4gZW52X3ZhbHVlOworCisgICAgICAgICAgICBpZiAoZXJyICE9IEVSUk9SX0VOVlZBUl9OT1RfRk9VTkQpCisgICAgICAgICAgICAgICAgX19pdHRfcmVwb3J0X2Vycm9yKF9faXR0X2Vycm9yX2NhbnRfcmVhZF9lbnYsIG5hbWUsIChpbnQpZXJyKTsKKyAgICAgICAgfQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworICAgICAgICBjaGFyKiBlbnYgPSBnZXRlbnYobmFtZSk7CisgICAgICAgIGlmIChlbnYgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihlbnYpOworICAgICAgICAgICAgc2l6ZV90IG1heF9sZW4gPSBNQVhfRU5WX1ZBTFVFX1NJWkUgLSAoc2l6ZV90KShlbnZfdmFsdWUgLSBlbnZfYnVmZik7CisgICAgICAgICAgICBpZiAobGVuIDwgbWF4X2xlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiByZXQgPSAoY29uc3QgY2hhciopZW52X3ZhbHVlOworICAgICAgICAgICAgICAgIHN0cm5jcHkoZW52X3ZhbHVlLCBlbnYsIGxlbiArIDEpOworICAgICAgICAgICAgICAgIGVudl92YWx1ZSArPSBsZW4gKyAxOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBfX2l0dF9yZXBvcnRfZXJyb3IoX19pdHRfZXJyb3JfZW52X3Rvb19sb25nLCBuYW1lLCAoc2l6ZV90KWxlbiwgKHNpemVfdCkobWF4X2xlbiAtIDEpKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIqIF9faXR0X2dldF9saWJfbmFtZSh2b2lkKQoreworICAgIGNvbnN0IGNoYXIqIGxpYl9uYW1lID0gX19pdHRfZ2V0X2Vudl92YXIoSVRUX1RPX1NUUihMSUJfVkFSX05BTUUpKTsKKworICAgIHJldHVybiBsaWJfbmFtZTsKK30KKworI2lmbmRlZiBtaW4KKyNkZWZpbmUgbWluKGEsYikgKGEpIDwgKGIpID8gKGEpIDogKGIpCisjZW5kaWYgLyogbWluICovCisKK3N0YXRpYyBfX2l0dF9ncm91cF9pZCBfX2l0dF9nZXRfZ3JvdXBzKHZvaWQpCit7CisgICAgcmVnaXN0ZXIgaW50IGk7CisgICAgX19pdHRfZ3JvdXBfaWQgcmVzID0gX19pdHRfZ3JvdXBfbm9uZTsKKyAgICBjb25zdCBjaGFyKiB2YXJfbmFtZSAgPSAiSU5URUxfSVRUTk9USUZZX0dST1VQUyI7CisgICAgY29uc3QgY2hhciogZ3JvdXBfc3RyID0gX19pdHRfZ2V0X2Vudl92YXIodmFyX25hbWUpOworCisgICAgaWYgKGdyb3VwX3N0ciAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW50IGxlbjsKKyAgICAgICAgY2hhciBnclsyNTVdOworICAgICAgICBjb25zdCBjaGFyKiBjaHVuazsKKyAgICAgICAgd2hpbGUgKChncm91cF9zdHIgPSBfX2l0dF9mc3BsaXQoZ3JvdXBfc3RyLCAiLDsgIiwgJmNodW5rLCAmbGVuKSkgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgX19pdHRfZnN0cmNweW4oZ3IsIGNodW5rLCBzaXplb2YoZ3IpIC0gMSk7CisgICAgICAgICAgICBnclttaW4obGVuLCAoaW50KShzaXplb2YoZ3IpIC0gMSkpXSA9IDA7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGdyb3VwX2xpc3RbaV0ubmFtZSAhPSBOVUxMOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFfX2l0dF9mc3RyY21wKGdyLCBncm91cF9saXN0W2ldLm5hbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gKF9faXR0X2dyb3VwX2lkKShyZXMgfCBncm91cF9saXN0W2ldLmlkKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIFRPRE86ICEhISBXb3JrYXJvdW5kIGZvciBidWcgd2l0aCB3YXJuaW5nIGZvciB1bmtub3duIGdyb3VwICEhIQorICAgICAgICAgKiBTaG91bGQgYmUgZml4ZWQgaW4gbmV3IGluaXRpYWxpemF0aW9uIHNjaGVtZS4KKyAgICAgICAgICogTm93IHRoZSBmb2xsb3dpbmcgZ3JvdXBzIHNob3VsZCBiZSBzZXQgYWx3YXlzLiAqLworICAgICAgICBmb3IgKGkgPSAwOyBncm91cF9saXN0W2ldLmlkICE9IF9faXR0X2dyb3VwX25vbmU7IGkrKykKKyAgICAgICAgICAgIGlmIChncm91cF9saXN0W2ldLmlkICE9IF9faXR0X2dyb3VwX2FsbCAmJgorICAgICAgICAgICAgICAgIGdyb3VwX2xpc3RbaV0uaWQgPiBfX2l0dF9ncm91cF9zcGxpdHRlcl9taW4gJiYKKyAgICAgICAgICAgICAgICBncm91cF9saXN0W2ldLmlkIDwgX19pdHRfZ3JvdXBfc3BsaXR0ZXJfbWF4KQorICAgICAgICAgICAgICAgIHJlcyA9IChfX2l0dF9ncm91cF9pZCkocmVzIHwgZ3JvdXBfbGlzdFtpXS5pZCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGdyb3VwX2FsaWFzW2ldLmVudl92YXIgIT0gTlVMTDsgaSsrKQorICAgICAgICAgICAgaWYgKF9faXR0X2dldF9lbnZfdmFyKGdyb3VwX2FsaWFzW2ldLmVudl92YXIpICE9IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGdyb3VwX2FsaWFzW2ldLmdyb3VwczsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IF9faXR0X2xpYl92ZXJzaW9uKGxpYl90IGxpYikKK3sKKyAgICBpZiAobGliID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChfX2l0dF9nZXRfcHJvYyhsaWIsICJfX2l0dF9hcGlfaW5pdCIpKQorICAgICAgICByZXR1cm4gMjsKKyAgICBpZiAoX19pdHRfZ2V0X3Byb2MobGliLCAiX19pdHRfYXBpX3ZlcnNpb24iKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIEl0J3Mgbm90IHVzZWQgcmlnaHQgbm93ISBDb21tZW50IGl0IG91dCB0byBhdm9pZCB3YXJuaW5ncy4KK3N0YXRpYyB2b2lkIF9faXR0X3JlaW5pdF9hbGxfcG9pbnRlcnModm9pZCkKK3sKKyAgICByZWdpc3RlciBpbnQgaTsKKyAgICAvLyBGaWxsIGFsbCBwb2ludGVycyB3aXRoIGluaXRpYWwgc3R1YnMKKyAgICBmb3IgKGkgPSAwOyBfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5uYW1lICE9IE5VTEw7IGkrKykKKyAgICAgICAgKl9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLmZ1bmNfcHRyID0gX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0uaW5pdF9mdW5jOworfQorKi8KKworc3RhdGljIHZvaWQgX19pdHRfbnVsbGlmeV9hbGxfcG9pbnRlcnModm9pZCkKK3sKKyAgICByZWdpc3RlciBpbnQgaTsKKyAgICAvKiBOdWxpZnkgYWxsIHBvaW50ZXJzIGV4Y2VwdCBkb21haW5fY3JlYXRlIGFuZCBzdHJpbmdfaGFuZGxlX2NyZWF0ZSAqLworICAgIGZvciAoaSA9IDA7IF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorICAgICAgICAqX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0uZnVuY19wdHIgPSBfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5udWxsX2Z1bmM7Cit9CisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNwcmFnbWEgd2FybmluZyhwdXNoKQorI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6IDQwNTQpIC8qIHdhcm5pbmcgQzQwNTQ6ICd0eXBlIGNhc3QnIDogZnJvbSBmdW5jdGlvbiBwb2ludGVyICdYWFgnIHRvIGRhdGEgcG9pbnRlciAndm9pZCAqJyAqLworI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6IDQwNTUpIC8qIHdhcm5pbmcgQzQwNTU6ICd0eXBlIGNhc3QnIDogZnJvbSBkYXRhIHBvaW50ZXIgJ3ZvaWQgKicgdG8gZnVuY3Rpb24gcG9pbnRlciAnWFhYJyAqLworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCitJVFRfRVhURVJOX0Mgdm9pZCBfTl8oZmluaV9pdHRsaWIpKHZvaWQpCit7CisgICAgX19pdHRfYXBpX2ZpbmlfdCogX19pdHRfYXBpX2ZpbmlfcHRyOworICAgIHN0YXRpYyB2b2xhdGlsZSBUSURUIGN1cnJlbnRfdGhyZWFkID0gMDsKKworICAgIGlmIChfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9pbml0aWFsaXplZCkKKyAgICB7CisgICAgICAgIF9faXR0X211dGV4X2xvY2soJl9OXyhfaXR0YXBpX2dsb2JhbCkubXV0ZXgpOworICAgICAgICBpZiAoX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfaW5pdGlhbGl6ZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjdXJyZW50X3RocmVhZCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN1cnJlbnRfdGhyZWFkID0gX19pdHRfdGhyZWFkX2lkKCk7CisgICAgICAgICAgICAgICAgX19pdHRfYXBpX2ZpbmlfcHRyID0gKF9faXR0X2FwaV9maW5pX3QqKShzaXplX3QpX19pdHRfZ2V0X3Byb2MoX05fKF9pdHRhcGlfZ2xvYmFsKS5saWIsICJfX2l0dF9hcGlfZmluaSIpOworICAgICAgICAgICAgICAgIGlmIChfX2l0dF9hcGlfZmluaV9wdHIpCisgICAgICAgICAgICAgICAgICAgIF9faXR0X2FwaV9maW5pX3B0cigmX05fKF9pdHRhcGlfZ2xvYmFsKSk7CisKKyAgICAgICAgICAgICAgICBfX2l0dF9udWxsaWZ5X2FsbF9wb2ludGVycygpOworCisgLyogVE9ETzogISEhIG5vdCBzYWZlICEhISBkb24ndCBzdXBwb3J0IHVubG9hZCBzbyBmYXIuCisgICogICAgICAgICAgICAgaWYgKF9OXyhfaXR0YXBpX2dsb2JhbCkubGliICE9IE5VTEwpCisgICogICAgICAgICAgICAgICAgIF9faXR0X3VubG9hZF9saWIoX05fKF9pdHRhcGlfZ2xvYmFsKS5saWIpOworICAqICAgICAgICAgICAgIF9OXyhfaXR0YXBpX2dsb2JhbCkubGliID0gTlVMTDsKKyAgKi8KKyAgICAgICAgICAgICAgICBfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9pbml0aWFsaXplZCA9IDA7CisgICAgICAgICAgICAgICAgY3VycmVudF90aHJlYWQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIF9faXR0X211dGV4X3VubG9jaygmX05fKF9pdHRhcGlfZ2xvYmFsKS5tdXRleCk7CisgICAgfQorfQorCitJVFRfRVhURVJOX0MgaW50IF9OXyhpbml0X2l0dGxpYikoY29uc3QgY2hhciogbGliX25hbWUsIF9faXR0X2dyb3VwX2lkIGluaXRfZ3JvdXBzKQoreworICAgIHJlZ2lzdGVyIGludCBpOworICAgIF9faXR0X2dyb3VwX2lkIGdyb3VwczsKKyNpZmRlZiBJVFRfQ09NUExFVEVfR1JPVVAKKyAgICBfX2l0dF9ncm91cF9pZCB6ZXJvX2dyb3VwID0gX19pdHRfZ3JvdXBfbm9uZTsKKyNlbmRpZiAvKiBJVFRfQ09NUExFVEVfR1JPVVAgKi8KKyAgICBzdGF0aWMgdm9sYXRpbGUgVElEVCBjdXJyZW50X3RocmVhZCA9IDA7CisKKyAgICBpZiAoIV9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2luaXRpYWxpemVkKQorICAgIHsKKyNpZm5kZWYgSVRUX1NJTVBMRV9JTklUCisgICAgICAgIElUVF9NVVRFWF9JTklUX0FORF9MT0NLKF9OXyhfaXR0YXBpX2dsb2JhbCkpOworI2VuZGlmIC8qIElUVF9TSU1QTEVfSU5JVCAqLworCisgICAgICAgIGlmICghX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfaW5pdGlhbGl6ZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjdXJyZW50X3RocmVhZCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN1cnJlbnRfdGhyZWFkID0gX19pdHRfdGhyZWFkX2lkKCk7CisgICAgICAgICAgICAgICAgX05fKF9pdHRhcGlfZ2xvYmFsKS50aHJlYWRfbGlzdC0+dGlkID0gY3VycmVudF90aHJlYWQ7CisgICAgICAgICAgICAgICAgaWYgKGxpYl9uYW1lID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGxpYl9uYW1lID0gX19pdHRfZ2V0X2xpYl9uYW1lKCk7CisgICAgICAgICAgICAgICAgZ3JvdXBzID0gX19pdHRfZ2V0X2dyb3VwcygpOworICAgICAgICAgICAgICAgIGlmIChncm91cHMgIT0gX19pdHRfZ3JvdXBfbm9uZSB8fCBsaWJfbmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX05fKF9pdHRhcGlfZ2xvYmFsKS5saWIgPSBfX2l0dF9sb2FkX2xpYigobGliX25hbWUgPT0gTlVMTCkgPyBpdHRub3RpZnlfbGliX25hbWUgOiBsaWJfbmFtZSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9OXyhfaXR0YXBpX2dsb2JhbCkubGliICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9faXR0X2FwaV9pbml0X3QqIF9faXR0X2FwaV9pbml0X3B0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaWJfdmVyc2lvbiA9IF9faXR0X2xpYl92ZXJzaW9uKF9OXyhfaXR0YXBpX2dsb2JhbCkubGliKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChsaWJfdmVyc2lvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwcyA9IF9faXR0X2dyb3VwX2xlZ2FjeTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaWxsIGFsbCBwb2ludGVycyBmcm9tIGR5bmFtaWMgbGlicmFyeSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLmdyb3VwICYgZ3JvdXBzICYgaW5pdF9ncm91cHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5mdW5jX3B0ciA9ICh2b2lkKilfX2l0dF9nZXRfcHJvYyhfTl8oX2l0dGFwaV9nbG9iYWwpLmxpYiwgX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0ubmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKl9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLmZ1bmNfcHRyID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVzdG9yZSBwb2ludGVycyBmb3IgZnVuY3Rpb24gd2l0aCBzdGF0aWMgaW1wbGVtZW50YXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0uZnVuY19wdHIgPSBfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5udWxsX2Z1bmM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pdHRfcmVwb3J0X2Vycm9yKF9faXR0X2Vycm9yX25vX3N5bWJvbCwgbGliX25hbWUsIF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLm5hbWUpOworI2lmZGVmIElUVF9DT01QTEVURV9HUk9VUAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHplcm9fZ3JvdXAgPSAoX19pdHRfZ3JvdXBfaWQpKHplcm9fZ3JvdXAgfCBfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5ncm91cCk7CisjZW5kaWYgLyogSVRUX0NPTVBMRVRFX0dST1VQICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKl9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLmZ1bmNfcHRyID0gX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0ubnVsbF9mdW5jOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChncm91cHMgPT0gX19pdHRfZ3JvdXBfbGVnYWN5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29tcGF0aWJpbGl0eSB3aXRoIGxlZ2FjeSB0b29scyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVFROT1RJRllfTkFNRSh0aHJlYWRfaWdub3JlKSAgPSBJVFROT1RJRllfTkFNRSh0aHJfaWdub3JlKTsKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRUTk9USUZZX05BTUUoc3luY19jcmVhdGVBKSAgID0gSVRUTk9USUZZX05BTUUoc3luY19zZXRfbmFtZUEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVFROT1RJRllfTkFNRShzeW5jX2NyZWF0ZVcpICAgPSBJVFROT1RJRllfTkFNRShzeW5jX3NldF9uYW1lVyk7CisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHN5bmNfY3JlYXRlKSAgICA9IElUVE5PVElGWV9OQU1FKHN5bmNfc2V0X25hbWUpOworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVFROT1RJRllfTkFNRShzeW5jX3ByZXBhcmUpICAgPSBJVFROT1RJRllfTkFNRShub3RpZnlfc3luY19wcmVwYXJlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRUTk9USUZZX05BTUUoc3luY19jYW5jZWwpICAgID0gSVRUTk9USUZZX05BTUUobm90aWZ5X3N5bmNfY2FuY2VsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRUTk9USUZZX05BTUUoc3luY19hY3F1aXJlZCkgID0gSVRUTk9USUZZX05BTUUobm90aWZ5X3N5bmNfYWNxdWlyZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVFROT1RJRllfTkFNRShzeW5jX3JlbGVhc2luZykgPSBJVFROT1RJRllfTkFNRShub3RpZnlfc3luY19yZWxlYXNpbmcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworI2lmZGVmIElUVF9DT01QTEVURV9HUk9VUAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0uZ3JvdXAgJiB6ZXJvX2dyb3VwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKl9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLmZ1bmNfcHRyID0gX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0ubnVsbF9mdW5jOworI2VuZGlmIC8qIElUVF9DT01QTEVURV9HUk9VUCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faXR0X2FwaV9pbml0X3B0ciA9IChfX2l0dF9hcGlfaW5pdF90Kikoc2l6ZV90KV9faXR0X2dldF9wcm9jKF9OXyhfaXR0YXBpX2dsb2JhbCkubGliLCAiX19pdHRfYXBpX2luaXQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX19pdHRfYXBpX2luaXRfcHRyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2l0dF9hcGlfaW5pdF9wdHIoJl9OXyhfaXR0YXBpX2dsb2JhbCksIGluaXRfZ3JvdXBzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9faXR0X251bGxpZnlfYWxsX3BvaW50ZXJzKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIF9faXR0X3JlcG9ydF9lcnJvcihfX2l0dF9lcnJvcl9ub19tb2R1bGUsIGxpYl9uYW1lLAorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faXR0X3N5c3RlbV9lcnJvcigpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGxlcnJvcigpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9faXR0X251bGxpZnlfYWxsX3BvaW50ZXJzKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2luaXRpYWxpemVkID0gMTsKKyAgICAgICAgICAgICAgICBjdXJyZW50X3RocmVhZCA9IDA7CisgICAgICAgICAgICAgICAgLyogISEhIEp1c3QgdG8gYXZvaWQgdW51c2VkIGNvZGUgZWxpbWluYXRpb24gISEhICovCisgICAgICAgICAgICAgICAgaWYgKF9faXR0X2ZpbmlfaXR0bGliX3B0ciA9PSBfTl8oZmluaV9pdHRsaWIpKSBjdXJyZW50X3RocmVhZCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworI2lmbmRlZiBJVFRfU0lNUExFX0lOSVQKKyAgICAgICAgX19pdHRfbXV0ZXhfdW5sb2NrKCZfTl8oX2l0dGFwaV9nbG9iYWwpLm11dGV4KTsKKyNlbmRpZiAvKiBJVFRfU0lNUExFX0lOSVQgKi8KKyAgICB9CisKKyAgICAvKiBFdmFsdWF0aW5nIGlmIGFueSBmdW5jdGlvbiBwdHIgaXMgbm9uIGVtcHR5IGFuZCBpdCdzIGluIGluaXRfZ3JvdXBzICovCisgICAgZm9yIChpID0gMDsgX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0ubmFtZSAhPSBOVUxMOyBpKyspCisgICAgICAgIGlmICgqX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0uZnVuY19wdHIgIT0gX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0ubnVsbF9mdW5jICYmCisgICAgICAgICAgICBfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5ncm91cCAmIGluaXRfZ3JvdXBzKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgcmV0dXJuIDA7Cit9CisKK0lUVF9FWFRFUk5fQyBfX2l0dF9lcnJvcl9oYW5kbGVyX3QqIF9OXyhzZXRfZXJyb3JfaGFuZGxlcikoX19pdHRfZXJyb3JfaGFuZGxlcl90KiBoYW5kbGVyKQoreworICAgIF9faXR0X2Vycm9yX2hhbmRsZXJfdCogcHJldiA9IChfX2l0dF9lcnJvcl9oYW5kbGVyX3QqKShzaXplX3QpX05fKF9pdHRhcGlfZ2xvYmFsKS5lcnJvcl9oYW5kbGVyOworICAgIF9OXyhfaXR0YXBpX2dsb2JhbCkuZXJyb3JfaGFuZGxlciA9ICh2b2lkKikoc2l6ZV90KWhhbmRsZXI7CisgICAgcmV0dXJuIHByZXY7Cit9CisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNwcmFnbWEgd2FybmluZyhwb3ApCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeV9zdGF0aWMuaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeV9zdGF0aWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTFmZTNjCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvaXR0bm90aWZ5X3N0YXRpYy5oCkBAIC0wLDAgKzEsMzE2IEBACisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJpdHRub3RpZnlfY29uZmlnLmgiCisKKyNpZm5kZWYgSVRUX0ZPUk1BVF9ERUZJTkVECisjICBpZm5kZWYgSVRUX0ZPUk1BVAorIyAgICBkZWZpbmUgSVRUX0ZPUk1BVAorIyAgZW5kaWYgLyogSVRUX0ZPUk1BVCAqLworIyAgaWZuZGVmIElUVF9OT19QQVJBTVMKKyMgICAgZGVmaW5lIElUVF9OT19QQVJBTVMKKyMgIGVuZGlmIC8qIElUVF9OT19QQVJBTVMgKi8KKyNlbmRpZiAvKiBJVFRfRk9STUFUX0RFRklORUQgKi8KKworLyoKKyAqIHBhcmFtZXRlcnMgZm9yIG1hY3JvIGV4cGVjdGVkOgorICogSVRUX1NUVUIoYXBpLCB0eXBlLCBmdW5jX25hbWUsIGFyZ3VtZW50cywgcGFyYW1zLCBmdW5jX25hbWVfaW5fZGxsLCBncm91cCwgcHJpbnRmX2ZtdCkKKyAqLworI2lmZGVmIF9fSVRUX0lOVEVSTkFMX0lOSVQKKworI2lmbmRlZiBfX0lUVF9JTlRFUk5BTF9CT0RZCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2RvbWFpbiosIGRvbWFpbl9jcmVhdGVBLCAoY29uc3QgY2hhciAgICAqbmFtZSksIChJVFRfRk9STUFUIG5hbWUpLCBkb21haW5fY3JlYXRlQSwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiXCIlc1wiIikKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfZG9tYWluKiwgZG9tYWluX2NyZWF0ZVcsIChjb25zdCB3Y2hhcl90ICpuYW1lKSwgKElUVF9GT1JNQVQgbmFtZSksIGRvbWFpbl9jcmVhdGVXLCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICJcIiVTXCIiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9kb21haW4qLCBkb21haW5fY3JlYXRlLCAgKGNvbnN0IGNoYXIgICAgKm5hbWUpLCAoSVRUX0ZPUk1BVCBuYW1lKSwgZG9tYWluX2NyZWF0ZSwgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIlwiJXNcIiIpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfc3RyaW5nX2hhbmRsZSosIHN0cmluZ19oYW5kbGVfY3JlYXRlQSwgKGNvbnN0IGNoYXIgICAgKm5hbWUpLCAoSVRUX0ZPUk1BVCBuYW1lKSwgc3RyaW5nX2hhbmRsZV9jcmVhdGVBLCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICJcIiVzXCIiKQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9zdHJpbmdfaGFuZGxlKiwgc3RyaW5nX2hhbmRsZV9jcmVhdGVXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSksIChJVFRfRk9STUFUIG5hbWUpLCBzdHJpbmdfaGFuZGxlX2NyZWF0ZVcsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIlwiJVNcIiIpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIF9faXR0X3N0cmluZ19oYW5kbGUqLCBzdHJpbmdfaGFuZGxlX2NyZWF0ZSwgIChjb25zdCBjaGFyICAgICpuYW1lKSwgKElUVF9GT1JNQVQgbmFtZSksIHN0cmluZ19oYW5kbGVfY3JlYXRlLCAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiXCIlc1wiIikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcGF1c2UsICAodm9pZCksIChJVFRfTk9fUEFSQU1TKSwgcGF1c2UsICBfX2l0dF9ncm91cF9jb250cm9sIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAibm8gYXJncyIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCByZXN1bWUsICh2b2lkKSwgKElUVF9OT19QQVJBTVMpLCByZXN1bWUsIF9faXR0X2dyb3VwX2NvbnRyb2wgfCBfX2l0dF9ncm91cF9sZWdhY3ksICJubyBhcmdzIikKKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGhyZWFkX3NldF9uYW1lQSwgKGNvbnN0IGNoYXIgICAgKm5hbWUpLCAoSVRUX0ZPUk1BVCBuYW1lKSwgdGhyZWFkX3NldF9uYW1lQSwgX19pdHRfZ3JvdXBfdGhyZWFkLCAiXCIlc1wiIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRocmVhZF9zZXRfbmFtZVcsIChjb25zdCB3Y2hhcl90ICpuYW1lKSwgKElUVF9GT1JNQVQgbmFtZSksIHRocmVhZF9zZXRfbmFtZVcsIF9faXR0X2dyb3VwX3RocmVhZCwgIlwiJVNcIiIpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0aHJlYWRfc2V0X25hbWUsICAoY29uc3QgY2hhciAgICAqbmFtZSksIChJVFRfRk9STUFUIG5hbWUpLCB0aHJlYWRfc2V0X25hbWUsICBfX2l0dF9ncm91cF90aHJlYWQsICJcIiVzXCIiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGhyZWFkX2lnbm9yZSwgKHZvaWQpLCAoSVRUX05PX1BBUkFNUyksIHRocmVhZF9pZ25vcmUsIF9faXR0X2dyb3VwX3RocmVhZCwgIm5vIGFyZ3MiKQorCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihMSUJJVFRBUEksIGludCwgIHRocl9uYW1lX3NldEEsIChjb25zdCBjaGFyICAgICpuYW1lLCBpbnQgbmFtZWxlbiksIChJVFRfRk9STUFUIG5hbWUsIG5hbWVsZW4pLCB0aHJfbmFtZV9zZXRBLCBfX2l0dF9ncm91cF90aHJlYWQgfCBfX2l0dF9ncm91cF9sZWdhY3ksICJcIiVzXCIsICVkIikKK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCAgdGhyX25hbWVfc2V0VywgKGNvbnN0IHdjaGFyX3QgKm5hbWUsIGludCBuYW1lbGVuKSwgKElUVF9GT1JNQVQgbmFtZSwgbmFtZWxlbiksIHRocl9uYW1lX3NldFcsIF9faXR0X2dyb3VwX3RocmVhZCB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIlwiJVNcIiwgJWQiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsICB0aHJfbmFtZV9zZXQsICAoY29uc3QgY2hhciAgICAqbmFtZSwgaW50IG5hbWVsZW4pLCAoSVRUX0ZPUk1BVCBuYW1lLCBuYW1lbGVuKSwgdGhyX25hbWVfc2V0LCAgX19pdHRfZ3JvdXBfdGhyZWFkIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiXCIlc1wiLCAlZCIpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQlYoTElCSVRUQVBJLCB2b2lkLCB0aHJfaWdub3JlLCAgICh2b2lkKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJVFRfTk9fUEFSQU1TKSwgICAgICAgICAgICB0aHJfaWdub3JlLCAgICBfX2l0dF9ncm91cF90aHJlYWQgfCBfX2l0dF9ncm91cF9sZWdhY3ksICJubyBhcmdzIikKKyNlbmRpZiAvKiBfX0lUVF9JTlRFUk5BTF9CT0RZICovCisKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGVuYWJsZV9hdHRhY2gsICh2b2lkKSwgKElUVF9OT19QQVJBTVMpLCBlbmFibGVfYXR0YWNoLCBfX2l0dF9ncm91cF9hbGwsICJubyBhcmdzIikKKworI2Vsc2UgIC8qIF9fSVRUX0lOVEVSTkFMX0lOSVQgKi8KKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19jcmVhdGVBLCAodm9pZCAqYWRkciwgY29uc3QgY2hhciAgICAqb2JqdHlwZSwgY29uc3QgY2hhciAgICAqb2JqbmFtZSwgaW50IGF0dHJpYnV0ZSksIChJVFRfRk9STUFUIGFkZHIsIG9ianR5cGUsIG9iam5hbWUsIGF0dHJpYnV0ZSksIHN5bmNfY3JlYXRlQSwgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jLCAiJXAsIFwiJXNcIiwgXCIlc1wiLCAleCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX2NyZWF0ZVcsICh2b2lkICphZGRyLCBjb25zdCB3Y2hhcl90ICpvYmp0eXBlLCBjb25zdCB3Y2hhcl90ICpvYmpuYW1lLCBpbnQgYXR0cmlidXRlKSwgKElUVF9GT1JNQVQgYWRkciwgb2JqdHlwZSwgb2JqbmFtZSwgYXR0cmlidXRlKSwgc3luY19jcmVhdGVXLCBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMsICIlcCwgXCIlU1wiLCBcIiVTXCIsICV4IikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfcmVuYW1lQSwgKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm5hbWUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBuYW1lKSwgc3luY19yZW5hbWVBLCBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMsICIlcCwgXCIlc1wiIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfcmVuYW1lVywgKHZvaWQgKmFkZHIsIGNvbnN0IHdjaGFyX3QgKm5hbWUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBuYW1lKSwgc3luY19yZW5hbWVXLCBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMsICIlcCwgXCIlU1wiIikKKyNlbHNlICAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfY3JlYXRlLCAgKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm9ianR5cGUsIGNvbnN0IGNoYXIgICAgKm9iam5hbWUsIGludCBhdHRyaWJ1dGUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBvYmp0eXBlLCBvYmpuYW1lLCBhdHRyaWJ1dGUpLCBzeW5jX2NyZWF0ZSwgIF9faXR0X2dyb3VwX3N5bmMgfCBfX2l0dF9ncm91cF9mc3luYywgIiVwLCBcIiVzXCIsIFwiJXNcIiwgJXgiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19yZW5hbWUsICAodm9pZCAqYWRkciwgY29uc3QgY2hhciAgICAqbmFtZSksIChJVFRfRk9STUFUIGFkZHIsIG5hbWUpLCBzeW5jX3JlbmFtZSwgIF9faXR0X2dyb3VwX3N5bmMgfCBfX2l0dF9ncm91cF9mc3luYywgIiVwLCBcIiVzXCIiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19kZXN0cm95LCAgICAodm9pZCAqYWRkciksIChJVFRfRk9STUFUIGFkZHIpLCBzeW5jX2Rlc3Ryb3ksICAgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jLCAiJXAiKQorCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX3ByZXBhcmUsICAgICh2b2lkKiBhZGRyKSwgKElUVF9GT1JNQVQgYWRkciksIHN5bmNfcHJlcGFyZSwgICBfX2l0dF9ncm91cF9zeW5jLCAgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfY2FuY2VsLCAgICAgKHZvaWQgKmFkZHIpLCAoSVRUX0ZPUk1BVCBhZGRyKSwgc3luY19jYW5jZWwsICAgIF9faXR0X2dyb3VwX3N5bmMsICAiJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19hY3F1aXJlZCwgICAodm9pZCAqYWRkciksIChJVFRfRk9STUFUIGFkZHIpLCBzeW5jX2FjcXVpcmVkLCAgX19pdHRfZ3JvdXBfc3luYywgICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX3JlbGVhc2luZywgICh2b2lkKiBhZGRyKSwgKElUVF9GT1JNQVQgYWRkciksIHN5bmNfcmVsZWFzaW5nLCBfX2l0dF9ncm91cF9zeW5jLCAgIiVwIikKKworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3VwcHJlc3NfcHVzaCwgICAgICAgKHVuc2lnbmVkIGludCBtYXNrKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIG1hc2spLCBzdXBwcmVzc19wdXNoLCAgX19pdHRfZ3JvdXBfc3VwcHJlc3MsICAiJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3VwcHJlc3NfcG9wLCAgICAgICAgKHZvaWQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJVFRfTk9fUEFSQU1TKSwgICBzdXBwcmVzc19wb3AsICAgX19pdHRfZ3JvdXBfc3VwcHJlc3MsICAibm8gYXJncyIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzdXBwcmVzc19tYXJrX3JhbmdlLCAoX19pdHRfc3VwcHJlc3NfbW9kZV90IG1vZGUsIHVuc2lnbmVkIGludCBtYXNrLCB2b2lkICogYWRkcmVzcywgc2l6ZV90IHNpemUpLChJVFRfRk9STUFUIG1vZGUsIG1hc2ssIGFkZHJlc3MsIHNpemUpLCBzdXBwcmVzc19tYXJrX3JhbmdlLCBfX2l0dF9ncm91cF9zdXBwcmVzcywgIiVkLCAlcCwgJXAsICVkIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN1cHByZXNzX2NsZWFyX3JhbmdlLChfX2l0dF9zdXBwcmVzc19tb2RlX3QgbW9kZSwgdW5zaWduZWQgaW50IG1hc2ssIHZvaWQgKiBhZGRyZXNzLCBzaXplX3Qgc2l6ZSksKElUVF9GT1JNQVQgbW9kZSwgbWFzaywgYWRkcmVzcywgc2l6ZSksIHN1cHByZXNzX2NsZWFyX3JhbmdlLF9faXR0X2dyb3VwX3N1cHByZXNzLCAiJWQsICVwLCAlcCwgJWQiKQorCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmc3luY19wcmVwYXJlLCAgICh2b2lkKiBhZGRyKSwgKElUVF9GT1JNQVQgYWRkciksIHN5bmNfcHJlcGFyZSwgICBfX2l0dF9ncm91cF9mc3luYywgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGZzeW5jX2NhbmNlbCwgICAgKHZvaWQgKmFkZHIpLCAoSVRUX0ZPUk1BVCBhZGRyKSwgc3luY19jYW5jZWwsICAgIF9faXR0X2dyb3VwX2ZzeW5jLCAiJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgZnN5bmNfYWNxdWlyZWQsICAodm9pZCAqYWRkciksIChJVFRfRk9STUFUIGFkZHIpLCBzeW5jX2FjcXVpcmVkLCAgX19pdHRfZ3JvdXBfZnN5bmMsICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmc3luY19yZWxlYXNpbmcsICh2b2lkKiBhZGRyKSwgKElUVF9GT1JNQVQgYWRkciksIHN5bmNfcmVsZWFzaW5nLCBfX2l0dF9ncm91cF9mc3luYywgIiVwIikKKworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfc2l0ZV9iZWdpbiwgICAgICAgICAgKF9faXR0X21vZGVsX3NpdGUgKnNpdGUsIF9faXR0X21vZGVsX3NpdGVfaW5zdGFuY2UgKmluc3RhbmNlLCBjb25zdCBjaGFyICpuYW1lKSwgKElUVF9GT1JNQVQgc2l0ZSwgaW5zdGFuY2UsIG5hbWUpLCBtb2RlbF9zaXRlX2JlZ2luLCBfX2l0dF9ncm91cF9tb2RlbCwgIiVwLCAlcCwgXCIlc1wiIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3NpdGVfZW5kLCAgICAgICAgICAgIChfX2l0dF9tb2RlbF9zaXRlICpzaXRlLCBfX2l0dF9tb2RlbF9zaXRlX2luc3RhbmNlICppbnN0YW5jZSksICAgICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIHNpdGUsIGluc3RhbmNlKSwgICAgICAgbW9kZWxfc2l0ZV9lbmQsICAgX19pdHRfZ3JvdXBfbW9kZWwsICIlcCwgJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfdGFza19iZWdpbiwgICAgICAgICAgKF9faXR0X21vZGVsX3Rhc2sgKnRhc2ssIF9faXR0X21vZGVsX3Rhc2tfaW5zdGFuY2UgKmluc3RhbmNlLCBjb25zdCBjaGFyICpuYW1lKSwgKElUVF9GT1JNQVQgdGFzaywgaW5zdGFuY2UsIG5hbWUpLCBtb2RlbF90YXNrX2JlZ2luLCBfX2l0dF9ncm91cF9tb2RlbCwgIiVwLCAlcCwgXCIlc1wiIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3Rhc2tfZW5kLCAgICAgICAgICAgIChfX2l0dF9tb2RlbF90YXNrICp0YXNrLCBfX2l0dF9tb2RlbF90YXNrX2luc3RhbmNlICppbnN0YW5jZSksICAgICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIHRhc2ssIGluc3RhbmNlKSwgICAgICAgbW9kZWxfdGFza19lbmQsICAgX19pdHRfZ3JvdXBfbW9kZWwsICIlcCwgJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfbG9ja19hY3F1aXJlLCAgICAgICAgKHZvaWQgKmxvY2spLCAoSVRUX0ZPUk1BVCBsb2NrKSwgbW9kZWxfbG9ja19hY3F1aXJlLCBfX2l0dF9ncm91cF9tb2RlbCwgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2xvY2tfcmVsZWFzZSwgICAgICAgICh2b2lkICpsb2NrKSwgKElUVF9GT1JNQVQgbG9jayksIG1vZGVsX2xvY2tfcmVsZWFzZSwgX19pdHRfZ3JvdXBfbW9kZWwsICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9yZWNvcmRfYWxsb2NhdGlvbiwgICAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBzaXplKSwgbW9kZWxfcmVjb3JkX2FsbG9jYXRpb24sICAgX19pdHRfZ3JvdXBfbW9kZWwsICIlcCwgJWQiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfcmVjb3JkX2RlYWxsb2NhdGlvbiwgKHZvaWQgKmFkZHIpLCAgICAgICAgICAgICAgKElUVF9GT1JNQVQgYWRkciksICAgICAgIG1vZGVsX3JlY29yZF9kZWFsbG9jYXRpb24sIF9faXR0X2dyb3VwX21vZGVsLCAiJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfaW5kdWN0aW9uX3VzZXMsICAgICAgKHZvaWQqIGFkZHIsIHNpemVfdCBzaXplKSwgKElUVF9GT1JNQVQgYWRkciwgc2l6ZSksIG1vZGVsX2luZHVjdGlvbl91c2VzLCAgICAgIF9faXR0X2dyb3VwX21vZGVsLCAiJXAsICVkIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3JlZHVjdGlvbl91c2VzLCAgICAgICh2b2lkKiBhZGRyLCBzaXplX3Qgc2l6ZSksIChJVFRfRk9STUFUIGFkZHIsIHNpemUpLCBtb2RlbF9yZWR1Y3Rpb25fdXNlcywgICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIiVwLCAlZCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9vYnNlcnZlX3VzZXMsICAgICAgICAodm9pZCogYWRkciwgc2l6ZV90IHNpemUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBzaXplKSwgbW9kZWxfb2JzZXJ2ZV91c2VzLCAgICAgICAgX19pdHRfZ3JvdXBfbW9kZWwsICIlcCwgJWQiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfY2xlYXJfdXNlcywgICAgICAgICAgKHZvaWQqIGFkZHIpLCAgICAgICAgICAgICAgKElUVF9GT1JNQVQgYWRkciksICAgICAgIG1vZGVsX2NsZWFyX3VzZXMsICAgICAgICAgIF9faXR0X2dyb3VwX21vZGVsLCAiJXAiKQorCisjaWZuZGVmIF9fSVRUX0lOVEVSTkFMX0JPRFkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3NpdGVfYmVnaW5XLCAgICAgICAgIChjb25zdCB3Y2hhcl90ICpuYW1lKSwgKElUVF9GT1JNQVQgbmFtZSksIG1vZGVsX3NpdGVfYmVnaW5XLCBfX2l0dF9ncm91cF9tb2RlbCwgIlwiJXNcIiIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF90YXNrX2JlZ2luVywgICAgICAgICAoY29uc3Qgd2NoYXJfdCAqbmFtZSksIChJVFRfRk9STUFUIG5hbWUpLCBtb2RlbF90YXNrX2JlZ2luVywgX19pdHRfZ3JvdXBfbW9kZWwsICJcIiVzXCIiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfaXRlcmF0aW9uX3Rhc2tXLCAgICAgKGNvbnN0IHdjaGFyX3QgKm5hbWUpLCAgICAgKElUVF9GT1JNQVQgbmFtZSksICAgICAgIG1vZGVsX2l0ZXJhdGlvbl90YXNrVywgICAgIF9faXR0X2dyb3VwX21vZGVsLCAiXCIlc1wiIikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3NpdGVfYmVnaW5BLCAgICAgICAgIChjb25zdCBjaGFyICpuYW1lKSwgICAgICAgIChJVFRfRk9STUFUIG5hbWUpLCAgICAgICBtb2RlbF9zaXRlX2JlZ2luQSwgICAgICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIlwiJXNcIiIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9zaXRlX2JlZ2luQUwsICAgICAgICAoY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IGxlbiksIChJVFRfRk9STUFUIG5hbWUsIGxlbiksIG1vZGVsX3NpdGVfYmVnaW5BTCwgX19pdHRfZ3JvdXBfbW9kZWwsICJcIiVzXCIsICVkIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3Rhc2tfYmVnaW5BLCAgICAgICAgIChjb25zdCBjaGFyICpuYW1lKSwgICAgICAgIChJVFRfRk9STUFUIG5hbWUpLCAgICAgICBtb2RlbF90YXNrX2JlZ2luQSwgICAgICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIlwiJXNcIiIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF90YXNrX2JlZ2luQUwsICAgICAgICAoY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IGxlbiksIChJVFRfRk9STUFUIG5hbWUsIGxlbiksIG1vZGVsX3Rhc2tfYmVnaW5BTCwgX19pdHRfZ3JvdXBfbW9kZWwsICJcIiVzXCIsICVkIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2l0ZXJhdGlvbl90YXNrQSwgICAgIChjb25zdCBjaGFyICpuYW1lKSwgICAgICAgIChJVFRfRk9STUFUIG5hbWUpLCAgICAgICBtb2RlbF9pdGVyYXRpb25fdGFza0EsICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIlwiJXNcIiIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9pdGVyYXRpb25fdGFza0FMLCAgICAoY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IGxlbiksIChJVFRfRk9STUFUIG5hbWUsIGxlbiksIG1vZGVsX2l0ZXJhdGlvbl90YXNrQUwsIF9faXR0X2dyb3VwX21vZGVsLCAiXCIlc1wiLCAlZCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9zaXRlX2VuZF8yLCAgICAgICAgICAodm9pZCksICAgICAgICAgICAgICAgICAgICAoSVRUX05PX1BBUkFNUyksICAgICAgICAgbW9kZWxfc2l0ZV9lbmRfMiwgICAgICAgICAgX19pdHRfZ3JvdXBfbW9kZWwsICJubyBhcmdzIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3Rhc2tfZW5kXzIsICAgICAgICAgICh2b2lkKSwgICAgICAgICAgICAgICAgICAgIChJVFRfTk9fUEFSQU1TKSwgICAgICAgICBtb2RlbF90YXNrX2VuZF8yLCAgICAgICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIm5vIGFyZ3MiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfbG9ja19hY3F1aXJlXzIsICAgICAgKHZvaWQgKmxvY2spLCAgICAgICAgICAgICAgKElUVF9GT1JNQVQgbG9jayksICAgICAgIG1vZGVsX2xvY2tfYWNxdWlyZV8yLCAgICAgIF9faXR0X2dyb3VwX21vZGVsLCAiJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfbG9ja19yZWxlYXNlXzIsICAgICAgKHZvaWQgKmxvY2spLCAgICAgICAgICAgICAgKElUVF9GT1JNQVQgbG9jayksICAgICAgIG1vZGVsX2xvY2tfcmVsZWFzZV8yLCAgICAgIF9faXR0X2dyb3VwX21vZGVsLCAiJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfYWdncmVnYXRlX3Rhc2ssICAgICAgKHNpemVfdCBjb3VudCksICAgICAgICAgICAgKElUVF9GT1JNQVQgY291bnQpLCAgICAgIG1vZGVsX2FnZ3JlZ2F0ZV90YXNrLCAgICAgIF9faXR0X2dyb3VwX21vZGVsLCAiJWQiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfZGlzYWJsZV9wdXNoLCAgICAgICAgKF9faXR0X21vZGVsX2Rpc2FibGUgeCksICAgKElUVF9GT1JNQVQgeCksICAgICAgICAgIG1vZGVsX2Rpc2FibGVfcHVzaCwgICAgICAgIF9faXR0X2dyb3VwX21vZGVsLCAiJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfZGlzYWJsZV9wb3AsICAgICAgICAgKHZvaWQpLCAgICAgICAgICAgICAgICAgICAgKElUVF9OT19QQVJBTVMpLCAgICAgICAgIG1vZGVsX2Rpc2FibGVfcG9wLCAgICAgICAgIF9faXR0X2dyb3VwX21vZGVsLCAibm8gYXJncyIpCisjZW5kaWYgLyogX19JVFRfSU5URVJOQUxfQk9EWSAqLworCisjaWZuZGVmIF9fSVRUX0lOVEVSTkFMX0JPRFkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfaGVhcF9mdW5jdGlvbiwgaGVhcF9mdW5jdGlvbl9jcmVhdGVBLCAoY29uc3QgY2hhciAgICAqbmFtZSwgY29uc3QgY2hhciAgICAqZG9tYWluKSwgKElUVF9GT1JNQVQgbmFtZSwgZG9tYWluKSwgaGVhcF9mdW5jdGlvbl9jcmVhdGVBLCBfX2l0dF9ncm91cF9oZWFwLCAiXCIlc1wiLCBcIiVzXCIiKQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9oZWFwX2Z1bmN0aW9uLCBoZWFwX2Z1bmN0aW9uX2NyZWF0ZVcsIChjb25zdCB3Y2hhcl90ICpuYW1lLCBjb25zdCB3Y2hhcl90ICpkb21haW4pLCAoSVRUX0ZPUk1BVCBuYW1lLCBkb21haW4pLCBoZWFwX2Z1bmN0aW9uX2NyZWF0ZVcsIF9faXR0X2dyb3VwX2hlYXAsICJcIiVzXCIsIFwiJXNcIiIpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2hlYXBfZnVuY3Rpb24sIGhlYXBfZnVuY3Rpb25fY3JlYXRlLCAgKGNvbnN0IGNoYXIgICAgKm5hbWUsIGNvbnN0IGNoYXIgICAgKmRvbWFpbiksIChJVFRfRk9STUFUIG5hbWUsIGRvbWFpbiksIGhlYXBfZnVuY3Rpb25fY3JlYXRlLCAgX19pdHRfZ3JvdXBfaGVhcCwgIlwiJXNcIiwgXCIlc1wiIikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBfX0lUVF9JTlRFUk5BTF9CT0RZICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX2FsbG9jYXRlX2JlZ2luLCAgIChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHNpemVfdCBzaXplLCBpbnQgaW5pdGlhbGl6ZWQpLCAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBoLCBzaXplLCBpbml0aWFsaXplZCksICAgICAgIGhlYXBfYWxsb2NhdGVfYmVnaW4sIF9faXR0X2dyb3VwX2hlYXAsICIlcCwgJWx1LCAlZCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX2FsbG9jYXRlX2VuZCwgICAgIChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHZvaWQqKiBhZGRyLCBzaXplX3Qgc2l6ZSwgaW50IGluaXRpYWxpemVkKSwgKElUVF9GT1JNQVQgaCwgYWRkciwgc2l6ZSwgaW5pdGlhbGl6ZWQpLCBoZWFwX2FsbG9jYXRlX2VuZCwgICBfX2l0dF9ncm91cF9oZWFwLCAiJXAsICVwLCAlbHUsICVkIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfZnJlZV9iZWdpbiwgICAgICAgKF9faXR0X2hlYXBfZnVuY3Rpb24gaCwgdm9pZCogIGFkZHIpLCAoSVRUX0ZPUk1BVCBoLCBhZGRyKSwgaGVhcF9mcmVlX2JlZ2luLCBfX2l0dF9ncm91cF9oZWFwLCAiJXAsICVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfZnJlZV9lbmQsICAgICAgICAgKF9faXR0X2hlYXBfZnVuY3Rpb24gaCwgdm9pZCogIGFkZHIpLCAoSVRUX0ZPUk1BVCBoLCBhZGRyKSwgaGVhcF9mcmVlX2VuZCwgICBfX2l0dF9ncm91cF9oZWFwLCAiJXAsICVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfcmVhbGxvY2F0ZV9iZWdpbiwgKF9faXR0X2hlYXBfZnVuY3Rpb24gaCwgdm9pZCogIGFkZHIsIHNpemVfdCBuZXdfc2l6ZSwgaW50IGluaXRpYWxpemVkKSwgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBoLCBhZGRyLCBuZXdfc2l6ZSwgaW5pdGlhbGl6ZWQpLCAgICAgICAgICAgaGVhcF9yZWFsbG9jYXRlX2JlZ2luLCBfX2l0dF9ncm91cF9oZWFwLCAiJXAsICVwLCAlbHUsICVkIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfcmVhbGxvY2F0ZV9lbmQsICAgKF9faXR0X2hlYXBfZnVuY3Rpb24gaCwgdm9pZCogIGFkZHIsIHZvaWQqKiBuZXdfYWRkciwgc2l6ZV90IG5ld19zaXplLCBpbnQgaW5pdGlhbGl6ZWQpLCAoSVRUX0ZPUk1BVCBoLCBhZGRyLCBuZXdfYWRkciwgbmV3X3NpemUsIGluaXRpYWxpemVkKSwgaGVhcF9yZWFsbG9jYXRlX2VuZCwgICBfX2l0dF9ncm91cF9oZWFwLCAiJXAsICVwLCAlcCwgJWx1LCAlZCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX2ludGVybmFsX2FjY2Vzc19iZWdpbiwgKHZvaWQpLCAoSVRUX05PX1BBUkFNUyksIGhlYXBfaW50ZXJuYWxfYWNjZXNzX2JlZ2luLCBfX2l0dF9ncm91cF9oZWFwLCAibm8gYXJncyIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX2ludGVybmFsX2FjY2Vzc19lbmQsICAgKHZvaWQpLCAoSVRUX05PX1BBUkFNUyksIGhlYXBfaW50ZXJuYWxfYWNjZXNzX2VuZCwgICBfX2l0dF9ncm91cF9oZWFwLCAibm8gYXJncyIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2JlZ2luLCAodm9pZCksIChJVFRfTk9fUEFSQU1TKSwgaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9iZWdpbiwgX19pdHRfZ3JvdXBfaGVhcCwgIm5vIGFyZ3MiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9lbmQsICAgKHZvaWQpLCAoSVRUX05PX1BBUkFNUyksIGhlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfZW5kLCAgIF9faXR0X2dyb3VwX2hlYXAsICJubyBhcmdzIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfcmVzZXRfZGV0ZWN0aW9uLCAodW5zaWduZWQgaW50IHJlc2V0X21hc2spLCAgKElUVF9GT1JNQVQgcmVzZXRfbWFzayksIGhlYXBfcmVzZXRfZGV0ZWN0aW9uLCBfX2l0dF9ncm91cF9oZWFwLCAiJXUiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9yZWNvcmQsICAgICAgICAgICh1bnNpZ25lZCBpbnQgcmVjb3JkX21hc2spLCAoSVRUX0ZPUk1BVCByZWNvcmRfbWFzayksICBoZWFwX3JlY29yZCwgICAgICAgIF9faXR0X2dyb3VwX2hlYXAsICIldSIpCisKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGlkX2NyZWF0ZSwgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQpLCAoSVRUX0ZPUk1BVCBkb21haW4sIGlkKSwgaWRfY3JlYXRlLCAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVsdSIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBpZF9kZXN0cm95LCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkKSwgKElUVF9GT1JNQVQgZG9tYWluLCBpZCksIGlkX2Rlc3Ryb3ksIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlbHUiKQorCitJVFRfU1RVQihJVFRBUEksIF9faXR0X3RpbWVzdGFtcCwgZ2V0X3RpbWVzdGFtcCwgKHZvaWQpLCAoSVRUX05PX1BBUkFNUyksIGdldF90aW1lc3RhbXAsICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICJubyBhcmdzIikKKworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcmVnaW9uX2JlZ2luLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9pZCBwYXJlbnQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUpLCAoSVRUX0ZPUk1BVCBkb21haW4sIGlkLCBwYXJlbnQsIG5hbWUpLCByZWdpb25fYmVnaW4sIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlbHUsICVsdSwgJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcmVnaW9uX2VuZCwgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBkb21haW4sIGlkKSwgICAgICAgICAgICAgICByZWdpb25fZW5kLCAgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlbHUiKQorCisjaWZuZGVmIF9fSVRUX0lOVEVSTkFMX0JPRFkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGZyYW1lX2JlZ2luX3YzLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkICppZCksIChJVFRfRk9STUFUIGRvbWFpbiwgaWQpLCBmcmFtZV9iZWdpbl92MywgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGZyYW1lX2VuZF92MywgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkICppZCksIChJVFRfRk9STUFUIGRvbWFpbiwgaWQpLCBmcmFtZV9lbmRfdjMsICAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGZyYW1lX3N1Ym1pdF92MywgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCAqaWQsIF9faXR0X3RpbWVzdGFtcCBiZWdpbiwgX19pdHRfdGltZXN0YW1wIGVuZCksIChJVFRfRk9STUFUIGRvbWFpbiwgaWQsIGJlZ2luLCBlbmQpLCBmcmFtZV9zdWJtaXRfdjMsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCwgJWx1LCAlbHUiKQorI2VuZGlmIC8qIF9fSVRUX0lOVEVSTkFMX0JPRFkgKi8KKworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19ncm91cCwgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9pZCBwYXJlbnQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUpLCAoSVRUX0ZPUk1BVCBkb21haW4sIGlkLCBwYXJlbnQsIG5hbWUpLCB0YXNrX2dyb3VwLCAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVsdSwgJWx1LCAlcCIpCisKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfYmVnaW4sICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X2lkIHBhcmVudCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSksIChJVFRfRk9STUFUIGRvbWFpbiwgaWQsIHBhcmVudCwgbmFtZSksIHRhc2tfYmVnaW4sICAgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlbHUsICVsdSwgJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19iZWdpbl9mbiwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfaWQgcGFyZW50LCB2b2lkKiBmbiksICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgZG9tYWluLCBpZCwgcGFyZW50LCBmbiksICAgdGFza19iZWdpbl9mbiwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVsdSwgJWx1LCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2VuZCwgICAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBkb21haW4pLCAgICAgICAgICAgICAgICAgICB0YXNrX2VuZCwgICAgICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCIpCisKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGNvdW50ZXJfaW5jX3YzLCAgICAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIGRvbWFpbiwgbmFtZSksICAgICAgICBjb3VudGVyX2luY192MywgICAgICAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGNvdW50ZXJfaW5jX2RlbHRhX3YzLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUsIHVuc2lnbmVkIGxvbmcgbG9uZyB2YWx1ZSksIChJVFRfRk9STUFUIGRvbWFpbiwgbmFtZSwgdmFsdWUpLCBjb3VudGVyX2luY19kZWx0YV92MywgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwLCAlbHUiKQorCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtYXJrZXIsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUsIF9faXR0X3Njb3BlIHNjb3BlKSwgKElUVF9GT1JNQVQgZG9tYWluLCBpZCwgbmFtZSwgc2NvcGUpLCBtYXJrZXIsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlbHUsICVwLCAlZCIpCisKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1ldGFkYXRhX2FkZCwgICAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIF9faXR0X21ldGFkYXRhX3R5cGUgdHlwZSwgc2l6ZV90IGNvdW50LCB2b2lkICpkYXRhKSwgKElUVF9GT1JNQVQgZG9tYWluLCBpZCwga2V5LCB0eXBlLCBjb3VudCwgZGF0YSksIG1ldGFkYXRhX2FkZCwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVsdSwgJXAsICVkLCAlbHUsICVwIikKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1ldGFkYXRhX3N0cl9hZGRBLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBsZW5ndGgpLCAgICAoSVRUX0ZPUk1BVCBkb21haW4sIGlkLCBrZXksIGRhdGEsIGxlbmd0aCksIG1ldGFkYXRhX3N0cl9hZGRBLCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWx1LCAlcCwgJXAsICVsdSIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtZXRhZGF0YV9zdHJfYWRkVywgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBjb25zdCB3Y2hhcl90KiBkYXRhLCBzaXplX3QgbGVuZ3RoKSwgKElUVF9GT1JNQVQgZG9tYWluLCBpZCwga2V5LCBkYXRhLCBsZW5ndGgpLCBtZXRhZGF0YV9zdHJfYWRkVywgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVsdSwgJXAsICVwLCAlbHUiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWV0YWRhdGFfc3RyX2FkZCwgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IGxlbmd0aCksICAgIChJVFRfRk9STUFUIGRvbWFpbiwgaWQsIGtleSwgZGF0YSwgbGVuZ3RoKSwgbWV0YWRhdGFfc3RyX2FkZCwgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlbHUsICVwLCAlcCwgJWx1IikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcmVsYXRpb25fYWRkX3RvX2N1cnJlbnQsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfcmVsYXRpb24gcmVsYXRpb24sIF9faXR0X2lkIHRhaWwpLCAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBkb21haW4sIHJlbGF0aW9uLCB0YWlsKSwgICAgICAgcmVsYXRpb25fYWRkX3RvX2N1cnJlbnQsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlbHUsICVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHJlbGF0aW9uX2FkZCwgICAgICAgICAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGhlYWQsIF9faXR0X3JlbGF0aW9uIHJlbGF0aW9uLCBfX2l0dF9pZCB0YWlsKSwgKElUVF9GT1JNQVQgZG9tYWluLCBoZWFkLCByZWxhdGlvbiwgdGFpbCksIHJlbGF0aW9uX2FkZCwgICAgICAgICAgICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJXAsICVsdSwgJXAiKQorCisjaWZuZGVmIF9fSVRUX0lOVEVSTkFMX0JPRFkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKExJQklUVEFQSSwgX19pdHRfZXZlbnQsIGV2ZW50X2NyZWF0ZUEsIChjb25zdCBjaGFyICAgICpuYW1lLCBpbnQgbmFtZWxlbiksIChJVFRfRk9STUFUIG5hbWUsIG5hbWVsZW4pLCBldmVudF9jcmVhdGVBLCBfX2l0dF9ncm91cF9tYXJrIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiXCIlc1wiLCAlZCIpCitJVFRfU1RVQihMSUJJVFRBUEksIF9faXR0X2V2ZW50LCBldmVudF9jcmVhdGVXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSwgaW50IG5hbWVsZW4pLCAoSVRUX0ZPUk1BVCBuYW1lLCBuYW1lbGVuKSwgZXZlbnRfY3JlYXRlVywgX19pdHRfZ3JvdXBfbWFyayB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIlwiJVNcIiwgJWQiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoTElCSVRUQVBJLCBfX2l0dF9ldmVudCwgZXZlbnRfY3JlYXRlLCAgKGNvbnN0IGNoYXIgICAgKm5hbWUsIGludCBuYW1lbGVuKSwgKElUVF9GT1JNQVQgbmFtZSwgbmFtZWxlbiksIGV2ZW50X2NyZWF0ZSwgIF9faXR0X2dyb3VwX21hcmsgfCBfX2l0dF9ncm91cF9sZWdhY3ksICJcIiVzXCIsICVkIikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCAgZXZlbnRfc3RhcnQsICAgICAgICAgIChfX2l0dF9ldmVudCBldmVudCksICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIGV2ZW50KSwgICAgICAgICBldmVudF9zdGFydCwgICBfX2l0dF9ncm91cF9tYXJrIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJWQiKQorSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsICBldmVudF9lbmQsICAgICAgICAgICAgKF9faXR0X2V2ZW50IGV2ZW50KSwgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgZXZlbnQpLCAgICAgICAgIGV2ZW50X2VuZCwgICAgIF9faXR0X2dyb3VwX21hcmsgfCBfX2l0dF9ncm91cF9sZWdhY3ksICIlZCIpCisjZW5kaWYgLyogX19JVFRfSU5URVJOQUxfQk9EWSAqLworCisjaWZuZGVmIF9fSVRUX0lOVEVSTkFMX0JPRFkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfc2V0X25hbWVBLCAodm9pZCAqYWRkciwgY29uc3QgY2hhciAgICAqb2JqdHlwZSwgY29uc3QgY2hhciAgICAqb2JqbmFtZSwgaW50IGF0dHJpYnV0ZSksIChJVFRfRk9STUFUIGFkZHIsIG9ianR5cGUsIG9iam5hbWUsIGF0dHJpYnV0ZSksIHN5bmNfc2V0X25hbWVBLCBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMgfCBfX2l0dF9ncm91cF9sZWdhY3ksICIlcCwgXCIlc1wiLCBcIiVzXCIsICV4IikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfc2V0X25hbWVXLCAodm9pZCAqYWRkciwgY29uc3Qgd2NoYXJfdCAqb2JqdHlwZSwgY29uc3Qgd2NoYXJfdCAqb2JqbmFtZSwgaW50IGF0dHJpYnV0ZSksIChJVFRfRk9STUFUIGFkZHIsIG9ianR5cGUsIG9iam5hbWUsIGF0dHJpYnV0ZSksIHN5bmNfc2V0X25hbWVXLCBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMgfCBfX2l0dF9ncm91cF9sZWdhY3ksICIlcCwgXCIlU1wiLCBcIiVTXCIsICV4IikKKyNlbHNlICAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfc2V0X25hbWUsICAodm9pZCAqYWRkciwgY29uc3QgY2hhciAgICAqb2JqdHlwZSwgY29uc3QgY2hhciAgICAqb2JqbmFtZSwgaW50IGF0dHJpYnV0ZSksIChJVFRfRk9STUFUIGFkZHIsIG9ianR5cGUsIG9iam5hbWUsIGF0dHJpYnV0ZSksIHN5bmNfc2V0X25hbWUsICBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMgfCBfX2l0dF9ncm91cF9sZWdhY3ksICJwLCBcIiVzXCIsIFwiJXNcIiwgJXgiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihMSUJJVFRBUEksIGludCwgbm90aWZ5X3N5bmNfbmFtZUEsICh2b2lkICpwLCBjb25zdCBjaGFyICAgICpvYmp0eXBlLCBpbnQgdHlwZWxlbiwgY29uc3QgY2hhciAgICAqb2JqbmFtZSwgaW50IG5hbWVsZW4sIGludCBhdHRyaWJ1dGUpLCAoSVRUX0ZPUk1BVCBwLCBvYmp0eXBlLCB0eXBlbGVuLCBvYmpuYW1lLCBuYW1lbGVuLCBhdHRyaWJ1dGUpLCBub3RpZnlfc3luY19uYW1lQSwgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJXAsIFwiJXNcIiwgJWQsIFwiJXNcIiwgJWQsICV4IikKK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCBub3RpZnlfc3luY19uYW1lVywgKHZvaWQgKnAsIGNvbnN0IHdjaGFyX3QgKm9ianR5cGUsIGludCB0eXBlbGVuLCBjb25zdCB3Y2hhcl90ICpvYmpuYW1lLCBpbnQgbmFtZWxlbiwgaW50IGF0dHJpYnV0ZSksIChJVFRfRk9STUFUIHAsIG9ianR5cGUsIHR5cGVsZW4sIG9iam5hbWUsIG5hbWVsZW4sIGF0dHJpYnV0ZSksIG5vdGlmeV9zeW5jX25hbWVXLCBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMgfCBfX2l0dF9ncm91cF9sZWdhY3ksICIlcCwgXCIlU1wiLCAlZCwgXCIlU1wiLCAlZCwgJXgiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsIG5vdGlmeV9zeW5jX25hbWUsICAodm9pZCAqcCwgY29uc3QgY2hhciAgICAqb2JqdHlwZSwgaW50IHR5cGVsZW4sIGNvbnN0IGNoYXIgICAgKm9iam5hbWUsIGludCBuYW1lbGVuLCBpbnQgYXR0cmlidXRlKSwgKElUVF9GT1JNQVQgcCwgb2JqdHlwZSwgdHlwZWxlbiwgb2JqbmFtZSwgbmFtZWxlbiwgYXR0cmlidXRlKSwgbm90aWZ5X3N5bmNfbmFtZSwgIF9faXR0X2dyb3VwX3N5bmMgfCBfX2l0dF9ncm91cF9mc3luYyB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIiVwLCBcIiVzXCIsICVkLCBcIiVzXCIsICVkLCAleCIpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKK0lUVF9TVFVCVihMSUJJVFRBUEksIHZvaWQsIG5vdGlmeV9zeW5jX3ByZXBhcmUsICAgKHZvaWQgKnApLCAoSVRUX0ZPUk1BVCBwKSwgbm90aWZ5X3N5bmNfcHJlcGFyZSwgICBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMgfCBfX2l0dF9ncm91cF9sZWdhY3ksICIlcCIpCitJVFRfU1RVQlYoTElCSVRUQVBJLCB2b2lkLCBub3RpZnlfc3luY19jYW5jZWwsICAgICh2b2lkICpwKSwgKElUVF9GT1JNQVQgcCksIG5vdGlmeV9zeW5jX2NhbmNlbCwgICAgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJXAiKQorSVRUX1NUVUJWKExJQklUVEFQSSwgdm9pZCwgbm90aWZ5X3N5bmNfYWNxdWlyZWQsICAodm9pZCAqcCksIChJVFRfRk9STUFUIHApLCBub3RpZnlfc3luY19hY3F1aXJlZCwgIF9faXR0X2dyb3VwX3N5bmMgfCBfX2l0dF9ncm91cF9mc3luYyB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIiVwIikKK0lUVF9TVFVCVihMSUJJVFRBUEksIHZvaWQsIG5vdGlmeV9zeW5jX3JlbGVhc2luZywgKHZvaWQgKnApLCAoSVRUX0ZPUk1BVCBwKSwgbm90aWZ5X3N5bmNfcmVsZWFzaW5nLCBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMgfCBfX2l0dF9ncm91cF9sZWdhY3ksICIlcCIpCisjZW5kaWYgLyogX19JVFRfSU5URVJOQUxfQk9EWSAqLworCitJVFRfU1RVQlYoTElCSVRUQVBJLCB2b2lkLCBtZW1vcnlfcmVhZCwgICAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBzaXplKSwgbWVtb3J5X3JlYWQsICAgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJXAsICVsdSIpCitJVFRfU1RVQlYoTElCSVRUQVBJLCB2b2lkLCBtZW1vcnlfd3JpdGUsICAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBzaXplKSwgbWVtb3J5X3dyaXRlLCAgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJXAsICVsdSIpCitJVFRfU1RVQlYoTElCSVRUQVBJLCB2b2lkLCBtZW1vcnlfdXBkYXRlLCAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBzaXplKSwgbWVtb3J5X3VwZGF0ZSwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJXAsICVsdSIpCisKK0lUVF9TVFVCKExJQklUVEFQSSwgX19pdHRfc3RhdGVfdCwgICAgIHN0YXRlX2dldCwgICAgKHZvaWQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJVFRfTk9fUEFSQU1TKSwgICBzdGF0ZV9nZXQsICAgIF9faXR0X2dyb3VwX2xlZ2FjeSwgIm5vIGFyZ3MiKQorSVRUX1NUVUIoTElCSVRUQVBJLCBfX2l0dF9zdGF0ZV90LCAgICAgc3RhdGVfc2V0LCAgICAoX19pdHRfc3RhdGVfdCBzKSwgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgcyksICAgIHN0YXRlX3NldCwgICAgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJWQiKQorSVRUX1NUVUIoTElCSVRUQVBJLCBfX2l0dF9vYmpfc3RhdGVfdCwgb2JqX21vZGVfc2V0LCAoX19pdHRfb2JqX3Byb3BfdCBwLCBfX2l0dF9vYmpfc3RhdGVfdCBzKSwgKElUVF9GT1JNQVQgcCwgcyksIG9ial9tb2RlX3NldCwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJWQsICVkIikKK0lUVF9TVFVCKExJQklUVEFQSSwgX19pdHRfdGhyX3N0YXRlX3QsIHRocl9tb2RlX3NldCwgKF9faXR0X3Rocl9wcm9wX3QgcCwgX19pdHRfdGhyX3N0YXRlX3QgcyksIChJVFRfRk9STUFUIHAsIHMpLCB0aHJfbW9kZV9zZXQsIF9faXR0X2dyb3VwX2xlZ2FjeSwgIiVkLCAlZCIpCisKKyNpZm5kZWYgX19JVFRfSU5URVJOQUxfQk9EWQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9mcmFtZSwgZnJhbWVfY3JlYXRlQSwgKGNvbnN0IGNoYXIgICAgKmRvbWFpbiksIChJVFRfRk9STUFUIGRvbWFpbiksIGZyYW1lX2NyZWF0ZUEsIF9faXR0X2dyb3VwX2ZyYW1lLCAiXCIlc1wiIikKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfZnJhbWUsIGZyYW1lX2NyZWF0ZVcsIChjb25zdCB3Y2hhcl90ICpkb21haW4pLCAoSVRUX0ZPUk1BVCBkb21haW4pLCBmcmFtZV9jcmVhdGVXLCBfX2l0dF9ncm91cF9mcmFtZSwgIlwiJXNcIiIpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2ZyYW1lLCBmcmFtZV9jcmVhdGUsICAoY29uc3QgY2hhciAgICAqZG9tYWluKSwgKElUVF9GT1JNQVQgZG9tYWluKSwgZnJhbWVfY3JlYXRlLCAgX19pdHRfZ3JvdXBfZnJhbWUsICJcIiVzXCIiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIF9fSVRUX0lOVEVSTkFMX0JPRFkgKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGZyYW1lX2JlZ2luLCAgICAgICAgIChfX2l0dF9mcmFtZSBmcmFtZSksICAgICAoSVRUX0ZPUk1BVCBmcmFtZSksICBmcmFtZV9iZWdpbiwgICBfX2l0dF9ncm91cF9mcmFtZSwgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGZyYW1lX2VuZCwgICAgICAgICAgIChfX2l0dF9mcmFtZSBmcmFtZSksICAgICAoSVRUX0ZPUk1BVCBmcmFtZSksICBmcmFtZV9lbmQsICAgICBfX2l0dF9ncm91cF9mcmFtZSwgIiVwIikKKworI2lmbmRlZiBfX0lUVF9JTlRFUk5BTF9CT0RZCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2NvdW50ZXIsIGNvdW50ZXJfY3JlYXRlQSwgKGNvbnN0IGNoYXIgICAgKm5hbWUsIGNvbnN0IGNoYXIgICAgKmRvbWFpbiksIChJVFRfRk9STUFUIG5hbWUsIGRvbWFpbiksIGNvdW50ZXJfY3JlYXRlQSwgX19pdHRfZ3JvdXBfY291bnRlciwgIlwiJXNcIiwgXCIlc1wiIikKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfY291bnRlciwgY291bnRlcl9jcmVhdGVXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSwgY29uc3Qgd2NoYXJfdCAqZG9tYWluKSwgKElUVF9GT1JNQVQgbmFtZSwgZG9tYWluKSwgY291bnRlcl9jcmVhdGVXLCBfX2l0dF9ncm91cF9jb3VudGVyLCAiXCIlc1wiLCBcIiVzXCIiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9jb3VudGVyLCBjb3VudGVyX2NyZWF0ZSwgIChjb25zdCBjaGFyICAgICpuYW1lLCBjb25zdCBjaGFyICAgICpkb21haW4pLCAoSVRUX0ZPUk1BVCBuYW1lLCBkb21haW4pLCBjb3VudGVyX2NyZWF0ZSwgIF9faXR0X2dyb3VwX2NvdW50ZXIsICJcIiVzXCIsIFwiJXNcIiIpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogX19JVFRfSU5URVJOQUxfQk9EWSAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgY291bnRlcl9kZXN0cm95LCAgIChfX2l0dF9jb3VudGVyIGlkKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBpZCksICAgICAgICBjb3VudGVyX2Rlc3Ryb3ksICAgX19pdHRfZ3JvdXBfY291bnRlciwgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGNvdW50ZXJfaW5jLCAgICAgICAoX19pdHRfY291bnRlciBpZCksICAgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgaWQpLCAgICAgICAgY291bnRlcl9pbmMsICAgICAgIF9faXR0X2dyb3VwX2NvdW50ZXIsICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBjb3VudGVyX2luY19kZWx0YSwgKF9faXR0X2NvdW50ZXIgaWQsIHVuc2lnbmVkIGxvbmcgbG9uZyB2YWx1ZSksIChJVFRfRk9STUFUIGlkLCB2YWx1ZSksIGNvdW50ZXJfaW5jX2RlbHRhLCBfX2l0dF9ncm91cF9jb3VudGVyLCAiJXAsICVsdSIpCisKKyNpZm5kZWYgX19JVFRfSU5URVJOQUxfQk9EWQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9tYXJrX3R5cGUsIG1hcmtfY3JlYXRlQSwgKGNvbnN0IGNoYXIgICAgKm5hbWUpLCAoSVRUX0ZPUk1BVCBuYW1lKSwgbWFya19jcmVhdGVBLCBfX2l0dF9ncm91cF9tYXJrLCAiXCIlc1wiIikKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfbWFya190eXBlLCBtYXJrX2NyZWF0ZVcsIChjb25zdCB3Y2hhcl90ICpuYW1lKSwgKElUVF9GT1JNQVQgbmFtZSksIG1hcmtfY3JlYXRlVywgX19pdHRfZ3JvdXBfbWFyaywgIlwiJVNcIiIpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIF9faXR0X21hcmtfdHlwZSwgbWFya19jcmVhdGUsICAoY29uc3QgY2hhciAgICAqbmFtZSksIChJVFRfRk9STUFUIG5hbWUpLCBtYXJrX2NyZWF0ZSwgIF9faXR0X2dyb3VwX21hcmssICJcIiVzXCIiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIF9fSVRUX0lOVEVSTkFMX0JPRFkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKElUVEFQSSwgaW50LCAgbWFya0EsICAgICAgICAoX19pdHRfbWFya190eXBlIG10LCBjb25zdCBjaGFyICAgICpwYXJhbWV0ZXIpLCAoSVRUX0ZPUk1BVCBtdCwgcGFyYW1ldGVyKSwgbWFya0EsIF9faXR0X2dyb3VwX21hcmssICIlZCwgXCIlc1wiIikKK0lUVF9TVFVCKElUVEFQSSwgaW50LCAgbWFya1csICAgICAgICAoX19pdHRfbWFya190eXBlIG10LCBjb25zdCB3Y2hhcl90ICpwYXJhbWV0ZXIpLCAoSVRUX0ZPUk1BVCBtdCwgcGFyYW1ldGVyKSwgbWFya1csIF9faXR0X2dyb3VwX21hcmssICIlZCwgXCIlU1wiIikKKyNlbHNlICAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgaW50LCAgbWFyaywgICAgICAgICAoX19pdHRfbWFya190eXBlIG10LCBjb25zdCBjaGFyICAgICpwYXJhbWV0ZXIpLCAoSVRUX0ZPUk1BVCBtdCwgcGFyYW1ldGVyKSwgbWFyaywgIF9faXR0X2dyb3VwX21hcmssICIlZCwgXCIlc1wiIikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgaW50LCAgbWFya19vZmYsIChfX2l0dF9tYXJrX3R5cGUgbXQpLCAoSVRUX0ZPUk1BVCBtdCksIG1hcmtfb2ZmLCBfX2l0dF9ncm91cF9tYXJrLCAiJWQiKQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBpbnQsICBtYXJrX2dsb2JhbEEsIChfX2l0dF9tYXJrX3R5cGUgbXQsIGNvbnN0IGNoYXIgICAgKnBhcmFtZXRlciksIChJVFRfRk9STUFUIG10LCBwYXJhbWV0ZXIpLCBtYXJrX2dsb2JhbEEsIF9faXR0X2dyb3VwX21hcmssICIlZCwgXCIlc1wiIikKK0lUVF9TVFVCKElUVEFQSSwgaW50LCAgbWFya19nbG9iYWxXLCAoX19pdHRfbWFya190eXBlIG10LCBjb25zdCB3Y2hhcl90ICpwYXJhbWV0ZXIpLCAoSVRUX0ZPUk1BVCBtdCwgcGFyYW1ldGVyKSwgbWFya19nbG9iYWxXLCBfX2l0dF9ncm91cF9tYXJrLCAiJWQsIFwiJVNcIiIpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIGludCwgIG1hcmtfZ2xvYmFsLCAgKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3QgY2hhciAgICAqcGFyYW1ldGVyKSwgKElUVF9GT1JNQVQgbXQsIHBhcmFtZXRlciksIG1hcmtfZ2xvYmFsLCAgX19pdHRfZ3JvdXBfbWFyaywgIiVkLCBcIiVTXCIiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBpbnQsICBtYXJrX2dsb2JhbF9vZmYsIChfX2l0dF9tYXJrX3R5cGUgbXQpLCAgICAgICAgICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIG10KSwgICAgICAgICAgICBtYXJrX2dsb2JhbF9vZmYsIF9faXR0X2dyb3VwX21hcmssICIlZCIpCisKKyNpZm5kZWYgX19JVFRfSU5URVJOQUxfQk9EWQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9jYWxsZXIsIHN0YWNrX2NhbGxlcl9jcmVhdGUsICh2b2lkKSwgKElUVF9OT19QQVJBTVMpLCBzdGFja19jYWxsZXJfY3JlYXRlLCAgX19pdHRfZ3JvdXBfc3RpdGNoLCAibm8gYXJncyIpCisjZW5kaWYgLyogX19JVFRfSU5URVJOQUxfQk9EWSAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3RhY2tfY2FsbGVyX2Rlc3Ryb3ksIChfX2l0dF9jYWxsZXIgaWQpLCAoSVRUX0ZPUk1BVCBpZCksIHN0YWNrX2NhbGxlcl9kZXN0cm95LCBfX2l0dF9ncm91cF9zdGl0Y2gsICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzdGFja19jYWxsZWVfZW50ZXIsICAgKF9faXR0X2NhbGxlciBpZCksIChJVFRfRk9STUFUIGlkKSwgc3RhY2tfY2FsbGVlX2VudGVyLCAgIF9faXR0X2dyb3VwX3N0aXRjaCwgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN0YWNrX2NhbGxlZV9sZWF2ZSwgICAoX19pdHRfY2FsbGVyIGlkKSwgKElUVF9GT1JNQVQgaWQpLCBzdGFja19jYWxsZWVfbGVhdmUsICAgX19pdHRfZ3JvdXBfc3RpdGNoLCAiJXAiKQorCitJVFRfU1RVQihJVFRBUEksICBfX2l0dF9jbG9ja19kb21haW4qLCBjbG9ja19kb21haW5fY3JlYXRlLCAoX19pdHRfZ2V0X2Nsb2NrX2luZm9fZm4gZm4sIHZvaWQqIGZuX2RhdGEpLCAoSVRUX0ZPUk1BVCBmbiwgZm5fZGF0YSksIGNsb2NrX2RvbWFpbl9jcmVhdGUsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCAgICAgICAgICAgICAgICBjbG9ja19kb21haW5fcmVzZXQsICAodm9pZCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX05PX1BBUkFNUyksICAgICAgICAgIGNsb2NrX2RvbWFpbl9yZXNldCwgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIm5vIGFyZ3MiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaWRfY3JlYXRlX2V4LCAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaWQpLCAoSVRUX0ZPUk1BVCBkb21haW4sIGNsb2NrX2RvbWFpbiwgdGltZXN0YW1wLCBpZCksIGlkX2NyZWF0ZV9leCwgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCwgJWx1LCAlbHUiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaWRfZGVzdHJveV9leCwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaWQpLCAoSVRUX0ZPUk1BVCBkb21haW4sIGNsb2NrX2RvbWFpbiwgdGltZXN0YW1wLCBpZCksIGlkX2Rlc3Ryb3lfZXgsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCwgJWx1LCAlbHUiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19iZWdpbl9leCwgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaWQsIF9faXR0X2lkIHBhcmVudGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lKSwgKElUVF9GT1JNQVQgZG9tYWluLCBjbG9ja19kb21haW4sIHRpbWVzdGFtcCwgaWQsIHBhcmVudGlkLCBuYW1lKSwgdGFza19iZWdpbl9leCwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwLCAlbHUsICVsdSwgJWx1LCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2JlZ2luX2ZuX2V4LCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCBpZCwgX19pdHRfaWQgcGFyZW50aWQsIHZvaWQqIGZuKSwgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBkb21haW4sIGNsb2NrX2RvbWFpbiwgdGltZXN0YW1wLCBpZCwgcGFyZW50aWQsIGZuKSwgdGFza19iZWdpbl9mbl9leCwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwLCAlbHUsICVsdSwgJWx1LCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2VuZF9leCwgICAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBkb21haW4sIGNsb2NrX2RvbWFpbiwgdGltZXN0YW1wKSwgdGFza19lbmRfZXgsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCwgJWx1IikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfYmVnaW5fb3ZlcmxhcHBlZCwgICAgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfaWQgcGFyZW50LCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgZG9tYWluLCBpZCwgcGFyZW50LCBuYW1lKSwgdGFza19iZWdpbl9vdmVybGFwcGVkLCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWx1LCAlbHUsICVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfYmVnaW5fb3ZlcmxhcHBlZF9leCwgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaWQsIF9faXR0X2lkIHBhcmVudGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lKSwgKElUVF9GT1JNQVQgZG9tYWluLCBjbG9ja19kb21haW4sIHRpbWVzdGFtcCwgaWQsIHBhcmVudGlkLCBuYW1lKSwgdGFza19iZWdpbl9vdmVybGFwcGVkX2V4LCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJXAsICVsdSwgJWx1LCAlbHUsICVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfZW5kX292ZXJsYXBwZWQsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgZG9tYWluLCBpZCksIHRhc2tfZW5kX292ZXJsYXBwZWQsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlbHUiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19lbmRfb3ZlcmxhcHBlZF9leCwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaWQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBkb21haW4sIGNsb2NrX2RvbWFpbiwgdGltZXN0YW1wLCBpZCksIHRhc2tfZW5kX292ZXJsYXBwZWRfZXgsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCwgJWx1LCAlbHUiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWFya2VyX2V4LCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCBpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSwgX19pdHRfc2NvcGUgc2NvcGUpLCAoSVRUX0ZPUk1BVCBkb21haW4sIGNsb2NrX2RvbWFpbiwgdGltZXN0YW1wLCBpZCwgbmFtZSwgc2NvcGUpLCBtYXJrZXJfZXgsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCwgJWx1LCAlbHUsICVwLCAlZCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtZXRhZGF0YV9hZGRfd2l0aF9zY29wZSwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9zY29wZSBzY29wZSwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBfX2l0dF9tZXRhZGF0YV90eXBlIHR5cGUsIHNpemVfdCBjb3VudCwgdm9pZCAqZGF0YSksIChJVFRfRk9STUFUIGRvbWFpbiwgc2NvcGUsIGtleSwgdHlwZSwgY291bnQsIGRhdGEpLCBtZXRhZGF0YV9hZGRfd2l0aF9zY29wZSwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVkLCAlcCwgJWQsICVsdSwgJXAiKQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlQSwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9zY29wZSBzY29wZSwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgbGVuZ3RoKSwgICAgKElUVF9GT1JNQVQgZG9tYWluLCBzY29wZSwga2V5LCBkYXRhLCBsZW5ndGgpLCBtZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVBLCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWQsICVwLCAlcCwgJWx1IikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZVcsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfc2NvcGUgc2NvcGUsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgY29uc3Qgd2NoYXJfdCAqZGF0YSwgc2l6ZV90IGxlbmd0aCksIChJVFRfRk9STUFUIGRvbWFpbiwgc2NvcGUsIGtleSwgZGF0YSwgbGVuZ3RoKSwgbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlVywgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVkLCAlcCwgJXAsICVsdSIpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGUsICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3Njb3BlIHNjb3BlLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBsZW5ndGgpLCAgICAoSVRUX0ZPUk1BVCBkb21haW4sIHNjb3BlLCBrZXksIGRhdGEsIGxlbmd0aCksIG1ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZSwgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlZCwgJXAsICVwLCAlbHUiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcmVsYXRpb25fYWRkX3RvX2N1cnJlbnRfZXgsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X3JlbGF0aW9uIHJlbGF0aW9uLCBfX2l0dF9pZCB0YWlsKSwgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgZG9tYWluLCBjbG9ja19kb21haW4sIHRpbWVzdGFtcCwgcmVsYXRpb24sIHRhaWwpLCAgICAgICByZWxhdGlvbl9hZGRfdG9fY3VycmVudF9leCwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwLCAlbHUsICVkLCAlbHUiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcmVsYXRpb25fYWRkX2V4LCAgICAgICAgICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIGhlYWQsIF9faXR0X3JlbGF0aW9uIHJlbGF0aW9uLCBfX2l0dF9pZCB0YWlsKSwgKElUVF9GT1JNQVQgZG9tYWluLCBjbG9ja19kb21haW4sIHRpbWVzdGFtcCwgaGVhZCwgcmVsYXRpb24sIHRhaWwpLCByZWxhdGlvbl9hZGRfZXgsICAgICAgICAgICAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwLCAlbHUsICVsdSwgJWQsICVsdSIpCitJVFRfU1RVQihJVFRBUEksICBfX2l0dF90cmFja19ncm91cCosIHRyYWNrX2dyb3VwX2NyZWF0ZSwgKF9faXR0X3N0cmluZ19oYW5kbGUqIG5hbWUsIF9faXR0X3RyYWNrX2dyb3VwX3R5cGUgdHJhY2tfZ3JvdXBfdHlwZSksICAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBuYW1lLCB0cmFja19ncm91cF90eXBlKSwgICAgICAgIHRyYWNrX2dyb3VwX2NyZWF0ZSwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVkIikKK0lUVF9TVFVCKElUVEFQSSwgIF9faXR0X3RyYWNrKiwgICAgICAgdHJhY2tfY3JlYXRlLCAgICAgICAoX19pdHRfdHJhY2tfZ3JvdXAqIHRyYWNrX2dyb3VwLF9faXR0X3N0cmluZ19oYW5kbGUqIG5hbWUsIF9faXR0X3RyYWNrX3R5cGUgdHJhY2tfdHlwZSksIChJVFRfRk9STUFUIHRyYWNrX2dyb3VwLCBuYW1lLCB0cmFja190eXBlKSwgdHJhY2tfY3JlYXRlLCAgICAgICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJXAsICVkIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsICAgICAgICAgICAgICAgc2V0X3RyYWNrLCAgICAgICAgICAoX19pdHRfdHJhY2sgKnRyYWNrKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIHRyYWNrKSwgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3RyYWNrLCAgICAgICAgICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCIpCisKKyNpZm5kZWYgX19JVFRfSU5URVJOQUxfQk9EWQorSVRUX1NUVUIoSVRUQVBJLCBjb25zdCBjaGFyKiwgYXBpX3ZlcnNpb24sICh2b2lkKSwgKElUVF9OT19QQVJBTVMpLCBhcGlfdmVyc2lvbiwgX19pdHRfZ3JvdXBfYWxsICYgfl9faXR0X2dyb3VwX2xlZ2FjeSwgIm5vIGFyZ3MiKQorI2VuZGlmIC8qIF9fSVRUX0lOVEVSTkFMX0JPRFkgKi8KKworI2lmbmRlZiBfX0lUVF9JTlRFUk5BTF9CT0RZCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihJVFRBUEksIGludCwgYXZfc2F2ZUEsICh2b2lkICpkYXRhLCBpbnQgcmFuaywgY29uc3QgaW50ICpkaW1lbnNpb25zLCBpbnQgdHlwZSwgY29uc3QgY2hhciAqZmlsZVBhdGgsIGludCBjb2x1bW5PcmRlciksIChJVFRfRk9STUFUIGRhdGEsIHJhbmssIGRpbWVuc2lvbnMsIHR5cGUsIGZpbGVQYXRoLCBjb2x1bW5PcmRlciksIGF2X3NhdmVBLCBfX2l0dF9ncm91cF9hcnJheXMsICIlcCwgJWQsICVwLCAlZCwgXCIlc1wiLCAlZCIpCitJVFRfU1RVQihJVFRBUEksIGludCwgYXZfc2F2ZVcsICh2b2lkICpkYXRhLCBpbnQgcmFuaywgY29uc3QgaW50ICpkaW1lbnNpb25zLCBpbnQgdHlwZSwgY29uc3Qgd2NoYXJfdCAqZmlsZVBhdGgsIGludCBjb2x1bW5PcmRlciksIChJVFRfRk9STUFUIGRhdGEsIHJhbmssIGRpbWVuc2lvbnMsIHR5cGUsIGZpbGVQYXRoLCBjb2x1bW5PcmRlciksIGF2X3NhdmVXLCBfX2l0dF9ncm91cF9hcnJheXMsICIlcCwgJWQsICVwLCAlZCwgXCIlU1wiLCAlZCIpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIGludCwgYXZfc2F2ZSwgICh2b2lkICpkYXRhLCBpbnQgcmFuaywgY29uc3QgaW50ICpkaW1lbnNpb25zLCBpbnQgdHlwZSwgY29uc3QgY2hhciAqZmlsZVBhdGgsIGludCBjb2x1bW5PcmRlciksIChJVFRfRk9STUFUIGRhdGEsIHJhbmssIGRpbWVuc2lvbnMsIHR5cGUsIGZpbGVQYXRoLCBjb2x1bW5PcmRlciksIGF2X3NhdmUsICBfX2l0dF9ncm91cF9hcnJheXMsICIlcCwgJWQsICVwLCAlZCwgXCIlc1wiLCAlZCIpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogX19JVFRfSU5URVJOQUxfQk9EWSAqLworCisjZW5kaWYgLyogX19JVFRfSU5URVJOQUxfSU5JVCAqLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvaXR0bm90aWZ5X3R5cGVzLmggYi9maW5hbC9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9pdHRub3RpZnlfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjk1YTY3Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvaXR0bm90aWZ5X3R5cGVzLmgKQEAgLTAsMCArMSw2NyBAQAorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9JVFROT1RJRllfVFlQRVNfSF8KKyNkZWZpbmUgX0lUVE5PVElGWV9UWVBFU19IXworCit0eXBlZGVmIGVudW0gX19faXR0X2dyb3VwX2lkCit7CisgICAgX19pdHRfZ3JvdXBfbm9uZSAgICAgID0gMCwKKyAgICBfX2l0dF9ncm91cF9sZWdhY3kgICAgPSAxPDwwLAorICAgIF9faXR0X2dyb3VwX2NvbnRyb2wgICA9IDE8PDEsCisgICAgX19pdHRfZ3JvdXBfdGhyZWFkICAgID0gMTw8MiwKKyAgICBfX2l0dF9ncm91cF9tYXJrICAgICAgPSAxPDwzLAorICAgIF9faXR0X2dyb3VwX3N5bmMgICAgICA9IDE8PDQsCisgICAgX19pdHRfZ3JvdXBfZnN5bmMgICAgID0gMTw8NSwKKyAgICBfX2l0dF9ncm91cF9qaXQgICAgICAgPSAxPDw2LAorICAgIF9faXR0X2dyb3VwX21vZGVsICAgICA9IDE8PDcsCisgICAgX19pdHRfZ3JvdXBfc3BsaXR0ZXJfbWluID0gMTw8NywKKyAgICBfX2l0dF9ncm91cF9jb3VudGVyICAgPSAxPDw4LAorICAgIF9faXR0X2dyb3VwX2ZyYW1lICAgICA9IDE8PDksCisgICAgX19pdHRfZ3JvdXBfc3RpdGNoICAgID0gMTw8MTAsCisgICAgX19pdHRfZ3JvdXBfaGVhcCAgICAgID0gMTw8MTEsCisgICAgX19pdHRfZ3JvdXBfc3BsaXR0ZXJfbWF4ID0gMTw8MTIsCisgICAgX19pdHRfZ3JvdXBfc3RydWN0dXJlID0gMTw8MTIsCisgICAgX19pdHRfZ3JvdXBfc3VwcHJlc3MgPSAxPDwxMywKKyAgICBfX2l0dF9ncm91cF9hcnJheXMgICAgPSAxPDwxNCwKKyAgICBfX2l0dF9ncm91cF9hbGwgICAgICAgPSAtMQorfSBfX2l0dF9ncm91cF9pZDsKKworI3ByYWdtYSBwYWNrKHB1c2gsIDgpCisKK3R5cGVkZWYgc3RydWN0IF9fX2l0dF9ncm91cF9saXN0Cit7CisgICAgX19pdHRfZ3JvdXBfaWQgaWQ7CisgICAgY29uc3QgY2hhciogICAgbmFtZTsKK30gX19pdHRfZ3JvdXBfbGlzdDsKKworI3ByYWdtYSBwYWNrKHBvcCkKKworI2RlZmluZSBJVFRfR1JPVVBfTElTVCh2YXJuYW1lKSBcCisgICAgc3RhdGljIF9faXR0X2dyb3VwX2xpc3QgdmFybmFtZVtdID0geyAgICAgICBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfYWxsLCAgICAgICAiYWxsIiAgICAgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfY29udHJvbCwgICAiY29udHJvbCIgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfdGhyZWFkLCAgICAidGhyZWFkIiAgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfbWFyaywgICAgICAibWFyayIgICAgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfc3luYywgICAgICAic3luYyIgICAgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfZnN5bmMsICAgICAiZnN5bmMiICAgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfaml0LCAgICAgICAiaml0IiAgICAgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfbW9kZWwsICAgICAibW9kZWwiICAgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfY291bnRlciwgICAiY291bnRlciIgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfZnJhbWUsICAgICAiZnJhbWUiICAgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfc3RpdGNoLCAgICAic3RpdGNoIiAgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfaGVhcCwgICAgICAiaGVhcCIgICAgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAic3RydWN0dXJlIiB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfc3VwcHJlc3MsICAic3VwcHJlc3MiICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfYXJyYXlzLCAgICAiYXJyYXlzIiAgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfbm9uZSwgICAgICBOVUxMICAgICAgICB9ICBcCisgICAgfQorCisjZW5kaWYgLyogX0lUVE5PVElGWV9UWVBFU19IXyAqLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvbGVnYWN5L2l0dG5vdGlmeS5oIGIvZmluYWwvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvbGVnYWN5L2l0dG5vdGlmeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZTViYjkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9sZWdhY3kvaXR0bm90aWZ5LmgKQEAgLTAsMCArMSw5NzEgQEAKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfTEVHQUNZX0lUVE5PVElGWV9IXworI2RlZmluZSBfTEVHQUNZX0lUVE5PVElGWV9IXworCisvKioKKyAqIEBmaWxlCisgKiBAYnJpZWYgTGVnYWN5IFVzZXIgQVBJIGZ1bmN0aW9ucyBhbmQgdHlwZXMKKyAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSVRUX09TX1dJTgorIyAgZGVmaW5lIElUVF9PU19XSU4gICAxCisjZW5kaWYgLyogSVRUX09TX1dJTiAqLworCisjaWZuZGVmIElUVF9PU19MSU5VWAorIyAgZGVmaW5lIElUVF9PU19MSU5VWCAyCisjZW5kaWYgLyogSVRUX09TX0xJTlVYICovCisKKyNpZm5kZWYgSVRUX09TX01BQworIyAgZGVmaW5lIElUVF9PU19NQUMgICAzCisjZW5kaWYgLyogSVRUX09TX01BQyAqLworCisjaWZuZGVmIElUVF9PUworIyAgaWYgZGVmaW5lZCBXSU4zMiB8fCBkZWZpbmVkIF9XSU4zMgorIyAgICBkZWZpbmUgSVRUX09TIElUVF9PU19XSU4KKyMgIGVsaWYgZGVmaW5lZCggX19BUFBMRV9fICkgJiYgZGVmaW5lZCggX19NQUNIX18gKQorIyAgICBkZWZpbmUgSVRUX09TIElUVF9PU19NQUMKKyMgIGVsc2UKKyMgICAgZGVmaW5lIElUVF9PUyBJVFRfT1NfTElOVVgKKyMgIGVuZGlmCisjZW5kaWYgLyogSVRUX09TICovCisKKyNpZm5kZWYgSVRUX1BMQVRGT1JNX1dJTgorIyAgZGVmaW5lIElUVF9QTEFURk9STV9XSU4gMQorI2VuZGlmIC8qIElUVF9QTEFURk9STV9XSU4gKi8KKworI2lmbmRlZiBJVFRfUExBVEZPUk1fUE9TSVgKKyMgIGRlZmluZSBJVFRfUExBVEZPUk1fUE9TSVggMgorI2VuZGlmIC8qIElUVF9QTEFURk9STV9QT1NJWCAqLworCisjaWZuZGVmIElUVF9QTEFURk9STV9NQUMKKyMgIGRlZmluZSBJVFRfUExBVEZPUk1fTUFDIDMKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk1fTUFDICovCisKKyNpZm5kZWYgSVRUX1BMQVRGT1JNCisjICBpZiBJVFRfT1M9PUlUVF9PU19XSU4KKyMgICAgZGVmaW5lIElUVF9QTEFURk9STSBJVFRfUExBVEZPUk1fV0lOCisjICBlbGlmIElUVF9PUz09SVRUX09TX01BQworIyAgICBkZWZpbmUgSVRUX1BMQVRGT1JNIElUVF9QTEFURk9STV9NQUMKKyMgIGVsc2UKKyMgICAgZGVmaW5lIElUVF9QTEFURk9STSBJVFRfUExBVEZPUk1fUE9TSVgKKyMgIGVuZGlmCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNICovCisKKyNpZiBkZWZpbmVkKF9VTklDT0RFKSAmJiAhZGVmaW5lZChVTklDT0RFKQorI2RlZmluZSBVTklDT0RFCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2luY2x1ZGUgPHRjaGFyLmg+CisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorI2luY2x1ZGUgPHdjaGFyLmg+CisjZW5kaWYgLyogVU5JQ09ERSB8fCBfVU5JQ09ERSAqLworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisjaWZuZGVmIENERUNMCisjICBpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyMgICAgZGVmaW5lIENERUNMIF9fY2RlY2wKKyMgIGVsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjICAgIGlmIGRlZmluZWQgX01fSVg4NiB8fCBkZWZpbmVkIF9faTM4Nl9fCisjICAgICAgZGVmaW5lIENERUNMIF9fYXR0cmlidXRlX18gKChjZGVjbCkpCisjICAgIGVsc2UgIC8qIF9NX0lYODYgfHwgX19pMzg2X18gKi8KKyMgICAgICBkZWZpbmUgQ0RFQ0wgLyogYWN0dWFsIG9ubHkgb24geDg2IHBsYXRmb3JtICovCisjICAgIGVuZGlmIC8qIF9NX0lYODYgfHwgX19pMzg2X18gKi8KKyMgIGVuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIENERUNMICovCisKKyNpZm5kZWYgU1REQ0FMTAorIyAgaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjICAgIGRlZmluZSBTVERDQUxMIF9fc3RkY2FsbAorIyAgZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyMgICAgaWYgZGVmaW5lZCBfTV9JWDg2IHx8IGRlZmluZWQgX19pMzg2X18KKyMgICAgICBkZWZpbmUgU1REQ0FMTCBfX2F0dHJpYnV0ZV9fICgoc3RkY2FsbCkpCisjICAgIGVsc2UgIC8qIF9NX0lYODYgfHwgX19pMzg2X18gKi8KKyMgICAgICBkZWZpbmUgU1REQ0FMTCAvKiBzdXBwb3J0ZWQgb25seSBvbiB4ODYgcGxhdGZvcm0gKi8KKyMgICAgZW5kaWYgLyogX01fSVg4NiB8fCBfX2kzODZfXyAqLworIyAgZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogU1REQ0FMTCAqLworCisjZGVmaW5lIElUVEFQSSAgICBDREVDTAorI2RlZmluZSBMSUJJVFRBUEkgQ0RFQ0wKKworLyogVE9ETzogVGVtcG9yYXJ5IGZvciBjb21wYXRpYmlsaXR5ISAqLworI2RlZmluZSBJVFRBUElfQ0FMTCAgICBDREVDTAorI2RlZmluZSBMSUJJVFRBUElfQ0FMTCBDREVDTAorCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisvKiB1c2UgX19mb3JjZWlubGluZSAoVkMrKyBzcGVjaWZpYykgKi8KKyNkZWZpbmUgSVRUX0lOTElORSAgICAgICAgICAgX19mb3JjZWlubGluZQorI2RlZmluZSBJVFRfSU5MSU5FX0FUVFJJQlVURSAvKiBub3RoaW5nICovCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisvKgorICogR2VuZXJhbGx5LCBmdW5jdGlvbnMgYXJlIG5vdCBpbmxpbmVkIHVubGVzcyBvcHRpbWl6YXRpb24gaXMgc3BlY2lmaWVkLgorICogRm9yIGZ1bmN0aW9ucyBkZWNsYXJlZCBpbmxpbmUsIHRoaXMgYXR0cmlidXRlIGlubGluZXMgdGhlIGZ1bmN0aW9uIGV2ZW4KKyAqIGlmIG5vIG9wdGltaXphdGlvbiBsZXZlbCB3YXMgc3BlY2lmaWVkLgorICovCisjaWZkZWYgX19TVFJJQ1RfQU5TSV9fCisjZGVmaW5lIElUVF9JTkxJTkUgICAgICAgICAgIHN0YXRpYworI2Vsc2UgIC8qIF9fU1RSSUNUX0FOU0lfXyAqLworI2RlZmluZSBJVFRfSU5MSU5FICAgICAgICAgICBzdGF0aWMgaW5saW5lCisjZW5kaWYgLyogX19TVFJJQ1RfQU5TSV9fICovCisjZGVmaW5lIElUVF9JTkxJTkVfQVRUUklCVVRFIF9fYXR0cmlidXRlX18gKChhbHdheXNfaW5saW5lLCB1bnVzZWQpKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworLyoqIEBlbmRjb25kICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworLyogSGVscGVyIG1hY3JvIGZvciBqb2luaW5nIHRva2VucyAqLworI2RlZmluZSBJVFRfSk9JTl9BVVgocCxuKSBwIyNuCisjZGVmaW5lIElUVF9KT0lOKHAsbikgICAgIElUVF9KT0lOX0FVWChwLG4pCisKKyNpZmRlZiBJVFRfTUFKT1IKKyN1bmRlZiBJVFRfTUFKT1IKKyNlbmRpZgorI2lmZGVmIElUVF9NSU5PUgorI3VuZGVmIElUVF9NSU5PUgorI2VuZGlmCisjZGVmaW5lIElUVF9NQUpPUiAgICAgMworI2RlZmluZSBJVFRfTUlOT1IgICAgIDAKKworLyogU3RhbmRhcmQgdmVyc2lvbmluZyBvZiBhIHRva2VuIHdpdGggbWFqb3IgYW5kIG1pbm9yIHZlcnNpb24gbnVtYmVycyAqLworI2RlZmluZSBJVFRfVkVSU0lPTklaRSh4KSAgICBcCisgICAgSVRUX0pPSU4oeCwgICAgICAgICAgICAgIFwKKyAgICBJVFRfSk9JTihfLCAgICAgICAgICAgICAgXAorICAgIElUVF9KT0lOKElUVF9NQUpPUiwgICAgICBcCisgICAgSVRUX0pPSU4oXywgSVRUX01JTk9SKSkpKQorCisjaWZuZGVmIElOVEVMX0lUVE5PVElGWV9QUkVGSVgKKyMgIGRlZmluZSBJTlRFTF9JVFROT1RJRllfUFJFRklYIF9faXR0XworI2VuZGlmIC8qIElOVEVMX0lUVE5PVElGWV9QUkVGSVggKi8KKyNpZm5kZWYgSU5URUxfSVRUTk9USUZZX1BPU1RGSVgKKyMgIGRlZmluZSBJTlRFTF9JVFROT1RJRllfUE9TVEZJWCBfcHRyXworI2VuZGlmIC8qIElOVEVMX0lUVE5PVElGWV9QT1NURklYICovCisKKyNkZWZpbmUgSVRUTk9USUZZX05BTUVfQVVYKG4pIElUVF9KT0lOKElOVEVMX0lUVE5PVElGWV9QUkVGSVgsbikKKyNkZWZpbmUgSVRUTk9USUZZX05BTUUobikgICAgIElUVF9WRVJTSU9OSVpFKElUVE5PVElGWV9OQU1FX0FVWChJVFRfSk9JTihuLElOVEVMX0lUVE5PVElGWV9QT1NURklYKSkpCisKKyNkZWZpbmUgSVRUTk9USUZZX1ZPSUQobikgKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEEobikgKCFJVFROT1RJRllfTkFNRShuKSkgPyAgICAgICAwIDogSVRUTk9USUZZX05BTUUobikKKworI2RlZmluZSBJVFROT1RJRllfVk9JRF9EMChuLGQpICAgICAgICghKGQpLT5mbGFncykgPyAodm9pZCkwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikoZCkKKyNkZWZpbmUgSVRUTk9USUZZX1ZPSURfRDEobixkLHgpICAgICAoIShkKS0+ZmxhZ3MpID8gKHZvaWQpMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gKHZvaWQpMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCkKKyNkZWZpbmUgSVRUTk9USUZZX1ZPSURfRDIobixkLHgseSkgICAoIShkKS0+ZmxhZ3MpID8gKHZvaWQpMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gKHZvaWQpMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5KQorI2RlZmluZSBJVFROT1RJRllfVk9JRF9EMyhuLGQseCx5LHopICghKGQpLT5mbGFncykgPyAodm9pZCkwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkseikKKyNkZWZpbmUgSVRUTk9USUZZX1ZPSURfRDQobixkLHgseSx6LGEpICAgICAoIShkKS0+ZmxhZ3MpID8gKHZvaWQpMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gKHZvaWQpMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5LHosYSkKKyNkZWZpbmUgSVRUTk9USUZZX1ZPSURfRDUobixkLHgseSx6LGEsYikgICAoIShkKS0+ZmxhZ3MpID8gKHZvaWQpMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gKHZvaWQpMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5LHosYSxiKQorI2RlZmluZSBJVFROT1RJRllfVk9JRF9ENihuLGQseCx5LHosYSxiLGMpICghKGQpLT5mbGFncykgPyAodm9pZCkwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkseixhLGIsYykKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEFfRDAobixkKSAgICAgICAoIShkKS0+ZmxhZ3MpID8gICAgICAgMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pKGQpCisjZGVmaW5lIElUVE5PVElGWV9EQVRBX0QxKG4sZCx4KSAgICAgKCEoZCktPmZsYWdzKSA/ICAgICAgIDAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICAgICAgIDAgOiBJVFROT1RJRllfTkFNRShuKShkLHgpCisjZGVmaW5lIElUVE5PVElGWV9EQVRBX0QyKG4sZCx4LHkpICAgKCEoZCktPmZsYWdzKSA/ICAgICAgIDAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICAgICAgIDAgOiBJVFROT1RJRllfTkFNRShuKShkLHgseSkKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEFfRDMobixkLHgseSx6KSAoIShkKS0+ZmxhZ3MpID8gICAgICAgMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5LHopCisjZGVmaW5lIElUVE5PVElGWV9EQVRBX0Q0KG4sZCx4LHkseixhKSAgICAgKCEoZCktPmZsYWdzKSA/IDAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICAgICAgIDAgOiBJVFROT1RJRllfTkFNRShuKShkLHgseSx6LGEpCisjZGVmaW5lIElUVE5PVElGWV9EQVRBX0Q1KG4sZCx4LHkseixhLGIpICAgKCEoZCktPmZsYWdzKSA/IDAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICAgICAgIDAgOiBJVFROT1RJRllfTkFNRShuKShkLHgseSx6LGEsYikKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEFfRDYobixkLHgseSx6LGEsYixjKSAoIShkKS0+ZmxhZ3MpID8gMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5LHosYSxiLGMpCisKKyNpZmRlZiBJVFRfU1RVQgorI3VuZGVmIElUVF9TVFVCCisjZW5kaWYKKyNpZmRlZiBJVFRfU1RVQlYKKyN1bmRlZiBJVFRfU1RVQlYKKyNlbmRpZgorI2RlZmluZSBJVFRfU1RVQlYoYXBpLHR5cGUsbmFtZSxhcmdzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHR5cGVkZWYgdHlwZSAoYXBpKiBJVFRfSk9JTihJVFROT1RJRllfTkFNRShuYW1lKSxfdCkpIGFyZ3M7ICAgXAorICAgIGV4dGVybiBJVFRfSk9JTihJVFROT1RJRllfTkFNRShuYW1lKSxfdCkgSVRUTk9USUZZX05BTUUobmFtZSk7CisjZGVmaW5lIElUVF9TVFVCIElUVF9TVFVCVgorLyoqIEBlbmRjb25kICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgbGVnYWN5IExlZ2FjeSBBUEkKKyAqIEB7CisgKiBAfQorICovCisKKy8qKgorICogQGRlZmdyb3VwIGxlZ2FjeV9jb250cm9sIENvbGxlY3Rpb24gQ29udHJvbAorICogQGluZ3JvdXAgbGVnYWN5CisgKiBHZW5lcmFsIGJlaGF2aW9yOiBhcHBsaWNhdGlvbiBjb250aW51ZXMgdG8gcnVuLCBidXQgbm8gcHJvZmlsaW5nIGluZm9ybWF0aW9uIGlzIGJlaW5nIGNvbGxlY3RlZAorICoKKyAqIFBhdXNpbmcgb2NjdXJzIG5vdCBvbmx5IGZvciB0aGUgY3VycmVudCB0aHJlYWQgYnV0IGZvciBhbGwgcHJvY2VzcyBhcyB3ZWxsIGFzIHNwYXduZWQgcHJvY2Vzc2VzCisgKiAtIEludGVsKFIpIFBhcmFsbGVsIEluc3BlY3RvciBhbmQgSW50ZWwoUikgSW5zcGVjdG9yIFhFOgorICogICAtIERvZXMgbm90IGFuYWx5emUgb3IgcmVwb3J0IGVycm9ycyB0aGF0IGludm9sdmUgbWVtb3J5IGFjY2Vzcy4KKyAqICAgLSBPdGhlciBlcnJvcnMgYXJlIHJlcG9ydGVkIGFzIHVzdWFsLiBQYXVzaW5nIGRhdGEgY29sbGVjdGlvbiBpbgorICogICAgIEludGVsKFIpIFBhcmFsbGVsIEluc3BlY3RvciBhbmQgSW50ZWwoUikgSW5zcGVjdG9yIFhFCisgKiAgICAgb25seSBwYXVzZXMgdHJhY2luZyBhbmQgYW5hbHl6aW5nIG1lbW9yeSBhY2Nlc3MuCisgKiAgICAgSXQgZG9lcyBub3QgcGF1c2UgdHJhY2luZyBvciBhbmFseXppbmcgdGhyZWFkaW5nIEFQSXMuCisgKiAgIC4KKyAqIC0gSW50ZWwoUikgUGFyYWxsZWwgQW1wbGlmaWVyIGFuZCBJbnRlbChSKSBWVHVuZShUTSkgQW1wbGlmaWVyIFhFOgorICogICAtIERvZXMgY29udGludWUgdG8gcmVjb3JkIHdoZW4gbmV3IHRocmVhZHMgYXJlIHN0YXJ0ZWQuCisgKiAgIC4KKyAqIC0gT3RoZXIgZWZmZWN0czoKKyAqICAgLSBQb3NzaWJsZSByZWR1Y3Rpb24gb2YgcnVudGltZSBvdmVyaGVhZC4KKyAqICAgLgorICogQHsKKyAqLworI2lmbmRlZiBfSVRUTk9USUZZX0hfCisvKiogQGJyaWVmIFBhdXNlIGNvbGxlY3Rpb24gKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3BhdXNlKHZvaWQpOworLyoqIEBicmllZiBSZXN1bWUgY29sbGVjdGlvbiAqLwordm9pZCBJVFRBUEkgX19pdHRfcmVzdW1lKHZvaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBwYXVzZSwgICAodm9pZCkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCByZXN1bWUsICAodm9pZCkpCisjZGVmaW5lIF9faXR0X3BhdXNlICAgICAgSVRUTk9USUZZX1ZPSUQocGF1c2UpCisjZGVmaW5lIF9faXR0X3BhdXNlX3B0ciAgSVRUTk9USUZZX05BTUUocGF1c2UpCisjZGVmaW5lIF9faXR0X3Jlc3VtZSAgICAgSVRUTk9USUZZX1ZPSUQocmVzdW1lKQorI2RlZmluZSBfX2l0dF9yZXN1bWVfcHRyIElUVE5PVElGWV9OQU1FKHJlc3VtZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3BhdXNlKCkKKyNkZWZpbmUgX19pdHRfcGF1c2VfcHRyICAwCisjZGVmaW5lIF9faXR0X3Jlc3VtZSgpCisjZGVmaW5lIF9faXR0X3Jlc3VtZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3BhdXNlX3B0ciAgMAorI2RlZmluZSBfX2l0dF9yZXN1bWVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKyNlbmRpZiAvKiBfSVRUTk9USUZZX0hfICovCisvKiogQH0gbGVnYWN5X2NvbnRyb2wgZ3JvdXAgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgbGVnYWN5X3RocmVhZHMgVGhyZWFkcworICogQGluZ3JvdXAgbGVnYWN5CisgKiBUaHJlYWRzIGdyb3VwCisgKiBAd2FybmluZyBMZWdhY3kgQVBJCisgKiBAeworICovCisvKioKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBTZXQgbmFtZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhyZWFkIGluIGFuYWx5c2lzIEdVSS4KKyAqIEByZXR1cm4gX19pdHRfZXJyIHVwb24gZmFpbHVyZSAobmFtZSBvciBuYW1lbGVuIGJlaW5nIG51bGwsbmFtZSBhbmQgbmFtZWxlbiBtaXNtYXRjaGVkKQorICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitpbnQgTElCSVRUQVBJIF9faXR0X3Rocl9uYW1lX3NldEEoY29uc3QgY2hhciAgICAqbmFtZSwgaW50IG5hbWVsZW4pOworaW50IExJQklUVEFQSSBfX2l0dF90aHJfbmFtZV9zZXRXKGNvbnN0IHdjaGFyX3QgKm5hbWUsIGludCBuYW1lbGVuKTsKKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjICBkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0ICAgICBfX2l0dF90aHJfbmFtZV9zZXRXCisjICBkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0X3B0ciBfX2l0dF90aHJfbmFtZV9zZXRXX3B0cgorI2Vsc2UKKyMgIGRlZmluZSBfX2l0dF90aHJfbmFtZV9zZXQgICAgIF9faXR0X3Rocl9uYW1lX3NldEEKKyMgIGRlZmluZSBfX2l0dF90aHJfbmFtZV9zZXRfcHRyIF9faXR0X3Rocl9uYW1lX3NldEFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitpbnQgTElCSVRUQVBJIF9faXR0X3Rocl9uYW1lX3NldChjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbik7CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCB0aHJfbmFtZV9zZXRBLCAoY29uc3QgY2hhciAgICAqbmFtZSwgaW50IG5hbWVsZW4pKQorSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsIHRocl9uYW1lX3NldFcsIChjb25zdCB3Y2hhcl90ICpuYW1lLCBpbnQgbmFtZWxlbikpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihMSUJJVFRBUEksIGludCwgdGhyX25hbWVfc2V0LCAgKGNvbnN0IGNoYXIgICAgKm5hbWUsIGludCBuYW1lbGVuKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0QSAgICAgSVRUTk9USUZZX0RBVEEodGhyX25hbWVfc2V0QSkKKyNkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0QV9wdHIgSVRUTk9USUZZX05BTUUodGhyX25hbWVfc2V0QSkKKyNkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0VyAgICAgSVRUTk9USUZZX0RBVEEodGhyX25hbWVfc2V0VykKKyNkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0V19wdHIgSVRUTk9USUZZX05BTUUodGhyX25hbWVfc2V0VykKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF90aHJfbmFtZV9zZXQgICAgIElUVE5PVElGWV9EQVRBKHRocl9uYW1lX3NldCkKKyNkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0X3B0ciBJVFROT1RJRllfTkFNRSh0aHJfbmFtZV9zZXQpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF90aHJfbmFtZV9zZXRBKG5hbWUsIG5hbWVsZW4pCisjZGVmaW5lIF9faXR0X3Rocl9uYW1lX3NldEFfcHRyIDAKKyNkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0VyhuYW1lLCBuYW1lbGVuKQorI2RlZmluZSBfX2l0dF90aHJfbmFtZV9zZXRXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0KG5hbWUsIG5hbWVsZW4pCisjZGVmaW5lIF9faXR0X3Rocl9uYW1lX3NldF9wdHIgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X3Rocl9uYW1lX3NldEFfcHRyIDAKKyNkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0V19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X3Rocl9uYW1lX3NldF9wdHIgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBNYXJrIGN1cnJlbnQgdGhyZWFkIGFzIGlnbm9yZWQgZnJvbSB0aGlzIHBvaW50IG9uLCBmb3IgdGhlIGR1cmF0aW9uIG9mIGl0cyBleGlzdGVuY2UuCisgKi8KK3ZvaWQgTElCSVRUQVBJIF9faXR0X3Rocl9pZ25vcmUodm9pZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihMSUJJVFRBUEksIHZvaWQsIHRocl9pZ25vcmUsICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfdGhyX2lnbm9yZSAgICAgSVRUTk9USUZZX1ZPSUQodGhyX2lnbm9yZSkKKyNkZWZpbmUgX19pdHRfdGhyX2lnbm9yZV9wdHIgSVRUTk9USUZZX05BTUUodGhyX2lnbm9yZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3Rocl9pZ25vcmUoKQorI2RlZmluZSBfX2l0dF90aHJfaWdub3JlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfdGhyX2lnbm9yZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IGxlZ2FjeV90aHJlYWRzIGdyb3VwICovCisKKy8qKgorICogQGRlZmdyb3VwIGxlZ2FjeV9zeW5jIFN5bmNocm9uaXphdGlvbgorICogQGluZ3JvdXAgbGVnYWN5CisgKiBTeW5jaHJvbml6YXRpb24gZ3JvdXAKKyAqIEB3YXJuaW5nIExlZ2FjeSBBUEkKKyAqIEB7CisgKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogQGJyaWVmIHBvc3NpYmxlIHZhbHVlIG9mIGF0dHJpYnV0ZSBhcmd1bWVudCBmb3Igc3luYyBvYmplY3QgdHlwZQorICovCisjZGVmaW5lIF9faXR0X2F0dHJfYmFycmllciAxCisKKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogQGJyaWVmIHBvc3NpYmxlIHZhbHVlIG9mIGF0dHJpYnV0ZSBhcmd1bWVudCBmb3Igc3luYyBvYmplY3QgdHlwZQorICovCisjZGVmaW5lIF9faXR0X2F0dHJfbXV0ZXggICAyCisKKy8qKgorICogQGRlcHJlY2F0ZWQgTGVnYWN5IEFQSQorICogQGJyaWVmIEFzc2lnbiBhIG5hbWUgdG8gYSBzeW5jIG9iamVjdCB1c2luZyBjaGFyIG9yIFVuaWNvZGUgc3RyaW5nCisgKiBAcGFyYW1baW5dIGFkZHIgICAgLSBwb2ludGVyIHRvIHRoZSBzeW5jIG9iamVjdC4gWW91IHNob3VsZCB1c2UgYSByZWFsIHBvaW50ZXIgdG8geW91ciBvYmplY3QKKyAqICAgICAgICAgICAgICAgICAgICAgIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB2YWx1ZXMgZG9uJ3QgY2xhc2ggd2l0aCBvdGhlciBvYmplY3QgYWRkcmVzc2VzCisgKiBAcGFyYW1baW5dIG9ianR5cGUgLSBudWxsLXRlcm1pbmF0ZWQgb2JqZWN0IHR5cGUgc3RyaW5nLiBJZiBOVUxMIGlzIHBhc3NlZCwgdGhlIG9iamVjdCB3aWxsCisgKiAgICAgICAgICAgICAgICAgICAgICBiZSBhc3N1bWVkIHRvIGJlIG9mIGdlbmVyaWMgIlVzZXIgU3luY2hyb25pemF0aW9uIiB0eXBlCisgKiBAcGFyYW1baW5dIG9iam5hbWUgLSBudWxsLXRlcm1pbmF0ZWQgb2JqZWN0IG5hbWUgc3RyaW5nLiBJZiBOVUxMLCBubyBuYW1lIHdpbGwgYmUgYXNzaWduZWQKKyAqICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBvYmplY3QgLS0geW91IGNhbiB1c2UgdGhlIF9faXR0X3N5bmNfcmVuYW1lIGNhbGwgbGF0ZXIgdG8gYXNzaWduCisgKiAgICAgICAgICAgICAgICAgICAgICB0aGUgbmFtZQorICogQHBhcmFtW2luXSBhdHRyaWJ1dGUgLSBvbmUgb2YgWyNfX2l0dF9hdHRyX2JhcnJpZXIsICNfX2l0dF9hdHRyX211dGV4XSB2YWx1ZXMgd2hpY2ggZGVmaW5lcyB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgIGV4YWN0IHNlbWFudGljcyBvZiBob3cgcHJlcGFyZS9hY3F1aXJlZC9yZWxlYXNpbmcgY2FsbHMgd29yay4KKyAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgordm9pZCBJVFRBUEkgX19pdHRfc3luY19zZXRfbmFtZUEodm9pZCAqYWRkciwgY29uc3QgY2hhciAgICAqb2JqdHlwZSwgY29uc3QgY2hhciAgICAqb2JqbmFtZSwgaW50IGF0dHJpYnV0ZSk7Cit2b2lkIElUVEFQSSBfX2l0dF9zeW5jX3NldF9uYW1lVyh2b2lkICphZGRyLCBjb25zdCB3Y2hhcl90ICpvYmp0eXBlLCBjb25zdCB3Y2hhcl90ICpvYmpuYW1lLCBpbnQgYXR0cmlidXRlKTsKKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjICBkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZSAgICAgX19pdHRfc3luY19zZXRfbmFtZVcKKyMgIGRlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lX3B0ciBfX2l0dF9zeW5jX3NldF9uYW1lV19wdHIKKyNlbHNlIC8qIFVOSUNPREUgKi8KKyMgIGRlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lICAgICBfX2l0dF9zeW5jX3NldF9uYW1lQQorIyAgZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWVfcHRyIF9faXR0X3N5bmNfc2V0X25hbWVBX3B0cgorI2VuZGlmIC8qIFVOSUNPREUgKi8KKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLwordm9pZCBJVFRBUEkgX19pdHRfc3luY19zZXRfbmFtZSh2b2lkICphZGRyLCBjb25zdCBjaGFyKiBvYmp0eXBlLCBjb25zdCBjaGFyKiBvYmpuYW1lLCBpbnQgYXR0cmlidXRlKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19zZXRfbmFtZUEsICh2b2lkICphZGRyLCBjb25zdCBjaGFyICAgICpvYmp0eXBlLCBjb25zdCBjaGFyICAgICpvYmpuYW1lLCBpbnQgYXR0cmlidXRlKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfc2V0X25hbWVXLCAodm9pZCAqYWRkciwgY29uc3Qgd2NoYXJfdCAqb2JqdHlwZSwgY29uc3Qgd2NoYXJfdCAqb2JqbmFtZSwgaW50IGF0dHJpYnV0ZSkpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX3NldF9uYW1lLCAgKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm9ianR5cGUsIGNvbnN0IGNoYXIgICAgKm9iam5hbWUsIGludCBhdHRyaWJ1dGUpKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lQSAgICAgSVRUTk9USUZZX1ZPSUQoc3luY19zZXRfbmFtZUEpCisjZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWVBX3B0ciBJVFROT1RJRllfTkFNRShzeW5jX3NldF9uYW1lQSkKKyNkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZVcgICAgIElUVE5PVElGWV9WT0lEKHN5bmNfc2V0X25hbWVXKQorI2RlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lV19wdHIgSVRUTk9USUZZX05BTUUoc3luY19zZXRfbmFtZVcpCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZSAgICAgSVRUTk9USUZZX1ZPSUQoc3luY19zZXRfbmFtZSkKKyNkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZV9wdHIgSVRUTk9USUZZX05BTUUoc3luY19zZXRfbmFtZSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWVBKGFkZHIsIG9ianR5cGUsIG9iam5hbWUsIGF0dHJpYnV0ZSkKKyNkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZVcoYWRkciwgb2JqdHlwZSwgb2JqbmFtZSwgYXR0cmlidXRlKQorI2RlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWUoYWRkciwgb2JqdHlwZSwgb2JqbmFtZSwgYXR0cmlidXRlKQorI2RlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lX3B0ciAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lX3B0ciAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGRlcHJlY2F0ZWQgTGVnYWN5IEFQSQorICogQGJyaWVmIEFzc2lnbiBhIG5hbWUgYW5kIHR5cGUgdG8gYSBzeW5jIG9iamVjdCB1c2luZyBjaGFyIG9yIFVuaWNvZGUgc3RyaW5nCisgKiBAcGFyYW1baW5dIGFkZHIgLSAgICAgIHBvaW50ZXIgdG8gdGhlIHN5bmMgb2JqZWN0LiBZb3Ugc2hvdWxkIHVzZSBhIHJlYWwgcG9pbnRlciB0byB5b3VyIG9iamVjdAorICogICAgICAgICAgICAgICAgICAgICAgICB0byBtYWtlIHN1cmUgdGhhdCB0aGUgdmFsdWVzIGRvbid0IGNsYXNoIHdpdGggb3RoZXIgb2JqZWN0IGFkZHJlc3NlcworICogQHBhcmFtW2luXSBvYmp0eXBlIC0gICBudWxsLXRlcm1pbmF0ZWQgb2JqZWN0IHR5cGUgc3RyaW5nLiBJZiBOVUxMIGlzIHBhc3NlZCwgdGhlIG9iamVjdCB3aWxsCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGJlIGFzc3VtZWQgdG8gYmUgb2YgZ2VuZXJpYyAiVXNlciBTeW5jaHJvbml6YXRpb24iIHR5cGUKKyAqIEBwYXJhbVtpbl0gb2JqbmFtZSAtICAgbnVsbC10ZXJtaW5hdGVkIG9iamVjdCBuYW1lIHN0cmluZy4gSWYgTlVMTCwgbm8gbmFtZSB3aWxsIGJlIGFzc2lnbmVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBvYmplY3QgLS0geW91IGNhbiB1c2UgdGhlIF9faXR0X3N5bmNfcmVuYW1lIGNhbGwgbGF0ZXIgdG8gYXNzaWduCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBuYW1lCisgKiBAcGFyYW1baW5dIHR5cGVsZW4sIG5hbWVsZW4gLSAgIGEgbGVuZ3RoIG9mIHN0cmluZyBmb3IgYXBwcm9wcmlhdGUgb2JqdHlwZSBhbmQgb2JqbmFtZSBwYXJhbWV0ZXIKKyAqIEBwYXJhbVtpbl0gYXR0cmlidXRlIC0gb25lIG9mIFsjX19pdHRfYXR0cl9iYXJyaWVyLCAjX19pdHRfYXR0cl9tdXRleF0gdmFsdWVzIHdoaWNoIGRlZmluZXMgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGV4YWN0IHNlbWFudGljcyBvZiBob3cgcHJlcGFyZS9hY3F1aXJlZC9yZWxlYXNpbmcgY2FsbHMgd29yay4KKyAqIEByZXR1cm4gX19pdHRfZXJyIHVwb24gZmFpbHVyZSAobmFtZSBvciBuYW1lbGVuIGJlaW5nIG51bGwsbmFtZSBhbmQgbmFtZWxlbiBtaXNtYXRjaGVkKQorICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitpbnQgTElCSVRUQVBJIF9faXR0X25vdGlmeV9zeW5jX25hbWVBKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm9ianR5cGUsIGludCB0eXBlbGVuLCBjb25zdCBjaGFyICAgICpvYmpuYW1lLCBpbnQgbmFtZWxlbiwgaW50IGF0dHJpYnV0ZSk7CitpbnQgTElCSVRUQVBJIF9faXR0X25vdGlmeV9zeW5jX25hbWVXKHZvaWQgKmFkZHIsIGNvbnN0IHdjaGFyX3QgKm9ianR5cGUsIGludCB0eXBlbGVuLCBjb25zdCB3Y2hhcl90ICpvYmpuYW1lLCBpbnQgbmFtZWxlbiwgaW50IGF0dHJpYnV0ZSk7CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorIyAgZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZVcKKyNlbHNlCisjICBkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lQQorI2VuZGlmCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK2ludCBMSUJJVFRBUEkgX19pdHRfbm90aWZ5X3N5bmNfbmFtZSh2b2lkICphZGRyLCBjb25zdCBjaGFyICpvYmp0eXBlLCBpbnQgdHlwZWxlbiwgY29uc3QgY2hhciAqb2JqbmFtZSwgaW50IG5hbWVsZW4sIGludCBhdHRyaWJ1dGUpOworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihMSUJJVFRBUEksIGludCwgbm90aWZ5X3N5bmNfbmFtZUEsICh2b2lkICphZGRyLCBjb25zdCBjaGFyICAgICpvYmp0eXBlLCBpbnQgdHlwZWxlbiwgY29uc3QgY2hhciAgICAqb2JqbmFtZSwgaW50IG5hbWVsZW4sIGludCBhdHRyaWJ1dGUpKQorSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsIG5vdGlmeV9zeW5jX25hbWVXLCAodm9pZCAqYWRkciwgY29uc3Qgd2NoYXJfdCAqb2JqdHlwZSwgaW50IHR5cGVsZW4sIGNvbnN0IHdjaGFyX3QgKm9iam5hbWUsIGludCBuYW1lbGVuLCBpbnQgYXR0cmlidXRlKSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCBub3RpZnlfc3luY19uYW1lLCAgKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm9ianR5cGUsIGludCB0eXBlbGVuLCBjb25zdCBjaGFyICAgICpvYmpuYW1lLCBpbnQgbmFtZWxlbiwgaW50IGF0dHJpYnV0ZSkpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWVBICAgICBJVFROT1RJRllfREFUQShub3RpZnlfc3luY19uYW1lQSkKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZUFfcHRyIElUVE5PVElGWV9OQU1FKG5vdGlmeV9zeW5jX25hbWVBKQorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lVyAgICAgSVRUTk9USUZZX0RBVEEobm90aWZ5X3N5bmNfbmFtZVcpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWVXX3B0ciBJVFROT1RJRllfTkFNRShub3RpZnlfc3luY19uYW1lVykKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lICAgICBJVFROT1RJRllfREFUQShub3RpZnlfc3luY19uYW1lKQorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lX3B0ciBJVFROT1RJRllfTkFNRShub3RpZnlfc3luY19uYW1lKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZUEoYWRkciwgb2JqdHlwZSwgdHlwZWxlbiwgb2JqbmFtZSwgbmFtZWxlbiwgYXR0cmlidXRlKQorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lQV9wdHIgMAorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lVyhhZGRyLCBvYmp0eXBlLCB0eXBlbGVuLCBvYmpuYW1lLCBuYW1lbGVuLCBhdHRyaWJ1dGUpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZShhZGRyLCBvYmp0eXBlLCB0eXBlbGVuLCBvYmpuYW1lLCBuYW1lbGVuLCBhdHRyaWJ1dGUpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWVfcHRyIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lQV9wdHIgMAorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWVfcHRyIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgRW50ZXIgc3BpbiBsb29wIG9uIHVzZXItZGVmaW5lZCBzeW5jIG9iamVjdAorICovCit2b2lkIExJQklUVEFQSSBfX2l0dF9ub3RpZnlfc3luY19wcmVwYXJlKHZvaWQqIGFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoTElCSVRUQVBJLCB2b2lkLCBub3RpZnlfc3luY19wcmVwYXJlLCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX3ByZXBhcmUgICAgIElUVE5PVElGWV9WT0lEKG5vdGlmeV9zeW5jX3ByZXBhcmUpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX3ByZXBhcmVfcHRyIElUVE5PVElGWV9OQU1FKG5vdGlmeV9zeW5jX3ByZXBhcmUpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19wcmVwYXJlKGFkZHIpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX3ByZXBhcmVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19wcmVwYXJlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGRlcHJlY2F0ZWQgTGVnYWN5IEFQSQorICogQGJyaWVmIFF1aXQgc3BpbiBsb29wIHdpdGhvdXQgYWNxdWlyaW5nIHNwaW4gb2JqZWN0CisgKi8KK3ZvaWQgTElCSVRUQVBJIF9faXR0X25vdGlmeV9zeW5jX2NhbmNlbCh2b2lkICphZGRyKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKExJQklUVEFQSSwgdm9pZCwgbm90aWZ5X3N5bmNfY2FuY2VsLCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX2NhbmNlbCAgICAgSVRUTk9USUZZX1ZPSUQobm90aWZ5X3N5bmNfY2FuY2VsKQorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19jYW5jZWxfcHRyIElUVE5PVElGWV9OQU1FKG5vdGlmeV9zeW5jX2NhbmNlbCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX2NhbmNlbChhZGRyKQorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19jYW5jZWxfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19jYW5jZWxfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgU3VjY2Vzc2Z1bCBzcGluIGxvb3AgY29tcGxldGlvbiAoc3luYyBvYmplY3QgYWNxdWlyZWQpCisgKi8KK3ZvaWQgTElCSVRUQVBJIF9faXR0X25vdGlmeV9zeW5jX2FjcXVpcmVkKHZvaWQgKmFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoTElCSVRUQVBJLCB2b2lkLCBub3RpZnlfc3luY19hY3F1aXJlZCwgKHZvaWQgKmFkZHIpKQorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19hY3F1aXJlZCAgICAgSVRUTk9USUZZX1ZPSUQobm90aWZ5X3N5bmNfYWNxdWlyZWQpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX2FjcXVpcmVkX3B0ciBJVFROT1RJRllfTkFNRShub3RpZnlfc3luY19hY3F1aXJlZCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX2FjcXVpcmVkKGFkZHIpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX2FjcXVpcmVkX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfYWNxdWlyZWRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgU3RhcnQgc3luYyBvYmplY3QgcmVsZWFzaW5nIGNvZGUuIElzIGNhbGxlZCBiZWZvcmUgdGhlIGxvY2sgcmVsZWFzZSBjYWxsLgorICovCit2b2lkIExJQklUVEFQSSBfX2l0dF9ub3RpZnlfc3luY19yZWxlYXNpbmcodm9pZCogYWRkcik7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihMSUJJVFRBUEksIHZvaWQsIG5vdGlmeV9zeW5jX3JlbGVhc2luZywgKHZvaWQgKmFkZHIpKQorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19yZWxlYXNpbmcgICAgIElUVE5PVElGWV9WT0lEKG5vdGlmeV9zeW5jX3JlbGVhc2luZykKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfcmVsZWFzaW5nX3B0ciBJVFROT1RJRllfTkFNRShub3RpZnlfc3luY19yZWxlYXNpbmcpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19yZWxlYXNpbmcoYWRkcikKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfcmVsZWFzaW5nX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfcmVsZWFzaW5nX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gbGVnYWN5X3N5bmMgZ3JvdXAgKi8KKworI2lmbmRlZiBfSVRUTk9USUZZX0hfCisvKioKKyAqIEBkZWZncm91cCBsZWdhY3lfZXZlbnRzIEV2ZW50cworICogQGluZ3JvdXAgbGVnYWN5CisgKiBFdmVudHMgZ3JvdXAKKyAqIEB7CisgKi8KKworLyoqIEBicmllZiB1c2VyIGV2ZW50IHR5cGUgKi8KK3R5cGVkZWYgaW50IF9faXR0X2V2ZW50OworCisvKioKKyAqIEBicmllZiBDcmVhdGUgYW4gZXZlbnQgbm90aWZpY2F0aW9uCisgKiBAbm90ZSBuYW1lIG9yIG5hbWVsZW4gYmVpbmcgbnVsbC9uYW1lIGFuZCBuYW1lbGVuIG5vdCBtYXRjaGluZywgdXNlciBldmVudCBmZWF0dXJlIG5vdCBlbmFibGVkCisgKiBAcmV0dXJuIG5vbi16ZXJvIGV2ZW50IGlkZW50aWZpZXIgdXBvbiBzdWNjZXNzIGFuZCBfX2l0dF9lcnIgb3RoZXJ3aXNlCisgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK19faXR0X2V2ZW50IExJQklUVEFQSSBfX2l0dF9ldmVudF9jcmVhdGVBKGNvbnN0IGNoYXIgICAgKm5hbWUsIGludCBuYW1lbGVuKTsKK19faXR0X2V2ZW50IExJQklUVEFQSSBfX2l0dF9ldmVudF9jcmVhdGVXKGNvbnN0IHdjaGFyX3QgKm5hbWUsIGludCBuYW1lbGVuKTsKKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjICBkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlICAgICBfX2l0dF9ldmVudF9jcmVhdGVXCisjICBkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlX3B0ciBfX2l0dF9ldmVudF9jcmVhdGVXX3B0cgorI2Vsc2UKKyMgIGRlZmluZSBfX2l0dF9ldmVudF9jcmVhdGUgICAgIF9faXR0X2V2ZW50X2NyZWF0ZUEKKyMgIGRlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVfcHRyIF9faXR0X2V2ZW50X2NyZWF0ZUFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworX19pdHRfZXZlbnQgTElCSVRUQVBJIF9faXR0X2V2ZW50X2NyZWF0ZShjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbik7CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKExJQklUVEFQSSwgX19pdHRfZXZlbnQsIGV2ZW50X2NyZWF0ZUEsIChjb25zdCBjaGFyICAgICpuYW1lLCBpbnQgbmFtZWxlbikpCitJVFRfU1RVQihMSUJJVFRBUEksIF9faXR0X2V2ZW50LCBldmVudF9jcmVhdGVXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSwgaW50IG5hbWVsZW4pKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoTElCSVRUQVBJLCBfX2l0dF9ldmVudCwgZXZlbnRfY3JlYXRlLCAgKGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlQSAgICAgSVRUTk9USUZZX0RBVEEoZXZlbnRfY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlQV9wdHIgSVRUTk9USUZZX05BTUUoZXZlbnRfY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlVyAgICAgSVRUTk9USUZZX0RBVEEoZXZlbnRfY3JlYXRlVykKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlV19wdHIgSVRUTk9USUZZX05BTUUoZXZlbnRfY3JlYXRlVykKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGUgICAgICBJVFROT1RJRllfREFUQShldmVudF9jcmVhdGUpCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZV9wdHIgIElUVE5PVElGWV9OQU1FKGV2ZW50X2NyZWF0ZSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZUEobmFtZSwgbmFtZWxlbikgKF9faXR0X2V2ZW50KTAKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlQV9wdHIgMAorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVXKG5hbWUsIG5hbWVsZW4pIChfX2l0dF9ldmVudCkwCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGUobmFtZSwgbmFtZWxlbikgIChfX2l0dF9ldmVudCkwCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZV9wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVfcHRyICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFJlY29yZCBhbiBldmVudCBvY2N1cnJlbmNlLgorICogQHJldHVybiBfX2l0dF9lcnIgdXBvbiBmYWlsdXJlIChpbnZhbGlkIGV2ZW50IGlkL3VzZXIgZXZlbnQgZmVhdHVyZSBub3QgZW5hYmxlZCkKKyAqLworaW50IExJQklUVEFQSSBfX2l0dF9ldmVudF9zdGFydChfX2l0dF9ldmVudCBldmVudCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCBldmVudF9zdGFydCwgKF9faXR0X2V2ZW50IGV2ZW50KSkKKyNkZWZpbmUgX19pdHRfZXZlbnRfc3RhcnQgICAgIElUVE5PVElGWV9EQVRBKGV2ZW50X3N0YXJ0KQorI2RlZmluZSBfX2l0dF9ldmVudF9zdGFydF9wdHIgSVRUTk9USUZZX05BTUUoZXZlbnRfc3RhcnQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9ldmVudF9zdGFydChldmVudCkgKGludCkwCisjZGVmaW5lIF9faXR0X2V2ZW50X3N0YXJ0X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfZXZlbnRfc3RhcnRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgUmVjb3JkIGFuIGV2ZW50IGVuZCBvY2N1cnJlbmNlLgorICogQG5vdGUgSXQgaXMgb3B0aW9uYWwgaWYgZXZlbnRzIGRvIG5vdCBoYXZlIGR1cmF0aW9ucy4KKyAqIEByZXR1cm4gX19pdHRfZXJyIHVwb24gZmFpbHVyZSAoaW52YWxpZCBldmVudCBpZC91c2VyIGV2ZW50IGZlYXR1cmUgbm90IGVuYWJsZWQpCisgKi8KK2ludCBMSUJJVFRBUEkgX19pdHRfZXZlbnRfZW5kKF9faXR0X2V2ZW50IGV2ZW50KTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsIGV2ZW50X2VuZCwgKF9faXR0X2V2ZW50IGV2ZW50KSkKKyNkZWZpbmUgX19pdHRfZXZlbnRfZW5kICAgICBJVFROT1RJRllfREFUQShldmVudF9lbmQpCisjZGVmaW5lIF9faXR0X2V2ZW50X2VuZF9wdHIgSVRUTk9USUZZX05BTUUoZXZlbnRfZW5kKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfZXZlbnRfZW5kKGV2ZW50KSAoaW50KTAKKyNkZWZpbmUgX19pdHRfZXZlbnRfZW5kX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfZXZlbnRfZW5kX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gbGVnYWN5X2V2ZW50cyBncm91cCAqLworI2VuZGlmIC8qIF9JVFROT1RJRllfSF8gKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgbGVnYWN5X21lbW9yeSBNZW1vcnkgQWNjZXNzZXMKKyAqIEBpbmdyb3VwIGxlZ2FjeQorICovCisKKy8qKgorICogQGRlcHJlY2F0ZWQgTGVnYWN5IEFQSQorICogQGJyaWVmIEluZm9ybSB0aGUgdG9vbCBvZiBtZW1vcnkgYWNjZXNzZXMgb24gcmVhZGluZworICovCit2b2lkIExJQklUVEFQSSBfX2l0dF9tZW1vcnlfcmVhZCh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihMSUJJVFRBUEksIHZvaWQsIG1lbW9yeV9yZWFkLCAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUpKQorI2RlZmluZSBfX2l0dF9tZW1vcnlfcmVhZCAgICAgSVRUTk9USUZZX1ZPSUQobWVtb3J5X3JlYWQpCisjZGVmaW5lIF9faXR0X21lbW9yeV9yZWFkX3B0ciBJVFROT1RJRllfTkFNRShtZW1vcnlfcmVhZCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X21lbW9yeV9yZWFkKGFkZHIsIHNpemUpCisjZGVmaW5lIF9faXR0X21lbW9yeV9yZWFkX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbWVtb3J5X3JlYWRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgSW5mb3JtIHRoZSB0b29sIG9mIG1lbW9yeSBhY2Nlc3NlcyBvbiB3cml0aW5nCisgKi8KK3ZvaWQgTElCSVRUQVBJIF9faXR0X21lbW9yeV93cml0ZSh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihMSUJJVFRBUEksIHZvaWQsIG1lbW9yeV93cml0ZSwgKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKSkKKyNkZWZpbmUgX19pdHRfbWVtb3J5X3dyaXRlICAgICBJVFROT1RJRllfVk9JRChtZW1vcnlfd3JpdGUpCisjZGVmaW5lIF9faXR0X21lbW9yeV93cml0ZV9wdHIgSVRUTk9USUZZX05BTUUobWVtb3J5X3dyaXRlKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbWVtb3J5X3dyaXRlKGFkZHIsIHNpemUpCisjZGVmaW5lIF9faXR0X21lbW9yeV93cml0ZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X21lbW9yeV93cml0ZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBJbmZvcm0gdGhlIHRvb2wgb2YgbWVtb3J5IGFjY2Vzc2VzIG9uIHVwZGF0aW5nCisgKi8KK3ZvaWQgTElCSVRUQVBJIF9faXR0X21lbW9yeV91cGRhdGUodm9pZCAqYWRkcmVzcywgc2l6ZV90IHNpemUpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoTElCSVRUQVBJLCB2b2lkLCBtZW1vcnlfdXBkYXRlLCAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUpKQorI2RlZmluZSBfX2l0dF9tZW1vcnlfdXBkYXRlICAgICBJVFROT1RJRllfVk9JRChtZW1vcnlfdXBkYXRlKQorI2RlZmluZSBfX2l0dF9tZW1vcnlfdXBkYXRlX3B0ciBJVFROT1RJRllfTkFNRShtZW1vcnlfdXBkYXRlKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbWVtb3J5X3VwZGF0ZShhZGRyLCBzaXplKQorI2RlZmluZSBfX2l0dF9tZW1vcnlfdXBkYXRlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbWVtb3J5X3VwZGF0ZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IGxlZ2FjeV9tZW1vcnkgZ3JvdXAgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgbGVnYWN5X3N0YXRlIFRocmVhZCBhbmQgT2JqZWN0IFN0YXRlcworICogQGluZ3JvdXAgbGVnYWN5CisgKi8KKworLyoqIEBicmllZiBzdGF0ZSB0eXBlICovCit0eXBlZGVmIGludCBfX2l0dF9zdGF0ZV90OworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KK3R5cGVkZWYgZW51bSBfX2l0dF9vYmpfc3RhdGUgeworICAgIF9faXR0X29ial9zdGF0ZV9lcnIgPSAwLAorICAgIF9faXR0X29ial9zdGF0ZV9jbHIgPSAxLAorICAgIF9faXR0X29ial9zdGF0ZV9zZXQgPSAyLAorICAgIF9faXR0X29ial9zdGF0ZV91c2UgPSAzCit9IF9faXR0X29ial9zdGF0ZV90OworCit0eXBlZGVmIGVudW0gX19pdHRfdGhyX3N0YXRlIHsKKyAgICBfX2l0dF90aHJfc3RhdGVfZXJyID0gMCwKKyAgICBfX2l0dF90aHJfc3RhdGVfY2xyID0gMSwKKyAgICBfX2l0dF90aHJfc3RhdGVfc2V0ID0gMgorfSBfX2l0dF90aHJfc3RhdGVfdDsKKwordHlwZWRlZiBlbnVtIF9faXR0X29ial9wcm9wIHsKKyAgICBfX2l0dF9vYmpfcHJvcF93YXRjaCAgICA9IDEsCisgICAgX19pdHRfb2JqX3Byb3BfaWdub3JlICAgPSAyLAorICAgIF9faXR0X29ial9wcm9wX3NoYXJhYmxlID0gMworfSBfX2l0dF9vYmpfcHJvcF90OworCit0eXBlZGVmIGVudW0gX19pdHRfdGhyX3Byb3AgeworICAgIF9faXR0X3Rocl9wcm9wX3F1aWV0ID0gMQorfSBfX2l0dF90aHJfcHJvcF90OworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGRlcHJlY2F0ZWQgTGVnYWN5IEFQSQorICogQGJyaWVmIG1hbmFnaW5nIHRocmVhZCBhbmQgb2JqZWN0IHN0YXRlcworICovCitfX2l0dF9zdGF0ZV90IExJQklUVEFQSSBfX2l0dF9zdGF0ZV9nZXQodm9pZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfc3RhdGVfdCwgc3RhdGVfZ2V0LCAodm9pZCkpCisjZGVmaW5lIF9faXR0X3N0YXRlX2dldCAgICAgSVRUTk9USUZZX0RBVEEoc3RhdGVfZ2V0KQorI2RlZmluZSBfX2l0dF9zdGF0ZV9nZXRfcHRyIElUVE5PVElGWV9OQU1FKHN0YXRlX2dldCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3N0YXRlX2dldCh2b2lkKSAoX19pdHRfc3RhdGVfdCkwCisjZGVmaW5lIF9faXR0X3N0YXRlX2dldF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3N0YXRlX2dldF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBtYW5hZ2luZyB0aHJlYWQgYW5kIG9iamVjdCBzdGF0ZXMKKyAqLworX19pdHRfc3RhdGVfdCBMSUJJVFRBUEkgX19pdHRfc3RhdGVfc2V0KF9faXR0X3N0YXRlX3Qgcyk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfc3RhdGVfdCwgc3RhdGVfc2V0LCAoX19pdHRfc3RhdGVfdCBzKSkKKyNkZWZpbmUgX19pdHRfc3RhdGVfc2V0ICAgICBJVFROT1RJRllfREFUQShzdGF0ZV9zZXQpCisjZGVmaW5lIF9faXR0X3N0YXRlX3NldF9wdHIgSVRUTk9USUZZX05BTUUoc3RhdGVfc2V0KQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3RhdGVfc2V0KHMpIChfX2l0dF9zdGF0ZV90KTAKKyNkZWZpbmUgX19pdHRfc3RhdGVfc2V0X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfc3RhdGVfc2V0X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGRlcHJlY2F0ZWQgTGVnYWN5IEFQSQorICogQGJyaWVmIG1hbmFnaW5nIHRocmVhZCBhbmQgb2JqZWN0IG1vZGVzCisgKi8KK19faXR0X3Rocl9zdGF0ZV90IExJQklUVEFQSSBfX2l0dF90aHJfbW9kZV9zZXQoX19pdHRfdGhyX3Byb3BfdCBwLCBfX2l0dF90aHJfc3RhdGVfdCBzKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF90aHJfc3RhdGVfdCwgdGhyX21vZGVfc2V0LCAoX19pdHRfdGhyX3Byb3BfdCBwLCBfX2l0dF90aHJfc3RhdGVfdCBzKSkKKyNkZWZpbmUgX19pdHRfdGhyX21vZGVfc2V0ICAgICBJVFROT1RJRllfREFUQSh0aHJfbW9kZV9zZXQpCisjZGVmaW5lIF9faXR0X3Rocl9tb2RlX3NldF9wdHIgSVRUTk9USUZZX05BTUUodGhyX21vZGVfc2V0KQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfdGhyX21vZGVfc2V0KHAsIHMpIChfX2l0dF90aHJfc3RhdGVfdCkwCisjZGVmaW5lIF9faXR0X3Rocl9tb2RlX3NldF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3Rocl9tb2RlX3NldF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBtYW5hZ2luZyB0aHJlYWQgYW5kIG9iamVjdCBtb2RlcworICovCitfX2l0dF9vYmpfc3RhdGVfdCBMSUJJVFRBUEkgX19pdHRfb2JqX21vZGVfc2V0KF9faXR0X29ial9wcm9wX3QgcCwgX19pdHRfb2JqX3N0YXRlX3Qgcyk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfb2JqX3N0YXRlX3QsIG9ial9tb2RlX3NldCwgKF9faXR0X29ial9wcm9wX3QgcCwgX19pdHRfb2JqX3N0YXRlX3QgcykpCisjZGVmaW5lIF9faXR0X29ial9tb2RlX3NldCAgICAgSVRUTk9USUZZX0RBVEEob2JqX21vZGVfc2V0KQorI2RlZmluZSBfX2l0dF9vYmpfbW9kZV9zZXRfcHRyIElUVE5PVElGWV9OQU1FKG9ial9tb2RlX3NldCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X29ial9tb2RlX3NldChwLCBzKSAoX19pdHRfb2JqX3N0YXRlX3QpMAorI2RlZmluZSBfX2l0dF9vYmpfbW9kZV9zZXRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9vYmpfbW9kZV9zZXRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSBsZWdhY3lfc3RhdGUgZ3JvdXAgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgZnJhbWVzIEZyYW1lcworICogQGluZ3JvdXAgbGVnYWN5CisgKiBGcmFtZXMgZ3JvdXAKKyAqIEB7CisgKi8KKy8qKgorICogQGJyaWVmIG9wYXF1ZSBzdHJ1Y3R1cmUgZm9yIGZyYW1lIGlkZW50aWZpY2F0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IF9faXR0X2ZyYW1lX3QgKl9faXR0X2ZyYW1lOworCisvKioKKyAqIEBicmllZiBDcmVhdGUgYSBnbG9iYWwgZnJhbWUgd2l0aCBnaXZlbiBkb21haW4KKyAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorX19pdHRfZnJhbWUgSVRUQVBJIF9faXR0X2ZyYW1lX2NyZWF0ZUEoY29uc3QgY2hhciAgICAqZG9tYWluKTsKK19faXR0X2ZyYW1lIElUVEFQSSBfX2l0dF9mcmFtZV9jcmVhdGVXKGNvbnN0IHdjaGFyX3QgKmRvbWFpbik7CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorIyAgZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZSAgICAgX19pdHRfZnJhbWVfY3JlYXRlVworIyAgZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZV9wdHIgX19pdHRfZnJhbWVfY3JlYXRlV19wdHIKKyNlbHNlIC8qIFVOSUNPREUgKi8KKyMgIGRlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGUgICAgIF9faXR0X2ZyYW1lX2NyZWF0ZUEKKyMgIGRlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGVfcHRyIF9faXR0X2ZyYW1lX2NyZWF0ZUFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitfX2l0dF9mcmFtZSBJVFRBUEkgX19pdHRfZnJhbWVfY3JlYXRlKGNvbnN0IGNoYXIgKmRvbWFpbik7CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfZnJhbWUsIGZyYW1lX2NyZWF0ZUEsIChjb25zdCBjaGFyICAgICpkb21haW4pKQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9mcmFtZSwgZnJhbWVfY3JlYXRlVywgKGNvbnN0IHdjaGFyX3QgKmRvbWFpbikpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2ZyYW1lLCBmcmFtZV9jcmVhdGUsICAoY29uc3QgY2hhciAqZG9tYWluKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlQSAgICAgSVRUTk9USUZZX0RBVEEoZnJhbWVfY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlQV9wdHIgSVRUTk9USUZZX05BTUUoZnJhbWVfY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlVyAgICAgSVRUTk9USUZZX0RBVEEoZnJhbWVfY3JlYXRlVykKKyNkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlV19wdHIgSVRUTk9USUZZX05BTUUoZnJhbWVfY3JlYXRlVykKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGUgICAgIElUVE5PVElGWV9EQVRBKGZyYW1lX2NyZWF0ZSkKKyNkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlX3B0ciBJVFROT1RJRllfTkFNRShmcmFtZV9jcmVhdGUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGVBKGRvbWFpbikKKyNkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlQV9wdHIgMAorI2RlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGVXKGRvbWFpbikKKyNkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZShkb21haW4pCisjZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZV9wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGVfcHRyICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKiBAYnJpZWYgUmVjb3JkIGFuIGZyYW1lIGJlZ2luIG9jY3VycmVuY2UuICovCit2b2lkIElUVEFQSSBfX2l0dF9mcmFtZV9iZWdpbihfX2l0dF9mcmFtZSBmcmFtZSk7CisvKiogQGJyaWVmIFJlY29yZCBhbiBmcmFtZSBlbmQgb2NjdXJyZW5jZS4gKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2ZyYW1lX2VuZCAgKF9faXR0X2ZyYW1lIGZyYW1lKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgZnJhbWVfYmVnaW4sIChfX2l0dF9mcmFtZSBmcmFtZSkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmcmFtZV9lbmQsICAgKF9faXR0X2ZyYW1lIGZyYW1lKSkKKyNkZWZpbmUgX19pdHRfZnJhbWVfYmVnaW4gICAgIElUVE5PVElGWV9WT0lEKGZyYW1lX2JlZ2luKQorI2RlZmluZSBfX2l0dF9mcmFtZV9iZWdpbl9wdHIgSVRUTk9USUZZX05BTUUoZnJhbWVfYmVnaW4pCisjZGVmaW5lIF9faXR0X2ZyYW1lX2VuZCAgICAgICBJVFROT1RJRllfVk9JRChmcmFtZV9lbmQpCisjZGVmaW5lIF9faXR0X2ZyYW1lX2VuZF9wdHIgICBJVFROT1RJRllfTkFNRShmcmFtZV9lbmQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9mcmFtZV9iZWdpbihmcmFtZSkKKyNkZWZpbmUgX19pdHRfZnJhbWVfYmVnaW5fcHRyIDAKKyNkZWZpbmUgX19pdHRfZnJhbWVfZW5kKGZyYW1lKQorI2RlZmluZSBfX2l0dF9mcmFtZV9lbmRfcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2ZyYW1lX2JlZ2luX3B0ciAwCisjZGVmaW5lIF9faXR0X2ZyYW1lX2VuZF9wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gZnJhbWVzIGdyb3VwICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAvKiBfTEVHQUNZX0lUVE5PVElGWV9IXyAqLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvel9MaW51eF9hc20ucyBiL2ZpbmFsL3J1bnRpbWUvc3JjL3pfTGludXhfYXNtLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRjODA1MgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL3pfTGludXhfYXNtLnMKQEAgLTAsMCArMSwxNjAxIEBACisvLyAgel9MaW51eF9hc20uczogIC0gbWljcm90YXNraW5nIHJvdXRpbmVzIHNwZWNpZmljYWxseQorLy8gICAgICAgICAgICAgICAgICAgIHdyaXR0ZW4gZm9yIEludGVsIHBsYXRmb3JtcyBydW5uaW5nIExpbnV4KiBPUworLy8gJFJldmlzaW9uOiA0MjgxMCAkCisvLyAkRGF0ZTogMjAxMy0xMS0wNyAxMjowNjozMyAtMDYwMCAoVGh1LCAwNyBOb3YgMjAxMykgJAorCisvLworLy8vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vLworLy8vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLy8vCisvLy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLy8vCisvLy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbWFjcm9zCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCisjIGlmIF9fTUlDX18gfHwgX19NSUMyX18KKy8vCisvLyB0aGUgJ2RlbGF5IHIxNi9yMzIvcjY0JyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSAncGF1c2UnLgorLy8gVGhlIGRlbGF5IG9wZXJhdGlvbiBoYXMgdGhlIGVmZmVjdCBvZiByZW1vdmluZyB0aGUgY3VycmVudCB0aHJlYWQgZnJvbQorLy8gdGhlIHJvdW5kLXJvYmluIEhUIG1lY2hhbmlzbSwgYW5kIHRoZXJlZm9yZSBzcGVlZHMgdXAgdGhlIGlzc3VlIHJhdGUgb2YKKy8vIHRoZSBvdGhlciB0aHJlYWRzIG9uIHRoZSBzYW1lIGNvcmUuCisvLworLy8gQSB2YWx1ZSBvZiAwIHdvcmtzIGZpbmUgZm9yIDw9IDIgdGhyZWFkcyBwZXIgY29yZSwgYnV0IGNhdXNlcyB0aGUgRVBDQworLy8gYmFycmllciB0aW1lIHRvIGluY3JlYXNlIGdyZWF0bHkgZm9yIDMgb3IgbW9yZSB0aHJlYWRzIHBlciBjb3JlLgorLy8KKy8vIEEgdmFsdWUgb2YgMTAwIHdvcmtzIHByZXR0eSB3ZWxsIGZvciB1cCB0byA0IHRocmVhZHMgcGVyIGNvcmUsIGJ1dCBpc24ndAorLy8gcXVpdGUgYXMgZmFzdCBhcyAwIGZvciAyIHRocmVhZHMgcGVyIGNvcmUuCisvLworLy8gV2UgbmVlZCB0byBjaGVjayB3aGF0IGhhcHBlbnMgZm9yIG92ZXJzdWJzY3JpcHRpb24gLyA+IDQgdGhyZWFkcyBwZXIgY29yZS4KKy8vIEl0IGlzIHBvc3NpYmxlIHRoYXQgd2UgbmVlZCB0byBwYXNzIHRoZSBkZWxheSB2YWx1ZSBpbiBhcyBhIHBhcmFtZXRlcgorLy8gdGhhdCB0aGUgY2FsbGVyIGRldGVybWluZXMgYmFzZWQgb24gdGhlIHRvdGFsICMgdGhyZWFkcyAvICMgY29yZXMuCisvLworLy8ubWFjcm8gcGF1c2Vfb3AKKy8vCW1vdiAgICAkMTAwLCAlcmF4CisvLwlkZWxheSAgJXJheAorLy8uZW5kbQorIyBlbHNlCisjICBkZWZpbmUgcGF1c2Vfb3AgICAuYnl0ZSAweGYzLDB4OTAKKyMgZW5kaWYgLy8gX19NSUNfXyB8fCBfX01JQzJfXworCisjIGlmIGRlZmluZWQgX19BUFBMRV9fICYmIGRlZmluZWQgX19NQUNIX18KKyMgIGRlZmluZSBLTVBfUFJFRklYX1VOREVSU0NPUkUoeCkgXyMjeCAgLy8gZXh0cmEgdW5kZXJzY29yZSBmb3IgT1MgWCogc3ltYm9scworLm1hY3JvIEFMSUdOCisJLmFsaWduICQwCisuZW5kbWFjcm8KKy5tYWNybyBERUJVR19JTkZPCisvKiBOb3Qgc3VyZSB3aGF0IC5zaXplIGRvZXMgaW4gaWNjLCBub3Qgc3VyZSBpZiB3ZSBuZWVkIHRvIGRvIHNvbWV0aGluZworICAgc2ltaWxhciBmb3IgT1MgWCouCisqLworLmVuZG1hY3JvCisubWFjcm8gUFJPQworCUFMSUdOICA0CisJLmdsb2JsIEtNUF9QUkVGSVhfVU5ERVJTQ09SRSgkMCkKK0tNUF9QUkVGSVhfVU5ERVJTQ09SRSgkMCk6CisuZW5kbWFjcm8KKyMgZWxzZSAvLyBkZWZpbmVkIF9fQVBQTEVfXyAmJiBkZWZpbmVkIF9fTUFDSF9fCisjICBkZWZpbmUgS01QX1BSRUZJWF9VTkRFUlNDT1JFKHgpIHggIC8vIG5vIGV4dHJhIHVuZGVyc2NvcmUgZm9yIExpbnV4KiBPUyBzeW1ib2xzCisubWFjcm8gQUxJR04gc2l6ZQorCS5hbGlnbiAxPDwoXHNpemUpCisuZW5kbQorLm1hY3JvIERFQlVHX0lORk8gcHJvYworLy8gTm90IHN1cmUgd2h5IHdlIG5lZWQgLnR5cGUgYW5kIC5zaXplIGZvciB0aGUgZnVuY3Rpb25zCisJLmFsaWduIDE2CisJLnR5cGUgIFxwcm9jLEBmdW5jdGlvbgorICAgICAgICAuc2l6ZSAgXHByb2MsLi1ccHJvYworLmVuZG0KKy5tYWNybyBQUk9DIHByb2MKKwlBTElHTiAgNAorICAgICAgICAuZ2xvYmwgS01QX1BSRUZJWF9VTkRFUlNDT1JFKFxwcm9jKQorS01QX1BSRUZJWF9VTkRFUlNDT1JFKFxwcm9jKToKKy5lbmRtCisjIGVuZGlmIC8vIGRlZmluZWQgX19BUFBMRV9fICYmIGRlZmluZWQgX19NQUNIX18KKyNlbmRpZiAvLyBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfeDg2XzY0CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGRhdGEKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKworLy8KKy8vIFN1cHBvcnQgZm9yIHVubmFtZWQgY29tbW9uIGJsb2Nrcy4KKy8vCisvLyBCZWNhdXNlIHRoZSBzeW1ib2wgIi5nb21wX2NyaXRpY2FsX3VzZXJfIiBjb250YWlucyBhICIuIiwgd2UgaGF2ZSB0bworLy8gcHV0IHRoaXMgc3R1ZmYgaW4gYXNzZW1ibHkuCisvLworCisjIGlmIEtNUF9BUkNIX1g4NgorIyAgaWYgZGVmaW5lZCBfX0FQUExFX18gJiYgZGVmaW5lZCBfX01BQ0hfXworICAgICAgICAuZGF0YQorICAgICAgICAuY29tbSAuZ29tcF9jcml0aWNhbF91c2VyXywzMgorICAgICAgICAuZGF0YQorICAgICAgICAuZ2xvYmwgX19fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkcgorX19fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkcjoKKyAgICAgICAgLmxvbmcgLmdvbXBfY3JpdGljYWxfdXNlcl8KKyMgIGVsc2UgLyogTGludXgqIE9TICovCisgICAgICAgIC5kYXRhCisgICAgICAgIC5jb21tIC5nb21wX2NyaXRpY2FsX3VzZXJfLDMyLDgKKyAgICAgICAgLmRhdGEKKwlBTElHTiA0CisgICAgICAgIC5nbG9iYWwgX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyCitfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHI6CisgICAgICAgIC40Ynl0ZSAuZ29tcF9jcml0aWNhbF91c2VyXworICAgICAgICAudHlwZSBfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIsQG9iamVjdAorICAgICAgICAuc2l6ZSBfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIsNAorIyAgZW5kaWYgLyogZGVmaW5lZCBfX0FQUExFX18gJiYgZGVmaW5lZCBfX01BQ0hfXyAqLworIyBlbmRpZiAvKiBLTVBfQVJDSF9YODYgKi8KKworIyBpZiBLTVBfQVJDSF9YODZfNjQKKyMgIGlmIGRlZmluZWQgX19BUFBMRV9fICYmIGRlZmluZWQgX19NQUNIX18KKyAgICAgICAgLmRhdGEKKyAgICAgICAgLmNvbW0gLmdvbXBfY3JpdGljYWxfdXNlcl8sMzIKKyAgICAgICAgLmRhdGEKKyAgICAgICAgLmdsb2JsIF9fX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIKK19fX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHI6CisgICAgICAgIC5xdWFkIC5nb21wX2NyaXRpY2FsX3VzZXJfCisjICBlbHNlIC8qIExpbnV4KiBPUyAqLworICAgICAgICAuZGF0YQorICAgICAgICAuY29tbSAuZ29tcF9jcml0aWNhbF91c2VyXywzMiw4CisgICAgICAgIC5kYXRhCisJQUxJR04gOAorICAgICAgICAuZ2xvYmFsIF9fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkcgorX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyOgorICAgICAgICAuOGJ5dGUgLmdvbXBfY3JpdGljYWxfdXNlcl8KKyAgICAgICAgLnR5cGUgX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyLEBvYmplY3QKKyAgICAgICAgLnNpemUgX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyLDgKKyMgIGVuZGlmIC8qIGRlZmluZWQgX19BUFBMRV9fICYmIGRlZmluZWQgX19NQUNIX18gKi8KKyMgZW5kaWYgLyogS01QX0FSQ0hfWDg2XzY0ICovCisKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKworCisjaWYgS01QX0FSQ0hfWDg2ICYmICFLTVBfQVJDSF9QUEM2NAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbWljcm90YXNraW5nIHJvdXRpbmVzIHNwZWNpZmljYWxseSB3cml0dGVuIGZvciBJQS0zMiBhcmNoaXRlY3R1cmUKKy8vIHJ1bm5pbmcgTGludXgqIE9TCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKworCS5pZGVudCAiSW50ZWwgQ29ycG9yYXRpb24iCisJLmRhdGEKKwlBTElHTiA0CisvLyB2b2lkCisvLyBfX2ttcF94ODZfcGF1c2UoIHZvaWQgKTsKKy8vCisKKyAgICAgICAgLnRleHQKKwlQUk9DICBfX2ttcF94ODZfcGF1c2UKKworICAgICAgICBwYXVzZV9vcAorICAgICAgICByZXQKKworCURFQlVHX0lORk8gX19rbXBfeDg2X3BhdXNlCisKKy8vCisvLyB2b2lkCisvLyBfX2ttcF94ODZfY3B1aWQoIGludCBtb2RlLCBpbnQgbW9kZTIsIHZvaWQgKmNwdWlkX2J1ZmZlciApOworLy8KKwlQUk9DICBfX2ttcF94ODZfY3B1aWQKKworCXB1c2hsICVlYnAKKwltb3ZsICAlZXNwLCVlYnAKKyAgICAgICAgcHVzaGwgJWVkaQorICAgICAgICBwdXNobCAlZWJ4CisgICAgICAgIHB1c2hsICVlY3gKKyAgICAgICAgcHVzaGwgJWVkeAorCisJbW92bCAgOCglZWJwKSwgJWVheAorCW1vdmwgIDEyKCVlYnApLCAlZWN4CisJY3B1aWQJCQkJLy8gUXVlcnkgdGhlIENQVUlEIGZvciB0aGUgY3VycmVudCBwcm9jZXNzb3IKKworCW1vdmwgIDE2KCVlYnApLCAlZWRpCisJbW92bCAgJWVheCwgMCglZWRpKQorCW1vdmwgICVlYngsIDQoJWVkaSkKKwltb3ZsICAlZWN4LCA4KCVlZGkpCisJbW92bCAgJWVkeCwgMTIoJWVkaSkKKworICAgICAgICBwb3BsICAlZWR4CisgICAgICAgIHBvcGwgICVlY3gKKyAgICAgICAgcG9wbCAgJWVieAorICAgICAgICBwb3BsICAlZWRpCisgICAgICAgIG1vdmwgICVlYnAsICVlc3AKKyAgICAgICAgcG9wbCAgJWVicAorCXJldAorCisJREVCVUdfSU5GTyBfX2ttcF94ODZfY3B1aWQKKworCisjIGlmICFLTVBfQVNNX0lOVFJJTlMKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBrbXBfaW50MzIKKy8vIF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgZCApOworLy8KKworICAgICAgICBQUk9DICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDMyCisKKyAgICAgICAgbW92bCAgICAgIDQoJWVzcCksICVlY3gKKyAgICAgICAgbW92bCAgICAgIDgoJWVzcCksICVlYXgKKyAgICAgICAgbG9jaworICAgICAgICB4YWRkbCAgICAgJWVheCwoJWVjeCkKKyAgICAgICAgcmV0CisKKwlERUJVR19JTkZPIF9fa21wX3Rlc3RfdGhlbl9hZGQzMgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX3hjaGdfZml4ZWQ4CisvLworLy8ga21wX2ludDMyCisvLyBfX2ttcF94Y2hnX2ZpeGVkOCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGQgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CTQoJWVzcCkKKy8vIAlkOgk4KCVlc3ApCisvLworLy8gcmV0dXJuOgklYWwKKworICAgICAgICBQUk9DICBfX2ttcF94Y2hnX2ZpeGVkOAorCisgICAgICAgIG1vdmwgICAgICA0KCVlc3ApLCAlZWN4ICAgIC8vICJwIgorICAgICAgICBtb3ZiICAgICAgOCglZXNwKSwgJWFsCS8vICJkIgorCisgICAgICAgIGxvY2sKKyAgICAgICAgeGNoZ2IgICAgICVhbCwoJWVjeCkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF94Y2hnX2ZpeGVkOAorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfeGNoZ19maXhlZDE2CisvLworLy8ga21wX2ludDE2CisvLyBfX2ttcF94Y2hnX2ZpeGVkMTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IGQgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CTQoJWVzcCkKKy8vIAlkOgk4KCVlc3ApCisvLyByZXR1cm46ICAgICAlYXgKKworICAgICAgICBQUk9DICBfX2ttcF94Y2hnX2ZpeGVkMTYKKworICAgICAgICBtb3ZsICAgICAgNCglZXNwKSwgJWVjeCAgICAvLyAicCIKKyAgICAgICAgbW92dyAgICAgIDgoJWVzcCksICVheAkvLyAiZCIKKworICAgICAgICBsb2NrCisgICAgICAgIHhjaGd3ICAgICAlYXgsKCVlY3gpCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfeGNoZ19maXhlZDE2CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF94Y2hnX2ZpeGVkMzIKKy8vCisvLyBrbXBfaW50MzIKKy8vIF9fa21wX3hjaGdfZml4ZWQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgZCApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJNCglZXNwKQorLy8gCWQ6CTgoJWVzcCkKKy8vCisvLyByZXR1cm46CSVlYXgKKworICAgICAgICBQUk9DICBfX2ttcF94Y2hnX2ZpeGVkMzIKKworICAgICAgICBtb3ZsICAgICAgNCglZXNwKSwgJWVjeCAgICAvLyAicCIKKyAgICAgICAgbW92bCAgICAgIDgoJWVzcCksICVlYXgJLy8gImQiCisKKyAgICAgICAgbG9jaworICAgICAgICB4Y2hnbCAgICAgJWVheCwoJWVjeCkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF94Y2hnX2ZpeGVkMzIKKworCisvLworLy8ga21wX2ludDgKKy8vIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGN2LCBrbXBfaW50OCBzdiApOworLy8KKworICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgKKworICAgICAgICBtb3ZsICAgICAgNCglZXNwKSwgJWVjeAorICAgICAgICBtb3ZiICAgICAgOCglZXNwKSwgJWFsCisgICAgICAgIG1vdmIgICAgICAxMiglZXNwKSwgJWRsCisgICAgICAgIGxvY2sKKyAgICAgICAgY21weGNoZ2IgICVkbCwoJWVjeCkKKyAgICAgICAgc2V0ZSAgICAgICVhbCAgICAgICAgICAgLy8gaWYgJWFsID09ICglZWN4KSBzZXQgJWFsID0gMSBlbHNlIHNldCAlYWwgPSAwCisgICAgICAgIGFuZCAgICAgICAkMSwgJWVheCAgICAgIC8vIHNpZ24gZXh0ZW5kIHByZXZpb3VzIGluc3RydWN0aW9uCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4CisKKy8vCisvLyBrbXBfaW50MTYKKy8vIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IGN2LCBrbXBfaW50MTYgc3YgKTsKKy8vCisKKyAgICAgICAgUFJPQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNgorCisgICAgICAgIG1vdmwgICAgICA0KCVlc3ApLCAlZWN4CisgICAgICAgIG1vdncgICAgICA4KCVlc3ApLCAlYXgKKyAgICAgICAgbW92dyAgICAgIDEyKCVlc3ApLCAlZHgKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hndyAgJWR4LCglZWN4KQorICAgICAgICBzZXRlICAgICAgJWFsICAgICAgICAgICAvLyBpZiAlYXggPT0gKCVlY3gpIHNldCAlYWwgPSAxIGVsc2Ugc2V0ICVhbCA9IDAKKyAgICAgICAgYW5kICAgICAgICQxLCAlZWF4ICAgICAgLy8gc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24KKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2CisKKy8vCisvLyBrbXBfaW50MzIKKy8vIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGN2LCBrbXBfaW50MzIgc3YgKTsKKy8vCisKKyAgICAgICAgUFJPQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMgorCisgICAgICAgIG1vdmwgICAgICA0KCVlc3ApLCAlZWN4CisgICAgICAgIG1vdmwgICAgICA4KCVlc3ApLCAlZWF4CisgICAgICAgIG1vdmwgICAgICAxMiglZXNwKSwgJWVkeAorICAgICAgICBsb2NrCisgICAgICAgIGNtcHhjaGdsICAlZWR4LCglZWN4KQorICAgICAgICBzZXRlICAgICAgJWFsICAgICAgICAgICAvLyBpZiAlZWF4ID09ICglZWN4KSBzZXQgJWFsID0gMSBlbHNlIHNldCAlYWwgPSAwCisgICAgICAgIGFuZCAgICAgICAkMSwgJWVheCAgICAgIC8vIHNpZ24gZXh0ZW5kIHByZXZpb3VzIGluc3RydWN0aW9uCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMgorCisvLworLy8ga21wX2ludDMyCisvLyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBjdiwga21wX2ludDY0IHN2ICk7CisvLworICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0CisKKyAgICAgICAgcHVzaGwgICAgICVlYnAKKyAgICAgICAgbW92bCAgICAgICVlc3AsICVlYnAKKyAgICAgICAgcHVzaGwgICAgICVlYngKKyAgICAgICAgcHVzaGwgICAgICVlZGkKKyAgICAgICAgbW92bCAgICAgIDgoJWVicCksICVlZGkKKyAgICAgICAgbW92bCAgICAgIDEyKCVlYnApLCAlZWF4ICAgICAgICAvLyAiY3YiIGxvdyBvcmRlciB3b3JkCisgICAgICAgIG1vdmwgICAgICAxNiglZWJwKSwgJWVkeCAgICAgICAgLy8gImN2IiBoaWdoIG9yZGVyIHdvcmQKKyAgICAgICAgbW92bCAgICAgIDIwKCVlYnApLCAlZWJ4ICAgICAgICAvLyAic3YiIGxvdyBvcmRlciB3b3JkCisgICAgICAgIG1vdmwgICAgICAyNCglZWJwKSwgJWVjeCAgICAgICAgLy8gInN2IiBoaWdoIG9yZGVyIHdvcmQKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hnOGIgKCVlZGkpCisgICAgICAgIHNldGUgICAgICAlYWwgICAgICAgICAgIC8vIGlmICVlZHg6ZWF4ID09ICglZWRpKSBzZXQgJWFsID0gMSBlbHNlIHNldCAlYWwgPSAwCisgICAgICAgIGFuZCAgICAgICAkMSwgJWVheCAgICAgIC8vIHNpZ24gZXh0ZW5kIHByZXZpb3VzIGluc3RydWN0aW9uCisgICAgICAgIHBvcGwgICAgICAlZWRpCisgICAgICAgIHBvcGwgICAgICAlZWJ4CisgICAgICAgIG1vdmwgICAgICAlZWJwLCAlZXNwCisgICAgICAgIHBvcGwgICAgICAlZWJwCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NAorCisvLworLy8ga21wX2ludDgKKy8vIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCBjdiwga21wX2ludDggc3YgKTsKKy8vCisKKyAgICAgICAgUFJPQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OAorCisgICAgICAgIG1vdmwgICAgICA0KCVlc3ApLCAlZWN4CisgICAgICAgIG1vdmIgICAgICA4KCVlc3ApLCAlYWwKKyAgICAgICAgbW92YiAgICAgIDEyKCVlc3ApLCAlZGwKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hnYiAgJWRsLCglZWN4KQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDgKKworLy8KKy8vIGttcF9pbnQxNgorLy8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IGN2LCBrbXBfaW50MTYgc3YgKTsKKy8vCisKKyAgICAgICAgUFJPQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYKKworICAgICAgICBtb3ZsICAgICAgNCglZXNwKSwgJWVjeAorICAgICAgICBtb3Z3ICAgICAgOCglZXNwKSwgJWF4CisgICAgICAgIG1vdncgICAgICAxMiglZXNwKSwgJWR4CisgICAgICAgIGxvY2sKKyAgICAgICAgY21weGNoZ3cgICVkeCwoJWVjeCkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNgorCisvLworLy8ga21wX2ludDMyCisvLyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgY3YsIGttcF9pbnQzMiBzdiApOworLy8KKworICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMgorCisgICAgICAgIG1vdmwgICAgICA0KCVlc3ApLCAlZWN4CisgICAgICAgIG1vdmwgICAgICA4KCVlc3ApLCAlZWF4CisgICAgICAgIG1vdmwgICAgICAxMiglZXNwKSwgJWVkeAorICAgICAgICBsb2NrCisgICAgICAgIGNtcHhjaGdsICAlZWR4LCglZWN4KQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyCisKKy8vCisvLyBrbXBfaW50NjQKKy8vIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBjdiwga21wX2ludDY0IHN2ICk7CisvLworICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NAorCisgICAgICAgIHB1c2hsICAgICAlZWJwCisgICAgICAgIG1vdmwgICAgICAlZXNwLCAlZWJwCisgICAgICAgIHB1c2hsICAgICAlZWJ4CisgICAgICAgIHB1c2hsICAgICAlZWRpCisgICAgICAgIG1vdmwgICAgICA4KCVlYnApLCAlZWRpCisgICAgICAgIG1vdmwgICAgICAxMiglZWJwKSwgJWVheCAgICAgICAgLy8gImN2IiBsb3cgb3JkZXIgd29yZAorICAgICAgICBtb3ZsICAgICAgMTYoJWVicCksICVlZHggICAgICAgIC8vICJjdiIgaGlnaCBvcmRlciB3b3JkCisgICAgICAgIG1vdmwgICAgICAyMCglZWJwKSwgJWVieCAgICAgICAgLy8gInN2IiBsb3cgb3JkZXIgd29yZAorICAgICAgICBtb3ZsICAgICAgMjQoJWVicCksICVlY3ggICAgICAgIC8vICJzdiIgaGlnaCBvcmRlciB3b3JkCisgICAgICAgIGxvY2sKKyAgICAgICAgY21weGNoZzhiICglZWRpKQorICAgICAgICBwb3BsICAgICAgJWVkaQorICAgICAgICBwb3BsICAgICAgJWVieAorICAgICAgICBtb3ZsICAgICAgJWVicCwgJWVzcAorICAgICAgICBwb3BsICAgICAgJWVicAorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF94Y2hnX3JlYWwzMgorLy8KKy8vIGttcF9yZWFsMzIKKy8vIF9fa21wX3hjaGdfcmVhbDMyKCB2b2xhdGlsZSBrbXBfcmVhbDMyICphZGRyLCBrbXBfcmVhbDMyIGRhdGEgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCWFkZHI6CTQoJWVzcCkKKy8vIAlkYXRhOgk4KCVlc3ApCisvLworLy8gcmV0dXJuOgklZWF4CisKKworICAgICAgICBQUk9DICBfX2ttcF94Y2hnX3JlYWwzMgorCisgICAgICAgIHB1c2hsICAgJWVicAorICAgICAgICBtb3ZsICAgICVlc3AsICVlYnAKKyAgICAgICAgc3VibCAgICAkNCwgJWVzcAorICAgICAgICBwdXNobCAgICVlc2kKKworICAgICAgICBtb3ZsICAgIDQoJWVicCksICVlc2kKKyAgICAgICAgZmxkcyAgICAoJWVzaSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYWQgPGFkZHI+CisgICAgICAgIGZzdHMgICAgLTQoJWVicCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0b3JlIG9sZCB2YWx1ZQorCisgICAgICAgIG1vdmwgICAgOCglZWJwKSwgJWVheAorCisgICAgICAgIGxvY2sKKyAgICAgICAgeGNoZ2wgICAlZWF4LCAoJWVzaSkKKworICAgICAgICBmbGRzICAgIC00KCVlYnApCisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gb2xkIHZhbHVlCisKKyAgICAgICAgcG9wbCAgICAlZXNpCisgICAgICAgIG1vdmwgICAgJWVicCwgJWVzcAorICAgICAgICBwb3BsICAgICVlYnAKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF94Y2hnX3JlYWwzMgorCisjIGVuZGlmIC8qICFLTVBfQVNNX0lOVFJJTlMgKi8KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX3Rlc3RfdGhlbl9hZGRfcmVhbDMyCisvLworLy8ga21wX3JlYWwzMgorLy8gX19rbXBfdGVzdF90aGVuX2FkZF9yZWFsMzIoIHZvbGF0aWxlIGttcF9yZWFsMzIgKmFkZHIsIGttcF9yZWFsMzIgZGF0YSApOworLy8KKworICAgICAgICBQUk9DICBfX2ttcF90ZXN0X3RoZW5fYWRkX3JlYWwzMgorCitfYWRkciA9IDgKK19kYXRhID0gMTIKK19vbGRfdmFsdWUgPSAtNAorX25ld192YWx1ZSA9IC04CisKKyAgICAgICAgcHVzaGwgICAlZWJwCisgICAgICAgIG1vdmwgICAgJWVzcCwgJWVicAorICAgICAgICBzdWJsICAgICQ4LCAlZXNwCisgICAgICAgIHB1c2hsICAgJWVzaQorICAgICAgICBwdXNobCAgICVlYngKKyAgICAgICAgbW92bCAgICBfYWRkciglZWJwKSwgJWVzaQorTDIyOgorICAgICAgICBmbGRzICAgICglZXNpKQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9hZCA8YWRkcj4KKyAgICAgICAgZnN0cyAgICBfb2xkX3ZhbHVlKCVlYnApCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdG9yZSBpbnRvIG9sZF92YWx1ZQorICAgICAgICBmYWRkcyAgIF9kYXRhKCVlYnApCisgICAgICAgIGZzdHBzICAgX25ld192YWx1ZSglZWJwKQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3X3ZhbHVlID0gb2xkX3ZhbHVlICsgZGF0YQorCisgICAgICAgIG1vdmwgICAgX29sZF92YWx1ZSglZWJwKSwgJWVheAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9hZCBvbGRfdmFsdWUKKyAgICAgICAgbW92bCAgICBfbmV3X3ZhbHVlKCVlYnApLCAlZWJ4CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2FkIG5ld192YWx1ZQorCisJbG9jaworCWNtcHhjaGdsICVlYngsKCVlc2kpCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb21wYXJlICVFQVggd2l0aCA8YWRkcj4uICBJZiBlcXVhbCBzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFpGIGFuZCBsb2FkICVFQlggaW50byA8YWRkcj4uICBFbHNlLCBjbGVhcgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gWkYgYW5kIGxvYWQgPGFkZHI+IGludG8gJUVBWC4KKyAgICAgICAgam56ICAgICBMMjIKKworCisgICAgICAgIGZsZHMgICAgX29sZF92YWx1ZSglZWJwKQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIG9sZF92YWx1ZQorICAgICAgICBwb3BsICAgICVlYngKKyAgICAgICAgcG9wbCAgICAlZXNpCisgICAgICAgIG1vdmwgICAgJWVicCwgJWVzcAorICAgICAgICBwb3BsICAgICVlYnAKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF90ZXN0X3RoZW5fYWRkX3JlYWwzMgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX3Rlc3RfdGhlbl9hZGRfcmVhbDY0CisvLworLy8ga21wX3JlYWw2NAorLy8gX19rbXBfdGVzdF90aGVuX2FkZF9yZWFsNjQoIHZvbGF0aWxlIGttcF9yZWFsNjQgKmFkZHIsIGttcF9yZWFsNjQgZGF0YSApOworLy8KKyAgICAgICAgUFJPQyAgX19rbXBfdGVzdF90aGVuX2FkZF9yZWFsNjQKKworX2FkZHIgPSA4CitfZGF0YSA9IDEyCitfb2xkX3ZhbHVlID0gLTgKK19uZXdfdmFsdWUgPSAtMTYKKworICAgICAgICBwdXNobCAgICVlYnAKKyAgICAgICAgbW92bCAgICAlZXNwLCAlZWJwCisgICAgICAgIHN1YmwgICAgJDE2LCAlZXNwCisgICAgICAgIHB1c2hsICAgJWVzaQorICAgICAgICBwdXNobCAgICVlYngKKyAgICAgICAgcHVzaGwgICAlZWN4CisgICAgICAgIHB1c2hsICAgJWVkeAorICAgICAgICBtb3ZsICAgIF9hZGRyKCVlYnApLCAlZXNpCitMNDQ6CisgICAgICAgIGZsZGwgICAgKCVlc2kpCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2FkIDxhZGRyPgorICAgICAgICBmc3RsICAgIF9vbGRfdmFsdWUoJWVicCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0b3JlIGludG8gb2xkX3ZhbHVlCisgICAgICAgIGZhZGRsICAgX2RhdGEoJWVicCkKKyAgICAgICAgZnN0cGwgICBfbmV3X3ZhbHVlKCVlYnApCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgKyBkYXRhCisKKyAgICAgICAgbW92bCAgICBfb2xkX3ZhbHVlKzQoJWVicCksICVlZHgKKyAgICAgICAgbW92bCAgICBfb2xkX3ZhbHVlKCVlYnApLCAlZWF4CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2FkIG9sZF92YWx1ZQorICAgICAgICBtb3ZsICAgIF9uZXdfdmFsdWUrNCglZWJwKSwgJWVjeAorICAgICAgICBtb3ZsICAgIF9uZXdfdmFsdWUoJWVicCksICVlYngKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYWQgbmV3X3ZhbHVlCisKKwlsb2NrCisJY21weGNoZzhiICglZXNpKQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29tcGFyZSAlRURYOiVFQVggd2l0aCA8YWRkcj4uICBJZiBlcXVhbCBzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFpGIGFuZCBsb2FkICVFQ1g6JUVCWCBpbnRvIDxhZGRyPi4gIEVsc2UsIGNsZWFyCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBaRiBhbmQgbG9hZCA8YWRkcj4gaW50byAlRURYOiVFQVguCisgICAgICAgIGpueiAgICAgTDQ0CisKKworICAgICAgICBmbGRsICAgIF9vbGRfdmFsdWUoJWVicCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBvbGRfdmFsdWUKKyAgICAgICAgcG9wbCAgICAlZWR4CisgICAgICAgIHBvcGwgICAgJWVjeAorICAgICAgICBwb3BsICAgICVlYngKKyAgICAgICAgcG9wbCAgICAlZXNpCisgICAgICAgIG1vdmwgICAgJWVicCwgJWVzcAorICAgICAgICBwb3BsICAgICVlYnAKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF90ZXN0X3RoZW5fYWRkX3JlYWw2NAorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZAorLy8KKy8vIHZvaWQKKy8vIF9fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQoIGttcF9pbnQxNiAqcCApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJNCglZXNwKQorLy8KKworICAgICAgICBQUk9DICBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkCisKKyAgICAgICAgbW92bCAgNCglZXNwKSwgJWVheAorICAgICAgICBmbGRjdyAoJWVheCkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZAorLy8KKy8vIHZvaWQKKy8vIF9fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkKCBrbXBfaW50MTYgKnAgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CTQoJWVzcCkKKy8vCisKKyAgICAgICAgUFJPQyAgX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQKKworICAgICAgICBtb3ZsICA0KCVlc3ApLCAlZWF4CisgICAgICAgIGZzdGN3ICglZWF4KQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkCisvLworLy8gdm9pZAorLy8gX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZCgpOworLy8KKy8vCisKKyAgICAgICAgUFJPQyAgX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZAorCisgICAgICAgIGZuY2xleAorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIHR5cGVkZWYgdm9pZAkoKm1pY3JvdGFza190KSggaW50ICpndGlkLCBpbnQgKnRpZCwgLi4uICk7CisvLworLy8gaW50CisvLyBfX2ttcF9pbnZva2VfbWljcm90YXNrKCBtaWNyb3Rhc2tfdCBwa2ZuLCBpbnQgZ3RpZCwgaW50IHRpZCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcmdjLCB2b2lkICpwX2FyZ3ZbXSApIHsKKy8vICAgICgqcGtmbikoICYgZ3RpZCwgJiBndGlkLCBhcmd2WzBdLCAuLi4gKTsKKy8vICAgIHJldHVybiAxOworLy8gfQorCisvLyAtLSBCZWdpbiBfX2ttcF9pbnZva2VfbWljcm90YXNrCisvLyBtYXJrX2JlZ2luOworCVBST0MgIF9fa21wX2ludm9rZV9taWNyb3Rhc2sKKworCXB1c2hsICVlYnAKKwltb3ZsICVlc3AsJWVicAkJLy8gZXN0YWJsaXNoIHRoZSBiYXNlIHBvaW50ZXIgZm9yIHRoaXMgcm91dGluZS4KKwlzdWJsICQ4LCVlc3AJCS8vIGFsbG9jYXRlIHNwYWNlIGZvciB0d28gbG9jYWwgdmFyaWFibGVzLgorCQkJCS8vIFRoZXNlIHZhcmliYWxlcyBhcmU6CisJCQkJLy8JYXJndjogLTQoJWVicCkKKwkJCQkvLwl0ZW1wOiAtOCglZWJwKQorCQkJCS8vCisJcHVzaGwgJWVieAkJLy8gc2F2ZSAlZWJ4IHRvIHVzZSBkdXJpbmcgdGhpcyByb3V0aW5lCisJCQkJLy8KKwltb3ZsIDIwKCVlYnApLCVlYngJLy8gU3RhY2sgYWxpZ25tZW50IC0gIyBhcmdzCisJYWRkbCAkMiwlZWJ4CQkvLyAjYXJncyArMiAgQWx3YXlzIHBhc3MgYXQgbGVhc3QgMiBhcmdzIChndGlkIGFuZCB0aWQpCisJc2hsbCAkMiwlZWJ4CQkvLyBOdW1iZXIgb2YgYnl0ZXMgdXNlZCBvbiBzdGFjazogKCNhcmdzKzIpKjQKKwltb3ZsICVlc3AsJWVheAkJLy8KKwlzdWJsICVlYngsJWVheAkJLy8gJWVzcC0oKCNhcmdzKzIpKjQpIC0+ICVlYXggLS0gd2l0aG91dCBtb2RzLCBzdGFjayBwdHIgd291bGQgYmUgdGhpcworCW1vdmwgJWVheCwlZWJ4CQkvLyBTYXZlIHRvICVlYngKKwlhbmRsICQweEZGRkZGRjgwLCVlYXgJLy8gbWFzayBvZmYgNyBiaXRzCisJc3VibCAlZWF4LCVlYngJCS8vIEFtb3VudCB0byBzdWJ0cmFjdCBmcm9tICVlc3AKKwlzdWJsICVlYngsJWVzcAkJLy8gUHJlcGFyZSB0aGUgc3RhY2sgcHRyIC0tCisJCQkJLy8gICBub3cgaXQgd2lsbCBiZSBhbGlnbmVkIG9uIDEyOC1ieXRlIGJvdW5kYXJ5IGF0IHRoZSBjYWxsCisKKwltb3ZsIDI0KCVlYnApLCVlYXgJLy8gY29weSBmcm9tIHBfYXJndltdCisJbW92bCAlZWF4LC00KCVlYnApCS8vIGludG8gdGhlIGxvY2FsIHZhcmlhYmxlICphcmd2LgorCisJbW92bCAyMCglZWJwKSwlZWJ4CS8vIGFyZ2MgaXMgMjAoJWVicCkKKwlzaGxsICQyLCVlYngKKworLmludm9rZV8yOgorCWNtcGwgJDAsJWVieAorCWpnICAuaW52b2tlXzQKKwlqbXAgLmludm9rZV8zCisJQUxJR04gMgorLmludm9rZV80OgorCW1vdmwgLTQoJWVicCksJWVheAorCXN1YmwgJDQsJWVieAkJCS8vIGRlY3JlbWVudCBhcmdjLgorCWFkZGwgJWVieCwlZWF4CQkJLy8gaW5kZXggaW50byBhcmd2LgorCW1vdmwgKCVlYXgpLCVlZHgKKwlwdXNobCAlZWR4CisKKwlqbXAgLmludm9rZV8yCisJQUxJR04gMgorLmludm9rZV8zOgorCWxlYWwgMTYoJWVicCksJWVheAkJLy8gcHVzaCAmIHRpZAorCXB1c2hsICVlYXgKKworCWxlYWwgMTIoJWVicCksJWVheAkJLy8gcHVzaCAmIGd0aWQKKwlwdXNobCAlZWF4CisKKwltb3ZsIDgoJWVicCksJWVieAorCWNhbGwgKiVlYngJCQkvLyBjYWxsICgqcGtmbikoKTsKKworCW1vdmwgJDEsJWVheAkJCS8vIHJldHVybiAxOworCisJbW92bCAtMTIoJWVicCksJWVieAkJLy8gcmVzdG9yZSAlZWJ4CisJbGVhdmUKKwlyZXQKKworCURFQlVHX0lORk8gX19rbXBfaW52b2tlX21pY3JvdGFzaworLy8gLS0gRW5kICBfX2ttcF9pbnZva2VfbWljcm90YXNrCisKKworLy8ga21wX3VpbnQ2NAorLy8gX19rbXBfaGFyZHdhcmVfdGltZXN0YW1wKHZvaWQpCisJUFJPQyAgX19rbXBfaGFyZHdhcmVfdGltZXN0YW1wCisJcmR0c2MKKwlyZXQKKworCURFQlVHX0lORk8gX19rbXBfaGFyZHdhcmVfdGltZXN0YW1wCisvLyAtLSBFbmQgIF9fa21wX2hhcmR3YXJlX3RpbWVzdGFtcAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiAqLworCisKKyNpZiBLTVBfQVJDSF9YODZfNjQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1pY3JvdGFza2luZyByb3V0aW5lcyBzcGVjaWZpY2FsbHkgd3JpdHRlbiBmb3IgSUEtMzIgYXJjaGl0ZWN0dXJlIGFuZAorLy8gSW50ZWwoUikgNjQgcnVubmluZyBMaW51eCogT1MKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIC0tIE1hY2hpbmUgdHlwZSBQCisvLyBtYXJrX2Rlc2NyaXB0aW9uICJJbnRlbCBDb3Jwb3JhdGlvbiI7CisJLmlkZW50ICJJbnRlbCBDb3Jwb3JhdGlvbiIKKy8vIC0tCS5maWxlICJ6X0xpbnV4X2FzbS5zIgorCS5kYXRhCisJQUxJR04gNAorCisvLyBBQzogVGhlIGZvbGxvd2luZyAjaWYgaGlkZW4gdGhlIC50ZXh0IHRodXMgbW92aW5nIHRoZSByZXN0IG9mIGNvZGUgaW50byAuZGF0YSBzZWN0aW9uIG9uIE1JQy4KKy8vIFRvIHByZXZlbnQgdGhpcyBpbiBmdXR1cmUgLnRleHQgYWRkZWQgdG8gZXZlcnkgcm91dGluZSBkZWZpbml0aW9uIGZvciB4ODZfNjQuCisjIGlmIF9fTUlDX18gfHwgX19NSUMyX18KKworIyBlbHNlCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfeDg2X3BhdXNlCisvLworLy8gdm9pZAorLy8gX19rbXBfeDg2X3BhdXNlKCB2b2lkICk7CisvLworCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX3g4Nl9wYXVzZQorCisgICAgICAgIHBhdXNlX29wCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfeDg2X3BhdXNlCisKKyMgZW5kaWYgLy8gX19NSUNfXyB8fCBfX01JQzJfXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX3g4Nl9jcHVpZAorLy8KKy8vIHZvaWQKKy8vIF9fa21wX3g4Nl9jcHVpZCggaW50IG1vZGUsIGludCBtb2RlMiwgdm9pZCAqY3B1aWRfYnVmZmVyICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAltb2RlOgkJJWVkaQorLy8gCW1vZGUyOgkJJWVzaQorLy8gCWNwdWlkX2J1ZmZlcjoJJXJkeAorCisgICAgICAgIC50ZXh0CisJUFJPQyAgX19rbXBfeDg2X2NwdWlkCisKKwlwdXNocSAgJXJicAorCW1vdnEgICAlcnNwLCVyYnAKKyAgICAgICAgcHVzaHEgICVyYngJCQkvLyBjYWxsZWUtc2F2ZSByZWdpc3RlcgorCisJbW92bCAgICVlc2ksICVlY3gJCS8vICJtb2RlMiIKKwltb3ZsICAgJWVkaSwgJWVheAkJLy8gIm1vZGUiCisgICAgICAgIG1vdnEgICAlcmR4LCAlcnNpICAgICAgICAgICAgICAgLy8gY3B1aWRfYnVmZmVyCisJY3B1aWQJCQkJLy8gUXVlcnkgdGhlIENQVUlEIGZvciB0aGUgY3VycmVudCBwcm9jZXNzb3IKKworCW1vdmwgICAlZWF4LCAwKCVyc2kpCQkvLyBzdG9yZSByZXN1bHRzIGludG8gYnVmZmVyCisJbW92bCAgICVlYngsIDQoJXJzaSkKKwltb3ZsICAgJWVjeCwgOCglcnNpKQorCW1vdmwgICAlZWR4LCAxMiglcnNpKQorCisgICAgICAgIHBvcHEgICAlcmJ4CQkJLy8gY2FsbGVlLXNhdmUgcmVnaXN0ZXIKKyAgICAgICAgbW92cSAgICVyYnAsICVyc3AKKyAgICAgICAgcG9wcSAgICVyYnAKKwlyZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX3g4Nl9jcHVpZAorCisKKworIyBpZiAhS01QX0FTTV9JTlRSSU5TCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfdGVzdF90aGVuX2FkZDMyCisvLworLy8ga21wX2ludDMyCisvLyBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGQgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CSVyZGkKKy8vIAlkOgklZXNpCisvLworLy8gcmV0dXJuOgklZWF4CisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfdGVzdF90aGVuX2FkZDMyCisKKyAgICAgICAgbW92bCAgICAgICVlc2ksICVlYXgJLy8gImQiCisgICAgICAgIGxvY2sKKyAgICAgICAgeGFkZGwgICAgICVlYXgsKCVyZGkpCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfdGVzdF90aGVuX2FkZDMyCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF90ZXN0X3RoZW5fYWRkNjQKKy8vCisvLyBrbXBfaW50NjQKKy8vIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgZCApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJJXJkaQorLy8gCWQ6CSVyc2kKKy8vCXJldHVybjoJJXJheAorCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NAorCisgICAgICAgIG1vdnEgICAgICAlcnNpLCAlcmF4CS8vICJkIgorICAgICAgICBsb2NrCisgICAgICAgIHhhZGRxICAgICAlcmF4LCglcmRpKQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NAorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfeGNoZ19maXhlZDgKKy8vCisvLyBrbXBfaW50MzIKKy8vIF9fa21wX3hjaGdfZml4ZWQ4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggZCApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJJXJkaQorLy8gCWQ6CSVzaWwKKy8vCisvLyByZXR1cm46CSVhbAorCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX3hjaGdfZml4ZWQ4CisKKyAgICAgICAgbW92YiAgICAgICVzaWwsICVhbAkvLyAiZCIKKworICAgICAgICBsb2NrCisgICAgICAgIHhjaGdiICAgICAlYWwsKCVyZGkpCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfeGNoZ19maXhlZDgKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX3hjaGdfZml4ZWQxNgorLy8KKy8vIGttcF9pbnQxNgorLy8gX19rbXBfeGNoZ19maXhlZDE2KCB2b2xhdGlsZSBrbXBfaW50MTYgKnAsIGttcF9pbnQxNiBkICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgklcmRpCisvLyAJZDoJJXNpCisvLyByZXR1cm46ICAgICAlYXgKKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF94Y2hnX2ZpeGVkMTYKKworICAgICAgICBtb3Z3ICAgICAgJXNpLCAlYXgJLy8gImQiCisKKyAgICAgICAgbG9jaworICAgICAgICB4Y2hndyAgICAgJWF4LCglcmRpKQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX3hjaGdfZml4ZWQxNgorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfeGNoZ19maXhlZDMyCisvLworLy8ga21wX2ludDMyCisvLyBfX2ttcF94Y2hnX2ZpeGVkMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGQgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CSVyZGkKKy8vIAlkOgklZXNpCisvLworLy8gcmV0dXJuOgklZWF4CisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfeGNoZ19maXhlZDMyCisKKyAgICAgICAgbW92bCAgICAgICVlc2ksICVlYXgJLy8gImQiCisKKyAgICAgICAgbG9jaworICAgICAgICB4Y2hnbCAgICAgJWVheCwoJXJkaSkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF94Y2hnX2ZpeGVkMzIKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX3hjaGdfZml4ZWQ2NAorLy8KKy8vIGttcF9pbnQ2NAorLy8gX19rbXBfeGNoZ19maXhlZDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBkICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgklcmRpCisvLyAJZDoJJXJzaQorLy8gcmV0dXJuOgklcmF4CisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfeGNoZ19maXhlZDY0CisKKyAgICAgICAgbW92cSAgICAgICVyc2ksICVyYXgJLy8gImQiCisKKyAgICAgICAgbG9jaworICAgICAgICB4Y2hncSAgICAgJXJheCwoJXJkaSkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF94Y2hnX2ZpeGVkNjQKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOAorLy8KKy8vIGttcF9pbnQ4CisvLyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCBjdiwga21wX2ludDggc3YgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CSVyZGkKKy8vIAljdjoJJWVzaQorLy8Jc3Y6CSVlZHgKKy8vCisvLyByZXR1cm46CSVlYXgKKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgKKworICAgICAgICBtb3ZiICAgICAgJXNpbCwgJWFsCS8vICJjdiIKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hnYiAgJWRsLCglcmRpKQorICAgICAgICBzZXRlICAgICAgJWFsICAgICAgICAgICAvLyBpZiAlYWwgPT0gKCVyZGkpIHNldCAlYWwgPSAxIGVsc2Ugc2V0ICVhbCA9IDAKKyAgICAgICAgYW5kcSAgICAgICQxLCAlcmF4ICAgICAgLy8gc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gZm9yIHJldHVybiB2YWx1ZQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOAorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNgorLy8KKy8vIGttcF9pbnQxNgorLy8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgY3YsIGttcF9pbnQxNiBzdiApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJJXJkaQorLy8gCWN2Ogklc2kKKy8vCXN2OgklZHgKKy8vCisvLyByZXR1cm46CSVlYXgKKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2CisKKyAgICAgICAgbW92dyAgICAgICVzaSwgJWF4CS8vICJjdiIKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hndyAgJWR4LCglcmRpKQorICAgICAgICBzZXRlICAgICAgJWFsICAgICAgICAgICAvLyBpZiAlYXggPT0gKCVyZGkpIHNldCAlYWwgPSAxIGVsc2Ugc2V0ICVhbCA9IDAKKyAgICAgICAgYW5kcSAgICAgICQxLCAlcmF4ICAgICAgLy8gc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gZm9yIHJldHVybiB2YWx1ZQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIKKy8vCisvLyBrbXBfaW50MzIKKy8vIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGN2LCBrbXBfaW50MzIgc3YgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CSVyZGkKKy8vIAljdjoJJWVzaQorLy8Jc3Y6CSVlZHgKKy8vCisvLyByZXR1cm46CSVlYXgKKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyCisKKyAgICAgICAgbW92bCAgICAgICVlc2ksICVlYXgJLy8gImN2IgorICAgICAgICBsb2NrCisgICAgICAgIGNtcHhjaGdsICAlZWR4LCglcmRpKQorICAgICAgICBzZXRlICAgICAgJWFsICAgICAgICAgICAvLyBpZiAlZWF4ID09ICglcmRpKSBzZXQgJWFsID0gMSBlbHNlIHNldCAlYWwgPSAwCisgICAgICAgIGFuZHEgICAgICAkMSwgJXJheCAgICAgIC8vIHNpZ24gZXh0ZW5kIHByZXZpb3VzIGluc3RydWN0aW9uIGZvciByZXR1cm4gdmFsdWUKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0CisvLworLy8ga21wX2ludDMyCisvLyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBjdiwga21wX2ludDY0IHN2ICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgklcmRpCisvLyAJY3Y6CSVyc2kKKy8vCXN2OgklcmR4CisvLwlyZXR1cm46CSVlYXgKKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0CisKKyAgICAgICAgbW92cSAgICAgICVyc2ksICVyYXggICAgLy8gImN2IgorICAgICAgICBsb2NrCisgICAgICAgIGNtcHhjaGdxICAlcmR4LCglcmRpKQorICAgICAgICBzZXRlICAgICAgJWFsICAgICAgICAgICAvLyBpZiAlcmF4ID09ICglcmRpKSBzZXQgJWFsID0gMSBlbHNlIHNldCAlYWwgPSAwCisgICAgICAgIGFuZHEgICAgICAkMSwgJXJheCAgICAgIC8vIHNpZ24gZXh0ZW5kIHByZXZpb3VzIGluc3RydWN0aW9uIGZvciByZXR1cm4gdmFsdWUKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OAorLy8KKy8vIGttcF9pbnQ4CisvLyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggY3YsIGttcF9pbnQ4IHN2ICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgklcmRpCisvLyAJY3Y6CSVlc2kKKy8vCXN2OgklZWR4CisvLworLy8gcmV0dXJuOgklZWF4CisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OAorCisgICAgICAgIG1vdmIgICAgICAlc2lsLCAlYWwJLy8gImN2IgorICAgICAgICBsb2NrCisgICAgICAgIGNtcHhjaGdiICAlZGwsKCVyZGkpCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OAorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYKKy8vCisvLyBrbXBfaW50MTYKKy8vIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTZfcmV0KCB2b2xhdGlsZSBrbXBfaW50MTYgKnAsIGttcF9pbnQxNiBjdiwga21wX2ludDE2IHN2ICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgklcmRpCisvLyAJY3Y6CSVzaQorLy8Jc3Y6CSVkeAorLy8KKy8vIHJldHVybjoJJWVheAorCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2CisKKyAgICAgICAgbW92dyAgICAgICVzaSwgJWF4CS8vICJjdiIKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hndyAgJWR4LCglcmRpKQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMgorLy8KKy8vIGttcF9pbnQzMgorLy8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGN2LCBrbXBfaW50MzIgc3YgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CSVyZGkKKy8vIAljdjoJJWVzaQorLy8Jc3Y6CSVlZHgKKy8vCisvLyByZXR1cm46CSVlYXgKKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMgorCisgICAgICAgIG1vdmwgICAgICAlZXNpLCAlZWF4CS8vICJjdiIKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hnbCAgJWVkeCwoJXJkaSkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMgorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQKKy8vCisvLyBrbXBfaW50NjQKKy8vIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBjdiwga21wX2ludDY0IHN2ICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgklcmRpCisvLyAJY3Y6CSVyc2kKKy8vCXN2OgklcmR4CisvLwlyZXR1cm46CSVlYXgKKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NAorCisgICAgICAgIG1vdnEgICAgICAlcnNpLCAlcmF4ICAgIC8vICJjdiIKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hncSAgJXJkeCwoJXJkaSkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NAorCisjIGVuZGlmIC8qICFLTVBfQVNNX0lOVFJJTlMgKi8KKworCisjIGlmICEgKF9fTUlDX18gfHwgX19NSUMyX18pCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfdGVzdF90aGVuX2FkZF9yZWFsMzIKKy8vCisvLyBrbXBfcmVhbDMyCisvLyBfX2ttcF90ZXN0X3RoZW5fYWRkX3JlYWwzMiggdm9sYXRpbGUga21wX3JlYWwzMiAqYWRkciwga21wX3JlYWwzMiBkYXRhICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlhZGRyOgklcmRpCisvLyAJZGF0YToJJXhtbTAgKGxvd2VyIDQgYnl0ZXMpCisvLworLy8gcmV0dXJuOgkleG1tMCAobG93ZXIgNCBieXRlcykKKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF90ZXN0X3RoZW5fYWRkX3JlYWwzMgorMToKKwltb3ZzcyAgICglcmRpKSwgJXhtbTEJLy8gbG9hZCB2YWx1ZSBvZiA8YWRkcj4KKwltb3ZkCSV4bW0xLCAlZWF4CS8vIHNhdmUgb2xkIHZhbHVlIG9mIDxhZGRyPgorCisJYWRkc3MJJXhtbTAsICV4bW0xCS8vIG5ldyB2YWx1ZSA9IG9sZCB2YWx1ZSArIDxkYXRhPgorCW1vdmQJJXhtbTEsICVlY3gJLy8gbW92ZSBuZXcgdmFsdWUgdG8gR1AgcmVnLgorCisJbG9jaworCWNtcHhjaGdsICVlY3gsICglcmRpKQkvLyBDb21wYXJlICVFQVggd2l0aCA8YWRkcj4uICBJZiBlcXVhbCBzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCS8vIFpGIGFuZCBleGNoYW5nZSAlRUNYIHdpdGggPGFkZHI+LiAgRWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgWkYgYW5kIGxvYWQgPGFkZHI+IGludG8gJUVBWC4KKyAgICAgICAganogICAgICAyZgorCXBhdXNlX29wCisJam1wCTFiCisyOgorCW1vdmQJJWVheCwgJXhtbTAJLy8gbG9hZCBvbGQgdmFsdWUgaW50byByZXR1cm4gcmVnaXN0ZXIKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF90ZXN0X3RoZW5fYWRkX3JlYWwzMgorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfdGVzdF90aGVuX2FkZF9yZWFsNjQKKy8vCisvLyBrbXBfcmVhbDY0CisvLyBfX2ttcF90ZXN0X3RoZW5fYWRkX3JlYWw2NCggdm9sYXRpbGUga21wX3JlYWw2NCAqYWRkciwga21wX3JlYWw2NCBkYXRhICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vICAgICAgYWRkcjogICAlcmRpCisvLyAgICAgIGRhdGE6ICAgJXhtbTAgKGxvd2VyIDggYnl0ZXMpCisvLyAgICAgIHJldHVybjogJXhtbTAgKGxvd2VyIDggYnl0ZXMpCisvLworCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX3Rlc3RfdGhlbl9hZGRfcmVhbDY0CisxOgorICAgICAgICBtb3ZscGQJKCVyZGkpLCAleG1tMQkvLyBsb2FkIHZhbHVlIG9mIDxhZGRyPgorCW1vdmQJJXhtbTEsICVyYXgJLy8gc2F2ZSBvbGQgdmFsdWUgb2YgPGFkZHI+CisKKwlhZGRzZAkleG1tMCwgJXhtbTEJLy8gbmV3IHZhbHVlID0gb2xkIHZhbHVlICsgPGRhdGE+CisJbW92ZAkleG1tMSwgJXJjeAkvLyBtb3ZlIG5ldyB2YWx1ZSB0byBHUCByZWcuCisKKwlsb2NrCisJY21weGNoZ3EgICVyY3gsICglcmRpKSAJLy8gQ29tcGFyZSAlUkFYIHdpdGggPGFkZHI+LiAgSWYgZXF1YWwgc2V0CisJCQkJLy8gWkYgYW5kIGV4Y2hhbmdlICVSQ1ggd2l0aCA8YWRkcj4uICBFbHNlLAorCQkJCS8vIGNsZWFyIFpGIGFuZCBsb2FkIDxhZGRyPiBpbnRvICVSQVguCisgICAgICAgIGp6ICAgICAgMmYKKwlwYXVzZV9vcAorCWptcCAgICAgMWIKKworMjoKKwltb3ZkCSVyYXgsICV4bW0wCS8vIGxvYWQgb2xkIHZhbHVlIGludG8gcmV0dXJuIHJlZ2lzdGVyCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfdGVzdF90aGVuX2FkZF9yZWFsNjQKKworCisjIGlmICFLTVBfQVNNX0lOVFJJTlMKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF94Y2hnX3JlYWwzMgorLy8KKy8vIGttcF9yZWFsMzIKKy8vIF9fa21wX3hjaGdfcmVhbDMyKCB2b2xhdGlsZSBrbXBfcmVhbDMyICphZGRyLCBrbXBfcmVhbDMyIGRhdGEgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCWFkZHI6CSVyZGkKKy8vIAlkYXRhOgkleG1tMCAobG93ZXIgNCBieXRlcykKKy8vCisvLyByZXR1cm46CSV4bW0wIChsb3dlciA0IGJ5dGVzKQorCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX3hjaGdfcmVhbDMyCisKKwltb3ZkCSV4bW0wLCAlZWF4CS8vIGxvYWQgImRhdGEiIHRvIGVheAorCisgICAgICAgICBsb2NrCisgICAgICAgICB4Y2hnbCAlZWF4LCAoJXJkaSkKKworCW1vdmQJJWVheCwgJXhtbTAJLy8gbG9hZCBvbGQgdmFsdWUgaW50byByZXR1cm4gcmVnaXN0ZXIKKworICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX3hjaGdfcmVhbDMyCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF94Y2hnX3JlYWw2NAorLy8KKy8vIGttcF9yZWFsNjQKKy8vIF9fa21wX3hjaGdfcmVhbDY0KCB2b2xhdGlsZSBrbXBfcmVhbDY0ICphZGRyLCBrbXBfcmVhbDY0IGRhdGEgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gICAgICBhZGRyOiAgICVyZGkKKy8vICAgICAgZGF0YTogICAleG1tMCAobG93ZXIgOCBieXRlcykKKy8vICAgICAgcmV0dXJuOiAleG1tMCAobG93ZXIgOCBieXRlcykKKy8vCisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfeGNoZ19yZWFsNjQKKworCW1vdmQJJXhtbTAsICVyYXgJLy8gbG9hZCAiZGF0YSIgdG8gcmF4CisKKyAgICAgICAgIGxvY2sKKwl4Y2hncSAgJXJheCwgKCVyZGkpCisKKwltb3ZkCSVyYXgsICV4bW0wCS8vIGxvYWQgb2xkIHZhbHVlIGludG8gcmV0dXJuIHJlZ2lzdGVyCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfeGNoZ19yZWFsNjQKKworCisjIGVuZGlmIC8qICEoX19NSUNfXyB8fCBfX01JQzJfXykgKi8KKworIyBlbmRpZiAvKiAhS01QX0FTTV9JTlRSSU5TICovCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkCisvLworLy8gdm9pZAorLy8gX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZCgga21wX2ludDE2ICpwICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgklcmRpCisvLworCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQKKworICAgICAgICBmbGRjdyAoJXJkaSkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZAorLy8KKy8vIHZvaWQKKy8vIF9fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkKCBrbXBfaW50MTYgKnAgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CSVyZGkKKy8vCisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQKKworICAgICAgICBmc3RjdyAoJXJkaSkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZAorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZAorLy8KKy8vIHZvaWQKKy8vIF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQoKTsKKy8vCisvLworCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQKKworI2lmIF9fTUlDX18gfHwgX19NSUMyX18KKy8vIFRPRE86IHJlbW92ZSB0aGUgd29ya2Fyb3VuZCBmb3IgcHJvYmxlbSB3aXRoIGZuY2xleCBpbnN0cnVjdGlvbiAobm8gQ1Ega25vd24pCisgICAgICAgIGZzdGVudiAgLTMyKCVyc3ApICAgICAgICAgICAgICAvLyBzdG9yZSBGUCBlbnYKKyAgICAgICAgYW5kdyAgICAkfjB4ODBmZiwgNC0zMiglcnNwKSAgIC8vIGNsZWFyIDAtNywxNSBiaXRzIG9mIEZQIFNXCisgICAgICAgIGZsZGVudiAgLTMyKCVyc3ApICAgICAgICAgICAgICAvLyBsb2FkIEZQIGVudiBiYWNrCisgICAgICAgIHJldAorI2Vsc2UKKyAgICAgICAgZm5jbGV4CisgICAgICAgIHJldAorI2VuZGlmCisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyB0eXBlZGVmIHZvaWQJKCptaWNyb3Rhc2tfdCkoIGludCAqZ3RpZCwgaW50ICp0aWQsIC4uLiApOworLy8KKy8vIGludAorLy8gX19rbXBfaW52b2tlX21pY3JvdGFzayggdm9pZCAoKnBrZm4pIChpbnQgKmd0aWQsIGludCAqdGlkLCAuLi4pLAorLy8JCSAgICAgICAgICAgaW50IGd0aWQsIGludCB0aWQsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJnYywgdm9pZCAqcF9hcmd2W10gKSB7CisvLyAgICAoKnBrZm4pKCAmIGd0aWQsICYgdGlkLCBhcmd2WzBdLCAuLi4gKTsKKy8vICAgIHJldHVybiAxOworLy8gfQorLy8KKy8vIG5vdGU6CisvLwlhdCBjYWxsIHRvIHBrZm4gbXVzdCBoYXZlICVyc3AgMTI4LWJ5dGUgYWxpZ25lZCBmb3IgY29tcGlsZXIKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gICAgICAlcmRpOiAgCXBrZm4KKy8vCSVlc2k6CWd0aWQKKy8vCSVlZHg6CXRpZAorLy8JJWVjeDoJYXJnYworLy8JJXI4OglwX2FyZ3YKKy8vCisvLyBsb2NhbHM6CisvLwlfX2d0aWQ6CWd0aWQgcGFybSBwdXNoZWQgb24gc3RhY2sgc28gY2FuIHBhc3MgJmd0aWQgdG8gcGtmbgorLy8JX190aWQ6CXRpZCBwYXJtIHB1c2hlZCBvbiBzdGFjayBzbyBjYW4gcGFzcyAmdGlkIHRvIHBrZm4KKy8vCisvLyByZWcgdGVtcHM6CisvLwklcmF4Ogl1c2VkIGFsbCBvdmVyIHRoZSBwbGFjZQorLy8JJXJkeDoJdXNlZCBpbiBzdGFjayBwb2ludGVyIGFsaWdubWVudCBjYWxjdWxhdGlvbgorLy8JJXIxMToJdXNlZCB0byB0cmF2ZXJzZSBwX2FyZ3YgYXJyYXkKKy8vCSVyc2k6CXVzZWQgYXMgdGVtcG9yYXJ5IGZvciBzdGFjayBwYXJhbWV0ZXJzCisvLwkJdXNlZCBhcyB0ZW1wb3JhcnkgZm9yIG51bWJlciBvZiBwa2ZuIHBhcm1zIHRvIHB1c2gKKy8vCSVyYng6CXVzZWQgdG8gaG9sZCBwa2ZuIGFkZHJlc3MsIGFuZCB6ZXJvIGNvbnN0YW50LCBjYWxsZWUtc2F2ZQorLy8KKy8vIHJldHVybjoJJWVheCAJKGFsd2F5cyAxL1RSVUUpCisvLworCitfX2d0aWQgPSAtMTYKK19fdGlkID0gLTI0CisKKy8vIC0tIEJlZ2luIF9fa21wX2ludm9rZV9taWNyb3Rhc2sKKy8vIG1hcmtfYmVnaW47CisgICAgICAgIC50ZXh0CisJUFJPQyAgX19rbXBfaW52b2tlX21pY3JvdGFzaworCisJcHVzaHEgCSVyYnAJCS8vIHNhdmUgYmFzZSBwb2ludGVyCisJbW92cSAJJXJzcCwlcmJwCS8vIGVzdGFibGlzaCB0aGUgYmFzZSBwb2ludGVyIGZvciB0aGlzIHJvdXRpbmUuCisJcHVzaHEgCSVyYngJCS8vICVyYnggaXMgY2FsbGVlLXNhdmVkIHJlZ2lzdGVyCisKKwlwdXNocQklcnNpCQkvLyBQdXQgZ3RpZCBvbiBzdGFjayBzbyBjYW4gcGFzcyAmdGdpZCB0byBwa2ZuCisJcHVzaHEJJXJkeAkJLy8gUHV0IHRpZCBvbiBzdGFjayBzbyBjYW4gcGFzcyAmdGlkIHRvIHBrZm4KKworCW1vdnEJJXJjeCwgJXJheAkvLyBTdGFjayBhbGlnbm1lbnQgY2FsY3VsYXRpb24gYmVnaW5zOyBhcmdjIC0+ICVyYXgKKwltb3ZxCSQwLCAlcmJ4CS8vIGNvbnN0YW50IGZvciBjbW92cyBsYXRlcgorCXN1YnEJJDQsICVyYXgJLy8gc3VidHJhY3QgZm91ciBhcmdzIHBhc3NlZCBpbiByZWdpc3RlcnMgdG8gcGtmbgorI2lmIF9fTUlDX18gfHwgX19NSUMyX18KKwlqcwlMX2ttcF8wCQkvLyBqdW1wIHRvIG1vdnEKKwlqbXAJTF9rbXBfMF9leGl0CS8vIGp1bXAgYWhlYWQKK0xfa21wXzA6CisJbW92cQklcmJ4LCAlcmF4CS8vIHplcm8gbmVnYXRpdmUgdmFsdWUgaW4gJXJheCA8LSBtYXgoMCwgYXJnYy00KQorTF9rbXBfMF9leGl0OgorI2Vsc2UKKwljbW92c3EJJXJieCwgJXJheAkvLyB6ZXJvIG5lZ2F0aXZlIHZhbHVlIGluICVyYXggPC0gbWF4KDAsIGFyZ2MtNCkKKyNlbmRpZiAvLyBfX01JQ19fIHx8IF9fTUlDMl9fCisKKwltb3ZxCSVyYXgsICVyc2kJLy8gc2F2ZSBtYXgoMCwgYXJnYy00KSAtPiAlcnNpIGZvciBsYXRlcgorCXNobHEgCSQzLCAlcmF4CS8vIE51bWJlciBvZiBieXRlcyB1c2VkIG9uIHN0YWNrOiBtYXgoMCwgYXJnYy00KSo4CisKKwltb3ZxIAklcnNwLCAlcmR4CS8vCisJc3VicSAJJXJheCwgJXJkeAkvLyAlcnNwLShtYXgoMCxhcmdjLTQpKjgpIC0+ICVyZHggLS0KKwkJCQkvLyB3aXRob3V0IGFsaWduLCBzdGFjayBwdHIgd291bGQgYmUgdGhpcworCW1vdnEgCSVyZHgsICVyYXgJLy8gU2F2ZSB0byAlcmF4CisKKwlhbmRxIAkkMHhGRkZGRkZGRkZGRkZGRjgwLCAlcmF4ICAvLyBtYXNrIG9mZiBsb3dlciA3IGJpdHMgKDEyOCBieXRlcyBhbGlnbikKKwlzdWJxIAklcmF4LCAlcmR4CS8vIEFtb3VudCB0byBzdWJ0cmFjdCBmcm9tICVyc3AKKwlzdWJxIAklcmR4LCAlcnNwCS8vIFByZXBhcmUgdGhlIHN0YWNrIHB0ciAtLQorCQkJCS8vIG5vdyAlcnNwIHdpbGwgYWxpZ24gdG8gMTI4LWJ5dGUgYm91bmRhcnkgYXQgY2FsbCBzaXRlCisKKwkJCQkvLyBzZXR1cCBwa2ZuIHBhcmFtZXRlciByZWcgYW5kIHN0YWNrCisJbW92cQklcmN4LCAlcmF4CS8vIGFyZ2MgLT4gJXJheAorCWNtcHEJJDAsICVyc2kKKwlqZQlMX2ttcF9pbnZva2VfcGFzc19wYXJtcwkvLyBqdW1wIGFoZWFkIGlmIG5vIHBhcm1zIHRvIHB1c2gKKwlzaGxxCSQzLCAlcmN4CS8vIGFyZ2MqOCAtPiAlcmN4CisJbW92cSAJJXI4LCAlcmR4CS8vIHBfYXJndiAtPiAlcmR4CisJYWRkcQklcmN4LCAlcmR4CS8vICZwX2FyZ3ZbYXJnY10gLT4gJXJkeAorCisJbW92cQklcnNpLCAlcmN4CS8vIG1heCAoMCwgYXJnYy00KSAtPiAlcmN4CisKK0xfa21wX2ludm9rZV9wdXNoX3Bhcm1zOgkvLyBwdXNoIG50aCAtIDd0aCBwYXJtcyB0byBwa2ZuIG9uIHN0YWNrCisJc3VicQkkOCwgJXJkeAkvLyBkZWNyZW1lbnQgcF9hcmd2IHBvaW50ZXIgdG8gcHJldmlvdXMgcGFybQorCW1vdnEJKCVyZHgpLCAlcnNpCS8vIHBfYXJndlslcmN4LTFdIC0+ICVyc2kKKwlwdXNocQklcnNpCQkvLyBwdXNoIHBfYXJndlslcmN4LTFdIG9udG8gc3RhY2sgKHJldmVyc2Ugb3JkZXIpCisJc3VibAkkMSwgJWVjeAorCisvLyBDNjk1NzA6ICJYODZfNjRfUkVMT0NfQlJBTkNIIG5vdCBzdXBwb3J0ZWQiIGVycm9yIGF0IGxpbmtpbmcgb24gbWFjXzMyZQorLy8JCWlmIHRoZSBuYW1lIG9mIHRoZSBsYWJlbCB0aGF0IGlzIGFuIG9wZXJhbmQgb2YgdGhpcyBqZWN4eiBzdGFydHMgd2l0aCBhIGRvdCAoIi4iKTsKKy8vCSAgIEFwcGxlJ3MgbGlua2VyIGRvZXMgbm90IHN1cHBvcnQgMS1ieXRlIGxlbmd0aCByZWxvY2F0aW9uOworLy8gICAgICAgICBSZXNvbHV0aW9uOiByZXBsYWNlIGFsbCAubGFiZWxYIGVudHJpZXMgd2l0aCBMX2xhYmVsWC4KKworCWplY3h6ICAgTF9rbXBfaW52b2tlX3Bhc3NfcGFybXMgIC8vIHN0b3Agd2hlbiBmb3VyIHBfYXJndltdIHBhcm1zIGxlZnQKKwlqbXAJTF9rbXBfaW52b2tlX3B1c2hfcGFybXMKKworCUFMSUdOIDMKK0xfa21wX2ludm9rZV9wYXNzX3Bhcm1zOgkvLyBwdXQgMXN0IC0gNnRoIHBhcm1zIHRvIHBrZm4gaW4gcmVnaXN0ZXJzLgorCQkJCS8vIG9yZGVyIGhlcmUgaXMgaW1wb3J0YW50IHRvIGF2b2lkIHRyYXNoaW5nCisJCQkJLy8gcmVnaXN0ZXJzIHVzZWQgZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dCBwYXJtcyEKKwltb3ZxCSVyZGksICVyYngJLy8gcGtmbiAtPiAlcmJ4CisJbGVhcQlfX2d0aWQoJXJicCksICVyZGkgLy8gJmd0aWQgLT4gJXJkaSAoc3RvcmUgMXN0IHBhcm0gdG8gcGtmbikKKwlsZWFxCV9fdGlkKCVyYnApLCAlcnNpICAvLyAmdGlkIC0+ICVyc2kgKHN0b3JlIDJuZCBwYXJtIHRvIHBrZm4pCisKKwltb3ZxCSVyOCwgJXIxMQkvLyBwX2FyZ3YgLT4gJXIxMQorCisjaWYgX19NSUNfXyB8fCBfX01JQzJfXworCWNtcHEJJDQsICVyYXgJLy8gYXJnYyA+PSA0PworCWpucwlMX2ttcF80CQkvLyBqdW1wIHRvIG1vdnEKKwlqbXAJTF9rbXBfNF9leGl0ICAgIC8vIGp1bXAgYWhlYWQKK0xfa21wXzQ6CisJbW92cQkyNCglcjExKSwgJXI5CS8vIHBfYXJndlszXSAtPiAlcjkgKHN0b3JlIDZ0aCBwYXJtIHRvIHBrZm4pCitMX2ttcF80X2V4aXQ6CisKKwljbXBxCSQzLCAlcmF4CS8vIGFyZ2MgPj0gMz8KKwlqbnMJTF9rbXBfMwkJLy8ganVtcCB0byBtb3ZxCisJam1wCUxfa21wXzNfZXhpdCAgICAvLyBqdW1wIGFoZWFkCitMX2ttcF8zOgorCW1vdnEJMTYoJXIxMSksICVyOAkvLyBwX2FyZ3ZbMl0gLT4gJXI4IChzdG9yZSA1dGggcGFybSB0byBwa2ZuKQorTF9rbXBfM19leGl0OgorCisJY21wcQkkMiwgJXJheAkvLyBhcmdjID49IDI/CisJam5zCUxfa21wXzIJCS8vIGp1bXAgdG8gbW92cQorCWptcAlMX2ttcF8yX2V4aXQgICAgLy8ganVtcCBhaGVhZAorTF9rbXBfMjoKKwltb3ZxCTgoJXIxMSksICVyY3gJLy8gcF9hcmd2WzFdIC0+ICVyY3ggKHN0b3JlIDR0aCBwYXJtIHRvIHBrZm4pCitMX2ttcF8yX2V4aXQ6CisKKwljbXBxCSQxLCAlcmF4CS8vIGFyZ2MgPj0gMT8KKwlqbnMJTF9rbXBfMQkJLy8ganVtcCB0byBtb3ZxCisJam1wCUxfa21wXzFfZXhpdCAgICAvLyBqdW1wIGFoZWFkCitMX2ttcF8xOgorCW1vdnEJKCVyMTEpLCAlcmR4CS8vIHBfYXJndlswXSAtPiAlcmR4IChzdG9yZSAzcmQgcGFybSB0byBwa2ZuKQorTF9rbXBfMV9leGl0OgorI2Vsc2UKKwljbXBxCSQ0LCAlcmF4CS8vIGFyZ2MgPj0gND8KKwljbW92bnNxCTI0KCVyMTEpLCAlcjkJLy8gcF9hcmd2WzNdIC0+ICVyOSAoc3RvcmUgNnRoIHBhcm0gdG8gcGtmbikKKworCWNtcHEJJDMsICVyYXgJLy8gYXJnYyA+PSAzPworCWNtb3Zuc3EJMTYoJXIxMSksICVyOAkvLyBwX2FyZ3ZbMl0gLT4gJXI4IChzdG9yZSA1dGggcGFybSB0byBwa2ZuKQorCisJY21wcQkkMiwgJXJheAkvLyBhcmdjID49IDI/CisJY21vdm5zcQk4KCVyMTEpLCAlcmN4CS8vIHBfYXJndlsxXSAtPiAlcmN4IChzdG9yZSA0dGggcGFybSB0byBwa2ZuKQorCisJY21wcQkkMSwgJXJheAkvLyBhcmdjID49IDE/CisJY21vdm5zcQkoJXIxMSksICVyZHgJLy8gcF9hcmd2WzBdIC0+ICVyZHggKHN0b3JlIDNyZCBwYXJtIHRvIHBrZm4pCisjZW5kaWYgLy8gX19NSUNfXyB8fCBfX01JQzJfXworCisJY2FsbAkqJXJieAkJLy8gY2FsbCAoKnBrZm4pKCk7CisJbW92cQkkMSwgJXJheAkvLyBtb3ZlIDEgaW50byByZXR1cm4gcmVnaXN0ZXI7CisKKwltb3ZxCS04KCVyYnApLCAlcmJ4CS8vIHJlc3RvcmUgJXJieAl1c2luZyAlcmJwIHNpbmNlICVyc3Agd2FzIG1vZGlmaWVkCisJbW92cSAJJXJicCwgJXJzcAkvLyByZXN0b3JlIHN0YWNrIHBvaW50ZXIKKwlwb3BxIAklcmJwCQkvLyByZXN0b3JlIGZyYW1lIHBvaW50ZXIKKwlyZXQKKworCURFQlVHX0lORk8gX19rbXBfaW52b2tlX21pY3JvdGFzaworLy8gLS0gRW5kICBfX2ttcF9pbnZva2VfbWljcm90YXNrCisKKy8vIGttcF91aW50NjQKKy8vIF9fa21wX2hhcmR3YXJlX3RpbWVzdGFtcCh2b2lkKQorICAgICAgICAudGV4dAorCVBST0MgIF9fa21wX2hhcmR3YXJlX3RpbWVzdGFtcAorCXJkdHNjCisJc2hscSAgICAkMzIsICVyZHgKKwlvcnEgICAgICVyZHgsICVyYXgKKwlyZXQKKworCURFQlVHX0lORk8gX19rbXBfaGFyZHdhcmVfdGltZXN0YW1wCisvLyAtLSBFbmQgIF9fa21wX2hhcmR3YXJlX3RpbWVzdGFtcAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX2JzcjMyCisvLworLy8gaW50CisvLyBfX2ttcF9ic3IzMiggaW50ICk7CisvLworCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX2JzcjMyCisKKyAgICAgICAgYnNyICAgICVlZGksJWVheAorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2JzcjMyCisKKwkKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZW5kaWYgLyogS01QX0FSQ0hfWDg2XzY0ICovCisKKyNpZiBLTVBfQVJDSF9BUk0KKyAgICAuZGF0YQorICAgIC5jb21tIC5nb21wX2NyaXRpY2FsX3VzZXJfLDMyLDgKKyAgICAuZGF0YQorICAgIC5hbGlnbiA0CisgICAgLmdsb2JhbCBfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIKK19fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkcjoKKyAgICAuNGJ5dGUgLmdvbXBfY3JpdGljYWxfdXNlcl8KKyAgICAuc2l6ZSBfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIsNAorI2VuZGlmIC8qIEtNUF9BUkNIX0FSTSAqLworCisjaWYgS01QX0FSQ0hfUFBDNjQKKyAgICAuZGF0YQorICAgIC5jb21tIC5nb21wX2NyaXRpY2FsX3VzZXJfLDMyLDgKKyAgICAuZGF0YQorICAgIC5hbGlnbiA4CisgICAgLmdsb2JhbCBfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIKK19fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkcjoKKyAgICAuOGJ5dGUgLmdvbXBfY3JpdGljYWxfdXNlcl8KKyAgICAuc2l6ZSBfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIsOAorI2VuZGlmIC8qIEtNUF9BUkNIX1BQQzY0ICovCisKKyNpZiBkZWZpbmVkKF9fbGludXhfXykKKy5zZWN0aW9uIC5ub3RlLkdOVS1zdGFjaywiIixAcHJvZ2JpdHMKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvel9MaW51eF91dGlsLmMgYi9maW5hbC9ydW50aW1lL3NyYy96X0xpbnV4X3V0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDhmNWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvel9MaW51eF91dGlsLmMKQEAgLTAsMCArMSwyNjYyIEBACisvKgorICogel9MaW51eF91dGlsLmMgLS0gcGxhdGZvcm0gc3BlY2lmaWMgcm91dGluZXMuCisgKiAkUmV2aXNpb246IDQyODQ3ICQKKyAqICREYXRlOiAyMDEzLTExLTI2IDA5OjEwOjAxIC0wNjAwIChUdWUsIDI2IE5vdiAyMDEzKSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfd3JhcHBlcl9nZXRwaWQuaCIKKyNpbmNsdWRlICJrbXBfaXR0LmgiCisjaW5jbHVkZSAia21wX3N0ci5oIgorI2luY2x1ZGUgImttcF9pMThuLmgiCisjaW5jbHVkZSAia21wX2lvLmgiCisKKyNpZiAhS01QX09TX0ZSRUVCU0QKKyMgaW5jbHVkZSA8YWxsb2NhLmg+CisjZW5kaWYKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxtYXRoLmg+ICAgICAgICAgICAgICAgLy8gSFVHRV9WQUwuCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdGltZXMuaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorCisjaWYgS01QX09TX0xJTlVYICYmICFLTVBfT1NfQ05LCisjIGluY2x1ZGUgPHN5cy9zeXNpbmZvLmg+CisjIGlmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0pCisvLyBXZSBzaG91bGQgcmVhbGx5IGluY2x1ZGUgPGZ1dGV4Lmg+LCBidXQgdGhhdCBjYXVzZXMgY29tcGF0aWJpbGl0eSBwcm9ibGVtcyBvbiBkaWZmZXJlbnQKKy8vIExpbnV4KiBPUyBkaXN0cmlidXRpb25zIHRoYXQgZWl0aGVyIHJlcXVpcmUgdGhhdCB5b3UgaW5jbHVkZSAob3IgYnJlYWsgd2hlbiB5b3UgdHJ5IHRvIGluY2x1ZGUpCisvLyA8cGNpL3R5cGVzLmg+LgorLy8gU2luY2UgYWxsIHdlIG5lZWQgaXMgdGhlIHR3byBtYWNyb3MgYmVsb3cgKHdoaWNoIGFyZSBwYXJ0IG9mIHRoZSBrZXJuZWwgQUJJLCBzbyBjYW4ndCBjaGFuZ2UpCisvLyB3ZSBqdXN0IGRlZmluZSB0aGUgY29uc3RhbnRzIGhlcmUgYW5kIGRvbid0IGluY2x1ZGUgPGZ1dGV4Lmg+CisjICBpZm5kZWYgRlVURVhfV0FJVAorIyAgIGRlZmluZSBGVVRFWF9XQUlUICAgIDAKKyMgIGVuZGlmCisjICBpZm5kZWYgRlVURVhfV0FLRQorIyAgIGRlZmluZSBGVVRFWF9XQUtFICAgIDEKKyMgIGVuZGlmCisjIGVuZGlmCisjZWxpZiBLTVBfT1NfREFSV0lOCisjIGluY2x1ZGUgPHN5cy9zeXNjdGwuaD4KKyMgaW5jbHVkZSA8bWFjaC9tYWNoLmg+CisjZWxpZiBLTVBfT1NfRlJFRUJTRAorIyBpbmNsdWRlIDxzeXMvc3lzY3RsLmg+CisjIGluY2x1ZGUgPHB0aHJlYWRfbnAuaD4KKyNlbmRpZgorCisKKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKy8vIEZvciBub24teDg2IGFyY2hpdGVjdHVyZQorI2lmIEtNUF9DT01QSUxFUl9HQ0MgJiYgIShLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX1BQQzY0KQorIyBpbmNsdWRlIDxzdGRib29sLmg+CisjIGluY2x1ZGUgPGZmaS5oPgorI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCBrbXBfc3lzX3RpbWVyIHsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgICAgIHN0YXJ0OworfTsKKworLy8gQ29udmVydCB0aW1lc3BlYyB0byBuYW5vc2Vjb25kcy4KKyNkZWZpbmUgVFMyTlModGltZXNwZWMpICgoKHRpbWVzcGVjKS50dl9zZWMgKiAxZTkpICsgKHRpbWVzcGVjKS50dl9uc2VjKQorCitzdGF0aWMgc3RydWN0IGttcF9zeXNfdGltZXIgX19rbXBfc3lzX3RpbWVyX2RhdGE7CisKKyNpZiBLTVBfSEFORExFX1NJR05BTFMKKyAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogc2lnX2Z1bmNfdCApKCBpbnQgKTsKKyAgICBTVEFUSUNfRUZJMl9XT1JLQVJPVU5EIHN0cnVjdCBzaWdhY3Rpb24gICAgX19rbXBfc2lnaGxkcnNbIE5TSUcgXTsKKyAgICBzdGF0aWMgc2lnc2V0X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc2lnc2V0OworI2VuZGlmCisKK3N0YXRpYyBpbnQgX19rbXBfaW5pdF9ydW50aW1lICAgPSBGQUxTRTsKKworc3RhdGljIGludCBfX2ttcF9mb3JrX2NvdW50ID0gMDsKKworc3RhdGljIHB0aHJlYWRfY29uZGF0dHJfdCAgX19rbXBfc3VzcGVuZF9jb25kX2F0dHI7CitzdGF0aWMgcHRocmVhZF9tdXRleGF0dHJfdCBfX2ttcF9zdXNwZW5kX211dGV4X2F0dHI7CisKK3N0YXRpYyBrbXBfY29uZF9hbGlnbl90ICAgIF9fa21wX3dhaXRfY3Y7CitzdGF0aWMga21wX211dGV4X2FsaWduX3QgICBfX2ttcF93YWl0X214OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgREVCVUdfU1VTUEVORAorc3RhdGljIHZvaWQKK19fa21wX3ByaW50X2NvbmQoIGNoYXIgKmJ1ZmZlciwga21wX2NvbmRfYWxpZ25fdCAqY29uZCApCit7CisgICAgc3ByaW50ZiggYnVmZmVyLCAiKGNvbmQgKGxvY2sgKCVsZCwgJWQpKSwgKGRlc2NyICglcCkpKSIsCisgICAgICAgICAgICAgICAgICAgICAgY29uZC0+Y19jb25kLl9fY19sb2NrLl9fc3RhdHVzLCBjb25kLT5jX2NvbmQuX19jX2xvY2suX19zcGlubG9jaywKKyAgICAgICAgICAgICAgICAgICAgICBjb25kLT5jX2NvbmQuX19jX3dhaXRpbmcgKTsKK30KKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgKCBLTVBfT1NfTElOVVggJiYgS01QX0FGRklOSVRZX1NVUFBPUlRFRCkKKworLyoKKyAqIEFmZmluaXR5IHN1cHBvcnQKKyAqLworCisvKgorICogT24gc29tZSBvZiB0aGUgb2xkZXIgT1MncyB0aGF0IHdlIGJ1aWxkIG9uLCB0aGVzZSBjb25zdGFudHMgYXJlbid0IHByZXNlbnQKKyAqIGluIDxhc20vdW5pc3RkLmg+ICNpbmNsdWRlZCBmcm9tIDxzeXMuc3lzY2FsbC5oPi4gIFRoZXkgbXVzdCBiZSB0aGUgc2FtZSBvbgorICogYWxsIHN5c3RlbXMgb2YgdGhlIHNhbWUgYXJjaCB3aGVyZSB0aGV5IGFyZSBkZWZpbmVkLCBhbmQgdGhleSBjYW5ub3QgY2hhbmdlLgorICogc3RvbmUgZm9yZXZlci4KKyAqLworCisjICBpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfQVJNCisjICAgaWZuZGVmIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkKKyMgICAgZGVmaW5lIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkgIDI0MQorIyAgIGVsaWYgX19OUl9zY2hlZF9zZXRhZmZpbml0eSAhPSAyNDEKKyMgICAgZXJyb3IgV3JvbmcgY29kZSBmb3Igc2V0YWZmaW5pdHkgc3lzdGVtIGNhbGwuCisjICAgZW5kaWYgLyogX19OUl9zY2hlZF9zZXRhZmZpbml0eSAqLworIyAgIGlmbmRlZiBfX05SX3NjaGVkX2dldGFmZmluaXR5CisjICAgIGRlZmluZSBfX05SX3NjaGVkX2dldGFmZmluaXR5ICAyNDIKKyMgICBlbGlmIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkgIT0gMjQyCisjICAgIGVycm9yIFdyb25nIGNvZGUgZm9yIGdldGFmZmluaXR5IHN5c3RlbSBjYWxsLgorIyAgIGVuZGlmIC8qIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkgKi8KKworIyAgZWxpZiBLTVBfQVJDSF9YODZfNjQKKyMgICBpZm5kZWYgX19OUl9zY2hlZF9zZXRhZmZpbml0eQorIyAgICBkZWZpbmUgX19OUl9zY2hlZF9zZXRhZmZpbml0eSAgMjAzCisjICAgZWxpZiBfX05SX3NjaGVkX3NldGFmZmluaXR5ICE9IDIwMworIyAgICBlcnJvciBXcm9uZyBjb2RlIGZvciBzZXRhZmZpbml0eSBzeXN0ZW0gY2FsbC4KKyMgICBlbmRpZiAvKiBfX05SX3NjaGVkX3NldGFmZmluaXR5ICovCisjICAgaWZuZGVmIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkKKyMgICAgZGVmaW5lIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkgIDIwNAorIyAgIGVsaWYgX19OUl9zY2hlZF9nZXRhZmZpbml0eSAhPSAyMDQKKyMgICAgZXJyb3IgV3JvbmcgY29kZSBmb3IgZ2V0YWZmaW5pdHkgc3lzdGVtIGNhbGwuCisjICAgZW5kaWYgLyogX19OUl9zY2hlZF9nZXRhZmZpbml0eSAqLworCisjICBlbGlmIEtNUF9BUkNIX1BQQzY0CisjICAgaWZuZGVmIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkKKyMgICAgZGVmaW5lIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkgIDIyMgorIyAgIGVsaWYgX19OUl9zY2hlZF9zZXRhZmZpbml0eSAhPSAyMjIKKyMgICAgZXJyb3IgV3JvbmcgY29kZSBmb3Igc2V0YWZmaW5pdHkgc3lzdGVtIGNhbGwuCisjICAgZW5kaWYgLyogX19OUl9zY2hlZF9zZXRhZmZpbml0eSAqLworIyAgIGlmbmRlZiBfX05SX3NjaGVkX2dldGFmZmluaXR5CisjICAgIGRlZmluZSBfX05SX3NjaGVkX2dldGFmZmluaXR5ICAyMjMKKyMgICBlbGlmIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkgIT0gMjIzCisjICAgIGVycm9yIFdyb25nIGNvZGUgZm9yIGdldGFmZmluaXR5IHN5c3RlbSBjYWxsLgorIyAgIGVuZGlmIC8qIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkgKi8KKworCisjICBlbHNlCisjICAgZXJyb3IgVW5rbm93biBvciB1bnN1cHBvcnRlZCBhcmNoaXRlY3R1cmUKKworIyAgZW5kaWYgLyogS01QX0FSQ0hfKiAqLworCitpbnQKK19fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkoIGttcF9hZmZpbl9tYXNrX3QgY29uc3QgKm1hc2ssIGludCBhYm9ydF9vbl9lcnJvciApCit7CisgICAgS01QX0FTU0VSVDIoS01QX0FGRklOSVRZX0NBUEFCTEUoKSwKKyAgICAgICJJbGxlZ2FsIHNldCBhZmZpbml0eSBvcGVyYXRpb24gd2hlbiBub3QgY2FwYWJsZSIpOworCisgICAgaW50IHJldHZhbCA9IHN5c2NhbGwoIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHksIDAsIF9fa21wX2FmZmluX21hc2tfc2l6ZSwgbWFzayApOworICAgIGlmIChyZXR2YWwgPj0gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaW50IGVycm9yID0gZXJybm87CisgICAgaWYgKGFib3J0X29uX2Vycm9yKSB7CisgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgIEtNUF9NU0coIEZhdGFsU3lzRXJyb3IgKSwKKyAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICApOworICAgIH0KKyAgICByZXR1cm4gZXJyb3I7Cit9CisKK2ludAorX19rbXBfZ2V0X3N5c3RlbV9hZmZpbml0eSgga21wX2FmZmluX21hc2tfdCAqbWFzaywgaW50IGFib3J0X29uX2Vycm9yICkKK3sKKyAgICBLTVBfQVNTRVJUMihLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpLAorICAgICAgIklsbGVnYWwgZ2V0IGFmZmluaXR5IG9wZXJhdGlvbiB3aGVuIG5vdCBjYXBhYmxlIik7CisKKyAgICBpbnQgcmV0dmFsID0gc3lzY2FsbCggX19OUl9zY2hlZF9nZXRhZmZpbml0eSwgMCwgX19rbXBfYWZmaW5fbWFza19zaXplLCBtYXNrICk7CisgICAgaWYgKHJldHZhbCA+PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpbnQgZXJyb3IgPSBlcnJubzsKKyAgICBpZiAoYWJvcnRfb25fZXJyb3IpIHsKKyAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgS01QX01TRyggRmF0YWxTeXNFcnJvciApLAorICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICk7CisgICAgfQorICAgIHJldHVybiBlcnJvcjsKK30KKwordm9pZAorX19rbXBfYWZmaW5pdHlfYmluZF90aHJlYWQoIGludCB3aGljaCApCit7CisgICAgS01QX0FTU0VSVDIoS01QX0FGRklOSVRZX0NBUEFCTEUoKSwKKyAgICAgICJJbGxlZ2FsIHNldCBhZmZpbml0eSBvcGVyYXRpb24gd2hlbiBub3QgY2FwYWJsZSIpOworCisgICAga21wX2FmZmluX21hc2tfdCAqbWFzayA9IChrbXBfYWZmaW5fbWFza190ICopYWxsb2NhKF9fa21wX2FmZmluX21hc2tfc2l6ZSk7CisgICAgS01QX0NQVV9aRVJPKG1hc2spOworICAgIEtNUF9DUFVfU0VUKHdoaWNoLCBtYXNrKTsKKyAgICBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KG1hc2ssIFRSVUUpOworfQorCisvKgorICogRGV0ZXJtaW5lIGlmIHdlIGNhbiBhY2Nlc3MgYWZmaW5pdHkgZnVuY3Rpb25hbGl0eSBvbiB0aGlzIHZlcnNpb24gb2YKKyAqIExpbnV4KiBPUyBieSBjaGVja2luZyBfX05SX3NjaGVkX3tnZXQsc2V0fWFmZmluaXR5IHN5c3RlbSBjYWxscywgYW5kIHNldAorICogX19rbXBfYWZmaW5fbWFza19zaXplIHRvIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZSAoMCBtZWFucyBub3QgY2FwYWJsZSkuCisgKi8KK3ZvaWQKK19fa21wX2FmZmluaXR5X2RldGVybWluZV9jYXBhYmxlKGNvbnN0IGNoYXIgKmVudl92YXIpCit7CisgICAgLy8KKyAgICAvLyBDaGVjayBhbmQgc2VlIGlmIHRoZSBPUyBzdXBwb3J0cyB0aHJlYWQgYWZmaW5pdHkuCisgICAgLy8KKworIyBkZWZpbmUgS01QX0NQVV9TRVRfU0laRV9MSU1JVCAgICAgICAgICAoMTAyNCoxMDI0KQorCisgICAgaW50IGdDb2RlOworICAgIGludCBzQ29kZTsKKyAgICBrbXBfYWZmaW5fbWFza190ICpidWY7CisgICAgYnVmID0gKCBrbXBfYWZmaW5fbWFza190ICogKSBLTVBfSU5URVJOQUxfTUFMTE9DKCBLTVBfQ1BVX1NFVF9TSVpFX0xJTUlUICk7CisKKyAgICAvLyBJZiBMaW51eCogT1M6CisgICAgLy8gSWYgdGhlIHN5c2NhbGwgZmFpbHMgb3IgcmV0dXJucyBhIHN1Z2dlc3Rpb24gZm9yIHRoZSBzaXplLAorICAgIC8vIHRoZW4gd2UgZG9uJ3QgaGF2ZSB0byBzZWFyY2ggZm9yIGFuIGFwcHJvcHJpYXRlIHNpemUuCisgICAgZ0NvZGUgPSBzeXNjYWxsKCBfX05SX3NjaGVkX2dldGFmZmluaXR5LCAwLCBLTVBfQ1BVX1NFVF9TSVpFX0xJTUlULCBidWYgKTsKKyAgICBLQV9UUkFDRSgzMCwgKCAiX19rbXBfYWZmaW5pdHlfZGV0ZXJtaW5lX2NhcGFibGU6ICIKKyAgICAgICAiaW5pdGlhbCBnZXRhZmZpbml0eSBjYWxsIHJldHVybmVkICVkIGVycm5vID0gJWRcbiIsCisgICAgICAgZ0NvZGUsIGVycm5vKSk7CisKKyAgICAvL2lmICgoZ0NvZGUgPCAwKSAmJiAoZXJybm8gPT0gRU5PU1lTKSkKKyAgICBpZiAoZ0NvZGUgPCAwKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIFN5c3RlbSBjYWxsIG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgLy8KKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgKF9fa21wX2FmZmluaXR5X3dhcm5pbmdzCisgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkKKyAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9kZWZhdWx0KQorICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X2Rpc2FibGVkKSkpIHsKKyAgICAgICAgICAgIGludCBlcnJvciA9IGVycm5vOworICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgIGttcF9tc193YXJuaW5nLAorICAgICAgICAgICAgICAgIEtNUF9NU0coIEdldEFmZlN5c0NhbGxOb3RTdXBwb3J0ZWQsIGVudl92YXIgKSwKKyAgICAgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgICAgIF9fa21wX2FmZmluX21hc2tfc2l6ZSA9IDA7ICAvLyBzaG91bGQgYWxyZWFkeSBiZSAwCisgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKGJ1Zik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGdDb2RlID4gMCkgeyAvLyBMaW51eCogT1Mgb25seQorICAgICAgICAvLyBUaGUgb3B0aW1hbCBzaXR1YXRpb246IHRoZSBPUyByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBidWZmZXIKKyAgICAgICAgLy8gaXQgZXhwZWN0cy4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gQSB2ZXJpZmljYXRpb24gb2YgY29ycmVjdCBiZWhhdmlvciBpcyB0aGF0IElzZXRhZmZpbml0eSBvbiBhIE5VTEwKKyAgICAgICAgLy8gYnVmZmVyIHdpdGggdGhlIHNhbWUgc2l6ZSBmYWlscyB3aXRoIGVycm5vIHNldCB0byBFRkFVTFQuCisgICAgICAgIHNDb2RlID0gc3lzY2FsbCggX19OUl9zY2hlZF9zZXRhZmZpbml0eSwgMCwgZ0NvZGUsIE5VTEwgKTsKKyAgICAgICAgS0FfVFJBQ0UoMzAsICggIl9fa21wX2FmZmluaXR5X2RldGVybWluZV9jYXBhYmxlOiAiCisgICAgICAgICAgICJzZXRhZmZpbml0eSBmb3IgbWFzayBzaXplICVkIHJldHVybmVkICVkIGVycm5vID0gJWRcbiIsCisgICAgICAgICAgIGdDb2RlLCBzQ29kZSwgZXJybm8pKTsKKyAgICAgICAgaWYgKHNDb2RlIDwgMCkgeworICAgICAgICAgICAgaWYgKGVycm5vID09IEVOT1NZUykgeworICAgICAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkKKyAgICAgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X2RlZmF1bHQpCisgICAgICAgICAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9kaXNhYmxlZCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBlcnJvciA9IGVycm5vOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbXNfd2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIFNldEFmZlN5c0NhbGxOb3RTdXBwb3J0ZWQsIGVudl92YXIgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbl9tYXNrX3NpemUgPSAwOyAgLy8gc2hvdWxkIGFscmVhZHkgYmUgMAorICAgICAgICAgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKGJ1Zik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXJybm8gPT0gRUZBVUxUKSB7CisgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5fbWFza19zaXplID0gZ0NvZGU7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMTAsICggIl9fa21wX2FmZmluaXR5X2RldGVybWluZV9jYXBhYmxlOiAiCisgICAgICAgICAgICAgICAgICAiYWZmaW5pdHkgc3VwcG9ydGVkIChtYXNrIHNpemUgJWQpXG4iLAorICAgICAgICAgICAgICAgICAgKGludClfX2ttcF9hZmZpbl9tYXNrX3NpemUpKTsKKyAgICAgICAgICAgICAgICBLTVBfSU5URVJOQUxfRlJFRShidWYpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vCisgICAgLy8gQ2FsbCB0aGUgZ2V0YWZmaW5pdHkgc3lzdGVtIGNhbGwgcmVwZWF0ZWRseSB3aXRoIGluY3JlYXNpbmcgc2V0IHNpemVzCisgICAgLy8gdW50aWwgd2Ugc3VjY2VlZCwgb3IgcmVhY2ggYW4gdXBwZXIgYm91bmQgb24gdGhlIHNlYXJjaC4KKyAgICAvLworICAgIEtBX1RSQUNFKDMwLCAoICJfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZTogIgorICAgICAgInNlYXJjaGluZyBmb3IgcHJvcGVyIHNldCBzaXplXG4iKSk7CisgICAgaW50IHNpemU7CisgICAgZm9yIChzaXplID0gMTsgc2l6ZSA8PSBLTVBfQ1BVX1NFVF9TSVpFX0xJTUlUOyBzaXplICo9IDIpIHsKKyAgICAgICAgZ0NvZGUgPSBzeXNjYWxsKCBfX05SX3NjaGVkX2dldGFmZmluaXR5LCAwLCAgc2l6ZSwgYnVmICk7CisgICAgICAgIEtBX1RSQUNFKDMwLCAoICJfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZTogIgorICAgICAgICAgICJnZXRhZmZpbml0eSBmb3IgbWFzayBzaXplICVkIHJldHVybmVkICVkIGVycm5vID0gJWRcbiIsIHNpemUsCisgICAgICAgICAgICBnQ29kZSwgZXJybm8pKTsKKworICAgICAgICBpZiAoZ0NvZGUgPCAwKSB7CisgICAgICAgICAgICBpZiAoIGVycm5vID09IEVOT1NZUyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBXZSBzaG91bGRuJ3QgZ2V0IGhlcmUKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIEtBX1RSQUNFKDMwLCAoICJfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZTogIgorICAgICAgICAgICAgICAgICAgImluY29uc2lzdGVudCBPUyBjYWxsIGJlaGF2aW9yOiBlcnJubyA9PSBFTk9TWVMgZm9yIG1hc2sgc2l6ZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBzaXplKSk7CisgICAgICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgKF9fa21wX2FmZmluaXR5X3dhcm5pbmdzCisgICAgICAgICAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9ub25lKQorICAgICAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfZGVmYXVsdCkKKyAgICAgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X2Rpc2FibGVkKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yID0gZXJybm87CisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgIGttcF9tc193YXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgS01QX01TRyggR2V0QWZmU3lzQ2FsbE5vdFN1cHBvcnRlZCwgZW52X3ZhciApLAorICAgICAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9fa21wX2FmZmluX21hc2tfc2l6ZSA9IDA7ICAvLyBzaG91bGQgYWxyZWFkeSBiZSAwCisgICAgICAgICAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoYnVmKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHNDb2RlID0gc3lzY2FsbCggX19OUl9zY2hlZF9zZXRhZmZpbml0eSwgMCwgZ0NvZGUsIE5VTEwgKTsKKyAgICAgICAgS0FfVFJBQ0UoMzAsICggIl9fa21wX2FmZmluaXR5X2RldGVybWluZV9jYXBhYmxlOiAiCisgICAgICAgICAgICJzZXRhZmZpbml0eSBmb3IgbWFzayBzaXplICVkIHJldHVybmVkICVkIGVycm5vID0gJWRcbiIsCisgICAgICAgICAgIGdDb2RlLCBzQ29kZSwgZXJybm8pKTsKKyAgICAgICAgaWYgKHNDb2RlIDwgMCkgeworICAgICAgICAgICAgaWYgKGVycm5vID09IEVOT1NZUykgeyAvLyBMaW51eCogT1Mgb25seQorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gV2Ugc2hvdWxkbid0IGdldCBoZXJlCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBLQV9UUkFDRSgzMCwgKCAiX19rbXBfYWZmaW5pdHlfZGV0ZXJtaW5lX2NhcGFibGU6ICIKKyAgICAgICAgICAgICAgICAgICJpbmNvbnNpc3RlbnQgT1MgY2FsbCBiZWhhdmlvcjogZXJybm8gPT0gRU5PU1lTIGZvciBtYXNrIHNpemUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgc2l6ZSkpOworICAgICAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkKKyAgICAgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X2RlZmF1bHQpCisgICAgICAgICAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9kaXNhYmxlZCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBlcnJvciA9IGVycm5vOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbXNfd2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIFNldEFmZlN5c0NhbGxOb3RTdXBwb3J0ZWQsIGVudl92YXIgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbl9tYXNrX3NpemUgPSAwOyAgLy8gc2hvdWxkIGFscmVhZHkgYmUgMAorICAgICAgICAgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKGJ1Zik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVycm5vID09IEVGQVVMVCkgeworICAgICAgICAgICAgICAgIF9fa21wX2FmZmluX21hc2tfc2l6ZSA9IGdDb2RlOworICAgICAgICAgICAgICAgIEtBX1RSQUNFKDEwLCAoICJfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZTogIgorICAgICAgICAgICAgICAgICAgImFmZmluaXR5IHN1cHBvcnRlZCAobWFzayBzaXplICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAoaW50KV9fa21wX2FmZmluX21hc2tfc2l6ZSkpOworICAgICAgICAgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKGJ1Zik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8vaW50IGVycm9yID0gZXJybm87ICAvLyBzYXZlIHVuY2F1Z2h0IGVycm9yIGNvZGUKKyAgICBLTVBfSU5URVJOQUxfRlJFRShidWYpOworICAgIC8vIGVycm5vID0gZXJyb3I7ICAvLyByZXN0b3JlIHVuY2F1Z2h0IGVycm9yIGNvZGUsIHdpbGwgYmUgcHJpbnRlZCBhdCB0aGUgbmV4dCBLTVBfV0FSTklORyBiZWxvdworCisgICAgLy8KKyAgICAvLyBBZmZpbml0eSBpcyBub3Qgc3VwcG9ydGVkCisgICAgLy8KKyAgICBfX2ttcF9hZmZpbl9tYXNrX3NpemUgPSAwOworICAgIEtBX1RSQUNFKDEwLCAoICJfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZTogIgorICAgICAgImNhbm5vdCBkZXRlcm1pbmUgbWFzayBzaXplIC0gYWZmaW5pdHkgbm90IHN1cHBvcnRlZFxuIikpOworICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkKKyAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X2RlZmF1bHQpCisgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9kaXNhYmxlZCkpKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZDYW50R2V0TWFza1NpemUsIGVudl92YXIgKTsKKyAgICB9Cit9CisKKworLyoKKyAqIENoYW5nZSB0aHJlYWQgdG8gdGhlIGFmZmluaXR5IG1hc2sgcG9pbnRlZCB0byBieSBhZmZpbl9tYXNrIGFyZ3VtZW50CisgKiBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgb2xkIHZhbHVlIGluIHRoZSBvbGRfbWFzayBhcmd1bWVudCwgaWYgYXJndW1lbnQKKyAqIGlzIG5vbi1OVUxMLgorICovCisKK3ZvaWQKK19fa21wX2NoYW5nZV90aHJlYWRfYWZmaW5pdHlfbWFzayggaW50IGd0aWQsIGttcF9hZmZpbl9tYXNrX3QgKm5ld19tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfYWZmaW5fbWFza190ICpvbGRfbWFzayApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA9PSBfX2ttcF9nZXRfZ3RpZCgpICk7CisgICAgaWYgKCBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpICkgeworICAgICAgICBpbnQgc3RhdHVzOworICAgICAgICBrbXBfaW5mb190ICAqdGggPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggbmV3X21hc2sgIT0gTlVMTCApOworCisgICAgICAgIGlmICggb2xkX21hc2sgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IF9fa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkoIG9sZF9tYXNrLCBUUlVFICk7CisgICAgICAgICAgICBpbnQgZXJyb3IgPSBlcnJubzsKKyAgICAgICAgICAgIGlmICggc3RhdHVzICE9IDAgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIENoYW5nZVRocmVhZEFmZk1hc2tFcnJvciApLAorICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KCBuZXdfbWFzaywgVFJVRSApOworCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBjaGFyIG9sZF9idWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgICAgIGNoYXIgbmV3X2J1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhvbGRfYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sIG9sZF9tYXNrKTsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2sobmV3X2J1ZiwgS01QX0FGRklOX01BU0tfUFJJTlRfTEVOLCBuZXdfbWFzayk7CisgICAgICAgICAgICBLTVBfSU5GT1JNKCBDaGFuZ2VBZmZNYXNrLCAiS01QX0FGRklOSVRZIChCaW5kKSIsIGd0aWQsIG9sZF9idWYsIG5ld19idWYgKTsKKworICAgICAgICB9CisKKyAgICAgICAgLyogTWFrZSBzdXJlIG9sZCB2YWx1ZSBpcyBjb3JyZWN0IGluIHRocmVhZCBkYXRhIHN0cnVjdHVyZXMgKi8KKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggb2xkX21hc2sgIT0gTlVMTCAmJiAobWVtY21wKG9sZF9tYXNrLAorICAgICAgICAgIHRoLT50aC50aF9hZmZpbl9tYXNrLCBfX2ttcF9hZmZpbl9tYXNrX3NpemUpID09IDApICk7CisgICAgICAgIEtNUF9DUFVfQ09QWSggdGgtPnRoLnRoX2FmZmluX21hc2ssIG5ld19tYXNrICk7CisgICAgfQorfQorCisjZW5kaWYgLy8gS01QX09TX0xJTlVYICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0pICYmICFLTVBfT1NfQ05LCisKK2ludAorX19rbXBfZnV0ZXhfZGV0ZXJtaW5lX2NhcGFibGUoKQoreworICAgIGludCBsb2MgPSAwOworICAgIGludCByYyA9IHN5c2NhbGwoIF9fTlJfZnV0ZXgsICZsb2MsIEZVVEVYX1dBS0UsIDEsIE5VTEwsIE5VTEwsIDAgKTsKKyAgICBpbnQgcmV0dmFsID0gKCByYyA9PSAwICkgfHwgKCBlcnJubyAhPSBFTk9TWVMgKTsKKworICAgIEtBX1RSQUNFKDEwLCAoICJfX2ttcF9mdXRleF9kZXRlcm1pbmVfY2FwYWJsZTogcmMgPSAlZCBlcnJubyA9ICVkXG4iLCByYywKKyAgICAgIGVycm5vICkgKTsKKyAgICBLQV9UUkFDRSgxMCwgKCAiX19rbXBfZnV0ZXhfZGV0ZXJtaW5lX2NhcGFibGU6IGZ1dGV4IHN5c2NhbGwlcyBzdXBwb3J0ZWRcbiIsCisgICAgICAgIHJldHZhbCA/ICIiIDogIiBub3QiICkgKTsKKworICAgIHJldHVybiByZXR2YWw7Cit9CisKKyNlbmRpZiAvLyBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNKSAmJiAhS01QX09TX0NOSworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQpICYmICghIEtNUF9BU01fSU5UUklOUykKKy8qCisgKiBPbmx5IDMyLWJpdCAiYWRkLWV4Y2hhbmdlIiBpbnN0cnVjdGlvbiBvbiBJQS0zMiBhcmNoaXRlY3R1cmUgY2F1c2VzIHVzIHRvCisgKiB1c2UgY29tcGFyZV9hbmRfc3RvcmUgZm9yIHRoZXNlIHJvdXRpbmVzCisgKi8KKwora21wX2ludDMyCitfX2ttcF90ZXN0X3RoZW5fb3IzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgZCApCit7CisgICAga21wX2ludDMyIG9sZF92YWx1ZSwgbmV3X3ZhbHVlOworCisgICAgb2xkX3ZhbHVlID0gVENSXzQoICpwICk7CisgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlIHwgZDsKKworICAgIHdoaWxlICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMMzIgKCBwLCBvbGRfdmFsdWUsIG5ld192YWx1ZSApICkKKyAgICB7CisgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgb2xkX3ZhbHVlID0gVENSXzQoICpwICk7CisgICAgICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSB8IGQ7CisgICAgfQorICAgIHJldHVybiBvbGRfdmFsdWU7Cit9CisKK2ttcF9pbnQzMgorX19rbXBfdGVzdF90aGVuX2FuZDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBkICkKK3sKKyAgICBrbXBfaW50MzIgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKyAgICBvbGRfdmFsdWUgPSBUQ1JfNCggKnAgKTsKKyAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgJiBkOworCisgICAgd2hpbGUgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUwzMiAoIHAsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlICkgKQorICAgIHsKKyAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICBvbGRfdmFsdWUgPSBUQ1JfNCggKnAgKTsKKyAgICAgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlICYgZDsKKyAgICB9CisgICAgcmV0dXJuIG9sZF92YWx1ZTsKK30KKworIyBpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfUFBDNjQKK2ttcF9pbnQ2NAorX19rbXBfdGVzdF90aGVuX2FkZDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBkICkKK3sKKyAgICBrbXBfaW50NjQgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKyAgICBvbGRfdmFsdWUgPSBUQ1JfOCggKnAgKTsKKyAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgKyBkOworCisgICAgd2hpbGUgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUw2NCAoIHAsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlICkgKQorICAgIHsKKyAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICBvbGRfdmFsdWUgPSBUQ1JfOCggKnAgKTsKKyAgICAgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlICsgZDsKKyAgICB9CisgICAgcmV0dXJuIG9sZF92YWx1ZTsKK30KKyMgZW5kaWYgLyogS01QX0FSQ0hfWDg2ICovCisKK2ttcF9pbnQ2NAorX19rbXBfdGVzdF90aGVuX29yNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGQgKQoreworICAgIGttcF9pbnQ2NCBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworICAgIG9sZF92YWx1ZSA9IFRDUl84KCAqcCApOworICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSB8IGQ7CisgICAgd2hpbGUgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUw2NCAoIHAsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlICkgKQorICAgIHsKKyAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICBvbGRfdmFsdWUgPSBUQ1JfOCggKnAgKTsKKyAgICAgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlIHwgZDsKKyAgICB9CisgICAgcmV0dXJuIG9sZF92YWx1ZTsKK30KKwora21wX2ludDY0CitfX2ttcF90ZXN0X3RoZW5fYW5kNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGQgKQoreworICAgIGttcF9pbnQ2NCBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworICAgIG9sZF92YWx1ZSA9IFRDUl84KCAqcCApOworICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSAmIGQ7CisgICAgd2hpbGUgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUw2NCAoIHAsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlICkgKQorICAgIHsKKyAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICBvbGRfdmFsdWUgPSBUQ1JfOCggKnAgKTsKKyAgICAgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlICYgZDsKKyAgICB9CisgICAgcmV0dXJuIG9sZF92YWx1ZTsKK30KKworI2VuZGlmIC8qIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0KSAmJiAoISBLTVBfQVNNX0lOVFJJTlMpICovCisKK3ZvaWQKK19fa21wX3Rlcm1pbmF0ZV90aHJlYWQoIGludCBndGlkICkKK3sKKyAgICBpbnQgc3RhdHVzOworICAgIGttcF9pbmZvX3QgICp0aCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKworICAgIGlmICggIXRoICkgcmV0dXJuOworCisgICAgI2lmZGVmIEtNUF9DQU5DRUxfVEhSRUFEUworICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfdGVybWluYXRlX3RocmVhZDoga2lsbCAoJWQpXG4iLCBndGlkICkgKTsKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9jYW5jZWwoIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCApOworICAgICAgICBpZiAoIHN0YXR1cyAhPSAwICYmIHN0YXR1cyAhPSBFU1JDSCApIHsKKyAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudFRlcm1pbmF0ZVdvcmtlclRocmVhZCApLAorICAgICAgICAgICAgICAgIEtNUF9FUlIoIHN0YXR1cyApLAorICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICApOworICAgICAgICB9OyAvLyBpZgorICAgICNlbmRpZgorICAgIF9fa21wX3lpZWxkKCBUUlVFICk7Cit9IC8vCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBTZXQgdGhyZWFkIHN0YWNrIGluZm8gYWNjb3JkaW5nIHRvIHZhbHVlcyByZXR1cm5lZCBieQorICogcHRocmVhZF9nZXRhdHRyX25wKCkuCisgKiBJZiB2YWx1ZXMgYXJlIHVucmVhc29uYWJsZSwgYXNzdW1lIGNhbGwgZmFpbGVkIGFuZCB1c2UKKyAqIGluY3JlbWVudGFsIHN0YWNrIHJlZmluZW1lbnQgbWV0aG9kIGluc3RlYWQuCisgKiBSZXR1cm5zIFRSVUUgaWYgdGhlIHN0YWNrIHBhcmFtZXRlcnMgY291bGQgYmUgZGV0ZXJtaW5lZCBleGFjdGx5LAorICogRkFMU0UgaWYgaW5jcmVtZW50YWwgcmVmaW5lbWVudCBpcyBuZWNlc3NhcnkuCisgKi8KK3N0YXRpYyBrbXBfaW50MzIKK19fa21wX3NldF9zdGFja19pbmZvKCBpbnQgZ3RpZCwga21wX2luZm9fdCAqdGggKQoreworICAgIGludCAgICAgICAgICAgIHN0YWNrX2RhdGE7CisjaWYgS01QX09TX0xJTlVYIHx8IEtNUF9PU19GUkVFQlNECisgICAgLyogTGludXgqIE9TIG9ubHkgLS0gbm8gcHRocmVhZF9nZXRhdHRyX25wIHN1cHBvcnQgb24gT1MgWCogKi8KKyAgICBwdGhyZWFkX2F0dHJfdCBhdHRyOworICAgIGludCAgICAgICAgICAgIHN0YXR1czsKKyAgICBzaXplX3QgICAgICAgICBzaXplID0gMDsKKyAgICB2b2lkICogICAgICAgICBhZGRyID0gMDsKKworICAgIC8qIEFsd2F5cyBkbyBpbmNyZW1lbnRhbCBzdGFjayByZWZpbmVtZW50IGZvciB1YmVybWFzdGVyIHRocmVhZHMgc2luY2UgdGhlIGluaXRpYWwKKyAgICAgICB0aHJlYWQgc3RhY2sgcmFuZ2UgY2FuIGJlIHJlZHVjZWQgYnkgc2libGluZyB0aHJlYWQgY3JlYXRpb24gc28gcHRocmVhZF9hdHRyX2dldHN0YWNrCisgICAgICAgbWF5IGNhdXNlIHRocmVhZCBndGlkIGFsaWFzaW5nICovCisgICAgaWYgKCAhIEtNUF9VQkVSX0dUSUQoZ3RpZCkgKSB7CisKKyAgICAgICAgLyogRmV0Y2ggdGhlIHJlYWwgdGhyZWFkIGF0dHJpYnV0ZXMgKi8KKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9hdHRyX2luaXQoICZhdHRyICk7CisgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9hdHRyX2luaXQiLCBzdGF0dXMgKTsKKyNpZiBLTVBfT1NfRlJFRUJTRAorICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2F0dHJfZ2V0X25wKCBwdGhyZWFkX3NlbGYoKSwgJmF0dHIgKTsKKyAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX2F0dHJfZ2V0X25wIiwgc3RhdHVzICk7CisjZWxzZQorICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2dldGF0dHJfbnAoIHB0aHJlYWRfc2VsZigpLCAmYXR0ciApOworICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfZ2V0YXR0cl9ucCIsIHN0YXR1cyApOworI2VuZGlmCisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfYXR0cl9nZXRzdGFjayggJmF0dHIsICZhZGRyLCAmc2l6ZSApOworICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfYXR0cl9nZXRzdGFjayIsIHN0YXR1cyApOworICAgICAgICBLQV9UUkFDRSggNjAsICggIl9fa21wX3NldF9zdGFja19pbmZvOiBUIyVkIHB0aHJlYWRfYXR0cl9nZXRzdGFjayByZXR1cm5lZCBzaXplOiAlbHUsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJsb3cgYWRkcjogJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCBzaXplLCBhZGRyICkpOworCisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfYXR0cl9kZXN0cm95KCAmYXR0ciApOworICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfYXR0cl9kZXN0cm95Iiwgc3RhdHVzICk7CisgICAgfQorCisgICAgaWYgKCBzaXplICE9IDAgJiYgYWRkciAhPSAwICkgeyAgICAgLyogd2FzIHN0YWNrIHBhcmFtZXRlciBkZXRlcm1pbmF0aW9uIHN1Y2Nlc3NmdWw/ICovCisgICAgICAgIC8qIFN0b3JlIHRoZSBjb3JyZWN0IGJhc2UgYW5kIHNpemUgKi8KKyAgICAgICAgVENXX1BUUih0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja2Jhc2UsICgoKGNoYXIgKilhZGRyKSArIHNpemUpKTsKKyAgICAgICAgVENXX1BUUih0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja3NpemUsIHNpemUpOworICAgICAgICBUQ1dfNCh0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja2dyb3csIEZBTFNFKTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorI2VuZGlmIC8qIEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfRlJFRUJTRCAqLworCisgICAgLyogVXNlIGluY3JlbWVudGFsIHJlZmluZW1lbnQgc3RhcnRpbmcgZnJvbSBpbml0aWFsIGNvbnNlcnZhdGl2ZSBlc3RpbWF0ZSAqLworICAgIFRDV19QVFIodGgtPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tzaXplLCAwKTsKKyAgICBUQ1dfUFRSKHRoIC0+IHRoLnRoX2luZm8uZHMuZHNfc3RhY2tiYXNlLCAmc3RhY2tfZGF0YSk7CisgICAgVENXXzQodGgtPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tncm93LCBUUlVFKTsKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyB2b2lkKgorX19rbXBfbGF1bmNoX3dvcmtlciggdm9pZCAqdGhyICkKK3sKKyAgICBpbnQgc3RhdHVzLCBvbGRfdHlwZSwgb2xkX3N0YXRlOworI2lmZGVmIEtNUF9CTE9DS19TSUdOQUxTCisgICAgc2lnc2V0X3QgICAgbmV3X3NldCwgb2xkX3NldDsKKyNlbmRpZiAvKiBLTVBfQkxPQ0tfU0lHTkFMUyAqLworICAgIHZvaWQgKmV4aXRfdmFsOworICAgIHZvaWQgKnBhZGRpbmcgPSAwOworICAgIGludCBndGlkOworICAgIGludCBlcnJvcjsKKworICAgIGd0aWQgPSAoKGttcF9pbmZvX3QqKXRocikgLT4gdGgudGhfaW5mby5kcy5kc19ndGlkOworICAgIF9fa21wX2d0aWRfc2V0X3NwZWNpZmljKCBndGlkICk7CisjaWZkZWYgS01QX1REQVRBX0dUSUQKKyAgICBfX2ttcF9ndGlkID0gZ3RpZDsKKyNlbmRpZgorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF90aHJlYWRfbmFtZSggZ3RpZCApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICBfX2ttcF9hZmZpbml0eV9zZXRfaW5pdF9tYXNrKCBndGlkLCBGQUxTRSApOworI2VuZGlmCisKKyNpZmRlZiBLTVBfQ0FOQ0VMX1RIUkVBRFMKKyAgICBzdGF0dXMgPSBwdGhyZWFkX3NldGNhbmNlbHR5cGUoIFBUSFJFQURfQ0FOQ0VMX0FTWU5DSFJPTk9VUywgJiBvbGRfdHlwZSApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9zZXRjYW5jZWx0eXBlIiwgc3RhdHVzICk7CisgICAgLyogam9zaCB0b2RvOiBpc24ndCBQVEhSRUFEX0NBTkNFTF9FTkFCTEUgZGVmYXVsdCBmb3IgbmV3bHktY3JlYXRlZCB0aHJlYWRzPyAqLworICAgIHN0YXR1cyA9IHB0aHJlYWRfc2V0Y2FuY2Vsc3RhdGUoIFBUSFJFQURfQ0FOQ0VMX0VOQUJMRSwgJiBvbGRfc3RhdGUgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfc2V0Y2FuY2Vsc3RhdGUiLCBzdGF0dXMgKTsKKyNlbmRpZgorCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorICAgIC8vCisgICAgLy8gU2V0IHRoZSBGUCBjb250cm9sIHJlZ3MgdG8gYmUgYSBjb3B5IG9mCisgICAgLy8gdGhlIHBhcmFsbGVsIGluaXRpYWxpemF0aW9uIHRocmVhZCdzLgorICAgIC8vCisgICAgX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZCgpOworICAgIF9fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQoICZfX2ttcF9pbml0X3g4N19mcHVfY29udHJvbF93b3JkICk7CisgICAgX19rbXBfbG9hZF9teGNzciggJl9fa21wX2luaXRfbXhjc3IgKTsKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKyNpZmRlZiBLTVBfQkxPQ0tfU0lHTkFMUworICAgIHN0YXR1cyA9IHNpZ2ZpbGxzZXQoICYgbmV3X3NldCApOworICAgIEtNUF9DSEVDS19TWVNGQUlMX0VSUk5PKCAic2lnZmlsbHNldCIsIHN0YXR1cyApOworICAgIHN0YXR1cyA9IHB0aHJlYWRfc2lnbWFzayggU0lHX0JMT0NLLCAmIG5ld19zZXQsICYgb2xkX3NldCApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9zaWdtYXNrIiwgc3RhdHVzICk7CisjZW5kaWYgLyogS01QX0JMT0NLX1NJR05BTFMgKi8KKworI2lmIEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfRlJFRUJTRAorICAgIGlmICggX19rbXBfc3Rrb2Zmc2V0ID4gMCAmJiBndGlkID4gMCApIHsKKyAgICAgICAgcGFkZGluZyA9IGFsbG9jYSggZ3RpZCAqIF9fa21wX3N0a29mZnNldCApOworICAgIH0KKyNlbmRpZgorCisgICAgS01QX01CKCk7CisgICAgX19rbXBfc2V0X3N0YWNrX2luZm8oIGd0aWQsIChrbXBfaW5mb190Kil0aHIgKTsKKworICAgIF9fa21wX2NoZWNrX3N0YWNrX292ZXJsYXAoIChrbXBfaW5mb190Kil0aHIgKTsKKworICAgIGV4aXRfdmFsID0gX19rbXBfbGF1bmNoX3RocmVhZCggKGttcF9pbmZvX3QgKikgdGhyICk7CisKKyNpZmRlZiBLTVBfQkxPQ0tfU0lHTkFMUworICAgIHN0YXR1cyA9IHB0aHJlYWRfc2lnbWFzayggU0lHX1NFVE1BU0ssICYgb2xkX3NldCwgTlVMTCApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9zaWdtYXNrIiwgc3RhdHVzICk7CisjZW5kaWYgLyogS01QX0JMT0NLX1NJR05BTFMgKi8KKworICAgIHJldHVybiBleGl0X3ZhbDsKK30KKworCisvKiBUaGUgbW9uaXRvciB0aHJlYWQgY29udHJvbHMgYWxsIG9mIHRoZSB0aHJlYWRzIGluIHRoZSBjb21wbGV4ICovCisKK3N0YXRpYyB2b2lkKgorX19rbXBfbGF1bmNoX21vbml0b3IoIHZvaWQgKnRociApCit7CisgICAgaW50ICAgICAgICAgc3RhdHVzLCBvbGRfdHlwZSwgb2xkX3N0YXRlOworI2lmZGVmIEtNUF9CTE9DS19TSUdOQUxTCisgICAgc2lnc2V0X3QgICAgbmV3X3NldDsKKyNlbmRpZiAvKiBLTVBfQkxPQ0tfU0lHTkFMUyAqLworICAgIHN0cnVjdCB0aW1lc3BlYyAgaW50ZXJ2YWw7CisgICAgaW50IHlpZWxkX2NvdW50OworICAgIGludCB5aWVsZF9jeWNsZXMgPSAwOworICAgIGludCBlcnJvcjsKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2xhdW5jaF9tb25pdG9yOiAjMSBsYXVuY2hlZFxuIiApICk7CisKKyAgICAvKiByZWdpc3RlciB1cyBhcyB0aGUgbW9uaXRvciB0aHJlYWQgKi8KKyAgICBfX2ttcF9ndGlkX3NldF9zcGVjaWZpYyggS01QX0dUSURfTU9OSVRPUiApOworI2lmZGVmIEtNUF9UREFUQV9HVElECisgICAgX19rbXBfZ3RpZCA9IEtNUF9HVElEX01PTklUT1I7CisjZW5kaWYKKworICAgIEtNUF9NQigpOworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF90aHJlYWRfaWdub3JlKCk7ICAgIC8vIEluc3RydWN0IEludGVsKFIpIFRocmVhZGluZyBUb29scyB0byBpZ25vcmUgbW9uaXRvciB0aHJlYWQuCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgX19rbXBfc2V0X3N0YWNrX2luZm8oICgoa21wX2luZm9fdCopdGhyKS0+dGgudGhfaW5mby5kcy5kc19ndGlkLCAoa21wX2luZm9fdCopdGhyICk7CisKKyAgICBfX2ttcF9jaGVja19zdGFja19vdmVybGFwKCAoa21wX2luZm9fdCopdGhyICk7CisKKyNpZmRlZiBLTVBfQ0FOQ0VMX1RIUkVBRFMKKyAgICBzdGF0dXMgPSBwdGhyZWFkX3NldGNhbmNlbHR5cGUoIFBUSFJFQURfQ0FOQ0VMX0FTWU5DSFJPTk9VUywgJiBvbGRfdHlwZSApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9zZXRjYW5jZWx0eXBlIiwgc3RhdHVzICk7CisgICAgLyogam9zaCB0b2RvOiBpc24ndCBQVEhSRUFEX0NBTkNFTF9FTkFCTEUgZGVmYXVsdCBmb3IgbmV3bHktY3JlYXRlZCB0aHJlYWRzPyAqLworICAgIHN0YXR1cyA9IHB0aHJlYWRfc2V0Y2FuY2Vsc3RhdGUoIFBUSFJFQURfQ0FOQ0VMX0VOQUJMRSwgJiBvbGRfc3RhdGUgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfc2V0Y2FuY2Vsc3RhdGUiLCBzdGF0dXMgKTsKKyNlbmRpZgorCisgICAgI2lmIEtNUF9SRUFMX1RJTUVfRklYCisgICAgLy8gVGhpcyBpcyBhIHBvdGVudGlhbCBmaXggd2hpY2ggYWxsb3dzIGFwcGxpY2F0aW9uIHdpdGggcmVhbC10aW1lIHNjaGVkdWxpbmcgcG9saWN5IHdvcmsuCisgICAgLy8gSG93ZXZlciwgZGVjaXNpb24gYWJvdXQgdGhlIGZpeCBpcyBub3QgbWFkZSB5ZXQsIHNvIGl0IGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuCisgICAgeyAvLyBBcmUgcHJvZ3JhbSBzdGFydGVkIHdpdGggcmVhbC10aW1lIHNjaGVkdWxpbmcgcG9saWN5PworICAgICAgICBpbnQgc2NoZWQgPSBzY2hlZF9nZXRzY2hlZHVsZXIoIDAgKTsKKyAgICAgICAgaWYgKCBzY2hlZCA9PSBTQ0hFRF9GSUZPIHx8IHNjaGVkID09IFNDSEVEX1JSICkgeworICAgICAgICAgICAgLy8gWWVzLCB3ZSBhcmUgYSBwYXJ0IG9mIHJlYWwtdGltZSBhcHBsaWNhdGlvbi4gVHJ5IHRvIGluY3JlYXNlIHRoZSBwcmlvcml0eSBvZiB0aGUKKyAgICAgICAgICAgIC8vIG1vbml0b3IuCisgICAgICAgICAgICBzdHJ1Y3Qgc2NoZWRfcGFyYW0gcGFyYW07CisgICAgICAgICAgICBpbnQgICAgbWF4X3ByaW9yaXR5ID0gc2NoZWRfZ2V0X3ByaW9yaXR5X21heCggc2NoZWQgKTsKKyAgICAgICAgICAgIGludCAgICByYzsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBSZWFsVGltZVNjaGVkTm90U3VwcG9ydGVkICk7CisgICAgICAgICAgICBzY2hlZF9nZXRwYXJhbSggMCwgJiBwYXJhbSApOworICAgICAgICAgICAgaWYgKCBwYXJhbS5zY2hlZF9wcmlvcml0eSA8IG1heF9wcmlvcml0eSApIHsKKyAgICAgICAgICAgICAgICBwYXJhbS5zY2hlZF9wcmlvcml0eSArPSAxOworICAgICAgICAgICAgICAgIHJjID0gc2NoZWRfc2V0c2NoZWR1bGVyKCAwLCBzY2hlZCwgJiBwYXJhbSApOworICAgICAgICAgICAgICAgIGlmICggcmMgIT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yID0gZXJybm87CisgICAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgICAga21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudENoYW5nZU1vbml0b3JQcmlvcml0eSApLAorICAgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICAgICAgICAgICAgS01QX01TRyggTW9uaXRvcldpbGxTdGFydmUgKSwKKyAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBjYW5ub3QgYWJvcnQgaGVyZSwgYmVjYXVzZSBudW1iZXIgb2YgQ1BVcyBtYXkgYmUgZW5vdWdoIGZvciBhbGwgdGhlIHRocmVhZHMsCisgICAgICAgICAgICAgICAgLy8gaW5jbHVkaW5nIHRoZSBtb25pdG9yIHRocmVhZCwgc28gYXBwbGljYXRpb24gY291bGQgcG90ZW50aWFsbHkgd29yay4uLgorICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAga21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIFJ1bm5pbmdBdE1heFByaW9yaXR5ICksCisgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIE1vbml0b3JXaWxsU3RhcnZlICksCisgICAgICAgICAgICAgICAgICAgIEtNUF9ITlQoIFJ1bm5pbmdBdE1heFByaW9yaXR5ICksCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH07IC8vIGlmCisgICAgfQorICAgICNlbmRpZiAvLyBLTVBfUkVBTF9USU1FX0ZJWAorCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBpZiAoIF9fa21wX21vbml0b3Jfd2FrZXVwcyA9PSAxICkgeworICAgICAgICBpbnRlcnZhbC50dl9zZWMgID0gMTsKKyAgICAgICAgaW50ZXJ2YWwudHZfbnNlYyA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50ZXJ2YWwudHZfc2VjICA9IDA7CisgICAgICAgIGludGVydmFsLnR2X25zZWMgPSAoTlNFQ19QRVJfU0VDIC8gX19rbXBfbW9uaXRvcl93YWtldXBzKTsKKyAgICB9CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfbGF1bmNoX21vbml0b3I6ICMyIG1vbml0b3JcbiIgKSApOworCisgICAgaWYgKF9fa21wX3lpZWxkX2N5Y2xlKSB7CisgICAgICAgIF9fa21wX3lpZWxkaW5nX29uID0gMDsgIC8qIFN0YXJ0IG91dCB3aXRoIHlpZWxkaW5nIHNodXQgb2ZmICovCisgICAgICAgIHlpZWxkX2NvdW50ID0gX19rbXBfeWllbGRfb2ZmX2NvdW50OworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3lpZWxkaW5nX29uID0gMTsgIC8qIFlpZWxkaW5nIGlzIG9uIHBlcm1hbmVudGx5ICovCisgICAgfQorCisgICAgd2hpbGUoICEgVENSXzQoIF9fa21wX2dsb2JhbC5nLmdfZG9uZSApICkgeworICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgIG5vdzsKKyAgICAgICAgc3RydWN0IHRpbWV2YWwgICB0dmFsOworCisgICAgICAgIC8qICBUaGlzIHRocmVhZCBtb25pdG9ycyB0aGUgc3RhdGUgb2YgdGhlIHN5c3RlbSAqLworCisgICAgICAgIEtBX1RSQUNFKCAxNSwgKCAiX19rbXBfbGF1bmNoX21vbml0b3I6IHVwZGF0ZVxuIiApICk7CisKKyAgICAgICAgc3RhdHVzID0gZ2V0dGltZW9mZGF5KCAmdHZhbCwgTlVMTCApOworICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTF9FUlJOTyggImdldHRpbWVvZmRheSIsIHN0YXR1cyApOworICAgICAgICBUSU1FVkFMX1RPX1RJTUVTUEVDKCAmdHZhbCwgJm5vdyApOworCisgICAgICAgIG5vdy50dl9zZWMgICs9IGludGVydmFsLnR2X3NlYzsKKyAgICAgICAgbm93LnR2X25zZWMgKz0gaW50ZXJ2YWwudHZfbnNlYzsKKworICAgICAgICBpZiAobm93LnR2X25zZWMgPj0gTlNFQ19QRVJfU0VDKSB7CisgICAgICAgICAgICBub3cudHZfc2VjICArPSAxOworICAgICAgICAgICAgbm93LnR2X25zZWMgLT0gTlNFQ19QRVJfU0VDOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF9sb2NrKCAmIF9fa21wX3dhaXRfbXgubV9tdXRleCApOworICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfbXV0ZXhfbG9jayIsIHN0YXR1cyApOworICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2NvbmRfdGltZWR3YWl0KCAmIF9fa21wX3dhaXRfY3YuY19jb25kLCAmIF9fa21wX3dhaXRfbXgubV9tdXRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiBub3cgKTsKKyAgICAgICAgaWYgKCBzdGF0dXMgIT0gMCApIHsKKyAgICAgICAgICAgIGlmICggc3RhdHVzICE9IEVUSU1FRE9VVCAmJiBzdGF0dXMgIT0gRUlOVFIgKSB7CisgICAgICAgICAgICAgICAgS01QX1NZU0ZBSUwoICJwdGhyZWFkX2NvbmRfdGltZWR3YWl0Iiwgc3RhdHVzICk7CisgICAgICAgICAgICB9OworICAgICAgICB9OworCisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCAmIF9fa21wX3dhaXRfbXgubV9tdXRleCApOworICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfbXV0ZXhfdW5sb2NrIiwgc3RhdHVzICk7CisKKyAgICAgICAgaWYgKF9fa21wX3lpZWxkX2N5Y2xlKSB7CisgICAgICAgICAgICB5aWVsZF9jeWNsZXMrKzsKKyAgICAgICAgICAgIGlmICggKHlpZWxkX2N5Y2xlcyAlIHlpZWxkX2NvdW50KSA9PSAwICkgeworICAgICAgICAgICAgICAgIGlmIChfX2ttcF95aWVsZGluZ19vbikgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF95aWVsZGluZ19vbiA9IDA7ICAgLyogVHVybiBpdCBvZmYgbm93ICovCisgICAgICAgICAgICAgICAgICAgIHlpZWxkX2NvdW50ID0gX19rbXBfeWllbGRfb2ZmX2NvdW50OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX3lpZWxkaW5nX29uID0gMTsgICAvKiBUdXJuIGl0IG9uIG5vdyAqLworICAgICAgICAgICAgICAgICAgICB5aWVsZF9jb3VudCA9IF9fa21wX3lpZWxkX29uX2NvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB5aWVsZF9jeWNsZXMgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX19rbXBfeWllbGRpbmdfb24gPSAxOworICAgICAgICB9CisKKyAgICAgICAgVENXXzQoIF9fa21wX2dsb2JhbC5nLmdfdGltZS5kdC50X3ZhbHVlLAorICAgICAgICAgIFRDUl80KCBfX2ttcF9nbG9iYWwuZy5nX3RpbWUuZHQudF92YWx1ZSApICsgMSApOworCisgICAgICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworICAgIH0KKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9sYXVuY2hfbW9uaXRvcjogIzMgY2xlYW51cFxuIiApICk7CisKKyNpZmRlZiBLTVBfQkxPQ0tfU0lHTkFMUworICAgIHN0YXR1cyA9IHNpZ2ZpbGxzZXQoICYgbmV3X3NldCApOworICAgIEtNUF9DSEVDS19TWVNGQUlMX0VSUk5PKCAic2lnZmlsbHNldCIsIHN0YXR1cyApOworICAgIHN0YXR1cyA9IHB0aHJlYWRfc2lnbWFzayggU0lHX1VOQkxPQ0ssICYgbmV3X3NldCwgTlVMTCApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9zaWdtYXNrIiwgc3RhdHVzICk7CisjZW5kaWYgLyogS01QX0JMT0NLX1NJR05BTFMgKi8KKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9sYXVuY2hfbW9uaXRvcjogIzQgZmluaXNoZWRcbiIgKSApOworCisgICAgaWYoIF9fa21wX2dsb2JhbC5nLmdfYWJvcnQgIT0gMCApIHsKKyAgICAgICAgLyogbm93IHdlIG5lZWQgdG8gdGVybWluYXRlIHRoZSB3b3JrZXIgdGhyZWFkcyAgKi8KKyAgICAgICAgLyogdGhlIHZhbHVlIG9mIHRfYWJvcnQgaXMgdGhlIHNpZ25hbCB3ZSBjYXVnaHQgKi8KKworICAgICAgICBpbnQgZ3RpZDsKKworICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfbGF1bmNoX21vbml0b3I6ICM1IHRlcm1pbmF0ZSBzaWc9JWRcbiIsIF9fa21wX2dsb2JhbC5nLmdfYWJvcnQgKSApOworCisgICAgICAgIC8qIHRlcm1pbmF0ZSB0aGUgT3Blbk1QIHdvcmtlciB0aHJlYWRzICovCisgICAgICAgIC8qIFRPRE8gdGhpcyBpcyBub3QgdmFsaWQgZm9yIHNpYmxpbmcgdGhyZWFkcyEhCisgICAgICAgICAqIHRoZSB1YmVyIG1hc3RlciBtaWdodCBub3QgYmUgMCBhbnltb3JlLi4gKi8KKyAgICAgICAgZm9yIChndGlkID0gMTsgZ3RpZCA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7ICsrZ3RpZCkKKyAgICAgICAgICAgIF9fa21wX3Rlcm1pbmF0ZV90aHJlYWQoIGd0aWQgKTsKKworICAgICAgICBfX2ttcF9jbGVhbnVwKCk7CisKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2xhdW5jaF9tb25pdG9yOiAjNiByYWlzZSBzaWc9JWRcbiIsIF9fa21wX2dsb2JhbC5nLmdfYWJvcnQgKSApOworCisgICAgICAgIGlmIChfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ID4gMCkKKyAgICAgICAgICAgIHJhaXNlKCBfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ICk7CisKKyAgICB9CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfbGF1bmNoX21vbml0b3I6ICM3IGV4aXRcbiIgKSApOworCisgICAgcmV0dXJuIHRocjsKK30KKwordm9pZAorX19rbXBfY3JlYXRlX3dvcmtlciggaW50IGd0aWQsIGttcF9pbmZvX3QgKnRoLCBzaXplX3Qgc3RhY2tfc2l6ZSApCit7CisgICAgcHRocmVhZF90ICAgICAgaGFuZGxlOworICAgIHB0aHJlYWRfYXR0cl90IHRocmVhZF9hdHRyOworICAgIGludCAgICAgICAgICAgIHN0YXR1czsKKworCisgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCA9IGd0aWQ7CisKKyAgICBpZiAoIEtNUF9VQkVSX0dUSUQoZ3RpZCkgKSB7CisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9jcmVhdGVfd29ya2VyOiB1YmVyIHRocmVhZCAoJWQpXG4iLCBndGlkICkgKTsKKyAgICAgICAgdGggLT4gdGgudGhfaW5mby5kcy5kc190aHJlYWQgPSBwdGhyZWFkX3NlbGYoKTsKKyAgICAgICAgX19rbXBfc2V0X3N0YWNrX2luZm8oIGd0aWQsIHRoICk7CisgICAgICAgIF9fa21wX2NoZWNrX3N0YWNrX292ZXJsYXAoIHRoICk7CisgICAgICAgIHJldHVybjsKKyAgICB9OyAvLyBpZgorCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2NyZWF0ZV93b3JrZXI6IHRyeSB0byBjcmVhdGUgdGhyZWFkICglZClcbiIsIGd0aWQgKSApOworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyNpZmRlZiBLTVBfVEhSRUFEX0FUVFIKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gcHRocmVhZF9hdHRyX2luaXQoICZ0aHJlYWRfYXR0ciApOworICAgICAgICAgICAgaWYgKCBzdGF0dXMgIT0gMCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudEluaXRUaHJlYWRBdHRycyApLAorICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBzdGF0dXMgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUoICYgdGhyZWFkX2F0dHIsIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFICk7CisgICAgICAgICAgICBpZiAoIHN0YXR1cyAhPSAwICkgeworICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50U2V0V29ya2VyU3RhdGUgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggc3RhdHVzICksCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9OyAvLyBpZgorCisgICAgICAgICAgICAvKiBTZXQgc3RhY2sgc2l6ZSBmb3IgdGhpcyB0aHJlYWQgbm93LiAqLworICAgICAgICAgICAgc3RhY2tfc2l6ZSArPSBndGlkICogX19rbXBfc3Rrb2Zmc2V0OworCisgICAgICAgICAgICBLQV9UUkFDRSggMTAsICggIl9fa21wX2NyZWF0ZV93b3JrZXI6IFQjJWQsIGRlZmF1bHQgc3RhY2tzaXplID0gJWx1IGJ5dGVzLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fa21wX3N0a3NpemUgPSAlbHUgYnl0ZXMsIGZpbmFsIHN0YWNrc2l6ZSA9ICVsdSBieXRlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCBLTVBfREVGQVVMVF9TVEtTSVpFLCBfX2ttcF9zdGtzaXplLCBzdGFja19zaXplICkgKTsKKworIyBpZmRlZiBfUE9TSVhfVEhSRUFEX0FUVFJfU1RBQ0tTSVpFCisgICAgICAgICAgICAgICAgc3RhdHVzID0gcHRocmVhZF9hdHRyX3NldHN0YWNrc2l6ZSggJiB0aHJlYWRfYXR0ciwgc3RhY2tfc2l6ZSApOworIyAgaWZkZWYgS01QX0JBQ0tVUF9TVEtTSVpFCisgICAgICAgICAgICBpZiAoIHN0YXR1cyAhPSAwICkgeworICAgICAgICAgICAgICAgIGlmICggISBfX2ttcF9lbnZfc3Rrc2l6ZSApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhY2tfc2l6ZSA9IEtNUF9CQUNLVVBfU1RLU0laRSArIGd0aWQgKiBfX2ttcF9zdGtvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0a3NpemUgPSBLTVBfQkFDS1VQX1NUS1NJWkU7CisgICAgICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9jcmVhdGVfd29ya2VyOiBUIyVkLCBkZWZhdWx0IHN0YWNrc2l6ZSA9ICVsdSBieXRlcywgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19rbXBfc3Rrc2l6ZSA9ICVsdSBieXRlcywgKGJhY2t1cCkgZmluYWwgc3RhY2tzaXplID0gJWx1ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCBLTVBfREVGQVVMVF9TVEtTSVpFLCBfX2ttcF9zdGtzaXplLCBzdGFja19zaXplICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfYXR0cl9zZXRzdGFja3NpemUoICZ0aHJlYWRfYXR0ciwgc3RhY2tfc2l6ZSApOworICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICB9OyAvLyBpZgorIyAgZW5kaWYgLyogS01QX0JBQ0tVUF9TVEtTSVpFICovCisgICAgICAgICAgICBpZiAoIHN0YXR1cyAhPSAwICkgeworICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50U2V0V29ya2VyU3RhY2tTaXplLCBzdGFja19zaXplICksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIHN0YXR1cyApLAorICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfSE5UKCBDaGFuZ2VXb3JrZXJTdGFja1NpemUgICksCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9OyAvLyBpZgorIyBlbmRpZiAvKiBfUE9TSVhfVEhSRUFEX0FUVFJfU1RBQ0tTSVpFICovCisgICAgICAgIH0KKyNlbmRpZiAvKiBLTVBfVEhSRUFEX0FUVFIgKi8KKworICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2NyZWF0ZSggJiBoYW5kbGUsICYgdGhyZWFkX2F0dHIsIF9fa21wX2xhdW5jaF93b3JrZXIsICh2b2lkICopIHRoICk7CisgICAgICAgICAgICBpZiAoIHN0YXR1cyAhPSAwIHx8ICEgaGFuZGxlICkgeyAvLyA/Pz8gV2h5IGRvIHdlIGNoZWNrIGhhbmRsZT8/CisjaWZkZWYgX1BPU0lYX1RIUkVBRF9BVFRSX1NUQUNLU0laRQorICAgICAgICAgICAgICAgIGlmICggc3RhdHVzID09IEVJTlZBTCApIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudFNldFdvcmtlclN0YWNrU2l6ZSwgc3RhY2tfc2l6ZSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggc3RhdHVzICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfSE5UKCBJbmNyZWFzZVdvcmtlclN0YWNrU2l6ZSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBpZiAoIHN0YXR1cyA9PSBFTk9NRU0gKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRTZXRXb3JrZXJTdGFja1NpemUsIHN0YWNrX3NpemUgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIHN0YXR1cyApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0hOVCggRGVjcmVhc2VXb3JrZXJTdGFja1NpemUgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH07CisjZW5kaWYgLyogX1BPU0lYX1RIUkVBRF9BVFRSX1NUQUNLU0laRSAqLworICAgICAgICAgICAgICAgIGlmICggc3RhdHVzID09IEVBR0FJTiApIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX01TRyggTm9SZXNvdXJjZXNGb3JXb3JrZXJUaHJlYWQgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIHN0YXR1cyApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0hOVCggRGVjcmVhc2VfTlVNX1RIUkVBRFMgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgS01QX1NZU0ZBSUwoICJwdGhyZWFkX2NyZWF0ZSIsIHN0YXR1cyApOworICAgICAgICAgICAgfTsgLy8gaWYKKworICAgICAgICAgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkID0gaGFuZGxlOworICAgICAgICB9CisKKyNpZmRlZiBLTVBfVEhSRUFEX0FUVFIKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gcHRocmVhZF9hdHRyX2Rlc3Ryb3koICYgdGhyZWFkX2F0dHIgKTsKKyAgICAgICAgICAgIGlmICggc3RhdHVzICkgeworICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAga21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnREZXN0cm95VGhyZWFkQXR0cnMgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggc3RhdHVzICksCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9CisjZW5kaWYgLyogS01QX1RIUkVBRF9BVFRSICovCisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9jcmVhdGVfd29ya2VyOiBkb25lIGNyZWF0aW5nIHRocmVhZCAoJWQpXG4iLCBndGlkICkgKTsKKworfSAvLyBfX2ttcF9jcmVhdGVfd29ya2VyCisKKwordm9pZAorX19rbXBfY3JlYXRlX21vbml0b3IoIGttcF9pbmZvX3QgKnRoICkKK3sKKyAgICBwdGhyZWFkX3QgICAgICAgICAgIGhhbmRsZTsKKyAgICBwdGhyZWFkX2F0dHJfdCAgICAgIHRocmVhZF9hdHRyOworICAgIHNpemVfdCAgICAgICAgICAgICAgc2l6ZTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHN0YXR1czsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGNhbGxlcl9ndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGF1dG9fYWRqX3NpemUgPSBGQUxTRTsKKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9jcmVhdGVfbW9uaXRvcjogdHJ5IHRvIGNyZWF0ZSBtb25pdG9yXG4iICkgKTsKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGlkICA9IEtNUF9HVElEX01PTklUT1I7CisgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCA9IEtNUF9HVElEX01PTklUT1I7CisgICAgI2lmIEtNUF9SRUFMX1RJTUVfRklYCisgICAgICAgIFRDV180KCBfX2ttcF9nbG9iYWwuZy5nX3RpbWUuZHQudF92YWx1ZSwgLTEgKTsgLy8gV2lsbCB1c2UgaXQgZm9yIHN5bmNocm9uaXphdGlvbiBhIGJpdCBsYXRlci4KKyAgICAjZW5kaWYgLy8gS01QX1JFQUxfVElNRV9GSVgKKworICAgICNpZmRlZiBLTVBfVEhSRUFEX0FUVFIKKyAgICAgICAgaWYgKCBfX2ttcF9tb25pdG9yX3N0a3NpemUgPT0gMCApIHsKKyAgICAgICAgICAgIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSA9IEtNUF9ERUZBVUxUX01PTklUT1JfU1RLU0laRTsKKyAgICAgICAgICAgIGF1dG9fYWRqX3NpemUgPSBUUlVFOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfYXR0cl9pbml0KCAmdGhyZWFkX2F0dHIgKTsKKyAgICAgICAgaWYgKCBzdGF0dXMgIT0gMCApIHsKKyAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudEluaXRUaHJlYWRBdHRycyApLAorICAgICAgICAgICAgICAgIEtNUF9FUlIoIHN0YXR1cyApLAorICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICApOworICAgICAgICB9OyAvLyBpZgorICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUoICYgdGhyZWFkX2F0dHIsIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFICk7CisgICAgICAgIGlmICggc3RhdHVzICE9IDAgKSB7CisgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRTZXRNb25pdG9yU3RhdGUgKSwKKyAgICAgICAgICAgICAgICBLTVBfRVJSKCBzdGF0dXMgKSwKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgKTsKKyAgICAgICAgfTsgLy8gaWYKKworICAgICAgICAjaWZkZWYgX1BPU0lYX1RIUkVBRF9BVFRSX1NUQUNLU0laRQorICAgICAgICAgICAgc3RhdHVzID0gcHRocmVhZF9hdHRyX2dldHN0YWNrc2l6ZSggJiB0aHJlYWRfYXR0ciwgJiBzaXplICk7CisgICAgICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfYXR0cl9nZXRzdGFja3NpemUiLCBzdGF0dXMgKTsKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgIHNpemUgPSBfX2ttcF9zeXNfbWluX3N0a3NpemU7CisgICAgICAgICNlbmRpZiAvKiBfUE9TSVhfVEhSRUFEX0FUVFJfU1RBQ0tTSVpFICovCisgICAgI2VuZGlmIC8qIEtNUF9USFJFQURfQVRUUiAqLworCisgICAgaWYgKCBfX2ttcF9tb25pdG9yX3N0a3NpemUgPT0gMCApIHsKKyAgICAgICAgX19rbXBfbW9uaXRvcl9zdGtzaXplID0gS01QX0RFRkFVTFRfTU9OSVRPUl9TVEtTSVpFOworICAgIH0KKyAgICBpZiAoIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSA8IF9fa21wX3N5c19taW5fc3Rrc2l6ZSApIHsKKyAgICAgICAgX19rbXBfbW9uaXRvcl9zdGtzaXplID0gX19rbXBfc3lzX21pbl9zdGtzaXplOworICAgIH0KKworICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBfY3JlYXRlX21vbml0b3I6IGRlZmF1bHQgc3RhY2tzaXplID0gJWx1IGJ5dGVzLCIKKyAgICAgICAgICAgICAgICAgICAgInJlcXVlc3RlZCBzdGFja3NpemUgPSAlbHUgYnl0ZXNcbiIsCisgICAgICAgICAgICAgICAgICAgIHNpemUsIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSApICk7CisKKyAgICByZXRyeToKKworICAgIC8qIFNldCBzdGFjayBzaXplIGZvciB0aGlzIHRocmVhZCBub3cuICovCisKKyAgICAjaWZkZWYgX1BPU0lYX1RIUkVBRF9BVFRSX1NUQUNLU0laRQorICAgICAgICBLQV9UUkFDRSggMTAsICggIl9fa21wX2NyZWF0ZV9tb25pdG9yOiBzZXR0aW5nIHN0YWNrc2l6ZSA9ICVsdSBieXRlcywiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfbW9uaXRvcl9zdGtzaXplICkgKTsKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9hdHRyX3NldHN0YWNrc2l6ZSggJiB0aHJlYWRfYXR0ciwgX19rbXBfbW9uaXRvcl9zdGtzaXplICk7CisgICAgICAgIGlmICggc3RhdHVzICE9IDAgKSB7CisgICAgICAgICAgICBpZiAoIGF1dG9fYWRqX3NpemUgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfbW9uaXRvcl9zdGtzaXplICo9IDI7CisgICAgICAgICAgICAgICAgZ290byByZXRyeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICBrbXBfbXNfd2FybmluZywgIC8vIHNob3VsZCB0aGlzIGJlIGZhdGFsPyAgQkIKKyAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50U2V0TW9uaXRvclN0YWNrU2l6ZSwgKGxvbmcgaW50KSBfX2ttcF9tb25pdG9yX3N0a3NpemUgKSwKKyAgICAgICAgICAgICAgICBLTVBfRVJSKCBzdGF0dXMgKSwKKyAgICAgICAgICAgICAgICBLTVBfSE5UKCBDaGFuZ2VNb25pdG9yU3RhY2tTaXplICksCisgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICk7CisgICAgICAgIH07IC8vIGlmCisgICAgI2VuZGlmIC8qIF9QT1NJWF9USFJFQURfQVRUUl9TVEFDS1NJWkUgKi8KKworICAgIFRDV180KCBfX2ttcF9nbG9iYWwuZy5nX3RpbWUuZHQudF92YWx1ZSwgMCApOworCisgICAgc3RhdHVzID0gcHRocmVhZF9jcmVhdGUoICZoYW5kbGUsICYgdGhyZWFkX2F0dHIsIF9fa21wX2xhdW5jaF9tb25pdG9yLCAodm9pZCAqKSB0aCApOworCisgICAgaWYgKCBzdGF0dXMgIT0gMCApIHsKKyAgICAgICAgI2lmZGVmIF9QT1NJWF9USFJFQURfQVRUUl9TVEFDS1NJWkUKKyAgICAgICAgICAgIGlmICggc3RhdHVzID09IEVJTlZBTCApIHsKKyAgICAgICAgICAgICAgICBpZiAoIGF1dG9fYWRqX3NpemUgICYmICggX19rbXBfbW9uaXRvcl9zdGtzaXplIDwgKHNpemVfdCkweDQwMDAwMDAwICkgKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSAqPSAyOworICAgICAgICAgICAgICAgICAgICBnb3RvIHJldHJ5OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudFNldE1vbml0b3JTdGFja1NpemUsIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSApLAorICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBzdGF0dXMgKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0hOVCggSW5jcmVhc2VNb25pdG9yU3RhY2tTaXplICksCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICBpZiAoIHN0YXR1cyA9PSBFTk9NRU0gKSB7CisgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRTZXRNb25pdG9yU3RhY2tTaXplLCBfX2ttcF9tb25pdG9yX3N0a3NpemUgKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggc3RhdHVzICksCisgICAgICAgICAgICAgICAgICAgIEtNUF9ITlQoIERlY3JlYXNlTW9uaXRvclN0YWNrU2l6ZSApLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAjZW5kaWYgLyogX1BPU0lYX1RIUkVBRF9BVFRSX1NUQUNLU0laRSAqLworICAgICAgICBpZiAoIHN0YXR1cyA9PSBFQUdBSU4gKSB7CisgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgIEtNUF9NU0coIE5vUmVzb3VyY2VzRm9yTW9uaXRvclRocmVhZCApLAorICAgICAgICAgICAgICAgIEtNUF9FUlIoIHN0YXR1cyApLAorICAgICAgICAgICAgICAgIEtNUF9ITlQoIERlY3JlYXNlTnVtYmVyT2ZUaHJlYWRzSW5Vc2UgKSwKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgS01QX1NZU0ZBSUwoICJwdGhyZWFkX2NyZWF0ZSIsIHN0YXR1cyApOworICAgIH07IC8vIGlmCisKKyAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQgPSBoYW5kbGU7CisKKyAgICAjaWYgS01QX1JFQUxfVElNRV9GSVgKKyAgICAgICAgLy8gV2FpdCBmb3IgdGhlIG1vbml0b3IgdGhyZWFkIGlzIHJlYWxseSBzdGFydGVkIGFuZCBzZXQgaXRzICpwcmlvcml0eSouCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHNpemVvZigga21wX3VpbnQzMiApID09IHNpemVvZiggX19rbXBfZ2xvYmFsLmcuZ190aW1lLmR0LnRfdmFsdWUgKSApOworICAgICAgICBfX2ttcF93YWl0X3lpZWxkXzQoCisgICAgICAgICAgICAoa21wX3VpbnQzMiB2b2xhdGlsZSAqKSAmIF9fa21wX2dsb2JhbC5nLmdfdGltZS5kdC50X3ZhbHVlLCAtMSwgJiBfX2ttcF9uZXFfNCwgTlVMTAorICAgICAgICApOworICAgICNlbmRpZiAvLyBLTVBfUkVBTF9USU1FX0ZJWAorCisgICAgI2lmZGVmIEtNUF9USFJFQURfQVRUUgorICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2F0dHJfZGVzdHJveSggJiB0aHJlYWRfYXR0ciApOworICAgICAgICBpZiAoIHN0YXR1cyAhPSAwICkgeworICAgICAgICAgICAgX19rbXBfbXNnKCAgICAvLworICAgICAgICAgICAgICAgIGttcF9tc193YXJuaW5nLAorICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnREZXN0cm95VGhyZWFkQXR0cnMgKSwKKyAgICAgICAgICAgICAgICBLTVBfRVJSKCBzdGF0dXMgKSwKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAjZW5kaWYKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcF9jcmVhdGVfbW9uaXRvcjogbW9uaXRvciBjcmVhdGVkICUjLjhseFxuIiwgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkICkgKTsKKworfSAvLyBfX2ttcF9jcmVhdGVfbW9uaXRvcgorCit2b2lkCitfX2ttcF9leGl0X3RocmVhZCgKKyAgICBpbnQgZXhpdF9zdGF0dXMKKykgeworICAgIHB0aHJlYWRfZXhpdCggKHZvaWQgKikgZXhpdF9zdGF0dXMgKTsKK30gLy8gX19rbXBfZXhpdF90aHJlYWQKKwordm9pZAorX19rbXBfcmVhcF9tb25pdG9yKCBrbXBfaW5mb190ICp0aCApCit7CisgICAgaW50ICAgICAgICAgIHN0YXR1cywgaTsKKyAgICB2b2lkICAgICAgICAqZXhpdF92YWw7CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfcmVhcF9tb25pdG9yOiB0cnkgdG8gcmVhcCBtb25pdG9yIHRocmVhZCB3aXRoIGhhbmRsZSAlIy44bHhcbiIsCisgICAgICAgICAgICAgICAgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkICkgKTsKKworICAgIC8vIElmIG1vbml0b3IgaGFzIGJlZW4gY3JlYXRlZCwgaXRzIHRpZCBhbmQgZ3RpZCBzaG91bGQgYmUgS01QX0dUSURfTU9OSVRPUi4KKyAgICAvLyBJZiBib3RoIHRpZCBhbmQgZ3RpZCBhcmUgMCwgaXQgbWVhbnMgdGhlIG1vbml0b3IgZGlkIG5vdCBldmVyIHN0YXJ0LgorICAgIC8vIElmIGJvdGggdGlkIGFuZCBndGlkIGFyZSBLTVBfR1RJRF9ETkUsIHRoZSBtb25pdG9yIGhhcyBiZWVuIHNodXQgZG93bi4KKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aC0+dGgudGhfaW5mby5kcy5kc190aWQgPT0gdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCApOworICAgIGlmICggdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCAhPSBLTVBfR1RJRF9NT05JVE9SICkgeworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisKKyAgICAvKiBGaXJzdCwgY2hlY2sgdG8gc2VlIHdoZXRoZXIgdGhlIG1vbml0b3IgdGhyZWFkIGV4aXN0cy4gIFRoaXMgY291bGQgcHJldmVudCBhIGhhbmcsCisgICAgICAgYnV0IGlmIHRoZSBtb25pdG9yIGRpZXMgYWZ0ZXIgdGhlIHB0aHJlYWRfa2lsbCBjYWxsIGFuZCBiZWZvcmUgdGhlIHB0aHJlYWRfam9pbgorICAgICAgIGNhbGwsIGl0IHdpbGwgc3RpbGwgaGFuZy4gKi8KKworICAgIHN0YXR1cyA9IHB0aHJlYWRfa2lsbCggdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkLCAwICk7CisgICAgaWYgKHN0YXR1cyA9PSBFU1JDSCkgeworCisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9yZWFwX21vbml0b3I6IG1vbml0b3IgZG9lcyBub3QgZXhpc3QsIHJldHVybmluZ1xuIikgKTsKKworICAgIH0gZWxzZQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9qb2luKCB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQsICYgZXhpdF92YWwpOworICAgICAgICBpZiAoZXhpdF92YWwgIT0gdGgpIHsKKyAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgS01QX01TRyggUmVhcE1vbml0b3JFcnJvciApLAorICAgICAgICAgICAgICAgIEtNUF9FUlIoIHN0YXR1cyApLAorICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgfQorCisgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGlkICA9IEtNUF9HVElEX0RORTsKKyAgICB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkID0gS01QX0dUSURfRE5FOworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3JlYXBfbW9uaXRvcjogZG9uZSByZWFwaW5nIG1vbml0b3IgdGhyZWFkIHdpdGggaGFuZGxlICUjLjhseFxuIiwKKyAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQgKSApOworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKK30KKwordm9pZAorX19rbXBfcmVhcF93b3JrZXIoIGttcF9pbmZvX3QgKnRoICkKK3sKKyAgICBpbnQgICAgICAgICAgc3RhdHVzOworICAgIHZvaWQgICAgICAgICpleGl0X3ZhbDsKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3JlYXBfd29ya2VyOiB0cnkgdG8gcmVhcCBUIyVkXG4iLCB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkICkgKTsKKworICAgIC8qIEZpcnN0LCBjaGVjayB0byBzZWUgd2hldGhlciB0aGUgd29ya2VyIHRocmVhZCBleGlzdHMuICBUaGlzIGNvdWxkIHByZXZlbnQgYSBoYW5nLAorICAgICAgIGJ1dCBpZiB0aGUgd29ya2VyIGRpZXMgYWZ0ZXIgdGhlIHB0aHJlYWRfa2lsbCBjYWxsIGFuZCBiZWZvcmUgdGhlIHB0aHJlYWRfam9pbgorICAgICAgIGNhbGwsIGl0IHdpbGwgc3RpbGwgaGFuZy4gKi8KKworICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2tpbGwoIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCwgMCApOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBFU1JDSCkgeworICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9yZWFwX3dvcmtlcjogd29ya2VyIFQjJWQgZG9lcyBub3QgZXhpc3QsIHJldHVybmluZ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9yZWFwX3dvcmtlcjogdHJ5IHRvIGpvaW4gd2l0aCB3b3JrZXIgVCMlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkICkgKTsKKworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfam9pbiggdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkLCAmIGV4aXRfdmFsKTsKKyNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgICAgICAvKiBEb24ndCBleHBvc2UgdGhlc2UgdG8gdGhlIHVzZXIgdW50aWwgd2UgdW5kZXJzdGFuZCB3aGVuIHRoZXkgdHJpZ2dlciAqLworICAgICAgICAgICAgICAgIGlmICggc3RhdHVzICE9IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIFJlYXBXb3JrZXJFcnJvciApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggc3RhdHVzICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCBleGl0X3ZhbCAhPSB0aCApIHsKKyAgICAgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcF9yZWFwX3dvcmtlcjogd29ya2VyIFQjJWQgZGlkIG5vdCByZWFwIHByb3Blcmx5LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhpdF92YWwgPSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQsIGV4aXRfdmFsICkgKTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogS01QX0RFQlVHICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9yZWFwX3dvcmtlcjogZG9uZSByZWFwaW5nIFQjJWRcbiIsIHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgKSApOworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIEtNUF9IQU5ETEVfU0lHTkFMUworCisKK3N0YXRpYyB2b2lkCitfX2ttcF9udWxsX2hhbmRsZXIoIGludCBzaWdubyApCit7CisgICAgLy8gIERvIG5vdGhpbmcsIGZvciBkb2luZyBTSUdfSUdOLXR5cGUgYWN0aW9ucy4KK30gLy8gX19rbXBfbnVsbF9oYW5kbGVyCisKKworc3RhdGljIHZvaWQKK19fa21wX3RlYW1faGFuZGxlciggaW50IHNpZ25vICkKK3sKKyAgICBpZiAoIF9fa21wX2dsb2JhbC5nLmdfYWJvcnQgPT0gMCApIHsKKyAgICAgICAgLyogU3RhZ2UgMSBzaWduYWwgaGFuZGxlciwgbGV0J3Mgc2h1dCBkb3duIGFsbCBvZiB0aGUgdGhyZWFkcyAqLworICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICBfX2ttcF9kZWJ1Z19wcmludGYoICJfX2ttcF90ZWFtX2hhbmRsZXI6IGNhdWdodCBzaWduYWwgPSAlZFxuIiwgc2lnbm8gKTsKKyAgICAgICAgI2VuZGlmCisgICAgICAgIHN3aXRjaCAoIHNpZ25vICkgeworICAgICAgICAgICAgY2FzZSBTSUdIVVAgIDoKKyAgICAgICAgICAgIGNhc2UgU0lHSU5UICA6CisgICAgICAgICAgICBjYXNlIFNJR1FVSVQgOgorICAgICAgICAgICAgY2FzZSBTSUdJTEwgIDoKKyAgICAgICAgICAgIGNhc2UgU0lHQUJSVCA6CisgICAgICAgICAgICBjYXNlIFNJR0ZQRSAgOgorICAgICAgICAgICAgY2FzZSBTSUdCVVMgIDoKKyAgICAgICAgICAgIGNhc2UgU0lHU0VHViA6CisgICAgICAgICAgICAjaWZkZWYgU0lHU1lTCisgICAgICAgICAgICAgICAgY2FzZSBTSUdTWVMgOgorICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICBjYXNlIFNJR1RFUk0gOgorICAgICAgICAgICAgICAgIGlmICggX19rbXBfZGVidWdfYnVmICkgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9kdW1wX2RlYnVnX2J1ZmZlciggKTsKKyAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgIEtNUF9NQigpOyAgICAgICAvLyBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuCisgICAgICAgICAgICAgICAgVENXXzQoIF9fa21wX2dsb2JhbC5nLmdfYWJvcnQsIHNpZ25vICk7CisgICAgICAgICAgICAgICAgS01QX01CKCk7ICAgICAgIC8vIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4KKyAgICAgICAgICAgICAgICBUQ1dfNCggX19rbXBfZ2xvYmFsLmcuZ19kb25lLCBUUlVFICk7CisgICAgICAgICAgICAgICAgS01QX01CKCk7ICAgICAgIC8vIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgICAgICAgICBfX2ttcF9kZWJ1Z19wcmludGYoICJfX2ttcF90ZWFtX2hhbmRsZXI6IHVua25vd24gc2lnbmFsIHR5cGUiICk7CisgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH07IC8vIHN3aXRjaAorICAgIH07IC8vIGlmCit9IC8vIF9fa21wX3RlYW1faGFuZGxlcgorCisKK3N0YXRpYwordm9pZCBfX2ttcF9zaWdhY3Rpb24oIGludCBzaWdudW0sIGNvbnN0IHN0cnVjdCBzaWdhY3Rpb24gKiBhY3QsIHN0cnVjdCBzaWdhY3Rpb24gKiBvbGRhY3QgKSB7CisgICAgaW50IHJjID0gc2lnYWN0aW9uKCBzaWdudW0sIGFjdCwgb2xkYWN0ICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUxfRVJSTk8oICJzaWdhY3Rpb24iLCByYyApOworfQorCisKK3N0YXRpYyB2b2lkCitfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKCBpbnQgc2lnLCBzaWdfZnVuY190IGhhbmRsZXJfZnVuYywgaW50IHBhcmFsbGVsX2luaXQgKQoreworICAgIEtNUF9NQigpOyAgICAgICAvLyBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuCisgICAgS0JfVFJBQ0UoIDYwLCAoICJfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKCAlZCwgLi4uLCAlZCApXG4iLCBzaWcsIHBhcmFsbGVsX2luaXQgKSApOworICAgIGlmICggcGFyYWxsZWxfaW5pdCApIHsKKyAgICAgICAgc3RydWN0IHNpZ2FjdGlvbiBuZXdfYWN0aW9uOworICAgICAgICBzdHJ1Y3Qgc2lnYWN0aW9uIG9sZF9hY3Rpb247CisgICAgICAgIG5ld19hY3Rpb24uc2FfaGFuZGxlciA9IGhhbmRsZXJfZnVuYzsKKyAgICAgICAgbmV3X2FjdGlvbi5zYV9mbGFncyAgID0gMDsKKyAgICAgICAgc2lnZmlsbHNldCggJiBuZXdfYWN0aW9uLnNhX21hc2sgKTsKKyAgICAgICAgX19rbXBfc2lnYWN0aW9uKCBzaWcsICYgbmV3X2FjdGlvbiwgJiBvbGRfYWN0aW9uICk7CisgICAgICAgIGlmICggb2xkX2FjdGlvbi5zYV9oYW5kbGVyID09IF9fa21wX3NpZ2hsZHJzWyBzaWcgXS5zYV9oYW5kbGVyICkgeworICAgICAgICAgICAgc2lnYWRkc2V0KCAmIF9fa21wX3NpZ3NldCwgc2lnICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBSZXN0b3JlL2tlZXAgdXNlcidzIGhhbmRsZXIgaWYgb25lIHByZXZpb3VzbHkgaW5zdGFsbGVkLgorICAgICAgICAgICAgX19rbXBfc2lnYWN0aW9uKCBzaWcsICYgb2xkX2FjdGlvbiwgTlVMTCApOworICAgICAgICB9OyAvLyBpZgorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFNhdmUgaW5pdGlhbC9zeXN0ZW0gc2lnbmFsIGhhbmRsZXJzIHRvIHNlZSBpZiB1c2VyIGhhbmRsZXJzIGluc3RhbGxlZC4KKyAgICAgICAgX19rbXBfc2lnYWN0aW9uKCBzaWcsIE5VTEwsICYgX19rbXBfc2lnaGxkcnNbIHNpZyBdICk7CisgICAgfTsgLy8gaWYKKyAgICBLTVBfTUIoKTsgICAgICAgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorfSAvLyBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyCisKKworc3RhdGljIHZvaWQKK19fa21wX3JlbW92ZV9vbmVfaGFuZGxlciggaW50IHNpZyApCit7CisgICAgS0JfVFJBQ0UoIDYwLCAoICJfX2ttcF9yZW1vdmVfb25lX2hhbmRsZXIoICVkIClcbiIsIHNpZyApICk7CisgICAgaWYgKCBzaWdpc21lbWJlciggJiBfX2ttcF9zaWdzZXQsIHNpZyApICkgeworICAgICAgICBzdHJ1Y3Qgc2lnYWN0aW9uIG9sZDsKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8vIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4KKyAgICAgICAgX19rbXBfc2lnYWN0aW9uKCBzaWcsICYgX19rbXBfc2lnaGxkcnNbIHNpZyBdLCAmIG9sZCApOworICAgICAgICBpZiAoICggb2xkLnNhX2hhbmRsZXIgIT0gX19rbXBfdGVhbV9oYW5kbGVyICkgJiYgKCBvbGQuc2FfaGFuZGxlciAhPSBfX2ttcF9udWxsX2hhbmRsZXIgKSApIHsKKyAgICAgICAgICAgIC8vIFJlc3RvcmUgdGhlIHVzZXJzIHNpZ25hbCBoYW5kbGVyLgorICAgICAgICAgICAgS0JfVFJBQ0UoIDEwLCAoICJfX2ttcF9yZW1vdmVfb25lX2hhbmRsZXI6IG9vcHMsIG5vdCBvdXIgaGFuZGxlciwgcmVzdG9yaW5nOiBzaWc9JWRcbiIsIHNpZyApICk7CisgICAgICAgICAgICBfX2ttcF9zaWdhY3Rpb24oIHNpZywgJiBvbGQsIE5VTEwgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgc2lnZGVsc2V0KCAmIF9fa21wX3NpZ3NldCwgc2lnICk7CisgICAgICAgIEtNUF9NQigpOyAgICAgICAvLyBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuCisgICAgfTsgLy8gaWYKK30gLy8gX19rbXBfcmVtb3ZlX29uZV9oYW5kbGVyCisKKwordm9pZAorX19rbXBfaW5zdGFsbF9zaWduYWxzKCBpbnQgcGFyYWxsZWxfaW5pdCApCit7CisgICAgS0JfVFJBQ0UoIDEwLCAoICJfX2ttcF9pbnN0YWxsX3NpZ25hbHMoICVkIClcbiIsIHBhcmFsbGVsX2luaXQgKSApOworICAgIGlmICggX19rbXBfaGFuZGxlX3NpZ25hbHMgfHwgISBwYXJhbGxlbF9pbml0ICkgeworICAgICAgICAvLyBJZiAhIHBhcmFsbGVsX2luaXQsIHdlIGRvIG5vdCBpbnN0YWxsIGhhbmRsZXJzLCBqdXN0IHNhdmUgb3JpZ2luYWwgaGFuZGxlcnMuCisgICAgICAgIC8vIExldCB1cyBkbyBpdCBldmVuIF9faGFuZGxlX3NpZ25hbHMgaXMgMC4KKyAgICAgICAgc2lnZW1wdHlzZXQoICYgX19rbXBfc2lnc2V0ICk7CisgICAgICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIFNJR0hVUCwgIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCApOworICAgICAgICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKCBTSUdJTlQsICBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQgKTsKKyAgICAgICAgX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlciggU0lHUVVJVCwgX19rbXBfdGVhbV9oYW5kbGVyLCBwYXJhbGxlbF9pbml0ICk7CisgICAgICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIFNJR0lMTCwgIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCApOworICAgICAgICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKCBTSUdBQlJULCBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQgKTsKKyAgICAgICAgX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlciggU0lHRlBFLCAgX19rbXBfdGVhbV9oYW5kbGVyLCBwYXJhbGxlbF9pbml0ICk7CisgICAgICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIFNJR0JVUywgIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCApOworICAgICAgICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKCBTSUdTRUdWLCBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQgKTsKKyAgICAgICAgI2lmZGVmIFNJR1NZUworICAgICAgICAgICAgX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlciggU0lHU1lTLCAgX19rbXBfdGVhbV9oYW5kbGVyLCBwYXJhbGxlbF9pbml0ICk7CisgICAgICAgICNlbmRpZiAvLyBTSUdTWVMKKyAgICAgICAgX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlciggU0lHVEVSTSwgX19rbXBfdGVhbV9oYW5kbGVyLCBwYXJhbGxlbF9pbml0ICk7CisgICAgICAgICNpZmRlZiBTSUdQSVBFCisgICAgICAgICAgICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKCBTSUdQSVBFLCBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQgKTsKKyAgICAgICAgI2VuZGlmIC8vIFNJR1BJUEUKKyAgICB9OyAvLyBpZgorfSAvLyBfX2ttcF9pbnN0YWxsX3NpZ25hbHMKKworCit2b2lkCitfX2ttcF9yZW1vdmVfc2lnbmFscyggdm9pZCApCit7CisgICAgaW50ICAgIHNpZzsKKyAgICBLQl9UUkFDRSggMTAsICggIl9fa21wX3JlbW92ZV9zaWduYWxzKClcbiIgKSApOworICAgIGZvciAoIHNpZyA9IDE7IHNpZyA8IE5TSUc7ICsrIHNpZyApIHsKKyAgICAgICAgX19rbXBfcmVtb3ZlX29uZV9oYW5kbGVyKCBzaWcgKTsKKyAgICB9OyAvLyBmb3Igc2lnCit9IC8vIF9fa21wX3JlbW92ZV9zaWduYWxzCisKKworI2VuZGlmIC8vIEtNUF9IQU5ETEVfU0lHTkFMUworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkCitfX2ttcF9lbmFibGUoIGludCBuZXdfc3RhdGUgKQoreworICAgICNpZmRlZiBLTVBfQ0FOQ0VMX1RIUkVBRFMKKyAgICAgICAgaW50IHN0YXR1cywgb2xkX3N0YXRlOworICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX3NldGNhbmNlbHN0YXRlKCBuZXdfc3RhdGUsICYgb2xkX3N0YXRlICk7CisgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9zZXRjYW5jZWxzdGF0ZSIsIHN0YXR1cyApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBvbGRfc3RhdGUgPT0gUFRIUkVBRF9DQU5DRUxfRElTQUJMRSApOworICAgICNlbmRpZgorfQorCit2b2lkCitfX2ttcF9kaXNhYmxlKCBpbnQgKiBvbGRfc3RhdGUgKQoreworICAgICNpZmRlZiBLTVBfQ0FOQ0VMX1RIUkVBRFMKKyAgICAgICAgaW50IHN0YXR1czsKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9zZXRjYW5jZWxzdGF0ZSggUFRIUkVBRF9DQU5DRUxfRElTQUJMRSwgb2xkX3N0YXRlICk7CisgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9zZXRjYW5jZWxzdGF0ZSIsIHN0YXR1cyApOworICAgICNlbmRpZgorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZAorX19rbXBfYXRmb3JrX3ByZXBhcmUgKHZvaWQpCit7CisgICAgLyogIG5vdGhpbmcgdG8gZG8gICovCit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9hdGZvcmtfcGFyZW50ICh2b2lkKQoreworICAgIC8qICBub3RoaW5nIHRvIGRvICAqLworfQorCisvKgorICAgIFJlc2V0IHRoZSBsaWJyYXJ5IHNvIGV4ZWN1dGlvbiBpbiB0aGUgY2hpbGQgc3RhcnRzICJhbGwgb3ZlciBhZ2FpbiIgd2l0aAorICAgIGNsZWFuIGRhdGEgc3RydWN0dXJlcyBpbiBpbml0aWFsIHN0YXRlcy4gIERvbid0IHdvcnJ5IGFib3V0IGZyZWVpbmcgbWVtb3J5CisgICAgYWxsb2NhdGVkIGJ5IHBhcmVudCwganVzdCBhYmFuZG9uIGl0IHRvIGJlIHNhZmUuCisqLworc3RhdGljIHZvaWQKK19fa21wX2F0Zm9ya19jaGlsZCAodm9pZCkKK3sKKyAgICAvKiBUT0RPIG1ha2Ugc3VyZSB0aGlzIGlzIGRvbmUgcmlnaHQgZm9yIG5lc3RlZC9zaWJsaW5nICovCisgICAgLy8gQVRUOiAgTWVtb3J5IGxlYWtzIGFyZSBoZXJlPyBUT0RPOiBDaGVjayBpdCBhbmQgZml4LgorICAgIC8qIEtNUF9BU1NFUlQoIDAgKTsgKi8KKworICAgICsrX19rbXBfZm9ya19jb3VudDsKKworICAgIF9fa21wX2luaXRfcnVudGltZSA9IEZBTFNFOworICAgIF9fa21wX2luaXRfbW9uaXRvciA9IDA7CisgICAgX19rbXBfaW5pdF9wYXJhbGxlbCA9IEZBTFNFOworICAgIF9fa21wX2luaXRfbWlkZGxlID0gRkFMU0U7CisgICAgX19rbXBfaW5pdF9zZXJpYWwgPSBGQUxTRTsKKyAgICBUQ1dfNChfX2ttcF9pbml0X2d0aWQsIEZBTFNFKTsKKyAgICBfX2ttcF9pbml0X2NvbW1vbiA9IEZBTFNFOworCisgICAgVENXXzQoX19rbXBfaW5pdF91c2VyX2xvY2tzLCBGQUxTRSk7CisgICAgX19rbXBfdXNlcl9sb2NrX3RhYmxlLnVzZWQgPSAwOworICAgIF9fa21wX3VzZXJfbG9ja190YWJsZS5hbGxvY2F0ZWQgPSAwOworICAgIF9fa21wX3VzZXJfbG9ja190YWJsZS50YWJsZSA9IE5VTEw7CisgICAgX19rbXBfbG9ja19ibG9ja3MgPSBOVUxMOworCisgICAgX19rbXBfYWxsX250aCA9IDA7CisgICAgVENXXzQoX19rbXBfbnRoLCAwKTsKKworICAgIC8qIE11c3QgYWN0dWFsbHkgemVybyBhbGwgdGhlICpjYWNoZSBhcmd1bWVudHMgcGFzc2VkIHRvIF9fa21wY190aHJlYWRwcml2YXRlIGhlcmUKKyAgICAgICBzbyB0aHJlYWRwcml2YXRlIGRvZXNuJ3QgdXNlIHN0YWxlIGRhdGEgKi8KKyAgICBLQV9UUkFDRSggMTAsICggIl9fa21wX2F0Zm9ya19jaGlsZDogY2hlY2tpbmcgY2FjaGUgYWRkcmVzcyBsaXN0ICVwXG4iLAorICAgICAgICAgICAgICAgICBfX2ttcF90aHJlYWRwcml2X2NhY2hlX2xpc3QgKSApOworCisgICAgd2hpbGUgKCBfX2ttcF90aHJlYWRwcml2X2NhY2hlX2xpc3QgIT0gTlVMTCApIHsKKworICAgICAgICBpZiAoICpfX2ttcF90aHJlYWRwcml2X2NhY2hlX2xpc3QgLT4gYWRkciAhPSBOVUxMICkgeworICAgICAgICAgICAgS0NfVFJBQ0UoIDUwLCAoICJfX2ttcF9hdGZvcmtfY2hpbGQ6IHplcm9pbmcgY2FjaGUgYXQgYWRkcmVzcyAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICYoKl9fa21wX3RocmVhZHByaXZfY2FjaGVfbGlzdCAtPiBhZGRyKSApICk7CisKKyAgICAgICAgICAgICpfX2ttcF90aHJlYWRwcml2X2NhY2hlX2xpc3QgLT4gYWRkciA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfdGhyZWFkcHJpdl9jYWNoZV9saXN0ID0gX19rbXBfdGhyZWFkcHJpdl9jYWNoZV9saXN0IC0+IG5leHQ7CisgICAgfQorCisgICAgX19rbXBfaW5pdF9ydW50aW1lID0gRkFMU0U7CisKKyAgICAvKiByZXNldCBzdGF0aWNhbGx5IGluaXRpYWxpemVkIGxvY2tzICovCisgICAgX19rbXBfaW5pdF9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKKyAgICBfX2ttcF9pbml0X2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfc3RkaW9fbG9jayApOworICAgIF9fa21wX2luaXRfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9jb25zb2xlX2xvY2sgKTsKKworICAgIC8qIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VyZSBubyBzdGFsZSBkYXRhIGlzIGxlZnQgYXJvdW5kICovCisgICAgLyogQUM6IGN1c3RvbWVycyBjb21wbGFpbiB0aGF0IHdlIHVzZSB1bnNhZmUgcm91dGluZXMgaW4gdGhlIGF0Zm9yaworICAgICAgIGhhbmRsZXIuIE1hdGh3b3JrczogZGxzeW0oKSBpcyB1bnNhZmUuIFdlIGNhbGwgZGxzeW0gYW5kIGRsb3BlbgorICAgICAgIGluIGR5bmFtaWNfbGluayB3aGVuIGNoZWNrIHRoZSBwcmVzZW5jZSBvZiBzaGFyZWQgdGJibWFsbG9jIGxpYnJhcnkuCisgICAgICAgU3VnZ2VzdGlvbiBpcyB0byBtYWtlIHRoZSBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIGxhemllciwgc2ltaWxhcgorICAgICAgIHRvIHdoYXQgZG9uZSBmb3IgX19rbXBjX2JlZ2luKCkuICovCisgICAgLy8gVE9ETzogc3luY2hyb25pemUgYWxsIHN0YXRpYyBpbml0aWFsaXphdGlvbnMgd2l0aCByZWd1bGFyIGxpYnJhcnkKKyAgICAvLyAgICAgICBzdGFydHVwOyBsb29rIGF0IGttcF9nbG9iYWwuYyBhbmQgZXRjLgorICAgIC8vX19rbXBfaW50ZXJuYWxfYmVnaW4gKCk7CisKK30KKwordm9pZAorX19rbXBfcmVnaXN0ZXJfYXRmb3JrKHZvaWQpIHsKKyAgICBpZiAoIF9fa21wX25lZWRfcmVnaXN0ZXJfYXRmb3JrICkgeworICAgICAgICBpbnQgc3RhdHVzID0gcHRocmVhZF9hdGZvcmsoIF9fa21wX2F0Zm9ya19wcmVwYXJlLCBfX2ttcF9hdGZvcmtfcGFyZW50LCBfX2ttcF9hdGZvcmtfY2hpbGQgKTsKKyAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX2F0Zm9yayIsIHN0YXR1cyApOworICAgICAgICBfX2ttcF9uZWVkX3JlZ2lzdGVyX2F0Zm9yayA9IEZBTFNFOworICAgIH0KK30KKwordm9pZAorX19rbXBfc3VzcGVuZF9pbml0aWFsaXplKCB2b2lkICkKK3sKKyAgICBpbnQgc3RhdHVzOworICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQoICZfX2ttcF9zdXNwZW5kX211dGV4X2F0dHIgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfbXV0ZXhhdHRyX2luaXQiLCBzdGF0dXMgKTsKKyAgICBzdGF0dXMgPSBwdGhyZWFkX2NvbmRhdHRyX2luaXQoICZfX2ttcF9zdXNwZW5kX2NvbmRfYXR0ciApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9jb25kYXR0cl9pbml0Iiwgc3RhdHVzICk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdXNwZW5kX2luaXRpYWxpemVfdGhyZWFkKCBrbXBfaW5mb190ICp0aCApCit7CisgICAgaWYgKCB0aC0+dGgudGhfc3VzcGVuZF9pbml0X2NvdW50IDw9IF9fa21wX2ZvcmtfY291bnQgKSB7CisgICAgICAgIC8qIHRoaXMgbWVhbnMgd2UgaGF2ZW4ndCBpbml0aWFsaXplZCB0aGUgc3VzcGVuc2lvbiBwdGhyZWFkIG9iamVjdHMgZm9yIHRoaXMgdGhyZWFkCisgICAgICAgICAgIGluIHRoaXMgaW5zdGFuY2Ugb2YgdGhlIHByb2Nlc3MgKi8KKyAgICAgICAgaW50ICAgICBzdGF0dXM7CisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF9pbml0KCAmdGgtPnRoLnRoX3N1c3BlbmRfY3YuY19jb25kLCAmX19rbXBfc3VzcGVuZF9jb25kX2F0dHIgKTsKKyAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX2NvbmRfaW5pdCIsIHN0YXR1cyApOworICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2luaXQoICZ0aC0+dGgudGhfc3VzcGVuZF9teC5tX211dGV4LCAmIF9fa21wX3N1c3BlbmRfbXV0ZXhfYXR0ciApOworICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfbXV0ZXhfaW5pdCIsIHN0YXR1cyApOworICAgICAgICAqKHZvbGF0aWxlIGludCopJnRoLT50aC50aF9zdXNwZW5kX2luaXRfY291bnQgPSBfX2ttcF9mb3JrX2NvdW50ICsgMTsKKyAgICB9OworfQorCit2b2lkCitfX2ttcF9zdXNwZW5kX3VuaW5pdGlhbGl6ZV90aHJlYWQoIGttcF9pbmZvX3QgKnRoICkKK3sKKyAgICBpZih0aC0+dGgudGhfc3VzcGVuZF9pbml0X2NvdW50ID4gX19rbXBfZm9ya19jb3VudCkgeworICAgICAgICAvKiB0aGlzIG1lYW5zIHdlIGhhdmUgaW5pdGlhbGl6ZSB0aGUgc3VzcGVuc2lvbiBwdGhyZWFkIG9iamVjdHMgZm9yIHRoaXMgdGhyZWFkCisgICAgICAgICAgIGluIHRoaXMgaW5zdGFuY2Ugb2YgdGhlIHByb2Nlc3MgKi8KKyAgICAgICAgaW50IHN0YXR1czsKKworICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2NvbmRfZGVzdHJveSggJnRoLT50aC50aF9zdXNwZW5kX2N2LmNfY29uZCApOworICAgICAgICBpZiAoIHN0YXR1cyAhPSAwICYmIHN0YXR1cyAhPSBFQlVTWSApIHsKKyAgICAgICAgICAgIEtNUF9TWVNGQUlMKCAicHRocmVhZF9jb25kX2Rlc3Ryb3kiLCBzdGF0dXMgKTsKKyAgICAgICAgfTsKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF9kZXN0cm95KCAmdGgtPnRoLnRoX3N1c3BlbmRfbXgubV9tdXRleCApOworICAgICAgICBpZiAoIHN0YXR1cyAhPSAwICYmIHN0YXR1cyAhPSBFQlVTWSApIHsKKyAgICAgICAgICAgIEtNUF9TWVNGQUlMKCAicHRocmVhZF9tdXRleF9kZXN0cm95Iiwgc3RhdHVzICk7CisgICAgICAgIH07CisgICAgICAgIC0tdGgtPnRoLnRoX3N1c3BlbmRfaW5pdF9jb3VudDsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0aC0+dGgudGhfc3VzcGVuZF9pbml0X2NvdW50ID09IF9fa21wX2ZvcmtfY291bnQpOworICAgIH0KK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBwdXRzIHRoZSBjYWxsaW5nIHRocmVhZCB0byBzbGVlcCBhZnRlciBzZXR0aW5nIHRoZQorICogc2xlZXAgYml0IGZvciB0aGUgaW5kaWNhdGVkIHNwaW4gdmFyaWFibGUgdG8gdHJ1ZS4KKyAqLworCit2b2lkCitfX2ttcF9zdXNwZW5kKCBpbnQgdGhfZ3RpZCwgdm9sYXRpbGUga21wX3VpbnQgKnNwaW5uZXIsIGttcF91aW50IGNoZWNrZXIgKQoreworICAgIGttcF9pbmZvX3QgKnRoID0gX19rbXBfdGhyZWFkc1t0aF9ndGlkXTsKKyAgICBpbnQgc3RhdHVzOworICAgIGttcF91aW50IG9sZF9zcGluOworCisgICAgS0ZfVFJBQ0UoIDMwLCAoIl9fa21wX3N1c3BlbmQ6IFQjJWQgZW50ZXIgZm9yIHNwaW4gPSAlcFxuIiwgdGhfZ3RpZCwgc3Bpbm5lciApICk7CisKKyAgICBfX2ttcF9zdXNwZW5kX2luaXRpYWxpemVfdGhyZWFkKCB0aCApOworCisgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF9sb2NrKCAmdGgtPnRoLnRoX3N1c3BlbmRfbXgubV9tdXRleCApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9tdXRleF9sb2NrIiwgc3RhdHVzICk7CisKKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX3N1c3BlbmQ6IFQjJWQgc2V0dGluZyBzbGVlcCBiaXQgZm9yIHNwaW4oJXApXG4iLAorICAgICAgICAgICAgICAgICAgICB0aF9ndGlkLCBzcGlubmVyICkgKTsKKworICAgIC8qIFRPRE86IHNob3VsZG4ndCB0aGlzIHVzZSByZWxlYXNlIHNlbWFudGljcyB0byBlbnN1cmUgdGhhdCBfX2ttcF9zdXNwZW5kX2luaXRpYWxpemVfdGhyZWFkCisgICAgICAgZ2V0cyBjYWxsZWQgZmlyc3Q/CisgICAgKi8KKyAgICBvbGRfc3BpbiA9IEtNUF9URVNUX1RIRU5fT1IzMiggKHZvbGF0aWxlIGttcF9pbnQzMiAqKSBzcGlubmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9CQVJSSUVSX1NMRUVQX1NUQVRFICk7CisKKyAgICBLRl9UUkFDRSggNSwgKCAiX19rbXBfc3VzcGVuZDogVCMlZCBzZXQgc2xlZXAgYml0IGZvciBzcGluKCVwKT09JWRcbiIsCisgICAgICAgICAgICAgICAgICAgdGhfZ3RpZCwgc3Bpbm5lciwgKnNwaW5uZXIgKSApOworCisgICAgaWYgKCBvbGRfc3BpbiA9PSBjaGVja2VyICkgeworICAgICAgICBLTVBfVEVTVF9USEVOX0FORDMyKCAodm9sYXRpbGUga21wX2ludDMyICopIHNwaW5uZXIsIH4oS01QX0JBUlJJRVJfU0xFRVBfU1RBVEUpICk7CisKKyAgICAgICAgS0ZfVFJBQ0UoIDUsICggIl9fa21wX3N1c3BlbmQ6IFQjJWQgZmFsc2UgYWxhcm0sIHJlc2V0IHNsZWVwIGJpdCBmb3Igc3BpbiglcClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHRoX2d0aWQsIHNwaW5uZXIpICk7CisgICAgfSBlbHNlIHsKKworICAgICAgICAvKiBFbmNhcHN1bGF0ZSBpbiBhIGxvb3AgYXMgdGhlIGRvY3VtZW50YXRpb24gc3RhdGVzIHRoYXQgdGhpcyBtYXkKKyAgICAgICAgICogIndpdGggbG93IHByb2JhYmlsaXR5IiByZXR1cm4gd2hlbiB0aGUgY29uZGl0aW9uIHZhcmlhYmxlIGhhcworICAgICAgICAgKiBub3QgYmVlbiBzaWduYWxlZCBvciBicm9hZGNhc3QKKyAgICAgICAgICovCisgICAgICAgIGludCBkZWFjdGl2YXRlZCA9IEZBTFNFOworICAgICAgICBUQ1dfUFRSKHRoLT50aC50aF9zbGVlcF9sb2MsIHNwaW5uZXIpOworICAgICAgICB3aGlsZSAoIFRDUl80KCAqc3Bpbm5lciApICYgS01QX0JBUlJJRVJfU0xFRVBfU1RBVEUgKSB7CisjaWZkZWYgREVCVUdfU1VTUEVORAorICAgICAgICAgICAgY2hhciBidWZmZXJbMTI4XTsKKyAgICAgICAgICAgIF9fa21wX3N1c3BlbmRfY291bnQrKzsKKyAgICAgICAgICAgIF9fa21wX3ByaW50X2NvbmQoIGJ1ZmZlciwgJnRoLT50aC50aF9zdXNwZW5kX2N2ICk7CisgICAgICAgICAgICBfX2ttcF9wcmludGYoICJfX2ttcF9zdXNwZW5kOiBzdXNwZW5kaW5nIFQjJWQ6ICVzXG4iLCB0aF9ndGlkLCBidWZmZXIgKTsKKyNlbmRpZgorCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gTWFyayB0aGUgdGhyZWFkIGFzIG5vIGxvbmdlciBhY3RpdmUKKyAgICAgICAgICAgIC8vIChvbmx5IGluIHRoZSBmaXJzdCBpdGVyYXRpb24gb2YgdGhlIGxvb3ApLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmICggISBkZWFjdGl2YXRlZCApIHsKKyAgICAgICAgICAgICAgICB0aC0+dGgudGhfYWN0aXZlID0gRkFMU0U7CisgICAgICAgICAgICAgICAgaWYgKCB0aC0+dGgudGhfYWN0aXZlX2luX3Bvb2wgKSB7CisgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9hY3RpdmVfaW5fcG9vbCA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICBLTVBfVEVTVF9USEVOX0RFQzMyKAorICAgICAgICAgICAgICAgICAgICAgIChrbXBfaW50MzIgKikgJl9fa21wX3RocmVhZF9wb29sX2FjdGl2ZV9udGggKTsKKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggVENSXzQoX19rbXBfdGhyZWFkX3Bvb2xfYWN0aXZlX250aCkgPj0gMCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZWFjdGl2YXRlZCA9IFRSVUU7CisKKworICAgICAgICAgICAgfQorCisjaWYgVVNFX1NVU1BFTkRfVElNRU9VVAorICAgICAgICAgICAgc3RydWN0IHRpbWVzcGVjICBub3c7CisgICAgICAgICAgICBzdHJ1Y3QgdGltZXZhbCAgIHR2YWw7CisgICAgICAgICAgICBpbnQgbXNlY3M7CisKKyAgICAgICAgICAgIHN0YXR1cyA9IGdldHRpbWVvZmRheSggJnR2YWwsIE5VTEwgKTsKKyAgICAgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMX0VSUk5PKCAiZ2V0dGltZW9mZGF5Iiwgc3RhdHVzICk7CisgICAgICAgICAgICBUSU1FVkFMX1RPX1RJTUVTUEVDKCAmdHZhbCwgJm5vdyApOworCisgICAgICAgICAgICBtc2VjcyA9ICg0Kl9fa21wX2RmbHRfYmxvY2t0aW1lKSArIDIwMDsKKyAgICAgICAgICAgIG5vdy50dl9zZWMgICs9IG1zZWNzIC8gMTAwMDsKKyAgICAgICAgICAgIG5vdy50dl9uc2VjICs9IChtc2VjcyAlIDEwMDApKjEwMDA7CisKKyAgICAgICAgICAgIEtGX1RSQUNFKCAxNSwgKCAiX19rbXBfc3VzcGVuZDogVCMlZCBhYm91dCB0byBwZXJmb3JtIHB0aHJlYWRfY29uZF90aW1lZHdhaXRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhfZ3RpZCApICk7CisgICAgICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2NvbmRfdGltZWR3YWl0KCAmdGgtPnRoLnRoX3N1c3BlbmRfY3YuY19jb25kLCAmdGgtPnRoLnRoX3N1c3BlbmRfbXgubV9tdXRleCwgJiBub3cgKTsKKyNlbHNlCisgICAgICAgICAgICBLRl9UUkFDRSggMTUsICggIl9fa21wX3N1c3BlbmQ6IFQjJWQgYWJvdXQgdG8gcGVyZm9ybSBwdGhyZWFkX2NvbmRfd2FpdFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aF9ndGlkICkgKTsKKworICAgICAgICAgICAgc3RhdHVzID0gcHRocmVhZF9jb25kX3dhaXQoICZ0aC0+dGgudGhfc3VzcGVuZF9jdi5jX2NvbmQsICZ0aC0+dGgudGhfc3VzcGVuZF9teC5tX211dGV4ICk7CisjZW5kaWYKKworICAgICAgICAgICAgaWYgKCAoc3RhdHVzICE9IDApICYmIChzdGF0dXMgIT0gRUlOVFIpICYmIChzdGF0dXMgIT0gRVRJTUVET1VUKSApIHsKKyAgICAgICAgICAgICAgICBLTVBfU1lTRkFJTCggInB0aHJlYWRfY29uZF93YWl0Iiwgc3RhdHVzICk7CisgICAgICAgICAgICB9CisjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEVUSU1FRE9VVCkgeworICAgICAgICAgICAgICAgIGlmICggKCpzcGlubmVyKSAmIEtNUF9CQVJSSUVSX1NMRUVQX1NUQVRFICkgeworICAgICAgICAgICAgICAgICAgICBLRl9UUkFDRSggMTAwLCAoICJfX2ttcF9zdXNwZW5kOiBUIyVkIHRpbWVvdXQgd2FrZXVwXG4iLCB0aF9ndGlkICkgKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBLRl9UUkFDRSggMiwgKCAiX19rbXBfc3VzcGVuZDogVCMlZCB0aW1lb3V0IHdha2V1cCwgc2xlZXAgYml0IG5vdCBzZXQhXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aF9ndGlkICkgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKCAoKnNwaW5uZXIpICYgS01QX0JBUlJJRVJfU0xFRVBfU1RBVEUgKSB7CisgICAgICAgICAgICAgICAgS0ZfVFJBQ0UoIDEwMCwgKCAiX19rbXBfc3VzcGVuZDogVCMlZCBzcHVyaW91cyB3YWtldXBcbiIsIHRoX2d0aWQgKSApOworICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgfSAvLyB3aGlsZQorCisgICAgICAgIC8vCisgICAgICAgIC8vIE1hcmsgdGhlIHRocmVhZCBhcyBhY3RpdmUgYWdhaW4KKyAgICAgICAgLy8gKGlmIGl0IHdhcyBwcmV2aW91cyBtYXJrZWQgYXMgaW5hY3RpdmUpCisgICAgICAgIC8vCisgICAgICAgIGlmICggZGVhY3RpdmF0ZWQgKSB7CisgICAgICAgICAgICB0aC0+dGgudGhfYWN0aXZlID0gVFJVRTsKKyAgICAgICAgICAgIGlmICggVENSXzQodGgtPnRoLnRoX2luX3Bvb2wpICkgeworICAgICAgICAgICAgICAgIEtNUF9URVNUX1RIRU5fSU5DMzIoCisgICAgICAgICAgICAgICAgICAoa21wX2ludDMyICopICZfX2ttcF90aHJlYWRfcG9vbF9hY3RpdmVfbnRoICk7CisgICAgICAgICAgICAgICAgdGgtPnRoLnRoX2FjdGl2ZV9pbl9wb29sID0gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworI2lmZGVmIERFQlVHX1NVU1BFTkQKKyAgICB7CisgICAgICAgIGNoYXIgYnVmZmVyWzEyOF07CisgICAgICAgIF9fa21wX3ByaW50X2NvbmQoIGJ1ZmZlciwgJnRoLT50aC50aF9zdXNwZW5kX2N2KTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCAiX19rbXBfc3VzcGVuZDogVCMlZCBoYXMgYXdha2VuZWQ6ICVzXG4iLCB0aF9ndGlkLCBidWZmZXIgKTsKKyAgICB9CisjZW5kaWYKKworCisgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF91bmxvY2soICZ0aC0+dGgudGhfc3VzcGVuZF9teC5tX211dGV4ICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX211dGV4X3VubG9jayIsIHN0YXR1cyApOworCisgICAgS0ZfVFJBQ0UoIDMwLCAoIl9fa21wX3N1c3BlbmQ6IFQjJWQgZXhpdFxuIiwgdGhfZ3RpZCApICk7Cit9CisKKworLyogVGhpcyByb3V0aW5lIHNpZ25hbHMgdGhlIHRocmVhZCBzcGVjaWZpZWQgYnkgdGFyZ2V0X2d0aWQgdG8gd2FrZSB1cAorICogYWZ0ZXIgc2V0dGluZyB0aGUgc2xlZXAgYml0IGluZGljYXRlZCBieSB0aGUgc3BpbiBhcmd1bWVudCB0byBGQUxTRS4KKyAqIFRoZSB0YXJnZXQgdGhyZWFkIG11c3QgYWxyZWFkeSBoYXZlIGNhbGxlZCBfX2ttcF9zdXNwZW5kKCkKKyAqLworCit2b2lkCitfX2ttcF9yZXN1bWUoIGludCB0YXJnZXRfZ3RpZCwgdm9sYXRpbGUga21wX3VpbnQgKnNwaW4gKQoreworICAgIGttcF9pbmZvX3QgKnRoID0gX19rbXBfdGhyZWFkc1t0YXJnZXRfZ3RpZF07CisgICAgaW50IHN0YXR1czsKKyAgICBrbXBfdWludCBvbGRfc3BpbjsKKworI2lmZGVmIEtNUF9ERUJVRworICAgIGludCBndGlkID0gVENSXzQoX19rbXBfaW5pdF9ndGlkKSA/IF9fa21wX2dldF9ndGlkKCkgOiAtMTsKKyNlbmRpZgorCisgICAgS0ZfVFJBQ0UoIDMwLCAoICJfX2ttcF9yZXN1bWU6IFQjJWQgd2FudHMgdG8gd2FrZXVwIFQjJWQgZW50ZXJcbiIsCisgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRhcmdldF9ndGlkICkgKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIGd0aWQgIT0gdGFyZ2V0X2d0aWQgKTsKKworICAgIF9fa21wX3N1c3BlbmRfaW5pdGlhbGl6ZV90aHJlYWQoIHRoICk7CisKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2xvY2soICZ0aC0+dGgudGhfc3VzcGVuZF9teC5tX211dGV4ICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX211dGV4X2xvY2siLCBzdGF0dXMgKTsKKyAgICBpZiAoIHNwaW4gPT0gTlVMTCApIHsKKyAgICAgICAgc3BpbiA9ICh2b2xhdGlsZSBrbXBfdWludCAqKVRDUl9QVFIodGgtPnRoLnRoX3NsZWVwX2xvYyk7CisgICAgICAgIGlmICggc3BpbiA9PSBOVUxMICkgeworICAgICAgICAgICAgS0ZfVFJBQ0UoIDUsICggIl9fa21wX3Jlc3VtZTogVCMlZCBleGl0aW5nLCB0aHJlYWQgVCMlZCBhbHJlYWR5IGF3YWtlIC0gIHNwaW4oJXApXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0YXJnZXRfZ3RpZCwgc3BpbiApICk7CisKKyAgICAgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCAmdGgtPnRoLnRoX3N1c3BlbmRfbXgubV9tdXRleCApOworICAgICAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX211dGV4X3VubG9jayIsIHN0YXR1cyApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgb2xkX3NwaW4gPSBLTVBfVEVTVF9USEVOX0FORDMyKCAoa21wX2ludDMyIHZvbGF0aWxlICopIHNwaW4sCisgICAgICB+KCBLTVBfQkFSUklFUl9TTEVFUF9TVEFURSApICk7CisgICAgaWYgKCAoIG9sZF9zcGluICYgS01QX0JBUlJJRVJfU0xFRVBfU1RBVEUgKSA9PSAwICkgeworICAgICAgICBLRl9UUkFDRSggNSwgKCAiX19rbXBfcmVzdW1lOiBUIyVkIGV4aXRpbmcsIHRocmVhZCBUIyVkIGFscmVhZHkgYXdha2UgLSAgc3BpbiglcCk6ICIKKyAgICAgICAgICAgICAgICAgICAiJXUgPT4gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFyZ2V0X2d0aWQsIHNwaW4sIG9sZF9zcGluLCAqc3BpbiApICk7CisKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF91bmxvY2soICZ0aC0+dGgudGhfc3VzcGVuZF9teC5tX211dGV4ICk7CisgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9tdXRleF91bmxvY2siLCBzdGF0dXMgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBUQ1dfUFRSKHRoLT50aC50aF9zbGVlcF9sb2MsIE5VTEwpOworCisgICAgS0ZfVFJBQ0UoIDUsICggIl9fa21wX3Jlc3VtZTogVCMlZCBhYm91dCB0byB3YWtldXAgVCMlZCwgcmVzZXQgc2xlZXAgYml0IGZvciBzcGluKCVwKTogIgorICAgICAgICAgICAgICAgICAgICIldSA9PiAldVxuIiwKKyAgICAgICAgICAgICAgICAgICBndGlkLCB0YXJnZXRfZ3RpZCwgc3Bpbiwgb2xkX3NwaW4sICpzcGluICkgKTsKKworI2lmZGVmIERFQlVHX1NVU1BFTkQKKyAgICB7CisgICAgICAgIGNoYXIgYnVmZmVyWzEyOF07CisgICAgICAgIF9fa21wX3ByaW50X2NvbmQoIGJ1ZmZlciwgJnRoLT50aC50aF9zdXNwZW5kX2N2ICk7CisgICAgICAgIF9fa21wX3ByaW50ZiggIl9fa21wX3Jlc3VtZTogVCMlZCByZXN1bWluZyBUIyVkOiAlc1xuIiwgZ3RpZCwgdGFyZ2V0X2d0aWQsIGJ1ZmZlciApOworICAgIH0KKyNlbmRpZgorCisKKyAgICBzdGF0dXMgPSBwdGhyZWFkX2NvbmRfc2lnbmFsKCAmdGgtPnRoLnRoX3N1c3BlbmRfY3YuY19jb25kICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX2NvbmRfc2lnbmFsIiwgc3RhdHVzICk7CisgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF91bmxvY2soICZ0aC0+dGgudGhfc3VzcGVuZF9teC5tX211dGV4ICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX211dGV4X3VubG9jayIsIHN0YXR1cyApOworICAgIEtGX1RSQUNFKCAzMCwgKCAiX19rbXBfcmVzdW1lOiBUIyVkIGV4aXRpbmcgYWZ0ZXIgc2lnbmFsaW5nIHdha2UgdXAgZm9yIFQjJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRhcmdldF9ndGlkICkgKTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkCitfX2ttcF95aWVsZCggaW50IGNvbmQgKQoreworICAgIGlmIChjb25kICYmIF9fa21wX3lpZWxkaW5nX29uKSB7CisgICAgICAgIHNjaGVkX3lpZWxkKCk7CisgICAgfQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkCitfX2ttcF9ndGlkX3NldF9zcGVjaWZpYyggaW50IGd0aWQgKQoreworICAgIGludCBzdGF0dXM7CisgICAgS01QX0FTU0VSVCggX19rbXBfaW5pdF9ydW50aW1lICk7CisgICAgc3RhdHVzID0gcHRocmVhZF9zZXRzcGVjaWZpYyggX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSwgKHZvaWQqKShndGlkKzEpICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX3NldHNwZWNpZmljIiwgc3RhdHVzICk7Cit9CisKK2ludAorX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKQoreworICAgIGludCBndGlkOworICAgIGlmICggIV9fa21wX2luaXRfcnVudGltZSApIHsKKyAgICAgICAgS0FfVFJBQ0UoIDUwLCAoIl9fa21wX2dldF9zcGVjaWZpYzogcnVudGltZSBzaHV0ZG93biwgcmV0dXJuaW5nIEtNUF9HVElEX1NIVVRET1dOXG4iICkgKTsKKyAgICAgICAgcmV0dXJuIEtNUF9HVElEX1NIVVRET1dOOworICAgIH0KKyAgICBndGlkID0gKGludCkoc2l6ZV90KXB0aHJlYWRfZ2V0c3BlY2lmaWMoIF9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXkgKTsKKyAgICBpZiAoIGd0aWQgPT0gMCApIHsKKyAgICAgICAgZ3RpZCA9IEtNUF9HVElEX0RORTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGd0aWQtLTsKKyAgICB9CisgICAgS0FfVFJBQ0UoIDUwLCAoIl9fa21wX2d0aWRfZ2V0X3NwZWNpZmljOiBrZXk6JWQgZ3RpZDolZFxuIiwKKyAgICAgICAgICAgICAgIF9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXksIGd0aWQgKSk7CisgICAgcmV0dXJuIGd0aWQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2RvdWJsZQorX19rbXBfcmVhZF9jcHVfdGltZSggdm9pZCApCit7CisgICAgLypjbG9ja190ICAgdDsqLworICAgIHN0cnVjdCB0bXMgIGJ1ZmZlcjsKKworICAgIC8qdCA9Ki8gIHRpbWVzKCAmIGJ1ZmZlciApOworCisgICAgcmV0dXJuIChidWZmZXIudG1zX3V0aW1lICsgYnVmZmVyLnRtc19jdXRpbWUpIC8gKGRvdWJsZSkgQ0xPQ0tTX1BFUl9TRUM7Cit9CisKK2ludAorX19rbXBfcmVhZF9zeXN0ZW1faW5mbyggc3RydWN0IGttcF9zeXNfaW5mbyAqaW5mbyApCit7CisgICAgaW50IHN0YXR1czsKKyAgICBzdHJ1Y3QgcnVzYWdlIHJfdXNhZ2U7CisKKyAgICBtZW1zZXQoIGluZm8sIDAsIHNpemVvZiggKmluZm8gKSApOworCisgICAgc3RhdHVzID0gZ2V0cnVzYWdlKCBSVVNBR0VfU0VMRiwgJnJfdXNhZ2UpOworICAgIEtNUF9DSEVDS19TWVNGQUlMX0VSUk5PKCAiZ2V0cnVzYWdlIiwgc3RhdHVzICk7CisKKyAgICBpbmZvLT5tYXhyc3MgID0gcl91c2FnZS5ydV9tYXhyc3M7ICAvKiB0aGUgbWF4aW11bSByZXNpZGVudCBzZXQgc2l6ZSB1dGlsaXplZCAoaW4ga2lsb2J5dGVzKSAgICAgKi8KKyAgICBpbmZvLT5taW5mbHQgID0gcl91c2FnZS5ydV9taW5mbHQ7ICAvKiB0aGUgbnVtYmVyIG9mIHBhZ2UgZmF1bHRzIHNlcnZpY2VkIHdpdGhvdXQgYW55IEkvTyAgICAgICAgKi8KKyAgICBpbmZvLT5tYWpmbHQgID0gcl91c2FnZS5ydV9tYWpmbHQ7ICAvKiB0aGUgbnVtYmVyIG9mIHBhZ2UgZmF1bHRzIHNlcnZpY2VkIHRoYXQgcmVxdWlyZWQgSS9PICAgICAgKi8KKyAgICBpbmZvLT5uc3dhcCAgID0gcl91c2FnZS5ydV9uc3dhcDsgICAvKiB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgcHJvY2VzcyB3YXMgInN3YXBwZWQiIG91dCBvZiBtZW1vcnkgKi8KKyAgICBpbmZvLT5pbmJsb2NrID0gcl91c2FnZS5ydV9pbmJsb2NrOyAvKiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBmaWxlIHN5c3RlbSBoYWQgdG8gcGVyZm9ybSBpbnB1dCAgKi8KKyAgICBpbmZvLT5vdWJsb2NrID0gcl91c2FnZS5ydV9vdWJsb2NrOyAvKiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBmaWxlIHN5c3RlbSBoYWQgdG8gcGVyZm9ybSBvdXRwdXQgKi8KKyAgICBpbmZvLT5udmNzdyAgID0gcl91c2FnZS5ydV9udmNzdzsgICAvKiB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgY29udGV4dCBzd2l0Y2ggd2FzIHZvbHVudGFyaWx5ICAgICAgKi8KKyAgICBpbmZvLT5uaXZjc3cgID0gcl91c2FnZS5ydV9uaXZjc3c7ICAvKiB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgY29udGV4dCBzd2l0Y2ggd2FzIGZvcmNlZCAgICAgICAgICAgKi8KKworICAgIHJldHVybiAoc3RhdHVzICE9IDApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKK3ZvaWQKK19fa21wX3JlYWRfc3lzdGVtX3RpbWUoIGRvdWJsZSAqZGVsdGEgKQoreworICAgIGRvdWJsZSAgICAgICAgICAgICAgdF9uczsKKyAgICBzdHJ1Y3QgdGltZXZhbCAgICAgIHR2YWw7CisgICAgc3RydWN0IHRpbWVzcGVjICAgICBzdG9wOworICAgIGludCBzdGF0dXM7CisKKyAgICBzdGF0dXMgPSBnZXR0aW1lb2ZkYXkoICZ0dmFsLCBOVUxMICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUxfRVJSTk8oICJnZXR0aW1lb2ZkYXkiLCBzdGF0dXMgKTsKKyAgICBUSU1FVkFMX1RPX1RJTUVTUEVDKCAmdHZhbCwgJnN0b3AgKTsKKyAgICB0X25zID0gVFMyTlMoc3RvcCkgLSBUUzJOUyhfX2ttcF9zeXNfdGltZXJfZGF0YS5zdGFydCk7CisgICAgKmRlbHRhID0gKHRfbnMgKiAxZS05KTsKK30KKwordm9pZAorX19rbXBfY2xlYXJfc3lzdGVtX3RpbWUoIHZvaWQgKQoreworICAgIHN0cnVjdCB0aW1ldmFsIHR2YWw7CisgICAgaW50IHN0YXR1czsKKyAgICBzdGF0dXMgPSBnZXR0aW1lb2ZkYXkoICZ0dmFsLCBOVUxMICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUxfRVJSTk8oICJnZXR0aW1lb2ZkYXkiLCBzdGF0dXMgKTsKKyAgICBUSU1FVkFMX1RPX1RJTUVTUEVDKCAmdHZhbCwgJl9fa21wX3N5c190aW1lcl9kYXRhLnN0YXJ0ICk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZmRlZiBCVUlMRF9UVgorCit2b2lkCitfX2ttcF90dl90aHJlYWRwcml2YXRlX3N0b3JlKCBrbXBfaW5mb190ICp0aCwgdm9pZCAqZ2xvYmFsX2FkZHIsIHZvaWQgKnRocmVhZF9hZGRyICkKK3sKKyAgICBzdHJ1Y3QgdHZfZGF0YSAqcDsKKworICAgIHAgPSAoc3RydWN0IHR2X2RhdGEgKikgX19rbXBfYWxsb2NhdGUoIHNpemVvZiggKnAgKSApOworCisgICAgcC0+dS50cC5nbG9iYWxfYWRkciA9IGdsb2JhbF9hZGRyOworICAgIHAtPnUudHAudGhyZWFkX2FkZHIgPSB0aHJlYWRfYWRkcjsKKworICAgIHAtPnR5cGUgPSAodm9pZCAqKSAxOworCisgICAgcC0+bmV4dCA9ICB0aC0+dGgudGhfbG9jYWwudHZfZGF0YTsKKyAgICB0aC0+dGgudGhfbG9jYWwudHZfZGF0YSA9IHA7CisKKyAgICBpZiAoIHAtPm5leHQgPT0gMCApIHsKKyAgICAgICAgaW50IHJjID0gcHRocmVhZF9zZXRzcGVjaWZpYyggX19rbXBfdHZfa2V5LCBwICk7CisgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9zZXRzcGVjaWZpYyIsIHJjICk7CisgICAgfQorfQorCisjZW5kaWYgLyogQlVJTERfVFYgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludAorX19rbXBfZ2V0X3hwcm9jKCB2b2lkICkgeworCisgICAgaW50IHIgPSAwOworCisgICAgI2lmIEtNUF9PU19MSU5VWAorCisgICAgICAgIHIgPSBzeXNjb25mKCBfU0NfTlBST0NFU1NPUlNfT05MTiApOworCisgICAgI2VsaWYgS01QX09TX0RBUldJTgorCisgICAgICAgIC8vIEJ1ZyBDNzcwMTEgSGlnaCAiT3Blbk1QIFRocmVhZHMgYW5kIG51bWJlciBvZiBhY3RpdmUgY29yZXMiLgorCisgICAgICAgIC8vIEZpbmQgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgQ1BVcy4KKyAgICAgICAga2Vybl9yZXR1cm5fdCAgICAgICAgICByYzsKKyAgICAgICAgaG9zdF9iYXNpY19pbmZvX2RhdGFfdCBpbmZvOworICAgICAgICBtYWNoX21zZ190eXBlX251bWJlcl90IG51bSA9IEhPU1RfQkFTSUNfSU5GT19DT1VOVDsKKyAgICAgICAgcmMgPSBob3N0X2luZm8oIG1hY2hfaG9zdF9zZWxmKCksIEhPU1RfQkFTSUNfSU5GTywgKGhvc3RfaW5mb190KSAmIGluZm8sICYgbnVtICk7CisgICAgICAgIGlmICggcmMgPT0gMCAmJiBudW0gPT0gSE9TVF9CQVNJQ19JTkZPX0NPVU5UICkgeworICAgICAgICAgICAgLy8gQ2Fubm90IHVzZSBLQV9UUkFDRSgpIGhlcmUgYmVjYXVzZSB0aGlzIGNvZGUgd29ya3MgYmVmb3JlIHRyYWNlIHN1cHBvcnQgaXMKKyAgICAgICAgICAgIC8vIGluaXRpYWxpemVkLgorICAgICAgICAgICAgciA9IGluZm8uYXZhaWxfY3B1czsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBDYW50R2V0TnVtQXZhaWxDUFUgKTsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oIEFzc3VtZWROdW1DUFUgKTsKKyAgICAgICAgfTsgLy8gaWYKKworICAgICNlbGlmIEtNUF9PU19GUkVFQlNECisKKyAgICAgICAgaW50IG1pYltdID0geyBDVExfSFcsIEhXX05DUFUgfTsKKyAgICAgICAgc2l6ZV90IGxlbiA9IHNpemVvZiggciApOworICAgICAgICBpZiAoIHN5c2N0bCggbWliLCAyLCAmciwgJmxlbiwgTlVMTCwgMCApIDwgMCApIHsKKyAgICAgICAgICAgIHIgPSAwOworICAgICAgICAgICAgS01QX1dBUk5JTkcoIENhbnRHZXROdW1BdmFpbENQVSApOworICAgICAgICAgICAgS01QX0lORk9STSggQXNzdW1lZE51bUNQVSApOworICAgICAgICB9CisKKyAgICAjZWxzZQorCisgICAgICAgICNlcnJvciAiVW5rbm93biBvciB1bnN1cHBvcnRlZCBPUy4iCisKKyAgICAjZW5kaWYKKworICAgIHJldHVybiByID4gMCA/IHIgOiAyOyAvKiBndWVzcyB2YWx1ZSBvZiAyIGlmIE9TIHRvbGQgdXMgMCAqLworCit9IC8vIF9fa21wX2dldF94cHJvYworCitpbnQKK19fa21wX3JlYWRfZnJvbV9maWxlKCBjaGFyIGNvbnN0ICpwYXRoLCBjaGFyIGNvbnN0ICpmb3JtYXQsIC4uLiApCit7CisgICAgaW50IHJlc3VsdDsKKyAgICB2YV9saXN0IGFyZ3M7CisKKyAgICB2YV9zdGFydChhcmdzLCBmb3JtYXQpOworICAgIEZJTEUgKmYgPSBmb3BlbihwYXRoLCAicmIiKTsKKyAgICBpZiAoIGYgPT0gTlVMTCApCisgICAgICAgIHJldHVybiAwOworICAgIHJlc3VsdCA9IHZmc2NhbmYoZiwgZm9ybWF0LCBhcmdzKTsKKyAgICBmY2xvc2UoZik7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkCitfX2ttcF9ydW50aW1lX2luaXRpYWxpemUoIHZvaWQgKQoreworICAgIGludCBzdGF0dXM7CisgICAgcHRocmVhZF9tdXRleGF0dHJfdCBtdXRleF9hdHRyOworICAgIHB0aHJlYWRfY29uZGF0dHJfdCAgY29uZF9hdHRyOworCisgICAgaWYgKCBfX2ttcF9pbml0X3J1bnRpbWUgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9OyAvLyBpZgorCisgICAgI2lmICggS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCApCisgICAgICAgIGlmICggISBfX2ttcF9jcHVpbmZvLmluaXRpYWxpemVkICkgeworICAgICAgICAgICAgX19rbXBfcXVlcnlfY3B1aWQoICZfX2ttcF9jcHVpbmZvICk7CisgICAgICAgIH07IC8vIGlmCisgICAgI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworICAgIF9fa21wX3hwcm9jID0gX19rbXBfZ2V0X3hwcm9jKCk7CisKKyAgICBpZiAoIHN5c2NvbmYoIF9TQ19USFJFQURTICkgKSB7CisKKyAgICAgICAgLyogUXVlcnkgdGhlIG1heGltdW0gbnVtYmVyIG9mIHRocmVhZHMgKi8KKyAgICAgICAgX19rbXBfc3lzX21heF9udGggPSBzeXNjb25mKCBfU0NfVEhSRUFEX1RIUkVBRFNfTUFYICk7CisgICAgICAgIGlmICggX19rbXBfc3lzX21heF9udGggPT0gLTEgKSB7CisgICAgICAgICAgICAvKiBVbmxpbWl0ZWQgdGhyZWFkcyBmb3IgTlBUTCAqLworICAgICAgICAgICAgX19rbXBfc3lzX21heF9udGggPSBJTlRfTUFYOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBfX2ttcF9zeXNfbWF4X250aCA8PSAxICkgeworICAgICAgICAgICAgLyogQ2FuJ3QgdGVsbCwganVzdCB1c2UgUFRIUkVBRF9USFJFQURTX01BWCAqLworICAgICAgICAgICAgX19rbXBfc3lzX21heF9udGggPSBLTVBfTUFYX05USDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFF1ZXJ5IHRoZSBtaW5pbXVtIHN0YWNrIHNpemUgKi8KKyAgICAgICAgX19rbXBfc3lzX21pbl9zdGtzaXplID0gc3lzY29uZiggX1NDX1RIUkVBRF9TVEFDS19NSU4gKTsKKyAgICAgICAgaWYgKCBfX2ttcF9zeXNfbWluX3N0a3NpemUgPD0gMSApIHsKKyAgICAgICAgICAgIF9fa21wX3N5c19taW5fc3Rrc2l6ZSA9IEtNUF9NSU5fU1RLU0laRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFNldCB1cCBtaW5pbXVtIG51bWJlciBvZiB0aHJlYWRzIHRvIHN3aXRjaCB0byBUTFMgZ3RpZCAqLworICAgIF9fa21wX3Rsc19ndGlkX21pbiA9IEtNUF9UTFNfR1RJRF9NSU47CisKKworICAgICNpZmRlZiBCVUlMRF9UVgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgcmMgPSBwdGhyZWFkX2tleV9jcmVhdGUoICYgX19rbXBfdHZfa2V5LCAwICk7CisgICAgICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfa2V5X2NyZWF0ZSIsIHJjICk7CisgICAgICAgIH0KKyAgICAjZW5kaWYKKworICAgIHN0YXR1cyA9IHB0aHJlYWRfa2V5X2NyZWF0ZSggJl9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXksIF9fa21wX2ludGVybmFsX2VuZF9kZXN0ICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX2tleV9jcmVhdGUiLCBzdGF0dXMgKTsKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4YXR0cl9pbml0KCAmIG11dGV4X2F0dHIgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfbXV0ZXhhdHRyX2luaXQiLCBzdGF0dXMgKTsKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2luaXQoICYgX19rbXBfd2FpdF9teC5tX211dGV4LCAmIG11dGV4X2F0dHIgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfbXV0ZXhfaW5pdCIsIHN0YXR1cyApOworICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZGF0dHJfaW5pdCggJiBjb25kX2F0dHIgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfY29uZGF0dHJfaW5pdCIsIHN0YXR1cyApOworICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF9pbml0KCAmIF9fa21wX3dhaXRfY3YuY19jb25kLCAmIGNvbmRfYXR0ciApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9jb25kX2luaXQiLCBzdGF0dXMgKTsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2luaXRpYWxpemUoKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICBfX2ttcF9pbml0X3J1bnRpbWUgPSBUUlVFOworfQorCit2b2lkCitfX2ttcF9ydW50aW1lX2Rlc3Ryb3koIHZvaWQgKQoreworICAgIGludCBzdGF0dXM7CisKKyAgICBpZiAoICEgX19rbXBfaW5pdF9ydW50aW1lICkgeworICAgICAgICByZXR1cm47IC8vIE5vdGhpbmcgdG8gZG8uCisgICAgfTsKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfZGVzdHJveSgpOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIHN0YXR1cyA9IHB0aHJlYWRfa2V5X2RlbGV0ZSggX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9rZXlfZGVsZXRlIiwgc3RhdHVzICk7CisgICAgI2lmZGVmIEJVSUxEX1RWCisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfa2V5X2RlbGV0ZSggX19rbXBfdHZfa2V5ICk7CisgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9rZXlfZGVsZXRlIiwgc3RhdHVzICk7CisgICAgI2VuZGlmCisKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2Rlc3Ryb3koICYgX19rbXBfd2FpdF9teC5tX211dGV4ICk7CisgICAgaWYgKCBzdGF0dXMgIT0gMCAmJiBzdGF0dXMgIT0gRUJVU1kgKSB7CisgICAgICAgIEtNUF9TWVNGQUlMKCAicHRocmVhZF9tdXRleF9kZXN0cm95Iiwgc3RhdHVzICk7CisgICAgfQorICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF9kZXN0cm95KCAmIF9fa21wX3dhaXRfY3YuY19jb25kICk7CisgICAgaWYgKCBzdGF0dXMgIT0gMCAmJiBzdGF0dXMgIT0gRUJVU1kgKSB7CisgICAgICAgIEtNUF9TWVNGQUlMKCAicHRocmVhZF9jb25kX2Rlc3Ryb3kiLCBzdGF0dXMgKTsKKyAgICB9CisgICAgI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfdW5pbml0aWFsaXplKCk7CisgICAgI2VuZGlmCisKKyAgICBfX2ttcF9pbml0X3J1bnRpbWUgPSBGQUxTRTsKK30KKworCisvKiBQdXQgdGhlIHRocmVhZCB0byBzbGVlcCBmb3IgYSB0aW1lIHBlcmlvZCAqLworLyogTk9URTogbm90IGN1cnJlbnRseSB1c2VkIGFueXdoZXJlICovCit2b2lkCitfX2ttcF90aHJlYWRfc2xlZXAoIGludCBtaWxsaXMgKQoreworICAgIHNsZWVwKCAgKCBtaWxsaXMgKyA1MDAgKSAvIDEwMDAgKTsKK30KKworLyogQ2FsY3VsYXRlIHRoZSBlbGFwc2VkIHdhbGwgY2xvY2sgdGltZSBmb3IgdGhlIHVzZXIgKi8KK3ZvaWQKK19fa21wX2VsYXBzZWQoIGRvdWJsZSAqdCApCit7CisgICAgaW50IHN0YXR1czsKKyMgaWZkZWYgRklYX1NHSV9DTE9DSworICAgIHN0cnVjdCB0aW1lc3BlYyB0czsKKworICAgIHN0YXR1cyA9IGNsb2NrX2dldHRpbWUoIENMT0NLX1BST0NFU1NfQ1BVVElNRV9JRCwgJnRzICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUxfRVJSTk8oICJjbG9ja19nZXR0aW1lIiwgc3RhdHVzICk7CisgICAgKnQgPSAoZG91YmxlKSB0cy50dl9uc2VjICogKDEuMCAvIChkb3VibGUpIE5TRUNfUEVSX1NFQykgKworICAgICAgICAoZG91YmxlKSB0cy50dl9zZWM7CisjIGVsc2UKKyAgICBzdHJ1Y3QgdGltZXZhbCB0djsKKworICAgIHN0YXR1cyA9IGdldHRpbWVvZmRheSggJiB0diwgTlVMTCApOworICAgIEtNUF9DSEVDS19TWVNGQUlMX0VSUk5PKCAiZ2V0dGltZW9mZGF5Iiwgc3RhdHVzICk7CisgICAgKnQgPSAoZG91YmxlKSB0di50dl91c2VjICogKDEuMCAvIChkb3VibGUpIFVTRUNfUEVSX1NFQykgKworICAgICAgICAoZG91YmxlKSB0di50dl9zZWM7CisjIGVuZGlmCit9CisKKy8qIENhbGN1bGF0ZSB0aGUgZWxhcHNlZCB3YWxsIGNsb2NrIHRpY2sgZm9yIHRoZSB1c2VyICovCit2b2lkCitfX2ttcF9lbGFwc2VkX3RpY2soIGRvdWJsZSAqdCApCit7CisgICAgKnQgPSAxIC8gKGRvdWJsZSkgQ0xPQ0tTX1BFUl9TRUM7Cit9CisKKy8qCisgICAgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGdpdmVuIGFkZHJlc3MgaXMgbWFwcGVkIGludG8gdGhlIGN1cnJlbnQgYWRkcmVzcyBzcGFjZS4KKyovCisKK2ludAorX19rbXBfaXNfYWRkcmVzc19tYXBwZWQoIHZvaWQgKiBhZGRyICkgeworCisgICAgaW50IGZvdW5kID0gMDsKKyAgICBpbnQgcmM7CisKKyAgICAjaWYgS01QX09TX0xJTlVYCisKKyAgICAgICAgLyoKKyAgICAgICAgICAgIE9uIExpbnV4KiBPUywgcmVhZCB0aGUgL3Byb2MvPHBpZD4vbWFwcyBwc2V1ZG8tZmlsZSB0byBnZXQgYWxsIHRoZSBhZGRyZXNzIHJhbmdlcyBtYXBwZWQKKyAgICAgICAgICAgIGludG8gdGhlIGFkZHJlc3Mgc3BhY2UuCisgICAgICAgICovCisKKyAgICAgICAgY2hhciAqIG5hbWUgPSBfX2ttcF9zdHJfZm9ybWF0KCAiL3Byb2MvJWQvbWFwcyIsIGdldHBpZCgpICk7CisgICAgICAgIEZJTEUgKiBmaWxlICA9IE5VTEw7CisKKyAgICAgICAgZmlsZSA9IGZvcGVuKCBuYW1lLCAiciIgKTsKKyAgICAgICAgS01QX0FTU0VSVCggZmlsZSAhPSBOVUxMICk7CisKKyAgICAgICAgZm9yICggOyA7ICkgeworCisgICAgICAgICAgICB2b2lkICogYmVnaW5uaW5nID0gTlVMTDsKKyAgICAgICAgICAgIHZvaWQgKiBlbmRpbmcgICAgPSBOVUxMOworICAgICAgICAgICAgY2hhciAgIHBlcm1zWyA1IF07CisKKyAgICAgICAgICAgIHJjID0gZnNjYW5mKCBmaWxlLCAiJXAtJXAgJTRzICUqW15cbl1cbiIsICYgYmVnaW5uaW5nLCAmIGVuZGluZywgcGVybXMgKTsKKyAgICAgICAgICAgIGlmICggcmMgPT0gRU9GICkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoIHJjID09IDMgJiYgc3RybGVuKCBwZXJtcyApID09IDQgKTsgLy8gTWFrZSBzdXJlIGFsbCBmaWVsZHMgYXJlIHJlYWQuCisKKyAgICAgICAgICAgIC8vIEVuZGluZyBhZGRyZXNzIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgcmVnaW9uLCBidXQgYmVnaW5uaW5nIGlzLgorICAgICAgICAgICAgaWYgKCAoIGFkZHIgPj0gYmVnaW5uaW5nICkgJiYgKCBhZGRyIDwgZW5kaW5nICkgKSB7CisgICAgICAgICAgICAgICAgcGVybXNbIDIgXSA9IDA7ICAgIC8vIDN0aCBhbmQgNHRoIGNoYXJhY3RlciBkb2VzIG5vdCBtYXR0ZXIuCisgICAgICAgICAgICAgICAgaWYgKCBzdHJjbXAoIHBlcm1zLCAicnciICkgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTWVtb3J5IHdlIGFyZSBsb29raW5nIGZvciBzaG91bGQgYmUgcmVhZGFibGUgYW5kIHdyaXRhYmxlLgorICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IDE7CisgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH07IC8vIGlmCisKKyAgICAgICAgfTsgLy8gZm9yZXZlcgorCisgICAgICAgIC8vIEZyZWUgcmVzb3VyY2VzLgorICAgICAgICBmY2xvc2UoIGZpbGUgKTsKKyAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoIG5hbWUgKTsKKworICAgICNlbGlmIEtNUF9PU19EQVJXSU4KKworICAgICAgICAvKgorICAgICAgICAgICAgT24gT1MgWCosIC9wcm9jIHBzZXVkbyBmaWxlc3lzdGVtIGlzIG5vdCBhdmFpbGFibGUuIFRyeSB0byByZWFkIG1lbW9yeSB1c2luZyB2bQorICAgICAgICAgICAgaW50ZXJmYWNlLgorICAgICAgICAqLworCisgICAgICAgIGludCAgICAgICBidWZmZXI7CisgICAgICAgIHZtX3NpemVfdCBjb3VudDsKKyAgICAgICAgcmMgPQorICAgICAgICAgICAgdm1fcmVhZF9vdmVyd3JpdGUoCisgICAgICAgICAgICAgICAgbWFjaF90YXNrX3NlbGYoKSwgICAgICAgICAgIC8vIFRhc2sgdG8gcmVhZCBtZW1vcnkgb2YuCisgICAgICAgICAgICAgICAgKHZtX2FkZHJlc3NfdCkoIGFkZHIgKSwgICAgIC8vIEFkZHJlc3MgdG8gcmVhZCBmcm9tLgorICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgdG8gYmUgcmVhZC4KKyAgICAgICAgICAgICAgICAodm1fYWRkcmVzc190KSggJiBidWZmZXIgKSwgLy8gQWRkcmVzcyBvZiBidWZmZXIgdG8gc2F2ZSByZWFkIGJ5dGVzIGluLgorICAgICAgICAgICAgICAgICYgY291bnQgICAgICAgICAgICAgICAgICAgICAvLyBBZGRyZXNzIG9mIHZhciB0byBzYXZlIG51bWJlciBvZiByZWFkIGJ5dGVzIGluLgorICAgICAgICAgICAgKTsKKyAgICAgICAgaWYgKCByYyA9PSAwICkgeworICAgICAgICAgICAgLy8gTWVtb3J5IHN1Y2Nlc3NmdWxseSByZWFkLgorICAgICAgICAgICAgZm91bmQgPSAxOworICAgICAgICB9OyAvLyBpZgorCisgICAgI2VsaWYgS01QX09TX0ZSRUVCU0QKKworICAgICAgICAvLyBGSVhNRShGcmVlQlNEKTogSW1wbGVtZW50IHRoaXMuCisgICAgICAgIGZvdW5kID0gMTsKKworICAgICNlbHNlCisKKyAgICAgICAgI2Vycm9yICJVbmtub3duIG9yIHVuc3VwcG9ydGVkIE9TIgorCisgICAgI2VuZGlmCisKKyAgICByZXR1cm4gZm91bmQ7CisKK30gLy8gX19rbXBfaXNfYWRkcmVzc19tYXBwZWQKKworI2lmZGVmIFVTRV9MT0FEX0JBTEFOQ0UKKworCisjIGlmIEtNUF9PU19EQVJXSU4KKworLy8gVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJvdW5kZWQgdmFsdWUgb2YgdGhlIHN5c3RlbSBsb2FkIGF2ZXJhZ2UKKy8vIGR1cmluZyBnaXZlbiB0aW1lIGludGVydmFsIHdoaWNoIGRlcGVuZHMgb24gdGhlIHZhbHVlIG9mCisvLyBfX2ttcF9sb2FkX2JhbGFuY2VfaW50ZXJ2YWwgdmFyaWFibGUgKGRlZmF1bHQgaXMgNjAgc2VjLCBvdGhlciB2YWx1ZXMKKy8vIG1heSBiZSAzMDAgc2VjIG9yIDkwMCBzZWMpLgorLy8gSXQgcmV0dXJucyAtMSBpbiBjYXNlIG9mIGVycm9yLgoraW50CitfX2ttcF9nZXRfbG9hZF9iYWxhbmNlKCBpbnQgbWF4ICkKK3sKKyAgICBkb3VibGUgYXZlcmFnZXNbM107CisgICAgaW50IHJldF9hdmcgPSAwOworCisgICAgaW50IHJlcyA9IGdldGxvYWRhdmcoIGF2ZXJhZ2VzLCAzICk7CisKKyAgICAvL0NoZWNrIF9fa21wX2xvYWRfYmFsYW5jZV9pbnRlcnZhbCB0byBkZXRlcm1pbmUgd2hpY2ggb2YgYXZlcmFnZXMgdG8gdXNlLgorICAgIC8vIGdldGxvYWRhdmcoKSBtYXkgcmV0dXJuIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBsZXNzIHRoYW4gcmVxdWVzdGVkIHRoYXQgaXMKKyAgICAvLyBsZXNzIHRoYW4gMy4KKyAgICBpZiAoIF9fa21wX2xvYWRfYmFsYW5jZV9pbnRlcnZhbCA8IDE4MCAmJiAoIHJlcyA+PSAxICkgKSB7CisgICAgICAgIHJldF9hdmcgPSBhdmVyYWdlc1swXTsvLyAxIG1pbgorICAgIH0gZWxzZSBpZiAoICggX19rbXBfbG9hZF9iYWxhbmNlX2ludGVydmFsID49IDE4MAorICAgICAgICAgICAgICAgICAgJiYgX19rbXBfbG9hZF9iYWxhbmNlX2ludGVydmFsIDwgNjAwICkgJiYgKCByZXMgPj0gMiApICkgeworICAgICAgICByZXRfYXZnID0gYXZlcmFnZXNbMV07Ly8gNSBtaW4KKyAgICB9IGVsc2UgaWYgKCAoIF9fa21wX2xvYWRfYmFsYW5jZV9pbnRlcnZhbCA+PSA2MDAgKSAmJiAoIHJlcyA9PSAzICkgKSB7CisgICAgICAgIHJldF9hdmcgPSBhdmVyYWdlc1syXTsvLyAxNSBtaW4KKyAgICB9IGVsc2Ugey8vIEVycm9yIG9jY3VycmVkCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0X2F2ZzsKK30KKworIyBlbHNlIC8vIExpbnV4KiBPUworCisvLyBUaGUgZnVjdGlvbiByZXR1cm5zIG51bWJlciBvZiBydW5uaW5nIChub3Qgc2xlZXBpbmcpIHRocmVhZHMsIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IuCisvLyBFcnJvciBjb3VsZCBiZSByZXBvcnRlZCBpZiBMaW51eCogT1Mga2VybmVsIHRvbyBvbGQgKHdpdGhvdXQgIi9wcm9jIiBzdXBwb3J0KS4KKy8vIENvdW50aW5nIHJ1bm5pbmcgdGhyZWFkcyBzdG9wcyBpZiBtYXggcnVubmluZyB0aHJlYWRzIGVuY291bnRlcmVkLgoraW50CitfX2ttcF9nZXRfbG9hZF9iYWxhbmNlKCBpbnQgbWF4ICkKK3sKKyAgICBzdGF0aWMgaW50IHBlcm1hbmVudF9lcnJvciA9IDA7CisKKyAgICBzdGF0aWMgaW50ICAgICBnbGJfcnVubmluZ190aHJlYWRzICAgICAgICAgID0gMDsgIC8qIFNhdmVkIGNvdW50IG9mIHRoZSBydW5uaW5nIHRocmVhZHMgZm9yIHRoZSB0aHJlYWQgYmFsYW5jZSBhbGdvcnRpaG0gKi8KKyAgICBzdGF0aWMgZG91YmxlICBnbGJfY2FsbF90aW1lID0gMDsgIC8qIFRocmVhZCBiYWxhbmNlIGFsZ29yaXRobSBjYWxsIHRpbWUgKi8KKworICAgIGludCBydW5uaW5nX3RocmVhZHMgPSAwOyAgICAgICAgICAgICAgLy8gTnVtYmVyIG9mIHJ1bm5pbmcgdGhyZWFkcyBpbiB0aGUgc3lzdGVtLgorCisgICAgRElSICAqICAgICAgICAgIHByb2NfZGlyICAgPSBOVUxMOyAgICAvLyBIYW5kbGUgb2YgIi9wcm9jLyIgZGlyZWN0b3J5LgorICAgIHN0cnVjdCBkaXJlbnQgKiBwcm9jX2VudHJ5ID0gTlVMTDsKKworICAgIGttcF9zdHJfYnVmX3QgICB0YXNrX3BhdGg7ICAgICAgICAgICAgLy8gIi9wcm9jLzxwaWQ+L3Rhc2svPHRpZD4vIiBwYXRoLgorICAgIERJUiAgKiAgICAgICAgICB0YXNrX2RpciAgID0gTlVMTDsgICAgLy8gSGFuZGxlIG9mICIvcHJvYy88cGlkPi90YXNrLzx0aWQ+LyIgZGlyZWN0b3J5LgorICAgIHN0cnVjdCBkaXJlbnQgKiB0YXNrX2VudHJ5ID0gTlVMTDsKKyAgICBpbnQgICAgICAgICAgICAgdGFza19wYXRoX2ZpeGVkX2xlbjsKKworICAgIGttcF9zdHJfYnVmX3QgICBzdGF0X3BhdGg7ICAgICAgICAgICAgLy8gIi9wcm9jLzxwaWQ+L3Rhc2svPHRpZD4vc3RhdCIgcGF0aC4KKyAgICBpbnQgICAgICAgICAgICAgc3RhdF9maWxlID0gLTE7CisgICAgaW50ICAgICAgICAgICAgIHN0YXRfcGF0aF9maXhlZF9sZW47CisKKyAgICBpbnQgdG90YWxfcHJvY2Vzc2VzID0gMDsgICAgICAgICAgICAgIC8vIFRvdGFsIG51bWJlciBvZiBwcm9jZXNzZXMgaW4gc3lzdGVtLgorICAgIGludCB0b3RhbF90aHJlYWRzICAgPSAwOyAgICAgICAgICAgICAgLy8gVG90YWwgbnVtYmVyIG9mIHRocmVhZHMgaW4gc3lzdGVtLgorCisgICAgZG91YmxlIGNhbGxfdGltZSA9IDAuMDsKKworICAgIF9fa21wX3N0cl9idWZfaW5pdCggJiB0YXNrX3BhdGggKTsKKyAgICBfX2ttcF9zdHJfYnVmX2luaXQoICYgc3RhdF9wYXRoICk7CisKKyAgICAgX19rbXBfZWxhcHNlZCggJiBjYWxsX3RpbWUgKTsKKworICAgIGlmICggZ2xiX2NhbGxfdGltZSAmJgorICAgICAgICAgICAgKCBjYWxsX3RpbWUgLSBnbGJfY2FsbF90aW1lIDwgX19rbXBfbG9hZF9iYWxhbmNlX2ludGVydmFsICkgKSB7CisgICAgICAgIHJ1bm5pbmdfdGhyZWFkcyA9IGdsYl9ydW5uaW5nX3RocmVhZHM7CisgICAgICAgIGdvdG8gZmluaXNoOworICAgIH0KKworICAgIGdsYl9jYWxsX3RpbWUgPSBjYWxsX3RpbWU7CisKKyAgICAvLyBEbyBub3Qgc3BlbmQgdGltZSBvbiBzY2FubmluZyAiL3Byb2MvIiBpZiB3ZSBoYXZlIGEgcGVybWFuZW50IGVycm9yLgorICAgIGlmICggcGVybWFuZW50X2Vycm9yICkgeworICAgICAgICBydW5uaW5nX3RocmVhZHMgPSAtMTsKKyAgICAgICAgZ290byBmaW5pc2g7CisgICAgfTsgLy8gaWYKKworICAgIGlmICggbWF4IDw9IDAgKSB7CisgICAgICAgIG1heCA9IElOVF9NQVg7CisgICAgfTsgLy8gaWYKKworICAgIC8vIE9wZW4gIi9wcm9jLyIgZGlyZWN0b3J5LgorICAgIHByb2NfZGlyID0gb3BlbmRpciggIi9wcm9jIiApOworICAgIGlmICggcHJvY19kaXIgPT0gTlVMTCApIHsKKyAgICAgICAgLy8gQ2Fubm90IG9wZW4gIi9wcnJvYy8iLiBQcm9iYWJseSB0aGUga2VybmVsIGRvZXMgbm90IHN1cHBvcnQgaXQuIFJldHVybiBhbiBlcnJvciBub3cgYW5kCisgICAgICAgIC8vIGluIHN1YnNlcXVlbnQgY2FsbHMuCisgICAgICAgIHJ1bm5pbmdfdGhyZWFkcyA9IC0xOworICAgICAgICBwZXJtYW5lbnRfZXJyb3IgPSAxOworICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICB9OyAvLyBpZgorCisgICAgLy8gSW5pdGlhbGl6ZSBmaXhlZCBwYXJ0IG9mIHRhc2tfcGF0aC4gVGhpcyBwYXJ0IHdpbGwgbm90IGNoYW5nZS4KKyAgICBfX2ttcF9zdHJfYnVmX2NhdCggJiB0YXNrX3BhdGgsICIvcHJvYy8iLCA2ICk7CisgICAgdGFza19wYXRoX2ZpeGVkX2xlbiA9IHRhc2tfcGF0aC51c2VkOyAgICAvLyBSZW1lbWJlciBudW1iZXIgb2YgdXNlZCBjaGFyYWN0ZXJzLgorCisgICAgcHJvY19lbnRyeSA9IHJlYWRkaXIoIHByb2NfZGlyICk7CisgICAgd2hpbGUgKCBwcm9jX2VudHJ5ICE9IE5VTEwgKSB7CisgICAgICAgIC8vIFByb2MgZW50cnkgaXMgYSBkaXJlY3RvcnkgYW5kIG5hbWUgc3RhcnRzIHdpdGggYSBkaWdpdC4gQXNzdW1lIGl0IGlzIGEgcHJvY2VzcycKKyAgICAgICAgLy8gZGlyZWN0b3J5LgorICAgICAgICBpZiAoIHByb2NfZW50cnktPmRfdHlwZSA9PSBEVF9ESVIgJiYgaXNkaWdpdCggcHJvY19lbnRyeS0+ZF9uYW1lWyAwIF0gKSApIHsKKworICAgICAgICAgICAgKysgdG90YWxfcHJvY2Vzc2VzOworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIGluaXQgcHJvY2VzcyBpcyB0aGUgdmVyeSBmaXJzdCBpbiAiL3Byb2MiLCBzbyB3ZSBjYW4gcmVwbGFjZQorICAgICAgICAgICAgLy8gc3RyY21wKCBwcm9jX2VudHJ5LT5kX25hbWUsICIxIiApID09IDAgd2l0aCBzaW1wbGVyIHRvdGFsX3Byb2Nlc3NlcyA9PSAxLgorICAgICAgICAgICAgLy8gV2UgYXJlIGdvaW5nIHRvIGNoZWNrIHRoYXQgdG90YWxfcHJvY2Vzc2VzID09IDEgPT4gZF9uYW1lID09ICIxIiBpcyB0cnVlICh3aGVyZQorICAgICAgICAgICAgLy8gIj0+IiBpcyBpbXBsaWNhdGlvbikuIFNpbmNlIEMrKyBkb2VzIG5vdCBoYXZlID0+IG9wZXJhdG9yLCBsZXQgdXMgcmVwbGFjZSBpdCB3aXRoIGl0cworICAgICAgICAgICAgLy8gZXF1aXZhbGVudDogYSA9PiBiID09ICEgYSB8fCBiLgorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdG90YWxfcHJvY2Vzc2VzICE9IDEgfHwgc3RyY21wKCBwcm9jX2VudHJ5LT5kX25hbWUsICIxIiApID09IDAgKTsKKworICAgICAgICAgICAgLy8gQ29uc3RydWN0IHRhc2tfcGF0aC4KKyAgICAgICAgICAgIHRhc2tfcGF0aC51c2VkID0gdGFza19wYXRoX2ZpeGVkX2xlbjsgICAgLy8gUmVzZXQgdGFza19wYXRoIHRvICIvcHJvYy8iLgorICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9jYXQoICYgdGFza19wYXRoLCBwcm9jX2VudHJ5LT5kX25hbWUsIHN0cmxlbiggcHJvY19lbnRyeS0+ZF9uYW1lICkgKTsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfY2F0KCAmIHRhc2tfcGF0aCwgIi90YXNrIiwgNSApOworCisgICAgICAgICAgICB0YXNrX2RpciA9IG9wZW5kaXIoIHRhc2tfcGF0aC5zdHIgKTsKKyAgICAgICAgICAgIGlmICggdGFza19kaXIgPT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAvLyBQcm9jZXNzIGNhbiBmaW5pc2ggYmV0d2VlbiByZWFkaW5nICIvcHJvYy8iIGRpcmVjdG9yeSBlbnRyeSBhbmQgb3BlbmluZyBwcm9jZXNzJworICAgICAgICAgICAgICAgIC8vICJ0YXNrLyIgZGlyZWN0b3J5LiBTbywgaW4gZ2VuZXJhbCBjYXNlIHdlIHNob3VsZCBub3QgY29tcGxhaW4sIGJ1dCBoYXZlIHRvIHNraXAKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHByb2Nlc3MgYW5kIHJlYWQgdGhlIG5leHQgb25lLgorICAgICAgICAgICAgICAgIC8vIEJ1dCBvbiBzeXN0ZW1zIHdpdGggbm8gInRhc2svIiBzdXBwb3J0IHdlIHdpbGwgc3BlbmQgbG90IG9mIHRpbWUgdG8gc2NhbiAiL3Byb2MvIgorICAgICAgICAgICAgICAgIC8vIHRyZWUgYWdhaW4gYW5kIGFnYWluIHdpdGhvdXQgYW55IGJlbmVmaXQuICJpbml0IiBwcm9jZXNzIChpdHMgcGlkIGlzIDEpIHNob3VsZAorICAgICAgICAgICAgICAgIC8vIGV4aXN0IGFsd2F5cywgc28sIGlmIHdlIGNhbm5vdCBvcGVuICIvcHJvYy8xL3Rhc2svIiBkaXJlY3RvcnksIGl0IG1lYW5zICJ0YXNrLyIKKyAgICAgICAgICAgICAgICAvLyBpcyBub3Qgc3VwcG9ydGVkIGJ5IGtlcm5lbC4gUmVwb3J0IGFuIGVycm9yIG5vdyBhbmQgaW4gdGhlIGZ1dHVyZS4KKyAgICAgICAgICAgICAgICBpZiAoIHN0cmNtcCggcHJvY19lbnRyeS0+ZF9uYW1lLCAiMSIgKSA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICBydW5uaW5nX3RocmVhZHMgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgcGVybWFuZW50X2Vycm9yID0gMTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBmaW5pc2g7CisgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgIC8vIENvbnN0cnVjdCBmaXhlZCBwYXJ0IG9mIHN0YXQgZmlsZSBwYXRoLgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfY2xlYXIoICYgc3RhdF9wYXRoICk7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9jYXQoICYgc3RhdF9wYXRoLCB0YXNrX3BhdGguc3RyLCB0YXNrX3BhdGgudXNlZCApOworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfY2F0KCAmIHN0YXRfcGF0aCwgIi8iLCAxICk7CisgICAgICAgICAgICAgICAgc3RhdF9wYXRoX2ZpeGVkX2xlbiA9IHN0YXRfcGF0aC51c2VkOworCisgICAgICAgICAgICAgICAgdGFza19lbnRyeSA9IHJlYWRkaXIoIHRhc2tfZGlyICk7CisgICAgICAgICAgICAgICAgd2hpbGUgKCB0YXNrX2VudHJ5ICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEl0IGlzIGEgZGlyZWN0b3J5IGFuZCBuYW1lIHN0YXJ0cyB3aXRoIGEgZGlnaXQuCisgICAgICAgICAgICAgICAgICAgIGlmICggcHJvY19lbnRyeS0+ZF90eXBlID09IERUX0RJUiAmJiBpc2RpZ2l0KCB0YXNrX2VudHJ5LT5kX25hbWVbIDAgXSApICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICArKyB0b3RhbF90aHJlYWRzOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25zcnVjdCBjb21wbGV0ZSBzdGF0IGZpbGUgcGF0aC4gRWFzaWVzdCB3YXkgd291bGQgYmU6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBzdGF0X3BhdGgsICIlcy8lcy9zdGF0IiwgdGFza19wYXRoLnN0ciwgdGFza19lbnRyeS0+ZF9uYW1lICk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgc2VyaWFlIG9mIF9fa21wX3N0cl9idWZfY2F0IHdvcmtzIGEgYml0IGZhc3Rlci4KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRfcGF0aC51c2VkID0gc3RhdF9wYXRoX2ZpeGVkX2xlbjsgICAgLy8gUmVzZXQgc3RhdCBwYXRoIHRvIGl0cyBmaXhlZCBwYXJ0LgorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9jYXQoICYgc3RhdF9wYXRoLCB0YXNrX2VudHJ5LT5kX25hbWUsIHN0cmxlbiggdGFza19lbnRyeS0+ZF9uYW1lICkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfY2F0KCAmIHN0YXRfcGF0aCwgIi9zdGF0IiwgNSApOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBMb3ctbGV2ZWwgQVBJIChvcGVuL3JlYWQvY2xvc2UpIGlzIHVzZWQuIEhpZ2gtbGV2ZWwgQVBJCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAoZm9wZW4vZmNsb3NlKSAgd29ya3MgfiAzMCAlIHNsb3dlci4KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRfZmlsZSA9IG9wZW4oIHN0YXRfcGF0aC5zdHIsIE9fUkRPTkxZICk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRfZmlsZSA9PSAtMSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBjYW5ub3QgcmVwb3J0IGFuIGVycm9yIGJlY2F1c2UgdGFzayAodGhyZWFkKSBjYW4gdGVybWluYXRlIGp1c3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgcmVhZGluZyB0aGlzIGZpbGUuCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgb2YgInN0YXQiIGZpbGUgbG9va3MgbGlrZToKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQyODUgKHByb2dyYW0pIFMgLi4uCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXQgaXMgYSBzaW5nbGUgbGluZSAoaWYgcHJvZ3JhbSBuYW1lIGRvZXMgbm90IGluY2x1ZGUgZmFubnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9scykuIEZpcnN0IG51bWJlciBpcyBhIHRocmVhZCBpZCwgdGhlbiBuYW1lIG9mIGV4ZWN1dGFibGUgZmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lIGluIHBhcmV0aGVzZXMsIHRoZW4gc3RhdGUgb2YgdGhlIHRocmVhZC4gV2UgbmVlZCBqdXN0IHRocmVhZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHb29kIG5ld3M6IExlbmd0aCBvZiBwcm9ncmFtIG5hbWUgaXMgMTUgY2hhcmFjdGVycyBtYXguIExvbmdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lcyBhcmUgdHJ1bmNhdGVkLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRodXMsIHdlIG5lZWQgcmF0aGVyIHNob3J0IGJ1ZmZlcjogMTUgY2hhcnMgZm9yIHByb2dyYW0gbmFtZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgcGFyZW50aGVzaXMsICsgMyBzcGFjZXMgKyB+NyBkaWdpdHMgb2YgcGlkID0gMzcuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFkIG5ld3M6IFByb2dyYW0gbmFtZSBtYXkgY29udGFpbiBzcGVjaWFsIHN5bWJvbHMgbGlrZSBzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2luZyBwYXJlbnRoZXNpcywgb3IgZXZlbiBuZXcgbGluZS4gVGhpcyBtYWtlcyBwYXJzaW5nICJzdGF0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIG5vdCAxMDAgJSByZWxpYWJsZS4gSW4gY2FzZSBvZiBmYW5ueSBwcm9ncmFtIG5hbWVzIHBhcnNpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF5IGZhaWwgKHJlcG9ydCBpbmNvcnJlY3QgdGhyZWFkIHN0YXRlKS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzaW5nICJzdGF0dXMiIGZpbGUgbG9va3MgbW9yZSBwcm9taXNzaW5nIChkdWUgdG8gZGlmZmVyZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgc3RydWN0dXJlIGFuZCBlc2NhcGluZyBzcGVjaWFsIHN5bWJvbHMpIGJ1dCByZWFkaW5nIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzaW5nIG9mICJzdGF0dXMiIGZpbGUgd29ya3Mgc2xvd2VyLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGxuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGJ1ZmZlclsgNjUgXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IHJlYWQoIHN0YXRfZmlsZSwgYnVmZmVyLCBzaXplb2YoIGJ1ZmZlciApIC0gMSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggbGVuID49IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclsgbGVuIF0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2luZyBzY2FuZjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHNzY2FuZiggYnVmZmVyLCAiJSpkICglKnMpICVjICIsICYgc3RhdGUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9va3MgdmVyeSBuaWNlLCBidXQgc2VhcmNoaW5nIGZvciBhIGNsb3NpbmcgcGFyZW50aGVzaXMgd29ya3MgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXQgZmFzdGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICogY2xvc2VfcGFyZW50ID0gc3Ryc3RyKCBidWZmZXIsICIpICIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBjbG9zZV9wYXJlbnQgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgc3RhdGUgPSAqICggY2xvc2VfcGFyZW50ICsgMiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZSA9PSAnUicgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKysgcnVubmluZ190aHJlYWRzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcnVubmluZ190aHJlYWRzID49IG1heCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmaW5pc2g7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZSggc3RhdF9maWxlICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdF9maWxlID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgICAgICB0YXNrX2VudHJ5ID0gcmVhZGRpciggdGFza19kaXIgKTsKKyAgICAgICAgICAgICAgICB9OyAvLyB3aGlsZQorICAgICAgICAgICAgICAgIGNsb3NlZGlyKCB0YXNrX2RpciApOworICAgICAgICAgICAgICAgIHRhc2tfZGlyID0gTlVMTDsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH07IC8vIGlmCisgICAgICAgIHByb2NfZW50cnkgPSByZWFkZGlyKCBwcm9jX2RpciApOworICAgIH07IC8vIHdoaWxlCisKKyAgICAvLworICAgIC8vIFRoZXJlIF9taWdodF8gYmUgYSB0aW1pbmcgaG9sZSB3aGVyZSB0aGUgdGhyZWFkIGV4ZWN1dGluZyB0aGlzCisgICAgLy8gY29kZSBnZXQgc2tpcHBlZCBpbiB0aGUgbG9hZCBiYWxhbmNlLCBhbmQgcnVubmluZ190aHJlYWRzIGlzIDAuCisgICAgLy8gQXNzZXJ0IGluIHRoZSBkZWJ1ZyBidWlsZHMgb25seSEhIQorICAgIC8vCisgICAgS01QX0RFQlVHX0FTU0VSVCggcnVubmluZ190aHJlYWRzID4gMCApOworICAgIGlmICggcnVubmluZ190aHJlYWRzIDw9IDAgKSB7CisgICAgICAgIHJ1bm5pbmdfdGhyZWFkcyA9IDE7CisgICAgfQorCisgICAgZmluaXNoOiAvLyBDbGVhbiB1cCBhbmQgZXhpdC4KKyAgICAgICAgaWYgKCBwcm9jX2RpciAhPSBOVUxMICkgeworICAgICAgICAgICAgY2xvc2VkaXIoIHByb2NfZGlyICk7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSggJiB0YXNrX3BhdGggKTsKKyAgICAgICAgaWYgKCB0YXNrX2RpciAhPSBOVUxMICkgeworICAgICAgICAgICAgY2xvc2VkaXIoIHRhc2tfZGlyICk7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSggJiBzdGF0X3BhdGggKTsKKyAgICAgICAgaWYgKCBzdGF0X2ZpbGUgIT0gLTEgKSB7CisgICAgICAgICAgICBjbG9zZSggc3RhdF9maWxlICk7CisgICAgICAgIH07IC8vIGlmCisKKyAgICBnbGJfcnVubmluZ190aHJlYWRzID0gcnVubmluZ190aHJlYWRzOworCisgICAgcmV0dXJuIHJ1bm5pbmdfdGhyZWFkczsKKworfSAvLyBfX2ttcF9nZXRfbG9hZF9iYWxhbmNlCisKKyMgZW5kaWYgLy8gS01QX09TX0RBUldJTgorCisjZW5kaWYgLy8gVVNFX0xPQURfQkFMQU5DRQorCisKKyNpZiBLTVBfQ09NUElMRVJfR0NDICYmICEoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9QUEM2NCkKKworaW50IF9fa21wX2ludm9rZV9taWNyb3Rhc2soIG1pY3JvdGFza190IHBrZm4sIGludCBndGlkLCBpbnQgdGlkLCBpbnQgYXJnYywKKyAgICAgICAgdm9pZCAqcF9hcmd2W10gKQoreworICAgIGludCBhcmdjX2Z1bGwgPSBhcmdjICsgMjsKKyAgICBpbnQgaTsKKyAgICBmZmlfY2lmIGNpZjsKKyAgICBmZmlfdHlwZSAqdHlwZXNbYXJnY19mdWxsXTsKKyAgICB2b2lkICphcmdzW2FyZ2NfZnVsbF07CisgICAgdm9pZCAqaWRwWzJdOworCisgICAgLyogV2UncmUgb25seSBwYXNzaW5nIHBvaW50ZXJzIHRvIHRoZSB0YXJnZXQuICovCisgICAgZm9yIChpID0gMDsgaSA8IGFyZ2NfZnVsbDsgaSsrKQorICAgICAgICB0eXBlc1tpXSA9ICZmZmlfdHlwZV9wb2ludGVyOworCisgICAgLyogVWdseSBkb3VibGUtaW5kaXJlY3Rpb24sIGJ1dCB0aGF0J3MgaG93IGl0IGdvZXMuLi4gKi8KKyAgICBpZHBbMF0gPSAmZ3RpZDsKKyAgICBpZHBbMV0gPSAmdGlkOworICAgIGFyZ3NbMF0gPSAmaWRwWzBdOworICAgIGFyZ3NbMV0gPSAmaWRwWzFdOworCisgICAgZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykKKyAgICAgICAgYXJnc1syICsgaV0gPSAmcF9hcmd2W2ldOworCisgICAgaWYgKGZmaV9wcmVwX2NpZigmY2lmLCBGRklfREVGQVVMVF9BQkksIGFyZ2NfZnVsbCwKKyAgICAgICAgICAgICAgICAmZmZpX3R5cGVfdm9pZCwgdHlwZXMpICE9IEZGSV9PSykKKyAgICAgICAgYWJvcnQoKTsKKworICAgIGZmaV9jYWxsKCZjaWYsICh2b2lkICgqKSh2b2lkKSlwa2ZuLCBOVUxMLCBhcmdzKTsKKworICAgIHJldHVybiAxOworfQorCisjZW5kaWYgLy8gS01QX0NPTVBJTEVSX0dDQyAmJiAhKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfUFBDNjQpCisKKyNpZiBLTVBfQVJDSF9QUEM2NAorCisvLyB3ZSByZWFsbHkgb25seSBuZWVkIHRoZSBjYXNlIHdpdGggMSBhcmd1bWVudCwgYmVjYXVzZSBDTEFORyBhbHdheXMgYnVpbGQKKy8vIGEgc3RydWN0IG9mIHBvaW50ZXJzIHRvIHNoYXJlZCB2YXJpYWJsZXMgcmVmZXJlbmNlZCBpbiB0aGUgb3V0bGluZWQgZnVuY3Rpb24KK2ludAorX19rbXBfaW52b2tlX21pY3JvdGFzayggbWljcm90YXNrX3QgcGtmbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBndGlkLCBpbnQgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZ2MsIHZvaWQgKnBfYXJndltdICkgeworICBzd2l0Y2ggKGFyZ2MpIHsKKyAgZGVmYXVsdDoKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlRvbyBtYW55IGFyZ3MgdG8gbWljcm90YXNrOiAlZCFcbiIsIGFyZ2MpOworICAgIGZmbHVzaChzdGRlcnIpOworICAgIGV4aXQoLTEpOworICBjYXNlIDA6CisgICAgKCpwa2ZuKSgmZ3RpZCwgJnRpZCk7CisgICAgYnJlYWs7CisgIGNhc2UgMToKKyAgICAoKnBrZm4pKCZndGlkLCAmdGlkLCBwX2FyZ3ZbMF0pOworICAgIGJyZWFrOworICBjYXNlIDI6CisgICAgKCpwa2ZuKSgmZ3RpZCwgJnRpZCwgcF9hcmd2WzBdLCBwX2FyZ3ZbMV0pOworICAgIGJyZWFrOworICBjYXNlIDM6CisgICAgKCpwa2ZuKSgmZ3RpZCwgJnRpZCwgcF9hcmd2WzBdLCBwX2FyZ3ZbMV0sIHBfYXJndlsyXSk7CisgICAgYnJlYWs7CisgIGNhc2UgNDoKKyAgICAoKnBrZm4pKCZndGlkLCAmdGlkLCBwX2FyZ3ZbMF0sIHBfYXJndlsxXSwgcF9hcmd2WzJdLCBwX2FyZ3ZbM10pOworICAgIGJyZWFrOworICBjYXNlIDU6CisgICAgKCpwa2ZuKSgmZ3RpZCwgJnRpZCwgcF9hcmd2WzBdLCBwX2FyZ3ZbMV0sIHBfYXJndlsyXSwgcF9hcmd2WzNdLCBwX2FyZ3ZbNF0pOworICAgIGJyZWFrOworICBjYXNlIDY6CisgICAgKCpwa2ZuKSgmZ3RpZCwgJnRpZCwgcF9hcmd2WzBdLCBwX2FyZ3ZbMV0sIHBfYXJndlsyXSwgcF9hcmd2WzNdLCBwX2FyZ3ZbNF0sCisgICAgICAgICAgICBwX2FyZ3ZbNV0pOworICAgIGJyZWFrOworICBjYXNlIDc6CisgICAgKCpwa2ZuKSgmZ3RpZCwgJnRpZCwgcF9hcmd2WzBdLCBwX2FyZ3ZbMV0sIHBfYXJndlsyXSwgcF9hcmd2WzNdLCBwX2FyZ3ZbNF0sCisgICAgICAgICAgICBwX2FyZ3ZbNV0sIHBfYXJndls2XSk7CisgICAgYnJlYWs7CisgIGNhc2UgODoKKyAgICAoKnBrZm4pKCZndGlkLCAmdGlkLCBwX2FyZ3ZbMF0sIHBfYXJndlsxXSwgcF9hcmd2WzJdLCBwX2FyZ3ZbM10sIHBfYXJndls0XSwKKyAgICAgICAgICAgIHBfYXJndls1XSwgcF9hcmd2WzZdLCBwX2FyZ3ZbN10pOworICAgIGJyZWFrOworICBjYXNlIDk6CisgICAgKCpwa2ZuKSgmZ3RpZCwgJnRpZCwgcF9hcmd2WzBdLCBwX2FyZ3ZbMV0sIHBfYXJndlsyXSwgcF9hcmd2WzNdLCBwX2FyZ3ZbNF0sCisgICAgICAgICAgICBwX2FyZ3ZbNV0sIHBfYXJndls2XSwgcF9hcmd2WzddLCBwX2FyZ3ZbOF0pOworICAgIGJyZWFrOworICBjYXNlIDEwOgorICAgICgqcGtmbikoJmd0aWQsICZ0aWQsIHBfYXJndlswXSwgcF9hcmd2WzFdLCBwX2FyZ3ZbMl0sIHBfYXJndlszXSwgcF9hcmd2WzRdLAorICAgICAgICAgICAgcF9hcmd2WzVdLCBwX2FyZ3ZbNl0sIHBfYXJndls3XSwgcF9hcmd2WzhdLCBwX2FyZ3ZbOV0pOworICAgIGJyZWFrOworICBjYXNlIDExOgorICAgICgqcGtmbikoJmd0aWQsICZ0aWQsIHBfYXJndlswXSwgcF9hcmd2WzFdLCBwX2FyZ3ZbMl0sIHBfYXJndlszXSwgcF9hcmd2WzRdLAorICAgICAgICAgICAgcF9hcmd2WzVdLCBwX2FyZ3ZbNl0sIHBfYXJndls3XSwgcF9hcmd2WzhdLCBwX2FyZ3ZbOV0sIHBfYXJndlsxMF0pOworICAgIGJyZWFrOworICBjYXNlIDEyOgorICAgICgqcGtmbikoJmd0aWQsICZ0aWQsIHBfYXJndlswXSwgcF9hcmd2WzFdLCBwX2FyZ3ZbMl0sIHBfYXJndlszXSwgcF9hcmd2WzRdLAorICAgICAgICAgICAgcF9hcmd2WzVdLCBwX2FyZ3ZbNl0sIHBfYXJndls3XSwgcF9hcmd2WzhdLCBwX2FyZ3ZbOV0sIHBfYXJndlsxMF0sCisgICAgICAgICAgICBwX2FyZ3ZbMTFdKTsKKyAgICBicmVhazsKKyAgY2FzZSAxMzoKKyAgICAoKnBrZm4pKCZndGlkLCAmdGlkLCBwX2FyZ3ZbMF0sIHBfYXJndlsxXSwgcF9hcmd2WzJdLCBwX2FyZ3ZbM10sIHBfYXJndls0XSwKKyAgICAgICAgICAgIHBfYXJndls1XSwgcF9hcmd2WzZdLCBwX2FyZ3ZbN10sIHBfYXJndls4XSwgcF9hcmd2WzldLCBwX2FyZ3ZbMTBdLAorICAgICAgICAgICAgcF9hcmd2WzExXSwgcF9hcmd2WzEyXSk7CisgICAgYnJlYWs7CisgIGNhc2UgMTQ6CisgICAgKCpwa2ZuKSgmZ3RpZCwgJnRpZCwgcF9hcmd2WzBdLCBwX2FyZ3ZbMV0sIHBfYXJndlsyXSwgcF9hcmd2WzNdLCBwX2FyZ3ZbNF0sCisgICAgICAgICAgICBwX2FyZ3ZbNV0sIHBfYXJndls2XSwgcF9hcmd2WzddLCBwX2FyZ3ZbOF0sIHBfYXJndls5XSwgcF9hcmd2WzEwXSwKKyAgICAgICAgICAgIHBfYXJndlsxMV0sIHBfYXJndlsxMl0sIHBfYXJndlsxM10pOworICAgIGJyZWFrOworICBjYXNlIDE1OgorICAgICgqcGtmbikoJmd0aWQsICZ0aWQsIHBfYXJndlswXSwgcF9hcmd2WzFdLCBwX2FyZ3ZbMl0sIHBfYXJndlszXSwgcF9hcmd2WzRdLAorICAgICAgICAgICAgcF9hcmd2WzVdLCBwX2FyZ3ZbNl0sIHBfYXJndls3XSwgcF9hcmd2WzhdLCBwX2FyZ3ZbOV0sIHBfYXJndlsxMF0sCisgICAgICAgICAgICBwX2FyZ3ZbMTFdLCBwX2FyZ3ZbMTJdLCBwX2FyZ3ZbMTNdLCBwX2FyZ3ZbMTRdKTsKKyAgICBicmVhazsKKyAgfQorCisgIHJldHVybiAxOworfQorCisjZW5kaWYKKworLy8gZW5kIG9mIGZpbGUgLy8KKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvel9XaW5kb3dzX05ULTU4Nl9hc20uYXNtIGIvZmluYWwvcnVudGltZS9zcmMvel9XaW5kb3dzX05ULTU4Nl9hc20uYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlYjBiMWMKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy96X1dpbmRvd3NfTlQtNTg2X2FzbS5hc20KQEAgLTAsMCArMSwxNjEzIEBACis7ICB6X1dpbmRvd3NfTlQtNTg2X2FzbS5hc206ICAtIG1pY3JvdGFza2luZyByb3V0aW5lcyBzcGVjaWZpY2FsbHkKKzsgICAgd3JpdHRlbiBmb3IgSUEtMzIgYXJjaGl0ZWN0dXJlIGFuZCBJbnRlbChSKSA2NCBydW5uaW5nIFdpbmRvd3MqIE9TCis7ICAkUmV2aXNpb246IDQyNDg3ICQKKzsgICREYXRlOiAyMDEzLTA3LTA4IDA4OjExOjIzIC0wNTAwIChNb24sIDA4IEp1bCAyMDEzKSAkCisKKzsKKzsvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworOy8vCis7Ly8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorOy8vCis7Ly8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorOy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorOy8vCis7Ly89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKzsKKworICAgICAgICBUSVRMRSAgIHpfV2luZG93c19OVC01ODZfYXNtLmFzbQorCis7ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IElBLTMyIGFyY2hpdGVjdHVyZSA9PT09PT09PT09PT09PT09PT09PT09PT09PQoraWZkZWYgX01fSUEzMgorCisgICAgICAgIC41ODZQCisKK2lmIEBWZXJzaW9uIGd0IDUxMAorICAgICAgICAubW9kZWwgSFVHRQorZWxzZQorX1RFWFQgICBTRUdNRU5UIFBBUkEgVVNFMzIgUFVCTElDICdDT0RFJworX1RFWFQgICBFTkRTCitfREFUQSAgIFNFR01FTlQgRFdPUkQgVVNFMzIgUFVCTElDICdEQVRBJworX0RBVEEgICBFTkRTCitDT05TVCAgIFNFR01FTlQgRFdPUkQgVVNFMzIgUFVCTElDICdDT05TVCcKK0NPTlNUICAgRU5EUworX0JTUyAgICBTRUdNRU5UIERXT1JEIFVTRTMyIFBVQkxJQyAnQlNTJworX0JTUyAgICBFTkRTCiskJFNZTUJPTFMgICAgICAgU0VHTUVOVCBCWVRFIFVTRTMyICdERUJTWU0nCiskJFNZTUJPTFMgICAgICAgRU5EUworJCRUWVBFUyBTRUdNRU5UIEJZVEUgVVNFMzIgJ0RFQlRZUCcKKyQkVFlQRVMgRU5EUworX1RMUyAgICBTRUdNRU5UIERXT1JEIFVTRTMyIFBVQkxJQyAnVExTJworX1RMUyAgICBFTkRTCitGTEFUICAgIEdST1VQIF9EQVRBLCBDT05TVCwgX0JTUworICAgICAgICBBU1NVTUUgIENTOiBGTEFULCBEUzogRkxBVCwgU1M6IEZMQVQKK2VuZGlmCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfeDg2X3BhdXNlCis7Cis7IHZvaWQKKzsgX19rbXBfeDg2X3BhdXNlKCB2b2lkICkKKzsKKworUFVCTElDICBfX19rbXBfeDg2X3BhdXNlCitfcCQgPSA0CitfZCQgPSA4CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19fX2ttcF94ODZfcGF1c2UgUFJPQyBORUFSCisKKyAgICAgICAgZGIgICAgICAwZjNICisgICAgICAgIGRiICAgICAgMDkwSCAgICA7OyBwYXVzZQorICAgICAgICByZXQKKworX19fa21wX3g4Nl9wYXVzZSBFTkRQCitfVEVYVCAgIEVORFMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfeDg2X2NwdWlkCis7Cis7IHZvaWQKKzsgX19rbXBfeDg2X2NwdWlkKCBpbnQgbW9kZSwgaW50IG1vZGUyLCBzdHJ1Y3Qga21wX2NwdWlkICpwICk7Cis7CisKK1BVQkxJQyAgX19fa21wX3g4Nl9jcHVpZAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfbW9kZSQgID0gOAorX21vZGUyJCA9IDEyCitfcCQgICAgID0gMTYKK19lYXgkICAgPSAwCitfZWJ4JCAgID0gNAorX2VjeCQgICA9IDgKK19lZHgkICAgPSAxMgorCitfX19rbXBfeDg2X2NwdWlkIFBST0MgTkVBUgorCisgICAgICAgIHB1c2ggICAgICBlYnAKKyAgICAgICAgbW92ICAgICAgIGVicCwgZXNwCisKKyAgICAgICAgcHVzaCAgICAgIGVkaQorICAgICAgICBwdXNoICAgICAgZWJ4CisgICAgICAgIHB1c2ggICAgICBlY3gKKyAgICAgICAgcHVzaCAgICAgIGVkeAorCisgICAgICAgIG1vdgkgIGVheCwgRFdPUkQgUFRSIF9tb2RlJFtlYnBdCisgICAgICAgIG1vdgkgIGVjeCwgRFdPUkQgUFRSIF9tb2RlMiRbZWJwXQorCWNwdWlkCQkJCQk7IFF1ZXJ5IHRoZSBDUFVJRCBmb3IgdGhlIGN1cnJlbnQgcHJvY2Vzc29yCisKKyAgICAgICAgbW92ICAgICAgIGVkaSwgRFdPUkQgUFRSIF9wJFtlYnBdCisJbW92IAkgIERXT1JEIFBUUiBfZWF4JFsgZWRpIF0sIGVheAorCW1vdiAJICBEV09SRCBQVFIgX2VieCRbIGVkaSBdLCBlYngKKwltb3YgCSAgRFdPUkQgUFRSIF9lY3gkWyBlZGkgXSwgZWN4CisJbW92IAkgIERXT1JEIFBUUiBfZWR4JFsgZWRpIF0sIGVkeAorCisgICAgICAgIHBvcCAgICAgICBlZHgKKyAgICAgICAgcG9wICAgICAgIGVjeAorICAgICAgICBwb3AgICAgICAgZWJ4CisgICAgICAgIHBvcCAgICAgICBlZGkKKworICAgICAgICBtb3YgICAgICAgZXNwLCBlYnAKKyAgICAgICAgcG9wICAgICAgIGVicAorICAgICAgICByZXQKKworX19fa21wX3g4Nl9jcHVpZCBFTkRQCitfVEVYVCAgICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF90ZXN0X3RoZW5fYWRkMzIKKzsKKzsga21wX2ludDMyCis7IF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgZCApOworOworCitQVUJMSUMgIF9fX2ttcF90ZXN0X3RoZW5fYWRkMzIKK19wJCA9IDQKK19kJCA9IDgKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX19fa21wX3Rlc3RfdGhlbl9hZGQzMiBQUk9DIE5FQVIKKworICAgICAgICBtb3YgICAgIGVheCwgRFdPUkQgUFRSIF9kJFtlc3BdCisgICAgICAgIG1vdiAgICAgZWN4LCBEV09SRCBQVFIgX3AkW2VzcF0KK2xvY2sgICAgeGFkZCAgICBEV09SRCBQVFIgW2VjeF0sIGVheAorICAgICAgICByZXQKKworX19fa21wX3Rlc3RfdGhlbl9hZGQzMiBFTkRQCitfVEVYVCAgIEVORFMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4Cis7Cis7IGttcF9pbnQ4Cis7IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGN2LCBrbXBfaW50OCBzdiApOworOworCitQVUJMSUMgIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX3AkID0gNAorX2N2JCA9IDgKK19zdiQgPSAxMgorCitfX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4IFBST0MgTkVBUgorCisgICAgICAgIG1vdiAgICAgICBlY3gsIERXT1JEIFBUUiBfcCRbZXNwXQorICAgICAgICBtb3YgICAgICAgYWwsIEJZVEUgUFRSIF9jdiRbZXNwXQorICAgICAgICBtb3YgICAgICAgZGwsIEJZVEUgUFRSIF9zdiRbZXNwXQorbG9jayAgICBjbXB4Y2hnICAgQllURSBQVFIgW2VjeF0sIGRsCisgICAgICAgIHNldGUgICAgICBhbCAgICAgICAgICAgOyBpZiBhbCA9PSBbZWN4XSBzZXQgYWwgPSAxIGVsc2Ugc2V0IGFsID0gMAorICAgICAgICBhbmQgICAgICAgZWF4LCAxICAgICAgIDsgc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24KKyAgICAgICAgcmV0CisKK19fX2ttcF9jb21wYXJlX2FuZF9zdG9yZTggRU5EUAorX1RFWFQgICAgIEVORFMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNgorOworOyBrbXBfaW50MTYKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgY3YsIGttcF9pbnQxNiBzdiApOworOworCitQVUJMSUMgIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19wJCA9IDQKK19jdiQgPSA4Citfc3YkID0gMTIKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYgUFJPQyBORUFSCisKKyAgICAgICAgbW92ICAgICAgIGVjeCwgRFdPUkQgUFRSIF9wJFtlc3BdCisgICAgICAgIG1vdiAgICAgICBheCwgV09SRCBQVFIgX2N2JFtlc3BdCisgICAgICAgIG1vdiAgICAgICBkeCwgV09SRCBQVFIgX3N2JFtlc3BdCitsb2NrICAgIGNtcHhjaGcgICBXT1JEIFBUUiBbZWN4XSwgZHgKKyAgICAgICAgc2V0ZSAgICAgIGFsICAgICAgICAgICA7IGlmIGF4ID09IFtlY3hdIHNldCBhbCA9IDEgZWxzZSBzZXQgYWwgPSAwCisgICAgICAgIGFuZCAgICAgICBlYXgsIDEgICAgICAgOyBzaWduIGV4dGVuZCBwcmV2aW91cyBpbnN0cnVjdGlvbgorICAgICAgICByZXQKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYgRU5EUAorX1RFWFQgICAgIEVORFMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMgorOworOyBrbXBfaW50MzIKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgY3YsIGttcF9pbnQzMiBzdiApOworOworCitQVUJMSUMgIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19wJCA9IDQKK19jdiQgPSA4Citfc3YkID0gMTIKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIgUFJPQyBORUFSCisKKyAgICAgICAgbW92ICAgICAgIGVjeCwgRFdPUkQgUFRSIF9wJFtlc3BdCisgICAgICAgIG1vdiAgICAgICBlYXgsIERXT1JEIFBUUiBfY3YkW2VzcF0KKyAgICAgICAgbW92ICAgICAgIGVkeCwgRFdPUkQgUFRSIF9zdiRbZXNwXQorbG9jayAgICBjbXB4Y2hnICAgRFdPUkQgUFRSIFtlY3hdLCBlZHgKKyAgICAgICAgc2V0ZSAgICAgIGFsICAgICAgICAgICA7IGlmIGVheCA9PSBbZWN4XSBzZXQgYWwgPSAxIGVsc2Ugc2V0IGFsID0gMAorICAgICAgICBhbmQgICAgICAgZWF4LCAxICAgICAgIDsgc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24KKyAgICAgICAgcmV0CisKK19fX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyIEVORFAKK19URVhUICAgICBFTkRTCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQKKzsKKzsga21wX2ludDMyCis7IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGN2LCBrbXBfaW50NjQgc3YgKTsKKzsKKworUFVCTElDICBfX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfcCQgPSA4CitfY3ZfbG93JCA9IDEyCitfY3ZfaGlnaCQgPSAxNgorX3N2X2xvdyQgPSAyMAorX3N2X2hpZ2gkID0gMjQKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQgUFJPQyBORUFSCisKKyAgICAgICAgcHVzaCAgICAgIGVicAorICAgICAgICBtb3YgICAgICAgZWJwLCBlc3AKKyAgICAgICAgcHVzaCAgICAgIGVieAorICAgICAgICBwdXNoICAgICAgZWRpCisgICAgICAgIG1vdiAgICAgICBlZGksIERXT1JEIFBUUiBfcCRbZWJwXQorICAgICAgICBtb3YgICAgICAgZWF4LCBEV09SRCBQVFIgX2N2X2xvdyRbZWJwXQorICAgICAgICBtb3YgICAgICAgZWR4LCBEV09SRCBQVFIgX2N2X2hpZ2gkW2VicF0KKyAgICAgICAgbW92ICAgICAgIGVieCwgRFdPUkQgUFRSIF9zdl9sb3ckW2VicF0KKyAgICAgICAgbW92ICAgICAgIGVjeCwgRFdPUkQgUFRSIF9zdl9oaWdoJFtlYnBdCitsb2NrICAgIGNtcHhjaGc4YiBRV09SRCBQVFIgW2VkaV0KKyAgICAgICAgc2V0ZSAgICAgIGFsICAgICAgICAgICA7IGlmIGVkeDplYXggPT0gW2VkaV0gc2V0IGFsID0gMSBlbHNlIHNldCBhbCA9IDAKKyAgICAgICAgYW5kICAgICAgIGVheCwgMSAgICAgICA7IHNpZ24gZXh0ZW5kIHByZXZpb3VzIGluc3RydWN0aW9uCisgICAgICAgIHBvcCAgICAgICBlZGkKKyAgICAgICAgcG9wICAgICAgIGVieAorICAgICAgICBtb3YgICAgICAgZXNwLCBlYnAKKyAgICAgICAgcG9wICAgICAgIGVicAorICAgICAgICByZXQKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQgRU5EUAorX1RFWFQgICAgIEVORFMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfeGNoZ19maXhlZDgKKzsKKzsga21wX2ludDgKKzsgX19rbXBfeGNoZ19maXhlZDgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCBkICk7Cis7CisKK1BVQkxJQyAgX19fa21wX3hjaGdfZml4ZWQ4CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19wJCA9IDQKK19kJCA9IDgKKworX19fa21wX3hjaGdfZml4ZWQ4IFBST0MgTkVBUgorCisgICAgICAgIG1vdiAgICAgICBlY3gsIERXT1JEIFBUUiBfcCRbZXNwXQorICAgICAgICBtb3YgICAgICAgYWwsICBCWVRFIFBUUiBfZCRbZXNwXQorbG9jayAgICB4Y2hnICAgICAgQllURSBQVFIgW2VjeF0sIGFsCisgICAgICAgIHJldAorCitfX19rbXBfeGNoZ19maXhlZDggRU5EUAorX1RFWFQgICAgIEVORFMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfeGNoZ19maXhlZDE2Cis7Cis7IGttcF9pbnQxNgorOyBfX2ttcF94Y2hnX2ZpeGVkMTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IGQgKTsKKzsKKworUFVCTElDICBfX19rbXBfeGNoZ19maXhlZDE2CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19wJCA9IDQKK19kJCA9IDgKKworX19fa21wX3hjaGdfZml4ZWQxNiBQUk9DIE5FQVIKKworICAgICAgICBtb3YgICAgICAgZWN4LCBEV09SRCBQVFIgX3AkW2VzcF0KKyAgICAgICAgbW92ICAgICAgIGF4LCAgV09SRCBQVFIgIF9kJFtlc3BdCitsb2NrICAgIHhjaGcgICAgICBXT1JEIFBUUiBbZWN4XSwgYXgKKyAgICAgICAgcmV0CisKK19fX2ttcF94Y2hnX2ZpeGVkMTYgRU5EUAorX1RFWFQgICAgIEVORFMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfeGNoZ19maXhlZDMyCis7Cis7IGttcF9pbnQzMgorOyBfX2ttcF94Y2hnX2ZpeGVkMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGQgKTsKKzsKKworUFVCTElDICBfX19rbXBfeGNoZ19maXhlZDMyCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19wJCA9IDQKK19kJCA9IDgKKworX19fa21wX3hjaGdfZml4ZWQzMiBQUk9DIE5FQVIKKworICAgICAgICBtb3YgICAgICAgZWN4LCBEV09SRCBQVFIgX3AkW2VzcF0KKyAgICAgICAgbW92ICAgICAgIGVheCwgRFdPUkQgUFRSIF9kJFtlc3BdCitsb2NrICAgIHhjaGcgICAgICBEV09SRCBQVFIgW2VjeF0sIGVheAorICAgICAgICByZXQKKworX19fa21wX3hjaGdfZml4ZWQzMiBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX3hjaGdfcmVhbDMyCis7Cis7IGttcF9yZWFsMzIKKzsgX19rbXBfeGNoZ19yZWFsMzIoIHZvbGF0aWxlIGttcF9yZWFsMzIgKnAsIGttcF9yZWFsMzIgZCApOworOworCitQVUJMSUMgIF9fX2ttcF94Y2hnX3JlYWwzMgorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfcCQgPSA4CitfZCQgPSAxMgorX29sZF92YWx1ZSQgPSAtNAorCitfX19rbXBfeGNoZ19yZWFsMzIgUFJPQyBORUFSCisKKyAgICAgICAgcHVzaCAgICBlYnAKKyAgICAgICAgbW92ICAgICBlYnAsIGVzcAorICAgICAgICBzdWIgICAgIGVzcCwgNAorICAgICAgICBwdXNoICAgIGVzaQorICAgICAgICBtb3YgICAgIGVzaSwgRFdPUkQgUFRSIF9wJFtlYnBdCisKKyAgICAgICAgZmxkICAgICBEV09SRCBQVFIgW2VzaV0KKyAgICAgICAgICAgICAgICAgICAgICAgIDs7IGxvYWQgPGFkZHI+CisgICAgICAgIGZzdCAgICAgRFdPUkQgUFRSIF9vbGRfdmFsdWUkW2VicF0KKyAgICAgICAgICAgICAgICAgICAgICAgIDs7IHN0b3JlIGludG8gb2xkX3ZhbHVlCisKKyAgICAgICAgbW92ICAgICBlYXgsIERXT1JEIFBUUiBfZCRbZWJwXQorCitsb2NrICAgIHhjaGcgICAgRFdPUkQgUFRSIFtlc2ldLCBlYXgKKworICAgICAgICBmbGQgICAgIERXT1JEIFBUUiBfb2xkX3ZhbHVlJFtlYnBdCisgICAgICAgICAgICAgICAgICAgICAgICA7OyByZXR1cm4gb2xkX3ZhbHVlCisgICAgICAgIHBvcCAgICAgZXNpCisgICAgICAgIG1vdiAgICAgZXNwLCBlYnAKKyAgICAgICAgcG9wICAgICBlYnAKKyAgICAgICAgcmV0CisKK19fX2ttcF94Y2hnX3JlYWwzMiBFTkRQCitfVEVYVCAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4Cis7Cis7IGttcF9pbnQ4Cis7IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCBjdiwga21wX2ludDggc3YgKTsKKzsKKworUFVCTElDICBfX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfcCQgPSA0CitfY3YkID0gOAorX3N2JCA9IDEyCisKK19fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4IFBST0MgTkVBUgorCisgICAgICAgIG1vdiAgICAgICBlY3gsIERXT1JEIFBUUiBfcCRbZXNwXQorICAgICAgICBtb3YgICAgICAgYWwsIEJZVEUgUFRSIF9jdiRbZXNwXQorICAgICAgICBtb3YgICAgICAgZGwsIEJZVEUgUFRSIF9zdiRbZXNwXQorbG9jayAgICBjbXB4Y2hnICAgQllURSBQVFIgW2VjeF0sIGRsCisgICAgICAgIHJldAorCitfX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OCBFTkRQCitfVEVYVCAgICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNgorOworOyBrbXBfaW50MTYKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IGN2LCBrbXBfaW50MTYgc3YgKTsKKzsKKworUFVCTElDICBfX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX3AkID0gNAorX2N2JCA9IDgKK19zdiQgPSAxMgorCitfX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYgUFJPQyBORUFSCisKKyAgICAgICAgbW92ICAgICAgIGVjeCwgRFdPUkQgUFRSIF9wJFtlc3BdCisgICAgICAgIG1vdiAgICAgICBheCwgV09SRCBQVFIgX2N2JFtlc3BdCisgICAgICAgIG1vdiAgICAgICBkeCwgV09SRCBQVFIgX3N2JFtlc3BdCitsb2NrICAgIGNtcHhjaGcgICBXT1JEIFBUUiBbZWN4XSwgZHgKKyAgICAgICAgcmV0CisKK19fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNiBFTkRQCitfVEVYVCAgICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMgorOworOyBrbXBfaW50MzIKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGN2LCBrbXBfaW50MzIgc3YgKTsKKzsKKworUFVCTElDICBfX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX3AkID0gNAorX2N2JCA9IDgKK19zdiQgPSAxMgorCitfX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIgUFJPQyBORUFSCisKKyAgICAgICAgbW92ICAgICAgIGVjeCwgRFdPUkQgUFRSIF9wJFtlc3BdCisgICAgICAgIG1vdiAgICAgICBlYXgsIERXT1JEIFBUUiBfY3YkW2VzcF0KKyAgICAgICAgbW92ICAgICAgIGVkeCwgRFdPUkQgUFRSIF9zdiRbZXNwXQorbG9jayAgICBjbXB4Y2hnICAgRFdPUkQgUFRSIFtlY3hdLCBlZHgKKyAgICAgICAgcmV0CisKK19fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMiBFTkRQCitfVEVYVCAgICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NAorOworOyBrbXBfaW50NjQKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGN2LCBrbXBfaW50NjQgc3YgKTsKKzsKKworUFVCTElDICBfX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX3AkID0gOAorX2N2X2xvdyQgPSAxMgorX2N2X2hpZ2gkID0gMTYKK19zdl9sb3ckID0gMjAKK19zdl9oaWdoJCA9IDI0CisKK19fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NCBQUk9DIE5FQVIKKworICAgICAgICBwdXNoICAgICAgZWJwCisgICAgICAgIG1vdiAgICAgICBlYnAsIGVzcAorICAgICAgICBwdXNoICAgICAgZWJ4CisgICAgICAgIHB1c2ggICAgICBlZGkKKyAgICAgICAgbW92ICAgICAgIGVkaSwgRFdPUkQgUFRSIF9wJFtlYnBdCisgICAgICAgIG1vdiAgICAgICBlYXgsIERXT1JEIFBUUiBfY3ZfbG93JFtlYnBdCisgICAgICAgIG1vdiAgICAgICBlZHgsIERXT1JEIFBUUiBfY3ZfaGlnaCRbZWJwXQorICAgICAgICBtb3YgICAgICAgZWJ4LCBEV09SRCBQVFIgX3N2X2xvdyRbZWJwXQorICAgICAgICBtb3YgICAgICAgZWN4LCBEV09SRCBQVFIgX3N2X2hpZ2gkW2VicF0KK2xvY2sgICAgY21weGNoZzhiIFFXT1JEIFBUUiBbZWRpXQorICAgICAgICBwb3AgICAgICAgZWRpCisgICAgICAgIHBvcCAgICAgICBlYngKKyAgICAgICAgbW92ICAgICAgIGVzcCwgZWJwCisgICAgICAgIHBvcCAgICAgICBlYnAKKyAgICAgICAgcmV0CisKK19fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NCBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX3Rlc3RfdGhlbl9hZGRfcmVhbDMyCis7Cis7IGttcF9yZWFsMzIKKzsgX19rbXBfdGVzdF90aGVuX2FkZF9yZWFsMzIoIHZvbGF0aWxlIGttcF9yZWFsMzIgKmFkZHIsIGttcF9yZWFsMzIgZGF0YSApOworOworCitQVUJMSUMgIF9fX2ttcF90ZXN0X3RoZW5fYWRkX3JlYWwzMgorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfYWRkciQgPSA4CitfZGF0YSQgPSAxMgorX29sZF92YWx1ZSQgPSAtNAorX25ld192YWx1ZSQgPSAtOAorCitfX19rbXBfdGVzdF90aGVuX2FkZF9yZWFsMzIgUFJPQyBORUFSCisgICAgICAgIHB1c2ggICAgZWJwCisgICAgICAgIG1vdiAgICAgZWJwLCBlc3AKKyAgICAgICAgc3ViICAgICBlc3AsIDgKKyAgICAgICAgcHVzaCAgICBlc2kKKyAgICAgICAgcHVzaCAgICBlYngKKyAgICAgICAgbW92ICAgICBlc2ksIERXT1JEIFBUUiBfYWRkciRbZWJwXQorJEwyMjoKKyAgICAgICAgZmxkICAgICBEV09SRCBQVFIgW2VzaV0KKyAgICAgICAgICAgICAgICAgICAgICAgIDs7IGxvYWQgPGFkZHI+CisgICAgICAgIGZzdCAgICAgRFdPUkQgUFRSIF9vbGRfdmFsdWUkW2VicF0KKyAgICAgICAgICAgICAgICAgICAgICAgIDs7IHN0b3JlIGludG8gb2xkX3ZhbHVlCisgICAgICAgIGZhZGQgICAgRFdPUkQgUFRSIF9kYXRhJFtlYnBdCisgICAgICAgIGZzdHAgICAgRFdPUkQgUFRSIF9uZXdfdmFsdWUkW2VicF0KKyAgICAgICAgICAgICAgICAgICAgICAgIDs7IG5ld192YWx1ZSA9IG9sZF92YWx1ZSArIGRhdGEKKworICAgICAgICBtb3YgICAgIGVheCwgRFdPUkQgUFRSIF9vbGRfdmFsdWUkW2VicF0KKyAgICAgICAgICAgICAgICAgICAgICAgIDs7IGxvYWQgb2xkX3ZhbHVlCisgICAgICAgIG1vdiAgICAgZWJ4LCBEV09SRCBQVFIgX25ld192YWx1ZSRbZWJwXQorICAgICAgICAgICAgICAgICAgICAgICAgOzsgbG9hZCBuZXdfdmFsdWUKKworbG9jayAgICBjbXB4Y2hnIERXT1JEIFBUUiBbZXNpXSwgZWJ4CisgICAgICAgICAgICAgICAgICAgICAgICA7OyBDb21wYXJlIEVBWCB3aXRoIDxhZGRyPi4gIElmIGVxdWFsIHNldAorICAgICAgICAgICAgICAgICAgICAgICAgOzsgWkYgYW5kIGxvYWQgRUJYIGludG8gPGFkZHI+LiAgRWxzZSwgY2xlYXIKKyAgICAgICAgICAgICAgICAgICAgICAgIDs7IFpGIGFuZCBsb2FkIDxhZGRyPiBpbnRvIEVBWC4KKyAgICAgICAgam56ICAgICBTSE9SVCAkTDIyCisKKworICAgICAgICBmbGQgICAgIERXT1JEIFBUUiBfb2xkX3ZhbHVlJFtlYnBdCisgICAgICAgICAgICAgICAgICAgICAgICA7OyByZXR1cm4gb2xkX3ZhbHVlCisgICAgICAgIHBvcCAgICAgZWJ4CisgICAgICAgIHBvcCAgICAgZXNpCisgICAgICAgIG1vdiAgICAgZXNwLCBlYnAKKyAgICAgICAgcG9wICAgICBlYnAKKyAgICAgICAgcmV0ICAgICAwCitfX19rbXBfdGVzdF90aGVuX2FkZF9yZWFsMzIgRU5EUAorX1RFWFQgICAgIEVORFMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfdGVzdF90aGVuX2FkZF9yZWFsNjQKKzsKKzsga21wX3JlYWw2NAorOyBfX2ttcF90ZXN0X3RoZW5fYWRkX3JlYWw2NCggdm9sYXRpbGUga21wX3JlYWw2NCAqYWRkciwga21wX3JlYWw2NCBkYXRhICk7Cis7CisKK1BVQkxJQyAgX19fa21wX3Rlc3RfdGhlbl9hZGRfcmVhbDY0CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19hZGRyJCA9IDgKK19kYXRhJCA9IDEyCitfb2xkX3ZhbHVlJCA9IC04CitfbmV3X3ZhbHVlJCA9IC0xNgorCitfX19rbXBfdGVzdF90aGVuX2FkZF9yZWFsNjQgUFJPQyBORUFSCisgICAgICAgIHB1c2ggICAgZWJwCisgICAgICAgIG1vdiAgICAgZWJwLCBlc3AKKyAgICAgICAgc3ViICAgICBlc3AsIDE2CisgICAgICAgIHB1c2ggICAgZXNpCisgICAgICAgIHB1c2ggICAgZWJ4CisgICAgICAgIHB1c2ggICAgZWN4CisgICAgICAgIHB1c2ggICAgZWR4CisgICAgICAgIG1vdiAgICAgZXNpLCBEV09SRCBQVFIgX2FkZHIkW2VicF0KKyRMNDQ6CisgICAgICAgIGZsZCAgICAgUVdPUkQgUFRSIFtlc2ldCisgICAgICAgICAgICAgICAgICAgICAgICA7OyBsb2FkIDxhZGRyPgorICAgICAgICBmc3QgICAgIFFXT1JEIFBUUiBfb2xkX3ZhbHVlJFtlYnBdCisgICAgICAgICAgICAgICAgICAgICAgICA7OyBzdG9yZSBpbnRvIG9sZF92YWx1ZQorICAgICAgICBmYWRkICAgIFFXT1JEIFBUUiBfZGF0YSRbZWJwXQorICAgICAgICBmc3RwICAgIFFXT1JEIFBUUiBfbmV3X3ZhbHVlJFtlYnBdCisgICAgICAgICAgICAgICAgICAgICAgICA7OyBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgKyBkYXRhCisKKyAgICAgICAgbW92ICAgICBlZHgsIERXT1JEIFBUUiBfb2xkX3ZhbHVlJFtlYnArNF0KKyAgICAgICAgbW92ICAgICBlYXgsIERXT1JEIFBUUiBfb2xkX3ZhbHVlJFtlYnBdCisgICAgICAgICAgICAgICAgICAgICAgICA7OyBsb2FkIG9sZF92YWx1ZQorICAgICAgICBtb3YgICAgIGVjeCwgRFdPUkQgUFRSIF9uZXdfdmFsdWUkW2VicCs0XQorICAgICAgICBtb3YgICAgIGVieCwgRFdPUkQgUFRSIF9uZXdfdmFsdWUkW2VicF0KKyAgICAgICAgICAgICAgICAgICAgICAgIDs7IGxvYWQgbmV3X3ZhbHVlCisKK2xvY2sgICAgY21weGNoZzhiIFFXT1JEIFBUUiBbZXNpXQorICAgICAgICAgICAgICAgICAgICAgICAgOzsgQ29tcGFyZSBFRFg6RUFYIHdpdGggPGFkZHI+LiAgSWYgZXF1YWwgc2V0CisgICAgICAgICAgICAgICAgICAgICAgICA7OyBaRiBhbmQgbG9hZCBFQ1g6RUJYIGludG8gPGFkZHI+LiAgRWxzZSwgY2xlYXIKKyAgICAgICAgICAgICAgICAgICAgICAgIDs7IFpGIGFuZCBsb2FkIDxhZGRyPiBpbnRvIEVEWDpFQVguCisgICAgICAgIGpueiAgICAgU0hPUlQgJEw0NAorCisKKyAgICAgICAgZmxkICAgICBRV09SRCBQVFIgX29sZF92YWx1ZSRbZWJwXQorICAgICAgICAgICAgICAgICAgICAgICAgOzsgcmV0dXJuIG9sZF92YWx1ZQorICAgICAgICBwb3AgICAgIGVkeAorICAgICAgICBwb3AgICAgIGVjeAorICAgICAgICBwb3AgICAgIGVieAorICAgICAgICBwb3AgICAgIGVzaQorICAgICAgICBtb3YgICAgIGVzcCwgZWJwCisgICAgICAgIHBvcCAgICAgZWJwCisgICAgICAgIHJldCAgICAgMAorX19fa21wX3Rlc3RfdGhlbl9hZGRfcmVhbDY0IEVORFAKK19URVhUICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkCis7Cis7IHZvaWQKKzsgX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZCgga21wX2ludDE2ICpwICk7Cis7Cis7IHBhcmFtZXRlcnM6Cis7ICAgICAgIHA6ICAgICAgNCglZXNwKQorCitQVUJMSUMgIF9fX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19wJCA9IDQKKworX19fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQgUFJPQyBORUFSCisKKyAgICAgICAgbW92ICAgICAgIGVheCwgRFdPUkQgUFRSIF9wJFtlc3BdCisgICAgICAgIGZsZGN3ICAgICBXT1JEIFBUUiBbZWF4XQorICAgICAgICByZXQKKworX19fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQgRU5EUAorX1RFWFQgICAgIEVORFMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQKKzsKKzsgdm9pZAorOyBfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZCgga21wX2ludDE2ICpwICk7Cis7Cis7IHBhcmFtZXRlcnM6Cis7ICAgICAgIHA6ICAgICAgNCglZXNwKQorCitQVUJMSUMgIF9fX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfcCQgPSA0CisKK19fX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZCBQUk9DIE5FQVIKKworICAgICAgICBtb3YgICAgICAgZWF4LCBEV09SRCBQVFIgX3AkW2VzcF0KKyAgICAgICAgZnN0Y3cgICAgIFdPUkQgUFRSIFtlYXhdCisgICAgICAgIHJldAorCitfX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQgRU5EUAorX1RFWFQgICAgIEVORFMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZAorOworOyB2b2lkCis7IF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQoKTsKKzsKKworUFVCTElDICBfX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CisKK19fX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkIFBST0MgTkVBUgorCisgICAgICAgIGZuY2xleAorICAgICAgICByZXQKKworX19fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQgRU5EUAorX1RFWFQgICAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF9pbnZva2VfbWljcm90YXNrCis7Cis7IHR5cGVkZWYgdm9pZCAgKCptaWNyb3Rhc2tfdCkoIGludCAqZ3RpZCwgaW50ICp0aWQsIC4uLiApOworOworOyBpbnQKKzsgX19rbXBfaW52b2tlX21pY3JvdGFzayggbWljcm90YXNrX3QgcGtmbiwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGd0aWQsIGludCB0aWQsCis7ICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcmdjLCB2b2lkICpwX2FyZ3ZbXSApCis7CisKK1BVQkxJQyAgX19fa21wX2ludm9rZV9taWNyb3Rhc2sKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX3BrZm4kID0gOAorX2d0aWQkID0gMTIKK190aWQkID0gMTYKK19hcmdjJCA9IDIwCitfYXJndiQgPSAyNAorX2kkID0gLTgKK19zdGtfYWRqJCA9IC0xNgorX3ZwdHIkID0gLTEyCitfcXB0ciQgPSAtNAorCitfX19rbXBfaW52b2tlX21pY3JvdGFzayBQUk9DIE5FQVIKKzsgTGluZSAxMDIKKyAgICAgICAgcHVzaCAgICBlYnAKKyAgICAgICAgbW92ICAgICBlYnAsIGVzcAorICAgICAgICBzdWIgICAgIGVzcCwgMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IDAwMDAwMDEwSAorICAgICAgICBwdXNoICAgIGVieAorICAgICAgICBwdXNoICAgIGVzaQorICAgICAgICBwdXNoICAgIGVkaQorOyBMaW5lIDExNAorICAgICAgICBtb3YgICAgIGVheCwgRFdPUkQgUFRSIF9hcmdjJFtlYnBdCisgICAgICAgIG1vdiAgICAgRFdPUkQgUFRSIF9pJFtlYnBdLCBlYXgKKworOzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJbGVhICAgICBlZHgsIERXT1JEIFBUUiBbZWF4KjQrOF0KKwltb3YgICAgIGVjeCwgZXNwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IFNhdmUgY3VycmVudCBTUCBpbnRvIEVDWAorCW1vdgllYXgsZWR4CQk7IFNhdmUgdGhlIHNpemUgb2YgdGhlIGFyZ3MgaW4gZWF4CisJc3ViCWVjeCxlZHgJCTsgZXNwLSgoI2FyZ3MrMikqNCkgLT4gZWN4IC0tIHdpdGhvdXQgbW9kcywgc3RhY2sgcHRyIHdvdWxkIGJlIHRoaXMKKwltb3YJZWR4LGVjeAkJOyBTYXZlIHRvIGVkeAorCWFuZAllY3gsLTEyOAk7IE1hc2sgb2ZmIDcgYml0cworCXN1YgllZHgsZWN4CQk7IEFtb3VudCB0byBzdWJ0cmFjdCBmcm9tIGVzcAorCXN1Ygllc3AsZWR4CQk7IFByZXBhcmUgc3RhY2sgcHRyLS0gTm93IGl0IHdpbGwgYmUgYWxpZ25lZCBvbiAxMjgtYnl0ZSBib3VuZGFyeSBhdCB0aGUgY2FsbAorCisJYWRkCWVkeCxlYXgJCTsgQ2FsY3VsYXRlIHRvdGFsIHNpemUgb2YgdGhlIHN0YWNrIGRlY3JlbWVudC4KKyAgICAgICAgbW92ICAgICBEV09SRCBQVFIgX3N0a19hZGokW2VicF0sIGVkeAorOzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgam1wICAgICBTSE9SVCAkTDIyMjM3CiskTDIyMjM4OgorICAgICAgICBtb3YgICAgIGVjeCwgRFdPUkQgUFRSIF9pJFtlYnBdCisgICAgICAgIHN1YiAgICAgZWN4LCAxCisgICAgICAgIG1vdiAgICAgRFdPUkQgUFRSIF9pJFtlYnBdLCBlY3gKKyRMMjIyMzc6CisgICAgICAgIGNtcCAgICAgRFdPUkQgUFRSIF9pJFtlYnBdLCAwCisgICAgICAgIGpsZSAgICAgU0hPUlQgJEwyMjIzOQorOyBMaW5lIDExNgorICAgICAgICBtb3YgICAgIGVkeCwgRFdPUkQgUFRSIF9pJFtlYnBdCisgICAgICAgIG1vdiAgICAgZWF4LCBEV09SRCBQVFIgX2FyZ3YkW2VicF0KKyAgICAgICAgbW92ICAgICBlY3gsIERXT1JEIFBUUiBbZWF4K2VkeCo0LTRdCisgICAgICAgIG1vdiAgICAgRFdPUkQgUFRSIF92cHRyJFtlYnBdLCBlY3gKKzsgTGluZSAxMjMKKyAgICAgICAgbW92ICAgICBlYXgsIERXT1JEIFBUUiBfdnB0ciRbZWJwXQorOyBMaW5lIDEyNAorICAgICAgICBwdXNoICAgIGVheAorOyBMaW5lIDEyNworICAgICAgICBqbXAgICAgIFNIT1JUICRMMjIyMzgKKyRMMjIyMzk6Cis7IExpbmUgMTI5CisgICAgICAgIGxlYSAgICAgZWR4LCBEV09SRCBQVFIgX3RpZCRbZWJwXQorICAgICAgICBtb3YgICAgIERXT1JEIFBUUiBfdnB0ciRbZWJwXSwgZWR4Cis7IExpbmUgMTMwCisgICAgICAgIGxlYSAgICAgZWF4LCBEV09SRCBQVFIgX2d0aWQkW2VicF0KKyAgICAgICAgbW92ICAgICBEV09SRCBQVFIgX3FwdHIkW2VicF0sIGVheAorOyBMaW5lIDE0MworICAgICAgICBtb3YgICAgIGVheCwgRFdPUkQgUFRSIF92cHRyJFtlYnBdCis7IExpbmUgMTQ0CisgICAgICAgIHB1c2ggICAgZWF4Cis7IExpbmUgMTQ1CisgICAgICAgIG1vdiAgICAgZWF4LCBEV09SRCBQVFIgX3FwdHIkW2VicF0KKzsgTGluZSAxNDYKKyAgICAgICAgcHVzaCAgICBlYXgKKzsgTGluZSAxNDcKKyAgICAgICAgY2FsbCAgICBEV09SRCBQVFIgX3BrZm4kW2VicF0KKzsgTGluZSAxNDgKKyAgICAgICAgYWRkICAgICBlc3AsIERXT1JEIFBUUiBfc3RrX2FkaiRbZWJwXQorOyBMaW5lIDE1MgorICAgICAgICBtb3YgICAgIGVheCwgMQorOyBMaW5lIDE1MworICAgICAgICBwb3AgICAgIGVkaQorICAgICAgICBwb3AgICAgIGVzaQorICAgICAgICBwb3AgICAgIGVieAorICAgICAgICBtb3YgICAgIGVzcCwgZWJwCisgICAgICAgIHBvcCAgICAgZWJwCisgICAgICAgIHJldCAgICAgMAorX19fa21wX2ludm9rZV9taWNyb3Rhc2sgRU5EUAorX1RFWFQgICBFTkRTCisKK2VuZGlmCisKKzsgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEludGVsKFIpIDY0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2lmZGVmIF9NX0FNRDY0CisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19rbXBfeDg2X3BhdXNlCis7Cis7IHZvaWQKKzsgX19rbXBfeDg2X3BhdXNlKCB2b2lkICkKKzsKKworUFVCTElDICBfX2ttcF94ODZfcGF1c2UKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX19rbXBfeDg2X3BhdXNlIFBST0MgO05FQVIKKworICAgICAgICBkYiAgICAgIDBmM0gKKyAgICAgICAgZGIgICAgICAwOTBIICAgIDsgcGF1c2UKKyAgICAgICAgcmV0CisKK19fa21wX3g4Nl9wYXVzZSBFTkRQCitfVEVYVCAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX3g4Nl9jcHVpZAorOworOyB2b2lkCis7IF9fa21wX3g4Nl9jcHVpZCggaW50IG1vZGUsIGludCBtb2RlMiwgc3RydWN0IGttcF9jcHVpZCAqcCApOworOworOyBwYXJhbWV0ZXJzOgorOwltb2RlOgkJZWN4Cis7CW1vZGUyOgkJZWR4Cis7CWNwdWlkX2J1ZmZlcjogCXI4CisKK1BVQkxJQyAgX19rbXBfeDg2X2NwdWlkCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKKworX19rbXBfeDg2X2NwdWlkIFBST0MgRlJBTUUgO05FQVIKKworICAgICAgICBwdXNoICAgICAgcmJwCisgICAgICAgIC5wdXNocmVnICByYnAKKyAgICAgICAgbW92ICAgICAgIHJicCwgcnNwCisgICAgICAgIC5zZXRmcmFtZSByYnAsIDAKKyAgICAgICAgcHVzaCAgICAgIHJieAkJCQk7IGNhbGxlZS1zYXZlIHJlZ2lzdGVyCisgICAgICAgIC5wdXNocmVnICByYngKKyAgICAgICAgLkVORFBST0xPRworCisJbW92CSAgcjEwLCByOCAgICAgICAgICAgICAgICAgICAgICAgOyBwIHBhcmFtZXRlcgorICAgICAgICBtb3YJICBlYXgsIGVjeAkJCTsgbW9kZSBwYXJhbWV0ZXIKKyAgICAgICAgbW92CSAgZWN4LCBlZHggICAgICAgICAgICAgICAgICAgICAgOyBtb2RlMiBwYXJhbWV0ZXIKKwljcHVpZAkJCQkJOyBRdWVyeSB0aGUgQ1BVSUQgZm9yIHRoZSBjdXJyZW50IHByb2Nlc3NvcgorCisJbW92IAkgIERXT1JEIFBUUiAwWyByMTAgXSwgZWF4CTsgc3RvcmUgcmVzdWx0cyBpbnRvIGJ1ZmZlcgorCW1vdiAJICBEV09SRCBQVFIgNFsgcjEwIF0sIGVieAorCW1vdiAJICBEV09SRCBQVFIgOFsgcjEwIF0sIGVjeAorCW1vdiAJICBEV09SRCBQVFIgMTJbIHIxMCBdLCBlZHgKKworICAgICAgICBwb3AgICAgICAgcmJ4CQkJCTsgY2FsbGVlLXNhdmUgcmVnaXN0ZXIKKyAgICAgICAgbW92ICAgICAgIHJzcCwgcmJwCisgICAgICAgIHBvcCAgICAgICByYnAKKyAgICAgICAgcmV0CisKK19fa21wX3g4Nl9jcHVpZCBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19rbXBfdGVzdF90aGVuX2FkZDMyCis7Cis7IGttcF9pbnQzMgorOyBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGQgKTsKKzsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CWQ6CWVkeAorOworOyByZXR1cm46IAllYXgKKworUFVCTElDICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX19rbXBfdGVzdF90aGVuX2FkZDMyIFBST0MgO05FQVIKKworICAgICAgICBtb3YgICAgIGVheCwgZWR4Citsb2NrICAgIHhhZGQgICAgRFdPUkQgUFRSIFtyY3hdLCBlYXgKKyAgICAgICAgcmV0CisKK19fa21wX3Rlc3RfdGhlbl9hZGQzMiBFTkRQCitfVEVYVCAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NAorOworOyBrbXBfaW50MzIKKzsgX19rbXBfdGVzdF90aGVuX2FkZDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBkICk7Cis7Cis7IHBhcmFtZXRlcnM6Cis7CXA6CXJjeAorOwlkOglyZHgKKzsKKzsgcmV0dXJuOiAJcmF4CisKK1BVQkxJQyAgX19rbXBfdGVzdF90aGVuX2FkZDY0CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19fa21wX3Rlc3RfdGhlbl9hZGQ2NCBQUk9DIDtORUFSCisKKyAgICAgICAgbW92ICAgICByYXgsIHJkeAorbG9jayAgICB4YWRkICAgIFFXT1JEIFBUUiBbcmN4XSwgcmF4CisgICAgICAgIHJldAorCitfX2ttcF90ZXN0X3RoZW5fYWRkNjQgRU5EUAorX1RFWFQgICBFTkRTCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgKKzsKKzsga21wX2ludDgKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggY3YsIGttcF9pbnQ4IHN2ICk7Cis7IHBhcmFtZXRlcnM6Cis7CXA6CXJjeAorOwljdjoJZWR4Cis7CXN2OglyOGQKKzsKKzsgcmV0dXJuOgllYXgKKworUFVCTElDICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorCitfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTggUFJPQyA7TkVBUgorCisgICAgICAgIG1vdiAgICAgICBhbCwgZGwJOyAiY3YiCisJbW92CSAgZWR4LCByOGQJOyAic3YiCitsb2NrICAgIGNtcHhjaGcgICBCWVRFIFBUUiBbcmN4XSwgZGwKKyAgICAgICAgc2V0ZSAgICAgIGFsICAgICAgICAgICAJOyBpZiBhbCA9PSBbcmN4XSBzZXQgYWwgPSAxIGVsc2Ugc2V0IGFsID0gMAorICAgICAgICBhbmQgICAgICAgcmF4LCAxICAgICAgIAk7IHNpZ24gZXh0ZW5kIHByZXZpb3VzIGluc3RydWN0aW9uCisgICAgICAgIHJldAorCitfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTggRU5EUAorX1RFWFQgICAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYKKzsKKzsga21wX2ludDE2Cis7IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IGN2LCBrbXBfaW50MTYgc3YgKTsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CWN2OgllZHgKKzsJc3Y6CXI4ZAorOworOyByZXR1cm46CWVheAorCitQVUJMSUMgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorCitfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2IFBST0MgO05FQVIKKworICAgICAgICBtb3YgICAgICAgYXgsIGR4CTsgImN2IgorCW1vdgkgIGVkeCwgcjhkCTsgInN2IgorbG9jayAgICBjbXB4Y2hnICAgV09SRCBQVFIgW3JjeF0sIGR4CisgICAgICAgIHNldGUgICAgICBhbCAgICAgICAgICAgCTsgaWYgYXggPT0gW3JjeF0gc2V0IGFsID0gMSBlbHNlIHNldCBhbCA9IDAKKyAgICAgICAgYW5kICAgICAgIHJheCwgMSAgICAgICAJOyBzaWduIGV4dGVuZCBwcmV2aW91cyBpbnN0cnVjdGlvbgorICAgICAgICByZXQKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNiBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMgorOworOyBrbXBfaW50MzIKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgY3YsIGttcF9pbnQzMiBzdiApOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJY3Y6CWVkeAorOwlzdjoJcjhkCis7Cis7IHJldHVybjoJZWF4CisKK1BVQkxJQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMgorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIgUFJPQyA7TkVBUgorCisgICAgICAgIG1vdiAgICAgICBlYXgsIGVkeAk7ICJjdiIKKwltb3YJICBlZHgsIHI4ZAk7ICJzdiIKK2xvY2sgICAgY21weGNoZyAgIERXT1JEIFBUUiBbcmN4XSwgZWR4CisgICAgICAgIHNldGUgICAgICBhbCAgICAgICAgICAgCTsgaWYgZWF4ID09IFtyY3hdIHNldCBhbCA9IDEgZWxzZSBzZXQgYWwgPSAwCisgICAgICAgIGFuZCAgICAgICByYXgsIDEgICAgICAgCTsgc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24KKyAgICAgICAgcmV0CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIgRU5EUAorX1RFWFQgICAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQKKzsKKzsga21wX2ludDMyCis7IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGN2LCBrbXBfaW50NjQgc3YgKTsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CWN2OglyZHgKKzsJc3Y6CXI4Cis7Cis7IHJldHVybjoJZWF4CisKK1BVQkxJQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQgUFJPQyA7TkVBUgorCisgICAgICAgIG1vdiAgICAgICByYXgsIHJkeAk7ICJjdiIKKwltb3YJICByZHgsIHI4CTsgInN2IgorbG9jayAgICBjbXB4Y2hnICAgUVdPUkQgUFRSIFtyY3hdLCByZHgKKyAgICAgICAgc2V0ZSAgICAgIGFsICAgICAgICAgICA7IGlmIHJheCA9PSBbcmN4XSBzZXQgYWwgPSAxIGVsc2Ugc2V0IGFsID0gMAorICAgICAgICBhbmQgICAgICAgcmF4LCAxICAgICAgIDsgc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24KKyAgICAgICAgcmV0CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQgRU5EUAorX1RFWFQgICAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF94Y2hnX2ZpeGVkOAorOworOyBrbXBfaW50OAorOyBfX2ttcF94Y2hnX2ZpeGVkOCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGQgKTsKKzsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CWQ6CWRsCis7Cis7IHJldHVybjogCWFsCisKK1BVQkxJQyAgX19rbXBfeGNoZ19maXhlZDgKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorCitfX2ttcF94Y2hnX2ZpeGVkOCBQUk9DIDtORUFSCisKKyAgICAgICAgbW92ICAgICAgIGFsLCAgZGwKK2xvY2sgICAgeGNoZyAgICAgIEJZVEUgUFRSIFtyY3hdLCBhbAorICAgICAgICByZXQKKworX19rbXBfeGNoZ19maXhlZDggRU5EUAorX1RFWFQgICAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF94Y2hnX2ZpeGVkMTYKKzsKKzsga21wX2ludDE2Cis7IF9fa21wX3hjaGdfZml4ZWQxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgZCApOworOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJZDoJZHgKKzsKKzsgcmV0dXJuOiAJYXgKKworUFVCTElDICBfX2ttcF94Y2hnX2ZpeGVkMTYKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorCitfX2ttcF94Y2hnX2ZpeGVkMTYgUFJPQyA7TkVBUgorCisgICAgICAgIG1vdiAgICAgICBheCwgIGR4Citsb2NrICAgIHhjaGcgICAgICBXT1JEIFBUUiBbcmN4XSwgYXgKKyAgICAgICAgcmV0CisKK19fa21wX3hjaGdfZml4ZWQxNiBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX3hjaGdfZml4ZWQzMgorOworOyBrbXBfaW50MzIKKzsgX19rbXBfeGNoZ19maXhlZDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBkICk7Cis7Cis7IHBhcmFtZXRlcnM6Cis7CXA6CXJjeAorOwlkOgllZHgKKzsKKzsgcmV0dXJuOiAJZWF4CisKK1BVQkxJQyAgX19rbXBfeGNoZ19maXhlZDMyCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19fa21wX3hjaGdfZml4ZWQzMiBQUk9DIDtORUFSCisKKyAgICAgICAgbW92ICAgICBlYXgsIGVkeAorbG9jayAgICB4Y2hnICAgIERXT1JEIFBUUiBbcmN4XSwgZWF4CisgICAgICAgIHJldAorCitfX2ttcF94Y2hnX2ZpeGVkMzIgRU5EUAorX1RFWFQgICBFTkRTCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfeGNoZ19maXhlZDY0Cis7Cis7IGttcF9pbnQ2NAorOyBfX2ttcF94Y2hnX2ZpeGVkNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGQgKTsKKzsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CWQ6CXJkeAorOworOyByZXR1cm46IAlyYXgKKworUFVCTElDICBfX2ttcF94Y2hnX2ZpeGVkNjQKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX19rbXBfeGNoZ19maXhlZDY0IFBST0MgO05FQVIKKworICAgICAgICBtb3YgICAgIHJheCwgcmR4Citsb2NrICAgIHhjaGcgICAgUVdPUkQgUFRSIFtyY3hdLCByYXgKKyAgICAgICAgcmV0CisKK19fa21wX3hjaGdfZml4ZWQ2NCBFTkRQCitfVEVYVCAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDgKKzsKKzsga21wX2ludDgKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGN2LCBrbXBfaW50OCBzdiApOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJY3Y6CWVkeAorOwlzdjoJcjhkCis7Cis7IHJldHVybjoJZWF4CisKK1BVQkxJQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDggUFJPQyA7TkVBUgorICAgICAgICBtb3YgICAgICAgYWwsIGRsCTsgImN2IgorCW1vdgkgIGVkeCwgcjhkCTsgInN2IgorbG9jayAgICBjbXB4Y2hnICAgQllURSBQVFIgW3JjeF0sIGRsCisgICAgICAgICAgICAgICAgICAgICAgICA7IENvbXBhcmUgQUwgd2l0aCBbcmN4XS4gIElmIGVxdWFsIHNldAorICAgICAgICAgICAgICAgICAgICAgICAgOyBaRiBhbmQgZXhjaGFuZ2UgREwgd2l0aCBbcmN4XS4gIEVsc2UsIGNsZWFyCisgICAgICAgICAgICAgICAgICAgICAgICA7IFpGIGFuZCBsb2FkIFtyY3hdIGludG8gQUwuCisgICAgICAgIHJldAorCitfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4IEVORFAKK19URVhUICAgICBFTkRTCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNgorOworOyBrbXBfaW50MTYKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IGN2LCBrbXBfaW50MTYgc3YgKTsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CWN2OgllZHgKKzsJc3Y6CXI4ZAorOworOyByZXR1cm46CWVheAorCitQVUJMSUMgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYgUFJPQyA7TkVBUgorCisgICAgICAgIG1vdiAgICAgICBheCwgZHgJOyAiY3YiCisJbW92CSAgZWR4LCByOGQJOyAic3YiCitsb2NrICAgIGNtcHhjaGcgICBXT1JEIFBUUiBbcmN4XSwgZHgKKyAgICAgICAgcmV0CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2IEVORFAKK19URVhUICAgICBFTkRTCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMgorOworOyBrbXBfaW50MzIKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGN2LCBrbXBfaW50MzIgc3YgKTsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CWN2OgllZHgKKzsJc3Y6CXI4ZAorOworOyByZXR1cm46CWVheAorCitQVUJMSUMgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIgUFJPQyA7TkVBUgorCisgICAgICAgIG1vdiAgICAgICBlYXgsIGVkeAk7ICJjdiIKKwltb3YJICBlZHgsIHI4ZAk7ICJzdiIKK2xvY2sgICAgY21weGNoZyAgIERXT1JEIFBUUiBbcmN4XSwgZWR4CisgICAgICAgIHJldAorCitfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMiBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQKKzsKKzsga21wX2ludDY0Cis7IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBjdiwga21wX2ludDY0IHN2ICk7Cis7IHBhcmFtZXRlcnM6Cis7CXA6CXJjeAorOwljdjoJcmR4Cis7CXN2OglyOAorOworOyByZXR1cm46CXJheAorCitQVUJMSUMgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQgUFJPQyA7TkVBUgorCisgICAgICAgIG1vdiAgICAgICByYXgsIHJkeAk7ICJjdiIKKwltb3YJICByZHgsIHI4CTsgInN2IgorbG9jayAgICBjbXB4Y2hnICAgUVdPUkQgUFRSIFtyY3hdLCByZHgKKyAgICAgICAgcmV0CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0IEVORFAKK19URVhUICAgICBFTkRTCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9sb29wOAorOworOyBrbXBfaW50OAorOyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9sb29wOCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGN2LCBrbXBfaW50OCBzdiApOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJY3Y6CWVkeAorOwlzdjoJcjhkCis7Cis7IHJldHVybjoJYWwKKworUFVCTElDICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9sb29wOAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX2xvb3A4IFBST0MgO05FQVIKKyRfX2ttcF9sb29wOgorICAgICAgICBtb3YgICAgICAgYWwsIGRsCTsgImN2IgorCW1vdgkgIGVkeCwgcjhkCTsgInN2IgorbG9jayAgICBjbXB4Y2hnICAgQllURSBQVFIgW3JjeF0sIGRsCisgICAgICAgICAgICAgICAgICAgICAgICA7IENvbXBhcmUgQUwgd2l0aCBbcmN4XS4gIElmIGVxdWFsIHNldAorICAgICAgICAgICAgICAgICAgICAgICAgOyBaRiBhbmQgZXhjaGFuZ2UgREwgd2l0aCBbcmN4XS4gIEVsc2UsIGNsZWFyCisgICAgICAgICAgICAgICAgICAgICAgICA7IFpGIGFuZCBsb2FkIFtyY3hdIGludG8gQUwuCisgICAgICAgIGp6ICAgICAJU0hPUlQgJF9fa21wX3N1Y2Nlc3MKKworICAgICAgICBkYiAgICAgIDBmM0gKKyAgICAgICAgZGIgICAgICAwOTBIICAgIAkJOyBwYXVzZQorCisJam1wCVNIT1JUICRfX2ttcF9sb29wCisKKyRfX2ttcF9zdWNjZXNzOgorICAgICAgICByZXQKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfbG9vcDggRU5EUAorX1RFWFQgICAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX3hjaGdfcmVhbDMyCis7Cis7IGttcF9yZWFsMzIKKzsgX19rbXBfeGNoZ19yZWFsMzIoIHZvbGF0aWxlIGttcF9yZWFsMzIgKnAsIGttcF9yZWFsMzIgZCApOworOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsgICAgICAgZDoJeG1tMSAobG93ZXIgNCBieXRlcykKKzsKKzsgcmV0dXJuOgl4bW0wIChsb3dlciA0IGJ5dGVzKQorCitQVUJMSUMgIF9fa21wX3hjaGdfcmVhbDMyCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19fa21wX3hjaGdfcmVhbDMyIFBST0MgO05FQVIKKworCW1vdmQJZWF4LCB4bW0xCQk7IGxvYWQgZAorCitsb2NrICAgIHhjaGcgICAgRFdPUkQgUFRSIFtyY3hdLCBlYXgKKworCW1vdmQJeG1tMCwgZWF4CQk7IGxvYWQgb2xkIHZhbHVlIGludG8gcmV0dXJuIHJlZ2lzdGVyCisgICAgICAgIHJldAorCitfX2ttcF94Y2hnX3JlYWwzMiBFTkRQCitfVEVYVCAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX3hjaGdfcmVhbDY0Cis7Cis7IGttcF9yZWFsNjQKKzsgX19rbXBfeGNoZ19yZWFsNjQoIHZvbGF0aWxlIGttcF9yZWFsNjQgKnAsIGttcF9yZWFsNjQgZCApOworOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJZDoJeG1tMSAobG93ZXIgOCBieXRlcykKKzsKKzsgcmV0dXJuOgl4bW0wIChsb3dlciA4IGJ5dGVzKQorCitQVUJMSUMgIF9fa21wX3hjaGdfcmVhbDY0CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19fa21wX3hjaGdfcmVhbDY0IFBST0MgO05FQVIKKworCW1vdmQJcmF4LCB4bW0xCQk7IGxvYWQgImQiCisKK2xvY2sgICAgeGNoZyAgICBRV09SRCBQVFIgW3JjeF0sIHJheAorCisJbW92ZAl4bW0wLCByYXgJCTsgbG9hZCBvbGQgdmFsdWUgaW50byByZXR1cm4gcmVnaXN0ZXIKKyAgICAgICAgcmV0CisKK19fa21wX3hjaGdfcmVhbDY0IEVORFAKK19URVhUICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19rbXBfdGVzdF90aGVuX2FkZF9yZWFsMzIKKzsKKzsga21wX3JlYWwzMgorOyBfX2ttcF90ZXN0X3RoZW5fYWRkX3JlYWwzMiggdm9sYXRpbGUga21wX3JlYWwzMiAqYWRkciwga21wX3JlYWwzMiBkYXRhICk7Cis7Cis7IHBhcmFtZXRlcnM6Cis7CWFkZHI6CXJjeAorOwlkYXRhOgl4bW0xIChsb3dlciA0IGJ5dGVzKQorOworOyByZXR1cm46CXhtbTAgKGxvd2VyIDQgYnl0ZXMpCisKK1BVQkxJQyAgX19rbXBfdGVzdF90aGVuX2FkZF9yZWFsMzIKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorCitfX2ttcF90ZXN0X3RoZW5fYWRkX3JlYWwzMiBQUk9DIDtORUFSCiskX19rbXBfcmVhbDMyX2xvb3A6CisgICAgICAgIG1vdnNzICAgeG1tMCwgRFdPUkQgUFRSIFtyY3hdCTsgbG9hZCB2YWx1ZSBhdCA8YWRkcj4KKwltb3ZkCWVheCwgeG1tMAkJOyBzYXZlIG9sZCB2YWx1ZSBhdCA8YWRkcj4KKworCWFkZHNzCXhtbTAsIHhtbTEJCTsgbmV3IHZhbHVlID0gb2xkIHZhbHVlICsgPGRhdGE+CisJbW92ZAllZHgsIHhtbTAJCTsgbW92ZSBuZXcgdmFsdWUgdG8gR1AgcmVnLgorCitsb2NrICAgIGNtcHhjaGcgRFdPUkQgUFRSIFtyY3hdLCBlZHgKKyAgICAgICAgICAgICAgICAgICAgICAgIDsgQ29tcGFyZSBFQVggd2l0aCA8YWRkcj4uICBJZiBlcXVhbCBzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIDsgWkYgYW5kIGV4Y2hhbmdlIEVEWCB3aXRoIDxhZGRyPi4gIEVsc2UsIGNsZWFyCisgICAgICAgICAgICAgICAgICAgICAgICA7IFpGIGFuZCBsb2FkIDxhZGRyPiBpbnRvIEVBWC4KKyAgICAgICAganogICAgIAlTSE9SVCAkX19rbXBfcmVhbDMyX3N1Y2Nlc3MKKworICAgICAgICBkYiAgICAgIDBmM0gKKyAgICAgICAgZGIgICAgICAwOTBIICAgIAkJOyBwYXVzZQorCisJam1wCVNIT1JUICRfX2ttcF9yZWFsMzJfbG9vcAorCiskX19rbXBfcmVhbDMyX3N1Y2Nlc3M6CisJbW92ZAl4bW0wLCBlYXgJCTsgbG9hZCBvbGQgdmFsdWUgaW50byByZXR1cm4gcmVnaXN0ZXIKKyAgICAgICAgcmV0CitfX2ttcF90ZXN0X3RoZW5fYWRkX3JlYWwzMiBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19rbXBfdGVzdF90aGVuX2FkZF9yZWFsNjQKKzsKKzsga21wX3JlYWw2NAorOyBfX2ttcF90ZXN0X3RoZW5fYWRkX3JlYWw2NCggdm9sYXRpbGUga21wX3JlYWw2NCAqYWRkciwga21wX3JlYWw2NCBkYXRhICk7Cis7Cis7IHBhcmFtZXRlcnM6Cis7CWFkZHI6CXJjeAorOwlkYXRhOgl4bW0xIChsb3dlciA4IGJ5dGVzKQorOworOyByZXR1cm46CXhtbTAgKGxvd2VyIDggYnl0ZXMpCisKK1BVQkxJQyAgX19rbXBfdGVzdF90aGVuX2FkZF9yZWFsNjQKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorCitfX2ttcF90ZXN0X3RoZW5fYWRkX3JlYWw2NCBQUk9DIDtORUFSCiskX19rbXBfcmVhbDY0X2xvb3A6CisgICAgICAgIG1vdmxwZCAgeG1tMCwgUVdPUkQgUFRSIFtyY3hdCTsgbG9hZCB2YWx1ZSBhdCA8YWRkcj4KKwltb3ZkCXJheCwgeG1tMAkJOyBzYXZlIG9sZCB2YWx1ZSBhdCA8YWRkcj4KKworCWFkZHNkCXhtbTAsIHhtbTEJCTsgbmV3IHZhbHVlID0gb2xkIHZhbHVlICsgPGRhdGE+CisJbW92ZAlyZHgsIHhtbTAJCTsgbW92ZSBuZXcgdmFsdWUgdG8gR1AgcmVnLgorCitsb2NrICAgIGNtcHhjaGcgUVdPUkQgUFRSIFtyY3hdLCByZHgKKyAgICAgICAgICAgICAgICAgICAgICAgIDsgQ29tcGFyZSBSQVggd2l0aCA8YWRkcj4uICBJZiBlcXVhbCBzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIDsgWkYgYW5kIGV4Y2hhbmdlIFJEWCB3aXRoIDxhZGRyPi4gIEVsc2UsIGNsZWFyCisgICAgICAgICAgICAgICAgICAgICAgICA7IFpGIGFuZCBsb2FkIDxhZGRyPiBpbnRvIFJBWC4KKyAgICAgICAganogICAgIAlTSE9SVCAkX19rbXBfcmVhbDY0X3N1Y2Nlc3MKKworICAgICAgICBkYiAgICAgIDBmM0gKKyAgICAgICAgZGIgICAgICAwOTBIICAgIAkJOyBwYXVzZQorCisJam1wCVNIT1JUICRfX2ttcF9yZWFsNjRfbG9vcAorCiskX19rbXBfcmVhbDY0X3N1Y2Nlc3M6CisJbW92ZAl4bW0wLCByYXgJCTsgbG9hZCBvbGQgdmFsdWUgaW50byByZXR1cm4gcmVnaXN0ZXIKKyAgICAgICAgcmV0CitfX2ttcF90ZXN0X3RoZW5fYWRkX3JlYWw2NCBFTkRQCitfVEVYVCAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQKKzsKKzsgdm9pZAorOyBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkKCBrbXBfaW50MTYgKnAgKTsKKzsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CisKK1BVQkxJQyAgX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkIFBST0MgO05FQVIKKworICAgICAgICBmbGRjdyAgIFdPUkQgUFRSIFtyY3hdCisgICAgICAgIHJldAorCitfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkIEVORFAKK19URVhUICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQKKzsKKzsgdm9pZAorOyBfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZCgga21wX2ludDE2ICpwICk7Cis7Cis7IHBhcmFtZXRlcnM6Cis7CXA6CXJjeAorOworCitQVUJMSUMgIF9fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkIFBST0MgO05FQVIKKworICAgICAgICBmc3RjdyAgIFdPUkQgUFRSIFtyY3hdCisgICAgICAgIHJldAorCitfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZCBFTkRQCitfVEVYVCAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQKKzsKKzsgdm9pZAorOyBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkKCkKKzsKKworUFVCTElDICBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQgUFJPQyA7TkVBUgorCisgICAgICAgIGZuY2xleAorICAgICAgICByZXQKKworX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZCBFTkRQCitfVEVYVCAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX2ludm9rZV9taWNyb3Rhc2sKKzsKKzsgdHlwZWRlZiB2b2lkICAoKm1pY3JvdGFza190KSggaW50ICpndGlkLCBpbnQgKnRpZCwgLi4uICk7Cis7Cis7IGludAorOyBfX2ttcF9pbnZva2VfbWljcm90YXNrKCBtaWNyb3Rhc2tfdCBwa2ZuLAorOyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3RpZCwgaW50IHRpZCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZ2MsIHZvaWQgKnBfYXJndltdICkgeworOworOyAgICAgKCpwa2ZuKSAoICZndGlkLCAmdGlkLCBhcmd2WzBdLCAuLi4gKTsKKzsgICAgIHJldHVybiAxOworOyB9Cis7Cis7IG5vdGU6Cis7ICAgICAganVzdCBiZWZvcmUgY2FsbCB0byBwa2ZuIG11c3QgaGF2ZSByc3AgMTI4LWJ5dGUgYWxpZ25lZCBmb3IgY29tcGlsZXIKKzsKKzsgcGFyYW1ldGVyczoKKzsgICAgICByY3g6ICAgcGtmbgkxNltyYnBdCis7ICAgICAgZWR4OiAgIGd0aWQJMjRbcmJwXQorOyAgICAgIHI4ZDogICB0aWQJMzJbcmJwXQorOyAgICAgIHI5ZDogICBhcmdjCTQwW3JicF0KKzsgICAgICBbc3RdOiAgcF9hcmd2CTQ4W3JicF0KKzsKKzsgcmVnIHRlbXBzOgorOyAgICAgIHJheDogICB1c2VkIGFsbCBvdmVyIHRoZSBwbGFjZQorOyAgICAgIHJkeDogICB1c2VkIGFsbCBvdmVyIHRoZSBwbGFjZQorOyAgICAgIHJjeDogICB1c2VkIGFzIGFyZ3VtZW50IGNvdW50ZXIgZm9yIHB1c2ggcGFybXMgbG9vcAorOyAgICAgIHIxMDogICB1c2VkIHRvIGhvbGQgcGtmbiBmdW5jdGlvbiBwb2ludGVyIGFyZ3VtZW50Cis7Cis7IHJldHVybjogICAgICBlYXggICAgKGFsd2F5cyAxL1RSVUUpCis7CisKKyRfcGtmbiAgID0gMTYKKyRfZ3RpZCAgID0gMjQKKyRfdGlkICAgID0gMzIKKyRfYXJnYyAgID0gNDAKKyRfcF9hcmd2ID0gNDgKKworUFVCTElDICBfX2ttcF9pbnZva2VfbWljcm90YXNrCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKKworX19rbXBfaW52b2tlX21pY3JvdGFzayBQUk9DIEZSQU1FIDtORUFSCisJbW92CVFXT1JEIFBUUiAxNltyc3BdLCByZHgJOyBob21lIGd0aWQgcGFyYW1ldGVyCisJbW92IAlRV09SRCBQVFIgMjRbcnNwXSwgcjgJOyBob21lIHRpZCBwYXJhbWV0ZXIKKyAgICAgICAgcHVzaCAgICByYnAJCTsgc2F2ZSBiYXNlIHBvaW50ZXIKKyAgICAgICAgLnB1c2hyZWcgcmJwCisJc3ViCXJzcCwgMAkJOyBubyBmaXhlZCBhbGxvY2F0aW9uIG5lY2Vzc2FyeSAtIGVuZCBwcm9sb2cKKworICAgICAgICBsZWEgICAgIHJicCwgUVdPUkQgUFRSIFtyc3BdICAgCTsgZXN0YWJsaXNoIHRoZSBiYXNlIHBvaW50ZXIKKyAgICAgICAgLnNldGZyYW1lIHJicCwgMAorICAgICAgICAuRU5EUFJPTE9HCisJbW92CXIxMCwgcmN4CTsgc2F2ZSBwa2ZuIHBvaW50ZXIgZm9yIGxhdGVyCisKKzs7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBtb3YgICAgIHJheCwgcjkJCTsgcmF4IDw9IGFyZ2MKKyAgICAgICAgY21wICAgICByYXgsIDIKKyAgICAgICAgamdlICAgICBTSE9SVCAkX2ttcF9pbnZva2Vfc3RhY2tfYWxpZ24KKyAgICAgICAgbW92ICAgICByYXgsIDIgICAgICAgICAgOyBzZXQgNCBob21lcyBpZiBsZXNzIHRoYW4gMiBwYXJtcworJF9rbXBfaW52b2tlX3N0YWNrX2FsaWduOgorCWxlYSAgICAgcmR4LCBRV09SRCBQVFIgW3JheCo4KzE2XSA7IHJheCA8PSAoYXJnYyArIDIpICogOAorCW1vdiAgICAgcmF4LCByc3AgICAgICAgIDsgU2F2ZSBjdXJyZW50IFNQIGludG8gcmF4CisJc3ViCXJheCwgcmR4CTsgcnNwIC0gKChhcmdjKzIpKjgpIC0+IHJheAorCQkJCTsgd2l0aG91dCBhbGlnbiwgcnNwIHdvdWxkIGJlIHRoaXMKKwlhbmQgICAgIHJheCwgLTEyOCAgICAgICA7IE1hc2sgb2ZmIDcgYml0cyAoMTI4LWJ5dGUgYWxpZ24pCisJYWRkICAgICByYXgsIHJkeCAgICAgICAgOyBhZGQgc3BhY2UgZm9yIHB1c2gncyBpbiBhIGxvb3AgYmVsb3cKKwltb3YgICAgIHJzcCwgcmF4ICAgICAgICA7IFByZXBhcmUgdGhlIHN0YWNrIHB0cgorCQkJCTsgTm93IGl0IHdpbGwgYWxpZ24gdG8gMTI4LWJ5dGUgYXQgdGhlIGNhbGwKKzs7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAJCQk7IHNldHVwIHBrZm4gcGFyYW1ldGVyIHN0YWNrCisJbW92CXJheCwgcjkJCTsgcmF4IDw9IGFyZ2MKKwlzaGwJcmF4LCAzCQk7IHJheCA8PSBhcmdjKjgKKwltb3YJcmR4LCBRV09SRCBQVFIgJF9wX2FyZ3ZbcmJwXQk7IHJkeCA8PSBwX2FyZ3YKKwlhZGQJcmR4LCByYXgJOyByZHggPD0gJnBfYXJndlthcmdjXQorCW1vdglyY3gsIHI5CQk7IHJjeCA8PSBhcmdjCisJamVjeHoJU0hPUlQgJF9rbXBfaW52b2tlX3Bhc3NfcGFybXMJOyBub3RoaW5nIHRvIHB1c2ggaWYgYXJnYz0wCisJY21wCWVjeCwgMQkJOyBpZiBhcmdjPTEgYnJhbmNoIGFoZWFkCisJamUJU0hPUlQgJF9rbXBfaW52b2tlX29uZV9wYXJtCisJc3ViCWVjeCwgMgkJOyBpZiBhcmdjPTIgYnJhbmNoIGFoZWFkLCBzdWJ0cmFjdCB0d28gZnJvbQorCWplCVNIT1JUICRfa21wX2ludm9rZV90d29fcGFybXMKKworJF9rbXBfaW52b2tlX3B1c2hfcGFybXM6CTsgcHVzaCBsYXN0IC0gNXRoIHBhcm1zIHRvIHBrZm4gb24gc3RhY2sKKwlzdWIJcmR4LCA4CQk7IGRlY3JlbWVudCBwX2FyZ3YgcG9pbnRlciB0byBwcmV2aW91cyBwYXJtCisJbW92IAlyOCwgUVdPUkQgUFRSIFtyZHhdIDsgcjggPD0gcF9hcmd2W3JjeC0xXQorCXB1c2gJcjgJCTsgcHVzaCBwX2FyZ3ZbcmN4LTFdIG9udG8gc3RhY2sgKHJldmVyc2Ugb3JkZXIpCisJc3ViCWVjeCwgMQorCWplY3h6CVNIT1JUICRfa21wX2ludm9rZV90d29fcGFybXMKKwlqbXAJU0hPUlQgJF9rbXBfaW52b2tlX3B1c2hfcGFybXMKKworJF9rbXBfaW52b2tlX3R3b19wYXJtczoKKwlzdWIJcmR4LCA4CQk7IHB1dCA0dGggcGFybSB0byBwa2ZuIGluIHI5CisJbW92CXI5LCBRV09SRCBQVFIgW3JkeF0gOyByOSA8PSBwX2FyZ3ZbMV0KKworJF9rbXBfaW52b2tlX29uZV9wYXJtOgorICAgICAgICBzdWIJcmR4LCA4CQk7IHB1dCAzcmQgcGFybSB0byBwa2ZuIGluIHI4CisJbW92CXI4LCBRV09SRCBQVFIgW3JkeF0gOyByOCA8PSBwX2FyZ3ZbMF0KKworJF9rbXBfaW52b2tlX3Bhc3NfcGFybXM6CTsgcHV0IDFzdCAmIDJuZCBwYXJtcyB0byBwa2ZuIGluIHJlZ2lzdGVycworCWxlYQlyZHgsIFFXT1JEIFBUUiAkX3RpZFtyYnBdICA7IHJkeCA8PSAmdGlkICgybmQgcGFybSB0byBwa2ZuKQorCWxlYQlyY3gsIFFXT1JEIFBUUiAkX2d0aWRbcmJwXSA7IHJjeCA8PSAmZ3RpZCAoMXN0IHBhcm0gdG8gcGtmbikKKyAgICAgICAgc3ViICAgICByc3AsIDMyICAgICAgICAgOyBhZGQgc3RhY2sgc3BhY2UgZm9yIGZpcnN0IGZvdXIgcGFybXMKKwltb3YJcmF4LCByMTAJOyByYXggPD0gcGtmbgorCWNhbGwJcmF4CQk7IGNhbGwgKCpwa2ZuKSgpCisJbW92CXJheCwgMQkJOyBtb3ZlIDEgaW50byByZXR1cm4gcmVnaXN0ZXI7CisKKyAgICAgICAgbGVhICAgICByc3AsIFFXT1JEIFBUUiBbcmJwXQk7IHJlc3RvcmUgc3RhY2sgcG9pbnRlcgorCis7CWFkZAlyc3AsIDAJCTsgbm8gZml4ZWQgYWxsb2NhdGlvbiBuZWNlc3NhcnkgLSBzdGFydCBlcGlsb2cKKyAgICAgICAgcG9wICAgICByYnAJCTsgcmVzdG9yZSBmcmFtZSBwb2ludGVyCisgICAgICAgIHJldAorX19rbXBfaW52b2tlX21pY3JvdGFzayBFTkRQCitfVEVYVCAgIEVORFMKKworZW5kaWYKKworRU5ECmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy96X1dpbmRvd3NfTlQtNTg2X3V0aWwuYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL3pfV2luZG93c19OVC01ODZfdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YmQ5NmIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy96X1dpbmRvd3NfTlQtNTg2X3V0aWwuYwpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIHpfV2luZG93c19OVC01ODZfdXRpbC5jIC0tIHBsYXRmb3JtIHNwZWNpZmljIHJvdXRpbmVzLgorICogJFJldmlzaW9uOiA0MjE4MSAkCisgKiAkRGF0ZTogMjAxMy0wMy0yNiAxNTowNDo0NSAtMDUwMCAoVHVlLCAyNiBNYXIgMjAxMykgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisKKyNpZiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCkKKy8qIE9ubHkgMzItYml0ICJhZGQtZXhjaGFuZ2UiIGluc3RydWN0aW9uIG9uIElBLTMyIGFyY2hpdGVjdHVyZSBjYXVzZXMgdXMgdG8KKyAqIHVzZSBjb21wYXJlX2FuZF9zdG9yZSBmb3IgdGhlc2Ugcm91dGluZXMKKyAqLworCitrbXBfaW50MzIKK19fa21wX3Rlc3RfdGhlbl9vcjMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBkICkKK3sKKyAgICBrbXBfaW50MzIgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKyAgICBvbGRfdmFsdWUgPSBUQ1JfNCggKnAgKTsKKyAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgfCBkOworCisgICAgd2hpbGUgKCAhIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIgKCBwLCBvbGRfdmFsdWUsIG5ld192YWx1ZSApICkKKyAgICB7CisgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgb2xkX3ZhbHVlID0gVENSXzQoICpwICk7CisgICAgICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSB8IGQ7CisgICAgfQorCisgICAgcmV0dXJuIG9sZF92YWx1ZTsKK30KKwora21wX2ludDMyCitfX2ttcF90ZXN0X3RoZW5fYW5kMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGQgKQoreworICAgIGttcF9pbnQzMiBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworICAgIG9sZF92YWx1ZSA9IFRDUl80KCAqcCApOworICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSAmIGQ7CisKKyAgICB3aGlsZSAoICEgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMiAoIHAsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlICkgKQorICAgIHsKKyAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICBvbGRfdmFsdWUgPSBUQ1JfNCggKnAgKTsKKyAgICAgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlICYgZDsKKyAgICB9CisgICAgcmV0dXJuIG9sZF92YWx1ZTsKK30KKworI2lmIEtNUF9BUkNIX1g4Ngora21wX2ludDY0CitfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGQgKQoreworICAgIGttcF9pbnQ2NCBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworICAgIG9sZF92YWx1ZSA9IFRDUl84KCAqcCApOworICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSArIGQ7CisgICAgd2hpbGUgKCAhIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQgKCBwLCBvbGRfdmFsdWUsIG5ld192YWx1ZSApICkKKyAgICB7CisgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgb2xkX3ZhbHVlID0gVENSXzgoICpwICk7CisgICAgICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSArIGQ7CisgICAgfQorCisgICAgcmV0dXJuIG9sZF92YWx1ZTsKK30KKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgKi8KKwora21wX2ludDY0CitfX2ttcF90ZXN0X3RoZW5fb3I2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgZCApCit7CisgICAga21wX2ludDY0IG9sZF92YWx1ZSwgbmV3X3ZhbHVlOworCisgICAgb2xkX3ZhbHVlID0gVENSXzgoICpwICk7CisgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlIHwgZDsKKyAgICB3aGlsZSAoICEgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCAoIHAsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlICkgKQorICAgIHsKKyAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICBvbGRfdmFsdWUgPSBUQ1JfOCggKnAgKTsKKyAgICAgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlIHwgZDsKKyAgICB9CisKKyAgICByZXR1cm4gb2xkX3ZhbHVlOworfQorCitrbXBfaW50NjQKK19fa21wX3Rlc3RfdGhlbl9hbmQ2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgZCApCit7CisgICAga21wX2ludDY0IG9sZF92YWx1ZSwgbmV3X3ZhbHVlOworCisgICAgb2xkX3ZhbHVlID0gVENSXzgoICpwICk7CisgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlICYgZDsKKyAgICB3aGlsZSAoICEgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCAoIHAsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlICkgKQorICAgIHsKKyAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICBvbGRfdmFsdWUgPSBUQ1JfOCggKnAgKTsKKyAgICAgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlICYgZDsKKyAgICB9CisKKyAgICByZXR1cm4gb2xkX3ZhbHVlOworfQorCisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy96X1dpbmRvd3NfTlRfdXRpbC5jIGIvZmluYWwvcnVudGltZS9zcmMvel9XaW5kb3dzX05UX3V0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTU5MTEwCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvel9XaW5kb3dzX05UX3V0aWwuYwpAQCAtMCwwICsxLDE5NzUgQEAKKy8qCisgKiB6X1dpbmRvd3NfTlRfdXRpbC5jIC0tIHBsYXRmb3JtIHNwZWNpZmljIHJvdXRpbmVzLgorICogJFJldmlzaW9uOiA0MjgxNiAkCisgKiAkRGF0ZTogMjAxMy0xMS0xMSAxNTozMzozNyAtMDYwMCAoTW9uLCAxMSBOb3YgMjAxMykgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2l0dC5oIgorI2luY2x1ZGUgImttcF9pMThuLmgiCisjaW5jbHVkZSAia21wX2lvLmgiCisKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogVGhpcyBjb2RlIGlzIHJlbGF0ZWQgdG8gTnRRdWVyeVN5c3RlbUluZm9ybWF0aW9uKCkgZnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24gCisgICBpcyB1c2VkIGluIHRoZSBMb2FkIGJhbGFuY2UgYWxnb3JpdGhtIGZvciBPTVBfRFlOQU1JQz10cnVlIHRvIGZpbmQgdGhlIAorICAgbnVtYmVyIG9mIHJ1bm5pbmcgdGhyZWFkcyBpbiB0aGUgc3lzdGVtLiAqLworCisjaW5jbHVkZSA8bnRzdGF0dXMuaD4KKyNpbmNsdWRlIDxudHNlY2FwaS5oPiAgIC8vIFVOSUNPREVfU1RSSU5HCisKK2VudW0gU1lTVEVNX0lORk9STUFUSU9OX0NMQVNTIHsKKyAgICBTeXN0ZW1Qcm9jZXNzSW5mb3JtYXRpb24gPSA1Cit9OyAvLyBTWVNURU1fSU5GT1JNQVRJT05fQ0xBU1MKKworc3RydWN0IENMSUVOVF9JRCB7CisgICAgSEFORExFIFVuaXF1ZVByb2Nlc3M7CisgICAgSEFORExFIFVuaXF1ZVRocmVhZDsKK307IC8vIHN0cnVjdCBDTElFTlRfSUQKKworZW51bSBUSFJFQURfU1RBVEUgeworICAgIFN0YXRlSW5pdGlhbGl6ZWQsCisgICAgU3RhdGVSZWFkeSwKKyAgICBTdGF0ZVJ1bm5pbmcsCisgICAgU3RhdGVTdGFuZGJ5LAorICAgIFN0YXRlVGVybWluYXRlZCwKKyAgICBTdGF0ZVdhaXQsCisgICAgU3RhdGVUcmFuc2l0aW9uLAorICAgIFN0YXRlVW5rbm93bgorfTsgLy8gZW51bSBUSFJFQURfU1RBVEUKKworc3RydWN0IFZNX0NPVU5URVJTIHsKKyAgICBTSVpFX1QgICAgICAgIFBlYWtWaXJ0dWFsU2l6ZTsKKyAgICBTSVpFX1QgICAgICAgIFZpcnR1YWxTaXplOworICAgIFVMT05HICAgICAgICAgUGFnZUZhdWx0Q291bnQ7CisgICAgU0laRV9UICAgICAgICBQZWFrV29ya2luZ1NldFNpemU7CisgICAgU0laRV9UICAgICAgICBXb3JraW5nU2V0U2l6ZTsKKyAgICBTSVpFX1QgICAgICAgIFF1b3RhUGVha1BhZ2VkUG9vbFVzYWdlOworICAgIFNJWkVfVCAgICAgICAgUXVvdGFQYWdlZFBvb2xVc2FnZTsKKyAgICBTSVpFX1QgICAgICAgIFF1b3RhUGVha05vblBhZ2VkUG9vbFVzYWdlOworICAgIFNJWkVfVCAgICAgICAgUXVvdGFOb25QYWdlZFBvb2xVc2FnZTsKKyAgICBTSVpFX1QgICAgICAgIFBhZ2VmaWxlVXNhZ2U7CisgICAgU0laRV9UICAgICAgICBQZWFrUGFnZWZpbGVVc2FnZTsKKyAgICBTSVpFX1QgICAgICAgIFByaXZhdGVQYWdlQ291bnQ7Cit9OyAvLyBzdHJ1Y3QgVk1fQ09VTlRFUlMKKworc3RydWN0IFNZU1RFTV9USFJFQUQgeworICBMQVJHRV9JTlRFR0VSICAgS2VybmVsVGltZTsKKyAgTEFSR0VfSU5URUdFUiAgIFVzZXJUaW1lOworICBMQVJHRV9JTlRFR0VSICAgQ3JlYXRlVGltZTsKKyAgVUxPTkcgICAgICAgICAgIFdhaXRUaW1lOworICBMUFZPSUQgICAgICAgICAgU3RhcnRBZGRyZXNzOworICBDTElFTlRfSUQgICAgICAgQ2xpZW50SWQ7CisgIERXT1JEICAgICAgICAgICBQcmlvcml0eTsKKyAgTE9ORyAgICAgICAgICAgIEJhc2VQcmlvcml0eTsKKyAgVUxPTkcgICAgICAgICAgIENvbnRleHRTd2l0Y2hDb3VudDsKKyAgVEhSRUFEX1NUQVRFICAgIFN0YXRlOworICBVTE9ORyAgICAgICAgICAgV2FpdFJlYXNvbjsKK307IC8vIFNZU1RFTV9USFJFQUQKKworS01QX0JVSUxEX0FTU0VSVCggb2Zmc2V0b2YoIFNZU1RFTV9USFJFQUQsIEtlcm5lbFRpbWUgKSA9PSAwICk7CisjaWYgS01QX0FSQ0hfWDg2CisgICAgS01QX0JVSUxEX0FTU0VSVCggb2Zmc2V0b2YoIFNZU1RFTV9USFJFQUQsIFN0YXJ0QWRkcmVzcyApID09IDI4ICk7CisgICAgS01QX0JVSUxEX0FTU0VSVCggb2Zmc2V0b2YoIFNZU1RFTV9USFJFQUQsIFN0YXRlICAgICAgICApID09IDUyICk7CisjZWxzZQorICAgIEtNUF9CVUlMRF9BU1NFUlQoIG9mZnNldG9mKCBTWVNURU1fVEhSRUFELCBTdGFydEFkZHJlc3MgKSA9PSAzMiApOworICAgIEtNUF9CVUlMRF9BU1NFUlQoIG9mZnNldG9mKCBTWVNURU1fVEhSRUFELCBTdGF0ZSAgICAgICAgKSA9PSA2OCApOworI2VuZGlmCisKK3N0cnVjdCBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiB7CisgIFVMT05HICAgICAgICAgICBOZXh0RW50cnlPZmZzZXQ7CisgIFVMT05HICAgICAgICAgICBOdW1iZXJPZlRocmVhZHM7CisgIExBUkdFX0lOVEVHRVIgICBSZXNlcnZlZFsgMyBdOworICBMQVJHRV9JTlRFR0VSICAgQ3JlYXRlVGltZTsKKyAgTEFSR0VfSU5URUdFUiAgIFVzZXJUaW1lOworICBMQVJHRV9JTlRFR0VSICAgS2VybmVsVGltZTsKKyAgVU5JQ09ERV9TVFJJTkcgIEltYWdlTmFtZTsKKyAgRFdPUkQgICAgICAgICAgIEJhc2VQcmlvcml0eTsKKyAgSEFORExFICAgICAgICAgIFByb2Nlc3NJZDsKKyAgSEFORExFICAgICAgICAgIFBhcmVudFByb2Nlc3NJZDsKKyAgVUxPTkcgICAgICAgICAgIEhhbmRsZUNvdW50OworICBVTE9ORyAgICAgICAgICAgUmVzZXJ2ZWQyWyAyIF07CisgIFZNX0NPVU5URVJTICAgICBWTUNvdW50ZXJzOworICBJT19DT1VOVEVSUyAgICAgSU9Db3VudGVyczsKKyAgU1lTVEVNX1RIUkVBRCAgIFRocmVhZHNbIDEgXTsKK307IC8vIFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OCit0eXBlZGVmIFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OICogUFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OOworCitLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04sIE5leHRFbnRyeU9mZnNldCApID09ICAwICk7CitLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04sIENyZWF0ZVRpbWUgICAgICApID09IDMyICk7CitLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04sIEltYWdlTmFtZSAgICAgICApID09IDU2ICk7CisjaWYgS01QX0FSQ0hfWDg2CisgICAgS01QX0JVSUxEX0FTU0VSVCggb2Zmc2V0b2YoIFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OLCBQcm9jZXNzSWQgICAgICAgKSA9PSAgNjggKTsKKyAgICBLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04sIEhhbmRsZUNvdW50ICAgICApID09ICA3NiApOworICAgIEtNUF9CVUlMRF9BU1NFUlQoIG9mZnNldG9mKCBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiwgVk1Db3VudGVycyAgICAgICkgPT0gIDg4ICk7CisgICAgS01QX0JVSUxEX0FTU0VSVCggb2Zmc2V0b2YoIFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OLCBJT0NvdW50ZXJzICAgICAgKSA9PSAxMzYgKTsKKyAgICBLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04sIFRocmVhZHMgICAgICAgICApID09IDE4NCApOworI2Vsc2UKKyAgICBLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04sIFByb2Nlc3NJZCAgICAgICApID09ICA4MCApOworICAgIEtNUF9CVUlMRF9BU1NFUlQoIG9mZnNldG9mKCBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiwgSGFuZGxlQ291bnQgICAgICkgPT0gIDk2ICk7CisgICAgS01QX0JVSUxEX0FTU0VSVCggb2Zmc2V0b2YoIFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OLCBWTUNvdW50ZXJzICAgICAgKSA9PSAxMTIgKTsKKyAgICBLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04sIElPQ291bnRlcnMgICAgICApID09IDIwOCApOworICAgIEtNUF9CVUlMRF9BU1NFUlQoIG9mZnNldG9mKCBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiwgVGhyZWFkcyAgICAgICAgICkgPT0gMjU2ICk7CisjZW5kaWYKKwordHlwZWRlZiBOVFNUQVRVUyAoTlRBUEkgKk50UXVlcnlTeXN0ZW1JbmZvcm1hdGlvbl90KSggU1lTVEVNX0lORk9STUFUSU9OX0NMQVNTLCBQVk9JRCwgVUxPTkcsIFBVTE9ORyApOworTnRRdWVyeVN5c3RlbUluZm9ybWF0aW9uX3QgTnRRdWVyeVN5c3RlbUluZm9ybWF0aW9uID0gTlVMTDsKKworSE1PRFVMRSBudGRsbCA9IE5VTEw7CisKKy8qIEVuZCBvZiBOdFF1ZXJ5U3lzdGVtSW5mb3JtYXRpb24oKS1yZWxhdGVkIGNvZGUgKi8KKworI2lmIEtNUF9BUkNIX1g4Nl82NAorc3RhdGljIEhNT0RVTEUga2VybmVsMzIgPSBOVUxMOworI2VuZGlmIC8qIEtNUF9BUkNIX1g4Nl82NCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvLyBXaHkgZG8gd2UgaGF2ZSBtdWx0aXBsZSBjb3BpZXMgb2YgX19rbXBfc3RhdGljX2RlbGF5KCkgYW5kIF9fa21wX3N0YXRpY195aWVsZCgpIGluIG1hbnkgZmlsZXM/CisjaWZkZWYgS01QX0RFQlVHCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGF0aWNfZGVsYXkoIGludCBhcmcgKSB7CisgICAgLyogV29yayBhcm91bmQgd2VpcmQgY29kZS1nZW4gYnVnIHRoYXQgY2F1c2VzIGFzc2VydCB0byB0cmlwICovCisgICAgI2lmIEtNUF9BUkNIX1g4Nl82NCAmJiBLTVBfT1NfTElOVVgKKyAgICAgICAgS01QX0FTU0VSVCggYXJnICE9IDAgKTsKKyAgICAjZWxzZQorICAgICAgICBLTVBfQVNTRVJUKCBhcmcgPj0gMCApOworICAgICNlbmRpZgorfQorCisjZWxzZQorCisgICAgI2RlZmluZSBfX2ttcF9zdGF0aWNfZGVsYXkoIGFyZyApICAgICAvKiBub3RoaW5nIHRvIGRvICovCisKKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKworc3RhdGljIHZvaWQKK19fa21wX3N0YXRpY195aWVsZCggaW50IGFyZyApCit7CisgICAgX19rbXBfeWllbGQoIGFyZyApOworfQorCisjaWYgS01QX0hBTkRMRV9TSUdOQUxTCisgICAgdHlwZWRlZiB2b2lkICAgICgqIHNpZ19mdW5jX3QgKSggaW50ICk7CisgICAgc3RhdGljIHNpZ19mdW5jX3QgIF9fa21wX3NpZ2hsZHJzWyBOU0lHIF07CisgICAgc3RhdGljIGludCAgICAgICAgIF9fa21wX3NpZ2luc3RhbGxlZFsgTlNJRyBdOworI2VuZGlmCisKK3N0YXRpYyBIQU5ETEUgICBfX2ttcF9tb25pdG9yX2V2Oworc3RhdGljIGttcF9pbnQ2NCBfX2ttcF93aW4zMl90aW1lOworZG91YmxlIF9fa21wX3dpbjMyX3RpY2s7CisKK2ludCBfX2ttcF9pbml0X3J1bnRpbWUgPSBGQUxTRTsKK0NSSVRJQ0FMX1NFQ1RJT04gX19rbXBfd2luMzJfc2VjdGlvbjsKKwordm9pZAorX19rbXBfd2luMzJfbXV0ZXhfaW5pdCgga21wX3dpbjMyX211dGV4X3QgKm14ICkKK3sKKyAgICBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKCAmIG14LT5jcyApOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfc3lzdGVtX29iamVjdF9jcmVhdGVkKCAmIG14LT5jcywgIkNyaXRpY2FsIFNlY3Rpb24iICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworfQorCit2b2lkCitfX2ttcF93aW4zMl9tdXRleF9kZXN0cm95KCBrbXBfd2luMzJfbXV0ZXhfdCAqbXggKQoreworICAgIERlbGV0ZUNyaXRpY2FsU2VjdGlvbiggJiBteC0+Y3MgKTsKK30KKwordm9pZAorX19rbXBfd2luMzJfbXV0ZXhfbG9jaygga21wX3dpbjMyX211dGV4X3QgKm14ICkKK3sKKyAgICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJiBteC0+Y3MgKTsKK30KKwordm9pZAorX19rbXBfd2luMzJfbXV0ZXhfdW5sb2NrKCBrbXBfd2luMzJfbXV0ZXhfdCAqbXggKQoreworICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmIG14LT5jcyApOworfQorCit2b2lkCitfX2ttcF93aW4zMl9jb25kX2luaXQoIGttcF93aW4zMl9jb25kX3QgKmN2ICkKK3sKKyAgICBjdi0+d2FpdGVyc19jb3VudF8gICAgICAgICA9IDA7CisgICAgY3YtPndhaXRfZ2VuZXJhdGlvbl9jb3VudF8gPSAwOworICAgIGN2LT5yZWxlYXNlX2NvdW50XyAgICAgICAgID0gMDsKKworICAgIC8qIEluaXRpYWxpemUgdGhlIGNyaXRpY2FsIHNlY3Rpb24gKi8KKyAgICBfX2ttcF93aW4zMl9tdXRleF9pbml0KCAmIGN2LT53YWl0ZXJzX2NvdW50X2xvY2tfICk7CisKKyAgICAvKiBDcmVhdGUgYSBtYW51YWwtcmVzZXQgZXZlbnQuICovCisgICAgY3YtPmV2ZW50XyA9IENyZWF0ZUV2ZW50KCBOVUxMLCAgICAgLy8gbm8gc2VjdXJpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUsICAgICAvLyBtYW51YWwtcmVzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCAgICAvLyBub24tc2lnbmFsZWQgaW5pdGlhbGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMICk7ICAgLy8gdW5uYW1lZAorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfc3lzdGVtX29iamVjdF9jcmVhdGVkKCBjdi0+ZXZlbnRfLCAiRXZlbnQiICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworfQorCit2b2lkCitfX2ttcF93aW4zMl9jb25kX2Rlc3Ryb3koIGttcF93aW4zMl9jb25kX3QgKmN2ICkKK3sKKyAgICBfX2ttcF93aW4zMl9tdXRleF9kZXN0cm95KCAmIGN2LT53YWl0ZXJzX2NvdW50X2xvY2tfICk7CisgICAgX19rbXBfZnJlZV9oYW5kbGUoIGN2LT5ldmVudF8gKTsKKyAgICBtZW1zZXQoIGN2LCAnXDAnLCBzaXplb2YoICpjdiApICk7Cit9CisKKy8qIFRPRE8gYXNzb2NpYXRlIGN2IHdpdGggYSB0ZWFtIGluc3RlYWQgb2YgYSB0aHJlYWQgc28gYXMgdG8gb3B0aW1pemUKKyAqIHRoZSBjYXNlIHdoZXJlIHdlIHdha2UgdXAgYSB3aG9sZSB0ZWFtICovCisKK3ZvaWQKK19fa21wX3dpbjMyX2NvbmRfd2FpdCgga21wX3dpbjMyX2NvbmRfdCAqY3YsIGttcF93aW4zMl9tdXRleF90ICpteCwga21wX2luZm9fdCAqdGgsIGludCBuZWVkX2RlY3JlYXNlX2xvYWQgKQoreworICAgIGludCBteV9nZW5lcmF0aW9uOworICAgIGludCBsYXN0X3dhaXRlcjsKKworICAgIC8qIEF2b2lkIHJhY2UgY29uZGl0aW9ucyAqLworICAgIF9fa21wX3dpbjMyX211dGV4X2xvY2soICZjdi0+d2FpdGVyc19jb3VudF9sb2NrXyApOworCisgICAgLyogSW5jcmVtZW50IGNvdW50IG9mIHdhaXRlcnMgKi8KKyAgICBjdi0+d2FpdGVyc19jb3VudF8rKzsKKworICAgIC8qIFN0b3JlIGN1cnJlbnQgZ2VuZXJhdGlvbiBpbiBvdXIgYWN0aXZhdGlvbiByZWNvcmQuICovCisgICAgbXlfZ2VuZXJhdGlvbiA9IGN2LT53YWl0X2dlbmVyYXRpb25fY291bnRfOworCisgICAgX19rbXBfd2luMzJfbXV0ZXhfdW5sb2NrKCAmY3YtPndhaXRlcnNfY291bnRfbG9ja18gKTsKKyAgICBfX2ttcF93aW4zMl9tdXRleF91bmxvY2soIG14ICk7CisKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgaW50IHdhaXRfZG9uZTsKKworICAgICAgICAvKiBXYWl0IHVudGlsIHRoZSBldmVudCBpcyBzaWduYWxlZCAqLworICAgICAgICBXYWl0Rm9yU2luZ2xlT2JqZWN0KCBjdi0+ZXZlbnRfLCBJTkZJTklURSApOworCisgICAgICAgIF9fa21wX3dpbjMyX211dGV4X2xvY2soICZjdi0+d2FpdGVyc19jb3VudF9sb2NrXyApOworCisgICAgICAgIC8qIEV4aXQgdGhlIGxvb3Agd2hlbiB0aGUgPGN2LT5ldmVudF8+IGlzIHNpZ25hbGVkIGFuZAorICAgICAgICAgKiB0aGVyZSBhcmUgc3RpbGwgd2FpdGluZyB0aHJlYWRzIGZyb20gdGhpcyA8d2FpdF9nZW5lcmF0aW9uPgorICAgICAgICAgKiB0aGF0IGhhdmVuJ3QgYmVlbiByZWxlYXNlZCBmcm9tIHRoaXMgd2FpdCB5ZXQuICAgICAgICAgICAgICAqLworICAgICAgICB3YWl0X2RvbmUgPSAoIGN2LT5yZWxlYXNlX2NvdW50XyA+IDAgKSAmJgorICAgICAgICAgICAgICAgICAgICAoIGN2LT53YWl0X2dlbmVyYXRpb25fY291bnRfICE9IG15X2dlbmVyYXRpb24gKTsKKworICAgICAgICBfX2ttcF93aW4zMl9tdXRleF91bmxvY2soICZjdi0+d2FpdGVyc19jb3VudF9sb2NrXyk7CisKKyAgICAgICAgLyogdGhlcmUgdXNlZCB0byBiZSBhIHNlbWljb2xvbiBhZnRlciB0aGUgaWYgc3RhdGVtZW50LAorICAgICAgICAgKiBpdCBsb29rZWQgbGlrZSBhIGJ1Zywgc28gaSByZW1vdmVkIGl0ICovCisgICAgICAgIGlmKCB3YWl0X2RvbmUgKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgX19rbXBfd2luMzJfbXV0ZXhfbG9jayggbXggKTsKKyAgICBfX2ttcF93aW4zMl9tdXRleF9sb2NrKCAmY3YtPndhaXRlcnNfY291bnRfbG9ja18gKTsKKworICAgIGN2LT53YWl0ZXJzX2NvdW50Xy0tOworICAgIGN2LT5yZWxlYXNlX2NvdW50Xy0tOworCisgICAgbGFzdF93YWl0ZXIgPSAgKCBjdi0+cmVsZWFzZV9jb3VudF8gPT0gMCApOworCisgICAgX19rbXBfd2luMzJfbXV0ZXhfdW5sb2NrKCAmY3YtPndhaXRlcnNfY291bnRfbG9ja18gKTsKKworICAgIGlmKCBsYXN0X3dhaXRlciApIHsKKyAgICAgICAgLyogV2UncmUgdGhlIGxhc3Qgd2FpdGVyIHRvIGJlIG5vdGlmaWVkLCBzbyByZXNldCB0aGUgbWFudWFsIGV2ZW50LiAqLworICAgICAgICBSZXNldEV2ZW50KCBjdi0+ZXZlbnRfICk7CisgICAgfQorfQorCit2b2lkCitfX2ttcF93aW4zMl9jb25kX2Jyb2FkY2FzdCgga21wX3dpbjMyX2NvbmRfdCAqY3YgKQoreworICAgIF9fa21wX3dpbjMyX211dGV4X2xvY2soICZjdi0+d2FpdGVyc19jb3VudF9sb2NrXyApOworCisgICAgaWYoIGN2LT53YWl0ZXJzX2NvdW50XyA+IDAgKSB7CisgICAgICAgIFNldEV2ZW50KCBjdi0+ZXZlbnRfICk7CisgICAgICAgIC8qIFJlbGVhc2UgYWxsIHRoZSB0aHJlYWRzIGluIHRoaXMgZ2VuZXJhdGlvbi4gKi8KKworICAgICAgICBjdi0+cmVsZWFzZV9jb3VudF8gPSBjdi0+d2FpdGVyc19jb3VudF87CisKKyAgICAgICAgLyogU3RhcnQgYSBuZXcgZ2VuZXJhdGlvbi4gKi8KKyAgICAgICAgY3YtPndhaXRfZ2VuZXJhdGlvbl9jb3VudF8rKzsKKyAgICB9CisKKyAgICBfX2ttcF93aW4zMl9tdXRleF91bmxvY2soICZjdi0+d2FpdGVyc19jb3VudF9sb2NrXyApOworfQorCit2b2lkCitfX2ttcF93aW4zMl9jb25kX3NpZ25hbCgga21wX3dpbjMyX2NvbmRfdCAqY3YgKQoreworICAgIF9fa21wX3dpbjMyX2NvbmRfYnJvYWRjYXN0KCBjdiApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkCitfX2ttcF9lbmFibGUoIGludCBuZXdfc3RhdGUgKQoreworICAgIGlmIChfX2ttcF9pbml0X3J1bnRpbWUpCisgICAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmIF9fa21wX3dpbjMyX3NlY3Rpb24gKTsKK30KKwordm9pZAorX19rbXBfZGlzYWJsZSggaW50ICpvbGRfc3RhdGUgKQoreworICAgICpvbGRfc3RhdGUgPSAwOworCisgICAgaWYgKF9fa21wX2luaXRfcnVudGltZSkKKyAgICAgICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICYgX19rbXBfd2luMzJfc2VjdGlvbiApOworfQorCit2b2lkCitfX2ttcF9zdXNwZW5kX2luaXRpYWxpemUoIHZvaWQgKQoreworICAgIC8qIGRvIG5vdGhpbmcgKi8KK30KKworc3RhdGljIHZvaWQKK19fa21wX3N1c3BlbmRfaW5pdGlhbGl6ZV90aHJlYWQoIGttcF9pbmZvX3QgKnRoICkKK3sKKyAgICBpZiAoICEgVENSXzQoIHRoLT50aC50aF9zdXNwZW5kX2luaXQgKSApIHsKKyAgICAgIC8qIHRoaXMgbWVhbnMgd2UgaGF2ZW4ndCBpbml0aWFsaXplZCB0aGUgc3VzcGVuc2lvbiBwdGhyZWFkIG9iamVjdHMgZm9yIHRoaXMgdGhyZWFkCisgICAgICAgICBpbiB0aGlzIGluc3RhbmNlIG9mIHRoZSBwcm9jZXNzICovCisgICAgICAgIF9fa21wX3dpbjMyX2NvbmRfaW5pdCggICZ0aC0+dGgudGhfc3VzcGVuZF9jdiApOworICAgICAgICBfX2ttcF93aW4zMl9tdXRleF9pbml0KCAmdGgtPnRoLnRoX3N1c3BlbmRfbXggKTsKKyAgICAgICAgVENXXzQoIHRoLT50aC50aF9zdXNwZW5kX2luaXQsIFRSVUUgKTsKKyAgICB9Cit9CisKK3ZvaWQKK19fa21wX3N1c3BlbmRfdW5pbml0aWFsaXplX3RocmVhZCgga21wX2luZm9fdCAqdGggKQoreworICAgIGlmICggVENSXzQoIHRoLT50aC50aF9zdXNwZW5kX2luaXQgKSApIHsKKyAgICAgIC8qIHRoaXMgbWVhbnMgd2UgaGF2ZSBpbml0aWFsaXplIHRoZSBzdXNwZW5zaW9uIHB0aHJlYWQgb2JqZWN0cyBmb3IgdGhpcyB0aHJlYWQKKyAgICAgICAgIGluIHRoaXMgaW5zdGFuY2Ugb2YgdGhlIHByb2Nlc3MgKi8KKyAgICAgIF9fa21wX3dpbjMyX2NvbmRfZGVzdHJveSggJiB0aC0+dGgudGhfc3VzcGVuZF9jdiApOworICAgICAgX19rbXBfd2luMzJfbXV0ZXhfZGVzdHJveSggJiB0aC0+dGgudGhfc3VzcGVuZF9teCApOworICAgICAgVENXXzQoIHRoLT50aC50aF9zdXNwZW5kX2luaXQsIEZBTFNFICk7CisgICAgfQorfQorCisvKgorICogVGhpcyByb3V0aW5lIHB1dHMgdGhlIGNhbGxpbmcgdGhyZWFkIHRvIHNsZWVwIGFmdGVyIHNldHRpbmcgdGhlCisgKiBzbGVlcCBiaXQgZm9yIHRoZSBpbmRpY2F0ZWQgc3BpbiB2YXJpYWJsZSB0byB0cnVlLgorICovCisKK3ZvaWQKK19fa21wX3N1c3BlbmQoIGludCB0aF9ndGlkLCB2b2xhdGlsZSBrbXBfdWludCAqc3Bpbm5lciwga21wX3VpbnQgY2hlY2tlciApCit7CisgICAga21wX2luZm9fdCAqdGggPSBfX2ttcF90aHJlYWRzW3RoX2d0aWRdOworICAgIGludCBzdGF0dXM7CisgICAga21wX3VpbnQgb2xkX3NwaW47CisKKyAgICBLRl9UUkFDRSggMzAsICgiX19rbXBfc3VzcGVuZDogVCMlZCBlbnRlciBmb3Igc3BpbiA9ICVwXG4iLCB0aF9ndGlkLCBzcGlubmVyICkgKTsKKworICAgIF9fa21wX3N1c3BlbmRfaW5pdGlhbGl6ZV90aHJlYWQoIHRoICk7CisKKyAgICBfX2ttcF93aW4zMl9tdXRleF9sb2NrKCAmdGgtPnRoLnRoX3N1c3BlbmRfbXggKTsKKworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfc3VzcGVuZDogVCMlZCBzZXR0aW5nIHNsZWVwIGJpdCBmb3Igc3BpbiglcClcbiIsCisgICAgICAgICAgICAgICAgICAgIHRoX2d0aWQsIHNwaW5uZXIgKSApOworCisgICAgLyogVE9ETzogc2hvdWxkbid0IHRoaXMgdXNlIHJlbGVhc2Ugc2VtYW50aWNzIHRvIGVuc3VyZSB0aGF0IF9fa21wX3N1c3BlbmRfaW5pdGlhbGl6ZV90aHJlYWQKKyAgICAgICBnZXRzIGNhbGxlZCBmaXJzdD8KKyAgICAqLworICAgIG9sZF9zcGluID0gS01QX1RFU1RfVEhFTl9PUjMyKCAodm9sYXRpbGUga21wX2ludDMyICopIHNwaW5uZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0JBUlJJRVJfU0xFRVBfU1RBVEUgKTsKKworICAgIEtGX1RSQUNFKCA1LCAoICJfX2ttcF9zdXNwZW5kOiBUIyVkIHNldCBzbGVlcCBiaXQgZm9yIHNwaW4oJXApPT0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhfZ3RpZCwgc3Bpbm5lciwgKnNwaW5uZXIgKSApOworCisgICAgaWYgKCBvbGRfc3BpbiA9PSBjaGVja2VyICkgeworICAgICAgICBLTVBfVEVTVF9USEVOX0FORDMyKCAodm9sYXRpbGUga21wX2ludDMyICopIHNwaW5uZXIsIH4oS01QX0JBUlJJRVJfU0xFRVBfU1RBVEUpICk7CisKKyAgICAgICAgS0ZfVFJBQ0UoIDUsICggIl9fa21wX3N1c3BlbmQ6IFQjJWQgZmFsc2UgYWxhcm0sIHJlc2V0IHNsZWVwIGJpdCBmb3Igc3BpbiglcClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHRoX2d0aWQsIHNwaW5uZXIpICk7CisgICAgfSBlbHNlIHsKKyNpZmRlZiBERUJVR19TVVNQRU5ECisgICAgICAgIF9fa21wX3N1c3BlbmRfY291bnQrKzsKKyNlbmRpZgorCisgICAgICAgIC8qIEVuY2Fwc3VsYXRlIGluIGEgbG9vcCBhcyB0aGUgZG9jdW1lbnRhdGlvbiBzdGF0ZXMgdGhhdCB0aGlzIG1heQorICAgICAgICAgKiAid2l0aCBsb3cgcHJvYmFiaWxpdHkiIHJldHVybiB3aGVuIHRoZSBjb25kaXRpb24gdmFyaWFibGUgaGFzCisgICAgICAgICAqIG5vdCBiZWVuIHNpZ25hbGVkIG9yIGJyb2FkY2FzdAorICAgICAgICAgKi8KKyAgICAgICAgaW50IGRlYWN0aXZhdGVkID0gRkFMU0U7CisgICAgICAgIFRDV19QVFIodGgtPnRoLnRoX3NsZWVwX2xvYywgc3Bpbm5lcik7CisgICAgICAgIHdoaWxlICggVENSXzQoICpzcGlubmVyICkgJiBLTVBfQkFSUklFUl9TTEVFUF9TVEFURSApIHsKKworICAgICAgICAgICAgS0ZfVFJBQ0UoIDE1LCAoIl9fa21wX3N1c3BlbmQ6IFQjJWQgYWJvdXQgdG8gcGVyZm9ybSBrbXBfd2luMzJfY29uZF93YWl0KClcbiIsCisgICAgICAgICAgICAgICAgICAgICB0aF9ndGlkICkgKTsKKworCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gTWFyayB0aGUgdGhyZWFkIGFzIG5vIGxvbmdlciBhY3RpdmUKKyAgICAgICAgICAgIC8vIChvbmx5IGluIHRoZSBmaXJzdCBpdGVyYXRpb24gb2YgdGhlIGxvb3ApLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmICggISBkZWFjdGl2YXRlZCApIHsKKyAgICAgICAgICAgICAgICB0aC0+dGgudGhfYWN0aXZlID0gRkFMU0U7CisgICAgICAgICAgICAgICAgaWYgKCB0aC0+dGgudGhfYWN0aXZlX2luX3Bvb2wgKSB7CisgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9hY3RpdmVfaW5fcG9vbCA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICBLTVBfVEVTVF9USEVOX0RFQzMyKAorICAgICAgICAgICAgICAgICAgICAgIChrbXBfaW50MzIgKikgJl9fa21wX3RocmVhZF9wb29sX2FjdGl2ZV9udGggKTsKKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggVENSXzQoX19rbXBfdGhyZWFkX3Bvb2xfYWN0aXZlX250aCkgPj0gMCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZWFjdGl2YXRlZCA9IFRSVUU7CisKKworICAgICAgICAgICAgICAgIF9fa21wX3dpbjMyX2NvbmRfd2FpdCggJnRoLT50aC50aF9zdXNwZW5kX2N2LCAmdGgtPnRoLnRoX3N1c3BlbmRfbXgsIDAsIDAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIF9fa21wX3dpbjMyX2NvbmRfd2FpdCggJnRoLT50aC50aF9zdXNwZW5kX2N2LCAmdGgtPnRoLnRoX3N1c3BlbmRfbXgsIDAsIDAgKTsKKyAgICAgICAgICAgIH0KKworI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgaWYoICgqc3Bpbm5lcikgJiBLTVBfQkFSUklFUl9TTEVFUF9TVEFURSApIHsKKyAgICAgICAgICAgICAgICBLRl9UUkFDRSggMTAwLCAoIl9fa21wX3N1c3BlbmQ6IFQjJWQgc3B1cmlvdXMgd2FrZXVwXG4iLCB0aF9ndGlkICkpOworICAgICAgICAgICAgfQorI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCisJfSAvLyB3aGlsZQorCisgICAgICAgIC8vCisgICAgICAgIC8vIE1hcmsgdGhlIHRocmVhZCBhcyBhY3RpdmUgYWdhaW4KKyAgICAgICAgLy8gKGlmIGl0IHdhcyBwcmV2aW91cyBtYXJrZWQgYXMgaW5hY3RpdmUpCisgICAgICAgIC8vCisgICAgICAgIGlmICggZGVhY3RpdmF0ZWQgKSB7CisgICAgICAgICAgICB0aC0+dGgudGhfYWN0aXZlID0gVFJVRTsKKyAgICAgICAgICAgIGlmICggVENSXzQodGgtPnRoLnRoX2luX3Bvb2wpICkgeworICAgICAgICAgICAgICAgIEtNUF9URVNUX1RIRU5fSU5DMzIoCisgICAgICAgICAgICAgICAgICAoa21wX2ludDMyICopICZfX2ttcF90aHJlYWRfcG9vbF9hY3RpdmVfbnRoICk7CisgICAgICAgICAgICAgICAgdGgtPnRoLnRoX2FjdGl2ZV9pbl9wb29sID0gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgX19rbXBfd2luMzJfbXV0ZXhfdW5sb2NrKCAmdGgtPnRoLnRoX3N1c3BlbmRfbXggKTsKKworICAgIEtGX1RSQUNFKCAzMCwgKCJfX2ttcF9zdXNwZW5kOiBUIyVkIGV4aXRcbiIsIHRoX2d0aWQgKSApOworfQorCisvKiBUaGlzIHJvdXRpbmUgc2lnbmFscyB0aGUgdGhyZWFkIHNwZWNpZmllZCBieSB0YXJnZXRfZ3RpZCB0byB3YWtlIHVwCisgKiBhZnRlciBzZXR0aW5nIHRoZSBzbGVlcCBiaXQgaW5kaWNhdGVkIGJ5IHRoZSBzcGluIGFyZ3VtZW50IHRvIEZBTFNFCisgKi8KK3ZvaWQKK19fa21wX3Jlc3VtZSggaW50IHRhcmdldF9ndGlkLCB2b2xhdGlsZSBrbXBfdWludCAqc3BpbiApCit7CisgICAga21wX2luZm9fdCAqdGggPSBfX2ttcF90aHJlYWRzW3RhcmdldF9ndGlkXTsKKyAgICBpbnQgc3RhdHVzOworICAgIGttcF91aW50MzIgb2xkX3NwaW47CisKKyNpZmRlZiBLTVBfREVCVUcKKyAgICBpbnQgZ3RpZCA9IFRDUl80KF9fa21wX2luaXRfZ3RpZCkgPyBfX2ttcF9nZXRfZ3RpZCgpIDogLTE7CisjZW5kaWYKKworICAgIEtGX1RSQUNFKCAzMCwgKCAiX19rbXBfcmVzdW1lOiBUIyVkIHdhbnRzIHRvIHdha2V1cCBUIyVkIGVudGVyXG4iLAorICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFyZ2V0X2d0aWQgKSApOworCisgICAgX19rbXBfc3VzcGVuZF9pbml0aWFsaXplX3RocmVhZCggdGggKTsKKworICAgIF9fa21wX3dpbjMyX211dGV4X2xvY2soICZ0aC0+dGgudGhfc3VzcGVuZF9teCApOworCisgICAgaWYgKCBzcGluID09IE5VTEwgKSB7CisgICAgICAgIHNwaW4gPSAodm9sYXRpbGUga21wX3VpbnQgKilUQ1JfUFRSKHRoLT50aC50aF9zbGVlcF9sb2MpOworICAgICAgICBpZiAoIHNwaW4gPT0gTlVMTCApIHsKKyAgICAgICAgICAgIEtGX1RSQUNFKCA1LCAoICJfX2ttcF9yZXN1bWU6IFQjJWQgZXhpdGluZywgdGhyZWFkIFQjJWQgYWxyZWFkeSBhd2FrZSAtICBzcGluKCVwKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFyZ2V0X2d0aWQsIHNwaW4gKSApOworCisgICAgICAgICAgICBfX2ttcF93aW4zMl9tdXRleF91bmxvY2soICZ0aC0+dGgudGhfc3VzcGVuZF9teCApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgVENXX1BUUih0aC0+dGgudGhfc2xlZXBfbG9jLCBOVUxMKTsKKyAgICBvbGRfc3BpbiA9IEtNUF9URVNUX1RIRU5fQU5EMzIoIChrbXBfaW50MzIgdm9sYXRpbGUgKikgc3BpbiwgfiggS01QX0JBUlJJRVJfU0xFRVBfU1RBVEUgKSApOworCisgICAgaWYgKCAoIG9sZF9zcGluICYgS01QX0JBUlJJRVJfU0xFRVBfU1RBVEUgKSA9PSAwICkgeworICAgICAgICBLRl9UUkFDRSggNSwgKCAiX19rbXBfcmVzdW1lOiBUIyVkIGV4aXRpbmcsIHRocmVhZCBUIyVkIGFscmVhZHkgYXdha2UgLSBzcGluKCVwKTogIgorICAgICAgICAgICAgICAgICAgICIldSA9PiAldVxuIiwKKyAgICAgICAgICAgICAgICAgICBndGlkLCB0YXJnZXRfZ3RpZCwgc3Bpbiwgb2xkX3NwaW4sICpzcGluICkgKTsKKworICAgICAgICBfX2ttcF93aW4zMl9tdXRleF91bmxvY2soICZ0aC0+dGgudGhfc3VzcGVuZF9teCApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIFRDV19QVFIodGgtPnRoLnRoX3NsZWVwX2xvYywgTlVMTCk7CisKKyAgICBLRl9UUkFDRSggNSwgKCAiX19rbXBfcmVzdW1lOiBUIyVkIGFib3V0IHRvIHdha2V1cCBUIyVkLCByZXNldCBzbGVlcCBiaXQgZm9yIHNwaW4oJXApXG4iLAorICAgICAgICAgICAgICAgICAgICBndGlkLCB0YXJnZXRfZ3RpZCwgc3BpbikgKTsKKworCisgICAgX19rbXBfd2luMzJfY29uZF9zaWduYWwoICAmdGgtPnRoLnRoX3N1c3BlbmRfY3YgKTsKKworICAgIF9fa21wX3dpbjMyX211dGV4X3VubG9jayggJnRoLT50aC50aF9zdXNwZW5kX214ICk7CisKKyAgICBLRl9UUkFDRSggMzAsICggIl9fa21wX3Jlc3VtZTogVCMlZCBleGl0aW5nIGFmdGVyIHNpZ25hbGluZyB3YWtlIHVwIGZvciBUIyVkXG4iLAorICAgICAgICAgICAgICAgICAgICBndGlkLCB0YXJnZXRfZ3RpZCApICk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQKK19fa21wX3lpZWxkKCBpbnQgY29uZCApCit7CisgICAgaWYgKGNvbmQpCisgICAgICAgIFNsZWVwKDApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkCitfX2ttcF9ndGlkX3NldF9zcGVjaWZpYyggaW50IGd0aWQgKQoreworICAgIEtBX1RSQUNFKCA1MCwgKCJfX2ttcF9ndGlkX3NldF9zcGVjaWZpYzogVCMlZCBrZXk6JWRcbiIsCisgICAgICAgICAgICAgICAgZ3RpZCwgX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSApKTsKKyAgICBLTVBfQVNTRVJUKCBfX2ttcF9pbml0X3J1bnRpbWUgKTsKKyAgICBpZiggISBUbHNTZXRWYWx1ZSggX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSwgKExQVk9JRCkoZ3RpZCsxKSkgKQorICAgICAgICBLTVBfRkFUQUwoIFRMU1NldFZhbHVlRmFpbGVkICk7Cit9CisKK2ludAorX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKQoreworICAgIGludCBndGlkOworICAgIGlmKCAhX19rbXBfaW5pdF9ydW50aW1lICkgeworICAgICAgICBLQV9UUkFDRSggNTAsICgiX19rbXBfZ2V0X3NwZWNpZmljOiBydW50aW1lIHNodXRkb3duLCByZXR1cm5pbmcgS01QX0dUSURfU0hVVERPV05cbiIgKSApOworICAgICAgICByZXR1cm4gS01QX0dUSURfU0hVVERPV047CisgICAgfQorICAgIGd0aWQgPSAoaW50KShrbXBfaW50cHRyX3QpVGxzR2V0VmFsdWUoIF9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXkgKTsKKyAgICBpZiAoIGd0aWQgPT0gMCApIHsKKyAgICAgICAgZ3RpZCA9IEtNUF9HVElEX0RORTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGd0aWQtLTsKKyAgICB9CisgICAgS0FfVFJBQ0UoIDUwLCAoIl9fa21wX2d0aWRfZ2V0X3NwZWNpZmljOiBrZXk6JWQgZ3RpZDolZFxuIiwKKyAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX3RocmVhZHByaXZhdGVfa2V5LCBndGlkICkpOworICAgIHJldHVybiBndGlkOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgS01QX0FSQ0hfWDg2XzY0CisKKy8vCisvLyBPbmx5IDEgRFdPUkQgaW4gdGhlIG1hc2sgc2hvdWxkIGhhdmUgYW55IHByb2NzIHNldC4KKy8vIFJldHVybiB0aGUgYXBwcm9wcmlhdGUgaW5kZXgsIG9yIC0xIGZvciBhbiBpbnZhbGlkIG1hc2suCisvLworaW50CitfX2ttcF9nZXRfcHJvY19ncm91cCgga21wX2FmZmluX21hc2tfdCBjb25zdCAqbWFzayApCit7CisgICAgaW50IGk7CisgICAgaW50IGdyb3VwID0gLTE7CisgICAgc3RydWN0IEdST1VQX0FGRklOSVRZIG5ld19nYSwgcHJldl9nYTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgX19rbXBfbnVtX3Byb2NfZ3JvdXBzOyBpKyspIHsKKyAgICAgICAgaWYgKG1hc2tbaV0gPT0gMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdyb3VwID49IDApIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBncm91cCA9IGk7CisgICAgfQorICAgIHJldHVybiBncm91cDsKK30KKworI2VuZGlmIC8qIEtNUF9BUkNIX1g4Nl82NCAqLworCitpbnQKK19fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkoIGttcF9hZmZpbl9tYXNrX3QgY29uc3QgKm1hc2ssIGludCBhYm9ydF9vbl9lcnJvciApCit7CisKKyNpZiBLTVBfQVJDSF9YODZfNjQKKworICAgIGlmIChfX2ttcF9udW1fcHJvY19ncm91cHMgPiAxKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIENoZWNrIGZvciBhIHZhbGlkIG1hc2suCisgICAgICAgIC8vCisgICAgICAgIHN0cnVjdCBHUk9VUF9BRkZJTklUWSBnYTsKKyAgICAgICAgaW50IGdyb3VwID0gX19rbXBfZ2V0X3Byb2NfZ3JvdXAoIG1hc2sgKTsKKyAgICAgICAgaWYgKGdyb3VwIDwgMCkgeworICAgICAgICAgICAgaWYgKGFib3J0X29uX2Vycm9yKSB7CisgICAgICAgICAgICAgICAgS01QX0ZBVEFMKEFmZmluaXR5SW52YWxpZE1hc2ssICJrbXBfc2V0X2FmZmluaXR5Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBUcmFuc2Zvcm0gdGhlIGJpdCB2ZWN0b3IgaW50byBhIEdST1VQX0FGRklOSVRZIHN0cnVjdAorICAgICAgICAvLyBhbmQgbWFrZSB0aGUgc3lzdGVtIGNhbGwgdG8gc2V0IGFmZmluaXR5LgorICAgICAgICAvLworICAgICAgICBnYS5ncm91cCA9IGdyb3VwOworICAgICAgICBnYS5tYXNrID0gbWFza1tncm91cF07CisgICAgICAgIGdhLnJlc2VydmVkWzBdID0gZ2EucmVzZXJ2ZWRbMV0gPSBnYS5yZXNlcnZlZFsyXSA9IDA7CisKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9TZXRUaHJlYWRHcm91cEFmZmluaXR5ICE9IE5VTEwpOworICAgICAgICBpZiAoX19rbXBfU2V0VGhyZWFkR3JvdXBBZmZpbml0eShHZXRDdXJyZW50VGhyZWFkKCksICZnYSwgTlVMTCkgPT0gMCkgeworICAgICAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIGlmIChhYm9ydF9vbl9lcnJvcikgeworICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50U2V0VGhyZWFkQWZmTWFzayApLAorICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorCisjZW5kaWYgLyogS01QX0FSQ0hfWDg2XzY0ICovCisKKyAgICB7CisgICAgICAgIGlmICghU2V0VGhyZWFkQWZmaW5pdHlNYXNrKCBHZXRDdXJyZW50VGhyZWFkKCksICptYXNrICkpIHsKKyAgICAgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBpZiAoYWJvcnRfb25fZXJyb3IpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudFNldFRocmVhZEFmZk1hc2sgKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGVycm9yOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQKK19fa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkoIGttcF9hZmZpbl9tYXNrX3QgKm1hc2ssIGludCBhYm9ydF9vbl9lcnJvciApCit7CisKKyNpZiBLTVBfQVJDSF9YODZfNjQKKworICAgIGlmIChfX2ttcF9udW1fcHJvY19ncm91cHMgPiAxKSB7CisgICAgICAgIEtNUF9DUFVfWkVSTyhtYXNrKTsKKyAgICAgICAgc3RydWN0IEdST1VQX0FGRklOSVRZIGdhOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX0dldFRocmVhZEdyb3VwQWZmaW5pdHkgIT0gTlVMTCk7CisKKyAgICAgICAgaWYgKF9fa21wX0dldFRocmVhZEdyb3VwQWZmaW5pdHkoR2V0Q3VycmVudFRocmVhZCgpLCAmZ2EpID09IDApIHsKKyAgICAgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBpZiAoYWJvcnRfb25fZXJyb3IpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyhGdW5jdGlvbkVycm9yLCAiR2V0VGhyZWFkR3JvdXBBZmZpbml0eSgpIiksCisgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoZXJyb3IpLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKGdhLmdyb3VwIDwgMCkgfHwgKGdhLmdyb3VwID4gX19rbXBfbnVtX3Byb2NfZ3JvdXBzKQorICAgICAgICAgIHx8IChnYS5tYXNrID09IDApKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBtYXNrW2dhLmdyb3VwXSA9IGdhLm1hc2s7CisgICAgfQorICAgIGVsc2UKKworI2VuZGlmIC8qIEtNUF9BUkNIX1g4Nl82NCAqLworCisgICAgeworICAgICAgICBrbXBfYWZmaW5fbWFza190IG5ld01hc2ssIHN5c01hc2ssIHJldHZhbDsKKworICAgICAgICBpZiAoIUdldFByb2Nlc3NBZmZpbml0eU1hc2soR2V0Q3VycmVudFByb2Nlc3MoKSwgJm5ld01hc2ssICZzeXNNYXNrKSkgeworICAgICAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIGlmIChhYm9ydF9vbl9lcnJvcikgeworICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKEZ1bmN0aW9uRXJyb3IsICJHZXRQcm9jZXNzQWZmaW5pdHlNYXNrKCkiKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0VSUihlcnJvciksCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICByZXR2YWwgPSBTZXRUaHJlYWRBZmZpbml0eU1hc2soR2V0Q3VycmVudFRocmVhZCgpLCBuZXdNYXNrKTsKKyAgICAgICAgaWYgKCEgcmV0dmFsKSB7CisgICAgICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgaWYgKGFib3J0X29uX2Vycm9yKSB7CisgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coRnVuY3Rpb25FcnJvciwgIlNldFRocmVhZEFmZmluaXR5TWFzaygpIiksCisgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoZXJyb3IpLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgbmV3TWFzayA9IFNldFRocmVhZEFmZmluaXR5TWFzayhHZXRDdXJyZW50VGhyZWFkKCksIHJldHZhbCk7CisgICAgICAgIGlmICghIG5ld01hc2spIHsKKyAgICAgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBpZiAoYWJvcnRfb25fZXJyb3IpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyhGdW5jdGlvbkVycm9yLCAiU2V0VGhyZWFkQWZmaW5pdHlNYXNrKCkiKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0VSUihlcnJvciksCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAqbWFzayA9IHJldHZhbDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQKK19fa21wX2FmZmluaXR5X2JpbmRfdGhyZWFkKCBpbnQgcHJvYyApCit7CisKKyNpZiBLTVBfQVJDSF9YODZfNjQKKworICAgIGlmIChfX2ttcF9udW1fcHJvY19ncm91cHMgPiAxKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIEZvcm0gdGhlIEdST1VQX0FGRklOSVRZIHN0cnVjdCBkaXJlY3RseSwgcmF0aGVyIHRoYW4gZmlsbGluZworICAgICAgICAvLyBvdXQgYSBiaXQgdmVjdG9yIGFuZCBjYWxsaW5nIF9fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkoKS4KKyAgICAgICAgLy8KKyAgICAgICAgc3RydWN0IEdST1VQX0FGRklOSVRZIGdhOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKChwcm9jID49IDApICYmIChwcm9jIDwgKF9fa21wX251bV9wcm9jX2dyb3VwcworICAgICAgICAgICAqIENIQVJfQklUICogc2l6ZW9mKERXT1JEX1BUUikpKSk7CisgICAgICAgIGdhLmdyb3VwID0gcHJvYyAvIChDSEFSX0JJVCAqIHNpemVvZihEV09SRF9QVFIpKTsKKyAgICAgICAgZ2EubWFzayA9IDEgPDwgKHByb2MgJSAoQ0hBUl9CSVQgKiBzaXplb2YoRFdPUkRfUFRSKSkpOworICAgICAgICBnYS5yZXNlcnZlZFswXSA9IGdhLnJlc2VydmVkWzFdID0gZ2EucmVzZXJ2ZWRbMl0gPSAwOworCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfU2V0VGhyZWFkR3JvdXBBZmZpbml0eSAhPSBOVUxMKTsKKyAgICAgICAgaWYgKF9fa21wX1NldFRocmVhZEdyb3VwQWZmaW5pdHkoR2V0Q3VycmVudFRocmVhZCgpLCAmZ2EsIE5VTEwpID09IDApIHsKKyAgICAgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeyAvLyBBQzogY29udGludWUgc2lsZW50bHkgaWYgbm90IHZlcmJvc2UKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgIGttcF9tc193YXJuaW5nLAorICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50U2V0VGhyZWFkQWZmTWFzayApLAorICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorCisjZW5kaWYgLyogS01QX0FSQ0hfWDg2XzY0ICovCisKKyAgICB7CisgICAgICAgIGttcF9hZmZpbl9tYXNrX3QgbWFzazsKKyAgICAgICAgS01QX0NQVV9aRVJPKCZtYXNrKTsKKyAgICAgICAgS01QX0NQVV9TRVQocHJvYywgJm1hc2spOworICAgICAgICBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KCZtYXNrLCBUUlVFKTsKKyAgICB9Cit9CisKK3ZvaWQKK19fa21wX2FmZmluaXR5X2RldGVybWluZV9jYXBhYmxlKCBjb25zdCBjaGFyICplbnZfdmFyICkKK3sKKyAgICAvLworICAgIC8vIEFsbCB2ZXJzaW9ucyBvZiBXaW5kb3dzKiBPUyAoc2luY2UgV2luICc5NSkgc3VwcG9ydCBTZXRUaHJlYWRBZmZpbml0eU1hc2soKS4KKyAgICAvLworCisjaWYgS01QX0FSQ0hfWDg2XzY0CisgICAgX19rbXBfYWZmaW5fbWFza19zaXplID0gX19rbXBfbnVtX3Byb2NfZ3JvdXBzICogc2l6ZW9mKGttcF9hZmZpbl9tYXNrX3QpOworI2Vsc2UKKyAgICBfX2ttcF9hZmZpbl9tYXNrX3NpemUgPSBzaXplb2Yoa21wX2FmZmluX21hc2tfdCk7CisjZW5kaWYKKworICAgIEtBX1RSQUNFKCAxMCwgKAorICAgICAgICAiX19rbXBfYWZmaW5pdHlfZGV0ZXJtaW5lX2NhcGFibGU6ICIKKyAgICAgICAgICAgICJXaW5kb3dzKiBPUyBhZmZpbml0eSBpbnRlcmZhY2UgZnVuY3Rpb25hbCAobWFzayBzaXplID0gJSIgS01QX1NJWkVfVF9TUEVDICIpLlxuIiwKKyAgICAgICAgX19rbXBfYWZmaW5fbWFza19zaXplCisgICAgKSApOworfQorCitkb3VibGUKK19fa21wX3JlYWRfY3B1X3RpbWUoIHZvaWQgKQoreworICAgIEZJTEVUSU1FICAgIENyZWF0aW9uVGltZSwgRXhpdFRpbWUsIEtlcm5lbFRpbWUsIFVzZXJUaW1lOworICAgIGludCAgICAgICAgIHN0YXR1czsKKyAgICBkb3VibGUgICAgICBjcHVfdGltZTsKKworICAgIGNwdV90aW1lID0gMDsKKworICAgIHN0YXR1cyA9IEdldFByb2Nlc3NUaW1lcyggR2V0Q3VycmVudFByb2Nlc3MoKSwgJkNyZWF0aW9uVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFeGl0VGltZSwgJktlcm5lbFRpbWUsICZVc2VyVGltZSApOworCisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBkb3VibGUgIHNlYyA9IDA7CisKKyAgICAgICAgc2VjICs9IEtlcm5lbFRpbWUuZHdIaWdoRGF0ZVRpbWU7CisgICAgICAgIHNlYyArPSBVc2VyVGltZS5kd0hpZ2hEYXRlVGltZTsKKworICAgICAgICAvKiBTaGlmdCBsZWZ0IGJ5IDMyIGJpdHMgKi8KKyAgICAgICAgc2VjICo9IChkb3VibGUpICgxIDw8IDE2KSAqIChkb3VibGUpICgxIDw8IDE2KTsKKworICAgICAgICBzZWMgKz0gS2VybmVsVGltZS5kd0xvd0RhdGVUaW1lOworICAgICAgICBzZWMgKz0gVXNlclRpbWUuZHdMb3dEYXRlVGltZTsKKworICAgICAgICBjcHVfdGltZSArPSAoc2VjICogMTAwLjApIC8gTlNFQ19QRVJfU0VDOworICAgIH0KKworICAgIHJldHVybiBjcHVfdGltZTsKK30KKworaW50CitfX2ttcF9yZWFkX3N5c3RlbV9pbmZvKCBzdHJ1Y3Qga21wX3N5c19pbmZvICppbmZvICkKK3sKKyAgICBpbmZvLT5tYXhyc3MgID0gMDsgICAgICAgICAgICAgICAgICAgLyogdGhlIG1heGltdW0gcmVzaWRlbnQgc2V0IHNpemUgdXRpbGl6ZWQgKGluIGtpbG9ieXRlcykgICAgICovCisgICAgaW5mby0+bWluZmx0ICA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIHRoZSBudW1iZXIgb2YgcGFnZSBmYXVsdHMgc2VydmljZWQgd2l0aG91dCBhbnkgSS9PICAgICAgICAqLworICAgIGluZm8tPm1hamZsdCAgPSAwOyAgICAgICAgICAgICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIHBhZ2UgZmF1bHRzIHNlcnZpY2VkIHRoYXQgcmVxdWlyZWQgSS9PICAgICAgKi8KKyAgICBpbmZvLT5uc3dhcCAgID0gMDsgICAgICAgICAgICAgICAgICAgLyogdGhlIG51bWJlciBvZiB0aW1lcyBhIHByb2Nlc3Mgd2FzICJzd2FwcGVkIiBvdXQgb2YgbWVtb3J5ICovCisgICAgaW5mby0+aW5ibG9jayA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGZpbGUgc3lzdGVtIGhhZCB0byBwZXJmb3JtIGlucHV0ICAqLworICAgIGluZm8tPm91YmxvY2sgPSAwOyAgICAgICAgICAgICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBmaWxlIHN5c3RlbSBoYWQgdG8gcGVyZm9ybSBvdXRwdXQgKi8KKyAgICBpbmZvLT5udmNzdyAgID0gMDsgICAgICAgICAgICAgICAgICAgLyogdGhlIG51bWJlciBvZiB0aW1lcyBhIGNvbnRleHQgc3dpdGNoIHdhcyB2b2x1bnRhcmlseSAgICAgICovCisgICAgaW5mby0+bml2Y3N3ICA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIHRoZSBudW1iZXIgb2YgdGltZXMgYSBjb250ZXh0IHN3aXRjaCB3YXMgZm9yY2VkICAgICAgICAgICAqLworCisgICAgcmV0dXJuIDE7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwordm9pZAorX19rbXBfcnVudGltZV9pbml0aWFsaXplKCB2b2lkICkKK3sKKyAgICBTWVNURU1fSU5GTyBpbmZvOworICAgIGttcF9zdHJfYnVmX3QgcGF0aDsKKyAgICBVSU5UIHBhdGhfc2l6ZTsKKworICAgIGlmICggX19rbXBfaW5pdF9ydW50aW1lICkgeworICAgICAgICByZXR1cm47CisgICAgfTsKKworICAgIEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oICYgX19rbXBfd2luMzJfc2VjdGlvbiApOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfc3lzdGVtX29iamVjdF9jcmVhdGVkKCAmIF9fa21wX3dpbjMyX3NlY3Rpb24sICJDcml0aWNhbCBTZWN0aW9uIiApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICBfX2ttcF9pbml0aWFsaXplX3N5c3RlbV90aWNrKCk7CisKKyAgICAjaWYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQpCisgICAgICAgIGlmICggISBfX2ttcF9jcHVpbmZvLmluaXRpYWxpemVkICkgeworICAgICAgICAgICAgX19rbXBfcXVlcnlfY3B1aWQoICYgX19rbXBfY3B1aW5mbyApOworICAgICAgICB9OyAvLyBpZgorICAgICNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKyAgICAvKiBTZXQgdXAgbWluaW11bSBudW1iZXIgb2YgdGhyZWFkcyB0byBzd2l0Y2ggdG8gVExTIGd0aWQgKi8KKyAgICAjaWYgS01QX09TX1dJTkRPV1MgJiYgISBkZWZpbmVkIEdVSURFRExMX0VYUE9SVFMgCisgICAgICAgIC8vIFdpbmRvd3MqIE9TLCBzdGF0aWMgbGlicmFyeS4KKyAgICAgICAgLyoKKyAgICAgICAgICAgIE5ldyB0aHJlYWQgbWF5IHVzZSBzdGFjayBzcGFjZSBwcmV2aW91c2x5IHVzZWQgYnkgYW5vdGhlciB0aHJlYWQsIGN1cnJlbnRseSB0ZXJtaW5hdGVkLgorICAgICAgICAgICAgT24gV2luZG93cyogT1MsIGluIGNhc2Ugb2Ygc3RhdGljIGxpbmtpbmcsIHdlIGRvIG5vdCBrbm93IHRoZSBtb21lbnQgb2YgdGhyZWFkIHRlcm1pbmF0aW9uLAorICAgICAgICAgICAgYW5kIG91ciBzdHJ1Y3R1cmVzIChfX2ttcF90aHJlYWRzIGFuZCBfX2ttcF9yb290IGFycmF5cykgYXJlIHN0aWxsIGtlZXAgaW5mbyBhYm91dCBkZWFkCisgICAgICAgICAgICB0aHJlYWRzLiBUaGlzIGxlYWRzIHRvIHByb2JsZW0gaW4gX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWQoKSBmdW5jdGlvbjogaXQgd3JvbmdseQorICAgICAgICAgICAgZmluZHMgZ3RpZCAoYnkgc2VhcmNoaW5nIHRocm91Z2ggc3RhY2sgYWRkcmVzc2VzIG9mIGFsbCBrbm93biB0aHJlYWRzKSBmb3IgdW5yZWdpc3RlcmVkCisgICAgICAgICAgICBmb3JlaWduIHRyZWFkLgorCisgICAgICAgICAgICBTZXR0aW5nIF9fa21wX3Rsc19ndGlkX21pbiB0byAwIHdvcmthcm91bmRzIHRoaXMgcHJvYmxlbTogX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWQoKQorICAgICAgICAgICAgZG9lcyBub3Qgc2VhcmNoIHRocm91Z2ggc3RhY2tzLCBidXQgZ2V0IGd0aWQgZnJvbSBUTFMgaW1tZWRpYXRlbGx5LgorCisgICAgICAgICAgICAtLWxuCisgICAgICAgICovCisgICAgICAgIF9fa21wX3Rsc19ndGlkX21pbiA9IDA7CisgICAgI2Vsc2UKKyAgICAgICAgX19rbXBfdGxzX2d0aWRfbWluID0gS01QX1RMU19HVElEX01JTjsKKyAgICAjZW5kaWYKKworICAgIC8qIGZvciB0aGUgc3RhdGljIGxpYnJhcnkgKi8KKyAgICBpZiAoICFfX2ttcF9ndGlkX3RocmVhZHByaXZhdGVfa2V5ICkgeworICAgICAgICBfX2ttcF9ndGlkX3RocmVhZHByaXZhdGVfa2V5ID0gVGxzQWxsb2MoKTsKKyAgICAgICAgaWYoIF9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXkgPT0gVExTX09VVF9PRl9JTkRFWEVTICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBUTFNPdXRPZkluZGV4ZXMgKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLy8KKyAgICAvLyBMb2FkIG50ZGxsLmRsbC4KKyAgICAvLworICAgIC8qCisgICAgICAgIFNpbXBsZQorICAgICAgICAgICAgR2V0TW9kdWxlSGFuZGxlKCAibnRkbGwuZGwiICkKKyAgICAgICAgaXMgbm90IHN1aXRhYmxlIGR1ZSB0byBzZWN1cml0eSBpc3N1ZSAoc2VlCisgICAgICAgIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS90ZWNobmV0L3NlY3VyaXR5L2Fkdmlzb3J5LzIyNjk2MzcubXNweCkuIFdlIGhhdmUgdG8gc3BlY2lmeSBmdWxsCisgICAgICAgIHBhdGggdG8gdGhlIGxpYnJhcnkuCisgICAgKi8KKyAgICBfX2ttcF9zdHJfYnVmX2luaXQoICYgcGF0aCApOworICAgIHBhdGhfc2l6ZSA9IEdldFN5c3RlbURpcmVjdG9yeSggcGF0aC5zdHIsIHBhdGguc2l6ZSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHBhdGhfc2l6ZSA+IDAgKTsKKyAgICBpZiAoIHBhdGhfc2l6ZSA+PSBwYXRoLnNpemUgKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIEJ1ZmZlciBpcyB0b28gc2hvcnQuICBFeHBhbmQgdGhlIGJ1ZmZlciBhbmQgdHJ5IGFnYWluLgorICAgICAgICAvLworICAgICAgICBfX2ttcF9zdHJfYnVmX3Jlc2VydmUoICYgcGF0aCwgcGF0aF9zaXplICk7CisgICAgICAgIHBhdGhfc2l6ZSA9IEdldFN5c3RlbURpcmVjdG9yeSggcGF0aC5zdHIsIHBhdGguc2l6ZSApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBwYXRoX3NpemUgPiAwICk7CisgICAgfTsgLy8gaWYKKyAgICBpZiAoIHBhdGhfc2l6ZSA+IDAgJiYgcGF0aF9zaXplIDwgcGF0aC5zaXplICkgeworICAgICAgICAvLworICAgICAgICAvLyBOb3cgd2UgaGF2ZSBzeXN0ZW0gZGlyZWN0b3J5IG5hbWUgaW4gdGhlIGJ1ZmZlci4KKyAgICAgICAgLy8gQXBwZW5kIGJhY2tzbGFzaCBhbmQgbmFtZSBvZiBkbGwgdG8gZm9ybSBmdWxsIHBhdGgsCisgICAgICAgIC8vCisgICAgICAgIHBhdGgudXNlZCA9IHBhdGhfc2l6ZTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBwYXRoLCAiXFwlcyIsICJudGRsbC5kbGwiICk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gTm93IGxvYWQgbnRkbGwgdXNpbmcgZnVsbCBwYXRoLgorICAgICAgICAvLworICAgICAgICBudGRsbCA9IEdldE1vZHVsZUhhbmRsZSggcGF0aC5zdHIgKTsKKyAgICB9CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBudGRsbCAhPSBOVUxMICk7CisgICAgaWYgKCBudGRsbCAhPSBOVUxMICkgeworICAgICAgICBOdFF1ZXJ5U3lzdGVtSW5mb3JtYXRpb24gPSAoTnRRdWVyeVN5c3RlbUluZm9ybWF0aW9uX3QpIEdldFByb2NBZGRyZXNzKCBudGRsbCwgIk50UXVlcnlTeXN0ZW1JbmZvcm1hdGlvbiIgKTsKKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVCggTnRRdWVyeVN5c3RlbUluZm9ybWF0aW9uICE9IE5VTEwgKTsKKworI2lmIEtNUF9BUkNIX1g4Nl82NAorICAgIC8vCisgICAgLy8gTG9hZCBrZXJuZWwzMi5kbGwuCisgICAgLy8gU2FtZSBjYXZlYXQgLSBtdXN0IHVzZSBmdWxsIHN5c3RlbSBwYXRoIG5hbWUuCisgICAgLy8KKyAgICBpZiAoIHBhdGhfc2l6ZSA+IDAgJiYgcGF0aF9zaXplIDwgcGF0aC5zaXplICkgeworICAgICAgICAvLworICAgICAgICAvLyBUcnVuY2F0ZSB0aGUgYnVmZmVyIGJhY2sgdG8ganVzdCB0aGUgc3lzdGVtIHBhdGggbGVuZ3RoLAorICAgICAgICAvLyBkaXNjYXJkaW5nICJcXG50ZGxsLmRsbCIsIGFuZCByZXBsYWNpbmcgaXQgd2l0aCAia2VybmVsMzIuZGxsIi4KKyAgICAgICAgLy8KKyAgICAgICAgcGF0aC51c2VkID0gcGF0aF9zaXplOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIHBhdGgsICJcXCVzIiwgImtlcm5lbDMyLmRsbCIgKTsKKworICAgICAgICAvLworICAgICAgICAvLyBMb2FkIGtlcm5lbDMyLmRsbCB1c2luZyBmdWxsIHBhdGguCisgICAgICAgIC8vCisgICAgICAgIGtlcm5lbDMyID0gR2V0TW9kdWxlSGFuZGxlKCBwYXRoLnN0ciApOworCisgICAgICAgIC8vCisgICAgICAgIC8vIExvYWQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIGtlcm5lbDMyLmRsbCByb3V0aW5lcworICAgICAgICAvLyB0aGF0IG1heSBvciBtYXkgbm90IGV4aXN0IG9uIHRoaXMgc3lzdGVtLgorICAgICAgICAvLworICAgICAgICBpZiAoIGtlcm5lbDMyICE9IE5VTEwgKSB7CisgICAgICAgICAgICBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JDb3VudCA9IChrbXBfR2V0QWN0aXZlUHJvY2Vzc29yQ291bnRfdCkgR2V0UHJvY0FkZHJlc3MoIGtlcm5lbDMyLCAiR2V0QWN0aXZlUHJvY2Vzc29yQ291bnQiICk7CisgICAgICAgICAgICBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JHcm91cENvdW50ID0gKGttcF9HZXRBY3RpdmVQcm9jZXNzb3JHcm91cENvdW50X3QpIEdldFByb2NBZGRyZXNzKCBrZXJuZWwzMiwgIkdldEFjdGl2ZVByb2Nlc3Nvckdyb3VwQ291bnQiICk7CisgICAgICAgICAgICBfX2ttcF9HZXRUaHJlYWRHcm91cEFmZmluaXR5ID0gKGttcF9HZXRUaHJlYWRHcm91cEFmZmluaXR5X3QpIEdldFByb2NBZGRyZXNzKCBrZXJuZWwzMiwgIkdldFRocmVhZEdyb3VwQWZmaW5pdHkiICk7CisgICAgICAgICAgICBfX2ttcF9TZXRUaHJlYWRHcm91cEFmZmluaXR5ID0gKGttcF9TZXRUaHJlYWRHcm91cEFmZmluaXR5X3QpIEdldFByb2NBZGRyZXNzKCBrZXJuZWwzMiwgIlNldFRocmVhZEdyb3VwQWZmaW5pdHkiICk7CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBTZWUgaWYgZ3JvdXAgYWZmaW5pdHkgaXMgc3VwcG9ydGVkIG9uIHRoaXMgc3lzdGVtLgorICAgICAgICAgICAgLy8gSWYgc28sIGNhbGN1bGF0ZSB0aGUgI2dyb3VwcyBhbmQgI3Byb2NzLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIEdyb3VwIGFmZmluaXR5IHdhcyBpbnRyb2R1Y2VkIHdpdGggV2luZG93cyogNyBPUyBhbmQgCisgICAgICAgICAgICAvLyBXaW5kb3dzKiBTZXJ2ZXIgMjAwOCBSMiBPUy4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBpZiAoICggX19rbXBfR2V0QWN0aXZlUHJvY2Vzc29yQ291bnQgIT0gTlVMTCApCisgICAgICAgICAgICAgICYmICggX19rbXBfR2V0QWN0aXZlUHJvY2Vzc29yR3JvdXBDb3VudCAhPSBOVUxMICkKKyAgICAgICAgICAgICAgJiYgKCBfX2ttcF9HZXRUaHJlYWRHcm91cEFmZmluaXR5ICE9IE5VTEwgKQorICAgICAgICAgICAgICAmJiAoIF9fa21wX1NldFRocmVhZEdyb3VwQWZmaW5pdHkgIT0gTlVMTCApCisgICAgICAgICAgICAgICYmICggKCBfX2ttcF9udW1fcHJvY19ncm91cHMKKyAgICAgICAgICAgICAgPSBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JHcm91cENvdW50KCkgKSA+IDEgKSApIHsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgdG90YWwgbnVtYmVyIG9mIGFjdGl2ZSBPUyBwcm9jcy4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIGludCBpOworCisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3J1bnRpbWVfaW5pdGlhbGl6ZTogJWQgcHJvY2Vzc29yIGdyb3VwcyBkZXRlY3RlZFxuIiwgX19rbXBfbnVtX3Byb2NfZ3JvdXBzICkgKTsKKworICAgICAgICAgICAgICAgIF9fa21wX3hwcm9jID0gMDsKKworICAgICAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgX19rbXBfbnVtX3Byb2NfZ3JvdXBzOyBpKysgKSB7CisgICAgICAgICAgICAgICAgICAgIERXT1JEIHNpemUgPSBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JDb3VudCggaSApOworICAgICAgICAgICAgICAgICAgICBfX2ttcF94cHJvYyArPSBzaXplOworICAgICAgICAgICAgICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfcnVudGltZV9pbml0aWFsaXplOiBwcm9jIGdyb3VwICVkIHNpemUgPSAlZFxuIiwgaSwgc2l6ZSApICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmICggX19rbXBfbnVtX3Byb2NfZ3JvdXBzIDw9IDEgKSB7CisgICAgICAgIEdldFN5c3RlbUluZm8oICYgaW5mbyApOworICAgICAgICBfX2ttcF94cHJvYyA9IGluZm8uZHdOdW1iZXJPZlByb2Nlc3NvcnM7CisgICAgfQorI2Vsc2UKKyAgICBHZXRTeXN0ZW1JbmZvKCAmIGluZm8gKTsKKyAgICBfX2ttcF94cHJvYyA9IGluZm8uZHdOdW1iZXJPZlByb2Nlc3NvcnM7CisjZW5kaWYgLy8gS01QX0FSQ0hfWDg2XzY0CisKKyAgICAvLworICAgIC8vIElmIHRoZSBPUyBzYWlkIHRoZXJlIHdlcmUgMCBwcm9jcywgdGFrZSBhIGd1ZXNzIGFuZCB1c2UgYSB2YWx1ZSBvZiAyLgorICAgIC8vIFRoaXMgaXMgZG9uZSBmb3IgTGludXgqIE9TLCBhbHNvLiAgRG8gd2UgbmVlZCBlcnJvciAvIHdhcm5pbmc/CisgICAgLy8KKyAgICBpZiAoIF9fa21wX3hwcm9jIDw9IDAgKSB7CisgICAgICAgIF9fa21wX3hwcm9jID0gMjsKKyAgICB9CisKKyAgICBLQV9UUkFDRSggNSwgKCJfX2ttcF9ydW50aW1lX2luaXRpYWxpemU6IHRvdGFsIHByb2Nlc3NvcnMgPSAlZFxuIiwgX19rbXBfeHByb2MpICk7CisKKyAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoICYgcGF0aCApOworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9pbml0aWFsaXplKCk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgX19rbXBfaW5pdF9ydW50aW1lID0gVFJVRTsKK30gLy8gX19rbXBfcnVudGltZV9pbml0aWFsaXplCisKK3ZvaWQKK19fa21wX3J1bnRpbWVfZGVzdHJveSggdm9pZCApCit7CisgICAgaWYgKCAhIF9fa21wX2luaXRfcnVudGltZSApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfZGVzdHJveSgpOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIC8qIHdlIGNhbid0IERlbGV0ZUNyaXRpY2Fsc2VjdGlvbiggJiBfX2ttcF93aW4zMl9zZWN0aW9uICk7ICovCisgICAgLyogZHVlIHRvIHRoZSBLWF9UUkFDRSgpIGNvbW1hbmRzICovCisgICAgS0FfVFJBQ0UoIDQwLCAoIl9fa21wX3J1bnRpbWVfZGVzdHJveVxuIiApKTsKKworICAgIGlmKCBfX2ttcF9ndGlkX3RocmVhZHByaXZhdGVfa2V5ICkgeworICAgICAgICBUbHNGcmVlKCBfX2ttcF9ndGlkX3RocmVhZHByaXZhdGVfa2V5ICk7CisgICAgICAgIF9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXkgPSAwOworICAgIH0KKworICAgIF9fa21wX2FmZmluaXR5X3VuaW5pdGlhbGl6ZSgpOworICAgIERlbGV0ZUNyaXRpY2FsU2VjdGlvbiggJiBfX2ttcF93aW4zMl9zZWN0aW9uICk7CisKKyAgICBudGRsbCA9IE5VTEw7CisgICAgTnRRdWVyeVN5c3RlbUluZm9ybWF0aW9uID0gTlVMTDsKKworI2lmIEtNUF9BUkNIX1g4Nl82NAorICAgIGtlcm5lbDMyID0gTlVMTDsKKyAgICBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JDb3VudCA9IE5VTEw7CisgICAgX19rbXBfR2V0QWN0aXZlUHJvY2Vzc29yR3JvdXBDb3VudCA9IE5VTEw7CisgICAgX19rbXBfR2V0VGhyZWFkR3JvdXBBZmZpbml0eSA9IE5VTEw7CisgICAgX19rbXBfU2V0VGhyZWFkR3JvdXBBZmZpbml0eSA9IE5VTEw7CisjZW5kaWYgLy8gS01QX0FSQ0hfWDg2XzY0CisKKyAgICBfX2ttcF9pbml0X3J1bnRpbWUgPSBGQUxTRTsKK30KKworCit2b2lkCitfX2ttcF90ZXJtaW5hdGVfdGhyZWFkKCBpbnQgZ3RpZCApCit7CisgICAga21wX2luZm9fdCAgKnRoID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworCisgICAgaWYoICF0aCApIHJldHVybjsKKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF90ZXJtaW5hdGVfdGhyZWFkOiBraWxsICglZClcbiIsIGd0aWQgKSApOworCisgICAgaWYgKFRlcm1pbmF0ZVRocmVhZCggdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkLCAoRFdPUkQpIC0xKSA9PSBGQUxTRSkgeworICAgICAgICAvKiBJdCdzIE9LLCB0aGUgdGhyZWFkIG1heSBoYXZlIGV4aXRlZCBhbHJlYWR5ICovCisgICAgfQorICAgIF9fa21wX2ZyZWVfaGFuZGxlKCB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQgKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAorX19rbXBfY2xlYXJfc3lzdGVtX3RpbWUoIHZvaWQgKQoreworICAgIEJPT0wgc3RhdHVzOworICAgIExBUkdFX0lOVEVHRVIgdGltZTsKKyAgICBzdGF0dXMgPSBRdWVyeVBlcmZvcm1hbmNlQ291bnRlciggJiB0aW1lICk7CisgICAgX19rbXBfd2luMzJfdGltZSA9IChrbXBfaW50NjQpIHRpbWUuUXVhZFBhcnQ7Cit9CisKK3ZvaWQKK19fa21wX2luaXRpYWxpemVfc3lzdGVtX3RpY2soIHZvaWQgKQoreworICAgIHsKKyAgQk9PTCBzdGF0dXM7CisgIExBUkdFX0lOVEVHRVIgZnJlcTsKKworICBzdGF0dXMgPSBRdWVyeVBlcmZvcm1hbmNlRnJlcXVlbmN5KCAmIGZyZXEgKTsKKyAgaWYgKCEgc3RhdHVzKSB7CisgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgIEtNUF9NU0coIEZ1bmN0aW9uRXJyb3IsICJRdWVyeVBlcmZvcm1hbmNlRnJlcXVlbmN5KCkiICksCisgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgKTsKKworICB9CisgIGVsc2UgeworICAgICAgX19rbXBfd2luMzJfdGljayA9ICgoZG91YmxlKSAxLjApIC8gKGRvdWJsZSkgZnJlcS5RdWFkUGFydDsKKyAgfQorICAgIH0KK30KKworLyogQ2FsY3VsYXRlIHRoZSBlbGFwc2VkIHdhbGwgY2xvY2sgdGltZSBmb3IgdGhlIHVzZXIgKi8KKwordm9pZAorX19rbXBfZWxhcHNlZCggZG91YmxlICp0ICkKK3sKKyAgICBCT09MIHN0YXR1czsKKyAgICBMQVJHRV9JTlRFR0VSIG5vdzsKKyAgICBzdGF0dXMgPSBRdWVyeVBlcmZvcm1hbmNlQ291bnRlciggJiBub3cgKTsKKyAgICAqdCA9ICgoZG91YmxlKSBub3cuUXVhZFBhcnQpICogX19rbXBfd2luMzJfdGljazsKK30KKworLyogQ2FsY3VsYXRlIHRoZSBlbGFwc2VkIHdhbGwgY2xvY2sgdGljayBmb3IgdGhlIHVzZXIgKi8KKwordm9pZAorX19rbXBfZWxhcHNlZF90aWNrKCBkb3VibGUgKnQgKQoreworICAgICp0ID0gX19rbXBfd2luMzJfdGljazsKK30KKwordm9pZAorX19rbXBfcmVhZF9zeXN0ZW1fdGltZSggZG91YmxlICpkZWx0YSApCit7CisKKyAgICBpZiAoZGVsdGEgIT0gTlVMTCkgeworICAgICAgICBCT09MIHN0YXR1czsKKyAgICAgICAgTEFSR0VfSU5URUdFUiBub3c7CisKKyAgICAgICAgc3RhdHVzID0gUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoICYgbm93ICk7CisKKyAgICAgICAgKmRlbHRhID0gKChkb3VibGUpICgoKGttcF9pbnQ2NCkgbm93LlF1YWRQYXJ0KSAtIF9fa21wX3dpbjMyX3RpbWUpKQorICAgICogX19rbXBfd2luMzJfdGljazsKKyAgICB9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBDaGFuZ2UgdGhyZWFkIHRvIHRoZSBhZmZpbml0eSBtYXNrIHBvaW50ZWQgdG8gYnkgYWZmaW5fbWFzayBhcmd1bWVudAorICogYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIG9sZCB2YWx1ZSBpbiB0aGUgb2xkX21hc2sgYXJndW1lbnQsIGlmIGFyZ3VtZW50CisgKiBpcyBub24tTlVMTC4KKyAqLworCit2b2lkCitfX2ttcF9jaGFuZ2VfdGhyZWFkX2FmZmluaXR5X21hc2soIGludCBndGlkLCBrbXBfYWZmaW5fbWFza190ICpuZXdfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2FmZmluX21hc2tfdCAqb2xkX21hc2sgKQoreworICAgIGttcF9pbmZvX3QgICp0aCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoICpuZXdfbWFzayAhPSAwICk7CisKKyAgICBpZiAoIG9sZF9tYXNrICE9IE5VTEwgKSB7CisgICAgICAgICpvbGRfbWFzayA9IFNldFRocmVhZEFmZmluaXR5TWFzayggdGggLT4gdGgudGhfaW5mby5kcy5kc190aHJlYWQsICpuZXdfbWFzayApOworCisgICAgICAgIGlmICghICpvbGRfbWFzayApIHsKKyAgICAgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRTZXRUaHJlYWRBZmZNYXNrICksCisgICAgICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oIENoYW5nZUFmZk1hc2ssICJLTVBfQUZGSU5JVFkgKEJpbmQpIiwgZ3RpZCwgKm9sZF9tYXNrLCAqbmV3X21hc2sgKTsKKworICAgIC8qIE1ha2Ugc3VyZSBvbGQgdmFsdWUgaXMgY29ycmVjdCBpbiB0aHJlYWQgZGF0YSBzdHJ1Y3R1cmVzICovCisgICAgS01QX0RFQlVHX0FTU0VSVCggb2xkX21hc2sgIT0gTlVMTCAmJiAqb2xkX21hc2sgPT0gKih0aCAtPiB0aC50aF9hZmZpbl9tYXNrICkpOworCisgICAgS01QX0NQVV9DT1BZKHRoIC0+IHRoLnRoX2FmZmluX21hc2ssIG5ld19tYXNrKTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkICogX19zdGRjYWxsCitfX2ttcF9sYXVuY2hfd29ya2VyKCB2b2lkICphcmcgKQoreworICAgIHZvbGF0aWxlIHZvaWQgKnN0YWNrX2RhdGE7CisgICAgdm9pZCAqZXhpdF92YWw7CisgICAgdm9pZCAqcGFkZGluZyA9IDA7CisgICAga21wX2luZm9fdCAqdGhpc190aHIgPSAoa21wX2luZm9fdCAqKSBhcmc7CisgICAgaW50IGd0aWQ7CisKKyAgICBndGlkID0gdGhpc190aHItPnRoLnRoX2luZm8uZHMuZHNfZ3RpZDsKKyAgICBfX2ttcF9ndGlkX3NldF9zcGVjaWZpYyggZ3RpZCApOworI2lmZGVmIEtNUF9UREFUQV9HVElECisgICAgI2Vycm9yICJUaGlzIGRlZmluZSBjYXVzZXMgcHJvYmxlbXMgd2l0aCBMb2FkTGlicmFyeSgpICsgZGVjbHNwZWModGhyZWFkKSAiIFwKKyAgICAgICAgIm9uIFdpbmRvd3MqIE9TLiAgU2VlIENRNTA1NjQsIHRlc3RzIGttcF9sb2FkX2xpYnJhcnkqLmMgYW5kIHRoaXMgTVNETiAiIFwKKyAgICAgICAgInJlZmVyZW5jZTogaHR0cDovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9rYi8xMTg4MTYiCisgICAgLy9fX2ttcF9ndGlkID0gZ3RpZDsKKyNlbmRpZgorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF90aHJlYWRfbmFtZSggZ3RpZCApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIF9fa21wX2FmZmluaXR5X3NldF9pbml0X21hc2soIGd0aWQsIEZBTFNFICk7CisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisgICAgLy8KKyAgICAvLyBTZXQgdGhlIEZQIGNvbnRyb2wgcmVncyB0byBiZSBhIGNvcHkgb2YKKyAgICAvLyB0aGUgcGFyYWxsZWwgaW5pdGlhbGl6YXRpb24gdGhyZWFkJ3MuCisgICAgLy8KKyAgICBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkKCk7CisgICAgX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZCggJl9fa21wX2luaXRfeDg3X2ZwdV9jb250cm9sX3dvcmQgKTsKKyAgICBfX2ttcF9sb2FkX214Y3NyKCAmX19rbXBfaW5pdF9teGNzciApOworI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworICAgIGlmICggX19rbXBfc3Rrb2Zmc2V0ID4gMCAmJiBndGlkID4gMCApIHsKKyAgICAgICAgcGFkZGluZyA9IF9hbGxvY2EoIGd0aWQgKiBfX2ttcF9zdGtvZmZzZXQgKTsKKyAgICB9CisKKyAgICBLTVBfRlNZTkNfUkVMRUFTSU5HKCAmdGhpc190aHIgLT4gdGgudGhfaW5mby5kcy5kc19hbGl2ZSApOworICAgIHRoaXNfdGhyIC0+IHRoLnRoX2luZm8uZHMuZHNfdGhyZWFkX2lkID0gR2V0Q3VycmVudFRocmVhZElkKCk7CisgICAgVENXXzQoIHRoaXNfdGhyIC0+IHRoLnRoX2luZm8uZHMuZHNfYWxpdmUsIFRSVUUgKTsKKworICAgIGlmICggVENSXzQoX19rbXBfZ3RpZF9tb2RlKSA8IDIgKSB7IC8vIGNoZWNrIHN0YWNrIG9ubHkgaWYgaXQgaXMgdXNlZCB0byBnZXQgZ3RpZAorICAgICAgICBUQ1dfUFRSKHRoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrYmFzZSwgJnN0YWNrX2RhdGEpOworICAgICAgICBLTVBfQVNTRVJUKCB0aGlzX3RociAtPiB0aC50aF9pbmZvLmRzLmRzX3N0YWNrZ3JvdyA9PSBGQUxTRSApOworICAgICAgICBfX2ttcF9jaGVja19zdGFja19vdmVybGFwKCB0aGlzX3RociApOworICAgIH0KKyAgICBLTVBfTUIoKTsKKyAgICBleGl0X3ZhbCA9IF9fa21wX2xhdW5jaF90aHJlYWQoIHRoaXNfdGhyICk7CisgICAgS01QX0ZTWU5DX1JFTEVBU0lORyggJnRoaXNfdGhyIC0+IHRoLnRoX2luZm8uZHMuZHNfYWxpdmUgKTsKKyAgICBUQ1dfNCggdGhpc190aHIgLT4gdGgudGhfaW5mby5kcy5kc19hbGl2ZSwgRkFMU0UgKTsKKyAgICBLTVBfTUIoKTsKKyAgICByZXR1cm4gZXhpdF92YWw7Cit9CisKKworLyogVGhlIG1vbml0b3IgdGhyZWFkIGNvbnRyb2xzIGFsbCBvZiB0aGUgdGhyZWFkcyBpbiB0aGUgY29tcGxleCAqLworCit2b2lkICogX19zdGRjYWxsCitfX2ttcF9sYXVuY2hfbW9uaXRvciggdm9pZCAqYXJnICkKK3sKKyAgICBEV09SRCAgICAgICAgd2FpdF9zdGF0dXM7CisgICAga21wX3RocmVhZF90IG1vbml0b3I7CisgICAgaW50ICAgICAgICAgIHN0YXR1czsKKyAgICBpbnQgICAgICAgICAgaW50ZXJ2YWw7CisgICAga21wX2luZm9fdCAqdGhpc190aHIgPSAoa21wX2luZm9fdCAqKSBhcmc7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2luaXRfbW9uaXRvcik7CisgICAgVENXXzQoIF9fa21wX2luaXRfbW9uaXRvciwgMiApOyAgICAvLyBBQzogU2lnbmFsIHRoZSBsaWJyYXJ5IHRoYXQgbW9uaXRvciBoYXMgc3RhcnRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogaGlkZSAiMiIgaW4gZW51bSAobGlrZSB7dHJ1ZSxmYWxzZSxzdGFydGVkfSkKKyAgICB0aGlzX3RociAtPiB0aC50aF9pbmZvLmRzLmRzX3RocmVhZF9pZCA9IEdldEN1cnJlbnRUaHJlYWRJZCgpOworICAgIFRDV180KCB0aGlzX3RociAtPiB0aC50aF9pbmZvLmRzLmRzX2FsaXZlLCBUUlVFICk7CisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfbGF1bmNoX21vbml0b3I6IGxhdW5jaGVkXG4iICkgKTsKKworICAgIG1vbml0b3IgPSBHZXRDdXJyZW50VGhyZWFkKCk7CisKKyAgICAvKiBzZXQgdGhyZWFkIHByaW9yaXR5ICovCisgICAgc3RhdHVzID0gU2V0VGhyZWFkUHJpb3JpdHkoIG1vbml0b3IsIFRIUkVBRF9QUklPUklUWV9ISUdIRVNUICk7CisgICAgaWYgKCEgc3RhdHVzKSB7CisgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgIEtNUF9NU0coIENhbnRTZXRUaHJlYWRQcmlvcml0eSApLAorICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICk7CisgICAgfQorCisgICAgLyogcmVnaXN0ZXIgdXMgYXMgbW9uaXRvciAqLworICAgIF9fa21wX2d0aWRfc2V0X3NwZWNpZmljKCBLTVBfR1RJRF9NT05JVE9SICk7CisjaWZkZWYgS01QX1REQVRBX0dUSUQKKyAgICAjZXJyb3IgIlRoaXMgZGVmaW5lIGNhdXNlcyBwcm9ibGVtcyB3aXRoIExvYWRMaWJyYXJ5KCkgKyBkZWNsc3BlYyh0aHJlYWQpICIgXAorICAgICAgICAib24gV2luZG93cyogT1MuICBTZWUgQ1E1MDU2NCwgdGVzdHMga21wX2xvYWRfbGlicmFyeSouYyBhbmQgdGhpcyBNU0ROICIgXAorICAgICAgICAicmVmZXJlbmNlOiBodHRwOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tL2tiLzExODgxNiIKKyAgICAvL19fa21wX2d0aWQgPSBLTVBfR1RJRF9NT05JVE9SOworI2VuZGlmCisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X3RocmVhZF9pZ25vcmUoKTsgICAgLy8gSW5zdHJ1Y3QgSW50ZWwoUikgVGhyZWFkaW5nIFRvb2xzIHRvIGlnbm9yZSBtb25pdG9yIHRocmVhZC4KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIGludGVydmFsID0gKCAxMDAwIC8gX19rbXBfbW9uaXRvcl93YWtldXBzICk7IC8qIGluIG1pbGxpc2Vjb25kcyAqLworCisgICAgd2hpbGUgKCEgVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSkgeworICAgICAgICAvKiAgVGhpcyB0aHJlYWQgbW9uaXRvcnMgdGhlIHN0YXRlIG9mIHRoZSBzeXN0ZW0gKi8KKworICAgICAgICBLQV9UUkFDRSggMTUsICggIl9fa21wX2xhdW5jaF9tb25pdG9yOiB1cGRhdGVcbiIgKSApOworCisgICAgICAgIHdhaXRfc3RhdHVzID0gV2FpdEZvclNpbmdsZU9iamVjdCggX19rbXBfbW9uaXRvcl9ldiwgaW50ZXJ2YWwgKTsKKworICAgICAgICBpZiAod2FpdF9zdGF0dXMgPT0gV0FJVF9USU1FT1VUKSB7CisgICAgICAgICAgICBUQ1dfNCggX19rbXBfZ2xvYmFsLmcuZ190aW1lLmR0LnRfdmFsdWUsCisgICAgICAgICAgICAgIFRDUl80KCBfX2ttcF9nbG9iYWwuZy5nX3RpbWUuZHQudF92YWx1ZSApICsgMSApOworICAgICAgICB9CisKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisgICAgfQorCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2xhdW5jaF9tb25pdG9yOiBmaW5pc2hlZFxuIiApICk7CisKKyAgICBzdGF0dXMgPSBTZXRUaHJlYWRQcmlvcml0eSggbW9uaXRvciwgVEhSRUFEX1BSSU9SSVRZX05PUk1BTCApOworICAgIGlmICghIHN0YXR1cykgeworICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICBLTVBfTVNHKCBDYW50U2V0VGhyZWFkUHJpb3JpdHkgKSwKKyAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICApOworICAgIH0KKworICAgIGlmIChfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ICE9IDApIHsKKyAgICAgICAgLyogbm93IHdlIG5lZWQgdG8gdGVybWluYXRlIHRoZSB3b3JrZXIgdGhyZWFkcyAgICovCisgICAgICAgIC8qIHRoZSB2YWx1ZSBvZiB0X2Fib3J0IGlzIHRoZSBzaWduYWwgd2UgY2F1Z2h0ICovCisKKyAgICAgICAgaW50IGd0aWQ7CisKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2xhdW5jaF9tb25pdG9yOiB0ZXJtaW5hdGUgc2lnPSVkXG4iLCAoX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCkgKSApOworCisgICAgICAgIC8qIHRlcm1pbmF0ZSB0aGUgT3Blbk1QIHdvcmtlciB0aHJlYWRzICovCisgICAgICAgIC8qIFRPRE8gdGhpcyBpcyBub3QgdmFsaWQgZm9yIHNpYmxpbmcgdGhyZWFkcyEhCisgICAgICAgICAqIHRoZSB1YmVyIG1hc3RlciBtaWdodCBub3QgYmUgMCBhbnltb3JlLi4gKi8KKyAgICAgICAgZm9yIChndGlkID0gMTsgZ3RpZCA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7ICsrZ3RpZCkKKyAgICAgICAgICAgIF9fa21wX3Rlcm1pbmF0ZV90aHJlYWQoIGd0aWQgKTsKKworICAgICAgICBfX2ttcF9jbGVhbnVwKCk7CisKKyAgICAgICAgU2xlZXAoIDAgKTsKKworICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfbGF1bmNoX21vbml0b3I6IHJhaXNlIHNpZz0lZFxuIiwgKF9fa21wX2dsb2JhbC5nLmdfYWJvcnQpICkgKTsKKworICAgICAgICBpZiAoX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCA+IDApIHsKKyAgICAgICAgICAgIHJhaXNlKCBfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBUQ1dfNCggdGhpc190aHIgLT4gdGgudGhfaW5mby5kcy5kc19hbGl2ZSwgRkFMU0UgKTsKKworICAgIEtNUF9NQigpOworICAgIHJldHVybiBhcmc7Cit9CisKK3ZvaWQKK19fa21wX2NyZWF0ZV93b3JrZXIoIGludCBndGlkLCBrbXBfaW5mb190ICp0aCwgc2l6ZV90IHN0YWNrX3NpemUgKQoreworICAgIGttcF90aHJlYWRfdCAgIGhhbmRsZTsKKyAgICBEV09SRCAgICAgICAgICBpZFRocmVhZDsKKyAgICAKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfY3JlYXRlX3dvcmtlcjogdHJ5IHRvIGNyZWF0ZSB0aHJlYWQgKCVkKVxuIiwgZ3RpZCApICk7CisgICAgCisgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCA9IGd0aWQ7CisgICAgCisgICAgaWYgKCBLTVBfVUJFUl9HVElEKGd0aWQpICkgeworICAgICAgICBpbnQgICAgIHN0YWNrX2RhdGE7CisKKyAgICAgICAgLyogVE9ETzogR2V0Q3VycmVudFRocmVhZCgpIHJldHVybnMgYSBwc2V1ZG8taGFuZGxlIHRoYXQgaXMgdW5zdWl0YWJsZSBmb3Igb3RoZXIgdGhyZWFkcyB0byB1c2UuCisgICAgICAgICAgIElzIGl0IGFwcHJvcHJpYXRlIHRvIGp1c3QgdXNlIEdldEN1cnJlbnRUaHJlYWQ/ICBXaGVuIHNob3VsZCB3ZSBjbG9zZSB0aGlzIGhhbmRsZT8gIFdoZW4KKyAgICAgICAgICAgdW5yZWdpc3RlcmluZyB0aGUgcm9vdD8KKyAgICAgICAgKi8KKyAgICAgICAgeworICAgICAgICAgICAgQk9PTCByYzsKKyAgICAgICAgICAgIHJjID0gRHVwbGljYXRlSGFuZGxlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Q3VycmVudFByb2Nlc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEN1cnJlbnRUaHJlYWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEN1cnJlbnRQcm9jZXNzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFVQTElDQVRFX1NBTUVfQUNDRVNTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgS01QX0FTU0VSVCggcmMgKTsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCIgX19rbXBfY3JlYXRlX3dvcmtlcjogUk9PVCBIYW5kbGUgZHVwbGljYXRlZCwgdGggPSAlcCwgaGFuZGxlID0gJSIgS01QX1VJTlRQVFJfU1BFQyAiXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQVk9JRCl0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCApICk7CisgICAgICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWRfaWQgPSBHZXRDdXJyZW50VGhyZWFkSWQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIFRDUl80KF9fa21wX2d0aWRfbW9kZSkgPCAyICkgeyAvLyBjaGVjayBzdGFjayBvbmx5IGlmIGl0IGlzIHVzZWQgdG8gZ2V0IGd0aWQKKyAgICAgICAgICAgIC8qIHdlIHdpbGwgZHluYW1pY2FsbHkgdXBkYXRlIHRoZSBzdGFjayByYW5nZSBpZiBndGlkX21vZGUgPT0gMSAqLworICAgICAgICAgICAgVENXX1BUUih0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja2Jhc2UsICZzdGFja19kYXRhKTsKKyAgICAgICAgICAgIFRDV19QVFIodGgtPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tzaXplLCAwKTsKKyAgICAgICAgICAgIFRDV180KHRoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrZ3JvdywgVFJVRSk7CisgICAgICAgICAgICBfX2ttcF9jaGVja19zdGFja19vdmVybGFwKCB0aCApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgICAgICAvKiBTZXQgc3RhY2sgc2l6ZSBmb3IgdGhpcyB0aHJlYWQgbm93LiAqLworICAgICAgICBLQV9UUkFDRSggMTAsICggIl9fa21wX2NyZWF0ZV93b3JrZXI6IHN0YWNrX3NpemUgPSAlIiBLTVBfU0laRV9UX1NQRUMKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXNcbiIsIHN0YWNrX3NpemUgKSApOworICAgICAgICAKKyAgICAgICAgc3RhY2tfc2l6ZSArPSBndGlkICogX19rbXBfc3Rrb2Zmc2V0OworICAgICAgICAKKyAgICAgICAgVENXX1BUUih0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja3NpemUsIHN0YWNrX3NpemUpOworICAgICAgICBUQ1dfNCh0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja2dyb3csIEZBTFNFKTsKKyAgICAgICAgCisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBfY3JlYXRlX3dvcmtlcjogKGJlZm9yZSkgc3RhY2tfc2l6ZSA9ICUiCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfU0laRV9UX1NQRUMKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMsICZfX2ttcF9sYXVuY2hfd29ya2VyID0gJXAsIHRoID0gJXAsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICImaWRUaHJlYWQgPSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChTSVpFX1QpIHN0YWNrX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAoTFBUSFJFQURfU1RBUlRfUk9VVElORSkgJiBfX2ttcF9sYXVuY2hfd29ya2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgKExQVk9JRCkgdGgsICZpZFRocmVhZCApICk7CisgICAgICAgIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhhbmRsZSA9IENyZWF0ZVRocmVhZCggTlVMTCwgKFNJWkVfVCkgc3RhY2tfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUFRIUkVBRF9TVEFSVF9ST1VUSU5FKSBfX2ttcF9sYXVuY2hfd29ya2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQVk9JRCkgdGgsIFNUQUNLX1NJWkVfUEFSQU1fSVNfQV9SRVNFUlZBVElPTiwgJmlkVGhyZWFkICk7CisgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICBLQV9UUkFDRSggMTAsICggIl9fa21wX2NyZWF0ZV93b3JrZXI6IChhZnRlcikgc3RhY2tfc2l6ZSA9ICUiCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfU0laRV9UX1NQRUMKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMsICZfX2ttcF9sYXVuY2hfd29ya2VyID0gJXAsIHRoID0gJXAsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJpZFRocmVhZCA9ICV1LCBoYW5kbGUgPSAlIiBLTVBfVUlOVFBUUl9TUEVDICJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAoU0laRV9UKSBzdGFja19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgKExQVEhSRUFEX1NUQVJUX1JPVVRJTkUpICYgX19rbXBfbGF1bmNoX3dvcmtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIChMUFZPSUQpIHRoLCBpZFRocmVhZCwgaGFuZGxlICkgKTsKKyAgICAgICAgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCBoYW5kbGUgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudENyZWF0ZVRocmVhZCApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCA9IGhhbmRsZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworICAgIH0KKyAgICAKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfY3JlYXRlX3dvcmtlcjogZG9uZSBjcmVhdGluZyB0aHJlYWQgKCVkKVxuIiwgZ3RpZCApICk7Cit9CisKK2ludAorX19rbXBfc3RpbGxfcnVubmluZyhrbXBfaW5mb190ICp0aCkgeworICAgIHJldHVybiAoV0FJVF9USU1FT1VUID09IFdhaXRGb3JTaW5nbGVPYmplY3QoIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCwgMCkpOworfQorCit2b2lkCitfX2ttcF9jcmVhdGVfbW9uaXRvcigga21wX2luZm9fdCAqdGggKQoreworICAgIGttcF90aHJlYWRfdCAgICAgICAgaGFuZGxlOworICAgIERXT1JEICAgICAgICAgICAgICAgaWRUaHJlYWQ7CisgICAgaW50ICAgICAgICAgICAgICAgICBpZGVhbCwgbmV3X2lkZWFsOworICAgIGludCAgICAgY2FsbGVyX2d0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2NyZWF0ZV9tb25pdG9yOiB0cnkgdG8gY3JlYXRlIG1vbml0b3JcbiIgKSApOworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBfX2ttcF9tb25pdG9yX2V2ID0gQ3JlYXRlRXZlbnQoIE5VTEwsIFRSVUUsIEZBTFNFLCBOVUxMICk7CisgICAgaWYgKCBfX2ttcF9tb25pdG9yX2V2ID09IE5VTEwgKSB7CisgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgIEtNUF9NU0coIENhbnRDcmVhdGVFdmVudCApLAorICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICk7CisgICAgfTsgLy8gaWYKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X3N5c3RlbV9vYmplY3RfY3JlYXRlZCggX19rbXBfbW9uaXRvcl9ldiwgIkV2ZW50IiApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX3RpZCAgPSBLTVBfR1RJRF9NT05JVE9SOworICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgPSBLTVBfR1RJRF9NT05JVE9SOworCisgICAgLy8gRklYTUUgLSBvbiBXaW5kb3dzKiBPUywgaWYgX19rbXBfbW9uaXRvcl9zdGtzaXplID0gMCwgZmlndXJlIG91dCBob3cKKyAgICAvLyB0byBhdXRvbWF0aWNhbGx5IGV4cGFuZCBzdGFja3NpemUgYmFzZWQgb24gQ3JlYXRlVGhyZWFkIGVycm9yIGNvZGUuCisgICAgaWYgKCBfX2ttcF9tb25pdG9yX3N0a3NpemUgPT0gMCApIHsKKyAgICAgICAgX19rbXBfbW9uaXRvcl9zdGtzaXplID0gS01QX0RFRkFVTFRfTU9OSVRPUl9TVEtTSVpFOworICAgIH0KKyAgICBpZiAoIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSA8IF9fa21wX3N5c19taW5fc3Rrc2l6ZSApIHsKKyAgICAgICAgX19rbXBfbW9uaXRvcl9zdGtzaXplID0gX19rbXBfc3lzX21pbl9zdGtzaXplOworICAgIH0KKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9jcmVhdGVfbW9uaXRvcjogcmVxdWVzdGVkIHN0YWNrc2l6ZSA9ICVkIGJ5dGVzXG4iLAorICAgICAgICAgICAgICAgICAgIChpbnQpIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSApICk7CisKKyAgICBUQ1dfNCggX19rbXBfZ2xvYmFsLmcuZ190aW1lLmR0LnRfdmFsdWUsIDAgKTsKKworICAgIGhhbmRsZSA9IENyZWF0ZVRocmVhZCggTlVMTCwgKFNJWkVfVCkgX19rbXBfbW9uaXRvcl9zdGtzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQVEhSRUFEX1NUQVJUX1JPVVRJTkUpIF9fa21wX2xhdW5jaF9tb25pdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQVk9JRCkgdGgsIFNUQUNLX1NJWkVfUEFSQU1fSVNfQV9SRVNFUlZBVElPTiwgJmlkVGhyZWFkICk7CisgICAgaWYgKGhhbmRsZSA9PSAwKSB7CisgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgIEtNUF9NU0coIENhbnRDcmVhdGVUaHJlYWQgKSwKKyAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICApOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCA9IGhhbmRsZTsKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2NyZWF0ZV9tb25pdG9yOiBtb25pdG9yIGNyZWF0ZWQgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkICkgKTsKK30KKworLyoKKyAgQ2hlY2sgdG8gc2VlIGlmIHRocmVhZCBpcyBzdGlsbCBhbGl2ZS4KKworICBOT1RFOiAgVGhlIEV4aXRQcm9jZXNzKGNvZGUpIHN5c3RlbSBjYWxsIGNhdXNlcyBhbGwgdGhyZWFkcyB0byBUZXJtaW5hdGUKKyAgICAgICAgIHdpdGggYSBleGl0X3ZhbCA9IGNvZGUuICBCZWNhdXNlIG9mIHRoaXMgd2UgY2FuIG5vdCByZWx5IG9uCisgICAgICAgICBleGl0X3ZhbCBoYXZpbmcgYW55IHBhcnRpY3VsYXIgdmFsdWUuICBTbyB0aGlzIHJvdXRpbmUgbWF5CisgICAgICAgICByZXR1cm4gU1RJTExfQUxJVkUgaW4gZXhpdF92YWwgZXZlbiBhZnRlciB0aGUgdGhyZWFkIGlzIGRlYWQuCisqLworCitpbnQKK19fa21wX2lzX3RocmVhZF9hbGl2ZSgga21wX2luZm9fdCAqIHRoLCBEV09SRCAqZXhpdF92YWwgKQoreworICAgIERXT1JEIHJjOworICAgIHJjID0gR2V0RXhpdENvZGVUaHJlYWQoIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCwgZXhpdF92YWwgKTsKKyAgICBpZiAoIHJjID09IDAgKSB7CisgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgIEtNUF9NU0coIEZ1bmN0aW9uRXJyb3IsICJHZXRFeGl0Q29kZVRocmVhZCgpIiApLAorICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICk7CisgICAgfTsgLy8gaWYKKyAgICByZXR1cm4gKCAqZXhpdF92YWwgPT0gU1RJTExfQUNUSVZFICk7Cit9CisKKwordm9pZAorX19rbXBfZXhpdF90aHJlYWQoCisgICAgaW50IGV4aXRfc3RhdHVzCispIHsKKyAgICBFeGl0VGhyZWFkKCBleGl0X3N0YXR1cyApOworfSAvLyBfX2ttcF9leGl0X3RocmVhZAorCisvKgorICAgIFRoaXMgaXMgYSBjb21tb24gcGFydCBmb3IgYm90aCBfX2ttcF9yZWFwX3dvcmtlcigpIGFuZCBfX2ttcF9yZWFwX21vbml0b3IoKS4KKyovCitzdGF0aWMgdm9pZAorX19rbXBfcmVhcF9jb21tb24oIGttcF9pbmZvX3QgKiB0aCApCit7CisgICAgRFdPUkQgZXhpdF92YWw7CisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVhcF9jb21tb246IHRyeSB0byByZWFwICglZClcbiIsIHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgKSApOworCisgICAgLyoKKyAgICAgICAgMjAwNi0xMC0xOToKKworICAgICAgICBUaGVyZSBhcmUgdHdvIG9wcG9zaXRlIHNpdHVhdGlvbnM6CisKKyAgICAgICAgICAgIDEuIFdpbmRvd3MqIE9TIGtlZXAgdGhyZWFkIGFsaXZlIGFmdGVyIGl0IHJlc2V0cyBkc19hbGl2ZSBmbGFnIGFuZCBleGl0cyBmcm9tIHRocmVhZAorICAgICAgICAgICAgICAgZnVuY3Rpb24uIChGb3IgZXhhbXBsZSwgc2VlIEM3MDc3MC9RMzk0MjgxICJ1bmxvYWRpbmcgb2YgZGxsIGJhc2VkIG9uIE9NUCBpcyB2ZXJ5CisgICAgICAgICAgICAgICBzbG93Ii4pCisgICAgICAgICAgICAyLiBXaW5kb3dzKiBPUyBtYXkga2lsbCB0aHJlYWQgYmVmb3JlIGl0IHJlc2V0cyBkc19hbGl2ZSBmbGFnLgorCisgICAgICAgIFJpZ2h0IHNvbHV0aW9uIHNlZW1zIHRvIGJlIHdhaXRpbmcgZm9yICplaXRoZXIqIHRocmVhZCB0ZXJtaW5hdGlvbiAqb3IqIGRzX2FsaXZlIHJlc2V0dGluZy4KKworICAgICovCisKKyAgICB7CisgICAgICAgIC8vIFRPRE86IFRoaXMgY29kZSBpcyB2ZXJ5IHNpbWlsYXIgdG8gS01QX1dBSVRfWUlFTEQuIE5lZWQgdG8gZ2VuZXJhbGl6ZSBLTVBfV0FJVF9ZSUVMRCB0bworICAgICAgICAvLyBjb3ZlciB0aGlzIHVzYWdlIGFsc28uCisgICAgICAgIHZvaWQgKiBvYmogPSBOVUxMOworICAgICAgICByZWdpc3RlciBrbXBfdWludDMyIHNwaW5zOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgS01QX0ZTWU5DX1NQSU5fSU5JVCggb2JqLCAodm9pZCopICYgdGgtPnRoLnRoX2luZm8uZHMuZHNfYWxpdmUgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgICAgIEtNUF9JTklUX1lJRUxEKCBzcGlucyApOworICAgICAgICBkbyB7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAgICAgS01QX0ZTWU5DX1NQSU5fUFJFUEFSRSggb2JqICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgICAgICAgICAgX19rbXBfaXNfdGhyZWFkX2FsaXZlKCB0aCwgJmV4aXRfdmFsICk7CisgICAgICAgICAgICBfX2ttcF9zdGF0aWNfZGVsYXkoIFRSVUUgKTsKKyAgICAgICAgICAgIEtNUF9ZSUVMRCggVENSXzQoX19rbXBfbnRoKSA+IF9fa21wX2F2YWlsX3Byb2MgKTsKKyAgICAgICAgICAgIEtNUF9ZSUVMRF9TUElOKCBzcGlucyApOworICAgICAgICB9IHdoaWxlICggZXhpdF92YWwgPT0gU1RJTExfQUNUSVZFICYmIFRDUl80KCB0aC0+dGgudGhfaW5mby5kcy5kc19hbGl2ZSApICk7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICBpZiAoIGV4aXRfdmFsID09IFNUSUxMX0FDVElWRSApIHsKKyAgICAgICAgICAgIEtNUF9GU1lOQ19DQU5DRUwoIG9iaiApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgS01QX0ZTWU5DX1NQSU5fQUNRVUlSRUQoIG9iaiApOworICAgICAgICB9OyAvLyBpZgorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICB9CisKKyAgICBfX2ttcF9mcmVlX2hhbmRsZSggdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkICk7CisKKyAgICAvKgorICAgICAqIE5PVEU6ICBUaGUgRXhpdFByb2Nlc3MoY29kZSkgc3lzdGVtIGNhbGwgY2F1c2VzIGFsbCB0aHJlYWRzIHRvIFRlcm1pbmF0ZQorICAgICAqICAgICAgICB3aXRoIGEgZXhpdF92YWwgPSBjb2RlLiAgQmVjYXVzZSBvZiB0aGlzIHdlIGNhbiBub3QgcmVseSBvbgorICAgICAqICAgICAgICBleGl0X3ZhbCBoYXZpbmcgYW55IHBhcnRpY3VsYXIgdmFsdWUuCisgICAgICovCisgICAgaWYgKCBleGl0X3ZhbCA9PSBTVElMTF9BQ1RJVkUgKSB7CisgICAgICAgIEtBX1RSQUNFKCAxLCAoICJfX2ttcF9yZWFwX2NvbW1vbjogdGhyZWFkIHN0aWxsIGFjdGl2ZS5cbiIgKSApOworICAgIH0gZWxzZSBpZiAoICh2b2lkICopIGV4aXRfdmFsICE9ICh2b2lkICopIHRoKSB7CisgICAgICAgIEtBX1RSQUNFKCAxLCAoICJfX2ttcF9yZWFwX2NvbW1vbjogRXhpdFByb2Nlc3MgLyBUZXJtaW5hdGVUaHJlYWQgdXNlZD9cbiIgKSApOworICAgIH07IC8vIGlmCisKKyAgICBLQV9UUkFDRSggMTAsCisgICAgICAgICgKKyAgICAgICAgICAgICJfX2ttcF9yZWFwX2NvbW1vbjogZG9uZSByZWFwaW5nICglZCksIGhhbmRsZSA9ICUiIEtNUF9VSU5UUFRSX1NQRUMgIlxuIiwKKyAgICAgICAgICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQsCisgICAgICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQKKyAgICAgICAgKQorICAgICk7CisKKyAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQgICAgPSAwOworICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX3RpZCAgICAgICA9IEtNUF9HVElEX0RORTsKKyAgICB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkICAgICAgPSBLTVBfR1RJRF9ETkU7CisgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkX2lkID0gMDsKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworfQorCit2b2lkCitfX2ttcF9yZWFwX21vbml0b3IoIGttcF9pbmZvX3QgKnRoICkKK3sKKyAgICBpbnQgc3RhdHVzOworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3JlYXBfbW9uaXRvcjogdHJ5IHRvIHJlYXAgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkICkgKTsKKworICAgIC8vIElmIG1vbml0b3IgaGFzIGJlZW4gY3JlYXRlZCwgaXRzIHRpZCBhbmQgZ3RpZCBzaG91bGQgYmUgS01QX0dUSURfTU9OSVRPUi4KKyAgICAvLyBJZiBib3RoIHRpZCBhbmQgZ3RpZCBhcmUgMCwgaXQgbWVhbnMgdGhlIG1vbml0b3IgZGlkIG5vdCBldmVyIHN0YXJ0LgorICAgIC8vIElmIGJvdGggdGlkIGFuZCBndGlkIGFyZSBLTVBfR1RJRF9ETkUsIHRoZSBtb25pdG9yIGhhcyBiZWVuIHNodXQgZG93bi4KKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aC0+dGgudGhfaW5mby5kcy5kc190aWQgPT0gdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCApOworICAgIGlmICggdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCAhPSBLTVBfR1RJRF9NT05JVE9SICkgeworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgc3RhdHVzID0gU2V0RXZlbnQoIF9fa21wX21vbml0b3JfZXYgKTsKKyAgICBpZiAoIHN0YXR1cyA9PSBGQUxTRSApIHsKKyAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgS01QX01TRyggQ2FudFNldEV2ZW50ICksCisgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgKTsKKyAgICB9CisgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcF9yZWFwX21vbml0b3I6IHJlYXBpbmcgdGhyZWFkICglZClcbiIsIHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgKSApOworICAgIF9fa21wX3JlYXBfY29tbW9uKCB0aCApOworCisgICAgX19rbXBfZnJlZV9oYW5kbGUoIF9fa21wX21vbml0b3JfZXYgKTsKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworfQorCit2b2lkCitfX2ttcF9yZWFwX3dvcmtlcigga21wX2luZm9fdCAqIHRoICkKK3sKKyAgICBLQV9UUkFDRSggMTAsICggIl9fa21wX3JlYXBfd29ya2VyOiByZWFwaW5nIHRocmVhZCAoJWQpXG4iLCB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkICkgKTsKKyAgICBfX2ttcF9yZWFwX2NvbW1vbiggdGggKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIEtNUF9IQU5ETEVfU0lHTkFMUworCisKK3N0YXRpYyB2b2lkCitfX2ttcF90ZWFtX2hhbmRsZXIoIGludCBzaWdubyApCit7CisgICAgaWYgKCBfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ID09IDAgKSB7CisgICAgICAgIC8vIFN0YWdlIDEgc2lnbmFsIGhhbmRsZXIsIGxldCdzIHNodXQgZG93biBhbGwgb2YgdGhlIHRocmVhZHMuCisgICAgICAgIGlmICggX19rbXBfZGVidWdfYnVmICkgeworICAgICAgICAgICAgX19rbXBfZHVtcF9kZWJ1Z19idWZmZXIoKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8vIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4KKyAgICAgICAgVENXXzQoIF9fa21wX2dsb2JhbC5nLmdfYWJvcnQsIHNpZ25vICk7CisgICAgICAgIEtNUF9NQigpOyAgICAgICAvLyBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuCisgICAgICAgIFRDV180KCBfX2ttcF9nbG9iYWwuZy5nX2RvbmUsIFRSVUUgKTsKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8vIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4KKyAgICB9Cit9IC8vIF9fa21wX3RlYW1faGFuZGxlcgorCisKKworc3RhdGljCitzaWdfZnVuY190IF9fa21wX3NpZ25hbCggaW50IHNpZ251bSwgc2lnX2Z1bmNfdCBoYW5kbGVyICkgeworICAgIHNpZ19mdW5jX3Qgb2xkID0gc2lnbmFsKCBzaWdudW0sIGhhbmRsZXIgKTsKKyAgICBpZiAoIG9sZCA9PSBTSUdfRVJSICkgeworICAgICAgICBpbnQgZXJyb3IgPSBlcnJubzsKKyAgICAgICAgX19rbXBfbXNnKCBrbXBfbXNfZmF0YWwsIEtNUF9NU0coIEZ1bmN0aW9uRXJyb3IsICJzaWduYWwiICksIEtNUF9FUlIoIGVycm9yICksIF9fa21wX21zZ19udWxsICk7CisgICAgfTsgLy8gaWYKKyAgICByZXR1cm4gb2xkOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlcigKKyAgICBpbnQgICAgICAgICAgIHNpZywKKyAgICBzaWdfZnVuY190ICAgIGhhbmRsZXIsCisgICAgaW50ICAgICAgICAgICBwYXJhbGxlbF9pbml0CispIHsKKyAgICBzaWdfZnVuY190IG9sZDsKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKyAgICBLQl9UUkFDRSggNjAsICgiX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlcjogY2FsbGVkOiBzaWc9JWRcbiIsIHNpZyApICk7CisgICAgaWYgKCBwYXJhbGxlbF9pbml0ICkgeworICAgICAgICBvbGQgPSBfX2ttcF9zaWduYWwoIHNpZywgaGFuZGxlciApOworICAgICAgICAvLyBTSUdfREZMIG9uIFdpbmRvd3MqIE9TIGluIE5VTEwgb3IgMC4KKyAgICAgICAgaWYgKCBvbGQgPT0gX19rbXBfc2lnaGxkcnNbIHNpZyBdICkgeworICAgICAgICAgICAgX19rbXBfc2lnaW5zdGFsbGVkWyBzaWcgXSA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBSZXN0b3JlL2tlZXAgdXNlcidzIGhhbmRsZXIgaWYgb25lIHByZXZpb3VzbHkgaW5zdGFsbGVkLgorICAgICAgICAgICAgb2xkID0gX19rbXBfc2lnbmFsKCBzaWcsIG9sZCApOworICAgICAgICB9OyAvLyBpZgorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFNhdmUgaW5pdGlhbC9zeXN0ZW0gc2lnbmFsIGhhbmRsZXJzIHRvIHNlZSBpZiB1c2VyIGhhbmRsZXJzIGluc3RhbGxlZC4KKyAgICAgICAgLy8gMjAwOS0wOS0yMzogSXQgaXMgYSBkZWFkIGNvZGUuIE9uIFdpbmRvd3MqIE9TIF9fa21wX2luc3RhbGxfc2lnbmFscyBjYWxsZWQgb25jZSB3aXRoCisgICAgICAgIC8vIHBhcmFsbGVsX2luaXQgPT0gVFJVRS4KKyAgICAgICAgb2xkID0gX19rbXBfc2lnbmFsKCBzaWcsIFNJR19ERkwgKTsKKyAgICAgICAgX19rbXBfc2lnaGxkcnNbIHNpZyBdID0gb2xkOworICAgICAgICBfX2ttcF9zaWduYWwoIHNpZywgb2xkICk7CisgICAgfTsgLy8gaWYKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KK30gLy8gX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlcgorCitzdGF0aWMgdm9pZAorX19rbXBfcmVtb3ZlX29uZV9oYW5kbGVyKCBpbnQgc2lnICkgeworICAgIGlmICggX19rbXBfc2lnaW5zdGFsbGVkWyBzaWcgXSApIHsKKyAgICAgICAgc2lnX2Z1bmNfdCBvbGQ7CisgICAgICAgIEtNUF9NQigpOyAgICAgICAvLyBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuCisgICAgICAgIEtCX1RSQUNFKCA2MCwgKCAiX19rbXBfcmVtb3ZlX29uZV9oYW5kbGVyOiBjYWxsZWQ6IHNpZz0lZFxuIiwgc2lnICkgKTsKKyAgICAgICAgb2xkID0gX19rbXBfc2lnbmFsKCBzaWcsIF9fa21wX3NpZ2hsZHJzWyBzaWcgXSApOworICAgICAgICBpZiAoIG9sZCAhPSBfX2ttcF90ZWFtX2hhbmRsZXIgKSB7CisgICAgICAgICAgICBLQl9UUkFDRSggMTAsICggIl9fa21wX3JlbW92ZV9vbmVfaGFuZGxlcjogb29wcywgbm90IG91ciBoYW5kbGVyLCByZXN0b3Jpbmc6IHNpZz0lZFxuIiwgc2lnICkgKTsKKyAgICAgICAgICAgIG9sZCA9IF9fa21wX3NpZ25hbCggc2lnLCBvbGQgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgX19rbXBfc2lnaGxkcnNbIHNpZyBdID0gTlVMTDsKKyAgICAgICAgX19rbXBfc2lnaW5zdGFsbGVkWyBzaWcgXSA9IDA7CisgICAgICAgIEtNUF9NQigpOyAgICAgICAvLyBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuCisgICAgfTsgLy8gaWYKK30gLy8gX19rbXBfcmVtb3ZlX29uZV9oYW5kbGVyCisKKwordm9pZAorX19rbXBfaW5zdGFsbF9zaWduYWxzKCBpbnQgcGFyYWxsZWxfaW5pdCApCit7CisgICAgS0JfVFJBQ0UoIDEwLCAoICJfX2ttcF9pbnN0YWxsX3NpZ25hbHM6IGNhbGxlZFxuIiApICk7CisgICAgaWYgKCAhIF9fa21wX2hhbmRsZV9zaWduYWxzICkgeworICAgICAgICBLQl9UUkFDRSggMTAsICggIl9fa21wX2luc3RhbGxfc2lnbmFsczogS01QX0hBTkRMRV9TSUdOQUxTIGlzIGZhbHNlIC0gaGFuZGxlcnMgbm90IGluc3RhbGxlZFxuIiApICk7CisgICAgICAgIHJldHVybjsKKyAgICB9OyAvLyBpZgorICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIFNJR0lOVCwgIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCApOworICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIFNJR0lMTCwgIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCApOworICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIFNJR0FCUlQsIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCApOworICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIFNJR0ZQRSwgIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCApOworICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIFNJR1NFR1YsIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCApOworICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIFNJR1RFUk0sIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCApOworfSAvLyBfX2ttcF9pbnN0YWxsX3NpZ25hbHMKKworCit2b2lkCitfX2ttcF9yZW1vdmVfc2lnbmFscyggdm9pZCApCit7CisgICAgaW50IHNpZzsKKyAgICBLQl9UUkFDRSggMTAsICgiX19rbXBfcmVtb3ZlX3NpZ25hbHM6IGNhbGxlZFxuIiApICk7CisgICAgZm9yICggc2lnID0gMTsgc2lnIDwgTlNJRzsgKysgc2lnICkgeworICAgICAgICBfX2ttcF9yZW1vdmVfb25lX2hhbmRsZXIoIHNpZyApOworICAgIH07IC8vIGZvciBzaWcKK30gLy8gX19rbXBfcmVtb3ZlX3NpZ25hbHMKKworCisjZW5kaWYgLy8gS01QX0hBTkRMRV9TSUdOQUxTCisKKy8qIFB1dCB0aGUgdGhyZWFkIHRvIHNsZWVwIGZvciBhIHRpbWUgcGVyaW9kICovCit2b2lkCitfX2ttcF90aHJlYWRfc2xlZXAoIGludCBtaWxsaXMgKQoreworICAgIERXT1JEIHN0YXR1czsKKworICAgIHN0YXR1cyA9IFNsZWVwRXgoIChEV09SRCkgbWlsbGlzLCBGQUxTRSApOworICAgIGlmICggc3RhdHVzICkgeworICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICBLTVBfTVNHKCBGdW5jdGlvbkVycm9yLCAiU2xlZXBFeCgpIiApLAorICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICk7CisgICAgfQorfQorCisvKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgZ2l2ZW4gYWRkcmVzcyBpcyBtYXBwZWQgaW50byB0aGUgY3VycmVudCBhZGRyZXNzIHNwYWNlLiAqLworaW50CitfX2ttcF9pc19hZGRyZXNzX21hcHBlZCggdm9pZCAqIGFkZHIgKQoreworICAgIERXT1JEIHN0YXR1czsKKyAgICBNRU1PUllfQkFTSUNfSU5GT1JNQVRJT04gbHBCdWZmZXI7CisgICAgU0laRV9UIGR3TGVuZ3RoOworCisgICAgZHdMZW5ndGggPSBzaXplb2YoTUVNT1JZX0JBU0lDX0lORk9STUFUSU9OKTsKKworICAgIHN0YXR1cyA9IFZpcnR1YWxRdWVyeSggYWRkciwgJmxwQnVmZmVyLCBkd0xlbmd0aCApOworCisgICAgcmV0dXJuICEoKCggbHBCdWZmZXIuU3RhdGUgPT0gTUVNX1JFU0VSVkUpIHx8ICggbHBCdWZmZXIuU3RhdGUgPT0gTUVNX0ZSRUUgKSkgfHwKKyAgICAgICAoKCBscEJ1ZmZlci5Qcm90ZWN0ID09IFBBR0VfTk9BQ0NFU1MgKSB8fCAoIGxwQnVmZmVyLlByb3RlY3QgPT0gUEFHRV9FWEVDVVRFICkpKTsKK30KKwora21wX3VpbnQ2NAorX19rbXBfaGFyZHdhcmVfdGltZXN0YW1wKHZvaWQpCit7CisgICAga21wX3VpbnQ2NCByID0gMDsKKworICAgIFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKChMQVJHRV9JTlRFR0VSKikgJnIpOworICAgIHJldHVybiByOworfQorCisvKiBGcmVlIGhhbmRsZSBhbmQgY2hlY2sgdGhlIGVycm9yIGNvZGUgKi8KK3ZvaWQKK19fa21wX2ZyZWVfaGFuZGxlKCBrbXBfdGhyZWFkX3QgdEhhbmRsZSApCit7CisvKiBjYWxsZWQgd2l0aCBwYXJhbWV0ZXIgdHlwZSBIQU5ETEUgYWxzbywgdGh1cyBzdXBwb3NlIGttcF90aHJlYWRfdCBkZWZpbmVkIGFzIEhBTkRMRSAqLworICAgIEJPT0wgcmM7CisgICAgcmMgPSBDbG9zZUhhbmRsZSggdEhhbmRsZSApOworICAgIGlmICggIXJjICkgeworICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICBLTVBfTVNHKCBDYW50Q2xvc2VIYW5kbGUgKSwKKyAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICApOworICAgIH0KK30KKworaW50CitfX2ttcF9nZXRfbG9hZF9iYWxhbmNlKCBpbnQgbWF4ICkgeworCisgICAgc3RhdGljIFVMT05HIGdsYl9idWZmX3NpemUgPSAxMDAgKiAxMDI0OworCisgICAgc3RhdGljIGludCAgICAgZ2xiX3J1bm5pbmdfdGhyZWFkcyAgPSAwOyAgLyogU2F2ZWQgY291bnQgb2YgdGhlIHJ1bm5pbmcgdGhyZWFkcyBmb3IgdGhlIHRocmVhZCBiYWxhbmNlIGFsZ29ydGlobSAqLworICAgIHN0YXRpYyBkb3VibGUgIGdsYl9jYWxsX3RpbWUgICAgICAgID0gMDsgIC8qIFRocmVhZCBiYWxhbmNlIGFsZ29yaXRobSBjYWxsIHRpbWUgKi8KKworICAgIGludCBydW5uaW5nX3RocmVhZHMgPSAwOyAgICAgICAgICAgICAgLy8gTnVtYmVyIG9mIHJ1bm5pbmcgdGhyZWFkcyBpbiB0aGUgc3lzdGVtLgorICAgIE5UU1RBVFVTICBzdGF0dXMgICAgICAgID0gMDsKKyAgICBVTE9ORyAgICAgYnVmZl9zaXplICAgICA9IDA7CisgICAgVUxPTkcgICAgIGluZm9fc2l6ZSAgICAgPSAwOworICAgIHZvaWQgKiAgICBidWZmZXIgICAgICAgID0gTlVMTDsKKyAgICBQU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04gc3BpID0gTlVMTDsKKyAgICBpbnQgZmlyc3RfdGltZSAgICAgICAgICA9IDE7CisKKyAgICBkb3VibGUgY2FsbF90aW1lID0gMC4wOyAvL3N0YXJ0LCBmaW5pc2g7CisKKyAgICBfX2ttcF9lbGFwc2VkKCAmIGNhbGxfdGltZSApOworCisgICAgaWYgKCBnbGJfY2FsbF90aW1lICYmCisgICAgICAgICAgICAoIGNhbGxfdGltZSAtIGdsYl9jYWxsX3RpbWUgPCBfX2ttcF9sb2FkX2JhbGFuY2VfaW50ZXJ2YWwgKSApIHsKKyAgICAgICAgcnVubmluZ190aHJlYWRzID0gZ2xiX3J1bm5pbmdfdGhyZWFkczsKKyAgICAgICAgZ290byBmaW5pc2g7CisgICAgfQorICAgIGdsYl9jYWxsX3RpbWUgPSBjYWxsX3RpbWU7CisKKyAgICAvLyBEbyBub3Qgc3BlbmQgdGltZSBvbiBydW5uaW5nIGFsZ29yaXRobSBpZiB3ZSBoYXZlIGEgcGVybWFuZW50IGVycm9yLgorICAgIGlmICggTnRRdWVyeVN5c3RlbUluZm9ybWF0aW9uID09IE5VTEwgKSB7CisgICAgICAgIHJ1bm5pbmdfdGhyZWFkcyA9IC0xOworICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICB9OyAvLyBpZgorCisgICAgaWYgKCBtYXggPD0gMCApIHsKKyAgICAgICAgbWF4ID0gSU5UX01BWDsKKyAgICB9OyAvLyBpZgorCisgICAgZG8geworCisgICAgICAgIGlmICggZmlyc3RfdGltZSApIHsKKyAgICAgICAgICAgIGJ1ZmZfc2l6ZSA9IGdsYl9idWZmX3NpemU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBidWZmX3NpemUgPSAyICogYnVmZl9zaXplOworICAgICAgICB9CisKKyAgICAgICAgYnVmZmVyID0gS01QX0lOVEVSTkFMX1JFQUxMT0MoIGJ1ZmZlciwgYnVmZl9zaXplICk7CisgICAgICAgIGlmICggYnVmZmVyID09IE5VTEwgKSB7CisgICAgICAgICAgICBydW5uaW5nX3RocmVhZHMgPSAtMTsKKyAgICAgICAgICAgIGdvdG8gZmluaXNoOworICAgICAgICB9OyAvLyBpZgorICAgICAgICBzdGF0dXMgPSBOdFF1ZXJ5U3lzdGVtSW5mb3JtYXRpb24oIFN5c3RlbVByb2Nlc3NJbmZvcm1hdGlvbiwgYnVmZmVyLCBidWZmX3NpemUsICYgaW5mb19zaXplICk7CisgICAgICAgIGZpcnN0X3RpbWUgPSAwOworCisgICAgfSB3aGlsZSAoIHN0YXR1cyA9PSBTVEFUVVNfSU5GT19MRU5HVEhfTUlTTUFUQ0ggKTsKKyAgICBnbGJfYnVmZl9zaXplID0gYnVmZl9zaXplOworCisgICAgI2RlZmluZSBDSEVDSyggY29uZCApICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBjb25kICk7ICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoICEgKCBjb25kICkgKSB7ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgcnVubmluZ190aHJlYWRzID0gLTE7ICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZ290byBmaW5pc2g7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0KKworICAgIENIRUNLKCBidWZmX3NpemUgPj0gaW5mb19zaXplICk7CisgICAgc3BpID0gUFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OKCBidWZmZXIgKTsKKyAgICBmb3IgKCA7IDsgKSB7CisgICAgICAgIHB0cmRpZmZfdCBvZmZzZXQgPSB1aW50cHRyX3QoIHNwaSApIC0gdWludHB0cl90KCBidWZmZXIgKTsKKyAgICAgICAgQ0hFQ0soIDAgPD0gb2Zmc2V0ICYmIG9mZnNldCArIHNpemVvZiggU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04gKSA8IGluZm9fc2l6ZSApOworICAgICAgICBIQU5ETEUgcGlkID0gc3BpLT5Qcm9jZXNzSWQ7CisgICAgICAgIFVMT05HIG51bSA9IHNwaS0+TnVtYmVyT2ZUaHJlYWRzOworICAgICAgICBDSEVDSyggbnVtID49IDEgKTsKKyAgICAgICAgc2l6ZV90IHNwaV9zaXplID0gc2l6ZW9mKCBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiApICsgc2l6ZW9mKCBTWVNURU1fVEhSRUFEICkgKiAoIG51bSAtIDEgKTsKKyAgICAgICAgQ0hFQ0soIG9mZnNldCArIHNwaV9zaXplIDwgaW5mb19zaXplICk7ICAgICAgICAgIC8vIE1ha2Ugc3VyZSBwcm9jZXNzIGluZm8gcmVjb3JkIGZpdHMgdGhlIGJ1ZmZlci4KKyAgICAgICAgaWYgKCBzcGktPk5leHRFbnRyeU9mZnNldCAhPSAwICkgeworICAgICAgICAgICAgQ0hFQ0soIHNwaV9zaXplIDw9IHNwaS0+TmV4dEVudHJ5T2Zmc2V0ICk7ICAgLy8gQW5kIGRvIG5vdCBvdmVybGFwIHdpdGggdGhlIG5leHQgcmVjb3JkLgorICAgICAgICB9OyAvLyBpZgorICAgICAgICAvLyBwaWQgPT0gMCBjb3JyZXNwb25kcyB0byB0aGUgU3lzdGVtIElkbGUgUHJvY2Vzcy4gSXQgYWx3YXlzIGhhcyBydW5uaW5nIHRocmVhZHMKKyAgICAgICAgLy8gb24gYWxsIGNvcmVzLiBTbywgd2UgZG9uJ3QgY29uc2lkZXIgdGhlIHJ1bm5pbmcgdGhyZWFkcyBvZiB0aGlzIHByb2Nlc3MuCisgICAgICAgIGlmICggcGlkICE9IDAgKSB7CisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBudW07ICsrIGkgKSB7CisgICAgICAgICAgICAgICAgVEhSRUFEX1NUQVRFIHN0YXRlID0gc3BpLT5UaHJlYWRzWyBpIF0uU3RhdGU7CisgICAgICAgICAgICAgICAgLy8gQ291bnQgdGhyZWFkcyB0aGF0IGhhdmUgUmVhZHkgb3IgUnVubmluZyBzdGF0ZS4KKyAgICAgICAgICAgICAgICAvLyAhISEgVE9ETzogV2h5IGNvbW1lbnQgZG9lcyBub3QgbWF0Y2ggdGhlIGNvZGU/Pz8KKyAgICAgICAgICAgICAgICBpZiAoIHN0YXRlID09IFN0YXRlUnVubmluZyApIHsKKyAgICAgICAgICAgICAgICAgICAgKysgcnVubmluZ190aHJlYWRzOworICAgICAgICAgICAgICAgICAgICAvLyBTdG9wIGNvdW50aW5nIHJ1bm5pbmcgdGhyZWFkcyBpZiB0aGUgbnVtYmVyIGlzIGFscmVhZHkgZ3JlYXRlciB0aGFuCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGNvcmVzCisgICAgICAgICAgICAgICAgICAgIGlmICggcnVubmluZ190aHJlYWRzID49IG1heCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgfTsgLy8gZm9yIGkKKyAgICAgICAgfSAvLyBpZgorICAgICAgICBpZiAoIHNwaS0+TmV4dEVudHJ5T2Zmc2V0ID09IDAgKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgc3BpID0gUFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OKCB1aW50cHRyX3QoIHNwaSApICsgc3BpLT5OZXh0RW50cnlPZmZzZXQgKTsKKyAgICB9OyAvLyBmb3JldmVyCisKKyAgICAjdW5kZWYgQ0hFQ0sKKworICAgIGZpbmlzaDogLy8gQ2xlYW4gdXAgYW5kIGV4aXQuCisKKyAgICAgICAgaWYgKCBidWZmZXIgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKCBidWZmZXIgKTsKKyAgICAgICAgfTsgLy8gaWYKKworICAgICAgICBnbGJfcnVubmluZ190aHJlYWRzID0gcnVubmluZ190aHJlYWRzOworCisgICAgICAgIHJldHVybiBydW5uaW5nX3RocmVhZHM7CisKK30gLy9fX2ttcF9nZXRfbG9hZF9iYWxhbmNlKCkKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90b29scy9idWlsZC5wbCBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvYnVpbGQucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDA1NjQ5OAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvYnVpbGQucGwKQEAgLTAsMCArMSw3NzAgQEAKKyMhL3Vzci9iaW4vcGVybAorCisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgUHJhZ21hcy4KK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKKyMgU3RhbmRhcmQgbW9kdWxlcy4KK3VzZSBEYXRhOjpEdW1wZXI7ICAgICMgTm90IGFjdHVhbGx5IHVzZWQsIGJ1dCB1c2VmdWwgZm9yIGRlYnVnZ2luZyBkdW1wcy4KKworIyBFbmFibGUgYGxpYm9tcC90b29scy9saWIvJyBtb2R1bGUgZGlyZWN0b3J5LgordXNlIEZpbmRCaW47Cit1c2UgbGliICIkRmluZEJpbjo6QmluL2xpYiI7CisKKyMgTElCT01QIG1vZHVsZXMuCit1c2UgQnVpbGQ7Cit1c2UgTGliT01QOwordXNlIFBsYXRmb3JtICI6dmFycyI7Cit1c2UgVW5hbWU7Cit1c2UgdG9vbHM7CisKK291ciAkVkVSU0lPTiA9ICIwLjAxNyI7CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgSW1wb3J0YW50IHZhcmlhYmxlcy4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworbXkgJHJvb3RfZGlyICA9ICRFTlZ7IExJQk9NUF9XT1JLIH07CisKK215ICVtYWtlZmlsZXMgPSAoCisgICAgcnRsICAgICAgID0+IGNhdF9maWxlKCAkcm9vdF9kaXIsICJzcmMiLCAgICAgICAgICAgICAgICAgICAgICAgIm1ha2VmaWxlLm1rIiApLAorICAgIHRpbWVsaW1pdCA9PiBjYXRfZmlsZSggJHJvb3RfZGlyLCAidG9vbHMiLCAic3JjIiwgInRpbWVsaW1pdCIsICJtYWtlZmlsZS5tayIgKSwKKyk7CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUGFyc2UgY29tbWFuZCBsaW5lLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFBvc3NpYmxlIG9wdGlvbnMuCisjICAgICAqIHRhcmdldHM6IGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHRhcmdldHMgdGhlIG9wdGlvbiBoYXMgbWVhbmluZyBmb3IuIEZvciBleGFtcGxlLAorIyAgICAgICAgICJ2ZXJzaW9uIiBvcHRpb24gKDQgb3IgNSkgaGFzIGEgbWVhbmluZyBvbmx5IGZvciAicnRsIiB0YXJnZXQsIHdoaWxlICJtb2RlIiBvcHRpb24gaGFzCisjICAgICAgICAgbWVhbmluZyBmb3IgYWxsIHRhcmdldHMuCisjICAgICAqIGJhc2U6IElmIGJhc2UgaXMgdHJ1ZSB0aGlzIGlzIGEgYmFzZSBvcHRpb24uIEFsbCB0aGUgcG9zc2libGUgdmFsdWVzIG9mIGJhc2Ugb3B0aW9ucyBhcmUKKyMgICAgICAgICBpdGVyYXRlZCBpZiAiLS1hbGwiIG9wdGlvbiBpcyBzcGVjaWZpZWQuIElmIGJhc2UgaXMgMCwgdGhpcyBpcyBhbiBleHRyYSBvcHRpb24uCisjICAgICAqIHBhcmFtczogQSBoYXNoIG9mIHBvc3NpYmxlIG9wdGlvbiB2YWx1ZXMuICIqIiBkZW5vdGVzIGRlZmF1bHQgb3B0aW9uIHZhbHVlLiBGb3IgZXhhbXBsZSwKKyMgICAgICAgICBpZiAidmVyc2lvIiBvcHRpb24gaXMgbm90IHNwZWNpZmllZCwgIi0tdmVyc2lvbj01IiB3aWxsIGJlIHVzZWQgaW1wbGljaXRseS4KKyMgICAgICogc3VmZnV4OiBPbmx5IGZvciBleHRyYSBvcHRpb25zLiBTdWJyb3V0aW5lIHJldHVybmluZyBzdWZmaXggZm9yIGJ1aWxkIGFuZCBvdXRwdXQKKyMgICAgICAgICBkaXJlY3Rvcmllcy4KK215ICRvcHRzID0geworICAgICJ0YXJnZXQiICAgICAgICAgID0+IHsgdGFyZ2V0cyA9PiAiIiwgICAgICAgICAgICAgICAgICBiYXNlID0+IDEsIHBhcm1zID0+IHsgbWFwKCAoICRfID0+ICIiICksIGtleXMoICVtYWtlZmlsZXMgKSApLCBydGwgPT4gIioiIH0sIH0sCisgICAgInZlcnNpb24iICAgICAgICAgPT4geyB0YXJnZXRzID0+ICJydGwiLCAgICAgICAgICAgICAgIGJhc2UgPT4gMSwgcGFybXMgPT4geyA1ICAgICAgID0+ICIqIiwgNCAgICAgICAgID0+ICIiICAgICAgICAgICAgICB9LCB9LAorICAgICJsaWItdHlwZSIgICAgICAgID0+IHsgdGFyZ2V0cyA9PiAicnRsIiwgICAgICAgICAgICAgICBiYXNlID0+IDEsIHBhcm1zID0+IHsgbm9ybWFsICA9PiAiKiIsIHN0dWJzID0+ICIiICAgICAgICAgICAgICAgICAgfSwgfSwKKyAgICAibGluay10eXBlIiAgICAgICA9PiB7IHRhcmdldHMgPT4gInJ0bCIsICAgICAgICAgICAgICAgYmFzZSA9PiAxLCBwYXJtcyA9PiB7IGR5bmFtaWMgPT4gIioiLCBzdGF0aWMgICAgPT4gIiIgICAgICAgICAgICAgIH0sIH0sCisgICAgInRhcmdldC1jb21waWxlciIgPT4geyB0YXJnZXRzID0+ICJydGwsZHNsIiwgICAgICAgICAgIGJhc2UgPT4gMCwgcGFybXMgPT4geyAxMiAgICAgID0+ICIqIiwgMTEgICAgICAgID0+ICIiICAgICAgICAgICAgICB9LCBzdWZmaXggPT4gc3ViIHsgJF9bIDAgXTsgICAgICAgICAgICAgICAgICAgICAgIH0gfSwKKyAgICAibW9kZSIgICAgICAgICAgICA9PiB7IHRhcmdldHMgPT4gInJ0bCxkc2wsdGltZWxpbWl0IiwgYmFzZSA9PiAwLCBwYXJtcyA9PiB7IHJlbGVhc2UgPT4gIioiLCBkaWFnICAgICAgPT4gIiIsIGRlYnVnID0+ICIiIH0sIHN1ZmZpeCA9PiBzdWIgeyBzdWJzdHIoICRfWyAwIF0sIDAsIDMgKTsgICAgICAgfSB9LAorICAgICJvbXAtdmVyc2lvbiIgICAgID0+IHsgdGFyZ2V0cyA9PiAicnRsIiwgICAgICAgICAgICAgICBiYXNlID0+IDAsIHBhcm1zID0+IHsgNDAgPT4gIioiLCAzMCA9PiAiIiwgMjUgPT4gIiIgfSwgc3VmZml4ID0+IHN1YiB7ICRfWyAwIF07IH0gfSwKKyAgICAiY292ZXJhZ2UiICAgICAgICA9PiB7IHRhcmdldHMgPT4gInJ0bCIsICAgICAgICAgICAgICAgYmFzZSA9PiAwLCBwYXJtcyA9PiB7IG9mZiAgICAgPT4gIioiLCBvbiAgICAgICAgPT4gIiIgICAgICAgICAgICAgIH0sIHN1ZmZpeCA9PiBzdWIgeyAkX1sgMCBdIGVxICJvbiIgPyAiYzEiIDogImMwIjsgfSB9LAorICAgICJ0Y2hlY2siICAgICAgICAgID0+IHsgdGFyZ2V0cyA9PiAicnRsIiwgICAgICAgICAgICAgICBiYXNlID0+IDAsIHBhcm1zID0+IHsgMCAgICAgICA9PiAiKiIsIDEgICAgICAgICA9PiAiIiwgMiA9PiAiIiAgICAgfSwgc3VmZml4ID0+IHN1YiB7ICJ0IiAuICRfWyAwIF07ICAgICAgICAgICAgICAgICB9IH0sCisgICAgIm1pYy1hcmNoIiAgICAgICAgPT4geyB0YXJnZXRzID0+ICJydGwiLCAgICAgICAgICAgICAgIGJhc2UgPT4gMCwgcGFybXMgPT4geyBrbmYgICAgID0+ICIqIiwga25jICAgICAgID0+ICIiLCBrbmwgPT4gIiIgICB9LCBzdWZmaXggPT4gc3ViIHsgJF9bIDAgXTsgICAgICAgICAgICAgICAgICAgICAgIH0gfSwKKyAgICAibWljLW9zIiAgICAgICAgICA9PiB7IHRhcmdldHMgPT4gInJ0bCIsICAgICAgICAgICAgICAgYmFzZSA9PiAwLCBwYXJtcyA9PiB7IGJzZCAgICAgPT4gIioiLCBsaW4gICAgICAgPT4gIiIgICAgICAgICAgICAgIH0sIHN1ZmZpeCA9PiBzdWIgeyAkX1sgMCBdOyAgICAgICAgICAgICAgICAgICAgICAgfSB9LAorICAgICJtaWMtY29tcCIgICAgICAgID0+IHsgdGFyZ2V0cyA9PiAicnRsIiwgICAgICAgICAgICAgICBiYXNlID0+IDAsIHBhcm1zID0+IHsgbmF0aXZlICA9PiAiKiIsIG9mZmxvYWQgICA9PiAiIiAgICAgICAgICAgICAgfSwgc3VmZml4ID0+IHN1YiB7IHN1YnN0ciggJF9bIDAgXSwgMCwgMyApOyAgICAgICB9IH0sCit9OworbXkgJHN5bm9ueW1zID0geworICAgICJkZWJ1ZyIgPT4gWyBxd3sgZGJnIGRlYmcgfSBdLAorfTsKKyMgVGhpcyBhcnJheSBzcGVjaWZpZXMgb3JkZXIgb2Ygb3B0aW9ucyB0byBwcm9jZXNzLCBzbyBpdCBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQgd2l0aCBrZXlzKCAlJG9wdHMgKS4KK215IEBhbGxfb3B0cyAgID0gcXd7IHRhcmdldCB2ZXJzaW9uIGxpYi10eXBlIGxpbmstdHlwZSB0YXJnZXQtY29tcGlsZXIgbW9kZSBvbXAtdmVyc2lvbiBjb3ZlcmFnZSB0Y2hlY2sgbWljLWFyY2ggbWljLW9zIG1pYy1jb21wIH07CisjIFRoaXMgaXMgdGhlIGxpc3Qgb2YgYmFzZSBvcHRpb25zLgorbXkgQGJhc2Vfb3B0cyAgPSBncmVwKCAkb3B0cy0+eyAkXyB9LT57IGJhc2UgfSA9PSAxLCBAYWxsX29wdHMgKTsKKyMgVGhpcyBpcyB0aGUgbGlzdCBvZiBleHRyYSBvcHRpb25zLgorbXkgQGV4dHJhX29wdHMgPSBncmVwKCAkb3B0cy0+eyAkXyB9LT57IGJhc2UgfSA9PSAwLCBAYWxsX29wdHMgKTsKKworc3ViIHN1ZmZpeCgkJCQpIHsKKyAgICBteSAoICRvcHQsICR2YWx1ZSwgJHNraXBfaWZfZGVmYXVsdCApID0gQF87CisgICAgbXkgJHN1ZmZpeCA9ICIiOworICAgIGlmICggbm90ICRza2lwX2lmX2RlZmF1bHQgb3IgJHZhbHVlIG5lICRvcHRzLT57ICRvcHQgfS0+eyBkZmx0IH0gKSB7CisgICAgICAgICRzdWZmaXggPSAkb3B0cy0+eyAkb3B0IH0tPnsgc3VmZml4IH0tPiggJHZhbHVlICk7CisgICAgfTsgIyBpZgorICAgIHJldHVybiAkc3VmZml4OworfTsgIyBzdWIgc3VmZml4CisKK215ICRzY3V0cyA9IHt9OyAgICAgIyBTaG9ydGN1dHMuIFdpbGwgaGVscCB0byBsb2NhdGUgcHJvcGVyIGl0ZW0gaW4gJG9wdHMuCitmb3JlYWNoIG15ICRvcHQgKCBrZXlzKCAlJG9wdHMgKSApIHsKKyAgICBmb3JlYWNoIG15ICRwYXJtICgga2V5cyggJXsgJG9wdHMtPnsgJG9wdCB9LT57IHBhcm1zIH0gfSApICkgeworICAgICAgICBpZiAoICRwYXJtICF+IG17XEEoPzpbMDEyXXxvbnxvZmYpXHp9ICkgeworICAgICAgICAgICAgJHNjdXRzLT57ICRwYXJtIH0gPSAkb3B0cy0+eyAkb3B0IH07CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgaWYgKCAkb3B0cy0+eyAkb3B0IH0tPnsgcGFybXMgfS0+eyAkcGFybSB9IGVxICIqIiApIHsKKyAgICAgICAgICAgICRvcHRzLT57ICRvcHQgfS0+eyBkZmx0IH0gPSAkcGFybTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgZm9yZWFjaCAkcGFybQorfTsgIyBmb3JlYWNoICRvcHQKKworc3ViIHBhcnNlX29wdGlvbihAKSB7CisgICAgIyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm9jZXNzIGV2ZXJ5IG9wdGlvbi4gJG5hbWUgaXMgb3B0aW9uIG5hbWUsICR2YWx1ZSBpcyBvcHRpb24gdmFsdWUuCisgICAgIyBGb3IgYm9vbGVhbiBvcHRpb25zICR2YWx1ZSBpcyBlaXRoZXIgMSBvciAwLAorICAgIG15ICggJG5hbWUsICR2YWx1ZSApID0gQF87CisgICAgaWYgKCAkbmFtZSBlcSAiYWxsIiBvciAkbmFtZSBlcSAiQUxMIiApIHsKKyAgICAgICAgZm9yZWFjaCBteSAkb3B0ICgga2V5cyggJSRvcHRzICkgKSB7CisgICAgICAgICAgICBpZiAoICRvcHRzLT57ICRvcHQgfS0+eyBiYXNlIH0gb3IgJG5hbWUgZXEgIkFMTCIgKSB7CisgICAgICAgICAgICAgICAgZm9yZWFjaCBteSAkcGFybSAoIGtleXMoICV7ICRvcHRzLT57ICRvcHQgfS0+eyBwYXJtcyB9IH0gKSApIHsKKyAgICAgICAgICAgICAgICAgICAgJG9wdHMtPnsgJG9wdCB9LT57IHBhcm1zIH0tPnsgJHBhcm0gfSA9IDE7CisgICAgICAgICAgICAgICAgfTsgIyBmb3JlYWNoICRwYXJtCisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH07ICMgZm9yZWFjaCAkb3B0CisgICAgICAgIHJldHVybjsKKyAgICB9OyAjIGlmCisgICAgaWYgKCBleGlzdHMoICRvcHRzLT57ICRuYW1lIH0gKSApIHsKKyAgICAgICAgIyBTdXBwb3NlIGl0IGlzIG9wdGlvbiB3aXRoIGV4cGxpY2l0IHZhbHVlLCBsaWtlICJ0YXJnZXQ9bm9ybWFsIi4KKyAgICAgICAgaWYgKCAkdmFsdWUgZXEgImFsbCIgKSB7CisgICAgICAgICAgICBmb3JlYWNoIG15ICRwYXJtICgga2V5cyggJXsgJG9wdHMtPnsgJG5hbWUgfS0+eyBwYXJtcyB9IH0gKSApIHsKKyAgICAgICAgICAgICAgICAkb3B0cy0+eyAkbmFtZSB9LT57IHBhcm1zIH0tPnsgJHBhcm0gfSA9IDE7CisgICAgICAgICAgICB9OyAjIGZvcmVhY2gKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNpZiAoIGV4aXN0cyggJG9wdHMtPnsgJG5hbWUgfS0+eyBwYXJtcyB9LT57ICR2YWx1ZSB9ICkgKSB7CisgICAgICAgICAgICAkb3B0cy0+eyAkbmFtZSB9LT57IHBhcm1zIH0tPnsgJHZhbHVlIH0gPSAxOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2lmICggJHZhbHVlIGVxICIiIGFuZCBleGlzdHMoICRvcHRzLT57ICRuYW1lIH0tPnsgcGFybXMgfS0+eyBvbiB9ICkgKSB7CisgICAgICAgICAgICAkb3B0cy0+eyAkbmFtZSB9LT57IHBhcm1zIH0tPnsgb24gfSA9IDE7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjbWRsaW5lX2Vycm9yKCAiSWxsZWdhbCB2YWx1ZSBvZiBcIiRuYW1lXCIgb3B0aW9uOiBcIiR2YWx1ZVwiIiApOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorICAgICMgT2ssIGl0IGlzIG5vdCBhbiBvcHRpb24gd2l0aCBleHBsaWNpdCB2YWx1ZS4gVHJ5IHRvIHRyZWF0IGlzIGFzIGEgYm9vbGVhbiBvcHRpb24uCisgICAgaWYgKCBleGlzdHMoICRzY3V0cy0+eyAkbmFtZSB9ICkgKSB7CisgICAgICAgICggJHZhbHVlIGVxICIxIiBvciAkdmFsdWUgZXEgIjAiICkgb3IgZGllICJJbnRlcm5hbCBlcnJvcjsgc3RvcHBlZCI7CisgICAgICAgICRzY3V0cy0+eyAkbmFtZSB9LT57IHBhcm1zIH0tPnsgJG5hbWUgfSA9ICR2YWx1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH07ICMgaWYKKyAgICAjIE5vLCBpdCBpcyBub3QgYSB2YWxpZCBvcHRpb24gYXQgYWxsLgorICAgIGNtZGxpbmVfZXJyb3IoICJJbGxlZ2FsIG9wdGlvbjogXCIkbmFtZVwiIiApOworfTsgIyBzdWIgcGFyc2Vfb3B0aW9uCisKK215ICRjbGVhbiAgICAgICAgPSAwOworbXkgJGNsZWFuX2NvbW1vbiA9IDA7CitteSAkY2xvYmJlciAgICAgID0gMDsKK215ICR0ZXN0X2RlcHMgICAgPSAxOworbXkgJHRlc3RfdG91Y2ggICA9IDE7CitteSBAZ29hbHM7CisKK3N1YiBzeW5vbnltcygkKSB7CisgICAgbXkgKCAkb3B0ICkgPSBAXzsKKyAgICByZXR1cm4gZXhpc3RzKCAkc3lub255bXMtPnsgJG9wdCB9ICkgPyAifCIgLiBqb2luKCAifCIsIEB7ICRzeW5vbnltcy0+eyAkb3B0IH0gfSApIDogIiI7Cit9OyAjIHN1YiBzeW5vbnltcworCitteSBAc3BlY3MgPSAoCisgICAgbWFwKCAoICIkXyIgLiBzeW5vbnltcyggJF8gKSAuICI9cyIgPT4gXCZwYXJzZV9vcHRpb24gKSwga2V5cyggJSRvcHRzICApICksCisgICAgbWFwKCAoICIkXyIgLiBzeW5vbnltcyggJF8gKSAuICIhIiAgPT4gXCZwYXJzZV9vcHRpb24gKSwga2V5cyggJSRzY3V0cyApICksCispOworbXkgJGFuc3dlcjsKK2dldF9vcHRpb25zKAorICAgIEBzcGVjcywKKyAgICBQbGF0Zm9ybTo6dGFyZ2V0X29wdGlvbnMoKSwKKyAgICAiYWxsIiAgICAgICAgICAgPT4gXCZwYXJzZV9vcHRpb24sCisgICAgIkFMTCIgICAgICAgICAgID0+IFwmcGFyc2Vfb3B0aW9uLAorICAgICJhbnN3ZXI9cyIgICAgICA9PiBcJGFuc3dlciwKKyAgICAidGVzdC1kZXBzISIgICAgPT4gXCR0ZXN0X2RlcHMsCisgICAgInRlc3QtdG91Y2ghIiAgID0+IFwkdGVzdF90b3VjaCwKKyAgICAidmVyc2lvbnx2ZXI6cyIgPT4KKyAgICAgICAgc3ViIHsKKyAgICAgICAgICAgICMgSXQgaXMgYSB0cmlja3kgb3B0aW9uLiBJdCBzcGVjaWZpZXMgbGlicmFyeSB2ZXJzaW9uIHRvIGJ1aWxkIGFuZCBpdCBpcyBhbHNvIGEgc3RhbmRhcmQKKyAgICAgICAgICAgICMgb3B0aW9uIHRvIHJlcXVlc3QgdG9vbCB2ZXJzaW9uLgorICAgICAgICAgICAgaWYgKCAkX1sgMSBdIGVxICIiICkgeworICAgICAgICAgICAgICAgICMgTm8gYXJndW1lbnRzID0+IHZlcnNpb24gcmVxdWVzdC4KKyAgICAgICAgICAgICAgICBwcmludCggIiR0b29sIHZlcnNpb24gJFZFUlNJT05cbiIgKTsKKyAgICAgICAgICAgICAgICBleGl0KCAwICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICMgQXJndW1lbnRzID0+IHZlcnNpb24gdG8gYnVpbGQuCisgICAgICAgICAgICAgICAgcGFyc2Vfb3B0aW9uKCBAXyApCisgICAgICAgICAgICB9OworICAgICAgICB9LAorKTsKK0Bnb2FscyA9IEBBUkdWOworaWYgKCBncmVwKCAkXyBlcSAiY2xvYmJlciIsIEBnb2FscyApICkgeworICAgICRjbG9iYmVyID0gMTsKK307ICMgaWYKK2lmICggZ3JlcCggJF8gZXEgImNsZWFuIiwgQGdvYWxzICkgKSB7CisgICAgJGNsZWFuID0gMTsKK307ICMgaWYKKworIyBPaywgbm93ICRvcHRzIGlzIGZ1bGZpbGxlZCB3aXRoIDAsIDEgKGV4cGxpY2l0bHkgc2V0IGJ5IHRoZSB1c2VyKSBhbmQgIiIgYW5kICIqIiAob3JpZ2luYWwKKyMgdmFsdWVzKS4gSW4gZWFjaCBvcHRpb24gYXQgbGVhc3Qgb25lIDEgc2hvdWxkIGJlIHByZXNlbnQgKG90aGVyd2lzZSB0aGVyZSBpcyBub3RoaW5nIHRvIGJ1aWxkKS4KK2ZvcmVhY2ggbXkgJG9wdCAoIGtleXMoICUkb3B0cyApICkgeworICAgIGlmICggbm90IGdyZXAoICRfIGVxICIxIiwgdmFsdWVzKCAleyAkb3B0cy0+eyAkb3B0IH0tPnsgcGFybXMgfSB9ICkgKSApIHsKKyAgICAgICAgIyBObyBleHBsaWNpdCAiMSIgZm91bmQuIEVuYWJsZSBkZWZhdWx0IGNob2ljZSBieSByZXBsYWNpbmcgIioiIHdpdGggIjEiLgorICAgICAgICBmb3JlYWNoIG15ICRwYXJtICgga2V5cyggJXsgJG9wdHMtPnsgJG9wdCB9LT57IHBhcm1zIH0gfSApICkgeworICAgICAgICAgICAgaWYgKCAkb3B0cy0+eyAkb3B0IH0tPnsgcGFybXMgfS0+eyAkcGFybSB9IGVxICIqIiApIHsKKyAgICAgICAgICAgICAgICAkb3B0cy0+eyAkb3B0IH0tPnsgcGFybXMgfS0+eyAkcGFybSB9ID0gMTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfTsgIyBmb3JlYWNoICRwYXJtCisgICAgfTsgIyBpZgorfTsgIyBmb3JlYWNoICRvcHQKKworIyBDbGVhciAkb3B0cy4gTGVhdmUgb25seSAiMSIuCitmb3JlYWNoIG15ICRvcHQgKCBrZXlzKCAlJG9wdHMgKSApIHsKKyAgICBmb3JlYWNoIG15ICRwYXJtICgga2V5cyggJXsgJG9wdHMtPnsgJG9wdCB9LT57IHBhcm1zIH0gfSApICkgeworICAgICAgICBpZiAoICRvcHRzLT57ICRvcHQgfS0+eyBwYXJtcyB9LT57ICRwYXJtIH0gbmUgIjEiICkgeworICAgICAgICAgICAgZGVsZXRlKCAkb3B0cy0+eyAkb3B0IH0tPnsgcGFybXMgfS0+eyAkcGFybSB9ICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGZvcmVhY2ggJHBhcm0KK307ICMgZm9yZWFjaCAkb3B0CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRmlsbCBqb2IgcXVldWUuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N1YiBlbnF1ZXVlX2pvYnMoJCRAKTsKK3N1YiBlbnF1ZXVlX2pvYnMoJCRAKSB7CisgICAgbXkgKCAkam9icywgJHNldCwgQHJlc3QgKSA9IEBfOworICAgIGlmICggQHJlc3QgKSB7CisgICAgICAgIG15ICRvcHQgPSBzaGlmdCggQHJlc3QgKTsKKyAgICAgICAgaWYgKAorICAgICAgICAgICAgZXhpc3RzKCAkc2V0LT57IHRhcmdldCB9ICkKKyAgICAgICAgICAgIGFuZAorICAgICAgICAgICAgJG9wdHMtPnsgJG9wdCB9LT57IHRhcmdldHMgfSAhfiBteyg/OlxBfCwpJHNldC0+eyB0YXJnZXQgfSg/Oix8XHopfQorICAgICAgICApIHsKKyAgICAgICAgICAgICMgVGhpcyBvcHRpb24gZG9lcyBub3QgaGF2ZSBtZWFuYW5pbmcgZm9yIHRoZSB0YXJnZXQsCisgICAgICAgICAgICAjIGRvIG5vdCBpdGVyYXRlLCBqdXN0IHVzZSBkZWZhdWx0IHZhbHVlLgorICAgICAgICAgICAgZW5xdWV1ZV9qb2JzKCAkam9icywgeyAkb3B0ID0+ICRvcHRzLT57ICRvcHQgfS0+eyBkZmx0IH0sICUkc2V0IH0sIEByZXN0ICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3JlYWNoIG15ICRwYXJtICggc29ydCgga2V5cyggJXsgJG9wdHMtPnsgJG9wdCB9LT57IHBhcm1zIH0gfSApICkgKSB7CisgICAgICAgICAgICAgICAgZW5xdWV1ZV9qb2JzKCAkam9icywgeyAkb3B0ID0+ICRwYXJtLCAlJHNldCB9LCBAcmVzdCApOworICAgICAgICAgICAgfTsgIyBmb3JlYWNoICRwYXJtCisgICAgICAgIH07ICMgaWYKKyAgICB9IGVsc2UgeworICAgICAgICBteSAkbWFrZWZpbGUgID0gJG1ha2VmaWxlc3sgJHNldC0+eyB0YXJnZXQgfSB9OworICAgICAgICBteSBAYmFzZSAgICAgID0gbWFwKCBzdWJzdHIoICRzZXQtPnsgJF8gfSwgMCwgMyApLCBAYmFzZV9vcHRzICk7CisgICAgICAgIG15IEBleHRyYSAgICAgPSBtYXAoIHN1ZmZpeCggJF8sICRzZXQtPnsgJF8gfSwgMCApLCBAZXh0cmFfb3B0cyApOworICAgICAgICBteSBAZXggICAgICAgID0gZ3JlcCggJF8gbmUgIiIsIG1hcCggc3VmZml4KCAkXywgJHNldC0+eyAkXyB9LCAxICksIEBleHRyYV9vcHRzICkgKTsKKyAgICAgICAgICAgICMgU2hvcnRlbmVkIHZlcnNpb24gb2YgQGV4dHJhIC0tIG9ubHkgbm9uLWRlZmF1bHQgdmFsdWVzLgorICAgICAgICBteSAkc3VmZml4ICAgID0gKCBAZXh0cmEgPyAiLiIgLiBqb2luKCAiLiIsIEBleHRyYSApIDogIiIgKTsKKyAgICAgICAgbXkgJGtuaWdodHMgICA9IGluZGV4KCAkc3VmZml4LCAia24iICkgLSAxOworICAgICAgICBpZiAoICR0YXJnZXRfcGxhdGZvcm0gIX4gImxyYiIgYW5kICRrbmlnaHRzID4gMCApIHsKKyAgICAgICAgICAgICRzdWZmaXggPSBzdWJzdHIoICRzdWZmaXgsIDAsICRrbmlnaHRzICk7CisgICAgICAgIH0KKyAgICAgICAgbXkgJHN1ZiAgICAgICA9ICggQGV4ID8gIi4iIC4gam9pbiggIi4iLCBAZXggKSA6ICIiICk7CisgICAgICAgICAgICAjIFNob3J0ZW5lZCB2ZXJzaW9uIG9mICRzaWZmaXggLS0gb25seSBub24tZGVmYXVsdCB2YWx1ZXMuCisgICAgICAgIG15ICRidWlsZF9kaXIgPSBqb2luKCAiLSIsICR0YXJnZXRfcGxhdGZvcm0sIGpvaW4oICJfIiwgQGJhc2UgKSAuICRzdWZmaXgsIFVuYW1lOjpob3N0X25hbWUoKSApOworICAgICAgICBteSAkb3V0X2FyY2hfZGlyID0gY2F0X2RpciggJEVOVnsgTElCT01QX0VYUE9SVFMgfSwgJHRhcmdldF9wbGF0Zm9ybSAuICRzdWYgKTsKKyAgICAgICAgbXkgJG91dF9jbW5fZGlyICA9IGNhdF9kaXIoICRFTlZ7IExJQk9NUF9FWFBPUlRTIH0sICJjb21tb24iICk7CisgICAgICAgIHB1c2goCisgICAgICAgICAgICBAJGpvYnMsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWFrZWZpbGUgPT4gJG1ha2VmaWxlLAorICAgICAgICAgICAgICAgIG1ha2VfYXJncyA9PiBbCisgICAgICAgICAgICAgICAgICAgICJvcz0iICAgLiAkdGFyZ2V0X29zLAorICAgICAgICAgICAgICAgICAgICAiYXJjaD0iIC4gJHRhcmdldF9hcmNoLAorICAgICAgICAgICAgICAgICAgICAiTUlDX09TPSIgLiAkc2V0LT57ICJtaWMtb3MiIH0sCisgICAgICAgICAgICAgICAgICAgICJNSUNfQVJDSD0iIC4gJHNldC0+eyAibWljLWFyY2giIH0sCisgICAgICAgICAgICAgICAgICAgICJNSUNfQ09NUD0iIC4gJHNldC0+eyAibWljLWNvbXAiIH0sCisgICAgICAgICAgICAgICAgICAgICJkYXRlPSIgLiBCdWlsZDo6dHN0ciggJEJ1aWxkOjpzdGFydCApLAorICAgICAgICAgICAgICAgICAgICAiVEVTVF9ERVBTPSIgLiAoICR0ZXN0X2RlcHMgICA/ICJvbiIgOiAib2ZmIiApLAorICAgICAgICAgICAgICAgICAgICAiVEVTVF9UT1VDSD0iIC4gKCAkdGVzdF90b3VjaCA/ICJvbiIgOiAib2ZmIiApLAorICAgICAgICAgICAgICAgICAgICAiQ1BMVVNQTFVTPW9uIiwKKyAgICAgICAgICAgICAgICAgICAgIkNPVkVSQUdFPSIgLiAkc2V0LT57IGNvdmVyYWdlIH0sCisgICAgICAgICAgICAgICAgICAgICMgT3B0aW9uICJtb2RlIiBjb250cm9scyAzIG1ha2UgZmxhZ3M6CisgICAgICAgICAgICAgICAgICAgICMgICAgIGRlYnVnICAgPT4gRnVsbCBkZWJ1Z2dpbmcgICA6ICAgIGRpYWdub3N0aWNzLCAgICBkZWJ1ZyBpbmZvLCBubyBvcHRpbWl6YXRpb24uCisgICAgICAgICAgICAgICAgICAgICMgICAgIGRpYWcgICAgPT4gT25seSBkaWFnbm9zdGljcyA6ICAgIGRpYWdub3N0aWNzLCAgICBkZWJ1ZyBpbmZvLCAgICBvcHRpbWl6YXRpb24uCisgICAgICAgICAgICAgICAgICAgICMgICAgIHJlbGVhc2UgPT4gUHJvZHVjdGlvbiBidWlsZCA6IG5vIGRpYWdub3N0aWNzLCBubyBkZWJ1ZyBpbmZvLCAgICBvcHRpbWl6YXRpb24uCisgICAgICAgICAgICAgICAgICAgICJERUJVR19JTkZPPSIgLiAgICggJHNldC0+eyBtb2RlIH0gbmUgInJlbGVhc2UiID8gIm9uIiA6ICJvZmYiICksCisgICAgICAgICAgICAgICAgICAgICJESUFHPSIgLiAgICAgICAgICggJHNldC0+eyBtb2RlIH0gbmUgInJlbGVhc2UiID8gIm9uIiA6ICJvZmYiICksCisgICAgICAgICAgICAgICAgICAgICJPUFRJTUlaQVRJT049IiAuICggJHNldC0+eyBtb2RlIH0gbmUgImRlYnVnIiAgID8gIm9uIiA6ICJvZmYiICksCisgICAgICAgICAgICAgICAgICAgICJMSUJfVFlQRT0iIC4gc3Vic3RyKCAkc2V0LT57ICJsaWItdHlwZSIgfSwgMCwgNCApLAorICAgICAgICAgICAgICAgICAgICAiTElOS19UWVBFPSIgLiBzdWJzdHIoICRzZXQtPnsgImxpbmstdHlwZSIgfSwgMCwgNCApLAorICAgICAgICAgICAgICAgICAgICAiT01QX1ZFUlNJT049IiAuICRzZXQtPnsgIm9tcC12ZXJzaW9uIiB9LAorICAgICAgICAgICAgICAgICAgICAiVVNFX1RDSEVDSz0iIC4gJHNldC0+eyB0Y2hlY2sgfSwKKyAgICAgICAgICAgICAgICAgICAgIlZFUlNJT049IiAuICRzZXQtPnsgdmVyc2lvbiB9LAorICAgICAgICAgICAgICAgICAgICAiVEFSR0VUX0NPTVBJTEVSPSIgLiAkc2V0LT57ICJ0YXJnZXQtY29tcGlsZXIiIH0sCisgICAgICAgICAgICAgICAgICAgICJzdWZmaXg9IiAuICRzdWYsCisgICAgICAgICAgICAgICAgICAgIEBnb2FscywKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgIGJ1aWxkX2RpciAgPT4gJGJ1aWxkX2RpcgorICAgICAgICAgICAgfQorICAgICAgICApOyAjIHB1c2gKKyAgICB9OyAjIGlmCit9OyAjIHN1YiBlbnF1ZXVlX2pvYnMKKworbXkgQGpvYnM7CitlbnF1ZXVlX2pvYnMoIFxAam9icywge30sIEBhbGxfb3B0cyApOworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIERvIHRoZSB3b3JrLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitteSAkZXhpdCA9IDA7CisKK0J1aWxkOjppbml0KCk7CisKK2lmICggJGNsb2JiZXIgKSB7CisgICAgbXkgQGRpcnMgPSAoICRFTlZ7IExJQk9NUF9UTVAgfSwgJEVOVnsgTElCT01QX0VYUE9SVFMgfSwgY2F0X2RpciggJHJvb3RfZGlyLCAidG9vbHMiLCAiYmluIiAgKSApOworICAgIG15ICRyYyA9IDA7CisgICAgcXVlc3Rpb24oCisgICAgICAgICJDbG9iYmVyICIgLiBqb2luKCAiLCAiLCBtYXAoICJcIiIgLiBCdWlsZDo6c2hvcnRlciggJF8gKSAuICJcIiIsIEBkaXJzICkgKSAuICIgZGlycz8gIiwKKyAgICAgICAgJGFuc3dlciwKKyAgICAgICAgcXJ7XEEoeXx5ZXN8bnxubylcen1pCisgICAgKTsKKyAgICBpZiAoICRhbnN3ZXIgPX4gbXtcQXl9aSApIHsKKyAgICAgICAgaW5mbyggIkNsb2JiZXJpbmcuLi4iICk7CisgICAgICAgICRyYyA9IEJ1aWxkOjpjbGVhbiggQGRpcnMgKTsKKyAgICAgICAgaW5mbyggQnVpbGQ6OnJzdHIoICRyYyApICk7CisgICAgfTsgIyBpZgorICAgIGlmICggJHJjICE9IDAgKSB7CisgICAgICAgICRleGl0ID0gMzsKKyAgICB9OyAjIGlmCit9IGVsc2UgeyAjIEJ1aWxkIG9yIGNsZWFuLgorICAgIGlmICggQGpvYnMgKSB7CisgICAgICAgIG15ICR0b3RhbCA9IEBqb2JzOyAgICAjIFRvdGFsIG51bWJlciBvZiBqb2JzLgorICAgICAgICBteSAkbiAgICAgPSAwOyAgICAgICAgIyBDdXJyZW50IGpvYiBudW1iZXIuCisgICAgICAgIEJ1aWxkOjpwcm9ncmVzcyggIiIsICIiICk7ICAgICAjIE91dHB1dCBlbXB0eSBsaW5lIHRvIGxvZyBmaWxlLgorICAgICAgICBteSAkZ29hbHMgPSBqb2luKCAiICIsIEBnb2FscyApOworICAgICAgICBCdWlsZDo6cHJvZ3Jlc3MoICJHb2FscyIsICRnb2FscyBlcSAiIiA/ICIoYWxsKSIgOiAkZ29hbHMgKTsKKyAgICAgICAgQnVpbGQ6OnByb2dyZXNzKCAiQ29uZmlndXJhdGlvbnMiLCBzY2FsYXIoIEBqb2JzICkgKTsKKyAgICAgICAgZm9yZWFjaCBteSAkam9iICggQGpvYnMgKSB7CisgICAgICAgICAgICArKyAkbjsKKyAgICAgICAgICAgIG15ICRiYXNlID0gZ2V0X2ZpbGUoICRqb2ItPnsgYnVpbGRfZGlyIH0gKTsKKyAgICAgICAgICAgIEJ1aWxkOjpwcm9ncmVzcyggIk1ha2luZyIsICIlM2Qgb2YgJTNkIDogJXMiLCAkbiwgJHRvdGFsLCAkYmFzZSApOworICAgICAgICAgICAgJGpvYi0+eyByYyB9ID0gQnVpbGQ6Om1ha2UoICRqb2IsICRjbGVhbiwgc3ByaW50ZiggIiVkLyVkIiwgJG4sICR0b3RhbCApICk7CisgICAgICAgIH07ICMgbXkgJGpvYgorICAgICAgICBteSAkZmFpbHVyZXMgPSBCdWlsZDo6c3VtbWFyeSgpOworICAgICAgICBpZiAoICRmYWlsdXJlcyA+IDAgKSB7CisgICAgICAgICAgICAkZXhpdCA9IDM7CisgICAgICAgIH07ICMgaWYKKyAgICB9IGVsc2UgeworICAgICAgICBpbmZvKCAiTm90aGluZyB0byBkby4iICk7CisgICAgfTsgIyBpZgorfTsgIyBpZgorCisjIEFuZCBleGl0LgorZXhpdCggJGV4aXQgKTsKKworX19FTkRfXworCis9cG9kCisKKz1oZWFkMSBOQU1FCisKKworQjxidWlsZC5wbD4gLS0gQnVpbGQgb25lIG9yIG1vcmUgY29uZmlndXJhdGlvbnMgb2YgT01QIFJUTCBsaWJyYXJpZXMuCisKKz1oZWFkMSBTWU5PUFNJUworCitCPGJ1aWxkLnBsPiBJPG9wdGlvbj4uLi4gW0I8LS0+XSBJPG1ha2Utb3B0aW9uPi4uLiBJPHZhcmlhYmxlPi4uLiBJPGdvYWw+Li4uCisKKz1oZWFkMSBPUFRJT05TCisKKz1vdmVyCisKKz1pdGVtIEI8LS1hbGw+CisKK0J1aWxkIGFsbCBiYXNlIGNvbmZpZ3VyYXRpb25zLgorCis9aXRlbSBCPC0tQUxMPgorCitCdWlsZCByZWFsbHkgYWxsIGNvbmZpZ3VyYXRpb25zLCBpbmNsdWRpbmcgZXh0cmEgb25lcy4KKworPWl0ZW0gQjwtLWFuc3dlcj0+STxzdHI+CisKK1VzZSBzcGVjaWZpZWQgc3RyaW5nIGFzIGRlZmF1bHQgYW5zd2VyIHRvIGFsbCBxdWVzdGlvbnMuCisKKz1pdGVtIEI8LS1hcmNoaXRlY3R1cmU9Pkk8YXJjaD4KKworU3BlY2lmeSB0YXJnZXQgYXJjaGl0ZWN0dXJlIHRvIGJ1aWxkLiBEZWZhdWx0IGlzIGFyY2hpdGVjdHVyZSBvZiBob3N0IG1hY2hpbmUuIEk8YXJjaD4gY2FuIGJlIEM8MzI+LAorQzwzMmU+LCBvciBvbmUgb2Yga25vd24gYWxpYXNlcyBsaWtlIEM8SUEzMj4uCisKK0lmIGFyY2hpdGVjdHVyZSBpcyBub3Qgc3BlY2lmaWVkIGV4cGxpY2l0bHksIHZhbHVlIG9mIExJQk9NUF9BUkNIIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHVzZWQuCitJZiBMSUJPTVBfQVJDSCBpcyBub3QgZGVmaW5lZCwgaG9zdCBhcmNoaXRlY3R1cmUgZGV0ZWN0ZWQuCisKKz1pdGVtIEI8LS1vcz0+STxvcz4KKworU3BlY2lmeSB0YXJnZXQgT1MuIERlZmF1bHQgaXMgT1Mgb2YgaG9zdCBtYWNoaW5lLiBJPG9zPiBjYW4gYmUgQzxsaW4+LCBDPGxyYj4sIEM8bWFjPiwgQzx3aW4+LAorb3Igb25lIG9mIGtub3duIGFsaWFzZXMgbGlrZSBDPExpbnV4PiwgQzxXaW5OVD4sIGV0Yy4KKworPWl0ZW0gQjwtLW1pYy1vcz0+STxvcz4KKworU3BlY2lmeSBPUyBvbiBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUgY2FyZC4gRGVmYXVsdCBpcyBDPGJzZD4uIEk8b3M+IGNhbiBiZSBDPGJzZD4sIEM8bGluPi4KKworPWl0ZW0gQjwtLW1pYy1hcmNoPT5JPGFyY2g+CisKK1NwZWNpZnkgYXJjaGl0ZWN0dXJlIG9mIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZSBjYXJkLiBEZWZhdWx0IGlzIEM8a25mPi4gSTxhcmNoPiBjYW4gYmUgQzxrbmY+LCBDPGtuYz4sIEM8a25sPi4KKworPWl0ZW0gQjwtLW1pYy1jb21wPT5JPGNvbXBpbGVyLXR5cGU+CisKK1NwZWNpZnkgd2hldGhlciB0aGUgSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQ29tcGlsZXIgaXMgbmF0aXZlIG9yIG9mZmxvYWQuIERlZmF1bHQgaXMgQzxuYXRpdmU+LgorSTxjb21waWxlci10eXBlPiBjYW4gYmUgQzxuYXRpdmU+IG9yIEM8b2ZmbG9hZD4uCisKKz1pdGVtIEI8LS0+W0I8bm8tPl1CPHRlc3QtZGVwcz4KKworRW5hYmxlIG9yIGRpc2FibGUgQzx0ZXN0LWRlcHM+LiBUaGUgdGVzdCBydW5zIGluIGFueSBjYXNlLCBidXQgcmVzdWx0IG9mIGRpc2FibGVkIHRlc3QgaXMgaWdub3JlZC4KK0J5IGRlZmF1bHQsIHRlc3QgaXMgZW5hYmxlZC4KKworPWl0ZW0gQjwtLT5bQjxuby0+XUI8dGVzdC10b3VjaD4KKworRW5hYmxlIG9yIGRpc2FibGUgQzx0ZXN0LXRvdWNoPi4gVGhlIHRlc3QgcnVucyBpbiBhbnkgY2FzZSwgYnV0IHJlc3VsdCBvZiBkaXNhYmxlZCB0ZXN0IGlzIGlnbm9yZWQuCitCeSBkZWZhdWx0LCB0ZXN0IGlzIGVuYWJsZWQuCisKKz1pdGVtIEJhc2UgQ29uZmlndXJhdGlvbiBTZWxlY3Rpb24gT3B0aW9ucworCis9b3ZlcgorCis9aXRlbSBCPC0tdGFyZ2V0PT5JPHRhcmdldD4KKworQnVpbGQgc3BlY2lmaWVkIHRhcmdldCwgZWl0aGVyIEM8cnRsPiAoT01QIFJ1bnRpbWUgTGlicmFyeTsgZGVmYXVsdCksCitvciBDPHRpbWVsaW1pdD4gKHByb2dyYW0gdXNlZCBpbiB0ZXN0aW5nKSwgb3IgQzxhbGw+LgorCis9aXRlbSBCPC0tbGliLXR5cGU9Pkk8bGliPgorCitCdWlsZCBzcGVjaWZpZWQgbGlicmFyeSwgZWl0aGVyIEM8bm9ybWFsPiAoZGVmYXVsdCksIG9yIEM8c3R1YnM+LCBvciBDPGFsbD4uCisKKz1pdGVtIEI8LS1saW5rLXR5cGU9Pkk8dHlwZT4KKworQnVpbGQgc3BlY2lmaWVkIGxpbmsgdHlwZSwgZWl0aGVyIEM8ZHluYW1pYz4gKGRlZmF1bHQpIG9yIEM8YWxsPi4KKworPWJhY2sKKworPWl0ZW0gRXh0cmEgQ29uZmlndXJhdGlvbiBTZWxlY3Rpb24gT3B0aW9ucworCis9b3ZlcgorCis9aXRlbSBCPC0tY292ZXI9Pkk8c3dpdGNoPgorCitCdWlsZCBmb3IgY29kZSBjb3ZlcmFnZSBkYXRhIGNvbGxlY3Rpb24uIEk8c3dpdGNoPiBjYW4gYmUgQzxvZmY+IChkZWZhdWx0KSwgQzxvbj4KK29yIEM8YWxsPi4KKworPWl0ZW0gQjwtLW1vZGU9Pkk8bW9kZT4KKworQnVpbGQgbGlicmFyeSBvZiBzcGVjaWZpZWQgSTxtb2RlPiwgZWl0aGVyIEM8ZGVidWc+LCBDPGRpYWc+LCBDPHJlbGVhc2U+IChkZWZhdWx0KSwgb3IgQzxhbGw+LgorTW9kZSBjb250cm9scyAzIGZlYXR1cmVzOgorCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgZmVhdHVyZS9tb2RlICAgICAgICAgICAgICAgICAgIGRlYnVnICBkaWFnICByZWxlYXNlCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgZGVidWcgaW5mbyAgICAgICAgICAgICAgICAgICAgICAgbyAgICAgIG8KKyAgICBkaWFnbm9zdGljcyAoYXNzZXJ0cywgdHJhY2VzKSAgICBvICAgICAgbworICAgIGNvZGUgb3B0aW1pemF0aW9uICAgICAgICAgICAgICAgICAgICAgICBvICAgICAgbworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aXRlbSBCPC0tdGFyZ2V0LWNvbXBpbGVyPT5JPHZlcnNpb24+CisKK0J1aWxkIGZpbGVzIGZvciBzcGVjaWZpZWQgdGFyZ2V0IGNvbXBpbGVyLCBDPDExPiBvciBDPDEyPi4KKworPWJhY2sKKworPWl0ZW0gU2hvcnRjdXRzCisKK0lmIG9wdGlvbiB3aXRoIEM8bm8+IHByZWZpeCBpcyB1c2VkLCBjb3JyZXNwb25kaW5nIGNvbmZpZ3VyYXRpb24gd2lsbCBCPG5vdD4gYmUgYnVpbHQuCitVc2VmdWwgZm9yIGV4Y2x1ZGluZyBzb21lIGNvbmZpZ3VyYXRpb25zIGlmIG9uZSBvciBtb3JlIG90aGVyIG9wdGlvbnMgc3BlY2lmaWVkIHdpdGggQzxhbGw+Cit2YWx1ZSAoc2VlIEV4YW1wbGVzKS4KKworPW92ZXIKKworPWl0ZW0gQjwtLT5bQjxubz5dQjwxMT4KKworQnVpbGQgZmlsZXMgZm9yIGNvbXBpbGVyIEM8MTE+LgorCis9aXRlbSBCPC0tPltCPG5vPl1CPDEyPgorCitCdWlsZCBmaWxlcyBmb3IgY29tcGlsZXIgQzwxMj4uCisKKz1pdGVtIEI8LS0+W0I8bm8+XUI8ZGVidWc+CisKKz1pdGVtIEI8LS0+W0I8bm8+XUI8ZGViZz4KKworPWl0ZW0gQjwtLT5bQjxubz5dQjxkYmc+CisKK0J1aWxkIGRlYnVnZ2FibGUgbGlicmFyeS4KKworPWl0ZW0gQjwtLT5bQjxubz5dQjxkaWFnPgorCitCdWlsZCBsaWJyYXJ5IHdpdGggZGlhZ25vc3RpY3MgZW5hYmxlZC4KKworPWl0ZW0gQjwtLT5bQjxubz5dQjxkeW5hbWljPgorCitCdWlsZCBkeW5hbWljIGxpYnJhcnkgKGRlZmF1bHQpLgorCis9aXRlbSBCPC0tPltCPG5vPl1CPG5vcm1hbD4KKworQnVpbGQgbm9ybWFsIGxpYnJhcnkgKGRlZmF1bHQpLgorCis9aXRlbSBCPC0tPltCPG5vPl1CPHJlbGVhc2U+CisKK0J1aWxkIHJlbGVhc2UgbGlicmFyeSAoZGVmYXVsdCkuCisKKz1pdGVtIEI8LS0+W0I8bm8+XUI8cnRsPgorCitCdWlsZCBPTVAgUlRMIChkZWZhdWx0KS4KKworPWl0ZW0gQjwtLT5bQjxubz5dQjxzdHVicz4KKworQnVpbGQgc3R1YnMgbGlicmFyeS4KKworPWl0ZW0gQjwtLT5bQjxubz5dQjx0aW1lbGltaXQ+CisKK0J1aWxkIHRpbWVsaW1pdCB1dGlsaXR5IHByb2dyYW0uCisKKz1iYWNrCisKKz1pdGVtIFN0YW5kYXJkIE9wdGlvbnMKKworPW92ZXIKKworPWl0ZW0gQjwtLWRvYz4KKworPWl0ZW0gQjwtLW1hbnVhbD4KKworUHJpbnQgZnVsbCBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQuCisKKz1pdGVtIEI8LS1oZWxwPgorCitQcmludCBzaG9ydCBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQuCisKKz1pdGVtIEI8LS11c2FnZT4KKworUHJpbnQgdmVyeSBzaG9ydCB1c2FnZSBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0tdmVyYm9zZT4KKworRG8gcHJpbnQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcy4KKworPWl0ZW0gQjwtLXZlcnNpb24+CisKK1ByaW50IHByb2dyYW0gdmVyc2lvbiBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLXF1aWV0PgorCitXb3JrIHF1aWV0LCBkbyBub3QgcHJpbnQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcy4KKworPWJhY2sKKworPWJhY2sKKworPWhlYWQxIEFSR1VNRU5UUworCis9b3ZlcgorCis9aXRlbSBJPG1ha2Utb3B0aW9uPgorCitBbnkgb3B0aW9uIGZvciBtYWtlZmlsZSwgZm9yIGV4YW1wbGUgQzwtaz4gb3IgQzwtbj4uIElmIHlvdSBwYXNzIHNvbWUgb3B0aW9ucyB0byBtYWtlZmlsZSwgQzwtLT4KK2RlbGltaXRlciBpcyBtYW5kYXRvcnksIG90aGVyd2lzZSBDPGJ1aWxkLnBsPiBwcm9jZXNzZXMgYWxsIHRoZSBvcHRpb25zIGludGVybmFsbHkuCisKKz1pdGVtIEk8dmFyaWFibGU+CisKK0RlZmluZSBtYWtlZmlsZSB2YXJpYWJsZSBpbiBmb3JtIEk8bmFtZT5CPD0+STx2YWx1ZT4uIE1vc3QgbWFrZWZpbGUgY2FwYWJpbGl0aWVzIGFyZQorYWNjZXNzaWJsZSB0aHJvdWdoIEM8YnVpbGQucGw+IG9wdGlvbnMsIHNvIHRoZXJlIGlzIG5vIG5lZWQgaW4gZGVmaW5pbmcgbWFrZSB2YXJpYWJsZXMgaW4gY29tbWFuZAorbGluZS4KKworPWl0ZW0gSTxnb2FsPgorCitNYWtlZmlsZSBnb2FsIHRvIGJ1aWxkIChvciBjbGVhbikuCisKKz1vdmVyCisKKz1pdGVtIEI8YWxsPgorCitCdWlsZCBDPGxpYj4sIEM8dGVzdHM+LCBDPGluYz4uCisKKz1pdGVtIEI8Y29tbW9uPgorCitCdWlsZCBjb21tb24gKGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCkgZmlsZXMuIENvbW1vbiBmaWxlcyBhcmUgbm90IGNvbmZpZ3VyYXRpb24tZGVwZW5kZW50LCBzbwordGhlcmUgaXMgbm8gcG9pbnQgaW4gYnVpbGRpbmcgaXQgZm9yIG1vcmUgdGhhbiBvbmUgY29uZmlndXJhdGlvbiAodGhvdWdodCBpdCBpcyBoYXJtbGVzcykuCitIb3dldmVyLCBkbyBub3QgYnVpbGQgY29tbW9uIGZpbGVzIG9uIG1hbnkgbWFjaGluZXMgc2ltdWx0YW5lb3VzbHkuCisKKz1pdGVtIEI8Y2xlYW4+CisKK0RlbGV0ZSB0aGUgZXhwb3J0IGZpbGVzIGFuZCBjbGVhbiBidWlsZCBkaXJlY3Rvcnkgb2YgY29uZmlndXJhdGlvbihzKSBzcGVjaWZpZWQgYnkgb3B0aW9ucy4gTm90ZQordGhhdCBDPGNsZWFuPiBnb2FsIGNhbm5vdCBiZSBtaXhlZCB3aXRoIG90aGVyIGdvYWxzIChleGNlcHQgZm9yIEM8Y2xlYW4tY29tbW9uPikuCisKKz1pdGVtIEI8Y2xlYW4tY29tbW9uPgorCitEZWxldGUgdGhlIGNvbW1vbiBmaWxlcyBpbiBGPGV4cG9ydHMvPiBkaXJlY3RvcnkuCisKKz1pdGVtIEI8Y2xvYmJlcj4KKworQ2xlYW4gRjxleHBvcnQvPiBhbmQgRjx0bXAvPiBkaXJlY3Rvcmllcy4gSWYgQzxjbG9iYmVyPiBpcyBzcGVjaWZpZWQsIG90aGVyIGdvYWxzIGFuZC9vciBvcHRpb25zCitkbyBub3QgbWF0dGVyLgorCitOb3RlOiBDbG9iYmVyaW5nIGlzIHBvdGVudGlhbHkgZGFuZ2Vyb3VzIG9wZXJhdGlvbiwgYmVjYXVzZSBpdCBkZWxldGVzIGNvbnRlbnQgb2YgZGlyZWN0b3J5Citwb2ludGVkIGJ5IElmIEM8TElCT01QX1RNUD4gZW52aXJvbm1lbnQgdmFyaWFibGUsIHNvIEM8YnVpbGQucGw+IGFza3MgYSBjb25maXJtYXRpb24gYmVmb3JlCitjbG9iYmVyaW5nLiBUbyBzdXBwcmVzcyB0aGUgcXVlc3Rpb24sIHVzZSBvcHRpb24gQzwtLWFuc3dlcj15ZXM+LgorCis9aXRlbSBCPGZhdD4KKworQzxtYWNfMzJlPiBvbmx5OiBCdWlsZCBmYXQgbGlicmFyaWVzIGZvciBib3RoIG1hY18zMiBhbmQgbWFjXzMyZS4gU2hvdWxkIGJlIHJ1biB3aGVuIEM8bGliPgorZ29hbCBpcyBidWlsdCBvbiBib3RoIEM8bWFjXzMyPiBhbmQgQzxtYWNfMzJlPi4KKworPWl0ZW0gSTxmaWxlLm8+CisKKyhXaW5kb3dzKiBPUzogSTxmaWxlLm9iaj4pIEJ1aWxkIHNwZWNpZmllZCBvYmplY3QgZmlsZSBvbmx5LgorCis9aXRlbSBJPGZpbGUuaT4KKworQ3JlYXRlIHByZXByb2Nlc3NlZCBzb3VyY2UgZmlsZS4KKworPWl0ZW0gQjxmb3JjZS10ZXN0cz4KKworRm9yY2UgcGVyZm9ybWluZyB0ZXN0cy4KKworPWl0ZW0gQjxmb3JjZS10ZXN0LWRlcHM+CisKK0ZvcmNlIHBlcmZvcm1pbmcgdGVzdC1kZXBzLgorCis9aXRlbSBCPGZvcmNlLXRlc3QtaW5zdHI+CisKK0ZvcmNlIHBlcmZvcm1pbmcgdGVzdC1pbnN0ci4KKworPWl0ZW0gQjxmb3JjZS10ZXN0LXJlbG8+CisKK0ZvcmNlIHBlcmZvcm1pbmcgdGVzdC1yZWxvLgorCis9aXRlbSBCPGZvcmNlLXRlc3QtdG91Y2g+CisKK0ZvcmNlIHBlcmZvcm1pbmcgdGVzdC10b3VjaC4KKworPWl0ZW0gQjxpbmM+CisKK0J1aWxkIEZvcnRyYW4gaW5jbHVkZSBmaWxlcywgb21wX2xpYi5oLCBvbXBfbGliLm1vZCBhbmQgb21wX2xpYl9raW5kcy5tb2QuCisKKz1pdGVtIEI8bGliPgorCitCdWlsZCBsaWJyYXJ5IChvbiBXaW5kb3dzKiBPUyBpbiBjYXNlIG9mIGR5bmFtaWMgbGlua2luZywgaXQgYWxzbyBidWlsZHMgaW1wb3J0IGxpYnJhcnkpLgorCis9aXRlbSBCPHRlc3RzPgorCitQZXJmb3JtIHRlc3RzOiBDPHRlc3QtZGVwcz4sIEM8dGVzdC1pbnN0cj4sIEM8dGVzdC1yZWxvPiwgYW5kIEM8dGVzdC10b3VjaD4uCisKKz1pdGVtIEI8dGVzdC1kZXBzPgorCitDaGVjayB0aGUgbGlicmFyeSBkZXBlbmRlbmNpZXMuIAorCis9aXRlbSBCPHRlc3QtaW5zdHI+CisKK0ludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZSBvbmx5OiBjaGVjayB0aGUgbGlicmFyeSBkb2VzIG5vdCBjb250YWluIHVuZGVzaXJlZCBpbnN0cnVjdGlvbnMuCisKKz1pdGVtIEI8dGVzdC1yZWxvPgorCitMaW51eCogT1Mgd2l0aCBkeW5hbWljIGxpbmtpbmcgb25seTogY2hlY2sgdGhlIGxpYnJhcnkgZG9lcyBub3QgY29udGFpbiBwb3NpdGlvbi1kZXBlbmRlbnQKK2NvZGUuCisKKz1pdGVtIEI8dGVzdC10b3VjaD4KKworQnVpbGQgYSB2ZXJ5IHNpbXBsZSBhcHBsaWNhdGlvbiB3aXRoIG5hdGl2ZSBjb21waWxlciAoR05VIG9uIExpbnV4KiBPUyBhbmQgT1MgWCosIE1TCitvbiBXaW5kb3dzKiBPUyksIGNoZWNrIGl0IGRvZXMgbm90IGRlcGVuZCBvbiBDPGxpYmlyYz4gbGlicmFyeSwgYW5kIHJ1biBpdC4KKworPWJhY2sKKworPWJhY2sKKworPWhlYWQxIERFU0NSSVBUSU9OCisKK0M8YnVpbGQucGw+IGNvbnN0cnVjdHMgdGhlIG5hbWUgb2YgYSBidWlsZCBkaXJlY3RvcnksIGNyZWF0ZXMgdGhlIGRpcmVjdG9yeSBpZiBpdAorZG9lcyBub3QgZXhpc3QsIGNoYW5nZXMgdG8gaXQsIGFuZCBydW5zIG1ha2UgdG8gYnVpbGQgdGhlIGdvYWxzIGluIHNwZWNpZmllZCBjb25maWd1cmF0aW9uLgorSWYgbW9yZSB0aGFuIG9uZSBjb25maWd1cmF0aW9uIGFyZSBzcGVjaWZpZWQgaW4gY29tbWFuZCBsaW5lIEM8YnVpbGQucGw+IGJ1aWxkcyB0aGVtIGFsbC4KKworQmVpbmcgcnVuIHdpdGggQzxjbGVhbj4gZ29hbCwgQzxidWlsZC5wbD4gZG9lcyBub3QgYnVpbGQgYnV0IGRlbGV0ZXMgZXhwb3J0IGZpbGVzIGFuZAorY2xlYW5zIGJ1aWxkIGRpcmVjdG9yaWVzIG9mIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkIGJ5IG90aGVyIG9wdGlvbnMuIEZvciBleGFtcGxlLAorQzxidWlsZC5wbCAtLWFsbCBjbGVhbj4gbWVhbnMgImNsZWFuIGJ1aWxkIGRpcmVjdG9yaWVzIGZvciBhbGwgY29uZmlndXJhdGlvbnMiLAoraXQgZG9lcyBCPG5vdD4gbWVhbiAiY2xlYW4gdGhlbiBidWlsZCBhbGwiLgorCitDPGNsZWFyLWNvbW1vbj4gZ29hbCBkZWxldGVzIGNvbW1vbiBmaWxlcyBpbiBGPGV4cG9ydHMvPiBkaXJlY3RvcnkuCitTaW5jZSBjb21tb24gZmlsZXMgYXJlIHJlYWxseSBjb21tb24gYW5kIG5vdCBhcmNoaXRlY3R1cmUgYW5kL29yIGNvbmZpZ3VyYXRpb24gZGVwZW5kZW50LAordGhlcmUgYXJlIG5vIG11Y2ggbWVhbmluZyBpbiBjb21iaW5pbmcgQzxjbGVhci1jb21tb24+IHdpdGggY29uZmlndXJhdGlvbiBzZWxlY3Rpb24gb3B0aW9ucy4KK0ZvciBleGFtcGxlLCBDPGJ1aWxkLnBsIC0tYWxsIGNsZWFuLWNvbW1vbj4gZGVsZXRlcyB0aGUgc2FtZSBmaWxlcyAxMyB0aW1lcy4KK0hvd2V2ZXIsIGl0IGRvZXMgbm90IGh1cnQgYW5kIGNhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggQzxjbGVhcj4gZ29hbC4KKworQzxjbG9iYmVyPiBnb2FsIGluc3RydWN0cyBDPGJ1aWxkLnBsPiB0byBjbGVhbiBleHBvcnRzIGFuZCBhbGwgYnVpbGQKK2RpcmVjdG9yaWVzLCBlLiBnLiBjbGVhbiBldmVyeXRoaW5nIHVuZGVyIEY8ZXhwb3J0cy8+IGFuZCBGPHRtcC8+IGRpcmVjdG9yaWVzLgorCitMb2dzIGFyZSBzYXZlZCBhdXRvbWF0aWNhbGx5LCB0aGVyZSBpcyBubyBuZWVkIGluIGV4cGxpY2l0IG91dHB1dCByZWRpcmVjdGlvbi4KK0xvZyBmaWxlIGZvciBlYWNoIHBhcnRpY3VsYXIgY29uZmlndXJhdGlvbiBpcyBuYW1lZCBGPGJ1aWxkLmxvZz4gYW5kIGxvY2F0ZWQgaW4gYnVpbGQgZGlyZWN0b3J5LgorU3VtbWFyeSBsb2cgZmlsZSAoanVzdCByZXN1bHQgb2YgZWFjaCBjb25maWd1cmF0aW9uKSBpcyBzYXZlZCBpbiBGPHRtcC8+IGRpcmVjdG9yeS4KKworTG9nIGZpbGVzIGFyZSBuZXZlciBvdmVyd3JpdHRlbi4gQzxidWlsZC5wbD4gYWx3YXlzIGFwcGVuZHMgb3V0cHV0IHRvIGxvZyBmaWxlcy4KK0hvd2V2ZXIgKG9idmlvdXNseSksIEM8Y2xlYXI+IGRlbGV0ZXMgbG9nIGZpbGUgZm9yIGNsZWFyZWQgY29uZmlndXJhdGlvbnMsCithbmQgQzxjbG9iYmVyPiBkZWxldGVzIGFsbCBzdW1tYXJ5IGxvZyBmaWxlcy4KKworPWhlYWQyIEVudmlyb25tZW50IFZhcmlhYmxlcworCis9b3ZlcgorCis9aXRlbSBCPExJQk9NUF9BUkNIPgorCitTcGVjaWZpZXMgdGFyZ2V0IGFyY2hpdGVjdHVyZS4gSWYgbm90IHByZXNlbnQsIGhvc3QgYXJjaGl0ZWN0dXJlIGlzIHVzZWQuIEVudmlyb25tZW50IHZhcmlhYmxlIG1heQorYmUgb3ZlcnJpZGVuIGJ5IEM8LS1hcmNoaXRlY3R1cmU+IGNvbW1hbmQgbGluZSBvcHRpb24uCisKKz1pdGVtIEI8TElCT01QX0VYUE9SVFM+CisKK1NwZWNpZmllcyBkaXJlY3RvcnkgZm9yIG91dHB1dCBmaWxlcy4gSWYgbm90IHNldCwgQzwkTElCT01QX1dPUksvZXhwb3J0cy8+IHVzZWQgYnkgZGVmYXVsdC4KKworPWl0ZW0gQjxMSUJPTVBfT1M+CisKK1NwZWNpZmllcyB0YXJnZXQgT1MuIElmIG5vdCBwcmVzZW50LCBob3N0IE9TIGlzIHVzZWQuIEVudmlyb25tZW50IHZhcmlhYmxlIG1heQorYmUgb3ZlcnJpZGVuIGJ5IEM8LS1vcz4gY29tbWFuZCBsaW5lIG9wdGlvbi4KKworPWl0ZW0gQjxMSUJPTVBfVE1QPgorCitEaXJlY3RvcnkgZm9yIHRlbXBvcmFyeSBmaWxlcy4gQzxidWlsZC5wbD4gY3JlYXRlcyBidWlsZCBkaXJlY3RvcmllcyB0aGVyZS4gSWYgbm90IHNldCwKK0M8JExJQk9NUF9XT1JLL3RtcC8+IHVzZWQgYnkgZGVmYXVsdC4KKworT24gV2luZG93cyogT1MgRjx0bXAvPiBkaXJlY3Rvcnkgb24gbG9jYWwgZHJpdmUgc3BlZWRzIHVwIHRoZSBidWlsZCBwcm9jZXNzLgorCis9aXRlbSBCPExJQk9NUF9XT1JLPgorCitSb290IG9mIGxpYm9tcCBkaXJlY3RvcnkgdHJlZSwgY29udGFpbnMgRjxzcmMvPiwgRjx0b29scy8+LCBhbmQgRjxleHBvcnRzLz4gc3ViZGlycy4KK0lmIG5vdCBzZXQsIEM8YnVpbGQucGw+IGd1ZXNzZXMgdGhlIHJvb3QgZGlyIChpdCBpcyBhIHBhcmVudCBvZiBkaXIgY29udGFpbmluZyBDPGJ1aWxkLnBsPikuCisKK05vdGU6IEd1ZXNzaW5nIGl0IG5vdCByZWxpYWJsZS4gUGxlYXNlIHNldCBDPExJQk9NUF9XT1JLPiBlbnZpcm9ubWVudCB2YXJpYWJsZSBhcHByb3ByaWF0ZWx5LgorCis9YmFjaworCis9aGVhZDEgRVhBTVBMRVMKKworPWhlYWQyIERldmVsb3BtZW50CisKK0J1aWxkIG5vcm1hbCAocGVyZm9ybWFuY2UpIGR5bmFtaWMgbGlicmFyeSBmb3IgZGVidWdnaW5nOgorCisgICAgJCBidWlsZC5wbCAtLWRlYnVnCisKK0J1aWxkIGFsbCBsaWJyYXJpZXMgKG5vcm1hbCwgc3R1YjsgZHluYW1pYyBSVEwpIGZvciBkZWJ1Z2dpbmc6CisKKyAgICAkIGJ1aWxkLnBsIC0tYWxsIC0tZGVidWcKKworRG8gYSBjbGVhbiBidWlsZCBmb3IgYWxsOgorCisgICAgJCBidWlsZC5wbCAtLWFsbCAtLWRlYnVnIGNsZWFuICYmIGJ1aWxkLnBsIC0tYWxsIC0tZGVidWcKKworRGVidWdnaW5nIGxpYnJhcmllcyBhcmUgc2F2ZWQgaW4gRjxleHBvcnRzL0k8cGxhdGZvcm0+LmRlYi8+LgorCis9aGVhZDIgUHJvbW90aW9uCisKKz1vdmVyCisKKz1pdGVtIDEKKworQ2xvYmJlciBldmVyeXRoaW5nOyBvbiBvbmUgbWFjaGluZToKKworICAgICQgYnVpbGQucGwgY2xvYmJlcgorCis9aXRlbSAyCisKK0J1aWxkIGNvbW1vbiBoZWFkZXJzLCBvbiBvbmUgbWFjaGluZToKKworICAgICQgYnVpbGQucGwgY29tbW9uCisKKz1pdGVtIDMKKworQnVpbGQgYWxsIHBsYXRmb3JtLWRlcGVuZGVudCBmaWxlcywgb24gYWxsIG1hY2hpbmVzOgorCisgICAgJCBidWlsZC5wbCAtLWFsbAorCis9aXRlbSA0CisKK0J1aWxkIE9TIFgqIHVuaXZlcnNhbCAoZmF0KSBsaWJyYXJpZXMsIG9uIEM8bWFjXzMyZT46CisKKyAgICAkIGJ1aWxkLnBsIGZhdAorCis9YmFjaworCis9Y3V0CisKKyMgZW5kIG9mIGZpbGUgIwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90b29scy9jaGVjay1kZXBlbmRzLnBsIGIvZmluYWwvcnVudGltZS90b29scy9jaGVjay1kZXBlbmRzLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNjZTExMWYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rvb2xzL2NoZWNrLWRlcGVuZHMucGwKQEAgLTAsMCArMSw0ODkgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKworIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgRmluZEJpbjsKK3VzZSBsaWIgIiRGaW5kQmluOjpCaW4vbGliIjsKKwordXNlIHRvb2xzOwordXNlIFBsYXRmb3JtICI6dmFycyI7CisKK291ciAkVkVSU0lPTiA9ICIwLjAwNSI7CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgT3VwdXQgcGFyc2UgZXJyb3IuCisjICAgICAkdG9vbCAtLSBOYW1lIG9mIHRvb2wuCisjICAgICBAYnVsayAtLSBPdXRwdXQgb2YgdGhlIHRvb2wuCisjICAgICAkbiAgICAtLSBOdW1iZXIgb2YgbGluZSBjYXVzZWQgcGFyc2UgZXJyb3IuCitzdWIgcGFyc2VfZXJyb3IoJFxAJCkgeworICAgIG15ICggJHRvb2wsICRidWxrLCAkbiApID0gQF87CisgICAgbXkgQGJ1bGs7CisgICAgZm9yICggbXkgJGkgPSAwOyAkaSA8IEAkYnVsazsgKysgJGkgKSB7CisgICAgICAgIHB1c2goIEBidWxrLCAoICRpID09ICRuID8gIj4+PiAiIDogIiAgICAiICkgLiAkYnVsay0+WyAkaSBdICk7CisgICAgfTsgIyBmb3IgJGkKKyAgICBydW50aW1lX2Vycm9yKCAiRmFpbCB0byBwYXJzZSAkdG9vbCBvdXRwdXQ6IiwgQGJ1bGssICIoZW9mKSIgKTsKK307ICMgc3ViIHBhcnNlX2Vycm9yCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMaW51eCogT1MgdmVyc2lvbiBvZiBnZXRfZGVwcygpIHBhcnNlcyBvdXRwdXQgb2YgbGRkOgorIworIyAkIGxkZCBsaWJuYW1lLnNvCisjICAgbGliYy5zby42ID0+IC9saWI2NC9saWJjLnNvLjYgKDB4MDAwMDJiNjBmZWRkODAwMCkKKyMgICBsaWJkbC5zby4yID0+IC9saWI2NC9saWJkbC5zby4yICgweDAwMDAyYjYwZmYxMmIwMDApCisjICAgbGlicHRocmVhZC5zby4wID0+IC9saWI2NC9saWJwdGhyZWFkLnNvLjAgKDB4MDAwMDJiNjBmZjMyZjAwMCkKKyMgICAvbGliNjQvbGQtbGludXgteDg2LTY0LnNvLjIgKDB4MDAwMDAwMzg3OTQwMDAwMCkKKyMKKyMgTm90ZTogbGRkIHByaW50ZCBhbGwgdGhlIGRlcGVuZGVuY2llcywgZGlyZWN0IGFuZCBpbmRpcmVjdC4gKEZvciBleGFtcGxlLCBpZiBzcGVjaWZpZWQgbGlicmFyeQorIyByZXF1aXJlcyBsaWJkbC5zbywgYW5kIGxpYmRsLnNvIHJlcXVpcmVzIC9saWIvbGQtbGludXguc28sIGxkZCBwcmludHMgYm90aCBsaWJkbC5zbyBhbmQKKyMgL2xpYi9sZC1saW51eC5zbykuIElmIHlvdSBkbyBub3Qgd2FudCBpbmRpcmVjdCBkZXBlbmRlbmNpZXMsIGxvb2sgYXQgcmVhZGVsZiB0b29sLgorIworc3ViIGdldF9kZXBzX2xkZCgkKSB7CisKKyAgICBteSAkbGliID0gc2hpZnQgKCBAXyApOworICAgIG15ICR0b29sID0gImxkZCI7CisgICAgbXkgQGJ1bGs7CisgICAgbXkgQGRlcHM7CisKKyAgICBleGVjdXRlKCBbICR0b29sLCAkbGliIF0sIC1zdGRvdXQgPT4gXEBidWxrICk7CisgICAgZGVidWcoIEBidWxrLCAiKGVvZikiICk7CisKKyAgICBmb3JlYWNoIG15ICRpICggMCAuLiBAYnVsayAtIDEgKSB7CisgICAgICAgIG15ICRsaW5lID0gJGJ1bGtbICRpIF07CisgICAgICAgIGlmICggJGxpbmUgIX4gbXteXHMqKD86KFtfYS16MC05ListL10qKVxzKz0+XHMrKT8oW19hLXowLTkuKy0vXSopXHMrXCgweFswLTlhLXpdKlwpJH1pICkgeworICAgICAgICAgICAgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBteSAkZGVwID0gKCBkZWZpbmVkKCAkMSApID8gJDEgOiAkMiApOworICAgICAgICBwdXNoKCBAZGVwcywgJGRlcCApOworICAgIH07ICMgZm9yZWFjaCAkaQorCisgICAgcmV0dXJuIEBkZXBzOworCit9OyAjIHN1YiBnZXRfZGVwc19sZGQKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEFub3RoZXIgTGludXgqIE9TIHZlcnNpb24gb2YgZ2V0X2RlcHMoKSBwYXJzZXMgb3V0cHV0IG9mIHJlYWRlbGY6CisjCisjICQgcmVhZGVsZiAtZCBleHBvcnRzL2xpbl8zMmUvbGliL2xpYmlvbXA1LnNvCisjCisjIER5bmFtaWMgc2VnbWVudCBhdCBvZmZzZXQgMHg4NzAwOCBjb250YWlucyAyNCBlbnRyaWVzOgorIyAgIFRhZyAgICAgICAgVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lL1ZhbHVlCisjICAweDAwMDAwMDAwMDAwMDAwMDEgKE5FRURFRCkgICAgICAgICAgICAgU2hhcmVkIGxpYnJhcnk6IFtsaWJjLnNvLjZdCisjICAweDAwMDAwMDAwMDAwMDAwMDEgKE5FRURFRCkgICAgICAgICAgICAgU2hhcmVkIGxpYnJhcnk6IFtsaWJkbC5zby4yXQorIyAgMHgwMDAwMDAwMDAwMDAwMDAxIChORUVERUQpICAgICAgICAgICAgIFNoYXJlZCBsaWJyYXJ5OiBbbGlicHRocmVhZC5zby4wXQorIyAgMHgwMDAwMDAwMDAwMDAwMDBlIChTT05BTUUpICAgICAgICAgICAgIExpYnJhcnkgc29uYW1lOiBbbGliaW9tcDUuc29dCisjICAweDAwMDAwMDAwMDAwMDAwMGQgKEZJTkkpICAgICAgICAgICAgICAgMHg1MWNhYQorIyAgMHgwMDAwMDAwMDAwMDAwMDA0IChIQVNIKSAgICAgICAgICAgICAgIDB4MTU4CisjICAweDAwMDAwMDAwMDAwMDAwMDUgKFNUUlRBQikgICAgICAgICAgICAgMHg5MzUwCisjICAuLi4KKyMKKyMgTm90ZTogSW4gY29udHJhc3QgdG8gbGRkLCByZWFkbGVmIHNob3dzIG9ubHkgZGlyZWN0IGRlcGVuZGVuY2llcy4KKyMKK3N1YiBnZXRfZGVwc19yZWFkZWxmKCQpIHsKKworICAgIG15ICRmaWxlID0gc2hpZnQgKCBAXyApOworICAgIG15ICR0b29sID0gInJlYWRlbGYiOworICAgIG15IEBidWxrOworICAgIG15IEBkZXBzOworCisgICAgZXhlY3V0ZSggWyAkdG9vbCwgIi1kIiwgJGZpbGUgXSwgLXN0ZG91dCA9PiBcQGJ1bGsgKTsKKyAgICBkZWJ1ZyggQGJ1bGssICIoZW9mKSIgKTsKKworICAgIG15ICRpID0gMDsKKyAgICAjIFBhcnNlIGhlYWRlci4KKyAgICAoICRpIDwgQGJ1bGsgYW5kICRidWxrWyAkaSBdID1+IG17XlxzKiR9ICkKKyAgICAgICAgb3IgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsKKyAgICArKyAkaTsKKyAgICBpZiAoICRpID09IEBidWxrIC0gMSBhbmQgJGJ1bGtbICRpIF0gPX4gbXteVGhlcmUgaXMgbm8gZHluYW1pYyBzZWN0aW9uIGluIHRoaXMgZmlsZVwuXHMqJH0gKSB7CisgICAgICAgICMgVGhpcyBpcyBub3QgZHluYW1pYyBleGVjdXRhYmxlID0+IG5vIGRlcGVuZGVuY2llcy4KKyAgICAgICAgcmV0dXJuIEBkZXBzOworICAgIH07ICMgaWYKKyAgICAoICRpIDwgQGJ1bGsgYW5kICRidWxrWyAkaSBdID1+IG17XkR5bmFtaWMgKD86c2VnbWVudHxzZWN0aW9uKSBhdCBvZmZzZXQgMHhbMC05YS1mXSsgY29udGFpbnMgXGQrIGVudHJpZXM6XHMqJH0gKQorICAgICAgICBvciBwYXJzZV9lcnJvciggJHRvb2wsIEBidWxrLCAkaSApOworICAgICsrICRpOworICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXteXHMqVGFnXHMrVHlwZVxzK05hbWUvVmFsdWVccyokfSApCisgICAgICAgIG9yIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7CisgICAgKysgJGk7CisgICAgIyBQYXJzZSBib2R5LgorICAgIHdoaWxlICggJGkgPCBAYnVsayApIHsKKyAgICAgICAgbXkgJGxpbmUgPSAkYnVsa1sgJGkgXTsKKyAgICAgICAgaWYgKCAkbGluZSAhfiBte15ccyoweFswLTlhLWZdK1xzK1woKFtfQS1aMC05XSspXClccysoLiopXHMqJH1pICkgeworICAgICAgICAgICAgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBteSAoICR0eXBlLCAkdmFsdWUgKSA9ICggJDEsICQyICk7CisgICAgICAgIGlmICggJHR5cGUgZXEgIk5FRURFRCIgKSB7CisgICAgICAgICAgICBpZiAoICR2YWx1ZSAhfiBte1xBU2hhcmVkIGxpYnJhcnk6IFxbKC4qKVxdXHp9ICkgeworICAgICAgICAgICAgICAgIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICBteSAkZGVwID0gJDE7CisgICAgICAgICAgICBwdXNoKCBAZGVwcywgJGRlcCApOworICAgICAgICB9OyAjIGlmCisgICAgICAgICsrICRpOworICAgIH07ICMgZm9yZWFjaCAkaQorCisgICAgcmV0dXJuIEBkZXBzOworCit9OyAjIHN1YiBnZXRfZGVwc19yZWFkZWxmCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBPUyBYKiB2ZXJzaW9uIG9mIGdldF9kZXBzKCkgcGFyc2VzIG91dHB1dCBvZiBvdG9vbDoKKyMKKyMgJCBvdG9vbCAtTCBsaWJuYW1lLmR5bGliCisjIGV4cG9ydHMvbWFjXzMyL2xpYi50aGluL2xpYmlvbXA1LmR5bGliOgorIyAgICAgICAgbGliaW9tcDUuZHlsaWIgKGNvbXBhdGliaWxpdHkgdmVyc2lvbiA1LjAuMCwgY3VycmVudCB2ZXJzaW9uIDUuMC4wKQorIyAgICAgICAgL3Vzci9saWIvbGliU3lzdGVtLkIuZHlsaWIgKGNvbXBhdGliaWxpdHkgdmVyc2lvbiAxLjAuMCwgY3VycmVudCB2ZXJzaW9uIDg4LjEuMykKKyMKK3N1YiBnZXRfZGVwc19vdG9vbCgkKSB7CisKKyAgICBteSAkZmlsZSA9IHNoaWZ0ICggQF8gKTsKKyAgICBteSAkbmFtZSA9IGdldF9maWxlKCAkZmlsZSApOworICAgIG15ICR0b29sID0gIm90b29sIjsKKyAgICBteSBAYnVsazsKKyAgICBteSBAZGVwczsKKworICAgIGlmICggJHRhcmdldF9hcmNoIGVxICIzMmUiICkgeworICAgICAgICAjIE9uIG9sZGVyIChUaWdlcikgc3lzdGVtcyBvdG9vbCBkb2VzIG5vdCByZWNvZ25pemUgNjQtYml0IGJpbmFyaWVzLCBzbyB0cnkgdG8gbG9jYXRlCisgICAgICAgICMgb3Rvb2w2NC4KKyAgICAgICAgbXkgJHBhdGggPSB3aGljaCggIm90b29sNjQiICk7CisgICAgICAgIGlmICggZGVmaW5lZCAoICRwYXRoICkgKSB7CisgICAgICAgICAgICAkdG9vbCA9ICJvdG9vbDY0IjsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKworICAgIGV4ZWN1dGUoIFsgJHRvb2wsICItTCIsICRmaWxlIF0sIC1zdGRvdXQgPT4gXEBidWxrICk7CisgICAgZGVidWcoIEBidWxrLCAiKGVvZikiICk7CisKKyAgICBteSAkaSA9IDA7CisgICAgIyBQYXJzZSB0aGUgZmlyc3Qgb25lIG9yIHR3byBsaW5lcyBzZXBhcmF0ZWx5LgorICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXteXFEkZmlsZVxFOiR9ICkKKyAgICAgICAgb3IgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsKKyAgICArKyAkaTsKKyAgICBpZiAoICRuYW1lID1+IG17XC5keWxpYlx6fSApIHsKKyAgICAgICAgIyBJbiBjYXNlIG9mIGR5bmFtaWMgbGlicmFyeSBvdG9vbCBwcmludCB0aGUgbGlicmFyeSBpdHNlbGYgYXMgYSBkZXBlbmRlbnQgbGlicmFyeS4KKyAgICAgICAgKCAkaSA8IEBidWxrIGFuZCAkYnVsa1sgJGkgXSA9fiBte15ccytcUSRuYW1lXEVccytcKGNvbXBhdGliaWxpdHkgdmVyc2lvbi4qXCkkfSApCisgICAgICAgICAgICBvciBwYXJzZV9lcnJvciggJHRvb2wsIEBidWxrLCAkaSApOworICAgICAgICArKyAkaTsKKyAgICB9OyAjIGlmCisKKyAgICAjIFRoZW4gcGFyc2UgdGhlIHJlc3QuCisgICAgd2hpbGUgKCAkaSA8IEBidWxrICkgeworICAgICAgICBteSAkbGluZSA9ICRidWxrWyAkaSBdOworICAgICAgICBpZiAoICRsaW5lICF+IG0vXlxzKiguKilccytcKGNvbXBhdGliaWxpdHkgdmVyc2lvblxzLipcKSQvICkgeworICAgICAgICAgICAgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBteSAoICRkZXAgKSA9ICggJDEgKTsKKyAgICAgICAgcHVzaCggQGRlcHMsICRkZXAgKTsKKyAgICAgICAgKysgJGk7CisgICAgfTsgIyB3aGlsZQorCisgICAgcmV0dXJuIEBkZXBzOworCit9OyAjIHN1YiBnZXRfZGVwc19vdG9vbAorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgV2luZG93cyogT1MgdmVyc2lvbiBvZiBnZXRfZGVwcygpIHBhcnNlcyBvdXRwdXQgb2YgbGluazoKKyMKKyMgPiBsaW5rIC1kdW1wIC1kZXBlbmRlbnRzIGxpYm5hbWUuZGxsCisjIE1pY3Jvc29mdCAoUikgQ09GRi9QRSBEdW1wZXIgVmVyc2lvbiA4LjAwLjQwMzEwLjM5CisjIENvcHlyaWdodCAoQykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgRHVtcCBvZiBmaWxlIFM6XFByb2plY3RzLk9NUFx1c2Vyc1xvbWFseXNoZVxvbXBcbGlib21wXGV4cG9ydHNcd2luXzY0XGxpYlxsaWJpb21wNW1kLmRsbAorIyBGaWxlIFR5cGU6IERMTAorIyAgIEltYWdlIGhhcyB0aGUgZm9sbG93aW5nIGRlcGVuZGVuY2llczoKKyMgICAgIEtFUk5FTDMyLmRsbAorIyAgIFN1bW1hcnkKKyMgICAgICAgICBDMDAwIC5kYXRhCisjICAgICAgICAgNjAwMCAucGRhdGEKKyMgICAgICAgIDE4MDAwIC5yZGF0YQorIyAgICAgICAgLi4uCisjCisjID4gbGluayAtZHVtcCAtZGlyZWN0aXZlcyBsaWJuYW1lLmxpYgorIyBNaWNyb3NvZnQgKFIpIENPRkYvUEUgRHVtcGVyIFZlcnNpb24gOC4wMC40MDMxMC4zOQorIyBDb3B5cmlnaHQgKEMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIER1bXAgb2YgZmlsZSBTOlxQcm9qZWN0cy5PTVBcdXNlcnNcb21hbHlzaGVcb21wXGxpYm9tcFxleHBvcnRzXHdpbl8zMmVcbGliXGxpYmltcDVtdC5saWIKKyMgRmlsZSBUeXBlOiBMSUJSQVJZCisjICAgTGlua2VyIERpcmVjdGl2ZXMKKyMgICAtLS0tLS0tLS0tLS0tLS0tLQorIyAgIC1kZWZhdWx0bGliOiJ1dWlkLmxpYiIKKyMgICAtZGVmYXVsdGxpYjoidXVpZC5saWIiCisjICAgLi4uLi4KKyMgICBTdW1tYXJ5CisjICAgICAgIDMyNTAgLmJzcworIyAgICAgICAzRkJDIC5kYXRhCisjICAgICAgICAgMzQgLmRhdGExCisjICAgICAgIC4uLi4KK3N1YiBnZXRfZGVwc19saW5rKCQpIHsKKworICAgIG15ICggJGxpYiApID0gQF87CisgICAgbXkgJHRvb2wgPSAibGluayI7CisgICAgbXkgQGJ1bGs7CisgICAgbXkgQGRlcHM7CisKKyAgICBteSAkZXh0ID0gbGMoIGdldF9leHQoICRsaWIgKSApOworICAgIGlmICggJGV4dCAhfiBte1xBXC4oPzpsaWJ8ZGxsfGV4ZSlcen1pICkgeworICAgICAgICBydW50aW1lX2Vycm9yKCAiSW5jb3JyZWN0IGZpbGUgaXMgc3BlY2lmaWVkOiBgJGxpYic7IG9ubHkgYGxpYicsIGBkbGwnIG9yIGBleGUnIGZpbGUgZXhwZWN0ZWQiICk7CisgICAgfTsgIyBpZgorCisgICAgZXhlY3V0ZSgKKyAgICAgICAgWyAkdG9vbCwgIi9kdW1wIiwgKCAkZXh0IGVxICIubGliIiA/ICIvZGlyZWN0aXZlcyIgOiAiL2RlcGVuZGVudHMiICksICRsaWIgXSwKKyAgICAgICAgLXN0ZG91dCA9PiBcQGJ1bGsKKyAgICApOworCisgICAgZGVidWcoIEBidWxrLCAiKGVvZikiICk7CisKKyAgICBteSAkaSA9IDA7CisgICAgKCAkaSA8IEBidWxrIGFuZCAkYnVsa1sgJGkgXSA9fiBte15NaWNyb3NvZnQgXChSXCkgQ09GRlwvUEUgRHVtcGVyIFZlcnNpb24uKiR9ICkgb3IgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsgKysgJGk7CisgICAgKCAkaSA8IEBidWxrIGFuZCAkYnVsa1sgJGkgXSA9fiBte15Db3B5cmlnaHQgXChDXCkgTWljcm9zb2Z0IENvcnBvcmF0aW9uXC4uKiR9ICkgb3IgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsgKysgJGk7CisgICAgKCAkaSA8IEBidWxrIGFuZCAkYnVsa1sgJGkgXSA9fiBte15ccyokfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgb3IgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsgKysgJGk7CisgICAgKCAkaSA8IEBidWxrIGFuZCAkYnVsa1sgJGkgXSA9fiBte15ccyokfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgb3IgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsgKysgJGk7CisgICAgKCAkaSA8IEBidWxrIGFuZCAkYnVsa1sgJGkgXSA9fiBte15EdW1wIG9mIGZpbGVcc1xRJGxpYlxFJH0gICAgICAgICAgICAgICAgICAgICkgb3IgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsgKysgJGk7CisgICAgKCAkaSA8IEBidWxrIGFuZCAkYnVsa1sgJGkgXSA9fiBte15ccyokfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgb3IgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsgKysgJGk7CisgICAgKCAkaSA8IEBidWxrIGFuZCAkYnVsa1sgJGkgXSA9fiBte15GaWxlIFR5cGU6XHMoLiopJH0gICAgICAgICAgICAgICAgICAgICAgICAgICkgb3IgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsgKysgJGk7CisgICAgKCAkaSA8IEBidWxrIGFuZCAkYnVsa1sgJGkgXSA9fiBte15ccyokfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgb3IgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsgKysgJGk7CisKKyAgICBpZiAoICRleHQgZXEgIi5saWIiICkgeworCisgICAgICAgIG15ICVkZXBzOworICAgICAgICB3aGlsZSAoICRpIDwgQGJ1bGsgKSB7CisgICAgICAgICAgICBteSAkbGluZSA9ICRidWxrWyAkaSBdOworICAgICAgICAgICAgaWYgKCAwICkgeworICAgICAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XlxzKlstL11kZWZhdWx0bGliXDooLiopXHMqJH1pICkgeworICAgICAgICAgICAgICAgIG15ICRkZXAgPSAkMTsKKyAgICAgICAgICAgICAgICAjIE5vcm1hbGl6ZSBsaWJyYXJ5IG5hbWU6CisgICAgICAgICAgICAgICAgJGRlcCA9IGxjKCAkMSApOyAgICAgICAgICAgICAgIyBDb252ZXJ0IHRvIGxvd2VyIGNhc2UuCisgICAgICAgICAgICAgICAgJGRlcCA9fiBze1xBIiguKikiXHp9eyQxfTsgICAgIyBEcm9wIHN1cnJvdW5kaW5nIHF1b3RlcyAoaWYgYW55KS4KKyAgICAgICAgICAgICAgICAkZGVwID1+IHN7XC5saWJcen17fTsgICAgICAgICAjIERyb3AgLmxpYiBzdWZmaXggKGlmIGFueSkuCisgICAgICAgICAgICAgICAgJGRlcHN7ICRkZXAgfSA9IDE7CisgICAgICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteXHMqTGlua2VyIERpcmVjdGl2ZXNccyokfSApIHsKKyAgICAgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccyotK1xzKiR9ICkgeworICAgICAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XlxzKi9hbHRlcm5hdGVuYW1lXDouKiR9ICkgeworICAgICAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XlxzKiR9ICkgeworICAgICAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XlxzKlN1bW1hcnlccyokfSApIHsKKyAgICAgICAgICAgICAgICBsYXN0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwYXJzZV9lcnJvciggJHRvb2wsIEBidWxrLCAkaSApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgKysgJGk7CisgICAgICAgIH0gIyB3aGlsZQorICAgICAgICBAZGVwcyA9IGtleXMoICVkZXBzICk7CisKKyAgICB9IGVsc2UgeworCisgICAgICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXtccypJbWFnZSBoYXMgdGhlIGZvbGxvd2luZyBkZXBlbmRlbmNpZXNcOiR9ICkKKyAgICAgICAgICAgIG9yIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7CisgICAgICAgICsrICRpOworICAgICAgICB3aGlsZSAoICRpIDwgQGJ1bGsgKSB7CisgICAgICAgICAgICBteSAkbGluZSA9ICRidWxrWyAkaSBdOworICAgICAgICAgICAgaWYgKCAwICkgeworICAgICAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XlxzKiR9ICkgeworICAgICAgICAgICAgICAgICMgSWdub3JlIGVtcHR5IGxpbmVzLgorICAgICAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XlxzKiguKlwuZGxsKSR9aSApIHsKKyAgICAgICAgICAgICAgICBteSAkZGVwID0gbGMoICQxICk7CisgICAgICAgICAgICAgICAgcHVzaCggQGRlcHMsICRkZXAgKTsKKyAgICAgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccypTdW1tYXJ5JH0gKSB7CisgICAgICAgICAgICAgICAgbGFzdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICsrICRpOworICAgICAgICB9OyAjIHdoaWxlCisKKyAgICB9OyAjIGlmCisKKyAgICByZXR1cm4gQGRlcHM7CisKK307ICMgc3ViIGdldF9kZXBzX2xpbmsKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE1haW4uCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgUGFyc2UgY29tbWFuZCBsaW5lLgorbXkgJGV4cGVjdGVkOworbXkgJGJhcmU7CitHZXRvcHQ6Okxvbmc6OkNvbmZpZ3VyZSggInBlcm11dGUiICk7CitnZXRfb3B0aW9ucygKKyAgICBQbGF0Zm9ybTo6dGFyZ2V0X29wdGlvbnMoKSwKKyAgICAiYmFyZSIgICAgICAgPT4gXCRiYXJlLAorICAgICJleHBlY3RlZD1zIiA9PiBcJGV4cGVjdGVkLAorKTsKK215IEBleHBlY3RlZDsKK2lmICggZGVmaW5lZCggJGV4cGVjdGVkICkgKSB7CisgICAgaWYgKCAkZXhwZWN0ZWQgbmUgIm5vbmUiICkgeworICAgICAgICBAZXhwZWN0ZWQgPSBzb3J0KCBzcGxpdCggIiwiLCAkZXhwZWN0ZWQgKSApOworICAgICAgICBpZiAoICR0YXJnZXRfb3MgZXEgIndpbiIgKSB7CisgICAgICAgICAgICBAZXhwZWN0ZWQgPSBtYXAoIGxjKCAkXyApLCBAZXhwZWN0ZWQgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKK307ICMgaWYKK2lmICggQEFSR1YgPCAxICkgeworICAgIGNtZGxpbmVfZXJyb3IoICJTcGVjaWZ5IGEgbGlicmFyeSBuYW1lIHRvIGNoZWNrIGZvciBkZXBlbmRlbmNpZXMiICk7Cit9OyAjIGlmCitpZiAoIEBBUkdWID4gMSApIHsKKyAgICBjbWRsaW5lX2Vycm9yKCAiVG9vIG1hbnkgYXJndW1lbnRzIiApOworfTsgIyBpZgorbXkgJGxpYiA9IHNoaWZ0KCBAQVJHViApOworaWYgKCBub3QgLWUgJGxpYiApeworICAgIHJ1bnRpbWVfZXJyb3IoICJTcGVjaWZpZWQgZmlsZSBkb2VzIG5vdCBleGlzdDogXCIkbGliXCIiICk7Cit9OyAjIGlmCisKKyMgU2VsZWN0IGFwcHJvcHJpYXRlIGdldF9kZXBzIGltcGxlbWVudGF0aW9uLgoraWYgKCAwICkgeworfSBlbHNpZiAoICR0YXJnZXRfb3MgZXEgImxpbiIgb3IgJHRhcmdldF9vcyBlcSAibHJiIiApIHsKKyAgICAqZ2V0X2RlcHMgPSBcKmdldF9kZXBzX3JlYWRlbGY7Cit9IGVsc2lmICggJHRhcmdldF9vcyBlcSAibWFjIiApIHsKKyAgICAqZ2V0X2RlcHMgPSBcKmdldF9kZXBzX290b29sOworfSBlbHNpZiAoICR0YXJnZXRfb3MgZXEgIndpbiIgKSB7CisgICAgKmdldF9kZXBzID0gXCpnZXRfZGVwc19saW5rOworfSBlbHNlIHsKKyAgICBydW50aW1lX2Vycm9yKCAiT1MgXCIkdGFyZ2V0X29zXCIgbm90IHN1cHBvcnRlZCIgKTsKK307ICMgaWYKKworIyBEbyB0aGUgd29yay4KK215IEBkZXBzID0gc29ydCggZ2V0X2RlcHMoICRsaWIgKSApOworaWYgKCAkYmFyZSApIHsKKyAgICBwcmludCggbWFwKCAiJF9cbiIsIEBkZXBzICkgKTsKK30gZWxzZSB7CisgICAgaW5mbyggIkRlcGVuZGVuY2llczoiLCBAZGVwcyA/IG1hcCggIiAgICAkXyIsIEBkZXBzICkgOiAiKG5vbmUpIiApOworfTsgIyBpZgoraWYgKCBkZWZpbmVkKCAkZXhwZWN0ZWQgKSApIHsKKyAgICBteSAlZGVwcyA9IG1hcCggKCAkXyA9PiAxICksIEBkZXBzICk7CisgICAgZm9yZWFjaCBteSAkZGVwICggQGV4cGVjdGVkICkgeworICAgICAgICBkZWxldGUoICRkZXBzeyAkZGVwIH0gKTsKKyAgICB9OyAjIGZvcmVhY2gKKyAgICBteSBAdW5leHBlY3RlZCA9IHNvcnQoIGtleXMoICVkZXBzICkgKTsKKyAgICBpZiAoIEB1bmV4cGVjdGVkICkgeworICAgICAgICBydW50aW1lX2Vycm9yKCAiVW5leHBlY3RlZCBkZXBlbmRlbmNpZXM6IiwgbWFwKCAiICAgICRfIiwgQHVuZXhwZWN0ZWQgKSApOworICAgIH07ICMgaWYKK307ICMgaWYKKworZXhpdCggMCApOworCitfX0VORF9fCisKKz1wb2QKKworPWhlYWQxIE5BTUUKKworQjxjaGVjay1kZXBlbmRzLnBsPiAtLSBDaGVjayBkZXBlbmRlbmNpZXMgZm9yIGEgc3BlY2lmaWVkIGxpYnJhcnkuCisKKz1oZWFkMSBTWU5PUFNJUworCitCPGNoZWNrLWRlcGVuZHMucGw+IEk8T1BUSU9OUz4uLi4gSTxsaWJyYXJ5PgorCis9aGVhZDEgREVTQ1JJUFRJT04KKworQzxjaGVjay1kZXBlbmRzLnBsPiBmaW5kcyBkaXJlY3QgZGVwZW5kZW5jaWVzIGZvciBhIHNwZWNpZmllZCBsaWJyYXJ5LiBMaXN0IG9mIGFjdHVhbCBkZXBlbmRlbmNpZXMKK2lzIHNvcnRlZCBhbHBoYWJldGljYWxseSBhbmQgcHJpbnRlZC4gSWYgbGlzdCBvZiBleHBlY3RlZCBkZXBlbmRlbmNpZXMgaXMgc3BlY2lmaWVkLCB0aGUgc2NyaXB0cworY2hlY2tzIHRoZSBsaWJyYXJ5IGhhcyBvbmx5IGFsbG93ZWQgZGVwZW5kZW5jaWVzLiBJbiBjYXNlIG9mIG5vdCBleHBlY3RlZCBkZXBuZGVuY2llcyB0aGUgc2NyaXB0Citpc3N1ZXMgZXJyb3IgbWVzc2FnZSBhbmQgZXhpdHMgd2l0aCBub24temVybyBjb2RlLgorCitMaW51eCogT1MgYW5kIE9TIFgqOiBUaGUgc2NyaXB0IGZpbmRzIGRlcGVuZGVuY2llcyBvbmx5IGZvciBkeW1hbWljIGxpYnJhcmllcy4gV2luZG93cyogT1M6IFRoZSBzY3JpcHQKK2ZpbmRzIGRlcGVuZGVuY2llcyBmb3IgZWl0aGVyIHN0YXRpYyBvciBkeW1hbWljIGxpYnJhcmllcy4KKworVGhlIHNjcmlwdCB1c2VzIGV4dGVybmFsIHRvb2xzLiBPbiBMaW51eCogT1MsIGl0IHJ1bnMgRjxyZWFkZWxmPiwgb24gT1MgWCogLS0gRjxvdG9vbD4gKG9yIEY8b3Rvb2w2ND4pLAorb24gV2luZG93cyogT1MgLS0gRjxsaW5rPi4KKworT24gV2luZG93cyogT1MgZGVwZW5kZW5jaWVzIGFyZSBwcmludGVkIGluIGxvd2VyIGNhc2UsIGNhc2Ugb2YgZXhwZWN0ZWQgZGVwZW5kZW5jaWVzIGlnbm9yZWQuCisKKz1oZWFkMSBPUFRJT05TCisKKz1vdmVyCisKKz1pdGVtIEI8LS1iYXJlPgorCitEbyBub3QgdXNlIGZhbmN5IGZvcm1hdHRpbmc7IHByb2R1Y2UgcGxhaW4sIGJhcmUgb3V0cHV0OiBqdXN0IGEgbGlzdCBvZiBsaWJyYXJpZXMsCithIGxpYnJhcnkgcGVyIGxpbmUuCisKKz1pdGVtIEI8LS1leHBlY3RlZD0+STxsaXN0PgorCitJPGxpc3Q+IGlzIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGV4cGVjdGVkIGRlcGVuZGVuY2llcyAob3IgQzxub25lPikuCitJZiBDPC0tZXhwZWN0ZWQ+IG9wdGlvbiBzcGVjaWZpZWQsIEM8Y2hlY2stZGVwZW5kcy5wbD4gY2hlY2tzIHRoZSBzcGVjaWZpZWQgbGlicmFyeQoraGFzIG9ubHkgZXhwZWN0ZWQgZGVwZW5kZW5jaWVzLgorCis9aXRlbSBCPC0tb3M9Pkk8c3RyPgorCitTcGVjaWZ5IHRhcmdldCBPUyAodG9vbCB0byB1c2UpIG1hbnVhbGx5LgorVXNlZnVsIGZvciBjcm9zcy1idWlsZCwgd2hlbiBob3N0IE9TIGlzIG5vdCB0aGUgc2FtZSBhcyB0YXJnZXQgT1MuCitJPHN0cj4gc2hvdWxkIGJlIGVpdGhlciBDPGxpbj4sIEM8bWFjPiwgb3IgQzx3aW4+LgorCis9YmFjaworCis9aGVhZDIgU3RhbmRhcmQgT3B0aW9ucworCis9b3ZlcgorCis9aXRlbSBCPC0taGVscD4KKworUHJpbnQgc2hvcnQgaGVscCBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0tZG9jPgorCis9aXRlbSBCPC0tbWFudWFsPgorCitQcmludCBmdWxsIGRvY3VtZW50YXRpb24gYW5kIGV4aXQuCisKKz1pdGVtIEI8LS1xdWlldD4KKworRG8gbm90IG91dHB1dCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLgorCis9aXRlbSBCPC0tdmVyc2lvbj4KKworUHJpbnQgdmVyc2lvbiBhbmQgZXhpdC4KKworPWJhY2sKKworPWhlYWQxIEFSR1VNRU5UUworCis9b3ZlcgorCis9aXRlbSBJPGxpYnJhcnk+CisKK0EgbmFtZSBvZiBsaWJyYXJ5IHRvIGZpbmQgb3IgY2hlY2sgZGVwZW5kZW5jaWVzLgorCis9YmFjaworCis9aGVhZDEgRVhBTVBMRVMKKworSnVzdCBwcmludCBsaWJyYXJ5IGRlcGVuZGVuY2llcyAoV2luZG93cyogT1MpOgorCisgICAgPiBjaGVjay1kZXBlbmRzLnBsIGV4cG9ydHMvd2luXzMyL2xpYi9saWJpb21wNS5kbGwKKyAgICBjaGVjay1kZXBlbmRzLnBsOiAoaSkgRGVwZW5kZW5jaWVzOgorICAgIGNoZWNrLWRlcGVuZHMucGw6IChpKSAgICAga2VybmVsMzIuZGxsCisKK1ByaW50IGxpYnJhcnkgZGVwZW5kZW5jaWVzLCB1c2UgYmFyZSBvdXRwdXQgKExpbnV4KiBPUyk6CisKKyAgICAkIGNoZWNrLWRlcGVuZHMucGwgLS1iYXJlIGV4cG9ydHMvbGluXzMyZS9saWIvbGlib21wX2RiLnNvCisgICAgbGliYy5zby42CisgICAgbGliZGwuc28uMgorICAgIGxpYnB0aHJlYWQuc28uMAorCitDaGVjayB0aGUgbGlicmFyeSBkb2VzIG5vdCBoYXZlIGFueSBkZXBlbmRlbmNpZXMgKE9TIFgqKToKKworICAgICQgY2hlY2stZGVwZW5kcy5wbCAtLWV4cGVjdGVkPW5vbmUgZXhwb3J0cy9tYWNfMzIvbGliL2xpYmlvbXA1LmR5bGliCisgICAgY2hlY2stZGVwZW5kcy5wbDogKGkpIERlcGVuZGVuY2llczoKKyAgICBjaGVjay1kZXBlbmRzLnBsOiAoaSkgICAgIC91c3IvbGliL2xpYlN5c3RlbS5CLmR5bGliCisgICAgY2hlY2stZGVwZW5kcy5wbDogKHgpIFVuZXhwZWN0ZWQgZGVwZW5kZW5jaWVzOgorICAgIGNoZWNrLWRlcGVuZHMucGw6ICh4KSAgICAgL3Vzci9saWIvbGliU3lzdGVtLkIuZHlsaWIKKyAgICAkIGVjaG8gJD8KKyAgICAyCisKKz1jdXQKKworIyBlbmQgb2YgZmlsZSAjCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdG9vbHMvY2hlY2stZXhlY3N0YWNrLnBsIGIvZmluYWwvcnVudGltZS90b29scy9jaGVjay1leGVjc3RhY2sucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjE0MTdjNwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvY2hlY2stZXhlY3N0YWNrLnBsCkBAIC0wLDAgKzEsMTM4IEBACisjIS91c3IvYmluL3BlcmwKKworIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgRmluZEJpbjsKK3VzZSBsaWIgIiRGaW5kQmluOjpCaW4vbGliIjsKKwordXNlIHRvb2xzOworCitvdXIgJFZFUlNJT04gPSAiMC4wMDIiOworCitzdWIgZXhlY3N0YWNrKCQpIHsKKyAgICBteSAoICRmaWxlICkgPSBAXzsKKyAgICBteSBAb3V0cHV0OworICAgIG15IEBzdGFjazsKKyAgICBleGVjdXRlKCBbICJyZWFkZWxmIiwgIi1sIiwgIi1XIiwgJGZpbGUgXSwgLXN0ZG91dCA9PiBcQG91dHB1dCApOworICAgIEBzdGFjayA9IGdyZXAoICRfID1+IG17XEFccyooPzpHTlVfKT9TVEFDS1xzK30sIEBvdXRwdXQgKTsKKyAgICBpZiAoIG5vdCBAc3RhY2sgKSB7CisgICAgICAgICMgSW50ZXJwcmV0IG1pc3NlZCAiU1RBQ0siIGxpbmUgYXMgZXJyb3IuCisgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkZmlsZTogTm8gc3RhY2sgc2VnbWVudCBmb3VuZDsgbG9va3MgbGlrZSBzdGFjayB3b3VsZCBiZSBleGVjdXRhYmxlLiIgKTsKKyAgICB9OyAjIGlmCisgICAgaWYgKCBAc3RhY2sgPiAxICkgeworICAgICAgICBydW50aW1lX2Vycm9yKCAiJGZpbGU6IE1vcmUgdGhhbiBvbmUgc3RhY2sgc2VnbWVudCBmb3VuZC4iLCAicmVhZGVsZiBvdXRwdXQ6IiwgQG91dHB1dCwgIihlb2YpIiApOworICAgIH07ICMgaWYKKyAgICAjIFR5cGljYWwgc3RhY2sgbGluZXMgYXJlOgorICAgICMgTGludXgqIE9TIElBLTMyIGFyY2hpdGVjdHVyZToKKyAgICAjICAgIEdOVV9TVEFDSyAgICAgIDB4MDAwMDAwIDB4MDAwMDAwMDAgMHgwMDAwMDAwMCAweDAwMDAwIDB4MDAwMDAgUldFIDB4NAorICAgICMgTGludXgqIE9TIEludGVsKFIpIDY0OgorICAgICMgICAgR05VX1NUQUNLICAgICAgMHgwMDAwMDAgMHgwMDAwMDAwMDAwMDAwMDAwIDB4MDAwMDAwMDAwMDAwMDAwMCAweDAwMDAwMCAweDAwMDAwMCBSV0UgMHg4CisgICAgaWYgKCAkc3RhY2tbIDAgXSAhfiBte1xBXHMqKD86R05VXyk/U1RBQ0soPzpccysweFswLTlhLWZdKyl7NX1ccysoW1IgXVtXIF1bRSBdKVxzKzB4WzAtOWEtZl0rXHMqXHp9ICkgeworICAgICAgICBydW50aW1lX2Vycm9yKCAiJGZpbGU6IENhbm5vdCBwYXJzZSBzdGFjayBzZWdtZW50IGxpbmU6IiwgIj4+PiAkc3RhY2tbIDAgXSIgKTsKKyAgICB9OyAjIGlmCisgICAgbXkgJGF0dHJzID0gJDE7CisgICAgaWYgKCAkYXR0cnMgPX4gbXtFfSApIHsKKyAgICAgICAgcnVudGltZV9lcnJvciggIiRmaWxlOiBTdGFjayBpcyBleGVjdXRhYmxlIiApOworICAgIH07ICMgaWYKK307ICMgc3ViIGV4ZWNzdGFjaworCitnZXRfb3B0aW9ucygKKyk7CisKK2ZvcmVhY2ggbXkgJGZpbGUgKCBAQVJHViApIHsKKyAgICBleGVjc3RhY2soICRmaWxlICk7Cit9OyAjIGZvcmVhY2ggJGZpbGUKKworZXhpdCggMCApOworCitfX0VORF9fCisKKz1wb2QKKworPWhlYWQxIE5BTUUKKworQjxjaGVjay1leGVjc3RhY2sucGw+IC0tIENoZWNrIHdoZXRoZXIgc3RhY2sgaXMgZXhlY3V0YWJsZSwgaXNzdWUgYW4gZXJyb3IgaWYgc28uCisKKz1oZWFkMSBTWU5PUFNJUworCitCPGNoZWNrLWV4ZWNzdGFjay5wbD4gSTxvcHRpaW9uPi4uLiBJPGZpbGU+Li4uCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGUgc2NyaXB0IGNoZWNrcyB3aGV0aGVyIHN0YWNrIG9mIHNwZWNpZmllZCBleGVjdXRhYmxlIGZpbGUsIGFuZCBpc3N1ZXMgZXJyb3IgaWYgc3RhY2sgaXMKK2V4ZWN1dGFibGUuIElmIHN0YWNrIGlzIG5vdCBleGVjdXRhYmxlLCB0aGUgc2NyaXB0IGV4aXRzIHNpbGVudGx5IHdpdGggemVybyBleGl0IGNvZGUuCisKK1RoZSBzY3JpcHQgcnVucyBDPHJlYWRlbGY+IHV0aWxpdHkgdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IHNwZWNpZmllZCBleGVjdXRhYmxlIGZpbGUuIFNvLCB0aGUKK3NjcmlwdCBmYWlscyBpZiBDPHJlYWRlbGY+IGlzIG5vdCBhdmFpbGFibGUuIEVmZmVjdGl2ZWx5IGl0IG1lYW5zIHRoZSBzY3JpcHQgd29ya3Mgb25seSBvbiBMaW51eCogT1MKKyhhbmQsIHByb2JhYmx5LCBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUpLgorCis9aGVhZDEgT1BUSU9OUworCis9b3ZlcgorCis9aXRlbSBTdGFuZGFyZCBPcHRpb25zCisKKz1vdmVyCisKKz1pdGVtIEI8LS1kb2M+CisKKz1pdGVtIEI8LS1tYW51YWw+CisKK1ByaW50IGZ1bGwgaGVscCBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0taGVscD4KKworUHJpbnQgc2hvcnQgaGVscCBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0tdXNhZ2U+CisKK1ByaW50IHZlcnkgc2hvcnQgdXNhZ2UgbWVzc2FnZSBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLXZlcmJvc2U+CisKK0RvIHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMuCisKKz1pdGVtIEI8LS12ZXJzaW9uPgorCitQcmludCBwcm9ncmFtIHZlcnNpb24gYW5kIGV4aXQuCisKKz1pdGVtIEI8LS1xdWlldD4KKworV29yayBxdWlldCwgZG8gbm90IHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMuCisKKz1iYWNrCisKKz1iYWNrCisKKz1oZWFkMSBBUkdVTUVOVFMKKworPW92ZXIKKworPWl0ZW0gSTxmaWxlPgorCitBIG5hbWUgb2YgZXhlY3V0YWJsZSBvciBzaGFyZWQgb2JqZWN0IHRvIGNoZWNrLiBNdWx0aXBsZSBmaWxlcyBtYXkgYmUgc3BlY2lmaWVkLgorCis9YmFjaworCis9aGVhZDEgRVhBTVBMRVMKKworQ2hlY2sgbGliaW9tcDUuc28gbGlicmFyeToKKworICAgICQgY2hlY2stZXhlY3N0YWNrLnBsIGxpYmlvbXA1LnNvCisKKz1jdXQKKworIyBlbmQgb2YgZmlsZSAjCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdG9vbHMvY2hlY2staW5zdHJ1Y3Rpb24tc2V0LnBsIGIvZmluYWwvcnVudGltZS90b29scy9jaGVjay1pbnN0cnVjdGlvbi1zZXQucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWZhNzg3ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvY2hlY2staW5zdHJ1Y3Rpb24tc2V0LnBsCkBAIC0wLDAgKzEsMzM2IEBACisjIS91c3IvYmluL3BlcmwKKworIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgRmluZEJpbjsKK3VzZSBsaWIgIiRGaW5kQmluOjpCaW4vbGliIjsKKwordXNlIFBsYXRmb3JtICI6dmFycyI7Cit1c2UgdG9vbHM7CisKK291ciAkVkVSU0lPTiA9ICIwLjAwNCI7CisKK215ICRoZXggPSBxcntbMC05YS1mXX1pOyAgICAjIGhleCBkaWdpdC4KKworIyBscmJfMzJlLXNwZWNpZmljIGRldGFpbHMuCisKK215ICRtaWNfYXJjaDsgIyBlaXRoZXIga25mIG9yIGtuYworbXkgJG1pY19vczsgICAjIGVpdGhlciBic2Qgb3IgbGluCitzdWIgYmFkX2xyYl9mbXQoJCkgeworICAgICMgQmVmb3JlIHdlIGFsbG93ZWQgYm90aCBlbGY2NC14ODYtNjQtZnJlZWJzZCBhbmQgZWxmLWwxb20tZnJlZWJzZC4KKyAgICAjIE5vdyB0aGUgZmlyc3Qgb25lIGlzIG9ic29sZXRlLCBvbmx5IGVsZjY0LWwxb20tZnJlZWJzZCBpcyBhbGxvd2VkLgorICAgIG15ICggJGZtdCApID0gQF87CisgICAgaWYgKCAwICkgeworICAgIH0gZWxzaWYgKCAiJG1pY19vcyIgZXEgImJzZCIgKSB7CisJaWYgKCAiJG1pY19hcmNoIiBlcSAia25mIiApIHsKKwkgICAgcmV0dXJuICRmbXQgIX4gbXtcQWVsZjY0LWwxb20oPzotZnJlZWJzZCk/XHp9OworCX0gZWxzZSB7CisJICAgIHJldHVybiAkZm10ICF+IG17XEFlbGY2NC14ODYtNjQoPzotZnJlZWJzZCk/XHp9OworCX07CisgICAgfSBlbHNpZiAoICIkbWljX29zIiBlcSAibGluIiApIHsKKwlpZiAoIDAgKSB7CisJfSBlbHNpZiAoICIkbWljX2FyY2giIGVxICJrbmYiICkgeworCSAgICByZXR1cm4gJGZtdCAhfiBte1xBZWxmNjQtbDFvbT9cen07CisJfSBlbHNpZiAoICIkbWljX2FyY2giIGVxICJrbmMiICkgeworCSAgICByZXR1cm4gJGZtdCAhfiBte1xBZWxmNjQtazFvbT9cen07CisJfSBlbHNlIHsKKwkgICAgcmV0dXJuIDE7CisJfTsKKyAgICB9IGVsc2UgeworCXJldHVybiAxOworICAgIH07Cit9OyAjIHN1YiBiYWRfbHJiX2ZtdAorCisjIFVuZGVzaXJlZCBpbnN0cnVjdGlvbnMgZm9yIGxyYjogYWxsIHg4NyBhbmQgc29tZSBvdGhlci4KKyMgQUM6IFNpbmNlIGNvbXBpbGVyIDIwMTAtMDYtMzAgeDg3IGluc3RydWN0aW9ucyBhcmUgc3VwcG9ydGVkLCByZW1vdmVkIHRoZSBjaGVjayBvZiB4ODcuCitteSAkbHJiX2JhZF9yZTsKK3N1YiBiYWRfbHJiX2luc3RyKCQkKSB7CisgICAgbXkgKCAkaW5zdHIsICRhcmdzICkgPSBAXzsKKyMgICAgaWYgKCAiJG1pY19vcyIgZXEgImxpbiIgYW5kICIkbWljX2FyY2giIGVxICJrbmYiICkgeworICAgIGlmICggIiRtaWNfb3MiIGVxICJsaW4iIG9yICIkbWljX2FyY2giIGVxICJrbmMiICkgeworCSMgd29ya2Fyb3VuZCBvZiBiYWQgY29kZSBnZW5lcmF0aW9uIG9uIEtORiBMaW51eCogT1M6CisJcmV0dXJuICggZGVmaW5lZCggJGluc3RyICkgYW5kICRpbnN0ciA9fiAkbHJiX2JhZF9yZSApOworICAgIH0gZWxzZSB7CisJcmV0dXJuICggZGVmaW5lZCggJGluc3RyICkgYW5kICRpbnN0ciA9fiAkbHJiX2JhZF9yZSBvciBkZWZpbmVkKCAkYXJncyApIGFuZCAkYXJncyA9fiBte3htbX1pICk7CisgICAgfQorfTsgIyBzdWIgYmFkX2xyYl9pbnN0cgorCisjIGxpbl8zMi1zcGVjaWZpYyBkZXRhaWxzLgorCitzdWIgYmFkX2lhMzJfZm10KCQpIHsKKyAgICBteSAoICRmbXQgKSA9IEBfOworICAgIHJldHVybiAkZm10ICF+IG17XEFlbGYzMi1pMzg2XHp9OworfTsgIyBzdWIgYmFkX2lhMzJfZm10CisKK215IEBzc2UyID0KKyAgICBxd3sKKyAgICAgICAgbW92YXBkIG1vdnVwZCBtb3ZocGQgbW92bHBkIG1vdm1za3BkIG1vdnNkCisgICAgICAgIGFkZHBkIGFkZHNkIHN1YnBkIHN1YnNkIG11bHBkIG11bHNkIGRpdnBkIGRpdnNkIHNxcnRwZCBzcXJ0c2QgbWF4cGQgbWF4c2QgbWlucGQgbWluc2QKKyAgICAgICAgYW5kcGQgYW5kbnBkIG9ycGQgeG9ycGQKKyAgICAgICAgY21wcGQgY21wc2QgY29taXNkIHVjb21pc2QKKyAgICAgICAgc2h1ZnBkIHVucGNraHBkIHVucGNrbHBkCisgICAgICAgIGN2dHBkMnBpIGN2dHRwZDJwaSBjdnRwaTJwZCBjdnRwZDJkcSBjdnR0cGQyZHEgY3Z0ZHEycGQgY3Z0cHMycGQgY3Z0cGQycHMgY3Z0c3Myc2QgY3Z0c2Qyc3MKKyAgICAgICAgY3Z0c2Qyc2kgY3Z0dHNkMnNpIGN2dHNpMnNkIGN2dGRxMnBzIGN2dHBzMmRxIGN2dHRwczJkcSBtb3ZkcWEgbW92ZHF1IG1vdnEyZHEgbW92ZHEycQorICAgICAgICBwbXVsdWRxIHBhZGRxIHBzdWJxIHBzaHVmbHcgcHNodWZodyBwc2h1ZmQgcHNsbGRxIHBzcmxkcSBwdW5wY2tocWRxIHB1bnBja2xxZHEgY2xmbHVzaAorICAgICAgICBsZmVuY2UgbWZlbmNlIG1hc2ttb3ZkcXUgbW92bnRwZCBtb3ZudGRxIG1vdm50aQorICAgIH07CitteSBAc3NlMyA9CisgICAgcXd7CisgICAgICAgIGZpc3R0cCBsZGRxdSBhZGRzdWJwcyBhZGRzdWJwZCBoYWRkcHMgaHN1YnBzIGhhZGRwZCBoc3VicGQgbW92c2hkdXAgbW92c2xkdXAgbW92ZGR1cCBtb25pdG9yCisgICAgICAgIG13YWl0CisgICAgfTsKK215IEBzc3NlMyA9CisgICAgcXd7CisgICAgICAgIHBoYWRkdyBwaGFkZHN3IHBoYWRkZCBwaHN1YncgcGhzdWJzdyBwaHN1YmQgcGFic2IgcGFic3cgcGFic2QgcG1hZGR1YnN3IHBtdWxocnN3IHBzaHVmYgorICAgICAgICBwc2lnbmIgcHNpZ253IHBzaWduZCBwYWxpZ25yCisgICAgfTsKK215IEBzc2U0ID0KKyAgICAoCisgICAgICAgICMgU1NFNC4xCisgICAgICAgIHF3eworICAgICAgICAgICAgcG11bGxkIHBtdWxkcSBkcHBkIGRwcHMgbW92bnRkcWEgYmxlbmRwZCBibGVuZHBzIGJsZW5kdnBkIGJsZW5kdnBzIHBibGVuZHZiIHBibGVuZHcgcG1pbnV3CisgICAgICAgICAgICBwbWludWQgcG1pbnNiIHBtaW5zZCBwbWF4dXcgcG1heHVkIHBtYXhzYiBwbWF4c2Qgcm91bmRwcyByb3VuZHBkIHJvdW5kc3Mgcm91bmRzZCBleHRyYWN0cHMKKyAgICAgICAgICAgIGluc2VydHBzIHBpbnNyYiBwaW5zcmQgcGluc3JxIHBleHRyYiBwZXh0cncgcGV4dHJkIHBleHRycSBwbW92c3hidyBwbW92enhidyBwbW92c3hiZAorICAgICAgICAgICAgcG1vdnp4YmQgcG1vdnN4d2QgcG1vdnp4d2QgcG1vdnN4YnEgcG1vdnp4YnEgcG1vdnN4d3EgcG1vdnp4d3EgcG1vdnN4ZHEgcG1vdnp4ZHEgbXBzYWRidworICAgICAgICAgICAgcGhtaW5wb3N1dyBwdGVzdCBwY21wZXFxIHBhY2t1c2R3CisgICAgICAgIH0sCisgICAgICAgICMgU1NFNC4yCisgICAgICAgIHF3eworICAgICAgICAgICAgcGNtcGVzdHJpIHBjbXBlc3RybSBwY21waXN0cmkgcGNtcGlzdHJtIHBjbXBndHEgY3JjMzIgcG9wY250CisgICAgICAgIH0KKyAgICApOworCisjIFVuZGVzaXJlZCBpbnN0cnVjdGlvbnMgZm9yIElBLTMyIGFyY2hpdGVjdHVyZTogUGVudGl1bSA0IChTU0UyKSBhbmQgbmV3ZXIuCisjIFRPRE86IEl0IHdvdWxkIGJlIG11Y2ggbW9yZSByZWxpYWJsZSB0byBsaXN0ICphbGxvd2VkKiBpbnN0cnVjdGlvbnMgcmF0aGVyIHRoYW4gbGlzdCB1bmRlc2lyZWQKKyMgaW5zdHJ1Y3Rpb25zLiBJbiBzdWNoIGEgY2FzZSB0aGUgbGlzdCB3aWxsIGJlIHN0YWJsZSBhbmQgbm90IHJlcXVpcmUgdXBkYXRlIHdoZW4gU1NFNSBpcyByZWxlYXNlZC4KK215IEBpYTMyX2JhZF9saXN0ID0gKCBAc3NlMiwgQHNzZTMsIEBzc3NlMywgQHNzZTQgKTsKKworbXkgJGlhMzJfYmFkX3JlID0gcXJ7QHtbICJeKD86IiAuIGpvaW4oICJ8IiwgQGlhMzJfYmFkX2xpc3QgKSAuICIpIiBdfX1pOworCitzdWIgYmFkX2lhMzJfaW5zdHIoJCQpIHsKKyAgICBteSAoICRpbnN0ciwgJGFyZ3MgKSA9IEBfOworICAgIHJldHVybiAoIGRlZmluZWQoICRpbnN0ciApIGFuZCAkaW5zdHIgPX4gJGlhMzJfYmFkX3JlICk7Cit9OyAjIHN1YiBiYWRfaWEzMl9pbnN0cgorCitzdWIgY2hlY2tfZmlsZSgkOyQkKSB7CisKKyAgICBteSAoICRmaWxlLCAkc2hvd19pbnN0cnVjdGlvbnMsICRtYXhfaW5zdHJ1Y3Rpb25zICkgPSBAXzsKKyAgICBteSBAYnVsazsKKworICAgIGlmICggbm90IGRlZmluZWQoICRtYXhfaW5zdHJ1Y3Rpb25zICkgKSB7CisgICAgICAgICRtYXhfaW5zdHJ1Y3Rpb25zID0gMTAwOworICAgIH07ICMgaWYKKworICAgIGlmICggIiRtaWNfb3MiIGVxICJic2QiICkgeworICAgICAgICBleGVjdXRlKCBbICJ4ODZfNjQtZnJlZWJzZC1vYmpkdW1wIiwgIi1kIiwgJGZpbGUgXSwgLXN0ZG91dCA9PiBcQGJ1bGsgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBleGVjdXRlKCBbICJvYmpkdW1wIiwgIi1kIiwgJGZpbGUgXSwgLXN0ZG91dCA9PiBcQGJ1bGsgKTsKKyAgICB9CisKKyAgICBteSAkbiA9IDA7CisgICAgbXkgJGVycm9ycyA9IDA7CisgICAgbXkgJGN1cnJlbnRfZnVuYyAgPSAiIjsgICAgIyBOYW1lIG9mIGN1cnJlbnQgZnVjdGlvbi4KKyAgICBteSAkcmVwb3J0ZWRfZnVuYyA9ICIiOyAgICAjIG5hbWUgb2YgbGFzdCByZXBvcnRlZCBmdW5jdGlvbi4KKyAgICBmb3JlYWNoIG15ICRsaW5lICggQGJ1bGsgKSB7CisgICAgICAgICsrICRuOworICAgICAgICBpZiAoIDAgKSB7CisgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccyokfSApIHsKKyAgICAgICAgICAgICMgRW1wdHkgbGluZS4KKyAgICAgICAgICAgICMgSWdub3JlLgorICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteSW4gYXJjaGl2ZSAoLio/KTpccyokfSApIHsKKyAgICAgICAgICAgICMgSW4gYXJjaGl2ZSBsaWJpb21wNS5hOgorICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteKD86Lio/KTpccypmaWxlIGZvcm1hdCAoLio/KVxzKiR9ICkgeworICAgICAgICAgICAgIyBsaWJpb21wNS5zbzogICAgIGZpbGUgZm9ybWF0IGVsZjY0LXg4Ni02NC1mcmVlYnNkCisgICAgICAgICAgICAjIGttcF9mdG5fY2RlY2wubzogICAgIGZpbGUgZm9ybWF0IGVsZjY0LXg4Ni02NAorICAgICAgICAgICAgbXkgJGZtdCA9ICQxOworICAgICAgICAgICAgaWYgKCBiYWRfZm10KCAkZm10ICkgKSB7CisgICAgICAgICAgICAgICAgcnVudGltZV9lcnJvciggIkludmFsaWQgZmlsZSBmb3JtYXQ6ICRmbXQuIiApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAoLio/KTpccyokfSApIHsKKyAgICAgICAgICAgICMgRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAucGx0OgorICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteJGhleCsgPChbXj5dKyk+OlxzKiR9ICkgeworICAgICAgICAgICAgIyAwMDAwMDAwMDAwMDE3ZTk4IDxfX2ttcF9zdHJfZm9ybWF0QHBsdC0weDEwPjoKKyAgICAgICAgICAgICRjdXJyZW50X2Z1bmMgPSAkMTsKKyAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XlxzKlwuezN9XHMqJH0gKSB7CisgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccyooJGhleCspOlxzKygkaGV4JGhleCg/OiAkaGV4JGhleCkqKVxzKyg/OmxvY2tccyt8cmV4Wy5hLXpdKlxzKyk/KFteIF0rKSg/OlxzKyhbXiNdKz8pKT9ccyooPzojfCQpfSApIHsKKyAgICAgICAgICAgICMgICAxN2U5ODogICAgICAgZmYgMzUgZmEgN2QgMjYgMDAgICAgICAgcHVzaHEgIDB4MjY3ZGZhKCVyaXApICAgICAgICAjIDI3ZmM5OCA8X0dMT0JBTF9PRkZTRVRfVEFCTEU+CisgICAgICAgICAgICBteSAoICRhZGRyLCAkZHVtcCwgJGluc3RyLCAkYXJncyApID0gKCAkMSwgJDIsICQzLCAkNCApOworICAgICAgICAgICAgIyBDaGVjayB0aGlzIGlzIG5vdCBhIGJhZCBpbnN0cnVjdGlvbiBhbmQgeG1tIHJlZ2lzdGVycyBhcmUgbm90IHVzZWQuCisgICAgICAgICAgICBpZiAoIGJhZF9pbnN0ciggJGluc3RyLCAkYXJncyApICkgeworICAgICAgICAgICAgICAgIGlmICggJGVycm9ycyA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCAiSW52YWxpZCBpbnN0cnVjdGlvbnMgZm91bmQgaW4gYCRmaWxlJzoiICk7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgIGlmICggJGN1cnJlbnRfZnVuYyBuZSAkcmVwb3J0ZWRfZnVuYyApIHsKKyAgICAgICAgICAgICAgICAgICAgd2FybmluZyggIiAgICAkY3VycmVudF9mdW5jIiApOworICAgICAgICAgICAgICAgICAgICAkcmVwb3J0ZWRfZnVuYyA9ICRjdXJyZW50X2Z1bmM7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgICsrICRlcnJvcnM7CisgICAgICAgICAgICAgICAgaWYgKCAkc2hvd19pbnN0cnVjdGlvbnMgKSB7CisgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoICIgICAgICAgICRsaW5lIiApOworICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICAgICBpZiAoICRlcnJvcnMgPj0gJG1heF9pbnN0cnVjdGlvbnMgKSB7CisgICAgICAgICAgICAgICAgICAgIGluZm8oICIkZXJyb3JzIGludmFsaWQgaW5zdHJ1Y3Rpb25zIGZvdW5kOyBzY2FubmluZyBzdG9wcGVkLiIgKTsKKyAgICAgICAgICAgICAgICAgICAgbGFzdDsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAiRXJyb3IgcGFyc2luZyBvYmpkdW1wIG91dHB1dCBsaW5lICRuOlxuPj4+PiAkbGluZVxuIiApOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBmb3JlYWNoICRsaW5lCisKKyAgICByZXR1cm4gJGVycm9yczsKKworfTsgIyBzdWIgY2hlY2tfZmlsZQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgUGFyc2UgY29tbWFuZCBsaW5lLgorbXkgJG1heF9pbnN0cnVjdGlvbnM7CitteSAkc2hvd19pbnN0cnVjdGlvbnM7CitnZXRfb3B0aW9ucygKKyAgICAibWF4LWluc3RydWN0aW9ucz1pIiA9PiBcJG1heF9pbnN0cnVjdGlvbnMsCisgICAgInNob3ctaW5zdHJ1Y3Rpb25zISIgPT4gXCRzaG93X2luc3RydWN0aW9ucywKKyAgICAibWljLWFyY2g9cyIgICAgICAgICA9PiBcJG1pY19hcmNoLAorICAgICJtaWMtb3M9cyIgICAgICAgICAgID0+IFwkbWljX29zLAorICAgIFBsYXRmb3JtOjp0YXJnZXRfb3B0aW9ucygpLAorKTsKK2lmICggIiRtaWNfb3MiIGVxICJsaW4iIGFuZCAiJG1pY19hcmNoIiBlcSAia25mIiApIHsKKyAgICAkbHJiX2JhZF9yZSA9IHFye14oPzpwYXVzZXxbc2xtXWZlbmNlfHNjYXR0ZXJ8Z2F0aGVyfGNtcHhjaGcxNmJ8Y2xldmljdFsxMl0pfWk7Cit9IGVsc2UgeworICAgICRscmJfYmFkX3JlID0gcXJ7Xig/OnBhdXNlfFtzbG1dZmVuY2V8c2NhdHRlcnxnYXRoZXJ8Y21vdnxjbXB4Y2hnMTZifGNsZXZpY3RbMTJdKX1pOworfTsKK2lmICggMCApIHsKK30gZWxzaWYgKCAkdGFyZ2V0X3BsYXRmb3JtIGVxICJscmJfMzJlIiApIHsKKyAgICAqYmFkX2luc3RyID0gXCpiYWRfbHJiX2luc3RyOworICAgICpiYWRfZm10ICAgPSBcKmJhZF9scmJfZm10OworfSBlbHNpZiAoICR0YXJnZXRfcGxhdGZvcm0gZXEgImxpbl8zMiIgKSB7CisgICAgKmJhZF9pbnN0ciA9IFwqYmFkX2lhMzJfaW5zdHI7CisgICAgKmJhZF9mbXQgICA9IFwqYmFkX2lhMzJfZm10OworfSBlbHNlIHsKKyAgICBydW50aW1lX2Vycm9yKCAiT25seSB3b3JrcyBvbiBsaW5fMzIgYW5kIGxyYl8zMmUgcGxhdGZvcm1zLiIgKTsKK307ICMgaWYKKworIyBEbyB0aGUgd29yay4KK215ICRyYyA9IDA7CitpZiAoIG5vdCBAQVJHViApIHsKKyAgICBpbmZvKCAiTm8gYXJndW1lbnRzIHNwZWNpZmllZCAtLSBub3RoaW5nIHRvIGRvLiIgKTsKK30gZWxzZSB7CisgICAgZm9yZWFjaCBteSAkYXJnICggQEFSR1YgKSB7CisgICAgICAgIG15ICRlcnJzID0gY2hlY2tfZmlsZSggJGFyZywgJHNob3dfaW5zdHJ1Y3Rpb25zLCAkbWF4X2luc3RydWN0aW9ucyApOworICAgICAgICBpZiAoICRlcnJzID4gMCApIHsKKyAgICAgICAgICAgICRyYyA9IDM7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGZvcmVhY2ggJGFyZworfTsgIyBpZgorCitleGl0KCAkcmMgKTsKKworX19FTkRfXworCis9cG9kCisKKz1oZWFkMSBOQU1FCisKK0I8Y2hlY2staW5zdHJ1Y3Rpb24tc2V0LnBsPiAtLSBNYWtlIHN1cmUgYmluYXJ5IGZpbGUgZG9lcyBub3QgY29udGFpbiB1bmRlc2lyZWQgaW5zdHJ1Y3Rpb25zLgorCis9aGVhZDEgU1lOT1BTSVMKKworQjxjaGVjay1pbnN0cnVjdGlvbnMucGw+IEk8b3B0aW9uPi4uLiBJPGZpbGU+Li4uCisKKz1oZWFkMSBPUFRJT05TCisKKz1vdmVyCisKKz1pdGVtIEI8LS1hcmNoaXRlY3R1cmU9Pkk8YXJjaD4KKworU3BlY2lmeSB0YXJnZXQgYXJjaGl0ZWN0dXJlLgorCis9aXRlbSBCPC0tbWF4LWluc3RydWN0aW9ucz0+STxudW1iZXI+CisKK1N0b3Agc2Nhbm5pbmcgaWYgSTxudW1iZXI+IGludmFsaWQgaW5zdHJ1Y3Rpb25zIGZvdW5kLiAxMDAgYnkgZGVmYXVsdC4KKworPWl0ZW0gQjwtLW9zPT5JPG9zPgorCitTcGVjaWZ5IHRhcmdldCBPUy4KKworPWl0ZW0gQjwtLT5bQjxuby0+XUI8c2hvdy1pbnN0cnVjdGlvbnM+CisKK1Nob3cgaW52YWxpZCBpbnN0cnVjdGlvbnMgZm91bmQgaW4gdGhlIGZpbGUuIEJ1IGRlZmF1bHQsIGluc3RydWN0aW9ucyBhcmUgbm90IHNob3duLgorCis9aXRlbSBTdGFuZGFyZCBPcHRpb25zCisKKz1vdmVyCisKKz1pdGVtIEI8LS1kb2M+CisKKz1pdGVtIEI8LS1tYW51YWw+CisKK1ByaW50IGZ1bGwgaGVscCBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0taGVscD4KKworUHJpbnQgc2hvcnQgaGVscCBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0tdXNhZ2U+CisKK1ByaW50IHZlcnkgc2hvcnQgdXNhZ2UgbWVzc2FnZSBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLXZlcmJvc2U+CisKK0RvIHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMuCisKKz1pdGVtIEI8LS12ZXJzaW9uPgorCitQcmludCBwcm9ncmFtIHZlcnNpb24gYW5kIGV4aXQuCisKKz1pdGVtIEI8LS1xdWlldD4KKworV29yayBxdWlldCwgZG8gbm90IHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMuCisKKz1iYWNrCisKKz1iYWNrCisKKz1oZWFkMSBBUkdVTUVOVFMKKworPW92ZXIKKworPWl0ZW0gSTxmaWxlPgorCitGaWxlIChvYmplY3QgZmlsZSBvciBsaWJyYXJ5LCBlaXRoZXIgc3RhdGljIG9yIGR5bmFtaWMpIHRvIGNoZWNrLgorCis9YmFjaworCis9aGVhZDEgREVTQ1JJUFRJT04KKworVGhlIHNjcmlwdCBydW5zIEY8b2JqZHVtcD4gdXRpbGl0eSB0byBnZXQgZGlzYXNzZW1ibGVyIGxpc3RpbmcgYW5kIGNoZWNrcyB0aGUgZmlsZSBkb2VzIG5vdCBjb250YWluCit1bndhbnRlZCBpbnN0cnVjdGlvbnMuCisKK0N1cnJlbnRseSB0aGUgc2NyaXB0IHdvcmtzIG9ubHkgZm9yOgorCis9b3ZlcgorCis9aXRlbSBDPGxyYl8zMmU+CisKK0ludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZSB0YXJnZXQgT1MuIFVuZGVzaXJlZCB1bnN0cnVjdGlvbnMgYXJlOiBhbGwgeDg3IGluc3RydWN0aW9ucyBhbmQgc29tZSBvdGhlcnMuCisKKz1pdGVtIEM8bGluXzMyPgorCitVbmRlc2lyZWQgaW5zdHJ1Y3Rpb25zIGFyZSBpbnN0cnVjdGlvbnMgbm90IHZhbGlkIGZvciBQZW50aXVtIDMgcHJvY2Vzc29yIChTU0UyIGFuZCBuZXdlcikuCisKKz1iYWNrCisKKz1jdXQKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90b29scy9jaGVjay10b29scy5wbCBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvY2hlY2stdG9vbHMucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjM2ZDUxYQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvY2hlY2stdG9vbHMucGwKQEAgLTAsMCArMSw2MDAgQEAKKyMhL3Vzci9iaW4vcGVybAorCisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgUHJhZ21hcy4KK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBGaW5kQmluOwordXNlIGxpYiAiJEZpbmRCaW46OkJpbi9saWIiOworCisjIExJQk9NUCBtb2R1bGVzLgordXNlIFBsYXRmb3JtICI6dmFycyI7Cit1c2UgdG9vbHM7CisKK291ciAkVkVSU0lPTiA9ICIwLjAxNSI7CisKK215ICRwZWRhbnRpYzsKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBIZWxwZXIgZnVuY3Rpb25zCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworc3ViIHJ1bigkXCRcJDtcJCkgeworICAgIG15ICggJGNtZCwgJHN0ZG91dCwgJHN0ZGVyciwgJHBhdGggKSA9IEBfOworICAgIG15ICggQHBhdGgsICRyYyApOworICAgIEBwYXRoID0gd2hpY2goICRjbWQtPlsgMCBdLCAtYWxsID0+IDEgKTsKKyAgICBpZiAoIEBwYXRoID4gMCApIHsKKyAgICAgICAgaWYgKCBAcGF0aCA+IDEgYW5kICRwZWRhbnRpYyApIHsKKyAgICAgICAgICAgIHdhcm5pbmcoICJNb3JlIHRoYW4gb25lIFwiJGNtZC0+WyAwIF1cIiBmb3VuZCBpbiBQQVRIOiIsIG1hcCggIiAgICAkXyIsIEBwYXRoICkgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBkZWJ1ZyggIlwiJGNtZC0+WyAwIF1cIiBmdWxsIHBhdGggaXMgXCIkcGF0aFsgMCBdXCIuIiApOworICAgICAgICBpZiAoIGRlZmluZWQoICRwYXRoICkgKSB7CisgICAgICAgICAgICAkJHBhdGggPSAkcGF0aFsgMCBdOworICAgICAgICB9OyAjIGlmCisgICAgICAgIGRlYnVnKCAiRXhlY3V0aW5nIGNvbW1hbmQ6IFwiIiAgLiBqb2luICggIiAiLCBAJGNtZCApIC4gIlwiLiIgKTsKKyAgICAgICAgJHJjID0KKyAgICAgICAgICAgIGV4ZWN1dGUoCisgICAgICAgICAgICAgICAgJGNtZCwKKyAgICAgICAgICAgICAgICAtaWdub3JlX3NpZ25hbCA9PiAxLCAtaWdub3JlX3N0YXR1cyA9PiAxLAorICAgICAgICAgICAgICAgIC1zdGRvdXQgPT4gJHN0ZG91dCwgLXN0ZGVyciA9PiAkc3RkZXJyLCAtc3RkaW4gPT4gdW5kZWYKKyAgICAgICAgICAgICk7CisgICAgICAgIGlmICggJHJjIDwgMCApIHsKKyAgICAgICAgICAgIHdhcm5pbmcoICJDYW5ub3QgcnVuIFwiJGNtZC0+WyAwIF1cIjogJEAiICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgZGVidWcoICJzdGRvdXQ6IiwgJCRzdGRvdXQsICIoZW9mKSIsICJzdGRlcnI6IiwgJCRzdGRlcnIsICIoZW9mKSIgKTsKKyAgICB9IGVsc2UgeworICAgICAgICB3YXJuaW5nKCAiTm8gXCIkY21kLT5bIDAgXVwiIGZvdW5kIGluIFBBVEguIiApOworICAgICAgICAkcmMgPSAtMTsKKyAgICB9OyAjIGlmCisgICAgcmV0dXJuICRyYzsKK307ICMgc3ViIHJ1bgorCisKK3N1YiBnZXRfYXJjaCgkJCQpIHsKKyAgICBteSAoICRuYW1lLCAkc3RyLCAkZXhwcyApID0gQF87CisgICAgbXkgKCAkYXJjaCwgJGNvdW50ICk7CisgICAgJGNvdW50ID0gMDsKKyAgICBmb3JlYWNoIG15ICRyZSAoIGtleXMoICUkZXhwcyApICkgeworICAgICAgICBpZiAoICRzdHIgPX4gJHJlICkgeworICAgICAgICAgICAgJGFyY2ggPSAkZXhwcy0+eyAkcmUgfTsKKyAgICAgICAgICAgICsrICRjb3VudDsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgZm9yCisgICAgaWYgKCAkY291bnQgIT0gMSBvciBub3QgUGxhdGZvcm06OmNhbm9uX2FyY2goICRhcmNoICkgKSB7CisgICAgICAgIHdhcm5pbmcoICJDYW5ub3QgZGV0ZWN0ICRuYW1lIGFyY2hpdGVjdHVyZTogJHN0ciIgKTsKKyAgICAgICAgcmV0dXJuIHVuZGVmOworICAgIH07ICMgaWYKKyAgICByZXR1cm4gJGFyY2g7Cit9OyAjIHN1YiBnZXRfYXJjaAorCitzdWIgZW5jb2RlKCQpIHsKKyAgICBteSAoICRzdHIgKSA9IEBfOworICAgICRzdHIgPX4gc3sgfXtffWc7CisgICAgcmV0dXJuICRzdHI7Cit9OyAjIHN1YiBlbmNvZGUKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGdldF94eHhfdmVyc2lvbiBzdWJyb3V0aW5lcy4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMKKyMgU29tZSBvZiBnZXRfeHh4X3ZlcnNpb24oKSBzdWJyb3V0aW5lcyBhY2NlcHQgYW4gYXJndW1lbnQgLS0gYSB0b29sIG5hbWUuIEZvciBleGFtcGxlLAorIyBnZXRfaW50ZWxfY29tcGlsZXJfdmVyc2lvbigpIGNhbiByZXBvcnQgdmVyc2lvbiBvZiBDLCBDKyssIG9yIEZvcnRyYW4gY29tcGlsZXIuIFRoZSB0b29sIGZvcgorIyByZXBvcnQgc2hvdWxkIGJlIHNwZWNpZmllZCBieSBhcmd1bWVudCwgZm9yIGV4YW1wbGU6IGdldF9pbnRlbF9jb21waWxlcl92ZXJzaW9uKCAiaWZvcnQiICkuCisjCisjIGdldF94eHhfdmVyc2lvbigpIHN1YnJvdXRpbmVzIHJldHVybnMgbGlzdCBvZiBvbmUgb3IgdHdvIGVsZW1lbnRzOgorIyAgICAgMS4gVGhlIGZpcnN0IGVsZW1lbnQgaXMgc2hvcnQgdG9vbCBuYW1lIChsaWtlICJnY2MiLCAiZysrIiwgImljbCIsIGV0YykuCisjICAgICAyLiBUaGUgc2Vjb25kIGVsZW1lbnQgaXMgdmVyc2lvbiBzdHJpbmcuCisjIElmIHJldHVybmVkIGxpc3QgY29udGFpbiBqdXN0IG9uZSBlbGVtZW50LCBpdCBtZWFucyB0aGVyZSBpcyBhIHByb2JsZW0gd2l0aCB0aGUgdG9vbC4KKyMKKworc3ViIGdldF9wZXJsX3ZlcnNpb24oKSB7CisgICAgbXkgKCAkcmMsICRzdGRvdXQsICRzdGRlcnIsICR2ZXJzaW9uICk7CisgICAgbXkgJHRvb2wgPSAicGVybCI7CisgICAgbXkgKCBAcmV0ICkgPSAoICR0b29sICk7CisgICAgJHJjID0gcnVuKCBbICR0b29sLCAiLS12ZXJzaW9uIiBdLCAkc3Rkb3V0LCAkc3RkZXJyICk7CisgICAgaWYgKCAkcmMgPj0gMCApIHsKKyAgICAgICAgIyBUeXBpY2FsIHBlcmwgb3V0cHV0OgorICAgICAgICAjICAgIFRoaXMgaXMgcGVybCwgdjUuMTAuMCBidWlsdCBmb3IgeDg2XzY0LWxpbnV4LXRocmVhZC1tdWx0aQorICAgICAgICAjICAgIFRoaXMgaXMgcGVybCwgdjUuOC44IGJ1aWx0IGZvciBNU1dpbjMyLXg2NC1tdWx0aS10aHJlYWQKKyAgICAgICAgIyAgICBUaGlzIGlzIHBlcmwsIHY1LjEwLjEgKCopIGJ1aWx0IGZvciB4ODZfNjQtbGludXgtdGhyZWFkLW11bHRpCisgICAgICAgIGlmICggJHN0ZG91dCAhfiBte15UaGlzIGlzIHBlcmwuKnYoXGQrXC5cZCsoPzpcLlxkKykpLipidWlsdCBmb3J9bSApIHsKKyAgICAgICAgICAgIHdhcm5pbmcoICJDYW5ub3QgcGFyc2UgcGVybCBvdXRwdXQ6IiwgJHN0ZG91dCwgIihvZWYpIiApOworICAgICAgICB9OyAjIGlmCisgICAgICAgICR2ZXJzaW9uID0gJDE7CisgICAgICAgIGlmICggJHRhcmdldF9vcyBlcSAid2luIiApIHsKKyAgICAgICAgICAgIGlmICggJHN0ZG91dCAhfiBte0JpbmFyeSBidWlsZCAoLiopIHByb3ZpZGVkIGJ5IEFjdGl2ZVN0YXRlIH0gKSB7CisgICAgICAgICAgICAgICAgd2FybmluZyggIlBlcmwgaXMgbm90IEFjdGl2ZVN0YXRlIG9uZSIgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKyAgICBwdXNoKCBAcmV0LCAkdmVyc2lvbiApOworICAgIHJldHVybiBAcmV0OworfTsgIyBzdWIgZ2V0X3BlcmxfdmVyc2lvbgorCisKK3N1YiBnZXRfZ251X21ha2VfdmVyc2lvbigpIHsKKyAgICBteSAoICRyYywgJHN0ZG91dCwgJHN0ZGVyciwgJHZlcnNpb24gKTsKKyAgICBteSAkdG9vbCA9ICJtYWtlIjsKKyAgICBteSAoIEByZXQgKSA9ICggJHRvb2wgKTsKKyAgICBteSAoICRwYXRoICk7CisgICAgJHJjID0gcnVuKCBbICR0b29sLCAiLS12ZXJzaW9uIiBdLCAkc3Rkb3V0LCAkc3RkZXJyLCAkcGF0aCApOworICAgIGlmICggJHJjID49IDAgKSB7CisgICAgICAgICMgVHlwaWNhbCBtYWtlIG91dHB1dDoKKyAgICAgICAgIyAgICAgR05VIE1ha2UgdmVyc2lvbiAzLjc5LjEsIGJ5IFJpY2hhcmQgU3RhbGxtYW4gYW5kIFJvbGFuZCBNY0dyYXRoLgorICAgICAgICAjICAgICBHTlUgTWFrZSAzLjgxCisgICAgICAgIGlmICggJHN0ZG91dCA9fiBte15HTlUgTWFrZSAoPzp2ZXJzaW9uICk/KFxkK1wuXGQrKD86XC5cZCspPykoPzosfFxzKX0gKSB7CisgICAgICAgICAgICAkdmVyc2lvbiA9ICQxOworICAgICAgICB9OyAjIGlmCisgICAgICAgIGlmICggJHRhcmdldF9vcyBlcSAid2luIiBhbmQgJHN0ZG91dCA9fiBte2J1aWx0IGZvciAoW2EtejAtOS1dKyl9ICkgeworICAgICAgICAgICAgbXkgJGJ1aWx0X2ZvciA9ICQxOworICAgICAgICAgICAgZGVidWcoICJHTlUgTWFrZSBidWlsdCBmb3I6IFwiJGJ1aWx0X2ZvclwiLiIgKTsKKyAgICAgICAgICAgIGlmICggJGJ1aWx0X2ZvciA9fiBte2N5Z3dpbn1pICkgeworICAgICAgICAgICAgICAgIHdhcm5pbmcoICJcIiRwYXRoXCIgaXMgYSBDeWd3aW4gbWFrZSwgaXQgaXMgKm5vdCogc3VpdGFibGUuIiApOworICAgICAgICAgICAgICAgIHJldHVybiBAcmV0OworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorICAgIHB1c2goIEByZXQsICR2ZXJzaW9uICk7CisgICAgcmV0dXJuIEByZXQ7Cit9OyAjIHN1YiBnZXRfZ251X21ha2VfdmVyc2lvbgorCisKK3N1YiBnZXRfaW50ZWxfY29tcGlsZXJfdmVyc2lvbigkKSB7CisgICAgbXkgKCAkdG9vbCApID0gQF87ICAgICMgVG9vbCBuYW1lLCBsaWtlICJpY2MiLCAiaWNwYyIsICJpY2wiLCBvciAiaWZvcnQiLgorICAgIG15ICggQHJldCApID0gKCAkdG9vbCApOworICAgIG15ICggJHJjLCAkc3Rkb3V0LCAkc3RkZXJyLCAkdG9vbF9yZSApOworICAgIG15ICR2ZXJzaW9uOworICAgIG15ICRpY19hcmNocyA9IHsKKyAgICAgICAgcXJ7MzItYml0fElBLTMyfSAgICAgICAgPT4gIjMyIiwKKyAgICAgICAgcXJ7SW50ZWxcKFJcKSA2NH0gPT4gIjMyZSIsCisgICAgICAgIHFye0ludGVsXChSXCkgW01dW0ldW0NdIEFyY2hpdGVjdHVyZX0gPT4gIjMyZSIsCisgICAgfTsKKyAgICAkdG9vbF9yZSA9IHF1b3RlbWV0YSggJHRvb2wgKTsKKyAgICAkcmMgPSBydW4oIFsgJHRvb2wsICggJHRhcmdldF9vcyBlcSAid2luIiA/ICgpIDogKCAiLVYiICkgKSBdLCAkc3Rkb3V0LCAkc3RkZXJyICk7CisgICAgaWYgKCAkcmMgPCAwICkgeworICAgICAgICByZXR1cm4gQHJldDsKKyAgICB9OyAjIGlmCisgICAgIyBJbnRlbCBjb21waWxlciB2ZXJzaW9uIHN0cmluZyBpcyBpbiB0aGUgZmlyc3QgbGluZSBvZiBzdGRlcnIuIEdldCBpdC4KKyAgICAjJHN0ZGVyciA9fiBte1xBKC4qXG4/KX07CisgICAgIyBBQzogTGV0J3MgbG9vayBmb3IgdmVyc2lvbiBzdHJpbmcgaW4gdGhlIGZpcnN0IGxpbmUgd2hpY2ggY29udGFpbnMgIkludGVsIiBzdHJpbmcuCisgICAgIyAgICAgVGhpcyBhbGxvd3MgdG8gdXNlIDExLjEgYW5kIDEyLjAgY29tcGlsZXJzIG9uIG5ldyBNQUMgbWFjaGluZXMgYnkgaWdub3JpbmcKKyAgICAjICAgICBodWdlIG51bWJlciBvZiB3YXJuaW5ncyBpc3N1ZWQgYnkgb2xkIGNvbXBpbGVycy4KKyAgICAkc3RkZXJyID1+IG17XihJbnRlbC4qKSR9bTsKKyAgICBteSAkdnN0ciA9ICQxOworICAgIG15ICggJGFwbCwgJHZlciwgJGJsZCwgJHBrZyApOworICAgIGlmICggMCApIHsKKyAgICB9IGVsc2lmICggJHZzdHIgPX4gbXteSW50ZWwuKj9Db21waWxlclxzKyguKj8pLD9ccytWZXJzaW9uXHMrKC4qPylccytCdWlsZFxzKyhcUyspKD86XHMrUGFja2FnZSBJRDogKFxTKykpP30gKSB7CisgICAgICAgICMgOS54LCAxMC54LCAxMS4wLgorICAgICAgICAoICRhcGwsICR2ZXIsICRibGQsICRwa2cgKSA9ICggJDEsICQyLCAkMywgJDQgKTsKKyAgICB9IGVsc2lmICggJHZzdHIgPX4gbXteSW50ZWwncyAoLio/KSBDb21waWxlciw/XHMrVmVyc2lvblxzKyguKj8pXHMrQnVpbGRccysoXFMrKX0gKSB7CisgICAgICAgICMgMTEuMQorICAgICAgICAoICRhcGwsICR2ZXIsICRibGQgKSA9ICggJDEsICQyLCAkMyApOworICAgIH0gZWxzZSB7CisgICAgICAgIHdhcm5pbmcoICJDYW5ub3QgcGFyc2UgJHt0b29sfSdzIHN0ZGVycjoiLCAkc3RkZXJyLCAiKGVvZikiICk7CisgICAgICAgIHJldHVybiBAcmV0OworICAgIH07ICMgaWYKKyAgICBteSAkaWNfYXJjaCA9IGdldF9hcmNoKCAiSW50ZWwgY29tcGlsZXIiLCAkYXBsLCAkaWNfYXJjaHMgKTsKKyAgICBpZiAoIG5vdCBkZWZpbmVkKCAkaWNfYXJjaCApICkgeworICAgICAgICByZXR1cm4gQHJldDsKKyAgICB9OyAjIGlmCisgICAgaWYgKCBQbGF0Zm9ybTo6Y2Fub25fYXJjaCggJGljX2FyY2ggKSBuZSAkdGFyZ2V0X2FyY2ggKSB7CisgICAgICAgIHdhcm5pbmcoICJUYXJnZXQgYXJjaGl0ZWN0dXJlIGlzICR0YXJnZXRfYXJjaCwgJHRvb2wgZm9yICRpY19hcmNoIGZvdW5kLiIgKTsKKyAgICAgICAgcmV0dXJuIEByZXQ7CisgICAgfTsgIyBpZgorICAgICMgTm9ybWFsaXplIHZlcnNpb24uCisgICAgbXkgJHN0YWdlOworICAgICR2ZXIgPX4gc3tccyt9eyB9ZzsKKyAgICAkdmVyID0gbGMoICR2ZXIgKTsKKyAgICBpZiAoICR2ZXIgPX4gbXtcQShcZCtcLlxkKyg/OlwuXGQrKT8pIChbYS16XSspXGF9aSApIHsKKyAgICAgICAgKCAkdmVyc2lvbiwgJHN0YWdlICkgPSAoICQxLCAkMiApOworICAgIH0gZWxzZSB7CisgICAgICAgICggJHZlcnNpb24sICRzdGFnZSApID0gKCAkdmVyLCAiIiApOworICAgIH07ICMgaWYKKyAgICAjIFBhcnNlIHBhY2thZ2UuCisgICAgaWYgKCBkZWZpbmVkKCAkcGtnICkgKSB7CisgICAgICAgIGlmICggJHBrZyAhfiBte1xBW2x3bV1fW2Etel0rX1thLXpdXyhcZCtcLlxkK1wuXGQrKVx6fWkgKSB7CisgICAgICAgICAgICB3YXJuaW5nKCAiQ2Fubm90IHBhcnNlIEludGVsIGNvbXBpbGVyIHBhY2thZ2U6ICRwa2ciICk7CisgICAgICAgICAgICByZXR1cm4gQHJldDsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICAkcGtnID0gJDE7CisgICAgICAgICR2ZXJzaW9uID0gJHBrZzsKKyAgICB9OyAjIGlmCisgICAgcHVzaCggQHJldCwgIiR2ZXJzaW9uICIgLiAoICRzdGFnZSA/ICIkc3RhZ2UgIiA6ICIiICkgLiAiKCRibGQpIGZvciAkaWNfYXJjaCIgKTsKKyAgICAjIE9rLCB2ZXJzaW9uIG9mIEludGVsIGNvbXBpbGVyIGZvdW5kIHN1Y2Nlc3NmdWxseS4gTm93IGxvb2sgYXQgY29uZmlnIGZpbGUuCisgICAgIyBJbnN0YWxsZXIgb2YgSW50ZWwgY29tcGlsZXIgdGVuZHMgdG8gYWRkIGEgcGF0aCB0byBNUyBsaW5rZXIgaW50byBjb21waWxlciBjb25maWcgZmlsZS4KKyAgICAjIEl0IGxlYWRzIHRvIHRyb3VibGVzLiBGb3IgZXhhbXBsZSwgYWxsIHRoZSBlbnZpcm9ubWVudCBzZXQgdXAgZm9yIE1TIFZTIDIwMDUsIGJ1dCBJbnRlbAorICAgICMgY29tcGlsZXIgdXNlcyBsbmtlciBmcm9tIE1TIFZTIDIwMDMgYmVjYXVzZSBpdCBpcyBzcGVjaWZpZWQgaW4gY29uZmlnIGZpbGUuCisgICAgIyBUbyBhdm9pZCBzdWNoIHRyb3VibGVzLCBtYWtlIHN1cmU6CisgICAgIyAgICAgSUNMQ0ZHL0lGT1JUQ0ZHIGVudmlyb25tZW50IHZhcmlhYmxlIGV4aXN0cyBvcgorICAgICMgICAgIGNvbXBpbGVyIGNvbmZpZyBmaWxlIGRvZXMgbm90IGV4aXN0LCBvcgorICAgICMgICAgIGNvbXBpbGVyIGNvbmZpZyBmaWxlIGRvZXMgbm90IHNwZWNpZnkgbGlua2VyLgorICAgIGlmICggJHRhcmdldF9vcyBlcSAid2luIiApIHsKKyAgICAgICAgaWYgKCBub3QgZXhpc3RzKCAkRU5WeyB1YyggJHRvb2wgLiAiY2ZnIiApIH0gKSApIHsKKyAgICAgICAgICAgICMgSWYgSUNMQ0ZHL0lGT1JUQ0ZHIGVudmlyb25tZW50IHZhcmlhbmxlIGV4aXN0cywgZXZlcnl0aGluZyBpcyBvay4KKyAgICAgICAgICAgICMgT3RoZXJ3aXNlIGNoZWNrIGNvbXBpbGVyJ3MgY29uZmlnIGZpbGUuCisgICAgICAgICAgICBteSAkcGF0aCA9IHdoaWNoKCAkdG9vbCApOworICAgICAgICAgICAgJHBhdGggPX4gc3tcLmV4ZVx6fXt9aTsgICAgICMgRHJvcCAiLmV4ZSIgc3VmZml4LgorICAgICAgICAgICAgJHBhdGggLj0gIi5jZmciOyAgICAgICAgICAgICMgQW5kIGFkZCAiLmNmZyIgb25lLgorICAgICAgICAgICAgaWYgKCAtZiAkcGF0aCApIHsKKyAgICAgICAgICAgICAgICAjIElmIG5vIGNvbmZpZyBmaWxlIGV4aXN0cywgaXQgaXMgb2suCisgICAgICAgICAgICAgICAgIyBPdGhlcndpc2UgYW5hbHl6ZSBpdHMgY29udGVudC4KKyAgICAgICAgICAgICAgICBteSAkYnVsayA9IHJlYWRfZmlsZSggJHBhdGggKTsKKyAgICAgICAgICAgICAgICAkYnVsayA9fiBzeyMuKlxufXt9ZzsgICAgIyBSZW1vdmUgY29tbWVudHMuCisgICAgICAgICAgICAgICAgbXkgQG9wdGlvbnMgPSAoICJRdmMiLCAiUWxvY2F0aW9uLGxpbmssIiApOworICAgICAgICAgICAgICAgIGZvcmVhY2ggbXkgICRvcHQgKCBAb3B0aW9ucyApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAkYnVsayA9fiBte1stL10kb3B0fSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoICJDb21waWxlciBjb25maWcgZmlsZSBcIiRwYXRoXCIgY29udGFpbnMgXCItJG9wdFwiIG9wdGlvbi4iICk7CisgICAgICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICAgICB9OyAjIGZvcmVhY2gKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKyAgICByZXR1cm4gQHJldDsKK307ICMgc3ViIGdldF9pbnRlbF9jb21waWxlcl92ZXJzaW9uCisKKworc3ViIGdldF9nbnVfY29tcGlsZXJfdmVyc2lvbigkKSB7CisgICAgbXkgKCAkdG9vbCApID0gQF87CisgICAgbXkgKCBAcmV0ICkgPSAoICR0b29sICk7CisgICAgbXkgKCAkcmMsICRzdGRvdXQsICRzdGRlcnIsICR2ZXJzaW9uICk7CisgICAgJHJjID0gcnVuKCBbICR0b29sLCAiLS12ZXJzaW9uIiBdLCAkc3Rkb3V0LCAkc3RkZXJyICk7CisgICAgaWYgKCAkcmMgPj0gMCApIHsKKyAgICAgICAgbXkgKCAkdmVyLCAkYmxkICk7CisgICAgICAgIGlmICggJHRhcmdldF9vcyBlcSAibWFjIiApIHsKKyAgICAgICAgICAgICMgaTY4Ni1hcHBsZS1kYXJ3aW44LWdjYy00LjAuMSAoR0NDKSA0LjAuMSAoQXBwbGUgQ29tcHV0ZXIsIEluYy4gYnVpbGQgNTM2NykKKyAgICAgICAgICAgICMgaTY4Ni1hcHBsZS1kYXJ3aW45LWdjYy00LjAuMSAoR0NDKSA0LjAuMSAoQXBwbGUgSW5jLiBidWlsZCA1NDg0KQorICAgICAgICAgICAgIyBpNjg2LWFwcGxlLWRhcndpbjExLWxsdm0tZ2NjLTQuMiAoR0NDKSA0LjIuMSAoQmFzZWQgb24gQXBwbGUgSW5jLiBidWlsZCA1NjU4KSAoTExWTSBidWlsZCAyMzM2LjkuMDApCisgICAgICAgICAgICAkc3Rkb3V0ID1+IG17Xi4qPyBcKEdDQ1wpIChcZCtcLlxkK1wuXGQrKSBcKC4qQXBwbGUuKj9JbmNcLiBidWlsZCAoXGQrKVwpfW07CisgICAgICAgICAgICAoICR2ZXIsICRibGQgKSA9ICggJDEsICQyICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIDAgKSB7CisgICAgICAgICAgICB9IGVsc2lmICggJHN0ZG91dCA9fiBte14uKj8gXChHQ0NcKSAoXGQrXC5cZCtcLlxkKykoPzogKFxkKykpP31tICkgeworICAgICAgICAgICAgICAgICMgZysrIChHQ0MpIDMuMi4zIDIwMDMwNTAyIChSZWQgSGF0IExpbnV4IDMuMi4zLTIwKQorICAgICAgICAgICAgICAgICMgR05VIEZvcnRyYW4gKEdDQykgNC4zLjIgMjAwODExMDUgKFJlZCBIYXQgNC4zLjItNykKKyAgICAgICAgICAgICAgICAoICR2ZXIsICRibGQgKSA9ICggJDEsICQyICk7CisgICAgICAgICAgICB9IGVsc2lmICggJHN0ZG91dCA9fiBte14uKj8gXChTVVNFIExpbnV4XCkgKFxkK1wuXGQrXC5cZCspXHMrXFsuKj8gKFxkKylcXX1tICkgeworICAgICAgICAgICAgICAgICMgZ2NjIChTVVNFIExpbnV4KSA0LjMuMiBbZ2NjLTRfMy1icmFuY2ggcmV2aXNpb24gMTQxMjkxXQorICAgICAgICAgICAgICAgICggJHZlciwgJGJsZCApID0gKCAkMSwgJDIgKTsKKyAgICAgICAgICAgIH0gZWxzaWYgKCAkc3Rkb3V0ID1+IG17Xi4qPyBcKFNVU0UgTGludXhcKSAoXGQrXC5cZCtcLlxkKylccytcZCtccytcWy4qPyAoXGQrKVxdfW0gKSB7CisgICAgICAgICAgICAgICAgIyBnY2MgKFNVU0UgTGludXgpIDQuNy4yIDIwMTMwMTA4IFtnY2MtNF83LWJyYW5jaCByZXZpc2lvbiAxOTUwMTJdCisgICAgICAgICAgICAgICAgKCAkdmVyLCAkYmxkICkgPSAoICQxLCAkMiApOworICAgICAgICAgICAgfSBlbHNpZiAoICRzdGRvdXQgPX4gbXteLio/IFwoKERlYmlhbnxVYnVudHUpLio/XCkgKFxkK1wuXGQrXC5cZCspfW0gKSB7CisgICAgICAgICAgICAgICAgIyBnY2MgKERlYmlhbiA0LjcuMi0yMikgNC43LjIKKyAgICAgICAgICAgICAgICAjIERlYmlhbiBzdXBwb3J0IGZyb20gU3lsdmVzdHJlIExlZHJ1IAorICAgICAgICAgICAgICAgICMgVGhhbmtzIQorICAgICAgICAgICAgICAgICR2ZXIgPSAkMjsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBpZiAoIGRlZmluZWQoICR2ZXIgKSApIHsKKyAgICAgICAgICAgICR2ZXJzaW9uID0gJHZlciAuICggZGVmaW5lZCggJGJsZCApID8gIiAoJGJsZCkiIDogIiIgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdhcm5pbmcoICJDYW5ub3QgcGFyc2UgR05VIGNvbXBpbGVyIHZlcnNpb246IiwgJHN0ZG91dCwgIihlb2YpIiApOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorICAgIHB1c2goIEByZXQsICR2ZXJzaW9uICk7CisgICAgcmV0dXJuIEByZXQ7Cit9OyAjIHN1YiBnZXRfZ251X2NvbXBpbGVyX3ZlcnNpb24KKworCitzdWIgZ2V0X2NsYW5nX2NvbXBpbGVyX3ZlcnNpb24oJCkgeworICAgIG15ICggJHRvb2wgKSA9IEBfOworICAgIG15ICggQHJldCApID0gKCAkdG9vbCApOworICAgIG15ICggJHJjLCAkc3Rkb3V0LCAkc3RkZXJyLCAkdmVyc2lvbiApOworICAgICRyYyA9IHJ1biggWyAkdG9vbCwgIi0tdmVyc2lvbiIgXSwgJHN0ZG91dCwgJHN0ZGVyciApOworICAgIGlmICggJHJjID49IDAgKSB7CisgICAgICAgIG15ICggJHZlciwgJGJsZCApOworICAgICAgICBpZiAoICR0YXJnZXRfb3MgZXEgIm1hYyIgYW5kICRzdGRvdXQgPX4gbXteLio/IChcZCtcLlxkKykgXCguKi0oXGQrXC5cZCtcLlxkKylcKX1tICkgeworICAgICAgICAgICAgIyBBcHBsZSBMTFZNIHZlcnNpb24gNC4yIChjbGFuZy00MjUuMC4yOCkgKGJhc2VkIG9uIExMVk0gMy4yc3ZuKQorICAgICAgICAgICAgKCAkdmVyLCAkYmxkICkgPSAoICQxLCAkMiApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCAwICkgeworICAgICAgICAgICAgfSBlbHNpZiAoICRzdGRvdXQgPX4gbXteLio/IChcZCtcLlxkKykoIFwoKC4qKVwpKT99bSApIHsKKyAgICAgICAgICAgICAgICAjIGNsYW5nIHZlcnNpb24gMy4zICh0YWdzL1JFTEVBU0VfMzMvZmluYWwpCisgICAgICAgICAgICAgICAgKCAkdmVyLCAkYmxkICkgPSAoICQxLCAkMyApOworICAgICAgICAgICAgfSAKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBpZiAoIGRlZmluZWQoICR2ZXIgKSApIHsKKyAgICAgICAgICAgICR2ZXJzaW9uID0gJHZlciAuICggZGVmaW5lZCggJGJsZCApID8gIiAoJGJsZCkiIDogIiIgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdhcm5pbmcoICJDYW5ub3QgcGFyc2UgQ2xhbmcgY29tcGlsZXIgdmVyc2lvbjoiLCAkc3Rkb3V0LCAiKGVvZikiICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCisgICAgcHVzaCggQHJldCwgJHZlcnNpb24gKTsKKyAgICByZXR1cm4gQHJldDsKK307ICMgc3ViIGdldF9nbnVfY29tcGlsZXJfdmVyc2lvbgorCisKK3N1YiBnZXRfbXNfY29tcGlsZXJfdmVyc2lvbigpIHsKKyAgICBteSAoICRyYywgJHN0ZG91dCwgJHN0ZGVyciwgJHZlcnNpb24gKTsKKyAgICBteSAkdG9vbCA9ICJjbCI7CisgICAgbXkgKCBAcmV0ICkgPSAoICR0b29sICk7CisgICAgbXkgJG1jX2FyY2hzID0geworICAgICAgICBxcns4MHg4Nn0gICAgICAgICA9PiAiSUEtMzIgYXJjaGl0ZWN0dXJlIiwKKyAgICAgICAgcXJ7QU1ENjR8eDY0fSAgICAgPT4gIkludGVsKFIpIDY0IiwKKyAgICB9OworICAgICRyYyA9IHJ1biggWyAkdG9vbCBdLCAkc3Rkb3V0LCAkc3RkZXJyICk7CisgICAgaWYgKCAkcmMgPCAwICkgeworICAgICAgICByZXR1cm4gQHJldDsKKyAgICB9OyAjIGlmCisgICAgaWYgKCAkc3RkZXJyICF+IG17Xk1pY3Jvc29mdCAuKiBDb21waWxlciBWZXJzaW9uICguKj8pIGZvciAoLiopXHMqJH1tICkgeworICAgICAgICB3YXJuaW5nKCAiQ2Fubm90IHBhcnNlIE1TIGNvbXBpbGVyIG91dHB1dDoiLCAkc3RkZXJyLCAiKGVvZikiICk7CisgICAgICAgIHJldHVybiBAcmV0OworICAgIH07ICMgaWYKKyAgICBteSAoICR2ZXIsICRhcGwgKSA9ICggJDEsICQyICk7CisgICAgaWYgKCAkdmVyICF+IG17XEFcZCsoPzpcLlxkKykrXHp9ICkgeworICAgICAgICB3YXJuaW5nKCAiQ2Fubm90IHBhcnNlIE1TIGNvbXBpbGVyIHZlcnNpb246ICR2ZXIiICk7CisgICAgICAgIHJldHVybiBAcmV0OworICAgIH07ICMgaWYKKyAgICBteSAkbWNfYXJjaCA9IGdldF9hcmNoKCAiTVMgY29tcGlsZXIiLCAkYXBsLCAkbWNfYXJjaHMgKTsKKyAgICBpZiAoIG5vdCBkZWZpbmVkKCAkbWNfYXJjaCApICkgeworICAgICAgICByZXR1cm4gQHJldDsKKyAgICB9OyAjIGlmCisgICAgaWYgKCBQbGF0Zm9ybTo6Y2Fub25fYXJjaCggJG1jX2FyY2ggKSBuZSAkdGFyZ2V0X2FyY2ggKSB7CisgICAgICAgIHdhcm5pbmcoICJUYXJnZXQgYXJjaGl0ZWN0dXJlIGlzICR0YXJnZXRfYXJjaCwgJHRvb2wgZm9yICRtY19hcmNoIGZvdW5kIiApOworICAgICAgICByZXR1cm4gQHJldDsKKyAgICB9OyAjIGlmCisgICAgJHZlcnNpb24gPSAiJHZlciBmb3IgJHRhcmdldF9hcmNoIjsKKyAgICBwdXNoKCBAcmV0LCAkdmVyc2lvbiApOworICAgIHJldHVybiBAcmV0OworfTsgIyBzdWIgZ2V0X21zX2NvbXBpbGVyX3ZlcnNpb24KKworCitzdWIgZ2V0X21zX2xpbmtlcl92ZXJzaW9uKCkgeworICAgIG15ICggJHJjLCAkc3Rkb3V0LCAkc3RkZXJyLCAkdmVyc2lvbiApOworICAgIG15ICR0b29sID0gImxpbmsiOworICAgIG15ICggQHJldCApID0gKCAkdG9vbCApOworICAgIG15ICggJHBhdGggKTsKKyAgICAkcmMgPSBydW4oIFsgJHRvb2wgXSwgJHN0ZG91dCwgJHN0ZGVyciwgJHBhdGggKTsKKyAgICBpZiAoICRyYyA8IDAgKSB7CisgICAgICAgIHJldHVybiBAcmV0OworICAgIH07ICMgaWYKKyAgICBpZiAoICRzdGRvdXQgIX4gbXteTWljcm9zb2Z0IFwoUlwpIEluY3JlbWVudGFsIExpbmtlciBWZXJzaW9uIChcZCsoPzpcLlxkKykrKVxzKiR9bSApIHsKKyAgICAgICAgd2FybmluZyggIkNhbm5vdCBwYXJzZSBNUyBsaW5rZXIgb3V0cHV0OiIsICRzdGRvdXQsICIoZW9mKSIgKTsKKyAgICAgICAgaWYgKCAkc3RkZXJyID1+IG17Xmxpbms6IG1pc3Npbmcgb3BlcmFuZH0gKSB7CisgICAgICAgICAgICB3YXJuaW5nKCAiU2VlbXMgXCIkcGF0aFwiIGlzIGEgVW5peC1saWtlIFwibGlua1wiIHByb2dyYW0sIG5vdCBNUyBsaW5rZXIuIiApOworICAgICAgICB9OyAjIGlmCisgICAgICAgIHJldHVybiBAcmV0OworICAgIH07ICMgaWYKKyAgICAkdmVyc2lvbiA9ICggJDEgKTsKKyAgICBwdXNoKCBAcmV0LCAkdmVyc2lvbiApOworICAgIHJldHVybiBAcmV0OworfTsgIyBzdWIgZ2V0X21zX2xpbmtlcl92ZXJzaW9uCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAibWFpbiIgcHJvZ3JhbS4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworbXkgJG1ha2U7CitteSAkaW50ZWwgICAgICAgPSAxOyAgICAgICAgICAgICAjIENoZWNrIEludGVsIGNvbXBpbGVycy4KK215ICRmb3J0cmFuICAgICA9IDA7ICAgICAgICAgICAgICMgQ2hlY2sgZm9yIGNvcnJlc3BvbmRpbmcgRm9ydHJhbiBjb21waWxlciwgaWZvcnQgZm9yIGludGVsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZm9ydHJhbiBmb3IgZ251IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZm9ydHJhbiBmb3IgY2xhbmcgCitteSAkY2xhbmcgICAgICAgPSAwOyAgICAgICAgICAgICAjIENoZWNrIENsYW5nIENvbXBpbGVycy4KK215ICRpbnRlbF9jb21waWxlcnMgPSB7CisgICAgImxpbiIgPT4geyBjID0+ICJpY2MiLCBjcHAgPT4gImljcGMiLCBmID0+ICJpZm9ydCIgfSwKKyAgICAibHJiIiA9PiB7IGMgPT4gImljYyIsIGNwcCA9PiAiaWNwYyIsIGYgPT4gImlmb3J0IiB9LAorICAgICJtYWMiID0+IHsgYyA9PiAiaWNjIiwgY3BwID0+ICJpY3BjIiwgZiA9PiAiaWZvcnQiIH0sCisgICAgIndpbiIgPT4geyBjID0+ICJpY2wiLCBjcHAgPT4gdW5kZWYsICBmID0+ICJpZm9ydCIgfSwKK307CitteSAkZ251X2NvbXBpbGVycyA9IHsKKyAgICAibGluIiA9PiB7IGMgPT4gImdjYyIsIGNwcCA9PiAgImcrKyIsIGYgPT4gImdmb3J0cmFuIiB9LAorICAgICJtYWMiID0+IHsgYyA9PiAiZ2NjIiwgY3BwID0+ICAiZysrIiwgZiA9PiAiZ2ZvcnRyYW4iIH0sCit9OworbXkgJGNsYW5nX2NvbXBpbGVycyA9IHsKKyAgICAibGluIiA9PiB7IGMgPT4gImNsYW5nIiwgY3BwID0+ICAiY2xhbmcrKyIgfSwKKyAgICAibWFjIiA9PiB7IGMgPT4gImNsYW5nIiwgY3BwID0+ICAiY2xhbmcrKyIgfSwKK307CisKK2dldF9vcHRpb25zKAorICAgIFBsYXRmb3JtOjp0YXJnZXRfb3B0aW9ucygpLAorICAgICJpbnRlbCEiICAgICAgICAgPT4gXCRpbnRlbCwKKyAgICAiZm9ydHJhbiIgICAgICAgID0+IFwkZm9ydHJhbiwKKyAgICAiY2xhbmciICAgICAgICAgID0+IFwkY2xhbmcsCisgICAgIm1ha2UiICAgICAgICAgICA9PiBcJG1ha2UsCisgICAgInBlZGFudGljIiAgICAgICA9PiBcJHBlZGFudGljLAorKTsKKworbXkgQHZlcnNpb25zOworcHVzaCggQHZlcnNpb25zLCBbICJQZXJsIiwgICAgIGdldF9wZXJsX3ZlcnNpb24oKSBdICk7CitwdXNoKCBAdmVyc2lvbnMsIFsgIkdOVSBNYWtlIiwgZ2V0X2dudV9tYWtlX3ZlcnNpb24oKSBdICk7CitpZiAoICRpbnRlbCApIHsKKyAgICBteSAkaWMgPSAkaW50ZWxfY29tcGlsZXJzLT57ICR0YXJnZXRfb3MgfTsKKyAgICBwdXNoKCBAdmVyc2lvbnMsIFsgIkludGVsIEMgQ29tcGlsZXIiLCAgICAgICBnZXRfaW50ZWxfY29tcGlsZXJfdmVyc2lvbiggJGljLT57IGMgfSApIF0gKTsKKyAgICBpZiAoIGRlZmluZWQoICRpYy0+eyBjcHAgfSApICkgeworICAgICAgICAjIElmIEludGVsIEMrKyBjb21waWxlciBoYXMgYSBuYW1lIGRpZmZlcmVudCBmcm9tIEMgY29tcGlsZXIsIGNoZWNrIGl0IGFzIHdlbGwuCisgICAgICAgIHB1c2goIEB2ZXJzaW9ucywgWyAiSW50ZWwgQysrIENvbXBpbGVyIiwgZ2V0X2ludGVsX2NvbXBpbGVyX3ZlcnNpb24oICRpYy0+eyBjcHAgfSApIF0gKTsKKyAgICB9OyAjIGlmCisgICAgIyBmb3J0cmFuIGNoZWNrIG11c3QgYmUgZXhwbGljaXRseSBzcGVjaWZpZWQgb24gY29tbWFuZCBsaW5lIHdpdGggLS1mb3J0cmFuCisgICAgaWYgKCAkZm9ydHJhbiApIHsKKyAgICAgICAgaWYgKCBkZWZpbmVkKCAkaWMtPnsgZiB9ICkgKSB7CisgICAgICAgICAgICBwdXNoKCBAdmVyc2lvbnMsIFsgIkludGVsIEZvcnRyYW4gQ29tcGlsZXIiLCBnZXRfaW50ZWxfY29tcGlsZXJfdmVyc2lvbiggJGljLT57IGYgfSApIF0gKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07Cit9OyAjIGlmCitpZiAoICR0YXJnZXRfb3MgZXEgImxpbiIgb3IgJHRhcmdldF9vcyBlcSAibWFjIiApIHsKKyAgICBpZiAoICRjbGFuZyApIHsKKyAgICAgICAgcHVzaCggQHZlcnNpb25zLCBbICJDbGFuZyBDIENvbXBpbGVyIiwgICAgIGdldF9jbGFuZ19jb21waWxlcl92ZXJzaW9uKCAkY2xhbmdfY29tcGlsZXJzLT57ICR0YXJnZXRfb3MgfS0+eyBjICAgfSApIF0gKTsKKyAgICAgICAgcHVzaCggQHZlcnNpb25zLCBbICJDbGFuZyBDKysgQ29tcGlsZXIiLCAgIGdldF9jbGFuZ19jb21waWxlcl92ZXJzaW9uKCAkY2xhbmdfY29tcGlsZXJzLT57ICR0YXJnZXRfb3MgfS0+eyBjcHAgfSApIF0gKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwdXNoKCBAdmVyc2lvbnMsIFsgIkdOVSBDIENvbXBpbGVyIiwgICAgIGdldF9nbnVfY29tcGlsZXJfdmVyc2lvbiggJGdudV9jb21waWxlcnMtPnsgJHRhcmdldF9vcyB9LT57IGMgICB9ICkgXSApOworICAgICAgICBwdXNoKCBAdmVyc2lvbnMsIFsgIkdOVSBDKysgQ29tcGlsZXIiLCAgIGdldF9nbnVfY29tcGlsZXJfdmVyc2lvbiggJGdudV9jb21waWxlcnMtPnsgJHRhcmdldF9vcyB9LT57IGNwcCB9ICkgXSApOworICAgIH07ICMgaWYKKyAgICAjIGlmIGludGVsIGZvcnRyYW4gaGFzIGJlZW4gY2hlY2tlZCB0aGVuIGdudSBmb3J0cmFuIGlzIHVubmVjZXNzYXJ5CisgICAgIyBhbHNvLCBpZiB1c2VyIHNwZWNpZmllcyBjbGFuZyBhcyBidWlsZCBjb21waWxlciwgdGhlbiBnZm9ydHJhbiBpcyBhc3N1bWVkIGZvcnRyYW4gY29tcGlsZXIKKyAgICBpZiAoICRmb3J0cmFuIGFuZCBub3QgJGludGVsICkgeworICAgICAgICBwdXNoKCBAdmVyc2lvbnMsIFsgIkdOVSBGb3J0cmFuIENvbXBpbGVyIiwgZ2V0X2dudV9jb21waWxlcl92ZXJzaW9uKCAkZ251X2NvbXBpbGVycy0+eyAkdGFyZ2V0X29zIH0tPnsgZiB9ICkgXSApOworICAgIH07IAorfTsgCitpZiAoICR0YXJnZXRfb3MgZXEgIndpbiIgKSB7CisgICAgcHVzaCggQHZlcnNpb25zLCBbICJNUyBDL0MrKyBDb21waWxlciIsICBnZXRfbXNfY29tcGlsZXJfdmVyc2lvbigpIF0gKTsKKyAgICBwdXNoKCBAdmVyc2lvbnMsIFsgIk1TIExpbmtlciIsICAgICAgICAgIGdldF9tc19saW5rZXJfdmVyc2lvbigpIF0gKTsKK307ICMgaWYKKworbXkgJGNvdW50ID0gMDsKK2ZvcmVhY2ggbXkgJGl0ZW0gKCBAdmVyc2lvbnMgKSB7CisgICAgbXkgKCAkdGl0bGUsICR0b29sLCAkdmVyc2lvbiApID0gQCRpdGVtOworICAgIGlmICggbm90IGRlZmluZWQoICR2ZXJzaW9uICkgKSB7CisgICAgICAgICR2ZXJzaW9uID0gIi0tLSBOL0EgLS0tIjsKKyAgICAgICAgKysgJGNvdW50OworICAgIH07ICMgaWYKKyAgICBpZiAoICRtYWtlICkgeworICAgICAgICBwcmludGYoICIlcz0lc1xuIiwgZW5jb2RlKCAkdG9vbCApLCBlbmNvZGUoICR2ZXJzaW9uICkgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoICIlLTI1czogJXNcbiIsICR0aXRsZSwgJHZlcnNpb24gKTsKKyAgICB9OyAjIGlmCit9OyAjIGZvcmVhY2gKKworZXhpdCggJGNvdW50ID09IDAgPyAwIDogMSApOworCitfX0VORF9fCisKKz1wb2QKKworPWhlYWQxIE5BTUUKKworQjxjaGVjay10b29scy5wbD4gLS0gQ2hlY2sgZGV2ZWxvcG1lbnQgdG9vbHMgYXZhaWxhYmlsaXR5IGFuZCB2ZXJzaW9ucy4KKworPWhlYWQxIFNZTk9QU0lTCisKK0I8Y2hlY2stdG9vbHMucGw+IEk8T1BUSU9OPi4uLgorCis9aGVhZDEgT1BUSU9OUworCis9b3ZlcgorCis9aXRlbSBCPC0tbWFrZT4KKworUHJvZHVjZSBvdXRwdXQgc3VpdGFibGUgZm9yIHVzaW5nIGluIG1ha2VmaWxlOiBzaG9ydCB0b29sIG5hbWVzIChlLiBnLiAiaWNjIiBpbnN0ZWFkIG9mICJJbnRlbCBDCitDb21waWxlciIpLCBzcGFjZXMgaW4gdmVyc2lvbiBzdHJpbmdzIHJlcGxhY2VkIHdpdGggdW5kZXJzY29yZXMuCisKKz1pdGVtIFRvb2xzIHNlbGVjdGlvbgorCis9b3ZlcgorCis9aXRlbSBCPC0tPltCPG5vLT5dQjwtZ251LWZvcnRyYW4+CisKK0NoZWNrIEdOVSBGb3J0cmFuIGNvbXBpbGVyLiBCeSBkZWZhdWx0LCBpdCBpcyBub3QgY2hlY2tlZC4KKworPWl0ZW0gQjwtLT5bQjxuby0+XUI8aW50ZWw+CisKK0NoZWNrIEludGVsIEMsIEMrKyBhbmQgRm9ydHJhbiBjb21waWxlcnMuIFRoaXMgaXMgZGVmYXVsdC4KKworPWJhY2sKKworPWl0ZW0gUGxhdGZvcm0gc2VsZWN0aW9uCisKKz1vdmVyCisKKz1pdGVtIEI8LS1hcmNoaXRlY3R1cmU9Pkk8c3RyPgorCitTcGVjaWZ5IHRhcmdldCBhcmNoaXRlY3R1cmUuIFVzZWQgaW4gY3Jvc3MtYnVpbGRzLCBmb3IgZXhhbXBsZSB3aGVuIGJ1aWxkaW5nIDMyLWJpdCBhcHBsaWNhdGlvbnMgb24KK0ludGVsKFIpIDY0IG1hY2hpbmUuCisKK0lmIGFyY2hpdGVjdHVyZSBpcyBub3Qgc3BlY2lmaWVkIGV4cGxpY2l0bHksIHZhbHVlIG9mIExJQk9NUF9BUkNIIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHVzZWQuCitJZiBMSUJPTVBfQVJDSCBpcyBub3QgZGVmaW5lZCwgaG9zdCBhcmNoaXRlY3R1cmUgZGV0ZWN0ZWQuCisKKz1pdGVtIEI8LS1vcz0+STxzdHI+CisKK1NwZWNpZnkgdGFyZ2V0IE9TIG5hbWUuIFVzZWQgaW4gY3Jvc3MtYnVpbGRzLCBmb3IgZXhhbXBsZSB3aGVuIGJ1aWxkaW5nIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZSBhcHBsaWNhdGlvbnMgb24KK1dpbmRvd3MqIE9TLgorCitJZiBPUyBpcyBub3Qgc3BlY2lmaWVkIGV4cGxpY2l0bHksIHZhbHVlIG9mIExJQk9NUF9PUyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyB1c2VkLgorSWYgTElCT01QX09TIGlzIG5vdCBkZWZpbmVkLCBob3N0IE9TIGRldGVjdGVkLgorCis9YmFjaworCis9YmFjaworCis9aGVhZDIgU3RhbmRhcmQgT3B0aW9ucworCis9b3ZlcgorCis9aXRlbSBCPC0tZG9jPgorCis9aXRlbSBCPC0tbWFudWFsPgorCitQcmludCBmdWxsIGhlbHAgbWVzc2FnZSBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLWhlbHA+CisKK1ByaW50IHNob3J0IGhlbHAgbWVzc2FnZSBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLXVzYWdlPgorCitQcmludCB2ZXJ5IHNob3J0IHVzYWdlIG1lc3NhZ2UgYW5kIGV4aXQuCisKKz1pdGVtIEI8LS12ZXJib3NlPgorCitEbyBwcmludCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLgorCis9aXRlbSBCPC0tdmVyc2lvbj4KKworUHJpbnQgdmVyc2lvbiBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLXF1aWV0PgorCitXb3JrIHF1aWV0LCBkbyBub3QgcHJpbnQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcy4KKworPWJhY2sKKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoaXMgc2NyaXB0IGNoZWNrcyBhdmFpbGFiaWxpdHkgYW5kIHZlcnNpb25zIG9mIGRldmVsb3BtZW50IHRvb2xzLiBCeSBkZWZhdWx0LCB0aGUgc2NyaXB0IGNoZWNrczoKK1BlcmwsIEdOVSBNYWtlLCBJbnRlbCBjb21waWxlcnMsIEdOVSBDIGFuZCBDKysgY29tcGlsZXJzIChMaW51eCogT1MgYW5kIE9TIFgqKSwKK01pY3Jvc29mdCBDL0MrKyBjb21waWxlciBhbmQgbGlua2VyIChXaW5kb3dzKiBPUykuCisKK1RoZSBzcmlwdCBwcmludHMgbmljZSBsb29raW5nIHRhYmxlIG9yIG1hY2hpbmUtcmVhZGFibGUgc3RyaW5ncy4KKworPWhlYWQyIEVYSVQKKworPW92ZXIKKworPWl0ZW0gKgorCiswIC0tIEFsbCBwcm9ncmFtcyBmb3VuZC4KKworPWl0ZW0gKgorCisxIC0tIFNvbWUgb2YgdG9vbHMgYXJlIG5vdCBmb3VuZC4KKworPWJhY2sKKworPWhlYWQxIEVYQU1QTEVTCisKKyAgICAkIGNoZWNrLXRvb2xzLnBsCisgICAgUGVybCAgICAgICAgICAgICAgICAgICAgIDogNS44LjAKKyAgICBHTlUgTWFrZSAgICAgICAgICAgICAgICAgOiAzLjc5LjEKKyAgICBJbnRlbCBDIENvbXBpbGVyICAgICAgICAgOiAxMS4wICgyMDA4MDkzMCkgZm9yIDMyZQorICAgIEludGVsIEMrKyBDb21waWxlciAgICAgICA6IDExLjAgKDIwMDgwOTMwKSBmb3IgMzJlCisgICAgSW50ZWwgRm9ydHJhbiBDb21waWxlciAgIDogMTAuMS4wMDggKDIwMDcwOTEzKSBmb3IgMzJlCisgICAgR05VIEMgQ29tcGlsZXIgICAgICAgICAgIDogMy4yLjMgKDIwMDMwNTAyKQorICAgIEdOVSBDKysgQ29tcGlsZXIgICAgICAgICA6IDMuMi4zICgyMDAzMDUwMikKKworICAgID4gY2hlY2stdG9vbHMucGwgLS1tYWtlCisgICAgcGVybD01LjguOAorICAgIG1ha2U9My44MQorICAgIGljbD0xMC4xXygyMDA3MDkxMylfZm9yXzMyZQorICAgIGlmb3J0PTEwLjFfKDIwMDcwOTEzKV9mb3JfMzJlCisgICAgY2w9MTQuMDAuNDAzMTAuNDFfZm9yXzMyZQorICAgIGxpbms9OC4wMC40MDMxMC4zOQorCis9YmFjaworCis9Y3V0CisKKyMgZW5kIG9mIGZpbGUgIworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rvb2xzL2NvbW1vbi5pbmMgYi9maW5hbC9ydW50aW1lL3Rvb2xzL2NvbW1vbi5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIxMzI1MQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvY29tbW9uLmluYwpAQCAtMCwwICsxLDk4IEBACisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKK2lmbmRlZiBvbXBfb3MKKworICAjIFdpbmRvd3Mgc2V0cyBlbnZpcm9ubWVudCB2YXJpYWJsZSBPUzsgZm9yIG90aGVyIHN5c3RlbXMsIGFzayB1bmFtZQorICBpZmVxICgkKE9TKSwpCisgICAgT1M6PSQoc2hlbGwgdW5hbWUpCisgICAgaWZlcSAoJChPUyksKQorICAgICAgJChlcnJvciAiQ2Fubm90IGRldGVjdCBvcGVyYXRpbmcgc3lzdGVtIikKKyAgICBlbmRpZgorICAgIGV4cG9ydCBvbXBfb3M9JChPUykKKyAgZW5kaWYKKworICBpZmVxICgkKE9TKSwgV2luZG93c19OVCkKKyAgICBleHBvcnQgb21wX29zPXdpbmRvd3MKKyAgZW5kaWYKKyAgaWZlcSAoJChPUyksIExpbnV4KQorICAgIGV4cG9ydCBvbXBfb3M9bGludXgKKyAgZW5kaWYKKyAgaWZlcSAoJChPUyksIEZyZWVCU0QpCisgICAgZXhwb3J0IG9tcF9vcz1mcmVlYnNkCisgIGVuZGlmCisgIGlmZXEgKCQoT1MpLCBEYXJ3aW4pCisgICAgZXhwb3J0IG9tcF9vcz1tYWNvcworICBlbmRpZgorCitlbmRpZiAjICFvbXBfb3MKKworIyBDb21waWxpbmcgZm9yIHRoZSBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBhcmNoaXRlY3R1cmUgaXMgbm9uLXRyaXZpYWwgYXQgdGhlIG5leHQgbGF5ZXIKKyMgb2Ygc2NyaXB0IGRvd24sIGJ1dCB3ZSBjYW4gbWFrZSBpdCBjb25zaXN0ZW50IGhlcmUuCitpZmVxICIkKGFyY2gpIiAibWljIgorICAgICMgSSByZWFsbHkgZG8gbWVhbiB0aGlzLi4uCisgICAgb3ZlcnJpZGUgYXJjaDo9MzJlCisgICAgb3ZlcnJpZGUgbWljOj15ZXMKK2Vsc2UKKyAgICBvdmVycmlkZSBtaWM6PW5vCitlbmRpZgorCitpZmVxICgsJCh3aWxkY2FyZCAkKG9tcF9yb290KS90b29scy8kKG9tcF9vcykuaW5jKSkKKyAgJChlcnJvciAiJChvbXBfb3MpIiBpcyBub3Qgc3VwcG9ydGVkLiBBZGQgdG9vbHMvJChvbXBfb3MpLmluYyBmaWxlIHdpdGggb3Mtc3BlY2lmaWMgc2V0dGluZ3MgKQorZW5kaWYKKworIyBkZXRlY3QgYXJjaCBhbmQgcnVudGltZSB2ZXJzaW9ucywgcHJvdmlkZSBjb21tb24gaG9zdC1zcGVjaWZpYyBkZWZpbml0aW9ucworaW5jbHVkZSAkKG9tcF9yb290KS90b29scy8kKG9tcF9vcykuaW5jCisKK2lmZXEgKCQoYXJjaCksKQorICQoZXJyb3IgQXJjaGl0ZWN0dXJlIG5vdCBkZXRlY3RlZCkKK2VuZGlmCisKKyMgU2V0dGluZyBkZWZhdWx0cworbW9kZT89cmVsZWFzZQorCitpZmVxICIkKGZpbHRlciAzMiAzMmUgNjQsJChhcmNoKSkiICIiCisgICAgY29tcGlsZXI/PWdjYworZWxzZQorICAgIGlmZXEgIiQob21wX29zKSIgIndpbmRvd3MiCisgICAgICAgIGNvbXBpbGVyPz1pY2wKKyAgICBlbHNlCisgICAgICAgIGNvbXBpbGVyPz1pY2MKKyAgICBlbmRpZgorZW5kaWYKKworaWZuZXEgIiQobWljKSIgIm5vIgorICAgIGlmZXEgIiQoY29tcGlsZXIpIiAiZ2NjIgorCSQoZXJyb3IgQ29tcGlsaW5nIHRoZSBydW50aW1lIHdpdGggZ2NjIGlzIG5vdCBzdXBwb3J0ZWQgb24gSW50ZWxcKFJcKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUpCisgICAgZW5kaWYKKworICAgICMgTWFnaWMgZmxhZ3MgZm9yIHRoZSBidWlsZCBzY3JpcHQhCisgICAgYnVpbGRfYXJncyArPSAtLW9zPWxyYiAtLW1pYy1hcmNoPWtuYyAtLW1pYy1vcz1saW4gLS1taWMtY29tcD1vZmZsb2FkCisKKyAgICAjIENoZWNrIHRoYXQgdGhlIGJpbnV0aWxzIGZvciBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUgYXJlIGF2YWlsYWJsZQorICAgICMgRmlyc3Qgd2Ugc2VlIHdoZXRoZXIgdGhlIG9iamR1bXAgb24gdGhlIHVzZXIncyBwYXRoIHN1cHBvcnRzIHRoZSBrMW9tIGFyY2hpdGVjdHVyZS4KKyAgICBoYXNrMW9tID0gJChzaGVsbCBpZiAob2JqZHVtcCAtLWhlbHAgfCBncmVwIC1zIGsxb20pOyB0aGVuIGVjaG8gT0s7IGVsc2UgZWNobyBLTzsgZmkpCisgICAgaWZuZXEgIiQoaGFzazFvbSkiICJPSyIKKyAgICAgICAgIyBBcHByb3ByaWF0ZSBiaW51dGlscyBhcmUgbm90IGFscmVhZHkgc2V0IHVwLCBzbyB0cnkgdG8gYWRkIHRoZW0gZnJvbSB0aGUgZGVmYXVsdCBwbGFjZS4KKyAgICAgICAgbWljQmluUGF0aCA9IC91c3IvbGludXgtazFvbS00LjcveDg2XzY0LWsxb20tbGludXgvYmluCisgICAgICAgIG1pY0JpblByZXNlbnQgPSAkKHNoZWxsIGlmIHRlc3QgLWQgJChtaWNCaW5QYXRoKTsgdGhlbiBlY2hvIE9LOyBlbHNlIGVjaG8gS087IGZpKQorICAgICAgICBpZm5lcSAiJChtaWNCaW5QcmVzZW50KSIgIk9LIgorICAgICAgICAgICAgIyBXZSBjYW4ndCBmaW5kIHRoZW0gaW4gdGhlIG5vcm1hbCBwbGFjZSwgc28gY29tcGxhaW4uCisgICAgICAgICAgICAkKGVycm9yIENvbXBpbGluZyBmb3IgSW50ZWxcKFJcKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUgcmVxdWlyZXMgdGhhdCB0aGUgY3Jvc3MtaG9zdGVkIGJpbnV0aWxzIGFyZSBhdmFpbGFibGUgaW4gJChtaWNCaW5QYXRoKS5cCitTZWUgdGhlIFRvb2xzIHRhYiBhdCBodHRwOi8vc29mdHdhcmUuaW50ZWwuY29tL21pYy1kZXZlbG9wZXIpCisgICAgICAgIGVuZGlmCisgICAgICAgIGV4cG9ydCBQQVRIIDo9ICQobWljQmluUGF0aCk6JHtQQVRIfQorICAgIGVuZGlmCitlbmRpZgorCitleHBvcnQgQlVJTERfQ09NUElMRVIgOj0gJChjb21waWxlcikKKworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rvb2xzL2V4cGFuZC12YXJzLnBsIGIvZmluYWwvcnVudGltZS90b29scy9leHBhbmQtdmFycy5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MGE2NDkwCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90b29scy9leHBhbmQtdmFycy5wbApAQCAtMCwwICsxLDMwNiBAQAorIyEvdXNyL2Jpbi9wZXJsCisKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIEZpbmRCaW47Cit1c2UgbGliICIkRmluZEJpbjo6QmluL2xpYiI7CisKK3VzZSB0b29sczsKKworb3VyICRWRVJTSU9OID0gIjAuMDA1IjsKKworbXkgJG5hbWVfcmV4cCAgICA9IHFye1tBLVphLXpfXStbQS1aYS16MC05X10qfTsKK215ICRrZXl3b3JkX3JleHAgPSBxcntpZnxlbHNlfGVuZHxvbXB9OworCitzdWIgZXJyb3IoJCQkKSB7CisgICAgbXkgKCAkaW5wdXQsICRtc2csICRidWxrICkgPSBAXzsKKyAgICBteSAkcG9zID0gcG9zKCAkJGJ1bGsgKTsKKyAgICAkJGJ1bGsgPX4gbXteKC4qPylcRyguKj8pJH1tIG9yIGRpZSAiSW50ZXJuYWwgZXJyb3IiOworICAgIG15ICggJHByZSwgJHBvc3QgKSA9ICggJDEsICQyICk7CisgICAgbXkgJG4gPSBzY2FsYXIoIEB7IFsgc3Vic3RyKCAkJGJ1bGssIDAsICRwb3MgKSA9fiBte1xufWcgXSB9ICkgKyAxOworICAgIHJ1bnRpbWVfZXJyb3IoICJcIiRpbnB1dFwiIGxpbmUgJG46ICRtc2c6IiwgIj4+PiAiIC4gJHByZSAuICItLVtIRVJFXS0tPiIgLiAkcG9zdCApOworfTsgIyBzdWIgZXJyb3IKKworc3ViIGV2YWx1YXRlKCQkJFwkKSB7CisgICAgbXkgKCAkZXhwciwgJHN0cmljdCwgJGlucHV0LCAkYnVsayApID0gQF87CisgICAgbXkgJHZhbHVlOworICAgIHsgIyBTaWduYWwgaGFuZGxlciB3aWxsIGJlIHJlc3RvcmVkIG9uIGV4aXQgZnJvbSB0aGlzIGJsb2NrLgorICAgICAgICAjIEluIGNhc2Ugb2YgInVzZSBzdHJpY3Q7IHVzZSB3YXJuaW5ncyIgZXZhbCBpc3N1ZXMgd2FybmluZ3MgdG8gc3RkZXJyLiBUaGlzIGRpcmVjdAorICAgICAgICAjIG91dHB1dCBtYXkgY29uZnVzZSB1c2VyLCBzbyB3ZSBuZWVkIHRvIGNhdGNoIGl0IGFuZCBwcmVwZW5kIHdpdGggb3VyIGluZm8uCisgICAgICAgIGxvY2FsICRTSUd7IF9fV0FSTl9fIH0gPSBzdWIgeyBkaWUgQF87IH07CisgICAgICAgICR2YWx1ZSA9CisgICAgICAgICAgICBldmFsKAorICAgICAgICAgICAgICAgICJwYWNrYWdlIF9fRVhQQU5EX1ZBUlNfXztcbiIgLgorICAgICAgICAgICAgICAgICggJHN0cmljdCA/ICJ1c2Ugc3RyaWN0OyB1c2Ugd2FybmluZ3M7XG4iIDogIm5vIHN0cmljdDsgbm8gd2FybmluZ3M7XG4iICkgLgorICAgICAgICAgICAgICAgICRleHByCisgICAgICAgICAgICApOworICAgIH07CisgICAgaWYgKCAkQCApIHsKKyAgICAgICAgIyBEcm9wIGxvY2F0aW9uIGluZm9ybWF0aW9uIC0tIGluY3JlYXNpbmcgZXZhbCBudW1iZXIgYW5kIGNvbnN0YW50ICJsaW5lIDMiCisgICAgICAgICMgaXMgdXNlbGVzcyBmb3IgdGhlIHVzZXIuCisgICAgICAgICRAID1+IHN7IGF0IFwoZXZhbCBcZCtcKSBsaW5lIFxkK317fWc7CisgICAgICAgICRAID1+IHN7XHMqXHp9e307CisgICAgICAgIGVycm9yKCAkaW5wdXQsICJDYW5ub3QgZXZhbHVhdGUgZXhwcmVzc2lvbiBcIlwke3skZXhwcn19XCI6ICRAIiwgJGJ1bGsgKTsKKyAgICB9OyAjIGlmCisgICAgaWYgKCAkc3RyaWN0IGFuZCBub3QgZGVmaW5lZCggJHZhbHVlICkgKSB7CisgICAgICAgIGVycm9yKCAkaW5wdXQsICJTdWJzdGl0dXRpb24gdmFsdWUgaXMgdW5kZWZpbmVkIiwgJGJ1bGsgKTsKKyAgICB9OyAjIGlmCisgICAgcmV0dXJuICR2YWx1ZTsKK307ICMgc3ViIGV2YWx1YXRlCisKKyMKKyMgUGFyc2UgY29tbWFuZCBsaW5lLgorIworCitteSAoIEBkZWZpbmVzLCAkaW5wdXQsICRvdXRwdXQsICRzdHJpY3QgKTsKK2dldF9vcHRpb25zKAorICAgICJEfGRlZmluZT1zIiA9PiBcQGRlZmluZXMsCisgICAgInN0cmljdCEiICAgID0+IFwkc3RyaWN0LAorKTsKK2lmICggQEFSR1YgPCAyICkgeworICAgIGNtZGxpbmVfZXJyb3IoICJOb3QgZW5vdWdoIGFyZ3VtZW50IiApOworfTsgIyBpZgoraWYgKCBAQVJHViA+IDIgKSB7CisgICAgY21kbGluZV9lcnJvciggIlRvbyBtYW55IGFyZ3VtZW50KHMpIiApOworfTsgIyBpZgorKCAkaW5wdXQsICRvdXRwdXQgKSA9IEBBUkdWOworCitmb3JlYWNoIG15ICRkZWZpbmUgKCBAZGVmaW5lcyApIHsKKyAgICBteSAoICRlcXVhbCwgJG5hbWUsICR2YWx1ZSApOworICAgICRlcXVhbCA9IGluZGV4KCAkZGVmaW5lLCAiPSIgKTsKKyAgICBpZiAoICRlcXVhbCA8IDAgKSB7CisgICAgICAgICRuYW1lID0gJGRlZmluZTsKKyAgICAgICAgJHZhbHVlID0gIiI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgJG5hbWUgPSBzdWJzdHIoICRkZWZpbmUsIDAsICRlcXVhbCApOworICAgICAgICAkdmFsdWUgPSBzdWJzdHIoICRkZWZpbmUsICRlcXVhbCArIDEgKTsKKyAgICB9OyAjIGlmCisgICAgaWYgKCAkbmFtZSBlcSAiIiApIHsKKyAgICAgICAgY21kbGluZV9lcnJvciggIklsbGVnYWwgZGVmaW5pdGlvbjogXCIkZGVmaW5lXCI6IHZhcmlhYmxlIG5hbWUgc2hvdWxkIG5vdCBiZSBlbXB0eS4iICk7CisgICAgfTsgIyBpZgorICAgIGlmICggJG5hbWUgIX4gbXtcQSRuYW1lX3JleHBcen0gKSB7CisgICAgICAgIGNtZGxpbmVfZXJyb3IoCisgICAgICAgICAgICAiSWxsZWdhbCBkZWZpbml0aW9uOiBcIiRkZWZpbmVcIjogIiAuCisgICAgICAgICAgICAgICAgInZhcmlhYmxlIG5hbWUgc2hvdWxkIGNvbnNpc3Qgb2YgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuIgorICAgICAgICApOworICAgIH07ICMgaWYKKyAgICBldmFsKCAiXCRfX0VYUEFORF9WQVJTX186OiRuYW1lID0gXCR2YWx1ZTsiICk7CisgICAgaWYgKCAkQCApIHsKKyAgICAgICAgZGllKCAiSW50ZXJuYWwgZXJyb3I6ICRAIiApOworICAgIH07ICMgaWYKK307ICMgZm9yZWFjaCAkZGVmaW5lCisKKyMKKyMgRG8gdGhlIHdvcmsuCisjCisKK215ICRidWxrOworCisjIFJlYWQgaW5wdXQgZmlsZS4KKyRidWxrID0gcmVhZF9maWxlKCAkaW5wdXQgKTsKKworIyBEbyB0aGUgcmVwbGFjZW1lbnRzLgorJGJ1bGsgPX4KKyAgICBzeyg/OlwkKCRrZXl3b3JkX3JleHApfFwkKCRuYW1lX3JleHApfFwke3soLio/KX19KX0KKyAgICB7CisgICAgICAgIG15ICR2YWx1ZTsKKyAgICAgICAgaWYgKCBkZWZpbmVkKCAkMSApICkgeworICAgICAgICAgICAgIyBLZXl3b3JkLiBMZWF2ZSBpdCBhcyBpcy4KKyAgICAgICAgICAgICR2YWx1ZSA9ICJcJCQxIjsKKyAgICAgICAgfSBlbHNpZiAoIGRlZmluZWQoICQyICkgKSB7CisgICAgICAgICAgICAjIFZhcmlhYmxlIHRvIGV4cGFuZC4KKyAgICAgICAgICAgIG15ICRuYW1lID0gJDI7CisgICAgICAgICAgICAkdmFsdWUgPSBldmFsKCAiXCRfX0VYUEFORF9WQVJTX186OiRuYW1lIiApOworICAgICAgICAgICAgaWYgKCAkQCApIHsKKyAgICAgICAgICAgICAgICBkaWUoICJJbnRlcm5hbCBlcnJvciIgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgIGlmICggJHN0cmljdCBhbmQgbm90IGRlZmluZWQoICR2YWx1ZSApICkgeworICAgICAgICAgICAgICAgIGVycm9yKCAkaW5wdXQsICJWYXJpYWJsZSBcIlwkJG5hbWVcIiBub3QgZGVmaW5lZCIsIFwkYnVsayApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgIyBQZXJsIGNvZGUgdG8gZXZhbHVhdGUuCisgICAgICAgICAgICBteSAkZXhwciA9ICQzOworICAgICAgICAgICAgJHZhbHVlID0gZXZhbHVhdGUoICRleHByLCAkc3RyaWN0LCAkaW5wdXQsICRidWxrICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgJHZhbHVlOworICAgIH1nZXM7CisKKyMgUHJvY2VzcyBjb25kaXRpb25hbHMuCisjIERpcnR5IHBhdGNoISBOZXN0ZWQgY29uZGl0aW9uYWxzIG5vdCBzdXBwb3J0ZWQhCisjIFRPRE86IEltcGxlbWVudCBuZXN0ZWQgY29uc3RydWN0cy4KKyRidWxrID1+CisgICAgc3teXCRpZiArKFteXG5dKikgKlxuKC4qXG4pXCRlbHNlICpcbiguKlxuKVwkZW5kICpcbn0KKyAgICB7CisgICAgICAgIG15ICggJGV4cHIsICR0aGVuX3BhcnQsICRlbHNlX3BhcnQgKSA9ICggJDEsICQyLCAkMyApOworICAgICAgICBteSAkdmFsdWUgPSBldmFsdWF0ZSggJGV4cHIsICRzdHJpY3QsICRpbnB1dCwgJGJ1bGsgKTsKKyAgICAgICAgaWYgKCAkdmFsdWUgKSB7CisgICAgICAgICAgICAkdmFsdWUgPSAkdGhlbl9wYXJ0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHZhbHVlID0gJGVsc2VfcGFydDsKKyAgICAgICAgfTsgIyBpZgorICAgIH1nZXNtOworCisjIFdyaXRlIG91dHB1dC4KK3dyaXRlX2ZpbGUoICRvdXRwdXQsIFwkYnVsayApOworCitleGl0KCAwICk7CisKK19fRU5EX18KKworPXBvZAorCis9aGVhZDEgTkFNRQorCitCPGV4cGFuZC12YXJzLnBsPiAtLSBTaW1wbGUgdGV4dCBwcmVwcm9jZXNzb3IuCisKKz1oZWFkMSBTWU5PUFNJUworCitCPGV4cGFuZC12YXJzLnBsPiBJPE9QVElPTj4uLi4gSTxpbnB1dD4gSTxvdXRwdXQ+CisKKz1oZWFkMSBPUFRJT05TCisKKz1vdmVyCisKKz1pdGVtIEI8LUQ+IEk8bmFtZT5bQjw9Pkk8dmFsdWU+XQorCis9aXRlbSBCPC0tZGVmaW5lPT5JPG5hbWU+W0I8PT5JPHZhbHVlPl0KKworRGVmaW5lIHZhcmlhYmxlLgorCis9aXRlbSBCPC0tc3RyaWN0PgorCitJbiBzdHJpY3QgbW9kZSwgdGhlIHNjcmlwdCBpc3N1ZXMgZXJyb3Igb24gdXNpbmcgdW5kZWZpbmVkIHZhcmlhYmxlcyBhbmQgZXhlY3V0ZXMgUGVybCBjb2RlCit3aXRoIEM8dXNlIHN0cmljdDsgdXNlIHdhcm5pbmdzOz4gcHJhZ21hcy4KKworPWJhY2sKKworPWhlYWQyIFN0YW5kYXJkIE9wdGlvbnMKKworPW92ZXIKKworPWl0ZW0gQjwtLWRvYz4KKworPWl0ZW0gQjwtLW1hbnVhbD4KKworUHJpbnQgZnVsbCBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQuCisKKz1pdGVtIEI8LS1oZWxwPgorCitQcmludCBzaG9ydCBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQuCisKKz1pdGVtIEI8LS11c2FnZT4KKworUHJpbnQgdmVyeSBzaG9ydCB1c2FnZSBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0tdmVyYm9zZT4KKworRG8gcHJpbnQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcy4KKworPWl0ZW0gQjwtLXZlcnNpb24+CisKK1ByaW50IHZlcnNpb24gYW5kIGV4aXQuCisKKz1pdGVtIEI8LS1xdWlldD4KKworV29yayBxdWlldCwgZG8gbm90IHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMuCisKKz1iYWNrCisKKz1oZWFkMSBBUkdVTUVOVFMKKworPW92ZXIKKworPWl0ZW0gSTxpbnB1dD4KKworSW5wdXQgZmlsZSBuYW1lLgorCis9aXRlbSBJPG91dHB1dD4KKworT3V0cHV0IGZpbGUgbmFtZS4KKworPWJhY2sKKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoaXMgc2NyaXB0IHJlYWRzIGlucHV0IGZpbGUsIG1ha2VzIHN1YnN0aXR1dGVzIGFuZCB3cml0ZXMgb3V0cHV0IGZpbGUuCisKK1RoZXJlIGFyZSB0d28gZm9ybSBvZiBzdWJzdGl0dXRlczoKKworPW92ZXIKKworPWl0ZW0gVmFyaWFibGVzCisKK1ZhcmlhYmxlcyBhcmUgcmVmZXJlbmNlZCBpbiBpbnB1dCBmaWxlIGluIGZvcm06CisKKyAgICAkbmFtZQorCitOYW1lIG9mIHZhcmlhYmxlIHNob3VsZCBjb25zaXN0IG9mIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIChMYXRpbiBsZXR0ZXJzLCBkaWdpdHMsIGFuZCB1bmRlcnNjb3JlcykuCitWYXJpYWJsZXMgYXJlIGRlZmluZWQgaW4gY29tbWFuZCBsaW5lIHdpdGggQzwtRD4gb3IgQzwtLWRlZmluZT4gb3B0aW9ucy4KKworPWl0ZW0gUGVybCBDb2RlCisKK1BlcmwgY29kZSBpcyBzcGVjaWZpZWQgaW4gaW5wdXQgZmlsZSBpbiBmb3JtOgorCisgICAgJHt7IC4uLmNvZGUuLi4gfX0KKworVGhlIGNvZGUgaXMgZXZhbHVhdGVkLCBhbmQgaXMgcmVwbGFjZWQgd2l0aCBpdHMgcmVzdWx0LiBOb3RlOiBpbiBzdHJpY3QgbW9kZSwgeW91IHNob3VsZCBkZWNsYXJlCit2YXJpYWJsZSBiZWZvcmUgdXNlLiBTZWUgZXhhbXBsZXMuCisKKz1iYWNrCisKKz1oZWFkMSBFWEFNUExFUworCitSZXBsYWNlIG9jY3VycmVuY2VzIG9mIEM8JHllYXI+LCBDPCRtb250aD4sIGFuZCBDPCRkYXk+IGluIEM8aW5wdXQudHh0PiBmaWxlIHdpdGggQzwyMDA3PiwgQzwwOT4sIEM8MDE+CityZXNwZWN0aXZlbHkgYW5kIHdyaXRlIHJlc3VsdCB0byBDPG91dHB1dC50eHQ+IGZpbGU6CisKKyAgICAkIGNhdCBpbnB1dC52YXIKKyAgICBUb2RheSBpcyAkeWVhci0kbW9udGgtJGRheS4KKyAgICAkIGV4cGFuZC12YXJzLnBsIC1EIHllYXI9MjAwNyAtRCBtb250aD0wOSAtRCBkYXk9MDEgaW5wdXQudmFyIG91dHB1dC50eHQgJiYgY2F0IG91dHB1dC50eHQKKyAgICBUb2RheSBpcyAyMDA3LTA5LTAxLgorCitVc2luZyBQZXJsIGNvZGU6CisKKyAgICAkIGNhdCBpbnB1dC52YXIKKyAgICAke3sgbG9jYWx0aW1lKCk7IH19CisgICAgJCBleHBhbmQtdmFycy5wbCAtRCB5ZWFyPTIwMDcgLUQgbW9udGg9MDkgLUQgZGF5PTAxIGlucHV0LnZhciBvdXRwdXQudHh0ICYmIGNhdCBvdXRwdXQudHh0CisgICAgTm93IFR1ZSBNYXkgIDUgMjA6NTQ6MTMgMjAwOQorCitVc2luZyBzdHJpY3QgbW9kZSBmb3IgY2F0Y2hpbmcgYnVnczoKKworICAgICQgY2F0IGlucHV0LnZhcgorICAgICR7eyAieWVhciA6ICIgLiBzdWJzdHIoICRkYXRlLCAwLCA0ICk7IH19CisgICAgJCBleHBhbmQtdmFycy5wbCBpbnB1dC52YXIgb3V0cHV0LnR4dCAmJiBjYXQgb3V0cHV0LnR4dAorICAgIHllYXIgOgorCitPb3BzLCB3aHkgaXQgZG9lcyBub3QgcHJpbnQgeWVhcj8gTGV0IHVzIHVzZSBzdHJpY3QgbW9kZToKKworICAgICQgZXhwYW5kLXZhcnMucGwgLS1zdHJpY3QgaW5wdXQudmFyIG91dHB1dC50eHQgJiYgY2F0IG91dHB1dC50eHQKKyAgICBleHBhbmQtdmFycy5wbDogKHgpICJ0ZXN0LnZhciI6IENhbm5vdCBldmFsdWF0ZSBleHByZXNzaW9uICIke3sgInllYXIgOiAiIC4gc3Vic3RyKCAkZGF0ZSwgMCwgNCApOyB9fSI6IEdsb2JhbCBzeW1ib2wgIiRkYXRlIiByZXF1aXJlcyBleHBsaWNpdCBwYWNrYWdlIG5hbWUKKworT2ssIHZhcmlhYmxlIGlzIG5vdCBkZWZpbmVkLiBMZXQgdXMgZGVmaW5lIGl0OgorCisgICAgJCBleHBhbmQtdmFycy5wbCAtLXN0cmljdCAtRCBkYXRlPTIwMDkwNTAxIGlucHV0LnZhciBvdXRwdXQudHh0ICYmIGNhdCBvdXRwdXQudHh0CisgICAgZXhwYW5kLXZhcnMucGw6ICh4KSAidGVzdC52YXIiOiBDYW5ub3QgZXZhbHVhdGUgZXhwcmVzc2lvbiAiJHt7ICJ5ZWFyIDogIiAuIHN1YnN0ciggJGRhdGUsIDAsIDQgKTsgfX0iOiBWYXJpYWJsZSAiJGRhdGUiIGlzIG5vdCBpbXBvcnRlZAorCitXaGF0IGlzIHdyb25nPyBWYXJpYWJsZSBzaG91bGQgYmUgZGVjbGFyZWQ6CisKKyAgICAkIGNhdCBpbnB1dC52YXIKKyAgICAke3sgb3VyICRkYXRlOyAieWVhciA6ICIgLiBzdWJzdHIoICRkYXRlLCAwLCA0ICk7IH19CisgICAgJCBleHBhbmQtdmFycy5wbCAtLXN0cmljdCAtRCBkYXRlPTIwMDkwNTAxIGlucHV0LnZhciBvdXRwdXQudHh0ICYmIGNhdCBvdXRwdXQudHh0CisgICAgeWVhciA6IDIwMDkKKworPWN1dAorCisjIGVuZCBvZiBmaWxlICMKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdG9vbHMvZXh0cmFjdC1vYmplY3RzLnBsIGIvZmluYWwvcnVudGltZS90b29scy9leHRyYWN0LW9iamVjdHMucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDRiZTZlYQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvZXh0cmFjdC1vYmplY3RzLnBsCkBAIC0wLDAgKzEsMjU4IEBACisjIS91c3IvYmluL2VudiBwZXJsCisKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIEZpbGU6Okdsb2IgIjpnbG9iIjsKK3VzZSBGaWxlOjpUZW1wOwordXNlIEN3ZDsKKwordXNlIEZpbmRCaW47Cit1c2UgbGliICIkRmluZEJpbjo6QmluL2xpYiI7CisKK3VzZSB0b29sczsKK3VzZSBVbmFtZTsKK3VzZSBQbGF0Zm9ybSAiOnZhcnMiOworCitvdXIgJFZFUlNJT04gPSAiMC4wMDUiOworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFN1YnJvdXRpbmVzLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdWIgd2luZG93cyB7CisgICAgbXkgKCAkYXJjaCwgJG91dHB1dCwgQGFyZ3MgKSA9IEBfOworICAgIG15ICVmaWxlczsKKyAgICAjIFRPRE86IENoZWNrIHRoZSBhcmNoaXZlcyBhcmUgb2Ygc3BlY2lmaWVkIGFyY2hpdGVjdHVyZS4KKyAgICBmb3JlYWNoIG15ICRhcmcgKCBAYXJncyApIHsKKyAgICAgICAgZm9yZWFjaCBteSAkYXJjaGl2ZSAoIGJzZF9nbG9iKCAkYXJnICkgKSB7CisgICAgICAgICAgICBpbmZvKCAiUHJvY2Vzc2luZyBcIiRhcmNoaXZlXCIuLi4iICk7CisgICAgICAgICAgICBteSAkYnVsazsKKyAgICAgICAgICAgIGV4ZWN1dGUoIFsgImxpYi5leGUiLCAiL25vbG9nbyIsICIvbGlzdCIsICRhcmNoaXZlIF0sIC1zdGRvdXQgPT4gXCRidWxrICk7CisgICAgICAgICAgICBteSBAbWVtYmVycyA9IHNwbGl0KCAiXG4iLCAkYnVsayApOworICAgICAgICAgICAgZm9yZWFjaCBteSAkbWVtYmVyICggQG1lbWJlcnMgKSB7CisgICAgICAgICAgICAgICAgbXkgJGZpbGUgPSBnZXRfZmlsZSggJG1lbWJlciApOworICAgICAgICAgICAgICAgIG15ICRwYXRoID0gY2F0X2ZpbGUoICRvdXRwdXQsICRmaWxlICk7CisgICAgICAgICAgICAgICAgaWYgKCBleGlzdHMoICRmaWxlc3sgJGZpbGUgfSApICkgeworICAgICAgICAgICAgICAgICAgICBydW50aW1lX2Vycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgIkV4dHJhY3Rpb24gXCIkZmlsZVwiIG1lbWJlciBmcm9tIFwiJGFyY2hpdmVcIiBhcmNoaXZlIGZhaWxlZDoiLAorICAgICAgICAgICAgICAgICAgICAgICAgIlwiJGZpbGVcIiBtZW1iZXIgaGFzIGFscmVhZHkgYmVlbiBleHRyYWN0ZWQgZnJvbSBcIiRmaWxlc3sgJGZpbGUgfVwiIGFyY2hpdmUiCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgICRmaWxlc3sgJGZpbGUgfSA9ICRhcmNoaXZlOworICAgICAgICAgICAgICAgIGluZm8oICIgICAgV3JpdGluZyBcIiRwYXRoXCIuLi4iICk7CisgICAgICAgICAgICAgICAgZXhlY3V0ZSggWyAibGliLmV4ZSIsICIvbm9sb2dvIiwgIi9leHRyYWN0OiIgLiAkbWVtYmVyLCAiL291dDoiIC4gJHBhdGgsICRhcmNoaXZlIF0gKTsKKyAgICAgICAgICAgIH07ICMgZm9yZWFjaCAkbWVtYmVyCisgICAgICAgIH07ICMgZm9yZWFjaCAkYXJjaGl2ZQorICAgIH07ICMgZm9yZWFjaCAkYXJnCit9OyAjIHN1YiB3aW5kb3dzCisKK3N1YiBsaW51eCB7CisgICAgbXkgKCAkYXJjaCwgJG91dHB1dCwgQGFyY2hpdmVzICkgPSBAXzsKKyAgICAjIFRPRE86IENoZWNrIHRoZSBhcmNoaXZlcyBhcmUgb2Ygc3BlY2lmaWVkIGFyY2hpdGVjdHVyZS4KKyAgICBteSAkY3dkID0gQ3dkOjpjd2QoKTsKKyAgICBjaGFuZ2VfZGlyKCAkb3V0cHV0ICk7CisgICAgZm9yZWFjaCBteSAkYXJjaGl2ZSAoIEBhcmNoaXZlcyApIHsKKyAgICAgICAgaW5mbyggIlByb2Nlc3NpbmcgXCIkYXJjaGl2ZVwiLi4uIiApOworICAgICAgICBteSAkcGF0aCA9IGFic19wYXRoKCAkYXJjaGl2ZSwgJGN3ZCApOworICAgICAgICBleGVjdXRlKCBbICJhciIsICJ4byIsICRwYXRoIF0gKTsKKyAgICB9OyAjIGZvcmVhY2ggJGFyY2hpdmUKKyAgICBjaGFuZ2VfZGlyKCAkY3dkICk7Cit9OyAjIHN1YiBsaW51eAorCitteSAlbWFjX2FyY2ggPSAoCisgICAgIjMyIiAgPT4gImkzODYiLAorICAgICIzMmUiID0+ICJ4ODZfNjQiCispOworCitzdWIgZGFyd2luIHsKKyAgICBteSAoICRhcmNoLCAkb3V0cHV0LCBAYXJjaGl2ZXMgKSA9IEBfOworICAgIG15ICRjd2QgPSBnZXRjd2QoKTsKKyAgICBjaGFuZ2VfZGlyKCAkb3V0cHV0ICk7CisgICAgaWYgKCBkZWZpbmVkKCAkYXJjaCApICkgeworICAgICAgICBpZiAoIG5vdCBkZWZpbmVkKCAkbWFjX2FyY2h7ICRhcmNoIH0gKSApIHsKKyAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICJBcmNoaXRlY3R1cmUgXCIkYXJjaFwiIGlzIG5vdCBhIHZhbGlkIG9uZSBmb3IgT1MgWCoiICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgJGFyY2ggPSAkbWFjX2FyY2h7ICRhcmNoIH07CisgICAgfTsgIyBpZgorICAgIGZvcmVhY2ggbXkgJGFyY2hpdmUgKCBAYXJjaGl2ZXMgKSB7CisgICAgICAgIGluZm8oICJQcm9jZXNzaW5nIFwiJGFyY2hpdmVcIi4uLiIgKTsKKyAgICAgICAgbXkgJHBhdGggPSBhYnNfcGF0aCggJGFyY2hpdmUsICRjd2QgKTsKKyAgICAgICAgbXkgJHRlbXA7CisgICAgICAgICMgV2hldGhlciBhcmNoaXZlIGlzIGEgZmF0IG9yIHRoaW4/CisgICAgICAgIG15ICRidWxrOworICAgICAgICBleGVjdXRlKCBbICJmaWxlIiwgJHBhdGggXSwgLXN0ZG91dCA9PiBcJGJ1bGsgKTsKKyAgICAgICAgaWYgKCAkYnVsayA9fiBte01hY2gtTyB1bml2ZXJzYWwgYmluYXJ5fSApIHsKKyAgICAgICAgICAgICMgQXJjaGl2ZSBpcyBmYXQsIGV4dHJhY3kgdGhpbiBhcmNoaXZlIGZpcnN0LgorICAgICAgICAgICAgaWYgKCBub3QgZGVmaW5lZCggJGFyY2ggKSApIHsKKyAgICAgICAgICAgICAgICBydW50aW1lX2Vycm9yKAorICAgICAgICAgICAgICAgICAgICAiXCIkYXJjaGl2ZVwiIGFyY2hpdmUgaXMgdW5pdmVyc2FsIGJpbmFyeSwgIiAuCisgICAgICAgICAgICAgICAgICAgICAgICAicGxlYXNlIHNwZWNpZnkgYXJjaGl0ZWN0dXJlIHRvIHdvcmsgd2l0aCIKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgKCB1bmRlZiwgJHRlbXAgKSA9IEZpbGU6OlRlbXA6OnRlbXBmaWxlKCk7CisgICAgICAgICAgICBleGVjdXRlKCBbICJsaWJ0b29sIiwgIi1zdGF0aWMiLCAiLWFyY2hfb25seSIsICRhcmNoLCAiLW8iLCAkdGVtcCwgJHBhdGggXSApOworICAgICAgICAgICAgJHBhdGggPSAkdGVtcDsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBleGVjdXRlKCBbICJhciIsICJ4byIsICRwYXRoIF0gKTsgICAgICMgRXh0cmFjdCBtZW1iZXJzLgorICAgICAgICBpZiAoIGRlZmluZWQoICR0ZW1wICkgKSB7ICAgICAgICAgICAgICMgRGVsZXRlIHRlbXAgZmlsZSwgaWYgYW55LgorICAgICAgICAgICAgZGVsX2ZpbGUoICR0ZW1wICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGZvcmVhY2ggJGFyY2hpdmUKKyAgICBjaGFuZ2VfZGlyKCAkY3dkICk7Cit9OyAjIHN1YiBkYXJ3aW4KKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE1haW4uCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgUGFyc2UgY29tbWFuZCBsaW5lLgorCitteSAkb3V0cHV0ID0gIi4iOworbXkgQGFyZ3M7CisKK2dldF9vcHRpb25zKAorICAgIFBsYXRmb3JtOjp0YXJnZXRfb3B0aW9ucygpLAorICAgICJvfG91dHB1dC1kaXJlY3Rvcnk9cyIgPT4gXCRvdXRwdXQsCispOworQGFyZ3MgPSBAQVJHVjsKKworaWYgKCBub3QgLWUgJG91dHB1dCApIHsKKyAgICBydW50aW1lX2Vycm9yKCAiT3V0cHV0IGRpcmVjdG9yeSBcIiRvdXRwdXRcIiBkb2VzIG5vdCBleGlzdCIgKTsKK307ICMgaWYKK2lmICggbm90IC1kICRvdXRwdXQgKSB7CisgICAgcnVudGltZV9lcnJvciggIlwiJG91dHB1dFwiIGlzIG5vdCBhIGRpcmVjdG9yeSIgKTsKK307ICMgaWYKK2lmICggbm90IC13ICRvdXRwdXQgKSB7CisgICAgcnVudGltZV9lcnJvciggIk91dHB1dCBkaXJlY3RvcnkgXCIkb3V0cHV0XCIgaXMgbm90IHdyaXRhYmxlIiApOworfTsgIyBpZgorCitpZiAoICR0YXJnZXRfb3MgZXEgIndpbiIgKSB7CisgICAgKnByb2Nlc3MgPSBcJndpbmRvd3M7Cit9IGVsc2lmICggJHRhcmdldF9vcyBlcSAibGluIiBvciAkdGFyZ2V0X29zIGVxICJscmIiICkgeworICAgICpwcm9jZXNzID0gXCZsaW51eDsKK30gZWxzaWYgKCAkdGFyZ2V0X29zIGVxICJtYWMiICkgeworICAgICpwcm9jZXNzID0gXCZkYXJ3aW47Cit9IGVsc2UgeworICAgIHJ1bnRpbWVfZXJyb3IoICJPUyBcIiR0YXJnZXRfb3NcIiBub3Qgc3VwcG9ydGVkIiApOworfTsgIyBpZgorCisKKyMgRG8gdGhlIHdvcmsuCitwcm9jZXNzKCAkdGFyZ2V0X2FyY2gsICRvdXRwdXQsIEBhcmdzICk7CitleGl0KCAwICk7CisKK19fRU5EX18KKworPXBvZAorCis9aGVhZDEgTkFNRQorCitCPGV4dHJhY3Qtb2JqZWN0cy5wbD4gLS0gRXh0cmFjdCBhbGwgb2JqZWN0IGZpbGVzIGZyb20gc3RhdGljIGxpYnJhcnkuCisKKz1oZWFkMSBTWU5PUFNJUworCitCPGV4dHJhY3Qtb2JqZWN0cy5wbD4gSTxvcHRpb24+Li4uIEk8YXJjaGl2ZT4uLi4KKworPWhlYWQxIE9QVElPTlMKKworPW92ZXIKKworPWl0ZW0gQjwtLWFyY2hpdGVjdHVyZT0+STxhcmNoPgorCitTcGVjaWZ5IGFyY2hpdGVjdHVyZSB0byB3b3JrIHdpdGguIFRoZSBvcHRpb24gaXMgbWFuZGF0b3J5IG9uIE9TIFgqIGluIGNhc2Ugb2YgdW5pdmVyc2FsIGFyY2hpdmUuCitJbiBvdGhlciBjYXNlcyB0aGUgb3B0aW9uIHNob3VsZCBub3QgYmUgdXNlZC4gSTxhcmNoPiBtYXkgYmUgb25lIG9mIEM8MzI+IG9yIEM8MzJlPi4KKworPWl0ZW0gQjwtLW9zPT5JPHN0cj4KKworU3BlY2lmeSBPUyBuYW1lLiBCeSBkZWZhdWx0IE9TIGlzIGF1dG9kZXRlY3RlZC4KKworRGVwZW5kaW5nIG9uIE9TLCBCPGV4dHJhY3Qtb2JqZWN0cy5wbD4gdXNlcyBkaWZmZXJlbnQgZXh0ZXJuYWwgdG9vbHMgZm9yIGhhbmRsaW5nIHN0YXRpYworbGlicmFyaWVzOiBGPGFyPiAoaW4gY2FzZSBvZiAibGluIiBhbmQgIm1hYyIpIG9yIEY8bGliLmV4ZT4gKGluIGNhc2Ugb2YgIndpbiIpLgorCis9aXRlbSBCPC0tb3V0cHV0LWRpcmVjdG9yeT0+STxkaXI+CisKK1NwZWNpZnkgZGlyZWN0b3J5IHRvIHdyaXRlIGV4dHJhY3RlZCBtZW1iZXJzIHRvLiBDdXJyZW50IGRpcmVjdG9yeSBpcyB1c2VkIGJ5IGRlZmF1bHQuCisKKz1pdGVtIEI8LS1oZWxwPgorCitQcmludCBzaG9ydCBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQuCisKKz1pdGVtIEI8LS1kb2M+CisKKz1pdGVtIEI8LS1tYW51YWw+CisKK1ByaW50IGZ1bGwgZG9jdW1lbnRhdGlvbiBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLXF1aWV0PgorCitEbyBub3QgcHJpbnQgaW5mb3JtYXRpb24gbWVzc2FnZXMuCisKKz1pdGVtIEI8LS12ZXJzaW9uPgorCitQcmludCB2ZXJzaW9uIGFuZCBleGl0LgorCis9YmFjaworCis9aGVhZDEgQVJHVU1FTlRTCisKKz1vdmVyCisKKz1pdGVtIEk8YXJjaGl2ZT4KKworQSBuYW1lIG9mIGFyY2hpdmUgZmlsZSAoc3RhdGljIGxpYnJhcnkpLiBNdWx0aXBsZSBhcmNoaXZlcyBtYXkgYmUgc3BlY2lmaWVkLgorCis9YmFjaworCis9aGVhZDEgREVTQ1JJUFRJT04KKworVGhlIHNjcmlwdCBleHRyYWN0cyBhbGwgdGhlIG1lbWJlcnMgKG9iamVjdCBmaWxlcykgZnJvbSBhcmNoaXZlIChzdGF0aWMgbGlicmFyeSkgdG8gc3BlY2lmaWVkCitkaXJlY3RvcnkuIENvbW1hbmRzIHRvIHBlcmZvcm0gdGhpcyBhY3Rpb24gZGlmZmVyIG9uIGRpZmZlcmVudCBPU2VzLiBPbiBMaW51eCogT1MsIHNpbXBsZSBjb21tYW5kCisKKyAgICBhciB4byBsaWJmaWxlLmEKKworaXMgZW5vdWdoIChpbiBjYXNlIG9mIGV4dHJhY3RpbmcgZmlsZXMgdG8gY3VycmVudCBkaXJlY3RvcnkpLgorCitPbiBPUyBYKiwgaXQgaXMgYSBiaXQgY29tcGlsaWNhdGVkIHdpdGggdW5pdmVyc2FsICgiZmF0IikgYmluYXJpZXMgLS0gQzxhcj4gY2Fubm90CitvcGVyYXRlIG9uIGZhdCBhcmNoaXZlcywgc28gInRoaW4iIGFyY2hpdmUgc2hvdWxkIGJlIGV4dHJhY3RlZCBmcm9tIHRoZSB1bml2ZXJzYWwgYmluYXJ5IGZpcnN0LgorCitPbiBXaW5kb3dzKiBPUywgbGlicmFyeSBtYW5hZ2VyIChDPGxpYi5leGU+KSBjYW4gZXh0cmFjdCBvbmx5IG9uZSBvYmplY3QgZmlsZSwgc28gb3BlcmF0aW9uIHNob3VsZCBiZQorcmVwZWF0ZWQgZm9yIGV2ZXJ5IG9iamVjdCBmaWxlIGluIHRoZSBsaWJyYXJ5LgorCitCPGV4dHJhY3Qtb2JqZWN0cy5wbD4gZGV0ZWN0cyBPUyBhdXRvbWF0aWNhbGx5LiBCdXQgZGV0ZWN0aW9uIGNhbiBiZSBvdmVycmlkZWQgd2l0aCBCPC0tb3M+IG9wdGlvbi4KK0l0IG1heSBiZSBoZWxwZnVsIGluIGNyb3NzLWJ1aWxkIGVudmlyb25tZW50cy4KKworQjxleHRyYWN0LW9iamVjdHMucGw+IGVmZmVjdGl2ZWx5IGVuY2Fwc3VsYXRlcyBhbGwgdGhlc2UgZGV0YWlscyBhbmQgcHJvdmlkZXMgdW5pZm9ybSB3YXkgZm9yCitleHRyYWN0aW5nIG9iamVjdCBmaWxlcyBmcm9tIHN0YXRpYyBsaWJyYXJpZXMsIHdoaWNoIGhlbHBzIHRvIGtlZXAgbWFrZWZpbGVzIHNpbXBsZSBhbmQgY2xlYW4uCisKKz1oZWFkMSBFWEFNUExFUworCitFeHRyYWN0IG9iamVjdCBmaWxlcyBmcm9tIGxpYnJhcnkgRjxsaWJpcmMubGliPiwgYW5kIHB1dCB0aGVtIGludG8gRjxvYmovPiBkaXJlY3Rvcnk6CisKKyAgICAkIGV4dHJhY3Qtb2JqZWN0cy5wbCAtLW91dHB1dD1vYmogbGliaXJjLmxpYgorCitFeHRyYWN0IG9iamVjdCBmaWxlcyBmcm9tIGxpYnJhcnkgRjxsaWJpcmMuYT4uIFVzZSBMaW51eCogT1MgdG9vbHMgKEY8YXI+KSwgZXZlbiBpZiBydW4gb24gYW5vdGhlciBPUzoKKworICAgICQgZXh0cmFjdC1vYmplY3RzLnBsIC0tb3M9bGluIGxpYmlyYy5hCisKK0V4dHJhY3Qgb2JqZWN0IGZpbGVzIGZyb20gbGlicmFyeSBGPGxpYmlyYy5hPiwgaWYgaXQgaXMgYSBPUyBYKiB1bml2ZXJzYWwgYmluYXJ5LCB1c2UgaTM4NgorYXJjaGl0ZWN0dXJlLiBCZSBxdWlldDoKKworICAgICQgZXh0cmFjdC1vYmplY3RzLnBsIC0tcXVpZXQgLS1hcmNoPWkzODYgbGliaXJjLmEKKworPWN1dAorCisjIGVuZCBvZiBmaWxlICMKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90b29scy9mcmVlYnNkLmluYyBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvZnJlZWJzZC5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRkN2ZlOQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvZnJlZWJzZC5pbmMKQEAgLTAsMCArMSwxMyBAQAorIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCitpbmNsdWRlIHRvb2xzL2xpbnV4LmluYworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rvb2xzL2dlbmVyYXRlLWRlZi5wbCBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvZ2VuZXJhdGUtZGVmLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdjMmIwZjMKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rvb2xzL2dlbmVyYXRlLWRlZi5wbApAQCAtMCwwICsxLDMyMSBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorCisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgU29tZSBwcmFnbWFzLgordXNlIHN0cmljdDsgICAgICAgICAgIyBSZXN0cmljdCB1bnNhZmUgY29uc3RydWN0cy4KK3VzZSB3YXJuaW5nczsgICAgICAgICMgRW5hYmxlIGFsbCB3YXJuaW5ncy4KKwordXNlIEZpbmRCaW47Cit1c2UgbGliICIkRmluZEJpbjo6QmluL2xpYiI7CisKK3VzZSB0b29sczsKKworb3VyICRWRVJTSU9OID0gIjAuMDA0IjsKKworIworIyBTdWJyb3V0aW5lcy4KKyMKKworc3ViIHBhcnNlX2lucHV0KCRcJSkgeworCisgICAgbXkgKCAkaW5wdXQsICRkZWZzICkgPSBAXzsKKyAgICBteSBAYnVsayA9IHJlYWRfZmlsZSggJGlucHV0ICk7CisgICAgbXkgJWVudHJpZXM7CisgICAgbXkgJW9yZGluYWxzOworICAgIG15IEBkaXJzOworICAgIG15ICR2YWx1ZSA9IDE7CisKKyAgICBteSAkZXJyb3IgPQorICAgICAgICBzdWIgeworICAgICAgICAgICAgbXkgKCAkbXNnLCAkbCwgJGxpbmUgKSA9IEBfOworICAgICAgICAgICAgcnVudGltZV9lcnJvcigKKyAgICAgICAgICAgICAgICAiRXJyb3IgcGFyc2luZyBmaWxlIFwiJGlucHV0XCIgbGluZSAkbDpcbiIgLgorICAgICAgICAgICAgICAgICIgICAgJGxpbmUiIC4KKyAgICAgICAgICAgICAgICAoICRtc2cgPyAkbXNnIC4gIlxuIiA6ICgpICkKKyAgICAgICAgICAgICk7CisgICAgICAgIH07ICMgc3ViCisKKyAgICBteSAkbiA9IDA7ICAgICMgTGluZSBudW1iZXIuCisgICAgZm9yZWFjaCBteSAkbGluZSAoIEBidWxrICkgeworICAgICAgICArKyAkbjsKKyAgICAgICAgaWYgKCAwICkgeworICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteXHMqKD86I3xcbil9ICkgeworICAgICAgICAgICAgIyBFbXB0eSBsaW5lIG9yIGNvbW1lbnQuIFNraXAgaXQuCisgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccyolfSApIHsKKyAgICAgICAgICAgICMgQSBkaXJlY3RpdmUuCisgICAgICAgICAgICBpZiAoIDAgICkgeworICAgICAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XlxzKiVccyppZihuKT9kZWZccysoW0EtWmEtejAtOV9dKylccyooPzojfFxuKX0gKSB7CisgICAgICAgICAgICAgICAgbXkgKCAkbmVnYXRpb24sICRuYW1lICkgPSAoICQxLCAkMiApOworICAgICAgICAgICAgICAgIG15ICRkaXIgPSB7IG4gPT4gJG4sIGxpbmUgPT4gJGxpbmUsIG5hbWUgPT4gJG5hbWUsIHZhbHVlID0+ICR2YWx1ZSB9OworICAgICAgICAgICAgICAgIHB1c2goIEBkaXJzLCAkZGlyICk7CisgICAgICAgICAgICAgICAgJHZhbHVlID0gKCAkdmFsdWUgYW5kICggJG5lZ2F0aW9uIHhvciAkZGVmcy0+eyAkbmFtZSB9ICkgKTsKKyAgICAgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccyolXHMqZW5kaWZccyooPzojfFxuKX0gKSB7CisgICAgICAgICAgICAgICAgaWYgKCBub3QgQGRpcnMgKSB7CisgICAgICAgICAgICAgICAgICAgICRlcnJvci0+KCAiT3JwaGFuICVlbmRpZiBkaXJlY3RpdmUuIiwgJG4sICRsaW5lICk7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgIG15ICRkaXIgPSBwb3AoIEBkaXJzICk7CisgICAgICAgICAgICAgICAgJHZhbHVlID0gJGRpci0+eyB2YWx1ZSB9OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAkZXJyb3ItPiggIkJhZCBkaXJlY3RpdmUuIiwgJG4sICRsaW5lICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccyooLSk/XHMqKFtBLVphLXowLTlfXSspKD86XHMrKFxkK3xEQVRBKSk/XHMqKD86I3xcbil9ICkgeworICAgICAgICAgICAgbXkgKCAkb2Jzb2xldGUsICRlbnRyeSwgJG9yZGluYWwgKSA9ICggJDEsICQyLCAkMyApOworICAgICAgICAgICAgaWYgKCAkdmFsdWUgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBleGlzdHMoICRlbnRyaWVzeyAkZW50cnkgfSApICkgeworICAgICAgICAgICAgICAgICAgICAkZXJyb3ItPiggIkVudHJ5IFwiJGVudHJ5XCIgaGFzIGFscmVhZHkgYmVlbiBzcGVjaWZpZWQuIiwgJG4sICRsaW5lICk7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgICRlbnRyaWVzeyAkZW50cnkgfSA9IHsgb3JkaW5hbCA9PiAkb3JkaW5hbCwgb2Jzb2xldGUgPT4gZGVmaW5lZCggJG9ic29sZXRlICkgfTsKKyAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQoICRvcmRpbmFsICkgYW5kICRvcmRpbmFsIG5lICJEQVRBIiApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAkb3JkaW5hbCA+PSAxMDAwIGFuZCAkZW50cnkgPX4gbXtcQVtva11tcF99ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgJGVycm9yLT4oICJPcmRpbmFsIG9mIHVzZXItY2FsbGFibGUgZW50cnkgbXVzdCBiZSA8IDEwMDAiLCAkbiwgJGxpbmUgKTsKKyAgICAgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgICAgICBpZiAoICRvcmRpbmFsID49IDEwMDAgYW5kICRvcmRpbmFsIDwgMjAwMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRlcnJvci0+KCAiT3JkaW5hbHMgYmV0d2VlbiAxMDAwIGFuZCAxOTk5IGFyZSByZXNlcnZlZC4iLCAkbiwgJGxpbmUgKTsKKyAgICAgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgICAgICBpZiAoIGV4aXN0cyggJG9yZGluYWxzeyAkb3JkaW5hbCB9ICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkZXJyb3ItPiggIk9yZGluYWwgJG9yZGluYWwgaGFzIGFscmVhZHkgYmVlbiB1c2VkLiIsICRuLCAkbGluZSApOworICAgICAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAgICAgICAgICRvcmRpbmFsc3sgJG9yZGluYWwgfSA9ICRlbnRyeTsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkZXJyb3ItPiggIiIsICRuLCAkbGluZSApOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBmb3JlYWNoCisKKyAgICBpZiAoIEBkaXJzICkgeworICAgICAgICBteSAkZGlyID0gcG9wKCBAZGlycyApOworICAgICAgICAkZXJyb3ItPiggIlVudGVybWluYXRlZCAlaWYgZGlyZWNpdmUuIiwgJGRpci0+eyBuIH0sICRkaXItPnsgbGluZSB9ICk7CisgICAgfTsgIyB3aGlsZQorCisgICAgcmV0dXJuICVlbnRyaWVzOworCit9OyAjIHN1YiBwYXJzZV9pbnB1dAorCitzdWIgcHJvY2VzcyhcJSkgeworCisgICAgbXkgKCAkZW50cmllcyApID0gQF87CisKKyAgICBmb3JlYWNoIG15ICRlbnRyeSAoIGtleXMoICUkZW50cmllcyApICkgeworICAgICAgICBpZiAoIG5vdCAkZW50cmllcy0+eyAkZW50cnkgfS0+eyBvYnNvbGV0ZSB9ICkgeworICAgICAgICAgICAgbXkgJG9yZGluYWwgPSAkZW50cmllcy0+eyAkZW50cnkgfS0+eyBvcmRpbmFsIH07CisgICAgICAgICAgICBpZiAoICRlbnRyeSA9fiBte1xBW29rXW1wX30gKSB7CisgICAgICAgICAgICAgICAgaWYgKCBub3QgZGVmaW5lZCggJG9yZGluYWwgKSBvciAkb3JkaW5hbCBlcSAiREFUQSIgKSB7CisgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIGVudHJ5IFwiJGVudHJ5XCI6IG9yZGluYWwgbnVtYmVyIGlzIG5vdCBzcGVjaWZpZWQuIgorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICAgICAkZW50cmllcy0+eyB1YyggJGVudHJ5ICkgfSA9IHsgb3JkaW5hbCA9PiAxMDAwICsgJG9yZGluYWwgfTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgZm9yZWFjaAorCisgICAgcmV0dXJuICUkZW50cmllczsKKworfTsgIyBzdWIgcHJvY2VzcworCitzdWIgZ2VuZXJhdGVfb3V0cHV0KFwlJCkgeworCisgICAgbXkgKCAkZW50cmllcywgJG91dHB1dCApID0gQF87CisgICAgbXkgJGJ1bGs7CisKKyAgICAkYnVsayA9ICJFWFBPUlRTXG4iOworICAgIGZvcmVhY2ggbXkgJGVudHJ5ICggc29ydCgga2V5cyggJSRlbnRyaWVzICkgKSApIHsKKyAgICAgICAgaWYgKCBub3QgJGVudHJpZXMtPnsgJGVudHJ5IH0tPnsgb2Jzb2xldGUgfSApIHsKKyAgICAgICAgICAgICRidWxrIC49IHNwcmludGYoICIgICAgJS00MHMgIiwgJGVudHJ5ICk7CisgICAgICAgICAgICBteSAkb3JkaW5hbCA9ICRlbnRyaWVzLT57ICRlbnRyeSB9LT57IG9yZGluYWwgfTsKKyAgICAgICAgICAgIGlmICggZGVmaW5lZCggJG9yZGluYWwgKSApIHsKKyAgICAgICAgICAgICAgICBpZiAoICRvcmRpbmFsIGVxICJEQVRBIiApIHsKKyAgICAgICAgICAgICAgICAgICAgJGJ1bGsgLj0gIkRBVEEiOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRidWxrIC49ICJcQCIgLiAkb3JkaW5hbDsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAkYnVsayAuPSAiXG4iOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBmb3JlYWNoCisgICAgaWYgKCBkZWZpbmVkKCAkb3V0cHV0ICkgKSB7CisgICAgICAgIHdyaXRlX2ZpbGUoICRvdXRwdXQsIFwkYnVsayApOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50KCAkYnVsayApOworICAgIH07ICMgaWYKKworfTsgIyBzdWIgZ2VuZXJhdGVfb3VwdXQKKworIworIyBQYXJzZSBjb21tYW5kIGxpbmUuCisjCisKK215ICRpbnB1dDsgICAjIFRoZSBuYW1lIG9mIGlucHV0IGZpbGUuCitteSAkb3V0cHV0OyAgIyBUaGUgbmFtZSBvZiBvdXRwdXQgZmlsZS4KK215ICVkZWZzOworCitnZXRfb3B0aW9ucygKKyAgICAib3V0cHV0PXMiICAgID0+IFwkb3V0cHV0LAorICAgICJEfGRlZmluZT1zIiAgPT4KKyAgICAgICAgc3ViIHsKKyAgICAgICAgICAgIG15ICggJG9wdF9uYW1lLCAkb3B0X3ZhbHVlICkgPSBAXzsKKyAgICAgICAgICAgIG15ICggJGRlZl9uYW1lLCAkZGVmX3ZhbHVlICk7CisgICAgICAgICAgICBpZiAoICRvcHRfdmFsdWUgPX4gbXtcQSguKj8pPSguKilcen0gKSB7CisgICAgICAgICAgICAgICAgKCAkZGVmX25hbWUsICRkZWZfdmFsdWUgKSA9ICggJDEsICQyICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICggJGRlZl9uYW1lLCAkZGVmX3ZhbHVlICkgPSAoICRvcHRfdmFsdWUsIDEgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICRkZWZzeyAkZGVmX25hbWUgfSA9ICRkZWZfdmFsdWU7CisgICAgICAgIH0sCispOworCitpZiAoIEBBUkdWID09IDAgKSB7CisgICAgY21kbGluZV9lcnJvciggIk5vdCBlbm91Z2ggYXJndW1lbnRzLiIgKTsKK307ICMgaWYKK2lmICggQEFSR1YgPiAxICkgeworICAgIGNtZGxpbmVfZXJyb3IoICJUb28gbWFueSBhcmd1bWVudHMuIiApOworfTsgIyBpZgorJGlucHV0ID0gc2hpZnQoIEBBUkdWICk7CisKKyMKKyMgV29yay4KKyMKKworbXkgJWRhdGEgPSBwYXJzZV9pbnB1dCggJGlucHV0LCAlZGVmcyApOworJWRhdGEgPSBwcm9jZXNzKCAlZGF0YSApOworZ2VuZXJhdGVfb3V0cHV0KCAlZGF0YSwgJG91dHB1dCApOworZXhpdCggMCApOworCitfX0VORF9fCisKKyMKKyMgRW1iZWRkZWQgZG9jdW1lbnRhdGlvbi4KKyMKKworPXBvZAorCis9aGVhZDEgTkFNRQorCitCPGdlbmVyYXRlLWRlZi5wbD4gLS0gR2VuZXJhdGUgZGVmIGZpbGUgZm9yIE9wZW5NUCBSVEwuCisKKz1oZWFkMSBTWU5PUFNJUworCitCPGdlbmVyYXRlLWRlZi5wbD4gSTxPUFRJT04+Li4uIEk8ZmlsZT4KKworPWhlYWQxIE9QVElPTlMKKworPW92ZXIKKworPWl0ZW0gQjwtLWRlZmluZT0+STxuYW1lPls9STx2YWx1ZT5dCisKKz1pdGVtIEI8LUQ+IEk8bmFtZT5bPUk8dmFsdWU+XQorCitEZWZpbmUgc3BlY2lmaWVkIG5hbWUuIElmIEk8dmFsdWU+IGlzIG9taXR0ZWQsIEk8bmFtZT4gaXMgZGVmaW5lZCB0byAxLiBJZiBJPHZhbHVlPiBpcyAwIG9yIGVtcHR5LAorbmFtZSBpcyBCPG5vdD4gZGVmaW5lZC4KKworPWl0ZW0gQjwtLW91dHB1dD0+STxmaWxlPgorCis9aXRlbSBCPC1vPiBJPGZpbGU+CisKK1NwZWNpZnkgb3V0cHV0IGZpbGUgbmFtZS4gSWYgb3B0aW9uIGlzIG5vdCBwcmVzZW50LCByZXN1bHQgaXMgcHJpbnRlZCB0byBzdGRvdXQuCisKKz1pdGVtIEI8LS1kb2M+CisKKz1pdGVtIEI8LS1tYW51YWw+CisKK1ByaW50IGZ1bGwgaGVscCBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0taGVscD4KKworUHJpbnQgc2hvcnQgaGVscCBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0tdXNhZ2U+CisKK1ByaW50IHZlcnkgc2hvcnQgdXNhZ2UgbWVzc2FnZSBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLXZlcmJvc2U+CisKK0RvIHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMuCisKKz1pdGVtIEI8LS12ZXJzaW9uPgorCitQcmludCB2ZXJzaW9uIGFuZCBleGl0LgorCis9aXRlbSBCPC0tcXVpZXQ+CisKK1dvcmsgcXVpZXQsIGRvIG5vdCBwcmludCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLgorCis9YmFjaworCis9aGVhZDEgQVJHVU1FTlRTCisKKz1vdmVyCisKKz1pdGVtIEk8ZmlsZT4KKworQSBuYW1lIG9mIGlucHV0IGZpbGUuCisKKz1iYWNrCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGUgc2NyaXB0IHJlYWRzIGlucHV0IGZpbGUsIHByb2Nlc3MgY29uZGl0aW9uYWwgZGlyZWN0aXZlcywgY2hlY2tzIGNvbnRlbnQgZm9yIGNvbnNpc3RlbmN5LCBhbmQKK2dlbmVyYXRlcyBvdXB0cHV0IGZpbGUgc3VpdGFibGUgZm9yIGxpbmtlci4KKworPWhlYWQyIElucHV0IEZpbGUgRm9ybWF0CisKKz1vdmVyCisKKz1pdGVtIENvbW1lbnRzCisKKyAgICAjIEl0J3MgYSBjb21tZW50LgorCitDb21tZW50cyBzdGFydCB3aXRoIEM8Iz4gc3ltYm9sIGFuZCBjb250aW51ZSB0byB0aGUgZW5kIG9mIGxpbmUuCisKKz1pdGVtIENvbmRpdGlvbmFsIERpcmVjdGl2ZXMKKworICAgICVpZmRlZiBuYW1lCisgICAgJWlmbmRlZiBuYW1lCisgICAgJWVuZGlmCisKK0EgcGFydCBvZiBmaWxlIHN1cnJvdW5kZWQgYnkgQzwlaWZkZWYgSTxuYW1lPj4gYW5kIEM8JWVuZGlmPiBkaXJlY3RpdmVzIGlzIGEgY29uZGl0aW9uYWwgcGFydCAtLSBpdAoraGFzIGVmZmVjdCBvbmx5IGlmIEk8bmFtZT4gaXMgZGVmaW5lZCBpbiB0aGUgY29tbWFuIGxpbmUgYnkgQjwtLWRlZmluZT4gb3B0aW9uLiBDPCVpZm5kZWY+IGlzIGEKK25lZ2F0ZWQgdmVyc2lvbiBvZiBDPCVpZmRlZj4gLS0gY29uZGl0aW9uYWwgcGFydCBoYXMgYW4gZWZmZWN0IG9ubHkgaWYgSTxuYW1lPiBpcyBCPG5vdD4gZGVmaW5lZC4KKworQ29uZGl0aW9uYWwgcGFydHMgbWF5IGJlIG5lc3RlZC4KKworPWl0ZW0gRXhwb3J0IERlZmluaXRpb25zCisKKyAgICBzeW1ib2wKKyAgICBzeW1ib2wgb3JkaW5hbAorICAgIHN5bWJvbCBEQVRBCisKK1N5bWJvbHMgc3RhcnRpbmcgd2l0aCBDPG9tcF8+IG9yIEM8a21wXz4gbXVzdCBoYXZlIG9yZGluYWwgc3BlY2lmaWVkLiBUaGV5IGFyZSBzdWJqZWN0cyBmb3Igc3BlY2lhbAorcHJvY2Vzc2luZzogZWFjaCBzeW1ib2wgZ2VuZXJhdGVzIHR3byBvdXRwdXQgbGluZXM6IG9yaWdpbmFsIG9uZSBhbmQgdXBwZXIgY2FzZSB2ZXJzaW9uLiBUaGUgb3JkaW5hbAorbnVtYmVyIG9mIHRoZSBzZWNvbmQgaXMgb3JpZ2luYWwgb3JkaW5hbCBpbmNyZWFzZWQgYnkgMTAwMC4KKworPWl0ZW0gT2Jzb2xldGUgU3ltYm9scworCisgICAgLSBzeW1ib2wKKyAgICAtIHN5bWJvbCBvcmRpbmFsCisgICAgLSBzeW1ib2wgREFUQQorCitPYnNvbGV0ZSBzeW1ib2xzIGxvb2sgbGlrZSBleHBvcnQgZGVmaW5pdGlvbnMgcHJlZml4ZWQgd2l0aCBtaW51cyBzaWduLiBPYnNvbGV0ZSBzeW1ib2xzIGRvIG5vdAorYWZmZWN0IHRoZSBvdXRwdXQsIGJ1dCBvYnNvbGV0ZSBzeW1ib2xzIGFuZCB0aGVpciBvcmRpbmFscyBjYW5ub3QgYmUgKHJlKXVzZWQgaW4gZXhwb3J0IGRlZmluaXRpb25zLgorCis9YmFjaworCis9aGVhZDEgRVhBTVBMRVMKKworICAgICQgZ2VuZXJhdGUtZGVmLnBsIC1EIHN0dWIgLUQgVVNFX1RDSEVDSz0wIC1vIGxpYmd1aWRlLmRlZiBkbGxleHBvcnQKKworPWN1dAorCisjIGVuZCBvZiBmaWxlICMKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90b29scy9saWIvQnVpbGQucG0gYi9maW5hbC9ydW50aW1lL3Rvb2xzL2xpYi9CdWlsZC5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjY3MTU2Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90b29scy9saWIvQnVpbGQucG0KQEAgLTAsMCArMSwyNjQgQEAKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKK3BhY2thZ2UgQnVpbGQ7CisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBDd2QgcXd7fTsKKwordXNlIExpYk9NUDsKK3VzZSB0b29sczsKK3VzZSBVbmFtZTsKK3VzZSBQbGF0Zm9ybSAiOnZhcnMiOworCitteSAkaG9zdCA9IFVuYW1lOjpob3N0X25hbWUoKTsKK215ICRyb290ID0gJEVOVnsgTElCT01QX1dPUksgICAgfTsKK215ICR0bXAgID0gJEVOVnsgTElCT01QX1RNUCAgICAgfTsKK215ICRvdXQgID0gJEVOVnsgTElCT01QX0VYUE9SVFMgfTsKKworbXkgQGpvYnM7CitvdXIgJHN0YXJ0ID0gdGltZSgpOworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEhlbHBlciBmdW5jdGlvbnMuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgdHN0ciAtLSBUaW1lIHN0cmluZy4gUmV0dXJucyBzdHJpbmcgInl5eXktZGQtbW0gaGg6bW06c3MgVVRDIi4KK3N1YiB0c3RyKDskKSB7CisgICAgbXkgKCAkdGltZSApID0gQF87CisgICAgaWYgKCBub3QgZGVmaW5lZCggJHRpbWUgKSApIHsKKyAgICAgICAgJHRpbWUgPSB0aW1lKCk7CisgICAgfTsgIyBpZgorICAgIG15ICggJHNlYywgJG1pbiwgJGhvdXIsICRkYXksICRtb250aCwgJHllYXIgKSA9IGdtdGltZSggJHRpbWUgKTsKKyAgICAkbW9udGggKz0gMTsKKyAgICAkeWVhciAgKz0gMTkwMDsKKyAgICBteSAkc3RyID0gc3ByaW50ZiggIiUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDolMDJkIFVUQyIsICR5ZWFyLCAkbW9udGgsICRkYXksICRob3VyLCAkbWluLCAkc2VjICk7CisgICAgcmV0dXJuICRzdHI7Cit9OyAjIHN1YiB0c3RyCisKKyMgZHN0ciAtLSBEdXJhdGlvbiBzdHJpbmcuIFJldHVybnMgc3RyaW5nICJoaDptbTpzcyIuCitzdWIgZHN0cigkKSB7CisgICAgIyBHZXQgdGltZSBpbiBzZWNvbmRzIGFuZCBmb3JtYXQgaXQgYXMgdGltZSBpbiBob3VycywgbWludXRlcywgc2Vjb25kcy4KKyAgICBteSAoICRzZWMgKSA9IEBfOworICAgIG15ICggJGgsICRtLCAkcyApOworICAgICRoICAgPSBpbnQoICRzZWMgLyAzNjAwICk7CisgICAgJHNlYyA9ICRzZWMgLSAkaCAqIDM2MDA7CisgICAgJG0gICA9IGludCggJHNlYyAvIDYwICk7CisgICAgJHNlYyA9ICRzZWMgLSAkbSAqIDYwOworICAgICRzICAgPSBpbnQoICRzZWMgKTsKKyAgICAkc2VjID0gJHNlYyAtICRzOworICAgIHJldHVybiBzcHJpbnRmKCAiJTAyZDolMDJkOiUwMmQiLCAkaCwgJG0sICRzICk7Cit9OyAjIHN1YiBkc3RyCisKKyMgcnN0ciAtLSBSZXN1bHQgc3RyaW5nLgorc3ViIHJzdHIoJCkgeworICAgIG15ICggJHJjICkgPSBAXzsKKyAgICByZXR1cm4gKCAkcmMgPT0gMCA/ICIrKysgU3VjY2VzcyArKysiIDogIi0tLSBGYWlsdXJlIC0tLSIgKTsKK307ICMgc3ViIHJzdHIKKworc3ViIHNob3J0ZXIoJDskKSB7CisgICAgIyBSZXR1cm4gc2hvcnRlciB2YXJpYW50IG9mIHBhdGggLS0gZWl0aGVyIGFic29sdXRlIG9yIHJlbGF0aXZlLgorICAgIG15ICggJHBhdGgsICRiYXNlICkgPSBAXzsKKyAgICBteSAkYWJzID0gYWJzX3BhdGgoICRwYXRoICk7CisgICAgbXkgJHJlbCA9IHJlbF9wYXRoKCAkcGF0aCwgJGJhc2UgKTsKKyAgICBpZiAoICRyZWwgZXEgIiIgKSB7CisgICAgICAgICRyZWwgPSAiLiI7CisgICAgfTsgIyBpZgorICAgICRwYXRoID0gKCBsZW5ndGgoICRyZWwgKSA8IGxlbmd0aCggJGFicyApID8gJHJlbCA6ICRhYnMgKTsKKyAgICBpZiAoICR0YXJnZXRfb3MgZXEgIndpbiIgKSB7CisgICAgICAgICRwYXRoID1+IHN7XFx9ey99ZzsKKyAgICB9OyAjIGlmCisgICAgcmV0dXJuICRwYXRoOworfTsgIyBzdWIgc2hvcnRlcgorCitzdWIgdGVlKCQkKSB7CisKKyAgICBteSAoICRhY3Rpb24sICRmaWxlICkgPSBAXzsKKyAgICBteSAkcGlkID0gMDsKKworICAgIG15ICRzYXZlX3N0ZG91dCA9IFN5bWJvbDo6Z2Vuc3ltKCk7CisgICAgbXkgJHNhdmVfc3RkZXJyID0gU3ltYm9sOjpnZW5zeW0oKTsKKworICAgICMgLS0tIHJlZGlyZWN0IHN0ZG91dCAtLS0KKyAgICBTVERPVVQtPmZsdXNoKCk7CisgICAgIyBTYXZlIHN0ZG91dCBpbiAkc2F2ZV9zdGRvdXQuCisgICAgb3BlbiggJHNhdmVfc3Rkb3V0LCAiPiYiIC4gU1RET1VULT5maWxlbm8oKSApCisgICAgICAgIG9yIGRpZSggIkNhbm5vdCBkdXAgZmlsZWhhbmRsZTogJCE7IHN0b3BwZWQiICk7CisgICAgIyBSZWRpcmVjdCBzdGRvdXQgdG8gdGVlIG9yIHRvIGZpbGUuCisgICAgaWYgKCAkdG9vbHM6OnZlcmJvc2UgKSB7CisgICAgICAgICRwaWQgPSBvcGVuKCBTVERPVVQsICJ8IHRlZSAtYSBcIiRmaWxlXCIiICkKKyAgICAgICAgICAgIG9yIGRpZSAiQ2Fubm90IG9wZW4gcGlwZSB0byBcInRlZVwiOiAkITsgc3RvcHBlZCI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3BlbiggU1RET1VULCAiPj4kZmlsZSIgKQorICAgICAgICAgICAgb3IgZGllICJDYW5ub3Qgb3BlbiBmaWxlIFwiJGZpbGVcIiBmb3Igd3JpdGluZzogJCE7IHN0b3BwZWQiOworICAgIH07ICMgaWYKKworICAgICMgLS0tIHJlZGlyZWN0IHN0ZGVyciAtLS0KKyAgICBTVERFUlItPmZsdXNoKCk7CisgICAgIyBTYXZlIHN0ZGVyciBpbiAkc2F2ZV9zdGRlcnIuCisgICAgb3BlbiggJHNhdmVfc3RkZXJyLCAiPiYiIC4gU1RERVJSLT5maWxlbm8oKSApCisgICAgICAgIG9yIGRpZSggIkNhbm5vdCBkdXAgZmlsZWhhbmRsZTogJCE7IHN0b3BwZWQiICk7CisgICAgIyBSZWRpcmVjdCBzdGRlcnIgdG8gc3Rkb3V0LgorICAgIG9wZW4oIFNUREVSUiwgIj4mIiAuIFNURE9VVC0+ZmlsZW5vKCkgKQorICAgICAgICBvciBkaWUoICJDYW5ub3QgZHVwIGZpbGVoYW5kbGU6ICQhOyBzdG9wcGVkIiApOworCisgICAgIyBQZXJmb3JtIGFjdGlvbnMuCisgICAgJGFjdGlvbi0+KCk7CisKKyAgICAjIC0tLSByZXN0b3JlIHN0ZGVyciAtLS0KKyAgICBTVERFUlItPmZsdXNoKCk7CisgICAgIyBSZXN0b3JlIHN0ZGVyciBmcm9tICRzYXZlX3N0ZGVyci4KKyAgICBvcGVuKCBTVERFUlIsICI+JiIgLiAkc2F2ZV9zdGRlcnItPmZpbGVubygpICkKKyAgICAgICAgb3IgZGllKCAiQ2Fubm90IGR1cCBmaWxlaGFuZGxlOiAkITsgc3RvcHBlZCIgKTsKKyAgICAjIENsb3NlICRzYXZlX3N0ZGVyci4KKyAgICAkc2F2ZV9zdGRlcnItPmNsb3NlKCkgb3IgZGllICggIkNhbm5vdCBjbG9zZSBmaWxlaGFuZGxlOiAkITsgc3RvcHBlZCIgKTsKKworICAgICMgLS0tIHJlc3RvcmUgc3Rkb3V0IC0tLQorICAgIFNURE9VVC0+Zmx1c2goKTsKKyAgICAjIFJlc3RvcmUgc3Rkb3V0IGZyb20gJHNhdmVfc3Rkb3V0LgorICAgIG9wZW4oIFNURE9VVCwgIj4mIiAuICRzYXZlX3N0ZG91dC0+ZmlsZW5vKCkgKQorICAgICAgICBvciBkaWUoICJDYW5ub3QgZHVwIGZpbGVoYW5kbGU6ICQhOyBzdG9wcGVkIiApOworICAgICMgQ2xvc2UgJHNhdmVfc3Rkb3V0LgorICAgICRzYXZlX3N0ZG91dC0+Y2xvc2UoKSBvciBkaWUgKCAiQ2Fubm90IGNsb3NlIGZpbGVoYW5kbGU6ICQhOyBzdG9wcGVkIiApOworCisgICAgIyBXYWl0IGZvciB0aGUgY2hpbGQgdGVlIHByb2Nlc3MsIG90aGVyd2lzZSBvdXRwdXQgb2YgbWFrZSBhbmQgYnVpbGQucGwgaW50ZXJsZWF2ZXMuCisgICAgaWYgKCAkcGlkICE9IDAgKSB7CisgICAgICAgIHdhaXRwaWQoICRwaWQsIDAgKTsKKyAgICB9OyAjIGlmCisKK307ICMgc3ViIHRlZQorCitzdWIgbG9nX2l0KCQkQCkgeworICAgIG15ICggJHRpdGxlLCAkZm9ybWF0LCBAYXJncyApID0gQF87CisgICAgbXkgJG1lc3NhZ2UgID0gc3ByaW50ZiggJGZvcm1hdCwgQGFyZ3MgKTsKKyAgICBteSAkcHJvZ3Jlc3MgPSBjYXRfZmlsZSggJHRtcCwgc3ByaW50ZiggIiVzLSVzLmxvZyIsICR0YXJnZXRfcGxhdGZvcm0sIFVuYW1lOjpob3N0X25hbWUoKSApICk7CisgICAgaWYgKCAkdGl0bGUgbmUgIiIgYW5kICRtZXNzYWdlIG5lICIiICkgeworICAgICAgICBteSAkbGluZSA9IHNwcmludGYoICIlLTE1cyA6ICVzXG4iLCAkdGl0bGUsICRtZXNzYWdlICk7CisgICAgICAgIGluZm8oICRsaW5lICk7CisgICAgICAgIHdyaXRlX2ZpbGUoICRwcm9ncmVzcywgdHN0cigpIC4gIjogIiAuICRsaW5lLCAtYXBwZW5kID0+IDEgKTsKKyAgICB9IGVsc2UgeworICAgICAgICB3cml0ZV9maWxlKCAkcHJvZ3Jlc3MsICJcbiIsIC1hcHBlbmQgPT4gMSApOworICAgIH07ICMgaWYKK307ICMgc3ViIGxvZ19pdAorCitzdWIgcHJvZ3Jlc3MoJCRAKSB7CisgICAgbXkgKCAkdGl0bGUsICRmb3JtYXQsIEBhcmdzICkgPSBAXzsKKyAgICBsb2dfaXQoICR0aXRsZSwgJGZvcm1hdCwgQGFyZ3MgKTsKK307ICMgc3ViIHByb2dyZXNzCisKK3N1YiBzdW1tYXJ5KCkgeworICAgIG15ICR0b3RhbCAgID0gQGpvYnM7CisgICAgbXkgJHN1Y2Nlc3MgPSAwOworICAgIG15ICRmaW5pc2ggPSB0aW1lKCk7CisgICAgZm9yZWFjaCBteSAkam9iICggQGpvYnMgKSB7CisgICAgICAgIG15ICggJGJ1aWxkX2RpciwgJHJjICkgPSAoICRqb2ItPnsgYnVpbGRfZGlyIH0sICRqb2ItPnsgcmMgfSApOworICAgICAgICBwcm9ncmVzcyggcnN0ciggJHJjICksICIlcyIsICRidWlsZF9kaXIgKTsKKyAgICAgICAgaWYgKCAkcmMgPT0gMCApIHsKKyAgICAgICAgICAgICsrICRzdWNjZXNzOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBmb3JlYWNoICRqb2IKKyAgICBteSAkZmFpbHVyZSA9ICR0b3RhbCAtICRzdWNjZXNzOworICAgIHByb2dyZXNzKCAiU3VjY2Vzc2VzIiwgICAgICAiJTNkIG9mICUzZCIsICRzdWNjZXNzLCAkdG90YWwgKTsKKyAgICBwcm9ncmVzcyggIkZhaWx1cmVzIiwgICAgICAgIiUzZCBvZiAlM2QiLCAkZmFpbHVyZSwgJHRvdGFsICk7CisgICAgcHJvZ3Jlc3MoICJUaW1lIGVsYXBzZWQiLCAgICIgICVzIiwgZHN0ciggJGZpbmlzaCAtICRzdGFydCApICk7CisgICAgcHJvZ3Jlc3MoICJPdmVyYWxsIHJlc3VsdCIsICIlcyIsIHJzdHIoICRmYWlsdXJlICkgKTsKKyAgICByZXR1cm4gJGZhaWx1cmU7Cit9OyAjIHN1YiBzdW1tYXJ5CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgV29ya2VyIGZ1bmN0aW9ucy4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3ViIGluaXQoKSB7CisgICAgbWFrZV9kaXIoICR0bXAgKTsKK307ICMgc3ViIGluaXQKKworc3ViIGNsZWFuKEApIHsKKyAgICAjIENsZWFuIGRpcmVjdG9yaWVzLgorICAgIG15ICggQGRpcnMgKSA9IEBfOworICAgIG15ICRleGl0ID0gMDsKKyAgICAjIE1pbWlzYyBtYWtlZmlsZSAtLSBwcmludCBhIGNvbW1hbmQuCisgICAgcHJpbnQoICJybSAtZiAtciAiIC4gam9pbiggIiAiLCBtYXAoIHNob3J0ZXIoICRfICkgLiAiLyoiLCBAZGlycyApICkgLiAiXG4iICk7CisgICAgJGV4aXQgPQorICAgICAgICBleGVjdXRlKAorICAgICAgICAgICAgWyAkXlgsIGNhdF9maWxlKCAkRU5WeyBMSUJPTVBfV09SSyB9LCAidG9vbHMiLCAiY2xlYW4tZGlyLnBsIiApLCBAZGlycyBdLAorICAgICAgICAgICAgLWlnbm9yZV9zdGF0dXMgPT4gMSwKKyAgICAgICAgICAgICggJHRvb2xzOjp2ZXJib3NlID8gKCkgOiAoIC1zdGRvdXQgPT4gdW5kZWYsIC1zdGRlcnIgPT4gIiIgKSApLAorICAgICAgICApOworICAgIHJldHVybiAkZXhpdDsKK307ICMgc3ViIGNsZWFuCisKK3N1YiBtYWtlKCQkJCkgeworICAgICMgQ2hhbmdlIGRpciB0byBidWlsZCBvbmUgYW5kIHJ1biBtYWtlLgorICAgIG15ICggJGpvYiwgJGNsZWFuLCAkbWFya2VyICkgPSBAXzsKKyAgICBteSAkZGlyICAgICAgPSAkam9iLT57IGJ1aWxkX2RpciB9OworICAgIG15ICRtYWtlZmlsZSA9ICRqb2ItPnsgbWFrZWZpbGUgfTsKKyAgICBteSAkYXJncyAgICAgPSAkam9iLT57IG1ha2VfYXJncyB9OworICAgIG15ICRjd2QgICAgICA9IEN3ZDo6Y3dkKCk7CisgICAgbXkgJHdpZHRoICAgID0gLTEwOworCisgICAgbXkgJGV4aXQ7CisgICAgJGRpciA9IGNhdF9kaXIoICR0bXAsICRkaXIgKTsKKyAgICBtYWtlX2RpciggJGRpciApOworICAgIGNoYW5nZV9kaXIoICRkaXIgKTsKKworICAgIG15ICRhY3Rpb25zID0KKyAgICAgICAgc3ViIHsKKyAgICAgICAgICAgIG15ICRzdGFydCA9IHRpbWUoKTsKKyAgICAgICAgICAgICRtYWtlZmlsZSA9IHNob3J0ZXIoICRtYWtlZmlsZSApOworICAgICAgICAgICAgcHJpbnQoICItIiB4IDc5LCAiXG4iICk7CisgICAgICAgICAgICBwcmludGYoICIlJHt3aWR0aH1zOiAlc1xuIiwgIlN0YXJ0ZWQiLCAgIHRzdHIoICRzdGFydCApICk7CisgICAgICAgICAgICBwcmludGYoICIlJHt3aWR0aH1zOiAlc1xuIiwgIlJvb3QgZGlyIiwgICRyb290ICk7CisgICAgICAgICAgICBwcmludGYoICIlJHt3aWR0aH1zOiAlc1xuIiwgIkJ1aWxkIGRpciIsIHNob3J0ZXIoICRkaXIsICRyb290ICkgKTsKKyAgICAgICAgICAgIHByaW50ZiggIiUke3dpZHRofXM6ICVzXG4iLCAiTWFrZWZpbGUiLCAgJG1ha2VmaWxlICk7CisgICAgICAgICAgICBwcmludCggIi0iIHggNzksICJcbiIgKTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAjIFVzZSBzaG9ydGVyIExJQk9NUF9XT1JLIHRvIGhhdmUgc2hvcnRlciBjb21tYW5kIGxpbmVzLgorICAgICAgICAgICAgICAgICMgTm90ZTogU29tZSB0b29scyBtYXkgbm90IHdvcmsgaWYgY3VycmVudCBkaXIgaXMgY2hhbmdlZC4KKyAgICAgICAgICAgICAgICBsb2NhbCAkRU5WeyBMSUJPTVBfV09SSyB9ID0gc2hvcnRlciggJEVOVnsgTElCT01QX1dPUksgfSApOworICAgICAgICAgICAgICAgICRleGl0ID0KKyAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFrZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi1yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLWYiLCAkbWFrZWZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFyY2g9IiAuICR0YXJnZXRfYXJjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFya2VyPSRtYXJrZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAkYXJncworICAgICAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC1pZ25vcmVfc3RhdHVzID0+IDEKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICBpZiAoICRjbGVhbiBhbmQgJGV4aXQgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgJGV4aXQgPSBjbGVhbiggJGRpciApOworICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG15ICRmaW5pc2ggPSB0aW1lKCk7CisgICAgICAgICAgICBwcmludCggIi0iIHggNzksICJcbiIgKTsKKyAgICAgICAgICAgIHByaW50ZiggIiUke3dpZHRofXM6ICVzXG4iLCAiRmluaXNoZWQiLCB0c3RyKCAkZmluaXNoICkgKTsKKyAgICAgICAgICAgIHByaW50ZiggIiUke3dpZHRofXM6ICVzXG4iLCAiRWxhcHNlZCIsIGRzdHIoICRmaW5pc2ggLSAkc3RhcnQgKSApOworICAgICAgICAgICAgcHJpbnRmKCAiJSR7d2lkdGh9czogJXNcbiIsICJSZXN1bHQiLCByc3RyKCAkZXhpdCApICk7CisgICAgICAgICAgICBwcmludCggIi0iIHggNzksICJcbiIgKTsKKyAgICAgICAgICAgIHByaW50KCAiXG4iICk7CisgICAgICAgIH07ICMgc3ViCisgICAgdGVlKCAkYWN0aW9ucywgImJ1aWxkLmxvZyIgKTsKKworICAgIGNoYW5nZV9kaXIoICRjd2QgKTsKKworICAgICMgU2F2ZSBjb21wbGV0ZWQgam9iIHRvIGJlIGFibGUgcHJpbnQgc3VtbWFyeSBsYXRlci4KKyAgICAkam9iLT57IHJjIH0gPSAkZXhpdDsKKyAgICBwdXNoKCBAam9icywgJGpvYiApOworCisgICAgcmV0dXJuICRleGl0OworCit9OyAjIHN1YiBtYWtlCisKKzE7CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rvb2xzL2xpYi9MaWJPTVAucG0gYi9maW5hbC9ydW50aW1lL3Rvb2xzL2xpYi9MaWJPTVAucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZhMzcxZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvbGliL0xpYk9NUC5wbQpAQCAtMCwwICsxLDg1IEBACisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCitwYWNrYWdlIExpYk9NUDsKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIHRvb2xzOworCitzdWIgZW1wdHkoJCkgeworICAgIG15ICggJHZhciApID0gQF87CisgICAgcmV0dXJuIG5vdCBleGlzdHMoICRFTlZ7ICR2YXIgfSApIG9yIG5vdCBkZWZpbmVkKCAkRU5WeyAkdmFyIH0gKSBvciAkRU5WeyAkdmFyIH0gZXEgIiI7Cit9OyAjIHN1YiBlbXB0eQorCitteSAoICRiYXNlLCAkb3V0LCAkdG1wICk7CitpZiAoIGVtcHR5KCAiTElCT01QX1dPUksiICkgKSB7CisgICAgIyAkRmluZEJpbjo6QmluIGlzIG5vdCB1c2VkIGludGVudGlvbmFsbHkgYmVjYXVzZSBpdCBnaXZlcyByZWFsIHBhdGguIEkgd2FudCB0byB1c2UgYWJzb2x1dGUsCisgICAgIyBidXQgbm90IHJlYWwgb25lIChyZWFsIHBhdGggZG9lcyBub3QgY29udGFpbiBzeW1saW5rcyB3aGlsZSBhYnNvbHV0ZSBwYXRoIG1heSBjb250YWluCisgICAgIyBzeW1saW5rcykuCisgICAgJGJhc2UgPSBnZXRfZGlyKCBnZXRfZGlyKCBhYnNfcGF0aCggJDAgKSApICk7Cit9IGVsc2UgeworICAgICRiYXNlID0gYWJzX3BhdGgoICRFTlZ7IExJQk9NUF9XT1JLIH0gKTsKK307ICMgaWYKKworaWYgKCBlbXB0eSggIkxJQk9NUF9FWFBPUlRTIiApICkgeworICAgICRvdXQgPSBjYXRfZGlyKCAkYmFzZSwgImV4cG9ydHMiICk7Cit9IGVsc2UgeworICAgICRvdXQgPSBhYnNfcGF0aCggJEVOVnsgTElCT01QX0VYUE9SVFMgfSApOworfTsgIyBpZgorCitpZiAoIGVtcHR5KCAiTElCT01QX1RNUCIgKSApIHsKKyAgICAkdG1wID0gY2F0X2RpciggJGJhc2UsICJ0bXAiICk7Cit9IGVsc2UgeworICAgICR0bXAgPSBhYnNfcGF0aCggJEVOVnsgTElCT01QX1RNUCB9ICk7Cit9OyAjIGlmCisKKyRFTlZ7IExJQk9NUF9XT1JLICAgIH0gPSAkYmFzZTsKKyRFTlZ7IExJQk9NUF9FWFBPUlRTIH0gPSAkb3V0OworJEVOVnsgTElCT01QX1RNUCAgICAgfSA9ICR0bXA7CisKK3JldHVybiAxOworCitfX0VORF9fCisKKz1wb2QKKworPWhlYWQxIE5BTUUKKworQjxMaWJPTVAucG0+IC0tCisKKz1oZWFkMSBTWU5PUFNJUworCisgICAgdXNlIEZpbmRCaW47CisgICAgdXNlIGxpYiAiJEZpbmRCaW46OkJpbi9saWIiOworICAgIHVzZSBMaWJPTVA7CisKKyAgICAkRU5WeyBMSUJPTVBfV09SSyAgICB9CisgICAgJEVOVnsgTElCT01QX1RNUCAgICAgfQorICAgICRFTlZ7IExJQk9NUF9FWFBPUlRTIH0KKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoZSBtb2R1bGUgY2hlY2tzIEM8TElCT01QX1dPUks+LCBDPExJQk9NUF9FWFBPUlRTPiwgYW5kIEM8TElCT01QX1RNUD4gZW52aXJvbm1lbnRzIHZhcmlhYmxlcy4KK0lmIGEgdmFyaWFibGUgc2V0LCB0aGUgbW9kdWxlIG1ha2VzIHN1cmUgaXQgaXMgYWJzb2x1dGUuIElmIGEgdmFyaWFibGUgZG9lcyBub3QgZXhpc3QsIHRoZSBtb2R1bGUKK3NldHMgaXQgdG8gZGVmYXVsdCB2YWx1ZS4KKworRGVmYXVsdCB2YWx1ZSBmb3IgQzxMSUJPTVBfRVhQT1JUUz4gaXMgQzwkTElCT01QX1dPUksvZXhwb3J0cz4sIGZvciBDPExJQk9NUF9UTVA+IC0tCitDPCRMSUJPTVBfV09SSy90bXA+LgorCitWYWx1ZSBmb3IgQzxMSUJPTVBfV09SSz4gaXMgZ3Vlc3NlZC4gVGhlIG1vZHVsZSBhc3N1bWVzIHRoZSBzY3JpcHQgKHdoaWNoIHVzZXMgdGhlIG1vZHVsZSkgaXMKK2xvY2F0ZWQgaW4gQzx0b29scy8+IGRpcmVjdG9yeSBvZiBsaWJvbXAgZGlyZWN0b3J5IHRyZWUsIGFuZCB1c2VzIHBhdGggb2YgdGhlIHNjcmlwdCB0byBjYWxjdWxhdGUKK0M8TElCT01QX1dPUks+LAorCis9Y3V0CisKKyMgZW5kIG9mIGZpbGUgIworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rvb2xzL2xpYi9QbGF0Zm9ybS5wbSBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvbGliL1BsYXRmb3JtLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3N2U2NDkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rvb2xzL2xpYi9QbGF0Zm9ybS5wbQpAQCAtMCwwICsxLDM5OSBAQAorIworIyBUaGlzIGlzIG5vdCBhIHJ1bm5hYmxlIHNjcmlwdCwgaXQgaXMgYSBQZXJsIG1vZHVsZSwgYSBjb2xsZWN0aW9uIG9mIHZhcmlhYmxlcywgc3Vicm91dGluZXMsIGV0Yy4KKyMgdG8gYmUgdXNlZCBpbiBQZXJsIHNjcmlwdHMuCisjCisjIFRvIGdldCBoZWxwIGFib3V0IGV4cG9ydGVkIHZhcmlhYmxlcyBhbmQgc3Vicm91dGluZXMsIGV4ZWN1dGUgdGhlIGZvbGxvd2luZyBjb21tYW5kOgorIworIyAgICAgcGVybGRvYyBQbGF0Zm9ybS5wbQorIworIyBvciBzZWUgUE9EIChQbGFpbiBPbGQgRG9jdW1lbnRhdGlvbikgaW1iZWRkZWQgdG8gdGhlIHNvdXJjZS4uLgorIworIworIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCitwYWNrYWdlIFBsYXRmb3JtOworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgYmFzZSAiRXhwb3J0ZXIiOworCit1c2UgVW5hbWU7CisKK215IEB2YXJzOworCitCRUdJTiB7CisgICAgQHZhcnMgPSBxd3sgJGhvc3RfYXJjaCAkaG9zdF9vcyAkaG9zdF9wbGF0Zm9ybSAkdGFyZ2V0X2FyY2ggJHRhcmdldF9vcyAkdGFyZ2V0X3BsYXRmb3JtIH07Cit9CisKK291ciAkVkVSU0lPTiAgICAgPSAiMC4wMTQiOworb3VyIEBFWFBPUlQgICAgICA9IHF3e307CitvdXIgQEVYUE9SVF9PSyAgID0gKCBxd3sgY2Fub25fYXJjaCBjYW5vbl9vcyBsZWdhbF9hcmNoIGFyY2hfb3B0IH0sIEB2YXJzICk7CitvdXIgJUVYUE9SVF9UQUdTID0gKCBhbGwgPT4gWyBARVhQT1JUX09LIF0sIHZhcnMgPT4gXEB2YXJzICk7CisKKyMgQ2Fub25pemUgYXJjaGl0ZWN0dXJlIG5hbWUuCitzdWIgY2Fub25fYXJjaCgkKSB7CisgICAgbXkgKCAkYXJjaCApID0gQF87CisgICAgaWYgKCBkZWZpbmVkKCAkYXJjaCApICkgeworICAgICAgICBpZiAoICRhcmNoID1+IG17XEFccyooPzozMnxJQS0/MzJ8SUEtPzMyIGFyY2hpdGVjdHVyZXxpWzM0NTZdODZ8eDg2KVxzKlx6fWkgKSB7CisgICAgICAgICAgICAkYXJjaCA9ICIzMiI7CisgICAgICAgIH0gZWxzaWYgKCAkYXJjaCA9fiBte1xBXHMqKD86NDh8KD86aWEpPzMyZXxJbnRlbFxzKjY0fEludGVsXChSXClccyo2NHx4ODZbXy1dNjR8eDY0fEFNRDY0KVxzKlx6fWkgKSB7CisgICAgICAgICAgICAkYXJjaCA9ICIzMmUiOworICAgICAgICB9IGVsc2lmICggJGFyY2ggPX4gbXtcQWFybSg/OnY3XEQqKT9cen0gKSB7CisgICAgICAgICAgICAkYXJjaCA9ICJhcm0iOworICAgICAgICB9IGVsc2lmICggJGFyY2ggPX4gbXtcQXBwYzY0fSApIHsKKyAgICAgICAgCSRhcmNoID0gInBwYzY0IjsgICAgICAgICAgICAKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRhcmNoID0gdW5kZWY7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCisgICAgcmV0dXJuICRhcmNoOworfTsgIyBzdWIgY2Fub25fYXJjaAorCit7ICAjIFJldHVybiBsZWdhbCBhcHByb3ZlZCBhcmNoaXRlY3R1cmUgbmFtZS4KKyAgICBteSAlbGVnYWwgPSAoCisgICAgICAgICIzMiIgID0+ICJJQS0zMiBhcmNoaXRlY3R1cmUiLAorICAgICAgICAiMzJlIiA9PiAiSW50ZWwoUikgNjQiLAorICAgICAgICAiYXJtIiA9PiAiQVJNIiwKKyAgICApOworCisgICAgc3ViIGxlZ2FsX2FyY2goJCkgeworICAgICAgICBteSAoICRhcmNoICkgPSBAXzsKKyAgICAgICAgJGFyY2ggPSBjYW5vbl9hcmNoKCAkYXJjaCApOworICAgICAgICBpZiAoIGRlZmluZWQoICRhcmNoICkgKSB7CisgICAgICAgICAgICAkYXJjaCA9ICRsZWdhbHsgJGFyY2ggfTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICByZXR1cm4gJGFyY2g7CisgICAgfTsgIyBzdWIgbGVnYWxfYXJjaAorfQorCit7ICAjIFJldHVybiBhcmNoaXRlY3R1cmUgbmFtZSBzdWl0YWJsZSBmb3IgSW50ZWwgY29tcGlsZXIgc2V0dXAgc2NyaXB0cy4KKyAgICBteSAlb3B0aW9uID0gKAorICAgICAgICAiMzIiICA9PiAiaWEzMiIsCisgICAgICAgICIzMmUiID0+ICJpbnRlbDY0IiwKKyAgICAgICAgIjY0IiAgPT4gImlhNjQiLAorICAgICAgICAiYXJtIiA9PiAiYXJtIiwKKyAgICApOworCisgICAgc3ViIGFyY2hfb3B0KCQpIHsKKyAgICAgICAgbXkgKCAkYXJjaCApID0gQF87CisgICAgICAgICRhcmNoID0gY2Fub25fYXJjaCggJGFyY2ggKTsKKyAgICAgICAgaWYgKCBkZWZpbmVkKCAkYXJjaCApICkgeworICAgICAgICAgICAgJGFyY2ggPSAkb3B0aW9ueyAkYXJjaCB9OworICAgICAgICB9OyAjIGlmCisgICAgICAgIHJldHVybiAkYXJjaDsKKyAgICB9OyAjIHN1YiBhcmNoX29wdAorfQorCisjIENhbm9uaXplIE9TIG5hbWUuCitzdWIgY2Fub25fb3MoJCkgeworICAgIG15ICggJG9zICkgPSBAXzsKKyAgICBpZiAoIGRlZmluZWQoICRvcyApICkgeworICAgICAgICBpZiAoICRvcyA9fiBte1xBXHMqKD86TGludXh8bGlufGwpXHMqXHp9aSApIHsKKyAgICAgICAgICAgICRvcyA9ICJsaW4iOworICAgICAgICB9IGVsc2lmICggJG9zID1+IG17XEFccyooPzpscmIpXHMqXHp9aSApIHsKKyAgICAgICAgICAgICRvcyA9ICJscmIiOworICAgICAgICB9IGVsc2lmICggJG9zID1+IG17XEFccyooPzpNYWMoPzpccypPUyg/OlxzKlgpPyk/fG1hY3xtfERhcndpbilccypcen1pICkgeworICAgICAgICAgICAgJG9zID0gIm1hYyI7CisgICAgICAgIH0gZWxzaWYgKCAkb3MgPX4gbXtcQVxzKig/Oldpbig/OmRvd3MpPyg/Oig/Ol98XHMqKT8oPzpOVHxYUHw5NXw5OHwyMDAzKSk/fHcpXHMqXHp9aSApIHsKKyAgICAgICAgICAgICRvcyA9ICJ3aW4iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJG9zID0gdW5kZWY7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCisgICAgcmV0dXJuICRvczsKK307ICMgc3ViIGNhbm9uX29zCisKK215ICggJF9ob3N0X29zLCAkX2hvc3RfYXJjaCwgJF90YXJnZXRfb3MsICRfdGFyZ2V0X2FyY2ggKTsKKworc3ViIHNldF90YXJnZXRfYXJjaCgkKSB7CisgICAgbXkgKCAkYXJjaCApID0gY2Fub25fYXJjaCggJF9bIDAgXSApOworICAgIGlmICggZGVmaW5lZCggJGFyY2ggKSApIHsKKyAgICAgICAgJF90YXJnZXRfYXJjaCAgICAgICA9ICRhcmNoOworICAgICAgICAkRU5WeyBMSUJPTVBfQVJDSCB9ID0gJGFyY2g7CisgICAgfTsgIyBpZgorICAgIHJldHVybiAkYXJjaDsKK307ICMgc3ViIHNldF90YXJnZXRfYXJjaAorCitzdWIgc2V0X3RhcmdldF9vcygkKSB7CisgICAgbXkgKCAkb3MgKSA9IGNhbm9uX29zKCAkX1sgMCBdICk7CisgICAgaWYgKCBkZWZpbmVkKCAkb3MgKSApIHsKKyAgICAgICAgJF90YXJnZXRfb3MgICAgICAgPSAkb3M7CisgICAgICAgICRFTlZ7IExJQk9NUF9PUyB9ID0gJG9zOworICAgIH07ICMgaWYKKyAgICByZXR1cm4gJG9zOworfTsgIyBzdWIgc2V0X3RhcmdldF9vcworCitzdWIgdGFyZ2V0X29wdGlvbnMoKSB7CisgICAgbXkgQG9wdGlvbnMgPSAoCisgICAgICAgICJ0YXJnZXQtb3N8b3M9cyIgPT4KKyAgICAgICAgICAgIHN1YiB7CisgICAgICAgICAgICAgICAgc2V0X3RhcmdldF9vcyggJF9bIDEgXSApIG9yCisgICAgICAgICAgICAgICAgICAgIGRpZSAiQmFkIHZhbHVlIG9mIC0tdGFyZ2V0LW9zIG9wdGlvbjogXCIkX1sgMSBdXCJcbiI7CisgICAgICAgICAgICB9LAorICAgICAgICAidGFyZ2V0LWFyY2hpdGVjdHVyZXx0YXJnZXJ0LWFyY2h8YXJjaGl0ZWN0dXJlfGFyY2g9cyIgPT4KKyAgICAgICAgICAgc3ViIHsKKyAgICAgICAgICAgICAgIHNldF90YXJnZXRfYXJjaCggJF9bIDEgXSApIG9yCisgICAgICAgICAgICAgICAgICAgZGllICJCYWQgdmFsdWUgb2YgLS10YXJnZXQtYXJjaGl0ZWN0dXJlIG9wdGlvbjogXCIkX1sgMSBdXCJcbiI7CisgICAgICAgICAgIH0sCisgICAgKTsKKyAgICByZXR1cm4gQG9wdGlvbnM7Cit9OyAjIHN1YiB0YXJnZXRfb3B0aW9ucworCisjIERldGVjdCBob3N0IGFyY2guCit7CisgICAgbXkgJGhhcmR3YXJlX3BsYXRmb3JtID0gVW5hbWU6OmhhcmR3YXJlX3BsYXRmb3JtKCk7CisgICAgaWYgKCAwICkgeworICAgIH0gZWxzaWYgKCAkaGFyZHdhcmVfcGxhdGZvcm0gZXEgImkzODYiICkgeworICAgICAgICAkX2hvc3RfYXJjaCA9ICIzMiI7CisgICAgfSBlbHNpZiAoICRoYXJkd2FyZV9wbGF0Zm9ybSBlcSAiaWE2NCIgKSB7CisgICAgICAgICRfaG9zdF9hcmNoID0gIjY0IjsKKyAgICB9IGVsc2lmICggJGhhcmR3YXJlX3BsYXRmb3JtIGVxICJ4ODZfNjQiICkgeworICAgICAgICAkX2hvc3RfYXJjaCA9ICIzMmUiOworICAgIH0gZWxzaWYgKCAkaGFyZHdhcmVfcGxhdGZvcm0gZXEgImFybSIgKSB7CisgICAgICAgICRfaG9zdF9hcmNoID0gImFybSI7CisgICAgfSBlbHNpZiAoICRoYXJkd2FyZV9wbGF0Zm9ybSBlcSAicHBjNjQiICkgeworICAgICAgICAkX2hvc3RfYXJjaCA9ICJwcGM2NCI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGllICJVbnN1cHBvcnRlZCBob3N0IGhhcmR3YXJlIHBsYXRmb3JtOiBcIiRoYXJkd2FyZV9wbGF0Zm9ybVwiOyBzdG9wcGVkIjsKKyAgICB9OyAjIGlmCit9CisKKyMgRGV0ZWN0IGhvc3QgT1MuCit7CisgICAgbXkgJG9wZXJhdGluZ19zeXN0ZW0gPSBVbmFtZTo6b3BlcmF0aW5nX3N5c3RlbSgpOworICAgIGlmICggMCApIHsKKyAgICB9IGVsc2lmICggJG9wZXJhdGluZ19zeXN0ZW0gZXEgIkdOVS9MaW51eCIgKSB7CisgICAgICAgICRfaG9zdF9vcyA9ICJsaW4iOworICAgIH0gZWxzaWYgKCAkb3BlcmF0aW5nX3N5c3RlbSBlcSAiRnJlZUJTRCIgKSB7CisgICAgICAgICMgSG9zdCBPUyByZXNlbWJsZXMgTGludXguCisgICAgICAgICRfaG9zdF9vcyA9ICJsaW4iOworICAgIH0gZWxzaWYgKCAkb3BlcmF0aW5nX3N5c3RlbSBlcSAiRGFyd2luIiApIHsKKyAgICAgICAgJF9ob3N0X29zID0gIm1hYyI7CisgICAgfSBlbHNpZiAoICRvcGVyYXRpbmdfc3lzdGVtIGVxICJNUyBXaW5kb3dzIiApIHsKKyAgICAgICAgJF9ob3N0X29zID0gIndpbiI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGllICJVbnN1cHBvcnRlZCBob3N0IG9wZXJhdGluZyBzeXN0ZW06IFwiJG9wZXJhdGluZ19zeXN0ZW1cIjsgc3RvcHBlZCI7CisgICAgfTsgIyBpZgorfQorCisjIERldGVjdCB0YXJnZXQgYXJjaC4KK2lmICggZGVmaW5lZCggJEVOVnsgTElCT01QX0FSQ0ggfSApICkgeworICAgICMgVXNlIGFyY2ggc3BlY2lmaWVkIGluIExJQk9NUF9BUkNILgorICAgICRfdGFyZ2V0X2FyY2ggPSBjYW5vbl9hcmNoKCAkRU5WeyBMSUJPTVBfQVJDSCB9ICk7CisgICAgaWYgKCBub3QgZGVmaW5lZCggJF90YXJnZXRfYXJjaCApICkgeworICAgICAgICBkaWUgIlVua25vd24gYXJjaGl0ZWN0dXJlIHNwZWNpZmllZCBpbiBMSUJPTVBfQVJDSCBlbnZpcm9ubWVudCB2YXJpYWJsZTogXCIkRU5WeyBMSUJPTVBfQVJDSCB9XCIiOworICAgIH07ICMgaWYKK30gZWxzZSB7CisgICAgIyBPdGhlcndpc2UgdXNlIGhvc3QgYXJjaGl0ZWN0dXJlLgorICAgICRfdGFyZ2V0X2FyY2ggPSAkX2hvc3RfYXJjaDsKK307ICMgaWYKKyRFTlZ7IExJQk9NUF9BUkNIIH0gPSAkX3RhcmdldF9hcmNoOworCisjIERldGVjdCB0YXJnZXQgT1MuCitpZiAoIGRlZmluZWQoICRFTlZ7IExJQk9NUF9PUyB9ICkgKSB7CisgICAgIyBVc2UgT1Mgc3BlY2lmaWVkIGluIExJQk9NUF9PUy4KKyAgICAkX3RhcmdldF9vcyA9IGNhbm9uX29zKCAkRU5WeyBMSUJPTVBfT1MgfSApOworICAgIGlmICggbm90IGRlZmluZWQoICRfdGFyZ2V0X29zICkgKSB7CisgICAgICAgIGRpZSAiVW5rbm93biBPUyBzcGVjaWZpZWQgaW4gTElCT01QX09TIGVudmlyb25tZW50IHZhcmlhYmxlOiBcIiRFTlZ7IExJQk9NUF9PUyB9XCIiOworICAgIH07ICMgaWYKK30gZWxzZSB7CisgICAgIyBPdGhlcndpc2UgdXNlIGhvc3QgT1MuCisgICAgJF90YXJnZXRfb3MgPSAkX2hvc3Rfb3M7Cit9OyAjIGlmCiskRU5WeyBMSUJPTVBfT1MgfSA9ICRfdGFyZ2V0X29zOworCit1c2UgdmFycyBAdmFyczsKKwordGllKCAkaG9zdF9hcmNoLCAgICAgICAiUGxhdGZvcm06Omhvc3RfYXJjaCIgKTsKK3RpZSggJGhvc3Rfb3MsICAgICAgICAgIlBsYXRmb3JtOjpob3N0X29zIiApOwordGllKCAkaG9zdF9wbGF0Zm9ybSwgICAiUGxhdGZvcm06Omhvc3RfcGxhdGZvcm0iICk7Cit0aWUoICR0YXJnZXRfYXJjaCwgICAgICJQbGF0Zm9ybTo6dGFyZ2V0X2FyY2giICk7Cit0aWUoICR0YXJnZXRfb3MsICAgICAgICJQbGF0Zm9ybTo6dGFyZ2V0X29zIiApOwordGllKCAkdGFyZ2V0X3BsYXRmb3JtLCAiUGxhdGZvcm06OnRhcmdldF9wbGF0Zm9ybSIgKTsKKworeyBwYWNrYWdlIFBsYXRmb3JtOjpiYXNlOworCisgICAgdXNlIENhcnA7CisKKyAgICB1c2UgVGllOjpTY2FsYXI7CisgICAgdXNlIGJhc2UgIlRpZTo6U3RkU2NhbGFyIjsKKworICAgIHN1YiBTVE9SRSB7CisgICAgICAgIG15ICRzZWxmID0gc2hpZnQoIEBfICk7CisgICAgICAgIGNyb2FrKCAiTW9kaWZ5aW5nIFwkIiAuIHJlZiggJHNlbGYgKSAuICIgaXMgbm90IGFsbG93ZWQ7IHN0b3BwZWQiICk7CisgICAgfTsgIyBzdWIgU1RPUkUKKworfSAjIHBhY2thZ2UgUGxhdGZvcm06OmJhc2UKKworeyBwYWNrYWdlIFBsYXRmb3JtOjpob3N0X2FyY2g7CisgICAgdXNlIGJhc2UgIlBsYXRmb3JtOjpiYXNlIjsKKyAgICBzdWIgRkVUQ0ggeworICAgICAgICByZXR1cm4gJF9ob3N0X2FyY2g7CisgICAgfTsgIyBzdWIgRkVUQ0gKK30gIyBwYWNrYWdlIFBsYXRmb3JtOjpob3N0X2FyY2gKKworeyBwYWNrYWdlIFBsYXRmb3JtOjpob3N0X29zOworICAgIHVzZSBiYXNlICJQbGF0Zm9ybTo6YmFzZSI7CisgICAgc3ViIEZFVENIIHsKKyAgICAgICAgcmV0dXJuICRfaG9zdF9vczsKKyAgICB9OyAjIHN1YiBGRVRDSAorfSAjIHBhY2thZ2UgUGxhdGZvcm06Omhvc3Rfb3MKKworeyBwYWNrYWdlIFBsYXRmb3JtOjpob3N0X3BsYXRmb3JtOworICAgIHVzZSBiYXNlICJQbGF0Zm9ybTo6YmFzZSI7CisgICAgc3ViIEZFVENIIHsKKyAgICAgICAgcmV0dXJuICIke19ob3N0X29zfV8ke19ob3N0X2FyY2h9IjsKKyAgICB9OyAjIHN1YiBGRVRDSAorfSAjIHBhY2thZ2UgUGxhdGZvcm06Omhvc3RfcGxhdGZvcm0KKworeyBwYWNrYWdlIFBsYXRmb3JtOjp0YXJnZXRfYXJjaDsKKyAgICB1c2UgYmFzZSAiUGxhdGZvcm06OmJhc2UiOworICAgIHN1YiBGRVRDSCB7CisgICAgICAgIHJldHVybiAkX3RhcmdldF9hcmNoOworICAgIH07ICMgc3ViIEZFVENICit9ICMgcGFja2FnZSBQbGF0Zm9ybTo6dGFyZ2V0X2FyY2gKKworeyBwYWNrYWdlIFBsYXRmb3JtOjp0YXJnZXRfb3M7CisgICAgdXNlIGJhc2UgIlBsYXRmb3JtOjpiYXNlIjsKKyAgICBzdWIgRkVUQ0ggeworICAgICAgICByZXR1cm4gJF90YXJnZXRfb3M7CisgICAgfTsgIyBzdWIgRkVUQ0gKK30gIyBwYWNrYWdlIFBsYXRmb3JtOjp0YXJnZXRfb3MKKworeyBwYWNrYWdlIFBsYXRmb3JtOjp0YXJnZXRfcGxhdGZvcm07CisgICAgdXNlIGJhc2UgIlBsYXRmb3JtOjpiYXNlIjsKKyAgICBzdWIgRkVUQ0ggeworICAgICAgICByZXR1cm4gIiR7X3RhcmdldF9vc31fJHtfdGFyZ2V0X2FyY2h9IjsKKyAgICB9OyAjIHN1YiBGRVRDSAorfSAjIHBhY2thZ2UgUGxhdGZvcm06OnRhcmdldF9wbGF0Zm9ybQorCisKK3JldHVybiAxOworCitfX0VORF9fCisKKz1wb2QKKworPWhlYWQxIE5BTUUKKworQjxQbGF0Zm9ybS5wbT4gLS0gRmV3IHN1YnJvdXRpbmVzIHRvIGdldCBPUywgYXJjaGl0ZWN0dXJlIGFuZCBwbGF0Zm9ybSBuYW1lIGluIGZvcm0gc3VpdGFibGUgZm9yCituYW1pbmcgZmlsZXMsIGRpcmVjdG9yaWVzLCBtYWNyb3MsIGV0Yy4KKworPWhlYWQxIFNZTk9QU0lTCisKKyAgICB1c2UgUGxhdGZvcm0gIjphbGwiOworICAgIHVzZSB0b29sczsKKworICAgIG15ICRhcmNoICAgPSBjYW5vbl9hcmNoKCAiZW02NFQiICk7ICAgICAgICAjIFJldHVybnMgIjMyZSIuCisgICAgbXkgJGxlZ2FsICA9IGxlZ2FsX2FyY2goICJlbTY0dCIgKTsgICAgICAgICMgUmV0dXJucyAiSW50ZWwoUikgNjQiLgorICAgIG15ICRvcHRpb24gPSBhcmNoX29wdCggImVtNjR0IiApOyAgICAgICAgICAjIFJldHVybnMgImludGVsNjQiLgorICAgIG15ICRvcyAgICAgPSBjYW5vbl9vcyggIldpbmRvd3MgTlQiICk7ICAgICAjIFJldHVybnMgIndpbiIuCisKKyAgICBwcmludCggJGhvc3RfYXJjaCwgJGhvc3Rfb3MsICRob3N0X3BsYXRmb3JtICk7CisgICAgcHJpbnQoICR0YXJlZ3RfYXJjaCwgJHRhcmdldF9vcywgJHRhcmdldF9wbGF0Zm9ybSApOworCisgICAgdG9vbHM6OmdldF9vcHRpb25zKAorICAgICAgICBQbGF0Zm9ybTo6dGFyZ2V0X29wdGlvbnMoKSwKKyAgICAgICAgLi4uCisgICAgKTsKKworCis9aGVhZDEgREVTQ1JJUFRJT04KKworRW52aXJvbm1lbnQgdmFyaWFibGUgTElCT01QX09TIHNwZWNpZmllcyB0YXJnZXQgT1MgdG8gcmVwb3J0LiBJZiBMSUJPTVBfT1MgaWQgbm90IGRlZmluZWQsCit0aGUgc2NyaXB0IGFzc3VtZXMgaG9zdCBPUyBpcyB0YXJnZXQgT1MuCisKK0Vudmlyb25tZW50IHZhcmlhYmxlIExJQk9NUF9BUkNIIHNwZWNpZmllcyB0YXJnZXQgYXJjaGl0ZWN0dXJlIHRvIHJlcG9ydC4gSWYgTElCT01QX0FSQ0ggaXMgbm90IGRlZmluZWQsCit0aGUgc2NyaXB0IGFzc3VtZXMgaG9zdCBhcmNoaXRlY3R1cmUgaXMgdGFyZ2V0IG9uZS4KKworPWhlYWQyIEZ1bmN0aW9ucy4KKworPW92ZXIKKworPWl0ZW0gQjxjYW5vbl9hcmNoKCAkYXJjaCApPgorCitJbnB1dCBzdHJpbmcgaXMgYW4gYXJjaGl0ZWN0dXJlIG5hbWUgdG8gY2Fub25pemUuIFRoZSBmdW5jdGlvbiByZWNvZ25pemVzIG1hbnkgdmFyaWFudHMsIGZvciBleGFtcGxlOgorQzwzMmU+LCBDPEludGVsNjQ+LCBDPEludGVsKFIpIDY0PiwgZXRjLiBSZXR1cm5lZCBzdHJpbmcgaXMgYSBjYW5vbm9uaXplZCBhcmNoaXRlY3R1cmUgbmFtZSwKK29uZSBvZjogQzwzMj4sIEM8MzJlPiwgQzw2ND4sIG9yIEM8dW5kZWY+IGlzIGlucHV0IHN0cmluZyBpcyBub3QgcmVjb2duaXplZC4KKworPWl0ZW0gQjxsZWdhbF9hcmNoKCAkYXJjaCApPgorCitJbnB1dCBzdHJpbmcgaXMgYXJjaGl0ZWN0dXJlIG5hbWUuIFRoZSBmdW5jdGlvbiByZWNvZ25pemVzIHRoZSBzYW1lIHZhcmlhbnRzIGFzIEM8YXJjaF9jYW5vbigpPiBkb2VzLgorUmV0dXJuZWQgc3RyaW5nIGlzIGEgbmFtZSBhcHByb3ZlZCBieSBJbnRlbCBMZWdhbCwgb25lIG9mOiBDPElBLTMyIGFyY2hpdGVjdHVyZT4sIEM8SW50ZWwoUikgNjQ+CitvciBDPHVuZGVmPiBpZiBpbnB1dCBzdHJpbmcgaXMgbm90IHJlY29nbml6ZWQuCisKKz1pdGVtIEI8YXJjaF9vcHQoICRhcmNoICk+CisKK0lucHV0IHN0cmluZyBpcyBhcmNoaXRlY3R1cmUgbmFtZS4gVGhlIGZ1bmN0aW9uIHJlY29nbml6ZXMgdGhlIHNhbWUgdmFyaWFudHMgYXMgQzxhcmNoX2Nhbm9uKCk+IGRvZXMuCitSZXR1cm5lZCBzdHJpbmcgaXMgYW4gYXJjaGl0ZWN0dXJlIG5hbWUgc3VpdGFibGUgZm9yIHBhc3NpbmcgdG8gY29tcGlsZXIgc2V0dXAgc2NyaXB0cworKGUuIGcuIEM8aWNjdmFycy5zaD4pLCBvbmUgb2Y6IEM8SUEtMzIgYXJjaGl0ZWN0dXJlPiwgQzxJbnRlbChSKSA2ND4gb3IgQzx1bmRlZj4gaWYgaW5wdXQgc3RyaW5nIGlzIG5vdAorcmVjb2duaXplZC4KKworPWl0ZW0gQjxjYW5vbl9vcyggJG9zICk+CisKK0lucHV0IHN0cmluZyBpcyBPUyBuYW1lIHRvIGNhbm9uaXplLiBUaGUgZnVuY3Rpb24gcmVjb2duaXplcyBtYW55IHZhcmlhbnRzLCBmb3IgZXhhbXBsZTogQzxtYWM+LCBDPE9TIFg+LCBldGMuIFJldHVybmVkIHN0cmluZyBpcyBhIGNhbm9uaXplZCBPUyBuYW1lLCBvbmUgb2Y6IEM8bGluPiwgQzxscmI+LAorQzxtYWM+LCBDPHdpbj4sIG9yIEM8dW5kZWY+IGlzIGlucHV0IHN0cmluZyBpcyBub3QgcmVjb2duaXplZC4KKworPWl0ZW0gQjx0YXJnZXRfb3B0aW9ucygpPgorCitSZXR1cm5zIGFycmF5IHN1aXRhYmxlIGZvciBwYXNzaW5nIHRvIEM8dG9vbHM6OmdldF9vcHRpb25zKCk+IHRvIGxldCBhIHNjcmlwdCByZWNvZ25pemUKK0M8LS10YXJnZXQtYXJjaGl0ZWN0dXJlPUk8c3RyPj4gYW5kIEM8LS10YXJnZXQtb3M9STxzdHI+PiBvcHRpb25zLiBUeXBpY2FsIHVzYWdlIGlzOgorCisgICAgdXNlIHRvb2xzOworICAgIHVzZSBQbGF0Zm9ybTsKKworICAgIG15ICggJG9zLCAkYXJjaCwgJHBsYXRmb3JtICk7ICAgICMgR2xvYmFsIHZhcmlhYmxlcywgbm90IGluaXRpYWxpemVkLgorCisgICAgLi4uCisKKyAgICBnZXRfb3B0aW9ucygKKyAgICAgICAgUGxhdGZvcm06OnRhcmdldF9vcHRpb25zKCksICAjIExldCBzY3JpcHQgcmVjb2duaXplIC0tdGFyZ2V0LW9zIGFuZCAtLXRhcmdldC1hcmNoIG9wdGlvbnMuCisgICAgICAgIC4uLgorICAgICk7CisgICAgIyBJbml0aWFsaXplIHZhcmlhYmxzIGFmdGVyIHBhcnNpbmcgY29tbWFuZCBsaW5lLgorICAgICggJG9zLCAkYXJjaCwgJHBsYXRmb3JtICkgPSAoIFBsYXRmb3JtOjp0YXJnZXRfb3MoKSwgUGxhdGZvcm06OnRhcmdldF9hcmNoKCksIFBsYXRmb3JtOjp0YXJnZXRfcGxhdGZvcm0oKSApOworCis9YmFjaworCis9aGVhZDIgVmFyaWFibGVzCisKKz1pdGVtIEI8JGhvc3RfYXJjaD4KKworQ2Fub25pemVkIG5hbWUgb2YgaG9zdCBhcmNoaXRlY3R1cmUuCisKKz1pdGVtIEI8JGhvc3Rfb3M+CisKK0Nhbm9uaXplZCBuYW1lIG9mIGhvc3QgT1MuCisKKz1pdGVtIEI8JGhvc3RfcGxhdGZvcm0+CisKK0hvc3QgcGxhdGZvcm0gbmFtZSAoY29uY2F0ZW5hdGVkIGNhbm9uaXplZCBPUyBuYW1lLCB1bmRlcnNjb3JlLCBhbmQgY2Fub25pemVkIGFyY2hpdGVjdHVyZSBuYW1lKS4KKworPWl0ZW0gQjwkdGFyZ2V0X2FyY2g+CisKK0Nhbm9uaXplZCBuYW1lIG9mIHRhcmdldCBhcmNoaXRlY3R1cmUuCisKKz1pdGVtIEI8JHRhcmdldF9vcz4KKworQ2Fub25pemVkIG5hbWUgb2YgdGFyZ2V0IE9TLgorCis9aXRlbSBCPCR0YXJnZXRfcGxhdGZvcm0+CisKK1RhcmdldCBwbGF0Zm9ybSBuYW1lIChjb25jYXRlbmF0ZWQgY2Fub25pemVkIE9TIG5hbWUsIHVuZGVyc2NvcmUsIGFuZCBjYW5vbml6ZWQgYXJjaGl0ZWN0dXJlIG5hbWUpLgorCis9YmFjaworCis9Y3V0CisKKyMgZW5kIG9mIGZpbGUgIworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rvb2xzL2xpYi9VbmFtZS5wbSBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvbGliL1VuYW1lLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNTE4YjQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rvb2xzL2xpYi9VbmFtZS5wbQpAQCAtMCwwICsxLDYyOSBAQAorIworIyBUaGlzIGlzIG5vdCBhIHJ1bm5hYmxlIHNjcmlwdCwgaXQgaXMgYSBQZXJsIG1vZHVsZSwgYSBjb2xsZWN0aW9uIG9mIHZhcmlhYmxlcywgc3Vicm91dGluZXMsIGV0Yy4KKyMgVG8gZ2V0IGhlbHAgYWJvdXQgZXhwb3J0ZWQgdmFyaWFibGVzIGFuZCBzdWJyb3V0aW5lcywgZXhlY3V0ZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CisjCisjICAgICBwZXJsZG9jIFVuYW1lLnBtCisjCisjIG9yIHNlZSBQT0QgKFBsYWluIE9sZCBEb2N1bWVudGF0aW9uKSBlbWJlZGRlZCB0byB0aGUgc291cmNlLi4uCisjCisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKK3BhY2thZ2UgVW5hbWU7CisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7Cit1c2Ugd2FybmluZ3M6OnJlZ2lzdGVyOwordXNlIEV4cG9ydGVyOworCit1c2UgUE9TSVg7Cit1c2UgRmlsZTo6R2xvYiAiOmdsb2IiOwordXNlIE5ldDo6RG9tYWluIHF3e307CisKKyMgRm9sbG93aW5nIGNvZGUgZG9lcyBub3Qgd29yayB3aXRoIFBlcmwgNS42IG9uIExpbnV4KiBPUyBhbmQgV2luZG93cyogT1M6CisjCisjICAgICB1c2UgaWYgJF5PIGVxICJkYXJ3aW4iLCB0b29scyA9PiBxd3t9OworIworIyBUaGUgd29ya2Fyb3VuZCBmb3IgUGVybCA1LjY6CisjCitCRUdJTiB7CisgICAgaWYgKCAkXk8gZXEgImRhcndpbiIgb3IgJF5PIGVxICJsaW51eCIgKSB7CisJcmVxdWlyZSB0b29sczsKKyAgICAgICAgaW1wb3J0IHRvb2xzOworICAgIH07ICMgaWYKKyAgICBpZiAoICReTyBlcSAiTVNXaW4zMiIgKSB7CisgICAgICAgIHJlcXVpcmUgV2luMzI7CisgICAgfTsgIyBpZgorfTsgIyBCRUdJTgorCitteSAkbXN3aW4gPSBxcntcQSg/Ok1TV2luMzJ8V2luZG93c19OVClcen07CisKK215IEBwb3NpeCA9IHF3eyBrZXJuZWxfbmFtZSBmcWRuIGtlcm5lbF9yZWxlYXNlIGtlcm5lbF92ZXJzaW9uIG1hY2hpbmUgfTsKKyAgICAjIFByb3BlcnRpZXMgc3VwcG9ydGVkIGJ5IFBPU0lYOjp1bmFtZSgpLgorbXkgQGxpbnV4ID0KKyAgICBxd3sgcHJvY2Vzc29yIGhhcmR3YXJlX3BsYXRmb3JtIG9wZXJhdGluZ19zeXN0ZW0gfTsKKyAgICAjIFByb3BlcnRpZXMgcmVwb3J0ZWQgYnkgdW5hbWUgaW4gTGludXgqIE9TLgorbXkgQGJhc2UgPSAoIEBwb3NpeCwgQGxpbnV4ICk7CisgICAgIyBCYXNlIHByb3BlcnRpZXMuCitteSBAYXV4ID0KKyAgICAoCisgICAgICAgIHF3eyBob3N0X25hbWUgZG9tYWluX25hbWUgfSwKKyAgICAgICAgbWFwKCAib3BlcmF0aW5nX3N5c3RlbV8kXyIsIHF3eyBuYW1lIHJlbGVhc2UgY29kZW5hbWUgZGVzY3JpcHRpb24gfSApCisgICAgKTsKKyAgICAjIEF1eGlsaWFyeSBwcm9wZXJ0aWVzLgorbXkgQGFsbCA9ICggQGJhc2UsIEBhdXggKTsKKyAgICAjIEFsbCB0aGUgcHJvcGVydGllcy4KK215IEBtZXRhID0gcXd7IGJhc2VfbmFtZXMgYWxsX25hbWVzIHZhbHVlIH07CisgICAgIyBNZXRhIGZ1bmN0aW9ucy4KKworb3VyICRWRVJTSU9OICAgICA9ICIwLjA3IjsKK291ciBASVNBICAgICAgICAgPSBxd3sgRXhwb3J0ZXIgfTsKK291ciBARVhQT1JUICAgICAgPSBxd3t9Oworb3VyIEBFWFBPUlRfT0sgICA9ICggQGFsbCwgQG1ldGEgKTsKK291ciAlRVhQT1JUX1RBR1MgPQorICAgICgKKyAgICAgICAgYmFzZSA9PiBbIEBiYXNlIF0sCisgICAgICAgIGFsbCAgPT4gWyBAYWxsICBdLAorICAgICAgICBtZXRhID0+IFsgQG1ldGEgXSwKKyAgICApOworCitteSAldmFsdWVzOworICAgICMgSGFzaCBvZiB2YWx1ZXMuIFNvbWUgdmFsdWVzIGFyZSBzdHJpbmdzLCBzb21lIG1heSBiZSByZWZlcmVuY2VzIHRvIGNvZGUgd2hpY2ggc2hvdWxkIGJlCisgICAgIyBldmFsdWF0ZWQgdG8gZ2V0IHJlYWwgdmFsdWUuIFRoaXMgdHJpY2sgaXMgaW1wbGVtZW50ZWQgYmVjYXVzZSBjYWxsIHRvIE5ldDo6RG9tYWluOjpob3N0ZnFkbigpCisgICAgIyBpcyByZWxhdGl2ZWx5IHNsb3cuCisKKyMgR2V0IHZhbHVlcyBmcm9tIFBPU0lYOjp1bmFtZSgpLgorQHZhbHVlc3sgQHBvc2l4IH0gPSBQT1NJWDo6dW5hbWUoKTsKKworIyBPbiBzb21lIHN5c3RlbXMgUE9TSVg6OnVuYW1lKCkgcmV0dXJucyAic2hvcnQiIG5vZGUgbmFtZSAod2l0aG91dCBkb21haW4gbmFtZSkuIFRvIGJlIGNvbnNpc3RlbnQKKyMgb24gYWxsIHN5c3RlbXMsIHdlIHdpbGwgZ2V0IG5vZGUgbmFtZSBmcm9tIGFsdGVybmF0aXZlIHNvdXJjZS4KK2lmICggJF5PID1+IG0vY3lnd2luL2kgKSB7CisgICAgIyBGdW5jdGlvbiBmcm9tIE5ldDo6RG9tYWluIG1vZHVsZSB3b3JrcyB3ZWxsLCBidXQgb24gQ3lnd2luIGl0IHByaW50cyB0bworICAgICMgc3RkZXJyICJkb21haW5uYW1lOiBub3QgZm91bmQiLiBTbyB3ZSB3aWxsIHVzZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIG5vdy4KKyAgICAkdmFsdWVzeyBmcWRuIH0gPSBsYyggJEVOVnsgQ09NUFVURVJOQU1FIH0gLiAiLiIgLiAkRU5WeyBVU0VSRE5TRE9NQUlOIH0gKTsKK30gZWxzZSB7CisgICAgIyBPbiBzeXN0ZW1zIG90aGVyIHRoYW4gQ3lnd2luLCBsZXQgdXMgdXNlIE5ldDo6RG9tYWluOjpob3N0ZnFkbigpLCBidXQgZG8gaXQgb25seSBub2RlIG5hbWUKKyAgICAjIGlzIHJlYWxseSByZXF1ZXN0ZWQuCisgICAgJHZhbHVlc3sgZnFkbiB9ID0KKyAgICAgICAgc3ViIHsKKyAgICAgICAgICAgIG15ICRmcWRuID0gTmV0OjpEb21haW46Omhvc3RmcWRuKCk7ICMgImZxZG4iIHN0YW5kcyBmb3IgImZ1bGx5IHF1YWxpZmllZCBkb2FtYWluIG5hbWUiLgorICAgICAgICAgICAgIyBPbiBzb21lIHN5c3RlbXMgUE9TSVg6OnVuYW1lKCkgYW5kIE5ldDo6RG9tYWluOjpob3N0ZnFkbigpIHJlcG9ydHMgZGlmZmVyZW50IG5hbWVzLgorICAgICAgICAgICAgIyBMZXQgdXMgaXNzdWUgYSB3YXJuaW5nIGlmIHRoZXkgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQuIE5hbWVzIGFyZSBpbnNpZ25pZmljYW50bHkKKyAgICAgICAgICAgICMgZGlmZmVyZW50IGlmIFBPU0lYOjp1bmFtZSgpIG1hdGNoZXMgdGhlIGJlZ2lubmluZyBvZiBOZXQ6OkRvbWFpbjo6aG9zdGZxZG4oKS4KKyAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICAkZnFkbiBlcSBzdWJzdHIoICRmcWRuLCAwLCBsZW5ndGgoICRmcWRuICkgKQorICAgICAgICAgICAgICAgICYmCisgICAgICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICAgICBsZW5ndGgoICRmcWRuICkgPT0gbGVuZ3RoKCAkZnFkbiApCisgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICAgICAgICAgICAgIHN1YnN0ciggJGZxZG4sIGxlbmd0aCggJGZxZG4gKSwgMSApIGVxICIuIgorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgICMgT2suCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHdhcm5pbmdzOjp3YXJuaWYoCisgICAgICAgICAgICAgICAgICAgICJQT1NJWDo6dW5hbWUoKSBhbmQgTmV0OjpEb21haW46Omhvc3RmcWRuKCkgcmVwb3J0ZWQgZGlmZmVyZW50IG5hbWVzOiAiIC4KKyAgICAgICAgICAgICAgICAgICAgICAgICJcIiR2YWx1ZXN7IGZxZG4gfVwiIGFuZCBcIiRmcWRuXCIgcmVzcGVjdGl2ZWx5XG4iCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgIHJldHVybiAkZnFkbjsKKyAgICAgICAgfTsgIyBzdWIKK307ICMgaWYKKworaWYgKCAkXk8gPX4gJG1zd2luICkgeworICAgIGlmICgKKyAgICAgICAgJHZhbHVlc3sgbWFjaGluZSB9ID1+IG17XEEoPzp4ODZ8WzU2XTg2KVx6fQorICAgICAgICBhbmQKKyAgICAgICAgZXhpc3RzKCAkRU5WeyBQUk9DRVNTT1JfQVJDSElURUNUVVJFIH0gKSBhbmQgJEVOVnsgUFJPQ0VTU09SX0FSQ0hJVEVDVFVSRSB9IGVxICJ4ODYiCisgICAgICAgIGFuZAorICAgICAgICBleGlzdHMoICRFTlZ7IFBST0NFU1NPUl9BUkNISVRFVzY0MzIgfSApCisgICAgKSB7CisgICAgICAgIGlmICggJEVOVnsgUFJPQ0VTU09SX0FSQ0hJVEVXNjQzMiB9IGVxICJBTUQ2NCIgKSB7CisgICAgICAgICAgICAkdmFsdWVzeyBtYWNoaW5lIH0gPSAieDg2XzY0IjsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKK307ICMgaWYKKworIyBTb21lIHZhbHVlcyBhcmUgbm90IHJldHVybmVkIGJ5IFBPU0lYOjp1bmFtZSgpLCBsZXQgdXMgY29tcHV0ZSB0aGVtLgorCisjIHByb2Nlc3Nvci4KKyR2YWx1ZXN7IHByb2Nlc3NvciB9ID0gJHZhbHVlc3sgbWFjaGluZSB9OworCisjIGhhcmR3YXJlX3BsYXRmb3JtLgoraWYgKCAwICkgeworfSBlbHNpZiAoICReTyBlcSAibGludXgiIG9yICReTyBlcSAiZnJlZWJzZCIgKSB7CisgICAgaWYgKCAwICkgeworICAgIH0gZWxzaWYgKCAkdmFsdWVzeyBtYWNoaW5lIH0gPX4gbXtcQWlbMzQ1Nl04Nlx6fSApIHsKKyAgICAgICAgJHZhbHVlc3sgaGFyZHdhcmVfcGxhdGZvcm0gfSA9ICJpMzg2IjsKKyAgICB9IGVsc2lmICggJHZhbHVlc3sgbWFjaGluZSB9ID1+IG17XEEoeDg2XzY0fGFtZDY0KVx6fSApIHsKKyAgICAgICAgJHZhbHVlc3sgaGFyZHdhcmVfcGxhdGZvcm0gfSA9ICJ4ODZfNjQiOworICAgIH0gZWxzaWYgKCAkdmFsdWVzeyBtYWNoaW5lIH0gPX4gbXtcQWFybXY3XEQqXHp9ICkgeworICAgICAgICAkdmFsdWVzeyBoYXJkd2FyZV9wbGF0Zm9ybSB9ID0gImFybSI7CisgICAgfSBlbHNpZiAoICR2YWx1ZXN7IG1hY2hpbmUgfSA9fiBte1xBcHBjNjRcen0gKSB7CisgICAgICAgICR2YWx1ZXN7IGhhcmR3YXJlX3BsYXRmb3JtIH0gPSAicHBjNjQiOworICAgIH0gZWxzZSB7CisgICAgICAgIGRpZSAiVW5zdXBwb3J0ZWQgbWFjaGluZSAoXCIkdmFsdWVzeyBtYWNoaW5lIH1cIikgcmV0dXJuZWQgYnkgUE9TSVg6OnVuYW1lKCk7IHN0b3BwZWQiOworICAgIH07ICMgaWYKK30gZWxzaWYgKCAkXk8gZXEgImRhcndpbiIgKSB7CisgICAgaWYgKCAwICkgeworICAgIH0gZWxzaWYgKCAkdmFsdWVzeyBtYWNoaW5lIH0gZXEgIng4NiIgb3IgJHZhbHVlc3sgbWFjaGluZSB9IGVxICJpMzg2IiApIHsKKyAgICAgICAgJHZhbHVlc3sgaGFyZHdhcmVfcGxhdGZvcm0gfSA9CisgICAgICAgICAgICBzdWIgeworICAgICAgICAgICAgICAgIG15ICRwbGF0Zm9ybSA9ICJpMzg2IjsKKyAgICAgICAgICAgICAgICAjIFNvbWUgT1NlcyBvbiBJbnRlbChSKSA2NCBzdGlsbCByZXBvcnRzICJpMzg2IiBtYWNoaW5lLiBWZXJpZnkgaXQgYnkgdXNpbmcKKyAgICAgICAgICAgICAgICAjIHRoZSB2YWx1ZSByZXR1cm5lZCBieSAnc3lzY3RsIC1uIGh3Lm9wdGlvbmFsLng4Nl82NCcuIE9uIEludGVsKFIpIDY0LWJpdCBzeXN0ZW1zIHRoZQorICAgICAgICAgICAgICAgICMgdmFsdWUgPT0gMTsgb24gMzItYml0IHN5c3RlbXMgdGhlICdody5vcHRpb25hbC54ODZfNjQnIHByb3BlcnR5IGVpdGhlciBkb2VzIG5vdCBleGlzdAorICAgICAgICAgICAgICAgICMgb3IgdGhlIHZhbHVlID09IDAuIFRoZSBwYXRoIHZhcmlhYmxlIGRvZXMgbm90IGNvbnRhaW4gYSBwYXRoIHRvIHN5c2N0bCB3aGVuCisgICAgICAgICAgICAgICAgIyBzdGFydGVkIGJ5IGNyb250YWIuCisgICAgICAgICAgICAgICAgbXkgJHN5c2N0bCA9ICggd2hpY2goICJzeXNjdGwiICkgb3IgIi91c3Ivc2Jpbi9zeXNjdGwiICk7CisgICAgICAgICAgICAgICAgbXkgJG91dHB1dDsKKyAgICAgICAgICAgICAgICBkZWJ1ZyggIkV4ZWN1dGluZyAkc3lzY3RsLi4uIiApOworICAgICAgICAgICAgICAgIGV4ZWN1dGUoIFsgJHN5c2N0bCwgIi1uIiwgImh3Lm9wdGlvbmFsLng4Nl82NCIgXSwgLXN0ZG91dCA9PiBcJG91dHB1dCwgLXN0ZGVyciA9PiB1bmRlZiApOworICAgICAgICAgICAgICAgIGNob21wKCAkb3V0cHV0ICk7CisgICAgICAgICAgICAgICAgaWYgKCAwICkgeworICAgICAgICAgICAgICAgIH0gZWxzaWYgKCAiJG91dHB1dCIgZXEgIiIgb3IgIiRvdXRwdXQiIGVxICIwIiApIHsKKyAgICAgICAgICAgICAgICAgICAgJHBsYXRmb3JtID0gImkzODYiOworICAgICAgICAgICAgICAgIH0gZWxzaWYgKCAiJG91dHB1dCIgZXEgIjEiICkgeworICAgICAgICAgICAgICAgICAgICAkcGxhdGZvcm0gPSAieDg2XzY0IjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkaWUgIlVuc3VwcG9ydGVkIHZhbHVlIChcIiRvdXRwdXRcIikgcmV0dXJuZWQgYnkgXCIkc3lzY3RsIC1uIGh3Lm9wdGlvbmFsLng4Nl82NFwiOyBzdG9wcGVkIjsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAgICAgcmV0dXJuICRwbGF0Zm9ybTsKKyAgICAgICAgICAgIH07ICMgc3ViIHsKKyAgICB9IGVsc2lmICggJHZhbHVlc3sgbWFjaGluZSB9IGVxICJ4ODZfNjQiICkgeworCSMgU29tZSBPUyBYKiB2ZXJzaW9ucyByZXBvcnQgIng4Nl82NCIuCisJJHZhbHVlc3sgaGFyZHdhcmVfcGxhdGZvcm0gfSA9ICJ4ODZfNjQiOworICAgIH0gZWxzZSB7CisgICAgICAgIGRpZSAiVW5zdXBwb3J0ZWQgbWFjaGluZSAoXCIkdmFsdWVzeyBtYWNoaW5lIH1cIikgcmV0dXJuZWQgYnkgUE9TSVg6OnVuYW1lKCk7IHN0b3BwZWQiOworICAgIH07ICMgaWYKK30gZWxzaWYgKCAkXk8gPX4gJG1zd2luICkgeworICAgIGlmICggMCApIHsKKyAgICB9IGVsc2lmICggJHZhbHVlc3sgbWFjaGluZSB9ID1+IG17XEEoPzp4ODZ8WzU2XTg2KVx6fSApIHsKKyAgICAgICAgJHZhbHVlc3sgaGFyZHdhcmVfcGxhdGZvcm0gfSA9ICJpMzg2IjsKKyAgICB9IGVsc2lmICggJHZhbHVlc3sgbWFjaGluZSB9IGVxICJ4ODZfNjQiIG9yICR2YWx1ZXN7IG1hY2hpbmUgfSBlcSAiYW1kNjQiICkgeworICAgICAgICAjIEFjdGl2ZVBlcmwgZm9yIElBLTMyIGFyY2hpdGVjdHVyZSByZXR1cm5zICJ4ODZfNjQiLCB3aGlsZSBBY3RpdmVQZXJsIGZvciBJbnRlbChSKSA2NCByZXR1cm5zICJhbWQ2NCIuCisgICAgICAgICR2YWx1ZXN7IGhhcmR3YXJlX3BsYXRmb3JtIH0gPSAieDg2XzY0IjsKKyAgICB9IGVsc2UgeworICAgICAgICBkaWUgIlVuc3VwcG9ydGVkIG1hY2hpbmUgKFwiJHZhbHVlc3sgbWFjaGluZSB9XCIpIHJldHVybmVkIGJ5IFBPU0lYOjp1bmFtZSgpOyBzdG9wcGVkIjsKKyAgICB9OyAjIGlmCit9IGVsc2lmICggJF5PIGVxICJjeWd3aW4iICkgeworICAgIGlmICggMCApIHsKKyAgICB9IGVsc2lmICggJHZhbHVlc3sgbWFjaGluZSB9ID1+IG17XEFpWzM0NTZdODZcen0gKSB7CisgICAgICAgICR2YWx1ZXN7IGhhcmR3YXJlX3BsYXRmb3JtIH0gPSAiaTM4NiI7CisgICAgfSBlbHNpZiAoICR2YWx1ZXN7IG1hY2hpbmUgfSBlcSAieDg2XzY0IiApIHsKKyAgICAgICAgJHZhbHVlc3sgaGFyZHdhcmVfcGxhdGZvcm0gfSA9ICJ4ODZfNjQiOworICAgIH0gZWxzZSB7CisgICAgICAgIGRpZSAiVW5zdXBwb3J0ZWQgbWFjaGluZSAoXCIkdmFsdWVzeyBtYWNoaW5lIH1cIikgcmV0dXJuZWQgYnkgUE9TSVg6OnVuYW1lKCk7IHN0b3BwZWQiOworICAgIH07ICMgaWYKK30gZWxzZSB7CisgICAgZGllICJVbnN1cHBvcnRlZCBPUyAoXCIkXk9cIik7IHN0b3BwZWQiOworfTsgIyBpZgorCisjIG9wZXJhdGluZ19zeXN0ZW0uCitpZiAoIDAgKSB7Cit9IGVsc2lmICggJHZhbHVlc3sga2VybmVsX25hbWUgfSBlcSAiTGludXgiICkgeworICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW0gfSA9ICJHTlUvTGludXgiOworICAgIG15ICRyZWxlYXNlOyAgICAjIE5hbWUgb2YgY2hvc2VuICIqLXJlbGVhc2UiIGZpbGUuCisgICAgbXkgJGJ1bGs7ICAgICAgICMgQ29udGVudCBvZiByZWxlYXNlIGZpbGUuCisgICAgIyBPbiBVYnVudHUsIGxzYi1yZWxlYXNlIGlzIHF1aXRlIGluZm9ybWF0aXZlLCBlLiBnLjoKKyAgICAjICAgICBESVNUUklCX0lEPVVidW50dQorICAgICMgICAgIERJU1RSSUJfUkVMRUFTRT05LjA0CisgICAgIyAgICAgRElTVFJJQl9DT0RFTkFNRT1qYXVudHkKKyAgICAjICAgICBESVNUUklCX0RFU0NSSVBUSU9OPSJVYnVudHUgOS4wNCIKKyAgICAjIFRyeSBsc2ItcmVsZWFzZSBmaXJzdC4gQnV0IG9uIHNvbWUgb2xkZXIgc3lzdGVtcyBsc2ItcmVsZWFzZSBpcyBub3QgaW5mb3JtYXRpdmUuCisgICAgIyBJdCBtYXkgY29udGFpbiBqdXN0IG9uZSBsaW5lOgorICAgICMgICAgIExTQl9WRVJTSU9OPSIxLjMiCisgICAgJHJlbGVhc2UgPSAiL2V0Yy9sc2ItcmVsZWFzZSI7CisgICAgaWYgKCAtZSAkcmVsZWFzZSApIHsKKyAgICAgICAgJGJ1bGsgPSByZWFkX2ZpbGUoICRyZWxlYXNlICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgJGJ1bGsgPSAiIjsKKyAgICB9OyAjIGlmCisgICAgaWYgKCAkYnVsayA9fiBte15ESVNUUklCX30gKSB7CisgICAgICAgICMgT2ssIHRoaXMgbHNiLXJlbGVhc2UgaXMgaW5mb3JtYXRpdmUuCisgICAgICAgICRidWxrID1+IG17XkRJU1RSSUJfSURccyo9XHMqKC4qPylccyokfW0KKyAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICIkcmVsZWFzZTogVGhlcmUgaXMgbm8gRElTVFJJQl9JRDoiLCAkYnVsaywgIihlb2YpIiApOworICAgICAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX25hbWUgfSA9ICQxOworICAgICAgICAkYnVsayA9fiBte15ESVNUUklCX1JFTEVBU0Vccyo9XHMqKC4qPylccyokfW0KKyAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICIkcmVsZWFzZTogVGhlcmUgaXMgbm8gRElTVFJJQl9SRUxFQVNFOiIsICRidWxrLCAiKGVvZikiICk7CisgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fcmVsZWFzZSB9ID0gJDE7CisgICAgICAgICRidWxrID1+IG17XkRJU1RSSUJfQ09ERU5BTUVccyo9XHMqKC4qPylccyokfW0KKyAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICIkcmVsZWFzZTogVGhlcmUgaXMgbm8gRElTVFJJQl9DT0RFTkFNRToiLCAkYnVsaywgIihlb2YpIiApOworICAgICAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX2NvZGVuYW1lIH0gPSAkMTsKKyAgICAgICAgJGJ1bGsgPX4gbXteRElTVFJJQl9ERVNDUklQVElPTlxzKj0iP1xzKiguKj8pIj9ccyokfW0KKyAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICIkcmVsZWFzZTogVGhlcmUgaXMgbm8gRElTVFJJQl9ERVNDUklQVElPTjoiLCAkYnVsaywgIihlb2YpIiApOworICAgICAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX2Rlc2NyaXB0aW9uIH0gPSAkMTsKKyAgICB9IGVsc2UgeworICAgICAgICAjIE9vcHMuIGxzYi1yZWxlYXNlIGlzIG1pc3NlZCBvciBub3QgaW5mb3JtYXRpdmUuIFRyeSBvdGhlciAqLXJlbGVhc2UgZmlsZXMuCisgICAgICAgICRyZWxlYXNlID0gIi9ldGMvc3lzdGVtLXJlbGVhc2UiOworICAgICAgICBpZiAoIG5vdCAtZSAkcmVsZWFzZSApIHsgICAgIyBVc2UgL2V0Yy9zeXN0ZW0tcmVsZWFzZSIgaWYgc3VjaCBmaWxlIGV4aXN0cy4KKyAgICAgICAgICAgICMgT3RoZXJ3aXNlIHRyeSBvdGhlciAiL2V0Yy8qLXJlbGVhc2UiIGZpbGVzLCBidXQgaWdub3JlICIvZXRjL2xzYi1yZWxlYXNlIi4KKyAgICAgICAgICAgIG15IEByZWxlYXNlcyA9IGdyZXAoICRfIG5lICIvZXRjL2xzYi1yZWxlYXNlIiwgYnNkX2dsb2IoICIvZXRjLyotcmVsZWFzZSIgKSApOworICAgICAgICAgICAgIyBPbiBzb21lIEZlZG9yYSBzeXN0ZW1zIHRoZXJlIGFyZSB0d28gZmlsZXM6IGZlZG9yYS1yZWxlYXNlIGFuZCByZWRoYXQtcmVsZWFzZQorICAgICAgICAgICAgIyB3aXRoIGlkZW50aWNhbCBjb250ZW50LiBJZiBmZWRvcmEtcmVsZWFzZSBwcmVzZW50LCBpZ25vcmUgcmVkamF0LXJlbGVhc2UuCisgICAgICAgICAgICBpZiAoIGdyZXAoICRfIGVxICIvZXRjL2ZlZG9yYS1yZWxlYXNlIiwgQHJlbGVhc2VzICkgKSB7CisgICAgICAgICAgICAgICAgQHJlbGVhc2VzID0gZ3JlcCggJF8gbmUgIi9ldGMvcmVkaGF0LXJlbGVhc2UiLCBAcmVsZWFzZXMgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgIGlmICggQHJlbGVhc2VzID09IDEgKSB7CisgICAgICAgICAgICAgICAgJHJlbGVhc2UgPSAkcmVsZWFzZXNbIDAgXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCBAcmVsZWFzZXMgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgIyBObyAqLXJlbGVhc2UgZmlsZXMgZm91bmQsIHRyeSBkZWJpYW5fdmVyc2lvbi4KKyAgICAgICAgICAgICAgICAgICAgJHJlbGVhc2UgPSAiL2V0Yy9kZWJpYW5fdmVyc2lvbiI7CisgICAgICAgICAgICAgICAgICAgIGlmICggbm90IC1lICRyZWxlYXNlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgJHJlbGVhc2UgPSB1bmRlZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoICJObyByZWxlYXNlIGZpbGVzIGZvdW5kIGluIFwiL2V0Yy9cIiBkaXJlY3RvcnkuIiApOworICAgICAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJHJlbGVhc2UgPSB1bmRlZjsKKyAgICAgICAgICAgICAgICAgICAgd2FybmluZyggIk1vcmUgdGhhbiBvbmUgcmVsZWFzZSBmaWxlcyBmb3VuZCBpbiBcIi9ldGMvXCIgZGlyZWN0b3J5OiIsIEByZWxlYXNlcyApOworICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBpZiAoIGRlZmluZWQoICRyZWxlYXNlICkgKSB7CisgICAgICAgICAgICAkYnVsayA9IHJlYWRfZmlsZSggJHJlbGVhc2UgKTsKKyAgICAgICAgICAgIGlmICggJHJlbGVhc2UgPX4gbXtzeXN0ZW18cmVkaGF0fGZlZG9yYX0gKSB7CisgICAgICAgICAgICAgICAgIyBSZWQgSGF0IG9yIEZlZG9yYS4gUGFyc2UgdGhlIGZpcnN0IGxpbmUgb2YgZmlsZS4KKyAgICAgICAgICAgICAgICAjIFR5cGljYWwgdmFsdWVzIG9mICotcmVsZWFzZSAob25lIG9mKToKKyAgICAgICAgICAgICAgICAjICAgICBSZWQgSGF0IEVudGVycHJpc2UgTGludXgqIE9TIFNlcnZlciByZWxlYXNlIDUuMiAoVGlrYW5nYSkKKyAgICAgICAgICAgICAgICAjICAgICBSZWQgSGF0IEVudGVycHJpc2UgTGludXgqIE9TIEFTIHJlbGVhc2UgMyAoVGFyb29uIFVwZGF0ZSA0KQorICAgICAgICAgICAgICAgICMgICAgIEZlZG9yYSByZWxlYXNlIDEwIChDYW1icmlkZ2UpCisgICAgICAgICAgICAgICAgJGJ1bGsgPX4gbXtcQSguKikkfW0KKyAgICAgICAgICAgICAgICAgICAgb3IgcnVudGltZV9lcnJvciggIiRyZWxlYXNlOiBDYW5ub3QgZmluZCB0aGUgZmlyc3QgbGluZToiLCAkYnVsaywgIihlb2YpIiApOworICAgICAgICAgICAgICAgIG15ICRmaXJzdF9saW5lID0gJDE7CisgICAgICAgICAgICAgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9kZXNjcmlwdGlvbiB9ID0gJGZpcnN0X2xpbmU7CisgICAgICAgICAgICAgICAgJGZpcnN0X2xpbmUgPX4gbXtcQSguKj8pXHMrcmVsZWFzZVxzKyguKj8pKD86XHMrXCgoLio/KSg/OlxzK1VwZGF0ZVxzKyguKj8pKT9cKSk/XHMqJH0KKyAgICAgICAgICAgICAgICAgICAgb3IgcnVudGltZV9lcnJvciggIiRyZWxlYXNlOjE6IENhbm5vdCBwYXJzZSBsaW5lOiIsICRmaXJzdF9saW5lICk7CisgICAgICAgICAgICAgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9uYW1lICAgIH0gID0gJDE7CisgICAgICAgICAgICAgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9yZWxlYXNlIH0gID0gJDIgLiAoIGRlZmluZWQoICQ0ICkgPyAiLiQ0IiA6ICIiICk7CisgICAgICAgICAgICAgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9jb2RlbmFtZSB9ID0gJDM7CisgICAgICAgICAgICB9IGVsc2lmICggJHJlbGVhc2UgPX4gbXtTdVNFfSApIHsKKyAgICAgICAgICAgICAgICAjIFR5cGljYWwgU3VTRS1yZWxlYXNlOgorICAgICAgICAgICAgICAgICMgICAgIFNVU0UgTGludXgqIE9TIEVudGVycHJpc2UgU2VydmVyIDEwICh4ODZfNjQpCisgICAgICAgICAgICAgICAgIyAgICAgVkVSU0lPTiA9IDEwCisgICAgICAgICAgICAgICAgIyAgICAgUEFUQ0hMRVZFTCA9IDIKKyAgICAgICAgICAgICAgICAkYnVsayA9fiBte1xBKC4qKSR9bQorICAgICAgICAgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiJHJlbGVhc2U6IENhbm5vdCBmaW5kIHRoZSBmaXJzdCBsaW5lOiIsICRidWxrLCAiKGVvZikiICk7CisgICAgICAgICAgICAgICAgbXkgJGZpcnN0X2xpbmUgPSAkMTsKKyAgICAgICAgICAgICAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX2Rlc2NyaXB0aW9uIH0gPSAkZmlyc3RfbGluZTsKKyAgICAgICAgICAgICAgICAkZmlyc3RfbGluZSA9fiBte14oLio/KVxzKihcZCspXHMqXCguKj9cKVxzKiR9CisgICAgICAgICAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICIkcmVsZWFzZToxOiBDYW5ub3QgcGFyc2UgbGluZToiLCAkZmlyc3RfbGluZSApOworICAgICAgICAgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fbmFtZSB9ID0gJDE7CisgICAgICAgICAgICAgICAgJGJ1bGsgPX4gbXteVkVSU0lPTlxzKj1ccyooLiopXHMqJH1tCisgICAgICAgICAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICIkcmVsZWFzZTogVGhlcmUgaXMgbm8gVkVSU0lPTjoiLCAkYnVsaywgIihlb2YpIiApOworICAgICAgICAgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fcmVsZWFzZSB9ID0gJDE7CisgICAgICAgICAgICAgICAgaWYgKCAkYnVsayA9fiBte15QQVRDSExFVkVMXHMqPVxzKiguKilccyokfW0gKSB7CisgICAgICAgICAgICAgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fcmVsZWFzZSB9IC49ICIuJDEiOworICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgIH0gZWxzaWYgKCAkcmVsZWFzZSA9fiBte2RlYmlhbl92ZXJzaW9ufSApIHsKKyAgICAgICAgICAgICAgICAjIERlYmlhbi4gVGhlIGZpbGUgZGViaWFuX3ZlcnNpb24gY29udGFpbnMganVzdCB2ZXJzaW9uIG51bWJlciwgbm90aGluZyBtb3JlOgorICAgICAgICAgICAgICAgICMgICAgIDQuMAorICAgICAgICAgICAgICAgIG15ICRuYW1lID0gIkRlYmlhbiI7CisgICAgICAgICAgICAgICAgJGJ1bGsgPX4gbXtcQSguKikkfW0KKyAgICAgICAgICAgICAgICAgICAgb3IgcnVudGltZV9lcnJvciggIiRyZWxlYXNlOiBDYW5ub3QgZmluZCB0aGUgZmlyc3QgbGluZToiLCAkYnVsaywgIihlb2YpIiApOworICAgICAgICAgICAgICAgIG15ICR2ZXJzaW9uID0gJDE7CisgICAgICAgICAgICAgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9uYW1lICAgICAgICB9ID0gJG5hbWU7CisgICAgICAgICAgICAgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9yZWxlYXNlICAgICB9ID0gJHZlcnNpb247CisgICAgICAgICAgICAgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9jb2RlbmFtZSAgICB9ID0gInVua25vd24iOworICAgICAgICAgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fZGVzY3JpcHRpb24gfSA9IHNwcmludGYoICIlcyAlcyIsICRuYW1lLCAkdmVyc2lvbiApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorICAgIGlmICggbm90IGRlZmluZWQoICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fbmFtZSB9ICkgKSB7CisgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fbmFtZSB9ID0gIkdOVS9MaW51eCI7CisgICAgfTsgIyBpZgorfSBlbHNpZiAoICR2YWx1ZXN7IGtlcm5lbF9uYW1lIH0gZXEgIkRhcndpbiIgKSB7CisgICAgbXkgJWNvZGVuYW1lcyA9ICgKKyAgICAgICAgMTAuNCA9PiAiVGlnZXIiLAorICAgICAgICAxMC41ID0+ICJMZW9wYXJkIiwKKyAgICAgICAgMTAuNiA9PiAiU25vdyBMZW9wYXJkIiwKKyAgICApOworICAgbXkgJGRhcndpbjsKKyAgIG15ICRnZXRfb3NfaW5mbyA9CisgICAgICAgc3ViIHsKKyAgICAgICAgICAgbXkgKCAkbmFtZSApID0gQF87CisgICAgICAgICAgIGlmICggbm90IGRlZmluZWQgJGRhcndpbiApIHsKKyAgICAgICAgICAgICAgICRkYXJ3aW4tPnsgb3BlcmF0aW5nX3N5c3RlbSB9ID0gIkRhcndpbiI7CisgICAgICAgICAgICAgICAjIHN3X3ZlcnMgcHJpbnRzIE9TIFgqIHZlcnNpb24gdG8gc3Rkb3V0OgorICAgICAgICAgICAgICAgIyAgICAgUHJvZHVjdE5hbWU6ICAgICAgIE9TIFgqCisgICAgICAgICAgICAgICAjICAgICBQcm9kdWN0VmVyc2lvbjogICAgMTAuNC4xMQorICAgICAgICAgICAgICAgIyAgICAgQnVpbGRWZXJzaW9uOiAgICAgIDhTMjE2NworICAgICAgICAgICAgICAgIyBJdCBkb2VzIG5vdCBwcmludCBjb2RlbmFtZSwgc28gd2UgY29kZSBPUyBYKiBjb2RlbmFtZXMgaGVyZS4KKyAgICAgICAgICAgICAgIG15ICRzd192ZXJzID0gd2hpY2goICJzd192ZXJzIiApIHx8ICIvdXNyL2Jpbi9zd192ZXJzIjsKKyAgICAgICAgICAgICAgIG15ICRvdXRwdXQ7CisgICAgICAgICAgICAgICBkZWJ1ZyggIkV4ZWN1dGluZyAkc3dfdmVycy4uLiIgKTsKKyAgICAgICAgICAgICAgIGV4ZWN1dGUoIFsgJHN3X3ZlcnMgXSwgLXN0ZG91dCA9PiBcJG91dHB1dCwgLXN0ZGVyciA9PiB1bmRlZiApOworICAgICAgICAgICAgICAgJG91dHB1dCA9fiBte15Qcm9kdWN0TmFtZTpccyooLiopXHMqJH1tCisgICAgICAgICAgICAgICAgICAgb3IgcnVudGltZV9lcnJvciggIlRoZXJlIGlzIG5vIFByb2R1Y3ROYW1lIGluIHN3X3ZlcnMgb3V0cHV0OiIsICRvdXRwdXQsICIoZW9mKSIgKTsKKyAgICAgICAgICAgICAgIG15ICRuYW1lID0gJDE7CisgICAgICAgICAgICAgICAkb3V0cHV0ID1+IG17XlByb2R1Y3RWZXJzaW9uOlxzKiguKilccyokfW0KKyAgICAgICAgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiVGhlcmUgaXMgbm8gUHJvZHVjdFZlcnNpb24gaW4gc3dfdmVycyBvdXRwdXQ6IiwgJG91dHB1dCwgIihlb2YpIiApOworICAgICAgICAgICAgICAgbXkgJHJlbGVhc2UgPSAkMTsKKyAgICAgICAgICAgICAgICMgU29tZXRpbWVzIHJlbGVhc2UgcmVwb3J0ZWQgYXMgIjEwLjQuMTEiICgzIGNvbXBvbmVudGVzKSwgc29tZXRpbWVzIGFzICIxMC42Ii4KKyAgICAgICAgICAgICAgICMgSGFuZGxlIGJvdGggdmFyaWFudHMuCisgICAgICAgICAgICAgICAkcmVsZWFzZSA9fiBte14oXGQrLlxkKykoPzpcLlxkKyk/KD89XHN8JCl9CisgICAgICAgICAgICAgICAgICAgb3IgcnVudGltZV9lcnJvciggIkNhbm5vdCBwYXJzZSBPUyBYKiB2ZXJzaW9uOiAkcmVsZWFzZSIgKTsKKyAgICAgICAgICAgICAgIG15ICR2ZXJzaW9uID0gJDE7CisgICAgICAgICAgICAgICBteSAkY29kZW5hbWUgPSAoICRjb2RlbmFtZXN7ICR2ZXJzaW9uIH0gb3IgInVua25vd24iICk7CisgICAgICAgICAgICAgICAkZGFyd2luLT57IG9wZXJhdGluZ19zeXN0ZW1fbmFtZSAgICAgICAgfSA9ICRuYW1lOworICAgICAgICAgICAgICAgJGRhcndpbi0+eyBvcGVyYXRpbmdfc3lzdGVtX3JlbGVhc2UgICAgIH0gPSAkcmVsZWFzZTsKKyAgICAgICAgICAgICAgICRkYXJ3aW4tPnsgb3BlcmF0aW5nX3N5c3RlbV9jb2RlbmFtZSAgICB9ID0gJGNvZGVuYW1lOworICAgICAgICAgICAgICAgJGRhcndpbi0+eyBvcGVyYXRpbmdfc3lzdGVtX2Rlc2NyaXB0aW9uIH0gPSBzcHJpbnRmKCAiJXMgJXMgKCVzKSIsICRuYW1lLCAkcmVsZWFzZSwgJGNvZGVuYW1lICk7CisgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgcmV0dXJuICRkYXJ3aW4tPnsgJG5hbWUgfTsKKyAgICAgICB9OyAjIHN1YgorICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW0gICAgICAgICAgICAgfSA9IHN1YiB7ICRnZXRfb3NfaW5mby0+KCAib3BlcmF0aW5nX3N5c3RlbSIgICAgICAgICAgICAgKTsgfTsKKyAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX25hbWUgICAgICAgIH0gPSBzdWIgeyAkZ2V0X29zX2luZm8tPiggIm9wZXJhdGluZ19zeXN0ZW1fbmFtZSIgICAgICAgICk7IH07CisgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9yZWxlYXNlICAgICB9ID0gc3ViIHsgJGdldF9vc19pbmZvLT4oICJvcGVyYXRpbmdfc3lzdGVtX3JlbGVhc2UiICAgICApOyB9OworICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fY29kZW5hbWUgICAgfSA9IHN1YiB7ICRnZXRfb3NfaW5mby0+KCAib3BlcmF0aW5nX3N5c3RlbV9jb2RlbmFtZSIgICAgKTsgfTsKKyAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX2Rlc2NyaXB0aW9uIH0gPSBzdWIgeyAkZ2V0X29zX2luZm8tPiggIm9wZXJhdGluZ19zeXN0ZW1fZGVzY3JpcHRpb24iICk7IH07Cit9IGVsc2lmICggJHZhbHVlc3sga2VybmVsX25hbWUgfSA9fiBte1xBV2luZG93c1sgX11OVFx6fSApIHsKKyAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtIH0gPSAiTVMgV2luZG93cyI7CisgICAgIyBteSBAb3NfbmFtZSA9IFdpbjMyOjpHZXRPU05hbWUoKTsKKyAgICAjICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fcmVsZWFzZSB9ID0gJG9zX25hbWVbIDAgXTsKKyAgICAjICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fdXBkYXRlICB9ID0gJG9zX25hbWVbIDEgXTsKK30gZWxzaWYgKCAkdmFsdWVzeyBrZXJuZWxfbmFtZSB9ID1+IG17XEFDWUdXSU5fTlQtfSApIHsKKyAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtIH0gPSAiTVMgV2luZG93cyI7Cit9IGVsc2lmICggJHZhbHVlc3sga2VybmVsX25hbWUgfSA9fiBte1xBRnJlZUJTRH0gKSB7CisgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbSB9ID0gIkZyZWVCU0QiOworfSBlbHNlIHsKKyAgICBkaWUgIlVuc3VwcG9ydGVkIGtlcm5lbF9uYW1lIChcIiR2YWx1ZXN7IGtlcm5lbF9uYW1lIH1cIikgcmV0dXJuZWQgYnkgUE9TSVg6OnVuYW1lKCk7IHN0b3BwZWQiOworfTsgIyBpZgorCisjIGhvc3RfbmFtZSBhbmQgZG9tYWluX25hbWUKKyR2YWx1ZXN7IGhvc3RfbmFtZSB9ID0KKyAgICBzdWIgeworICAgICAgICBteSAkZnFkbiA9IHZhbHVlKCAiZnFkbiIgKTsKKyAgICAgICAgJGZxZG4gPX4gbXtcQShbXi5dKikoPzpcLiguKikpP1x6fTsKKyAgICAgICAgbXkgJGhvc3RfbmFtZSA9ICQxOworICAgICAgICBpZiAoIG5vdCBkZWZpbmVkKCAkaG9zdF9uYW1lICkgb3IgJGhvc3RfbmFtZSBlcSAiIiApIHsKKyAgICAgICAgICAgIGRpZSAiVW5leHBlY3RlZCBlcnJvcjogdW5kZWZpbmVkIG9yIGVtcHR5IGhvc3QgbmFtZTsgc3RvcHBlZCI7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgcmV0dXJuICRob3N0X25hbWU7CisgICAgfTsKKyR2YWx1ZXN7IGRvbWFpbl9uYW1lIH0gPQorICAgIHN1YiB7CisgICAgICAgIG15ICRmcWRuID0gdmFsdWUoICJmcWRuIiApOworICAgICAgICAkZnFkbiA9fiBte1xBKFteLl0qKSg/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+CisKK1J1biBzcGVjaWZpZWQgcHJvZ3JhbSBvciBzaGVsbCBjb21tYW5kIGFuZCByZXR1cm4gb3V0cHV0LgorCitJbiBzY2FsYXIgY29udGV4dCBlbnRpcmUgb3V0cHV0IGlzIHJldHVybmVkIGluIGEgc2luZ2xlIHN0cmluZy4gSW4gbGlzdCBjb250ZXh0IGxpc3Qgb2Ygc3RyaW5ncworaXMgcmV0dXJuZWQuIEZ1bmN0aW9uIGlzc3VlcyBhbiBlcnJvciBhbmQgZXhpdHMgc2NyaXB0IGlmIGFueSBlcnJvciBvY2N1cnMuCisKKz1jdXQKKworCitzdWIgYmFja3RpY2tzKCRAKSB7CisKKyAgICBteSAkY29tbWFuZCA9IHNoaWZ0KCBAXyApOworICAgIG15ICVvcHRzICAgID0gQF87CisgICAgbXkgQG91dHB1dDsKKworICAgIGNoZWNrX29wdHMoICVvcHRzLCBbIHF3KCAtY2hvbXAgKSBdICk7CisKKyAgICBleGVjdXRlKCAkY29tbWFuZCwgLXN0ZG91dCA9PiBcQG91dHB1dCApOworCisgICAgaWYgKCAkb3B0c3sgLWNob21wIH0gKSB7CisgICAgICAgIGNob21wKCBAb3V0cHV0ICk7CisgICAgfTsgIyBpZgorCisgICAgcmV0dXJuICggd2FudGFycmF5KCkgPyBAb3V0cHV0IDogam9pbiggIiIsIEBvdXRwdXQgKSApOworCit9OyAjIHN1YiBiYWNrdGlja3MKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N1YiBwYWQoJCQkKSB7CisgICAgbXkgKCAkc3RyLCAkbGVuZ3RoLCAkcGFkICkgPSBAXzsKKyAgICBteSAkbHN0ciA9IGxlbmd0aCggJHN0ciApOyAgICAjIExlbmd0aCBvZiBzb3VyY2Ugc3RyaW5nLgorICAgIGlmICggJGxzdHIgPCAkbGVuZ3RoICkgeworICAgICAgICBteSAkbHBhZCAgPSBsZW5ndGgoICRwYWQgKTsgICAgICAgICAgICAgICAgICAgICAgICAgIyBMZW5ndGggb2YgcGFkLgorICAgICAgICBteSAkY291bnQgPSBpbnQoICggJGxlbmd0aCAtICRsc3RyICkgLyAkbHBhZCApOyAgICAgIyBOdW1iZXIgb2YgcGFkIHJlcGV0aXRpb25zLgorICAgICAgICBteSAkdGFpbCAgPSAkbGVuZ3RoIC0gKCAkbHN0ciArICRscGFkICogJGNvdW50ICk7CisgICAgICAgICRzdHIgPSAkc3RyIC4gKCAkcGFkIHggJGNvdW50ICkgLiBzdWJzdHIoICRwYWQsIDAsICR0YWlsICk7CisgICAgfTsgIyBpZgorICAgIHJldHVybiAkc3RyOworfTsgIyBzdWIgcGFkCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWJhY2sKKworPWN1dAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworcmV0dXJuIDE7CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9Y3V0CisKKyMgRW5kIG9mIGZpbGUuCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rvb2xzL2xpbnV4LmluYyBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvbGludXguaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZDI1MTIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rvb2xzL2xpbnV4LmluYwpAQCAtMCwwICsxLDM1IEBACisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMjIyMjIyMgRGV0ZWN0aW9ucyBhbmQgQ29tbWFuZHMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworaWZuZGVmIGFyY2gKKyAgICAgICAgdW5hbWVfbTo9JChzaGVsbCB1bmFtZSAtbSkKKyAgICAgICAgaWZlcSAoJCh1bmFtZV9tKSxpNjg2KQorICAgICAgICAgICAgICAgIGV4cG9ydCBhcmNoOj0zMgorICAgICAgICBlbmRpZgorICAgICAgICBpZmVxICgkKHVuYW1lX20pLHg4Nl82NCkKKyAgICAgICAgICAgICAgICBleHBvcnQgYXJjaDo9MzJlCisgICAgICAgIGVuZGlmCisgICAgICAgIGlmbmRlZiBhcmNoCisgICAgICAgICAgICAgICAgZXhwb3J0IGFyY2g6PSQodW5hbWVfbSkKKyAgICAgICAgZW5kaWYKK2VuZGlmCisKK0NNRD1zaCAtYworQ1dEPSQoc2hlbGwgcHdkKQorQ1A9Y3AKK1JNPz1ybSAtZgorUk1SPz1ybSAtcmYKK1JEPz1ybWRpcgorTUQ/PW1rZGlyIC1wCitOVUw9IC9kZXYvbnVsbAorU0xBU0g9LwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90b29scy9tYWNvcy5pbmMgYi9maW5hbC9ydW50aW1lL3Rvb2xzL21hY29zLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGY4NmIxCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90b29scy9tYWNvcy5pbmMKQEAgLTAsMCArMSwzNyBAQAorIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCisjIyMjIyMjIERldGVjdGlvbnMgYW5kIENvbW1hbmRzICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2lmbmRlZiBhcmNoCisgaWZlcSAoJChzaGVsbCAvdXNyL3NiaW4vc3lzY3RsIC1uIGh3Lm1hY2hpbmUpLFBvd2VyIE1hY2ludG9zaCkKKyAgIGlmZXEgKCQoc2hlbGwgL3Vzci9zYmluL3N5c2N0bCAtbiBody5vcHRpb25hbC42NGJpdG9wcyksMSkKKyAgICAgZXhwb3J0IGFyY2g6PXBwYzY0CisgICBlbHNlCisgICAgIGV4cG9ydCBhcmNoOj1wcGMzMgorICAgZW5kaWYKKyBlbHNlCisgICBpZmVxICgkKHNoZWxsIC91c3Ivc2Jpbi9zeXNjdGwgLW4gaHcub3B0aW9uYWwueDg2XzY0IDI+L2Rldi9udWxsKSwxKQorICAgICBleHBvcnQgYXJjaDo9aW50ZWw2NAorICAgZWxzZQorICAgICBleHBvcnQgYXJjaDo9aWEzMgorICAgZW5kaWYKKyBlbmRpZgorZW5kaWYKKworQ01EPSQoU0hFTEwpIC1jCitDV0Q9JChzaGVsbCBwd2QpCitSTT89cm0gLWYKK1JNUj89cm0gLXJmCitSRD89cm1kaXIKK01EPz1ta2RpciAtcAorTlVMPSAvZGV2L251bGwKK1NMQVNIPS8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdG9vbHMvbWVzc2FnZS1jb252ZXJ0ZXIucGwgYi9maW5hbC9ydW50aW1lL3Rvb2xzL21lc3NhZ2UtY29udmVydGVyLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM4MmY0MmUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rvb2xzL21lc3NhZ2UtY29udmVydGVyLnBsCkBAIC0wLDAgKzEsNzc1IEBACisjIS91c3IvYmluL3BlcmwKKworIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgRmlsZTo6R2xvYiAiOmdsb2IiOwordXNlIEVuY29kZSBxd3sgZW5jb2RlIH07CisKK3VzZSBGaW5kQmluOwordXNlIGxpYiAiJEZpbmRCaW46OkJpbi9saWIiOworCit1c2UgdG9vbHM7Cit1c2UgUGxhdGZvcm0gIjp2YXJzIjsKKworb3VyICRWRVJTSU9OID0gIjAuMDQiOworbXkgJGVzY2FwZSAgICAgID0gcXJ7JX07CitteSAkcGxhY2Vob2xkZXIgPSBxcnsoXGQpXCQoc3xsP1tkdV0pfTsKKworbXkgJHNlY3Rpb25zID0KKyAgICB7CisgICAgICAgIG1ldGEgICAgID0+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+eyBzZXQgfSAuIlxuIjsKKyAgICB9OyAjIGZvcmVhY2ggJHNlY3Rpb24KKyAgICAkYnVsayAuPQorICAgICAgICAiKVxuXG4iOworCisgICAgZm9yZWFjaCBteSAkc2VjdGlvbiAoIEBzZWN0aW9ucyApIHsKKyAgICAgICAgbXkgJHNob3J0ID0gJHNlY3Rpb25zLT57ICRzZWN0aW9uIH0tPnsgc2hvcnQgfTsKKyAgICAgICAgbXkgJG4gPSAwOworICAgICAgICBmb3JlYWNoIG15ICRpdGVtICggQHsgJGRhdGEtPnsgJHNlY3Rpb24gfSB9ICkgeworICAgICAgICAgICAgbXkgKCB1bmRlZiwgJG1zZyApID0gQCRpdGVtOworICAgICAgICAgICAgKysgJG47CisgICAgICAgICAgICAkYnVsayAuPQorICAgICAgICAgICAgICAgICJNZXNzYWdlSWQ9JG5cbiIgLgorICAgICAgICAgICAgICAgICJGYWNpbGl0eT0kc2hvcnRcbiIgLgorICAgICAgICAgICAgICAgICJMYW5ndWFnZT0kbGFuZ3VhZ2VcbiIgLgorICAgICAgICAgICAgICAgIG1zZzJtYyggJG1zZyApIC4gIlxuLlxuXG4iOworICAgICAgICB9OyAjIGZvcmVhY2ggJGl0ZW0KKyAgICB9OyAjIGZvcmVhY2ggJHNlY3Rpb24KKworICAgICRidWxrIC49CisgICAgICAgICJcbiIgLgorICAgICAgICAiOyBlbmQgb2YgZmlsZSA7XG4iOworCisgICAgJGJ1bGsgPSBlbmNvZGUoICJVVEYtMTZMRSIsICRidWxrICk7ICMgQ29udmVydCB0ZXh0IHRvIFVURi0xNkxFIHVzZWQgaW4gV2luZG93cyogT1MuCisgICAgd3JpdGVfZmlsZSggJGZpbGUsIFwkYnVsaywgLWJpbmFyeSA9PiAxICk7CisKK307ICMgc3ViIGdlbmVyYXRlX21lc3NhZ2Vfd2luZG93cworCisKKyMKKyMgUGFyc2UgY29tbWFuZCBsaW5lLgorIworCitteSAkaW5wdXRfZmlsZTsKK215ICRlbnVtX2ZpbGU7CitteSAkc2lnbmF0dXJlX2ZpbGU7CitteSAkZGVmYXVsdF9maWxlOworbXkgJG1lc3NhZ2VfZmlsZTsKK215ICRpZDsKK215ICRwcmVmaXggPSAiIjsKK2dldF9vcHRpb25zKAorICAgIFBsYXRmb3JtOjp0YXJnZXRfb3B0aW9ucygpLAorICAgICJlbnVtLWZpbGU9cyIgICAgICA9PiBcJGVudW1fZmlsZSwKKyAgICAic2lnbmF0dXJlLWZpbGU9cyIgPT4gXCRzaWduYXR1cmVfZmlsZSwKKyAgICAiZGVmYXVsdC1maWxlPXMiICAgPT4gXCRkZWZhdWx0X2ZpbGUsCisgICAgIm1lc3NhZ2UtZmlsZT1zIiAgID0+IFwkbWVzc2FnZV9maWxlLAorICAgICJpZHxsYW5nLWlkIiAgICAgICA9PiBcJGlkLAorICAgICJwcmVmaXg9cyIJICAgICAgID0+IFwkcHJlZml4LAorKTsKK2lmICggQEFSR1YgPT0gMCApIHsKKyAgICBjbWRsaW5lX2Vycm9yKCAiTm8gc291cmNlIGZpbGUgc3BlY2lmaWVkIC0tIG5vdGhpbmcgdG8gZG8iICk7Cit9OyAjIGlmCitpZiAoIEBBUkdWID4gMSApIHsKKyAgICBjbWRsaW5lX2Vycm9yKCAiVG9vIG1hbnkgc291cmNlIGZpbGVzIHNwZWNpZmllZCIgKTsKK307ICMgaWYKKyRpbnB1dF9maWxlID0gJEFSR1ZbIDAgXTsKKworCitteSAkZ2VuZXJhdGVfbWVzc2FnZTsKK2lmICggJHRhcmdldF9vcyA9fiBte1xBKD86bGlufGxyYnxtYWMpXHp9ICkgeworICAgICRnZW5lcmF0ZV9tZXNzYWdlID0gXCZnZW5lcmF0ZV9tZXNzYWdlX3VuaXg7Cit9IGVsc2lmICggJHRhcmdldF9vcyBlcSAid2luIiApIHsKKyAgICAkZ2VuZXJhdGVfbWVzc2FnZSA9IFwmZ2VuZXJhdGVfbWVzc2FnZV93aW5kb3dzOworfSBlbHNlIHsKKyAgICBydW50aW1lX2Vycm9yKCAiT1MgXCIkdGFyZ2V0X29zXCIgaXMgbm90IHN1cHBvcnRlZCIgKTsKK307ICMgaWYKKworCisjCisjIERvIHRoZSB3b3JrLgorIworCitteSAkZGF0YSA9IHBhcnNlX3NvdXJjZSggJGlucHV0X2ZpbGUgKTsKK2lmICggZGVmaW5lZCggJGlkICkgKSB7CisgICAgcHJpbnQoICRkYXRhLT57ICIlbWV0YSIgfS0+eyBMYW5nSWQgfSwgIlxuIiApOworfTsgIyBpZgoraWYgKCBkZWZpbmVkKCAkZW51bV9maWxlICkgKSB7CisgICAgZ2VuZXJhdGVfZW51bSggJGRhdGEsICRlbnVtX2ZpbGUsICRwcmVmaXggKTsKK307ICMgaWYKK2lmICggZGVmaW5lZCggJHNpZ25hdHVyZV9maWxlICkgKSB7CisgICAgZ2VuZXJhdGVfc2lnbmF0dXJlKCAkZGF0YSwgJHNpZ25hdHVyZV9maWxlICk7Cit9OyAjIGlmCitpZiAoIGRlZmluZWQoICRkZWZhdWx0X2ZpbGUgKSApIHsKKyAgICBnZW5lcmF0ZV9kZWZhdWx0KCAkZGF0YSwgJGRlZmF1bHRfZmlsZSwgJHByZWZpeCApOworfTsgIyBpZgoraWYgKCBkZWZpbmVkKCAkbWVzc2FnZV9maWxlICkgKSB7CisgICAgJGdlbmVyYXRlX21lc3NhZ2UtPiggJGRhdGEsICRtZXNzYWdlX2ZpbGUgKTsKK307ICMgaWYKKworZXhpdCggMCApOworCitfX0VORF9fCisKKz1wb2QKKworPWhlYWQxIE5BTUUKKworQjxtZXNzYWdlLWNvbnZlcnRlci5wbD4gLS0gQ29udmVydCBtZXNzYWdlIGNhdGFsb2cgc291cmNlIGZpbGUgaW50byBhbm90aGVyIHRleHQgZm9ybXMuCisKKz1oZWFkMSBTWU5PUFNJUworCitCPG1lc3NhZ2UtY29udmVydGVyLnBsPiBJPG9wdGlvbj4uLi4gPGZpbGU+CisKKz1oZWFkMSBPUFRJT05TCisKKz1vdmVyCisKKz1pdGVtIEI8LS1lbnVtLWZpbGU9Pkk8ZmlsZT4KKworR2VuZXJhdGUgZW51bSBmaWxlIG5hbWVkIEk8ZmlsZT4uCisKKz1pdGVtIEI8LS1kZWZhdWx0LWZpbGU9Pkk8ZmlsZT4KKworR2VuZXJhdGUgZGVmYXVsdCBtZXNzYWdlcyBmaWxlIG5hbWVkIEk8ZmlsZT4uCisKKz1pdGVtIEI8LS1sYW5nLWlkPgorCitQcmludCBsYW5ndWFnZSBpZGVudGlmaWVyIG9mIHRoZSBtZXNzYWdlIGNhdGFsb2cgc291cmNlIGZpbGUuCisKKz1pdGVtIEI8LS1tZXNzYWdlLWZpbGU9Pkk8ZmlsZT4KKworR2VuZXJhdGUgbWVzc2FnZSBmaWxlLgorCis9aXRlbSBCPC0tc2lnbmF0dXJlLWZpbGU9Pkk8ZmlsZT4KKworR2VuZXJhdGUgc2lnbmF0dXJlIGZpbGUuCisKK1NpZ25hdHVyZXMgYXJlIHVzZWQgZm9yIGNoZWNraW5nIGNvbXBhdGliaWxpdHkuIEZvciBleGFtcGxlLCB0byBjaGVjayBhIHByaW1hcnkKK2NhdGFsb2cgYW5kIGl0cyB0cmFuc2xhdGlvbiB0byBhbm90aGVyIGxhbmd1YWdlLCBzaWduYXR1cmVzIG9mIGJvdGggY2F0YWxvZ3Mgc2hvdWxkIGJlIGdlbmVyYXRlZAorYW5kIGNvbXBhcmVkLiBJZiBzaWduYXR1cmVzIGFyZSBpZGVudGljYWwsIGNhdGFsb2dzIGFyZSBjb21wYXRpYmxlLgorCis9aXRlbSBCPC0tcHJlZml4PT5JPHByZWZpeD4KKworUHJlZml4IHRvIGJlIHVzZWQgZm9yIGFsbCBDIGlkZW50aWZpZXJzICh0eXBlIGFuZCB2YXJpYWJsZSBuYW1lcykgaW4gZW51bSBhbmQgZGVmYXVsdCBtZXNzYWdlcworZmlsZXMuCisKKz1pdGVtIEI8LS1vcz0+STxzdHI+CisKK1NwZWNpZnkgT1MgbmFtZSB0aGUgbWVzc2FnZSBmb3JtYXRzIHRvIGJlIGNvbnZlcnRlZCBmb3IuIElmIG5vdCBzcGVjaWZpZWQgZXhwb2xpY2l0bHksIHZhbHVlIG9mCitMSUJPTVBfT1MgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgdXNlZC4gSWYgTElCT01QX09TIGlzIG5vdCBkZWZpbmVkLCBob3N0IE9TIGlzIGRldGVjdGVkLgorCitEZXBlbmRpbmcgb24gT1MsIEI8bWVzc2FnZS1jb252ZXJ0ZXIucGw+IGNvbnZlcnRzIG1lc3NhZ2UgZm9ybWF0cyB0byBHTlUgc3R5bGUgb3IgTVMgc3R5bGUuCisKKz1pdGVtIFN0YW5kYXJkIE9wdGlvbnMKKworPW92ZXIKKworPWl0ZW0gQjwtLWRvYz4KKworPWl0ZW0gQjwtLW1hbnVhbD4KKworUHJpbnQgZnVsbCBkb2N1bWVudGF0aW9uIGFuZCBleGl0LgorCis9aXRlbSBCPC0taGVscD4KKworUHJpbnQgc2hvcnQgaGVscCBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0tdmVyc2lvbj4KKworUHJpbnQgdmVyc2lvbiBzdHJpbmcgYW5kIGV4aXQuCisKKz1iYWNrCisKKz1iYWNrCisKKz1oZWFkMSBBUkdVTUVOVFMKKworPW92ZXIKKworPWl0ZW0gSTxmaWxlPgorCitBIG5hbWUgb2YgaW5wdXQgZmlsZS4KKworPWJhY2sKKworPWhlYWQxIERFU0NSSVBUSU9OCisKKz1oZWFkMiBNZXNzYWdlIENhdGFsb2cgRmlsZSBGb3JtYXQKKworSXQgaXMgcGxhaW4gdGV4dCBmaWxlIGluIFVURi04IGVuY29kaW5nLiBFbXB0eSBsaW5lcyBhbmQgbGluZXMgYmVnaW5uaW5nIHdpdGggc2hhcnAgc2lnbiAoQzwjPikgYXJlCitpZ25vcmVkLiBFQk5GIHN5bnRheCBvZiBjb250ZW50OgorCisgICAgY2F0YWxvZyAgICA9IHsgc2VjdGlvbiB9OworICAgIHNlY3Rpb24gICAgPSBoZWFkZXIgYm9keTsKKyAgICBoZWFkZXIgICAgID0gIi0qLSAiIHNlY3Rpb24taWQgIiAtKi0iICJcbiI7CisgICAgYm9keSAgICAgICA9IHsgbWVzc2FnZSB9OworICAgIG1lc3NhZ2UgICAgPSBtZXNzYWdlLWlkIHN0cmluZyAiXG4iIHsgc3RyaW5nICJcbiIgfTsKKyAgICBzZWN0aW9uLWlkID0gaWRlbnRpZmllcjsKKyAgICBtZXNzYWdlLWlkID0gIk9CU09MRVRFIiB8IGlkZW50aWZpZXI7CisgICAgaWRlbnRpZmllciA9IGxldHRlciB7IGxldHRlciB8IGRpZ2l0IHwgIl8iIH07CisgICAgc3RyaW5nICAgICA9ICIiIiB7IGNoYXJhY3RlciB9ICIiIjsKKworSWRlbnRpZmllciBzdGFydHMgd2l0aCBsZXR0ZXIsIHdpdGggZm9sbG93aW5nIGxldHRlcnMsIGRpZ2l0cywgYW5kIHVuZGVyc2NvcmVzLiBJZGVudGlmaWVycyBhcmUKK2Nhc2Utc2Vuc2l0aXZlLiBTZXRpb24gaWRlbnRpZmllcnMgYXJlIGZpeGVkOiBDPE1FVEE+LCBDPFNUUklOR1M+LCBDPEZPUk1BVFM+LCBDPE1FU1NBR0VTPiBhbmQKK0M8SElOVFM+LiBNZXNzYWdlIGlkZW50aWZpZXJzIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBzZWN0aW9uLiBTcGVjaWFsIEM8T0JTT0xFVEU+IHBzZXVkby1pZGVudGlmaWVyCittYXkgYmUgdXNlZCBtYW55IHRpbWVzLgorCitTdHJpbmcgaXMgYSBDIHN0cmluZyBsaXRlcmFsIHdoaWNoIG11c3Qgbm90IGNyb3NzIGxpbmUgYm91bmRhcmllcy4KK0xvbmcgbWVzc2FnZXMgbWF5IG9jY3VweSBtdWx0aXBsZSBsaW5lcywgYSBzdHJpbmcgcGVyIGxpbmUuCisKK01lc3NhZ2UgbWF5IGluY2x1ZGUgcHJpbnRmLWxpa2UgR05VLXN0eWxlIHBsYWNlaG9sZGVycyBmb3IgYXJndW1lbnRzOiBDPCVJPG4+JEk8dD4+LAord2hlcmUgSTxuPiBpcyBhcmd1bWVudCBudW1iZXIgKEM8MT4sIEM8Mj4sIC4uLiksCitJPHQ+IC0tIGFyZ3VtZW50IHR5cGUsIEM8cz4gKHN0cmluZykgb3IgQzxkPiAoMzItYml0IGludGVnZXIpLgorCitTZWUgYWxzbyBjb21tZW50cyBpbiBGPGkxOG4vZW5fVVMudHh0Pi4KKworPWhlYWQyIE91dHB1dCBGaWxlcworCitUaGlzIHNjcmlwdCBjYW4gZ2VuZXJhdGUgMyBkaWZmZXJlbnQgdGV4dCBmaWxlcyBmcm9tIHNpbmdsZSBzb3VyY2U6CisKKz1vdmVyCisKKz1pdGVtIEVudW0gZmlsZS4KKworRW51bSBmaWxlIGlzIGEgQyBpbmNsdWRlIGZpbGUsIGNvbnRhaW5pbmcgZGVmaW5pdGlvbnMgb2YgbWVzc2FnZSBpZGVudGlmaWVycywgZS4gZy46CisKKyAgICBlbnVtIGttcF9pMThuX2lkIHsKKworICAgICAgICAvLyBTZXQgIzEsIG1ldGEuCisgICAgICAgIGttcF9pMThuX3BycF9maXJzdCA9IDY1NTM2LAorICAgICAgICBrbXBfaTE4bl9wcnBfTGFuZ3VhZ2UsCisgICAgICAgIGttcF9pMThuX3BycF9Db3VudHJ5LAorICAgICAgICBrbXBfaTE4bl9wcnBfTGFuZ0lkLAorICAgICAgICBrbXBfaTE4bl9wcnBfVmVyc2lvbiwKKyAgICAgICAga21wX2kxOG5fcHJwX1JldmlzaW9uLAorICAgICAgICBrbXBfaTE4bl9wcnBfbGFzdCwKKworICAgICAgICAvLyBTZXQgIzIsIHN0cmluZ3MuCisgICAgICAgIGttcF9pMThuX3N0cl9maXJzdCA9IDEzMTA3MiwKKyAgICAgICAga21wX2kxOG5fc3RyX0Vycm9yLAorICAgICAgICBrbXBfaTE4bl9zdHJfVW5rbm93bkZpbGUsCisgICAgICAgIGttcF9pMThuX3N0cl9Ob3RBTnVtYmVyLAorICAgICAgICAuLi4KKworICAgICAgICAvLyBTZXQgIzMsIGZvdHJtYXRzLgorICAgICAgICAuLi4KKworICAgICAgICBrbXBfaTE4bl94eHhfbGFzdGVzdAorCisgICAgfTsgLy8gZW51bSBrbXBfaTE4bl9pZAorCisgICAgdHlwZWRlZiBlbnVtIGttcF9pMThuX2lkICBrbXBfaTE4bl9pZF90OworCis9aXRlbSBEZWZhdWx0IG1lc3NhZ2VzIGZpbGUuCisKK0RlZmF1bHQgbWVzc2FnZXMgZmlsZSBpcyBhIEMgaW5jbHVkZSBmaWxlIGNvbnRhaW5pbmcgZGVmYXVsdCBtZXNzYWdlcyB0byBiZSBlbWJlZGRlZCBpbnRvCithcHBsaWNhdGlvbiAoYW5kIHVzZWQgaWYgZXh0ZXJuYWwgbWVzc2FnZSBjYXRhbG9nIGRvZXMgbm90IGV4aXN0IG9yIGNvdWxkIG5vdCBiZSBvcGVuKToKKworICAgIHN0YXRpYyBjaGFyIGNvbnN0ICoKKyAgICBfX2ttcF9pMThuX2RlZmF1bHRfbWV0YVtdID0KKyAgICAgICAgeworICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICJFbmdsaXNoIiwKKyAgICAgICAgICAgICJVU0EiLAorICAgICAgICAgICAgIjEwMzMiLAorICAgICAgICAgICAgIjIiLAorICAgICAgICAgICAgIjIwMDkwODA2IiwKKyAgICAgICAgICAgIE5VTEwKKyAgICAgICAgfTsKKworICAgIHN0YXRpYyBjaGFyIGNvbnN0ICoKKyAgICBfX2ttcF9pMThuX2RlZmF1bHRfc3RyaW5nc1tdID0KKyAgICAgICAgeworICAgICAgICAgICAgIkVycm9yIiwKKyAgICAgICAgICAgICIodW5rbm93biBmaWxlKSIsCisgICAgICAgICAgICAibm90IGEgbnVtYmVyIiwKKyAgICAgICAgICAgIC4uLgorICAgICAgICAgICAgTlVMTAorICAgICAgICB9OworCisgICAgLi4uCisKKz1pdGVtIE1lc3NhZ2UgZmlsZS4KKworTWVzc2FnZSBmaWxlIGlzIGFuIGlucHV0IGZvciBtZXNzYWdlIGNvbXBpbGVyLCBGPGdlbmNhdD4gb24gTGludXgqIE9TIGFuZCBPUyBYKiwgb3IgRjxtYy5leGU+IG9uCitXaW5kb3dzKiBPUy4KKworSGVyZSBpcyB0aGUgZXhhbXBsZSBvZiBMaW51eCogT1MgbWVzc2FnZSBmaWxlOgorCisgICAgJHF1b3RlICIKKyAgICAxICJKYXBhbmVzZSIKKyAgICAyICJKYXBhbiIKKyAgICAzICIxMDQxIgorICAgIDQgIjIiCisgICAgNSAiQmFzZWQgb24gRW5saXNoIG1lc3NhZ2UgY2F0YWxvZyByZXZpc2lvbiAyMDA5MDgwNiIKKyAgICAuLi4KKworRXhhbXBsZSBvZiBXaW5kb3dzKiBPUyBtZXNzYWdlIGZpbGU6CisKKyAgICBMYW5ndWFnZU5hbWVzID0gKEphcGFuZXNlPTEwMDQxOm1zZ18xMDQxKQorCisgICAgRmFjaWxpdHlOYW1lcyA9ICgKKyAgICAgcHJwPTEKKyAgICAgc3RyPTIKKyAgICAgZm10PTMKKyAgICAgLi4uCisgICAgKQorCisgICAgTWVzc2FnZUlkPTEKKyAgICBGYWNpbGl0eT1wcnAKKyAgICBMYW5ndWFnZT1KYXBhbmVzZQorICAgIEphcGFuZXNlCisgICAgLgorCisgICAgLi4uCisKKz1pdGVtIFNpZ25hdHVyZS4KKworU2lnbmF0dXJlIGlzIGEgcHJvY2Vzc2VkIHNvdXJjZSBmaWxlOiBjb21tZW50cyBzdHJpcHBlZCwgc3RyaW5ncyBkZWxldGVkLCBidXQgcGxhY2Vob2xkZXJzIGtlcHQgYW5kCitzb3J0ZWQuCisKKyAgICAtKi0gRk9STUFUUy0qLQorCisgICAgSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlMSRkICUyJHMKKyAgICBXYXJuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUxJGQgJTIkcworICAgIEZhdGFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJTEkZCAlMiRzCisgICAgU3lzRXJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlMSRkICUyJHMKKyAgICBIaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUxJC0gJTIkcworICAgIFByYWdtYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJTEkcyAlMiRzICUzJHMgJTQkcworCitUaGUgcHVycG9zZSBvZiBzaWduYXR1cmVzIC0tIGNvbXBhcmUgdHdvIG1lc3NhZ2Ugc291cmNlIGZpbGVzIGZvciBjb21wYXRpYmlsaXR5LiBJZiBzaWduYXR1cmVzIG9mCit0d28gbWVzc2FnZSBzb3VyY2VzIGFyZSB0aGUgc2FtZSwgYmluYXJ5IG1lc3NhZ2UgY2F0YWxvZ3Mgd2lsbCBiZSBjb21wYXRpYmxlLgorCis9YmFjaworCis9aGVhZDEgRVhBTVBMRVMKKworR2VuZXJhdGUgaW5jbHVkZSBmaWxlIGNvbnRhaW5pbmcgbWVzc2FnZSBpZGVudGlmaWVyczoKKworICAgICQgbWVzc2FnZS1jb252ZXJ0ZXIucGwgLS1lbnVtLWZpbGU9a21wX2kxOG5faWQuaW5jIGVuX1VTLnR4dAorCitHZW5lcmF0ZSBpbmNsdWRlIGZpbGUgY29udGF0aW5nIGRlZmF1bHQgbWVzc2FnZXM6CisKKyAgICAkIG1lc3NhZ2UtY29udmVydGVyLnBsIC0tZGVmYXVsdC1maWxlPWttcF9pMThuX2RlZmF1bHQuaW5jIGVuX1VTLnR4dAorCitHZW5lcmF0ZSBpbnB1dCBmaWxlIGZvciBtZXNzYWdlIGNvbXBpbGVyLCBMaW51eCogT1MgZXhhbXBsZToKKworICAgICQgbWVzc2FnZS1jb252ZXJ0ZXIucGwgLS1tZXNzYWdlLWZpbGU9cnVfUlUuVVRGLTgubXNnIHJ1X1JVLnR4dAorCitHZW5lcmF0ZSBpbnB1dCBmaWxlIGZvciBtZXNzYWdlIGNvbXBpbGVyLCBXaW5kb3dzKiBPUyBleGFtcGxlOgorCisgICAgPiBtZXNzYWdlLWNvbnZlcnRlci5wbCAtLW1lc3NhZ2UtZmlsZT1ydV9SVS5VVEYtOC5tYyBydV9SVS50eHQKKworPWN1dAorCisjIGVuZCBvZiBmaWxlICMKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90b29scy9vYmpjb3B5LmNwcCBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvb2JqY29weS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZkMThiMAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvb2JqY29weS5jcHAKQEAgLTAsMCArMSw1MjIgQEAKKy8qCisgKiAkUmV2aXNpb246IDQyMTgxICQKKyAqICREYXRlOiAyMDEzLTAzLTI2IDE1OjA0OjQ1IC0wNTAwIChUdWUsIDI2IE1hciAyMDEzKSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJzdHJlYW0+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Y3N0cmluZz4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKwordHlwZWRlZiBzdGQ6OnN0cmluZyAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdDsKK3R5cGVkZWYgc3RkOjp2ZWN0b3I8IHN0cmluZ190ID4gICAgICAgICAgc3RyaW5nc190OwordHlwZWRlZiBzdGQ6Om1hcDwgc3RyaW5nX3QsIHN0cmluZ190ID4gICBzdHJfaGFzaF90OwordHlwZWRlZiBzdGQ6OnBhaXI8IHN0cmluZ190LCBzdHJpbmdfdCA+ICBzdHJfcGFpcl90OworI2lmZGVmIF9XSU4zMgorICAgIHR5cGVkZWYgbG9uZyBsb25nICBpbnQ2NF90OworI2VuZGlmCisKK3N0cmluZ190CitzaGlmdCggc3RyaW5nc190ICYgc3RycyApIHsKKyAgICBzdHJpbmdfdCBmaXJzdCA9IHN0cnMuZnJvbnQoKTsKKyAgICBzdHJzLmVyYXNlKCBzdHJzLmJlZ2luKCkgKTsKKyAgICByZXR1cm4gZmlyc3Q7Cit9IC8vIHNoaWZ0CisKK3N0cmluZ190CitmaW5kKAorICAgIHN0cl9oYXNoX3QgY29uc3QgJiBoYXNoLAorICAgIHN0cmluZ190IGNvbnN0ICYgICBrZXkKKykgeworICAgIHN0cmluZ190IHZhbHVlOworICAgIHN0cl9oYXNoX3Q6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gaGFzaC5maW5kKCBrZXkgKTsKKyAgICBpZiAoIGl0ICE9IGhhc2guZW5kKCkgKSB7CisgICAgICAgIHZhbHVlID0gaXQtPnNlY29uZDsKKyAgICB9OyAvLyBpZgorICAgIHJldHVybiB2YWx1ZTsKK30gLy8gZmluZAorCit2b2lkIGRpZSggc3RyaW5nX3QgY29uc3QgJiBtZXNzYWdlICkgeworICAgIHN0ZDo6Y2VyciA8PCBtZXNzYWdlIDw8IHN0ZDo6ZW5kbDsKKyAgICBleGl0KCAxICk7Cit9IC8vIGRpZQorCit2b2lkIHN0b3AoIHN0cmluZ190IGNvbnN0ICYgbWVzc2FnZSApIHsKKyAgICBwcmludGYoICIlc1xuIiwgbWVzc2FnZS5jX3N0cigpICk7CisgICAgZXhpdCggMSApOworfQorCisvLyBBbiBlbnRyeSBpbiB0aGUgc3ltYm9sIHRhYmxlIG9mIGEgLm9iaiBmaWxlLgorc3RydWN0IHN5bWJvbF90IHsKKyAgICBsb25nIGxvbmcgICAgICAgIG5hbWU7CisgICAgdW5zaWduZWQgICAgICAgICB2YWx1ZTsKKyAgICB1bnNpZ25lZCAgc2hvcnQgIHNlY3Rpb25fbnVtOworICAgIHVuc2lnbmVkICBzaG9ydCAgdHlwZTsKKyAgICBjaGFyICAgICAgICAgICAgIHN0b3JhZ2VfY2xhc3M7CisgICAgY2hhciAgICAgICAgICAgICBuQXV4OworfTsgLy8gc3RydWN0IHN5bWJvbF90CisKKworY2xhc3MgX3JzdHJlYW1fdCA6IHB1YmxpYyBzdGQ6OmlzdHJzdHJlYW0geworCisgICAgcHJpdmF0ZToKKworICAgICAgICBjb25zdCBjaGFyICogYnVmOworCisgICAgcHJvdGVjdGVkOgorCisgICAgICAgIF9yc3RyZWFtX3QoIHBhaXI8IGNvbnN0IGNoYXIgKiwgc3RyZWFtc2l6ZSA+IHAgKQorICAgICAgICAgICAgOiBpc3Ryc3RyZWFtKCBwLmZpcnN0LCBwLnNlY29uZCApLCBidWYoIHAuZmlyc3QgKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICB+X3JzdHJlYW1fdCgpIHsKKyAgICAgICAgICAgIGRlbGV0ZSBbXSBidWY7CisgICAgICAgIH0KKworfTsgLy8gY2xhc3MgX3JzdHJlYW1fdAorCisvKiBBIHN0cmVhbSBlbmNhcHVzbGF0aW5nIHRoZSBjb250ZW50IG9mIGEgZmlsZSBvciB0aGUgY29udGVudCBvZiBhIHN0cmluZywgb3ZlcnJpZGluZyB0aGUKKyAgID4+IG9wZXJhdG9yIHRvIHJlYWQgdmFyaW91cyBpbnRlZ2VyIHR5cGVzIGluIGJpbmFyeSBmb3JtLCBhcyB3ZWxsIGFzIGEgc3ltYm9sIHRhYmxlCisgICBlbnRyeS4KKyovCitjbGFzcyByc3RyZWFtX3QgOiBwdWJsaWMgX3JzdHJlYW1fdCB7Citwcml2YXRlOgorCisgICAgdGVtcGxhdGU8IHR5cGVuYW1lIHR5cGVfdCA+CisgICAgaW5saW5lIHJzdHJlYW1fdCAmIGRvX3JlYWQoIHR5cGVfdCAmIHggKSB7CisJcmVhZCggKGNoYXIqKSAmIHgsIHNpemVvZiggdHlwZV90ICkgKTsKKwlyZXR1cm4gKiB0aGlzOworICAgIH0KKworICAgIHN0YXRpYyBwYWlyPGNvbnN0IGNoYXIqLCBzdHJlYW1zaXplPiBnZXRCdWYoY29uc3QgY2hhciAqZmlsZU5hbWUpIHsKKwlpZnN0cmVhbSByYXcoZmlsZU5hbWUsaW9zOjpiaW5hcnkgfCBpb3M6OmluKTsKKwlpZighcmF3LmlzX29wZW4oKSkKKwkgICAgc3RvcCgicnN0cmVhbS5nZXRCdWY6IEVycm9yIG9wZW5pbmcgZmlsZSIpOworCXJhdy5zZWVrZygwLGlvczo6ZW5kKTsKKwlzdHJlYW1wb3MgZmlsZVNpemUgPSByYXcudGVsbGcoKTsKKwlpZihmaWxlU2l6ZSA8IDApCisJICAgIHN0b3AoInJzdHJlYW0uZ2V0QnVmOiBFcnJvciByZWFkaW5nIGZpbGUiKTsKKwljaGFyICpidWYgPSBuZXcgY2hhcltmaWxlU2l6ZV07CisJcmF3LnNlZWtnKDAsaW9zOjpiZWcpOworCXJhdy5yZWFkKGJ1ZiwgZmlsZVNpemUpOworCXJldHVybiBwYWlyPGNvbnN0IGNoYXIqLCBzdHJlYW1zaXplPihidWYsZmlsZVNpemUpOworICAgIH0KK3B1YmxpYzoKKyAgICAvLyBjb25zdHJ1Y3QgZnJvbSBhIHN0cmluZworICAgIHJzdHJlYW1fdCggY29uc3QgY2hhciAqIGJ1Ziwgc3RyZWFtc2l6ZSBzaXplICkgOgorICAgICAgICBfcnN0cmVhbV90KCBwYWlyPCBjb25zdCBjaGFyICosIHN0cmVhbXNpemUgPiggYnVmLCBzaXplICkgKQorICAgIHt9CisgICAgLyogY29uc3RydWN0IGZyb20gYSBmaWxlIHdob2xlIGNvbnRlbnQgaXMgZnVsbHkgcmVhZCBvbmNlIHRvIGluaXRpYWxpemUgdGhlIGNvbnRlbnQgb2YKKyAgICAgICB0aGlzIHN0cmVhbQorICAgICovCisgICAgcnN0cmVhbV90KCBzdHJpbmdfdCBjb25zdCAmIGZpbGVOYW1lICkKKyAgICAgICAgOiBfcnN0cmVhbV90KCBnZXRCdWYoIGZpbGVOYW1lLmNfc3RyKCkgKSApCisgICAgeworICAgIH0KKworICAgIHJzdHJlYW1fdCAmIG9wZXJhdG9yID4+KCBpbnQgJiB4ICkgeworCXJldHVybiBkb19yZWFkKHgpOworICAgIH0KKyAgICByc3RyZWFtX3QgJiBvcGVyYXRvciA+Pih1bnNpZ25lZCAmeCkgeworCXJldHVybiBkb19yZWFkKHgpOworICAgIH0KKyAgICByc3RyZWFtX3QgJiBvcGVyYXRvcj4+KHNob3J0ICZ4KSB7CisJcmV0dXJuIGRvX3JlYWQoeCk7CisgICAgfQorICAgIHJzdHJlYW1fdCAmIG9wZXJhdG9yPj4odW5zaWduZWQgc2hvcnQgJngpIHsKKwlyZXR1cm4gZG9fcmVhZCh4KTsKKyAgICB9CisgICAgcnN0cmVhbV90ICYgb3BlcmF0b3I+Piggc3ltYm9sX3QgJiBlICkgeworCXJlYWQoKGNoYXIqKSZlLCAxOCk7CisJcmV0dXJuICp0aGlzOworICAgIH0KK307IC8vIGNsYXNzIHJzdHJlYW1fdAorCisvLyBzdHJpbmcgdGFibGUgaW4gYSAuT0JKIGZpbGUKK2NsYXNzIFN0cmluZ1RhYmxlIHsKK3ByaXZhdGU6CisgICAgbWFwPHN0cmluZywgdW5zaWduZWQ+IGRpcmVjdG9yeTsKKyAgICBzaXplX3QgbGVuZ3RoOworICAgIGNoYXIgKmRhdGE7CisKKyAgICAvLyBtYWtlIDxkaXJlY3Rvcnk+IGZyb20gPGxlbmd0aD4gYnl0ZXMgaW4gPGRhdGE+CisgICAgdm9pZCBtYWtlRGlyZWN0b3J5KHZvaWQpIHsKKwl1bnNpZ25lZCBpID0gNDsKKwl3aGlsZShpIDwgbGVuZ3RoKSB7CisJICAgIHN0cmluZyBzID0gc3RyaW5nKGRhdGEgKyBpKTsKKwkgICAgZGlyZWN0b3J5Lmluc2VydChtYWtlX3BhaXIocywgaSkpOworCSAgICBpICs9IHMuc2l6ZSgpICsgMTsKKwl9CisgICAgfQorICAgIC8vIGluaXRpYWxpemUgPGxlbmd0aD4gYW5kIDxkYXRhPiB3aXRoIGNvbnRlbnRzIHNwZWNpZmllZCBieSB0aGUgYXJndW1lbnRzCisgICAgdm9pZCBpbml0KGNvbnN0IGNoYXIgKl9kYXRhKSB7CisJdW5zaWduZWQgX2xlbmd0aCA9ICoodW5zaWduZWQqKV9kYXRhOworCisJaWYoX2xlbmd0aCA8IHNpemVvZih1bnNpZ25lZCkgfHwgX2xlbmd0aCAhPSAqKHVuc2lnbmVkKilfZGF0YSkKKwkgICAgc3RvcCgiU3RyaW5nVGFibGUuaW5pdDogSW52YWxpZCBzeW1ib2wgdGFibGUiKTsKKwlpZihfZGF0YVtfbGVuZ3RoIC0gMV0pIHsKKwkgICAgLy8gdG8gcHJldmVudCBydW5hd2F5IHN0cmluZ3MsIG1ha2Ugc3VyZSB0aGUgZGF0YSBlbmRzIHdpdGggYSB6ZXJvCisJICAgIGRhdGEgPSBuZXcgY2hhcltsZW5ndGggPSBfbGVuZ3RoICsgMV07CisJICAgIGRhdGFbX2xlbmd0aF0gPSAwOworCX0gZWxzZSB7CisJICAgIGRhdGEgPSBuZXcgY2hhcltsZW5ndGggPSBfbGVuZ3RoXTsKKwl9CisJKih1bnNpZ25lZCopZGF0YSA9IGxlbmd0aDsKKwltZW1jcHkoIGRhdGEgKyBzaXplb2YodW5zaWduZWQpLCBfZGF0YSArIHNpemVvZih1bnNpZ25lZCksIGxlbmd0aCAtIHNpemVvZih1bnNpZ25lZCkgKTsKKwltYWtlRGlyZWN0b3J5KCk7CisgICAgfQorcHVibGljOgorICAgIFN0cmluZ1RhYmxlKCByc3RyZWFtX3QgJiBmICkgeworCS8qIENvbnN0cnVjdCBzdHJpbmcgdGFibGUgYnkgcmVhZGluZyBmcm9tIGYuCisJICovCisJc3RyZWFtcG9zIHM7CisJdW5zaWduZWQgc3RyU2l6ZTsKKwljaGFyICpzdHJEYXRhOworCisJcyA9IGYudGVsbGcoKTsKKwlmPj5zdHJTaXplOworCWlmKHN0clNpemUgPCBzaXplb2YodW5zaWduZWQpKQorCSAgICBzdG9wKCJTdHJpbmdUYWJsZTogSW52YWxpZCBzdHJpbmcgdGFibGUiKTsKKwlzdHJEYXRhID0gbmV3IGNoYXJbc3RyU2l6ZV07CisJKih1bnNpZ25lZCopc3RyRGF0YSA9IHN0clNpemU7CisJLy8gcmVhZCB0aGUgcmF3IGRhdGEgaW50byA8c3RyRGF0YT4KKwlmLnJlYWQoc3RyRGF0YSArIHNpemVvZih1bnNpZ25lZCksIHN0clNpemUgLSBzaXplb2YodW5zaWduZWQpKTsKKwlzID0gZi50ZWxsZygpIC0gczsKKwlpZihzIDwgc3RyU2l6ZSkKKwkgICAgc3RvcCgiU3RyaW5nVGFibGU6IFVuZXhwZWN0ZWQgRU9GIik7CisJaW5pdChzdHJEYXRhKTsKKwlkZWxldGVbXXN0ckRhdGE7CisgICAgfQorICAgIFN0cmluZ1RhYmxlKGNvbnN0IHNldDxzdHJpbmc+ICZzdHJpbmdzKSB7CisJLyogQ29uc3RydWN0IHN0cmluZyB0YWJsZSBmcm9tIGdpdmVuIHN0cmluZ3MuCisJICovCisJY2hhciAqcDsKKwlzZXQ8c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXQ7CisJc2l6ZV90IHM7CisKKwkvLyBjb3VudCByZXF1aXJlZCBzaXplIGZvciBkYXRhCisJZm9yKGxlbmd0aCA9IHNpemVvZih1bnNpZ25lZCksIGl0ID0gc3RyaW5ncy5iZWdpbigpOyBpdCAhPSBzdHJpbmdzLmVuZCgpOyArK2l0KSB7CisJICAgIHNpemVfdCBsID0gKCppdCkuc2l6ZSgpOworCisJICAgIGlmKGwgPiAodW5zaWduZWQpIDB4RkZGRkZGRkYpCisJCXN0b3AoIlN0cmluZ1RhYmxlOiBTdHJpbmcgdG9vIGxvbmciKTsKKwkgICAgaWYobCA+IDgpIHsKKwkJbGVuZ3RoICs9IGwgKyAxOworCQlpZihsZW5ndGggPiAodW5zaWduZWQpIDB4RkZGRkZGRkYpCisJCSAgICBzdG9wKCJTdHJpbmdUYWJsZTogU3ltYm9sIHRhYmxlIHRvbyBsb25nIik7CisJICAgIH0KKwl9CisJZGF0YSA9IG5ldyBjaGFyW2xlbmd0aF07CisJKih1bnNpZ25lZCopZGF0YSA9IGxlbmd0aDsKKwkvLyBwb3B1bGF0ZSBkYXRhIGFuZCBkaXJlY3RvcnkKKwlmb3IocCA9IGRhdGEgKyBzaXplb2YodW5zaWduZWQpLCBpdCA9IHN0cmluZ3MuYmVnaW4oKTsgaXQgIT0gc3RyaW5ncy5lbmQoKTsgKytpdCkgeworCSAgICBjb25zdCBzdHJpbmcgJnN0ciA9ICppdDsKKwkgICAgc2l6ZV90IGwgPSBzdHIuc2l6ZSgpOworCSAgICBpZihsID4gOCkgeworCQlkaXJlY3RvcnkuaW5zZXJ0KG1ha2VfcGFpcihzdHIsIHAgLSBkYXRhKSk7CisJCW1lbWNweShwLCBzdHIuY19zdHIoKSwgbCk7CisJCXBbbF0gPSAwOworCQlwICs9IGwgKyAxOworCSAgICB9CisJfQorICAgIH0KKyAgICB+U3RyaW5nVGFibGUoKSB7CisJZGVsZXRlW10gZGF0YTsKKyAgICB9CisgICAgLyogUmV0dXJucyBlbmNvZGluZyBmb3IgZ2l2ZW4gc3RyaW5nIGJhc2VkIG9uIHRoaXMgc3RyaW5nIHRhYmxlLgorICAgICAgIEVycm9yIGlmIHN0cmluZyBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIDggYnV0IHN0cmluZyBpcyBub3QgaW4KKyAgICAgICB0aGUgc3RyaW5nIHRhYmxlLS1yZXR1cm5zIDAuCisgICAgKi8KKyAgICBpbnQ2NF90IGVuY29kZShjb25zdCBzdHJpbmcgJnN0cikgeworCWludDY0X3QgcjsKKworCWlmKHN0ci5zaXplKCkgPD0gOCkgeworCSAgICAvLyBlbmNvZGVkIGRpcmVjdGx5CisJICAgICgoY2hhciopJnIpWzddID0gMDsKKwkgICAgc3RybmNweSgoY2hhciopJnIsIHN0ci5jX3N0cigpLCA4KTsKKwkgICAgcmV0dXJuIHI7CisJfSBlbHNlIHsKKwkgICAgLy8gcmVwcmVzZW50ZWQgYXMgaW5kZXggaW50byB0YWJsZQorCSAgICBtYXA8c3RyaW5nLHVuc2lnbmVkPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBkaXJlY3RvcnkuZmluZChzdHIpOworCSAgICBpZihpdCA9PSBkaXJlY3RvcnkuZW5kKCkpCisJCXN0b3AoIlN0cmluZ1RhYmxlOjplbmNvZGU6IFN0cmluZyBub3cgZm91bmQgaW4gc3RyaW5nIHRhYmxlIik7CisJICAgICgodW5zaWduZWQqKSZyKVswXSA9IDA7CisJICAgICgodW5zaWduZWQqKSZyKVsxXSA9ICgqaXQpLnNlY29uZDsKKwkgICAgcmV0dXJuIHI7CisJfQorICAgIH0KKyAgICAvKiBSZXR1cm5zIHN0cmluZyByZXByZXNlbnRlZCBieSB4IGJhc2VkIG9uIHRoaXMgc3RyaW5nIHRhYmxlLgorICAgICAgIEVycm9yIGlmIHggcmVmZXJlbmNlcyBhbiBpbnZhbGlkIHBvc2l0aW9uIGluIHRoZSB0YWJsZS0tcmV0dXJucworICAgICAgIHRoZSBlbXB0eSBzdHJpbmcuCisgICAgKi8KKyAgICBzdHJpbmcgZGVjb2RlKGludDY0X3QgeCkgY29uc3QgeworCWlmKCoodW5zaWduZWQqKSZ4ID09IDApIHsKKwkgICAgLy8gcmVwcmVzZW50ZWQgYXMgaW5kZXggaW50byB0YWJsZQorCSAgICB1bnNpZ25lZCAmcCA9ICgodW5zaWduZWQqKSZ4KVsxXTsKKwkgICAgaWYocCA+PSBsZW5ndGgpCisJCXN0b3AoIlN0cmluZ1RhYmxlOjpkZWNvZGU6IEludmFsaWQgc3RyaW5nIHRhYmxlIGxvb2t1cCIpOworCSAgICByZXR1cm4gc3RyaW5nKGRhdGEgKyBwKTsKKwl9IGVsc2UgeworCSAgICAvLyBlbmNvZGVkIGRpcmVjdGx5CisJICAgIGNoYXIgKnAgPSAoY2hhciopJng7CisJICAgIGludCBpOworCisJICAgIGZvcihpID0gMDsgaSA8IDggJiYgcFtpXTsgKytpKTsKKwkgICAgcmV0dXJuIHN0cmluZyhwLCBpKTsKKwl9CisgICAgfQorICAgIHZvaWQgd3JpdGUob3N0cmVhbSAmb3MpIHsKKwlvcy53cml0ZShkYXRhLCBsZW5ndGgpOworICAgIH0KK307CisKKwordm9pZAorb2JqX2NvcHkoCisgICAgc3RyaW5nX3QgY29uc3QgJiAgICBzcmMsICAgIC8vIE5hbWUgb2Ygc291cmNlIGZpbGUuCisgICAgc3RyaW5nX3QgY29uc3QgJiAgICBkc3QsICAgIC8vIE5hbWUgb2YgZGVzdGluYXRpb24gZmlsZS4KKyAgICBzdHJfaGFzaF90IGNvbnN0ICYgIHJlZGVmcyAgLy8gTGlzdCBvZiByZWRlZmluaXRpdGlvbnMuCispIHsKKworICAgIHNldDwgc3RyaW5nID4gc3RyaW5nczsgLy8gc2V0IG9mIGFsbCBvY2N1cnJpbmcgc3ltYm9scywgYXBwcm9wcmlhdGVseSBwcmVmaXhlZAorICAgIHN0cmVhbXBvcyBmaWxlU2l6ZTsKKyAgICBzaXplX3Qgc3RyVGFiU3RhcnQ7CisgICAgdW5zaWduZWQgc3ltVGFiU3RhcnQ7CisgICAgdW5zaWduZWQgc3ltTkVudHJpZXM7CisgICAgaW50IGk7CisKKworICAgIHN0cmluZyBjb25zdCBlcnJvcl9yZWFkaW5nID0gIkVycm9yIHJlYWRpbmcgXCIiICsgc3JjICsgIlwiIGZpbGU6ICI7CisKKyAgICByc3RyZWFtX3QgaW4oIHNyYyApOworCisgICAgaW4uc2Vla2coIDAsIGlvczo6ZW5kICk7CisgICAgZmlsZVNpemUgPSBpbi50ZWxsZygpOworCisgICAgaW4uc2Vla2coIDggKTsKKyAgICBpbiA+PiBzeW1UYWJTdGFydCA+PiBzeW1ORW50cmllczsKKyAgICBzdHJUYWJTdGFydCA9IHN5bVRhYlN0YXJ0ICsgMTggKiBzaXplX3QoIHN5bU5FbnRyaWVzICk7CisgICAgaW4uc2Vla2coIHN0clRhYlN0YXJ0ICk7CisgICAgaWYgKCBpbi5lb2YoKSApIHsKKyAgICAgICAgc3RvcCggZXJyb3JfcmVhZGluZyArICJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlIiApOworICAgIH0KKyAgICBTdHJpbmdUYWJsZSBzdHJpbmdUYWJsZU9sZCggaW4gKTsgLy8gUmVhZCBvcmlnaW5hbCBzdHJpbmcgdGFibGUuCisKKyAgICBpZiAoIGluLnRlbGxnKCkgIT0gZmlsZVNpemUgKSB7CisgICAgICAgIHN0b3AoIGVycm9yX3JlYWRpbmcgKyAiVW5leHBlY3RlZCBkYXRhIGFmdGVyIHN0cmluZyB0YWJsZSIgKTsKKyAgICB9CisKKyAgICAvLyBjb21wdXRlIHNldCBvZiBvY2N1cnJpbmcgc3RyaW5ncyB3aXRoIHByZWZpeCBhZGRlZAorICAgIGZvciAoIGkgPSAwOyBpIDwgc3ltTkVudHJpZXM7ICsrIGkgKSB7CisKKwlzeW1ib2xfdCBlOworCisJaW4uc2Vla2coIHN5bVRhYlN0YXJ0ICsgaSAqIDE4ICk7CisJaWYgKCBpbi5lb2YoKSApIHsKKyAgICAgICAgICAgIHN0b3AoImhpZGVTeW1ib2xzOiBVbmV4cGVjdGVkIEVPRiIpOworICAgICAgICB9CisJaW4gPj4gZTsKKwlpZiAoIGluLmZhaWwoKSApIHsKKyAgICAgICAgICAgIHN0b3AoImhpZGVTeW1ib2xzOiBGaWxlIHJlYWQgZXJyb3IiKTsKKyAgICAgICAgfQorCWlmICggZS5uQXV4ICkgeworICAgICAgICAgICAgaSArPSBlLm5BdXg7CisgICAgICAgIH0KKwljb25zdCBzdHJpbmcgJiBzID0gc3RyaW5nVGFibGVPbGQuZGVjb2RlKCBlLm5hbWUgKTsKKwkvLyBpZiBzeW1ib2wgaXMgZXh0ZXJuIGFuZCBmb3VuZCBpbiA8aGlkZT4sIHByZWZpeCBhbmQgaW5zZXJ0IGludG8gc3RyaW5ncywKKwkvLyBvdGhlcndpc2UsIGp1c3QgaW5zZXJ0IGludG8gc3RyaW5ncyB3aXRob3V0IHByZWZpeAorICAgICAgICBzdHJpbmdfdCBuYW1lID0gZmluZCggcmVkZWZzLCBzICk7CisJc3RyaW5ncy5pbnNlcnQoIG5hbWUgIT0gIiIgJiYgZS5zdG9yYWdlX2NsYXNzID09IDIgPyBuYW1lIDogcyApOworICAgIH0KKworICAgIG9mc3RyZWFtIG91dCggZHN0LmNfc3RyKCksIGlvczo6dHJ1bmMgfCBpb3M6Om91dCB8IGlvczo6YmluYXJ5ICk7CisgICAgaWYgKCAhIG91dC5pc19vcGVuKCkgKSB7CisgICAgICAgIHN0b3AoImhpZGVTeW1ib2xzOiBFcnJvciBvcGVuaW5nIG91dHB1dCBmaWxlIik7CisgICAgfQorCisgICAgLy8gbWFrZSBuZXcgc3RyaW5nIHRhYmxlIGZyb20gc3RyaW5nIHNldAorICAgIFN0cmluZ1RhYmxlIHN0cmluZ1RhYmxlTmV3ID0gU3RyaW5nVGFibGUoIHN0cmluZ3MgKTsKKworICAgIC8vIGNvcHkgaW5wdXQgZmlsZSB0byBvdXRwdXQgZmlsZSB1cCB0byBqdXN0IGJlZm9yZSB0aGUgc3ltYm9sIHRhYmxlCisgICAgaW4uc2Vla2coIDAgKTsKKyAgICBjaGFyICogYnVmID0gbmV3IGNoYXJbIHN5bVRhYlN0YXJ0IF07CisgICAgaW4ucmVhZCggYnVmLCBzeW1UYWJTdGFydCApOworICAgIG91dC53cml0ZSggYnVmLCBzeW1UYWJTdGFydCApOworICAgIGRlbGV0ZSBbXSBidWY7CisKKyAgICAvLyBjb3B5IGlucHV0IHN5bWJvbCB0YWJsZSB0byBvdXRwdXQgc3ltYm9sIHRhYmxlIHdpdGggbmFtZSB0cmFuc2xhdGlvbgorICAgIGZvciAoIGkgPSAwOyBpIDwgc3ltTkVudHJpZXM7ICsrIGkgKSB7CisJc3ltYm9sX3QgZTsKKworCWluLnNlZWtnKCBzeW1UYWJTdGFydCArIGkgKiAxOCApOworCWlmICggaW4uZW9mKCkgKSB7CisgICAgICAgICAgICBzdG9wKCJoaWRlU3ltYm9sczogVW5leHBlY3RlZCBFT0YiKTsKKyAgICAgICAgfQorCWluID4+IGU7CisJaWYgKCBpbi5mYWlsKCkgKSB7CisgICAgICAgICAgICBzdG9wKCJoaWRlU3ltYm9sczogRmlsZSByZWFkIGVycm9yIik7CisgICAgICAgIH0KKwljb25zdCBzdHJpbmcgJiBzID0gc3RyaW5nVGFibGVPbGQuZGVjb2RlKCBlLm5hbWUgKTsKKwlvdXQuc2Vla3AoIHN5bVRhYlN0YXJ0ICsgaSAqIDE4ICk7CisgICAgICAgIHN0cmluZ190IG5hbWUgPSBmaW5kKCByZWRlZnMsIHMgKTsKKwllLm5hbWUgPSBzdHJpbmdUYWJsZU5ldy5lbmNvZGUoICggZS5zdG9yYWdlX2NsYXNzID09IDIgJiYgbmFtZSAhPSAiIiApID8gbmFtZSA6IHMgKTsKKwlvdXQud3JpdGUoIChjaGFyKikgJiBlLCAxOCApOworCWlmICggb3V0LmZhaWwoKSApIHsKKyAgICAgICAgICAgIHN0b3AoICJoaWRlU3ltYm9sczogRmlsZSB3cml0ZSBlcnJvciIgKTsKKyAgICAgICAgfQorCWlmICggZS5uQXV4ICkgeworCSAgICAvLyBjb3B5IGF1eGlsaWFyeSBzeW1ib2wgdGFibGUgZW50cmllcworCSAgICBpbnQgbkF1eCA9IGUubkF1eDsKKwkgICAgZm9yIChpbnQgaiA9IDE7IGogPD0gbkF1eDsgKytqICkgeworCQlpbiA+PiBlOworCQlvdXQuc2Vla3AoIHN5bVRhYlN0YXJ0ICsgKCBpICsgaiApICogMTggKTsKKwkJb3V0LndyaXRlKCAoY2hhciopICYgZSwgMTggKTsKKwkgICAgfQorCSAgICBpICs9IG5BdXg7CisJfQorICAgIH0KKyAgICAvLyBvdXRwdXQgc3RyaW5nIHRhYmxlCisgICAgc3RyaW5nVGFibGVOZXcud3JpdGUoIG91dCApOworfQorCisKK3ZvaWQKK3NwbGl0KCBzdHJpbmdfdCBjb25zdCAmIHN0ciwgY2hhciBjaCwgc3RyaW5nX3QgJiBoZWFkLCBzdHJpbmdfdCAmIHRhaWwgKSB7CisgICAgc3RyaW5nX3Q6OnNpemVfdHlwZSBwb3MgPSBzdHIuZmluZCggY2ggKTsKKyAgICBpZiAoIHBvcyA9PSBzdHJpbmdfdDo6bnBvcyApIHsKKyAgICAgICAgaGVhZCA9IHN0cjsKKyAgICAgICAgdGFpbCA9ICIiOworICAgIH0gZWxzZSB7CisgICAgICAgIGhlYWQgPSBzdHIuc3Vic3RyKCAwLCBwb3MgKTsKKyAgICAgICAgdGFpbCA9IHN0ci5zdWJzdHIoIHBvcyArIDEgKTsKKyAgICB9OyAvLyBpZgorfSAvLyBzcGxpdAorCisKK3ZvaWQgaGVscCgpIHsKKyAgICBzdGQ6OmNvdXQKKyAgICAgICAgPDwgIk5BTUVcbiIKKyAgICAgICAgPDwgIiAgICBvYmpjb3B5IC0tIGNvcHkgYW5kIHRyYW5zbGF0ZSBvYmplY3QgZmlsZXNcbiIKKyAgICAgICAgPDwgIlxuIgorICAgICAgICA8PCAiU1lOT1BTSVNcbiIKKyAgICAgICAgPDwgIiAgICBvYmpjb3B5IG9wdGlvbnMuLi4gc291cmNlIGRlc3RpbmF0aW9uXG4iCisgICAgICAgIDw8ICJcbiIKKyAgICAgICAgPDwgIk9QVElPTlNcbiIKKyAgICAgICAgPDwgIiAgICAtLWhlbHAgIFByaW50IHRoaXMgaGVscCBhbmQgZXhpdC5cbiIKKyAgICAgICAgPDwgIiAgICAtLXJlZGVmaW5lLXN5bSBvbGQ9bmV3XG4iCisgICAgICAgIDw8ICIgICAgICAgICAgICBSZW5hbWUgXCJvbGRcIiBzeW1ib2wgaW4gc291cmNlIG9iamVjdCBmaWxlIHRvIFwibmV3XCIgc3ltYm9sIGluXG4iCisgICAgICAgIDw8ICIgICAgICAgICAgICBkZXN0aW5hdGlvbiBvYmplY3QgZmlsZS5cbiIKKyAgICAgICAgPDwgIiAgICAtLXJlZGVmaW5lLXN5bXMgc3ltX2ZpbGVcbiIKKyAgICAgICAgPDwgIiAgICAgICAgICAgIEZvciBlYWNoIHBhaXIgXCJvbGQgbmV3XCIgaW4gc3ltX2ZpbGUgcmVuYW1lIFwib2xkXCIgc3ltYm9sIGluIFxuIgorICAgICAgICA8PCAiICAgICAgICAgICAgc291cmNlIG9iamVjdCBmaWxlIHRvIFwibmV3XCIgc3ltYm9sIGluIGRlc3RpbmF0aW9uIG9iamVjdCBmaWxlLlxuIgorICAgICAgICA8PCAiXG4iCisgICAgICAgIDw8ICJBUkdVTUVOVFNcbiIKKyAgICAgICAgPDwgIiAgICBzb3VyY2UgIFRoZSBuYW1lIG9mIHNvdXJjZSBvYmplY3QgZmlsZS5cbiIKKyAgICAgICAgPDwgIiAgICBkZXN0aW5hdGlvblxuIgorICAgICAgICA8PCAiICAgICAgICAgICAgVGhlIG5hbWUgb2YgZGVzdGluYXRpb24gb2JqZWN0IGZpbGUuXG4iCisgICAgICAgIDw8ICJcbiIKKyAgICAgICAgPDwgIkRFU0NSSVBUSU9OXG4iCisgICAgICAgIDw8ICIgICAgVGhpcyBwcm9ncmFtIGltcGxlbWVudHMgYSBtaW5vciBiaXQgb2YgTGludXgqIE9TJ3Mgb2JqY29weSB1dGlsaXR5IG9uIFdpbmRvd3MqIE9TLlxuIgorICAgICAgICA8PCAiICAgIEl0IGNhbiBjb3B5IG9iamVjdCBmaWxlcyBhbmQgZWRpdCBpdHMgc3ltYm9sIHRhYmxlLlxuIgorICAgICAgICA8PCAiXG4iCisgICAgICAgIDw8ICJFWEFNUExFU1xuIgorICAgICAgICA8PCAiICAgIFxuIgorICAgICAgICA8PCAiICAgICAgICA+IG9iamNvcHkgLS1yZWRlZmluZS1zeW0gZmFzdGNweT1fX3h4eF9mYXN0Y3B5IGEub2JqIGIub2JqXG4iCisgICAgICAgIDw8ICJcbiI7Cit9IC8vIGhlbHAKKworCitpbnQKK21haW4oIGludCBhcmdjLCBjaGFyIGNvbnN0ICogYXJndltdICkgeworCisgICAgc3RyaW5nc190ICAgYXJncyggYXJnYyAtIDEgKTsKKyAgICBzdHJfaGFzaF90ICByZWRlZnM7CisgICAgc3RyaW5nc190ICAgZmlsZXM7CisKKyAgICBzdGQ6OmNvcHkoIGFyZ3YgKyAxLCBhcmd2ICsgYXJnYywgYXJncy5iZWdpbigpICk7CisKKyAgICB3aGlsZSAoIGFyZ3Muc2l6ZSgpID4gMCApIHsKKyAgICAgICAgc3RyaW5nX3QgYXJnID0gc2hpZnQoIGFyZ3MgKTsKKyAgICAgICAgaWYgKCBhcmcuc3Vic3RyKCAwLCAyICkgPT0gIi0tIiApIHsKKyAgICAgICAgICAgIC8vIEFuIG9wdGlvbi4KKyAgICAgICAgICAgIGlmICggMCAgKSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCBhcmcgPT0gIi0taGVscCIgKSB7CisgICAgICAgICAgICAgICAgaGVscCgpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfSBlbHNlIGlmICggYXJnID09ICItLXJlZGVmaW5lLXN5bSIgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBhcmdzLnNpemUoKSA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICBkaWUoICJcIiIgKyBhcmcgKyAiXCIgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiApOworICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgLy8gcmVhZCBsaXN0IG9mIHN5bWJvbCBwYWlycyAib2xkIG5ldyIgZnJvbSBjb21tYW5kIGxpbmUuCisgICAgICAgICAgICAgICAgc3RyaW5nX3QgcmVkZWYgPSBzaGlmdCggYXJncyApOworICAgICAgICAgICAgICAgIHN0cmluZ190IG9sZF9zeW07CisgICAgICAgICAgICAgICAgc3RyaW5nX3QgbmV3X3N5bTsKKyAgICAgICAgICAgICAgICBzcGxpdCggcmVkZWYsICc9Jywgb2xkX3N5bSwgbmV3X3N5bSApOworICAgICAgICAgICAgICAgIGlmICggb2xkX3N5bS5sZW5ndGgoKSA9PSAwIHx8IG5ld19zeW0ubGVuZ3RoKCkgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgZGllKCAiSWxsZWdhbCByZWRlZmluaXRpb246IFwiIiArIHJlZGVmICsgIlwiOyBuZWl0aGVyIG9sZCBzeW1ib2wgbm9yIG5ldyBzeW1ib2wgbWF5IGJlIGVtcHR5IiApOworICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgcmVkZWZzLmluc2VydCggc3RyX3BhaXJfdCggb2xkX3N5bSwgbmV3X3N5bSApICk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCBhcmcgPT0gIi0tcmVkZWZpbmUtc3ltcyIgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBhcmdzLnNpemUoKSA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICBkaWUoICJcIiIgKyBhcmcgKyAiXCIgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiApOworICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgLy8gcmVhZCBsaXN0IG9mIHN5bWJvbCBwYWlycyAib2xkIG5ldyIgZnJvbSBmaWxlLgorICAgICAgICAgICAgICAgIHN0cmluZ190IGZuYW1lID0gc2hpZnQoIGFyZ3MgKTsKKyAgICAgICAgICAgICAgICBzdHJpbmdfdCByZWRlZjsKKwkJaWZzdHJlYW0gaWZzKCBmbmFtZS5jX3N0cigpICk7CisJCXdoaWxlICggaWZzLmdvb2QoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0bGluZSggaWZzLCByZWRlZiApOy8vIGdldCBwYWlyIG9mIG9sZC9uZXcgc3ltYm9scyBzZXBhcmF0ZWQgYnkgc3BhY2UKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3Qgb2xkX3N5bTsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3QgbmV3X3N5bTsKKyAgICAgICAgICAgICAgICAgICAgLy8gQUM6IGdjb3VudCgpIGRvZXMgbm90IHdvcmsgaGVyZSAoYWx3YXlzIHJldHVybiAwKSwgc28gY29tbWVudCBpdAorICAgICAgICAgICAgICAgICAgICAvL2lmICggaWZzLmdjb3VudCgpICkgeyAvLyBza2lwIGVtcHR5IGxpbmVzCisgICAgICAgICAgICAgICAgICAgIHNwbGl0KCByZWRlZiwgJyAnLCBvbGRfc3ltLCBuZXdfc3ltICk7CisgICAgICAgICAgICAgICAgICAgIGlmICggb2xkX3N5bS5sZW5ndGgoKSA9PSAwIHx8IG5ld19zeW0ubGVuZ3RoKCkgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgLy8gZW5kIG9mIGZpbGUgcmVhY2hlZCAobGFzdCBlbXB0eSBsaW5lKQorICAgICAgICAgICAgICAgICAgICAgICAgLy9kaWUoICJJbGxlZ2FsIHJlZGVmaW5pdGlvbjogXCIiICsgcmVkZWYgKyAiXCI7IG5laXRoZXIgb2xkIHN5bWJvbCBub3IgbmV3IHN5bWJvbCBtYXkgYmUgZW1wdHkiICk7CisgICAgICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgICAgIHJlZGVmcy5pbnNlcnQoIHN0cl9wYWlyX3QoIG9sZF9zeW0sIG5ld19zeW0gKSApOworICAgICAgICAgICAgICAgICAgICAvL30KKwkJfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkaWUoICJJbGxlZ2FsIG9wdGlvbjogXCIiICsgYXJnICsgIlwiIiApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE5vdCBhbiBvcHRpb24sIGEgZmlsZSBuYW1lLgorICAgICAgICAgICAgaWYgKCBmaWxlcy5zaXplKCkgPj0gMiApIHsKKyAgICAgICAgICAgICAgICBkaWUoICJUb28gbWFueSBmaWxlcyBzcGVjaWZpZWQ7IHR3byBmaWxlcyByZXF1aXJlZCAodXNlIC0taGVscCBvcHRpb24gZm9yIGhlbHApIiApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIGZpbGVzLnB1c2hfYmFjayggYXJnICk7CisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gd2hpbGUKKyAgICBpZiAoIGZpbGVzLnNpemUoKSA8IDIgKSB7CisgICAgICAgIGRpZSggIk5vdCBlbm91Z2ggZmlsZXMgc3BlY2lmaWVkOyB0d28gZmlsZXMgcmVxdWlyZWQgKHVzZSAtLWhlbHAgb3B0aW9uIGZvciBoZWxwKSIgKTsKKyAgICB9OyAvLyBpZgorCisgICAgb2JqX2NvcHkoIGZpbGVzWyAwIF0sIGZpbGVzWyAxIF0sIHJlZGVmcyApOworCisgICAgcmV0dXJuIDA7CisKK30gLy8gbWFpbgorCisKKy8vIGVuZCBvZiBmaWxlIC8vCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rvb2xzL3JlcXVpcmVkLW9iamVjdHMucGwgYi9maW5hbC9ydW50aW1lL3Rvb2xzL3JlcXVpcmVkLW9iamVjdHMucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjM3OGIwOAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvcmVxdWlyZWQtb2JqZWN0cy5wbApAQCAtMCwwICsxLDYyOSBAQAorIyEvdXNyL2Jpbi9wZXJsCisKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIEZpbGU6Okdsb2IgIjpnbG9iIjsKK3VzZSBEYXRhOjpEdW1wZXI7CisKK3VzZSBGaW5kQmluOwordXNlIGxpYiAiJEZpbmRCaW46OkJpbi9saWIiOworCit1c2UgdG9vbHM7Cit1c2UgUGxhdGZvcm0gIjp2YXJzIjsKKworb3VyICRWRVJTSU9OID0gIjAuMDA0IjsKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTZXQgb2Ygb2JqZWN0czogICAgICAgIyBSZWYgdG8gaGFzaCwga2V5cyBhcmUgbmFtZXMgb2Ygb2JqZWN0cy4KKyMgICAgIG9iamVjdDA6ICAgICAgICAgICMgUmVmIHRvIGhhc2ggb2YgdHdvIGVsZW1lbnRzIHdpdGgga2V5cyAiZGVmaW5lZCIgYW5kICJ1bmRlZmluZWQiLgorIyAgICAgICAgIGRlZmluZWQ6ICAgICAgIyBSZWYgdG8gYXJyYXkgb2Ygc3ltYm9scyBkZWZpbmVkIGluIG9iamVjdDAuCisjICAgICAgICAgICAgIC0gc3ltYm9sMCAjIFN5bWJvbCBuYW1lLgorIyAgICAgICAgICAgICAtIC4uLgorIyAgICAgICAgIHVuZGVmaW5lZDogICAgIyBSZWYgdG8gYXJyYXkgb2Ygc3ltYm9scyByZWZlcmVuY2VkIGluIG9iamVjdDAuCisjICAgICAgICAgICAgIC0gc3ltYm9sMAorIyAgICAgICAgICAgICAtIC4uLgorIyAgICAgb2JqZWN0MToKKyMgICAgICAgICAuLi4KKyMgICAgIC4uLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNldCBvZiBzeW1ib2xzOiAgICAgICAjIFJlZiB0byBoYXNoLCBrZXlzIGFyZSBuYW1lcyBvZiBzeW1ib2xzLgorIyAgICBzeW1ib2wwOiAgICAgICAgICAgIyBSZWYgdG8gYXJyYXkgb2Ygb2JqZWN0IG5hbWVzIHdoZXJlIHRoZSBzeW1ib2wwIGlzIGRlZmluZWQuCisjICAgICAgICAtIG9iamVjdDAgICAgICAjIE9iamVjdCBmaWxlIG5hbWUuCisjICAgICAgICAtIC4uLgorIyAgICBzeW1ib2wxOgorIyAgICAgICAgLi4uCisjICAgIC4uLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdWIgZHVtcF9vYmplY3RzKCQkJCkgeworCisgICAgbXkgKCAkdGl0bGUsICRvYmplY3RzLCAkZHVtcCApID0gQF87CisKKyAgICBpZiAoICRkdW1wID4gMCApIHsKKyAgICAgICAgU1RERVJSLT5wcmludCggJHRpdGxlLCAiXG4iICk7CisgICAgICAgIGZvcmVhY2ggbXkgJG9iamVjdCAoIHNvcnQoIGtleXMoICUkb2JqZWN0cyApICkgKSB7CisgICAgICAgICAgICBTVERFUlItPnByaW50KCAiICAgICRvYmplY3RcbiIgKTsKKyAgICAgICAgICAgIGlmICggJGR1bXAgPiAxICkgeworICAgICAgICAgICAgICAgIFNUREVSUi0+cHJpbnQoICIgICAgICAgIERlZmluZWQgc3ltYm9sczpcbiIgKTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICRzeW1ib2wgKCBzb3J0KCBAeyAkb2JqZWN0cy0+eyAkb2JqZWN0IH0tPnsgZGVmaW5lZCB9IH0gKSApIHsKKyAgICAgICAgICAgICAgICAgICAgU1RERVJSLT5wcmludCggIiAgICAgICAgICAgICRzeW1ib2xcbiIgKTsKKyAgICAgICAgICAgICAgICB9OyAjIGZvcmVhY2ggJHN5bWJvbAorICAgICAgICAgICAgICAgIFNUREVSUi0+cHJpbnQoICIgICAgICAgIFVuZGVmaW5lZCBzeW1ib2xzOlxuIiApOworICAgICAgICAgICAgICAgIGZvcmVhY2ggbXkgJHN5bWJvbCAoIHNvcnQoIEB7ICRvYmplY3RzLT57ICRvYmplY3QgfS0+eyB1bmRlZmluZWQgfSB9ICkgKSB7CisgICAgICAgICAgICAgICAgICAgIFNUREVSUi0+cHJpbnQoICIgICAgICAgICAgICAkc3ltYm9sXG4iICk7CisgICAgICAgICAgICAgICAgfTsgIyBmb3JlYWNoICRzeW1ib2wKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfTsgIyBmb3JlYWNoICRvYmplY3QKKyAgICB9OyAjIGlmCisKK307ICMgc3ViIGR1bXBfb2JqZWN0cworCitzdWIgZHVtcF9zeW1ib2xzKCQkJCkgeworCisgICAgbXkgKCAkdGl0bGUsICRzeW1ib2xzLCAkZHVtcCApID0gQF87CisKKyAgICBpZiAoICRkdW1wID4gMCApIHsKKyAgICAgICAgU1RERVJSLT5wcmludCggJHRpdGxlLCAiXG4iICk7CisgICAgICAgIGZvcmVhY2ggbXkgJHN5bWJvbCAoIHNvcnQoIGtleXMoICUkc3ltYm9scyApICkgKSB7CisgICAgICAgICAgICBTVERFUlItPnByaW50KCAiICAgICRzeW1ib2xcbiIgKTsKKyAgICAgICAgICAgIGlmICggJGR1bXAgPiAxICkgeworICAgICAgICAgICAgICAgIGZvcmVhY2ggbXkgJG9iamVjdCAoIHNvcnQoIEB7ICRzeW1ib2xzLT57ICRzeW1ib2wgfSB9ICkgKSB7CisgICAgICAgICAgICAgICAgICAgIFNUREVSUi0+cHJpbnQoICIgICAgICAgICRvYmplY3RcbiIgKTsKKyAgICAgICAgICAgICAgICB9OyAjIGZvcmVhY2gKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfTsgIyBmb3JlYWNoICRvYmplY3QKKyAgICB9OyAjIGlmCisKK307ICMgc3ViIGR1bXBfc3ltYm9scworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE5hbWU6CisjICAgICBsb2FkX3N5bWJvbHMgLS0gRnVsZmlsbCBvYmplY3RzIGRhdGEgc3RydWN0dXJlIHdpdGggc3ltYm9sIG5hbWVzLgorIyBTeW5vcHNpczoKKyMgICAgIGxvYWRfc3ltYm9scyggJG9iamVjdHMgKTsKKyMgQXJndW1lbnRzOgorIyAgICAgJG9iamVjdHMgKGluL291dCkgLS0gU2V0IG9mIG9iamVjdHMuIE9uIGVudGVyLCBpdCBpcyBleHBlY3RlZCB0aGF0IHRvcC1sZXZlbCBoYXNoIGhhcyBmaWxsZWQKKyMgICAgICAgICB3aXRoIG9iamVjdCBuYW1lcyBvbmx5LiBPbiBleGl0LCBpdCBpcyBjb21wbGV0ZWx5IGZ1bGZpbGxlZCB3aXRoIGxpc3RzIG9mIHN5bWJvbHMKKyMgICAgICAgICBkZWZpbmVkIG9yIHJlZmVyZW5jZWQgaW4gZWFjaCBvYmplY3QgZmlsZS4KKyMgUmV0dXJuczoKKyMgICAgIE5vdGhpbmcuCisjIEV4YW1wbGU6CisjICAgICBteSAkb2JqZWN0cyA9IHsgZm9vLm8gPT4ge30gfTsKKyMgICAgIGxvYWRfc3ltYm9scyggJG9iamVjdHMgKTsKKyMgICAgICMgTm93ICRvYmplY3RzIGlzIHsgZ29vLm8gPT4geyBkZWZpbmVkID0+IFsgLi4uIF0sIHVuZGVmaW5lZCA9PiBbIC4uLiBdIH0gfS4KKyMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGhpcyB2ZXJzaW9uIG9mIGxvYWRfc3ltYm9scyBwYXJzZXMgb3V0cHV0IG9mIG5tIGNvbW1hbmQgYW5kIHdvcmtzIG9uIExpbnV4KiBPUyBhbmQgT1MgWCouCisjCitzdWIgX2xvYWRfc3ltYm9sc19ubSgkKSB7CisKKyAgICBteSAkb2JqZWN0cyA9IHNoaWZ0KCBAXyApOworICAgICAgICAjIEl0IGlzIGEgcmVmIHRvIGhhc2guIEtleXMgYXJlIG9iamVjdCBuYW1lcywgdmFsdWVzIGFyZSBlbXB0eSBoYXNoZXMgKGZvciBub3cpLgorICAgIG15IEBidWxrOworCisgICAgaWYgKCAlJG9iamVjdHMgKSB7CisgICAgICAgICMgRG8gbm90IHJ1biBubSBpZiBhIHNldCBvZiBvYmplY3RzIGlzIGVtcHR5IC0tIG5tIHdpbGwgdHJ5IHRvIG9wZW4gYS5vdXQgaW4gdGhpcyBjYXNlLgorICAgICAgICBleGVjdXRlKAorICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICJubSIsCisgICAgICAgICAgICAgICAgIi1nIiwgICAgIyBEaXNwbGF5IG9ubHkgZXh0ZXJuYWwgKGdsb2JhbCkgc3ltYm9scy4KKyAgICAgICAgICAgICAgICAiLW8iLCAgICAjIFByZWNlZGUgZWFjaCBzeW1ib2wgYnkgdGhlIG5hbWUgb2YgdGhlIGlucHV0IGZpbGUuCisgICAgICAgICAgICAgICAga2V5cyggJSRvYmplY3RzICkKKyAgICAgICAgICAgICAgICAgICAgIyBSdW5uaW5nIG5tIG9uY2UgKHJhdGhlciB0aGFuIG9uY2UgcGVyIG9iamVjdCkgaW1wcm92ZXMgcGVyZm9ybWFuY2UKKyAgICAgICAgICAgICAgICAgICAgIyBkcmFzdGljYWxseS4KKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAtc3Rkb3V0ID0+IFxAYnVsaworICAgICAgICApOworICAgIH07ICMgaWYKKworICAgIGZvcmVhY2ggbXkgJGxpbmUgKCBAYnVsayApIHsKKyAgICAgICAgaWYgKCAkbGluZSAhfiBte14oLiopOig/OiA/WzAtOWEtZl0qfCAqKSAoW0EtWmEtel0pICguKikkfSApIHsKKyAgICAgICAgICAgIGRpZSAiQ2Fubm90IHBhcnNlIG5tIG91dHB1dCwgbGluZTpcbiAgICAkbGluZVxuIjsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBteSAoICRmaWxlLCAkdGFnLCAkc3ltYm9sICkgPSAoICQxLCAkMiwgJDMgKTsKKyAgICAgICAgaWYgKCBub3QgZXhpc3RzKCAkb2JqZWN0cy0+eyAkZmlsZSB9ICkgKSB7CisgICAgICAgICAgICBkaWUgIm5tIHJlcG9ydGVkIHVua25vd24gb2JqZWN0IGZpbGU6XG4gICAgJGxpbmVcbiI7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgIyBBQzogZXhjbHVkZSBzb21lIGxpYmMgc3ltYm9scyBmcm9tIHJlbmFtaW5nLCBvdGhlcndpc2Ugd2UgaGF2ZSBwcm9ibGVtcworICAgICAgICAjICAgICBpbiB0ZXN0cyBmb3IgZ2ZvcnRyYW4gKyBzdGF0aWMgbGliaW9tcCBvbiBMaW5fMzIuCisgICAgICAgICMgICAgIFRoZXNlIHN5bWJvbHMgY2FtZSBmcm9tIGxpYnRiYm1hbGxvYy5hCisgICAgICAgIGlmICggJHRhcmdldF9vcyBlcSAibGluIiApIHsKKyAgICAgICAgICAgIGlmICggJHN5bWJvbCA9fiBte19faTY4Nn0gKSB7CisgICAgICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAjIEFDOiBhZGRlZCAidyIgdG8gdGFncyBvZiB1bmRlZmluZWQgc3ltYm9scywgZS5nLiBtYWxsb2MgaXMgd2VhayBpbiBsaWJpcmMgdjEyLjEuCisgICAgICAgIGlmICggJHRhZyBlcSAiVSIgb3IgJHRhZyBlcSAidyIgKSB7ICMgU3ltYm9sIG5vdCBkZWZpbmVkLgorICAgICAgICAgICAgcHVzaCggQHsgJG9iamVjdHMtPnsgJGZpbGUgfS0+eyB1bmRlZmluZWQgfSB9LCAkc3ltYm9sICk7CisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICMgU3ltYm9sIGRlZmluZWQuCisgICAgICAgICAgICBwdXNoKCBAeyAkb2JqZWN0cy0+eyAkZmlsZSB9LT57IGRlZmluZWQgfSB9LCAkc3ltYm9sICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGZvcmVhY2gKKworICAgIHJldHVybiB1bmRlZjsKKworfTsgIyBzdWIgX2xvYWRfc3ltYm9sc19ubQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRoaXMgdmVyc2lvbiBvZiBsb2FkX3N5bWJvbHMgcGFyc2VzIG91dHB1dCBvZiBsaW5rIGNvbW1hbmQgYW5kIHdvcmtzIG9uIFdpbmRvd3MqIE9TLgorIworc3ViIF9sb2FkX3N5bWJvbHNfbGluaygkKSB7CisKKyAgICBteSAkb2JqZWN0cyA9IHNoaWZ0KCBAXyApOworICAgICAgICAjIEl0IGlzIGEgcmVmIHRvIGhhc2guIEtleXMgYXJlIG9iamVjdCBuYW1lcywgdmFsdWVzIGFyZSBlbXB0eSBoYXNoZXMgKGZvciBub3cpLgorICAgIG15IEBidWxrOworCisgICAgaWYgKCAlJG9iamVjdHMgKSB7CisgICAgICAgICMgRG8gbm90IHJ1biBubSBpZiBhIHNldCBvZiBvYmplY3RzIGlzIGVtcHR5IC0tIG5tIHdpbGwgdHJ5IHRvIG9wZW4gYS5vdXQgaW4gdGhpcyBjYXNlLgorICAgICAgICBleGVjdXRlKAorICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICJsaW5rIiwKKyAgICAgICAgICAgICAgICAiL2R1bXAiLAorICAgICAgICAgICAgICAgICIvc3ltYm9scyIsCisgICAgICAgICAgICAgICAga2V5cyggJSRvYmplY3RzICkKKyAgICAgICAgICAgICAgICAgICAgIyBSdW5uaW5nIG5tIG9uY2UgKHJhdGhlciB0aGFuIG9uY2UgcGVyIG9iamVjdCkgaW1wcm92ZXMgcGVyZm9ybWFuY2UKKyAgICAgICAgICAgICAgICAgICAgIyBkcmFzdGljYWxseS4KKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAtc3Rkb3V0ID0+IFxAYnVsaworICAgICAgICApOworICAgIH07ICMgaWYKKworICAgIG15ICRudW1fcmUgICA9IHFye1swLTlBLUZdezMsNH19OworICAgIG15ICRhZGRyX3JlICA9IHFye1swLTlBLUZdezh9fTsKKyAgICBteSAkdGFnX3JlICAgPSBxcntERUJVR3xBQlN8VU5ERUZ8U0VDVFswLTlBLUZdK307CisgICAgbXkgJGNsYXNzX3JlID0gcXJ7U3RhdGljfEV4dGVybmFsfEZpbGVuYW1lfExhYmVsfEJlZ2luRnVuY3Rpb258RW5kRnVuY3Rpb258V2Vha0V4dGVybmFsfFwuYmYgb3JcLmVmfTsKKworICAgIG15ICRmaWxlOworICAgIGZvcmVhY2ggbXkgJGxpbmUgKCBAYnVsayApIHsKKyAgICAgICAgaWYgKCAkbGluZSA9fiBte1xBRHVtcCBvZiBmaWxlICguKj8pXG5cen0gKSB7CisgICAgICAgICAgICAkZmlsZSA9ICQxOworICAgICAgICAgICAgaWYgKCBub3QgZXhpc3RzKCAkb2JqZWN0cy0+eyAkZmlsZSB9ICkgKSB7CisgICAgICAgICAgICAgICAgZGllICJsaW5rIHJlcG9ydGVkIHVua25vd24gb2JqZWN0IGZpbGU6XG4gICAgJGxpbmVcbiI7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte1xBJG51bV9yZSB9ICkgeworICAgICAgICAgICAgaWYgKCBub3QgZGVmaW5lZCggJGZpbGUgKSApIHsKKyAgICAgICAgICAgICAgICBkaWUgImxpbmsgcmVwb3J0ZWQgc3ltYm9sIG9mIHVua25vd24gb2JqZWN0IGZpbGU6XG4gICAgJGxpbmVcbiI7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICBpZiAoICRsaW5lICF+IG17XEEkbnVtX3JlICRhZGRyX3JlICgkdGFnX3JlKVxzK25vdHlwZSg/OiBcKFwpKT9ccysoJGNsYXNzX3JlKVxzK1x8ICguKj8pXG5cen0gKSB7CisgICAgICAgICAgICAgICAgZGllICJDYW5ub3QgcGFyc2UgbGluayBvdXRwdXQsIGxpbmU6XG4gICAgJGxpbmVcbiI7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICBteSAoICR0YWcsICRjbGFzcywgJHN5bWJvbCApID0gKCAkMSwgJDIsICQzICk7CisgICAgICAgICAgICAjIGxpbmsuZXhlIC9kdW1wIHNvbWV0aW1lcyBwcmludHMgY29tbWVudHMgZm9yIHN5bWJvbHMsIGUuIGcuOgorICAgICAgICAgICAgIyAiLj8wX21lbWNvcHlBIChbRW50cnldID8wX21lbWNvcHlBKSIsIG9yICI/P19DQF8wMUFAcj8kQUFAIChgc3RyaW5nJykiLgorICAgICAgICAgICAgIyBTdHJpcCB0aGVzZSBjb21tZW50cy4KKyAgICAgICAgICAgICRzeW1ib2wgPX4gc3sgXCguKlwpXHp9e307CisgICAgICAgICAgICBpZiAoICRjbGFzcyBlcSAiRXh0ZXJuYWwiICkgeworICAgICAgICAgICAgICAgIGlmICggJHRhZyBlcSAiVU5ERUYiICkgeyAjIFN5bWJvbCBub3QgZGVmaW5lZC4KKyAgICAgICAgICAgICAgICAgICAgcHVzaCggQHsgJG9iamVjdHMtPnsgJGZpbGUgfS0+eyB1bmRlZmluZWQgfSB9LCAkc3ltYm9sICk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICMgU3ltYm9sIGRlZmluZWQuCisgICAgICAgICAgICAgICAgICAgIHB1c2goIEB7ICRvYmplY3RzLT57ICRmaWxlIH0tPnsgZGVmaW5lZCB9IH0sICRzeW1ib2wgKTsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAjIElnbm9yZSBhbGwgb3RoZXIgbGluZXMuCisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGZvcmVhY2gKKworICAgIHJldHVybiB1bmRlZjsKKworfTsgIyBzdWIgX2xvYWRfc3ltYm9sc19saW5rCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTmFtZToKKyMgICAgIHN5bWJvbHMgLS0gQ29uc3RydWN0IHNldCBvZiBzeW1ib2xzIHdpdGggc3BlY2lmaWVkIHRhZyBpbiB0aGUgc3BlY2lmaWVkIHNldCBvZiBvYmplY3RzLgorIyBTeW5vcHNpczoKKyMgICAgIG15ICRzeW1ib2xzID0gZGVmaW5lZF9zeW1ib2xzKCAkb2JqZWN0cywgJHRhZyApOworIyBBcmd1bWVudHM6CisjICAgICAkb2JqZWN0cyAoaW4pIC0tIFNldCBvZiBvYmplY3RzLgorIyAgICAgJHRhZyAoaW4pIC0tIEEgdGFnLCAiZGVmaW5lZCIgb3IgInVuZGVmaW5lZCIuCisjIFJldHVybnM6CisjICAgICBTZXQgb2Ygc3ltYm9scyB3aXRoIHRoZSBzcGVjaWZpZWQgdGFnLgorIworc3ViIHN5bWJvbHMoJCQpIHsKKworICAgIG15ICRvYmplY3RzID0gc2hpZnQoIEBfICk7CisgICAgbXkgJHRhZyAgICAgPSBzaGlmdCggQF8gKTsKKworICAgIG15ICRzeW1ib2xzID0ge307CisKKyAgICBmb3JlYWNoIG15ICRvYmplY3QgKCBrZXlzKCAlJG9iamVjdHMgKSApIHsKKyAgICAgICAgZm9yZWFjaCBteSAkc3ltYm9sICggQHsgJG9iamVjdHMtPnsgJG9iamVjdCB9LT57ICR0YWcgfSB9ICkgeworICAgICAgICAgICAgcHVzaCggQHsgJHN5bWJvbHMtPnsgJHN5bWJvbCB9IH0sICRvYmplY3QgKTsKKyAgICAgICAgfTsgIyBmb3JlYWNoICRzeW1ib2wKKyAgICB9OyAjIGZvcmVhY2ggJG9iamVjdAorCisgICAgcmV0dXJuICRzeW1ib2xzOworCit9OyAjIHN1YiBzeW1ib2xzCisKK3N1YiBkZWZpbmVkX3N5bWJvbHMoJCkgeworCisgICAgbXkgJG9iamVjdHMgPSBzaGlmdCggQF8gKTsKKyAgICBteSAkZGVmaW5lZCA9IHN5bWJvbHMoICRvYmplY3RzLCAiZGVmaW5lZCIgKTsKKyAgICByZXR1cm4gJGRlZmluZWQ7CisKK307ICMgc3ViIGRlZmluZWRfc3ltYm9scworCitzdWIgdW5kZWZpbmVkX3N5bWJvbHMoJCkgeworCisgICAgbXkgJG9iamVjdHMgPSBzaGlmdCggQF8gKTsKKyAgICBteSAkZGVmaW5lZCA9IHN5bWJvbHMoICRvYmplY3RzLCAiZGVmaW5lZCIgKTsKKyAgICBteSAkdW5kZWZpbmVkID0gc3ltYm9scyggJG9iamVjdHMsICJ1bmRlZmluZWQiICk7CisgICAgZm9yZWFjaCBteSAkc3ltYm9sICgga2V5cyggJSRkZWZpbmVkICkgKSB7CisgICAgICAgIGRlbGV0ZSggJHVuZGVmaW5lZC0+eyAkc3ltYm9sIH0gKTsKKyAgICB9OyAjIGZvcmVhY2ggc3ltYm9sCisgICAgcmV0dXJuICR1bmRlZmluZWQ7CisKK307ICMgc3ViIHVuZGVmaW5lZF9zeW1ib2xzCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTmFtZToKKyMgICAgIF9yZXF1aXJlZF9leHRyYV9vYmplY3RzIC0tIFNlbGVjdCBhIHN1YnNldCBvZiBleHRyYSBvYmplY3RzIHJlcXVpcmVkIHRvIHJlc29sdmUgdW5kZWZpbmVkCisjICAgICAgICAgc3ltYm9scyBpbiBhIHNldCBvZiBvYmplY3RzLiBJdCBpcyBhIGhlbHBlciBzdWIgZm9yIHJlcXVpcmVkX2V4dHJhX29iamVjdHMoKS4KKyMgU3lub3BzaXM6CisjICAgICBteSAkcmVxdWlyZWQgPSBfcmVxdWlyZWRfZXh0cmFfb2JqZWN0cyggJG9iamVjdHMsICRleHRyYSwgJHN5bWJvbHMgKTsKKyMgQXJndW1lbnRzOgorIyAgICAgJG9iamVjdHMgKGluKSAtLSBBIHNldCBvZiBvYmplY3RzIHRvIGJlIHNlYXJjaGVkIGZvciB1bmRlZmluZWQgc3ltYm9scy4KKyMgICAgICRleHRyYSAoaW4pIC0tIEEgc2V0IG9mIGV4dHJhIG9iamVjdHMgdG8gYmUgc2VhcmNoZWQgZm9yIGRlZmluZWQgc3ltYm9scyB0byByZXNvbHZlIHVuZGVmaW5lZAorIyAgICAgICAgIHN5bWJvbHMgaW4gb2JqZWN0cy4KKyMgICAgICRzeW1ib2xzIChpbi9vdXQpIC0tIFNldCBvZiBzeW1ib2xzIGRlZmluZWQgaW4gdGhlIHNldCBvZiBleHRlcm5hbCBvYmplY3RzLiBBdCB0aGUgZmlyc3QgY2FsbAorIyAgICAgICAgIGl0IHNob3VsZCBjb25zaXN0IG9mIGFsbCB0aGUgc3ltYm9scyBkZWZpbmVkIGluIGFsbCB0aGUgZXh0cmEgb2JqZWN0cy4gU3ltYm9scyBkZWZpbmVkIGluCisjICAgICAgICAgdGhlIHNlbGVjdGVkIHN1YnNldCBvZiBleHRyYSBvYmplY3RzIGFyZSByZW1vdmVkIGZyb20gc2V0IG9mIGRlZmluZWQgc3ltYm9scywgYmVjYXVzZQorIyAgICAgICAgIHRoZXkgYXJlIG91dCBvZiBpbnRlcmVzdCBmb3Igc3Vic2VxdWVudCBjYWxscy4KKyMgUmV0dXJuczoKKyMgICAgIEEgc3Vic2V0IG9mIGV4dHJhIG9iamVjdHMgcmVxdWlyZWQgYnkgdGhlIHNwZWNpZmllZCBzZXQgb2Ygb2JqZWN0cy4KKyMKK3N1YiBfcmVxdWlyZWRfZXh0cmFfb2JqZWN0cygkJCQkKSB7CisKKyAgICBteSAkb2JqZWN0cyA9IHNoaWZ0KCBAXyApOworICAgIG15ICRleHRyYSAgID0gc2hpZnQoIEBfICk7CisgICAgbXkgJHN5bWJvbHMgPSBzaGlmdCggQF8gKTsKKyAgICBteSAkZHVtcCAgICA9IHNoaWZ0KCBAXyApOworCisgICAgbXkgJHJlcXVpcmVkID0ge307CisKKyAgICBpZiAoICRkdW1wID4gMCApIHsKKyAgICAgICAgU1RERVJSLT5wcmludCggIlJlcXVpcmVkIGV4dHJhIG9iamVjdHM6XG4iICk7CisgICAgfTsgIyBpZgorICAgIGZvcmVhY2ggbXkgJG9iamVjdCAoIGtleXMoICUkb2JqZWN0cyApICkgeworICAgICAgICBmb3JlYWNoIG15ICRzeW1ib2wgKCBAeyAkb2JqZWN0cy0+eyAkb2JqZWN0IH0tPnsgdW5kZWZpbmVkIH0gfSApIHsKKyAgICAgICAgICAgIGlmICggZXhpc3RzKCAkc3ltYm9scy0+eyAkc3ltYm9sIH0gKSApIHsKKyAgICAgICAgICAgICAgICAjIEFkZCBhbGwgb2JqZWN0cyB3aGVyZSB0aGUgc3ltYm9sIGlzIGRlZmluZWQgdG8gdGhlIHJlcXVpcmVkIG9iamVjdHMuCisgICAgICAgICAgICAgICAgZm9yZWFjaCBteSAkcmVxX29iaiAoIEB7ICRzeW1ib2xzLT57ICRzeW1ib2wgfSB9ICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoICRkdW1wID4gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNUREVSUi0+cHJpbnQoICIgICAgJHJlcV9vYmpcbiIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJGR1bXAgPiAxICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUREVSUi0+cHJpbnQoICIgICAgICAgIGJ5ICRvYmplY3RcbiIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVERFUlItPnByaW50KCAiICAgICAgICAgICAgZHVlIHRvICRzeW1ib2xcbiIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgICAgICAkcmVxdWlyZWQtPnsgJHJlcV9vYmogfSA9ICRleHRyYS0+eyAkcmVxX29iaiB9OworICAgICAgICAgICAgICAgIH07ICMgZm9yZWFjaCAkcmVxX29iagorICAgICAgICAgICAgICAgICMgRGVsZXRlIHRoZSBzeW1ib2wgZnJvbSBsaXN0IG9mIGRlZmluZWQgc3ltYm9scy4KKyAgICAgICAgICAgICAgICBkZWxldGUoICRzeW1ib2xzLT57ICRzeW1ib2wgfSApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9OyAjIGZvcmVhY2ggJHN5bWJvbAorICAgIH07ICMgZm9yZWFjaCAkb2JqZWN0CisKKyAgICByZXR1cm4gJHJlcXVpcmVkOworCit9OyAjIHN1YiBfcmVxdWlyZWRfZXh0cmFfb2JqZWN0cworCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTmFtZToKKyMgICAgIHJlcXVpcmVkX2V4dHJhX29iamVjdHMgLS0gU2VsZWN0IGEgc3Vic2V0IG9mIGV4dHJhIG9iamVjdHMgcmVxdWlyZWQgdG8gcmVzb2x2ZSB1bmRlZmluZWQKKyMgICAgICAgICBzeW1ib2xzIGluIGEgc2V0IG9mIGJhc2Ugb2JqZWN0cyBhbmQgc2VsZWN0ZWQgZXh0cmEgb2JqZWN0cy4KKyMgU3lub3BzaXM6CisjICAgICBteSAkcmVxdWlyZWQgPSByZXF1aXJlZF9leHRyYV9vYmplY3RzKCAkYmFzZSwgJGV4dHJhICk7CisjIEFyZ3VtZW50czoKKyMgICAgICRiYXNlIChpbi9vdXQpIC0tIEEgc2V0IG9mIGJhc2Ugb2JqZWN0cyB0byBiZSBzZWFyY2hlZCBmb3IgdW5kZWZpbmVkIHN5bWJvbHMuIE9uIGVudGVyLCBpdCBpcworIyAgICAgICAgIGV4cGVjdGVkIHRoYXQgdG9wLWxldmVsIGhhc2ggaGFzIGZpbGxlZCB3aXRoIG9iamVjdCBuYW1lcyBvbmx5LiBPbiBleGl0LCBpdCBpcyBjb21wbGV0ZWx5CisjICAgICAgICAgZnVsZmlsbGVkIHdpdGggbGlzdHMgb2Ygc3ltYm9scyBkZWZpbmVkIGFuZC9vciByZWZlcmVuY2VkIGluIGVhY2ggb2JqZWN0IGZpbGUuCisjICAgICAkZXh0cmEgKGluL291dCkgLS0gQSBzZXQgb2YgZXh0cmEgb2JqZWN0cyB0byBiZSBzZWFyY2hlZCBmb3IgZGVmaW5lZCBzeW1ib2xzIHJlcXVpcmVkIHRvCisjICAgICAgICAgcmVzb2x2ZSB1bmRlZmluZWQgc3ltYm9scyBpbiBhIHNldCBvZiBiYXNlIG9iamVjdHMuIFVzYWdlIGlzIHNpbWlsYXIgdG8gYmFzZSBvYmplY3RzLgorIyBSZXR1cm5zOgorIyAgICAgQSBzdWJzZXQgb2YgZXh0cmEgb2JqZWN0IGZpbGVzLgorIworc3ViIHJlcXVpcmVkX2V4dHJhX29iamVjdHMoJCQkKSB7CisKKyAgICBteSAkYmFzZSAgICA9IHNoaWZ0KCBAXyApOworICAgIG15ICRleHRyYSAgID0gc2hpZnQoIEBfICk7CisgICAgbXkgJGR1bXAgICAgPSBzaGlmdCggQF8gKTsKKworICAgICMgTG9hZCBzeW1ib2xzIGZvciBlYWNoIG9iamVjdC4KKyAgICBsb2FkX3N5bWJvbHMoICRiYXNlICk7CisgICAgbG9hZF9zeW1ib2xzKCAkZXh0cmEgKTsKKyAgICBpZiAoICRkdW1wICkgeworICAgICAgICBkdW1wX29iamVjdHMoICJCYXNlIG9iamVjdHM6IiwgJGJhc2UsICRkdW1wICk7CisgICAgICAgIGR1bXBfb2JqZWN0cyggIkV4dHJhIG9iamVjdHM6IiwgJGV4dHJhLCAkZHVtcCApOworICAgIH07ICMgaWYKKworICAgICMgQ29sbGVjdCBzeW1ib2xzIGRlZmluZWQgaW4gZXh0cmEgb2JqZWN0cy4KKyAgICBteSAkc3ltYm9scyA9IGRlZmluZWRfc3ltYm9scyggJGV4dHJhICk7CisKKyAgICBteSAkcmVxdWlyZWQgPSB7fTsKKyAgICAjIFNlbGVjdCBleHRyYSBvYmplY3RzIHJlcXVpcmVkIGJ5IGJhc2Ugb2JqZWN0cy4KKyAgICBteSAkZGVsdGEgPSBfcmVxdWlyZWRfZXh0cmFfb2JqZWN0cyggJGJhc2UsICRleHRyYSwgJHN5bWJvbHMsICRkdW1wICk7CisgICAgd2hpbGUgKCAlJGRlbHRhICkgeworICAgICAgICAlJHJlcXVpcmVkID0gKCAlJHJlcXVpcmVkLCAlJGRlbHRhICk7CisgICAgICAgICMgUHJvYmFibHksIGp1c3Qgc2VsZWN0ZWQgb2JqZWN0cyByZXF1aXJlIHNvbWUgbW9yZSBvYmplY3RzLgorICAgICAgICAkZGVsdGEgPSBfcmVxdWlyZWRfZXh0cmFfb2JqZWN0cyggJGRlbHRhLCAkZXh0cmEsICRzeW1ib2xzLCAkZHVtcCApOworICAgIH07ICMgd2hpbGUKKworICAgIGlmICggJGR1bXAgKSB7CisgICAgICAgIG15ICRiYXNlX3VuZGVmaW5lZCA9IHVuZGVmaW5lZF9zeW1ib2xzKCAkYmFzZSApOworICAgICAgICBteSAkcmVxX3VuZGVmaW5lZCA9IHVuZGVmaW5lZF9zeW1ib2xzKCAkcmVxdWlyZWQgKTsKKyAgICAgICAgZHVtcF9zeW1ib2xzKCAiU3ltYm9scyB1bmRlZmluZWQgaW4gYmFzZSBvYmplY3RzOiIsICRiYXNlX3VuZGVmaW5lZCwgJGR1bXAgKTsKKyAgICAgICAgZHVtcF9zeW1ib2xzKCAiU3ltYm9scyB1bmRlZmluZWQgaW4gcmVxdWlyZWQgb2JqZWN0czoiLCAkcmVxX3VuZGVmaW5lZCwgJGR1bXAgKTsKKyAgICB9OyAjIGlmCisKKyAgICByZXR1cm4gJHJlcXVpcmVkOworCit9OyAjIHN1YiByZXF1aXJlZF9leHRyYV9vYmplY3RzCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBOYW1lOgorIyAgICAgY29weV9vYmplY3RzIC0tIENvcHkgKGFuZCBvcHRpb25hbGx5IGVkaXQpIG9iamVjdCBmaWxlcyB0byBzcGVjaWZpZWQgZGlyZWN0b3J5LgorIyBTeW5vcHNpczoKKyMgICAgIGNvcHlfb2JqZWN0cyggJG9iamVjdHMsICR0YXJnZXQsICRwcmVmaXgsIEBzeW1ib2xzICk7CisjIEFyZ3VtZW50czoKKyMgICAgICRvYmplY3RzIChpbikgLS0gQSBzZXQgb2Ygb2JqZWN0IGZpbGVzLgorIyAgICAgJHRhcmdldCAoaW4pIC0tIEEgbmFtZSBvZiB0YXJnZXQgZGlyZWN0b3J5LiBEaXJlY3RvcnkgbXVzdCBleGlzdC4KKyMgICAgICRwcmVmaXggKGluKSAtLSBBIHByZWZpeCB0byBhZGQgdG8gYWxsIHRoZSBzeW1ib2xzIGxpc3RlZCBpbiBAc3ltYm9scy4gSWYgcHJlZml4IGlzIHVuZGVmaW5lZCwKKyMgICAgICAgICBvYmplY3QgZmlsZXMgYXJlIGp1c3QgY29waWVkLgorIyAgICAgQHN5bWJvbHMgKGluKSAtLSBMaXN0IG9mIHN5bWJvbCBuYW1lcyB0byBiZSByZW5hbWVkLgorIyBSZXR1cm5zOgorIyAgICAgTm9uZS4KKyMKK3N1YiBjb3B5X29iamVjdHMoJCQ7JFxAKSB7CisKKyAgICBteSAkb2JqZWN0cyA9IHNoaWZ0KCBAXyApOworICAgIG15ICR0YXJnZXQgID0gc2hpZnQoIEBfICk7CisgICAgbXkgJHByZWZpeCAgPSBzaGlmdCggQF8gKTsKKyAgICBteSAkc3ltYm9scyA9IHNoaWZ0KCBAXyApOworICAgIG15IEByZWRlZmluZTsKKyAgICBteSBAcmVkZWZpbmVfOworICAgIG15ICRzeW1zX2ZpbGUgPSAiX19rbXBfc3ltX3BhaXJzLmxvZyI7CisKKyAgICBpZiAoIG5vdCAtZSAkdGFyZ2V0ICkgeworICAgICAgICBkaWUgIlwiJHRhcmdldFwiIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdFxuIjsKKyAgICB9OyAjIGlmCisgICAgaWYgKCBub3QgLWQgJHRhcmdldCApIHsKKyAgICAgICAgZGllICJcIiR0YXJnZXRcIiBpcyBub3QgYSBkaXJlY3RvcnlcbiI7CisgICAgfTsgIyBpZgorCisgICAgaWYgKCBkZWZpbmVkKCAkcHJlZml4ICkgYW5kIEAkc3ltYm9scyApIHsKKyAgICAgICAgbXkgJWEgPSBtYXAgKCAoICIkXyAkcHJlZml4JF8iID0+IDEgKSwgQCRzeW1ib2xzICk7CisgICAgICAgIEByZWRlZmluZV8gPSBrZXlzKCAlYSApOworICAgIH07ICMgaWYKKyAgICBmb3JlYWNoIG15ICRsaW5lICggQHJlZGVmaW5lXyApIHsKKyAgICAgICAgJGxpbmUgPX4gc3skcHJlZml4KFxXKyl9eyQxJHByZWZpeH07CisgICAgICAgIHB1c2goIEByZWRlZmluZSwgJGxpbmUgKTsKKyAgICB9CisgICAgd3JpdGVfZmlsZSggJHN5bXNfZmlsZSwgXEByZWRlZmluZSApOworICAgIGZvcmVhY2ggbXkgJHNyYyAoIHNvcnQoIGtleXMoICUkb2JqZWN0cyApICkgKSB7CisgICAgICAgIG15ICRkc3QgPSBjYXRfZmlsZSggJHRhcmdldCwgZ2V0X2ZpbGUoICRzcmMgKSApOworICAgICAgICBpZiAoIEByZWRlZmluZSApIHsKKyAgICAgICAgICAgIGV4ZWN1dGUoIFsgIm9iamNvcHkiLCAiLS1yZWRlZmluZS1zeW1zIiwgJHN5bXNfZmlsZSwgJHNyYywgJGRzdCBdICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb3B5X2ZpbGUoICRzcmMsICRkc3QsIC1vdmVyd3JpdGUgPT4gMSApOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBmb3JlYWNoICRvYmplY3QKKworfTsgIyBzdWIgY29weV9vYmplY3RzCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBNYWluLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitteSAkYmFzZSAgPSB7fTsKK215ICRleHRyYSA9IHt9OworbXkgJHN3aXRjaGVyID0gJGJhc2U7CitteSAkZHVtcCA9IDA7CitteSAkcHJpbnRfYmFzZTsKK215ICRwcmludF9leHRyYTsKK215ICRjb3B5X2Jhc2U7CitteSAkY29weV9leHRyYTsKK215ICRwcmVmaXg7CisKKyMgUGFyc2UgY29tbWFuZCBsaW5lLgorCitHZXRvcHQ6Okxvbmc6OkNvbmZpZ3VyZSggInBlcm11dGUiICk7CitnZXRfb3B0aW9ucygKKyAgICBQbGF0Zm9ybTo6dGFyZ2V0X29wdGlvbnMoKSwKKyAgICAiYmFzZSIgICAgICAgICA9PiBzdWIgeyAkc3dpdGNoZXIgPSAkYmFzZTsgIH0sCisgICAgImV4dHJhIiAgICAgICAgPT4gc3ViIHsgJHN3aXRjaGVyID0gJGV4dHJhOyB9LAorICAgICJwcmludC1iYXNlIiAgID0+IFwkcHJpbnRfYmFzZSwKKyAgICAicHJpbnQtZXh0cmEiICA9PiBcJHByaW50X2V4dHJhLAorICAgICJwcmludC1hbGwiICAgID0+IHN1YiB7ICRwcmludF9iYXNlID0gMTsgJHByaW50X2V4dHJhID0gMTsgfSwKKyAgICAiY29weS1iYXNlPXMiICA9PiBcJGNvcHlfYmFzZSwKKyAgICAiY29weS1leHRyYT1zIiA9PiBcJGNvcHlfZXh0cmEsCisgICAgImNvcHktYWxsPXMiICAgPT4gc3ViIHsgJGNvcHlfYmFzZSA9ICRfWyAxIF07ICRjb3B5X2V4dHJhID0gJF9bIDEgXTsgfSwKKyAgICAiZHVtcCIgICAgICAgICA9PiBzdWIgeyArKyAkZHVtcDsgfSwKKyAgICAicHJlZml4PXMiICAgICA9PiBcJHByZWZpeCwKKyAgICAiPD4iICAgID0+CisgICAgICAgIHN1YiB7CisgICAgICAgICAgICBteSAkYXJnID0gJF9bIDAgXTsKKyAgICAgICAgICAgIG15IEBhcmdzOworICAgICAgICAgICAgaWYgKCAkXk8gZXEgIk1TV2luMzIiICkgeworICAgICAgICAgICAgICAgICMgV2luZG93cyogT1MgZG9lcyBub3QgZXhwYW5kIHdpbGRjYXJkcy4gRG8gaXQuLi4KKyAgICAgICAgICAgICAgICBAYXJncyA9IGJzZF9nbG9iKCAkYXJnICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEBhcmdzID0gKCAkYXJnICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICBmb3JlYWNoIG15ICRvYmplY3QgKCBAYXJncyApIHsKKyAgICAgICAgICAgICAgICBpZiAoIGV4aXN0cyggJGJhc2UtPnsgJG9iamVjdCB9ICkgb3IgZXhpc3RzKCAkZXh0cmEtPnsgJG9iamVjdCB9ICkgKSB7CisgICAgICAgICAgICAgICAgICAgIGRpZSAiT2JqZWN0IFwiJG9iamVjdFwiIGhhcyBhbHJlYWR5IGJlZW4gc3BlY2lmaWVkLlxuIjsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAgICAgJHN3aXRjaGVyLT57ICRvYmplY3QgfSA9IHsgZGVmaW5lZCA9PiBbXSwgdW5kZWZpbmVkID0+IFtdIH07CisgICAgICAgICAgICB9OyAjIGZvcmVhY2gKKyAgICAgICAgfSwKKyk7CitpZiAoIG5vdCAlJGJhc2UgKSB7CisgICAgY21kbGluZV9lcnJvciggIk5vIGJhc2Ugb2JqZWN0cyBzcGVjaWZpZWQiICk7Cit9OyAjIGlmCisKK2lmICggJHRhcmdldF9vcyBlcSAid2luIiApIHsKKyAgICAqbG9hZF9zeW1ib2xzID0gXCZfbG9hZF9zeW1ib2xzX2xpbms7Cit9IGVsc2lmICggJHRhcmdldF9vcyBlcSAibGluIiBvciAkdGFyZ2V0X29zIGVxICJscmIiICkgeworICAgICpsb2FkX3N5bWJvbHMgPSBcJl9sb2FkX3N5bWJvbHNfbm07Cit9IGVsc2lmICggJHRhcmdldF9vcyBlcSAibWFjIiApIHsKKyAgICAqbG9hZF9zeW1ib2xzID0gXCZfbG9hZF9zeW1ib2xzX25tOworfSBlbHNlIHsKKyAgICBydW50aW1lX2Vycm9yKCAiT1MgXCIkdGFyZ2V0X29zXCIgbm90IHN1cHBvcnRlZCIgKTsKK307ICMgaWYKKworIyBEbyB0aGUgd29yay4KKworbXkgJHJlcXVpcmVkID0gcmVxdWlyZWRfZXh0cmFfb2JqZWN0cyggJGJhc2UsICRleHRyYSwgJGR1bXAgKTsKK2lmICggJHByaW50X2Jhc2UgKSB7CisgICAgcHJpbnQoIG1hcCggIiRfXG4iLCBzb3J0KCBrZXlzKCAlJGJhc2UgKSApICkgKTsKK307ICMgaWYKK2lmICggJHByaW50X2V4dHJhICkgeworICAgIHByaW50KCBtYXAoICIkX1xuIiwgc29ydCgga2V5cyggJSRyZXF1aXJlZCApICkgKSApOworfTsgIyBpZgorbXkgQHN5bWJvbHM7CitpZiAoIGRlZmluZWQoICRwcmVmaXggKSApIHsKKyAgICBmb3JlYWNoIG15ICRvYmplY3QgKCBzb3J0KCBrZXlzKCAlJHJlcXVpcmVkICkgKSApIHsKKyAgICAgICAgcHVzaCggQHN5bWJvbHMsIEB7ICRyZXF1aXJlZC0+eyAkb2JqZWN0IH0tPnsgZGVmaW5lZCB9IH0gKTsKKyAgICB9OyAjIGZvcmVhY2ggJG9iamVjdHMKK307ICMgaWYKK2lmICggJGNvcHlfYmFzZSApIHsKKyAgICBjb3B5X29iamVjdHMoICRiYXNlLCAkY29weV9iYXNlLCAkcHJlZml4LCBAc3ltYm9scyApOworfTsgIyBpZgoraWYgKCAkY29weV9leHRyYSApIHsKKyAgICBjb3B5X29iamVjdHMoICRyZXF1aXJlZCwgJGNvcHlfZXh0cmEsICRwcmVmaXgsIEBzeW1ib2xzICk7Cit9OyAjIGlmCisKK2V4aXQoIDAgKTsKKworX19FTkRfXworCis9cG9kCisKKz1oZWFkMSBOQU1FCisKK0I8cmVxdWlyZWQtb2JqZWN0cy5wbD4gLS0gU2VsZWN0IGEgcmVxdWlyZWQgZXh0cmEgb2JqZWN0IGZpbGVzLgorCis9aGVhZDEgU1lOT1BTSVMKKworQjxyZXF1aXJlZC1vYmplY3RzLnBsPiBJPG9wdGlvbj4uLi4gWy0tYmFzZV0gSTxmaWxlPi4uLiAtLWV4dHJhIEk8ZmlsZT4uLi4KKworPWhlYWQxIERFU0NSSVBUSU9OCisKK0I8cmVxdWlyZWQtb2JqZWN0cy5wbD4gd29ya3Mgd2l0aCB0d28gc2V0cyBvZiBvYmplY3QgZmlsZXMgLS0gYSBzZXQgb2YgSTxiYXNlPiBvYmplY3RzCithbmQgYSBzZXQgb2YgSTxleHRyYT4gb2JqZWN0cywgYW5kIHNlbGVjdHMgdGhvc2UgZXh0cmEgb2JqZWN0cyB3aGljaCBhcmUgcmVxdWlyZWQgZm9yIHJlc29sdmluZwordW5kZWZpbmVkIHN5bWJvbHMgaW4gYmFzZSBvYmplY3RzIEk8YW5kPiBzZWxlY3RlZCBleHRyYSBvYmplY3RzLgorCitTZWxlY3RlZCBvYmplY3QgZmlsZXMgbWF5IGJlIGNvcGllZCB0byBzcGVjaWZpZWQgbG9jYXRpb24gb3IgdGhlaXIgbmFtZXMgbWF5IGJlIHByaW50ZWQgdG8gc3Rkb3V0LAorYSBuYW1lIHBlciBsaW5lLiBBZGRpdGlvbmFsbHksIHN5bWJvbHMgZGVmaW5lZCBpbiBzZWxlY3RlZCBleHRyYSBvYmplY3RzIG1heSBiZSByZW5hbWVkLgorCitEZXBlbmRpbmcgb24gT1MsIGRpZmZlcmVudCBleHRlcm5hbCB0b29scyBtYXkgYmUgdXNlZC4gRm9yIGV4YW1wbGUsIEI8cmVxdWlyZWQtb2JqZWN0cy5wbD4gdXNlcworRjxsaW5rLmV4ZT4gb24gIndpbiIgYW5kIEY8bm0+IG9uICJsaW4iIGFuZCAibWFjIiBPU2VzLiBOb3JtYWxseSBPUyBpcyBhdXRvZGV0ZWN0ZWQsIGJ1dAorZGV0ZWN0aW9uIGNhbiBiZSBvdmVycmlkZWQgd2l0aCBCPC0tb3M+IG9wdGlvbi4gSXQgbWF5IGJlIGhlbHBmdWwgaW4gY3Jvc3MtYnVpbGQgZW52aXJvbm1lbnRzLgorCis9aGVhZDEgT1BUSU9OUworCis9b3ZlcgorCis9aXRlbSBCPC0tYmFzZT4KKworVGhlIGxpc3Qgb2YgYmFzZSBvYmplY3RzIGZvbGxvd3MgdGhpcyBvcHRpb24uCisKKz1pdGVtIEI8LS1leHRyYT4KKworTGlzdCBvZiBleHRyYSBvYmplY3RzIGZvbGxvd3MgdGhpcyBvcHRpb24uCisKKz1pdGVtIEI8LS1wcmludC1hbGw+CisKK1ByaW50IGxpc3Qgb2YgYmFzZSBvYmplY3RzIGFuZCBsaXN0IG9mIHJlcXVpcmVkIGV4dHJhIG9iamVjdHMuCisKKz1pdGVtIEI8LS1wcmludC1iYXNlPgorCitQcmludCBsaXN0IG9mIGJhc2Ugb2JqZWN0cy4KKworPWl0ZW0gQjwtLXByaW50LWV4dHJhPgorCitQcmludCBsaXN0IG9mIHNlbGVjdGVkIGV4dHJhIG9iamVjdHMuCisKKz1pdGVtIEI8LS1jb3B5LWFsbD0+STxkaXI+CisKK0NvcHkgYWxsIGJhc2UgYW5kIHNlbGVjdGVkIGV4dHJhIG9iamVjdHMgdG8gc3BlY2lmaWVkIGRpcmVjdG9yeS4gVGhlIGRpcmVjdG9yeSBtdXN0IGV4aXN0LiBFeGlzdGluZworZmlsZXMgYXJlIG92ZXJ3cml0dGVuLgorCis9aXRlbSBCPC0tY29weS1iYXNlPT5JPGRpcj4KKworQ29weSBhbGwgYmFzZSBvYmplY3RzIHRvIHNwZWNpZmllZCBkaXJlY3RvcnkuCisKKz1pdGVtIEI8LS1jb3B5LWV4dHJhPT5JPGRpcj4KKworQ29weSBzZWxlY3RlZCBleHRyYSBvYmplY3RzIHRvIHNwZWNpZmllZCBkaXJlY3RvcnkuCisKKz1pdGVtIEI8LS1wcmVmaXg9Pkk8c3RyPgorCitJZiBwcmVmaXggaXMgc3BlY2lmaWVkLCBjb3BpZWQgb2JqZWN0IGZpbGVzIGFyZSBlZGl0ZWQgLS0gc3ltYm9scyBkZWZpbmVkIGluIHNlbGVjdGVkIGV4dHJhCitvYmplY3QgZmlsZXMgYXJlIHJlbmFtZWQgKGluIGFsbCB0aGUgY29waWVkIG9iamVjdCBmaWxlcykgYnkgYWRkaW5nIHRoaXMgcHJlZml4LgorCitGPG9iamNvcHk+IHByb2dyYW0gc2hvdWxkIGJlIGF2YWlsYWJsZSBmb3IgcGVyZm9ybWluZyB0aGlzIG9wZXJhdGlvbi4KKworPWl0ZW0gQjwtLW9zPT5JPHN0cj4KKworU3BlY2lmeSBPUyBuYW1lLiBCeSBkZWZhdWx0IE9TIGlzIGF1dG9kZXRlY3RlZC4KKworRGVwZW5kaW5nIG9uIE9TLCBCPHJlcXVpcmVkLW9iamVjdHMucGw+IHVzZXMgZGlmZmVyZW50IGV4dGVybmFsIHRvb2xzLgorCis9aXRlbSBCPC0taGVscD4KKworUHJpbnQgc2hvcnQgaGVscCBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0tZG9jPgorCis9aXRlbSBCPC0tbWFudWFsPgorCitQcmludCBmdWxsIGRvY3VtZW50YXRpb24gYW5kIGV4aXQuCisKKz1pdGVtIEI8LS12ZXJzaW9uPgorCitQcmludCB2ZXJzaW9uIGFuZCBleGl0LgorCis9YmFjaworCis9aGVhZDEgQVJHVU1FTlRTCisKKz1vdmVyCisKKz1pdGVtIEk8ZmlsZT4KKworQSBuYW1lIG9mIG9iamVjdCBmaWxlLgorCis9YmFjaworCis9aGVhZDEgRVhBTVBMRVMKKworICAgICQgcmVxdWlyZWQtb2JqZWN0cy5wbCAtLWJhc2Ugb2JqLyoubyAtLWV4dHJhIC4uL2xpYi9vYmovKi5vIC0tcHJpbnQtZXh0cmEgPiByZXF1aXJlZC5sc3QKKyAgICAkIGFyIGNyIGxpYnguYSBvYmovKi5vICQoY2F0IHJlcXVpcmVkLmxzdCkKKworICAgICQgcmVxdWlyZWQtb2JqZWN0cy5wbCAtLWJhc2UgaW50ZXJuYWwvKi5vIC0tZXh0cmEgZXh0ZXJuYWwvKi5vIC0tcHJlZml4PV9feHl6XyAtLWNvcHktYWxsPW9iagorICAgICQgYXIgY3IgeHl6LmEgb2JqLyoubworCis9Y3V0CisKKyMgZW5kIG9mIGZpbGUgIworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rvb2xzL3NyYy9jb21tb24tY2hlY2tzLm1rIGIvZmluYWwvcnVudGltZS90b29scy9zcmMvY29tbW9uLWNoZWNrcy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTU5ZmM2Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90b29scy9zcmMvY29tbW9uLWNoZWNrcy5tawpAQCAtMCwwICsxLDk1IEBACisjIGNvbW1vbi1jaGVja3MubWsgIworCisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGhpcyBmaWxlIGNvbnRhaW5zIHJlYWxseSBjb21tb24gZGVmaW5pdGlvbnMgdXNlZCBieSBtdWx0aXBsZSBtYWtlZmlsZXMuIE1vZGlmeSBpdCBjYXJlZnVsbHkhCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMKKyMgQ2hlY2sgdG9vbHMgdmVyc2lvbnMuCisjCitpZmVxICIkKGNsZWFuKSIgIiIgICAgIyBEbyBub3QgY2hlY2sgdG9vbHMgaWYgY2xlYW4gZ29hbCBzcGVjaWZpZWQuCisKKyAgICBjaGVja190b29sc19mbGFncyA9IC0tbWFrZQorCisgICAgIyBkZXRlcm1pbmUgaWYgZm9ydHJhbiBjaGVjayBpcyByZXF1aXJlZCBmcm9tIGdvYWxzCisgICAgIyBNQUtFQ01ER09BTFMgaXMgbGlrZSBhcmd2IGZvciBnbnUgbWFrZQorICAgIGlmbmVxICIkKGZpbHRlciBtb2QgYWxsLCQoTUFLRUNNREdPQUxTKSkiICIiCisgICAgICAgIGNoZWNrX3Rvb2xzX2ZsYWdzICs9IC0tZm9ydHJhbgorICAgIGVsc2UKKyAgICAgICAgaWZlcSAiJChNQUtFQ01ER09BTFMpIiAiIiAjIHdpbGwgZGVmYXVsdCB0byBhbGwgaWYgbm8gZ29hbHMgc3BlY2lmaWVkIG9uIGNvbW1hbmQgbGluZQorICAgICAgICAgICAgY2hlY2tfdG9vbHNfZmxhZ3MgKz0gLS1mb3J0cmFuCisgICAgICAgIGVuZGlmCisgICAgZW5kaWYKKyAgICBpZm5lcSAiJChmaWx0ZXIgZ2NjIGNsYW5nLCQoYykpIiAiIiAjIGlmIGJ1aWxkIGNvbXBpbGVyIGlzIGdjYyBvciBjbGFuZworICAgICAgICBjaGVja190b29sc19mbGFncyArPSAtLW5vLWludGVsCisgICAgZW5kaWYKKyAgICBpZmVxICIkKGMpIiAiY2xhbmciCisgICAgICAgIGNoZWNrX3Rvb2xzX2ZsYWdzICs9IC0tY2xhbmcKKyAgICBlbmRpZgorCisgICAgY3Vycl90b29scyA6PSAkKHN0cmlwICQoc2hlbGwgJChwZXJsKSAkKHRvb2xzX2RpciljaGVjay10b29scy5wbCAkKG9hLW9wdHMpICQoY2hlY2tfdG9vbHNfZmxhZ3MpKSkKKworICAgIGlmZXEgIiQoY3Vycl90b29scykiICIiCisgICAgICAgICQoZXJyb3IgY2hlY2stdG9vbHMucGwgZmFpbGVkKQorICAgIGVuZGlmCisgICAgaWZuZXEgIiQoZmluZHN0cmluZyBOL0EsJChjdXJyX3Rvb2xzKSkiICIiCisgICAgICAgIG1pc3NlZF90b29scyA6PSAkKGZpbHRlciAlLS0tX04vQV8tLS0sJChjdXJyX3Rvb2xzKSkKKyAgICAgICAgbWlzc2VkX3Rvb2xzIDo9ICQoc3Vic3QgPS0tLV9OL0FfLS0tLCwkKG1pc3NlZF90b29scykpCisgICAgICAgIG1pc3NlZF90b29scyA6PSAkKHN1YnN0ICQoc3BhY2UpLCQoY29tbWEpJChzcGFjZSksJChtaXNzZWRfdG9vbHMpKQorICAgICAgICAkKGVycm9yIERldmVsb3BtZW50IHRvb2xzIG5vdCBmb3VuZDogJChtaXNzZWRfdG9vbHMpKQorICAgIGVuZGlmCisgICAgcHJldl90b29scyA6PSAkKHN0cmlwICQoc2hlbGwgWyAtZSB0b29scy5jZmcgXSAmJiBjYXQgdG9vbHMuY2ZnKSkKKyAgICAkKGNhbGwgc2F5LFRvb2xzICA6ICQoY3Vycl90b29scykpCisgICAgaWZlcSAiJChwcmV2X3Rvb2xzKSIgIiIKKyAgICAgICAgIyBObyBzYXZlZCBjb25maWcgZmlsZSwgbGV0IHVzIGNyZWF0ZSBpdC4KKyAgICAgICAgZHVtbXkgOj0gJChzaGVsbCBlY2hvICIkKGN1cnJfdG9vbHMpIiA+IHRvb2xzLmNmZykKKyAgICBlbHNlCisgICAgICAgICMgQ2hlY2sgdGhlIHNhdmVkIGNvbmZpZyBmaWxlIG1hdGNoZXMgY3VycmVudCBjb25maWd1cmF0aW9uLgorICAgICAgICBpZm5lcSAiJChjdXJyX3Rvb2xzKSIgIiQocHJldl90b29scykiCisgICAgICAgICAgICAjIFNob3cgdGhlIGRpZmZlcnRlbmNlIGJldHdlZW4gcHJldmlvdXMgYW5kIGN1cnJlbnQgdG9vbHMuCisgICAgICAgICAgICAkKGNhbGwgc2F5LE9sZCB0b29scyA6ICQoZmlsdGVyLW91dCAkKGN1cnJfdG9vbHMpLCQocHJldl90b29scykpKQorICAgICAgICAgICAgJChjYWxsIHNheSxOZXcgdG9vbHMgOiAkKGZpbHRlci1vdXQgJChwcmV2X3Rvb2xzKSwkKGN1cnJfdG9vbHMpKSkKKyAgICAgICAgICAgICMgQW5kIGluaXRpYXRlIHJlYnVpbGQuCisgICAgICAgICAgICAkKGNhbGwgc2F5LFRvb2xzIGNoYW5nZWQkKGNvbW1hKSByZWJ1aWxkaW5nLi4uKQorICAgICAgICAgICAgZHVtbXkgOj0gJChzaGVsbCAkKHJtKSAucmVidWlsZCAmJiBlY2hvICIkKGN1cnJfdG9vbHMpIiA+IHRvb2xzLmNmZykKKyAgICAgICAgZW5kaWYKKyAgICBlbmRpZgorZW5kaWYKKworIyBDaGVjayBjb25maWcuCitpZmVxICIkKGN1cnJfY29uZmlnKSIgIiIKKyAgICAkKGVycm9yIG1ha2VmaWxlIG11c3QgZGVmaW5lIGBjdXJyX2NvbmZpZycgdmFyaWFibGUpCitlbmRpZgorcHJldl9jb25maWcgOj0gJChzaGVsbCBbIC1lIGJ1aWxkLmNmZyBdICYmIGNhdCBidWlsZC5jZmcpCitjdXJyX2NvbmZpZyA6PSAkKHN0cmlwICQoY3Vycl9jb25maWcpKQoraWZlcSAiJChjbGVhbikiICIiICAgICMgRG8gbm90IGNoZWNrIGNvbmZpZyBpZiBjbGVhbiBnb2FsIHNwZWNpZmllZC4KKyAgICAkKGNhbGwgc2F5LENvbmZpZyA6ICQoY3Vycl9jb25maWcpKQorICAgIGlmZXEgIiQocHJldl9jb25maWcpIiAiIgorICAgICAgICAjIE5vIHNhdmVkIGNvbmZpZyBmaWxlLCBsZXQgdXMgY3JlYXRlIGl0LgorICAgICAgICBkdW1teSA6PSAkKHNoZWxsIGVjaG8gIiQoY3Vycl9jb25maWcpIiA+IGJ1aWxkLmNmZykKKyAgICBlbHNlCisgICAgICAgICMgQ2hlY2sgc2F2ZWQgY29uZmlnIGZpbGUgbWF0Y2hlcyBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCisgICAgICAgIGlmbmVxICIkKGN1cnJfY29uZmlnKSIgIiQocHJldl9jb25maWcpIgorICAgICAgICAgICAgIyBTaG93IHRoZSBkaWZmZXJ0ZW5jZSBiZXR3ZWVuIHByZXZpb3VzIGFuZCBjdXJyZW50IGNvbmZpZ3VyYXRpb25zLgorICAgICAgICAgICAgJChjYWxsIHNheSxPbGQgY29uZmlnIDogJChmaWx0ZXItb3V0ICQoY3Vycl9jb25maWcpLCQocHJldl9jb25maWcpKSkKKyAgICAgICAgICAgICQoY2FsbCBzYXksTmV3IGNvbmZpZyA6ICQoZmlsdGVyLW91dCAkKHByZXZfY29uZmlnKSwkKGN1cnJfY29uZmlnKSkpCisgICAgICAgICAgICAjIEFuZCBpbml0aWF0ZSByZWJ1aWxkLgorICAgICAgICAgICAgJChjYWxsIHNheSxDb25maWd1cmF0aW9uIGNoYW5nZWQkKGNvbW1hKSByZWJ1aWxkaW5nLi4uKQorICAgICAgICAgICAgZHVtbXkgOj0gJChzaGVsbCAkKHJtKSAucmVidWlsZCAmJiBlY2hvICIkKGN1cnJfY29uZmlnKSIgPiBidWlsZC5jZmcpCisgICAgICAgIGVuZGlmCisgICAgZW5kaWYKK2VuZGlmCisKKyMgZW5kIG9mIGZpbGUgIworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rvb2xzL3NyYy9jb21tb24tZGVmcy5tayBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvc3JjL2NvbW1vbi1kZWZzLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYjY0YjAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rvb2xzL3NyYy9jb21tb24tZGVmcy5tawpAQCAtMCwwICsxLDIyOCBAQAorIyBjb21tb24tZGVmcy5tayAjCisKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUaGlzIGZpbGUgY29udGFpbnMgcmVhbGx5IGNvbW1vbiBkZWZpbml0aW9ucyB1c2VkIGJ5IG11bHRpcGxlIG1ha2VmaWxlcy4gTW9kaWZ5IGl0IGNhcmVmdWxseSEKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTb21lIHRyaWNreSB2YXJpYWJsZXMuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitlbXB0eSA6PQorc3BhY2UgOj0gJChlbXB0eSkgJChlbXB0eSkKK2NvbW1hIDo9ICwKK2lmZXEgIiQoZGF0ZSkiICIiCisgICAgJChlcnJvciBDYWxsZXIgc2hvdWxkIHNwZWNpZnkgImRhdGUiIHZhcmlhYmxlLikKK2VuZGlmCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgSGVscGVyIGZpbmN0aW9ucy4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBTeW5vcHNpczoKKyMgICAgICQoY2FsbCBzYXksdGV4dC10by1wcmludC10by10aGUtc2NyZWVuKQorIyBEZXNjcmlwdGlvbjoKKyMgICAgIFRoZSBmdW5jdGlvbiBwcmludHMgaXRzIGFyZ3VtZW50IHRvIHRoZSBzY3JlZW4uIEluIGNhc2Ugb2Ygb2xkZXIgbWFrZXMgaXQgaXMgYW5hbG9nIG9mCisjICAgICAkKHdhcm5pbmcpLCBzdGFydGluZyBmcm9tIG1ha2UgMy44MSBpcyBpcyBhbmFsb2cgb2YgJChpbmZvKS4KKyMKK3NheSA9ICQod2FybmluZyAkKDEpKQoraWZuZXEgIiQoZmlsdGVyIDMuODEsJChNQUtFX1ZFUlNJT04pKSIgIiIKKyAgICBzYXkgPSAkKGluZm8gJCgxKSkKK2VuZGlmCisKKyMgU3lub3BzaXM6CisjICAgICBhcmNoaXRlY3R1cmUgPSAkKGNhbGwgbGVnYWxfYXJjaCwzMikKKyMgRGVzY3JpcHRpb246CisjICAgICBUaGUgZnVuY3Rpb24gcmV0dXJuIHByaW50YWJsZSBuYW1lIG9mIHNwZWNpZmllZCBhcmNoaXRlY3R1cmUsIElBLTMyIGFyY2hpdGVjdHVyZSBvciBJbnRlbChSKSA2NC4KKyMKK2xlZ2FsX2FyY2ggPSAkKGlmICQoZmlsdGVyIDMyLCQoMSkpLElBLTMyLCQoaWYgJChmaWx0ZXIgMzJlLCQoMSkpLEludGVsKFIpIDY0LCQoaWYgJChmaWx0ZXIgbDEsJCgxKSksTDFPTSwkKGlmICQoZmlsdGVyIGFybSwkKDEpKSxBUk0sJChpZiAkKGZpbHRlciBwcGM2NCwkKDEpKSxQUEM2NCwkKGVycm9yIEJhZCBhcmNoaXRlY3R1cmUgc3BlY2lmaWVkOiAkKDEpKSkpKSkpCisKKyMgU3lub3BzaXM6CisjICAgICB2YXJfbmFtZSA9ICQoY2FsbCBjaGVja192YXJpYWJsZSx2YXIsbGlzdCkKKyMgRGVzY3JpcHRpb246CisjICAgICBUaGUgZnVuY3Rpb24gdmVyaWZpZXMgdGhlIHZhbHVlIG9mIHZhciB2YXJpYmFsZS4gSWYgaXQgaXMgZW1wdHksIHRoZSBmaXJzdCB3b3JkIGZyb20gdGhlIGxpc3QKKyMgICAgIGlzIGFzc2lnbmVkIHRvIHZhciBhcyBkZWZhdWx0IHZhbHVlLiBPdGhlcndpc2UgdGhlIHZhciB2YWx1ZSBtdXN0IG1hdGNoIG9uZSBvZiB3b3JkcyBpbiB0aGUKKyMgICAgIGxpc3QsIG9yIGVycm9yIGlzIGlzc3VlZC4KKyMgRXhhbXBsZToKKyMgICAgIExJTktfVFlQRSA9ICQoY2FsbCBjaGVja192YXJpYWJsZSxMSU5LX1RZUEUsc3RhdGljIGR5bmFtaWMpCisjCitjaGVja192YXJpYWJsZSA9ICQoY2FsbCBfY2hlY2tfdmFyaWFibGVfd29yZHMsJCgxKSkkKGNhbGwgX2NoZWNrX3ZhcmlhYmxlX3ZhbHVlLCQoMSksJCgyKSkKKworIyBTeW5vcHNpczoKKyMgICAgICQoY2FsbCBfY2hlY2tfdmFyaWFibGVfd29yZHMsdmFyKQorIyBEZXNjcmlwdGlvbjoKKyMgICAgIENoZWNrcyB0aGF0IHZhcmlhYmxlIHZhciBpcyBlbXB0eSBvciBzaW5nbGUgd29yZC4gSW4gY2FzZSBvZiBtdWx0aXBsZSB3b3JkcyBhbiBlcnJvciBpcworIyAgICAgaXNzdWVkLiBJdCBpcyBoZWxwZXIgZnVuY3Rpb24gZm9yIGNoZWNrX3ZhcmlhYmxlLgorIworX2NoZWNrX3ZhcmlhYmxlX3dvcmRzID0gJChpZiAkKGZpbHRlciAwIDEsJCh3b3JkcyAkKCQoMSkpKSksLFwKKyAgICAkKGVycm9yIElsbGVnYWwgdmFsdWUgb2YgJCgxKTogIiQoJCgxKSkiKSkKKworIyBTeW5vcHNpczoKKyMgICAgICQoY2FsbCBfY2hlY2tfdmFyaWFibGVfdmFsdWUsdmFyKQorIyBEZXNjcmlwdGlvbjoKKyMgICAgIElmIHZhcmlhYmxlIHZhciBpcyBlbXB0eSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGZpcnN0IHdvcmQgZnJvbSB0aGUgbGlzdC4gSWYgdmFyaWFibGUgaXMKKyMgICAgIG5vdCBlbXB0eSBhbmQgbWF0Y2ggb25lIG9mIHdvcmRzIGluIHRoZSBsaXN0LCB2YXJpYWJsZSdzIHZhbHVlIHJldHVybmVkLiBPdGhlcndpc2UsIGVycm9yIGlzCisjICAgICBpc3N1ZWQuIEl0IGlzIGhlbHBlciBmdW5jdGlvbiBmb3IgY2hlY2tfdmFyaWFibGUuCisjCitfY2hlY2tfdmFyaWFibGVfdmFsdWUgPSAkKGlmICQoJCgxKSksJChpZiAkKGZpbHRlciAkKDIpLCQoJCgxKSkpLCQoJCgxKSksXAorICAgICQoZXJyb3IgSWxsZWdhbCB2YWx1ZSBvZiAkKDEpOiAiJCgkKDEpKSIpKSwkKGZpcnN0d29yZCAkKDIpKSkKKworIyBTeW5vcHNpczoKKyMgICAgICQoY2FsbCBkZWJ1Zyx2YXIpCisjIERlc2NyaXB0aW9uOgorIyAgICAgSWYgTElCT01QX01BS0VfREVCVUcgaXMgbm90IGVtcHR5LCB2YXIgbmFtZSBhbmQgdmFsdWUgcHJpbnRlZC4gVXNlIHRoaXMgZm9yIGRlYnVnIHB1cnBvc2UuCisjCitpZmVxICIkKExJQk9NUF9NQUtFX0RFQlVHKSIgIiIKKyAgICBkZWJ1ZyA9CitlbHNlCisgICAgZGVidWcgPSAkKGNhbGwgc2F5LGRlYnVnOiAkKDEpPSIkKCQoMSkpIikKK2VuZGlmCisKKyMgU3lub3BzaXM6CisjICAgICAkKGNhbGwgaGVhZGVyLHRhcmdldCkKKyMgRGVzY3JpcHRpb246CisjICAgICBSZXR1cm5zIGEgc3RyaW5nIHRvIHByaW50IHRvIHNob3cgYnVpbGQgcHJvZ3Jlc3MuCisjCitoZWFkZXIgPSAtLS0tLSAkKG1hcmtlcikgLS0tICQoMSkgLS0tLS0KKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBHbG9iYWwgbWFrZSBzZXR0aW5ncy4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBOb24tZW1wdHkgQ0RQQVRIIG1heSBsZWFkIHRvIHByb2JsZW1zIG9uIHNvbWUgcGxhdGZvcm1zOiBzaW1wbGUgImNkIGRpciIgKHdoZXJlICJkaXIiIGlzIGFuCisjIGV4aXN0aW5nIGRpcmVjdG9yeSBpbiBjdXJyZW50IG9uZSkgZmFpbHMuIENsZWFyaW5nIENEUEFUSCBzb2x2ZXMgdGhlIHByb2JsZW0uCitDRFBBVEggPQorLlNVRkZJWEVTIDogICAgICAgICAgICAjIENsZWFuIGRlZmF1bHQgbGlzdCBvZiBzdWZmaXhlcy4KKy5ERUxFVEVfT05fRVJST1IgOiAgICAgIyBEZWxldGUgdGFyZ2V0IGZpbGUgaW4gY2FzZSBvZiBlcnJvci4KKworJChjYWxsIHNheSwkKGNhbGwgaGVhZGVyLG1ha2luZyAkKGlmICQoTUFLRUNNREdPQUxTKSwkKE1BS0VDTURHT0FMUyksYWxsKSkpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgY2xlYW4gYW5kIGNsb2JiZXIgZ29hbHMuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgImNsZWFuIiBnb2FsIG11c3QgYmUgc3BlY2lmaWVkIGFsb25lLCBvdGhlcndpc2Ugd2UgaGF2ZSB0cm91YmxlcyB3aXRoIGRlcGVuZGVuY3kgZmlsZXMuCitjbGVhbiA6PSAkKGZpbHRlciBjbGVhbiUsJChNQUtFQ01ER09BTFMpKQoraWZuZXEgIiQoY2xlYW4pIiAiIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgImNsZWFuIiBnb2FsIGlzIHByZXNlbnQgaW4gY29tbWFuZCBsaW5lLgorICAgIGlmbmVxICIkKGZpbHRlci1vdXQgY2xlYW4lLCQoTUFLRUNNREdPQUxTKSkiICIiICAgICMgdGhlcmUgYXJlIG5vbi1jbGVhbiBnb2Fscy4KKyAgICAgICAgJChlcnJvciAiY2xlYW4iIGdvYWxzIG11c3Qgbm90IGJlIG1peGVkIHdpdGggb3RoZXIgZ29hbHMpCisgICAgZW5kaWYKK2VuZGlmCisjIElzc3VlIGVycm9yIG9uICJjbG9iYmVyIiB0YXJnZXQuCitpZm5lcSAiJChmaWx0ZXIgY2xvYmJlciwkKE1BS0VDTURHT0FMUykpIiAiIgorICAgICQoZXJyb3IgVGhlcmUgaXMgbm8gY2xvYmJlciBnb2FsIGluIG1ha2VmaWxlKQorZW5kaWYKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBNYW5kYXRvcnkgdmFyaWFibGVzIHBhc3NlZCBmcm9tIGJ1aWxkLnBsLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitvcyAgICAgICA6PSAkKGNhbGwgY2hlY2tfdmFyaWFibGUsb3MsbGluIGxyYiBtYWMgd2luKQorYXJjaCAgICAgOj0gJChjYWxsIGNoZWNrX3ZhcmlhYmxlLGFyY2gsMzIgMzJlIDY0IGFybSBwcGM2NCkKK3BsYXRmb3JtIDo9ICQob3MpXyQoYXJjaCkKK3BsYXRmb3JtIDo9ICQoY2FsbCBjaGVja192YXJpYWJsZSxwbGF0Zm9ybSxsaW5fMzIgbGluXzMyZSBsaW5fNjQgbGluX2FybSBscmJfMzJlIG1hY18zMiBtYWNfMzJlIHdpbl8zMiB3aW5fMzJlIHdpbl82NCBsaW5fcHBjNjQpCisjIG9hLW9wdHMgbWVhbnMgIm9zIGFuZCBhcmNoIG9wdGlvbnMiLiBUaGV5IGFyZSBwYXNzZWQgdG8gYWxtb3N0IGFsbCBwZXJsIHNjcmlwdHMuCitvYS1vcHRzICA6PSAtLW9zPSQob3MpIC0tYXJjaD0kKGFyY2gpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRGlyZWN0b3JpZXMuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2lmZXEgIiQoTElCT01QX1dPUkspIiAiIgorICAgICQoZXJyb3IgSW50ZXJuYWwgZXJyb3I6IExJQk9NUF9XT1JLIHZhcmlhYmxlIG11c3QgYmUgc2V0IGluIG1ha2VmaWxlLm1rKQorZW5kaWYKK3Rvb2xzX2RpciA9ICQoTElCT01QX1dPUkspdG9vbHMvCisjIFdlIGRvIG5vdCBkZWZpbmUgc3JjLyBhbmQgb3RoZXIgZGlyZWN0b3JpZXMgaGVyZSBiZWNhdXNlIHRoZXkgZGVwZW5kcyBvbiB0YXJnZXQgKFJUTCwgRFNMLCB0b29scykuCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRmlsZSBzdWZmaXhlcy4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaWZlcSAiJChvcykiICJ3aW4iICMgd2luCisgICAgYXNtID0gLmFzbQorICAgIG9iaiA9IC5vYmoKKyAgICBsaWIgPSAubGliCisgICAgZGxsID0gLmRsbAorICAgIGV4ZSA9IC5leGUKKyAgICBjYXQgPSAkKGRsbCkKK2Vsc2UgIyBsaW4sIGxyYiBvciBtYWMKKyAgICBhc20gPSAucworICAgIG9iaiA9IC5vCisgICAgbGliID0gLmEKKyAgICBpZmVxICIkKG9zKSIgIm1hYyIKKyAgICAgICAgZGxsID0gLmR5bGliCisgICAgZWxzZQorICAgICAgICBkbGwgPSAuc28KKyAgICBlbmRpZgorICAgIGV4ZSA9ICQoZW1wdHkpCisgICAgY2F0ID0gLmNhdAorZW5kaWYKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGaWxlIG1hbmlwdWxhdGlvbiBhbmQgbWlzYyBjb21tYW5kcy4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordGFyZ2V0ID0gQGVjaG8gIiQoY2FsbCBoZWFkZXIsJEApIgoraWZlcSAiJChvcykiICJ3aW4iCisgICAgY3AgICAgPSBjcCAtZgorICAgIHJtICAgID0gcm0gLWYKKyAgICBta2RpciA9IG1rZGlyIC1wCisgICAgdG91Y2ggPSB0b3VjaAorICAgIHBlcmwgID0gcGVybAorICAgIHNsYXNoID0gXFwKK2Vsc2UgIyBsaW4sIGxyYiBvciBtYWMKKyAgICBjcCAgICA9IGNwIC1mCisgICAgcm0gICAgPSBybSAtZgorICAgIG1rZGlyID0gbWtkaXIgLXAKKyAgICB0b3VjaCA9IHRvdWNoCisgICAgcGVybCAgPSBwZXJsCisgICAgc2xhc2ggPSAvCitlbmRpZgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbW1vbiBub24tY29uZmlndXJhdGlvbiBvcHRpb25zLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUaGV5IG1heSBhZmZlY3QgYnVpbGQgcHJvY2VzcyBidXQgZG9lcyBub3QgYWZmZWN0IHJlc3VsdC4KKworIyBJZiBURVNUX0RFUFMgaXMgIm9mZiIsIHRlc3QgZGVwcyBpcyBzdGlsbCBwZXJmb3JtZWQsIGJ1dCBpdHMgcmVzdWx0IGlzIGlnbm9yZWQuCitURVNUX0RFUFMgIDo9ICQoY2FsbCBjaGVja192YXJpYWJsZSxURVNUX0RFUFMsb24gb2ZmKQorIyBUaGUgc2FtZSBmb3IgdGVzdCB0b3VjaC4KK1RFU1RfVE9VQ0ggOj0gJChjYWxsIGNoZWNrX3ZhcmlhYmxlLFRFU1RfVE9VQ0gsb24gb2ZmKQordGQtaSA9ICQoaWYgJChmaWx0ZXIgb2ZmLCQoVEVTVF9ERVBTKSksLSkKK3R0LWkgPSAkKGlmICQoZmlsdGVyIG9mZiwkKFRFU1RfVE9VQ0gpKSwtKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbW1vbiB0YXJnZXRzLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIEFsbCBjb21tb24gdGFyZ2V0cyBhcmUgZGVmaW5lZCBhcyBwaG9ueS4gSXQgYWxsb3dzICJidWlsLnBsIC0tYWxsIHRlc3QteHh4Ii4KKyMgTWFrZWZpbGUgY2FuIGRlZmluZSBhY3Rpb25zIGZvciBhIHBhcnRpY2l1bGFyIHRlc3Qgb3IgbGVhdmUgaXQgbm8tb3AuCisKKyMgYWxsLCB0aGUgZGVmYXVsdCB0YXJnZXQsIHNob3VsZCBiZSB0aGUgZmlyc3Qgb25lLgorLlBIT05ZIDogYWxsCithbGwgOgorCisuUEhPTlkgOiBjb21tb24gY2xlYW4gY2xlYW4tY29tbW9uIGZhdCBpbmMgbDEwbiBsaWIKKworLlBIT05ZIDogZm9yY2UtdGVzdHMgICAgICAgICAgdGVzdHMKKy5QSE9OWSA6IGZvcmNlLXRlc3QtdG91Y2ggICAgIHRlc3QtdG91Y2gKKy5QSE9OWSA6IGZvcmNlLXRlc3QtcmVsbyAgICAgIHRlc3QtcmVsbworLlBIT05ZIDogZm9yY2UtdGVzdC1leGVjc3RhY2sgdGVzdC1leGVjc3RhY2sKKy5QSE9OWSA6IGZvcmNlLXRlc3QtaW5zdHIgICAgIHRlc3QtaW5zdHIKKy5QSE9OWSA6IGZvcmNlLXRlc3QtZGVwcyAgICAgIHRlc3QtZGVwcworCit0ZXN0cyA9IHRvdWNoIHJlbG8gZXhlY3N0YWNrIGluc3RyIGRlcHMKK3Rlc3RzICAgICAgIDogJChhZGRwcmVmaXggdGVzdC0sJCh0ZXN0cykpCitmb3JjZS10ZXN0cyA6ICQoYWRkcHJlZml4IGZvcmNlLXRlc3QtLCQodGVzdHMpKQorCisjIGVuZCBvZiBmaWxlICMKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdG9vbHMvc3JjL2NvbW1vbi1ydWxlcy5tayBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvc3JjL2NvbW1vbi1ydWxlcy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjg5YmViCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90b29scy9zcmMvY29tbW9uLXJ1bGVzLm1rCkBAIC0wLDAgKzEsMTg4IEBACisjIGNvbW1vbi1ydWxlcy5tayAjCisKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUaGlzIGZpbGUgY29udGFpbnMgcmVhbGx5IGNvbW1vbiBkZWZpbml0aW9ucyB1c2VkIGJ5IG11bHRpcGxlIG1ha2VmaWxlcy4gTW9kaWZ5IGl0IGNhcmVmdWxseSEKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyAtLS0gQ3JlYXRpbmcgYSBkaXJlY3RvcnkgLS0tCisjIEEgZGlyZWN0b3J5IGNhbm5vdCBiZSBhIHRhcmdldCwgYmVjYXVzZSBpbiBMaW51eCogT1MgZGlyZWN0b3J5J3MgdGltZXN0YW1wIGlzIHVwZGF0ZWQgZWFjaCB0aW1lIGEKKyMgZmlsZSBpcyBjcmVhdGVkIG9yIGRlbGV0ZWQgaW4gdGhlIGRpcmVjdG9yeS4gV2UgdXNlICIuZGlyIiBmaWxlIGluIHBsYWNlIG9mIGRpcmVjdG9yeS4gSWYgc3VjaAorIyBmaWxlIGV4aXN0cywgaXQgbWVhbnMgZGlyZWN0b3J5IGV4aXN0cyBhbHNvLgorCisuUFJFQ0lPVVMgOiAlLy5kaXIgICAgICAgICAgICAgICAgICAgICAjIERvIG5vdCBkZWxldGUgYXV0b21hdGljYWxseSBjcmVhdGVkIGZpbGVzLgorCislLy5kaXIgOgorCSQodGFyZ2V0KQorCSQobWtkaXIpICQoZGlyICRAKQorCSQodG91Y2gpICRACisKKyMgLS0tIFJlYnVpbGRpbmcgLS0tCisjIFJlbW92aW5nIG9yIHRvdWNoaW5nIC5yZWJ1aWxkIGZpbGUgY2F1c2VzIHJlYnVpbGQuCisjIFRvIGxldCBpdCB3b3JrLCAucmVidWlsZCBzaG91bGQgYmUgYWRkZWQgYXMgcHJlcmVxdWlzaXRlIHRvIGV2ZXJ5IHJ1bGUgKGRlcGVuZGVuY3kgd2l0aCBjb21tYW5kcykKKyMgZXhjZXB0IGNsZWFuKiBhbmQgZm9yY2UqLCBpbiB0aGlzIGFuZCBvdGhlciBtYWtlZmlsZXMuCisucmVidWlsZCA6CisJJCh0YXJnZXQpCisJJCh0b3VjaCkgJEAKKworIyAtLSBDcmVhdGluZyBkZXBlbmRlbmN5IGZpbGUgZm9yIEMvQysrIC0tLQorCislLmQgOiAlLmMgLnJlYnVpbGQKKwkkKHRhcmdldCkKKwkkKGMpICQoY3BwLWZsYWdzKSAkKGMtZmxhZ3MpICQoYy1mbGFncy1tKSAkPCA+ICRACisKKyUuZCA6ICUuY3BwIC5yZWJ1aWxkCisJJCh0YXJnZXQpCisJJChjeHgpICQoY3BwLWZsYWdzKSAkKGN4eC1mbGFncykgJChjeHgtZmxhZ3MtbSkgJDwgPiAkQAorCisjIC0tIENyZWF0aW5nIHByZXByb2Nlc3NlZCBmaWxlIGZvciBDL0MrKyAtLS0KKworJS5pIDogJS5jIC5yZWJ1aWxkCisJJCh0YXJnZXQpCisJJChjKSAkKGNwcC1mbGFncykgJChjLWZsYWdzKSAtUCAkKGMtb3V0KSRAICQ8CisKKyUuaSA6ICUuY3BwIC5yZWJ1aWxkCisJJCh0YXJnZXQpCisJJChjeHgpICQoY3BwLWZsYWdzKSAkKGN4eC1mbGFncykgLVAgJChjeHgtb3V0KSRAICQ8CisKKyMgLS0gQ29tcGlsaW5nIEMvQysrIGZpbGVzIC0tLQorCislJChvYmopIDogJS5jIC5yZWJ1aWxkCisJJCh0YXJnZXQpCisJJChjKSAkKGNwcC1mbGFncykgJChjLWZsYWdzKSAkKGMtb3V0KSRAICQ8CisKKyUkKG9iaikgOiAlLmNwcCAucmVidWlsZAorCSQodGFyZ2V0KQorCSQoY3h4KSAkKGNwcC1mbGFncykgJChjeHgtZmxhZ3MpICQoY3h4LW91dCkkQCAkPAorCisjIC0tIEdlbmVyYXRlIGFzc2VtYmx5IGZpbGVzIC0tLQorCislJChhc20pIDogJS5jIC5yZWJ1aWxkCisJJCh0YXJnZXQpCisJJChjKSAkKGNwcC1mbGFncykgJChjLWZsYWdzKSAtUyAkKGMtb3V0KSRAICQ8CisKKyUkKGFzbSkgOiAlLmNwcCAucmVidWlsZAorCSQodGFyZ2V0KQorCSQoY3h4KSAkKGNwcC1mbGFncykgJChjeHgtZmxhZ3MpIC1TICQoY3h4LW91dCkkQCAkPAorCisjIC0tIENvbXBpbGluZyBhc20gZmlsZXMgLS0tCisKKyUkKG9iaikgOiAlJChhc20pIC5yZWJ1aWxkCisJJCh0YXJnZXQpCisgICAgICAgICMgVGhlcmUgaXMgYSBidWcgb24gbHJiOiBpY2MgZG9lcyBub3Qgd29yayB3aXRoICIteCBhc3NlbWJsZXItd2l0aC1jcHAiIG9wdGlvbiwgc28gd2UgaGF2ZQorICAgICAgICAjIHRvIHByZXByb2Nlc3MgZmlsZSBtYW51YWxseSBhbmQgdGhlbiBhc3NlbWJseSBpdC4KKyAgICAgICAgaWZlcSAiJChvcykiICJscmIiCisJICAgICQoYykgLUUgJChjcHAtZmxhZ3MpICQ8ID4gJEAudG1wCisJICAgICQoYXMpICQoYXMtZmxhZ3MpIC14IGFzc2VtYmxlciAkKGFzLW91dCkkQCAkQC50bXAKKyAgICAgICAgZWxzZQorCSAgICAkKGFzKSAkKGFzLWZsYWdzKSAkKGFzLW91dCkkQCAkPAorICAgICAgICBlbmRpZgorCisjIC0tIEV4cGFuZGluZyB2YXJpYWJsZXMgaW4gdGVtcGxhdGUgZmlsZXMgLS0tCisKKyMgR2VuZXJhbCBydWxlICIlIDogJS52YXIiIGRvZXMgbm90IHdvcmsgZ29vZCwgc28gd2UgaGF2ZSB0byB3cml0ZSBtb3JlIHNwZWNpZmljIHJ1bGVzOgorIyAiJS5oIDogJS5oLnZhciIsIGV0Yy4KKworLlBSRUNJT1VTIDogJS5oICUuZiAlLnJjICAgICAgICAgICAgICAgIyBEbyBub3QgZGVsZXRlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBmaWxlcy4KKworZXhwYW5kLXZhcnMgPSAkKHBlcmwpICQodG9vbHNfZGlyKWV4cGFuZC12YXJzLnBsIC0tc3RyaWN0ICQoZXYtZmxhZ3MpICQ8ICRACisKKyMgQW55IGdlbmVyYXRlZCBmaWxlIGRlcGVuZHMgb24ga21wX3ZlcnNpb24uYywgYmVjYXVzZSB3ZSBleHRyYWN0IGJ1aWxkIG51bWJlciBmcm9tIHRoYXQgZmlsZS4KKworJS5oICA6ICUuaC52YXIgIFwKKyAgICBrbXBfdmVyc2lvbi5jICQodG9vbHNfZGlyKWV4cGFuZC12YXJzLnBsIC5yZWJ1aWxkCisJJCh0YXJnZXQpCisJJChleHBhbmQtdmFycykKKworJS5mICA6ICUuZi52YXIgIFwKKyAgICBrbXBfdmVyc2lvbi5jICQodG9vbHNfZGlyKWV4cGFuZC12YXJzLnBsIC5yZWJ1aWxkCisJJCh0YXJnZXQpCisJJChleHBhbmQtdmFycykKKworJS5mOTAgIDogJS5mOTAudmFyICBcCisgICAga21wX3ZlcnNpb24uYyAkKHRvb2xzX2RpcilleHBhbmQtdmFycy5wbCAucmVidWlsZAorCSQodGFyZ2V0KQorCSQoZXhwYW5kLXZhcnMpCisKKyUucmMgOiAlLnJjLnZhciBcCisgICBrbXBfdmVyc2lvbi5jICQodG9vbHNfZGlyKWV4cGFuZC12YXJzLnBsIC5yZWJ1aWxkCisJJCh0YXJnZXQpCisJJChleHBhbmQtdmFycykKKworIyAtLSBNYWtpbmcgc3RhdGljIGxpYnJhcnkgLS0tCisKKy5QUkVDSU9VUyA6ICUkKGxpYikgICAgICAgICAgICAgICAgICAgICMgRG8gbm90IGRlbGV0ZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgZmlsZXMuCisKKyUkKGxpYikgOiAlJChsaWIpLmxzdCAucmVidWlsZAorCSQodGFyZ2V0KQorCSQocm0pICRACisJJChhcikgJChhci1mbGFncykgJChhci1vdXQpJEAgJCQoY2F0ICQ8KQorICAgICAgICAjIHN0cmlwIGRlYnVnIGluZm8gaW4gY2FzZSBpdCBpcyByZXF1ZXN0ZWQgKHdvcmtzIGZvciBMaW51eCogT1Mgb25seSkKKyAgICAgICAgaWZuZXEgIiQoZGJnX3N0cmlwKSIgIiIKKyAgICAgICAgICAgIGlmZXEgIiQoREVCVUdfSU5GTykiICJvZmYiCisJICAgICAgICBvYmpjb3B5IC0tc3RyaXAtZGVidWcgJEAKKyAgICAgICAgICAgIGVuZGlmCisgICAgICAgIGVuZGlmCisKKyMgLS0gTWFraW5nIGR5bmFtaWMgbGlicmFyeSAtLS0KKworLlBSRUNJT1VTIDogJSQoZGxsKSAgICAgICAgICAgICAgICAgICAgIyBEbyBub3QgZGVsZXRlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBmaWxlcy4KKworIyBtYWtlZmlsZS5tayBzaG91bGQgcHJvcGVybHkgZGVmaW5lIGltcF9maWxlLCBkZWZfZmlsZSwgcmVzX2ZpbGUsIGFuZCBwZGJfZmlsZToKKyMgICAgIGxpbiBhbmQgbWFjOiBkZWZfZmlsZSBhbmQgcmVzX2ZpbGUgc2hvdWxkIGJlIGVtcHR5LCBpbXBfZmlsZSBhbmQgcGRiX2ZpbGUgZG8gbm90IG1hdHRlci4KKyMgICAgIHdpbjogYWxsIHRoZSB2YXJpYWJlIG1heSBiZSBlbXB0eTsgaWYgYSB2YXJpYWJsZSBzcGVjaWZpZWQsIGl0IGFmZmVjdHMgbGQtZmxhZ3MuCisjIE5vdGU6IGltcF9maWxlIGFuZCBwZGJfZmlsZSBhcmUgc2lkZSBlZmZlY3Qgb2YgYnVpbGRpbmcgdGhpcyB0YXJnZXQuCisjIE5vdGU6IHRvIHdvcmthcm91bmQgQ1EyMTUyMjkgJGxkLWZsYWdzLWV4dHJhIGludHJvZHVjZWQgdG8ga2VlcCBvcHRpb25zIGJlIHBsYWNlZCBhZnRlciBvYmplY3RzCislJChkbGwpIDogJSQoZGxsKS5sc3QgJChkZWZfZmlsZSkgJChyZXNfZmlsZSkgLnJlYnVpbGQKKwkkKHRhcmdldCkKKwkkKGxkKSAkKGxkLWZsYWdzLWRsbCkgJChsZC1mbGFncykgJChsZC1vdXQpJEAgJCQoY2F0ICQ8KSAkKGxkLWZsYWdzLWV4dHJhKSAkKHJlc19maWxlKQorICAgICAgICAjIElmIHN0cmlwcGVkIHBkYiBleGlzdCwgcmVuYW1lIGl0IHRvIG5vcm1hbCBwZGIgbmFtZS4gU2VlIGRldnRvb2xzLm1rIGZvciBleHBsYW5hdGlvbi4KKyAgICAgICAgaWZuZXEgIiQocGRiX2ZpbGUpIiAiIgorICAgICAgICAgICAgaWZlcSAiJChERUJVR19JTkZPKSIgIm9mZiIKKwkgICAgICAgIG12ICQocGRiX2ZpbGUpICQocGRiX2ZpbGUpLm5vbnN0cmlwcGVkCisJICAgICAgICBtdiAkKHBkYl9maWxlKS5zdHJpcHBlZCAkKHBkYl9maWxlKQorICAgICAgICAgICAgZW5kaWYKKyAgICAgICAgZW5kaWYKKworJS5kYmcgOiAlJChkbGwpIC5yZWJ1aWxkCisJJCh0YXJnZXQpCisJb2JqY29weSAtLW9ubHkta2VlcC1kZWJ1ZyAkPCAkQCAKKworCisuUFJFQ0lPVVM6ICUucmVzICAgICAgICAgICAgICAgICAgICAgICAjIERvIG5vdCBkZWxldGUgYXV0b21hdGljYWxseSBjcmVhdGVkIGZpbGVzLgorCislLnJlcyA6ICUucmMgLnJlYnVpbGQKKwkkKHRhcmdldCkKKwlyYyAtZm8kQCAkPAorCisjIC0tLSBCdWlsZGluZyBoZWxwZXIgdG9vbHMgZnJvbSBzb3VyY2VzIC0tLQorCisuUFJFQ0lPVVM6ICUkKGV4ZSkgICAgICAgICAgICAgICAgICAgICAjIERvIG5vdCBkZWxldGUgYXV0b21hdGljYWxseSBjcmVhdGVkIGZpbGVzLgorCislJChleGUpIDogJCh0b29sc19kaXIpJS5jcHAgLnJlYnVpbGQKKwkkKHRhcmdldCkKKwkkKGN4eCkgJChjeHgtb3V0KSRAICQ8CisKKyMgLS0tIEZvcmNpbmcgYSB0ZXN0IC0tLQorCit0ZXN0LSUvLmZvcmNlIDogdGVzdC0lLy5kaXIKKwkkKHRhcmdldCkKKwkkKHJtKSAkKGRpciAkQCkue3Rlc3QsZm9yY2V9CisKKyMgLS0tIFJlbW92aW5nIGEgZmlsZSBpbiBidWlsZCBkaXJlY3RvcnkgLS0tCisKK3JtLSUgOgorCSQodGFyZ2V0KQorCSQocm0pICQocGF0c3Vic3Qgcm0tJSwlLCRAKQorCisjIGVuZCBvZiBmaWxlICMKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdG9vbHMvc3JjL2NvbW1vbi10b29scy5tayBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvc3JjL2NvbW1vbi10b29scy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWM5ZmJjCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90b29scy9zcmMvY29tbW9uLXRvb2xzLm1rCkBAIC0wLDAgKzEsNDM4IEBACisjIGNvbW1vbi10b29scy5tayAjCisKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBEZXYgdG9vbHMgYW5kIGdlbmVyYWwgb3B0aW9ucyAobGlrZSAtZnBpYywgLU8yIG9yIC1nKS4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBjICAgICAgIC0tIEMgY29tcGlsZXIuCisjIGN4eCAgICAgLS0gQysrIGNvbXBpbGVyLgorIyBjcHAgICAgIC0tIEMgcHJlcHJvY2Vzc29yLgorIyBmb3J0ICAgIC0tIEZvcnRyYW4gY29tcGlsZXIuCisjIGFzICAgICAgLS0gQXNzZW1ibGVyLgorIyBhciAgICAgIC0tIExpYnJhcmlhbiAoc3RhdGljIGxpYnJhcnkgbWFrZXIpLgorIyBsZCAgICAgIC0tIExpbmtlciAoZHluYW1pYyBsaWJyYXJ5IG1ha2VyKS4KKyMgKi1vdXQgICAtLSBGbGFnIGRlbm90aW5nIG91dHB1dCBmaWxlLiBJZiBzcGFjZSBiZXR3ZWVuIGZsYWcgYW5kIGZpbGUgbmFtZSByZXF1aXJlZCwgYWRkIGV4cGxpY2l0CisjICAgICAgICAgICAgc3BhY2UgdG8gdmFyaWFibGUsIGUuIGcuOiAiYy1vdXQgPSAtbyQoc3BhY2UpIi4KKyMgKi1mbGFncyAtLSBGbGFncyB0byBhcHByb3ByaWF0ZSBwcm9ncmFtLCBlLiBnLiBjLWZsYWdzIC0tIGZsYWdzIGZvciBDIGNvbXBpbGVyLCBldGMuCisKKyMgLS0tIENvbW1vbiBkZWZpbml0aW9ucyAtLS0KKworIyBBZGQgY3VycmVudCBkaXJlY3RvcnkgKGl0IGNvbnRhaW5zIGdlbmVyYXRlZCBmaWxlcykuCisjIE5vdGU6IEl0IGlzIGltcG9ydGFudCB0byBzcGVjaWZ5IGN1cnJlbnQgZGlyIGFzICIuLyIgKG5vdCBqdXN0ICIuIikuIE90aGVyd2lzZSBJbnRlbCBjb21waWxlcgorIyBvbiBXaW5kb3dzKiBPUyBnZW5lcmF0ZXMgc3VjaCBhIGRlcGVuZGVuY3k6ICJrbXBfcnVudGltZS5vYmo6IC5ca21wX2kxOG4uaW5jIiwgYW5kIG1ha2UgY29tcGxhaW5zCisjICJObyBydWxlIHRvIGJ1aWxkIC5ca21wX2kxOG4uaW5jIi4gVXNpbmcgIi4vIiBzb2x2ZXMgdGhlIHByb2JsZW0uCitjcHAtZmxhZ3MgKz0gLUkgLi8KKyMgRm9yIG5vbi14ODYgYXJjaGl0ZWN0dXJlCitpZmVxICIkKGZpbHRlciAzMiAzMmUgNjQsJChhcmNoKSkiICIiCisgICAgY3BwLWZsYWdzICs9ICQoc2hlbGwgcGtnLWNvbmZpZyAtLWNmbGFncyBsaWJmZmkpCitlbmRpZgorIyBBZGQgYWxsIFZQQVRIIGRpcmVjdG9yaWVzIHRvIHBhdGggZm9yIHNlYXJjaGluZyBpbmNsdWRlIGZpbGVzLgorY3BwLWZsYWdzICs9ICQoZm9yZWFjaCBpLCQoVlBBVEgpLC1JICQoaSkpCisKKworIyBTaG91bGRuJ3QgdGhpcyBiZSBiZWluZyBzZXQgZnJvbSB0aGUgY29tbWFuZCBsaW5lIHNvbWVob3c/CitjcHAtZmxhZ3MgKz0gLUQgVVNFX0lUVF9CVUlMRAorCitpZmVxICIkKE9QVElNSVpBVElPTikiICJvbiIKKyAgICBjcHAtZmxhZ3MgKz0gLUQgTkRFQlVHCitlbHNlCisgICAgY3BwLWZsYWdzICs9IC1EIF9ERUJVRyAtRCBCVUlMRF9ERUJVRworZW5kaWYKKworIyAtLS0gTGludXgqIE9TLCBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUgYW5kIE9TIFgqIGRlZmluaXRpb25zIC0tLQorCitpZm5lcSAiJChmaWx0ZXIgbGluIGxyYiBtYWMsJChvcykpIiAiIgorICAgICMgLS0tIEMvQysrIC0tLQorICAgIGlmZXEgIiQoYykiICIiCisgICAgICAgIGMgPSBpY2MKKyAgICBlbmRpZgorICAgICMgQysrIGNvbXBpbGVyIGlzIGEgY29tcGxlbWVudCB0byBDIGNvbXBpbGVyLgorICAgIGlmZXEgIiQoYykiICJpY2MiCisgICAgICAgIGN4eCA9IGljcGMKKyAgICBlbmRpZgorICAgIGlmZXEgIiQoYykiICJnY2MiCisgICAgICAgIGN4eCA9IGcrKworICAgIGVuZGlmCisgICAgaWZlcSAiJChjKSIgImNsYW5nIgorICAgICAgICBjeHggPSBjbGFuZysrCisgICAgZW5kaWYKKyAgICAjIE91dHB1dCBmaWxlIGZsYWcuCisgICAgYy1vdXQgICA9IC1vJChzcGFjZSkKKyAgICBjeHgtb3V0ID0gLW8kKHNwYWNlKQorICAgICMgQ29tcGlsZSBvbmx5LCBubyBsaW5rLgorICAgIGMtZmxhZ3MgICArPSAtYworICAgIGN4eC1mbGFncyArPSAtYworICAgICMgR2VuZXJhdGluZyBkZXBlbmRlY3kgZmlsZS4KKyAgICBjLWZsYWdzLW0gICArPSAtTSAtTUcKKyAgICBjeHgtZmxhZ3MtbSArPSAtTSAtTUcKKyAgICAjIEVuYWJsZSBDOTkgbGFuZ3VhZ2UuCisgICAgaWZuZXEgIiQoQ1BMVVNQTFVTKSIgIm9uIgorICAgICAgICBjLWZsYWdzICs9IC1zdGQ9Z251OTkKKyAgICBlbmRpZgorICAgICMgR2VuZXJhdGUgcG9zaXRpb24taW5kZXBlbmRlbnQgY29kZSAoYSBtdXN0IGZvciBzaGFyZWQgb2JqZWN0cykuCisgICAgaWZlcSAiJChMSU5LX1RZUEUpIiAiZHluYSIKKyAgICAgICAgYy1mbGFncyAgICs9IC1mUElDCisgICAgICAgIGN4eC1mbGFncyArPSAtZlBJQworICAgIGVuZGlmCisgICAgIyBFbWl0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KKyAgICBpZmVxICIkKERFQlVHX0lORk8pIiAib24iCisgICAgICAgIGMtZmxhZ3MgICArPSAtZworICAgICAgICBjeHgtZmxhZ3MgKz0gLWcKKyAgICBlbmRpZgorICAgICMgSW5zdHJ1bWVudCBwcm9ncmFtIGZvciBwcm9maWxpbmcsIGdhdGhlciBleHRyYSBpbmZvcm1hdGlvbi4KKyAgICBpZmVxICIkKENPVkVSQUdFKSIgIm9uIgorICAgICAgICBpZmVxICIkKGMpIiAiaWNjIgorICAgICAgICAgICAgYy1mbGFncyAgICs9IC1wcm9mX2dlbngKKyAgICAgICAgZW5kaWYKKyAgICAgICAgaWZlcSAiJChjeHgpIiAiaWNwYyIKKyAgICAgICAgICAgIGN4eC1mbGFncyArPSAtcHJvZl9nZW54CisgICAgICAgIGVuZGlmCisgICAgZW5kaWYKKyAgICAjIFR1cm4gb3B0aW1pemF0aW9uIG9uIG9yIG9mZi4KKyAgICBpZmVxICIkKE9QVElNSVpBVElPTikiICJvbiIKKyAgICAgICAgIyAtaW5saW5lLW1pbi1zaXplPTEgaW1wcm92ZXMgcGVyZm9ybWFuY2Ugb2YgUEFSQUxMRUwgRVBDQyB1cCB0byAxMCUgb24gZnhpNjRsaW4wMSwKKyAgICAgICAgIyBkb2Vzbid0IGNoYW5nZSBwZXJmb3JtYW5jZSBvbiBmeGU2NGxpbjAxLgorICAgICAgICAjIFByZXNlbmNlIG9mIHRoZSAtaW5saW5lLW1pbi1zaXplPTEgc3dpdGNoIHNob3VsZCBvbmx5IGhlbHAKKyAgICAgICAgIyB0byBwcm9tb3RlIHBlcmZvcm1hbmNlIHN0YWJpbGl0eSBiZXR3ZWVuIGNoYW5nZXMsCisgICAgICAgICMgZXZlbiBpZiBpdCBoYXMgbm8gb2JzZXJ2YWJsZSBpbXBhY3QgcmlnaHQgbm93LgorCWlmbmVxICIkKGZpbHRlciBpY2wgaWNsLmV4ZSwkKGMpKSIgIiIKKyAgICAgICAgICAgIGMtZmxhZ3MgICArPSAtTzIgLWlubGluZS1taW4tc2l6ZT0xCisJZWxzZQorICAgICAgICAgICAgYy1mbGFncyAgICs9IC1PMgorCWVuZGlmCisgICAgICAgIGlmbmVxICIkKGZpbHRlciBpY2wgaWNsLmV4ZSwkKGN4eCkpIiAiIgorICAgICAgICAgICAgY3h4LWZsYWdzICs9IC1PMiAtaW5saW5lLW1pbi1zaXplPTEKKwllbHNlCisgICAgICAgICAgICBjeHgtZmxhZ3MgKz0gLU8yCisJZW5kaWYKKyAgICBlbHNlCisgICAgICAgIGMtZmxhZ3MgICArPSAtTzAKKyAgICAgICAgY3h4LWZsYWdzICs9IC1PMAorICAgIGVuZGlmCisgICAgIyAtLS0gQXNzZW1ibGVyIC0tLQorICAgIGlmZXEgIiQoYykiICJpY2MiCisgICAgICAgIGFzICAgICAgICA9IGljYworICAgIGVuZGlmCisgICAgaWZlcSAiJChjKSIgImdjYyIKKyAgICAgICAgYXMgICAgICAgID0gZ2NjCisgICAgZW5kaWYKKyAgICBpZmVxICIkKGMpIiAiY2xhbmciCisgICAgICAgIGFzICAgICAgICA9IGNsYW5nCisgICAgZW5kaWYKKyAgICBhcy1vdXQgICAgPSAtbyQoc3BhY2UpCisgICAgYXMtZmxhZ3MgKz0gJChjcHAtZmxhZ3MpCisgICAgIyBDb21waWxlIG9ubHksIG5vIGxpbmsuCisgICAgYXMtZmxhZ3MgKz0gLWMKKyAgICBhcy1mbGFncyArPSAteCBhc3NlbWJsZXItd2l0aC1jcHAKKyAgICAjIC0tLSBGb3J0cmFuIC0tLQorICAgIGlmZXEgIiQoYykiICJpY2MiCisgICAgICAgIGZvcnQgPSBpZm9ydAorICAgIGVuZGlmCisgICAgaWZlcSAiJChjKSIgImdjYyIKKyAgICAgICAgZm9ydCA9IGdmb3J0cmFuCisgICAgZW5kaWYKKyAgICBpZmVxICIkKGMpIiAiY2xhbmciCisgICAgICAgIGZvcnQgPSBnZm9ydHJhbgorICAgIGVuZGlmCisgICAgaWZlcSAiJChmb3J0KSIgIiIKKyAgICAgICAgZm9ydCA9IGlmb3J0CisgICAgZW5kaWYKKyAgICBmb3J0LW91dCAgICA9IC1vJChzcGFjZSkKKyAgICBmb3J0LWZsYWdzICs9IC1jCitlbmRpZgorCisjIC0tLSBMaW51eCogT1MgZGVmaW5pdGlvbnMgLS0tCisKK2lmZXEgIiQob3MpIiAibGluIgorICAgICMgLS0tIEMvQysrIC0tLQorICAgICMgT24gbGluXzMyLCB3ZSB3YW50IHRvIG1haW50YWluIHN0YWNrIGFsaWdubWVudCB0byBiZSBjb25wYXRpYmxlIHdpdGggR05VIGJpbmFyaWVzIGJ1aWx0IHdpdGgKKyAgICAjIGNvbXBpbGVyLgorICAgIGlmZXEgIiQoYykiICJpY2MiCisgICAgICAgIGlmZXEgIiQoYXJjaCkiICIzMiIKKyAgICAgICAgICAgIGMtZmxhZ3MgICArPSAtZmFsaWduLXN0YWNrPW1haW50YWluLTE2LWJ5dGUKKyAgICAgICAgICAgIGN4eC1mbGFncyArPSAtZmFsaWduLXN0YWNrPW1haW50YWluLTE2LWJ5dGUKKyAgICAgICAgZW5kaWYKKyAgICAgICAgIyBHZW5lcmF0ZSBjb2RlIHRoYXQgd2lsbCBydW4gb24gYW55IFBlbnRpdW0gb3IgbGF0ZXIgcHJvY2Vzc29yLgorICAgICAgICBpZmVxICIkKGFyY2gpIiAiMzIiCisgICAgICAgICAgICBjLWZsYWdzICAgKz0gLW1pYTMyCisgICAgICAgICAgICBjeHgtZmxhZ3MgKz0gLW1pYTMyCisgICAgICAgIGVuZGlmCisgICAgZW5kaWYKKyAgICBpZmVxICIkKGMpIiAiZ2NjIgorICAgICAgICBpZmVxICIkKGFyY2gpIiAiYXJtIgorICAgICAgICAgICAgYy1mbGFncyAgICs9IC1tYXJtCisgICAgICAgIGVuZGlmCisgICAgZW5kaWYKKyAgICAjIC0tLSBMaWJyYXJpYW4gLS0tCisgICAgYXIgICAgICAgID0gYXIKKyAgICBhci1vdXQgICAgPSAkKGVtcHR5KQorICAgIGFyLWZsYWdzICs9IGNyCisgICAgIyAtLS0gTGlua2VyIC0tLQorICAgICMgVXNlIGxkIGJ5IGRlZmF1bHQsIGhvd2V2ZXIsIG1ha2VmaWxlIG1heSBzcGVjaWZ5IGxkPSQoYykgYmVmb3JlIGluY2x1ZGluZyBkZXZ0b29scy5tay4KKyAgICBpZmVxICIkKGxkKSIgIiIKKyAgICAgICAgbGQgPSAkKGMpCisgICAgZW5kaWYKKyAgICBsZC1mbGFncy1kbGwgKz0gLXNoYXJlZAorICAgIGlmZXEgIiQobGQpIiAibGQiCisgICAgICAgIGxkLW91dCA9IC1vJChzcGFjZSkKKyAgICAgICAgaWZlcSAiJChhcmNoKSIgIjMyIgorICAgICAgICAgICAgbGQtZmxhZ3MgKz0gLW0gZWxmX2kzODYKKyAgICAgICAgZW5kaWYKKyAgICAgICAgaWZlcSAiJChhcmNoKSIgIjMyZSIKKyAgICAgICAgICAgIGxkLWZsYWdzICs9IC1tIGVsZl94ODZfNjQKKyAgICAgICAgZW5kaWYKKyAgICAgICAgbGQtZmxhZ3MgICAgICs9IC14IC1sYyAtbGRsCisgICAgICAgIGxkLWZsYWdzICAgICArPSAteiBub2V4ZWNzdGFjaworICAgICAgICBsZC1mbGFncy1kbGwgKz0gLXNvbmFtZT0kKEBGKQorICAgIGVuZGlmCisgICAgaWZlcSAiJChsZCkiICIkKGMpIgorICAgICAgICBsZC1vdXQgICAgPSAkKGMtb3V0KQorICAgICAgICBsZC1mbGFncyArPSAtV2wsLXosbm9leGVjc3RhY2sKKyAgICAgICAgbGQtZmxhZ3MtZGxsICs9IC1XbCwtc29uYW1lPSQoQEYpCisgICAgZW5kaWYKKyAgICBpZmVxICIkKGxkKSIgIiQoY3h4KSIKKyAgICAgICAgbGQtb3V0ICAgID0gJChjeHgtb3V0KQorICAgICAgICBsZC1mbGFncyArPSAtV2wsLXosbm9leGVjc3RhY2sKKyAgICAgICAgbGQtZmxhZ3MtZGxsICs9IC1XbCwtc29uYW1lPSQoQEYpCisgICAgZW5kaWYKK2VuZGlmCisKKyMgLS0tIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZSBkZWZpbml0aW9ucyAtLS0KKworaWZlcSAiJChvcykiICJscmIiCisgICAgIyAtLS0gQy9DKysgLS0tCisgICAgIyBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUgc3BlY2lmaWMgb3B0aW9ucywgbmVlZCBjbGFyaWZpY2F0aW9uIGZvciBwdXJwb3NlOgorICAgICNjLWZsYWdzICAgICArPSAtbW1pYyAtbVAyT1BUX2ludHJpbl9kaXNhYmxlX25hbWU9bWVtY3B5IC1tUDJPUFRfaW50cmluX2Rpc2FibGVfbmFtZT1tZW1zZXQgLW1HTE9CX2ZyZWVzdGFuZGluZyAtbUdMT0Jfbm9uc3RhbmRhcmRfbGliIC1ub3N0ZGxpYiAtZm5vLWJ1aWx0aW4KKyAgICAjY3h4LWZsYWdzICAgKz0gLW1taWMgLW1QMk9QVF9pbnRyaW5fZGlzYWJsZV9uYW1lPW1lbWNweSAtbVAyT1BUX2ludHJpbl9kaXNhYmxlX25hbWU9bWVtc2V0IC1tR0xPQl9mcmVlc3RhbmRpbmcgLW1HTE9CX25vbnN0YW5kYXJkX2xpYiAtbm9zdGRsaWIgLWZuby1idWlsdGluCisgICAgIyBpY2MgZm9yIGxyYiBoYXMgYSBidWc6IGl0IGdlbmVyYXRlcyBkZXBlbmRlbmNpZXMgZm9yIHRhcmdldCBsaWtlIGZpbGUub2JqLCB3aGlsZSByZWFsIG9iamVjdAorICAgICMgZmlsZXMgYXJlIG5hbWVkIGZpbGUuby4gLU1UIGlzIGEgd29ya2Fyb3VuZCBmb3IgdGhlIHByb2JsZW0uCisgICAgYy1mbGFncy1tICAgKz0gLU1UICQoYmFzZW5hbWUgJEApLm8KKyAgICBjeHgtZmxhZ3MtbSArPSAtTVQgJChiYXNlbmFtZSAkQCkubworICAgICMgLS0tIExpYnJhcmlhbiAtLS0KKyAgICBhciAgICAgICAgPSBhcgorICAgIGFyLW91dCAgICA9ICQoZW1wdHkpCisgICAgYXItZmxhZ3MgKz0gY3IKKyAgICAjIC0tLSBMaW5rZXIgLS0tCisgICAgIyBVc2UgJChjKSBieSBkZWZhdWx0LCBob3dldmVyLCBtYWtlZmlsZSBtYXkgc3BlY2lmeSBhbm90aGVyIGxpbmtlciAoZS5nLiBsZD1sZCkgYmVmb3JlIGluY2x1ZGluZyBkZXZ0b29scy5tay4KKyAgICBpZmVxICIkKGxkKSIgIiIKKyAgICAgICAgbGQgPSAkKGMpCisgICAgZW5kaWYKKyAgICBpZmVxICIkKGxkKSIgImxkIgorICAgICAgICBsZC1vdXQgICA9IC1vJChzcGFjZSkKKyAgICAgICAgbGQtZmxhZ3MgKz0gLW0gZWxmX2wxb21fZmJzZAorICAgICAgICBsZC1mbGFncy1kbGwgKz0gLXNoYXJlZCAteCAtbGMKKyAgICAgICAgbGQtZmxhZ3MtZGxsICs9IC1zb25hbWU9JChARikKKyAgICAgICAgIyBOb3cgZmluZCBvdXQgcGF0aCB0byBsaWJyYXJpZXMuCisgICAgICAgICAgICBsZC1mbGFncy1MIDo9ICQoc2hlbGwgJChjKSAtV2wsLXYgLVwjIDI+JjEgfCBncmVwIC1lICItTCIpCisgICAgICAgICAgICAkKGNhbGwgZGVidWcsbGQtZmxhZ3MtTCkKKyAgICAgICAgICAgICMgUmVtb3ZlIGNvbnRpbnVhdGlvbiBjaGFyYWN0ZXJzOyBmaXJzdCBhZGQgYSBzcGFjZSB0byB0aGUgZW5kICgiIC1McGF0aDEgLyIgLT4gIi1McGF0aDEgLyAiKQorICAgICAgICAgICAgbGQtZmxhZ3MtTCA6PSAkKGZpbHRlci1vdXQgXCwkKGxkLWZsYWdzLUwpKQorICAgICAgICAgICAgJChjYWxsIGRlYnVnLGxkLWZsYWdzLUwpCisgICAgICAgICAgICAjIExpbmtlciB0cmVhdHMgYmFja3NsYXNoICgnXCcpIGFzIGFuIGVzY2FwZSBzeW1ib2wsIHNvIHJlcGxhY2UgaXQgd2l0aCBmb3J3YXJkIHNsYXNoLgorICAgICAgICAgICAgbGQtZmxhZ3MtTCA6PSAkKHN1YnN0IFwsLywkKGxkLWZsYWdzLUwpKQorICAgICAgICAgICAgJChjYWxsIGRlYnVnLGxkLWZsYWdzLUwpCisgICAgICAgIGxkLWZsYWdzICs9ICQobGQtZmxhZ3MtTCkKKyAgICBlbmRpZgorICAgIGlmZXEgIiQobGQpIiAiJChjKSIKKyAgICAgICAgbGQtb3V0ICAgICAgICA9ICQoYy1vdXQpCisgICAgICAgIGxkLWZsYWdzLWRsbCArPSAtc2hhcmVkIC1XbCwteCAtV2wsLXNvbmFtZT0kKEBGKQorICAgIGVuZGlmCisgICAgaWZlcSAiJChsZCkiICIkKGN4eCkiCisgICAgICAgIGxkLW91dCAgICAgICAgPSAkKGN4eC1vdXQpCisgICAgICAgIGxkLWZsYWdzLWRsbCArPSAtc2hhcmVkIC1XbCwteCAtV2wsLXNvbmFtZT0kKEBGKQorICAgIGVuZGlmCitlbmRpZgorCisjIC0tLSBPUyBYKiBkZWZpbml0aW9ucyAtLS0KKworaWZlcSAiJChvcykiICJtYWMiCisgICAgIyAtLS0gTGlicmFyaWFuIC0tLQorICAgIGFyICAgICAgICA9IGxpYnRvb2wKKyAgICBhci1vdXQgICAgPSAtbyQoc3BhY2UpCisgICAgYXItZmxhZ3MgKz0gLXN0YXRpYworICAgICMgLS0tIExpbmtlciAtLS0KKyAgICAjIFVzZSBDIGNvbXBpbGVyIGFzIGxpbmtlciBieSBkZWZhdWx0LCBob3dldmVyLCBtYWtlZmlsZSBtYXkgc3BlY2lmeSBsZD0kKGxpYnRvb2wpIGJlZm9yZQorICAgICMgaW5jbHVkaW5nIGRldnRvb2xzLm1rLgorICAgIGlmZXEgIiQobGQpIiAiIgorICAgICAgICBsZCA9ICQoYykKKyAgICBlbmRpZgorICAgIGlmZXEgIiQobGQpIiAibGlidG9vbCIKKyAgICAgICAgbGQtb3V0ICAgICAgICA9IC1vJChzcGFjZSkKKyAgICAgICAgbGQtZmxhZ3MtZGxsICs9IC1keW5hbWljCisgICAgICAgIGxkLWZsYWdzICAgICArPSAtbGMgLWxkbAorICAgIGVuZGlmCisgICAgaWZlcSAiJChsZCkiICIkKGMpIgorICAgICAgICBsZC1vdXQgICAgICAgID0gJChjLW91dCkKKyAgICAgICAgbGQtZmxhZ3MtZGxsICs9IC1keW5hbWljbGliCisgICAgZW5kaWYKKyAgICBpZmVxICIkKGxkKSIgIiQoY3h4KSIKKyAgICAgICAgbGQtb3V0ICAgICAgICA9ICQoY3h4LW91dCkKKyAgICAgICAgbGQtZmxhZ3MtZGxsICs9IC1keW5hbWljbGliCisgICAgZW5kaWYKKyAgICAjIFRoZXNlIG9wdGlvbnMgc3VpdGFibGUgZm9yIGFueSBsaW5rZXIsIGVpdGhlciBDIGNvbXBpbGVyIG9yIGxpYnRvb2wuCisgICAgbGQtZmxhZ3MtZGxsICs9IC1oZWFkZXJwYWRfbWF4X2luc3RhbGxfbmFtZXMKKyAgICBsZC1mbGFncy1kbGwgKz0gLWluc3RhbGxfbmFtZSAkKEBGKQorZW5kaWYKKworIyAtLS0gV2luZG93cyogT1MgZGVmaW5pdGlvbnMgLS0tCisKK2lmZXEgIiQob3MpIiAid2luIgorICAgICMgRGlzYWJsZSB3YXJuaW5nICJmdW5jdGlvbiAiLi4uIiAoZGVjbGFyZWQgYXQgbGluZSAuLi4gb2YgLi4uKSB3YXMgZGVjbGFyZWQgZGVwcmVjYXRlZC4uLiIuCisgICAgY3BwLWZsYWdzICs9IC1EX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MgLURfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUKKyAgICAjIC0tLSBDL0MrKyAtLS0KKyAgICBpZmVxICIkKGMpIiAiIgorICAgICAgICBjID0gaWNsLmV4ZQorICAgIGVuZGlmCisgICAgY3h4ICAgID0gJChjKQorICAgICMgT2Z0ZW4gZGVmYXVsdCBpY2wuY2ZnIGZpbGUgaW4gY29tcGlsZXIgYmluLyBkaXJlY3RvcnkgY29udGFpbnMgb3B0aW9ucyAtUXZjIGFuZAorICAgICMgLVFsb2NhdGlvbixsaW5rLiBTZXR0aW5nIElDTENGRyAoYW5kIElGT1JUQ0ZHKSB0byBzcGVjaWFsbHkgcHJlcGFyZWQgZW1wdHkgY29uZmlnIGZpbGUKKyAgICAjIG92ZXJyaWRlcyBkZWZhdWx0IGNvbmZpZy4KKyAgICBJQ0xDRkcgICA9ICQodG9vbHNfZGlyKWljYy5jZmcKKyAgICBJRk9SVENGRyA9ICQodG9vbHNfZGlyKWljYy5jZmcKKyAgICBleHBvcnQgSUNMQ0ZHCisgICAgZXhwb3J0IElGT1JUQ0ZHCisgICAgIyBPdXRwdXQgZmlsZS4KKyAgICBjLW91dCAgID0gLW8kKHNwYWNlKQorICAgIGN4eC1vdXQgPSAtbyQoc3BhY2UpCisgICAgIyBEaXNhYmxlIGFubm95aW5nIGNvbXBpbGVyIGxvZ28uCisgICAgYy1mbGFncyAgICs9IC1ub2xvZ28KKyAgICBjeHgtZmxhZ3MgKz0gLW5vbG9nbworICAgICMgR2VuZXJhdGUgY29kZSB0aGF0IHdpbGwgcnVuIG9uIGFueSBQZW50aXVtIG9yIGxhdGVyIHByb2Nlc3Nvci4KKyAgICBpZmVxICIkKGFyY2gpIiAiMzIiCisgICAgICAgIGMtZmxhZ3MgICArPSAtYXJjaDppYTMyCisgICAgICAgIGN4eC1mbGFncyArPSAtYXJjaDppYTMyCisgICAgZW5kaWYKKyAgICAjIENvbXBpbGUgb25seSwgbm8gbGluay4KKyAgICBjLWZsYWdzICAgKz0gLWMKKyAgICBjeHgtZmxhZ3MgKz0gLWMKKyAgICAjIC1RTSAgLS0gR2VuZXJhdGUgZGVwZW5kZW5jeSBmaWxlLgorICAgICMgLVFNTSAtLSBkbyBub3QgaW5jbHVkZSBzeXN0ZW0gaGVhZGVycy4gT24gV2luZG93cyogT1MsIHN5c3RlbSBoZWFkZXJzIG1heSBiZSBsb2NhdGVkIGluCisgICAgIyAgICAgICAgICJDOlxQcm9ncmFtIEZpbGVzXC4uLiIsIGJ1dCBwYXRoIHdpdGggc3BhY2UgY29uZnVzZXMgbWFrZSwgc28gd2UgZXhjbHVkZSBzeXN0ZW0KKyAgICAjICAgICAgICAgaGVhZGVycy4KKyAgICAjIC1RTUcgLS0gVHJlYXQgbWlzc2VkIGhlYWRlcnMgYXMgZ2VuZXJhdGVkLiBXZSBkbyBoYXZlIHNvbWUgZ2VuZXJhdGVkIGluY2x1ZGUgZmlsZXMuCisgICAgYy1mbGFncy1tICAgKz0gLVFNIC1RTU0gLVFNRworICAgIGN4eC1mbGFncy1tICs9IC1RTSAtUU1NIC1RTUcKKyAgICAjIEVuYWJsZSBDOTkgbGFuZ3VhZ2UuCisgICAgaWZuZXEgIiQoQ1BMVVNQTFVTKSIgIm9uIgorICAgIAljLWZsYWdzICAgKz0gLVFzdGQ9Z251OTkKKyAgICBlbmRpZgorICAgICMgRW5hYmxlIEMrKyBleGNlcHRpb24gaGFuZGxpbmcuCisgICAgIyA/Pz8gV2h5IHdlIGRpc2FibGUgaXQgb24gTGludXgqIE9TPworICAgIGN4eC1mbGFncyArPSAtRUhzYworICAgIGlmZXEgIiQoYXJjaCkiICIzMiIKKyAgICAgICAgaWZuZXEgIiQoZmlsdGVyIGljbCBpY2wuZXhlLCQoYykpIiAiIgorICAgICAgICAgICAgYy1mbGFncyAgICs9IC1Rc2FmZXNlaAorICAgICAgICBlbmRpZgorICAgICAgICBpZm5lcSAiJChmaWx0ZXIgaWNsIGljbC5leGUsJChjeHgpKSIgIiIKKyAgICAgICAgICAgIGN4eC1mbGFncyArPSAtUXNhZmVzZWgKKyAgICAgICAgZW5kaWYKKyAgICBlbmRpZgorICAgICMgRW1pdCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCisgICAgaWZlcSAiJChERUJVR19JTkZPKSIgIm9uIgorICAgICAgICBjLWZsYWdzICAgKz0gLVppCisgICAgICAgIGN4eC1mbGFncyArPSAtWmkKKyAgICBlbmRpZgorICAgICMgSW5zdHJ1bWVudCBwcm9ncmFtIGZvciBwcm9maWxpbmcsIGdhdGhlciBleHRyYSBpbmZvcm1hdGlvbi4KKyAgICBpZmVxICIkKENPVkVSQUdFKSIgIm9uIgorICAgICAgICBjLWZsYWdzICAgKz0gLVFwcm9mX2dlbngKKyAgICAgICAgY3h4LWZsYWdzICs9IC1RcHJvZl9nZW54CisgICAgZW5kaWYKKyAgICAjIFR1cm4gb3B0aW1pemF0aW9uIG9uIG9yIG9mZi4KKyAgICBpZmVxICIkKE9QVElNSVpBVElPTikiICJvbiIKKyAgICAgICAgIyBQcmVzZW5jZSBvZiB0aGUgLWlubGluZS1taW4tc2l6ZT0xIHN3aXRjaCBzaG91bGQgb25seSBoZWxwCisgICAgICAgICMgdG8gcHJvbW90ZSBwZXJmb3JtYW5jZSBzdGFiaWxpdHkgYmV0d2VlbiBjaGFuZ2VzLAorICAgICAgICAjIGV2ZW4gaWYgaXQgaGFzIG5vIG9ic2VydmFibGUgaW1wYWN0IHJpZ2h0IG5vdy4KKyAgICAgICAgIyBTZWUgdGhlIExpbnV4KiBPUyBzZWN0aW9uIGFib3ZlLgorCWlmbmVxICIkKGZpbHRlciBpY2wgaWNsLmV4ZSwkKGMpKSIgIiIKKwkgICAgYy1mbGFncyAgICs9IC1PMiAtUWlubGluZS1taW4tc2l6ZT0xCisJZWxzZQorCSAgICBjLWZsYWdzICAgKz0gLU8yCisJZW5kaWYgCisgICAgICAgIGlmbmVxICIkKGZpbHRlciBpY2wgaWNsLmV4ZSwkKGN4eCkpIiAiIgorICAgICAgICAgICAgY3h4LWZsYWdzICs9IC1PMiAtUWlubGluZS1taW4tc2l6ZT0xCisJZWxzZQorICAgICAgICAgICAgY3h4LWZsYWdzICs9IC1PMgorCWVuZGlmCisgICAgZWxzZQorICAgICAgICBjLWZsYWdzICAgKz0gLU9kCisgICAgICAgIGN4eC1mbGFncyArPSAtT2QKKyAgICAgICAgIyBFbmFibGUgc3RhY2sgZnJhbWUgcnVudGltZSBlcnJvciBjaGVja2luZy4KKyAgICAgICAgIyAhISEgME9ic29sZXRlIG9wdGlvbi4gU2hvdWxkIHVzZSAvUlRDIGluc3RlYWQuCisgICAgICAgIGMtZmxhZ3MgICArPSAtUlRDMQorICAgICAgICBjeHgtZmxhZ3MgKz0gLVJUQzEKKyAgICBlbmRpZgorICAgICMgLS0tIEFzc2VtYmxlciAtLS0KKyAgICBpZmVxICIkKGFyY2gpIiAiMzIiCisgICAgICAgIGFzICAgPSBtbAorICAgIGVuZGlmCisgICAgaWZlcSAiJChhcmNoKSIgIjMyZSIKKyAgICAgICAgYXMgICA9IG1sNjQKKyAgICBlbmRpZgorICAgIGlmZXEgIiQoYXMpIiAiaWFzIgorICAgICAgICBhcy1vdXQgICA9IC1vJChzcGFjZSkKKyAgICBlbmRpZgorICAgIGlmbmVxICIkKGZpbHRlciBtbCBtbDY0LCQoYXMpKSIgIiIKKyAgICAgICAgYXMtb3V0ICAgPSAtRm8KKyAgICAgICAgYXMtZmxhZ3MgKz0gLW5vbG9nbyAtYworICAgIGVuZGlmCisgICAgIyAtLS0gRm9ydHJhbiAtLS0KKyAgICBmb3J0ICAgICAgICA9IGlmb3J0CisgICAgZm9ydC1vdXQgICAgPSAtbyQoc3BhY2UpCisgICAgZm9ydC1mbGFncyArPSAtbm9sb2dvCisgICAgZm9ydC1mbGFncyArPSAtYworICAgICMgLS0tIExpYnJhcmlhbiAtLS0KKyAgICBhciAgICAgPSBsaW5rLmV4ZQorICAgIGFyLW91dCA9IC1vdXQ6CisgICAgIyBHZW5lcmF0ZSBzdGF0aWMgbGlicmFyeS4gTXVzdCBiZSB0aGUgZmlyc3Qgb3B0aW9uLgorICAgIGFyLWZsYWdzICs9IC1saWIKKyAgICAjIFR1cm4gb2ZmIHRvb2wgYmFubmVyLgorICAgIGFyLWZsYWdzICs9IC1ub2xvZ28KKyAgICAjIC0tLSBMaW5rZXIgLS0tCisgICAgbGQgICAgICAgPSBsaW5rLmV4ZQorICAgIGxkLW91dCAgID0gLW91dDoKKyAgICAjIEdlbmVyYXRlIGR5bmFtaWMgbGlicmFyeS4KKyAgICBsZC1mbGFncy1kbGwgKz0gLWRsbAorICAgICMgVHVybiBvZmYgdG9vbCBiYW5uZXIuCisgICAgbGQtZmxhZ3MgKz0gLW5vbG9nbworICAgICMgR2VuZXJhdGUgcGRiIChQcm9ncmFtIERhdGFCYXNlLCBkZWJ1ZyBpbmZvcm1hdGlvbikgZmlsZS4KKyAgICAjIElmIERFQlVHX0lORk8gaXMgb24sIGdlbmVyYXRlIG5vcm1hbCAoZnVsbC1mZWF0dXJlZCkgcGRiIGZpbGUuIE90aGVyd2lzZSwgd2UgbmVlZCBvbmx5CisgICAgIyBzdHJpcHBlZCBwZGIuIEJ1dCBzdHJpcHBlZCBwZGIgY2Fubm90IGJlIGdlbmVyYXRlZCBhbG9uZSwgd2UgaGF2ZSB0byBnZW5lcmF0ZSBub3JtYWwgKmFuZCoKKyAgICAjIHN0cmlwcGVkIHBkYi4gQWZ0ZXIgZ2VuZXJhdGluZyBib3RoIHBkYiBmaWxlcyB3ZSByZW5hbWUgc3RyaXBwZWQgcGRiIHRvIG5vcm1hbCBwZGIgbmFtZSAoc2VlCisgICAgIyBydWxlcy5taykuCisgICAgaWZlcSAiJChERUJVR19JTkZPKSIgIm9uIgorICAgICAgICBsZC1mbGFncyArPSAkKGlmICQocGRiX2ZpbGUpLC1kZWJ1ZyAtcGRiOiQocGRiX2ZpbGUpKQorICAgIGVsc2UKKyAgICAgICAgbGQtZmxhZ3MgKz0gJChpZiAkKHBkYl9maWxlKSwtZGVidWcgLXBkYjokKHBkYl9maWxlKSAtcGRic3RyaXBwZWQ6JChwZGJfZmlsZSkuc3RyaXBwZWQpCisgICAgZW5kaWYKKyAgICAjIFVzZSBkZWYgZmlsZSwgaWYgJChkZWZfZmlsZSkgaXMgc3BlY2lmaWVkLgorICAgIGxkLWZsYWdzICs9ICQoaWYgJChkZWZfZmlsZSksLWRlZjokKGRlZl9maWxlKSkKKyAgICAjIEdlbmVyYXRlIGltcG9ydCBsaWJyYXJ5LCBpZiAkKGltcF9maWxlKSBpcyBzcGVjaWZpZWQuCisgICAgbGQtZmxhZ3MgKz0gJChpZiAkKGltcF9maWxlKSwtaW1wbGliOiQoaW1wX2ZpbGUpKQorICAgICMgU3BlY2lmeSBhcmNoaXRlY3R1cmUuCisgICAgaWZlcSAiJChhcmNoKSIgIjMyIgorICAgICAgICBhci1mbGFncyArPSAtbWFjaGluZTppMzg2CisgICAgICAgIGxkLWZsYWdzICs9IC1tYWNoaW5lOmkzODYKKyAgICBlbmRpZgorICAgIGlmZXEgIiQoYXJjaCkiICIzMmUiCisgICAgICAgIGFyLWZsYWdzICs9IC1tYWNoaW5lOmFtZDY0CisgICAgICAgIGxkLWZsYWdzICs9IC1tYWNoaW5lOmFtZDY0CisgICAgZW5kaWYKKyAgICAjIFNBRkVTRUgKKyAgICBpZmVxICIkKGFyY2gpIiAiMzIiCisgICAgICAgIGFzLWZsYWdzICs9IC1zYWZlc2VoCisgICAgICAgIGxkLWZsYWdzICs9IC1zYWZlc2VoCisgICAgZW5kaWYKK2VuZGlmCisKKyMgZW5kIG9mIGZpbGUgIwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90b29scy93aW5kb3dzLmluYyBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvd2luZG93cy5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QyZTA3MAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvd2luZG93cy5pbmMKQEAgLTAsMCArMSwyNyBAQAorIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCitleHBvcnQgU0hFTEwgPSBjbWQKKworIyBUT0RPIGdpdmUgYW4gZXJyb3IgaWYgYXJjaHMgZG9lc24ndCBtYXRjaAoraWZuZGVmIGFyY2gKKyAgICAkKGVycm9yIENvdWxkIG5vdCBkZXRlY3QgYXJjaDogcGxlYXNlIHNwZWNpZnkgb24gY29tbWFuZCBsaW5lLikKK2VuZGlmCisKKworQ01EPWNtZCAvQworQ1dEPSQoc2hlbGwgY21kIC9DIGVjaG8gJUNEJSkKK1JNPWNtZCAvQyBkZWwgL1EgL0YKK1JEPWNtZCAvQyBybWRpcgorTUQ9Y21kIC9jIG1rZGlyCitTTEFTSD1cXAorTlVMID0gbnVsCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdG9vbHMvd2lwZS1zdHJpbmcucGwgYi9maW5hbC9ydW50aW1lL3Rvb2xzL3dpcGUtc3RyaW5nLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRlYWI5NWYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rvb2xzL3dpcGUtc3RyaW5nLnBsCkBAIC0wLDAgKzEsMTgzIEBACisjIS91c3IvYmluL3BlcmwKKworIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgRmlsZTo6R2xvYiAiOmdsb2IiOworCit1c2UgRmluZEJpbjsKK3VzZSBsaWIgIiRGaW5kQmluOjpCaW4vbGliIjsKKwordXNlIHRvb2xzOworCitvdXIgJFZFUlNJT04gPSAiMC4wMiI7CisKK3N1YiB3aXBlKCQkJCkgeworCisgICAgbXkgKCAkaW5wdXQsICRvdXRwdXQsICR3aXBlICkgPSBAXzsKKyAgICBteSAkYnVsayA9IHJlYWRfZmlsZSggJGlucHV0LCAtYmluYXJ5ID0+IDEgKTsKKyAgICAkYnVsayA9fiBzeygkd2lwZSl9eyAiICIgeCBsZW5ndGgoICQxICkgfWdlOworICAgIHdyaXRlX2ZpbGUoICRvdXRwdXQsIFwkYnVsaywgLWJpbmFyeSA9PiAxICk7CisgICAgcmV0dXJuIHVuZGVmOworCit9OyAjIHN1YiB3aXBlCisKK215IEB3aXBlOworbXkgJHRhcmdldCA9ICIuIjsKK2dldF9vcHRpb25zKAorICAgICJ3aXBlLWxpdGVyYWw9cyIgICAgID0+CisgICAgICAgIHN1YiB7IG15ICRhcmcgPSAkX1sgMSBdOyBwdXNoKCBAd2lwZSwgcXJ7QHsgWyBxdW90ZW1ldGEoICRhcmcgKSBdIH19ICk7IH0sCisgICAgIndpcGUtcmVnZXhwPXMiICAgICAgPT4KKyAgICAgICAgc3ViIHsgbXkgJGFyZyA9ICRfWyAxIF07IHB1c2goIEB3aXBlLCBxcnskYXJnfSApOyB9LAorICAgICJ0YXJnZXQtZGlyZWN0b3J5PXMiID0+IFwkdGFyZ2V0LAorKTsKKworIyBDb252ZXJ0IHN0cmluZ3MgdG8gcmVndWxhciBleHByZXNzaW9uLgorbXkgJHdpcGUgPSBxcntAeyBbIGpvaW4oICJ8IiwgQHdpcGUgKSBdIH19OworCitteSAlam9iczsKKworIyBDb2xsZWN0IGZpbGVzIHRvIHByb2Nlc3MuCisjIGpvYnM6IG91dHB1dCAtPiBpbnB1dC4KK2ZvcmVhY2ggbXkgJGFyZyAoIEBBUkdWICkgeworICAgIG15IEBpbnB1dHMgPSAoICReTyBlcSAiTVNXaW4zMiIgPyBic2RfZ2xvYiggJGFyZyApIDogKCAkYXJnICkgKTsKKyAgICBmb3JlYWNoIG15ICRpbnB1dCAoIEBpbnB1dHMgKSB7CisgICAgICAgIG15ICRmaWxlICAgPSBnZXRfZmlsZSggJGlucHV0ICk7CisgICAgICAgIG15ICRvdXRwdXQgPSBjYXRfZmlsZSggJHRhcmdldCwgJGZpbGUgKTsKKyAgICAgICAgaWYgKCBleGlzdHMoICRqb2JzeyAkb3V0cHV0IH0gKSApIHsKKyAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoCisgICAgICAgICAgICAgICAgIlwiJGpvYnN7ICRvdXRwdXQgfVwiIGFuZCBcIiRpbnB1dFwiIGlucHV0IGZpbGVzIHRlbmQgdG8gYmUgd3JpdHRlbiAiIC4KKyAgICAgICAgICAgICAgICAgICAgInRvIHRoZSBzYW1lIG91dHB1dCBmaWxlIFwiJG91dHB1dFwiIgorICAgICAgICAgICAgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICAkam9ic3sgJG91dHB1dCB9ID0gJGlucHV0OworICAgIH07ICMgZm9yZWFjaAorfTsgIyBmb3JlYWNoICRmaWxlCisKKyMgUHJvY2VzcyBmaWxlcy4KKyVqb2JzID0gcmV2ZXJzZSggJWpvYnMgKTsgIyBqb2JzOiBpbnB1dCAtPiBvdXRwdXQuCitmb3JlYWNoIG15ICRpbnB1dCAoIHNvcnQoIGtleXMoICVqb2JzICkgKSApIHsKKyAgICBteSAkb3V0cHV0ID0gJGpvYnN7ICRpbnB1dCB9OworICAgIGluZm8oICJcIiRpbnB1dFwiIC0+IFwiJG91dHB1dFwiIiApOworICAgIHdpcGUoICRpbnB1dCwgJG91dHB1dCwgJHdpcGUgKTsKK307ICMgZm9yZWFjaCAkaW5wdXQKKworZXhpdCggMCApOworCitfX0VORF9fCisKKyMKKyMgRW1iZWRkZWQgZG9jdW1lbnRhdGlvbi4KKyMKKworPXBvZAorCis9aGVhZDEgTkFNRQorCitCPHdpcGUtc3RyaW5nLnBsPiAtLSBXaXBlIHN0cmluZyBpbiB0ZXh0IG9yIGJpbmFyeSBmaWxlcy4KKworPWhlYWQxIFNZTk9QU0lTCisKK0I8d2lwZS1zdHJpbmcucGw+IEk8T1BUSU9OPi4uLiBJPEZJTEU+Li4uCisKKz1oZWFkMSBPUFRJT05TCisKKz1vdmVyCisKKz1pdGVtIEI8LS1kb2M+CisKKz1pdGVtIEI8LS1tYW51YWw+CisKK1ByaW50IGZ1bGwgaGVscCBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0taGVscD4KKworUHJpbnQgc2hvcnQgaGVscCBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0tdGFyZ2V0LWRpcmVjdG9yeT0+STxkaXI+CisKK0RpcmVjdG9yeSB0byBwdXQgcmVzdWx0IGZpbGVzIHRvLiBCeSBkZWZhdWx0IHJlc3VsdCBmaWxlcyBhcmUgd3JpdHRlbiBpbiB0aGUgY3VycmVudCB3b3JraW5nCitkaXJlY3RvcnkuCisKKz1pdGVtIEI8LS11c2FnZT4KKworUHJpbnQgdmVyeSBzaG9ydCB1c2FnZSBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0tdmVyc2lvbj4KKworUHJpbnQgdmVyc2lvbiBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLXdpcGUtbGl0ZXJhbD0+STxzdHI+CisKK1NwZWNpZnkgbGl0ZXJhbCBzdHJpbmcgdG8gd2lwZS4gTXVsdGlwbGUgbGl0ZXJhbHMgYXJlIGFsbG93ZWQuCisKKz1pdGVtIEI8LS13aXBlLXJlZ2V4cD0+STxzdHI+CisKK1NwZWNpZnkgUGVybCByZWd1bGFyIGV4cHJlc3Npb24gdG8gd2lwZS4gTXVsdGlwbGUgcmVndWxhciBleHByZXNzaW9ucyBtYXkgYmUgc3BlY2lmaWVkLgorCitCZSBjYXJlZnVsLiBQcm90ZWN0IHNwZWNpYWwgY2hhcmFjdGVycyBmcm9tIGJlaWduIGludGVycHJldGVkIGJ5IHNoZWxsLgorCis9YmFjaworCis9aGVhZDEgQVJHVU1FTlRTCisKKz1vdmVyCisKKz1pdGVtIEk8ZmlsZT4KKworRmlsZSBuYW1lIHRvIHdpcGUgc3RyaW5nIGluLgorCis9YmFjaworCis9aGVhZDEgREVTQ1JJUFRJT04KKworVGhlIHNjcmlwdCB3aXBlcyBzdHJpbmdzIGluIGZpbGVzLiBTdHJpbmcgbWF5IGJlIHNwZWNpZmllZCBsaXRlcmFsbHkgb3IgYnkgUGVybCByZWd1bGFyIGV4cHJlc3Npb24uCitTdHJpbmdzIGFyZSB3aXBlZCBieSByZXBsYWNpbmcgY2hhcmFjdGVycyB3aXRoIHNwYWNlcywgc28gc2l6ZSBvZiBmaWxlIHJlbWFpbnMgdGhlIHNhbWUuIFRoZSBzY3JpcHQKK21heSBiZSBhcHBsaWVkIHRvIGJvdGggdGV4dCBhbmQgYmluYXJ5IGZpbGVzLgorCitSZXN1bHQgZmlsZXMgYXJlIHdyaXR0ZW4gYnkgZGVmYXVsdCB0byBjdXJyZW50IGRpcmVjdG9yeSwgb3IgdG8gZGlyZWN0b3J5IHNwZWNpZmllZCBieQorQjwtLXRhcmdldC1kaXJlY3Rvcnk+IG9wdGlvbiwgaWYgYW55LiBJZiBtdWx0aXBsZSBpbnB1dCBmaWxlcyB0ZW5kIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIHNhbWUgb3V0cHV0CitmaWxlIChlLiBnLiBpZGVudGljYWxseSBuYW1lZCBpbnB1dCBmaWxlcyBsb2NhdGVkIGluIGRpZmZlcmVudCBkaXJlY3RvcmllcyksIHRoZSBzY3JpcHQgZ2VuZXJhdGVzIGFuCitlcnJvci4KKworVGhlIHNjcmlwdCByZWFkcyBlbnRpcmUgZmlsZSwgcHJvY2VzcyBpdCwgYW5kIHRoZSB3cml0ZXMgdG8gZGlzay4gVGhlcmVmb3JlIGl0IGlzIChhbG1vc3QpIHNhZmUgdG8KK3VwZGF0ZSBmaWxlcyBpbi1wbGFjZSAoc2VlIGV4YW1wbGVzKS4KKworPWhlYWQxIEVYQU1QTEVTCisKK1dpcGUgIkNvcHlyaWdodCIgd29yZCBpbiBhbGwgdGhlIGZpbGVzIHdpdGggInR4dCIgc3VmZml4IGluIGN1cnJlbnQgZGlyZWN0b3J5LCBvdmVyd3JpdGUgb3JpZ2luYWwKK2ZpbGVzICh1cGRhdGUgdGhlbSBpbi1wbGFjZSk6CisKKyAgICB3aXBlLXN0cmluZy5wbCAtLXdpcGUtbGl0ZXJhbD0iQ29weXJpZ2h0IiAqLnR4dAorCitXaXBlICJDb3B5cmlnaHQiIGFuZCAiQ29weWxlZnQiIHdvcmRzIGluIGFsbCB0aGUgZmlsZXMgd2l0aCAidHh0IiBzdWZmaXggaW4gY3VycmVudCBkaXJlY3RvcnksCit3cml0ZSByZXN1bHQgZmlsZXMgdG8gLi4vd2lwZWQgZGlyZWN0b3J5OgorCisgICAgd2lwZS1zdHJpbmcucGwgLS13aXBlLWxpdGVyYWw9Q29weXJpZ2h0IC0td2lwZS1saXRlcmFsPUNvcHlsZWZ0IC0tdGFyZ2V0LWRpcj0uLi93aXBlZCAqLnR4dAorCitXaXBlICJDb3B5cmlnaHQiIGFuZCAiQ29weWxlZnQiIHdvcmRzIGluIGZpbGVzIGZyb20gImRvYyIgZGlyZWN0b3J5LCB3cml0ZSByZXN1bHQgZmlsZXMgdG8gY3VycmVudAorZGlyZWN0b3J5OworCisgICAgd2lwZS1zdHJpbmcucGwgLS13aXBlLXJlZ2V4cD0iQ29weXJpZ2h0fENvcHlsZWZ0IiBkb2MvKgorCitXaXBlICJkZWZhdWx0bGliIiBkaXJlY3RpdmUgaW4gYWxsIHRoZSBsaWJyYXJ5IGZpbGVzOgorCisgICAgd2lwZS1zdHJpbmcucGwgLS13aXBlLXJlZ2V4cD0iLWRlZmF1bHRsaWI6W0EtWmEtejAtOV8uXSsiICoubGliCisKKyhCZSBjYXJlZnVsOiB0aGUgc2NyaXB0IGRvZXMgbm90IGFuYWx5emUgc3RydWN0dXJlIG9mIGxpYnJhcnkgYW5kIG9iamVjdCBmaWxlcywgaXQganVzdCB3aXBlcworVTxzdHJpbmdzPiwgc28gaXQgd2lwZXMgYWxsIHRoZSBvY2N1cnJlbmNlcyBvZiBzdHJpbmdzIG1hdGNoaW5nIHRvIHNwZWNpZmllZCByZWd1bGFyIGV4cHJlc3Npb24uKQorCis9Y3V0CisKKyMgZW5kIG9mIGZpbGUgIwpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL0xJQ0VOU0UgYi9maW5hbC90ZXN0c3VpdGUvTElDRU5TRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTlmYjAxCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL0xJQ0VOU0UKQEAgLTAsMCArMSwzNCBAQAorICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIgCisgIFVuaXZlcnNpdHkgb2YgSG91c3RvbiBTeXN0ZW0KKyAgCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgIAorICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgIGFyZSBtZXQ6CisgIAorICBvIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAKKyAgbyBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAKKyAgbyBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG9mIEhvdXN0b24gU3lzdGVtIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0bworICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljCisgICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAKKyAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKKyAgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAKKwpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL01ha2VmaWxlIGIvZmluYWwvdGVzdHN1aXRlL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZDE4ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvTWFrZWZpbGUKQEAgLTAsMCArMSwyMjIgQEAKKyMgR2VuZXJhbCBNYWtlZmlsZSBjb250YWluaW5nIGFsbCB0aGUgbmVjZXNzYXJ5IGNvbXBpbGVyIGZsYWdzIGZvciB0aGUgdGVzdHMKKworIyBtb2RpZnkgQ0MgYW5kIENGTEFHUyBmb3IgT3Blbk1QIEMgY29tcGlsZXJzCisjIG1vZGlmeSBGQyBhbmQgRkZMQUdTIGZvciBPcGVuTVAgRm9ydHJhbiBjb21waWxlcnMKKworCisjIENvbnRlbnQ6CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyAxLiBCYXNpYyB1c2FnZQorIyAyLiBHZW5lcmFsIHRlc3RzdWl0ZSBzZXR0aW5ncworIyAzLiBDb21waWxlciBzZWxlY3Rpb24gYW5kIEZsYWdzCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAxLiBCYXNpYyB1c2FnZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIAltYWtlIGN0ZXN0CQlnZW5lcmF0ZSBjIHRlc3QgImN0ZXN0IgorIyAJbWFrZSBmdGVzdAkJZ2VuZXJhdGUgZm9ydHJhbiB0ZXN0ICJmdGVzdCIKKyMJbWFrZSBjbGVhbgkJcmVtb3ZlcyBhbGwgc291cmNlcyBhbmQgYmluYXJpZXMKKyMgCW1ha2UgY2xlYW5hbGwJcmVtb3ZlcyBzb3VyY2VzLGJpbmFyaWVzIGFuZCBsb2dmaWxlcworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAyLiBHZW5lcmFsIHRlc3RzdWl0ZSBzZXR0aW5ncworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgRm9yIGdlbmVyYWwgdGVzdHN1aXRlIHNldHRpbmdzIHNlZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlCisjIG9tcHRzLmNvbmYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIDMuIENvbXBpbGVyIHNlbGVjdGlvbiBhbmQgRmxhZ3MKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIEdOVSBDb21waWxlcgorQ0MgICAgID0gZ2NjCitDRkxBR1MgPSAtZm9wZW5tcCAtbG0gLU8zCitDRkxBR1MgPSAtZm9wZW5tcCAtbG0gLU8zCitGQyAgICAgPSBnZm9ydHJhbgorRkZMQUdTID0gLWZvcGVubXAgLWxtCitGRkxBR1MgPSAtZm9wZW5tcCAtbG0gLU8zCisKKworIyBGdWppdHN1IENvbXBpbGVyczoKKyNDQyA9IGZjYworI0NGTEFHUyA9IC1LT01QLGZhc3RfR1AyPTIKKyNGQz1mcnQKKyNGRkxBR1M9LUtPTVAsZmFzdF9HUDI9MiAtdyAtQW0gLVg5IC1GaXhlZAorCisKKyMgUEdJIGNvbXBpbGVycworI0NDID0gcGdjYworI0NGTEFHUyA9IC1tcAorI0NGTEFHUyA9IC1tcCAtRFZFUkJPU0UKKyNDRkxBR1MgPSAtZmFzdCAtbXAKKworI0ZDID0gcGdmOTAKKyNGRkxBR1MgPSAtZmFzdCAtbXAKKyNGRkxBR1MgPSAtbXAgLWcKKworCisjIEludGVsIGNvbXBpbGVyczoKKyNDQyA9IGljYworI0NGTEFHUyA9IC1PMyAtaXAgLW9wZW5tcAorI0NGTEFHUyA9IC1XYWxsIC1PMCAtb3Blbm1wCisjQ0ZMQUdTID0gIC1vcGVubXAgLWxtCisjQ0ZMQUdTID0gIC1vcGVubXAgLWxtIC1EVkVSQk9TRQorCisjRkMgPSBpZm9ydAorI0ZGTEFHUyA9IC1vcGVubXAgLWxtIC1mcHAKKworIyBPbW5pIGNvbXBpbGVyczoKKyNDQyA9IG9tcGNjCisjQ0ZMQUdTID0gLU8zIC1sbQorCisKKyMgQXNzdXJlIGNvbXBpbGVyczoKKyNDQyA9IGFzc3VyZWMKKyNDRkxBR1MgPSAtTzMgLVdBcG5hbWU9cHJvamVjdCAtRFVTRV9BU1NVUkU9MQorI0ZDID0KKyNGRkxBR1MgPQorCisjIE5FQzoKKyNDQyA9IGMrKworI0NDID0gc3hjKysKKyNDRkxBR1MgPSAtUG9wZW5tcAorCisjRkM9c3hmOTAKKyNGRkxBR1M9IC1Qb3Blbm1wCisKKworIyBIaXRhY2hpOgorI0NDID0geGNjCisjQ0ZMQUdTID0gLU80IC1wdmVjICtPcCAtcGFyYWxsZWwgLW9tcAorI0ZDID0KKyNGRkxBR1MgPQorCisKKyMgU0dJOgorI0NDID0gY2MKKyNDRkxBR1MgPSAtbXAgLWxtCisjRkMgPQorI0ZGTEFHUyA9CisKKworIyBJQk0gY29tcGlsZXJzOgorI0NDID0geGxjX3IKKyNDRkxBR1MgPSAtcXNtcD1vbXAgLWxtCisKKworI0ZDPXhsZjkwX3IKKyNGRkxBR1M9LXFzbXA9b21wIC1xZml4ZWQ9MTMyIC1xbGFuZ2x2bD1leHRlbmRlZAorCisKKyMgU1VOIGNvbXBpbGVycworI0NDID0gY2MKKyNDRkxBR1MgPSAtZmFzdCAteG9wZW5tcCAtbG0KKworI0ZDID1mOTAKKyNGRkxBR1MgPSAteG9wZW5tcCAtZmFzdCAtbG0KKworCisjIG9wZW42NCBjb21waWxlcnMKKyMgcmVtYXJrOiAtSS4gd2FzIGEgd29ya2Fyb3VuZCBiZWNhdXNlIHRoZSBpbnN0YWxsYXRpb24gY2FtZSB3aXRob3V0IG9tcC5oIGZpbGUKKyNDQyA9IG9wZW5jYworI0NGTEFHUyA9IC1PMCAtb3Blbm1wIC1sbSAtSS4gLWxvbXAgLWxwdGhyZWFkCisjQ0ZMQUdTID0gLU8wIC1vcGVubXAgLWxtIC1JIC9ob21lL21hdHRoZXcvb3B0L3Vzci9pbmNsdWRlIC1scHRocmVhZAorI0NGTEFHUyA9IC1vcGVubXAgLWxtCisKKyNGQyA9IG9wZW5mOTAKKyNGRkxBR1MgPSAtTzAgLW9wZW5tcCAtbG0gIC1sb21wIC1scHRocmVhZAorCisKKyNQYXRoc2NhbGUgQ29tcGlsZXIKKyNDQyA9IHBhdGhjYworI0NGTEFHUyA9IC1tcCAtT2Zhc3QgLWxtCisKKyNGQz1wYXRoZjkwCisjRkZMQUdTPSAtbXAgLU9mYXN0IC1sbQorCisKKyNPcGVuVUggQ29tcGlsZXIKKyNDQyA9IHVoY2MKKyNDRkxBR1MgPSAtbXAKKworI0ZDID0gdWhmOTAKKyNGRkxBR1MgPSAtbXAKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitoZWxwOgorCUBlY2hvICJPcGVuTVAgVmFsaWRhdGlvbiBTdWl0ZSwgdjMuMCIKKwlAZWNobyAiKEMpIFVuaXZlcnNpdHkgb2YgU3R1dHRnYXJ0LCBVbml2ZXJzaXR5IG9mIEhvdXN0b24iCisJQGVjaG8gIiIKKwlAZWNobyAiRG8gbWFrZSBbcnVsZV0sIHdoZXJlIHJ1bGUgbWF5IGJlIG9uZSBvZjoiCisJQGVjaG8gIiAgY3Rlc3QiCisJQGVjaG8gIiAgICBCdWlsZCBhbmQgcnVuIHRoZSBPcGVuTVAvQyB2YWxpZGF0aW9uIHRlc3RzLiIKKwlAZWNobyAiICBmdGVzdCIKKwlAZWNobyAiICAgIEJ1aWxkIGFuZCBydW4gdGhlIE9wZW5NUC9Gb3J0cmFuIHZhbGlkYXRpb24gdGVzdHMuIgorCUBlY2hvICIgIHByaW50X2NvbXBpbGVfb3B0aW9ucyIKKwlAZWNobyAiICAgIERpc3BsYXkgdGhlIGRlZmF1bHQgY29tcGlsZXIgYW5kIGNvbXBpbGVyIG9wdGlvbnMgYmVpbmcgdGVzdGVkIgorCUBlY2hvICIgIGNsZWFuc3JjcyIKKwlAZWNobyAiICAgIFJlbW92ZSBzb3VyY2VzIGdlbmVyYXRlZCBmcm9tIHRoZSB0ZW1wbGF0ZXMiCisJQGVjaG8gIiAgY2xlYW5iaW5zIgorCUBlY2hvICIgICAgUmVtb3ZlIGV4ZWN1dGFibGVzIGZyb20gYmluLyBkaXJlY3RvcnkiCisJQGVjaG8gIiAgY2xlYW5vdXRzIgorCUBlY2hvICIgICAgUmVtb3ZlIGFsbCAqLm91dCBmaWxlcyBmcm9tIGJpbi8gZGlyZWN0b3J5IgorCUBlY2hvICIgIGNsZWFubG9ncyIKKwlAZWNobyAiICAgIFJlbW92ZSBhbGwgKi5sb2cgZmlsZXMgZnJvbSBiaW4vIGRpcmVjdG9yeSIKKwlAZWNobyAiICBjbGVhbiIKKwlAZWNobyAiICAgIFJlbW92ZSBhbGwgc291cmNlcyBhbmQgZXhlY3V0YWJsZXMgZnJvbSBiaW4vIGRpcmVjdG9yeSIKKwlAZWNobyAiICBjbGVhbmFsbCIKKwlAZWNobyAiICAgIFJlbW92ZSB0aGUgZW50aXJlIGJpbi8gZGlyZWN0b3J5IgorCitvbXBfbXlfc2xlZXA6CisJbWtkaXIgLXAgYmluL2MKKwljcCBvbXBfbXlfc2xlZXAuaCBiaW4vYy8KK29tcF90ZXN0c3VpdGU6IG9tcF90ZXN0c3VpdGUuaAorCW1rZGlyIC1wIGJpbi9jCisJY3Agb21wX3Rlc3RzdWl0ZS5oIGJpbi9jLworb21wX3Rlc3RzdWl0ZS5oOiBvbXB0cy1jLmNvbmYgYy8qCisJLi9vbXB0c19tYWtlSGVhZGVyLnBsIC1mPW9tcHRzLWMuY29uZiAtdD1jCisuYy5vOiBvbXBfdGVzdHN1aXRlIG9tcF9teV9zbGVlcAorCSQoQ0MpICQoQ0ZMQUdTKSAtYyAkPAorCitjdGVzdDogb21wX215X3NsZWVwIG9tcF90ZXN0c3VpdGUKKwkuL3J1bnRlc3QucGwgLS1sYW5nPWMgdGVzdGxpc3QtYy50eHQKKworZnRlc3Q6CisJbWtkaXIgLXAgYmluL2ZvcnRyYW4KKwljcCBvbXBfdGVzdHN1aXRlLmYgYmluL2ZvcnRyYW4KKwljcCBvbXBfbXlfc2xlZXAuZiBiaW4vZm9ydHJhbgorCS4vcnVudGVzdC5wbCAtLWxhbmc9Zm9ydHJhbiB0ZXN0bGlzdC1mLnR4dAorCitwcmludF9jb21waWxlX29wdGlvbnM6CisJQGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0iCisJQGVjaG8gIkMgY29tcGlsZXIiCisJQGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0iCisJQGVjaG8gImNvbXBpbGF0aW9uOiAkKENDKSAkKENGTEFHUykiCisJQCQoQ0MpIC0tdmVyc2lvbgorCUBlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tIgorCUBlY2hvICJGb3J0cmFuIGNvbXBpbGVyIgorCUBlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tIgorCUBlY2hvICJjb21waWxhdGlvbjogJChGQykgJChGRkxBR1MpIgorCUAkKEZDKSAtLXZlcnNpb24KKworY2xlYW5zcmNzOgorCWZpbmQgYmluLyAtaW5hbWUgIiouW2NmXSIgLWV4ZWMgcm0ge30gXDsKK2NsZWFuYmluczoKKwlmaW5kIGJpbi8gLXBlcm0gL2EreCAtdHlwZSBmIC1leGVjIHJtIHt9IFw7CitjbGVhbm91dHM6CisJZmluZCBiaW4vIC1pbmFtZSAiKi5vdXQiIC1leGVjIHJtIHt9IFw7CitjbGVhbmxvZ3M6CisJZmluZCBiaW4vIC1pbmFtZSAiKi5sb2ciIC1leGVjIHJtIHt9IFw7CisKK2NsZWFuOiBjbGVhbnNyY3MgY2xlYW5iaW5zCisKK2NsZWFuYWxsOgorCXJtIC1yZiBiaW4vCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9SRUFETUUgYi9maW5hbC90ZXN0c3VpdGUvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYTdjNjEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvUkVBRE1FCkBAIC0wLDAgKzEsMzM0IEBACisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorfCAgICAgICAgICAgICAgICAgICBPcGVuTVAgVmFsaWRhdGlvbiBTdWl0ZSAgViAzLjAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8ICAgICAgICAgICAgICBIaWdoIFBlcmZvcm1hbmNlIENvbXB1dGluZyBDZW50ZXIsIFN0dXR0Z2FydCAgICAgICAgICAgICAgICAgIHwKK3wgICAgICAgSGlnaCBQZXJmb3JtYW5jZSBDb21wdXRpbmcgYW5kIFRvb2xzLCBVbml2ZXJzaXR5IG9mIEhvdXN0b24gICAgICAgICAgfAorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEphbi4gMjAxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKK1RBQkxFIE9GIENPTlRFTlRTCisKK0kgICAgCUlOVFJPRFVDVElPTgorSS4xLgkgIEFpbXMgYW5kIGdlbmVyYWwgZnVuY3Rpb24KK0kuMi4gCSAgRmlsZXMgYW5kIGRpcmVjdG9yaWVzCisKK0lJCQlVU0FHRQorSUkuMS4JICBGaXJzdCBydW4gd2l0aCBtYWtlCitJSS4yCSAgV2hlcmUgdG8gc2VhcmNoIGZvciByZXN1bHRzCitJSS4zLgkgIFVzaW5nIHRoZSBydW50ZXN0IHNjcmlwdAorCitJSUkJCUFkZGluZyBhbmQgbW9kaWZ5aW5nIHRlc3RzCitJSUkuMS4JICBUaGUgdGVtcGxhdGUgc3RydWN0dXJlCisKK0lWCQlLbm93biBJc3N1ZXMgYW5kIFdvcmthcm91bmQKKworViAgICAgICBDb250YWN0IGFuZCBTdXBwb3J0CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJLiAgSU5UUk9EVUNUSU9OCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworSS4xLiAgQWltcyBhbmQgZ2VuZXJhbCBmdW5jdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIE9wZW5NUCB2YWxpZGF0aW9uIHN1aXRlIGlzIGRlc2lnbmVkIHRvIHZlcmlmeSB0aGUgY29ycmVjdCBpbXBsZW1lbnRhdGlvbgorb2YgT3Blbk1QIGluIGNvbXBpbGVycy4gSXQgaXMgY2FwYWJsZSBvZiBjaGVja2luZyBGb3J0cmFuIGFzIHdlbGwgYXMgYworY29tcGlsZXIuCisKK1Rlc3RpbmcgdGhlIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIHN0YXRpc3RpY3MuIEVhY2ggZGlyZWN0aXZlIGlzIHRlc3RlZAorYnkgY29tcHV0aW5nIGFuZCB2ZXJpZnlpbmcgdGhlIHJlc3VsdCB3aXRoIHRoZSBhbHJlYWR5IGtub3duIHZhbHVlLiBJbiBtb3N0CitjYXNlcyBhIHdyb25nIGltcGxlbWVudGF0aW9uIGNhbiByZXN1bHQgaW4gdGhlIHJpZ2h0IHZhbHVlcy4gU28gdGhlIHRlc3RzIGFyZQorcnVuIHNldmVyYWwgdGltZXMuCisKK0FkZGl0aW9uYWxseSwgdGhlIHZhbGlkYXRpb24gc3VpdGUgY3JlYXRlcyBzbyBjYWxsZWQgY3Jvc3N0ZXN0cyBmb3IgZWFjaAorZGlyZWN0aXZlLiBUaGVzZSBhcmUgdGVzdHMgaW4gd2hpY2ggZWl0aGVyIHRoZSBkaXJlY3RpdmUgaXMgbWlzc2luZyBvciB1c2VkCit3aXRoIGRpZmZlcmVudCBhcmd1bWVudHMuIElmIHRoaXMgc28gY2FsbGVkIGNyb3NzdGVzdCBmYWlscywgdGhpcyBpbmRpY2F0ZXMKK3N0cm9uZ2x5IHRoYXQgdGhlIHByZXZpb3VzIHRlc3QgaXMgY2FwYWJsZSBvZiB0ZXN0aW5nIHRoZSBkaXJlY3RpdmUuCisKK0xhc3RseSwgYW4gb3JwaGFuZWQgdGVzdCBpcyBhbHNvIHJ1biB0byBkZXRlcm1pbmUgaWYgdGhlIGRpcmVjdGl2ZSBiZWluZwordGVzdGVkIGlzIGFibGUgdG8gY29ycmVjdGx5IHJ1biB3aGVuICdvcnBoYW5lZCcgZnJvbSB0aGUgbWFpbiBmdW5jdGlvbi4KK0Vzc2VudGlhbGx5LCB0aGUgZGlyZWN0aXZlJ3MgY29kZSBpcyBwbGFjZWQgaW50byBpdHMgb3duIGZ1bmN0aW9uIHdoaWNoIGlzCitjYWxsZWQgZHVyaW5nIGV4ZWN1dGlvbiBvZiB0aGUgbWFpbiBmdW5jdGlvbiBhbmQgb2Z0ZW4gaW5zaWRlIGEgcGFyYWxsZWwKK3JlZ2lvbi4KKworCitJLjIuICBGaWxlcyBhbmQgZGlyZWN0b3JpZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitkIGMgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHRlbXBsYXRlcyBmb3IgdGhlIGMgdGVzdHMKK2QgZm9ydHJhbiAgICAgICAgICAgICAgICAgICBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgdGVtcGxhdGVzIGZvciB0aGUgRm9ydHJhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RzCisgIE1ha2VmaWxlICAgICAgICAgICAgICAgICAgTWFrZWZpbGUgY29udGFpbmluZyBvcHRpb25zIGZvciBjb21waWxhdGlvbgorICBjb21tb25fdXRpbGl0eS5mCisgIG9tcF9teV9zbGVlcC5oICAgICAgICAgICAgdGhyZWFkIHNhdmUgc2xlZXAgZnVuY3Rpb24KKyAgb21wX3Rlc3RzdWl0ZS5mICAgICAgICAgICBGb3J0cmFuIGhlYWRlciBmaWxlCisgIG9tcF90ZXN0c3VpdGUuaCAgICAgICAgICAgYXV0b2dlbmVyYXRlZCBjLWhlYWRlciBmaWxlCisgIG9tcHRzLWMuY29uZiAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBmaWxlIGZvciB0aGUgYyB0ZXN0cyBhYm91dCBob3cgb2Z0ZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdGVzdHMgc2hhbGwgYmUgZXhlY3V0ZWQgb3IgaG93IGxhcmdlIHRoZSBsb29wIHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcworICBvbXB0c19tYWtlSGVhZGVyLnBsCSAgICBwZXJsIG1vZHVsZSBmb3IgYXV0b21hdGljYWxseSBnZW5lcmF0aW9uIG9mIGFuIHVwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gZGF0ZSBoZWFkZXIgZmlsZQorICBvbXB0c19wYXJzZXJGdW5jdGlvbnMucG0JcGVybCBtb2R1bGUgY29udGFpbmluZyBnZW5lcmFsIGZ1bmN0aW9ucyBmb3IKKwkJCQkgICAgICAgICAgICB0aGUgcGFyc2VyLnBsIHNjcmlwdAorICBvbXB0c19wYXJzZXIucGwJICAgICAgICBzY3JpcHQgZm9yIGdlbmVyYXRpbmcgdGhlIHNvdXJjZSBjb2RlIG91dCBvZiB0aGUgdGVtcGxhdGVzCisgIG9tcHRzX3N0YW5kYWxvbmVQcm9jLmMJZnJhbWV3b3JrIGZvciB0aGUgYyB0ZXN0cworICBvbXB0c19zdGFuZGFsb25lUHJvYy5mCWZyYW1ld29yayBmb3IgdGhlIEZvcnRyYW4gdGVzdHMKKyAgUkVBRE1FCQkgICAgICAgICAgICB0aGUgUkVBRE1FIGZpbGUgeW91J3ZlIGFscmVhZHkgZm91bmQgOy0pCisgIExJQ0VOU0UgICAgICAgICAgICAgICAgICAgY29udGFpbnMgbGljZW5zZSBpbmZvcm1hdGlvbgorICBydW50ZXN0LnBsCQkgICAgICAgIHRoZSBmcmFtZSBwcm9ncmFtIG9mIHRoZSB0ZXN0IHN1aXRlCisgIHRlc3RsaXN0LWYudHh0CSAgICAgICAgdGVzdCBsaXN0IGNvbnRhaW5pbmcgdGhlIGF2YWlsYWJsZSB0ZXN0cyBmb3IgRm9ydHJhbgorICB0ZXN0bGlzdC1jLnR4dAkgICAgICAgIHRlc3QgbGlzdCBjb250YWluaW5nIHRoZSBhdmFpbGFibGUgdGVzdHMgZm9yIGMKKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSUkuICBVU0FHRQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworSUkuMS4gRmlyc3QgcnVuIHdpdGggbWFrZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitZb3UgY2FuIGRvIGEgZmlyc3Qgc2ltcGxlIHJ1biBvZiB0aGUgdGVzdHN1aXRlIG9ubHkgYWZ0ZXIgb25lIHN0ZXAgb2YKK2NvbmZpZ3VyYXRpb246CisKKzEpIE1vZGlmeSB0aGUgb21wdHMuY29uZiBhbmQgb21wdHMtYy5jb25mIGZpbGUsIGNoYW5nZSB0aGUgbnVtYmVyIG9mIHRocmVhZHMKK2FuZCBudW1iZXIgb2YgcmVwZXRpdGlvbnMgb2YgZWFjaCB0ZXN0LgorCisyKSBNb2RpZnkgdGhlIE1ha2VmaWxlLCB1bmNvbW1lbnRpbmcgdGhlIENDL0ZDIGFuZCBDRkxBR1MvRkZMQUdTIHZhcmlhYmxlcyBmb3IKK3RoZSBjb21waWxlciBvZiB5b3VyIGNob2ljZS4KKworQW5kIG5vdyB5b3UgY2FuIHJ1biB0aGUgdGVzdHN1aXRlIGVpdGhlciBmb3IgYSBDIGNvbXBpbGVyIHdpdGg6CisKKz4JbWFrZSBjdGVzdAorCitvciBmb3IgYSBGb3J0cmFuIGNvbXBpbGVyIHdpdGg6CisKKz4JbWFrZSBmdGVzdAorCisKK0lJLjIuIFJ1bm5pbmcgY3VzdG9tIHRlc3RzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK0luIG9yZGVyIHRvIHJ1biBzaW5nbGUgdGVzdHMgb3IgY3VzdG9tIGdyb3VwcyBvZiB0ZXN0cywgdHdvIG1ha2UgY29tbW1hbmRzCithcmUgZGVmaW5lZDogbWFrZSBzdGVzdCBhbmQgbWFrZSBmc3Rlc3QuIFRoZXNlIHR3byBjb21tYW5kIHJlZmVyZW5jZSB0aGUgZmlsZQorY3VzdG9tdGVzdC50eHQgd2hlbiBsb29raW5nIGZvciBhIHRlc3RsaXN0IHRvIHVzZS4gU2ltcGx5IGVkaXQgY3VzdG9tdGVzdC50eHQKK3RvIGluY2x1ZGUgdGhlIGRlc2lyZWQgdGVzdCBvciB0ZXN0cy4gSWYgY3VzdG9tdGVzdC50eHQgY29udGFpbnMgYyB0ZXN0cywKKworPiAgICAgIG1ha2Ugc3Rlc3QKKworb3IgZm9yIGZvcnRyYW4gdGVzdHMKKworPiAgICAgIG1ha2UgZnN0ZXN0CisKK0luIG9yZGVyIHRvIGNoYW5nZSB0aGUgbnVtYmVyIG9mIHRocmVhZHMgdXNlZCBpbiB0aGUgdGVzdHMsIHNpbXBseSBlZGl0IHRoZQorTWFrZWZpbGUgdmFyaWFibGVzIE1JTlRIUkVBRFMgYW5kIE1BWFRIUkVBRFMuIEJ5IGRlZmF1bHQsIHRoZXkgYXJlIGNvbmZpZ3VyZWQKK3RvIHVzZSAyIHRocmVhZHMuIFRvIGNoYW5nZSB0aGUgbnVtYmVyIG9mIHRpbWVzIGVhY2ggdGVzdCBpcyBydW4sIGZvciBjIHRlc3RzCitlZGl0IHRoZSBSRVBFVElUSU9OUyB2YXJpYWJsZSBpbiB0aGUgZmlsZSBvbXB0cy1jLmNvbmYuIFRoZSBMT09QQ09VTlQgYW5kCitTTEVFUFRJTUUgdmFyaWFibGVzIGNhbiBhbHNvIGJlIGNoYW5nZWQgaGVyZS4gRm9yIGZvcnRyYW4gdGVzdHMsIGVkaXQgdGhlIGZpbGUKK29tcF90ZXN0c3VpdGUuZiB0byBjaGFuZ2UgYm90aCB0aGUgTE9PUENPVU5UIGFuZCB0aGUgbnVtYmVyIG9mIHRpbWVzIGVhY2ggdGVzdAoraXMgcnVuLgorCisKKworSUkuMy4gVW5kZXJzdGFuZGluZyB0aGUgcmVzdWx0cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworV2hlbiBydW5uaW5nIHRoZSB0ZXN0c3VpdGUgdGhlIHJlc3VsdHMgd2lsbCBiZSBzaG93biBvbiB0aGUgc2NyZWVuLgorCitJZiB5b3UgbmVlZCB0aGUgcmVzdWx0cyBmb3IgZnVydGhlciBwdXJwb3NlIHlvdSBjYW4gdXNlIHRoZSByZXN1bHRzLnR4dCwgd2hpY2gKK2lzIGEgc2ltcGxlIGxpc3QgY29udGFpbmluZyB0aGUgcmVzdWx0cyBmb3IgZWFjaCBkaXJlY3RpdmUKK2luIGEgc2luZ2xlIGxpbmUuIEVhY2ggbGluZSBzdGFydHMgd2l0aCB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0aXZlLiBUaGVuIGZvbGxvd3MKK3RoZSByZXN1bHQgb2YgdGhlIHRlc3QgZ2l2ZW4gaW4gdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHBhc3NlZCB0ZXN0cy4gSWYgMTAwJSBvZgordGhlIHRlc3RzIHBhc3NlZCBzdWNjZXNzZnVsbHksIHRoZSBzZWNvbmQgbnVtYmVyIGdpdmVzIHRoZSByZXN1bHQgb2YgdGhlCitjb3JyZXNwb25kaW5nIGNyb3NzdGVzdC4gQ3Jvc3N0ZXN0cyB3aWxsIG9ubHkgYmUgcnVuIGlmIHRoZSBub3JtYWwgdGVzdCBwYXNzZXMKK3dpdGggMTAwJSBhY2N1cmFjeS4gSWYgYSBjcm9zc3Rlc3Qgd2FzIG5vdCBydW4gb3IgYSB0ZXN0IGRvZXMgbm90IGV4aXN0LCBpdCBpcworZGVub3RhdGVkIGJ5IGEgIi0iLgorQWZ0ZXIgdGhlIHJlc3VsdHMgb2YgdGhlIG5vcm1hbCB0ZXN0cywgdGhlcmUgZm9sbG93IGEgc2VyaWVzIG9mIHRlc3RzIGluIHRoZQorb3JwaGFuZWQgbW9kZS4gSWYgdGhlcmUgd2VyZSBubyBvcnBoYW5lZCB0ZXN0cyBhdmFpbGFibGUgdGhpcyBpcyBzaG93biBieSBhICItIi4KKworSWYgeW91IHJ1biB0aGUgdGVzdHN1aXRlIHdpdGggZGlmZmVyZW50IG51bWJlcnMgb2YgdGhyZWFkcyAoZS5nLiB1c2luZyB0aGUKK3J1bnRlc3QucGwgc2NyaXB0KSB0aGUgcmVzdWx0cyBhcmUgc2hvd24gaW4gYmxvY2tzIG9mIDQgY29sdW1ucyBmb3IgZWFjaCBudW1iZXIKK29mIHRocmVhZHMuCisKK0lmIGEgdGVzdCBmYWlscyB5b3UgY2FuIGZpbmQgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBpbiB0aGUgb21wdHMubG9nLAorYmluL2MvKi5vdXQgYW5kICoubG9nIGZpbGVzLiBXaGlsZSB0aGUgb21wdHMubG9nIGZpbGUgY29udGFpbnMgYWxsIGNvbXBpbGVyCitlcnJvciBtZXNzYWdlcyBmb3IgYWxsIHRlc3RzLCB0aGUgKi5vdXQgYW5kICoubG9nIGZpbGVzIGNvbnRhaW4gZGV0YWlsZWQgaW5mb3JhbXRpb24KK29uIHRoZSBleGVjdXRpb24gcHJvY2VzcyBvZiB0aGUgc2luZ2xlIHRlc3RzLgorSW4gdGhlICoub3V0IGZpbGVzIHRoZXJlIGFyZSBsaXN0ZWQgYWxsIHRoZSByZXN1bHRzIG9mIHRoZSBzaW5nbGUgZXhlY3V0aW9ucyBvZgordGhlIHRlc3RzLiBJbiB0aGUgKi5sb2cgZmlsZXMgdGhlcmUgYXJlIGVycm9yIG1lc3NhZ2VzIG9mIHRoZSB0ZXN0cyBpdHNlbGYuCisKKworSUkuNC4gQ2xlYW5pbmcgVXAKKy0tLS0tLS0tLS0tLS0tLS0tCisKKworQmVjYXVzZSBtYW55IGZpbGVzIGFyZSBnZW5lcmF0ZWQgZm9yIGVhY2ggdGVzdGVkIGRpcmVjdGl2ZSwgaXQgaXMgb2Z0ZW4gbmVjZXNzYXJ5Cit0byBjbGVhbiB0aGUgbWFpbiBkaXJlY3RvcnkgYWZ0ZXIgYSBiYXR0ZXJ5IG9mIHRlc3RzLiBUbyBjbGVhbiBhbGwgZ2VuZXJhdGVkIGZpbGVzCitpbiB0aGUgbWFpbiBkaXJlY3RvcnkgaW5jbHVkaW5nIHRoZSByZXN1bHRzIGFuZCBsb2cgZmlsZXMsCisKKz4gICAgIG1ha2UgY2xlYW4KKworCitUbyBjbGVhbiBvbmx5IHRoZSBsb2dzIGFuZCBvdXQgZmlsZXMsCisKKz4gICAgIG1ha2UgY2xlYW5sb2dzCisKK1RvIGNsZWFuIG9ubHkgdGhlIHJlc3VsdHMsCisKKz4gICAgIG1ha2UgY2xlYW5yZXN1bHRzCisKKworCitJSS40LiBVc2luZyB0aGUgcnVudGVzdCBzY3JpcHQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitTbyBmb3Igc3BlY2lhbCBwdXJwb3NlIHlvdSBjYW4gdXNlIHRoZSBydW50ZXN0LnBsIHNjcmlwdCwgd2hpY2ggYWxsb3dzIGEgbG90Cittb3JlIG9wdGlvbnMgZm9yIHRoZSBleGVjdXRpb24gcHJvY2VzcyB0aGFuIHRoZSBleGVjdXRpb24gd2l0aCBtYWtlLgorCitVc2luZyB0aGUgcnVudGVzdC5wbCBzY3JpcHQgaXMgcmF0aGVyIGVhc3kuIFlvdSBjYW4gdXNlIHRoZSB0aGUgdGVzdCBzdWl0ZSBvbmx5CithZnRlciB0d28gc3RlcHMgb2YgbW9kaWZpY2F0aW9uczoKKworMS4pIE1vZGlmeSB0aGUgTWFrZWZpbGUgdG8geW91ciB3aXNoZXMgY2hvb3NpbmcgeW91ciBjb21waWxlciBhbmQgdGhlIG5lY2Vzc2FyeQorICAgIGNvbXBpbGVyIGZsYWdzLgorMi4pIElmIG5lY2Vzc2FyeSBlZGl0IG9uZSBvZiB0aGUgdGVzdCBsaXN0cyAodGVzdGxpc3QtYy50eHQpIGFuZCBjb21tZW50IG91dCB0aGUKKyAgICB0ZXN0cyB5b3UgZG8gbm90IHdhbnQgdG8gcnVuIHVzaW5nICMgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUuIFRlc3RsaXN0cyBmb3IgRm9ydHJhbiBlbmQKKyAgICB3aXRoIC1mLnR4dCB3aGlsZSB0ZXN0IGxpc3RzIGZvciBjIHdpdGggLWMudHh0LgorCitBbmQgbm93IHlvdSBjYW4gcnVuIHRoZSB0ZXN0IHN1aXRlIGVpdGhlciBmb3IgRm9ydHJhbiB1c2luZworCSMJPiAgLi9ydW50ZXN0LnBsIC1sYW5nPWZvcnRyYW4gLWQ9Zm9ydHJhbiB0ZXN0bGlzdC1mLnR4dAorb3IgZm9yIGMKKwkjCT4gIC4vcnVudGVzdC5wbCAtbGFuZz1jIC1kPWMgdGVzdGxpc3QtYy50eHQKKworV2l0aCB0aGUgLS1oZWxwIG9wdGlvbiB5b3UgY2FuIHNob3cgdGhlIGNvbXBsZXRlIGxpc3Qgb2Ygb3B0aW9ucyBhbmQgdGhlaXIKK2V4cGxhbmF0aW9ucy4KKworVGhlIHRlc3QgcmVzdWx0cyBhcmUgc3VtbWFyaXplZCBpbiBjcmVzdWx0cyBvciBmcmVzdWx0cy50eHQgd2hpbGUgKi5sb2cga2VlcAorZGV0YWlscyBmb3IgaW5kaXZpZHVhbCB0ZXN0cy4gVGhlcmUgaXMgYWxzbyBhIGZpbGUgKG9tcHRzLmxvZykga2VlcGluZworY29tcGlsYXRpb24gaW5mb3JtYXRpb24uIChzZWUgc2VjdGlvbiBJSS4yICkKKworSWYgeW91IGRvbid0IHdhbnQgdG8gdGVzdCB0aGUgZGlyZWN0aXZlcyBpbiBvcnBoYW5lZCBtb2RlIHlvdSBjYW4gdXNlIHRoZQorLW5vcnBoYW4gb3B0aW9uLiBZb3UgYWxzbyBjYW4gdXNlIHRoZSBydW50ZXN0LnBsIHNjcmlwdCBlaXRoZXIgdG8gY29tcGlsZSBhbGwKK3Rlc3RzIG9yIHJ1biBjb21waWxlZCB0ZXN0cyBlLmcuIGZvciBjcm9zcyBjb21waWxhdGlvbiBvbiBvdGhlciBwbGF0Zm9ybXMuIEZvcgordGhpcyB0aGVyZSBhcmUgdGhlIG9wdGlvbnMgLW5vcnVuIGFuZCAtbm9jb21waWxlLgorCitIYXBweSB0ZXN0aW5nIQorCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJSUkuCUhvdyB0byBhZGQgbmV3IHRlc3RzIC8gVGhlIHN0cnVjdHVyZSBvZiB0ZXN0IHRlbXBsYXRlcworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0lJSS4xICBUaGUgdGVtcGxhdGUgc3RydWN0dXJlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIHRlc3Qgc3VpdGUgaXMgYmFzZWQgb24gdGVtcGxhdGVzIHNvIHRoYXQgeW91IG9ubHkgaGF2ZSBvbmUgZmlsZSBmb3IgdGVzdCwKK2Nyb3NzdGVzdCBhbmQgdGhlIG9ycGhhbmVkIHZlcnNpb25zIG9mIHRoZW0uCisKKwlBKSBEZXNjcmlwdGlvbiBvZiB0aGUgdGVtcGxhdGUgc3RydWN0dXJlCisKK1RoZSBzeW50YXggb2YgdGhlIHRlbXBsYXRlcyBpcyBtdWNoIGxpa2UgeG1sLiBTbyBlYWNoIHRlc3QgYmVnaW5zIHdpdGgKKyc8b21wdHM6dGVzdD4nIGFuZCBlbmRzIHdpdGggJzwvb21wdHM6dGVzdD4nLgorCitJbiBiZXR3ZWVuIHRoZXJlIGFyZSBzZXZlcmFsIG90aGVyIGJsb2NrcyBob2xkaW5nIGluZm9ybWF0aW9uOgorCistIDxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+IDwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPiBJbiBiZXR3ZWVuIHRoaXMgdGFnIHlvdSBjYW4KKyAgZ2l2ZSBhIGRlc2NyaXB0aW9uIG9uIHdoYXQgdGhlIHRlc3QgY2hlY2tzIGFuZCBob3cgaXQgd29ya3MuCisKKy0gPG9tcHRzOm9tcHZlcnNpb24+IDwvb21wdHM6dmVyc2lvbj4gVGhpcyB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZQorICBPcGVuTVAtdmVyc2lvbiB3aGljaCBpbmNsdWRlcyB0aGUgdGVzdGVkIGRpcmVjdGl2ZS4KKworLSA8b21wdHM6ZGlyZWN0aXZlPiA8L29tcHRzOmRpcmVjdGl2ZT4gVXNlZCB0byBzcGVjaWZ5IHRoZSBkaXJlY3RpdmUgaG93IGl0IGlzCisgIGNhbGxlZCBpbiB0aGUgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuCisKKy0gPG9tcHRzOmRlcGVuZGVuY2VzPiA8L29tcHRzOmRlcGVuZGVuY2VzPiBXaXRoIHRoaXMgdGFnIHlvdSBjYW4gc3BlY2lmeSBvdGhlcgorICBvbXAgZGlyZWN0aXZlcyB3aGljaCBhcmUgbmVjZXNzYXJ5IGZvciB0aGUgY29ycmVjdCBleGVjdXRpb24gb2YgeW91ciB0ZXN0LgorVGhlIGRpcmVjdGl2ZXMgaGF2ZSB0byBiZSBsaXN0ZWQgYnkgdGhlaXIgZGlyZWN0aXZlIG5hbWVzIGFzIGl0IGlzIGNhbGxlZCBpbgordGhlIHByb2dyYW1taW5nIGxhbmd1YWdlLiBNdWx0aXBsZSBkaXJlY3RpdmVzIGFyZSBzZXBhcmF0ZWQgYnkgJywnLgorCistIDxvbXB0czp0ZXN0Y29kZT4gPC9vbXB0czp0ZXN0Y29kZT4gSW4gdGhpcyB0YWcgc3RhbmRzIHRoZSB3aG9sZSBzb3VyY2UgY29kZQorZm9yIHRoZSB0ZXN0IC8gY3Jvc3N0ZXN0LiAgRWFjaCB0ZXN0IGhhcyB0byBiZSB3cml0dGVuIGFzIGEgZnVuY3Rpb24uIFRoZQorc3ludGF4IG9mIHRoZSBmdW5jdGlvbnMgZGlmZmVycyBiZXR3ZWVuIEMgYW5kIEZvcnRyYW46IEluIEMgaXQgaGFzIHRvIHRha2UgYQorZmlsZSBwb2ludGVyICdGSUxFICogbG9nRmlsZScgYW5kIHJldHVybiBhbiBpbnQuIElmIHRoZSB0ZXN0IGhhcyBiZWVuIHBhc3NlZAorc3VjY2Vzc2Z1bCBpdCBoYXMgdG8gcmV0dXJuIGEgdmFsdWUgdW5lcXVhbCB0byAwLiBUaGUgZmlsZSBwb2ludGVyIGNhbiBiZSB1c2VkCit0byB3cml0ZSBpbmZvcm1hdGlvbiBpbnRvIGEgbG9nIGZpbGUuICBJbiBGb3J0cmFuIHRoZSBmdW5jdGlvbiB0YWtlcyBubworYXJndW1lbnQgYW5kIHRoZSBmdW5jdGlvbiBuYW1lIG11c3Qgbm90IGV4Y2VlZCBYWCBjaGFyYWN0ZXJzLiAgVGhlIHJldHVybiB2YWx1ZQoraGFzIHRvIGJlIHNwZWNpZmllZCB1c2luZyB0aGUgJzx0ZXN0ZnVuY3Rpb25uYW1lPicgdGFncy4gSXQgaGFzIHRvIGJlIDEgaWYgdGhlCit0ZXN0IHN1Y2NlZWRlZCBhbmQgMCBpZiB0aGUgdGVzdCBmYWlsZWQuIEZvciBkZXRhaWxzIHNlZSB0aGUgZXhhbXBsZS4KKworVG8gdGVsbCB0aGUgdGVzdCBzdWl0ZSB0aGUgbmFtZSBvZiB5b3VyIHRlc3QgZnVuY3Rpb24geW91IGhhdmUgdG8gZW5jbG9zZSBpdAoraW50byB0aGUgJzxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPicgdGFnLgorCitJZiB0aGVyZSBhcmUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0ZXN0IGFuZCBjcm9zc3Rlc3QgeW91IGNhbiB1c2UgdGhlCis8b21wdHM6Y2hlY2s+IDwvb21wdHM6Y2hlY2s+IGFuZCA8b21wdHM6Y3Jvc3NjaGVjaz4gPC9vbXB0czpjcm9zc2NoZWNrPiB0YWcuCitXaGVuIGdlbmVyYXRpbmcgdGhlIHRlc3QgdGhlIHBhcnNlciB3aWxsIHVzZSB0aGUgY29kZSBlbmNsb3NlZCBpbgorPG9tcHRzOmNoZWNrPiB0YWdzIGFuZCBjdXQgb3V0IHRoZSBjb2RlIHdyaXR0ZW4gaW4gPG9tcHRzOmNyb3NzY2hlY2s+IHRhZ3MuIFNvCit5b3UgaGF2ZSB0d28gcG9zc2liaWxpdGllcyB0byB3cml0ZSB5b3VyIHRlbXBsYXRlIGZvciB0ZXN0IGFuZCBjcm9zc3Rlc3Q6IFRoZQorZmlyc3Qgd2F5IHlvdSBjYW4gd3JpdGUgdGhlIGNvbXBsZXRlIGNvZGUgaXMgdG8gd3JpdGUgdGhlIHRlc3QgaW4gb25lCis8b21wdHM6Y2hlY2s+IHRhZyBhbmQgbGF0ZXIgdGhlIGNyb3NzdGVzdCBpbiBvbmUgPG9tcHRzOmNyb3NzY2hlY2s+IHRhZy4gIFRoZQorc2Vjb25kIHdheSBpcyB0byB3cml0ZSBib3RoIHRlc3RzIG9ubHkgYnkgZW5jbG9zaW5nIGRpZmZlcmluZyBwYXJ0cyBpbgorY29ycmVzcG9uZGluZyB0YWdzLgorCitUaGUgZmlyc3QgbWV0aG9kIHNob3VsZCBiZSBwcmVmZXJyZWQgaWYgdGVzdCBhbmQgY3Jvc3N0ZXN0IGRpZmZlciBtdWNoIGZyb20KK2VhY2ggb3RoZXIuIFRoZSBzZWNvbmQgZS5nLiBpZiB5b3Ugb25seSB3YW50IHRvIGNoYW5nZSBhIGZldyBvcHRpb25zIGxpa2UKK3JlcGxhY2luZyBhbiBvbXAgc2luZ2xlcHJpdmF0ZSBjbGF1c2UgYnkgYW4gb21wIHByaXZhdGUgY2xhdXNlIG9yIHRvIGN1dCBvdXQKK2EgZGlyZWN0aXZlIGxpa2Ugb21wIGZsdXNoLiAgV2hlbiB5b3UgdXNlIHRoZSBmaXJzdCB3YXkgeW91IGhhdmUgdG8gdGFrZSBjYXJlCitvZiB0aGUgZnVuY3Rpb24gbmFtZSEgWW91IGhhdmUgdG8gZGVjbGFyZSBpdCB0d2ljZSB3aXRoCis8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiEKKworLSA8b21wdHM6b3JwaGFuPiA8L29tcHRzOm9ycGhhbj4gVGhpcyB0YWcgY2FuIGJlIHVzZWQgaWYgeW91IHdhbnQgdG8gZW5hYmxlCisgIHlvdXIgdGVzdCB0byBjaGVjayB0aGUgZGlyZWN0aXZlIGluIG9ycGhhbiByZWdpb25zLCB0b28uICBUaGUgY29kZSBlbmNsb3NlZAoraW4gdGhpcyBwYXJ0IHdpbGwgYmUgd3JpdHRlbiB0byBhIHNlcGFyYXRlIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgY2FsbGVkCitpbnN0ZWFkLiAgSWYgeW91IGhhdmUgdmFyaWFibGVzIHdoaWNoIGFyZSB1c2VkIG91dHNpZGUgdGhpcyByZWdpb24geW91IGhhdmUgdG8KK2RlY2xhcmUgdGhlbSBhcyBnbG9iYWwgdmFyaWFibGVzIGVuY2xvc2VkIGluIGFuIDxvbXB0czpvcnBoYW46dmFycz4gdGFnLiBGb3IKK2Z1cnRoZXIgaW5mb3JtYXRpb24gc2VlIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgPG9tcHRzOm9ycGhhbjp2YXJzPiB0YWcuCisKKy0gPG9tcHRzOm9ycGhhbjp2YXJzPiA8L29tcHRzOm9ycGhhbjp2YXJzPiBUaGlzIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgZ2xvYmFsCisgIHZhcmlhYmxlcyBmb3IgYW4gb3JwaGFuIHJlZ2lvbiB3aGljaCBhbGxvdyB0aGUgZXhjaGFuZ2Ugb2YgdmFsdWVzIGJldHdlZW4KK3RoZSBtYWluIHByb2dyYW0gYW5kIHRoZSBvcnBoYW5lZCBmdW5jdGlvbnMuIFRoZSB1c2FnZSBkaWZmZXJzIGJldHdlZW4gQyBhbmQKK0ZvcnRyYW4uICBJbiBDIHlvdSBoYXZlIHRvIHVzZSBhIHNpbmdsZSBkZWNsYXJhdGlvbiBmb3IgZWFjaCB2YXJpYWJsZS4gWW91IGNhbgorZWl0aGVyIGRlY2xhcmUgYWxsIHZhcmlhYmxlcyBpbiBvbmUgc2luZ2xlIG9yIGluIHNldmVyYWwgZGlmZmVyZW50IHJlZ2lvbnMuIFlvdQorbXVzdCBub3QgaW5pdGlhbGl6ZSB0aGUgdmFyaWFibGVzIGluc2lkZSEgIEluIEZvcnRyYW4geW91IGhhdmUgdG8gcHV0IGFsbAorZGVjbGFyYXRpb25zIGluIG9uZSBzaW5nbGUgdGFnLiBCZWNhdXNlIHRoZXJlIGV4aXN0IG5vIGdsb2JhbCB2YXJpYWJsZXMgYXMgaW4KK0MgeW91IGhhdmUgdG8gdXNlIGNvbW1vbiBibG9ja3MuIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHNlZSB0aGUgZXhhbXBsZXMuCisKK0lJSS4yLiAgQWRkaW5nIHRlc3RzIHRvIHRoZSB0ZXN0IGxpc3RzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBZnRlciB5b3UgaGF2ZSBjcmVhdGVkIGEgbmV3IHRlc3QgeW91IGhhdmUgdG8gYWRkIHRoZW0gdG8gYSB0ZXN0bGlzdC4gU2ltcGx5CithZGQgdGhlIGZ1bmN0aW9uIG5hbWUgaW4gYSBuZXcgTGluZSBpbnRvIGEgZmlsZS4KKworCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK0lWLiAgIEtub3duIElzc3VlcyBhbmQgV29ya2Fyb3VuZAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBTdW4gT1MgaGFzIGEgcHJvYmxlbSB3aXRoIHRoZSAtbWF4ZGVwdGggb3B0aW9uIG9uIHRoZSAnbWFrZSBjbGVhbmFsbCcKK2NvbW1hbmQuIFRoaXMgcHJldmVudHMgdGhlIHRlc3RzIGZyb20gYmVpbmcgcmVtb3ZlZCBmcm9tIHRoZSB3b3JraW5nIGRpcmVjdG9yeQorYW5kIGNhbiBjYXVzZSBwcm9ibGVtcyB3aXRoIGZ1dHVyZSB0ZXN0cy4gVG8gcmVtZWR5LCBlZGl0IHRoZSBtYWtlZmlsZSBsaW5lCit1bmRlciB0aGUgY2xlYW4gY29tbWFuZDoKKworICAgICAtcm0gW2NmXXRlc3QqLltjZl0gW2NmXWNyb3NzdGVzdCouW2NmXSBbY2ZdY3Rlc3QqLltjZl0gW2NmXW9ycGhhbiouW2NmXQorCitDaGFuZ2UgdG86CisKKyAgICAgLXJtIFtjZl10ZXN0KiBbY2ZdY3Jvc3N0ZXN0KiBbY2ZdY3Rlc3QqIFtjZl1vcnBoYW4qCisKKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVi4gICBDb250YWN0IGFuZCBTdXBwb3J0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQ29udGFjdDogaHR0cDovL3d3dy5jcy51aC5lZHUvfmhwY3Rvb2xzCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9oYXNfb3Blbm1wLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9oYXNfb3Blbm1wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgzYTk3MwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL2hhc19vcGVubXAuYwpAQCAtMCwwICsxLDMwIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIE9wZW5NcCBzdXBwb3J0Ljwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5fT1BFTk1QPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+aGFzX29wZW5tcDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBydmFsdWUgPSAwOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICA8b21wdHM6b3JwaGFuPgorICAgIDxvbXB0czpjaGVjaz4KKyNpZmRlZiBfT1BFTk1QCisJcnZhbHVlID0gMTsKKyNlbmRpZgorICAgIDwvb21wdHM6Y2hlY2s+CisgICAgPG9tcHRzOmNyb3NzY2hlY2s+CisjaWYgMAorCXJ2YWx1ZSA9IDE7CisjZW5kaWYKKyAgICA8L29tcHRzOmNyb3NzY2hlY2s+CisgICAgICA8L29tcHRzOm9ycGhhbj4KKwlyZXR1cm4gKHJ2YWx1ZSk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2F0b21pYy5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2F0b21pYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMmQxYWEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfYXRvbWljLmMKQEAgLTAsMCArMSw0MzQgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIGF0b21pYyBkaXJlY3RpdmUgYnkgY291bnRpbmcgdXAgYSB2YXJpYWJsZSBpbiBhIHBhcmFsbGVsaXplZCBsb29wIHdpdGggYW4gYXRvbWljIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGF0b21pYzwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfYXRvbWljPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IHN1bTsKKyAgICAgICAgaW50IGRpZmY7CisgICAgICAgIGRvdWJsZSBkc3VtID0gMDsKKyAgICAgICAgZG91YmxlIGR0ID0gMC41OwkvKiBiYXNlIG9mIGdlb21ldHJpYyByb3cgZm9yICsgYW5kIC0gdGVzdCovCisgICAgICAgIGRvdWJsZSBkZGlmZjsKKyAgICAgICAgaW50IHByb2R1Y3Q7CisgICAgICAgIGludCB4OworICAgICAgICBpbnQgKmxvZ2ljczsKKyAgICAgICAgaW50IGJpdF9hbmQgPSAxOworICAgICAgICBpbnQgYml0X29yID0gMDsKKyAgICAgICAgaW50IGV4Y2x1c2l2X2JpdF9vciA9IDA7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworI2RlZmluZSBET1VCTEVfRElHSVRTIDIwCS8qIGR0XkRPVUJMRV9ESUdJVFMgKi8KKyNkZWZpbmUgTUFYX0ZBQ1RPUiAxMAorI2RlZmluZSBLTk9XTl9QUk9EVUNUIDM2Mjg4MDAJLyogMTAhICovCisgICAgaW50IGo7CisgICAgaW50IGtub3duX3N1bTsKKyAgICBpbnQga25vd25fZGlmZjsKKyAgICBpbnQga25vd25fcHJvZHVjdDsKKyAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICBpbnQgbG9naWNfYW5kID0gMTsKKyAgICBpbnQgbG9naWNfb3IgPSAwOworICAgIGRvdWJsZSBka25vd25fc3VtOworICAgIGRvdWJsZSByb3VuZGluZ19lcnJvciA9IDEuRS05OworICAgIGRvdWJsZSBkcHQsIGRpdjsKKyAgICBpbnQgbG9naWNzQXJyYXlbTE9PUENPVU5UXTsKKyAgICBsb2dpY3MgPSBsb2dpY3NBcnJheTsKKyAgICAKKyAgICBzdW0gPSAwOworICAgIGRpZmYgPSAwOworICAgIHByb2R1Y3QgPSAxOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorCSAgICBmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKQorCSAgICB7CisJCTxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorCQlzdW0gKz0gaTsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKyAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgICAgaWYgKGtub3duX3N1bSAhPSBzdW0pCisgICAgeworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLCAKKyAgICAgICAgICAgICAgICAgIkVycm9yIGluIHN1bSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgJWQuXG4iLCAKKyAgICAgICAgICAgICAgICAgc3VtLCBrbm93bl9zdW0pOworICAgICAgICByZXN1bHQrKzsKKyAgICB9CisgICAgCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4gICAKKyAgICAgICAgICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgICBkaWZmIC09IGk7CisgICAgICAgICAgICB9CisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgIH0KKyAgICBrbm93bl9kaWZmID0gKChMT09QQ09VTlQgLSAxKSAqIExPT1BDT1VOVCkgLyAyICogLTE7CisgICAgaWYgKGRpZmYgIT0ga25vd25fZGlmZikKKyAgICB7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsCisgICAgICAgICAgICAgICJFcnJvciBpbiBkaWZmZXJlbmNlIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAwLlxuIiwKKyAgICAgICAgICAgICAgIGRpZmYpOworICAgICAgICByZXN1bHQrKzsKKyAgICB9CisKKyAgICAvKiBUZXN0cyBmb3IgZG91YmxlcyAqLworICAgIGRzdW0gPSAwOworICAgIGRwdCA9IDE7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgRE9VQkxFX0RJR0lUUzsgKytqKQorICAgICAgeworICAgICAgICBkcHQgKj0gZHQ7CisgICAgICB9CisgICAgZGtub3duX3N1bSA9ICgxIC0gZHB0KSAvICgxIC1kdCk7CisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRE9VQkxFX0RJR0lUUzsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIGRzdW0gKz0gcG93IChkdCwgaSk7CisgICAgICAgICAgICB9CisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmIChkc3VtICE9IGRrbm93bl9zdW0gJiYgKGZhYnMgKGRzdW0gLSBka25vd25fc3VtKSA+IHJvdW5kaW5nX2Vycm9yKSkKKyAgICB7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsCisgICAgICAgICAgICAgICAgICJFcnJvciBpbiBzdW0gd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICVmIGluc3RlYWQgb2Y6ICVmIChEaWZmZXJlbmNlOiAlRSlcbiIsCisgICAgICAgICAgICAgICAgIGRzdW0sIGRrbm93bl9zdW0sIGRzdW0gLSBka25vd25fc3VtKTsKKyAgICAgICAgcmVzdWx0Kys7CisgICAgfQorCisgICAgZHB0ID0gMTsKKworICAgIGZvciAoaiA9IDA7IGogPCBET1VCTEVfRElHSVRTOyArK2opCisgICAgeworICAgICAgICBkcHQgKj0gZHQ7CisgICAgfQorICAgIGRkaWZmID0gKDEgLSBkcHQpIC8gKDEgLSBkdCk7CisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgeworICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRE9VQkxFX0RJR0lUUzsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIGRkaWZmIC09IHBvdyAoZHQsIGkpOworICAgICAgICAgICAgfQorICAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfSAKKyAgICBpZiAoZmFicyAoZGRpZmYpID4gcm91bmRpbmdfZXJyb3IpCisgICAgeworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLAorICAgICAgICAgICAgICAgICAiRXJyb3IgaW4gZGlmZmVyZW5jZSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJUUgaW5zdGVhZCBvZiAwLjBcbiIsCisgICAgICAgICAgICAgICAgIGRkaWZmKTsKKyAgICAgICAgcmVzdWx0Kys7CisgICAgfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8PSBNQVhfRkFDVE9SOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgcHJvZHVjdCAqPSBpOworICAgICAgICAgICAgfQorICAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorICAgIAorICAgIGtub3duX3Byb2R1Y3QgPSBLTk9XTl9QUk9EVUNUOworICAgIGlmIChrbm93bl9wcm9kdWN0ICE9IHByb2R1Y3QpCisgICAgeworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLAorICAgICAgICAgICAgICAgICAiRXJyb3IgaW4gcHJvZHVjdCB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgJWRcbiIsCisgICAgICAgICAgICAgICAgIHByb2R1Y3QsIGtub3duX3Byb2R1Y3QpOworICAgICAgICByZXN1bHQrKzsKKyAgICB9CisKKyAgICBwcm9kdWN0ID0gS05PV05fUFJPRFVDVDsKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8PSBNQVhfRkFDVE9SOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgcHJvZHVjdCAvPSBpOworICAgICAgICAgICAgfQorICAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKHByb2R1Y3QgIT0gMSkKKyAgICB7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsCisgICAgICAgICAgICAgICAgICJFcnJvciBpbiBwcm9kdWN0IGRpdmlzaW9uIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAxXG4iLAorICAgICAgICAgICAgICAgICBwcm9kdWN0KTsKKyAgICAgICAgcmVzdWx0Kys7CisgICAgfQorICAgIAorICAgIGRpdiA9IDUuMEUrNTsKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgICAgICAgaW50IGk7CisjcHJhZ21hIG9tcCBmb3IKKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gTUFYX0ZBQ1RPUjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIGRpdiAvPSBpOworICAgICAgICAgICAgfQorICAgIH0KKworICAgIGlmIChmYWJzKGRpdi0wLjEzNzc4NykgPj0gMS4wRS00ICkKKyAgICB7CisgICAgICAgIHJlc3VsdCsrOworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLAorICAgICAgICAgICAgICAgICAiRXJyb3IgaW4gZGl2aXNpb24gd2l0aCBkb3VibGU6IFJlc3VsdCB3YXMgJWYgaW5zdGVhZCBvZiAwLjEzNzc4N1xuIiwgZGl2KTsKKyAgICB9CisKKyAgICB4ID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIHgrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmICh4ICE9IExPT1BDT1VOVCkKKyAgICB7CisgICAgICAgIHJlc3VsdCsrOworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gKytcbiIpOworICAgIH0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIHgtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKHggIT0gMCkKKyAgICB7CisgICAgICAgIHJlc3VsdCsrOworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gLS1cbiIpOworICAgIH0KKworICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikKKyAgICB7CisgICAgICAgIGxvZ2ljc1tqXSA9IDE7CisgICAgfQorICAgIGJpdF9hbmQgPSAxOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgaW50IGk7CisjcHJhZ21hIG9tcCBmb3IKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgYXRvbWljPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICBiaXRfYW5kICY9IGxvZ2ljc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmICghYml0X2FuZCkKKyAgICB7CisgICAgICAgIHJlc3VsdCsrOworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDFcbiIpOworICAgIH0KKworICAgIGJpdF9hbmQgPSAxOworICAgIGxvZ2ljc1tMT09QQ09VTlQgLyAyXSA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgaW50IGk7CisjcHJhZ21hIG9tcCBmb3IKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgYXRvbWljPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICBiaXRfYW5kICY9IGxvZ2ljc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKGJpdF9hbmQpCisgICAgeworICAgICAgICByZXN1bHQrKzsKKyAgICAgICAgZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIEJJVCBBTkQgcGFydCAyXG4iKTsKKyAgICB9CisKKyAgICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyBqKyspCisgICAgeworICAgICAgICBsb2dpY3Nbal0gPSAwOworICAgIH0KKyAgICBiaXRfb3IgPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgYml0X29yIHw9IGxvZ2ljc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKGJpdF9vcikKKyAgICB7CisgICAgICAgIHJlc3VsdCsrOworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gQklUIE9SIHBhcnQgMVxuIik7CisgICAgfQorICAgIGJpdF9vciA9IDA7CisgICAgbG9naWNzW0xPT1BDT1VOVCAvIDJdID0gMTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIGJpdF9vciB8PSBsb2dpY3NbaV07CisgICAgICAgICAgICB9CisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgaWYgKCFiaXRfb3IpCisgICAgeworICAgICAgICByZXN1bHQrKzsKKyAgICAgICAgZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIEJJVCBPUiBwYXJ0IDJcbiIpOworICAgIH0KKworICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7IGorKykKKyAgICB7CisgICAgICAgIGxvZ2ljc1tqXSA9IDA7CisgICAgfQorICAgIGV4Y2x1c2l2X2JpdF9vciA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgICA8b21wdHM6b3JwaGFuPiAKKyAgICAgICAgICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgXj0gbG9naWNzW2ldOworICAgICAgICAgICAgfQorICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGlmIChleGNsdXNpdl9iaXRfb3IpIAorICAgIHsKKyAgICAgICAgcmVzdWx0Kys7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAxXG4iKTsKKyAgICB9CisKKyAgICBleGNsdXNpdl9iaXRfb3IgPSAwOworICAgIGxvZ2ljc1tMT09QQ09VTlQgLyAyXSA9IDE7CisgICAgCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4gCisgICAgICAgICAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgYXRvbWljPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICAgZXhjbHVzaXZfYml0X29yIF49IGxvZ2ljc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBpZiAoIWV4Y2x1c2l2X2JpdF9vcikgCisgICAgeworICAgICAgICByZXN1bHQrKzsKKyAgICAgICAgZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDJcbiIpOworICAgIH0KKworICAgIHggPSAxOworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDEwOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgICB4IDw8PSAxOworICAgICAgICAgICAgfQorICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9CisKKyAgICBpZiAoIHggIT0gMTAyNCkKKyAgICB7CisgICAgICAgIHJlc3VsdCsrOworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gPDxcbiIpOworICAgICAgICB4ID0gMTAyNDsKKyAgICB9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgaW50IGk7CisjcHJhZ21hIG9tcCBmb3IKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMDsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIHggPj49IDE7CisgICAgICAgICAgICB9CisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmICh4ICE9IDEpCisgICAgeworICAgICAgICByZXN1bHQrKzsKKyAgICAgICAgZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluID4+XG4iKTsKKyAgICB9CisKKyAgICByZXR1cm4gKHJlc3VsdCA9PSAwKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfYmFycmllci5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2JhcnJpZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjY2OWUyCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2JhcnJpZXIuYwpAQCAtMCwwICsxLDQxIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBiYXJyaWVyIGRpcmVjdGl2ZS4gVGhlIHRlc3QgY3JlYXRlcyBzZXZlcmFsIHRocmVhZHMgYW5kIHNlbmRzIG9uZSBvZiB0aGVtIHNsZWVwaW5nIGJlZm9yZSBzZXR0aW5nIGEgZmxhZy4gQWZ0ZXIgdGhlIGJhcnJpZXIgdGhlIG90aGVyIG9uZXMgZG8gc29tZSBsaXR0bGUgd29yayBkZXBlbmRpbmcgb24gdGhlIGZsYWcuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBiYXJyaWVyPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2JhcnJpZXI8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgcmVzdWx0MTsKKwlpbnQgcmVzdWx0MjsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgcmVzdWx0MSA9IDA7CisgICAgcmVzdWx0MiA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgIDxvbXB0czpvcnBoYW4+CisJaW50IHJhbms7CisJcmFuayA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKwlpZiAocmFuayA9PTEpIHsKKyAgICAgICAgbXlfc2xlZXAoU0xFRVBUSU1FX0xPTkcpOworICAgICAgICByZXN1bHQyID0gMzsKKwl9Cis8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgYmFycmllcjwvb21wdHM6Y2hlY2s+CisJaWYgKHJhbmsgPT0gMikgeworCSAgICByZXN1bHQxID0gcmVzdWx0MjsKKwl9CisgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorICAgIHByaW50ZigicmVzdWx0MT0lZFxuIixyZXN1bHQxKTsKKyAgICByZXR1cm4gKHJlc3VsdDEgPT0gMyk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2NyaXRpY2FsLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfY3JpdGljYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjNmMjY0Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2NyaXRpY2FsLmMKQEAgLTAsMCArMSw0MiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgY3JpdGljYWwgZGlyZWN0aXZlIGJ5IGNvdW50aW5nIHVwIGEgdmFyaWFibGUgaW4gYSBwYXJhbGxlbGl6ZWQgbG9vcCB3aXRoaW4gYSBjcml0aWNhbCBzZWN0aW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgY3JpdGljYWw8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfY3JpdGljYWw8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgc3VtOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgc3VtPTA7CisgICAgaW50IGtub3duX3N1bTsKKwkgIAorICAgIDxvbXB0czpvcnBoYW4+CisgICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgICBpbnQgbXlzdW09MDsKKyAgICAgIGludCBpOworICAgICAgCisgICAgICAjcHJhZ21hIG9tcCBmb3IKKwkgICAgZm9yIChpID0gMDsgaSA8IDEwMDA7IGkrKykKKwkgICAgICBteXN1bSA9IG15c3VtICsgaTsKKworICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBjcml0aWNhbDwvb21wdHM6Y2hlY2s+CisJICAgIHN1bSA9IG15c3VtICtzdW07CisgICAgICAgIAorICAgIH0JLyogZW5kIG9mIHBhcmFsbGVsICovCisgICAgPC9vbXB0czpvcnBoYW4+CisgICAgCisgICAgcHJpbnRmKCJzdW09JWRcbiIsc3VtKTsKKyAgICBrbm93bl9zdW0gPSA5OTkgKiAxMDAwIC8gMjsKKyAgICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworCit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2ZsdXNoLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZmx1c2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmFiZjhlCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2ZsdXNoLmMKQEAgLTAsMCArMSw1MCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgZmx1c2ggZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZmx1c2g8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgYmFycmllcjwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2ZsdXNoPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IHJlc3VsdDE7CisJaW50IHJlc3VsdDI7CisJaW50IGR1bW15OworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKwlyZXN1bHQxID0gMDsKKwlyZXN1bHQyID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisJaW50IHJhbms7CisJcmFuayA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKworI3ByYWdtYSBvbXAgYmFycmllcgorCWlmIChyYW5rID09IDEpIHsKKwkgICAgcmVzdWx0MiA9IDM7CisJICAgIDxvbXB0czpvcnBoYW4+CisJCTxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBmbHVzaCAocmVzdWx0Mik8L29tcHRzOmNoZWNrPgorCQlkdW1teSA9IHJlc3VsdDI7CisJICAgIDwvb21wdHM6b3JwaGFuPgorCX0KKworCWlmIChyYW5rID09IDApIHsKKwkgICAgPG9tcHRzOmNoZWNrPm15X3NsZWVwKFNMRUVQVElNRV9MT05HKTs8L29tcHRzOmNoZWNrPgorCSAgICA8b21wdHM6b3JwaGFuPgorCQk8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgZmx1c2ggKHJlc3VsdDIpPC9vbXB0czpjaGVjaz4KKwkJcmVzdWx0MSA9IHJlc3VsdDI7CisJICAgIDwvb21wdHM6b3JwaGFuPgorCX0KKyAgICB9CS8qIGVuZCBvZiBwYXJhbGxlbCAqLworCisgICAgcmV0dXJuICgocmVzdWx0MSA9PSByZXN1bHQyKSAmJiAocmVzdWx0MiA9PSBkdW1teSkgJiYgKHJlc3VsdDIgPT0gMykpOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3JfY29sbGFwc2UuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3JfY29sbGFwc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjE2ZjQwCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9jb2xsYXBzZS5jCkBAIC0wLDAgKzEsNTYgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdpdGggb21wIGZvciBjb2xsYXBzZSBjbGF1c2UuIEJpbmQgd2l0aCB0d28gbG9vcHMuIFdpdGhvdXQgdGhlIGNvbGxhcHNlIGNsYXVzZSwgdGhlIGZpcnN0IGxvb3Agd2lsbCBub3QgYmUgb3JkZXJlZDwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZm9yIGNvbGxhcHNlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcCBmb3Igc2NoZWR1bGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisKKy8qIFV0aWxpdHkgZnVuY3Rpb24gdG8gY2hlY2sgdGhhdCBpIGlzIGluY3JlYXNpbmcgbW9ub3RvbmljYWxseSAKKyAgIHdpdGggZWFjaCBjYWxsICovCitzdGF0aWMgaW50IGNoZWNrX2lfaXNsYXJnZXIgKGludCBpKQoreworICAgIHN0YXRpYyBpbnQgbGFzdF9pOworICAgIGludCBpc2xhcmdlcjsKKyAgICBpZiAoaT09MSkKKyAgICAgIGxhc3RfaT0wOworICAgIGlzbGFyZ2VyID0gKChpID49IGxhc3RfaSkmJihpIC0gbGFzdF9pPD0xKSk7CisgICAgbGFzdF9pID0gaTsKKyAgICByZXR1cm4gKGlzbGFyZ2VyKTsKK30KKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2Zvcl9jb2xsYXBzZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBpc19sYXJnZXIgPSAxOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgaW50IGksajsKKwkgIGludCBteV9pc2xhcmdlciA9IDE7CisgICAgICAjcHJhZ21hIG9tcCBmb3IgcHJpdmF0ZShpLGopIHNjaGVkdWxlKHN0YXRpYywxKSA8b21wdHM6Y2hlY2s+Y29sbGFwc2UoMik8L29tcHRzOmNoZWNrPiBvcmRlcmVkCisJICAgIGZvciAoaSA9IDE7IGkgPCAxMDA7IGkrKyl7CisgICAgICAgICAgPG9tcHRzOmNyb3NzY2hlY2s+bXlfaXNsYXJnZXIgPSBjaGVja19pX2lzbGFyZ2VyKGkpJiYgbXlfaXNsYXJnZXI7PC9vbXB0czpjcm9zc2NoZWNrPgorICAgICAgICAgIGZvciAoaiA9MTsgaiA8MTAwOyBqKyspCisgICAgICAgICAgeworICAgICAgICAgICAgPG9tcHRzOmNoZWNrPgorCQkgICAgI3ByYWdtYSBvbXAgb3JkZXJlZAorCQkgICAgICBteV9pc2xhcmdlciA9IGNoZWNrX2lfaXNsYXJnZXIoaSkmJm15X2lzbGFyZ2VyOworICAgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKwkgICAgICB9CS8qIGVuZCBvZiBmb3IgKi8KKyAgICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkJaXNfbGFyZ2VyID0gaXNfbGFyZ2VyICYmIG15X2lzbGFyZ2VyOworCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIHJldHVybiAoaXNfbGFyZ2VyKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX2ZpcnN0cHJpdmF0ZS5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9maXJzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjcyMDE0Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9maXJzdHByaXZhdGUuYwpAQCAtMCwwICsxLDU1IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBmb3IgZmlyc3Rwcml2YXRlIGNsYXVzZSBieSBjb3VudGluZyB1cCBhIHZhcmlhYmxlIGluIGEgcGFyYWxsZWxpemVkIGxvb3AuIEVhY2ggdGhyZWFkIGhhcyBhIGZpcnN0cHJpdmF0ZSB2YXJpYWJsZSAoMSkgYW5kIGFuIHZhcmlhYmxlICgyKSBkZWNsYXJlZCBieSBmb3IgZmlyc3Rwcml2YXRlLiBGaXJzdCBpdCBzdG9yZXMgdGhlIHJlc3VsdCBvZiBpdHMgbGFzdCBpdGVyYXRpb24gaW4gdmFyaWFibGUgKDIpLiBUaGVuIGl0IHN0b3JlcyB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlICgyKSBpbiBpdHMgZmlyc3Rwcml2YXRlIHZhcmlhYmxlICgxKS4gQXQgdGhlIGVuZCBhbGwgZmlyc3Rwcml2YXRlIHZhcmlhYmxlcyAoMSkgYXJlIGFkZGVkIHRvIGEgdG90YWwgc3VtIGluIGEgY3JpdGljYWwgc2VjdGlvbiBhbmQgY29tcGFyZWQgd2l0aCB0aGUgY29ycmVjdCByZXN1bHQuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBmb3IgZmlyc3Rwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcCBwYXJhbGxlbCBmaXJzdHByaXZhdGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgc3VtMTsKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoc3VtMSkKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2Zvcl9maXJzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgIGludCBzdW07CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBzdW0wOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICBpbnQga25vd25fc3VtOworICAgIGludCB0aHJlYWRzbnVtOworCisgICAgc3VtID0gMDsKKyAgICBzdW0wID0gMTIzNDU7CisgICAgc3VtMSA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocmVhZHNudW09b21wX2dldF9udW1fdGhyZWFkcygpOworICAgICAgICB9CisJLyogc3VtMCA9IDA7ICovCisJPG9tcHRzOm9ycGhhbj4KKwlpbnQgaTsKKyNwcmFnbWEgb21wIGZvciA8b21wdHM6Y2hlY2s+Zmlyc3Rwcml2YXRlKHN1bTApPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz5wcml2YXRlKHN1bTApPC9vbXB0czpjcm9zc2NoZWNrPgorCWZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspCisJeworCSAgICBzdW0wID0gc3VtMCArIGk7CisJICAgIHN1bTEgPSBzdW0wOworCX0JLyogZW5kIG9mIGZvciAqLworCTwvb21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisJICAgIHN1bSA9IHN1bSArIHN1bTE7CisJfQkvKiBlbmQgb2YgY3JpdGljYWwgKi8KKyAgICB9CS8qIGVuZCBvZiBwYXJhbGxlbCAqLyAgICAKKworICAgIGtub3duX3N1bSA9IDEyMzQ1KiB0aHJlYWRzbnVtKyAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgICAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX2xhc3Rwcml2YXRlLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX2xhc3Rwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIwODBhMgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3JfbGFzdHByaXZhdGUuYwpAQCAtMCwwICsxLDUyIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBmb3IgbGFzdHByaXZhdGUgY2xhdXNlIGJ5IGNvdW50aW5nIHVwIGEgdmFyaWFibGUgaW4gYSBwYXJhbGxlbGl6ZWQgbG9vcC4gRWFjaCB0aHJlYWQgc2F2ZXMgdGhlIG5leHQgc3VtbWFuZCBpbiBhIGxhc3Rwcml2YXRlIHZhcmlhYmxlIGkwLiBBdCB0aGUgZW5kIGkwIGlzIGNvbXBhcmVkIHRvIHRoZSB2YWx1ZSBvZiB0aGUgZXhwZWN0ZWQgbGFzdCBzdW1tYW5kLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZm9yIGxhc3Rwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcCBwYXJhbGxlbCBmaXJzdHByaXZhdGUsb21wIHNjaGVkdWxlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHN1bTA7CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKHN1bTApCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9mb3JfbGFzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworCWludCBzdW0gPSAwOworCWludCBrbm93bl9zdW07CisJPG9tcHRzOm9ycGhhbjp2YXJzPgorCSAgICBpbnQgaTA7CisJPC9vbXB0czpvcnBoYW46dmFycz4KKworCWkwID0gLTE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisJeworCSAgICBzdW0wID0gMDsKKwkgICAgewkvKiBCZWdpbiBvZiBvcnBoYW5lZCBibG9jayAqLworCSAgICA8b21wdHM6b3JwaGFuPgorCQlpbnQgaTsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShzdGF0aWMsNykgPG9tcHRzOmNoZWNrPmxhc3Rwcml2YXRlKGkwKTwvb21wdHM6Y2hlY2s+CisJCWZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspCisJCXsKKwkJICAgIHN1bTAgPSBzdW0wICsgaTsKKwkJICAgIGkwID0gaTsKKwkJfQkvKiBlbmQgb2YgZm9yICovCisJICAgIDwvb21wdHM6b3JwaGFuPgorCSAgICB9CS8qIGVuZCBvZiBvcnBoYW5lZCBibG9jayAqLworCisjcHJhZ21hIG9tcCBjcml0aWNhbAorCSAgICB7CisJCXN1bSA9IHN1bSArIHN1bTA7CisJICAgIH0JLyogZW5kIG9mIGNyaXRpY2FsICovCisJfQkvKiBlbmQgb2YgcGFyYWxsZWwgKi8gICAgCisKKwlrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisJZnByaW50Zihsb2dGaWxlLCIga25vd25fc3VtID0gJWQgLCBzdW0gPSAlZCBcbiIsa25vd25fc3VtLHN1bSk7CisJZnByaW50Zihsb2dGaWxlLCIgTE9PUENPVU5UID0gJWQgLCBpMCA9ICVkIFxuIixMT09QQ09VTlQsaTApOworCXJldHVybiAoKGtub3duX3N1bSA9PSBzdW0pICYmIChpMCA9PSBMT09QQ09VTlQpICk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9ub3dhaXQuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfbm93YWl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNlYzQwYgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfbm93YWl0LmMKQEAgLTAsMCArMSw1NyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBmb3Igbm93YWl0IGRpcmVjdGl2ZS4gSXQgZmlsbHMgYW4gYXJyYXkgd2l0aCB2YWx1ZXMgYW5kIG9wZXJhdGVzIG9uIHRoZXNlIGluIHRoZSBmb2xsb3dpbmcuPC9vbXB0czpkZXNjcmlwdGlvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIGZvciBub3dhaXQ8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp2ZXJzaW9uPjEuMDwvb21wdHM6dmVyc2lvbj4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgcGFyYWxsZWwgZm9yLCBvbXAgZmx1c2g8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9mb3Jfbm93YWl0PC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKwk8b21wdHM6b3JwaGFuOnZhcnM+CisJCWludCByZXN1bHQ7CisJCWludCBjb3VudDsKKwk8L29tcHRzOm9ycGhhbjp2YXJzPgorCWludCBqOworCWludCBteWFycmF5W0xPT1BDT1VOVF07CisKKwlyZXN1bHQgPSAwOworCWNvdW50ID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisJeworCTxvbXB0czpvcnBoYW4+CisJCWludCByYW5rOworCQlpbnQgaTsKKworCQlyYW5rID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisKKyNwcmFnbWEgb21wIGZvciA8b21wdHM6Y2hlY2s+bm93YWl0PC9vbXB0czpjaGVjaz4gCisJCWZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykgeworCQkJaWYgKGkgPT0gMCkgeworCQkJCWZwcmludGYgKGxvZ0ZpbGUsICJUaHJlYWQgbnIgJWQgZW50ZXJpbmcgZm9yIGxvb3AgYW5kIGdvaW5nIHRvIHNsZWVwLlxuIiwgcmFuayk7CisJCQkJbXlfc2xlZXAoU0xFRVBUSU1FKTsKKwkJCQljb3VudCA9IDE7CisjcHJhZ21hIG9tcCBmbHVzaChjb3VudCkKKwkJCQlmcHJpbnRmIChsb2dGaWxlLCAiVGhyZWFkIG5yICVkIHdva2UgdXAgYW5kIHNldCBjb3VudCA9IDEuXG4iLCByYW5rKTsKKwkJCX0KKwkJfQorCQkKKwkJZnByaW50ZiAobG9nRmlsZSwgIlRocmVhZCBuciAlZCBleGl0ZWQgZmlyc3QgZm9yIGxvb3AgYW5kIGVudGVycyB0aGUgc2Vjb25kLlxuIiwgcmFuayk7CisjcHJhZ21hIG9tcCBmb3IKKwkJZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKSAKKwkJeworI3ByYWdtYSBvbXAgZmx1c2goY291bnQpCisJCQlpZiAoY291bnQgPT0gMCkKKwkJCQlyZXN1bHQgPSAxOworCQl9CisJPC9vbXB0czpvcnBoYW4+CisJfQorCQorCXJldHVybiByZXN1bHQ7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9vcmRlcmVkLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX29yZGVyZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mjk3ZDA0Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9vcmRlcmVkLmMKQEAgLTAsMCArMSw2MCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgb3JkZXJlZCBkaXJlY3RpdmUgYnkgY291bnRpbmcgdXAgYW4gdmFyaWFibGUgaW4gYW4gcGFyYWxsZWxpemVkIGxvb3AgYW5kIHdhdGNoaW5nIGVhY2ggaXRlcmF0aW9uIGlmIHRoZSBzdW1hbmQgaXMgbGFyZ2VyIGFzIHRoZSBsYXN0IG9uZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGZvciBvcmRlcmVkPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcCBmb3Igc2NoZWR1bGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitzdGF0aWMgaW50IGxhc3RfaSA9IDA7CisKKy8qIFV0aWxpdHkgZnVuY3Rpb24gdG8gY2hlY2sgdGhhdCBpIGlzIGluY3JlYXNpbmcgbW9ub3RvbmljYWxseSAKKyAgIHdpdGggZWFjaCBjYWxsICovCitzdGF0aWMgaW50IGNoZWNrX2lfaXNsYXJnZXIgKGludCBpKQoreworICAgIGludCBpc2xhcmdlcjsKKyAgICBpc2xhcmdlciA9IChpID4gbGFzdF9pKTsKKyAgICBsYXN0X2kgPSBpOworICAgIHJldHVybiAoaXNsYXJnZXIpOworfQorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfZm9yX29yZGVyZWQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgc3VtOworCWludCBpc19sYXJnZXIgPSAxOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IGtub3duX3N1bTsKKworICAgIGxhc3RfaSA9IDA7CisgICAgc3VtID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGk7CisJICAgIGludCBteV9pc2xhcmdlciA9IDE7CisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoc3RhdGljLDEpIG9yZGVyZWQKKwkgICAgZm9yIChpID0gMTsgaSA8IDEwMDsgaSsrKQorCSAgICB7CisJCTxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBvcmRlcmVkPC9vbXB0czpjaGVjaz4KKwkJeworCQkgICAgbXlfaXNsYXJnZXIgPSBjaGVja19pX2lzbGFyZ2VyKGkpICYmIG15X2lzbGFyZ2VyOworCQkgICAgc3VtID0gc3VtICsgaTsKKwkJfQkvKiBlbmQgb2Ygb3JkZXJlZCAqLworCSAgICB9CS8qIGVuZCBvZiBmb3IgKi8KKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJICAgIHsKKwkJaXNfbGFyZ2VyID0gaXNfbGFyZ2VyICYmIG15X2lzbGFyZ2VyOworCSAgICB9CS8qIGVuZCBvZiBjcml0aWNhbCAqLworCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGtub3duX3N1bT0oOTkgKiAxMDApIC8gMjsKKyAgICByZXR1cm4gKChrbm93bl9zdW0gPT0gc3VtKSAmJiBpc19sYXJnZXIpOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3JfcHJpdmF0ZS5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9wcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE2NTExMAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3JfcHJpdmF0ZS5jCkBAIC0wLDAgKzEsNjQgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIGZvciBwcml2YXRlIGNsYXVzZSBieSBjb3VudGluZyB1cCBhIHZhcmlhYmxlIGluIGEgcGFyYWxsZWxpemVkIGxvb3AuIEVhY2ggdGhyZWFkIGhhcyBhIHByaXZhdGUgdmFyaWFibGUgKDEpIGFuZCBhIHZhcmlhYmxlICgyKSBkZWNsYXJlZCBieSBmb3IgcHJpdmF0ZS4gRmlyc3QgaXQgc3RvcmVzIHRoZSByZXN1bHQgb2YgaXRzIGxhc3QgaXRlcmF0aW9uIGluIHZhcmlhYmxlICgyKS4gVGhlbiB0aGlzIHRocmVhZCB3YWl0cyBzb21lIHRpbWUgYmVmb3JlIGl0IHN0b3JlcyB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlICgyKSBpbiBpdHMgcHJpdmF0ZSB2YXJpYWJsZSAoMSkuIEF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgaXRlcmF0aW9uIHRoZSB2YWx1ZSBvZiAoMSkgaXMgYXNzaWduZWQgdG8gKDIpLiBBdCB0aGUgZW5kIGFsbCBwcml2YXRlIHZhcmlhYmxlcyAoMSkgYXJlIGFkZGVkIHRvIGEgdG90YWwgc3VtIGluIGEgY3JpdGljYWwgc2VjdGlvbiBhbmQgY29tcGFyZWQgd2l0aCB0aGUgY29ycmVjdCByZXN1bHQuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBmb3IgcHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBwYXJhbGxlbCxvbXAgZmx1c2gsb21wIGNyaXRpY2FsLG9tcCB0aHJlYWRwcml2YXRlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKy8qIFV0aWxpdHkgZnVuY3Rpb24gZG8gc3BlbmQgc29tZSB0aW1lIGluIGEgbG9vcCAqLworc3RhdGljIHZvaWQgZG9fc29tZV93b3JrICgpeworICAgIGludCBpOworICAgIGRvdWJsZSBzdW0gPSAwOworICAgIGZvcihpID0gMDsgaSA8IDEwMDA7IGkrKyl7CisJc3VtICs9IHNxcnQgKChkb3VibGUpIGkpOworICAgIH0KK30KKworaW50IHN1bTE7CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKHN1bTEpCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9mb3JfcHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgaW50IHN1bSA9IDA7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBzdW0wOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICBpbnQga25vd25fc3VtOworCisgICAgc3VtMCA9IDA7CS8qIHNldHRpbmcgKGdsb2JhbCkgc3VtMCA9IDAgKi8KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisJc3VtMSA9IDA7CS8qIHNldHRpbmcgc3VtMSBpbiBlYWNoIHRocmVhZCB0byAwICovCisKKwl7CS8qIGJlZ2luIG9mIG9ycGhhbmVkIGJsb2NrICovCisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGk7CisjcHJhZ21hIG9tcCBmb3IgPG9tcHRzOmNoZWNrPnByaXZhdGUoc3VtMCk8L29tcHRzOmNoZWNrPiBzY2hlZHVsZShzdGF0aWMsMSkKKwkgICAgZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykKKwkgICAgeworCQlzdW0wID0gc3VtMTsKKyNwcmFnbWEgb21wIGZsdXNoCisJCXN1bTAgPSBzdW0wICsgaTsKKwkJZG9fc29tZV93b3JrICgpOworI3ByYWdtYSBvbXAgZmx1c2gKKwkJc3VtMSA9IHN1bTA7CisJICAgIH0JLyogZW5kIG9mIGZvciAqLworCTwvb21wdHM6b3JwaGFuPgorCX0JLyogZW5kIG9mIG9ycGhhbmVkIGJsb2NrICovCisKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJeworCSAgICBzdW0gPSBzdW0gKyBzdW0xOworCX0JLyplbmQgb2YgY3JpdGljYWwqLworICAgIH0JLyogZW5kIG9mIHBhcmFsbGVsKi8gICAgCisKKyAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgICAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3JfcmVkdWN0aW9uLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX3JlZHVjdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZDE5MTcKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX3JlZHVjdGlvbi5jCkBAIC0wLDAgKzEsNDI5IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBmb3IgcmVkdWN0aW9uIGRpcmVjdGl2ZSB3aWNoIGFsbCBpdHMgb3B0aW9ucy48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGZvciByZWR1Y3Rpb248L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfZm9yX3JlZHVjdGlvbjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWRvdWJsZSBkdDsKKwlpbnQgc3VtOworCWludCBkaWZmOworCWludCBwcm9kdWN0ID0gMTsKKwlkb3VibGUgZHN1bTsKKwlkb3VibGUgZGtub3duX3N1bTsKKwlkb3VibGUgZGRpZmY7CisJaW50IGxvZ2ljX2FuZDsKKwlpbnQgbG9naWNfb3I7CisJaW50IGJpdF9hbmQ7CisJaW50IGJpdF9vcjsKKwlpbnQgZXhjbHVzaXZfYml0X29yOworCWludCAqbG9naWNzOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyNkZWZpbmUgRE9VQkxFX0RJR0lUUyAyMAkvKiBkdF5ET1VCTEVfRElHSVRTICovCisjZGVmaW5lIE1BWF9GQUNUT1IgMTAKKyNkZWZpbmUgS05PV05fUFJPRFVDVCAzNjI4ODAwCS8qIDEwISAqLworCisgICAgaW50IGk7CisgICAgaW50IGtub3duX3N1bTsKKyAgICBpbnQga25vd25fcHJvZHVjdDsKKyAgICBkb3VibGUgcm91bmRpbmdfZXJyb3IgPSAxLkUtOTsJLyogb3ZlciBhbGwgcm91bmRpbmcgZXJyb3IgdG8gYmUgaWdub3JlZCBpbiB0aGUgZG91YmxlIHRlc3RzICovCisgICAgZG91YmxlIGRwdDsKKyAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICBpbnQgbG9naWNzQXJyYXlbTE9PUENPVU5UXTsKKworICAgIC8qIFZhcmlhYmxlcyBmb3IgaW50ZWdlciB0ZXN0cyAqLworICAgIHN1bSA9IDA7CisgICAgcHJvZHVjdCA9IDE7CisgICAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworICAgIC8qIHZhcmlhYmVscyBmb3IgZG91YmxlIHRlc3RzICovCisgICAgZHQgPSAxLiAvIDMuOwkvKiBiYXNlIG9mIGdlb21ldHJpYyByb3cgZm9yICsgYW5kIC0gdGVzdCovCisgICAgZHN1bSA9IDAuOworICAgIC8qIFZhcmlhYmVsZXMgZm9yIGxvZ2ljICB0ZXN0cyAqLworICAgIGxvZ2ljcyA9IGxvZ2ljc0FycmF5OworICAgIGxvZ2ljX2FuZCA9IDE7CisgICAgbG9naWNfb3IgPSAwOworICAgIC8qIFZhcmlhYmVsZXMgZm9yIGJpdCBvcGVyYXRvcnMgdGVzdHMgKi8KKyAgICBiaXRfYW5kID0gMTsKKyAgICBiaXRfb3IgPSAwOworICAgIC8qIFZhcmlhYmxlcyBmb3IgZXhjbHVzaXYgYml0IG9yICovCisgICAgZXhjbHVzaXZfYml0X29yID0gMDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBUZXN0cyBmb3IgaW50ZWdlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKiogVGVzdGluZyBpbnRlZ2VyIGFkZGl0aW9uICoqKiovCisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgajsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKzpzdW0pPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJICAgIGZvciAoaiA9IDE7IGogPD0gTE9PUENPVU5UOyBqKyspCisJICAgIHsKKwkJc3VtID0gc3VtICsgajsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmIChrbm93bl9zdW0gIT0gc3VtKSB7CisJcmVzdWx0Kys7CisJZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIHN1bSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgJWQuXG4iLCBzdW0sIGtub3duX3N1bSk7IAorICAgIH0KKworCisvKioqKiBUZXN0aW5nIGludGVnZXIgc3VidHJhY3RvbiAqKioqLworCisgICAgZGlmZiA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgajsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLTpkaWZmKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCSAgICBmb3IgKGogPSAxOyBqIDw9IExPT1BDT1VOVDsgaisrKQorCSAgICB7CisJCWRpZmYgPSBkaWZmIC0gajsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmIChkaWZmICE9IDApIHsKKwlyZXN1bHQrKzsKKwlmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gZGlmZmVyZW5jZSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgMC5cbiIsIGRpZmYpOworICAgIH0KKworCisvKioqKiBUZXN0aW5nIGludGVnZXIgbXVsdGlwbGljYXRpb24gKioqKi8KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIGludCBqOworI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigqOnByb2R1Y3QpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJICAgIGZvciAoaiA9IDE7IGogPD0gTUFYX0ZBQ1RPUjsgaisrKQorCSAgICB7CisJCXByb2R1Y3QgKj0gajsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGtub3duX3Byb2R1Y3QgPSBLTk9XTl9QUk9EVUNUOworICAgIGlmKGtub3duX3Byb2R1Y3QgIT0gcHJvZHVjdCkKKyAgICB7CisJcmVzdWx0Kys7CisJZnByaW50ZiAobG9nRmlsZSwiRXJyb3IgaW4gUHJvZHVjdCB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgJWRcbiIscHJvZHVjdCxrbm93bl9wcm9kdWN0KTsKKyAgICB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogVGVzdHMgZm9yIGRvdWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqIFRlc3RpbmcgZG91YmxlIGFkZGl0aW9uICoqKiovCisKKyAgICBkc3VtID0gMC47CisgICAgZHB0ID0gMS47CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRE9VQkxFX0RJR0lUUzsgKytpKQorICAgIHsKKwlkcHQgKj0gZHQ7CisgICAgfQorICAgIGRrbm93bl9zdW0gPSAoMSAtIGRwdCkgLyAoMSAtIGR0KTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIGludCBqOworI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigrOmRzdW0pPC9vbXB0czpjaGVjaz4KKwkgICAgZm9yIChqID0gMDsgaiA8IERPVUJMRV9ESUdJVFM7IGorKykKKwkgICAgewkKKwkJZHN1bSArPSBwb3cgKGR0LCBqKTsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmIChmYWJzIChkc3VtIC0gZGtub3duX3N1bSkgPiByb3VuZGluZ19lcnJvcikgeworCXJlc3VsdCsrOyAKKwlmcHJpbnRmIChsb2dGaWxlLCAiXG5FcnJvciBpbiBzdW0gd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICVmIGluc3RlYWQgb2Y6ICVmIChEaWZmZXJlbmNlOiAlRSlcbiIsIGRzdW0sIGRrbm93bl9zdW0sIGRzdW0tZGtub3duX3N1bSk7CisgICAgfQorCisjaWYgMAorICAgIGRwdCA9IDEuOworICAgIGZvciAoaSA9IDA7IGkgPCBET1VCTEVfRElHSVRTOyArK2kpCisgICAgeworCWRwdCAqPSBkdDsKKyAgICB9CisjZW5kaWYKKworCisvKioqKiBUZXN0aW5nIGRvdWJsZSBzdWJ0cmFjdGlvbiAqKioqLworCisgICAgZGRpZmYgPSAoMSAtIGRwdCkgLyAoMSAtIGR0KTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIGludCBqOworI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigtOmRkaWZmKTwvb21wdHM6Y2hlY2s+CisJICAgIGZvciAoaiA9IDA7IGogPCBET1VCTEVfRElHSVRTOyArK2opCisJICAgIHsKKwkJZGRpZmYgLT0gcG93IChkdCwgaik7CisJICAgIH0KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9CisKKyAgICBpZiAoZmFicyAoZGRpZmYpID4gcm91bmRpbmdfZXJyb3IpIHsKKwlyZXN1bHQrKzsKKwlmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gRGlmZmVyZW5jZSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJUUgaW5zdGVhZCBvZiAwLjBcbiIsIGRkaWZmKTsKKyAgICB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogVGVzdHMgZm9yIGxvZ2ljYWwgdmFsdWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqIFRlc3RpbmcgbG9naWMgYW5kICoqKiovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisgICAgeworCWxvZ2ljc1tpXSA9IDE7CisgICAgfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGo7CisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCYmOmxvZ2ljX2FuZCk8L29tcHRzOmNoZWNrPgorCSAgICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyArK2opCisJICAgIHsKKwkJbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3Nbal0pOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYoIWxvZ2ljX2FuZCkgeworCXJlc3VsdCsrOworCWZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAxXG4iKTsKKyAgICB9CisKKyAgICBsb2dpY19hbmQgPSAxOworICAgIGxvZ2ljc1tMT09QQ09VTlQgLyAyXSA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgajsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJiY6bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCSAgICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyArK2opCisJICAgIHsKKwkJbG9naWNfYW5kID0gbG9naWNfYW5kICYmIGxvZ2ljc1tqXTsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmKGxvZ2ljX2FuZCkgeworCXJlc3VsdCsrOworCWZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAyXG4iKTsKKyAgICB9CisKKworLyoqKiogVGVzdGluZyBsb2dpYyBvciAqKioqLworCisgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKQorICAgIHsKKwlsb2dpY3NbaV0gPSAwOworICAgIH0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIGludCBqOworI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8fDpsb2dpY19vcikgIDwvb21wdHM6Y2hlY2s+CisJICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikKKwkgICAgeworCQlsb2dpY19vciA9IGxvZ2ljX29yIHx8IGxvZ2ljc1tqXTsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmIChsb2dpY19vcikgeworCXJlc3VsdCsrOworCWZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDFcbiIpOworICAgIH0KKworICAgIGxvZ2ljX29yID0gMDsKKyAgICBsb2dpY3NbTE9PUENPVU5UIC8gMl0gPSAxOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGo7CisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHx8OmxvZ2ljX29yKTwvb21wdHM6Y2hlY2s+CisJICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikKKwkgICAgeworCQlsb2dpY19vciA9IGxvZ2ljX29yIHx8IGxvZ2ljc1tqXTsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmKCFsb2dpY19vcikgeworCXJlc3VsdCsrOworCWZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDJcbiIpOworICAgIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBUZXN0cyBmb3IgYml0IHZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKiogVGVzdGluZyBiaXQgYW5kICoqKiovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyArK2kpCisgICAgeworCWxvZ2ljc1tpXSA9IDE7CisgICAgfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGo7CisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCY6Yml0X2FuZCkgIDwvb21wdHM6Y2hlY2s+CisJICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikKKwkgICAgeworCQliaXRfYW5kID0gKGJpdF9hbmQgJiBsb2dpY3Nbal0pOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKCFiaXRfYW5kKSB7CisJcmVzdWx0Kys7CisJZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIEJJVCBBTkQgcGFydCAxXG4iKTsKKyAgICB9CisKKyAgICBiaXRfYW5kID0gMTsKKyAgICBsb2dpY3NbTE9PUENPVU5UIC8gMl0gPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGo7CisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCY6Yml0X2FuZCk8L29tcHRzOmNoZWNrPgorCSAgICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyArK2opCisJICAgIHsKKwkJYml0X2FuZCA9IGJpdF9hbmQgJiBsb2dpY3Nbal07CisJICAgIH0KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9CisgICAgaWYgKGJpdF9hbmQpIHsKKwlyZXN1bHQrKzsKKwlmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDJcbiIpOworICAgIH0KKworCisvKioqKiBUZXN0aW5nIGJpdCBvciAqKioqLworCisgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKQorICAgIHsKKwlsb2dpY3NbaV0gPSAwOworICAgIH0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIGludCBqOworI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8OmJpdF9vcik8L29tcHRzOmNoZWNrPgorCSAgICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyArK2opCisJICAgIHsKKwkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2pdOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKGJpdF9vcikgeworCXJlc3VsdCsrOworCWZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBCSVQgT1IgcGFydCAxXG4iKTsKKyAgICB9CisKKyAgICBiaXRfb3IgPSAwOworICAgIGxvZ2ljc1tMT09QQ09VTlQgLyAyXSA9IDE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgajsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofDpiaXRfb3IpPC9vbXB0czpjaGVjaz4KKwkgICAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgKytqKQorCSAgICB7CisJCWJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tqXTsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKyAgICBpZiAoIWJpdF9vcikgeworCXJlc3VsdCsrOworCWZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBCSVQgT1IgcGFydCAyXG4iKTsKKyAgICB9CisKKworLyoqKiogVGVzdGluZyBleGNsdXNpdmUgYml0IG9yICoqKiovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisgICAgeworCWxvZ2ljc1tpXSA9IDA7CisgICAgfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGo7CisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKF46ZXhjbHVzaXZfYml0X29yKTwvb21wdHM6Y2hlY2s+CisJICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikKKwkgICAgeworCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3Nbal07CisJICAgIH0KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9CisgICAgaWYgKGV4Y2x1c2l2X2JpdF9vcikgeworCXJlc3VsdCsrOworCWZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAxXG4iKTsKKyAgICB9CisKKyAgICBleGNsdXNpdl9iaXRfb3IgPSAwOworICAgIGxvZ2ljc1tMT09QQ09VTlQgLyAyXSA9IDE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgajsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpPC9vbXB0czpjaGVjaz4KKwkgICAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgKytqKQorCSAgICB7CisJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tqXTsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKyAgICBpZiAoIWV4Y2x1c2l2X2JpdF9vcikgeworCXJlc3VsdCsrOworCWZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAyXG4iKTsKKyAgICB9CisKKyAgICAvKmZwcmludGYgKCJcblJlc3VsdDolZFxuIiwgcmVzdWx0KTsqLworICAgIHJldHVybiAocmVzdWx0ID09IDApOworCisgICAgZnJlZSAobG9naWNzKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX2F1dG8uYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfc2NoZWR1bGVfYXV0by5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MWExYzQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX2F1dG8uYwpAQCAtMCwwICsxLDU1IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aXRoIG9tcCBmb3Igc2NoZWR1bGUgYXV0bzwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZm9yIGF1dG88L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWwsb21wIHBhcmFsbGVsIGZpcnN0cHJpdmF0ZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCBzdW0xOworI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShzdW0xKQorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfZm9yX2F1dG88L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgIGludCBzdW07CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBzdW0wOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICBpbnQga25vd25fc3VtOworICAgIGludCB0aHJlYWRzbnVtOworCisgICAgc3VtID0gMDsKKyAgICBzdW0wID0gMTIzNDU7CisgICAgc3VtMSA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocmVhZHNudW09b21wX2dldF9udW1fdGhyZWFkcygpOworICAgICAgICB9CisJLyogc3VtMCA9IDA7ICovCisJPG9tcHRzOm9ycGhhbj4KKwlpbnQgaTsKKyNwcmFnbWEgb21wIGZvciA8b21wdHM6Y2hlY2s+Zmlyc3Rwcml2YXRlKHN1bTApIHNjaGVkdWxlKGF1dG8pPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz5wcml2YXRlKHN1bTApPC9vbXB0czpjcm9zc2NoZWNrPgorCWZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspCisJeworCSAgICBzdW0wID0gc3VtMCArIGk7CisJICAgIHN1bTEgPSBzdW0wOworCX0JLyogZW5kIG9mIGZvciAqLworCTwvb21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisJICAgIHN1bSA9IHN1bSArIHN1bTE7CisJfQkvKiBlbmQgb2YgY3JpdGljYWwgKi8KKyAgICB9CS8qIGVuZCBvZiBwYXJhbGxlbCAqLyAgICAKKworICAgIGtub3duX3N1bSA9IDEyMzQ1KiB0aHJlYWRzbnVtKyAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgICAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX2R5bmFtaWMuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfc2NoZWR1bGVfZHluYW1pYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyY2RhNTYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX2R5bmFtaWMuYwpAQCAtMCwwICsxLDExMSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBkeW5hbWljIG9wdGlvbiBvZiB0aGUgb21wIGZvciBzY2hlZHVsZSBkaXJlY3RpdmU8L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGZvciBzY2hlZHVsZShkeW5hbWljKTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBmbHVzaCxvbXAgZm9yIG5vd2FpdCxvbXAgY3JpdGljYWwsb21wIHNpbmdsZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisKKy8qCisqIFRlc3QgZm9yIGR5bmFtaWMgc2NoZWR1bGluZyB3aXRoIGNodW5rIHNpemUKKyogTWV0aG9kOiBjYWN1bGF0ZSBob3cgbWFueSB0aW1lcyB0aGUgaXRlcmF0aW9uIHNwYWNlIGlzIGRpc3BhdGNoZWQKKyogICAgICAgICBhbmQganVkZ2UgaWYgZWFjaCBkaXNwYXRjaCBoYXMgdGhlIHJlcXVlc3RlZCBjaHVuayBzaXplCisqICAgICAgICAgdW5sZXNzIGl0IGlzIHRoZSBsYXN0IG9uZS4KKyogSXQgaXMgcG9zc2libGUgZm9yIHR3byBhZGphY2VudCBjaHVua3MgYXJlIGFzc2lnbmVkIHRvIHRoZSBzYW1lIHRocmVhZAorKiBNb2RpZnlpZWQgYnkgQ2h1bmh1YSBMaWFvCisqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b21wLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKKyNkZWZpbmUgQ0ZETUFYX1NJWkUgMTAwCitjb25zdCBpbnQgY2h1bmtfc2l6ZSA9IDc7CisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9mb3Jfc2NoZWR1bGVfZHluYW1pYzwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgIGludCB0aWQ7Cis8b21wdHM6b3JwaGFuOnZhcnM+ICAKKyAgaW50ICp0aWRzOworICBpbnQgaTsKKzwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgaW50IHRpZHNBcnJheVtDRkRNQVhfU0laRV07CisgIGludCBjb3VudCA9IDA7CisgIGludCB0bXBfY291bnQgPSAwOyAvKmRpc3BhdGNoIHRpbWVzKi8KKyAgaW50ICp0bXA7ICAvKnN0b3JlIGNodW5rIHNpemUgZm9yIGVhY2ggZGlzcGF0Y2gqLworICBpbnQgcmVzdWx0ID0gMDsKKyAgCisgIHRpZHMgPSB0aWRzQXJyYXk7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHByaXZhdGUodGlkKSBzaGFyZWQodGlkcykKKyAgewkJCQkvKiBiZWdpbiBvZiBwYXJhbGxlbCAqLworICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgaW50IHRpZDsKKworICAgIHRpZCA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKyNwcmFnbWEgb21wIGZvciA8b21wdHM6Y2hlY2s+c2NoZWR1bGUoZHluYW1pYyxjaHVua19zaXplKTwvb21wdHM6Y2hlY2s+CisgICAgZm9yIChpID0gMDsgaSA8IENGRE1BWF9TSVpFOyBpKyspCisgICAgICB7CisJdGlkc1tpXSA9IHRpZDsKKyAgICAgIH0KKyAgICAgPC9vbXB0czpvcnBoYW4+CisgIH0JCQkJLyogZW5kIG9mIHBhcmFsbGVsICovCisKKyAgZm9yIChpID0gMDsgaSA8IENGRE1BWF9TSVpFIC0gMTsgKytpKQorICAgIHsKKyAgICAgIGlmICh0aWRzW2ldICE9IHRpZHNbaSArIDFdKQorCXsKKwkgIGNvdW50Kys7CisJfQorICAgIH0KKworICB0bXAgPSAoaW50ICopIG1hbGxvYyAoc2l6ZW9mIChpbnQpICogKGNvdW50ICsgMSkpOworICB0bXBbMF0gPSAxOworCisgIGZvciAoaSA9IDA7IGkgPCBDRkRNQVhfU0laRSAtIDE7ICsraSkKKyAgICB7CisgICAgICBpZiAodG1wX2NvdW50ID4gY291bnQpCisJeworCSAgcHJpbnRmICgiLS0tLS0tLS0tLS0tLS0tLS0tLS1cblRlc3RpbnRlcm5hbCBFcnJvcjogTGlzdCB0b28gc21hbGwhISFcbi0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsJLyogRXJyb3IgaGFuZGxpbmcgKi8KKwkgIGJyZWFrOworCX0KKyAgICAgIGlmICh0aWRzW2ldICE9IHRpZHNbaSArIDFdKQorCXsKKwkgIHRtcF9jb3VudCsrOworCSAgdG1wW3RtcF9jb3VudF0gPSAxOworCX0KKyAgICAgIGVsc2UKKwl7CisJICB0bXBbdG1wX2NvdW50XSsrOworCX0KKyAgICB9CisvKgorcHJpbnRmKCJkZWJ1Zy0tLS1cbiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBDRkRNQVhfU0laRTsgKytpKQorCXByaW50ZigiJWQgIix0aWRzW2ldKTsKK3ByaW50ZigiZGVidWctLS0tXG4iKTsKKyovCisvKiBpcyBkeW5hbWljIHN0YXRlbWVudCB3b3JraW5nPyAqLworICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICB7CisgICAgICBpZiAoKHRtcFtpXSVjaHVua19zaXplKSE9MCkgCisvKml0IGlzIHBvc3NpYmxlIGZvciAyIGFkamFjZW50IGNodW5rcyBhc3NpZ25lZCB0byBhIHNhbWUgdGhyZWFkKi8KKwl7CisgICAgICAgICByZXN1bHQrKzsKKyAgZnByaW50Zihsb2dGaWxlLCJUaGUgaW50ZXJtZWRpYXRlIGRpc3BhdGNoIGhhcyB3cm9uZyBjaHVua3NpemUuXG4iKTsKKwkgIC8qcmVzdWx0ICs9ICgodG1wW2ldIC8gY2h1bmtfc2l6ZSkgLSAxKTsqLworCX0KKyAgICB9CisgIGlmICgodG1wW2NvdW50XSVjaHVua19zaXplKSE9KENGRE1BWF9TSVpFJWNodW5rX3NpemUpKQorICAgeyAKKyAgIHJlc3VsdCsrOworICBmcHJpbnRmKGxvZ0ZpbGUsInRoZSBsYXN0IGRpc3BhdGNoIGhhcyB3cm9uZyBjaHVua3NpemUuXG4iKTsKKyAgIH0KKyAgLyogZm9yIChpbnQgaT0wO2k8Y291bnQrMTsrK2kpIHByaW50ZigiJWRcdDo9XHQlZFxuIixpKzEsdG1wW2ldKTsgKi8KKyAgcmV0dXJuIChyZXN1bHQ9PTApOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfc2NoZWR1bGVfZ3VpZGVkLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX2d1aWRlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNTY0YTUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX2d1aWRlZC5jCkBAIC0wLDAgKzEsMjI1IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIGd1aWRlZCBvcHRpb24gb2YgdGhlIG9tcCBmb3Igc2NoZWR1bGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZm9yIHNjaGVkdWxlKGd1aWRlZCk8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgZmx1c2gsb21wIGZvciBub3dhaXQsb21wIGNyaXRpY2FsLG9tcCBzaW5nbGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorLyogVGVzdCBmb3IgZ3VpZGVkIHNjaGVkdWxpbmcKKyAqIEVuc3VyZSB0aHJlYWRzIGdldCBjaHVua3MgaW50ZXJsZWF2ZWx5IGZpcnN0CisgKiBUaGVuIGp1ZGdlIHRoZSBjaHVuayBzaXplcyBhcmUgZGVjcmVhc2luZyB0byBhIHN0YWJsZSB2YWx1ZQorICogTW9kaWZpZWQgYnkgQ2h1bmh1YSBMaWFvCisgKiBGb3IgZXhhbXBsZSwgMTAwIGl0ZXJhdGlvbiBvbiAyIHRocmVhZHMsIGNodW5rc2l6ZSA3CisgKiBvbmUgbGluZSBmb3IgZWFjaCBkaXNwYXRjaCwgMC8xIG1lYW5zIHRocmVhZCBpZAorICogMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgIDI0CisgKiAxIDEgMSAxIDEgMSAxIDEgMSAxIDEgMSAxIDEgMSAxIDEgMSAgICAgICAgICAgICAgMTgKKyAqIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAgICAgICAgICAgICAgICAgICAgICAxNAorICogMSAxIDEgMSAxIDEgMSAxIDEgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwCisgKiAwIDAgMCAwIDAgMCAwIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgKKyAqIDEgMSAxIDEgMSAxIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNworICogMCAwIDAgMCAwIDAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3CisgKiAxIDEgMSAxIDEgMSAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcKKyAqIDAgMCAwIDAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNQorKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCisjZGVmaW5lIE5VTUJFUl9PRl9USFJFQURTIDEwCisjZGVmaW5lIENGU01BWF9TSVpFIDEwMDAKKyNkZWZpbmUgTUFYX1RJTUUgIDAuMDA1CisKKyNpZmRlZiBTTEVFUFRJTUUKKyN1bmRlZiBTTEVFUFRJTUUKKyNkZWZpbmUgU0xFRVBUSU1FIDAuMDAwMQorI2VuZGlmCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9mb3Jfc2NoZWR1bGVfZ3VpZGVkPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50ICogdGlkczsKKwlpbnQgKiBjaHVua3NpemVzOworCWludCBub3RvdXQ7CisJaW50IG1heGl0ZXI7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgIGludCB0aHJlYWRzOworICAgIGludCBpOworICAgIGludCByZXN1bHQ7CisKKyAgICB0aWRzID0gKGludCAqKSBtYWxsb2MgKHNpemVvZiAoaW50KSAqIChDRlNNQVhfU0laRSArIDEpKTsKKwltYXhpdGVyID0gMDsKKyAgICByZXN1bHQgPSAxOworICAgIG5vdG91dCA9IDE7CisKKy8qIFRlc3RpbmcgaWYgZW5vdWdodCB0aHJlYWRzIGFyZSBhdmFpbGFibGUgZm9yIHRoaXMgY2hlY2suICovCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorCXsKKyNwcmFnbWEgb21wIHNpbmdsZQorCSAgeworCQl0aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcyAoKTsKKwkgIH0gLyogZW5kIG9mIHNpbmdsZSAqLworCX0gLyogZW5kIG9mIHBhcmFsbGVsICovCisKKwlpZiAodGhyZWFkcyA8IDIpIHsKKwkgIHByaW50ZiAoIlRoaXMgdGVzdCBvbmx5IHdvcmtzIHdpdGggYXQgbGVhc3QgdHdvIHRocmVhZHMgLlxuIik7CisJICBmcHJpbnRmIChsb2dGaWxlLCAiVGhpcyB0ZXN0IG9ubHkgd29ya3Mgd2l0aCBhdCBsZWFzdCB0d28gdGhyZWFkcy4gQXZhaWxhYmxlIHdlcmUgb25seSAlZCB0aHJlYWQocykuXG4iLCB0aHJlYWRzKTsKKwkgIHJldHVybiAoMCk7CisJfSAvKiBlbmQgaWYgKi8KKworCisgICAgLyogTm93IHRoZSByZWFsIHBhcmFsbGVsIHdvcms6ICAKKyAgICAgKgorCSAqIEVhY2ggdGhyZWFkIHdpbGwgc3RhcnQgaW1tZWRpYXRlbHkgd2l0aCB0aGUgZmlyc3QgY2h1bmsuCisgICAgICovCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQodGlkcyxtYXhpdGVyKQorICAgIHsJLyogYmVnaW4gb2YgcGFyYWxsZWwgKi8KKyAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICBkb3VibGUgY291bnQ7CisgICAgICBpbnQgdGlkOworICAgICAgaW50IGo7CisKKyAgICAgIHRpZCA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKworI3ByYWdtYSBvbXAgZm9yIG5vd2FpdCA8b21wdHM6Y2hlY2s+c2NoZWR1bGUoZ3VpZGVkKTwvb21wdHM6Y2hlY2s+CisgICAgICBmb3IoaiA9IDA7IGogPCBDRlNNQVhfU0laRTsgKytqKQorICAgICAgeworCWNvdW50ID0gMC47CisjcHJhZ21hIG9tcCBmbHVzaChtYXhpdGVyKQorCWlmIChqID4gbWF4aXRlcikKKwl7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCSAgeworCSAgICBtYXhpdGVyID0gajsKKwkgIH0JLyogZW5kIG9mIGNyaXRpY2FsICovIAorCX0KKwkvKnByaW50ZiAoInRocmVhZCAlZCBzbGVlcGluZ1xuIiwgdGlkKTsqLworI3ByYWdtYSBvbXAgZmx1c2gobWF4aXRlcixub3RvdXQpCQorCXdoaWxlIChub3RvdXQgJiYgKGNvdW50IDwgTUFYX1RJTUUpICYmIChtYXhpdGVyID09IGopKQorCXsKKyNwcmFnbWEgb21wIGZsdXNoKG1heGl0ZXIsbm90b3V0KQorCSAgbXlfc2xlZXAgKFNMRUVQVElNRSk7CisJICBjb3VudCArPSBTTEVFUFRJTUU7CisjaWZkZWYgVkVSQk9TRQorCSAgcHJpbnRmKCIuIik7CisjZW5kaWYKKwl9CisjaWZkZWYgVkVSQk9TRQorCWlmIChjb3VudCA+IDAuKSBwcmludGYoIiB3YWl0ZWQgJWxmIHNcbiIsIGNvdW50KTsKKyNlbmRpZgorCS8qcHJpbnRmICgidGhyZWFkICVkIGF3YWtlXG4iLCB0aWQpOyovCisJdGlkc1tqXSA9IHRpZDsKKyNpZmRlZiBWRVJCT1NFCisJcHJpbnRmKCIlZCBmaW5pc2hlZCBieSAlZFxuIixqLHRpZCk7CisjZW5kaWYKKyAgICAgIH0JLyogZW5kIG9mIGZvciAqLworCisgICAgICBub3RvdXQgPSAwOworI3ByYWdtYSBvbXAgZmx1c2gobWF4aXRlcixub3RvdXQpCisgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9CS8qIGVuZCBvZiBwYXJhbGxlbCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXZhbHVhdGlvbiBvZiB0aGUgdmFsdWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCXsKKwkgIGludCBkZXRlcm1pbmVkX2NodW5rc2l6ZSA9IDE7CisJICBpbnQgbGFzdF90aHJlYWRuciA9IHRpZHNbMF07CisJICBpbnQgZ2xvYmFsX2NodW5rbnIgPSAwOworCSAgaW50IGxvY2FsX2NodW5rbnJbTlVNQkVSX09GX1RIUkVBRFNdOworCSAgaW50IG9wZW53b3JrID0gQ0ZTTUFYX1NJWkU7CisJICBpbnQgZXhwZWN0ZWRfY2h1bmtfc2l6ZTsKKwkgIGRvdWJsZSBjID0gMTsKKworCSAgZm9yIChpID0gMDsgaSA8IE5VTUJFUl9PRl9USFJFQURTOyBpKyspCisJCWxvY2FsX2NodW5rbnJbaV0gPSAwOworCisJICB0aWRzW0NGU01BWF9TSVpFXSA9IC0xOworCisgICAgICAvKgorCSAgICogZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgZ2xvYmFsIGNodW5rcworCSAgICovCisJICAvKmZwcmludGYobG9nRmlsZSwiIyBnbG9iYWxfY2h1bmtuciB0aHJlYWQgbG9jYWxfY2h1bmtuciBjaHVua3NpemVcbiIpOyAqLworCSAgZm9yKGkgPSAxOyBpIDw9IENGU01BWF9TSVpFOyArK2kpCisJICB7CisJCWlmIChsYXN0X3RocmVhZG5yPT10aWRzW2ldKSB7IAorCQkgIGRldGVybWluZWRfY2h1bmtzaXplKys7IAorCQl9CisJCWVsc2UKKwkJeworCQkgIC8qIGZwcmludGYgKGxvZ0ZpbGUsICIlZFx0JWRcdCVkXHQlZFxuIiwgZ2xvYmFsX2NodW5rbnIsbGFzdF90aHJlYWRuciwgbG9jYWxfY2h1bmtucltsYXN0X3RocmVhZG5yXSwgbSk7ICovCisJCSAgZ2xvYmFsX2NodW5rbnIrKzsKKwkJICBsb2NhbF9jaHVua25yW2xhc3RfdGhyZWFkbnJdKys7CisJCSAgbGFzdF90aHJlYWRuciA9IHRpZHNbaV07CisJCSAgZGV0ZXJtaW5lZF9jaHVua3NpemUgPSAxOworCQl9CisJICB9CisJICAvKiBub3cgYWxsb2NhdGUgdGhlIG1lbW9yeSBmb3Igc2F2aW5nIHRoZSBzaXplcyBvZiB0aGUgZ2xvYmFsIGNodW5rcyAqLworCSAgY2h1bmtzaXplcyA9IChpbnQqKW1hbGxvYyhnbG9iYWxfY2h1bmtuciAqIHNpemVvZihpbnQpKTsKKworICAgICAgLyoKKwkgICAqIEV2YWx1YXRlIHRoZSBzaXplcyBvZiB0aGUgZ2xvYmFsIGNodW5rcworCSAgICovCisJICBnbG9iYWxfY2h1bmtuciA9IDA7CisJICBkZXRlcm1pbmVkX2NodW5rc2l6ZSA9IDE7CisJICBsYXN0X3RocmVhZG5yID0gdGlkc1swXTsJICAgIAorCSAgZm9yIChpID0gMTsgaSA8PSBDRlNNQVhfU0laRTsgKytpKQorCSAgeworCQkvKiBJZiB0aGUgdGhyZWFkbnVtYmVyIHdhcyB0aGUgc2FtZSBhcyBiZWZvcmUgaW5jcmVhc2UgdGhlIGRldGVjdGVkIGNodW5rc2l6ZSBmb3IgdGhpcyBjaHVuaworCQkgKiBvdGhlcndpc2Ugc2V0IHRoZSBkZXRlY3RlZCBjaHVua3NpemUgYWdhaW4gdG8gb25lIGFuZCBzYXZlIHRoZSBudW1iZXIgb2YgdGhlIG5leHQgdGhyZWFkIGluIGxhc3RfdGhyZWFkbnIuIAorCQkgKi8KKwkJaWYgKGxhc3RfdGhyZWFkbnIgPT0gdGlkc1tpXSkgeyAKKwkJICBkZXRlcm1pbmVkX2NodW5rc2l6ZSsrOyAKKwkJfQorCQllbHNlIHsKKwkJICBjaHVua3NpemVzW2dsb2JhbF9jaHVua25yXSA9IGRldGVybWluZWRfY2h1bmtzaXplOworCQkgIGdsb2JhbF9jaHVua25yKys7CisJCSAgbG9jYWxfY2h1bmtucltsYXN0X3RocmVhZG5yXSsrOworCQkgIGxhc3RfdGhyZWFkbnIgPSB0aWRzW2ldOworCQkgIGRldGVybWluZWRfY2h1bmtzaXplID0gMTsKKwkJfQorCSAgfQorCisjaWZkZWYgVkVSQk9TRQorCSAgZnByaW50ZiAobG9nRmlsZSwgImZvdW5kXHRleHBlY3RlZFx0Y29uc3RhbnRcbiIpOworI2VuZGlmCisKKwkgIC8qIGlkZW50aWZ5IHRoZSBjb25zdGFudCBjIGZvciB0aGUgZXhwb25lbnRpYWwgZGVjcmVhc2Ugb2YgdGhlIGNodW5rc2l6ZSAqLworCSAgZXhwZWN0ZWRfY2h1bmtfc2l6ZSA9IG9wZW53b3JrIC8gdGhyZWFkczsKKwkgIGMgPSAoZG91YmxlKSBjaHVua3NpemVzWzBdIC8gZXhwZWN0ZWRfY2h1bmtfc2l6ZTsKKwkgIAorCSAgZm9yIChpID0gMDsgaSA8IGdsb2JhbF9jaHVua25yOyBpKyspCisJICB7CisJCS8qIGNhbGN1bGF0ZSB0aGUgbmV3IGV4cGVjdGVkIGNodW5rc2l6ZSAqLworCQlpZiAoZXhwZWN0ZWRfY2h1bmtfc2l6ZSA+IDEpIAorCQkgIGV4cGVjdGVkX2NodW5rX3NpemUgPSBjICogb3BlbndvcmsgLyB0aHJlYWRzOworCQkKKyNpZmRlZiBWRVJCT1NFCisJCWZwcmludGYgKGxvZ0ZpbGUsICIlOGRcdCU4ZFx0JWxmXG4iLCBjaHVua3NpemVzW2ldLCBleHBlY3RlZF9jaHVua19zaXplLCBjICogY2h1bmtzaXplc1tpXS9leHBlY3RlZF9jaHVua19zaXplKTsKKyNlbmRpZgorCQkKKwkJLyogY2hlY2sgaWYgY2h1bmtzaXplIGlzIGluc2lkZSB0aGUgcm91bmRpbmcgZXJyb3JzICovCisJCWlmIChhYnMgKGNodW5rc2l6ZXNbaV0gLSBleHBlY3RlZF9jaHVua19zaXplKSA+PSAyKSB7CisJCSAgcmVzdWx0ID0gMDsKKyNpZm5kZWYgVkVSQk9TRQorCQkgIGZwcmludGYgKGxvZ0ZpbGUsICJDaHVua3NpemUgZGlmZmVyZWQgZnJvbSBleHBlY3RlZCB2YWx1ZTogJWQgaW5zdGVhZCBvZiAlZFxuIiwgY2h1bmtzaXplc1tpXSwgZXhwZWN0ZWRfY2h1bmtfc2l6ZSk7CisJCSAgcmV0dXJuIDA7CisjZW5kaWYKKwkJfSAvKiBlbmQgaWYgKi8KKworI2lmbmRlZiBWRVJCT1NFCisJCWlmIChleHBlY3RlZF9jaHVua19zaXplIC0gY2h1bmtzaXplc1tpXSA8IDAgKQorCQkgIGZwcmludGYgKGxvZ0ZpbGUsICJDaHVua3NpemUgZGlkIG5vdCBkZWNyZWFzZTogJWQgaW5zdGVhZCBvZiAlZFxuIiwgY2h1bmtzaXplc1tpXSxleHBlY3RlZF9jaHVua19zaXplKTsKKyNlbmRpZgorCisJCS8qIGNhbGN1bGF0aW5nIHRoZSByZW1haW5pbmcgYW1vdW50IG9mIHdvcmsgKi8KKwkJb3BlbndvcmsgLT0gY2h1bmtzaXplc1tpXTsKKwkgIH0JCisJfQorICAgIHJldHVybiByZXN1bHQ7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgorCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpYy5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9zY2hlZHVsZV9zdGF0aWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzFkN2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9zY2hlZHVsZV9zdGF0aWMuYwpAQCAtMCwwICsxLDE2NSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBzdGF0aWMgb3B0aW9uIG9mIHRoZSBvbXAgZm9yIHNjaGVkdWxlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGZvciBzY2hlZHVsZShzdGF0aWMpPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGZvciBub3dhaXQsb21wIGZsdXNoLG9tcCBjcml0aWNhbCxvbXAgc2luZ2xlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCisjZGVmaW5lIE5VTUJFUl9PRl9USFJFQURTIDEwCisjZGVmaW5lIENGU01BWF9TSVpFIDEwMDAKKyNkZWZpbmUgTUFYX1RJTUUgMC4wMQorCisjaWZkZWYgU0xFRVBUSU1FCisjdW5kZWYgU0xFRVBUSU1FCisjZGVmaW5lIFNMRUVQVElNRSAwLjAwMDUKKyNlbmRpZgorCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9mb3Jfc2NoZWR1bGVfc3RhdGljPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgaW50IHRocmVhZHM7CisgIGludCBpLGxhc3R0aWQ7CisgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgaW50ICogdGlkczsKKyAgaW50IG5vdG91dDsKKyAgaW50IG1heGl0ZXI7CisgIGludCBjaHVua19zaXplOworICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICBpbnQgY291bnRlciA9IDA7CisgIGludCB0bXBfY291bnQ9MTsKKyAgaW50IGxhc3R0aHJlYWRzc3RhcnR0aWQgPSAtMTsKKyAgaW50IHJlc3VsdCA9IDE7CisgIGNodW5rX3NpemUgPSA3OworCisgIHRpZHMgPSAoaW50ICopIG1hbGxvYyAoc2l6ZW9mIChpbnQpICogKENGU01BWF9TSVpFICsgMSkpOworICBub3RvdXQgPSAxOworICBtYXhpdGVyID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKHRpZHMsY291bnRlcikKKyAgewkvKiBiZWdpbiBvZiBwYXJhbGxlbCovCisjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICB7CisgICAgICB0aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcyAoKTsKKyAgICB9CS8qIGVuZCBvZiBzaW5nbGUgKi8KKyAgfQkvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworICBpZiAodGhyZWFkcyA8IDIpCisgIHsKKyAgICBwcmludGYgKCJUaGlzIHRlc3Qgb25seSB3b3JrcyB3aXRoIGF0IGxlYXN0IHR3byB0aHJlYWRzIik7CisgICAgZnByaW50ZiAobG9nRmlsZSwiVGhpcyB0ZXN0IG9ubHkgd29ya3Mgd2l0aCBhdCBsZWFzdCB0d28gdGhyZWFkcyIpOworICAgIHJldHVybiAwOworICB9CisgIGVsc2UgCisgIHsKKyAgICBmcHJpbnRmIChsb2dGaWxlLCJVc2luZyBhbiBpbnRlcm5hbCBjb3VudCBvZiAlZFxuVXNpbmcgYSBzcGVjaWZpZWQgY2h1bmtzaXplIG9mICVkXG4iLCBDRlNNQVhfU0laRSwgY2h1bmtfc2l6ZSk7CisgICAgdGlkc1tDRlNNQVhfU0laRV0gPSAtMTsJLyogc2V0dGluZyBlbmRmbGFnICovCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQodGlkcykKKyAgICB7CS8qIGJlZ2luIG9mIHBhcmFsbGVsICovCisgICAgICA8b21wdHM6b3JwaGFuPgorCWRvdWJsZSBjb3VudDsKKyAgICAgIGludCB0aWQ7CisgICAgICBpbnQgajsKKworICAgICAgdGlkID0gb21wX2dldF90aHJlYWRfbnVtICgpOworCisjcHJhZ21hIG9tcCBmb3Igbm93YWl0IDxvbXB0czpjaGVjaz5zY2hlZHVsZShzdGF0aWMsY2h1bmtfc2l6ZSk8L29tcHRzOmNoZWNrPgorICAgICAgZm9yKGogPSAwOyBqIDwgQ0ZTTUFYX1NJWkU7ICsraikKKyAgICAgIHsKKwljb3VudCA9IDAuOworI3ByYWdtYSBvbXAgZmx1c2gobWF4aXRlcikKKwlpZiAoaiA+IG1heGl0ZXIpCisJeworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkgIHsKKwkgICAgbWF4aXRlciA9IGo7CisJICB9CS8qIGVuZCBvZiBjcml0aWNhbCAqLyAKKwl9CisJLypwcmludGYgKCJ0aHJlYWQgJWQgc2xlZXBpbmdcbiIsIHRpZCk7Ki8KKwl3aGlsZSAobm90b3V0ICYmIChjb3VudCA8IE1BWF9USU1FKSAmJiAobWF4aXRlciA9PSBqKSkKKwl7CisjcHJhZ21hIG9tcCBmbHVzaChtYXhpdGVyLG5vdG91dCkKKwkgIG15X3NsZWVwIChTTEVFUFRJTUUpOworCSAgY291bnQgKz0gU0xFRVBUSU1FOworCSAgcHJpbnRmKCIuIik7CisJfQorI2lmZGVmIFZFUkJPU0UKKwlpZiAoY291bnQgPiAwLikgcHJpbnRmKCIgd2FpdGVkICVsZiBzXG4iLCBjb3VudCk7CisjZW5kaWYKKwkvKnByaW50ZiAoInRocmVhZCAlZCBhd2FrZVxuIiwgdGlkKTsqLworCXRpZHNbal0gPSB0aWQ7CisjaWZkZWYgVkVSQk9TRQorCXByaW50ZigiJWQgZmluaXNoZWQgYnkgJWRcbiIsaix0aWQpOworI2VuZGlmCisgICAgICB9CS8qIGVuZCBvZiBmb3IgKi8KKworICAgICAgbm90b3V0ID0gMDsKKyNwcmFnbWEgb21wIGZsdXNoKG1heGl0ZXIsbm90b3V0KQorICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQkvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworICAgIC8qKioqIGFuYWx5c2luZyB0aGUgZGF0YSBpbiBhcnJheSB0aWRzICoqKiovCisKKyAgICBsYXN0dGlkID0gdGlkc1swXTsKKyAgICB0bXBfY291bnQgPSAwOyAKKworICAgIGZvciAoaSA9IDA7IGkgPCBDRlNNQVhfU0laRSArIDE7ICsraSkKKyAgICB7CisgICAgICAvKiBJZiB0aGUgd29yayAgd2FzIGRvbmUgYnkgdGhlIHNhbWUgdGhyZWFkIGluY3JlYXNlIHRtcF9jb3VudCBieSBvbmUuICovCisgICAgICBpZiAodGlkc1tpXSA9PSBsYXN0dGlkKSB7CisJdG1wX2NvdW50Kys7CisjaWZkZWYgVkVSQk9TRQorCWZwcmludGYgKGxvZ0ZpbGUsICIlZDogJWQgXG4iLCBpLCB0aWRzW2ldKTsKKyNlbmRpZgorCWNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvKiBDaGVjayBpZiB0aGUgbmV4dCB0aHJlYWQgaGFkIGhhcyB0aGUgcmlnaHQgdGhyZWFkIG51bWJlci4gV2hlbiBmaW5kaW5nIAorICAgICAgICogdGhyZWFkbnVtYmVyIC0xIHRoZSBlbmQgc2hvdWxkIGJlIHJlYWNoZWQuIAorICAgICAgICovCSAgCisgICAgICBpZiAodGlkc1tpXSA9PSAobGFzdHRpZCArIDEpICUgdGhyZWFkcyB8fCB0aWRzW2ldID09IC0xKSB7CisJLyogY2hlY2tpbmcgZm9yIHRoZSByaWdodCBjaHVuayBzaXplICovCisJaWYgKHRtcF9jb3VudCA9PSBjaHVua19zaXplKSB7CisJICB0bXBfY291bnQgPSAxOworCSAgbGFzdHRpZCA9IHRpZHNbaV07CisjaWZkZWYgVkVSQk9TRQorCSAgZnByaW50ZiAobG9nRmlsZSwgIk9LXG4iKTsKKyNlbmRpZgorCX0KKwkvKiBJZiB0aGUgY2h1bmsgc2l6ZSB3YXMgd3JvbmcsIGNoZWNrIGlmIHRoZSBlbmQgd2FzIHJlYWNoZWQgKi8KKwllbHNlIHsKKwkgIGlmICh0aWRzW2ldID09IC0xKSB7CisJICAgIGlmIChpID09IENGU01BWF9TSVpFKSB7CisJICAgICAgZnByaW50ZiAobG9nRmlsZSwgIkxhc3QgdGhyZWFkIGhhZCBjaHVuayBzaXplICVkXG4iLCB0bXBfY291bnQpOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICAgIGVsc2UgeworCSAgICAgIGZwcmludGYgKGxvZ0ZpbGUsICJFUlJPUjogTGFzdCB0aHJlYWQgKHRocmVhZCB3aXRoIG51bWJlciAtMSkgd2FzIGZvdW5kIGJlZm9yZSB0aGUgZW5kLlxuIik7CisJICAgICAgcmVzdWx0ID0gMDsKKwkgICAgfQorCSAgfQorCSAgZWxzZSB7CisJICAgIGZwcmludGYgKGxvZ0ZpbGUsICJFUlJPUjogY2h1bmsgc2l6ZSB3YXMgJWQuIChhc3NpZ25lZCB3YXMgJWQpXG4iLCB0bXBfY291bnQsIGNodW5rX3NpemUpOworCSAgICByZXN1bHQgPSAwOworCSAgfQorCX0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworCWZwcmludGYobG9nRmlsZSwgIkVSUk9SOiBGb3VuZCB0aHJlYWQgd2l0aCBudW1iZXIgJWQgKHNob3VsZCBiZSBpbmJldHdlZW4gMCBhbmQgJWQpLiIsIHRpZHNbaV0sIHRocmVhZHMgLSAxKTsKKwlyZXN1bHQgPSAwOworICAgICAgfQorI2lmZGVmIFZFUkJPU0UKKyAgICAgIGZwcmludGYgKGxvZ0ZpbGUsICIlZDogJWQgXG4iLCBpLCB0aWRzW2ldKTsKKyNlbmRpZgorICAgIH0KKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9zY2hlZHVsZV9zdGF0aWNfMy5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9zY2hlZHVsZV9zdGF0aWNfMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyODY2N2YKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpY18zLmMKQEAgLTAsMCArMSwyMTIgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgc3RhdGljIG9wdGlvbiBvZiB0aGUgb21wIGZvciBzY2hlZHVsZSBkaXJlY3RpdmUgY29uc2lkZXJpbmcgdGhlIHNwZWNpZmljYXRpb25zIGZvciB0aGUgY2h1bmsgZGlzdHJpYnV0aW9uIG9mIHNldmVyYWwgbG9vcCByZWdpb25zIGlzIHRoZSBzYW1lIGFzIHNwZWNpZmllZCBpbiB0aGUgT3BlbiBNUCBzdGFuZGFyZCB2ZXJzaW9uIDMuMC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGZvciBzY2hlZHVsZShzdGF0aWMpPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGZvciBub3dhaXQsb21wIGZsdXNoLG9tcCBjcml0aWNhbCxvbXAgc2luZ2xlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCisjZGVmaW5lIE5VTUJFUl9PRl9USFJFQURTIDEwCisjZGVmaW5lIENGU01BWF9TSVpFIDEwMDAKKyNkZWZpbmUgTUFYX1RJTUUgMC4wMQorCisjaWZkZWYgU0xFRVBUSU1FCisjdW5kZWYgU0xFRVBUSU1FCisjZGVmaW5lIFNMRUVQVElNRSAwLjAwMDUKKyNlbmRpZgorCisjZGVmaW5lIFZFUkJPU0UgMAorCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9mb3Jfc2NoZWR1bGVfc3RhdGljXzM8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICBpbnQgdGhyZWFkczsKKyAgaW50IGksbGFzdHRpZDsKKyAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICBpbnQgKiB0aWRzOworICBpbnQgKiB0aWRzMjsKKyAgaW50IG5vdG91dDsKKyAgaW50IG1heGl0ZXI7CisgIGludCBjaHVua19zaXplOworICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICBpbnQgY291bnRlciA9IDA7CisgIGludCB0bXBfY291bnQ9MTsKKyAgaW50IGxhc3R0aHJlYWRzc3RhcnR0aWQgPSAtMTsKKyAgaW50IHJlc3VsdCA9IDE7CisgIGNodW5rX3NpemUgPSA3OworCisgIHRpZHMgPSAoaW50ICopIG1hbGxvYyAoc2l6ZW9mIChpbnQpICogKENGU01BWF9TSVpFICsgMSkpOworICBub3RvdXQgPSAxOworICBtYXhpdGVyID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKHRpZHMsY291bnRlcikKKyAgewkvKiBiZWdpbiBvZiBwYXJhbGxlbCovCisjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICB7CisgICAgICB0aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcyAoKTsKKyAgICB9CS8qIGVuZCBvZiBzaW5nbGUgKi8KKyAgfQkvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworICBpZiAodGhyZWFkcyA8IDIpCisgIHsKKyAgICBwcmludGYgKCJUaGlzIHRlc3Qgb25seSB3b3JrcyB3aXRoIGF0IGxlYXN0IHR3byB0aHJlYWRzIik7CisgICAgZnByaW50ZiAobG9nRmlsZSwiVGhpcyB0ZXN0IG9ubHkgd29ya3Mgd2l0aCBhdCBsZWFzdCB0d28gdGhyZWFkcyIpOworICAgIHJldHVybiAwOworICB9CisgIGVsc2UgCisgIHsKKyAgICBmcHJpbnRmIChsb2dGaWxlLCJVc2luZyBhbiBpbnRlcm5hbCBjb3VudCBvZiAlZFxuVXNpbmcgYSBzcGVjaWZpZWQgY2h1bmtzaXplIG9mICVkXG4iLCBDRlNNQVhfU0laRSwgY2h1bmtfc2l6ZSk7CisgICAgdGlkc1tDRlNNQVhfU0laRV0gPSAtMTsJLyogc2V0dGluZyBlbmRmbGFnICovCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQodGlkcykKKyAgICB7CS8qIGJlZ2luIG9mIHBhcmFsbGVsICovCisgICAgICA8b21wdHM6b3JwaGFuPgorCWRvdWJsZSBjb3VudDsKKyAgICAgIGludCB0aWQ7CisgICAgICBpbnQgajsKKworICAgICAgdGlkID0gb21wX2dldF90aHJlYWRfbnVtICgpOworCisjcHJhZ21hIG9tcCBmb3Igbm93YWl0IDxvbXB0czpjaGVjaz5zY2hlZHVsZShzdGF0aWMsY2h1bmtfc2l6ZSk8L29tcHRzOmNoZWNrPgorICAgICAgZm9yKGogPSAwOyBqIDwgQ0ZTTUFYX1NJWkU7ICsraikKKyAgICAgIHsKKwljb3VudCA9IDAuOworI3ByYWdtYSBvbXAgZmx1c2gobWF4aXRlcikKKwlpZiAoaiA+IG1heGl0ZXIpCisJeworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkgIHsKKwkgICAgbWF4aXRlciA9IGo7CisJICB9CS8qIGVuZCBvZiBjcml0aWNhbCAqLyAKKwl9CisJLypwcmludGYgKCJ0aHJlYWQgJWQgc2xlZXBpbmdcbiIsIHRpZCk7Ki8KKwl3aGlsZSAobm90b3V0ICYmIChjb3VudCA8IE1BWF9USU1FKSAmJiAobWF4aXRlciA9PSBqKSkKKwl7CisjcHJhZ21hIG9tcCBmbHVzaChtYXhpdGVyLG5vdG91dCkKKwkgIG15X3NsZWVwIChTTEVFUFRJTUUpOworCSAgY291bnQgKz0gU0xFRVBUSU1FOworCSAgcHJpbnRmKCIuIik7CisJfQorI2lmZGVmIFZFUkJPU0UKKwlpZiAoY291bnQgPiAwLikgcHJpbnRmKCIgd2FpdGVkICVsZiBzXG4iLCBjb3VudCk7CisjZW5kaWYKKwkvKnByaW50ZiAoInRocmVhZCAlZCBhd2FrZVxuIiwgdGlkKTsqLworCXRpZHNbal0gPSB0aWQ7CisjaWZkZWYgVkVSQk9TRQorCXByaW50ZigiJWQgZmluaXNoZWQgYnkgJWRcbiIsaix0aWQpOworI2VuZGlmCisgICAgICB9CS8qIGVuZCBvZiBmb3IgKi8KKworICAgICAgbm90b3V0ID0gMDsKKyNwcmFnbWEgb21wIGZsdXNoKG1heGl0ZXIsbm90b3V0KQorICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQkvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworICAgIC8qKioqIGFuYWx5c2luZyB0aGUgZGF0YSBpbiBhcnJheSB0aWRzICoqKiovCisKKyAgICBsYXN0dGlkID0gdGlkc1swXTsKKyAgICB0bXBfY291bnQgPSAwOyAKKworICAgIGZvciAoaSA9IDA7IGkgPCBDRlNNQVhfU0laRSArIDE7ICsraSkKKyAgICB7CisgICAgICAvKiBJZiB0aGUgd29yayAgd2FzIGRvbmUgYnkgdGhlIHNhbWUgdGhyZWFkIGluY3JlYXNlIHRtcF9jb3VudCBieSBvbmUuICovCisgICAgICBpZiAodGlkc1tpXSA9PSBsYXN0dGlkKSB7CisJdG1wX2NvdW50Kys7CisjaWZkZWYgVkVSQk9TRQorCWZwcmludGYgKGxvZ0ZpbGUsICIlZDogJWQgXG4iLCBpLCB0aWRzW2ldKTsKKyNlbmRpZgorCWNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvKiBDaGVjayBpZiB0aGUgbmV4dCB0aHJlYWQgaGFkIGhhcyB0aGUgcmlnaHQgdGhyZWFkIG51bWJlci4gV2hlbiBmaW5kaW5nIAorICAgICAgICogdGhyZWFkbnVtYmVyIC0xIHRoZSBlbmQgc2hvdWxkIGJlIHJlYWNoZWQuIAorICAgICAgICovCSAgCisgICAgICBpZiAodGlkc1tpXSA9PSAobGFzdHRpZCArIDEpICUgdGhyZWFkcyB8fCB0aWRzW2ldID09IC0xKSB7CisJLyogY2hlY2tpbmcgZm9yIHRoZSByaWdodCBjaHVuayBzaXplICovCisJaWYgKHRtcF9jb3VudCA9PSBjaHVua19zaXplKSB7CisJICB0bXBfY291bnQgPSAxOworCSAgbGFzdHRpZCA9IHRpZHNbaV07CisjaWZkZWYgVkVSQk9TRQorCSAgZnByaW50ZiAobG9nRmlsZSwgIk9LXG4iKTsKKyNlbmRpZgorCX0KKwkvKiBJZiB0aGUgY2h1bmsgc2l6ZSB3YXMgd3JvbmcsIGNoZWNrIGlmIHRoZSBlbmQgd2FzIHJlYWNoZWQgKi8KKwllbHNlIHsKKwkgIGlmICh0aWRzW2ldID09IC0xKSB7CisJICAgIGlmIChpID09IENGU01BWF9TSVpFKSB7CisJICAgICAgZnByaW50ZiAobG9nRmlsZSwgIkxhc3QgdGhyZWFkIGhhZCBjaHVuayBzaXplICVkXG4iLCB0bXBfY291bnQpOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICAgIGVsc2UgeworCSAgICAgIGZwcmludGYgKGxvZ0ZpbGUsICJFUlJPUjogTGFzdCB0aHJlYWQgKHRocmVhZCB3aXRoIG51bWJlciAtMSkgd2FzIGZvdW5kIGJlZm9yZSB0aGUgZW5kLlxuIik7CisJICAgICAgcmVzdWx0ID0gMDsKKwkgICAgfQorCSAgfQorCSAgZWxzZSB7CisJICAgIGZwcmludGYgKGxvZ0ZpbGUsICJFUlJPUjogY2h1bmsgc2l6ZSB3YXMgJWQuIChhc3NpZ25lZCB3YXMgJWQpXG4iLCB0bXBfY291bnQsIGNodW5rX3NpemUpOworCSAgICByZXN1bHQgPSAwOworCSAgfQorCX0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworCWZwcmludGYobG9nRmlsZSwgIkVSUk9SOiBGb3VuZCB0aHJlYWQgd2l0aCBudW1iZXIgJWQgKHNob3VsZCBiZSBpbmJldHdlZW4gMCBhbmQgJWQpLiIsIHRpZHNbaV0sIHRocmVhZHMgLSAxKTsKKwlyZXN1bHQgPSAwOworICAgICAgfQorI2lmZGVmIFZFUkJPU0UKKyAgICAgIGZwcmludGYgKGxvZ0ZpbGUsICIlZDogJWQgXG4iLCBpLCB0aWRzW2ldKTsKKyNlbmRpZgorICAgIH0KKyAgfQorCisgIC8qIE5vdyB3ZSBjaGVjayBpZiBzZXZlcmFsIGxvb3AgcmVnaW9ucyBpbiBvbmUgcGFyYWxsZWwgcmVnaW9uIGhhdmUgdGhlIHNhbWUgCisgICAqIGxvZ2ljYWwgYXNzaWduZW1lbnQgb2YgY2h1bmtzIHRvIHRocmVhZHMuCisgICAqIFdlIHVzZSB0aGUgbm93YWl0IGNsYXVzZSB0byBpbmNyZWFzZSB0aGUgcHJvYmFiaWxpdHkgdG8gZ2V0IGFuIGVycm9yLiAqLworCisgIC8qIEZpcnN0IHdlIGFsbG9jYXRlIHNvbWUgbW9yZSBtZW1tb3J5ICovCisgZnJlZSAodGlkcyk7CisgIHRpZHMgPSAoaW50ICopIG1hbGxvYyAoc2l6ZW9mIChpbnQpICogTE9PUENPVU5UKTsKKyAgdGlkczIgPSAoaW50ICopIG1hbGxvYyAoc2l6ZW9mIChpbnQpICogTE9PUENPVU5UKTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgIHsKKyAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICB7CisgICAgICAgICAgaW50IG47CisjcHJhZ21hIG9tcCBmb3IgPG9tcHRzOmNoZWNrPnNjaGVkdWxlKHN0YXRpYyk8L29tcHRzOmNoZWNrPiBub3dhaXQKKyAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgTE9PUENPVU5UOyBuKyspCisgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoTE9PUENPVU5UID09IG4gKyAxICkKKyAgICAgICAgICAgICAgICAgIG15X3NsZWVwKFNMRUVQVElNRSk7CisKKyAgICAgICAgICAgICAgdGlkc1tuXSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgIHsKKyAgICAgICAgICBpbnQgbTsKKyNwcmFnbWEgb21wIGZvciA8b21wdHM6Y2hlY2s+c2NoZWR1bGUoc3RhdGljKTwvb21wdHM6Y2hlY2s+IG5vd2FpdAorICAgICAgICAgIGZvciAobSA9IDE7IG0gPD0gTE9PUENPVU5UOyBtKyspCisgICAgICAgICAgeworICAgICAgICAgICAgICB0aWRzMlttLTFdID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICAgICAgfQorICAgICAgfQorICAgICAgPC9vbXB0czpvcnBoYW4+CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisgICAgICBpZiAodGlkc1tpXSAhPSB0aWRzMltpXSkgeworICAgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsICJDaHVuayBuby4gJWQgd2FzIGFzc2lnbmVkIG9uY2UgdG8gdGhyZWFkICVkIGFuZCBsYXRlciB0byB0aHJlYWQgJWQuXG4iLCBpLCB0aWRzW2ldLHRpZHMyW2ldKTsKKyAgICAgICAgICByZXN1bHQgPSAwOworICAgICAgfQorCisgIGZyZWUgKHRpZHMpOworICBmcmVlICh0aWRzMik7CisgIHJldHVybiByZXN1bHQ7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2dldF9udW1fdGhyZWFkcy5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2dldF9udW1fdGhyZWFkcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMDkyYmEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZ2V0X251bV90aHJlYWRzLmMKQEAgLTAsMCArMSwzOSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoYXQgdGhlIG9tcF9nZXRfbnVtX3RocmVhZHMgcmV0dXJucyB0aGUgY29ycmVjdCBudW1iZXIgb2YgdGhyZWFkcy4gVGhlcmVmb3IgaXQgY291bnRzIHVwIGEgdmFyaWFibGUgaW4gYSBwYXJhbGxlbGl6ZWQgc2VjdGlvbiBhbmQgY29tcGFycyB0aGlzIHZhbHVlIHdpdGggdGhlIHJlc3VsdCBvZiB0aGUgb21wX2dldF9udW1fdGhyZWFkcyBmdW5jdGlvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX2dldF9udW1fdGhyZWFkczwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9nZXRfbnVtX3RocmVhZHM8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgIC8qIGNoZWNrcyB0aGF0IG9tcF9nZXRfbnVtX3RocmVhZHMgaXMgZXF1YWwgdG8gdGhlIG51bWJlciBvZgorICAgICAgIHRocmVhZHMgKi8KKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IG50aHJlYWRzX2xpYjsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBudGhyZWFkcyA9IDA7CisKKyAgICBudGhyZWFkc19saWIgPSAtMTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisJICAgIG50aHJlYWRzKys7CisJfQkvKiBlbmQgb2YgY3JpdGljYWwgKi8KKyNwcmFnbWEgb21wIHNpbmdsZQorCXsgCis8b21wdHM6b3JwaGFuPgorCSAgICA8b21wdHM6Y2hlY2s+bnRocmVhZHNfbGliID0gb21wX2dldF9udW1fdGhyZWFkcyAoKTs8L29tcHRzOmNoZWNrPgorPC9vbXB0czpvcnBoYW4+CisJfQkvKiBlbmQgb2Ygc2luZ2xlICovCisgICAgfQkvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworCWZwcmludGYgKGxvZ0ZpbGUsICJDb3VudGVkICVkIHRocmVhZHMuIGdldF9udW1fdGhyZWFkcyByZXR1cm5lZCAlZC5cbiIsIG50aHJlYWRzLCBudGhyZWFkc19saWIpOworICAgIHJldHVybiAobnRocmVhZHMgPT0gbnRocmVhZHNfbGliKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZ2V0X3d0aWNrLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZ2V0X3d0aWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgyYjU3ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9nZXRfd3RpY2suYwpAQCAtMCwwICsxLDI0IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcF9nZXRfd3RpY2sgZnVuY3Rpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcF9nZXRfd3RpY2s8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9nZXRfd3RpY2s8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWRvdWJsZSB0aWNrOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgdGljayA9IC0xLjsKKworICAgIDxvbXB0czpvcnBoYW4+CisJPG9tcHRzOmNoZWNrPnRpY2sgPSBvbXBfZ2V0X3d0aWNrICgpOzwvb21wdHM6Y2hlY2s+CisgICAgPC9vbXB0czpvcnBoYW4+CisgICAgZnByaW50ZiAobG9nRmlsZSwgIldvcmsgdG9vayAlbGYgc2VjLiB0aW1lLlxuIiwgdGljayk7CisgICAgcmV0dXJuICgodGljayA+IDAuMCkgJiYgKHRpY2sgPCAwLjAxKSk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2dldF93dGltZS5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2dldF93dGltZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMDIyNmQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZ2V0X3d0aW1lLmMKQEAgLTAsMCArMSwzOCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXBfZ2V0X3d0aW1lIGZ1bmN0aW9uLiBJdCBjb21wYXJlcyB0aGUgdGltZSB3aXRoIHdoaWNoIGlzIGNhbGxlZCBhIHNsZWVwIGZ1bmN0aW9uIHdpdGggdGhlIHRpbWUgaXQgdG9vayBieSBtZXNzdXJpbmcgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY2FsbCBvZiB0aGUgc2xlZXAgZnVuY3Rpb24gYW5kIGl0cyBlbmQuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcF9nZXRfd3RpbWU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlPHN0ZGlvLmg+CisjaW5jbHVkZTxzdGRsaWIuaD4KKyNpbmNsdWRlPHVuaXN0ZC5oPgorCisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9nZXRfd3RpbWU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWRvdWJsZSBzdGFydDsKKwlkb3VibGUgZW5kOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgZG91YmxlIG1lYXN1cmVkX3RpbWU7CisgICAgaW50IHdhaXRfdGltZSA9IDE7IAorCisgICAgc3RhcnQgPSAwOworICAgIGVuZCA9IDA7CisKKyAgICA8b21wdHM6b3JwaGFuPgorCTxvbXB0czpjaGVjaz5zdGFydCA9IG9tcF9nZXRfd3RpbWUgKCk7PC9vbXB0czpjaGVjaz4KKyAgICA8L29tcHRzOm9ycGhhbj4KKwlteV9zbGVlcCAod2FpdF90aW1lKTsgCisgICAgPG9tcHRzOm9ycGhhbj4KKwk8b21wdHM6Y2hlY2s+ZW5kID0gb21wX2dldF93dGltZSAoKTs8L29tcHRzOmNoZWNrPgorICAgIDwvb21wdHM6b3JwaGFuPgorCW1lYXN1cmVkX3RpbWUgPSBlbmQtc3RhcnQ7CisgICAgZnByaW50Zihsb2dGaWxlLCAiV29yayB0b29rICVsZiBzZWMuIHRpbWUuXG4iLCBtZWFzdXJlZF90aW1lKTsKKyAgICByZXR1cm4gKChtZWFzdXJlZF90aW1lID4gMC45OSAqIHdhaXRfdGltZSkgJiYgKG1lYXN1cmVkX3RpbWUgPCAxLjAxICogd2FpdF90aW1lKSkgOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9pbl9wYXJhbGxlbC5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2luX3BhcmFsbGVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDliNjExMQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9pbl9wYXJhbGxlbC5jCkBAIC0wLDAgKzEsNTEgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGF0IG9tcF9pbl9wYXJhbGxlbCByZXR1cm5zIGZhbHNlIHdoZW4gY2FsbGVkIGZyb20gYSBzZXJpYWwgcmVnaW9uIGFuZCB0cnVlIHdoZW4gY2FsbGVkIHdpdGhpbiBhIHBhcmFsbGVsIHJlZ2lvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX2luX3BhcmFsbGVsPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisvKgorICogQ2hlY2tzIHRoYXQgZmFsc2UgaXMgcmV0dXJuZWQgd2hlbiBjYWxsZWQgZnJvbSBzZXJpYWwgcmVnaW9uCisgKiBhbmQgdHJ1ZSBpcyByZXR1cm5lZCB3aGVuIGNhbGxlZCB3aXRoaW4gcGFyYWxsZWwgcmVnaW9uLiAKKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfaW5fcGFyYWxsZWw8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgc2VyaWFsOworCWludCBpc3BhcmFsbGVsOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICBzZXJpYWwgPSAxOworICAgIGlzcGFyYWxsZWwgPSAwOworCisgICAgPG9tcHRzOmNoZWNrPgorCTxvbXB0czpvcnBoYW4+CisJICAgIHNlcmlhbCA9IG9tcF9pbl9wYXJhbGxlbCAoKTsKKwk8L29tcHRzOm9ycGhhbj4KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisjcHJhZ21hIG9tcCBzaW5nbGUKKwl7CisJICAgIDxvbXB0czpvcnBoYW4+CisJCWlzcGFyYWxsZWwgPSBvbXBfaW5fcGFyYWxsZWwgKCk7CisJICAgIDwvb21wdHM6b3JwaGFuPgorCX0KKyAgICB9CisgICAgPC9vbXB0czpjaGVjaz4KKworICAgIDxvbXB0czpjcm9zc2NoZWNrPgorI3ByYWdtYSBvbXAgcGFyYWxsZWwKKwl7CisjcHJhZ21hIG9tcCBzaW5nbGUKKwkgICAgeworCisJICAgIH0KKwl9CisgICAgPC9vbXB0czpjcm9zc2NoZWNrPgorCisJcmV0dXJuICghKHNlcmlhbCkgJiYgaXNwYXJhbGxlbCk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2xvY2suYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9sb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUyOWMwNwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9sb2NrLmMKQEAgLTAsMCArMSw0NSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXBfc2V0X2xvY2sgIGFuZCB0aGUgb21wX3Vuc2V0X2xvY2sgZnVuY3Rpb24gYnkgY291bnRpbmcgdGhlIHRocmVhZHMgZW50ZXJpbmcgYW5kIGV4aXRpbmcgYSBzaW5nbGUgcmVnaW9uIHdpdGggbG9ja3MuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcF9sb2NrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworb21wX2xvY2tfdCBsY2s7CisgICAgCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfbG9jazwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKyAgaW50IG5yX3RocmVhZHNfaW5fc2luZ2xlID0gMDsKKyAgaW50IHJlc3VsdCA9IDA7CisgIGludCBucl9pdGVyYXRpb25zID0gMDsKKyAgaW50IGk7CisgIG9tcF9pbml0X2xvY2sgKCZsY2spOworICAKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNoYXJlZChsY2spCisgIHsKKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKyAgICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICA8b21wdHM6Y2hlY2s+b21wX3NldF9sb2NrICgmbGNrKTs8L29tcHRzOmNoZWNrPgorCTwvb21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgZmx1c2gKKwlucl90aHJlYWRzX2luX3NpbmdsZSsrOworI3ByYWdtYSBvbXAgZmx1c2ggICAgICAgICAgIAorCW5yX2l0ZXJhdGlvbnMrKzsKKwlucl90aHJlYWRzX2luX3NpbmdsZS0tOworCXJlc3VsdCA9IHJlc3VsdCArIG5yX3RocmVhZHNfaW5fc2luZ2xlOworCTxvbXB0czpvcnBoYW4+CisJICAgIDxvbXB0czpjaGVjaz5vbXBfdW5zZXRfbG9jaygmbGNrKTs8L29tcHRzOmNoZWNrPgorCTwvb21wdHM6b3JwaGFuPgorICAgICAgfQorICB9CisgIG9tcF9kZXN0cm95X2xvY2sgKCZsY2spOworICAKKyAgcmV0dXJuICgocmVzdWx0ID09IDApICYmIChucl9pdGVyYXRpb25zID09IExPT1BDT1VOVCkpOworICAKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfbWFzdGVyLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfbWFzdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RiMmYxZQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9tYXN0ZXIuYwpAQCAtMCwwICsxLDM3IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBtYXN0ZXIgZGlyZWN0aXZlIGJ5IGNvdW50aW5nIHVwIGEgdmFyaWFibGUgaW4gYSBvbXAgbWFzdGVyIHNlY3Rpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBtYXN0ZXI8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfbWFzdGVyPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgbnRocmVhZHM7CisJaW50IGV4ZWN1dGluZ190aHJlYWQ7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgIG50aHJlYWRzID0gMDsKKyAgICBleGVjdXRpbmdfdGhyZWFkID0gLTE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBtYXN0ZXIgPC9vbXB0czpjaGVjaz4KKwkgICAgeworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkJeworCQkgICAgbnRocmVhZHMrKzsKKwkJfQorCQlleGVjdXRpbmdfdGhyZWFkID0gb21wX2dldF90aHJlYWRfbnVtICgpOworCisJICAgIH0gLyogZW5kIG9mIG1hc3RlciovCisJPC9vbXB0czpvcnBoYW4+CisgICAgfSAvKiBlbmQgb2YgcGFyYWxsZWwqLworICAgIHJldHVybiAoKG50aHJlYWRzID09IDEpICYmIChleGVjdXRpbmdfdGhyZWFkID09IDApKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfbWFzdGVyXzMuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9tYXN0ZXJfMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlOTgxMjkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfbWFzdGVyXzMuYwpAQCAtMCwwICsxLDQ0IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBtYXN0ZXIgZGlyZWN0aXZlIGJ5IGNvdW50aW5nIHVwIGEgdmFyaWFibGUgaW4gYSBvbXAgbWFzdGVyIHNlY3Rpb24uIEl0IGFsc28gY2hlY2tzIHRoYXQgdGhlIG1hc3RlciB0aHJlYWQgaGFzIHRoZSB0aHJlYWQgbnVtYmVyIDAgYXMgc3BlY2lmaWVkIGluIHRoZSBPcGVuIE1QIHN0YW5kYXJkIHZlcnNpb24gMy4wLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgbWFzdGVyPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX21hc3Rlcl8zPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgbnRocmVhZHM7CisJaW50IGV4ZWN1dGluZ190aHJlYWQ7CisgICAgICAgIGludCB0aWRfcmVzdWx0ID0gMDsgLyogY291bnRzIHVwIHRoZSBudW1iZXIgb2Ygd3JvbmcgdGhyZWFkIG5vLiBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWFzdGVyIHRocmVhZC4gKE11c3QgYmUgMCkgKi8KKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgbnRocmVhZHMgPSAwOworICAgIGV4ZWN1dGluZ190aHJlYWQgPSAtMTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIG1hc3RlciA8L29tcHRzOmNoZWNrPgorCSAgICB7CisgICAgICAgICAgICAgICAgaW50IHRpZCA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgICAgICAgICAgIGlmICh0aWQgIT0gMCkgeworI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgICAgICAgICAgICAgICAgeyB0aWRfcmVzdWx0Kys7IH0KKyAgICAgICAgICAgICAgICB9CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCQl7CisJCSAgICBudGhyZWFkcysrOworCQl9CisJCWV4ZWN1dGluZ190aHJlYWQgPSBvbXBfZ2V0X3RocmVhZF9udW0gKCk7CisKKwkgICAgfSAvKiBlbmQgb2YgbWFzdGVyKi8KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9IC8qIGVuZCBvZiBwYXJhbGxlbCovCisgICAgcmV0dXJuICgobnRocmVhZHMgPT0gMSkgJiYgKGV4ZWN1dGluZ190aHJlYWQgPT0gMCkgJiYgKHRpZF9yZXN1bHQgPT0gMCkpOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9uZXN0X2xvY2suYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9uZXN0X2xvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWRlMzg5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX25lc3RfbG9jay5jCkBAIC0wLDAgKzEsNDUgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wX3NldF9uZXN0X2xvY2sgYW5kIHRoZSBvbXBfdW5zZXRfbmVzdF9sb2NrIGZ1bmN0aW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXBfbmVzdF9sb2NrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworb21wX25lc3RfbG9ja190IGxjazsKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX25lc3RfbG9jazwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKyAgICBpbnQgbnJfdGhyZWFkc19pbl9zaW5nbGUgPSAwOworICAgIGludCByZXN1bHQgPSAwOworICAgIGludCBucl9pdGVyYXRpb25zID0gMDsKKyAgICBpbnQgaTsKKworICAgIG9tcF9pbml0X25lc3RfbG9jayAoJmxjayk7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNoYXJlZChsY2spICAKKyAgICB7CisjcHJhZ21hIG9tcCBmb3IKKwlmb3IoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKwl7CisJICAgIDxvbXB0czpvcnBoYW4+CisJCTxvbXB0czpjaGVjaz5vbXBfc2V0X25lc3RfbG9jayAoJmxjayk7PC9vbXB0czpjaGVjaz4KKwkgICAgPC9vbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCBmbHVzaAorCQlucl90aHJlYWRzX2luX3NpbmdsZSsrOworI3ByYWdtYSBvbXAgZmx1c2ggICAgICAgICAgIAorCSAgICBucl9pdGVyYXRpb25zKys7CisJICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlLS07CisJICAgIHJlc3VsdCA9IHJlc3VsdCArIG5yX3RocmVhZHNfaW5fc2luZ2xlOworCSAgICA8b21wdHM6b3JwaGFuPgorCQk8b21wdHM6Y2hlY2s+b21wX3Vuc2V0X25lc3RfbG9jayAoJmxjayk7PC9vbXB0czpjaGVjaz4KKwkgICAgPC9vbXB0czpvcnBoYW4+CisJfQorICAgIH0KKyAgICBvbXBfZGVzdHJveV9uZXN0X2xvY2sgKCZsY2spOworCisgICAgcmV0dXJuICgocmVzdWx0ID09IDApICYmIChucl9pdGVyYXRpb25zID09IExPT1BDT1VOVCkpOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9uZXN0ZWQuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9uZXN0ZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjU3YmM4Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX25lc3RlZC5jCkBAIC0wLDAgKzEsNDIgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wX25lc3RlZCBmdW5jdGlvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX25lc3RlZDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisvKgorICogVGVzdCBpZiB0aGUgY29tcGlsZXIgc3VwcG9ydHMgbmVzdGVkIHBhcmFsbGVsaXNtCisgKiBCeSBDaHVuaHVhIExpYW8sIFVuaXZlcnNpdHkgb2YgSG91c3RvbgorICogT2N0LiAyMDA1CisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX25lc3RlZDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgaW50IGNvdW50ZXIgPSAwOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyNpZmRlZiBfT1BFTk1QCisgICAgPG9tcHRzOmNoZWNrPm9tcF9zZXRfbmVzdGVkKDEpOzwvb21wdHM6Y2hlY2s+CisgICAgPG9tcHRzOmNyb3NzY2hlY2s+b21wX3NldF9uZXN0ZWQoMCk7PC9vbXB0czpjcm9zc2NoZWNrPgorI2VuZGlmCisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNoYXJlZChjb3VudGVyKQoreworPG9tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgY291bnRlciArKzsKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgICAgY291bnRlciAtLTsKKyAgICB9Cis8L29tcHRzOm9ycGhhbj4KK30KKyAgICByZXR1cm4gKGNvdW50ZXIgIT0gMCk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2NvcHlpbi5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2NvcHlpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MmJmYTIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfY29weWluLmMKQEAgLTAsMCArMSw0NyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgY29weWluIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIGNvcHlpbjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbCxvbXAgdGhyZWFkcHJpdmF0ZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK3N0YXRpYyBpbnQgc3VtMSA9IDc4OTsKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoc3VtMSkKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3BhcmFsbGVsX2NvcHlpbjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IHN1bSwgbnVtX3RocmVhZHM7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQga25vd25fc3VtOworCisgICAgc3VtID0gMDsKKyAgICBzdW0xID0gNzsKKyAgICBudW1fdGhyZWFkcyA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIDxvbXB0czpjaGVjaz5jb3B5aW4oc3VtMSk8L29tcHRzOmNoZWNrPgorICAgIHsKKwkvKnByaW50Zigic3VtMT0lZFxuIixzdW0xKTsqLworCTxvbXB0czpvcnBoYW4+CisJaW50IGk7CisjcHJhZ21hIG9tcCBmb3IgCisJICAgIGZvciAoaSA9IDE7IGkgPCAxMDAwOyBpKyspCisJICAgIHsKKwkJc3VtMSA9IHN1bTEgKyBpOworCSAgICB9IC8qZW5kIG9mIGZvciovCisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKwkgICAgc3VtID0gc3VtICsgc3VtMTsKKyAgICAgICAgICAgIG51bV90aHJlYWRzKys7CisJfSAvKmVuZCBvZiBjcml0aWNhbCovCisJPC9vbXB0czpvcnBoYW4+CisgICAgfSAvKiBlbmQgb2YgcGFyYWxsZWwqLyAgICAKKyAgICBrbm93bl9zdW0gPSAoOTk5ICogMTAwMCkgLyAyICsgNyAqIG51bV90aHJlYWRzOworICAgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7CisKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZGVmYXVsdC5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2RlZmF1bHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Yzg3MzcxCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2RlZmF1bHQuYwpAQCAtMCwwICsxLDQ0IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIGRlZmF1bHQgb3B0aW9uIG9mIHRoZSBwYXJhbGxlbCBjb25zdHJ1Y3QuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBkZWZhdWx0PC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3BhcmFsbGVsX2RlZmF1bHQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICA8b21wdHM6b3JwaGFuOnZhcnM+CisgIGludCBpOworICBpbnQgc3VtOworICBpbnQgbXlzdW07CisgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgIAorICBpbnQga25vd25fc3VtOworICBzdW0gPTA7CisgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMiA7CisKKyAgPG9tcHRzOm9ycGhhbj4KKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgPG9tcHRzOmNoZWNrPmRlZmF1bHQoc2hhcmVkKTwvb21wdHM6Y2hlY2s+IHByaXZhdGUoaSkgcHJpdmF0ZShteXN1bTxvbXB0czpjcm9zc2NoZWNrPixzdW08L29tcHRzOmNyb3NzY2hlY2s+KQorICB7CisJbXlzdW0gPSAwOworICAjcHJhZ21hIG9tcCBmb3IKKwlmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKQorCXsKKwkgIG15c3VtID0gbXlzdW0gKyBpOworCX0gCisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKwkgIHN1bSA9IHN1bSArIG15c3VtOworCX0gICAvKiBlbmQgb2YgY3JpdGljYWwgKi8KKyAgfSAgIC8qIGVuZCBvZiBwYXJhbGxlbCAqLworICA8L29tcHRzOm9ycGhhbj4KKyAgaWYgKGtub3duX3N1bSAhPSBzdW0pIHsKKyAgCWZwcmludGYobG9nRmlsZSwgIktOT1dOX1NVTSA9ICVkOyBTVU0gPSAlZFxuIiwga25vd25fc3VtLCBzdW0pOworICB9CisgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2ZpcnN0cHJpdmF0ZS5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2ZpcnN0cHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MTViNGMKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZmlyc3Rwcml2YXRlLmMKQEAgLTAsMCArMSw0OCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgZmlyc3Rwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIGZpcnN0cHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBmb3Igb21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworLy9zdGF0aWMgaW50IHN1bTEgPSA3ODk7CisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9maXJzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBzdW0sIG51bV90aHJlYWRzLHN1bTE7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQga25vd25fc3VtOworCisgICAgc3VtID0gMDsKKyAgICBzdW0xPTc7CisgICAgbnVtX3RocmVhZHMgPSAwOworCisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIDxvbXB0czpjaGVjaz5maXJzdHByaXZhdGUoc3VtMSk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUoc3VtMSk8L29tcHRzOmNyb3NzY2hlY2s+CisgICAgeworCisJLypwcmludGYoInN1bTE9JWRcbiIsc3VtMSk7Ki8KKwk8b21wdHM6b3JwaGFuPgorCWludCBpOworI3ByYWdtYSBvbXAgZm9yIAorCSAgICBmb3IgKGkgPSAxOyBpIDwgMTAwMDsgaSsrKQorCSAgICB7CisJCXN1bTEgPSBzdW0xICsgaTsKKwkgICAgfSAvKmVuZCBvZiBmb3IqLworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisJICAgIHN1bSA9IHN1bSArIHN1bTE7CisgICAgICAgICAgICBudW1fdGhyZWFkcysrOworCX0gLyplbmQgb2YgY3JpdGljYWwqLworCTwvb21wdHM6b3JwaGFuPgorICAgIH0gLyogZW5kIG9mIHBhcmFsbGVsKi8gICAgCisgICAga25vd25fc3VtID0gKDk5OSAqIDEwMDApIC8gMiArIDcgKiBudW1fdGhyZWFkczsKKyAgICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworCit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2Zvcl9maXJzdHByaXZhdGUuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3JfZmlyc3Rwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNiNDkyNgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3JfZmlyc3Rwcml2YXRlLmMKQEAgLTAsMCArMSwzNiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgZm9yIGZpcnN0cHJpdmF0ZSBkaXJlY3RpdmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBmb3IgZmlyc3Rwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHBhcmFsbGVsIGZvciByZWR1Y3Rpb24sb21wIHBhcmFsbGVsIGZvciBwcml2YXRlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3BhcmFsbGVsX2Zvcl9maXJzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBzdW0gOworICAgIGludCBpMjsKKyAgICBpbnQgaTsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgIAorICAgIHN1bT0wOworICAgIGkyPTM7CisgICAgaW50IGtub3duX3N1bTsKKworICAgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciByZWR1Y3Rpb24oKzpzdW0pIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPmZpcnN0cHJpdmF0ZShpMik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUoaTIpPC9vbXB0czpjcm9zc2NoZWNrPgorICAgIDxvbXB0czpvcnBoYW4+CisgICAgZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykKKyAgICB7CisJICBzdW0gPSBzdW0gKyAoaSArIGkyKTsKKyAgICB9IC8qZW5kIG9mIGZvciovCisgICAgPC9vbXB0czpvcnBoYW4+CisgICAgCisgICAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyICsgaTIgKiBMT09QQ09VTlQ7CisgICAgCisgICAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKKworfSAvKiBlbmQgb2YgY2hlY2tfcGFyYWxsZWxfZm9yX2Zpc3Rwcml2YXRlICovCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2Zvcl9pZi5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2Zvcl9pZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyODg2YmEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZm9yX2lmLmMKQEAgLTAsMCArMSwzOCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgZm9yIGlmIGRpcmVjdGl2ZS4gTmVlZHMgYXQgbGVhc3QgdHdvIHRocmVhZHMuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBmb3IgaWY8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz48L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3BhcmFsbGVsX2Zvcl9pZjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgICAgaW50IGtub3duX3N1bTsKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IG51bV90aHJlYWRzOworICAgIGludCBzdW0sIHN1bTI7CisgICAgaW50IGk7CisgICAgaW50IGNvbnRyb2w7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICBjb250cm9sID0gMDsKKyAgICBudW1fdGhyZWFkcz0wOworICAgIHN1bSA9IDA7CisgICAgc3VtMiA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5pZiAoY29udHJvbD09MSk8L29tcHRzOmNoZWNrPgorICAgIDxvbXB0czpvcnBoYW4+CisgICAgZm9yIChpPTA7IGkgPD0gTE9PUENPVU5UOyBpKyspCisgICAgeworICAgICAgICBudW1fdGhyZWFkcyA9IG9tcF9nZXRfbnVtX3RocmVhZHMoKTsKKwlzdW0gPSBzdW0gKyBpOworICAgIH0gLyplbmQgb2YgZm9yKi8KKworICAgIDwvb21wdHM6b3JwaGFuPgorICAgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKyAgICBmcHJpbnRmIChsb2dGaWxlLCAiTnVtYmVyIG9mIHRocmVhZHMgZGV0ZXJtaW5lZCBieSBvbXBfZ2V0X251bV90aHJlYWRzOiAlZFxuIiwgbnVtX3RocmVhZHMpOworICAgIHJldHVybiAoa25vd25fc3VtID09IHN1bSAmJiBudW1fdGhyZWFkcyA9PSAxKTsKK30gLyogZW5kIG9mIGNoZWNrX3BhcmFsbGVsX2Zvcl9wcml2YXRlICovCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2Zvcl9sYXN0cHJpdmF0ZS5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2Zvcl9sYXN0cHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwOWRlYmEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZm9yX2xhc3Rwcml2YXRlLmMKQEAgLTAsMCArMSwzNCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgZm9yIGxhc3Rwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIGZvciBsYXN0cHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBwYXJhbGxlbCBmb3IgcmVkdWN0aW9uLG9tcCBwYXJhbGxlbCBmb3IgcHJpdmF0ZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9mb3JfbGFzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQgc3VtOworICAgIGludCBpOworICAgIGludCBpMDsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgc3VtID0wOworICAgIGkwID0gLTE7CisgICAgaW50IGtub3duX3N1bTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHJlZHVjdGlvbigrOnN1bSkgc2NoZWR1bGUoc3RhdGljLDcpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPmxhc3Rwcml2YXRlKGkwKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShpMCk8L29tcHRzOmNyb3NzY2hlY2s+CisgICAgPG9tcHRzOm9ycGhhbj4KKyAgICBmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKQorICAgIHsKKwlzdW0gPSBzdW0gKyBpOworCWkwID0gaTsKKyAgICB9IC8qZW5kIG9mIGZvciovCisgICAgLyogZW5kIG9mIHBhcmFsbGVsKi8gICAgCisgICAgPC9vbXB0czpvcnBoYW4+CisgICAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworICAgIHJldHVybiAoKGtub3duX3N1bSA9PSBzdW0pICYmIChpMCA9PSBMT09QQ09VTlQpKTsKK30gLyogZW5kIG9mIGNoZWNrX3BhcmFsbGVsX2Zvcl9sYXN0cHJpdmF0ZSAqLworPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3Jfb3JkZXJlZC5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2Zvcl9vcmRlcmVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFhNGJjOQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3Jfb3JkZXJlZC5jCkBAIC0wLDAgKzEsNjIgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIGZvciBvcmRlcmVkIGRpcmVjdGl2ZTwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgZm9yIG9yZGVyZWQ8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgcGFyYWxsZWwgc2NoZWR1bGUoc3RhdGljKTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK3N0YXRpYyBpbnQgbGFzdF9pID0gMDsKK2ludCBpOworCisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKGkpCisKKy8qIFZhcmlhYmxlIGlpIGlzIHVzZWQgdG8gYXZvaWQgcHJvYmxlbXMgd2l0aCBhIHRocmVhZHByaXZhdGUgdmFyaWFibGUgdXNlZCBhcyBhIGxvb3AKKyAqIGluZGV4LiBTZWUgdGVzdCBvbXBfdGhyZWFkcHJpdmF0ZV9mb3IuCisgKi8KK3N0YXRpYyBpbnQgaWk7CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKGlpKQorCisvKiEgCisgIFV0aWxpdHkgZnVuY3Rpb246IHJldHVybnMgdHJ1ZSBpZiB0aGUgcGFzc2VkIGFyZ3VtZW50IGlzIGxhcmdlciB0aGFuIAorICB0aGUgYXJndW1lbnQgb2YgdGhlIGxhc3QgY2FsbCBvZiB0aGlzIGZ1bmN0aW9uLgorICAqLworc3RhdGljIGludCBjaGVja19pX2lzbGFyZ2VyMiAoaW50IGkpeworCWludCBpc2xhcmdlcjsKKwlpc2xhcmdlciA9IChpID4gbGFzdF9pKTsKKwlsYXN0X2kgPSBpOworCXJldHVybiAoaXNsYXJnZXIpOworfQorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfZm9yX29yZGVyZWQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworCTxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgc3VtOworCWludCBpc19sYXJnZXI7CisJPC9vbXB0czpvcnBoYW46dmFycz4KKworCWludCBrbm93bl9zdW07CisJaW50IGk7CisJCisJc3VtID0gMDsKKwlpc19sYXJnZXIgPSAxOworCWxhc3RfaSA9IDA7CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoc3RhdGljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPm9yZGVyZWQ8L29tcHRzOmNoZWNrPgorCWZvciAoaSA9IDE7IGkgPCAxMDA7IGkrKykKKwl7CisJCWlpID0gaTsKKwk8b21wdHM6b3JwaGFuPgorPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIG9yZGVyZWQ8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworCQkJaXNfbGFyZ2VyID0gY2hlY2tfaV9pc2xhcmdlcjIgKGlpKSAmJiBpc19sYXJnZXI7CisJCQlzdW0gID0gc3VtICsgaWk7CisJCX0KKwk8L29tcHRzOm9ycGhhbj4KKwl9CisJa25vd25fc3VtID0gKDk5ICogMTAwKSAvIDI7CisJZnByaW50ZiAobG9nRmlsZSwiIGtub3duX3N1bSA9ICVkICwgc3VtID0gJWQgXG4iLCBrbm93bl9zdW0sIHN1bSk7CisJZnByaW50ZiAobG9nRmlsZSwiIGlzX2xhcmdlciA9ICVkXG4iLCBpc19sYXJnZXIpOworCXJldHVybiAoa25vd25fc3VtID09IHN1bSkgJiYgaXNfbGFyZ2VyOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3JfcHJpdmF0ZS5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2Zvcl9wcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAyODBjYwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3JfcHJpdmF0ZS5jCkBAIC0wLDAgKzEsNDggQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIGZvciBwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIGZvciBwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHBhcmFsbGVsIGZvciByZWR1Y3Rpb24sb21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKy8qISBVdGlsaXR5IGZ1bmN0aW9uIHRvIHNwZW5kIHNvbWUgdGltZSBpbiBhIGxvb3AgKi8KK3N0YXRpYyB2b2lkIGRvX3NvbWVfd29yayAodm9pZCl7CisgICAgaW50IGk7CisgICAgZG91YmxlIHN1bSA9IDA7CisgICAgZm9yKGkgPSAwOyBpIDwgMTAwMDsgaSsrKXsKKwlzdW0gKz0gc3FydCAoaSk7CisgICAgfQorfQorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfZm9yX3ByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQgc3VtOworICAgIGludCBpOworICAgIGludCBpMjsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgIAorICAgIHN1bSA9MDsKKyAgICBpMj0wOworICAgIGludCBrbm93bl9zdW07CisgIAorI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHJlZHVjdGlvbigrOnN1bSkgc2NoZWR1bGUoc3RhdGljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnByaXZhdGUoaTIpPC9vbXB0czpjaGVjaz4KKyAgICA8b21wdHM6b3JwaGFuPgorICAgIAorICAgIGZvciAoaT0xO2k8PUxPT1BDT1VOVDtpKyspCisgICAgeworCWkyID0gaTsKKyNwcmFnbWEgb21wIGZsdXNoCisJZG9fc29tZV93b3JrICgpOworI3ByYWdtYSBvbXAgZmx1c2gKKwlzdW0gPSBzdW0gKyBpMjsKKyAgICB9IC8qZW5kIG9mIGZvciovCisgICAgPC9vbXB0czpvcnBoYW4+CisKKyAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgICAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKK30gLyogZW5kIG9mIGNoZWNrX3BhcmFsbGVsX2Zvcl9wcml2YXRlICovCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2Zvcl9yZWR1Y3Rpb24uYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3JfcmVkdWN0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM5OTFmNwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3JfcmVkdWN0aW9uLmMKQEAgLTAsMCArMSwyODAgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIGZvciByZWR1Y3Rpb24gZGlyZWN0aXZlIHdpdGggYWxsIGl0cyBvcHRpb25zLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgZm9yIHJlZHVjdGlvbjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfZm9yX3JlZHVjdGlvbjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisJPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBzdW07CisJaW50IGtub3duX3N1bTsKKwlkb3VibGUgZHN1bTsKKwlkb3VibGUgZGtub3duX3N1bTsKKwlkb3VibGUgZHQ9MC41OwkJCQkvKiBiYXNlIG9mIGdlb21ldHJpYyByb3cgZm9yICsgYW5kIC0gdGVzdCovCisJZG91YmxlIHJvdW5kaW5nX2Vycm9yPSAxLkUtOTsKKyNkZWZpbmUgRE9VQkxFX0RJR0lUUyAyMAkJLyogZHReRE9VQkxFX0RJR0lUUyAqLworCWludCBkaWZmOworCWRvdWJsZSBkZGlmZjsKKwlpbnQgcHJvZHVjdDsKKwlpbnQga25vd25fcHJvZHVjdDsKKyNkZWZpbmUgTUFYX0ZBQ1RPUiAxMAorI2RlZmluZSBLTk9XTl9QUk9EVUNUIDM2Mjg4MDAJLyogMTAhICovCisJaW50IGxvZ2ljX2FuZDsKKwlpbnQgbG9naWNfb3I7CisJaW50IGJpdF9hbmQ7CisJaW50IGJpdF9vcjsKKwlpbnQgZXhjbHVzaXZfYml0X29yOworCWludCBsb2dpY3NbTE9PUENPVU5UXTsKKwlpbnQgaTsKKwlkb3VibGUgZHB0OworCWludCByZXN1bHQ7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgIHN1bSA9MDsKKyAgICBkc3VtPTA7CisJZHQgPSAxLi8zLjsKKyAgICByZXN1bHQgPSAwOworICAgIHByb2R1Y3QgPSAxOworCWxvZ2ljX2FuZD0xOworCWxvZ2ljX29yPTA7CisJYml0X2FuZD0xOworCWJpdF9vcj0wOworCWV4Y2x1c2l2X2JpdF9vcj0wOworCisJa25vd25fc3VtID0gKExPT1BDT1VOVCooTE9PUENPVU5UKzEpKS8yOworPG9tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigrOnN1bSk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IgKGk9MTtpPD1MT09QQ09VTlQ7aSsrKQorCXsKKwkJc3VtPXN1bStpOworCX0KKworCWlmKGtub3duX3N1bSE9c3VtKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gc3VtIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAlZFxuIixzdW0sa25vd25fc3VtKTsgCisJfQorCisJZGlmZiA9IChMT09QQ09VTlQqKExPT1BDT1VOVCsxKSkvMjsKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigtOmRpZmYpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yIChpPTE7aTw9TE9PUENPVU5UOysraSkKKwl7CisJCWRpZmY9ZGlmZi1pOworCX0KKworCWlmKGRpZmYgIT0gMCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIGRpZmZlcmVuY2Ugd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mIDAuXG4iLGRpZmYpOworCX0KKworCS8qIFRlc3RzIGZvciBkb3VibGVzICovCisJZHN1bT0wOworCWRwdD0xOworCWZvciAoaT0wO2k8RE9VQkxFX0RJR0lUUzsrK2kpCisJeworCQlkcHQqPWR0OworCX0KKwlka25vd25fc3VtID0gKDEtZHB0KS8oMS1kdCk7CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKzpkc3VtKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvciAoaT0wO2k8RE9VQkxFX0RJR0lUUzsrK2kpCisJeworCQlkc3VtICs9IHBvdyhkdCxpKTsKKwl9CisKKwlpZiggZmFicyhkc3VtLWRrbm93bl9zdW0pID4gcm91bmRpbmdfZXJyb3IgKQorCXsKKwkJcmVzdWx0Kys7IAorCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIHN1bSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJWYgaW5zdGVhZCBvZiAlZiAoRGlmZmVyZW5jZTogJUUpXG4iLGRzdW0sZGtub3duX3N1bSwgZHN1bS1ka25vd25fc3VtKTsKKwl9CisKKwlkcHQ9MTsKKworCWZvciAoaT0wO2k8RE9VQkxFX0RJR0lUUzsrK2kpCisJeworCQlkcHQqPWR0OworCX0KKwlmcHJpbnRmKGxvZ0ZpbGUsIlxuIik7CisJZGRpZmYgPSAoMS1kcHQpLygxLWR0KTsKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigtOmRkaWZmKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvciAoaT0wO2k8RE9VQkxFX0RJR0lUUzsrK2kpCisJeworCQlkZGlmZiAtPSBwb3coZHQsaSk7CisJfQorCWlmKCBmYWJzKGRkaWZmKSA+IHJvdW5kaW5nX2Vycm9yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gRGlmZmVyZW5jZSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJUUgaW5zdGVhZCBvZiAwLjBcbiIsZGRpZmYpOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCo6cHJvZHVjdCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0xO2k8PU1BWF9GQUNUT1I7aSsrKQorCXsKKwkJcHJvZHVjdCAqPSBpOworCX0KKworCWtub3duX3Byb2R1Y3QgPSBLTk9XTl9QUk9EVUNUOworCWlmKGtub3duX3Byb2R1Y3QgIT0gcHJvZHVjdCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIFByb2R1Y3Qgd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mICVkXG5cbiIscHJvZHVjdCxrbm93bl9wcm9kdWN0KTsKKwl9CisKKwlmb3IoaT0wO2k8TE9PUENPVU5UO2krKykKKwl7CisJCWxvZ2ljc1tpXT0xOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCYmOmxvZ2ljX2FuZCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKwl9CisJaWYoIWxvZ2ljX2FuZCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDEuXG4iKTsKKwl9CisKKwlsb2dpY19hbmQgPSAxOworCWxvZ2ljc1tMT09QQ09VTlQvMl09MDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCYmOmxvZ2ljX2FuZCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV07CisJfQorCWlmKGxvZ2ljX2FuZCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDIuXG4iKTsKKwl9CisKKwlmb3IoaT0wO2k8TE9PUENPVU5UO2krKykKKwl7CisJCWxvZ2ljc1tpXT0wOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHx8OmxvZ2ljX29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJbG9naWNfb3IgPSBsb2dpY19vciB8fCBsb2dpY3NbaV07CisJfQorCWlmKGxvZ2ljX29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAxLlxuIik7CisJfQorCWxvZ2ljX29yID0gMDsKKwlsb2dpY3NbTE9PUENPVU5ULzJdPTE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8fDpsb2dpY19vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWxvZ2ljX29yID0gbG9naWNfb3IgfHwgbG9naWNzW2ldOworCX0KKwlpZighbG9naWNfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDIuXG4iKTsKKwl9CisKKworCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJbG9naWNzW2ldPTE7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJjpiaXRfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJYml0X2FuZCA9IChiaXRfYW5kICYgbG9naWNzW2ldKTsKKwl9CisJaWYoIWJpdF9hbmQpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMS5cbiIpOworCX0KKworCWJpdF9hbmQgPSAxOworCWxvZ2ljc1tMT09QQ09VTlQvMl09MDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCY6Yml0X2FuZCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWJpdF9hbmQgPSBiaXRfYW5kICYgbG9naWNzW2ldOworCX0KKwlpZihiaXRfYW5kKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDIuXG4iKTsKKwl9CisKKwlmb3IoaT0wO2k8TE9PUENPVU5UO2krKykKKwl7CisJCWxvZ2ljc1tpXT0wOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHw6Yml0X29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworCX0KKwlpZihiaXRfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgT1IgcGFydCAxXG4iKTsKKwl9CisJYml0X29yID0gMDsKKwlsb2dpY3NbTE9PUENPVU5ULzJdPTE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8OmJpdF9vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKwl9CisJaWYoIWJpdF9vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEJJVCBPUiBwYXJ0IDJcbiIpOworCX0KKworCWZvcihpPTA7aTxMT09QQ09VTlQ7aSsrKQorCXsKKwkJbG9naWNzW2ldPTA7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJfQorCWlmKGV4Y2x1c2l2X2JpdF9vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDFcbiIpOworCX0KKworCWV4Y2x1c2l2X2JpdF9vciA9IDA7CisJbG9naWNzW0xPT1BDT1VOVC8yXT0xOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJfQorCWlmKCFleGNsdXNpdl9iaXRfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAyXG4iKTsKKwl9Cis8L29tcHRzOm9ycGhhbj4KKwkvKnByaW50ZigiXG5SZXN1bHQ6JWRcbiIscmVzdWx0KTsqLworCXJldHVybiAocmVzdWx0PT0wKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfaWYuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9pZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZjQ1YjEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfaWYuYwpAQCAtMCwwICsxLDQwIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIGlmIG9wdGlvbiBvZiB0aGUgcGFyYWxsZWwgY29uc3RydWN0Ljwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgaWY8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfaWY8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworPG9tcHRzOm9ycGhhbjp2YXJzPgorICBpbnQgaTsKKyAgaW50IHN1bTsKKyAgaW50IGtub3duX3N1bTsKKyAgaW50IG15c3VtOworICBpbnQgY29udHJvbD0xOworPC9vbXB0czpvcnBoYW46dmFycz4KKyAgc3VtID0wOworICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIgOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+aWYoY29udHJvbD09MCk8L29tcHRzOmNoZWNrPgorICB7CisJPG9tcHRzOm9ycGhhbj4KKyAgICBteXN1bSA9IDA7CisJZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykKKwl7CisJICBteXN1bSA9IG15c3VtICsgaTsKKwl9IAorI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisJICBzdW0gPSBzdW0gKyBteXN1bTsKKwl9ICAgLyogZW5kIG9mIGNyaXRpY2FsICovCisgIDwvb21wdHM6b3JwaGFuPgorICB9ICAgLyogZW5kIG9mIHBhcmFsbGVsICovCisKKyAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfbnVtX3RocmVhZHMuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9udW1fdGhyZWFkcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5N2ZlZDIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfbnVtX3RocmVhZHMuYwpAQCAtMCwwICsxLDQ2IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcF9wYXJhbGxlbF9udW1fdGhyZWFkcyBkaXJlY3RpdmUgYnkgY291bnRpbmcgdGhlIHRocmVhZHMgaW4gYSBwYXJhbGxlbCByZWdpb24gd2hpY2ggd2FzIHN0YXJ0ZWQgd2l0aCBhbiBleHBsaWNpdGx5IHN0YXRlZCBudW1iZXIgb2YgdGhyZWFkcy48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmVsbGVsIG51bV90aHJlYWRzPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIG1hc3RlcixvbXAgcGFyYWxsZWwgcmVkdWN0aW9uLG9tcCBhdG9taWM8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfbnVtX3RocmVhZHM8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgZmFpbGVkOworCWludCB0aHJlYWRzOworCWludCBudGhyZWFkczsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgaW50IG1heF90aHJlYWRzID0gMDsKKworICAgIGZhaWxlZCA9IDA7CisKKyAgICAvKiBmaXJzdCB3ZSBjaGVjayBob3cgbWFueSB0aHJlYWRzIGFyZSBhdmFpbGFibGUgKi8KKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworI3ByYWdtYSBvbXAgbWFzdGVyCisJbWF4X3RocmVhZHMgPSBvbXBfZ2V0X251bV90aHJlYWRzICgpOworICAgIH0KKworICAgIC8qIHdlIGluY3JlYXNlIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBmcm9tIG9uZSB0byBtYXhpbXVtOiovCisgICAgZm9yICh0aHJlYWRzID0gMTsgdGhyZWFkcyA8PSBtYXhfdGhyZWFkczsgdGhyZWFkcysrKQorICAgIHsKKwludGhyZWFkcyA9IDA7CisKKwk8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgcGFyYWxsZWwgcmVkdWN0aW9uKCs6ZmFpbGVkKSA8b21wdHM6Y2hlY2s+bnVtX3RocmVhZHModGhyZWFkcyk8L29tcHRzOmNoZWNrPgorCSAgICB7CisJCWZhaWxlZCA9IGZhaWxlZCArICEodGhyZWFkcyA9PSBvbXBfZ2V0X251bV90aHJlYWRzICgpKTsKKyNwcmFnbWEgb21wIGF0b21pYworCSAgICBudGhyZWFkcyArPSAxOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisJZmFpbGVkID0gZmFpbGVkICsgIShudGhyZWFkcyA9PSB0aHJlYWRzKTsKKyAgICB9CisgICAgcmV0dXJuICghZmFpbGVkKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfcHJpdmF0ZS5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3ByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGNjYzA5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3ByaXZhdGUuYwpAQCAtMCwwICsxLDUwIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgZm9yIG9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKy8vc3RhdGljIGludCBzdW0xID0gNzg5OworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfcHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IHN1bSwgbnVtX3RocmVhZHMsc3VtMTsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBrbm93bl9zdW07CisKKyAgICBzdW0gPSAwOworICAgIDxvbXB0czpjcm9zc2NoZWNrPiBzdW0xPTA7IDwvb21wdHM6Y3Jvc3NjaGVjaz4KKyAgICBudW1fdGhyZWFkcyA9IDA7CisKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgPG9tcHRzOmNoZWNrPnByaXZhdGUoc3VtMSk8L29tcHRzOmNoZWNrPgorICAgIHsKKwk8b21wdHM6Y2hlY2s+CisJc3VtMSA9IDc7CisJPC9vbXB0czpjaGVjaz4KKwkvKnByaW50Zigic3VtMT0lZFxuIixzdW0xKTsqLworCTxvbXB0czpvcnBoYW4+CisJaW50IGk7CisjcHJhZ21hIG9tcCBmb3IgCisJICAgIGZvciAoaSA9IDE7IGkgPCAxMDAwOyBpKyspCisJICAgIHsKKwkJc3VtMSA9IHN1bTEgKyBpOworCSAgICB9IC8qZW5kIG9mIGZvciovCisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKwkgICAgc3VtID0gc3VtICsgc3VtMTsKKyAgICAgICAgICAgIG51bV90aHJlYWRzKys7CisJfSAvKmVuZCBvZiBjcml0aWNhbCovCisJPC9vbXB0czpvcnBoYW4+CisgICAgfSAvKiBlbmQgb2YgcGFyYWxsZWwqLyAgICAKKyAgICBrbm93bl9zdW0gPSAoOTk5ICogMTAwMCkgLyAyICsgNyAqIG51bV90aHJlYWRzOworICAgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7CisKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfcmVkdWN0aW9uLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfcmVkdWN0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZmODM5NAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9yZWR1Y3Rpb24uYwpAQCAtMCwwICsxLDI3OCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgcmVkdWN0aW9uIGRpcmVjdGl2ZSB3aXRoIGFsbCBpdHMgb3B0aW9ucy48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIHJlZHVjdGlvbjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfcmVkdWN0aW9uPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKwk8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IHN1bTsKKwlpbnQga25vd25fc3VtOworCWRvdWJsZSBkc3VtOworCWRvdWJsZSBka25vd25fc3VtOworCWRvdWJsZSBkdD0wLjU7CQkJCS8qIGJhc2Ugb2YgZ2VvbWV0cmljIHJvdyBmb3IgKyBhbmQgLSB0ZXN0Ki8KKwlkb3VibGUgcm91bmRpbmdfZXJyb3I9IDEuRS05OworI2RlZmluZSBET1VCTEVfRElHSVRTIDIwCQkvKiBkdF5ET1VCTEVfRElHSVRTICovCisJaW50IGRpZmY7CisJZG91YmxlIGRkaWZmOworCWludCBwcm9kdWN0OworCWludCBrbm93bl9wcm9kdWN0OworI2RlZmluZSBNQVhfRkFDVE9SIDEwCisjZGVmaW5lIEtOT1dOX1BST0RVQ1QgMzYyODgwMAkvKiAxMCEgKi8KKwlpbnQgbG9naWNfYW5kOworCWludCBsb2dpY19vcjsKKwlpbnQgYml0X2FuZDsKKwlpbnQgYml0X29yOworCWludCBleGNsdXNpdl9iaXRfb3I7CisJaW50IGxvZ2ljc1tMT09QQ09VTlRdOworCWludCBpOworCWRvdWJsZSBkcHQ7CisJaW50IHJlc3VsdDsKKzwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgc3VtID0wOworICAgIGRzdW09MDsKKyAgICBwcm9kdWN0PTE7CisJbG9naWNfYW5kPTE7CisJbG9naWNfb3I9MDsKKwliaXRfYW5kPTE7CisJYml0X29yPTA7CisJZXhjbHVzaXZfYml0X29yPTA7CisgICAgcmVzdWx0PTA7CisJZHQgPSAxLi8zLjsKKwlrbm93bl9zdW0gPSAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzI7Cis8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCs6c3VtKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvciAoaT0xO2k8PUxPT1BDT1VOVDtpKyspCisJeworCQlzdW09c3VtK2k7CisJfQorCisJaWYoa25vd25fc3VtIT1zdW0pCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBzdW0gd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mICVkXG4iLHN1bSxrbm93bl9zdW0pOyAKKwl9CisKKwlkaWZmID0gKExPT1BDT1VOVCooTE9PUENPVU5UKzEpKS8yOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC06ZGlmZik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IgKGk9MTtpPD1MT09QQ09VTlQ7KytpKQorCXsKKwkJZGlmZj1kaWZmLWk7CisJfQorCisJaWYoZGlmZiAhPSAwKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gZGlmZmVyZW5jZSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgMC5cbiIsZGlmZik7CisJfQorCisJLyogVGVzdHMgZm9yIGRvdWJsZXMgKi8KKwlkc3VtPTA7CisJZHB0PTE7CisJZm9yIChpPTA7aTxET1VCTEVfRElHSVRTOysraSkKKwl7CisJCWRwdCo9ZHQ7CisJfQorCWRrbm93bl9zdW0gPSAoMS1kcHQpLygxLWR0KTsKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigrOmRzdW0pPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yIChpPTA7aTxET1VCTEVfRElHSVRTOysraSkKKwl7CisJCWRzdW0gKz0gcG93KGR0LGkpOworCX0KKworCWlmKCBmYWJzKGRzdW0tZGtub3duX3N1bSkgPiByb3VuZGluZ19lcnJvciApCisJeworCQlyZXN1bHQrKzsgCisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gc3VtIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlZiBpbnN0ZWFkIG9mICVmIChEaWZmZXJlbmNlOiAlRSlcbiIsZHN1bSxka25vd25fc3VtLCBkc3VtLWRrbm93bl9zdW0pOworCX0KKworCWRwdD0xOworCisJZm9yIChpPTA7aTxET1VCTEVfRElHSVRTOysraSkKKwl7CisJCWRwdCo9ZHQ7CisJfQorCWZwcmludGYobG9nRmlsZSwiXG4iKTsKKwlkZGlmZiA9ICgxLWRwdCkvKDEtZHQpOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC06ZGRpZmYpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yIChpPTA7aTxET1VCTEVfRElHSVRTOysraSkKKwl7CisJCWRkaWZmIC09IHBvdyhkdCxpKTsKKwl9CisJaWYoIGZhYnMoZGRpZmYpID4gcm91bmRpbmdfZXJyb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBEaWZmZXJlbmNlIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlRSBpbnN0ZWFkIG9mIDAuMFxuIixkZGlmZik7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKjpwcm9kdWN0KTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTE7aTw9TUFYX0ZBQ1RPUjtpKyspCisJeworCQlwcm9kdWN0ICo9IGk7CisJfQorCisJa25vd25fcHJvZHVjdCA9IEtOT1dOX1BST0RVQ1Q7CisJaWYoa25vd25fcHJvZHVjdCAhPSBwcm9kdWN0KQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gUHJvZHVjdCB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgJWRcblxuIixwcm9kdWN0LGtub3duX3Byb2R1Y3QpOworCX0KKworCWZvcihpPTA7aTxMT09QQ09VTlQ7aSsrKQorCXsKKwkJbG9naWNzW2ldPTE7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJiY6bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworCX0KKwlpZighbG9naWNfYW5kKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gbG9naWMgQU5EIHBhcnQgMS5cbiIpOworCX0KKworCWxvZ2ljX2FuZCA9IDE7CisJbG9naWNzW0xPT1BDT1VOVC8yXT0wOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJiY6bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJbG9naWNfYW5kID0gbG9naWNfYW5kICYmIGxvZ2ljc1tpXTsKKwl9CisJaWYobG9naWNfYW5kKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gbG9naWMgQU5EIHBhcnQgMi5cbiIpOworCX0KKworCWZvcihpPTA7aTxMT09QQ09VTlQ7aSsrKQorCXsKKwkJbG9naWNzW2ldPTA7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofHw6bG9naWNfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQlsb2dpY19vciA9IGxvZ2ljX29yIHx8IGxvZ2ljc1tpXTsKKwl9CisJaWYobG9naWNfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDEuXG4iKTsKKwl9CisJbG9naWNfb3IgPSAwOworCWxvZ2ljc1tMT09QQ09VTlQvMl09MTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHx8OmxvZ2ljX29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJbG9naWNfb3IgPSBsb2dpY19vciB8fCBsb2dpY3NbaV07CisJfQorCWlmKCFsb2dpY19vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMi5cbiIpOworCX0KKworCisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQlsb2dpY3NbaV09MTsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigmOmJpdF9hbmQpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQliaXRfYW5kID0gKGJpdF9hbmQgJiBsb2dpY3NbaV0pOworCX0KKwlpZighYml0X2FuZCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEJJVCBBTkQgcGFydCAxLlxuIik7CisJfQorCisJYml0X2FuZCA9IDE7CisJbG9naWNzW0xPT1BDT1VOVC8yXT0wOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJjpiaXRfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJYml0X2FuZCA9IGJpdF9hbmQgJiBsb2dpY3NbaV07CisJfQorCWlmKGJpdF9hbmQpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMi5cbiIpOworCX0KKworCWZvcihpPTA7aTxMT09QQ09VTlQ7aSsrKQorCXsKKwkJbG9naWNzW2ldPTA7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofDpiaXRfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJfQorCWlmKGJpdF9vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEJJVCBPUiBwYXJ0IDFcbiIpOworCX0KKwliaXRfb3IgPSAwOworCWxvZ2ljc1tMT09QQ09VTlQvMl09MTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHw6Yml0X29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworCX0KKwlpZighYml0X29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gQklUIE9SIHBhcnQgMlxuIik7CisJfQorCisJZm9yKGk9MDtpPExPT1BDT1VOVDtpKyspCisJeworCQlsb2dpY3NbaV09MDsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiheOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKwl9CisJaWYoZXhjbHVzaXZfYml0X29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMVxuIik7CisJfQorCisJZXhjbHVzaXZfYml0X29yID0gMDsKKwlsb2dpY3NbTE9PUENPVU5ULzJdPTE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiheOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKwl9CisJaWYoIWV4Y2x1c2l2X2JpdF9vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDJcbiIpOworCX0KKyAgICA8L29tcHRzOm9ycGhhbj4KKwkvKnByaW50ZigiXG5SZXN1bHQ6JWRcbiIscmVzdWx0KTsqLworCXJldHVybiAocmVzdWx0PT0wKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfZmlyc3Rwcml2YXRlLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfZmlyc3Rwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkzMzgzOQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9zZWN0aW9uc19maXJzdHByaXZhdGUuYwpAQCAtMCwwICsxLDQ5IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBmaXJzdHByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgc2VjdGlvbnMgZmlyc3Rwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3BhcmFsbGVsX3NlY3Rpb25zX2ZpcnN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgaW50IHN1bTsKKyAgaW50IHN1bTA7CisgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgIGludCBrbm93bl9zdW07CisgIHN1bSA9NzsKKyAgc3VtMD0xMTsKKworPG9tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5maXJzdHByaXZhdGUoc3VtMCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUoc3VtMCk8L29tcHRzOmNyb3NzY2hlY2s+CisgIHsKKyNwcmFnbWEgb21wIHNlY3Rpb24gCisgICAgeworI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgIHsKKwlzdW09IHN1bStzdW0wOworICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAvKmVuZCBvZiBjcml0aWNhbCAqLworICAgIH0gICAgCisjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgIHsKKwlzdW09IHN1bStzdW0wOworICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAvKmVuZCBvZiBjcml0aWNhbCAqLworICAgIH0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgeworCXN1bT0gc3VtK3N1bTA7CisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIC8qZW5kIG9mIGNyaXRpY2FsICovCisgICAgfSAgICAgICAgICAgICAgIAorICAgIH0gICAgICAvKmVuZCBvZiBwYXJhbGxlbCBzZWN0aW9ucyovCis8L29tcHRzOm9ycGhhbj4KK2tub3duX3N1bT0xMSozKzc7CityZXR1cm4gKGtub3duX3N1bT09c3VtKTsgCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIG9mIGNoZWNrX3NlY3Rpb25fZmlyc3Rwcml2YXRlKi8KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfbGFzdHByaXZhdGUuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9zZWN0aW9uc19sYXN0cHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1YWU1ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfbGFzdHByaXZhdGUuYwpAQCAtMCwwICsxLDcwIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBsYXN0cHJpdmF0ZSBkaXJlY3RpdmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBzZWN0aW9ucyBsYXN0cHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbCxvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9zZWN0aW9uc19sYXN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgaW50IHN1bTsKKyAgaW50IHN1bTA7CisgIGludCBpOworICBpbnQgaTA7CisgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgIGludCBrbm93bl9zdW07CisgIHN1bSA9MDsKKyAgc3VtMCA9IDA7CisgIGkwID0gLTE7CisgIAorICA8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpLHN1bTApIDxvbXB0czpjaGVjaz5sYXN0cHJpdmF0ZShpMCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUoaTApPC9vbXB0czpjcm9zc2NoZWNrPgorICAgIHsKKyNwcmFnbWEgb21wIHNlY3Rpb24gIAorICAgICAgeworCXN1bTA9MDsKKwlmb3IgKGk9MTtpPDQwMDtpKyspCisJICB7CisJICAgIHN1bTA9c3VtMCtpOworCSAgICBpMD1pOworCSAgfQorI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisJICBzdW09IHN1bStzdW0wOworCX0gICAgICAgICAgICAgICAgICAgICAgICAgLyplbmQgb2YgY3JpdGljYWwqLworICAgICAgfS8qIGVuZCBvZiBzZWN0aW9uICovCisjcHJhZ21hIG9tcCBzZWN0aW9uIAorICAgICAgeworCXN1bTA9MDsKKwlmb3IoaT00MDA7aTw3MDA7aSsrKQorCSAgeworCSAgICBzdW0wPXN1bTAraTsgICAgICAgICAgICAgICAgICAgICAgIC8qZW5kIG9mIGZvciovCisJICAgIGkwPWk7CisJICB9CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKwkgIHN1bT0gc3VtK3N1bTA7CisJfSAgICAgICAgICAgICAgICAgICAgICAgICAvKmVuZCBvZiBjcml0aWNhbCovCisgICAgICB9CisjcHJhZ21hIG9tcCBzZWN0aW9uIAorICAgICAgeworCXN1bTA9MDsKKwlmb3IoaT03MDA7aTwxMDAwO2krKykKKwkgIHsKKwkgICAgc3VtMD1zdW0wK2k7CisgICAgICBpMD1pOworCSAgfQorI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisJICBzdW09IHN1bStzdW0wOworCX0gICAgICAgICAgICAgICAgICAgICAgICAgLyplbmQgb2YgY3JpdGljYWwqLworICAgICAgfQorICAgIH0vKiBlbmQgb2YgcGFyYWxsZWwgc2VjdGlvbnMqLworICA8L29tcHRzOm9ycGhhbj4gCisgIGtub3duX3N1bT0oOTk5KjEwMDApLzI7CisgIHJldHVybiAoKGtub3duX3N1bT09c3VtKSAmJiAoaTA9PTk5OSkgKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfcHJpdmF0ZS5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3NlY3Rpb25zX3ByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWZlNDE0Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3NlY3Rpb25zX3ByaXZhdGUuYwpAQCAtMCwwICsxLDY1IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfc2VjdGlvbnNfcHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgaW50IHN1bTsKKyAgaW50IHN1bTA7CisgIGludCBpOworICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICBpbnQga25vd25fc3VtOworICBzdW0gPSA3OworICBzdW0wPTA7CisKKzxvbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKDxvbXB0czpjaGVjaz5zdW0wLDwvb21wdHM6Y2hlY2s+IGkpCisgIHsKKyNwcmFnbWEgb21wIHNlY3Rpb24gCisgICAgeworICAgICAgPG9tcHRzOmNoZWNrPgorICAgICAgc3VtMD0wOworICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgIGZvciAoaT0xO2k8NDAwO2krKykKKwlzdW0wPXN1bTAraTsKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICB7CisJc3VtPSBzdW0rc3VtMDsKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgLyplbmQgb2YgY3JpdGljYWwgKi8KKyAgICB9ICAgIAorI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIDxvbXB0czpjaGVjaz4KKyAgICAgIHN1bTA9MDsKKyAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICBmb3IoaT00MDA7aTw3MDA7aSsrKQorCXN1bTA9c3VtMCtpOworI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgIHsKKwlzdW09IHN1bStzdW0wOworICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAvKmVuZCBvZiBjcml0aWNhbCAqLworICAgIH0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICA8b21wdHM6Y2hlY2s+CisgICAgICBzdW0wPTA7CisgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgZm9yKGk9NzAwO2k8MTAwMDtpKyspCisJc3VtMD1zdW0wK2k7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgeworCXN1bT0gc3VtK3N1bTA7CisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIC8qZW5kIG9mIGNyaXRpY2FsICovCisgICAgfSAgICAgICAgICAgICAgIAorICB9ICAgICAgICAvKmVuZCBvZiBwYXJhbGxlbCBzZWN0aW9ucyovCis8L29tcHRzOm9ycGhhbj4KK2tub3duX3N1bT0oOTk5KjEwMDApLzIrNzsKK3JldHVybiAoa25vd25fc3VtPT1zdW0pOyAKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgb2YgY2hlY2tfc2VjdGlvbl9wcml2YXRlKi8KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfcmVkdWN0aW9uLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfcmVkdWN0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FkZWE2YQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9zZWN0aW9uc19yZWR1Y3Rpb24uYwpAQCAtMCwwICsxLDU2OCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcmVkdWN0aW9uIGRpcmVjdGl2ZSB3aXRoIGFsbCBpdHMgb3B0aW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgc2VjdGlvbnMgcmVkdWN0aW9uPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9zZWN0aW9uc19yZWR1Y3Rpb248L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworCTxvbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQgc3VtOworCWludCBrbm93bl9zdW07CQorCWRvdWJsZSBkcHQ7CisgICAgZG91YmxlIGRzdW07CisJZG91YmxlIGRrbm93bl9zdW07CisJZG91YmxlIGR0PTAuNTsJCQkJLyogYmFzZSBvZiBnZW9tZXRyaWMgcm93IGZvciArIGFuZCAtIHRlc3QqLworCWRvdWJsZSByb3VuZGluZ19lcnJvcj0gMS5FLTU7CisJaW50IGRpZmY7CisJZG91YmxlIGRkaWZmOworCWludCBwcm9kdWN0OworCWludCBrbm93bl9wcm9kdWN0OworCWludCBsb2dpY19hbmQ7CisJaW50IGJpdF9hbmQ7CisJaW50IGxvZ2ljX29yOworCWludCBiaXRfb3I7CisJaW50IGV4Y2x1c2l2X2JpdF9vcjsKKwlpbnQgbG9naWNzWzEwMDBdOworCWludCBpOworCWludCByZXN1bHQ7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAKKyAgICBzdW0gPSA3OworICAgIGRzdW09MDsKKyAgICBwcm9kdWN0ID0xOworICAgIGRwdCA9IDE7CisJbG9naWNfYW5kPTE7CisJYml0X2FuZD0xOworCWxvZ2ljX29yPTA7CisJYml0X29yPTA7CisJZXhjbHVzaXZfYml0X29yPTA7CisgICAgcmVzdWx0ID0wOworCS8qICBpbnQgbXlfaXNsYXJnZXI7Ki8KKwkvKmludCBpc19sYXJnZXI9MTsqLworCWtub3duX3N1bSA9ICg5OTkqMTAwMCkvMis3OworCisgICAgPG9tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigrOnN1bSk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT0xO2k8MzAwO2krKykKKwkJCXsKKwkJCQlzdW09c3VtK2k7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTMwMDtpPDcwMDtpKyspCisJCQl7CisJCQkJc3VtPXN1bStpOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT03MDA7aTwxMDAwO2krKykKKwkJCXsKKwkJCQlzdW09c3VtK2k7CisJCQl9CisJCX0KKwl9CisKKwlpZihrbm93bl9zdW0hPXN1bSkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIHN1bSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgJWQuXG4iLHN1bSwga25vd25fc3VtKTsKKwl9CisKKwlkaWZmID0gKDk5OSoxMDAwKS8yOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC06ZGlmZik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT0xO2k8MzAwO2krKykKKwkJCXsKKwkJCQlkaWZmPWRpZmYtaTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MzAwO2k8NzAwO2krKykKKwkJCXsKKwkJCQlkaWZmPWRpZmYtaTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9NzAwO2k8MTAwMDtpKyspCisJCQl7CisJCQkJZGlmZj1kaWZmLWk7CisJCQl9CisJCX0KKwl9CisKKworCWlmKGRpZmYgIT0gMCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIERpZmZlcmVuY2Ugd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mIDAuXG4iLGRpZmYpOworCX0KKwlmb3IgKGk9MDtpPDIwOysraSkKKwl7CisJCWRwdCo9ZHQ7CisJfQorCWRrbm93bl9zdW0gPSAoMS1kcHQpLygxLWR0KTsKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigrOmRzdW0pPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MDtpPDY7KytpKQorCQkJeworCQkJCWRzdW0gKz0gcG93KGR0LGkpOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT02O2k8MTI7KytpKQorCQkJeworCQkJCWRzdW0gKz0gcG93KGR0LGkpOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT0xMjtpPDIwOysraSkKKwkJCXsKKwkJCQlkc3VtICs9IHBvdyhkdCxpKTsKKwkJCX0KKwkJfQorCX0KKworCisJaWYoIGZhYnMoZHN1bS1ka25vd25fc3VtKSA+IHJvdW5kaW5nX2Vycm9yICkKKwl7CisJCXJlc3VsdCsrOyAKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBzdW0gd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICVmIGluc3RlYWQgb2YgJWYgKERpZmZlcmVuY2U6ICVFKVxuIixkc3VtLGRrbm93bl9zdW0sIGRzdW0tZGtub3duX3N1bSk7CisJfQorCisJZHB0PTE7CisKKwlmb3IgKGk9MDtpPDIwOysraSkKKwl7CisJCWRwdCo9ZHQ7CisJfQorCWZwcmludGYobG9nRmlsZSwiXG4iKTsKKwlkZGlmZiA9ICgxLWRwdCkvKDEtZHQpOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC06ZGRpZmYpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MDtpPDY7KytpKQorCQkJeworCQkJCWRkaWZmIC09IHBvdyhkdCxpKTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9NjtpPDEyOysraSkKKwkJCXsKKwkJCQlkZGlmZiAtPSBwb3coZHQsaSk7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTEyO2k8MjA7KytpKQorCQkJeworCQkJCWRkaWZmIC09IHBvdyhkdCxpKTsKKwkJCX0KKwkJfQorCX0KKworCWlmKCBmYWJzKGRkaWZmKSA+IHJvdW5kaW5nX2Vycm9yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gRGlmZmVyZW5jZSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJUUgaW5zdGVhZCBvZiAwLjBcbiIsZGRpZmYpOworCX0KKworCWtub3duX3Byb2R1Y3QgPSAzNjI4ODAwOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCo6cHJvZHVjdCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsJCisJCQlmb3IoaT0xO2k8MztpKyspCisJCQl7CisJCQkJcHJvZHVjdCAqPSBpOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvcihpPTM7aTw3O2krKykKKwkJCXsKKwkJCQlwcm9kdWN0ICo9IGk7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yKGk9NztpPDExO2krKykKKwkJCXsKKwkJCQlwcm9kdWN0ICo9IGk7CisJCQl9CisJCX0KKwl9CisKKworCWlmKGtub3duX3Byb2R1Y3QgIT0gcHJvZHVjdCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIFByb2R1Y3Qgd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mICVkXG4iLHByb2R1Y3Qsa25vd25fcHJvZHVjdCk7CisJfQorCisJZm9yKGk9MDtpPDEwMDA7aSsrKQorCXsKKwkJbG9naWNzW2ldPTE7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJiY6bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTE7aTwzMDA7aSsrKQorCQkJeworCQkJCWxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MzAwO2k8NzAwO2krKykKKwkJCXsKKwkJCQlsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTcwMDtpPDEwMDA7aSsrKQorCQkJeworCQkJCWxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKwkJCX0KKwkJfQorCX0KKworCWlmKCFsb2dpY19hbmQpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAxXG4iKTsKKwl9CisKKwlsb2dpY19hbmQgPSAxOworCWxvZ2ljc1s1MDFdID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCYmOmxvZ2ljX2FuZCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT0xO2k8MzAwO2krKykKKwkJCXsKKwkJCQlsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTMwMDtpPDcwMDtpKyspCisJCQl7CisJCQkJbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT03MDA7aTwxMDAwO2krKykKKwkJCXsKKwkJCQlsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisJCQl9CisJCX0KKwl9CisKKwlpZihsb2dpY19hbmQpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAyIik7CisJfQorCisJZm9yKGk9MDtpPDEwMDA7aSsrKQorCXsKKwkJbG9naWNzW2ldPTA7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofHw6bG9naWNfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MTtpPDMwMDtpKyspCisJCQl7CisJCQkJbG9naWNfb3IgPSAobG9naWNfb3IgfHwgbG9naWNzW2ldKTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MzAwO2k8NzAwO2krKykKKwkJCXsKKwkJCQlsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT03MDA7aTwxMDAwO2krKykKKwkJCXsKKwkJCQlsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworCQkJfQorCQl9CisJfQorCisJaWYobG9naWNfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDFcbiIpOworCX0KKworCWxvZ2ljX29yID0gMDsKKwlsb2dpY3NbNTAxXT0xOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofHw6bG9naWNfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MTtpPDMwMDtpKyspCisJCQl7CisJCQkJbG9naWNfb3IgPSAobG9naWNfb3IgfHwgbG9naWNzW2ldKTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MzAwO2k8NzAwO2krKykKKwkJCXsKKwkJCQlsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT03MDA7aTwxMDAwO2krKykKKwkJCXsKKwkJCQlsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworCQkJfQorCQl9CisJfQorCisJaWYoIWxvZ2ljX29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAyXG4iKTsKKwl9CisKKwlmb3IoaT0wO2k8MTAwMDsrK2kpCisJeworCQlsb2dpY3NbaV09MTsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigmOmJpdF9hbmQpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CQorCQkJZm9yKGk9MDtpPDMwMDsrK2kpCisJCQl7CisJCQkJYml0X2FuZCA9IChiaXRfYW5kICYgbG9naWNzW2ldKTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CQorCQkJZm9yKGk9MzAwO2k8NzAwOysraSkKKwkJCXsKKwkJCQliaXRfYW5kID0gKGJpdF9hbmQgJiBsb2dpY3NbaV0pOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsJCisJCQlmb3IoaT03MDA7aTwxMDAwOysraSkKKwkJCXsKKwkJCQliaXRfYW5kID0gKGJpdF9hbmQgJiBsb2dpY3NbaV0pOworCQkJfQorCQl9CisJfQorCWlmKCFiaXRfYW5kKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDFcbiIpOworCX0KKworCWJpdF9hbmQgPSAxOworCWxvZ2ljc1s1MDFdPTA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigmOmJpdF9hbmQpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IoaT0wO2k8MzAwOysraSkKKwkJCXsKKwkJCQliaXRfYW5kID0gYml0X2FuZCAmIGxvZ2ljc1tpXTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IoaT0zMDA7aTw3MDA7KytpKQorCQkJeworCQkJCWJpdF9hbmQgPSBiaXRfYW5kICYgbG9naWNzW2ldOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvcihpPTcwMDtpPDEwMDA7KytpKQorCQkJeworCQkJCWJpdF9hbmQgPSBiaXRfYW5kICYgbG9naWNzW2ldOworCQkJfQorCQl9CisJfQorCWlmKGJpdF9hbmQpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMiIpOworCX0KKworCWZvcihpPTA7aTwxMDAwO2krKykKKwl7CisJCWxvZ2ljc1tpXT0wOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHw6Yml0X29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yKGk9MDtpPDMwMDsrK2kpCisJCQl7CisJCQkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvcihpPTMwMDtpPDcwMDsrK2kpCisJCQl7CisJCQkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvcihpPTcwMDtpPDEwMDA7KytpKQorCQkJeworCQkJCWJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKwkJCX0KKwkJfQorCX0KKwlpZihiaXRfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgT1IgcGFydCAxXG4iKTsKKwl9CisJYml0X29yID0gMDsKKwlsb2dpY3NbNTAxXT0xOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofDpiaXRfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IoaT0wO2k8MzAwOysraSkKKwkJCXsKKwkJCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yKGk9MzAwO2k8NzAwOysraSkKKwkJCXsKKwkJCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yKGk9NzAwO2k8MTAwMDsrK2kpCisJCQl7CisJCQkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworCQkJfQorCQl9CisJfQorCWlmKCFiaXRfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgT1IgcGFydCAyXG4iKTsKKwl9CisKKwlmb3IoaT0wO2k8MTAwMDtpKyspCisJeworCQlsb2dpY3NbaV09MDsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiheOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsJCisJCQlmb3IoaT0wO2k8MzAwOysraSkKKwkJCXsKKwkJCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJewkKKwkJCWZvcihpPTMwMDtpPDcwMDsrK2kpCisJCQl7CisJCQkJZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsJCisJCQlmb3IoaT03MDA7aTwxMDAwOysraSkKKwkJCXsKKwkJCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJCQl9CisJCX0KKwl9CisJaWYoZXhjbHVzaXZfYml0X29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMVxuIik7CisJfQorCisJZXhjbHVzaXZfYml0X29yID0gMDsKKwlsb2dpY3NbNTAxXT0xOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IoaT0wO2k8MzAwOysraSkKKwkJCXsKKwkJCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yKGk9MzAwO2k8NzAwOysraSkKKwkJCXsKKwkJCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yKGk9NzAwO2k8MTAwMDsrK2kpCisJCQl7CisJCQkJZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworCQkJfQorCQl9CisJfQorCWlmKCFleGNsdXNpdl9iaXRfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAyXG4iKTsKKwl9Cis8L29tcHRzOm9ycGhhbj4KKwkvKnByaW50ZigiXG5SZXN1bHQ6JWRcbiIscmVzdWx0KTsqLworCXJldHVybiAocmVzdWx0PT0wKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfc2hhcmVkLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfc2hhcmVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYyOGUzOAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9zaGFyZWQuYwpAQCAtMCwwICsxLDQzIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIHNoYXJlZCBvcHRpb24gb2YgdGhlIHBhcmFsbGVsIGNvbnN0cnVjdC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIHNoYXJlZDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9zaGFyZWQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICA8b21wdHM6b3JwaGFuOnZhcnM+CisgIGludCBpOworICBpbnQgc3VtOworICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICBzdW0gPSAwOworICBpbnQga25vd25fc3VtOworICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIgOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5zaGFyZWQoc3VtKTwvb21wdHM6Y2hlY2s+IDxvbXB0czpjcm9zc2NoZWNrPmZpcnN0cHJpdmF0ZShzdW0pPC9vbXB0czpjcm9zc2NoZWNrPgorICB7CisgICAgPG9tcHRzOm9ycGhhbj4KKyAgICBpbnQgbXlzdW0gPSAwOworI3ByYWdtYSBvbXAgZm9yCisJZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykKKwl7CisJICBteXN1bSA9IG15c3VtICsgaTsKKwl9IAorI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisJICBzdW0gPSBzdW0gKyBteXN1bTsKKwl9ICAgLyogZW5kIG9mIGNyaXRpY2FsICovCis8L29tcHRzOm9ycGhhbj4KKworICB9ICAgLyogZW5kIG9mIHBhcmFsbGVsICovCisgIGlmIChrbm93bl9zdW0gIT0gc3VtKSB7CisgIAlmcHJpbnRmKGxvZ0ZpbGUsICJLTk9XTl9TVU0gPSAlZDsgU1VNID0gJWRcbiIsIGtub3duX3N1bSwgc3VtKTsKKyAgfQorICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9zZWN0aW9uX2ZpcnN0cHJpdmF0ZS5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NlY3Rpb25fZmlyc3Rwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAzNWQxMAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9zZWN0aW9uX2ZpcnN0cHJpdmF0ZS5jCkBAIC0wLDAgKzEsNTIgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHNlY3Rpb24gZmlyc3Rwcml2YXRlIGRpcmVjdGl2ZSBieSBhZGRpbmcgYSB2YXJpYWJsZSB3aGljaCBpcyBkZWZpbmVkIGJlZm9yZSB0aGUgcGFyYWxsZWwgcmVnaW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZmlyc3Rwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3NlY3Rpb25fZmlyc3Rwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKwk8b21wdHM6b3JwaGFuOnZhcnM+CisJICAgIGludCBzdW07CisJICAgIGludCBzdW0wOworCTwvb21wdHM6b3JwaGFuOnZhcnM+CisJaW50IGtub3duX3N1bTsKKworCXN1bTAgPSAxMTsKKwlzdW0gPSA3OworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKwl7Cis8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5maXJzdHByaXZhdGUoc3VtMCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUoc3VtMCk8L29tcHRzOmNyb3NzY2hlY2s+CisJCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24gCisJCQl7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCQkJCXsKKwkJCQkJc3VtID0gc3VtICsgc3VtMDsKKwkJCQl9IC8qZW5kIG9mIGNyaXRpY2FsICovCisJCQl9ICAgIAorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkJCQl7CisJCQkJCXN1bSA9IHN1bSArIHN1bTA7CisJCQkJfSAvKmVuZCBvZiBjcml0aWNhbCAqLworCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkJCQl7CisJCQkJCXN1bSA9IHN1bSArIHN1bTA7CisJCQkJfSAvKmVuZCBvZiBjcml0aWNhbCAqLworCQkJfSAgICAgICAgICAgICAgIAorCQl9IC8qZW5kIG9mIHNlY3Rpb25zKi8KKzwvb21wdHM6b3JwaGFuPgorCX0gLyogZW5kIG9mIHBhcmFsbGVsICovCisJa25vd25fc3VtID0gMTEgKiAzICsgNzsKKwlyZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOyAKK30gLyogZW5kIG9mIGNoZWNrX3NlY3Rpb25fZmlyc3Rwcml2YXRlKi8KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfc2VjdGlvbl9sYXN0cHJpdmF0ZS5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NlY3Rpb25fbGFzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmFlMGRmCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NlY3Rpb25fbGFzdHByaXZhdGUuYwpAQCAtMCwwICsxLDczIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBzZWN0aW9uIGxhc3Rwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHNlY3Rpb24gbGFzdHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfc2VjdGlvbl9sYXN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBpMCA9IC0xOworCWludCBzdW0gPSAwOworICAgICAgICBpbnQgaTsKKyAgICAgICAgaW50IHN1bTAgPSAwOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IGtub3duX3N1bTsKKworICAgIGkwID0gLTE7CisgICAgc3VtID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5sYXN0cHJpdmF0ZShpMCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUoaTApPC9vbXB0czpjcm9zc2NoZWNrPiBwcml2YXRlKGksc3VtMCkKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uICAKKwkgICAgeworCQlzdW0wID0gMDsKKwkJZm9yIChpID0gMTsgaSA8IDQwMDsgaSsrKQorCQl7CisJCSAgICBzdW0wID0gc3VtMCArIGk7CisJCSAgICBpMCA9IGk7CisJCX0KKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJCXsKKwkJICAgIHN1bSA9IHN1bSArIHN1bTA7CisJCX0gLyplbmQgb2YgY3JpdGljYWwqLworCSAgICB9IC8qIGVuZCBvZiBzZWN0aW9uICovCisjcHJhZ21hIG9tcCBzZWN0aW9uIAorCSAgICB7CisJCXN1bTAgPSAwOworCQlmb3IoaSA9IDQwMDsgaSA8IDcwMDsgaSsrKQorCQl7CisJCSAgICBzdW0wID0gc3VtMCArIGk7CisJCSAgICBpMCA9IGk7CisJCX0KKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJCXsKKwkJICAgIHN1bSA9IHN1bSArIHN1bTA7CisJCX0gLyplbmQgb2YgY3JpdGljYWwqLworCSAgICB9CisjcHJhZ21hIG9tcCBzZWN0aW9uIAorCSAgICB7CisJCXN1bTAgPSAwOworCQlmb3IoaSA9IDcwMDsgaSA8IDEwMDA7IGkrKykKKwkJeworCQkgICAgc3VtMCA9IHN1bTAgKyBpOworCQkgICAgaTAgPSBpOworCQl9CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCQl7CisJCSAgICBzdW0gPSBzdW0gKyBzdW0wOworCQl9IC8qZW5kIG9mIGNyaXRpY2FsKi8KKwkgICAgfQorCX0gLyogZW5kIG9mIHNlY3Rpb25zKi8KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9IC8qIGVuZCBvZiBwYXJhbGxlbCovICAgIAorICAgIGtub3duX3N1bSA9ICg5OTkgKiAxMDAwKSAvIDI7CisgICAgcmV0dXJuICgoa25vd25fc3VtID09IHN1bSkgJiYgKGkwID09IDk5OSkgKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfc2VjdGlvbl9wcml2YXRlLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfc2VjdGlvbl9wcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk5YTJmOAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9zZWN0aW9uX3ByaXZhdGUuYwpAQCAtMCwwICsxLDY5IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBzZWN0aW9uIHByaXZhdGUgZGlyZWN0aXZlIGJ5IHVwY291bnRpbmcgYSB2YXJpYWJsZSBpbiBhIHRvIHNldmVyYWwgc2VjdGlvbnMgc3BsaXR0ZWQgbG9vcC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHNlY3Rpb24gcHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9zZWN0aW9uX3ByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgc3VtOworCWludCBzdW0wOworICAgIGludCBpOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IGtub3duX3N1bTsKKworICAgIHN1bSA9IDc7CisgICAgc3VtMCA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworCTxvbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnByaXZhdGUoc3VtMCxpKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShpKTwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uIAorCSAgICB7CisJCTxvbXB0czpjaGVjaz4KKyAgICAgICAgc3VtMCA9IDA7CisgICAgICAgIDwvb21wdHM6Y2hlY2s+CisJCWZvciAoaSA9IDE7IGkgPCA0MDA7IGkrKykKKwkJICAgIHN1bTAgPSBzdW0wICsgaTsKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJCXsKKwkJICAgIHN1bSA9IHN1bSArIHN1bTA7CisJCX0gLyplbmQgb2YgY3JpdGljYWwgKi8KKwkgICAgfSAgICAKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkgICAgeworICAgICAgICAgIDxvbXB0czpjaGVjaz4KKwkJc3VtMCA9IDA7CisgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKwkJZm9yIChpID0gNDAwOyBpIDwgNzAwOyBpKyspCisJCSAgICBzdW0wID0gc3VtMCArIGk7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCQl7CisJCSAgICBzdW0gPSBzdW0gKyBzdW0wOworCQl9IC8qZW5kIG9mIGNyaXRpY2FsICovCisJICAgIH0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkgICAgeworICAgICAgICAgIDxvbXB0czpjaGVjaz4KKwkJc3VtMCA9IDA7CisgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKwkJZm9yIChpID0gNzAwOyBpIDwgMTAwMDsgaSsrKQorCQkgICAgc3VtMCA9IHN1bTAgKyBpOworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkJeworCQkgICAgc3VtID0gc3VtICsgc3VtMDsKKwkJfSAvKmVuZCBvZiBjcml0aWNhbCAqLworCSAgICB9ICAgICAgICAgICAgICAgCisJfSAvKmVuZCBvZiBzZWN0aW9ucyovCisJPC9vbXB0czpvcnBoYW4+CisgICAgfSAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKyAgICBrbm93bl9zdW0gPSAoOTk5ICogMTAwMCkgLyAyICsgNzsKKyAgICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOyAKK30gLyogZW5kIG9mIGNoZWNrX3NlY3Rpb25fcHJpdmF0ZSovCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NlY3Rpb25zX25vd2FpdC5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NlY3Rpb25zX25vd2FpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MWEzNzUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfc2VjdGlvbnNfbm93YWl0LmMKQEAgLTAsMCArMSw2NiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBmb3Igbm93YWl0IGRpcmVjdGl2ZS4gSXQgZmlsbHMgYW4gYXJyYXkgd2l0aCB2YWx1ZXMgYW5kIG9wZXJhdGVzIG9uIHRoZXNlIGluIHRoZSBmb2xsb3dpbmcuPC9vbXB0czpkZXNjcmlwdGlvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIHNlY3Rpb25zIG5vd2FpdDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnZlcnNpb24+MS4wPC9vbXB0czp2ZXJzaW9uPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBwYXJhbGxlbCBzZWN0aW9ucywgb21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfc2VjdGlvbnNfbm93YWl0PC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKwk8b21wdHM6b3JwaGFuOnZhcnM+CisJCWludCByZXN1bHQ7CisJCWludCBjb3VudDsKKwk8L29tcHRzOm9ycGhhbjp2YXJzPgorCWludCBqOworCisJcmVzdWx0ID0gMDsKKwljb3VudCA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorCXsKKwk8b21wdHM6b3JwaGFuPgorCWludCByYW5rOworCisJcmFuayA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKwkKKyNwcmFnbWEgb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5ub3dhaXQ8L29tcHRzOmNoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZnByaW50ZiAobG9nRmlsZSwgIlRocmVhZCBuciAlZCBlbnRlcnMgZmlyc3Qgc2VjdGlvbiBhbmQgZ2V0cyBzbGVlcGluZy5cbiIsIHJhbmspOworCQkJCW15X3NsZWVwKFNMRUVQVElNRSk7CisJCQkJY291bnQgPSAxOworCQkJCWZwcmludGYgKGxvZ0ZpbGUsICJUaHJlYWQgbnIgJWQgd29rZSB1cCBhbiBzZXQgY291bnQgdG8gMS5cbiIsIHJhbmspOworI3ByYWdtYSBvbXAgZmx1c2goY291bnQpCisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZnByaW50ZiAobG9nRmlsZSwgIlRocmVhZCBuciAlZCBleGVjdXRlZCB3b3JrIGluIHRoZSBmaXJzdCBzZWN0aW9uLlxuIiwgcmFuayk7CisJCQl9CisJCX0KKy8qIEJlZ2luIG9mIHNlY29uZCBzZWN0aW9ucyBlbnZpcm9ubWVudCAqLworI3ByYWdtYSBvbXAgc2VjdGlvbnMKKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZwcmludGYgKGxvZ0ZpbGUsICJUaHJlYWQgbnIgJWQgZXhlY3V0ZWQgd29yayBpbiB0aGUgc2Vjb25kIHNlY3Rpb24uXG4iLCByYW5rKTsKKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmcHJpbnRmIChsb2dGaWxlLCAiVGhyZWFkIG5yICVkIGV4ZWN1dGVkIHdvcmsgaW4gdGhlIHNlY29uZCBzZWN0aW9uIGFuZCBjb250cm9scyB0aGUgdmFsdWUgb2YgY291bnRcbiIsIHJhbmspOworCQkJCWlmIChjb3VudCA9PSAwKQorCQkJCQlyZXN1bHQgPSAxOworCQkJCWZwcmludGYgKGxvZ0ZpbGUsICJjb3V0IHdhcyAlZCIsIGNvdW50KTsKKwkJCX0KKwkJfQorCTwvb21wdHM6b3JwaGFuPgorCX0KKwkKKwlyZXR1cm4gcmVzdWx0OworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9zZWN0aW9uc19yZWR1Y3Rpb24uYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9zZWN0aW9uc19yZWR1Y3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTc4MjlhCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NlY3Rpb25zX3JlZHVjdGlvbi5jCkBAIC0wLDAgKzEsNjEzIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBzZWN0aW9ucyByZWR1Y3Rpb24gZGlyZWN0aXZlIHdpdGggYWxsIGl0cyBvcHRpb25zLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgc2VjdGlvbnMgcmVkdWN0aW9uPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9zZWN0aW9uc19yZWR1Y3Rpb248L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworCTxvbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQgc3VtOworCWludCBrbm93bl9zdW07CisJZG91YmxlIGRwdCxkc3VtOworCWRvdWJsZSBka25vd25fc3VtOworCWRvdWJsZSBkdD0wLjU7CQkJCS8qIGJhc2Ugb2YgZ2VvbWV0cmljIHJvdyBmb3IgKyBhbmQgLSB0ZXN0Ki8KKwlkb3VibGUgcm91bmRpbmdfZXJyb3I9IDEuRS05OworCWludCBkaWZmOworCWRvdWJsZSBkZGlmZjsKKwlpbnQgcHJvZHVjdDsKKwlpbnQga25vd25fcHJvZHVjdDsKKwlpbnQgbG9naWNfYW5kOworCWludCBiaXRfYW5kOworCWludCBsb2dpY19vcjsKKwlpbnQgYml0X29yOworCWludCBleGNsdXNpdl9iaXRfb3I7CisJaW50IGxvZ2ljc1sxMDAwXTsKKwlpbnQgaTsKKwlpbnQgcmVzdWx0OworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisJLyogIGludCBteV9pc2xhcmdlcjsqLworCS8qaW50IGlzX2xhcmdlcj0xOyovCisKKyAgICBzdW0gPTc7CisgICAgZHB0ID0xOworICAgIGRzdW09MDsKKyAgICBwcm9kdWN0ID0xOworCWxvZ2ljX2FuZD0xOworCWJpdF9hbmQ9MTsKKwlsb2dpY19vcj0wOworCWJpdF9vcj0wOworCWV4Y2x1c2l2X2JpdF9vcj0wOworICAgIHJlc3VsdCA9IDA7CisJZHQgPSAxLi8zLjsKKwlrbm93bl9zdW0gPSAoOTk5KjEwMDApLzIrNzsKKzxvbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCBwYXJhbGxlbAorCXsKKworI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCs6c3VtKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTE7aTwzMDA7aSsrKQorCQkJCXsKKwkJCQkJc3VtPXN1bStpOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MzAwO2k8NzAwO2krKykKKwkJCQl7CisJCQkJCXN1bT1zdW0raTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTcwMDtpPDEwMDA7aSsrKQorCQkJCXsKKwkJCQkJc3VtPXN1bStpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWlmKGtub3duX3N1bSE9c3VtKQorCXsKKwkJKytyZXN1bHQ7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gc3VtIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAlZFxuIiwgc3VtLGtub3duX3N1bSk7CisJfQorCisJZGlmZiA9ICg5OTkqMTAwMCkvMjsKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisJeworI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC06ZGlmZik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT0xO2k8MzAwO2krKykKKwkJCQl7CisJCQkJCWRpZmY9ZGlmZi1pOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MzAwO2k8NzAwO2krKykKKwkJCQl7CisJCQkJCWRpZmY9ZGlmZi1pOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9NzAwO2k8MTAwMDtpKyspCisJCQkJeworCQkJCQlkaWZmPWRpZmYtaTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlpZihkaWZmICE9IDApCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBEaWZmZXJlbmNlIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAwLlxuIixkaWZmKTsKKwl9CisKKwlmb3IgKGk9MDtpPDIwOysraSkKKwl7CisJCWRwdCo9ZHQ7CisJfQorCWRrbm93bl9zdW0gPSAoMS1kcHQpLygxLWR0KTsKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisJeworI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCs6ZHN1bSk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT0wO2k8NjsrK2kpCisJCQkJeworCQkJCQlkc3VtICs9IHBvdyhkdCxpKTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTY7aTwxMjsrK2kpCisJCQkJeworCQkJCQlkc3VtICs9IHBvdyhkdCxpKTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTEyO2k8MjA7KytpKQorCQkJCXsKKwkJCQkJZHN1bSArPSBwb3coZHQsaSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYoIGZhYnMoZHN1bS1ka25vd25fc3VtKSA+IHJvdW5kaW5nX2Vycm9yICkKKwl7CisJCXJlc3VsdCsrOyAKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBzdW0gd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICVmIGluc3RlYWQgb2YgJWYgKERpZmZlcmVuY2U6ICVFKVxuIixkc3VtLGRrbm93bl9zdW0sIGRzdW0tZGtub3duX3N1bSk7CisJfQorCisJZHB0PTE7CisKKwlmb3IgKGk9MDtpPDIwOysraSkKKwl7CisJCWRwdCo9ZHQ7CisJfQorCWZwcmludGYobG9nRmlsZSwiXG4iKTsKKwlkZGlmZiA9ICgxLWRwdCkvKDEtZHQpOworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLTpkZGlmZik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT0wO2k8NjsrK2kpCisJCQkJeworCQkJCQlkZGlmZiAtPSBwb3coZHQsaSk7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT02O2k8MTI7KytpKQorCQkJCXsKKwkJCQkJZGRpZmYgLT0gcG93KGR0LGkpOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MTI7aTwyMDsrK2kpCisJCQkJeworCQkJCQlkZGlmZiAtPSBwb3coZHQsaSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYoIGZhYnMoZGRpZmYpID4gcm91bmRpbmdfZXJyb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBEaWZmZXJlbmNlIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlRSBpbnN0ZWFkIG9mIDAuMFxuIixkZGlmZik7CisJfQorCisKKwlrbm93bl9wcm9kdWN0ID0gMzYyODgwMDsKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisJeworI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCo6cHJvZHVjdCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJewkKKwkJCQlmb3IoaT0xO2k8MztpKyspCisJCQkJeworCQkJCQlwcm9kdWN0ICo9IGk7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvcihpPTM7aTw3O2krKykKKwkJCQl7CisJCQkJCXByb2R1Y3QgKj0gaTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yKGk9NztpPDExO2krKykKKwkJCQl7CisJCQkJCXByb2R1Y3QgKj0gaTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlpZihrbm93bl9wcm9kdWN0ICE9IHByb2R1Y3QpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBQcm9kdWN0IHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAlZFxuIixwcm9kdWN0LGtub3duX3Byb2R1Y3QpOworCX0KKworCWZvcihpPTA7aTwxMDAwO2krKykKKwl7CisJCWxvZ2ljc1tpXT0xOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJiY6bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTE7aTwzMDA7aSsrKQorCQkJCXsKKwkJCQkJbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MzAwO2k8NzAwO2krKykKKwkJCQl7CisJCQkJCWxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTcwMDtpPDEwMDA7aSsrKQorCQkJCXsKKwkJCQkJbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWlmKCFsb2dpY19hbmQpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAxXG4iKTsKKwl9CisKKwlsb2dpY19hbmQgPSAxOworCWxvZ2ljc1s1MDFdID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJiY6bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTE7aTwzMDA7aSsrKQorCQkJCXsKKwkJCQkJbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MzAwO2k8NzAwO2krKykKKwkJCQl7CisJCQkJCWxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTcwMDtpPDEwMDA7aSsrKQorCQkJCXsKKwkJCQkJbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWlmKGxvZ2ljX2FuZCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDJcbiIpOworCX0KKworCWZvcihpPTA7aTwxMDAwO2krKykKKwl7CisJCWxvZ2ljc1tpXT0wOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisJeworI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHx8OmxvZ2ljX29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTE7aTwzMDA7aSsrKQorCQkJCXsKKwkJCQkJbG9naWNfb3IgPSAobG9naWNfb3IgfHwgbG9naWNzW2ldKTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTMwMDtpPDcwMDtpKyspCisJCQkJeworCQkJCQlsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9NzAwO2k8MTAwMDtpKyspCisJCQkJeworCQkJCQlsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWlmKGxvZ2ljX29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiXG5FcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDFcbiIpOworCX0KKworCWxvZ2ljX29yID0gMDsKKwlsb2dpY3NbNTAxXT0xOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofHw6bG9naWNfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MTtpPDMwMDtpKyspCisJCQkJeworCQkJCQlsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MzAwO2k8NzAwO2krKykKKwkJCQl7CisJCQkJCWxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT03MDA7aTwxMDAwO2krKykKKwkJCQl7CisJCQkJCWxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYoIWxvZ2ljX29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAyXG4iKTsKKwl9CisKKworCWZvcihpPTA7aTwxMDAwOysraSkKKwl7CisJCWxvZ2ljc1tpXT0xOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisJeworI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCY6Yml0X2FuZCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJewkKKwkJCQlmb3IoaT0wO2k8MzAwOysraSkKKwkJCQl7CisJCQkJCWJpdF9hbmQgPSAoYml0X2FuZCAmIGxvZ2ljc1tpXSk7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJewkKKwkJCQlmb3IoaT0zMDA7aTw3MDA7KytpKQorCQkJCXsKKwkJCQkJYml0X2FuZCA9IChiaXRfYW5kICYgbG9naWNzW2ldKTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CQorCQkJCWZvcihpPTcwMDtpPDEwMDA7KytpKQorCQkJCXsKKwkJCQkJYml0X2FuZCA9IChiaXRfYW5kICYgbG9naWNzW2ldKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJaWYoIWJpdF9hbmQpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMVxuIik7CisJfQorCisJYml0X2FuZCA9IDE7CisJbG9naWNzWzUwMV09MDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisJeworI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCY6Yml0X2FuZCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvcihpPTA7aTwzMDA7KytpKQorCQkJCXsKKwkJCQkJYml0X2FuZCA9IGJpdF9hbmQgJiBsb2dpY3NbaV07CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvcihpPTMwMDtpPDcwMDsrK2kpCisJCQkJeworCQkJCQliaXRfYW5kID0gYml0X2FuZCAmIGxvZ2ljc1tpXTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yKGk9NzAwO2k8MTAwMDsrK2kpCisJCQkJeworCQkJCQliaXRfYW5kID0gYml0X2FuZCAmIGxvZ2ljc1tpXTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJaWYoYml0X2FuZCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEJJVCBBTkQgcGFydCAyXG4iKTsKKwl9CisKKwlmb3IoaT0wO2k8MTAwMDtpKyspCisJeworCQlsb2dpY3NbaV09MDsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8OmJpdF9vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvcihpPTA7aTwzMDA7KytpKQorCQkJCXsKKwkJCQkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IoaT0zMDA7aTw3MDA7KytpKQorCQkJCXsKKwkJCQkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IoaT03MDA7aTwxMDAwOysraSkKKwkJCQl7CisJCQkJCWJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJaWYoYml0X29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gQklUIE9SIHBhcnQgMVxuIik7CisJfQorCWJpdF9vciA9IDA7CisJbG9naWNzWzUwMV09MTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisJeworI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHw6Yml0X29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yKGk9MDtpPDMwMDsrK2kpCisJCQkJeworCQkJCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvcihpPTMwMDtpPDcwMDsrK2kpCisJCQkJeworCQkJCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvcihpPTcwMDtpPDEwMDA7KytpKQorCQkJCXsKKwkJCQkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlpZighYml0X29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gQklUIE9SIHBhcnQgMlxuIik7CisJfQorCisJZm9yKGk9MDtpPDEwMDA7aSsrKQorCXsKKwkJbG9naWNzW2ldPTA7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsJCisJCQkJZm9yKGk9MDtpPDMwMDsrK2kpCisJCQkJeworCQkJCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJewkKKwkJCQlmb3IoaT0zMDA7aTw3MDA7KytpKQorCQkJCXsKKwkJCQkJZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsJCisJCQkJZm9yKGk9NzAwO2k8MTAwMDsrK2kpCisJCQkJeworCQkJCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJCQkJfQorCQkJfQorCQl9CisJfQorCWlmKGV4Y2x1c2l2X2JpdF9vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDFcbiIpOworCX0KKworCWV4Y2x1c2l2X2JpdF9vciA9IDA7CisJbG9naWNzWzUwMV09MTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisJeworI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKF46ZXhjbHVzaXZfYml0X29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yKGk9MDtpPDMwMDsrK2kpCisJCQkJeworCQkJCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvcihpPTMwMDtpPDcwMDsrK2kpCisJCQkJeworCQkJCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvcihpPTcwMDtpPDEwMDA7KytpKQorCQkJCXsKKwkJCQkJZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlpZighZXhjbHVzaXZfYml0X29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMlxuIik7CisJfQorPC9vbXB0czpvcnBoYW4+CisJLypwcmludGYoIlxuUmVzdWx0OiVkXG4iLHJlc3VsdCk7Ki8KKwlyZXR1cm4gKHJlc3VsdD09MCk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NpbmdsZS5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NpbmdsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMmIwZDIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfc2luZ2xlLmMKQEAgLTAsMCArMSw0MyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgc2luZ2xlIGRpcmVjdGl2ZSBieSBjb250cm9sbGluZyBob3cgb2Z0ZW4gYSBkaXJlY3RpdmUgaXMgY2FsbGVkIGluIGFuIG9tcCBzaW5nbGUgcmVnaW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgc2luZ2xlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHBhcmFsbGVsIHByaXZhdGUsb21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3NpbmdsZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IG5yX3RocmVhZHNfaW5fc2luZ2xlOworCWludCByZXN1bHQ7CisJaW50IG5yX2l0ZXJhdGlvbnM7CisJaW50IGk7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlID0gMDsKKyAgICByZXN1bHQgPSAwOworICAgIG5yX2l0ZXJhdGlvbnMgPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBwcml2YXRlKGkpCisgICAgeworCWZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKwl7CisJICAgIDxvbXB0czpvcnBoYW4+CisJCTxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBzaW5nbGUgPC9vbXB0czpjaGVjaz4KKwkJeyAgCisjcHJhZ21hIG9tcCBmbHVzaAorCQkgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUrKzsKKyNwcmFnbWEgb21wIGZsdXNoICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkgICAgbnJfaXRlcmF0aW9ucysrOworCQkgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUtLTsKKwkJICAgIHJlc3VsdCA9IHJlc3VsdCArIG5yX3RocmVhZHNfaW5fc2luZ2xlOworCQl9IC8qIGVuZCBvZiBzaW5nbGUgKi8gICAgCisJICAgIDwvb21wdHM6b3JwaGFuPgorCX0gLyogZW5kIG9mIGZvciAgKi8KKyAgICB9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLworICAgIHJldHVybiAoKHJlc3VsdCA9PSAwKSAmJiAobnJfaXRlcmF0aW9ucyA9PSBMT09QQ09VTlQpKTsKK30gLyogZW5kIG9mIGNoZWNrX3NpbmdsZSovCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NpbmdsZV9jb3B5cHJpdmF0ZS5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NpbmdsZV9jb3B5cHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjN2NkNTQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfc2luZ2xlX2NvcHlwcml2YXRlLmMKQEAgLTAsMCArMSw1MCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgc2luZ2xlIGNvcHlwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHNpbmdsZSBjb3B5cHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBwYXJsbGVsLG9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgajsKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoaikKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3NpbmdsZV9jb3B5cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgcmVzdWx0OworCWludCBucl9pdGVyYXRpb25zOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICByZXN1bHQgPSAwOworICAgIG5yX2l0ZXJhdGlvbnMgPSAwOworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisJICAgIHsKKwkJLyoKKwkJICAgaW50IHRocmVhZDsKKwkJICAgdGhyZWFkID0gb21wX2dldF90aHJlYWRfbnVtICgpOworCQkgKi8KKyNwcmFnbWEgb21wIHNpbmdsZSA8b21wdHM6Y2hlY2s+Y29weXByaXZhdGUoaik8L29tcHRzOmNoZWNrPgorCQl7CisJCSAgICBucl9pdGVyYXRpb25zKys7CisJCSAgICBqID0gaTsKKwkJICAgIC8qcHJpbnRmICgidGhyZWFkICVkIGFzc2lnbnMsIGogPSAlZCwgaSA9ICVkXG4iLCB0aHJlYWQsIGosIGkpOyovCisJCX0KKwkJLyoJI3ByYWdtYSBvbXAgYmFycmllciovCisjcHJhZ21hIG9tcCBjcml0aWNhbAorCQl7CisJCSAgICAvKnByaW50ZiAoInRocmVhZCA9ICVkLCBqID0gJWQsIGkgPSAlZFxuIiwgdGhyZWFkLCBqLCBpKTsqLworCQkgICAgcmVzdWx0ID0gcmVzdWx0ICsgaiAtIGk7CisJCX0KKyNwcmFnbWEgb21wIGJhcnJpZXIKKwkgICAgfSAvKiBlbmQgb2YgZm9yICovCisJPC9vbXB0czpvcnBoYW4+CisgICAgfSAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKyAgICByZXR1cm4gKChyZXN1bHQgPT0gMCkgJiYgKG5yX2l0ZXJhdGlvbnMgPT0gTE9PUENPVU5UKSk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NpbmdsZV9ub3dhaXQuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9zaW5nbGVfbm93YWl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI3YTI1MAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9zaW5nbGVfbm93YWl0LmMKQEAgLTAsMCArMSw2MCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgc2luZ2xlIG5vd2FpdDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbCxvbXAgYXRvbWljPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IG15X2l0ZXJhdGlvbnM7CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKG15X2l0ZXJhdGlvbnMpCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9zaW5nbGVfbm93YWl0PC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgbnJfaXRlcmF0aW9uczsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgaW50IHRvdGFsX2l0ZXJhdGlvbnMgPSAwOworICAgIGludCBpOworCisgICAgbnJfaXRlcmF0aW9ucyA9IDA7CisgICAgbXlfaXRlcmF0aW9ucyA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHByaXZhdGUoaSkKKyAgICB7CisJZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKQorCXsKKwkgICAgPG9tcHRzOm9ycGhhbj4KKwkJPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIHNpbmdsZSBub3dhaXQ8L29tcHRzOmNoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBhdG9taWMgIAorCQkgICAgbnJfaXRlcmF0aW9ucysrOworCQl9IC8qIGVuZCBvZiBzaW5nbGUqLyAgICAKKwkgICAgPC9vbXB0czpvcnBoYW4+CisJfSAvKiBlbmQgb2YgZm9yICAqLworICAgIH0gLyogZW5kIG9mIHBhcmFsbGVsICovCisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHByaXZhdGUoaSkgCisgICAgeworCW15X2l0ZXJhdGlvbnMgPSAwOworCWZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKwl7CisJICAgIDxvbXB0czpvcnBoYW4+CisJCTxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBzaW5nbGUgbm93YWl0PC9vbXB0czpjaGVjaz4KKwkJeworCQkgICAgbXlfaXRlcmF0aW9ucysrOworCQl9IC8qIGVuZCBvZiBzaW5nbGUqLyAgICAKKwkgICAgPC9vbXB0czpvcnBoYW4+CisJfSAvKiBlbmQgb2YgZm9yICAqLworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisJICAgIHRvdGFsX2l0ZXJhdGlvbnMgKz0gbXlfaXRlcmF0aW9uczsKKwl9CisKKyAgICB9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLworICAgIHJldHVybiAoKG5yX2l0ZXJhdGlvbnMgPT0gTE9PUENPVU5UKSAmJiAodG90YWxfaXRlcmF0aW9ucyA9PSBMT09QQ09VTlQpKTsKK30gLyogZW5kIG9mIGNoZWNrX3NpbmdsZV9ub3dhaXQqLworPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9zaW5nbGVfcHJpdmF0ZS5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NpbmdsZV9wcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc1MDJjNwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9zaW5nbGVfcHJpdmF0ZS5jCkBAIC0wLDAgKzEsNTYgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHNpbmdsZSBwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHNpbmdlbCBwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcCBmbHVzaCxvbXAgc2luZ2xlIG5vd2FpdDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCBteWl0ID0gMDsKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUobXlpdCkKK2ludCBteXJlc3VsdCA9IDA7CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKG15cmVzdWx0KQorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfc2luZ2xlX3ByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBucl90aHJlYWRzX2luX3NpbmdsZTsKKwlpbnQgcmVzdWx0OworCWludCBucl9pdGVyYXRpb25zOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IGk7CisKKyAgICBteWl0ID0gMDsKKyAgICBucl90aHJlYWRzX2luX3NpbmdsZSA9IDA7CisgICAgbnJfaXRlcmF0aW9ucyA9IDA7CisgICAgcmVzdWx0ID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgcHJpdmF0ZShpKQorICAgIHsKKwlteXJlc3VsdCA9IDA7CisJbXlpdCA9IDA7CisJZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKQorCXsKKwk8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgc2luZ2xlIDxvbXB0czpjaGVjaz5wcml2YXRlKG5yX3RocmVhZHNfaW5fc2luZ2xlKSA8L29tcHRzOmNoZWNrPm5vd2FpdAorCSAgICB7ICAKKwkJbnJfdGhyZWFkc19pbl9zaW5nbGUgPSAwOworI3ByYWdtYSBvbXAgZmx1c2gKKwkJbnJfdGhyZWFkc19pbl9zaW5nbGUrKzsKKyNwcmFnbWEgb21wIGZsdXNoICAgICAgICAgICAgICAgICAgICAgICAgIAorCQlteWl0Kys7CisJCW15cmVzdWx0ID0gbXlyZXN1bHQgKyBucl90aHJlYWRzX2luX3NpbmdsZTsKKwkgICAgfSAvKiBlbmQgb2Ygc2luZ2xlICovICAgIAorCTwvb21wdHM6b3JwaGFuPgorCX0gLyogZW5kIG9mIGZvciAqLworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisgICAgICAgICAgICByZXN1bHQgKz0gbnJfdGhyZWFkc19pbl9zaW5nbGU7CisJICAgIG5yX2l0ZXJhdGlvbnMgKz0gbXlpdDsKKwl9CisgICAgfSAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKyAgICByZXR1cm4gKChyZXN1bHQgPT0gMCkgJiYgKG5yX2l0ZXJhdGlvbnMgPT0gTE9PUENPVU5UKSk7Cit9IC8qIGVuZCBvZiBjaGVja19zaW5nbGUgcHJpdmF0ZSAqLyAKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFzay5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTg5NzkwCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2suYwpAQCAtMCwwICsxLDUyIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCB0YXNrIGRpcmVjdGl2ZS4gVGhlIGlkZWEgb2YgdGhlIHRlc3RzIGlzIHRvIGdlbmVyYXRlIGEgc2V0IG9mIHRhc2tzIGluIGEgc2luZ2xlIHJlZ2lvbi4gV2UgbGV0IHBhdXNlIHRoZSB0YXNrcyBnZW5lcmF0ZWQgc28gdGhhdCBvdGhlciB0aHJlYWRzIGdldCBzaGVkdWxlZCB0byB0aGUgbmV3bHkgb3BlbmVkIHRhc2tzLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGFzazwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBzaW5nbGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGFzazwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCB0aWRzW05VTV9UQVNLU107CisgICAgaW50IGk7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCit7CisjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykgeworICAgICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgIC8qIEZpcnN0IHdlIGhhdmUgdG8gc3RvcmUgdGhlIHZhbHVlIG9mIHRoZSBsb29wIGluZGV4IGluIGEgbmV3IHZhcmlhYmxlCisgICAgICAgICAgICAgKiB3aGljaCB3aWxsIGJlIHByaXZhdGUgZm9yIGVhY2ggdGFzayBiZWNhdXNlIG90aGVyd2lzZSBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuCisgICAgICAgICAgICAgKiBpZiB0aGUgZXhlY3V0aW9uIG9mIHRoZSB0YXNrIHRha2VzIGxvbmdlciB0aGFuIHRoZSB0aW1lIHdoaWNoIGlzIG5lZWRlZCB0byAKKyAgICAgICAgICAgICAqIGVudGVyIHRoZSBuZXh0IHN0ZXAgb2YgdGhlIGxvb3AhCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGludCBteWk7CisgICAgICAgICAgICBteWkgPSBpOworCis8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgdGFzazwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbXlfc2xlZXAgKFNMRUVQVElNRSk7CisKKyAgICAgICAgICAgICAgICB0aWRzW215aV0gPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKyAgICAgICAgICAgIH0gLyogZW5kIG9mIG9tcCB0YXNrICovCisgICAgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgfSAvKiBlbmQgb2YgZm9yICovCisgICAgfSAvKiBlbmQgb2Ygc2luZ2xlICovCit9IC8qZW5kIG9mIHBhcmFsbGVsICovCisKKy8qIE5vdyB3ZSBja2VjayBpZiBtb3JlIHRoYW4gb25lIHRocmVhZCBleGVjdXRlZCB0aGUgdGFza3MuICovCisgICAgZm9yIChpID0gMTsgaSA8IE5VTV9UQVNLUzsgaSsrKSB7CisgICAgICAgIGlmICh0aWRzWzBdICE9IHRpZHNbaV0pCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9IC8qIGVuZCBvZiBjaGVja19wYXJhbGxlbF9mb3JfcHJpdmF0ZSAqLworPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNrX2ZpbmFsLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFza19maW5hbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMDBjNWYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFza19maW5hbC5jCkBAIC0wLDAgKzEsNTIgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHRhc2sgZGlyZWN0aXZlLiBUaGUgaWRlYSBvZiB0aGUgdGVzdHMgaXMgdG8gZ2VuZXJhdGUgYSBzZXQgb2YgdGFza3MgaW4gYSBzaW5nbGUgcmVnaW9uLiBXZSBsZXQgcGF1c2UgdGhlIHRhc2tzIGdlbmVyYXRlZCBzbyB0aGF0IG90aGVyIHRocmVhZHMgZ2V0IHNoZWR1bGVkIHRvIHRoZSBuZXdseSBvcGVuZWQgdGFza3MuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0YXNrIGZpbmFsPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHNpbmdsZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90YXNrX2ZpbmFsPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IHRpZHNbTlVNX1RBU0tTXTsKKyAgICBpbnQgaTsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBlcnJvcjsKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAoreworI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1RBU0tTOyBpKyspIHsKKyAgICAgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICAvKiBGaXJzdCB3ZSBoYXZlIHRvIHN0b3JlIHRoZSB2YWx1ZSBvZiB0aGUgbG9vcCBpbmRleCBpbiBhIG5ldyB2YXJpYWJsZQorICAgICAgICAgICAgICogd2hpY2ggd2lsbCBiZSBwcml2YXRlIGZvciBlYWNoIHRhc2sgYmVjYXVzZSBvdGhlcndpc2UgaXQgd2lsbCBiZSBvdmVyd3JpdHRlbgorICAgICAgICAgICAgICogaWYgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgdGFzayB0YWtlcyBsb25nZXIgdGhhbiB0aGUgdGltZSB3aGljaCBpcyBuZWVkZWQgdG8gCisgICAgICAgICAgICAgKiBlbnRlciB0aGUgbmV4dCBzdGVwIG9mIHRoZSBsb29wIQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpbnQgbXlpOworICAgICAgICAgICAgbXlpID0gaTsKKworICAgICAgICAgICAgI3ByYWdtYSBvbXAgdGFzayA8b21wdHM6Y2hlY2s+ZmluYWwoaT49MTApPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBteV9zbGVlcCAoU0xFRVBUSU1FKTsKKworICAgICAgICAgICAgICAgIHRpZHNbbXlpXSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgICAgICAgfSAvKiBlbmQgb2Ygb21wIHRhc2sgKi8KKyAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICB9IC8qIGVuZCBvZiBmb3IgKi8KKyAgICB9IC8qIGVuZCBvZiBzaW5nbGUgKi8KK30gLyplbmQgb2YgcGFyYWxsZWwgKi8KKworLyogTm93IHdlIGNrZWNrIGlmIG1vcmUgdGhhbiBvbmUgdGhyZWFkIGV4ZWN1dGVkIHRoZSB0YXNrcy4gKi8KKyAgICBmb3IgKGkgPSAxMDsgaSA8IE5VTV9UQVNLUzsgaSsrKSB7CisgICAgICAgIGlmICh0aWRzWzEwXSAhPSB0aWRzW2ldKQorICAgICAgICAgICAgZXJyb3IrKzsKKyAgICB9CisgICAgcmV0dXJuIChlcnJvcj09MCk7Cit9IC8qIGVuZCBvZiBjaGVja19wYXJhbGxlbF9mb3JfcHJpdmF0ZSAqLworPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNrX2ZpcnN0cHJpdmF0ZS5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfZmlyc3Rwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FhMDc0NgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNrX2ZpcnN0cHJpdmF0ZS5jCkBAIC0wLDAgKzEsNTEgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgZmlyc3Rwcml2YXRlIGNsYXVzZSBvZiB0aGUgdGFzayBkaXJlY3RpdmUuIFdlIGNyZWF0ZSBhIHNldCBvZiB0YXNrcyBpbiBhIHNpbmdsZSByZWdpb24uIFdlIGRlZmluZXMgYSB2YXJpYWJsZSBuYW1lZCBzdW0gdW5lcXVhbCB6ZXJvIHdoaWNoIGdldHMgZGVjbGFyZWQgZmlyc3Rwcml2YXRlIGZvciBlYWNoIHRhc2suIE5vdyBlYWNoIHRhc2sgY2FsY3VhbHRlcyBhIHN1bSB1c2luZyB0aGlzIHByaXZhdGUgdmFyaWFibGUuIEJlZm9yZSBlYWNoIGNhbGN1YWxhdGlvbiBzdGVwIHdlIGludHJvZHVjZSBhIGZsdXNoIGNvbW1hbmQgc28gdGhhdCBtYXliZSB0aGUgcHJpdmF0ZSB2YXJpYWJlbCBnZXRzIGJhZC4gQXQgdGhlIGVuZCB3ZSBjaGVjayBpZiB0aGUgY2FsY3VsYXRlZCBzdW0gd2FzIHJpZ2h0Ljwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGFzayBmaXJzdHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgc2luZ2xlLG9tcCBmbHVzaCxvbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2tfZmlyc3Rwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgICBpbnQgaTsKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IHN1bSA9IDEyMzQ7CisgICAgaW50IGtub3duX3N1bTsKKyAgICBpbnQgcmVzdWx0ID0gMDsgLyogY291bnRzIHRoZSB3cm9uZyBzdW1zIGZyb20gdGFza3MgKi8KKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAga25vd25fc3VtID0gMTIzNCArIChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9UQVNLUzsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDxvbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCB0YXNrIDxvbXB0czpjaGVjaz5maXJzdHByaXZhdGUoc3VtKTwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8PSBMT09QQ09VTlQ7IGorKykgeworI3ByYWdtYSBvbXAgZmx1c2gKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1bSArPSBqOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgaWYgY2FsY3VsYXRlZCBzdW0gd2FzIHJpZ2h0ICovCisgICAgICAgICAgICAgICAgICAgIGlmIChzdW0gIT0ga25vd25fc3VtKSB7CisjcHJhZ21hIG9tcCBjcml0aWNhbCAKKyAgICAgICAgICAgICAgICAgICAgICB7IHJlc3VsdCsrOyB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IC8qIGVuZCBvZiBvbXAgdGFzayAqLworICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICAgICAgfQkvKiBlbmQgb2YgZm9yICovCisgICAgICAgIH0gLyogZW5kIG9mIHNpbmdsZSAqLworICAgIH0JLyogZW5kIG9mIHBhcmFsbGVsKi8KKworICAgIHJldHVybiAocmVzdWx0ID09IDApOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNrX2lmLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFza19pZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwN2FiMmYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFza19pZi5jCkBAIC0wLDAgKzEsNDMgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgaWYgY2xhdXNlIG9mIHRoZSBvbXAgdGFzayBkaXJlY3RpdmUuIFRoZSBpZGVhciBvZiB0aGUgdGVzdHMgaXMgdG8gZ2VuZXJhdGUgYSB0YXNrcyBpbiBhIHNpbmdsZSByZWdpb24gYW5kIHBhdXNlIGl0IGltbWVkaWF0ZWx5LiBUaGUgcGFyZW50IHRocmVhZCBub3cgc2hhbGwgc2V0IGEgY291bnRlciB2YXJpYWJsZSB3aGljaCB0aGUgcGF1c2VkIHRhc2sgc2hhbGwgZXZhbHVhdGUgd2hlbiB3b2tlIHVwLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGFzayBpZjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBzaW5nbGUsb21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2tfaWY8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQgY29uZGl0aW9uX2ZhbHNlOworICAgIGludCBjb3VudDsKKyAgICBpbnQgcmVzdWx0OworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgY291bnQ9MDsKKyAgICBjb25kaXRpb25fZmFsc2UgPSAobG9nRmlsZSA9PSBOVUxMKTsKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAoreworI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgeworICAgICAgICA8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgdGFzayA8b21wdHM6Y2hlY2s+aWYgKGNvbmRpdGlvbl9mYWxzZSk8L29tcHRzOmNoZWNrPiBzaGFyZWQoY291bnQsIHJlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgbXlfc2xlZXAgKFNMRUVQVElNRV9MT05HKTsKKy8vI3ByYWdtYSBvbXAgZmx1c2ggKGNvdW50KQorICAgICAgICAgICAgcmVzdWx0ID0gKDAgPT0gY291bnQpOworICAgICAgICB9IC8qIGVuZCBvZiBvbXAgdGFzayAqLworICAgICAgICA8L29tcHRzOm9ycGhhbj4KKworICAgICAgICBjb3VudCA9IDE7CisvLyNwcmFnbWEgb21wIGZsdXNoIChjb3VudCkKKworICAgIH0gLyogZW5kIG9mIHNpbmdsZSAqLworfSAvKmVuZCBvZiBwYXJhbGxlbCAqLworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFza19pbXBfZmlyc3Rwcml2YXRlLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFza19pbXBfZmlyc3Rwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI4ZjBlZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNrX2ltcF9maXJzdHByaXZhdGUuYwpAQCAtMCwwICsxLDUxIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+IFRlc3QgdG8gc2VlIGlmIGltcGxpZWQgcHJpdmF0ZSB3b3JrcyBwcm9wZXJseTwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGFzazwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBzaW5nbGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworCisKKworLyogVXRpbGl0eSBmdW5jdGlvbiBkbyBzcGVuZCBzb21lIHRpbWUgaW4gYSBsb29wICovCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGFza19pbXBfZmlyc3Rwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgICBpbnQgaT01OworICAgIGludCBrID0gMDsKKyAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICBpbnQgdGFza19yZXN1bHQgPSAxOworICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZmlyc3Rwcml2YXRlKGkpCisgICAgeworICAgICAgI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgICB7CisgICAgIAorICAgICAgICAKKyAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgTlVNX1RBU0tTOyBrKyspCisJICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICNwcmFnbWEgb21wIHRhc2sgc2hhcmVkKHJlc3VsdCAsIHRhc2tfcmVzdWx0PG9tcHRzOmNyb3NzY2hlY2s+LCBpPC9vbXB0czpjcm9zc2NoZWNrPikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGo7CisJCQkgIC8vY2hlY2sgaWYgaSBpcyBwcml2YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGkgIT0gNSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrX3Jlc3VsdCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IoaiA9IDA7IGogPCBOVU1fVEFTS1M7IGorKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzIHNob3VsZCBiZSBmaXJzdHByaXZhdGUgaW1wbGljaXRseQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCQl9CisKKwkgICNwcmFnbWEgb21wIHRhc2t3YWl0CisJICByZXN1bHQgPSAodGFza19yZXN1bHQgJiYgaT09NSk7CisgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgIH0KKyAgICAKKyAgICByZXR1cm4gcmVzdWx0OworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNrX3ByaXZhdGUuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNrX3ByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWUyNmRkCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfcHJpdmF0ZS5jCkBAIC0wLDAgKzEsNTMgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgcHJpdmF0ZSBjbGF1c2Ugb2YgdGhlIHRhc2sgZGlyZWN0aXZlLiBXZSBjcmVhdGUgYSBzZXQgb2YgdGFza3MgaW4gYSBzaW5nbGUgcmVnaW9uLiBXZSBkZWZpbmVzIGEgdmFyaWFibGUgbmFtZWQgc3VtIHdoaWNoIGdldHMgZGVjbGFyZWQgcHJpdmF0ZSBmb3IgZWFjaCB0YXNrLiBOb3cgZWFjaCB0YXNrIGNhbGN1YWx0ZXMgYSBzdW0gdXNpbmcgdGhpcyBwcml2YXRlIHZhcmlhYmxlLiBCZWZvcmUgZWFjaCBjYWxjdWFsYXRpb24gc3RlcCB3ZSBpbnRyb2R1Y2UgYSBmbHVzaCBjb21tYW5kIHNvIHRoYXQgbWF5YmUgdGhlIHByaXZhdGUgdmFyaWFiZWwgZ2V0cyBiYWQuIEF0IHRoZSBlbmQgd2UgY2hlY2sgaWYgdGhlIGNhbGN1bGF0ZWQgc3VtIHdhcyByaWdodC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHRhc2sgcHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBzaW5nbGUsb21wIGZsdXNoLG9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisvKiBVdGlsaXR5IGZ1bmN0aW9uIGRvIHNwZW5kIHNvbWUgdGltZSBpbiBhIGxvb3AgKi8KK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90YXNrX3ByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgIGludCBpOworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQga25vd25fc3VtOworICAgIGludCBzdW0gPSAwOworICAgIGludCByZXN1bHQgPSAwOyAvKiBjb3VudHMgdGhlIHdyb25nIHN1bXMgZnJvbSB0YXNrcyAqLworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgdGFzayA8b21wdHM6Y2hlY2s+cHJpdmF0ZShzdW0pPC9vbXB0czpjaGVjaz4gc2hhcmVkKHJlc3VsdCwga25vd25fc3VtKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGo7CisJCSAgICAvL2lmIHN1bSBpcyBwcml2YXRlLCBpbml0aWFsaXplIHRvIDAKKwkJICAgIDxvbXB0czpjaGVjaz5zdW0gPSAwOzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPD0gTE9PUENPVU5UOyBqKyspIHsKKyNwcmFnbWEgb21wIGZsdXNoCisgICAgICAgICAgICAgICAgICAgICAgICBzdW0gKz0gajsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvKiBjaGVjayBpZiBjYWxjdWxhdGVkIHN1bSB3YXMgcmlnaHQgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN1bSAhPSBrbm93bl9zdW0pIHsKKyNwcmFnbWEgb21wIGNyaXRpY2FsIAorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Kys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IC8qIGVuZCBvZiBvbXAgdGFzayAqLworICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICAgICAgfQkvKiBlbmQgb2YgZm9yICovCisgICAgICAgIH0gLyogZW5kIG9mIHNpbmdsZSAqLworICAgIH0JLyogZW5kIG9mIHBhcmFsbGVsKi8KKworICAgIHJldHVybiAocmVzdWx0ID09IDApOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNrX3NoYXJlZC5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfc2hhcmVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRjMjEwOQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNrX3NoYXJlZC5jCkBAIC0wLDAgKzEsNDcgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj4gVGVzdCB0byBzZWUgaWYgaW1wbGllZCBzaGFyZWQgd29ya3MgY29ycmVjdGx5PC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0YXNrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHNpbmdsZSwgb21wIHRhc2sgZmlyc3Rwcml2YXRlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKworCisKKy8qIFV0aWxpdHkgZnVuY3Rpb24gZG8gc3BlbmQgc29tZSB0aW1lIGluIGEgbG9vcCAqLworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2tfaW1wX3NoYXJlZDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IGk7CisgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgIGk9MDsKKyAgICBpbnQgayA9IDA7CisgICAgaW50IHJlc3VsdCA9IDA7CisKKyAgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgICNwcmFnbWEgb21wIHNpbmdsZQorICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBOVU1fVEFTS1M7IGsrKykgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgICAgICAgICAjcHJhZ21hIG9tcCB0YXNrIDxvbXB0czpjcm9zc2NoZWNrPiBmaXJzdHByaXZhdGUoaSkgPC9vbXB0czpjcm9zc2NoZWNrPiA8b21wdHM6Y2hlY2s+IHNoYXJlZChpKTwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzIHNob3VsZCBiZSBzaGFyZWQgaW1wbGljaXRseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPiAKKyAgICAgICAgICAgICAgICAgIH0KKworICAgIH0KKworcmVzdWx0ID0gaTsKK3JldHVybiAoKHJlc3VsdCA9PSBOVU1fVEFTS1MpKTsKKyAgICAgCit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfdW50aWVkLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFza191bnRpZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDZlYmUyCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfdW50aWVkLmMKQEAgLTAsMCArMSw2OSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3QgZm9yIHVudGllZCBjbGF1c2UuIEZpcnN0IGdlbmVyYXRlIGEgc2V0IG9mIHRhc2tzIGFuZCBwYXVzZSBpdCBpbW1lZGlhdGVseS4gVGhlbiB3ZSByZXN1bWUgaGFsZiBvZiB0aGVtIGFuZCBjaGVjayB3aGV0aGVyIHRoZXkgYXJlIHNjaGVkdWxlZCBieSBkaWZmZXJlbnQgdGhyZWFkczwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGFzayB1bnRpZWQ8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgdGFza3dhaXQ8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2tfdW50aWVkPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKworICA8b21wdHM6b3JwaGFuOnZhcnM+CisgIGludCBpOworICBpbnQgY291bnQ7CisgIGludCBzdGFydF90aWRbTlVNX1RBU0tTXTsKKyAgaW50IGN1cnJlbnRfdGlkW05VTV9UQVNLU107CisgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgIGNvdW50ID0gMDsKKyAgCisgIC8qaW5pdGlhbGl6YXRpb24qLworICBmb3IgKGk9MDsgaTwgTlVNX1RBU0tTOyBpKyspeworICAgIHN0YXJ0X3RpZFtpXT0wOworICAgIGN1cnJlbnRfdGlkW2ldPTA7CisgIH0KKyAgCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZpcnN0cHJpdmF0ZShpKQorICB7CisgICAgI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgeworICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9UQVNLUzsgaSsrKSB7CisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgIGludCBteWkgPSBpOworICAgICAgICAjcHJhZ21hIG9tcCB0YXNrIDxvbXB0czpjaGVjaz51bnRpZWQ8L29tcHRzOmNoZWNrPgorICAgICAgICB7CisgICAgICAgICAgbXlfc2xlZXAoU0xFRVBUSU1FKTsKKyAgICAgICAgICBzdGFydF90aWRbbXlpXSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgICAgIGN1cnJlbnRfdGlkW215aV0gPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKyAgICAgICAgICAKKyAgICAgICAgICAjcHJhZ21hIG9tcCB0YXNrd2FpdAorICAgICAgICAgIAorICAgICAgICAgIDxvbXB0czpjaGVjaz5pZigoc3RhcnRfdGlkW215aV0gJTIpICE9MCl7PC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgIG15X3NsZWVwKFNMRUVQVElNRSk7CisgICAgICAgICAgICBjdXJyZW50X3RpZFtteWldID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICAgICAgPG9tcHRzOmNoZWNrPgorICAgICAgICAgIH0gLyogZW5kIG9mIGlmICovIAorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY3VycmVudF90aWRbbXlpXSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgICAgIH0KKyAgICAgICAgICA8L29tcHRzOmNoZWNrPgorCisgICAgICAgIH0gLyplbmQgb2Ygb21wIHRhc2sgKi8KKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgICB9IC8qIGVuZCBvZiBmb3IgKi8KKyAgICB9IC8qIGVuZCBvZiBzaW5nbGUgKi8KKyAgfSAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworICBmb3IgKGk9MDtpPE5VTV9UQVNLUzsgaSsrKQorICB7CisgICAgcHJpbnRmKCJzdGFydF90aWRbJWRdPSVkLCBjdXJyZW50X3RpZFslZF09JWRcbiIsaSwgc3RhcnRfdGlkW2ldLCBpICwgY3VycmVudF90aWRbaV0pOworICAgIGlmIChjdXJyZW50X3RpZFtpXSA9PSBzdGFydF90aWRbaV0pCisgICAgICBjb3VudCsrOworICB9CisgIHJldHVybiAoY291bnQ8TlVNX1RBU0tTKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+CisKKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNrd2FpdC5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2t3YWl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg3NjFmMgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNrd2FpdC5jCkBAIC0wLDAgKzEsNzUgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHRhc2t3YWl0IGRpcmVjdGl2ZS4gRmlyc3Qgd2UgZ2VuZXJhdGUgYSBzZXQgb2YgdGFza3MsIHdoaWNoIHNldCB0aGUgZWxlbWVudHMgb2YgYW4gYXJyYXkgdG8gYSBzcGVjaWZpYyB2YWx1ZS4gVGhlbiB3ZSBkbyBhIHRhc2t3YWl0IGFuZCBjaGVjayBpZiBhbGwgdGFza3MgZmluaXNoZWQgbWVhbmluZyBhbGwgYXJyYXkgZWxlbWVudHMgY29udGFpbiB0aGUgcmlnaHQgdmFsdWUuIFRoZW4gd2UgZ2VuZXJhdGUgYSBzZWNvbmQgc2V0IHNldHRpbmcgdGhlIGFycmF5IGVsZW1lbnRzIHRvIGFub3RoZXIgdmFsdWUuIEFmdGVyIHRoZSBwYXJhbGxlbCByZWdpb24gd2UgY2hlY2sgaWYgYWxsIHRhc2tzIG9mIHRoZSBzZWNvbmQgc2V0IGZpbmlzaGVkIGFuZCB3ZXJlIGV4ZWN1dGVkIGFmdGVyIHRoZSB0YXNrcyBvZiB0aGUgZmlyc3Qgc2V0Ljwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGFza3dhaXQ8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgc2luZ2xlLG9tcCB0YXNrPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2t3YWl0PC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKyAgICBpbnQgcmVzdWx0MSA9IDA7ICAgICAvKiBTdG9yZXMgbnVtYmVyIG9mIG5vdCBmaW5pc2hlZCB0YXNrcyBhZnRlciB0aGUgdGFza3dhaXQgKi8KKyAgICBpbnQgcmVzdWx0MiA9IDA7ICAgICAvKiBTdG9yZXMgbnVtYmVyIG9mIHdyb25nIGFycmF5IGVsZW1lbnRzIGF0IHRoZSBlbmQgKi8KKworICAgIGludCBhcnJheVtOVU1fVEFTS1NdOworICAgIGludCBpOworCisgICAgLyogZmlsbCBhcnJheSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykgCisgICAgICAgIGFycmF5W2ldID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykgeworICAgICAgICAgICAgICAgIC8qIEZpcnN0IHdlIGhhdmUgdG8gc3RvcmUgdGhlIHZhbHVlIG9mIHRoZSBsb29wIGluZGV4IGluIGEgbmV3IHZhcmlhYmxlCisgICAgICAgICAgICAgICAgICogd2hpY2ggd2lsbCBiZSBwcml2YXRlIGZvciBlYWNoIHRhc2sgYmVjYXVzZSBvdGhlcndpc2UgaXQgd2lsbCBiZSBvdmVyd3JpdHRlbgorICAgICAgICAgICAgICAgICAqIGlmIHRoZSBleGVjdXRpb24gb2YgdGhlIHRhc2sgdGFrZXMgbG9uZ2VyIHRoYW4gdGhlIHRpbWUgd2hpY2ggaXMgbmVlZGVkIHRvIAorICAgICAgICAgICAgICAgICAqIGVudGVyIHRoZSBuZXh0IHN0ZXAgb2YgdGhlIGxvb3AhCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaW50IG15aTsKKyAgICAgICAgICAgICAgICBteWkgPSBpOworI3ByYWdtYSBvbXAgdGFzaworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbXlfc2xlZXAgKFNMRUVQVElNRSk7CisgICAgICAgICAgICAgICAgICAgIGFycmF5W215aV0gPSAxOworICAgICAgICAgICAgICAgIH0gLyogZW5kIG9mIG9tcCB0YXNrICovCisgICAgICAgICAgICB9IC8qIGVuZCBvZiBmb3IgKi8KKworPG9tcHRzOm9ycGhhbj4KKzxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCB0YXNrd2FpdDwvb21wdHM6Y2hlY2s+Cis8L29tcHRzOm9ycGhhbj4KKworICAgICAgICAgICAgLyogY2hlY2sgaWYgYWxsIHRhc2tzIHdlcmUgZmluaXNoZWQgKi8KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykgCisgICAgICAgICAgICAgICAgaWYgKGFycmF5W2ldICE9IDEpCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdDErKzsKKworICAgICAgICAgICAgLyogZ2VuZXJhdGUgc29tZSBtb3JlIHRhc2tzIHdoaWNoIG5vdyBzaGFsbCBvdmVyd3JpdGUgCisgICAgICAgICAgICAgKiB0aGUgdmFsdWVzIGluIHRoZSB0aWRzIGFycmF5ICovCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1RBU0tTOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgbXlpOworICAgICAgICAgICAgICAgIG15aSA9IGk7CisjcHJhZ21hIG9tcCB0YXNrCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcnJheVtteWldID0gMjsKKyAgICAgICAgICAgICAgICB9IC8qIGVuZCBvZiBvbXAgdGFzayAqLworICAgICAgICAgICAgfSAvKiBlbmQgb2YgZm9yICovCisKKyAgICAgICAgfSAvKiBlbmQgb2Ygc2luZ2xlICovCisgICAgfSAvKmVuZCBvZiBwYXJhbGxlbCAqLworCisgICAgLyogZmluYWwgY2hlY2ssIGlmIGFsbCBhcnJheSBlbGVtZW50cyBjb250YWluIHRoZSByaWdodCB2YWx1ZXM6ICovCisgICAgZm9yIChpID0gMDsgaSA8IE5VTV9UQVNLUzsgaSsrKSB7CisgICAgICAgIGlmIChhcnJheVtpXSAhPSAyKQorICAgICAgICAgICAgcmVzdWx0MisrOworICAgIH0KKworICAgIHJldHVybiAoKHJlc3VsdDEgPT0gMCkgJiYgKHJlc3VsdDIgPT0gMCkpOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNreWllbGQuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNreWllbGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDEyNzFlCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2t5aWVsZC5jCkBAIC0wLDAgKzEsNTkgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHRhc2t5aWVsZCBkaXJlY3RpdmUuIEZpcnN0IGdlbmVyYXRlIGEgc2V0IG9mIHRhc2tzIGFuZCBwYXVzZSBpdCBpbW1lZGlhdGVseS4gVGhlbiB3ZSByZXN1bWUgaGFsZiBvZiB0aGVtIGFuZCBjaGVjayB3aGV0aGVyIHRoZXkgYXJlIHNjaGVkdWxlZCBieSBkaWZmZXJlbnQgdGhyZWFkczwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGFza3lpZWxkPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHRhc2t3YWl0PC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90YXNreWllbGQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworCisgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgaW50IGk7CisgIGludCBjb3VudCA9IDA7CisgIGludCBzdGFydF90aWRbTlVNX1RBU0tTXTsKKyAgaW50IGN1cnJlbnRfdGlkW05VTV9UQVNLU107CisgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgIGZvciAoaT0wOyBpPCBOVU1fVEFTS1M7IGkrKyl7CisgICAgc3RhcnRfdGlkW2ldPTA7CisgICAgY3VycmVudF90aWRbaV09MDsKKyAgfQorICAKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIHNpbmdsZQorICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykgeworICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICBpbnQgbXlpID0gaTsKKyAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIHRhc2sgdW50aWVkPC9vbXB0czpjaGVjaz4KKyAgICAgICAgeworICAgICAgICAgIG15X3NsZWVwKFNMRUVQVElNRSk7CisgICAgICAgICAgc3RhcnRfdGlkW215aV0gPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKyAgICAgICAgICAKKyAgICAgICAgICAjcHJhZ21hIG9tcCB0YXNreWllbGQKKyAgICAgICAgICAKKyAgICAgICAgICBpZigoc3RhcnRfdGlkW215aV0gJTIpID09MCl7CisgICAgICAgICAgICBteV9zbGVlcChTTEVFUFRJTUUpOworICAgICAgICAgICAgY3VycmVudF90aWRbbXlpXSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgICAgIH0gLyplbmQgb2YgaWYqLworICAgICAgICB9IC8qIGVuZCBvZiBvbXAgdGFzayAqLworICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgIH0gLyogZW5kIG9mIGZvciAqLworICAgIH0gLyogZW5kIG9mIHNpbmdsZSAqLworICB9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLworCisgIGZvciAoaT0wO2k8TlVNX1RBU0tTOyBpKyspCisgIHsKKyAgICAvL3ByaW50Zigic3RhcnRfdGlkWyVkXT0lZCwgY3VycmVudF90aWRbJWRdPSVkXG4iLGksIHN0YXJ0X3RpZFtpXSwgaSAsIGN1cnJlbnRfdGlkW2ldKTsKKyAgICBpZiAoY3VycmVudF90aWRbaV0gPT0gc3RhcnRfdGlkW2ldKQorICAgICAgY291bnQrKzsKKyAgfQorICByZXR1cm4gKGNvdW50PE5VTV9UQVNLUyk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorCis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGVzdF9sb2NrLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGVzdF9sb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg4OWRmYgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90ZXN0X2xvY2suYwpAQCAtMCwwICsxLDQ3IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcF90ZXN0bG9jayBmdW5jdGlvbi4gVGhlIHRlc3QgY291bnRzIHRoZSB0aHJlYWRzIGVudGVyaW5nIGFuZCBleGl0aW5nIGEgc2luZ2xlIHJlZ2lvbiB3aGljaCBpcyBidWlsZCB3aXRoIGEgdGVzdF9sb2NrIGluIGFuIGVuZGxlc3MgbG9vcC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX3Rlc3RfbG9jazwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBmbHVzaDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK29tcF9sb2NrX3QgbGNrOworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGVzdF9sb2NrPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworICAgIGludCBucl90aHJlYWRzX2luX3NpbmdsZSA9IDA7CisgICAgaW50IHJlc3VsdCA9IDA7CisgICAgaW50IG5yX2l0ZXJhdGlvbnMgPSAwOworICAgIGludCBpOworCisgICAgb21wX2luaXRfbG9jayAoJmxjayk7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNoYXJlZChsY2spICAKKyAgICB7CisKKyNwcmFnbWEgb21wIGZvcgorCWZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKwl7CisJICAgIC8qb21wX3NldF9sb2NrKCZsY2spOyovCisJICAgIDxvbXB0czpvcnBoYW4+CisJCTxvbXB0czpjaGVjaz53aGlsZSAoIW9tcF90ZXN0X2xvY2sgKCZsY2spKQorCQl7fTs8L29tcHRzOmNoZWNrPgorCSAgICA8L29tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIGZsdXNoCisJICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlKys7CisjcHJhZ21hIG9tcCBmbHVzaCAgICAgICAgICAgCisJICAgIG5yX2l0ZXJhdGlvbnMrKzsKKwkgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUtLTsKKwkgICAgcmVzdWx0ID0gcmVzdWx0ICsgbnJfdGhyZWFkc19pbl9zaW5nbGU7CisJICAgIDxvbXB0czpjaGVjaz5vbXBfdW5zZXRfbG9jayAoJmxjayk7PC9vbXB0czpjaGVjaz4KKwl9CisgICAgfQorICAgIG9tcF9kZXN0cm95X2xvY2soJmxjayk7CisKKyAgICByZXR1cm4gKChyZXN1bHQgPT0gMCkgJiYgKG5yX2l0ZXJhdGlvbnMgPT0gTE9PUENPVU5UKSk7CisKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGVzdF9uZXN0X2xvY2suYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90ZXN0X25lc3RfbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZDZhNDUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGVzdF9uZXN0X2xvY2suYwpAQCAtMCwwICsxLDQ4IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcF90ZXN0X25lc3RfbG9jayBmdW5jdGlvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX3Rlc3RfbmVzdF9sb2NrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworCitzdGF0aWMgb21wX25lc3RfbG9ja190IGxjazsKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rlc3RfbmVzdF9sb2NrPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworICAgIAorICAgIGludCBucl90aHJlYWRzX2luX3NpbmdsZSA9IDA7CisgICAgaW50IHJlc3VsdCA9IDA7CisgICAgaW50IG5yX2l0ZXJhdGlvbnMgPSAwOworICAgIGludCBpOworCisgICAgb21wX2luaXRfbmVzdF9sb2NrICgmbGNrKTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKGxjaykgCisgICAgeworCisjcHJhZ21hIG9tcCBmb3IKKwlmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisJeworCSAgICAvKm9tcF9zZXRfbG9jaygmbGNrKTsqLworPG9tcHRzOm9ycGhhbj4KKwkgICAgPG9tcHRzOmNoZWNrPndoaWxlKCFvbXBfdGVzdF9uZXN0X2xvY2sgKCZsY2spKQorCSAgICB7fTs8L29tcHRzOmNoZWNrPgorPC9vbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCBmbHVzaAorCSAgICBucl90aHJlYWRzX2luX3NpbmdsZSsrOworI3ByYWdtYSBvbXAgZmx1c2ggICAgICAgICAgIAorCSAgICBucl9pdGVyYXRpb25zKys7CisJICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlLS07CisJICAgIHJlc3VsdCA9IHJlc3VsdCArIG5yX3RocmVhZHNfaW5fc2luZ2xlOworCSAgICA8b21wdHM6Y2hlY2s+b21wX3Vuc2V0X25lc3RfbG9jayAoJmxjayk7PC9vbXB0czpjaGVjaz4KKwl9CisgICAgfQorICAgIG9tcF9kZXN0cm95X25lc3RfbG9jayAoJmxjayk7CisKKyAgICByZXR1cm4gKChyZXN1bHQgPT0gMCkgJiYgKG5yX2l0ZXJhdGlvbnMgPT0gTE9PUENPVU5UKSk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3RocmVhZHByaXZhdGUuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90aHJlYWRwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU0ZDdhYQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90aHJlYWRwcml2YXRlLmMKQEAgLTAsMCArMSw5NyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgdGhyZWFkcHJpdmF0ZSBkaXJlY3RpdmUgYnkgZmlsbGluZyBhbiBhcnJheSB3aXRoIHJhbmRvbSBudW1iZXJzIGluIGFuIHBhcmFsbGVsaXNlZCByZWdpb24uIEVhY2ggdGhyZWFkIGdlbmVyYXRlcyBvbmUgbnVtYmVyIG9mIHRoZSBhcnJheSBhbmQgc2F2ZXMgdGhpcyBpbiBhIHRlbXBvcmFyeSB0aHJlYWRwcml2YXRlIHZhcmlhYmxlLiBJbiBhIHNlY29uZCBwYXJhbGxlbGlzZWQgcmVnaW9uIHRoZSB0ZXN0IGNvbnRyb2xzLCB0aGF0IHRoZSB0ZW1wb3JhcnkgdmFyaWFibGUgY29udGFpbnMgc3RpbGwgdGhlIGZvcm1lciB2YWx1ZSBieSBjb21wYXJpbmcgaXQgd2l0aCB0aGUgb25lIGluIHRoZSBhcnJheS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHRocmVhZHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWwsb21wX3NldF9keW5hbWljLG9tcF9nZXRfbnVtX3RocmVhZHM8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorLyoKKyAqIFRocmVhZHByaXZhdGUgaXMgdGVzdGVkIGluIDIgd2F5czoKKyAqIDEuIFRoZSBnbG9iYWwgdmFyaWFibGUgZGVjbGFyZWQgYXMgdGhyZWFkcHJpdmF0ZSBzaG91bGQgaGF2ZQorICogICAgbG9jYWwgY29weSBmb3IgZWFjaCB0aHJlYWQuIE90aGVyd2lzZSByYWNlIGNvbmRpdGlvbiBhbmQgCisgKiAgICB3cm9uZyByZXN1bHQuCisgKiAyLiBJZiB0aGUgdmFsdWUgb2YgbG9jYWwgY29weSBpcyByZXRhaW5lZCBmb3IgdGhlIHR3byBhZGphY2VudAorICogICAgcGFyYWxsZWwgcmVnaW9ucworICovCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3N0YXRpYyBpbnQgc3VtMD0wOworc3RhdGljIGludCBteXZhbHVlID0gMDsKKworPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoc3VtMCk8L29tcHRzOmNoZWNrPgorPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUobXl2YWx1ZSk8L29tcHRzOmNoZWNrPgorCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90aHJlYWRwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworCWludCBzdW0gPSAwOworCWludCBrbm93bl9zdW07CisJaW50IGk7IAorCWludCBpdGVyOworCWludCAqZGF0YTsKKwlpbnQgc2l6ZTsKKwlpbnQgZmFpbGVkID0gMDsKKwlpbnQgbXlfcmFuZG9tOworCW9tcF9zZXRfZHluYW1pYygwKTsKKworICAgICNwcmFnbWEgb21wIHBhcmFsbGVsIHByaXZhdGUoaSkgCisgICAgeworCSAgc3VtMCA9IDA7CisgICAgICAjcHJhZ21hIG9tcCBmb3IgCisJICAgIGZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspCisJCXsKKwkJCXN1bTAgPSBzdW0wICsgaTsKKwkJfSAvKmVuZCBvZiBmb3IqLworICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkgIHsKKwkgICAgICBzdW0gPSBzdW0gKyBzdW0wOworCSAgfSAvKmVuZCBvZiBjcml0aWNhbCAqLworCX0gLyogZW5kIG9mIHBhcmFsbGVsICovICAgIAorCWtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKwlpZiAoa25vd25fc3VtICE9IHN1bSApIHsKKwkJZnByaW50ZiAobG9nRmlsZSwgIiBrbm93bl9zdW0gPSAlZCwgc3VtID0gJWRcbiIsIGtub3duX3N1bSwgc3VtKTsKKwl9CisKKwkvKiB0aGUgbmV4dCBwYXJhbGxlbCByZWdpb24gaXMganVzdCB1c2VkIHRvIGdldCB0aGUgbnVtYmVyIG9mIHRocmVhZHMqLworCW9tcF9zZXRfZHluYW1pYygwKTsKKyAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorCXsKKyAgICAgICNwcmFnbWEgb21wIG1hc3RlcgorCSAgeworCQkJc2l6ZT1vbXBfZ2V0X251bV90aHJlYWRzKCk7CisJCQlkYXRhPShpbnQqKSBtYWxsb2Moc2l6ZSpzaXplb2YoaW50KSk7CisJICB9CisJfS8qIGVuZCBwYXJhbGxlbCovCisKKworCXNyYW5kKDQ1KTsKKwlmb3IgKGl0ZXIgPSAwOyBpdGVyIDwgMTAwOyBpdGVyKyspeworCQlteV9yYW5kb20gPSByYW5kKCk7CS8qIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGlzIGNhbGxlZCBpbnNpZGUgc2VyaWFsIHJlZ2lvbiovCisKKwkvKiB0aGUgZmlyc3QgcGFyYWxsZWwgcmVnaW9uIGlzIHVzZWQgdG8gaW5pdGlhbGl5ZSBteXZhbHVlIGFuZCB0aGUgYXJyYXkgd2l0aCBteV9yYW5kb20rcmFuayovCisgICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKwl7CisJICAgIGludCByYW5rOworCQlyYW5rID0gb21wX2dldF90aHJlYWRfbnVtICgpOworCQlteXZhbHVlID0gZGF0YVtyYW5rXSA9IG15X3JhbmRvbSArIHJhbms7CisJfQorCisJLyogdGhlIHNlY29uZCBwYXJhbGxlbCByZWdpb24gdmVyaWZpZXMgdGhhdCB0aGUgdmFsdWUgb2YgIm15dmFsdWUiIGlzIHJldGFpbmVkICovCisgICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgcmVkdWN0aW9uKCs6ZmFpbGVkKQorCXsKKwkgICAgaW50IHJhbms7CisJCXJhbmsgPSBvbXBfZ2V0X3RocmVhZF9udW0gKCk7CisJCWZhaWxlZCA9IGZhaWxlZCArIChteXZhbHVlICE9IGRhdGFbcmFua10pOworCQlpZihteXZhbHVlICE9IGRhdGFbcmFua10peworCQkgIGZwcmludGYgKGxvZ0ZpbGUsICIgbXl2YWx1ZSA9ICVkLCBkYXRhW3JhbmtdPSAlZFxuIiwgbXl2YWx1ZSwgZGF0YVtyYW5rXSk7CisJCX0KKwl9CisgIH0KKyAgZnJlZSAoZGF0YSk7CisKKwlyZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pICYmICFmYWlsZWQ7CisKK30gLyogZW5kIG9mIGNoZWNrX3RocmVhZHByaXZhdGUqLworPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90aHJlYWRwcml2YXRlX2Zvci5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3RocmVhZHByaXZhdGVfZm9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM0MzU5ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90aHJlYWRwcml2YXRlX2Zvci5jCkBAIC0wLDAgKzEsNDQgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyBpZiBhIHZhcmlhYmxlIGRlY2xhcmVkIGFzIHRocmVhZHByaXZhdGUgY2FuIGJlIHVzZWQgYXMgYSBsb29waW5kZXguPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0aHJlYWRwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworc3RhdGljIGludCBpOworPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoaSk8L29tcHRzOmNoZWNrPgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGhyZWFkcHJpdmF0ZV9mb3I8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisJCWludCBrbm93bl9zdW07CisJCWludCBzdW07CisJCWtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKwkJc3VtID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKwl7CisJCWludCBzdW0wID0gMDsKKyNwcmFnbWEgb21wIGZvcgorCQlmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKQorCQl7CisJCQlzdW0wID0gc3VtMCArIGk7CisJCX0gLyplbmQgb2YgZm9yKi8KKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJCXsKKwkJCXN1bSA9IHN1bSArIHN1bTA7CisJCX0gLyplbmQgb2YgY3JpdGljYWwgKi8KKwl9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLyAgICAKKwkKKwlpZiAoa25vd25fc3VtICE9IHN1bSApIHsKKwkJZnByaW50ZiAobG9nRmlsZSwgIiBrbm93bl9zdW0gPSAlZCwgc3VtID0gJWRcbiIsIGtub3duX3N1bSwgc3VtKTsKKwl9CisKKwlyZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworCit9IC8qIGVuZCBvZiBjaGVja190aHJlYWRwcml2YXRlKi8KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CisKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jb21tb25fdXRpbGl0eS5mIGIvZmluYWwvdGVzdHN1aXRlL2NvbW1vbl91dGlsaXR5LmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZkMTA3OAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jb21tb25fdXRpbGl0eS5mCkBAIC0wLDAgKzEsNTcgQEAKKyAgICAgIHN1YnJvdXRpbmUgcHJpbnRfcmVzdWx0KHMsY3Jvc3NmYWlsZWQsTSxuYW1lKSAgICAgCisgICAgICBpbXBsaWNpdCBub25lCisgICAgICBjaGFyYWN0ZXIgKGxlbj0qKTo6bmFtZQorCSAgIHJlYWwgY2VydAorCSAgIGludGVnZXIgTSxjcm9zc2ZhaWxlZAorCSAgIGludGVnZXIgcworCSAgIGNoYXJhY3RlciAobGVuPTExKSA6OiBjCisgCSAgIGNoYXJhY3RlciAobGVuPTE4KSA6OiBjMgorCSAgIGNlcnQ9MTAwLjAqY3Jvc3NmYWlsZWQvTQorISAgICAgICAgICAgcHJpbnQgKiwgImNlcnQiLCBjZXJ0LCAiY3Jvc3MgIiwgY3Jvc3NmYWlsZWQKKyEJdGVzdDE9aHVuZHJlZCpjcm9zc2ZhaWxlZAorCSAgIGM9IiUgY2VydGFpbnR5IgorCSAgIGMyPSIgLi4uIHZlcmlmaWVkIHdpdGggIgorICAgICAgaWYocy5lcS4xKSB0aGVuCisgICAgICAgICB3cml0ZSAoKiwiKEEsIEEsIEY3LjIsIEEpIikgbmFtZSwgYzIsIGNlcnQsIGMKKyAgICAgIGVsc2UKKyAgICAgICAgIHdyaXRlICgqLCIoQSxBKSIpIG5hbWUsIiAuLi4gRkFJTEVEIgorICAgICAgZW5kaWYKKwkgICBlbmQKKworICAgICAgc3Vicm91dGluZSBkb190ZXN0KHRlc3RfZnVuYyxjcm9zc190ZXN0X2Z1bmMsbmFtZSxOLGZhaWxlZCwKKyAgICAgeCAgbnVtX3Rlc3RzLGNyb3NzY2hlY2tlZCkKKyAgICAgIGltcGxpY2l0IG5vbmUKKyAgICAgIGludGVnZXIgc3VjY2VlZAorICAgICAgaW50ZWdlciBjcm9zc2ZhaWwKKyAgICAgIGludGVnZXIgZmFpbGVkCisgICAgICBpbnRlZ2VyLCBleHRlcm5hbDo6dGVzdF9mdW5jCisgICAgICBpbnRlZ2VyLCBleHRlcm5hbDo6Y3Jvc3NfdGVzdF9mdW5jCisgICAgICBjaGFyYWN0ZXIgKGxlbj0qKTo6bmFtZQorICAgICAgaW50ZWdlciBmYWlsCisgICAgICBpbnRlZ2VyIE4saQorICAgICAgaW50ZWdlciBudW1fdGVzdHMsY3Jvc3NjaGVja2VkCisgICAgICBudW1fdGVzdHM9bnVtX3Rlc3RzKzEKKyAgICAgIHN1Y2NlZWQ9MQorICAgICAgY3Jvc3NmYWlsPTAKKyAgICAgIGZhaWw9MAorICAgICAgZG8gaT0xLE4KKyAgICAgICAgIGlmKHRlc3RfZnVuYygpLmVxLjApIHRoZW4KKyAgICAgICAgICAgIHN1Y2NlZWQ9MAorICAgICAgICAgICAgZmFpbD1mYWlsKzEKKyAgICAgICAgICAgIGV4aXQKKyAgICAgICAgIGVuZCBpZgorICAgICAgICAgaWYoY3Jvc3NfdGVzdF9mdW5jKCkuZXEuMCkgdGhlbgorISAgICAgICAgICAgIHByaW50ICosIGNyb3NzZmFpbAorICAgICAgICAgICAgY3Jvc3NmYWlsPWNyb3NzZmFpbCsxLjAgCisgICAgICAgICBlbmQgaWYKKyAgICAgIGVuZGRvCisgICAgICAKKyAgICAgIGlmIChmYWlsIC5uZS4gMCkgdGhlbgorICAgICAgICAgZmFpbGVkPWZhaWxlZCsxCisgICAgICBlbHNlCisgICAgICAgICBpZihjcm9zc2ZhaWwgLm5lLiAwKSB0aGVuCisgICAgICAgICAgICBjcm9zc2NoZWNrZWQ9Y3Jvc3NjaGVja2VkKzEKKyAgICAgICAgIGVuZCBpZgorICAgICAgZW5kaWYKKyAgICAgIGNhbGwgcHJpbnRfcmVzdWx0KHN1Y2NlZWQsY3Jvc3NmYWlsLE4sbmFtZSkKKyAgICAgIGVuZApkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2N1c3RvbXRlc3QudHh0IGIvZmluYWwvdGVzdHN1aXRlL2N1c3RvbXRlc3QudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZDA1YWUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvY3VzdG9tdGVzdC50eHQKQEAgLTAsMCArMSwyIEBACisjIEFkZCBjdXN0b20gdGVzdHMgaW4gdGhpcyBsaXN0CitvbXBfcGFyYWxsZWxfY29weWluCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9PTVAxX1RFU1QgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9PTVAxX1RFU1QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE2NGNlMAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL09NUDFfVEVTVApAQCAtMCwwICsxLDM2IEBACitoYXNfb3Blbm1wCitvbXBfbmVzdGVkCitvbXBfZ2V0X251bV90aHJlYWRzCitvbXBfaW5fcGFyYWxsZWwKK2RvX29yZGVyZWQKK2RvX3JlZHVjdGlvbgorZG9fcHJpdmF0ZQorZG9fZmlyc3Rwcml2YXRlCitkb19sYXN0cHJpdmF0ZQorc2VjdGlvbl9yZWR1Y3Rpb24KK3NlY3Rpb25fcHJpdmF0ZQorc2VjdGlvbl9maXJzdHByaXZhdGUKK3NlY3Rpb25fbGFzdHByaXZhdGUKK3NpbmdsZQorc2luZ2xlX3ByaXZhdGUKK3NpbmdsZV9ub3dhaXQKK3Bhcl9kb19vcmRlcmVkCitwYXJfZG9fcmVkdWN0aW9uCitwYXJfZG9fcHJpdmF0ZQorcGFyX2RvX2ZpcnN0cHJpdmF0ZQorcGFyX2RvX2xhc3Rwcml2YXRlCitwYXJfc2VjdGlvbl9yZWR1Y3Rpb24KK3Bhcl9zZWN0aW9uX3ByaXZhdGUKK3Bhcl9zZWN0aW9uX2ZpcnN0cHJpdmF0ZQorcGFyX3NlY3Rpb25fbGFzdHByaXZhdGUKK29tcF9tYXN0ZXJfdGhyZWFkCitvbXBfY3JpdGljYWwKK29tcF9hdG9taWMKK29tcF9iYXJyaWVyCitvbXBfZmx1c2gKK29tcF90aHJlYWRwcml2YXRlCitvbXBfY29weWluCitvbXBfbG9jaworb21wX3Rlc3Rsb2NrCitvbXBfbmVzdF9sb2NrCitvbXBfbmVzdF90ZXN0bG9jawpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vT01QMl9URVNUIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vT01QMl9URVNUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNDc2NjUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9PTVAyX1RFU1QKQEAgLTAsMCArMSw1IEBACitvbXBfbnVtX3RocmVhZHMKK29tcF93b3Jrc2hhcmUKK29tcF90aW1lCitvbXBfdGlja3NfdGltZQorc2luZ2xlX2NvcHlwcml2YXRlCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9jb21tb25fdXRpbGl0eS5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vY29tbW9uX3V0aWxpdHkuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmQxMDc4Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vY29tbW9uX3V0aWxpdHkuZgpAQCAtMCwwICsxLDU3IEBACisgICAgICBzdWJyb3V0aW5lIHByaW50X3Jlc3VsdChzLGNyb3NzZmFpbGVkLE0sbmFtZSkgICAgIAorICAgICAgaW1wbGljaXQgbm9uZQorICAgICAgY2hhcmFjdGVyIChsZW49Kik6Om5hbWUKKwkgICByZWFsIGNlcnQKKwkgICBpbnRlZ2VyIE0sY3Jvc3NmYWlsZWQKKwkgICBpbnRlZ2VyIHMKKwkgICBjaGFyYWN0ZXIgKGxlbj0xMSkgOjogYworIAkgICBjaGFyYWN0ZXIgKGxlbj0xOCkgOjogYzIKKwkgICBjZXJ0PTEwMC4wKmNyb3NzZmFpbGVkL00KKyEgICAgICAgICAgIHByaW50ICosICJjZXJ0IiwgY2VydCwgImNyb3NzICIsIGNyb3NzZmFpbGVkCishCXRlc3QxPWh1bmRyZWQqY3Jvc3NmYWlsZWQKKwkgICBjPSIlIGNlcnRhaW50eSIKKwkgICBjMj0iIC4uLiB2ZXJpZmllZCB3aXRoICIKKyAgICAgIGlmKHMuZXEuMSkgdGhlbgorICAgICAgICAgd3JpdGUgKCosIihBLCBBLCBGNy4yLCBBKSIpIG5hbWUsIGMyLCBjZXJ0LCBjCisgICAgICBlbHNlCisgICAgICAgICB3cml0ZSAoKiwiKEEsQSkiKSBuYW1lLCIgLi4uIEZBSUxFRCIKKyAgICAgIGVuZGlmCisJICAgZW5kCisKKyAgICAgIHN1YnJvdXRpbmUgZG9fdGVzdCh0ZXN0X2Z1bmMsY3Jvc3NfdGVzdF9mdW5jLG5hbWUsTixmYWlsZWQsCisgICAgIHggIG51bV90ZXN0cyxjcm9zc2NoZWNrZWQpCisgICAgICBpbXBsaWNpdCBub25lCisgICAgICBpbnRlZ2VyIHN1Y2NlZWQKKyAgICAgIGludGVnZXIgY3Jvc3NmYWlsCisgICAgICBpbnRlZ2VyIGZhaWxlZAorICAgICAgaW50ZWdlciwgZXh0ZXJuYWw6OnRlc3RfZnVuYworICAgICAgaW50ZWdlciwgZXh0ZXJuYWw6OmNyb3NzX3Rlc3RfZnVuYworICAgICAgY2hhcmFjdGVyIChsZW49Kik6Om5hbWUKKyAgICAgIGludGVnZXIgZmFpbAorICAgICAgaW50ZWdlciBOLGkKKyAgICAgIGludGVnZXIgbnVtX3Rlc3RzLGNyb3NzY2hlY2tlZAorICAgICAgbnVtX3Rlc3RzPW51bV90ZXN0cysxCisgICAgICBzdWNjZWVkPTEKKyAgICAgIGNyb3NzZmFpbD0wCisgICAgICBmYWlsPTAKKyAgICAgIGRvIGk9MSxOCisgICAgICAgICBpZih0ZXN0X2Z1bmMoKS5lcS4wKSB0aGVuCisgICAgICAgICAgICBzdWNjZWVkPTAKKyAgICAgICAgICAgIGZhaWw9ZmFpbCsxCisgICAgICAgICAgICBleGl0CisgICAgICAgICBlbmQgaWYKKyAgICAgICAgIGlmKGNyb3NzX3Rlc3RfZnVuYygpLmVxLjApIHRoZW4KKyEgICAgICAgICAgICBwcmludCAqLCBjcm9zc2ZhaWwKKyAgICAgICAgICAgIGNyb3NzZmFpbD1jcm9zc2ZhaWwrMS4wIAorICAgICAgICAgZW5kIGlmCisgICAgICBlbmRkbworICAgICAgCisgICAgICBpZiAoZmFpbCAubmUuIDApIHRoZW4KKyAgICAgICAgIGZhaWxlZD1mYWlsZWQrMQorICAgICAgZWxzZQorICAgICAgICAgaWYoY3Jvc3NmYWlsIC5uZS4gMCkgdGhlbgorICAgICAgICAgICAgY3Jvc3NjaGVja2VkPWNyb3NzY2hlY2tlZCsxCisgICAgICAgICBlbmQgaWYKKyAgICAgIGVuZGlmCisgICAgICBjYWxsIHByaW50X3Jlc3VsdChzdWNjZWVkLGNyb3NzZmFpbCxOLG5hbWUpCisgICAgICBlbmQKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX2NvbGxhcHNlLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9kb19jb2xsYXBzZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MTcyNTAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9kb19jb2xsYXBzZS5mCkBAIC0wLDAgKzEsNjcgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdpdGggb21wIGZvciBjb2xsYXBzZSBjbGF1c2UuIEJpbmQgd2l0aCB0d28gbG9vcHMuIFdpdGhvdXQgdGhlIGNvbGxhcHNlIGNsYXVzZSwgdGhlIGZpcnN0IGxvb3Agd2lsbCBub3QgYmUgb3JkZXJlZDwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+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+CisKKy8qISBVdGlsaXR5IGZ1bmN0aW9uIHRvIGhhdmUgYSBzbGVlcCBmdW5jdGlvbiB3aXRoIGJldHRlciByZXNvbHV0aW9uIGFuZCB3aGljaCBvbmx5IHN0b3BzIG9uZSB0aHJlYWQuICovCisKK3N0YXRpYyB2b2lkIG15X3NsZWVwKGRvdWJsZSBzbGVlcHRpbWUpeworICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgc3RydWN0IHRpbWV6b25lIHR6cDsKKyAgZG91YmxlIHN0YXJ0OworICBkb3VibGUgcmVhbDsKKyAgaWYoZ2V0dGltZW9mZGF5KCZ0diwmdHpwKSE9MCkgeworICAgIHBlcnJvcigiZ2V0X3RpbWU6ICIpOworICAgIGV4aXQoLTEpOworICB9CisgIHN0YXJ0ID0gKGRvdWJsZSl0di50dl9zZWMgKyAoKGRvdWJsZSl0di50dl91c2VjLzEwMDAwMDAuMCk7CisgIHJlYWw9c3RhcnQ7CisgIHdoaWxlKCAocmVhbC1zdGFydCk8c2xlZXB0aW1lKXsKKyAgICBpZihnZXR0aW1lb2ZkYXkoJnR2LCZ0enApIT0wKSB7CisgICAgICBwZXJyb3IoImdldF90aW1lOiAiKTsKKyAgICAgIGV4aXQoLTEpOworICAgIH0KKyAgICByZWFsID0gKGRvdWJsZSl0di50dl9zZWMgKyAoKGRvdWJsZSl0di50dl91c2VjLzEwMDAwMDAuMCk7CisgIH0KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvb21wX3Rlc3RzdWl0ZS5mIGIvZmluYWwvdGVzdHN1aXRlL29tcF90ZXN0c3VpdGUuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTM1MzEzCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL29tcF90ZXN0c3VpdGUuZgpAQCAtMCwwICsxLDE0IEBACisgICAgICBJTlRFR0VSIE4gIVRoZSBudW1iZXIgb2YgdGltZXMgZWFjaCB0ZXN0IGlzIHJ1bgorICAgICAgUEFSQU1FVEVSIChOPTEpCisgICAgICBDSEFSQUNURVIqOCBPTVBUU19WRVJTSU9OCisgICAgICBQQVJBTUVURVIgKE9NUFRTX1ZFUlNJT049IjMuMC5hIikKKyAgICAgIElOVEVHRVIgTE9PUENPVU5UICFUaGUgbnVtYmVyIG9mIHRpbWVzIGVhY2ggbG9vcCBpcyBydW4KKyAgICAgIFBBUkFNRVRFUiAoTE9PUENPVU5UPTEwMDApCisgICAgICBET1VCTEUgUFJFQ0lTSU9OIFNMRUVQVElNRQorICAgICAgUEFSQU1FVEVSIChTTEVFUFRJTUUgPSAuMDEpCisgICAgICBET1VCTEUgUFJFQ0lTSU9OIFNMRUVQVElNRV9MT05HCisgICAgICBQQVJBTUVURVIgKFNMRUVQVElNRV9MT05HID0gMC41KQorICAgICAgSU5URUdFUiBOVU1fVEFTS1MKKyAgICAgIFBBUkFNRVRFUiAoTlVNX1RBU0tTPTI1KQorICAgICAgSU5URUdFUiBNQVhfVEFTS1NfUEVSX1RIUkVBRAorICAgICAgUEFSQU1FVEVSIChNQVhfVEFTS1NfUEVSX1RIUkVBRD01KQpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL29tcF90ZXN0c3VpdGUuaCBiL2ZpbmFsL3Rlc3RzdWl0ZS9vbXBfdGVzdHN1aXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ExODY2ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9vbXBfdGVzdHN1aXRlLmgKQEAgLTAsMCArMSwxNjQgQEAKKy8qIEdsb2JhbCBoZWFkZXJmaWxlIG9mIHRoZSBPcGVuTVAgVGVzdHN1aXRlICovCisKKy8qIFRoaXMgZmlsZSB3YXMgY3JlYXRlZCB3aXRoIHRoZSBvbXB0c19tYWtlSGVhZGVyLnBsIHNjcmlwdCB1c2luZyB0aGUgZm9sbG93aW5nIG9waW9uczogKi8KKy8qIC1mPW9tcHRzLWMuY29uZiAtdD1jICAqLworCisKKyNpZm5kZWYgT01QX1RFU1RTVUlURV9ICisjZGVmaW5lIE9NUF9URVNUU1VJVEVfSAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvbXAuaD4KKworLyogVmVyc2lvbiBpbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgT01QVFNfVkVSU0lPTiAiMy4wYSIKKworLyogR2VuZXJhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTE9PUENPVU5UIAkxMDAwCisjZGVmaW5lIFJFUEVUSVRJT05TIAkgIDIwCisvKiBmb2xsb3dpbmcgdGltZXMgYXJlIGluIHNlY29uZHMgKi8KKyNkZWZpbmUgU0xFRVBUSU1FCSAwLjAxCisjZGVmaW5lIFNMRUVQVElNRV9MT05HCSAwLjUKKworLyogRGVmaW5pdGlvbnMgZm9yIHRhc2tzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTlVNX1RBU0tTICAgICAgICAgICAgICAyNQorI2RlZmluZSBNQVhfVEFTS1NfUEVSX1RIUkVBRCAgICA1CitpbnQgdGVzdF9vbXBfbmVzdGVkKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcF9uZXN0ZWQgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX25lc3RlZChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcF9uZXN0ZWQgKi8KK2ludCB0ZXN0X29tcF9uZXN0X2xvY2soRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wX25lc3RfbG9jayAqLworaW50IGNyb3NzdGVzdF9vbXBfbmVzdF9sb2NrKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wX25lc3RfbG9jayAqLworaW50IHRlc3Rfb21wX3Rhc2tfaWYoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHRhc2sgaWYgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3Rhc2tfaWYoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgdGFzayBpZiAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX3NoYXJlZChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgc2hhcmVkICovCitpbnQgY3Jvc3N0ZXN0X29tcF9wYXJhbGxlbF9zaGFyZWQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgc2hhcmVkICovCitpbnQgdGVzdF9vbXBfc2luZ2xlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBzaW5nbGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3NpbmdsZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBzaW5nbGUgKi8KK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9zZWN0aW9uc19yZWR1Y3Rpb24oRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIHNlY3Rpb25zIHJlZHVjdGlvbiAqLworaW50IGNyb3NzdGVzdF9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfcmVkdWN0aW9uKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHBhcmFsbGVsIHNlY3Rpb25zIHJlZHVjdGlvbiAqLworaW50IHRlc3Rfb21wX2Zvcl9zY2hlZHVsZV9keW5hbWljKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYykgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2Zvcl9zY2hlZHVsZV9keW5hbWljKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIGZvciBzY2hlZHVsZShkeW5hbWljKSAqLworaW50IHRlc3RfaGFzX29wZW5tcChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBfT1BFTk1QICovCitpbnQgY3Jvc3N0ZXN0X2hhc19vcGVubXAoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBfT1BFTk1QICovCitpbnQgdGVzdF9vbXBfdGFza3dhaXQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHRhc2t3YWl0ICovCitpbnQgY3Jvc3N0ZXN0X29tcF90YXNrd2FpdChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCB0YXNrd2FpdCAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX2Zvcl9sYXN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgZm9yIGxhc3Rwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF9wYXJhbGxlbF9mb3JfbGFzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgZm9yIGxhc3Rwcml2YXRlICovCitpbnQgdGVzdF9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpY18zKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBmb3Igc2NoZWR1bGUoc3RhdGljKSAqLworaW50IGNyb3NzdGVzdF9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpY18zKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIGZvciBzY2hlZHVsZShzdGF0aWMpICovCitpbnQgdGVzdF9vbXBfY3JpdGljYWwoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGNyaXRpY2FsICovCitpbnQgY3Jvc3N0ZXN0X29tcF9jcml0aWNhbChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBjcml0aWNhbCAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX3NlY3Rpb25zX2xhc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBsYXN0cHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfbGFzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgbGFzdHByaXZhdGUgKi8KK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9udW1fdGhyZWFkcyhGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyZWxsZWwgbnVtX3RocmVhZHMgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX251bV90aHJlYWRzKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHBhcmVsbGVsIG51bV90aHJlYWRzICovCitpbnQgdGVzdF9vbXBfc2VjdGlvbnNfcmVkdWN0aW9uKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBzZWN0aW9ucyByZWR1Y3Rpb24gKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3NlY3Rpb25zX3JlZHVjdGlvbihGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBzZWN0aW9ucyByZWR1Y3Rpb24gKi8KK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9pZihGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgaWYgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX2lmKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHBhcmFsbGVsIGlmICovCitpbnQgdGVzdF9vbXBfdGFza19pbXBfc2hhcmVkKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCB0YXNrICovCitpbnQgY3Jvc3N0ZXN0X29tcF90YXNrX2ltcF9zaGFyZWQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgdGFzayAqLworaW50IHRlc3Rfb21wX3NlY3Rpb25fbGFzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHNlY3Rpb24gbGFzdHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3NlY3Rpb25fbGFzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgc2VjdGlvbiBsYXN0cHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX2Zvcl9jb2xsYXBzZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgZm9yIGNvbGxhcHNlICovCitpbnQgY3Jvc3N0ZXN0X29tcF9mb3JfY29sbGFwc2UoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgZm9yIGNvbGxhcHNlICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfZm9yX2ZpcnN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgZm9yIGZpcnN0cHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfcGFyYWxsZWxfZm9yX2ZpcnN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBmb3IgZmlyc3Rwcml2YXRlICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfY29weWluKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBwYXJhbGxlbCBjb3B5aW4gKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX2NvcHlpbihGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBjb3B5aW4gKi8KK2ludCB0ZXN0X29tcF90ZXN0X25lc3RfbG9jayhGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXBfdGVzdF9uZXN0X2xvY2sgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3Rlc3RfbmVzdF9sb2NrKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wX3Rlc3RfbmVzdF9sb2NrICovCitpbnQgdGVzdF9vbXBfZm9yX29yZGVyZWQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGZvciBvcmRlcmVkICovCitpbnQgY3Jvc3N0ZXN0X29tcF9mb3Jfb3JkZXJlZChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBmb3Igb3JkZXJlZCAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX3JlZHVjdGlvbihGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgcmVkdWN0aW9uICovCitpbnQgY3Jvc3N0ZXN0X29tcF9wYXJhbGxlbF9yZWR1Y3Rpb24oRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgcmVkdWN0aW9uICovCitpbnQgdGVzdF9vbXBfZ2V0X3d0aWNrKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcF9nZXRfd3RpY2sgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2dldF93dGljayhGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcF9nZXRfd3RpY2sgKi8KK2ludCB0ZXN0X29tcF90YXNreWllbGQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHRhc2t5aWVsZCAqLworaW50IGNyb3NzdGVzdF9vbXBfdGFza3lpZWxkKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHRhc2t5aWVsZCAqLworaW50IHRlc3Rfb21wX2Zvcl9zY2hlZHVsZV9zdGF0aWMoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGZvciBzY2hlZHVsZShzdGF0aWMpICovCitpbnQgY3Jvc3N0ZXN0X29tcF9mb3Jfc2NoZWR1bGVfc3RhdGljKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIGZvciBzY2hlZHVsZShzdGF0aWMpICovCitpbnQgdGVzdF9vbXBfc2luZ2xlX3ByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHNpbmdlbCBwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF9zaW5nbGVfcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBzaW5nZWwgcHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX2Zvcl9maXJzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGZvciBmaXJzdHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2Zvcl9maXJzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgZm9yIGZpcnN0cHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX2Zvcl9yZWR1Y3Rpb24oRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIGZvciByZWR1Y3Rpb24gKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX2Zvcl9yZWR1Y3Rpb24oRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgZm9yIHJlZHVjdGlvbiAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX2Zvcl9pZihGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgZm9yIGlmICovCitpbnQgY3Jvc3N0ZXN0X29tcF9wYXJhbGxlbF9mb3JfaWYoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgZm9yIGlmICovCitpbnQgdGVzdF9vbXBfc2luZ2xlX25vd2FpdChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgc2luZ2xlIG5vd2FpdCAqLworaW50IGNyb3NzdGVzdF9vbXBfc2luZ2xlX25vd2FpdChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBzaW5nbGUgbm93YWl0ICovCitpbnQgdGVzdF9vbXBfdGFza19maXJzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHRhc2sgZmlyc3Rwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF90YXNrX2ZpcnN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCB0YXNrIGZpcnN0cHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX2Zvcl9ub3dhaXQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIGZvciBub3dhaXQgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2Zvcl9ub3dhaXQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgZm9yIG5vd2FpdCAqLworaW50IHRlc3Rfb21wX3Rhc2tfcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgdGFzayBwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF90YXNrX3ByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgdGFzayBwcml2YXRlICovCitpbnQgdGVzdF9vbXBfdGVzdF9sb2NrKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcF90ZXN0X2xvY2sgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3Rlc3RfbG9jayhGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcF90ZXN0X2xvY2sgKi8KK2ludCB0ZXN0X29tcF9nZXRfd3RpbWUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wX2dldF93dGltZSAqLworaW50IGNyb3NzdGVzdF9vbXBfZ2V0X3d0aW1lKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wX2dldF93dGltZSAqLworaW50IHRlc3Rfb21wX3Rhc2tfaW1wX2ZpcnN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgdGFzayAqLworaW50IGNyb3NzdGVzdF9vbXBfdGFza19pbXBfZmlyc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHRhc2sgKi8KK2ludCB0ZXN0X29tcF9hdG9taWMoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGF0b21pYyAqLworaW50IGNyb3NzdGVzdF9vbXBfYXRvbWljKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIGF0b21pYyAqLworaW50IHRlc3Rfb21wX3RocmVhZHByaXZhdGVfZm9yKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCB0aHJlYWRwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF90aHJlYWRwcml2YXRlX2ZvcihGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCB0aHJlYWRwcml2YXRlICovCitpbnQgdGVzdF9vbXBfc2luZ2xlX2NvcHlwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBzaW5nbGUgY29weXByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3NpbmdsZV9jb3B5cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBzaW5nbGUgY29weXByaXZhdGUgKi8KK2ludCB0ZXN0X29tcF9tYXN0ZXIoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIG1hc3RlciAqLworaW50IGNyb3NzdGVzdF9vbXBfbWFzdGVyKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIG1hc3RlciAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX2ZpcnN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgZmlyc3Rwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF9wYXJhbGxlbF9maXJzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgZmlyc3Rwcml2YXRlICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfZm9yX3ByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIGZvciBwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF9wYXJhbGxlbF9mb3JfcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBmb3IgcHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX2RlZmF1bHQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIGRlZmF1bHQgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX2RlZmF1bHQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgZGVmYXVsdCAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX2Zvcl9vcmRlcmVkKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBwYXJhbGxlbCBmb3Igb3JkZXJlZCAqLworaW50IGNyb3NzdGVzdF9vbXBfcGFyYWxsZWxfZm9yX29yZGVyZWQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgZm9yIG9yZGVyZWQgKi8KK2ludCB0ZXN0X29tcF9mb3JfbGFzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGZvciBsYXN0cHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfZm9yX2xhc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIGZvciBsYXN0cHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX2xvY2soRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wX2xvY2sgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2xvY2soRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXBfbG9jayAqLworaW50IHRlc3Rfb21wX2JhcnJpZXIoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGJhcnJpZXIgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2JhcnJpZXIoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgYmFycmllciAqLworaW50IHRlc3Rfb21wX3NlY3Rpb25zX25vd2FpdChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgbm93YWl0ICovCitpbnQgY3Jvc3N0ZXN0X29tcF9zZWN0aW9uc19ub3dhaXQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgbm93YWl0ICovCitpbnQgdGVzdF9vbXBfbWFzdGVyXzMoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIG1hc3RlciAqLworaW50IGNyb3NzdGVzdF9vbXBfbWFzdGVyXzMoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgbWFzdGVyICovCitpbnQgdGVzdF9vbXBfdGFza191bnRpZWQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHRhc2sgdW50aWVkICovCitpbnQgY3Jvc3N0ZXN0X29tcF90YXNrX3VudGllZChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCB0YXNrIHVudGllZCAqLworaW50IHRlc3Rfb21wX3Rhc2soRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHRhc2sgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3Rhc2soRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgdGFzayAqLworaW50IHRlc3Rfb21wX2luX3BhcmFsbGVsKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcF9pbl9wYXJhbGxlbCAqLworaW50IGNyb3NzdGVzdF9vbXBfaW5fcGFyYWxsZWwoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXBfaW5fcGFyYWxsZWwgKi8KK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9zZWN0aW9uc19maXJzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIHNlY3Rpb25zIGZpcnN0cHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfZmlyc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHBhcmFsbGVsIHNlY3Rpb25zIGZpcnN0cHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX2Zvcl9hdXRvKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBmb3IgYXV0byAqLworaW50IGNyb3NzdGVzdF9vbXBfZm9yX2F1dG8oRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgZm9yIGF1dG8gKi8KK2ludCB0ZXN0X29tcF90YXNrX2ZpbmFsKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCB0YXNrIGZpbmFsICovCitpbnQgY3Jvc3N0ZXN0X29tcF90YXNrX2ZpbmFsKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHRhc2sgZmluYWwgKi8KK2ludCB0ZXN0X29tcF9zZWN0aW9uX3ByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHNlY3Rpb24gcHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfc2VjdGlvbl9wcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHNlY3Rpb24gcHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX3NlY3Rpb25zX3ByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX3NlY3Rpb25zX3ByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX2Zvcl9yZWR1Y3Rpb24oRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGZvciByZWR1Y3Rpb24gKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2Zvcl9yZWR1Y3Rpb24oRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgZm9yIHJlZHVjdGlvbiAqLworaW50IHRlc3Rfb21wX2Zvcl9wcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBmb3IgcHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfZm9yX3ByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgZm9yIHByaXZhdGUgKi8KK2ludCB0ZXN0X29tcF9mbHVzaChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgZmx1c2ggKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2ZsdXNoKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIGZsdXNoICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgcHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfcGFyYWxsZWxfcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBwcml2YXRlICovCitpbnQgdGVzdF9vbXBfdGhyZWFkcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgdGhyZWFkcHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfdGhyZWFkcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCB0aHJlYWRwcml2YXRlICovCitpbnQgdGVzdF9vbXBfc2VjdGlvbl9maXJzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGZpcnN0cHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfc2VjdGlvbl9maXJzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgZmlyc3Rwcml2YXRlICovCitpbnQgdGVzdF9vbXBfZm9yX3NjaGVkdWxlX2d1aWRlZChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgZm9yIHNjaGVkdWxlKGd1aWRlZCkgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2Zvcl9zY2hlZHVsZV9ndWlkZWQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgZm9yIHNjaGVkdWxlKGd1aWRlZCkgKi8KK2ludCB0ZXN0X29tcF9nZXRfbnVtX3RocmVhZHMoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wX2dldF9udW1fdGhyZWFkcyAqLworaW50IGNyb3NzdGVzdF9vbXBfZ2V0X251bV90aHJlYWRzKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wX2dldF9udW1fdGhyZWFkcyAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9vbXB0cy1jLmNvbmYgYi9maW5hbC90ZXN0c3VpdGUvb21wdHMtYy5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMGI5NTAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvb21wdHMtYy5jb25mCkBAIC0wLDAgKzEsMTkgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9tcC5oPgorCisvKiBWZXJzaW9uIGluZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBPTVBUU19WRVJTSU9OICIzLjBhIgorCisvKiBHZW5lcmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBMT09QQ09VTlQgCTEwMDAKKyNkZWZpbmUgUkVQRVRJVElPTlMgCSAgMjAKKy8qIGZvbGxvd2luZyB0aW1lcyBhcmUgaW4gc2Vjb25kcyAqLworI2RlZmluZSBTTEVFUFRJTUUJIDAuMDEKKyNkZWZpbmUgU0xFRVBUSU1FX0xPTkcJIDAuNQorCisvKiBEZWZpbml0aW9ucyBmb3IgdGFza3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBOVU1fVEFTS1MgICAgICAgICAgICAgIDI1CisjZGVmaW5lIE1BWF9UQVNLU19QRVJfVEhSRUFEICAgIDUKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9vbXB0cy1mLmNvbmYgYi9maW5hbC90ZXN0c3VpdGUvb21wdHMtZi5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNWFmMzAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvb21wdHMtZi5jb25mCkBAIC0wLDAgKzEgQEAKKyFFbXB0eSBjb25maWcgZmlsZQpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL29tcHRzLmNvbmYgYi9maW5hbC90ZXN0c3VpdGUvb21wdHMuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zMzEzNWI1Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL29tcHRzLmNvbmYKQEAgLTAsMCArMSwyNiBAQAorPGNvbmZpZz4KKzxnbG9iYWxjb25maWc+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+IHMvWyBcdF0rLy9nOworICB9CisgIHJldHVybiAkc3RyOworfQorCityZXR1cm4gMTsKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9vbXB0c19zdGFuZGFsb25lUHJvYy5jIGIvZmluYWwvdGVzdHN1aXRlL29tcHRzX3N0YW5kYWxvbmVQcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAzMDUyYQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9vbXB0c19zdGFuZGFsb25lUHJvYy5jCkBAIC0wLDAgKzEsNTEgQEAKK2ludCBtYWluKCkKK3sKKwlpbnQgaTsJCQkvKiBMb29wIGluZGV4ICovCisJaW50IHJlc3VsdDsJCS8qIHJldHVybiB2YWx1ZSBvZiB0aGUgcHJvZ3JhbSAqLworCWludCBmYWlsZWQ9MDsgCQkvKiBOdW1iZXIgb2YgZmFpbGVkIHRlc3RzICovCisJaW50IHN1Y2Nlc3M9MDsJCS8qIG51bWJlciBvZiBzdWNjZWVkZWQgdGVzdHMgKi8KKwlzdGF0aWMgRklMRSAqIGxvZ0ZpbGU7CS8qIHBvaW50ZXIgb250byB0aGUgbG9nZmlsZSAqLworCXN0YXRpYyBjb25zdCBjaGFyICogbG9nRmlsZU5hbWUgPSAiYmluL2MvPHRlc3RmdW5jdGlvbm5hbWU+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+KXsgJHNyYyAuPSAkXzsgfQorY2xvc2UoVEVTVCk7CisKKyMgRXh0cmFjdGluZyB0aGUgc291cmNlIGZvciB0aGUgbWFpbnByb2dyYW1tIGFuZCBzYXZpbmcgaXQgaW4gJG1haW5wcm9jc3JjCitvcGVuKE1BSU5QUk9DLCRtYWlucHJvY3NyYykgb3IgZGllICJDb3VsZCBub3Qgb3BlbiB0aGUgc291cmNlZmlsZSBmb3IgdGhlIG1haW4gcHJvZ3JhbSAkbWFpbnByb2NzcmMiOword2hpbGUoPE1BSU5QUk9DPil7ICRtYWlucHJvYyAuPSAkXzsgfQorY2xvc2UgKE1BSU5QUk9DKTsKKworIyBTb21lIHRlbXBvcmFyeSB0ZXN0aW5mb3JtYXRpb246CisoJGRlc2NyaXB0aW9uKSAgPSBnZXRfdGFnX3ZhbHVlcyAoJ29tcHRzOnRlc3RkZXNjcmlwdGlvbicsJHNyYyk7CisoJGRpcmVjdGl2ZSkgICAgPSBnZXRfdGFnX3ZhbHVlcyAoJ29tcHRzOmRpcmVjdGl2ZScsJHNyYyk7CisoJGZ1bmN0aW9ubmFtZSkgPSBnZXRfdGFnX3ZhbHVlcyAoJ29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZScsJHNyYyk7CisKK29wZW4gKE9VVEZJTEUsIj4kb3V0ZmlsZSIpIG9yIGRpZSAiQ291bGQgbm90IGNyZWF0ZSB0aGUgb3V0cHV0IGZpbGUgZm9yICRkaXJlY3RpdmUiOworCisjIENyZWF0aW5nIHRoZSBzb3VyY2UgZm9yIHRoZSB0ZXN0OgorKCRjb2RlKSA9IGdldF90YWdfdmFsdWVzKCdvbXB0czp0ZXN0Y29kZScsJHNyYyk7CisjIFB1dHRpbmcgdG9nZXRoZXIgdGhlIGZ1bmN0aW9ucyBhbmQgdGhlIG1haW5wcm9ncmFtbToKKyRjb2RlIC49ICRtYWlucHJvYzsKKworI3RoYW5rcyB0byBEci4gWWluIE1hIGluIEFic29mdCwgZ2V0IHRoZSBwYXJhbWV0ZXJzIDxvbXB0czpvcnBoYW46cGFyYW1zPiBieSBqb29uCisgKCRwYXJtcykgPSBnZXRfdGFnX3ZhbHVlcygnb21wdHM6b3JwaGFuOnBhcm1zJywoJGNvZGUpKTsKKyAoJHBhcm1zKSA9IGxlYXZlX3NpbmdsZV9zcGFjZSgkcGFybXMpOworICgkY29kZSkgPSByZXBsYWNlX3RhZ3MoJ29tcHRzOm9ycGhhbjpwYXJtcycsJycsJGNvZGUpOworCisjIE1ha2UgbW9kaWZpY2F0aW9ucyBmb3IgdGhlIG9ycGhhbmVkIHRlc3R2ZXJzaW9uIGlmIG5lY2Vzc2FyeToKK2lmICgkb3JwaGFuKSB7CisjIEdldCB0aGUgZ2xvYmFsIHZhcmlhYmxlczoKKyAgICBAZGVmcyA9IGdldF90YWdfdmFsdWVzKCJvbXB0czpvcnBoYW46dmFycyIsJGNvZGUpOworICAgICRvcnBodmFyc2RlZiA9ICIiOworICAgIGZvcmVhY2ggKEBkZWZzKSB7CisgICAgICAgIGlmIChub3QgL15bIF0qJC9ncykgeyAkb3JwaHZhcnNkZWYgPSBqb2luKCJcbiIsJG9ycGh2YXJzZGVmLCRfKTsgfSAKKyAgICB9CisjIEdlbmVyYXRlIHRoZSBvcnBoYW4gc3Vicm91dGluZXM6CisgICAgICAgICRvcnBoZnVuY3MgPSBjcmVhdGVfb3JwaF9mb3J0cmFuZnVuY3Rpb25zICgiIiwgKCRjb2RlKSwoJHBhcm1zKSk7CisjIFJlcGxhY2Ugb3JwaGFuIHJlZ2lvbnMgYnkgZnVuY3Rpb25jYWxsczoKKyAgICAgICAgKCRjb2RlKSA9IG9ycGhhbl9yZWdpb25zMmZvcnRyYW5mdW5jdGlvbnMgKCIiLCAoJGNvZGUpLCgkcGFybXMpKTsKKyAgICAgICAgKCRjb2RlKSA9IGVubGFyZ2VfdGFncyAoJ29tcHRzOm9ycGhhbjp2YXJzJywnJywnJywoJGNvZGUpKTsKKyMgdG8gZmluZCBvcnBoYW4gY2FsbCBzdGF0ZW1lbnQgYW5kIGFkZCBwYXJhbWV0ZXJzLCBieSBqb29uCisgICAgICAgICgkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOm9ycGhhbjpwYXJtcycsJycsJycsKCRjb2RlKSk7CisjIFB1dCBhbGwgdG9nZXRoZXI6CisgICAgICAgICRjb2RlID0gJGNvZGUgLiAkb3JwaGZ1bmNzOworfQorCisjIFJlbW92ZSByZW1haW5pbmcgbWFya3MgZm9yIHRoZSBvcnBhaG4gcmVnaW9ucyBhbmQgaXRzIHZhcmlhYmxlczoKKygkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOm9ycGhhbicsJycsJycsKCRjb2RlKSk7CisoJGNvZGUpID0gZW5sYXJnZV90YWdzKCdvbXB0czpvcnBoYW46dmFycycsJycsJycsKCRjb2RlKSk7CisjIHJlbW92ZSBwYXJhbWV0ZXJzIGJldHdlZW4gZm9yIG9ycGhhbmVkIGRpcmVjdGl2ZSBwYXJhbWV0ZXMsIGFkZGVkIGJ5am9vbgorKCRjb2RlKSA9IGVubGFyZ2VfdGFncygnb21wdHM6b3JwaGFuOnBhcm1zJywnJywnJywoJGNvZGUpKTsKKworaWYoJHRlc3QpIHsKKyMgUmVtb3ZlIHRoZSBtYXJrcyBmb3IgdGhlIHRlc3Rjb2RlIGFuZCByZW1vdmUgdGhlIGNvZGUgZm9yIHRoZSBjcm9zc3Rlc3RzOiAKKyAgICAoJGNvZGUpID0gZW5sYXJnZV90YWdzKCdvbXB0czpjaGVjaycsJycsJycsKCRjb2RlKSk7CisgICAgKCRjb2RlKSA9IGRlbGV0ZV90YWdzKCdvbXB0czpjcm9zc2NoZWNrJywoJGNvZGUpKTsJCQorfQorZWxzaWYoJGNyb3NzdGVzdCkgeworIyBSZW1vdmUgdGhlIG1hcmtzIGZvciB0aGUgY3Jvc3N0ZXN0Y29kZSBhbmQgcmVtb3ZlIHRoZSBjb2RlIGZvciB0aGUgdGVzdHM6IAorICAgICgkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOmNyb3NzY2hlY2snLCcnLCcnLCgkY29kZSkpOworICAgICgkY29kZSkgPSBkZWxldGVfdGFncygnb21wdHM6Y2hlY2snLCgkY29kZSkpOwkJCit9CisjIE1ha2luZyBzb21lIGZpbmFsIG1vZGlmaWNhdGlvbnM6CisoJGNvZGUpID0gcmVwbGFjZV90YWdzKCd0ZXN0ZnVuY3Rpb25uYW1lJywidGVzdF8iLiRmdW5jdGlvbm5hbWUsKCRjb2RlKSk7CisoJGNvZGUpID0gcmVwbGFjZV90YWdzKCdkaXJlY3RpdmUnLCRkaXJlY3RpdmUsKCRjb2RlKSk7CisoJGNvZGUpID0gcmVwbGFjZV90YWdzKCdkZXNjcmlwdGlvbicsJGRlc2NyaXB0aW9uLCgkY29kZSkpOworKCRjb2RlKSA9IGVubGFyZ2VfdGFncygnb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lJywidGVzdF8iLCcnLCgkY29kZSkgKTsKKyMJJGNvZGUgPSAgIlwjaW5jbHVkZSBcIm9tcF90ZXN0c3VpdGUuaFwiXG4iLiRjb2RlOworIyBXcml0ZSB0aGUgcmVzdWx0IGludG8gdGhlIGZpbGUgYW5kIGNsb3NlIGl0OgorcHJpbnQgT1VURklMRSAkY29kZTsKK2Nsb3NlKE9VVEZJTEUpOwpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL3Rlc3RsaXN0LWMudHh0IGIvZmluYWwvdGVzdHN1aXRlL3Rlc3RsaXN0LWMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxM2EyMTgKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvdGVzdGxpc3QtYy50eHQKQEAgLTAsMCArMSw2OCBAQAorIyBMaXN0IGNvbnRhaW5pbmcgdGhlIHRlc3RzIG9mIHRoZSBPcGVuTVBWYWxpZGFpb24gU3VpdGUgYXZhaWxhYmxlIHRvIGNoZWNrCisjIHRoZSBjIGltcGxlbWVudGF0aW9uLgoraGFzX29wZW5tcAorb21wX2F0b21pYworb21wX2JhcnJpZXIKK29tcF9jcml0aWNhbAorb21wX2ZsdXNoCitvbXBfZm9yX2ZpcnN0cHJpdmF0ZQorb21wX2Zvcl9sYXN0cHJpdmF0ZQorb21wX2Zvcl9vcmRlcmVkCitvbXBfZm9yX3ByaXZhdGUKK29tcF9mb3JfcmVkdWN0aW9uCitvbXBfZm9yX3NjaGVkdWxlX2R5bmFtaWMKK29tcF9mb3Jfc2NoZWR1bGVfZ3VpZGVkCitvbXBfZm9yX3NjaGVkdWxlX3N0YXRpYworb21wX2Zvcl9ub3dhaXQKK29tcF9nZXRfbnVtX3RocmVhZHMKK29tcF9nZXRfd3RpY2sKK29tcF9nZXRfd3RpbWUKK29tcF9pbl9wYXJhbGxlbAorb21wX2xvY2sKK29tcF9tYXN0ZXIKK29tcF9uZXN0X2xvY2sKK29tcF9wYXJhbGxlbF9jb3B5aW4KK29tcF9wYXJhbGxlbF9mb3JfZmlyc3Rwcml2YXRlCitvbXBfcGFyYWxsZWxfZm9yX2xhc3Rwcml2YXRlCitvbXBfcGFyYWxsZWxfZm9yX29yZGVyZWQKK29tcF9wYXJhbGxlbF9mb3JfcHJpdmF0ZQorb21wX3BhcmFsbGVsX2Zvcl9yZWR1Y3Rpb24KK29tcF9wYXJhbGxlbF9udW1fdGhyZWFkcworb21wX3BhcmFsbGVsX3NlY3Rpb25zX2ZpcnN0cHJpdmF0ZQorb21wX3BhcmFsbGVsX3NlY3Rpb25zX2xhc3Rwcml2YXRlCitvbXBfcGFyYWxsZWxfc2VjdGlvbnNfcHJpdmF0ZQorb21wX3BhcmFsbGVsX3NlY3Rpb25zX3JlZHVjdGlvbgorb21wX3NlY3Rpb25fZmlyc3Rwcml2YXRlCitvbXBfc2VjdGlvbl9sYXN0cHJpdmF0ZQorb21wX3NlY3Rpb25fcHJpdmF0ZQorb21wX3NlY3Rpb25zX3JlZHVjdGlvbgorb21wX3NlY3Rpb25zX25vd2FpdAorb21wX3BhcmFsbGVsX2Zvcl9pZgorb21wX3NpbmdsZV9jb3B5cHJpdmF0ZQorb21wX3NpbmdsZV9ub3dhaXQKK29tcF9zaW5nbGVfcHJpdmF0ZQorb21wX3NpbmdsZQorb21wX3Rlc3RfbG9jaworb21wX3Rlc3RfbmVzdF9sb2NrCitvbXBfdGhyZWFkcHJpdmF0ZQorb21wX3BhcmFsbGVsX2RlZmF1bHQKK29tcF9wYXJhbGxlbF9zaGFyZWQKK29tcF9wYXJhbGxlbF9wcml2YXRlCitvbXBfcGFyYWxsZWxfZmlyc3Rwcml2YXRlCitvbXBfcGFyYWxsZWxfaWYKK29tcF9wYXJhbGxlbF9yZWR1Y3Rpb24KKworIyBOZXcgdGVzdHMgZm9yIE9wZW5NUCAzLjAKK29tcF9mb3JfY29sbGFwc2UKK29tcF9tYXN0ZXJfMworb21wX3Rhc2sKK29tcF90YXNrX2lmCitvbXBfdGFza191bnRpZWQKK29tcF90YXNrX3NoYXJlZAorb21wX3Rhc2tfcHJpdmF0ZQorb21wX3Rhc2tfZmlyc3Rwcml2YXRlCitvbXBfdGFza3dhaXQKKworIyBOZXcgdGVzdHMgZm9yIE9wZW5NUCAzLjEKK29tcF90YXNreWllbGQKK29tcF90YXNrX2ZpbmFsCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvdGVzdGxpc3QtZi50eHQgYi9maW5hbC90ZXN0c3VpdGUvdGVzdGxpc3QtZi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUzODlhNQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS90ZXN0bGlzdC1mLnR4dApAQCAtMCwwICsxLDYzIEBACisjIExpc3QgY29udGFpbmluZyB0aGUgdGVzdHMgb2YgdGhlIE9wZW5NUFZhbGlkYWlvbiBTdWl0ZSBhdmFpbGFibGUgdG8gY2hlY2sKKyMgdGhlIGZvcnRhbiBpbXBsZW1lbnRhdGlvbi4KK2RvX2ZpcnN0cHJpdmF0ZQorZG9fbGFzdHByaXZhdGUKK2RvX29yZGVyZWQKK2RvX3ByaXZhdGUKK2RvX3JlZHVjdGlvbgorZG9fc2NoZWR1bGVfZHluYW1pYworZG9fc2NoZWR1bGVfZ3VpZGVkCitkb19zY2hlZHVsZV9zdGF0aWMKK2hhc19vcGVubXAKK29tcF9hdG9taWMKK29tcF9iYXJyaWVyCitvbXBfY29weWluCitvbXBfY3JpdGljYWwKK29tcF9mbHVzaAorb21wX2dldF9udW1fdGhyZWFkcworb21wX2luX3BhcmFsbGVsCitvbXBfbG9jaworb21wX21hc3Rlcgorb21wX25lc3RfbG9jaworb21wX3Rlc3RfbmVzdF9sb2NrCitvbXBfbmVzdGVkCitvbXBfbnVtX3RocmVhZHMKK29tcF90ZXN0bG9jaworb21wX3RocmVhZHByaXZhdGUKK29tcF9nZXRfd3RpY2tzCisjIyNvbXBfd29ya3NoYXJlX2RlZmF1bHQKK29tcF93b3Jrc2hhcmUKKyMjIyBCcmF1Y2h0IG1hbiBkZW4gb2RlciBvYmlnZW4gZXJ3ZWl0ZXJuPworb21wX3d0aW1lCitwYXJfZG9fZmlyc3Rwcml2YXRlCitwYXJfZG9fbGFzdHByaXZhdGUKK3Bhcl9kb19vcmRlcmVkCitwYXJfZG9fcHJpdmF0ZQorcGFyX2RvX3JlZHVjdGlvbgorcGFyX3NlY3Rpb25fZmlyc3Rwcml2YXRlCitwYXJfc2VjdGlvbl9sYXN0cHJpdmF0ZQorcGFyX3NlY3Rpb25fcHJpdmF0ZQorcGFyX3NlY3Rpb25fcmVkdWN0CitzZWN0aW9uX2ZpcnN0cHJpdmF0ZQorc2VjdGlvbl9sYXN0cHJpdmF0ZQorc2VjdGlvbl9wcml2YXRlCitzZWN0aW9uX3JlZHVjdGlvbgorb21wX3NpbmdsZQorc2luZ2xlX2NvcHlwcml2YXRlCitzaW5nbGVfbm93YWl0CitzaW5nbGVfcHJpdmF0ZQorCisjIE5ldyB0ZXN0cyBmb3IgT3Blbk1QIDMuMAorZG9fY29sbGFwc2UKK29tcF9tYXN0ZXJfMworb21wX3Rhc2sKK29tcF90YXNrX2lmCitvbXBfdGFza191bnRpZWQKK29tcF90YXNrX3NoYXJlZAorb21wX3Rhc2tfcHJpdmF0ZQorb21wX3Rhc2tfZmlyc3Rwcml2YXRlCitvbXBfdGFza3dhaXQKKworIyBOZXcgdGVzdHMgZm9yIE9wZW5NUCAzLjEKKyNvbXBfdGFza3lpZWxkCisjb21wX3Rhc2tfZmluYWwKZGlmZiAtLWdpdCBhL2ZpbmFsL3d3dy9SRUFETUUudHh0IGIvZmluYWwvd3d3L1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVjY2E3ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3d3dy9SRUFETUUudHh0CkBAIC0wLDAgKzEsMTEyIEBACisKKyAgICAgICAgICAgICAgIFJFQURNRSBmb3IgSW50ZWwoUikgT3Blbk1QKiBSdW50aW1lIExpYnJhcnkKKyAgICAgICAgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworSG93IHRvIEJ1aWxkIERvY3VtZW50YXRpb24KKz09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBtYWluIGRvY3VtZW50YXRpb24gaXMgaW4gRG94eWdlbiogZm9ybWF0LCBhbmQgdGhpcyBkaXN0cmlidXRpb24KK3Nob3VsZCBjb21lIHdpdGggcHJlLWJ1aWx0IFBERiBkb2N1bWVudGF0aW9uIGluIGRvYy9SZWZlcmVuY2UucGRmLiAgCitIb3dldmVyLCBhbiBIVE1MIHZlcnNpb24gY2FuIGJlIGJ1aWx0IGJ5IGV4ZWN1dGluZzoKKworJSBkb3h5Z2VuIGRvYy9kb3h5Z2VuL2NvbmZpZyAKKworaW4gdGhpcyBkaXJlY3RvcnkuCisKK1RoYXQgd2lsbCBwcm9kdWNlIEhUTUwgZG9jdW1lbnRhdGlvbiBpbiB0aGUgZG9jL2RveHlnZW4vZ2VuZXJhdGVkCitkaXJlY3RvcnksIHdoaWNoIGNhbiBiZSBhY2Nlc3NlZCBieSBwb2ludGluZyBhIHdlYiBicm93c2VyIGF0IHRoZQoraW5kZXguaHRtbCBmaWxlIHRoZXJlLgorCitJZiB5b3UgZG9uJ3QgaGF2ZSBEb3h5Z2VuIGluc3RhbGxlZCwgeW91IGNhbiBkb3dubG9hZCBpdCBmcm9tCit3d3cuZG94eWdlbi5vcmcuCisKKworSG93IHRvIEJ1aWxkIHRoZSBJbnRlbChSKSBPcGVuTVAqIFJ1bnRpbWUgTGlicmFyeQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgTWFrZWZpbGUgYXQgdGhlIHRvcC1sZXZlbCB3aWxsIGF0dGVtcHQgdG8gZGV0ZWN0IHdoYXQgaXQgbmVlZHMgdG8KK2J1aWxkIHRoZSBJbnRlbChSKSBPcGVuTVAqIFJ1bnRpbWUgTGlicmFyeS4gIFRvIHNlZSB0aGUgZGVmYXVsdCBzZXR0aW5ncywgCit0eXBlOgorCittYWtlIGluZm8KKworWW91IGNhbiBjaGFuZ2UgdGhlIE1ha2VmaWxlJ3MgYmVoYXZpb3Igd2l0aCB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CisKK29tcF9yb290OiAgICBUaGUgcGF0aCB0byB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSB0b3AtbGV2ZWwKKwkgICAgIE1ha2VmaWxlLiAgQnkgZGVmYXVsdCwgdGhpcyB3aWxsIHRha2Ugb24gdGhlIHZhbHVlIG9mIHRoZSAKKwkgICAgIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCisKK29tcF9vczogICAgICBPcGVyYXRpbmcgc3lzdGVtLiAgQnkgZGVmYXVsdCwgdGhlIGJ1aWxkIHdpbGwgYXR0ZW1wdCB0byAKKwkgICAgIGRldGVjdCB0aGlzLiBDdXJyZW50bHkgc3VwcG9ydHMgImxpbnV4IiwgIm1hY29zIiwgYW5kIAorCSAgICAgIndpbmRvd3MiLgorCithcmNoOiAgICAgICAgQXJjaGl0ZWN0dXJlLiBCeSBkZWZhdWx0LCB0aGUgYnVpbGQgd2lsbCBhdHRlbXB0IHRvIAorCSAgICAgZGV0ZWN0IHRoaXMgaWYgbm90IHNwZWNpZmllZCBieSB0aGUgdXNlci4gQ3VycmVudGx5IAorCSAgICAgc3VwcG9ydGVkIHZhbHVlcyBhcmUKKyAgICAgICAgICAgICAgICAgIjMyIiBmb3IgSUEtMzIgYXJjaGl0ZWN0dXJlIAorICAgICAgICAgICAgICAgICAiMzJlIiBmb3IgSW50ZWwoUikgNjQgYXJjaGl0ZWN0dXJlCisgICAgICAgICAgICAgICAgICJtaWMiIGZvciBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUKKworICAgICAgICAgICAgIElmICJtaWMiIGlzIHNwZWNpZmllZCB0aGVuICJpY2MiIHdpbGwgYmUgdXNlZCBhcyB0aGUKKwkgICAgIGNvbXBpbGVyLCBhbmQgYXBwcm9wcmlhdGUgazFvbSBiaW51dGlscyB3aWxsIGJlIHVzZWQuIFRoZQorCSAgICAgbmVjZXNzYXJ5IHBhY2thZ2VzIG11c3QgYmUgaW5zdGFsbGVkIG9uIHRoZSBidWlsZCBtYWNoaW5lCisJICAgICBmb3IgdGhpcyB0byBiZSBwb3NzaWJsZSAoYnV0IGFuIEludGVsKFIpIFhlb24gUGhpKFRNKQorCSAgICAgY29wcm9jZXNzb3IgY2FyZCBpcyBub3QgcmVxdWlyZWQgdG8gYnVpbGQgdGhlIGxpYnJhcnkpLgorCitjb21waWxlcjogICAgV2hpY2ggY29tcGlsZXIgdG8gdXNlIGZvciB0aGUgYnVpbGQuICBEZWZhdWx0cyB0byAiaWNjIiAKKwkgICAgIG9yICJpY2wiIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2Ygb21wX29zLiBBbHNvIHN1cHBvcnRzIAorCSAgICAgc29tZSB2ZXJzaW9ucyBvZiAiZ2NjIiogd2hlbiBvbXBfb3MgaXMgImxpbnV4Ii4gVGhlIHNlbGVjdGVkIAorCSAgICAgY29tcGlsZXIgc2hvdWxkIGJlIGluc3RhbGxlZCBhbmQgaW4gdGhlIHVzZXIncyBwYXRoLiBUaGUgCisJICAgICBjb3JyZXNwb25kaW5nIEZvcnRyYW4gY29tcGlsZXIgc2hvdWxkIGFsc28gYmUgaW4gdGhlIHBhdGguIAorCSAgICAgU2VlICJTdXBwb3J0ZWQgUlRMIEJ1aWxkIENvbmZpZ3VyYXRpb25zIiBiZWxvdyBmb3IgbW9yZSAKKwkgICAgIGluZm9ybWF0aW9uIG9uIGNvbXBpbGVyIHZlcnNpb25zLgorCittb2RlOiAgICAgICAgTGlicmFyeSBtb2RlOiBkZWZhdWx0IGlzICJyZWxlYXNlIi4gIEFsc28gc3VwcG9ydHMgImRlYnVnIi4KKworVG8gdXNlIGFueSBvZiB0aGUgb3B0aW9ucyBhYm92ZSwgc2ltcGxlIGFkZCA8b3B0aW9uX25hbWU+PTx2YWx1ZT4uICBGb3IgCitleGFtcGxlLCBpZiB5b3Ugd2FudCB0byBidWlsZCB3aXRoIGdjYyBpbnN0ZWFkIG9mIGljYywgdHlwZToKKworbWFrZSBjb21waWxlcj1nY2MKKworU3VwcG9ydGVkIFJUTCBCdWlsZCBDb25maWd1cmF0aW9ucworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitTdXBwb3J0ZWQgQXJjaGl0ZWN0dXJlczogSUEtMzIgYXJjaGl0ZWN0dXJlLCBJbnRlbChSKSA2NCwgYW5kIAorSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlCisKKyAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorICAgICAgICAgICAgICB8ICAgaWNjL2ljbCAgICAgfCAgICBnY2MgICAgICB8ICAgY2xhbmcgICAgfAorLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfCBMaW51eCogT1MgICB8ICAgWWVzKDEsNSkgICAgfCAgWWVzKDIsNCkgICB8IFllcyg0LDYsNykgfAorfCBPUyBYKiAgICAgICB8ICAgWWVzKDEsMyw0KSAgfCAgTm8gICAgICAgICB8IFllcyg0LDYsNykgfAorfCBXaW5kb3dzKiBPUyB8ICAgWWVzKDEsNCkgICAgfCAgTm8gICAgICAgICB8IE5vICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisoMSkgT24gSUEtMzIgYXJjaGl0ZWN0dXJlIGFuZCBJbnRlbChSKSA2NCwgaWNjL2ljbCB2ZXJzaW9ucyAxMi54IGFyZSAKKyAgICBzdXBwb3J0ZWQgKDEyLjEgaXMgcmVjb21tZW5kZWQpLgorKDIpIGdjYyB2ZXJzaW9uIDQuNi4yIGlzIHN1cHBvcnRlZC4KKygzKSBGb3IgaWNjIG9uIE9TIFgqLCBPUyBYKiB2ZXJzaW9uIDEwLjUuOCBpcyBzdXBwb3J0ZWQuCisoNCkgSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlIG5vdCBzdXBwb3J0ZWQuCisoNSkgT24gSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlLCBpY2MvaWNsIHZlcnNpb25zIDEzLjAgCisgICAgb3IgbGF0ZXIgYXJlIHJlcXVpcmVkLgorKDYpIGNsYW5nIHZlcnNpb24gMy4zIGlzIHN1cHBvcnRlZC4KKyg3KSBjbGFuZyBjdXJyZW50bHkgZG9lcyBub3Qgb2ZmZXIgYSBzb2Z0d2FyZS1pbXBsZW1lbnRlZCAxMjggYml0IGV4dGVuZGVkIAorICAgIHByZWNpc2lvbiB0eXBlLiAgVGh1cywgYWxsIGVudHJ5IHBvaW50cyByZWxpYW50IG9uIHRoaXMgdHlwZSBhcmUgcmVtb3ZlZAorICAgIGZyb20gdGhlIGxpYnJhcnkgYW5kIGNhbm5vdCBiZSBjYWxsZWQgaW4gdGhlIHVzZXIgcHJvZ3JhbS4gIFRoZSBmb2xsb3dpbmcKKyAgICBmdW5jdGlvbnMgYXJlIG5vdCBhdmFpbGFibGU6CisgICAgX19rbXBjX2F0b21pY19jbXBseDE2XyoKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfKgorICAgIF9fa21wY19hdG9taWNfKl9mcAorCitGcm9udC1lbmQgQ29tcGlsZXJzIHRoYXQgd29yayB3aXRoIHRoaXMgUlRMCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBmb2xsb3dpbmcgY29tcGlsZXJzIGFyZSBrbm93biB0byBkbyBjb21wYXRpYmxlIGNvZGUgZ2VuZXJhdGlvbiBmb3IKK3RoaXMgUlRMOiAgaWNjL2ljbCwgZ2NjLiAgU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbC4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTm90aWNlcworPT09PT09PQorCisqT3RoZXIgbmFtZXMgYW5kIGJyYW5kcyBtYXkgYmUgY2xhaW1lZCBhcyB0aGUgcHJvcGVydHkgb2Ygb3RoZXJzLgpkaWZmIC0tZ2l0IGEvZmluYWwvd3d3L1JlZmVyZW5jZS5wZGYgYi9maW5hbC93d3cvUmVmZXJlbmNlLnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODBmOThjCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvd3d3L1JlZmVyZW5jZS5wZGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmluYWwvd3d3L2NvbnRlbnQuY3NzIGIvZmluYWwvd3d3L2NvbnRlbnQuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYTZhMzIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC93d3cvY29udGVudC5jc3MKQEAgLTAsMCArMSwyNyBAQAoraHRtbCB7IG1hcmdpbjogMHB4OyB9IGJvZHkgeyBtYXJnaW46IDhweDsgfQorCitodG1sLCBib2R5IHsKKyAgcGFkZGluZzowcHg7CisgIGZvbnQtc2l6ZTpzbWFsbDsgZm9udC1mYW1pbHk6Ikx1Y2lkYSBHcmFuZGUiLCAiTHVjaWRhIFNhbnMgVW5pY29kZSIsIEFyaWFsLCBWZXJkYW5hLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IGJhY2tncm91bmQtY29sb3I6ICNmZmY7IGNvbG9yOiAjMjIyOworICBsaW5lLWhlaWdodDoxLjU7Cit9CisKK2gxLCBoMiwgaDMsIHR0IHsgY29sb3I6ICMwMDAgfQorCitoMSB7IHBhZGRpbmctdG9wOjBweDsgbWFyZ2luLXRvcDowcHg7fQoraDIgeyBjb2xvcjojMzMzMzMzOyBwYWRkaW5nLXRvcDowLjVlbTsgfQoraDMgeyBwYWRkaW5nLXRvcDogMC41ZW07IG1hcmdpbi1ib3R0b206IC0wLjI1ZW07IGNvbG9yOiMyZDU4Yjd9CitsaSB7IHBhZGRpbmctYm90dG9tOiAwLjVlbTsgfQordWwgeyBwYWRkaW5nLWxlZnQ6MS41ZW07IH0KKworLyogU2xpZGVzICovCitJTUcuaW1nX3NsaWRlIHsKKyAgICBkaXNwbGF5OiBibG9jazsKKyAgICBtYXJnaW4tbGVmdDogYXV0bzsKKyAgICBtYXJnaW4tcmlnaHQ6IGF1dG8KK30KKworLml0ZW1UaXRsZSB7IGNvbG9yOiMyZDU4YjcgfQorCisvKiBUYWJsZXMgKi8KK3RyIHsgdmVydGljYWwtYWxpZ246dG9wIH0KZGlmZiAtLWdpdCBhL2ZpbmFsL3d3dy9pbmRleC5odG1sIGIvZmluYWwvd3d3L2luZGV4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYwZjRhOQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3d3dy9pbmRleC5odG1sCkBAIC0wLDAgKzEsMTkxIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMS8vRU4iCisgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L3N0cmljdC5kdGQiPgorPCEtLSBNYXRlcmlhbCB1c2VkIGZyb206IEhUTUwgNC4wMSBzcGVjczogaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQwMS8gLS0+Cis8aHRtbD4KKzxoZWFkPgorICA8TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKyAgPHRpdGxlPk9wZW5NUCogOiBTdXBwb3J0IGZvciB0aGUgT3Blbk1QIGxhbmd1YWdlPC90aXRsZT4KKyAgPGxpbmsgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0ibWVudS5jc3MiPgorICA8bGluayB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJjb250ZW50LmNzcyI+Cis8L2hlYWQ+CisKKzxib2R5PgorPGRpdiBpZD0ibWVudSI+CisgIDxkaXY+CisgICAgPGEgaHJlZj0iaHR0cDovL2xsdm0ub3JnLyI+TExWTSBIb21lPC9hPgorICA8L2Rpdj4KKworICA8ZGl2IGNsYXNzPSJzdWJtZW51Ij4KKyAgICA8bGFiZWw+T3Blbk1QIEluZm88L2xhYmVsPgorICAgIDxhIGhyZWY9Ii9pbmRleC5odG1sIj5BYm91dDwvYT4KKyAgPC9kaXY+CisKKyAgPGRpdiBjbGFzcz0ic3VibWVudSI+CisgICAgPGxhYmVsPlF1aWNrIExpbmtzPC9sYWJlbD4KKyAgICA8YSBocmVmPSJodHRwOi8vbGlzdHMuY3MudWl1Yy5lZHUvbWFpbG1hbi9saXN0aW5mby9vcGVubXAtZGV2Ij5vcGVubXAtZGV2PC9hPgorICAgIDxhIGhyZWY9Imh0dHA6Ly9saXN0cy5jcy51aXVjLmVkdS9tYWlsbWFuL2xpc3RpbmZvL29wZW5tcC1jb21taXRzIj5vcGVubXAtY29tbWl0czwvYT4KKyAgICA8YSBocmVmPSJodHRwOi8vbGx2bS5vcmcvYnVncy8iPkJ1ZyBSZXBvcnRzPC9hPgorICAgIDxhIGhyZWY9Imh0dHA6Ly9sbHZtLm9yZy9zdm4vbGx2bS1wcm9qZWN0L29wZW5tcC90cnVuay8iPkJyb3dzZSBTVk48L2E+CisgICAgPGEgaHJlZj0iaHR0cDovL2xsdm0ub3JnL3ZpZXd2Yy9sbHZtLXByb2plY3Qvb3Blbm1wL3RydW5rLyI+QnJvd3NlIFZpZXdWQzwvYT4KKyAgPC9kaXY+Cis8L2Rpdj4KKworPGRpdiBpZD0iY29udGVudCI+CisgIDwhLS0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotLT4KKyAgPGgxPiJPcGVuTVAmcmVnOyIgU3VwcG9ydCBmb3IgdGhlIE9wZW5NUCBsYW5ndWFnZTwvaDE+CisgIDwhLS0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotLT4KKworICA8cD5UaGUgT3Blbk1QIHN1YnByb2plY3Qgb2YgTExWTSBpcyBpbnRlbmRlZCB0byBjb250YWluIGFsbCBvZiB0aGUKKyAgICAgY29tcG9uZW50cyByZXF1aXJlZCB0byBidWlsZCBhbiBleGVjdXRpbmcgT3Blbk1QIHByb2dyYW0gdGhhdCBhcmUKKyAgICAgb3V0c2lkZSB0aGUgY29tcGlsZXIgaXRzZWxmLiBTdXBwb3J0IGZvciBPcGVuTVAgMy4xIGluIENsYW5nIGlzIGluIHRoZQorICAgICBwcm9jZXNzIG9mIGJlaW5nIHByb21vdGVkIGludG8gdGhlIENsYW5nIG1haW5saW5lLCBhbmQgY2FuIGJlCisgICAgIGZvdW5kIGF0IDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy1vbXAuZ2l0aHViLmlvLyI+T3Blbk1QL0NsYW5nPC9hPi4gCisgIDwvcD4KKworICA8cD5IZXJlIHlvdSBjYW4gZmluZCB0aGUgY29kZSBmb3IgdGhlIHJ1bnRpbWUgbGlicmFyeSBhZ2FpbnN0IHdoaWNoCisgICAgY29kZSBjb21waWxlZCBieSB0aGUgT3Blbk1QL0NsYW5nIGNvbXBpbGVyIG11c3QgYmUgbGlua2VkIGJlZm9yZSBpdAorICAgIGNhbiBydW4uIFRoaXMgY29kZSBpcyBhbHNvIGF2YWlsYWJsZQorICAgIGF0IDxhIGhyZWY9Imh0dHA6Ly9vcGVubXBydGwub3JnLyI+b3Blbm1wcnRsLm9yZzwvYT47IHdlIGludGVuZCB0bworICAgIGtlZXAgdGhlIGRpZmZlcmVudCBzaXRlcyBpbiBzeW5jLgorICA8L3A+CisKKyAgPHA+U3VwcG9ydCBmb3IgdGhlIHBhcnRzIG9mIHRoZSBPcGVuTVAgNC4wIGxhbmd1YWdlIHRoYXQgYXJlIG5vdAorICBhc3NvY2lhdGVkIHdpdGggdGhlICJ0YXJnZXQiIGNvbnN0cnVjdHMgYXJlIGNvbnRhaW5lZCBpbiB0aGUKKyAgInJ1bnRpbWUiIGRpcmVjdG9yeS4gU3VwcG9ydCBmb3Igb2ZmbG9hZGluZyBjb21wdXRhdGlvbiB2aWEgdGhlCisgICJ0YXJnZXQiIGRpcmVjdGl2ZSBpcyBpbiB0aGUgc2VwYXJhdGUgIm9mZmxvYWQiIGRpcmVjdG9yeS4gVGhhdAorICBidWlsZHMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdGhlIGludGVyZmFjZXMgZm9yIHRyYW5zZmVycmluZyBjb2RlCisgIGFuZCBkYXRhIHRvIGFuIGF0dGFjaGVkIGNvbXB1dGF0aW9uYWwgZGV2aWNlLiBJbml0aWFsIHN1cHBvcnQgaGVyZQorICBpcyBmb3IgdGhlIEludGVsJnJlZyBYZW9uIFBoaSYjMDE1MyBjb3Byb2Nlc3NvciwgYnV0IHdvcmsgaXMKKyAgYmVnaW5uaW5nIHRvIHN1cHBvcnQgb3RoZXIgYXR0YWNoZWQgY29tcHV0aW5nIGRldmljZXMsIGFuZCB0aGUKKyAgZGVzaWduIGlzIGludGVuZGVkIHRvIGJlIGdlbmVyYWwuIFRoZSBSRUFETUUudHh0IGluIHRoZSAib2ZmbG9hZCIKKyAgZGlyZWN0b3J5IGRlc2NyaWJlcyBob3cgdG8gYnVpbGQgdGhlIG9mZmxvYWQgbGlicmFyeS4KKyAgPC9wPgorCisgIDxwPkFsbCBvZiB0aGUgY29kZSBoZXJlIGlzIDxhCisgICAgIGhyZWY9Imh0dHA6Ly9sbHZtLm9yZy9kb2NzL0RldmVsb3BlclBvbGljeS5odG1sI2xpY2Vuc2UiPmR1YWwgbGljZW5zZWQ8L2E+CisgICAgIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBhbmQgdGhlIFVJVUMgTGljZW5zZSAoYSBCU0QtbGlrZSBsaWNlbnNlKS4KKyAgICAgVGhlIExJQ0VOU0UudHh0IGZpbGUgYXQgdGhlIHRvcCBvZiB0aGUgT3Blbk1QIHByb2plY3QgY29udGFpbnMKKyAgICAgdGhlIGxpY2Vuc2UgdGV4dCBhbmQgYXNzb2NpYXRlZCBwYXRlbnQgZ3JhbnRzLgorICA8L3A+CisKKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8aDIgaWQ9ImdvYWxzIj5GZWF0dXJlcyBhbmQgR29hbHM8L2gyPgorICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisKKyAgICA8dWw+CisgICAgICAgIDxsaT5Db3JyZWN0bmVzcyBhcyBkZWZpbmVkIGJ5IHRoZSAKKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5tcC5vcmcvbXAtZG9jdW1lbnRzL09wZW5NUDMuMS5wZGYiPk9wZW5NUAorICAgICAgICAgIDMuMSBzdGFuZGFyZCAoUERGKTwvYT4gbm93LCBhbmQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVubXAub3JnL21wLWRvY3VtZW50cy9PcGVuTVA0LjAuMC5wZGYiPk9wZW5NUAorICAgICAgICAgIDQuMCBzdGFuZGFyZCAoUERGKTwvYT4gaW4gdGhlIGZ1dHVyZS48L2xpPgorICAgICAgICA8bGk+SGlnaCBwZXJmb3JtYW5jZS48L2xpPgorICAgICAgICA8bGk+QUJJIGNvbXBhdGliaWxpdHkgd2l0aCA8YSBocmVmPSJodHRwOi8vZ2NjLmdudS5vcmciPkdjYzwvYT4gYW5kCisgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9zb2Z0d2FyZS5pbnRlbC5jb20vZW4tdXMvaW50ZWwtY29tcGlsZXJzIj5JbnRlbCdzCisgICAgICAgIGV4aXN0aW5nIE9wZW5NUCBjb21waWxlcnMuPC9hPiAKKyAgICAgICAgSG93ZXZlciwgd2UgYXJlIG5vdCBjdXJyZW50bHkgKE1heSAyMDE0KSBjb21wYXRpYmxlIHdpdGggZ2NjIDQuOSwgc2luY2UKKyAgICAgICAgaXQgaGFzIGludHJvZHVjZWQgbmV3IGVudHJ5cG9pbnRzIHdpdGggd2hpY2ggd2UgaGF2ZSBub3QgeWV0CisgICAgICAgIGNhdWdodCB1cC4uLiAKKyAgICAgICAgPC9saT4KKyAgICA8L3VsPgorCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPGgyIGlkPSJ3aHkiPldoeSBoYXZlIHRoZSBydW50aW1lIGNvZGUgaGVyZT88L2gyPgorICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisKKyAgPHA+SXQgbWFrZXMgc2Vuc2UgdG8gaGF2ZSB0aGUgcnVudGltZSBzb3VyY2VzIGluIHRoZSBzYW1lIHBsYWNlCisgICAgKGFuZCB3aXRoIHRoZSBzYW1lIGxpY2Vuc2UpIGFzIHRoZSBjb21waWxlci4KKyAgPC9wPgorCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPGgyIGlkPSJyZXF1aXJlbWVudHMiPlBsYXRmb3JtIFN1cHBvcnQ8L2gyPgorICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisKKyAgPHA+VGhlIE9wZW5NUCBydW50aW1lIGlzIGtub3duIHRvIHdvcmsgb24gMzIgYW5kIDY0IGJpdCBYODYKKyAgICBwcm9jZXNzb3JzIHdoZW4gY29tcGlsZWQgd2l0aCBlaXRoZXIgdGhlIEludGVsIGNvbXBpbGVyIG9yIGdjYywgYW5kIGFsc28gdGhlIEludGVsJnJlZzsmbmJzcDtYZW9uIFBoaSZ0cmFkZTsgcHJvZHVjdCBmYW1pbHksIHdoZW4gY29tcGlsZWQgd2l0aAorICAgIHRoZSBJbnRlbCBjb21waWxlci4KKyAgPC9wPgorICAKKyAgPHA+QSBmdWxsIE9TIGNvbXBhdGliaWxpdHkgbWF0cml4IGlzIGluIAorICAgIDxhIGhyZWY9IlJFQURNRS50eHQiPlJFQURNRS50eHQ8L2E+CisgIDwvcD4KKworCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPGgyIGlkPSJkaXItc3RydWN0dXJlIj5TdGF0dXM8L2gyPgorICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisKKyAgIDxwPlRoZSBydW50aW1lIGNhbiBiZSBidWlsdCB3aXRoIGdjYywgaWNjIG9yIGNsYW5nLiBIb3dldmVyLCBub3RlCisgICB0aGF0IGEgcnVudGltZSBidWlsdCB3aXRoIGNsYW5nIGNhbm5vdCBiZSBndWFyYW50ZWVkIHRvIHdvcmsgd2l0aAorICAgT3Blbk1QIGNvZGUgY29tcGlsZWQgYnkgdGhlIG90aGVyIGNvbXBpbGVycywgc2luY2UgY2xhbmcgZG9lcyBub3Qgc3VwcG9ydAorICAgYSAxMjgtYml0IGZsb2F0IHR5cGUsIGFuZCBjYW5ub3QgdGhlcmVmb3JlIGdlbmVyYXRlIHRoZSBjb2RlIHVzZWQKKyAgIGZvciByZWR1Y3Rpb25zIG9mIHRoYXQgdHlwZSAod2hpY2ggbWF5IG9jY3VyIGluIHVzZXIgY29kZSBjb21waWxlZAorICAgYnkgdGhlIG90aGVyIGNvbXBpbGVycykuCisgICA8L3A+CisgCisgICA8cD5UaGUgVW5pdmVyc2l0eSBvZiBIb3VzdG9uIGhhcyBraW5kbHkgY29udHJpYnV0ZWQgdGhlaXIgdGVzdAorICAgc3VpdGUgKGluIHRoZSAidGVzdHN1aXRlIiBkaXJlY3RvcnkpLiBJbnRlZ3JhdGlvbiBhbmQgdXNlIG9mIHRoaXMKKyAgIGZvciBhdXRvbWF0aWMgdGVzdGluZyByZW1haW4gdG8gYmUgZG9uZSwgYnV0IG5vdyB0aGUgY29kZSBpcyBoZXJlCisgICB3b3JrIGNhbiBiZWdpbi4KKyAgIDwvcD4KKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDxoMj5HZXQgaXQgYW5kIGdldCBpbnZvbHZlZCE8L2gyPgorICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisKKyAgPHA+Rmlyc3QgcGxlYXNlIHJldmlldyBvdXIKKyAgICAgPGEgaHJlZj0iaHR0cDovL2xsdm0ub3JnL2RvY3MvRGV2ZWxvcGVyUG9saWN5Lmh0bWwiPkRldmVsb3BlcidzIFBvbGljeTwvYT4uCisKKyAgPHA+VG8gY2hlY2sgb3V0IHRoZSBjb2RlLCB1c2U6PC9wPgorCisgIDx1bD4KKyAgPGxpPjxjb2RlPnN2biBjbyBodHRwOi8vbGx2bS5vcmcvc3ZuL2xsdm0tcHJvamVjdC9vcGVubXAvdHJ1bmsgb3Blbm1wPC9jb2RlPjwvbGk+CisgIDwvdWw+CisKKyAgPHA+CisgICAgIE5leHQ6CisgIDwvcD4KKyAgCisgIDx1bD4KKyAgICA8bGk+PGNvZGU+Y2Qgb3Blbm1wL3J1bnRpbWU8L2NvZGU+PC9saT4KKyAgICA8bGk+PGNvZGU+bWFrZSBjb21waWxlcj1nY2M8L2NvZGU+PC9saT4KKyAgPC91bD4KKyAgCisgIDxwPkZ1bGwgZGV0YWlscyBvZiBob3cgdG8gYnVpbGQgYXJlIGluIHRoZQorICAgIDxhIGhyZWY9IlJFQURNRS50eHQiPlJFQURNRS50eHQ8L2E+CisgIDwvcD4KKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDxoMz5Ob3RlczwvaDM+CisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKworPHA+CisKKzwvcD4KKworICA8cD5TZW5kIGRpc2N1c3Npb25zIHRvIHRoZQorICAoPGEgaHJlZj0iaHR0cDovL2xpc3RzLmNzLnVpdWMuZWR1L21haWxtYW4vbGlzdGluZm8vb3Blbm1wLWRldiI+T3Blbk1QIG1haWxpbmcgbGlzdDwvYT4pLjwvcD4KKworCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPGgyPkRlc2lnbiBEb2N1bWVudHM8L2gyPgorICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisKKzx1bD4KKzxsaT48YSBocmVmPSJSZWZlcmVuY2UucGRmIj5SdW50aW1lIGRlc2lnbiAoUERGKTwvYT48L2xpPgorPC91bD4KKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDxoMj5Db3B5cmlnaHQgbm90aWNlczwvaDI+CisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKzx1bD4KKzxsaT4KKyAgVGhlIE9wZW5NUCBuYW1lIGFuZCB0aGUgT3Blbk1QIGxvZ28gYXJlIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiB0aGUKKyAgT3Blbk1QIEFyY2hpdGVjdHVyZSBSZXZpZXcgQm9hcmQuCis8L2xpPgorPGxpPgorICBJbnRlbCBpcyBhIHRyYWRlbWFyayBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBpbiB0aGUgVS5TLiBhbmQvb3Igb3RoZXIKKyAgY291bnRyaWVzLgorPC9saT4KKzwvdWw+Cis8L2Rpdj4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3d3dy9tZW51LmNzcyBiL2ZpbmFsL3d3dy9tZW51LmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTg4N2IxCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvd3d3L21lbnUuY3NzCkBAIC0wLDAgKzEsMzkgQEAKKy8qKioqKioqKioqKioqKiovCisvKiBwYWdlIGxheW91dCAqLworLyoqKioqKioqKioqKioqKi8KKworW2lkPW1lbnVdIHsKKwlwb3NpdGlvbjpmaXhlZDsKKwl3aWR0aDoyNWV4OworfQorW2lkPWNvbnRlbnRdIHsKKwkvKiAqKioqKiAgRURJVCBUSElTIFZBTFVFIElGIENPTlRFTlQgT1ZFUkxBUFMgTUVOVSAqKioqKiAqLworCXBvc2l0aW9uOmFic29sdXRlOworICBsZWZ0OjI5ZXg7CisJcGFkZGluZy1yaWdodDo0ZXg7Cit9CisKKy8qKioqKioqKioqKioqKi8KKy8qIG1lbnUgc3R5bGUgKi8KKy8qKioqKioqKioqKioqKi8KKworI21lbnUgLnN1Ym1lbnUgeworCXBhZGRpbmctdG9wOjFlbTsKKwlkaXNwbGF5OmJsb2NrOworfQorCisjbWVudSBsYWJlbCB7CisJZGlzcGxheTpibG9jazsKKwlmb250LXdlaWdodDogYm9sZDsKKwl0ZXh0LWFsaWduOiBjZW50ZXI7CisJYmFja2dyb3VuZC1jb2xvcjogcmdiKDE5MiwxOTIsMTkyKTsKK30KKyNtZW51IGEgeworCXBhZGRpbmc6MCAuMmVtOworCWRpc3BsYXk6YmxvY2s7CisJdGV4dC1hbGlnbjogY2VudGVyOworCWJhY2tncm91bmQtY29sb3I6IHJnYigyMzUsMjM1LDIzNSk7Cit9CisjbWVudSBhOnZpc2l0ZWQgeworCWNvbG9yOnJnYigxMDAsNTAsMTAwKTsKK30K